1 // SPDX-License-Identifier: GPL-2.0-only
2 /*******************************************************************************
4 Copyright(c) 2004-2005 Intel Corporation. All rights reserved.
6 Portions of this file are based on the WEP enablement code provided by the
7 Host AP project hostap-drivers v0.1.3
8 Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
10 Copyright (c) 2002-2003, Jouni Malinen <j@w1.fi>
14 Intel Linux Wireless <ilw@linux.intel.com>
15 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
17 *******************************************************************************/
19 #include <linux/compiler.h>
20 #include <linux/errno.h>
21 #include <linux/if_arp.h>
22 #include <linux/in6.h>
25 #include <linux/kernel.h>
26 #include <linux/module.h>
27 #include <linux/netdevice.h>
28 #include <linux/proc_fs.h>
29 #include <linux/skbuff.h>
30 #include <linux/slab.h>
31 #include <linux/tcp.h>
32 #include <linux/types.h>
33 #include <linux/wireless.h>
34 #include <linux/etherdevice.h>
35 #include <linux/uaccess.h>
36 #include <net/net_namespace.h>
41 #define DRV_DESCRIPTION "802.11 data/management/control stack"
42 #define DRV_NAME "libipw"
43 #define DRV_PROCNAME "ieee80211"
44 #define DRV_VERSION LIBIPW_VERSION
45 #define DRV_COPYRIGHT "Copyright (C) 2004-2005 Intel Corporation <jketreno@linux.intel.com>"
47 MODULE_VERSION(DRV_VERSION
);
48 MODULE_DESCRIPTION(DRV_DESCRIPTION
);
49 MODULE_AUTHOR(DRV_COPYRIGHT
);
50 MODULE_LICENSE("GPL");
52 static struct cfg80211_ops libipw_config_ops
= { };
53 static void *libipw_wiphy_privid
= &libipw_wiphy_privid
;
55 static int libipw_networks_allocate(struct libipw_device
*ieee
)
59 for (i
= 0; i
< MAX_NETWORK_COUNT
; i
++) {
60 ieee
->networks
[i
] = kzalloc(sizeof(struct libipw_network
),
62 if (!ieee
->networks
[i
]) {
63 LIBIPW_ERROR("Out of memory allocating beacons\n");
64 for (j
= 0; j
< i
; j
++)
65 kfree(ieee
->networks
[j
]);
73 static inline void libipw_networks_free(struct libipw_device
*ieee
)
77 for (i
= 0; i
< MAX_NETWORK_COUNT
; i
++)
78 kfree(ieee
->networks
[i
]);
81 void libipw_networks_age(struct libipw_device
*ieee
,
82 unsigned long age_secs
)
84 struct libipw_network
*network
= NULL
;
86 unsigned long age_jiffies
= msecs_to_jiffies(age_secs
* MSEC_PER_SEC
);
88 spin_lock_irqsave(&ieee
->lock
, flags
);
89 list_for_each_entry(network
, &ieee
->network_list
, list
) {
90 network
->last_scanned
-= age_jiffies
;
92 spin_unlock_irqrestore(&ieee
->lock
, flags
);
94 EXPORT_SYMBOL(libipw_networks_age
);
96 static void libipw_networks_initialize(struct libipw_device
*ieee
)
100 INIT_LIST_HEAD(&ieee
->network_free_list
);
101 INIT_LIST_HEAD(&ieee
->network_list
);
102 for (i
= 0; i
< MAX_NETWORK_COUNT
; i
++)
103 list_add_tail(&ieee
->networks
[i
]->list
,
104 &ieee
->network_free_list
);
107 struct net_device
*alloc_libipw(int sizeof_priv
, int monitor
)
109 struct libipw_device
*ieee
;
110 struct net_device
*dev
;
113 LIBIPW_DEBUG_INFO("Initializing...\n");
115 dev
= alloc_etherdev(sizeof(struct libipw_device
) + sizeof_priv
);
119 ieee
= netdev_priv(dev
);
124 ieee
->wdev
.wiphy
= wiphy_new(&libipw_config_ops
, 0);
125 if (!ieee
->wdev
.wiphy
) {
126 LIBIPW_ERROR("Unable to allocate wiphy.\n");
127 goto failed_free_netdev
;
130 ieee
->dev
->ieee80211_ptr
= &ieee
->wdev
;
131 ieee
->wdev
.iftype
= NL80211_IFTYPE_STATION
;
133 /* Fill-out wiphy structure bits we know... Not enough info
134 here to call set_wiphy_dev or set MAC address or channel info
135 -- have to do that in ->ndo_init... */
136 ieee
->wdev
.wiphy
->privid
= libipw_wiphy_privid
;
138 ieee
->wdev
.wiphy
->max_scan_ssids
= 1;
139 ieee
->wdev
.wiphy
->max_scan_ie_len
= 0;
140 ieee
->wdev
.wiphy
->interface_modes
= BIT(NL80211_IFTYPE_STATION
)
141 | BIT(NL80211_IFTYPE_ADHOC
);
144 err
= libipw_networks_allocate(ieee
);
146 LIBIPW_ERROR("Unable to allocate beacon storage: %d\n", err
);
147 goto failed_free_wiphy
;
149 libipw_networks_initialize(ieee
);
151 /* Default fragmentation threshold is maximum payload size */
152 ieee
->fts
= DEFAULT_FTS
;
153 ieee
->rts
= DEFAULT_FTS
;
154 ieee
->scan_age
= DEFAULT_MAX_SCAN_AGE
;
157 /* Default to enabling full open WEP with host based encrypt/decrypt */
158 ieee
->host_encrypt
= 1;
159 ieee
->host_decrypt
= 1;
160 ieee
->host_mc_decrypt
= 1;
162 /* Host fragmentation in Open mode. Default is enabled.
163 * Note: host fragmentation is always enabled if host encryption
164 * is enabled. For cards can do hardware encryption, they must do
165 * hardware fragmentation as well. So we don't need a variable
166 * like host_enc_frag. */
167 ieee
->host_open_frag
= 1;
168 ieee
->ieee802_1x
= 1; /* Default to supporting 802.1x */
170 spin_lock_init(&ieee
->lock
);
172 lib80211_crypt_info_init(&ieee
->crypt_info
, dev
->name
, &ieee
->lock
);
174 ieee
->wpa_enabled
= 0;
175 ieee
->drop_unencrypted
= 0;
176 ieee
->privacy_invoked
= 0;
182 wiphy_free(ieee
->wdev
.wiphy
);
188 EXPORT_SYMBOL(alloc_libipw
);
190 void free_libipw(struct net_device
*dev
, int monitor
)
192 struct libipw_device
*ieee
= netdev_priv(dev
);
194 lib80211_crypt_info_free(&ieee
->crypt_info
);
196 libipw_networks_free(ieee
);
198 /* free cfg80211 resources */
200 wiphy_free(ieee
->wdev
.wiphy
);
204 EXPORT_SYMBOL(free_libipw
);
206 #ifdef CONFIG_LIBIPW_DEBUG
208 static int debug
= 0;
209 u32 libipw_debug_level
= 0;
210 EXPORT_SYMBOL_GPL(libipw_debug_level
);
211 static struct proc_dir_entry
*libipw_proc
= NULL
;
213 static int debug_level_proc_show(struct seq_file
*m
, void *v
)
215 seq_printf(m
, "0x%08X\n", libipw_debug_level
);
219 static int debug_level_proc_open(struct inode
*inode
, struct file
*file
)
221 return single_open(file
, debug_level_proc_show
, NULL
);
224 static ssize_t
debug_level_proc_write(struct file
*file
,
225 const char __user
*buffer
, size_t count
, loff_t
*pos
)
227 char buf
[] = "0x00000000\n";
228 size_t len
= min(sizeof(buf
) - 1, count
);
231 if (copy_from_user(buf
, buffer
, len
))
234 if (sscanf(buf
, "%li", &val
) != 1)
235 printk(KERN_INFO DRV_NAME
236 ": %s is not in hex or decimal form.\n", buf
);
238 libipw_debug_level
= val
;
240 return strnlen(buf
, len
);
243 static const struct proc_ops debug_level_proc_ops
= {
244 .proc_open
= debug_level_proc_open
,
245 .proc_read
= seq_read
,
246 .proc_lseek
= seq_lseek
,
247 .proc_release
= single_release
,
248 .proc_write
= debug_level_proc_write
,
250 #endif /* CONFIG_LIBIPW_DEBUG */
252 static int __init
libipw_init(void)
254 #ifdef CONFIG_LIBIPW_DEBUG
255 struct proc_dir_entry
*e
;
257 libipw_debug_level
= debug
;
258 libipw_proc
= proc_mkdir(DRV_PROCNAME
, init_net
.proc_net
);
259 if (libipw_proc
== NULL
) {
260 LIBIPW_ERROR("Unable to create " DRV_PROCNAME
261 " proc directory\n");
264 e
= proc_create("debug_level", 0644, libipw_proc
,
265 &debug_level_proc_ops
);
267 remove_proc_entry(DRV_PROCNAME
, init_net
.proc_net
);
271 #endif /* CONFIG_LIBIPW_DEBUG */
273 printk(KERN_INFO DRV_NAME
": " DRV_DESCRIPTION
", " DRV_VERSION
"\n");
274 printk(KERN_INFO DRV_NAME
": " DRV_COPYRIGHT
"\n");
279 static void __exit
libipw_exit(void)
281 #ifdef CONFIG_LIBIPW_DEBUG
283 remove_proc_entry("debug_level", libipw_proc
);
284 remove_proc_entry(DRV_PROCNAME
, init_net
.proc_net
);
287 #endif /* CONFIG_LIBIPW_DEBUG */
290 #ifdef CONFIG_LIBIPW_DEBUG
291 #include <linux/moduleparam.h>
292 module_param(debug
, int, 0444);
293 MODULE_PARM_DESC(debug
, "debug output mask");
294 #endif /* CONFIG_LIBIPW_DEBUG */
296 module_exit(libipw_exit
);
297 module_init(libipw_init
);