Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
[pandora-kernel.git] / drivers / staging / rtl8187se / ieee80211 / ieee80211_module.c
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/version.h>
50 #include <linux/wireless.h>
51 #include <linux/etherdevice.h>
52 #include <asm/uaccess.h>
53 #include <net/arp.h>
54 #include <net/net_namespace.h>
55
56 #include "ieee80211.h"
57
58 MODULE_DESCRIPTION("802.11 data/management/control stack");
59 MODULE_AUTHOR("Copyright (C) 2004 Intel Corporation <jketreno@linux.intel.com>");
60 MODULE_LICENSE("GPL");
61
62 #define DRV_NAME "ieee80211"
63
64 static inline int ieee80211_networks_allocate(struct ieee80211_device *ieee)
65 {
66         if (ieee->networks)
67                 return 0;
68
69         ieee->networks = kcalloc(
70                 MAX_NETWORK_COUNT, sizeof(struct ieee80211_network),
71                 GFP_KERNEL);
72         if (!ieee->networks) {
73                 printk(KERN_WARNING "%s: Out of memory allocating beacons\n",
74                        ieee->dev->name);
75                 return -ENOMEM;
76         }
77
78         return 0;
79 }
80
81 static inline void ieee80211_networks_free(struct ieee80211_device *ieee)
82 {
83         if (!ieee->networks)
84                 return;
85         kfree(ieee->networks);
86         ieee->networks = NULL;
87 }
88
89 static inline void ieee80211_networks_initialize(struct ieee80211_device *ieee)
90 {
91         int i;
92
93         INIT_LIST_HEAD(&ieee->network_free_list);
94         INIT_LIST_HEAD(&ieee->network_list);
95         for (i = 0; i < MAX_NETWORK_COUNT; i++)
96                 list_add_tail(&ieee->networks[i].list, &ieee->network_free_list);
97 }
98
99
100 struct net_device *alloc_ieee80211(int sizeof_priv)
101 {
102         struct ieee80211_device *ieee;
103         struct net_device *dev;
104         int i,err;
105
106         IEEE80211_DEBUG_INFO("Initializing...\n");
107
108         dev = alloc_etherdev(sizeof(struct ieee80211_device) + sizeof_priv);
109         if (!dev) {
110                 IEEE80211_ERROR("Unable to network device.\n");
111                 goto failed;
112         }
113         ieee = netdev_priv(dev);
114
115         ieee->dev = dev;
116
117         err = ieee80211_networks_allocate(ieee);
118         if (err) {
119                 IEEE80211_ERROR("Unable to allocate beacon storage: %d\n",
120                                 err);
121                 goto failed;
122         }
123         ieee80211_networks_initialize(ieee);
124
125         /* Default fragmentation threshold is maximum payload size */
126         ieee->fts = DEFAULT_FTS;
127         ieee->scan_age = DEFAULT_MAX_SCAN_AGE;
128         ieee->open_wep = 1;
129
130         /* Default to enabling full open WEP with host based encrypt/decrypt */
131         ieee->host_encrypt = 1;
132         ieee->host_decrypt = 1;
133         ieee->ieee802_1x = 1; /* Default to supporting 802.1x */
134
135         INIT_LIST_HEAD(&ieee->crypt_deinit_list);
136         init_timer(&ieee->crypt_deinit_timer);
137         ieee->crypt_deinit_timer.data = (unsigned long)ieee;
138         ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler;
139
140         spin_lock_init(&ieee->lock);
141         spin_lock_init(&ieee->wpax_suitlist_lock);
142
143         ieee->wpax_type_set = 0;
144         ieee->wpa_enabled = 0;
145         ieee->tkip_countermeasures = 0;
146         ieee->drop_unencrypted = 0;
147         ieee->privacy_invoked = 0;
148         ieee->ieee802_1x = 1;
149         ieee->raw_tx = 0;
150
151         ieee80211_softmac_init(ieee);
152
153         for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++)
154                 INIT_LIST_HEAD(&ieee->ibss_mac_hash[i]);
155
156         for (i = 0; i < 17; i++) {
157           ieee->last_rxseq_num[i] = -1;
158           ieee->last_rxfrag_num[i] = -1;
159           ieee->last_packet_time[i] = 0;
160         }
161 //These function were added to load crypte module autoly
162         ieee80211_tkip_null();
163         ieee80211_wep_null();
164         ieee80211_ccmp_null();
165         return dev;
166
167  failed:
168         if (dev)
169                 free_netdev(dev);
170         return NULL;
171 }
172
173
174 void free_ieee80211(struct net_device *dev)
175 {
176         struct ieee80211_device *ieee = netdev_priv(dev);
177
178         int i;
179         struct list_head *p, *q;
180
181
182         ieee80211_softmac_free(ieee);
183         del_timer_sync(&ieee->crypt_deinit_timer);
184         ieee80211_crypt_deinit_entries(ieee, 1);
185
186         for (i = 0; i < WEP_KEYS; i++) {
187                 struct ieee80211_crypt_data *crypt = ieee->crypt[i];
188                 if (crypt) {
189                         if (crypt->ops)
190                                 crypt->ops->deinit(crypt->priv);
191                         kfree(crypt);
192                         ieee->crypt[i] = NULL;
193                 }
194         }
195
196         ieee80211_networks_free(ieee);
197
198         for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++) {
199                 list_for_each_safe(p, q, &ieee->ibss_mac_hash[i]) {
200                         kfree(list_entry(p, struct ieee_ibss_seq, list));
201                         list_del(p);
202                 }
203         }
204
205
206         free_netdev(dev);
207 }