/drivers/staging/rtl8187se/ieee80211/ieee80211_module.c
C | 206 lines | 136 code | 35 blank | 35 comment | 13 complexity | 151ce6431c89a34a424f14f7e138ada3 MD5 | raw file
Possible License(s): LGPL-2.0, AGPL-1.0, GPL-2.0
1/******************************************************************************* 2 3 Copyright(c) 2004 Intel Corporation. All rights reserved. 4 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 8 <jkmaline@cc.hut.fi> 9 Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi> 10 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. 14 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 18 more details. 19 20 You should have received a copy of the GNU General Public License along with 21 this program; if not, write to the Free Software Foundation, Inc., 59 22 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 23 24 The full GNU General Public License is included in this distribution in the 25 file called LICENSE. 26 27 Contact Information: 28 James P. Ketrenos <ipw2100-admin@linux.intel.com> 29 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 30 31*******************************************************************************/ 32 33#include <linux/compiler.h> 34//#include <linux/config.h> 35#include <linux/errno.h> 36#include <linux/if_arp.h> 37#include <linux/in6.h> 38#include <linux/in.h> 39#include <linux/ip.h> 40#include <linux/kernel.h> 41#include <linux/module.h> 42#include <linux/netdevice.h> 43#include <linux/pci.h> 44#include <linux/proc_fs.h> 45#include <linux/skbuff.h> 46#include <linux/slab.h> 47#include <linux/tcp.h> 48#include <linux/types.h> 49#include <linux/wireless.h> 50#include <linux/etherdevice.h> 51#include <asm/uaccess.h> 52#include <net/arp.h> 53#include <net/net_namespace.h> 54 55#include "ieee80211.h" 56 57MODULE_DESCRIPTION("802.11 data/management/control stack"); 58MODULE_AUTHOR("Copyright (C) 2004 Intel Corporation <jketreno@linux.intel.com>"); 59MODULE_LICENSE("GPL"); 60 61#define DRV_NAME "ieee80211" 62 63static inline int ieee80211_networks_allocate(struct ieee80211_device *ieee) 64{ 65 if (ieee->networks) 66 return 0; 67 68 ieee->networks = kcalloc( 69 MAX_NETWORK_COUNT, sizeof(struct ieee80211_network), 70 GFP_KERNEL); 71 if (!ieee->networks) { 72 printk(KERN_WARNING "%s: Out of memory allocating beacons\n", 73 ieee->dev->name); 74 return -ENOMEM; 75 } 76 77 return 0; 78} 79 80static inline void ieee80211_networks_free(struct ieee80211_device *ieee) 81{ 82 if (!ieee->networks) 83 return; 84 kfree(ieee->networks); 85 ieee->networks = NULL; 86} 87 88static inline void ieee80211_networks_initialize(struct ieee80211_device *ieee) 89{ 90 int i; 91 92 INIT_LIST_HEAD(&ieee->network_free_list); 93 INIT_LIST_HEAD(&ieee->network_list); 94 for (i = 0; i < MAX_NETWORK_COUNT; i++) 95 list_add_tail(&ieee->networks[i].list, &ieee->network_free_list); 96} 97 98 99struct net_device *alloc_ieee80211(int sizeof_priv) 100{ 101 struct ieee80211_device *ieee; 102 struct net_device *dev; 103 int i,err; 104 105 IEEE80211_DEBUG_INFO("Initializing...\n"); 106 107 dev = alloc_etherdev(sizeof(struct ieee80211_device) + sizeof_priv); 108 if (!dev) { 109 IEEE80211_ERROR("Unable to network device.\n"); 110 goto failed; 111 } 112 ieee = netdev_priv(dev); 113 114 ieee->dev = dev; 115 116 err = ieee80211_networks_allocate(ieee); 117 if (err) { 118 IEEE80211_ERROR("Unable to allocate beacon storage: %d\n", 119 err); 120 goto failed; 121 } 122 ieee80211_networks_initialize(ieee); 123 124 /* Default fragmentation threshold is maximum payload size */ 125 ieee->fts = DEFAULT_FTS; 126 ieee->scan_age = DEFAULT_MAX_SCAN_AGE; 127 ieee->open_wep = 1; 128 129 /* Default to enabling full open WEP with host based encrypt/decrypt */ 130 ieee->host_encrypt = 1; 131 ieee->host_decrypt = 1; 132 ieee->ieee802_1x = 1; /* Default to supporting 802.1x */ 133 134 INIT_LIST_HEAD(&ieee->crypt_deinit_list); 135 init_timer(&ieee->crypt_deinit_timer); 136 ieee->crypt_deinit_timer.data = (unsigned long)ieee; 137 ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler; 138 139 spin_lock_init(&ieee->lock); 140 spin_lock_init(&ieee->wpax_suitlist_lock); 141 142 ieee->wpax_type_set = 0; 143 ieee->wpa_enabled = 0; 144 ieee->tkip_countermeasures = 0; 145 ieee->drop_unencrypted = 0; 146 ieee->privacy_invoked = 0; 147 ieee->ieee802_1x = 1; 148 ieee->raw_tx = 0; 149 150 ieee80211_softmac_init(ieee); 151 152 for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) 153 INIT_LIST_HEAD(&ieee->ibss_mac_hash[i]); 154 155 for (i = 0; i < 17; i++) { 156 ieee->last_rxseq_num[i] = -1; 157 ieee->last_rxfrag_num[i] = -1; 158 ieee->last_packet_time[i] = 0; 159 } 160//These function were added to load crypte module autoly 161 ieee80211_tkip_null(); 162 ieee80211_wep_null(); 163 ieee80211_ccmp_null(); 164 return dev; 165 166 failed: 167 if (dev) 168 free_netdev(dev); 169 return NULL; 170} 171 172 173void free_ieee80211(struct net_device *dev) 174{ 175 struct ieee80211_device *ieee = netdev_priv(dev); 176 177 int i; 178 struct list_head *p, *q; 179 180 181 ieee80211_softmac_free(ieee); 182 del_timer_sync(&ieee->crypt_deinit_timer); 183 ieee80211_crypt_deinit_entries(ieee, 1); 184 185 for (i = 0; i < WEP_KEYS; i++) { 186 struct ieee80211_crypt_data *crypt = ieee->crypt[i]; 187 if (crypt) { 188 if (crypt->ops) 189 crypt->ops->deinit(crypt->priv); 190 kfree(crypt); 191 ieee->crypt[i] = NULL; 192 } 193 } 194 195 ieee80211_networks_free(ieee); 196 197 for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) { 198 list_for_each_safe(p, q, &ieee->ibss_mac_hash[i]) { 199 kfree(list_entry(p, struct ieee_ibss_seq, list)); 200 list_del(p); 201 } 202 } 203 204 205 free_netdev(dev); 206}