blob: 9d5788e04dd5447a75f7285f49ce804179879982 [file] [log] [blame]
Larry Finger94a79942011-08-23 19:00:42 -05001/*******************************************************************************
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
Larry Finger94a79942011-08-23 19:00:42 -050020 The full GNU General Public License is included in this distribution in the
21 file called LICENSE.
22
23 Contact Information:
24 James P. Ketrenos <ipw2100-admin@linux.intel.com>
25 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
26
27*******************************************************************************/
28
29#include <linux/compiler.h>
30#include <linux/errno.h>
31#include <linux/if_arp.h>
32#include <linux/in6.h>
33#include <linux/in.h>
34#include <linux/ip.h>
35#include <linux/kernel.h>
36#include <linux/module.h>
37#include <linux/netdevice.h>
38#include <linux/pci.h>
39#include <linux/proc_fs.h>
40#include <linux/skbuff.h>
41#include <linux/slab.h>
42#include <linux/tcp.h>
43#include <linux/types.h>
Larry Finger94a79942011-08-23 19:00:42 -050044#include <linux/wireless.h>
45#include <linux/etherdevice.h>
Larry Finger85678292011-08-25 11:48:24 -050046#include <linux/uaccess.h>
Larry Finger94a79942011-08-23 19:00:42 -050047#include <net/arp.h>
Larry Finger94a79942011-08-23 19:00:42 -050048#include "rtllib.h"
49
Sean MacLennand37e0202011-11-28 20:21:27 -050050u32 rt_global_debug_component = COMP_ERR;
51EXPORT_SYMBOL(rt_global_debug_component);
52
Larry Finger94a79942011-08-23 19:00:42 -050053static inline int rtllib_networks_allocate(struct rtllib_device *ieee)
54{
55 if (ieee->networks)
56 return 0;
57
Shraddha Barke749f3c02015-10-09 21:03:29 +053058 ieee->networks = kcalloc(MAX_NETWORK_COUNT,
59 sizeof(struct rtllib_network), GFP_KERNEL);
Quentin Lambertb6b00122015-03-05 14:12:15 +010060 if (!ieee->networks)
Larry Finger94a79942011-08-23 19:00:42 -050061 return -ENOMEM;
Larry Finger94a79942011-08-23 19:00:42 -050062
Larry Finger94a79942011-08-23 19:00:42 -050063 return 0;
64}
65
66static inline void rtllib_networks_free(struct rtllib_device *ieee)
67{
68 if (!ieee->networks)
69 return;
Larry Finger94a79942011-08-23 19:00:42 -050070 kfree(ieee->networks);
Larry Finger94a79942011-08-23 19:00:42 -050071 ieee->networks = NULL;
72}
73
74static inline void rtllib_networks_initialize(struct rtllib_device *ieee)
75{
76 int i;
77
78 INIT_LIST_HEAD(&ieee->network_free_list);
79 INIT_LIST_HEAD(&ieee->network_list);
80 for (i = 0; i < MAX_NETWORK_COUNT; i++)
Larry Finger85678292011-08-25 11:48:24 -050081 list_add_tail(&ieee->networks[i].list,
82 &ieee->network_free_list);
Larry Finger94a79942011-08-23 19:00:42 -050083}
84
Larry Finger94a79942011-08-23 19:00:42 -050085struct net_device *alloc_rtllib(int sizeof_priv)
86{
87 struct rtllib_device *ieee = NULL;
88 struct net_device *dev;
Larry Finger85678292011-08-25 11:48:24 -050089 int i, err;
Larry Finger94a79942011-08-23 19:00:42 -050090
Mateusz Kulikowskidef16d22015-05-31 20:19:34 +020091 pr_debug("rtllib: Initializing...\n");
Larry Finger94a79942011-08-23 19:00:42 -050092
93 dev = alloc_etherdev(sizeof(struct rtllib_device) + sizeof_priv);
94 if (!dev) {
Mateusz Kulikowskif0dddb12015-05-31 20:19:27 +020095 pr_err("Unable to allocate net_device.\n");
Himangi Saraogi49d74d72014-06-21 20:39:51 +053096 return NULL;
Larry Finger94a79942011-08-23 19:00:42 -050097 }
98 ieee = (struct rtllib_device *)netdev_priv_rsl(dev);
99 memset(ieee, 0, sizeof(struct rtllib_device)+sizeof_priv);
100 ieee->dev = dev;
101
Larry Finger94a79942011-08-23 19:00:42 -0500102 err = rtllib_networks_allocate(ieee);
103 if (err) {
Mateusz Kulikowskif0dddb12015-05-31 20:19:27 +0200104 pr_err("Unable to allocate beacon storage: %d\n", err);
Larry Finger94a79942011-08-23 19:00:42 -0500105 goto failed;
106 }
107 rtllib_networks_initialize(ieee);
108
Larry Finger94a79942011-08-23 19:00:42 -0500109 /* Default fragmentation threshold is maximum payload size */
110 ieee->fts = DEFAULT_FTS;
111 ieee->scan_age = DEFAULT_MAX_SCAN_AGE;
112 ieee->open_wep = 1;
113
114 /* Default to enabling full open WEP with host based encrypt/decrypt */
115 ieee->host_encrypt = 1;
116 ieee->host_decrypt = 1;
117 ieee->ieee802_1x = 1; /* Default to supporting 802.1x */
118
Larry Finger94a79942011-08-23 19:00:42 -0500119 ieee->rtllib_ap_sec_type = rtllib_ap_sec_type;
120
121 spin_lock_init(&ieee->lock);
122 spin_lock_init(&ieee->wpax_suitlist_lock);
Larry Finger94a79942011-08-23 19:00:42 -0500123 spin_lock_init(&ieee->reorder_spinlock);
Larry Finger94a79942011-08-23 19:00:42 -0500124 atomic_set(&(ieee->atm_swbw), 0);
125
Sean MacLennan3b148be2011-12-19 23:23:08 -0500126 /* SAM FIXME */
127 lib80211_crypt_info_init(&ieee->crypt_info, "RTLLIB", &ieee->lock);
128
Larry Finger94a79942011-08-23 19:00:42 -0500129 ieee->wpa_enabled = 0;
130 ieee->tkip_countermeasures = 0;
131 ieee->drop_unencrypted = 0;
132 ieee->privacy_invoked = 0;
133 ieee->ieee802_1x = 1;
134 ieee->raw_tx = 0;
135 ieee->hwsec_active = 0;
136
Larry Finger85678292011-08-25 11:48:24 -0500137 memset(ieee->swcamtable, 0, sizeof(struct sw_cam_table) * 32);
Larry Finger94a79942011-08-23 19:00:42 -0500138 rtllib_softmac_init(ieee);
139
Larry Finger85678292011-08-25 11:48:24 -0500140 ieee->pHTInfo = kzalloc(sizeof(struct rt_hi_throughput), GFP_KERNEL);
Sandhya Bankar6869a112016-09-18 04:18:22 +0530141 if (!ieee->pHTInfo)
Larry Finger94a79942011-08-23 19:00:42 -0500142 return NULL;
Quentin Lambertb6b00122015-03-05 14:12:15 +0100143
Larry Finger94a79942011-08-23 19:00:42 -0500144 HTUpdateDefaultSetting(ieee);
145 HTInitializeHTInfo(ieee);
146 TSInitialize(ieee);
147 for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++)
148 INIT_LIST_HEAD(&ieee->ibss_mac_hash[i]);
149
150 for (i = 0; i < 17; i++) {
151 ieee->last_rxseq_num[i] = -1;
152 ieee->last_rxfrag_num[i] = -1;
153 ieee->last_packet_time[i] = 0;
154 }
155
Larry Finger94a79942011-08-23 19:00:42 -0500156 return dev;
157
158 failed:
Himangi Saraogi49d74d72014-06-21 20:39:51 +0530159 free_netdev(dev);
Larry Finger94a79942011-08-23 19:00:42 -0500160 return NULL;
161}
Sean MacLennan3b284992011-11-28 20:20:26 -0500162EXPORT_SYMBOL(alloc_rtllib);
Larry Finger94a79942011-08-23 19:00:42 -0500163
Larry Finger94a79942011-08-23 19:00:42 -0500164void free_rtllib(struct net_device *dev)
165{
Larry Finger85678292011-08-25 11:48:24 -0500166 struct rtllib_device *ieee = (struct rtllib_device *)
167 netdev_priv_rsl(dev);
Larry Fingerd7613e52011-09-01 12:23:21 -0500168
169 kfree(ieee->pHTInfo);
170 ieee->pHTInfo = NULL;
Larry Finger94a79942011-08-23 19:00:42 -0500171 rtllib_softmac_free(ieee);
Sean MacLennan0ddcf5f2011-12-19 23:21:41 -0500172
Sean MacLennan3b148be2011-12-19 23:23:08 -0500173 lib80211_crypt_info_free(&ieee->crypt_info);
Larry Finger94a79942011-08-23 19:00:42 -0500174
175 rtllib_networks_free(ieee);
Larry Finger94a79942011-08-23 19:00:42 -0500176 free_netdev(dev);
177}
Sean MacLennan3b284992011-11-28 20:20:26 -0500178EXPORT_SYMBOL(free_rtllib);
Larry Finger94a79942011-08-23 19:00:42 -0500179
Rashika Kheriacf8ab8c2013-11-02 23:38:00 +0530180static int __init rtllib_init(void)
Larry Finger94a79942011-08-23 19:00:42 -0500181{
Larry Finger94a79942011-08-23 19:00:42 -0500182 return 0;
183}
184
Rashika Kheriacf8ab8c2013-11-02 23:38:00 +0530185static void __exit rtllib_exit(void)
Larry Finger94a79942011-08-23 19:00:42 -0500186{
Larry Finger94a79942011-08-23 19:00:42 -0500187}
Sean MacLennand37e0202011-11-28 20:21:27 -0500188
189module_init(rtllib_init);
190module_exit(rtllib_exit);
191
192MODULE_LICENSE("GPL");