mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-12-28 16:56:26 +00:00
wifi: wext/libipw: move spy implementation to libipw
There's no driver left using this other than ipw2200, so move the data bookkeeping and code into libipw. Link: https://patch.msgid.link/20241007210254.037d864cda7d.Ib2197cb056ff05746d3521a5fba637062acb7314@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
4991d2e7ad
commit
3a1d429ebd
@ -7,7 +7,6 @@ config IPW2100
|
||||
tristate "Intel PRO/Wireless 2100 Network Connection"
|
||||
depends on PCI && CFG80211
|
||||
select WIRELESS_EXT
|
||||
select WEXT_SPY
|
||||
select WEXT_PRIV
|
||||
select FW_LOADER
|
||||
select LIBIPW
|
||||
@ -68,7 +67,6 @@ config IPW2200
|
||||
depends on PCI && CFG80211
|
||||
select CFG80211_WEXT_EXPORT
|
||||
select WIRELESS_EXT
|
||||
select WEXT_SPY
|
||||
select WEXT_PRIV
|
||||
select FW_LOADER
|
||||
select LIBIPW
|
||||
@ -156,7 +154,6 @@ config LIBIPW
|
||||
tristate
|
||||
depends on PCI && CFG80211
|
||||
select WIRELESS_EXT
|
||||
select WEXT_SPY
|
||||
select CRYPTO
|
||||
select CRYPTO_MICHAEL_MIC
|
||||
select CRC32
|
||||
|
@ -13,6 +13,7 @@ libipw-objs := \
|
||||
libipw_rx.o \
|
||||
libipw_wx.o \
|
||||
libipw_geo.o \
|
||||
libipw_spy.o \
|
||||
libipw_crypto.o \
|
||||
libipw_crypto_ccmp.o \
|
||||
libipw_crypto_tkip.o \
|
||||
|
@ -9856,10 +9856,10 @@ static iw_handler ipw_wx_handlers[] = {
|
||||
IW_HANDLER(SIOCGIWENCODE, ipw_wx_get_encode),
|
||||
IW_HANDLER(SIOCSIWPOWER, ipw_wx_set_power),
|
||||
IW_HANDLER(SIOCGIWPOWER, ipw_wx_get_power),
|
||||
IW_HANDLER(SIOCSIWSPY, iw_handler_set_spy),
|
||||
IW_HANDLER(SIOCGIWSPY, iw_handler_get_spy),
|
||||
IW_HANDLER(SIOCSIWTHRSPY, iw_handler_set_thrspy),
|
||||
IW_HANDLER(SIOCGIWTHRSPY, iw_handler_get_thrspy),
|
||||
IW_HANDLER(SIOCSIWSPY, ipw_wx_set_spy),
|
||||
IW_HANDLER(SIOCGIWSPY, ipw_wx_get_spy),
|
||||
IW_HANDLER(SIOCSIWTHRSPY, ipw_wx_set_thrspy),
|
||||
IW_HANDLER(SIOCGIWTHRSPY, ipw_wx_get_thrspy),
|
||||
IW_HANDLER(SIOCSIWGENIE, ipw_wx_set_genie),
|
||||
IW_HANDLER(SIOCGIWGENIE, ipw_wx_get_genie),
|
||||
IW_HANDLER(SIOCSIWMLME, ipw_wx_set_mlme),
|
||||
@ -11636,7 +11636,7 @@ static int ipw_pci_probe(struct pci_dev *pdev,
|
||||
priv->ieee->worst_rssi = -85;
|
||||
|
||||
net_dev->netdev_ops = &ipw_netdev_ops;
|
||||
priv->wireless_data.spy_data = &priv->ieee->spy_data;
|
||||
priv->ieee->spy_enabled = true;
|
||||
net_dev->wireless_data = &priv->wireless_data;
|
||||
net_dev->wireless_handlers = &ipw_wx_handler_def;
|
||||
net_dev->ethtool_ops = &ipw_ethtool_ops;
|
||||
|
@ -788,6 +788,7 @@ struct libipw_device {
|
||||
|
||||
int iw_mode; /* operating mode (IW_MODE_*) */
|
||||
struct iw_spy_data spy_data; /* iwspy support */
|
||||
bool spy_enabled;
|
||||
|
||||
spinlock_t lock;
|
||||
|
||||
@ -1083,4 +1084,16 @@ void libipw_crypto_tkip_exit(void);
|
||||
void libipw_crypto_ccmp_exit(void);
|
||||
void libipw_crypto_exit(void);
|
||||
|
||||
|
||||
int ipw_wx_set_spy(struct net_device *dev, struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra);
|
||||
int ipw_wx_get_spy(struct net_device *dev, struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra);
|
||||
int ipw_wx_set_thrspy(struct net_device *dev, struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra);
|
||||
int ipw_wx_get_thrspy(struct net_device *dev, struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra);
|
||||
void libipw_spy_update(struct net_device *dev, unsigned char *address,
|
||||
struct iw_quality *wstats);
|
||||
|
||||
#endif /* LIBIPW_H */
|
||||
|
@ -393,7 +393,7 @@ int libipw_rx(struct libipw_device *ieee, struct sk_buff *skb,
|
||||
wstats.updated |= IW_QUAL_QUAL_INVALID;
|
||||
|
||||
/* Update spy records */
|
||||
wireless_spy_update(ieee->dev, hdr->addr2, &wstats);
|
||||
libipw_spy_update(ieee->dev, hdr->addr2, &wstats);
|
||||
}
|
||||
#endif /* IW_WIRELESS_SPY */
|
||||
#endif /* CONFIG_WIRELESS_EXT */
|
||||
|
@ -14,19 +14,20 @@
|
||||
#include <net/iw_handler.h>
|
||||
#include <net/arp.h>
|
||||
#include <net/wext.h>
|
||||
#include "libipw.h"
|
||||
|
||||
static inline struct iw_spy_data *get_spydata(struct net_device *dev)
|
||||
static struct iw_spy_data *get_spydata(struct net_device *dev)
|
||||
{
|
||||
/* This is the new way */
|
||||
if (dev->wireless_data)
|
||||
return dev->wireless_data->spy_data;
|
||||
if (dev->wireless_data && dev->wireless_data->libipw &&
|
||||
dev->wireless_data->libipw->spy_enabled)
|
||||
return &dev->wireless_data->libipw->spy_data;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int iw_handler_set_spy(struct net_device * dev,
|
||||
struct iw_request_info * info,
|
||||
union iwreq_data * wrqu,
|
||||
char * extra)
|
||||
int ipw_wx_set_spy(struct net_device * dev,
|
||||
struct iw_request_info * info,
|
||||
union iwreq_data * wrqu,
|
||||
char * extra)
|
||||
{
|
||||
struct iw_spy_data * spydata = get_spydata(dev);
|
||||
struct sockaddr * address = (struct sockaddr *) extra;
|
||||
@ -36,15 +37,15 @@ int iw_handler_set_spy(struct net_device * dev,
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
/* Disable spy collection while we copy the addresses.
|
||||
* While we copy addresses, any call to wireless_spy_update()
|
||||
* While we copy addresses, any call to libipw_spy_update()
|
||||
* will NOP. This is OK, as anyway the addresses are changing. */
|
||||
spydata->spy_number = 0;
|
||||
|
||||
/* We want to operate without locking, because wireless_spy_update()
|
||||
/* We want to operate without locking, because libipw_spy_update()
|
||||
* most likely will happen in the interrupt handler, and therefore
|
||||
* have its own locking constraints and needs performance.
|
||||
* The rtnl_lock() make sure we don't race with the other iw_handlers.
|
||||
* This make sure wireless_spy_update() "see" that the spy list
|
||||
* This make sure libipw_spy_update() "see" that the spy list
|
||||
* is temporarily disabled. */
|
||||
smp_wmb();
|
||||
|
||||
@ -69,12 +70,12 @@ int iw_handler_set_spy(struct net_device * dev,
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(iw_handler_set_spy);
|
||||
EXPORT_SYMBOL(ipw_wx_set_spy);
|
||||
|
||||
int iw_handler_get_spy(struct net_device * dev,
|
||||
struct iw_request_info * info,
|
||||
union iwreq_data * wrqu,
|
||||
char * extra)
|
||||
int ipw_wx_get_spy(struct net_device * dev,
|
||||
struct iw_request_info * info,
|
||||
union iwreq_data * wrqu,
|
||||
char * extra)
|
||||
{
|
||||
struct iw_spy_data * spydata = get_spydata(dev);
|
||||
struct sockaddr * address = (struct sockaddr *) extra;
|
||||
@ -101,16 +102,16 @@ int iw_handler_get_spy(struct net_device * dev,
|
||||
spydata->spy_stat[i].updated &= ~IW_QUAL_ALL_UPDATED;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(iw_handler_get_spy);
|
||||
EXPORT_SYMBOL(ipw_wx_get_spy);
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/*
|
||||
* Standard Wireless Handler : set spy threshold
|
||||
*/
|
||||
int iw_handler_set_thrspy(struct net_device * dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data * wrqu,
|
||||
char * extra)
|
||||
int ipw_wx_set_thrspy(struct net_device * dev,
|
||||
struct iw_request_info * info,
|
||||
union iwreq_data * wrqu,
|
||||
char * extra)
|
||||
{
|
||||
struct iw_spy_data * spydata = get_spydata(dev);
|
||||
struct iw_thrspy * threshold = (struct iw_thrspy *) extra;
|
||||
@ -128,16 +129,16 @@ int iw_handler_set_thrspy(struct net_device * dev,
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(iw_handler_set_thrspy);
|
||||
EXPORT_SYMBOL(ipw_wx_set_thrspy);
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/*
|
||||
* Standard Wireless Handler : get spy threshold
|
||||
*/
|
||||
int iw_handler_get_thrspy(struct net_device * dev,
|
||||
struct iw_request_info *info,
|
||||
union iwreq_data * wrqu,
|
||||
char * extra)
|
||||
int ipw_wx_get_thrspy(struct net_device * dev,
|
||||
struct iw_request_info * info,
|
||||
union iwreq_data * wrqu,
|
||||
char * extra)
|
||||
{
|
||||
struct iw_spy_data * spydata = get_spydata(dev);
|
||||
struct iw_thrspy * threshold = (struct iw_thrspy *) extra;
|
||||
@ -152,7 +153,7 @@ int iw_handler_get_thrspy(struct net_device * dev,
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(iw_handler_get_thrspy);
|
||||
EXPORT_SYMBOL(ipw_wx_get_thrspy);
|
||||
|
||||
/*------------------------------------------------------------------*/
|
||||
/*
|
||||
@ -189,9 +190,9 @@ static void iw_send_thrspy_event(struct net_device * dev,
|
||||
* small, this is good enough. If we wanted to support larger number of
|
||||
* spy addresses, we should use something more efficient...
|
||||
*/
|
||||
void wireless_spy_update(struct net_device * dev,
|
||||
unsigned char * address,
|
||||
struct iw_quality * wstats)
|
||||
void libipw_spy_update(struct net_device * dev,
|
||||
unsigned char * address,
|
||||
struct iw_quality * wstats)
|
||||
{
|
||||
struct iw_spy_data * spydata = get_spydata(dev);
|
||||
int i;
|
||||
@ -229,4 +230,3 @@ void wireless_spy_update(struct net_device * dev,
|
||||
}
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(wireless_spy_update);
|
@ -418,8 +418,6 @@ struct iw_spy_data {
|
||||
struct libipw_device;
|
||||
/* The struct */
|
||||
struct iw_public_data {
|
||||
/* Driver enhanced spy support */
|
||||
struct iw_spy_data * spy_data;
|
||||
/* Legacy structure managed by the ipw2x00-specific IEEE 802.11 layer */
|
||||
struct libipw_device * libipw;
|
||||
};
|
||||
@ -443,22 +441,6 @@ static inline void wireless_nlevent_flush(void) {}
|
||||
/* We may need a function to send a stream of events to user space.
|
||||
* More on that later... */
|
||||
|
||||
/* Standard handler for SIOCSIWSPY */
|
||||
int iw_handler_set_spy(struct net_device *dev, struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra);
|
||||
/* Standard handler for SIOCGIWSPY */
|
||||
int iw_handler_get_spy(struct net_device *dev, struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra);
|
||||
/* Standard handler for SIOCSIWTHRSPY */
|
||||
int iw_handler_set_thrspy(struct net_device *dev, struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra);
|
||||
/* Standard handler for SIOCGIWTHRSPY */
|
||||
int iw_handler_get_thrspy(struct net_device *dev, struct iw_request_info *info,
|
||||
union iwreq_data *wrqu, char *extra);
|
||||
/* Driver call to update spy records */
|
||||
void wireless_spy_update(struct net_device *dev, unsigned char *address,
|
||||
struct iw_quality *wstats);
|
||||
|
||||
/************************* INLINE FUNCTIONS *************************/
|
||||
/*
|
||||
* Function that are so simple that it's more efficient inlining them
|
||||
|
@ -11,9 +11,6 @@ config WEXT_PROC
|
||||
depends on PROC_FS
|
||||
depends on WEXT_CORE
|
||||
|
||||
config WEXT_SPY
|
||||
bool
|
||||
|
||||
config WEXT_PRIV
|
||||
bool
|
||||
|
||||
|
@ -4,7 +4,6 @@ obj-y += tests/
|
||||
|
||||
obj-$(CONFIG_WEXT_CORE) += wext-core.o
|
||||
obj-$(CONFIG_WEXT_PROC) += wext-proc.o
|
||||
obj-$(CONFIG_WEXT_SPY) += wext-spy.o
|
||||
obj-$(CONFIG_WEXT_PRIV) += wext-priv.o
|
||||
|
||||
cfg80211-y += core.o sysfs.o radiotap.o util.o reg.o scan.o nl80211.o
|
||||
|
Loading…
Reference in New Issue
Block a user