mirror of https://github.com/torvalds/linux.git
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"
|
tristate "Intel PRO/Wireless 2100 Network Connection"
|
||||||
depends on PCI && CFG80211
|
depends on PCI && CFG80211
|
||||||
select WIRELESS_EXT
|
select WIRELESS_EXT
|
||||||
select WEXT_SPY
|
|
||||||
select WEXT_PRIV
|
select WEXT_PRIV
|
||||||
select FW_LOADER
|
select FW_LOADER
|
||||||
select LIBIPW
|
select LIBIPW
|
||||||
|
|
@ -68,7 +67,6 @@ config IPW2200
|
||||||
depends on PCI && CFG80211
|
depends on PCI && CFG80211
|
||||||
select CFG80211_WEXT_EXPORT
|
select CFG80211_WEXT_EXPORT
|
||||||
select WIRELESS_EXT
|
select WIRELESS_EXT
|
||||||
select WEXT_SPY
|
|
||||||
select WEXT_PRIV
|
select WEXT_PRIV
|
||||||
select FW_LOADER
|
select FW_LOADER
|
||||||
select LIBIPW
|
select LIBIPW
|
||||||
|
|
@ -156,7 +154,6 @@ config LIBIPW
|
||||||
tristate
|
tristate
|
||||||
depends on PCI && CFG80211
|
depends on PCI && CFG80211
|
||||||
select WIRELESS_EXT
|
select WIRELESS_EXT
|
||||||
select WEXT_SPY
|
|
||||||
select CRYPTO
|
select CRYPTO
|
||||||
select CRYPTO_MICHAEL_MIC
|
select CRYPTO_MICHAEL_MIC
|
||||||
select CRC32
|
select CRC32
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ libipw-objs := \
|
||||||
libipw_rx.o \
|
libipw_rx.o \
|
||||||
libipw_wx.o \
|
libipw_wx.o \
|
||||||
libipw_geo.o \
|
libipw_geo.o \
|
||||||
|
libipw_spy.o \
|
||||||
libipw_crypto.o \
|
libipw_crypto.o \
|
||||||
libipw_crypto_ccmp.o \
|
libipw_crypto_ccmp.o \
|
||||||
libipw_crypto_tkip.o \
|
libipw_crypto_tkip.o \
|
||||||
|
|
|
||||||
|
|
@ -9856,10 +9856,10 @@ static iw_handler ipw_wx_handlers[] = {
|
||||||
IW_HANDLER(SIOCGIWENCODE, ipw_wx_get_encode),
|
IW_HANDLER(SIOCGIWENCODE, ipw_wx_get_encode),
|
||||||
IW_HANDLER(SIOCSIWPOWER, ipw_wx_set_power),
|
IW_HANDLER(SIOCSIWPOWER, ipw_wx_set_power),
|
||||||
IW_HANDLER(SIOCGIWPOWER, ipw_wx_get_power),
|
IW_HANDLER(SIOCGIWPOWER, ipw_wx_get_power),
|
||||||
IW_HANDLER(SIOCSIWSPY, iw_handler_set_spy),
|
IW_HANDLER(SIOCSIWSPY, ipw_wx_set_spy),
|
||||||
IW_HANDLER(SIOCGIWSPY, iw_handler_get_spy),
|
IW_HANDLER(SIOCGIWSPY, ipw_wx_get_spy),
|
||||||
IW_HANDLER(SIOCSIWTHRSPY, iw_handler_set_thrspy),
|
IW_HANDLER(SIOCSIWTHRSPY, ipw_wx_set_thrspy),
|
||||||
IW_HANDLER(SIOCGIWTHRSPY, iw_handler_get_thrspy),
|
IW_HANDLER(SIOCGIWTHRSPY, ipw_wx_get_thrspy),
|
||||||
IW_HANDLER(SIOCSIWGENIE, ipw_wx_set_genie),
|
IW_HANDLER(SIOCSIWGENIE, ipw_wx_set_genie),
|
||||||
IW_HANDLER(SIOCGIWGENIE, ipw_wx_get_genie),
|
IW_HANDLER(SIOCGIWGENIE, ipw_wx_get_genie),
|
||||||
IW_HANDLER(SIOCSIWMLME, ipw_wx_set_mlme),
|
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;
|
priv->ieee->worst_rssi = -85;
|
||||||
|
|
||||||
net_dev->netdev_ops = &ipw_netdev_ops;
|
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_data = &priv->wireless_data;
|
||||||
net_dev->wireless_handlers = &ipw_wx_handler_def;
|
net_dev->wireless_handlers = &ipw_wx_handler_def;
|
||||||
net_dev->ethtool_ops = &ipw_ethtool_ops;
|
net_dev->ethtool_ops = &ipw_ethtool_ops;
|
||||||
|
|
|
||||||
|
|
@ -788,6 +788,7 @@ struct libipw_device {
|
||||||
|
|
||||||
int iw_mode; /* operating mode (IW_MODE_*) */
|
int iw_mode; /* operating mode (IW_MODE_*) */
|
||||||
struct iw_spy_data spy_data; /* iwspy support */
|
struct iw_spy_data spy_data; /* iwspy support */
|
||||||
|
bool spy_enabled;
|
||||||
|
|
||||||
spinlock_t lock;
|
spinlock_t lock;
|
||||||
|
|
||||||
|
|
@ -1083,4 +1084,16 @@ void libipw_crypto_tkip_exit(void);
|
||||||
void libipw_crypto_ccmp_exit(void);
|
void libipw_crypto_ccmp_exit(void);
|
||||||
void libipw_crypto_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 */
|
#endif /* LIBIPW_H */
|
||||||
|
|
|
||||||
|
|
@ -393,7 +393,7 @@ int libipw_rx(struct libipw_device *ieee, struct sk_buff *skb,
|
||||||
wstats.updated |= IW_QUAL_QUAL_INVALID;
|
wstats.updated |= IW_QUAL_QUAL_INVALID;
|
||||||
|
|
||||||
/* Update spy records */
|
/* Update spy records */
|
||||||
wireless_spy_update(ieee->dev, hdr->addr2, &wstats);
|
libipw_spy_update(ieee->dev, hdr->addr2, &wstats);
|
||||||
}
|
}
|
||||||
#endif /* IW_WIRELESS_SPY */
|
#endif /* IW_WIRELESS_SPY */
|
||||||
#endif /* CONFIG_WIRELESS_EXT */
|
#endif /* CONFIG_WIRELESS_EXT */
|
||||||
|
|
|
||||||
|
|
@ -14,19 +14,20 @@
|
||||||
#include <net/iw_handler.h>
|
#include <net/iw_handler.h>
|
||||||
#include <net/arp.h>
|
#include <net/arp.h>
|
||||||
#include <net/wext.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 && dev->wireless_data->libipw &&
|
||||||
if (dev->wireless_data)
|
dev->wireless_data->libipw->spy_enabled)
|
||||||
return dev->wireless_data->spy_data;
|
return &dev->wireless_data->libipw->spy_data;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int iw_handler_set_spy(struct net_device * dev,
|
int ipw_wx_set_spy(struct net_device * dev,
|
||||||
struct iw_request_info * info,
|
struct iw_request_info * info,
|
||||||
union iwreq_data * wrqu,
|
union iwreq_data * wrqu,
|
||||||
char * extra)
|
char * extra)
|
||||||
{
|
{
|
||||||
struct iw_spy_data * spydata = get_spydata(dev);
|
struct iw_spy_data * spydata = get_spydata(dev);
|
||||||
struct sockaddr * address = (struct sockaddr *) extra;
|
struct sockaddr * address = (struct sockaddr *) extra;
|
||||||
|
|
@ -36,15 +37,15 @@ int iw_handler_set_spy(struct net_device * dev,
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
/* Disable spy collection while we copy the addresses.
|
/* 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. */
|
* will NOP. This is OK, as anyway the addresses are changing. */
|
||||||
spydata->spy_number = 0;
|
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
|
* most likely will happen in the interrupt handler, and therefore
|
||||||
* have its own locking constraints and needs performance.
|
* have its own locking constraints and needs performance.
|
||||||
* The rtnl_lock() make sure we don't race with the other iw_handlers.
|
* 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. */
|
* is temporarily disabled. */
|
||||||
smp_wmb();
|
smp_wmb();
|
||||||
|
|
||||||
|
|
@ -69,12 +70,12 @@ int iw_handler_set_spy(struct net_device * dev,
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(iw_handler_set_spy);
|
EXPORT_SYMBOL(ipw_wx_set_spy);
|
||||||
|
|
||||||
int iw_handler_get_spy(struct net_device * dev,
|
int ipw_wx_get_spy(struct net_device * dev,
|
||||||
struct iw_request_info * info,
|
struct iw_request_info * info,
|
||||||
union iwreq_data * wrqu,
|
union iwreq_data * wrqu,
|
||||||
char * extra)
|
char * extra)
|
||||||
{
|
{
|
||||||
struct iw_spy_data * spydata = get_spydata(dev);
|
struct iw_spy_data * spydata = get_spydata(dev);
|
||||||
struct sockaddr * address = (struct sockaddr *) extra;
|
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;
|
spydata->spy_stat[i].updated &= ~IW_QUAL_ALL_UPDATED;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(iw_handler_get_spy);
|
EXPORT_SYMBOL(ipw_wx_get_spy);
|
||||||
|
|
||||||
/*------------------------------------------------------------------*/
|
/*------------------------------------------------------------------*/
|
||||||
/*
|
/*
|
||||||
* Standard Wireless Handler : set spy threshold
|
* Standard Wireless Handler : set spy threshold
|
||||||
*/
|
*/
|
||||||
int iw_handler_set_thrspy(struct net_device * dev,
|
int ipw_wx_set_thrspy(struct net_device * dev,
|
||||||
struct iw_request_info *info,
|
struct iw_request_info * info,
|
||||||
union iwreq_data * wrqu,
|
union iwreq_data * wrqu,
|
||||||
char * extra)
|
char * extra)
|
||||||
{
|
{
|
||||||
struct iw_spy_data * spydata = get_spydata(dev);
|
struct iw_spy_data * spydata = get_spydata(dev);
|
||||||
struct iw_thrspy * threshold = (struct iw_thrspy *) extra;
|
struct iw_thrspy * threshold = (struct iw_thrspy *) extra;
|
||||||
|
|
@ -128,16 +129,16 @@ int iw_handler_set_thrspy(struct net_device * dev,
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(iw_handler_set_thrspy);
|
EXPORT_SYMBOL(ipw_wx_set_thrspy);
|
||||||
|
|
||||||
/*------------------------------------------------------------------*/
|
/*------------------------------------------------------------------*/
|
||||||
/*
|
/*
|
||||||
* Standard Wireless Handler : get spy threshold
|
* Standard Wireless Handler : get spy threshold
|
||||||
*/
|
*/
|
||||||
int iw_handler_get_thrspy(struct net_device * dev,
|
int ipw_wx_get_thrspy(struct net_device * dev,
|
||||||
struct iw_request_info *info,
|
struct iw_request_info * info,
|
||||||
union iwreq_data * wrqu,
|
union iwreq_data * wrqu,
|
||||||
char * extra)
|
char * extra)
|
||||||
{
|
{
|
||||||
struct iw_spy_data * spydata = get_spydata(dev);
|
struct iw_spy_data * spydata = get_spydata(dev);
|
||||||
struct iw_thrspy * threshold = (struct iw_thrspy *) extra;
|
struct iw_thrspy * threshold = (struct iw_thrspy *) extra;
|
||||||
|
|
@ -152,7 +153,7 @@ int iw_handler_get_thrspy(struct net_device * dev,
|
||||||
|
|
||||||
return 0;
|
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
|
* small, this is good enough. If we wanted to support larger number of
|
||||||
* spy addresses, we should use something more efficient...
|
* spy addresses, we should use something more efficient...
|
||||||
*/
|
*/
|
||||||
void wireless_spy_update(struct net_device * dev,
|
void libipw_spy_update(struct net_device * dev,
|
||||||
unsigned char * address,
|
unsigned char * address,
|
||||||
struct iw_quality * wstats)
|
struct iw_quality * wstats)
|
||||||
{
|
{
|
||||||
struct iw_spy_data * spydata = get_spydata(dev);
|
struct iw_spy_data * spydata = get_spydata(dev);
|
||||||
int i;
|
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;
|
struct libipw_device;
|
||||||
/* The struct */
|
/* The struct */
|
||||||
struct iw_public_data {
|
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 */
|
/* Legacy structure managed by the ipw2x00-specific IEEE 802.11 layer */
|
||||||
struct libipw_device * libipw;
|
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.
|
/* We may need a function to send a stream of events to user space.
|
||||||
* More on that later... */
|
* 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 *************************/
|
/************************* INLINE FUNCTIONS *************************/
|
||||||
/*
|
/*
|
||||||
* Function that are so simple that it's more efficient inlining them
|
* 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 PROC_FS
|
||||||
depends on WEXT_CORE
|
depends on WEXT_CORE
|
||||||
|
|
||||||
config WEXT_SPY
|
|
||||||
bool
|
|
||||||
|
|
||||||
config WEXT_PRIV
|
config WEXT_PRIV
|
||||||
bool
|
bool
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@ obj-y += tests/
|
||||||
|
|
||||||
obj-$(CONFIG_WEXT_CORE) += wext-core.o
|
obj-$(CONFIG_WEXT_CORE) += wext-core.o
|
||||||
obj-$(CONFIG_WEXT_PROC) += wext-proc.o
|
obj-$(CONFIG_WEXT_PROC) += wext-proc.o
|
||||||
obj-$(CONFIG_WEXT_SPY) += wext-spy.o
|
|
||||||
obj-$(CONFIG_WEXT_PRIV) += wext-priv.o
|
obj-$(CONFIG_WEXT_PRIV) += wext-priv.o
|
||||||
|
|
||||||
cfg80211-y += core.o sysfs.o radiotap.o util.o reg.o scan.o nl80211.o
|
cfg80211-y += core.o sysfs.o radiotap.o util.o reg.o scan.o nl80211.o
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue