Skip to content

Commit

Permalink
nl80211: move scan API to wdev
Browse files Browse the repository at this point in the history
The new P2P Device will have to be able to scan for
P2P search, so move scanning to use struct wireless_dev
instead of struct net_device.

Signed-off-by: Johannes Berg <[email protected]>
  • Loading branch information
jmberg-intel committed Jul 12, 2012
1 parent 1c90f9d commit fd01428
Show file tree
Hide file tree
Showing 14 changed files with 57 additions and 47 deletions.
6 changes: 3 additions & 3 deletions drivers/net/wireless/ath/ath6kl/cfg80211.c
Original file line number Diff line number Diff line change
Expand Up @@ -966,11 +966,11 @@ static int ath6kl_set_probed_ssids(struct ath6kl *ar,
return 0;
}

static int ath6kl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev,
static int ath6kl_cfg80211_scan(struct wiphy *wiphy,
struct cfg80211_scan_request *request)
{
struct ath6kl *ar = ath6kl_priv(ndev);
struct ath6kl_vif *vif = netdev_priv(ndev);
struct ath6kl_vif *vif = ath6kl_vif_from_wdev(request->wdev);
struct ath6kl *ar = ath6kl_priv(vif->ndev);
s8 n_channels = 0;
u16 *channels = NULL;
int ret = 0;
Expand Down
3 changes: 2 additions & 1 deletion drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
Original file line number Diff line number Diff line change
Expand Up @@ -691,9 +691,10 @@ __brcmf_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev,
}

static s32
brcmf_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev,
brcmf_cfg80211_scan(struct wiphy *wiphy,
struct cfg80211_scan_request *request)
{
struct net_device *ndev = request->wdev->netdev;
s32 err = 0;

WL_TRACE("Enter\n");
Expand Down
3 changes: 2 additions & 1 deletion drivers/net/wireless/iwmc3200wifi/cfg80211.c
Original file line number Diff line number Diff line change
Expand Up @@ -353,9 +353,10 @@ static int iwm_cfg80211_change_iface(struct wiphy *wiphy,
return 0;
}

static int iwm_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev,
static int iwm_cfg80211_scan(struct wiphy *wiphy,
struct cfg80211_scan_request *request)
{
struct net_device *ndev = request->wdev->netdev;
struct iwm_priv *iwm = ndev_to_iwm(ndev);
int ret;

Expand Down
1 change: 0 additions & 1 deletion drivers/net/wireless/libertas/cfg.c
Original file line number Diff line number Diff line change
Expand Up @@ -805,7 +805,6 @@ void lbs_scan_done(struct lbs_private *priv)
}

static int lbs_cfg_scan(struct wiphy *wiphy,
struct net_device *dev,
struct cfg80211_scan_request *request)
{
struct lbs_private *priv = wiphy_priv(wiphy);
Expand Down
3 changes: 2 additions & 1 deletion drivers/net/wireless/mwifiex/cfg80211.c
Original file line number Diff line number Diff line change
Expand Up @@ -1376,9 +1376,10 @@ mwifiex_cfg80211_leave_ibss(struct wiphy *wiphy, struct net_device *dev)
* it also informs the results.
*/
static int
mwifiex_cfg80211_scan(struct wiphy *wiphy, struct net_device *dev,
mwifiex_cfg80211_scan(struct wiphy *wiphy,
struct cfg80211_scan_request *request)
{
struct net_device *dev = request->wdev->netdev;
struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
int i;
struct ieee80211_channel *chan;
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/wireless/orinoco/cfg.c
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ static int orinoco_change_vif(struct wiphy *wiphy, struct net_device *dev,
return err;
}

static int orinoco_scan(struct wiphy *wiphy, struct net_device *dev,
static int orinoco_scan(struct wiphy *wiphy,
struct cfg80211_scan_request *request)
{
struct orinoco_private *priv = wiphy_priv(wiphy);
Expand Down
5 changes: 3 additions & 2 deletions drivers/net/wireless/rndis_wlan.c
Original file line number Diff line number Diff line change
Expand Up @@ -484,7 +484,7 @@ static int rndis_change_virtual_intf(struct wiphy *wiphy,
enum nl80211_iftype type, u32 *flags,
struct vif_params *params);

static int rndis_scan(struct wiphy *wiphy, struct net_device *dev,
static int rndis_scan(struct wiphy *wiphy,
struct cfg80211_scan_request *request);

static int rndis_set_wiphy_params(struct wiphy *wiphy, u32 changed);
Expand Down Expand Up @@ -1941,9 +1941,10 @@ static int rndis_get_tx_power(struct wiphy *wiphy, int *dbm)
}

#define SCAN_DELAY_JIFFIES (6 * HZ)
static int rndis_scan(struct wiphy *wiphy, struct net_device *dev,
static int rndis_scan(struct wiphy *wiphy,
struct cfg80211_scan_request *request)
{
struct net_device *dev = request->wdev->netdev;
struct usbnet *usbdev = netdev_priv(dev);
struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev);
int ret;
Expand Down
7 changes: 4 additions & 3 deletions include/net/cfg80211.h
Original file line number Diff line number Diff line change
Expand Up @@ -999,7 +999,7 @@ struct cfg80211_ssid {
* @ie_len: length of ie in octets
* @rates: bitmap of rates to advertise for each band
* @wiphy: the wiphy this was for
* @dev: the interface
* @wdev: the wireless device to scan for
* @aborted: (internal) scan request was notified as aborted
* @no_cck: used to send probe requests at non CCK rate in 2GHz band
*/
Expand All @@ -1012,9 +1012,10 @@ struct cfg80211_scan_request {

u32 rates[IEEE80211_NUM_BANDS];

struct wireless_dev *wdev;

/* internal */
struct wiphy *wiphy;
struct net_device *dev;
bool aborted;
bool no_cck;

Expand Down Expand Up @@ -1700,7 +1701,7 @@ struct cfg80211_ops {
struct ieee80211_channel *chan,
enum nl80211_channel_type channel_type);

int (*scan)(struct wiphy *wiphy, struct net_device *dev,
int (*scan)(struct wiphy *wiphy,
struct cfg80211_scan_request *request);

int (*auth)(struct wiphy *wiphy, struct net_device *dev,
Expand Down
5 changes: 3 additions & 2 deletions net/mac80211/cfg.c
Original file line number Diff line number Diff line change
Expand Up @@ -1763,10 +1763,11 @@ static int ieee80211_resume(struct wiphy *wiphy)
#endif

static int ieee80211_scan(struct wiphy *wiphy,
struct net_device *dev,
struct cfg80211_scan_request *req)
{
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
struct ieee80211_sub_if_data *sdata;

sdata = IEEE80211_WDEV_TO_SUB_IF(req->wdev);

switch (ieee80211_vif_type_p2p(&sdata->vif)) {
case NL80211_IFTYPE_STATION:
Expand Down
2 changes: 1 addition & 1 deletion net/wireless/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -708,7 +708,7 @@ static void wdev_cleanup_work(struct work_struct *work)

cfg80211_lock_rdev(rdev);

if (WARN_ON(rdev->scan_req && rdev->scan_req->dev == wdev->netdev)) {
if (WARN_ON(rdev->scan_req && rdev->scan_req->wdev == wdev)) {
rdev->scan_req->aborted = true;
___cfg80211_scan_done(rdev, true);
}
Expand Down
31 changes: 17 additions & 14 deletions net/wireless/nl80211.c
Original file line number Diff line number Diff line change
Expand Up @@ -4130,7 +4130,7 @@ static int validate_scan_freqs(struct nlattr *freqs)
static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
{
struct cfg80211_registered_device *rdev = info->user_ptr[0];
struct net_device *dev = info->user_ptr[1];
struct wireless_dev *wdev = info->user_ptr[1];
struct cfg80211_scan_request *request;
struct nlattr *attr;
struct wiphy *wiphy;
Expand Down Expand Up @@ -4290,15 +4290,16 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
request->no_cck =
nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);

request->dev = dev;
request->wdev = wdev;
request->wiphy = &rdev->wiphy;

rdev->scan_req = request;
err = rdev->ops->scan(&rdev->wiphy, dev, request);
err = rdev->ops->scan(&rdev->wiphy, request);

if (!err) {
nl80211_send_scan_start(rdev, dev);
dev_hold(dev);
nl80211_send_scan_start(rdev, wdev);
if (wdev->netdev)
dev_hold(wdev->netdev);
} else {
out_free:
rdev->scan_req = NULL;
Expand Down Expand Up @@ -7066,7 +7067,7 @@ static struct genl_ops nl80211_ops[] = {
.doit = nl80211_trigger_scan,
.policy = nl80211_policy,
.flags = GENL_ADMIN_PERM,
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
.internal_flags = NL80211_FLAG_NEED_WDEV_UP |
NL80211_FLAG_NEED_RTNL,
},
{
Expand Down Expand Up @@ -7458,7 +7459,7 @@ static int nl80211_add_scan_req(struct sk_buff *msg,

static int nl80211_send_scan_msg(struct sk_buff *msg,
struct cfg80211_registered_device *rdev,
struct net_device *netdev,
struct wireless_dev *wdev,
u32 pid, u32 seq, int flags,
u32 cmd)
{
Expand All @@ -7469,7 +7470,9 @@ static int nl80211_send_scan_msg(struct sk_buff *msg,
return -1;

if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
(wdev->netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
wdev->netdev->ifindex)) ||
nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)))
goto nla_put_failure;

/* ignore errors and send incomplete event anyway */
Expand Down Expand Up @@ -7506,15 +7509,15 @@ nl80211_send_sched_scan_msg(struct sk_buff *msg,
}

void nl80211_send_scan_start(struct cfg80211_registered_device *rdev,
struct net_device *netdev)
struct wireless_dev *wdev)
{
struct sk_buff *msg;

msg = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
if (!msg)
return;

if (nl80211_send_scan_msg(msg, rdev, netdev, 0, 0, 0,
if (nl80211_send_scan_msg(msg, rdev, wdev, 0, 0, 0,
NL80211_CMD_TRIGGER_SCAN) < 0) {
nlmsg_free(msg);
return;
Expand All @@ -7525,15 +7528,15 @@ void nl80211_send_scan_start(struct cfg80211_registered_device *rdev,
}

void nl80211_send_scan_done(struct cfg80211_registered_device *rdev,
struct net_device *netdev)
struct wireless_dev *wdev)
{
struct sk_buff *msg;

msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
if (!msg)
return;

if (nl80211_send_scan_msg(msg, rdev, netdev, 0, 0, 0,
if (nl80211_send_scan_msg(msg, rdev, wdev, 0, 0, 0,
NL80211_CMD_NEW_SCAN_RESULTS) < 0) {
nlmsg_free(msg);
return;
Expand All @@ -7544,15 +7547,15 @@ void nl80211_send_scan_done(struct cfg80211_registered_device *rdev,
}

void nl80211_send_scan_aborted(struct cfg80211_registered_device *rdev,
struct net_device *netdev)
struct wireless_dev *wdev)
{
struct sk_buff *msg;

msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
if (!msg)
return;

if (nl80211_send_scan_msg(msg, rdev, netdev, 0, 0, 0,
if (nl80211_send_scan_msg(msg, rdev, wdev, 0, 0, 0,
NL80211_CMD_SCAN_ABORTED) < 0) {
nlmsg_free(msg);
return;
Expand Down
6 changes: 3 additions & 3 deletions net/wireless/nl80211.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ int nl80211_init(void);
void nl80211_exit(void);
void nl80211_notify_dev_rename(struct cfg80211_registered_device *rdev);
void nl80211_send_scan_start(struct cfg80211_registered_device *rdev,
struct net_device *netdev);
struct wireless_dev *wdev);
void nl80211_send_scan_done(struct cfg80211_registered_device *rdev,
struct net_device *netdev);
struct wireless_dev *wdev);
void nl80211_send_scan_aborted(struct cfg80211_registered_device *rdev,
struct net_device *netdev);
struct wireless_dev *wdev);
void nl80211_send_sched_scan(struct cfg80211_registered_device *rdev,
struct net_device *netdev, u32 cmd);
void nl80211_send_sched_scan_results(struct cfg80211_registered_device *rdev,
Expand Down
24 changes: 13 additions & 11 deletions net/wireless/scan.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev, bool leak)
{
struct cfg80211_scan_request *request;
struct net_device *dev;
struct wireless_dev *wdev;
#ifdef CONFIG_CFG80211_WEXT
union iwreq_data wrqu;
#endif
Expand All @@ -35,29 +35,31 @@ void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev, bool leak)
if (!request)
return;

dev = request->dev;
wdev = request->wdev;

/*
* This must be before sending the other events!
* Otherwise, wpa_supplicant gets completely confused with
* wext events.
*/
cfg80211_sme_scan_done(dev);
if (wdev->netdev)
cfg80211_sme_scan_done(wdev->netdev);

if (request->aborted)
nl80211_send_scan_aborted(rdev, dev);
nl80211_send_scan_aborted(rdev, wdev);
else
nl80211_send_scan_done(rdev, dev);
nl80211_send_scan_done(rdev, wdev);

#ifdef CONFIG_CFG80211_WEXT
if (!request->aborted) {
if (wdev->netdev && !request->aborted) {
memset(&wrqu, 0, sizeof(wrqu));

wireless_send_event(dev, SIOCGIWSCAN, &wrqu, NULL);
wireless_send_event(wdev->netdev, SIOCGIWSCAN, &wrqu, NULL);
}
#endif

dev_put(dev);
if (wdev->netdev)
dev_put(wdev->netdev);

rdev->scan_req = NULL;

Expand Down Expand Up @@ -955,7 +957,7 @@ int cfg80211_wext_siwscan(struct net_device *dev,
}

creq->wiphy = wiphy;
creq->dev = dev;
creq->wdev = dev->ieee80211_ptr;
/* SSIDs come after channels */
creq->ssids = (void *)&creq->channels[n_channels];
creq->n_channels = n_channels;
Expand Down Expand Up @@ -1024,12 +1026,12 @@ int cfg80211_wext_siwscan(struct net_device *dev,
creq->rates[i] = (1 << wiphy->bands[i]->n_bitrates) - 1;

rdev->scan_req = creq;
err = rdev->ops->scan(wiphy, dev, creq);
err = rdev->ops->scan(wiphy, creq);
if (err) {
rdev->scan_req = NULL;
/* creq will be freed below */
} else {
nl80211_send_scan_start(rdev, dev);
nl80211_send_scan_start(rdev, dev->ieee80211_ptr);
/* creq now owned by driver */
creq = NULL;
dev_hold(dev);
Expand Down
6 changes: 3 additions & 3 deletions net/wireless/sme.c
Original file line number Diff line number Diff line change
Expand Up @@ -136,15 +136,15 @@ static int cfg80211_conn_scan(struct wireless_dev *wdev)
wdev->conn->params.ssid_len);
request->ssids[0].ssid_len = wdev->conn->params.ssid_len;

request->dev = wdev->netdev;
request->wdev = wdev;
request->wiphy = &rdev->wiphy;

rdev->scan_req = request;

err = rdev->ops->scan(wdev->wiphy, wdev->netdev, request);
err = rdev->ops->scan(wdev->wiphy, request);
if (!err) {
wdev->conn->state = CFG80211_CONN_SCANNING;
nl80211_send_scan_start(rdev, wdev->netdev);
nl80211_send_scan_start(rdev, wdev);
dev_hold(wdev->netdev);
} else {
rdev->scan_req = NULL;
Expand Down

0 comments on commit fd01428

Please sign in to comment.