1 /*******************************************************************************
3 Copyright(c) 2004 Intel Corporation. All rights reserved.
5 Portions of this file are based on the WEP enablement code provided by the
6 Host AP project hostap-drivers v0.1.3
7 Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
11 This program is free software; you can redistribute it and/or modify it
12 under the terms of version 2 of the GNU General Public License as
13 published by the Free Software Foundation.
15 This program is distributed in the hope that it will be useful, but WITHOUT
16 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
20 The full GNU General Public License is included in this distribution in the
25 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
27 *******************************************************************************/
29 #include <linux/compiler.h>
30 #include <linux/errno.h>
31 #include <linux/if_arp.h>
32 #include <linux/in6.h>
35 #include <linux/kernel.h>
36 #include <linux/module.h>
37 #include <linux/netdevice.h>
38 #include <linux/pci.h>
39 #include <linux/proc_fs.h>
40 #include <linux/skbuff.h>
41 #include <linux/slab.h>
42 #include <linux/tcp.h>
43 #include <linux/types.h>
44 #include <linux/wireless.h>
45 #include <linux/etherdevice.h>
46 #include <linux/uaccess.h>
50 u32 rt_global_debug_component = COMP_ERR;
51 EXPORT_SYMBOL(rt_global_debug_component);
53 static inline int rtllib_networks_allocate(struct rtllib_device *ieee)
58 ieee->networks = kcalloc(MAX_NETWORK_COUNT,
59 sizeof(struct rtllib_network), GFP_KERNEL);
66 static inline void rtllib_networks_free(struct rtllib_device *ieee)
70 kfree(ieee->networks);
71 ieee->networks = NULL;
74 static inline void rtllib_networks_initialize(struct rtllib_device *ieee)
78 INIT_LIST_HEAD(&ieee->network_free_list);
79 INIT_LIST_HEAD(&ieee->network_list);
80 for (i = 0; i < MAX_NETWORK_COUNT; i++)
81 list_add_tail(&ieee->networks[i].list,
82 &ieee->network_free_list);
85 struct net_device *alloc_rtllib(int sizeof_priv)
87 struct rtllib_device *ieee = NULL;
88 struct net_device *dev;
91 pr_debug("rtllib: Initializing...\n");
93 dev = alloc_etherdev(sizeof(struct rtllib_device) + sizeof_priv);
95 pr_err("Unable to allocate net_device.\n");
98 ieee = (struct rtllib_device *)netdev_priv_rsl(dev);
99 memset(ieee, 0, sizeof(struct rtllib_device)+sizeof_priv);
102 err = rtllib_networks_allocate(ieee);
104 pr_err("Unable to allocate beacon storage: %d\n", err);
107 rtllib_networks_initialize(ieee);
109 /* Default fragmentation threshold is maximum payload size */
110 ieee->fts = DEFAULT_FTS;
111 ieee->scan_age = DEFAULT_MAX_SCAN_AGE;
114 /* Default to enabling full open WEP with host based encrypt/decrypt */
115 ieee->host_encrypt = 1;
116 ieee->host_decrypt = 1;
117 ieee->ieee802_1x = 1; /* Default to supporting 802.1x */
119 ieee->rtllib_ap_sec_type = rtllib_ap_sec_type;
121 spin_lock_init(&ieee->lock);
122 spin_lock_init(&ieee->wpax_suitlist_lock);
123 spin_lock_init(&ieee->reorder_spinlock);
124 atomic_set(&(ieee->atm_swbw), 0);
127 lib80211_crypt_info_init(&ieee->crypt_info, "RTLLIB", &ieee->lock);
129 ieee->wpa_enabled = 0;
130 ieee->tkip_countermeasures = 0;
131 ieee->drop_unencrypted = 0;
132 ieee->privacy_invoked = 0;
133 ieee->ieee802_1x = 1;
135 ieee->hwsec_active = 0;
137 memset(ieee->swcamtable, 0, sizeof(struct sw_cam_table) * 32);
138 rtllib_softmac_init(ieee);
140 ieee->pHTInfo = kzalloc(sizeof(struct rt_hi_throughput), GFP_KERNEL);
141 if (ieee->pHTInfo == NULL)
144 HTUpdateDefaultSetting(ieee);
145 HTInitializeHTInfo(ieee);
147 for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++)
148 INIT_LIST_HEAD(&ieee->ibss_mac_hash[i]);
150 for (i = 0; i < 17; i++) {
151 ieee->last_rxseq_num[i] = -1;
152 ieee->last_rxfrag_num[i] = -1;
153 ieee->last_packet_time[i] = 0;
162 EXPORT_SYMBOL(alloc_rtllib);
164 void free_rtllib(struct net_device *dev)
166 struct rtllib_device *ieee = (struct rtllib_device *)
167 netdev_priv_rsl(dev);
169 kfree(ieee->pHTInfo);
170 ieee->pHTInfo = NULL;
171 rtllib_softmac_free(ieee);
173 lib80211_crypt_info_free(&ieee->crypt_info);
175 rtllib_networks_free(ieee);
178 EXPORT_SYMBOL(free_rtllib);
180 static int __init rtllib_init(void)
185 static void __exit rtllib_exit(void)
189 module_init(rtllib_init);
190 module_exit(rtllib_exit);
192 MODULE_LICENSE("GPL");