PageRenderTime 28ms CodeModel.GetById 20ms app.highlight 6ms RepoModel.GetById 1ms app.codeStats 0ms

/drivers/staging/rtl8187se/ieee80211/ieee80211_module.c

https://bitbucket.org/cyanogenmod/android_kernel_asus_tf300t
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}