Merge branch 'for-linus' of git://git.kernel.dk/linux-block
[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/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
57 MODULE_DESCRIPTION("802.11 data/management/control stack");
58 MODULE_AUTHOR("Copyright (C) 2004 Intel Corporation <jketreno@linux.intel.com>");
59 MODULE_LICENSE("GPL");
60
61 #define DRV_NAME "ieee80211"
62
63 static 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
80 static 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
88 static 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
99 struct 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
173 void 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 }