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 * 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> 44 #include <linux/wireless.h> 45 #include <linux/etherdevice.h> 46 #include <linux/uaccess.h> 47 #include <net/arp.h> 48 #include "rtllib.h" 49 50 u32 rt_global_debug_component = COMP_ERR; 51 EXPORT_SYMBOL(rt_global_debug_component); 52 53 static inline int rtllib_networks_allocate(struct rtllib_device *ieee) 54 { 55 if (ieee->networks) 56 return 0; 57 58 ieee->networks = kcalloc(MAX_NETWORK_COUNT, 59 sizeof(struct rtllib_network), GFP_KERNEL); 60 if (!ieee->networks) 61 return -ENOMEM; 62 63 return 0; 64 } 65 66 static inline void rtllib_networks_free(struct rtllib_device *ieee) 67 { 68 if (!ieee->networks) 69 return; 70 kfree(ieee->networks); 71 ieee->networks = NULL; 72 } 73 74 static 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++) 81 list_add_tail(&ieee->networks[i].list, 82 &ieee->network_free_list); 83 } 84 85 struct net_device *alloc_rtllib(int sizeof_priv) 86 { 87 struct rtllib_device *ieee = NULL; 88 struct net_device *dev; 89 int i, err; 90 91 pr_debug("rtllib: Initializing...\n"); 92 93 dev = alloc_etherdev(sizeof(struct rtllib_device) + sizeof_priv); 94 if (!dev) { 95 pr_err("Unable to allocate net_device.\n"); 96 return NULL; 97 } 98 ieee = (struct rtllib_device *)netdev_priv_rsl(dev); 99 memset(ieee, 0, sizeof(struct rtllib_device)+sizeof_priv); 100 ieee->dev = dev; 101 102 err = rtllib_networks_allocate(ieee); 103 if (err) { 104 pr_err("Unable to allocate beacon storage: %d\n", err); 105 goto failed; 106 } 107 rtllib_networks_initialize(ieee); 108 109 /* 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 119 ieee->rtllib_ap_sec_type = rtllib_ap_sec_type; 120 121 spin_lock_init(&ieee->lock); 122 spin_lock_init(&ieee->wpax_suitlist_lock); 123 spin_lock_init(&ieee->reorder_spinlock); 124 atomic_set(&(ieee->atm_swbw), 0); 125 126 /* SAM FIXME */ 127 lib80211_crypt_info_init(&ieee->crypt_info, "RTLLIB", &ieee->lock); 128 129 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 137 memset(ieee->swcamtable, 0, sizeof(struct sw_cam_table) * 32); 138 rtllib_softmac_init(ieee); 139 140 ieee->pHTInfo = kzalloc(sizeof(struct rt_hi_throughput), GFP_KERNEL); 141 if (!ieee->pHTInfo) 142 return NULL; 143 144 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 156 return dev; 157 158 failed: 159 free_netdev(dev); 160 return NULL; 161 } 162 EXPORT_SYMBOL(alloc_rtllib); 163 164 void free_rtllib(struct net_device *dev) 165 { 166 struct rtllib_device *ieee = (struct rtllib_device *) 167 netdev_priv_rsl(dev); 168 169 kfree(ieee->pHTInfo); 170 ieee->pHTInfo = NULL; 171 rtllib_softmac_free(ieee); 172 173 lib80211_crypt_info_free(&ieee->crypt_info); 174 175 rtllib_networks_free(ieee); 176 free_netdev(dev); 177 } 178 EXPORT_SYMBOL(free_rtllib); 179 180 static int __init rtllib_init(void) 181 { 182 return 0; 183 } 184 185 static void __exit rtllib_exit(void) 186 { 187 } 188 189 module_init(rtllib_init); 190 module_exit(rtllib_exit); 191 192 MODULE_LICENSE("GPL"); 193