Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
ieee80211_module.c
Go to the documentation of this file.
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
9  Copyright (c) 2002-2003, Jouni Malinen <[email protected]>
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 <[email protected]>
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 <[email protected]>");
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;
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);
136  ieee->crypt_deinit_timer.data = (unsigned long)ieee;
138 
139  spin_lock_init(&ieee->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 
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
164  return dev;
165 
166  failed:
167  if (dev)
168  free_netdev(dev);
169  return NULL;
170 }
171 
172 
174 {
175  struct ieee80211_device *ieee = netdev_priv(dev);
176 
177  int i;
178  struct list_head *p, *q;
179 
180 
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 }