[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:
@ -334,7 +334,6 @@ struct net_device
|
|||||||
|
|
||||||
|
|
||||||
struct net_device_stats* (*get_stats)(struct net_device *dev);
|
struct net_device_stats* (*get_stats)(struct net_device *dev);
|
||||||
struct iw_statistics* (*get_wireless_stats)(struct net_device *dev);
|
|
||||||
|
|
||||||
/* List of functions to handle Wireless Extensions (instead of ioctl).
|
/* List of functions to handle Wireless Extensions (instead of ioctl).
|
||||||
* See <net/iw_handler.h> for details. Jean II */
|
* See <net/iw_handler.h> for details. Jean II */
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* This file define a set of standard wireless extensions
|
* This file define a set of standard wireless extensions
|
||||||
*
|
*
|
||||||
* Version : 20 17.2.06
|
* Version : 21 14.3.06
|
||||||
*
|
*
|
||||||
* Authors : Jean Tourrilhes - HPL - <jt@hpl.hp.com>
|
* Authors : Jean Tourrilhes - HPL - <jt@hpl.hp.com>
|
||||||
* Copyright (c) 1997-2006 Jean Tourrilhes, All Rights Reserved.
|
* Copyright (c) 1997-2006 Jean Tourrilhes, All Rights Reserved.
|
||||||
@ -69,9 +69,14 @@
|
|||||||
|
|
||||||
/***************************** INCLUDES *****************************/
|
/***************************** INCLUDES *****************************/
|
||||||
|
|
||||||
|
/* This header is used in user-space, therefore need to be sanitised
|
||||||
|
* for that purpose. Those includes are usually not compatible with glibc.
|
||||||
|
* To know which includes to use in user-space, check iwlib.h. */
|
||||||
|
#ifdef __KERNEL__
|
||||||
#include <linux/types.h> /* for "caddr_t" et al */
|
#include <linux/types.h> /* for "caddr_t" et al */
|
||||||
#include <linux/socket.h> /* for "struct sockaddr" et al */
|
#include <linux/socket.h> /* for "struct sockaddr" et al */
|
||||||
#include <linux/if.h> /* for IFNAMSIZ and co... */
|
#include <linux/if.h> /* for IFNAMSIZ and co... */
|
||||||
|
#endif /* __KERNEL__ */
|
||||||
|
|
||||||
/***************************** VERSION *****************************/
|
/***************************** VERSION *****************************/
|
||||||
/*
|
/*
|
||||||
@ -80,7 +85,7 @@
|
|||||||
* (there is some stuff that will be added in the future...)
|
* (there is some stuff that will be added in the future...)
|
||||||
* I just plan to increment with each new version.
|
* I just plan to increment with each new version.
|
||||||
*/
|
*/
|
||||||
#define WIRELESS_EXT 20
|
#define WIRELESS_EXT 21
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Changes :
|
* Changes :
|
||||||
@ -208,6 +213,14 @@
|
|||||||
* V19 to V20
|
* V19 to V20
|
||||||
* ----------
|
* ----------
|
||||||
* - RtNetlink requests support (SET/GET)
|
* - RtNetlink requests support (SET/GET)
|
||||||
|
*
|
||||||
|
* V20 to V21
|
||||||
|
* ----------
|
||||||
|
* - Remove (struct net_device *)->get_wireless_stats()
|
||||||
|
* - Change length in ESSID and NICK to strlen() instead of strlen()+1
|
||||||
|
* - Add IW_RETRY_SHORT/IW_RETRY_LONG retry modifiers
|
||||||
|
* - Power/Retry relative values no longer * 100000
|
||||||
|
* - Add explicit flag to tell stats are in 802.11k RCPI : IW_QUAL_RCPI
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**************************** CONSTANTS ****************************/
|
/**************************** CONSTANTS ****************************/
|
||||||
@ -448,6 +461,7 @@
|
|||||||
#define IW_QUAL_QUAL_INVALID 0x10 /* Driver doesn't provide value */
|
#define IW_QUAL_QUAL_INVALID 0x10 /* Driver doesn't provide value */
|
||||||
#define IW_QUAL_LEVEL_INVALID 0x20
|
#define IW_QUAL_LEVEL_INVALID 0x20
|
||||||
#define IW_QUAL_NOISE_INVALID 0x40
|
#define IW_QUAL_NOISE_INVALID 0x40
|
||||||
|
#define IW_QUAL_RCPI 0x80 /* Level + Noise are 802.11k RCPI */
|
||||||
#define IW_QUAL_ALL_INVALID 0x70
|
#define IW_QUAL_ALL_INVALID 0x70
|
||||||
|
|
||||||
/* Frequency flags */
|
/* Frequency flags */
|
||||||
@ -500,10 +514,12 @@
|
|||||||
#define IW_RETRY_TYPE 0xF000 /* Type of parameter */
|
#define IW_RETRY_TYPE 0xF000 /* Type of parameter */
|
||||||
#define IW_RETRY_LIMIT 0x1000 /* Maximum number of retries*/
|
#define IW_RETRY_LIMIT 0x1000 /* Maximum number of retries*/
|
||||||
#define IW_RETRY_LIFETIME 0x2000 /* Maximum duration of retries in us */
|
#define IW_RETRY_LIFETIME 0x2000 /* Maximum duration of retries in us */
|
||||||
#define IW_RETRY_MODIFIER 0x000F /* Modify a parameter */
|
#define IW_RETRY_MODIFIER 0x00FF /* Modify a parameter */
|
||||||
#define IW_RETRY_MIN 0x0001 /* Value is a minimum */
|
#define IW_RETRY_MIN 0x0001 /* Value is a minimum */
|
||||||
#define IW_RETRY_MAX 0x0002 /* Value is a maximum */
|
#define IW_RETRY_MAX 0x0002 /* Value is a maximum */
|
||||||
#define IW_RETRY_RELATIVE 0x0004 /* Value is not in seconds/ms/us */
|
#define IW_RETRY_RELATIVE 0x0004 /* Value is not in seconds/ms/us */
|
||||||
|
#define IW_RETRY_SHORT 0x0010 /* Value is for short packets */
|
||||||
|
#define IW_RETRY_LONG 0x0020 /* Value is for long packets */
|
||||||
|
|
||||||
/* Scanning request flags */
|
/* Scanning request flags */
|
||||||
#define IW_SCAN_DEFAULT 0x0000 /* Default scan of the driver */
|
#define IW_SCAN_DEFAULT 0x0000 /* Default scan of the driver */
|
||||||
|
@ -344,8 +344,6 @@ static ssize_t wireless_show(struct class_device *cd, char *buf,
|
|||||||
if(dev->wireless_handlers &&
|
if(dev->wireless_handlers &&
|
||||||
dev->wireless_handlers->get_wireless_stats)
|
dev->wireless_handlers->get_wireless_stats)
|
||||||
iw = dev->wireless_handlers->get_wireless_stats(dev);
|
iw = dev->wireless_handlers->get_wireless_stats(dev);
|
||||||
else if (dev->get_wireless_stats)
|
|
||||||
iw = dev->get_wireless_stats(dev);
|
|
||||||
if (iw != NULL)
|
if (iw != NULL)
|
||||||
ret = (*format)(iw, buf);
|
ret = (*format)(iw, buf);
|
||||||
}
|
}
|
||||||
@ -465,8 +463,7 @@ int netdev_register_sysfs(struct net_device *net)
|
|||||||
*groups++ = &netstat_group;
|
*groups++ = &netstat_group;
|
||||||
|
|
||||||
#ifdef WIRELESS_EXT
|
#ifdef WIRELESS_EXT
|
||||||
if (net->get_wireless_stats
|
if (net->wireless_handlers && net->wireless_handlers->get_wireless_stats)
|
||||||
|| (net->wireless_handlers && net->wireless_handlers->get_wireless_stats))
|
|
||||||
*groups++ = &wireless_group;
|
*groups++ = &wireless_group;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -68,6 +68,14 @@
|
|||||||
*
|
*
|
||||||
* v8 - 17.02.06 - Jean II
|
* v8 - 17.02.06 - Jean II
|
||||||
* o RtNetlink requests support (SET/GET)
|
* 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 *****************************/
|
/***************************** INCLUDES *****************************/
|
||||||
@ -234,24 +242,24 @@ static const struct iw_ioctl_description standard_ioctl[] = {
|
|||||||
[SIOCSIWESSID - SIOCIWFIRST] = {
|
[SIOCSIWESSID - SIOCIWFIRST] = {
|
||||||
.header_type = IW_HEADER_TYPE_POINT,
|
.header_type = IW_HEADER_TYPE_POINT,
|
||||||
.token_size = 1,
|
.token_size = 1,
|
||||||
.max_tokens = IW_ESSID_MAX_SIZE + 1,
|
.max_tokens = IW_ESSID_MAX_SIZE,
|
||||||
.flags = IW_DESCR_FLAG_EVENT,
|
.flags = IW_DESCR_FLAG_EVENT,
|
||||||
},
|
},
|
||||||
[SIOCGIWESSID - SIOCIWFIRST] = {
|
[SIOCGIWESSID - SIOCIWFIRST] = {
|
||||||
.header_type = IW_HEADER_TYPE_POINT,
|
.header_type = IW_HEADER_TYPE_POINT,
|
||||||
.token_size = 1,
|
.token_size = 1,
|
||||||
.max_tokens = IW_ESSID_MAX_SIZE + 1,
|
.max_tokens = IW_ESSID_MAX_SIZE,
|
||||||
.flags = IW_DESCR_FLAG_DUMP,
|
.flags = IW_DESCR_FLAG_DUMP,
|
||||||
},
|
},
|
||||||
[SIOCSIWNICKN - SIOCIWFIRST] = {
|
[SIOCSIWNICKN - SIOCIWFIRST] = {
|
||||||
.header_type = IW_HEADER_TYPE_POINT,
|
.header_type = IW_HEADER_TYPE_POINT,
|
||||||
.token_size = 1,
|
.token_size = 1,
|
||||||
.max_tokens = IW_ESSID_MAX_SIZE + 1,
|
.max_tokens = IW_ESSID_MAX_SIZE,
|
||||||
},
|
},
|
||||||
[SIOCGIWNICKN - SIOCIWFIRST] = {
|
[SIOCGIWNICKN - SIOCIWFIRST] = {
|
||||||
.header_type = IW_HEADER_TYPE_POINT,
|
.header_type = IW_HEADER_TYPE_POINT,
|
||||||
.token_size = 1,
|
.token_size = 1,
|
||||||
.max_tokens = IW_ESSID_MAX_SIZE + 1,
|
.max_tokens = IW_ESSID_MAX_SIZE,
|
||||||
},
|
},
|
||||||
[SIOCSIWRATE - SIOCIWFIRST] = {
|
[SIOCSIWRATE - SIOCIWFIRST] = {
|
||||||
.header_type = IW_HEADER_TYPE_PARAM,
|
.header_type = IW_HEADER_TYPE_PARAM,
|
||||||
@ -338,7 +346,7 @@ static const struct iw_ioctl_description standard_ioctl[] = {
|
|||||||
.max_tokens = sizeof(struct iw_pmksa),
|
.max_tokens = sizeof(struct iw_pmksa),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
static const int standard_ioctl_num = (sizeof(standard_ioctl) /
|
static const unsigned standard_ioctl_num = (sizeof(standard_ioctl) /
|
||||||
sizeof(struct iw_ioctl_description));
|
sizeof(struct iw_ioctl_description));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -389,7 +397,7 @@ static const struct iw_ioctl_description standard_event[] = {
|
|||||||
.max_tokens = sizeof(struct iw_pmkid_cand),
|
.max_tokens = sizeof(struct iw_pmkid_cand),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
static const int standard_event_num = (sizeof(standard_event) /
|
static const unsigned standard_event_num = (sizeof(standard_event) /
|
||||||
sizeof(struct iw_ioctl_description));
|
sizeof(struct iw_ioctl_description));
|
||||||
|
|
||||||
/* Size (in bytes) of the various private data types */
|
/* Size (in bytes) of the various private data types */
|
||||||
@ -465,17 +473,6 @@ static inline struct iw_statistics *get_wireless_stats(struct net_device *dev)
|
|||||||
(dev->wireless_handlers->get_wireless_stats != NULL))
|
(dev->wireless_handlers->get_wireless_stats != NULL))
|
||||||
return dev->wireless_handlers->get_wireless_stats(dev);
|
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 */
|
/* Not found */
|
||||||
return (struct iw_statistics *) NULL;
|
return (struct iw_statistics *) NULL;
|
||||||
}
|
}
|
||||||
@ -1843,8 +1840,33 @@ int wireless_rtnetlink_set(struct net_device * dev,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef WE_EVENT_RTNETLINK
|
#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 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)
|
static void wireless_nlevent_process(unsigned long data)
|
||||||
{
|
{
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
@ -1921,13 +1943,6 @@ static inline void rtmsg_iwinfo(struct net_device * dev,
|
|||||||
tasklet_schedule(&wireless_nlevent_tasklet);
|
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 */
|
#endif /* WE_EVENT_RTNETLINK */
|
||||||
|
|
||||||
/* ---------------------------------------------------------------- */
|
/* ---------------------------------------------------------------- */
|
||||||
|
Reference in New Issue
Block a user