[PATCH] WE-21 support (core API)
This is version 21 of the Wireless Extensions. Changelog : o finishes migrating the ESSID API (remove the +1) o netdev->get_wireless_stats is no more o long/short retry This is a redacted version of a patch originally submitted by Jean Tourrilhes. I removed most of the additions, in order to minimize future support requirements for nl80211 (or other WE successor). CC: Jean Tourrilhes <jt@hpl.hp.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
@ -68,6 +68,14 @@
|
||||
*
|
||||
* v8 - 17.02.06 - Jean II
|
||||
* o RtNetlink requests support (SET/GET)
|
||||
*
|
||||
* v8b - 03.08.06 - Herbert Xu
|
||||
* o Fix Wireless Event locking issues.
|
||||
*
|
||||
* v9 - 14.3.06 - Jean II
|
||||
* o Change length in ESSID and NICK to strlen() instead of strlen()+1
|
||||
* o Make standard_ioctl_num and standard_event_num unsigned
|
||||
* o Remove (struct net_device *)->get_wireless_stats()
|
||||
*/
|
||||
|
||||
/***************************** INCLUDES *****************************/
|
||||
@ -234,24 +242,24 @@ static const struct iw_ioctl_description standard_ioctl[] = {
|
||||
[SIOCSIWESSID - SIOCIWFIRST] = {
|
||||
.header_type = IW_HEADER_TYPE_POINT,
|
||||
.token_size = 1,
|
||||
.max_tokens = IW_ESSID_MAX_SIZE + 1,
|
||||
.max_tokens = IW_ESSID_MAX_SIZE,
|
||||
.flags = IW_DESCR_FLAG_EVENT,
|
||||
},
|
||||
[SIOCGIWESSID - SIOCIWFIRST] = {
|
||||
.header_type = IW_HEADER_TYPE_POINT,
|
||||
.token_size = 1,
|
||||
.max_tokens = IW_ESSID_MAX_SIZE + 1,
|
||||
.max_tokens = IW_ESSID_MAX_SIZE,
|
||||
.flags = IW_DESCR_FLAG_DUMP,
|
||||
},
|
||||
[SIOCSIWNICKN - SIOCIWFIRST] = {
|
||||
.header_type = IW_HEADER_TYPE_POINT,
|
||||
.token_size = 1,
|
||||
.max_tokens = IW_ESSID_MAX_SIZE + 1,
|
||||
.max_tokens = IW_ESSID_MAX_SIZE,
|
||||
},
|
||||
[SIOCGIWNICKN - SIOCIWFIRST] = {
|
||||
.header_type = IW_HEADER_TYPE_POINT,
|
||||
.token_size = 1,
|
||||
.max_tokens = IW_ESSID_MAX_SIZE + 1,
|
||||
.max_tokens = IW_ESSID_MAX_SIZE,
|
||||
},
|
||||
[SIOCSIWRATE - SIOCIWFIRST] = {
|
||||
.header_type = IW_HEADER_TYPE_PARAM,
|
||||
@ -338,8 +346,8 @@ static const struct iw_ioctl_description standard_ioctl[] = {
|
||||
.max_tokens = sizeof(struct iw_pmksa),
|
||||
},
|
||||
};
|
||||
static const int standard_ioctl_num = (sizeof(standard_ioctl) /
|
||||
sizeof(struct iw_ioctl_description));
|
||||
static const unsigned standard_ioctl_num = (sizeof(standard_ioctl) /
|
||||
sizeof(struct iw_ioctl_description));
|
||||
|
||||
/*
|
||||
* Meta-data about all the additional standard Wireless Extension events
|
||||
@ -389,8 +397,8 @@ static const struct iw_ioctl_description standard_event[] = {
|
||||
.max_tokens = sizeof(struct iw_pmkid_cand),
|
||||
},
|
||||
};
|
||||
static const int standard_event_num = (sizeof(standard_event) /
|
||||
sizeof(struct iw_ioctl_description));
|
||||
static const unsigned standard_event_num = (sizeof(standard_event) /
|
||||
sizeof(struct iw_ioctl_description));
|
||||
|
||||
/* Size (in bytes) of the various private data types */
|
||||
static const char iw_priv_type_size[] = {
|
||||
@ -465,17 +473,6 @@ static inline struct iw_statistics *get_wireless_stats(struct net_device *dev)
|
||||
(dev->wireless_handlers->get_wireless_stats != NULL))
|
||||
return dev->wireless_handlers->get_wireless_stats(dev);
|
||||
|
||||
/* Old location, field to be removed in next WE */
|
||||
if(dev->get_wireless_stats) {
|
||||
static int printed_message;
|
||||
|
||||
if (!printed_message++)
|
||||
printk(KERN_DEBUG "%s (WE) : Driver using old /proc/net/wireless support, please fix driver !\n",
|
||||
dev->name);
|
||||
|
||||
return dev->get_wireless_stats(dev);
|
||||
}
|
||||
|
||||
/* Not found */
|
||||
return (struct iw_statistics *) NULL;
|
||||
}
|
||||
@ -1843,8 +1840,33 @@ int wireless_rtnetlink_set(struct net_device * dev,
|
||||
*/
|
||||
|
||||
#ifdef WE_EVENT_RTNETLINK
|
||||
/* ---------------------------------------------------------------- */
|
||||
/*
|
||||
* Locking...
|
||||
* ----------
|
||||
*
|
||||
* Thanks to Herbert Xu <herbert@gondor.apana.org.au> for fixing
|
||||
* the locking issue in here and implementing this code !
|
||||
*
|
||||
* The issue : wireless_send_event() is often called in interrupt context,
|
||||
* while the Netlink layer can never be called in interrupt context.
|
||||
* The fully formed RtNetlink events are queued, and then a tasklet is run
|
||||
* to feed those to Netlink.
|
||||
* The skb_queue is interrupt safe, and its lock is not held while calling
|
||||
* Netlink, so there is no possibility of dealock.
|
||||
* Jean II
|
||||
*/
|
||||
|
||||
static struct sk_buff_head wireless_nlevent_queue;
|
||||
|
||||
static int __init wireless_nlevent_init(void)
|
||||
{
|
||||
skb_queue_head_init(&wireless_nlevent_queue);
|
||||
return 0;
|
||||
}
|
||||
|
||||
subsys_initcall(wireless_nlevent_init);
|
||||
|
||||
static void wireless_nlevent_process(unsigned long data)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
@ -1921,13 +1943,6 @@ static inline void rtmsg_iwinfo(struct net_device * dev,
|
||||
tasklet_schedule(&wireless_nlevent_tasklet);
|
||||
}
|
||||
|
||||
static int __init wireless_nlevent_init(void)
|
||||
{
|
||||
skb_queue_head_init(&wireless_nlevent_queue);
|
||||
return 0;
|
||||
}
|
||||
|
||||
subsys_initcall(wireless_nlevent_init);
|
||||
#endif /* WE_EVENT_RTNETLINK */
|
||||
|
||||
/* ---------------------------------------------------------------- */
|
||||
|
Reference in New Issue
Block a user