Skip to content

Commit f0df91b

Browse files
committed
wifi: cfg80211: hide scan internals
Hide the internal scan fields from mac80211 and drivers, the 'notified' variable is for internal tracking, and the 'info' is output that's passed to cfg80211_scan_done() and stored only for delayed userspace notification. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Reviewed-by: Benjamin Berg <benjamin.berg@intel.com> Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com> Link: https://patch.msgid.link/20250609213231.6a62e41858e2.I004f66e9c087cc6e6ae4a24951cf470961ee9466@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
1 parent 6f9e701 commit f0df91b

File tree

8 files changed

+196
-179
lines changed

8 files changed

+196
-179
lines changed

include/net/cfg80211.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2748,8 +2748,6 @@ struct cfg80211_scan_6ghz_params {
27482748
* @wiphy: the wiphy this was for
27492749
* @scan_start: time (in jiffies) when the scan started
27502750
* @wdev: the wireless device to scan for
2751-
* @info: (internal) information about completed scan
2752-
* @notified: (internal) scan request was notified as done or aborted
27532751
* @no_cck: used to send probe requests at non CCK rate in 2GHz band
27542752
* @mac_addr: MAC address used with randomisation
27552753
* @mac_addr_mask: MAC address mask used with randomisation, bits that
@@ -2780,12 +2778,8 @@ struct cfg80211_scan_request {
27802778
u8 mac_addr[ETH_ALEN] __aligned(2);
27812779
u8 mac_addr_mask[ETH_ALEN] __aligned(2);
27822780
u8 bssid[ETH_ALEN] __aligned(2);
2783-
2784-
/* internal */
27852781
struct wiphy *wiphy;
27862782
unsigned long scan_start;
2787-
struct cfg80211_scan_info info;
2788-
bool notified;
27892783
bool no_cck;
27902784
bool scan_6ghz;
27912785
u32 n_6ghz_params;

net/wireless/core.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ void cfg80211_stop_p2p_device(struct cfg80211_registered_device *rdev,
239239

240240
rdev->opencount--;
241241

242-
if (rdev->scan_req && rdev->scan_req->wdev == wdev) {
242+
if (rdev->scan_req && rdev->scan_req->req.wdev == wdev) {
243243
if (WARN_ON(!rdev->scan_req->notified &&
244244
(!rdev->int_scan_req ||
245245
!rdev->int_scan_req->notified)))
@@ -1574,7 +1574,7 @@ static int cfg80211_netdev_notifier_call(struct notifier_block *nb,
15741574
case NETDEV_DOWN:
15751575
wiphy_lock(&rdev->wiphy);
15761576
cfg80211_update_iface_num(rdev, wdev->iftype, -1);
1577-
if (rdev->scan_req && rdev->scan_req->wdev == wdev) {
1577+
if (rdev->scan_req && rdev->scan_req->req.wdev == wdev) {
15781578
if (WARN_ON(!rdev->scan_req->notified &&
15791579
(!rdev->int_scan_req ||
15801580
!rdev->int_scan_req->notified)))

net/wireless/core.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@
2121

2222
#define WIPHY_IDX_INVALID -1
2323

24+
struct cfg80211_scan_request_int {
25+
struct cfg80211_scan_info info;
26+
bool notified;
27+
/* must be last - variable members */
28+
struct cfg80211_scan_request req;
29+
};
30+
2431
struct cfg80211_registered_device {
2532
const struct cfg80211_ops *ops;
2633
struct list_head list;
@@ -70,8 +77,8 @@ struct cfg80211_registered_device {
7077
struct rb_root bss_tree;
7178
u32 bss_generation;
7279
u32 bss_entries;
73-
struct cfg80211_scan_request *scan_req; /* protected by RTNL */
74-
struct cfg80211_scan_request *int_scan_req;
80+
struct cfg80211_scan_request_int *scan_req; /* protected by RTNL */
81+
struct cfg80211_scan_request_int *int_scan_req;
7582
struct sk_buff *scan_msg;
7683
struct list_head sched_scan_req_list;
7784
time64_t suspend_at;

net/wireless/nl80211.c

Lines changed: 51 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -9831,12 +9831,12 @@ nl80211_check_scan_flags(struct wiphy *wiphy, struct wireless_dev *wdev,
98319831
mac_addr = req->mac_addr;
98329832
mac_addr_mask = req->mac_addr_mask;
98339833
} else {
9834-
struct cfg80211_scan_request *req = request;
9834+
struct cfg80211_scan_request_int *req = request;
98359835

98369836
randomness_flag = NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
9837-
flags = &req->flags;
9838-
mac_addr = req->mac_addr;
9839-
mac_addr_mask = req->mac_addr_mask;
9837+
flags = &req->req.flags;
9838+
mac_addr = req->req.mac_addr;
9839+
mac_addr_mask = req->req.mac_addr_mask;
98409840
}
98419841

98429842
*flags = nla_get_u32(attrs[NL80211_ATTR_SCAN_FLAGS]);
@@ -9891,7 +9891,7 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
98919891
{
98929892
struct cfg80211_registered_device *rdev = info->user_ptr[0];
98939893
struct wireless_dev *wdev = info->user_ptr[1];
9894-
struct cfg80211_scan_request *request;
9894+
struct cfg80211_scan_request_int *request;
98959895
struct nlattr *scan_freqs = NULL;
98969896
bool scan_freqs_khz = false;
98979897
struct nlattr *attr;
@@ -9943,21 +9943,21 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
99439943
if (ie_len > wiphy->max_scan_ie_len)
99449944
return -EINVAL;
99459945

9946-
size = struct_size(request, channels, n_channels);
9946+
size = struct_size(request, req.channels, n_channels);
99479947
ssids_offset = size;
9948-
size = size_add(size, array_size(sizeof(*request->ssids), n_ssids));
9948+
size = size_add(size, array_size(sizeof(*request->req.ssids), n_ssids));
99499949
ie_offset = size;
99509950
size = size_add(size, ie_len);
99519951
request = kzalloc(size, GFP_KERNEL);
99529952
if (!request)
99539953
return -ENOMEM;
9954-
request->n_channels = n_channels;
9954+
request->req.n_channels = n_channels;
99559955

99569956
if (n_ssids)
9957-
request->ssids = (void *)request + ssids_offset;
9958-
request->n_ssids = n_ssids;
9957+
request->req.ssids = (void *)request + ssids_offset;
9958+
request->req.n_ssids = n_ssids;
99599959
if (ie_len)
9960-
request->ie = (void *)request + ie_offset;
9960+
request->req.ie = (void *)request + ie_offset;
99619961

99629962
i = 0;
99639963
if (scan_freqs) {
@@ -9980,7 +9980,7 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
99809980
!cfg80211_wdev_channel_allowed(wdev, chan))
99819981
continue;
99829982

9983-
request->channels[i] = chan;
9983+
request->req.channels[i] = chan;
99849984
i++;
99859985
}
99869986
} else {
@@ -10001,7 +10001,7 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
1000110001
!cfg80211_wdev_channel_allowed(wdev, chan))
1000210002
continue;
1000310003

10004-
request->channels[i] = chan;
10004+
request->req.channels[i] = chan;
1000510005
i++;
1000610006
}
1000710007
}
@@ -10012,10 +10012,10 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
1001210012
goto out_free;
1001310013
}
1001410014

10015-
request->n_channels = i;
10015+
request->req.n_channels = i;
1001610016

10017-
for (i = 0; i < request->n_channels; i++) {
10018-
struct ieee80211_channel *chan = request->channels[i];
10017+
for (i = 0; i < request->req.n_channels; i++) {
10018+
struct ieee80211_channel *chan = request->req.channels[i];
1001910019

1002010020
/* if we can go off-channel to the target channel we're good */
1002110021
if (cfg80211_off_channel_oper_allowed(wdev, chan))
@@ -10034,22 +10034,23 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
1003410034
err = -EINVAL;
1003510035
goto out_free;
1003610036
}
10037-
request->ssids[i].ssid_len = nla_len(attr);
10038-
memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr));
10037+
request->req.ssids[i].ssid_len = nla_len(attr);
10038+
memcpy(request->req.ssids[i].ssid,
10039+
nla_data(attr), nla_len(attr));
1003910040
i++;
1004010041
}
1004110042
}
1004210043

1004310044
if (info->attrs[NL80211_ATTR_IE]) {
10044-
request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
10045-
memcpy((void *)request->ie,
10045+
request->req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
10046+
memcpy((void *)request->req.ie,
1004610047
nla_data(info->attrs[NL80211_ATTR_IE]),
10047-
request->ie_len);
10048+
request->req.ie_len);
1004810049
}
1004910050

1005010051
for (i = 0; i < NUM_NL80211_BANDS; i++)
1005110052
if (wiphy->bands[i])
10052-
request->rates[i] =
10053+
request->req.rates[i] =
1005310054
(1 << wiphy->bands[i]->n_bitrates) - 1;
1005410055

1005510056
if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) {
@@ -10069,16 +10070,16 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
1006910070
err = ieee80211_get_ratemask(wiphy->bands[band],
1007010071
nla_data(attr),
1007110072
nla_len(attr),
10072-
&request->rates[band]);
10073+
&request->req.rates[band]);
1007310074
if (err)
1007410075
goto out_free;
1007510076
}
1007610077
}
1007710078

1007810079
if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) {
10079-
request->duration =
10080+
request->req.duration =
1008010081
nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]);
10081-
request->duration_mandatory =
10082+
request->req.duration_mandatory =
1008210083
nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]);
1008310084
}
1008410085

@@ -10087,7 +10088,7 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
1008710088
if (err)
1008810089
goto out_free;
1008910090

10090-
request->no_cck =
10091+
request->req.no_cck =
1009110092
nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
1009210093

1009310094
/* Initial implementation used NL80211_ATTR_MAC to set the specific
@@ -10100,19 +10101,21 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
1010010101
* (NL80211_ATTR_SCAN_FLAGS is used to enable random MAC address use).
1010110102
*/
1010210103
if (info->attrs[NL80211_ATTR_BSSID])
10103-
memcpy(request->bssid,
10104+
memcpy(request->req.bssid,
1010410105
nla_data(info->attrs[NL80211_ATTR_BSSID]), ETH_ALEN);
10105-
else if (!(request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) &&
10106+
else if (!(request->req.flags & NL80211_SCAN_FLAG_RANDOM_ADDR) &&
1010610107
info->attrs[NL80211_ATTR_MAC])
10107-
memcpy(request->bssid, nla_data(info->attrs[NL80211_ATTR_MAC]),
10108+
memcpy(request->req.bssid,
10109+
nla_data(info->attrs[NL80211_ATTR_MAC]),
1010810110
ETH_ALEN);
1010910111
else
10110-
eth_broadcast_addr(request->bssid);
10112+
eth_broadcast_addr(request->req.bssid);
1011110113

10112-
request->tsf_report_link_id = nl80211_link_id_or_invalid(info->attrs);
10113-
request->wdev = wdev;
10114-
request->wiphy = &rdev->wiphy;
10115-
request->scan_start = jiffies;
10114+
request->req.tsf_report_link_id =
10115+
nl80211_link_id_or_invalid(info->attrs);
10116+
request->req.wdev = wdev;
10117+
request->req.wiphy = &rdev->wiphy;
10118+
request->req.scan_start = jiffies;
1011610119

1011710120
rdev->scan_req = request;
1011810121
err = cfg80211_scan(rdev);
@@ -18414,7 +18417,7 @@ void nl80211_notify_iface(struct cfg80211_registered_device *rdev,
1841418417
static int nl80211_add_scan_req(struct sk_buff *msg,
1841518418
struct cfg80211_registered_device *rdev)
1841618419
{
18417-
struct cfg80211_scan_request *req = rdev->scan_req;
18420+
struct cfg80211_scan_request_int *req = rdev->scan_req;
1841818421
struct nlattr *nest;
1841918422
int i;
1842018423
struct cfg80211_scan_info *info;
@@ -18425,19 +18428,20 @@ static int nl80211_add_scan_req(struct sk_buff *msg,
1842518428
nest = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_SSIDS);
1842618429
if (!nest)
1842718430
goto nla_put_failure;
18428-
for (i = 0; i < req->n_ssids; i++) {
18429-
if (nla_put(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid))
18431+
for (i = 0; i < req->req.n_ssids; i++) {
18432+
if (nla_put(msg, i, req->req.ssids[i].ssid_len,
18433+
req->req.ssids[i].ssid))
1843018434
goto nla_put_failure;
1843118435
}
1843218436
nla_nest_end(msg, nest);
1843318437

18434-
if (req->flags & NL80211_SCAN_FLAG_FREQ_KHZ) {
18438+
if (req->req.flags & NL80211_SCAN_FLAG_FREQ_KHZ) {
1843518439
nest = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQ_KHZ);
1843618440
if (!nest)
1843718441
goto nla_put_failure;
18438-
for (i = 0; i < req->n_channels; i++) {
18442+
for (i = 0; i < req->req.n_channels; i++) {
1843918443
if (nla_put_u32(msg, i,
18440-
ieee80211_channel_to_khz(req->channels[i])))
18444+
ieee80211_channel_to_khz(req->req.channels[i])))
1844118445
goto nla_put_failure;
1844218446
}
1844318447
nla_nest_end(msg, nest);
@@ -18446,19 +18450,20 @@ static int nl80211_add_scan_req(struct sk_buff *msg,
1844618450
NL80211_ATTR_SCAN_FREQUENCIES);
1844718451
if (!nest)
1844818452
goto nla_put_failure;
18449-
for (i = 0; i < req->n_channels; i++) {
18450-
if (nla_put_u32(msg, i, req->channels[i]->center_freq))
18453+
for (i = 0; i < req->req.n_channels; i++) {
18454+
if (nla_put_u32(msg, i,
18455+
req->req.channels[i]->center_freq))
1845118456
goto nla_put_failure;
1845218457
}
1845318458
nla_nest_end(msg, nest);
1845418459
}
1845518460

18456-
if (req->ie &&
18457-
nla_put(msg, NL80211_ATTR_IE, req->ie_len, req->ie))
18461+
if (req->req.ie &&
18462+
nla_put(msg, NL80211_ATTR_IE, req->req.ie_len, req->req.ie))
1845818463
goto nla_put_failure;
1845918464

18460-
if (req->flags &&
18461-
nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->flags))
18465+
if (req->req.flags &&
18466+
nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->req.flags))
1846218467
goto nla_put_failure;
1846318468

1846418469
info = rdev->int_scan_req ? &rdev->int_scan_req->info :

net/wireless/rdev-ops.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -456,15 +456,15 @@ rdev_set_monitor_channel(struct cfg80211_registered_device *rdev,
456456
}
457457

458458
static inline int rdev_scan(struct cfg80211_registered_device *rdev,
459-
struct cfg80211_scan_request *request)
459+
struct cfg80211_scan_request_int *request)
460460
{
461461
int ret;
462462

463-
if (WARN_ON_ONCE(!request->n_ssids && request->ssids))
463+
if (WARN_ON_ONCE(!request->req.n_ssids && request->req.ssids))
464464
return -EINVAL;
465465

466466
trace_rdev_scan(&rdev->wiphy, request);
467-
ret = rdev->ops->scan(&rdev->wiphy, request);
467+
ret = rdev->ops->scan(&rdev->wiphy, &request->req);
468468
trace_rdev_return_int(&rdev->wiphy, ret);
469469
return ret;
470470
}

0 commit comments

Comments
 (0)