Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+196 -179
-6
include/net/cfg80211.h
··· 2748 2748 * @wiphy: the wiphy this was for 2749 2749 * @scan_start: time (in jiffies) when the scan started 2750 2750 * @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 2753 2751 * @no_cck: used to send probe requests at non CCK rate in 2GHz band 2754 2752 * @mac_addr: MAC address used with randomisation 2755 2753 * @mac_addr_mask: MAC address mask used with randomisation, bits that ··· 2778 2780 u8 mac_addr[ETH_ALEN] __aligned(2); 2779 2781 u8 mac_addr_mask[ETH_ALEN] __aligned(2); 2780 2782 u8 bssid[ETH_ALEN] __aligned(2); 2781 - 2782 - /* internal */ 2783 2783 struct wiphy *wiphy; 2784 2784 unsigned long scan_start; 2785 - struct cfg80211_scan_info info; 2786 - bool notified; 2787 2785 bool no_cck; 2788 2786 bool scan_6ghz; 2789 2787 u32 n_6ghz_params;
+2 -2
net/wireless/core.c
··· 239 239 240 240 rdev->opencount--; 241 241 242 - if (rdev->scan_req && rdev->scan_req->wdev == wdev) { 242 + if (rdev->scan_req && rdev->scan_req->req.wdev == wdev) { 243 243 if (WARN_ON(!rdev->scan_req->notified && 244 244 (!rdev->int_scan_req || 245 245 !rdev->int_scan_req->notified))) ··· 1574 1574 case NETDEV_DOWN: 1575 1575 wiphy_lock(&rdev->wiphy); 1576 1576 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) { 1578 1578 if (WARN_ON(!rdev->scan_req->notified && 1579 1579 (!rdev->int_scan_req || 1580 1580 !rdev->int_scan_req->notified)))
+9 -2
net/wireless/core.h
··· 21 21 22 22 #define WIPHY_IDX_INVALID -1 23 23 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 + 24 31 struct cfg80211_registered_device { 25 32 const struct cfg80211_ops *ops; 26 33 struct list_head list; ··· 77 70 struct rb_root bss_tree; 78 71 u32 bss_generation; 79 72 u32 bss_entries; 80 - struct cfg80211_scan_request *scan_req; /* protected by RTNL */ 81 - struct cfg80211_scan_request *int_scan_req; 73 + struct cfg80211_scan_request_int *scan_req; /* protected by RTNL */ 74 + struct cfg80211_scan_request_int *int_scan_req; 82 75 struct sk_buff *scan_msg; 83 76 struct list_head sched_scan_req_list; 84 77 time64_t suspend_at;
+51 -46
net/wireless/nl80211.c
··· 9831 9831 mac_addr = req->mac_addr; 9832 9832 mac_addr_mask = req->mac_addr_mask; 9833 9833 } else { 9834 - struct cfg80211_scan_request *req = request; 9834 + struct cfg80211_scan_request_int *req = request; 9835 9835 9836 9836 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; 9840 9840 } 9841 9841 9842 9842 *flags = nla_get_u32(attrs[NL80211_ATTR_SCAN_FLAGS]); ··· 9891 9891 { 9892 9892 struct cfg80211_registered_device *rdev = info->user_ptr[0]; 9893 9893 struct wireless_dev *wdev = info->user_ptr[1]; 9894 - struct cfg80211_scan_request *request; 9894 + struct cfg80211_scan_request_int *request; 9895 9895 struct nlattr *scan_freqs = NULL; 9896 9896 bool scan_freqs_khz = false; 9897 9897 struct nlattr *attr; ··· 9943 9943 if (ie_len > wiphy->max_scan_ie_len) 9944 9944 return -EINVAL; 9945 9945 9946 - size = struct_size(request, channels, n_channels); 9946 + size = struct_size(request, req.channels, n_channels); 9947 9947 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)); 9949 9949 ie_offset = size; 9950 9950 size = size_add(size, ie_len); 9951 9951 request = kzalloc(size, GFP_KERNEL); 9952 9952 if (!request) 9953 9953 return -ENOMEM; 9954 - request->n_channels = n_channels; 9954 + request->req.n_channels = n_channels; 9955 9955 9956 9956 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; 9959 9959 if (ie_len) 9960 - request->ie = (void *)request + ie_offset; 9960 + request->req.ie = (void *)request + ie_offset; 9961 9961 9962 9962 i = 0; 9963 9963 if (scan_freqs) { ··· 9980 9980 !cfg80211_wdev_channel_allowed(wdev, chan)) 9981 9981 continue; 9982 9982 9983 - request->channels[i] = chan; 9983 + request->req.channels[i] = chan; 9984 9984 i++; 9985 9985 } 9986 9986 } else { ··· 10001 10001 !cfg80211_wdev_channel_allowed(wdev, chan)) 10002 10002 continue; 10003 10003 10004 - request->channels[i] = chan; 10004 + request->req.channels[i] = chan; 10005 10005 i++; 10006 10006 } 10007 10007 } ··· 10012 10012 goto out_free; 10013 10013 } 10014 10014 10015 - request->n_channels = i; 10015 + request->req.n_channels = i; 10016 10016 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]; 10019 10019 10020 10020 /* if we can go off-channel to the target channel we're good */ 10021 10021 if (cfg80211_off_channel_oper_allowed(wdev, chan)) ··· 10034 10034 err = -EINVAL; 10035 10035 goto out_free; 10036 10036 } 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)); 10039 10040 i++; 10040 10041 } 10041 10042 } 10042 10043 10043 10044 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, 10046 10047 nla_data(info->attrs[NL80211_ATTR_IE]), 10047 - request->ie_len); 10048 + request->req.ie_len); 10048 10049 } 10049 10050 10050 10051 for (i = 0; i < NUM_NL80211_BANDS; i++) 10051 10052 if (wiphy->bands[i]) 10052 - request->rates[i] = 10053 + request->req.rates[i] = 10053 10054 (1 << wiphy->bands[i]->n_bitrates) - 1; 10054 10055 10055 10056 if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) { ··· 10070 10069 err = ieee80211_get_ratemask(wiphy->bands[band], 10071 10070 nla_data(attr), 10072 10071 nla_len(attr), 10073 - &request->rates[band]); 10072 + &request->req.rates[band]); 10074 10073 if (err) 10075 10074 goto out_free; 10076 10075 } 10077 10076 } 10078 10077 10079 10078 if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) { 10080 - request->duration = 10079 + request->req.duration = 10081 10080 nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]); 10082 - request->duration_mandatory = 10081 + request->req.duration_mandatory = 10083 10082 nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]); 10084 10083 } 10085 10084 ··· 10088 10087 if (err) 10089 10088 goto out_free; 10090 10089 10091 - request->no_cck = 10090 + request->req.no_cck = 10092 10091 nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]); 10093 10092 10094 10093 /* Initial implementation used NL80211_ATTR_MAC to set the specific ··· 10101 10100 * (NL80211_ATTR_SCAN_FLAGS is used to enable random MAC address use). 10102 10101 */ 10103 10102 if (info->attrs[NL80211_ATTR_BSSID]) 10104 - memcpy(request->bssid, 10103 + memcpy(request->req.bssid, 10105 10104 nla_data(info->attrs[NL80211_ATTR_BSSID]), ETH_ALEN); 10106 - else if (!(request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) && 10105 + else if (!(request->req.flags & NL80211_SCAN_FLAG_RANDOM_ADDR) && 10107 10106 info->attrs[NL80211_ATTR_MAC]) 10108 - memcpy(request->bssid, nla_data(info->attrs[NL80211_ATTR_MAC]), 10107 + memcpy(request->req.bssid, 10108 + nla_data(info->attrs[NL80211_ATTR_MAC]), 10109 10109 ETH_ALEN); 10110 10110 else 10111 - eth_broadcast_addr(request->bssid); 10111 + eth_broadcast_addr(request->req.bssid); 10112 10112 10113 - request->tsf_report_link_id = nl80211_link_id_or_invalid(info->attrs); 10114 - request->wdev = wdev; 10115 - request->wiphy = &rdev->wiphy; 10116 - request->scan_start = jiffies; 10113 + request->req.tsf_report_link_id = 10114 + nl80211_link_id_or_invalid(info->attrs); 10115 + request->req.wdev = wdev; 10116 + request->req.wiphy = &rdev->wiphy; 10117 + request->req.scan_start = jiffies; 10117 10118 10118 10119 rdev->scan_req = request; 10119 10120 err = cfg80211_scan(rdev); ··· 18417 18414 static int nl80211_add_scan_req(struct sk_buff *msg, 18418 18415 struct cfg80211_registered_device *rdev) 18419 18416 { 18420 - struct cfg80211_scan_request *req = rdev->scan_req; 18417 + struct cfg80211_scan_request_int *req = rdev->scan_req; 18421 18418 struct nlattr *nest; 18422 18419 int i; 18423 18420 struct cfg80211_scan_info *info; ··· 18428 18425 nest = nla_nest_start_noflag(msg, NL80211_ATTR_SCAN_SSIDS); 18429 18426 if (!nest) 18430 18427 goto nla_put_failure; 18431 - for (i = 0; i < req->n_ssids; i++) { 18432 - if (nla_put(msg, i, req->ssids[i].ssid_len, req->ssids[i].ssid)) 18428 + for (i = 0; i < req->req.n_ssids; i++) { 18429 + if (nla_put(msg, i, req->req.ssids[i].ssid_len, 18430 + req->req.ssids[i].ssid)) 18433 18431 goto nla_put_failure; 18434 18432 } 18435 18433 nla_nest_end(msg, nest); 18436 18434 18437 - if (req->flags & NL80211_SCAN_FLAG_FREQ_KHZ) { 18435 + if (req->req.flags & NL80211_SCAN_FLAG_FREQ_KHZ) { 18438 18436 nest = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQ_KHZ); 18439 18437 if (!nest) 18440 18438 goto nla_put_failure; 18441 - for (i = 0; i < req->n_channels; i++) { 18439 + for (i = 0; i < req->req.n_channels; i++) { 18442 18440 if (nla_put_u32(msg, i, 18443 - ieee80211_channel_to_khz(req->channels[i]))) 18441 + ieee80211_channel_to_khz(req->req.channels[i]))) 18444 18442 goto nla_put_failure; 18445 18443 } 18446 18444 nla_nest_end(msg, nest); ··· 18450 18446 NL80211_ATTR_SCAN_FREQUENCIES); 18451 18447 if (!nest) 18452 18448 goto nla_put_failure; 18453 - for (i = 0; i < req->n_channels; i++) { 18454 - if (nla_put_u32(msg, i, req->channels[i]->center_freq)) 18449 + for (i = 0; i < req->req.n_channels; i++) { 18450 + if (nla_put_u32(msg, i, 18451 + req->req.channels[i]->center_freq)) 18455 18452 goto nla_put_failure; 18456 18453 } 18457 18454 nla_nest_end(msg, nest); 18458 18455 } 18459 18456 18460 - if (req->ie && 18461 - nla_put(msg, NL80211_ATTR_IE, req->ie_len, req->ie)) 18457 + if (req->req.ie && 18458 + nla_put(msg, NL80211_ATTR_IE, req->req.ie_len, req->req.ie)) 18462 18459 goto nla_put_failure; 18463 18460 18464 - if (req->flags && 18465 - nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->flags)) 18461 + if (req->req.flags && 18462 + nla_put_u32(msg, NL80211_ATTR_SCAN_FLAGS, req->req.flags)) 18466 18463 goto nla_put_failure; 18467 18464 18468 18465 info = rdev->int_scan_req ? &rdev->int_scan_req->info :
+3 -3
net/wireless/rdev-ops.h
··· 456 456 } 457 457 458 458 static inline int rdev_scan(struct cfg80211_registered_device *rdev, 459 - struct cfg80211_scan_request *request) 459 + struct cfg80211_scan_request_int *request) 460 460 { 461 461 int ret; 462 462 463 - if (WARN_ON_ONCE(!request->n_ssids && request->ssids)) 463 + if (WARN_ON_ONCE(!request->req.n_ssids && request->req.ssids)) 464 464 return -EINVAL; 465 465 466 466 trace_rdev_scan(&rdev->wiphy, request); 467 - ret = rdev->ops->scan(&rdev->wiphy, request); 467 + ret = rdev->ops->scan(&rdev->wiphy, &request->req); 468 468 trace_rdev_return_int(&rdev->wiphy, ret); 469 469 return ret; 470 470 }
+99 -89
net/wireless/scan.c
··· 782 782 } 783 783 EXPORT_SYMBOL_IF_CFG80211_KUNIT(cfg80211_parse_colocated_ap); 784 784 785 - static void cfg80211_scan_req_add_chan(struct cfg80211_scan_request *request, 786 - struct ieee80211_channel *chan, 787 - bool add_to_6ghz) 785 + static void cfg80211_scan_req_add_chan(struct cfg80211_scan_request *request, 786 + struct ieee80211_channel *chan, 787 + bool add_to_6ghz) 788 788 { 789 789 int i; 790 790 u32 n_channels = request->n_channels; ··· 843 843 u8 i; 844 844 struct cfg80211_colocated_ap *ap; 845 845 int n_channels, count = 0, err; 846 - struct cfg80211_scan_request *request, *rdev_req = rdev->scan_req; 846 + struct cfg80211_scan_request_int *request, *rdev_req = rdev->scan_req; 847 847 LIST_HEAD(coloc_ap_list); 848 848 bool need_scan_psc = true; 849 849 const struct ieee80211_sband_iftype_data *iftd; 850 850 size_t size, offs_ssids, offs_6ghz_params, offs_ies; 851 851 852 - rdev_req->scan_6ghz = true; 852 + rdev_req->req.scan_6ghz = true; 853 853 854 854 if (!rdev->wiphy.bands[NL80211_BAND_6GHZ]) 855 855 return -EOPNOTSUPP; 856 856 857 857 iftd = ieee80211_get_sband_iftype_data(rdev->wiphy.bands[NL80211_BAND_6GHZ], 858 - rdev_req->wdev->iftype); 858 + rdev_req->req.wdev->iftype); 859 859 if (!iftd || !iftd->he_cap.has_he) 860 860 return -EOPNOTSUPP; 861 861 862 862 n_channels = rdev->wiphy.bands[NL80211_BAND_6GHZ]->n_channels; 863 863 864 - if (rdev_req->flags & NL80211_SCAN_FLAG_COLOCATED_6GHZ) { 864 + if (rdev_req->req.flags & NL80211_SCAN_FLAG_COLOCATED_6GHZ) { 865 865 struct cfg80211_internal_bss *intbss; 866 866 867 867 spin_lock_bh(&rdev->bss_lock); ··· 883 883 * This is relevant for ML probe requests when the lower 884 884 * band APs have not been discovered. 885 885 */ 886 - if (is_broadcast_ether_addr(rdev_req->bssid) || 887 - !ether_addr_equal(rdev_req->bssid, res->bssid) || 886 + if (is_broadcast_ether_addr(rdev_req->req.bssid) || 887 + !ether_addr_equal(rdev_req->req.bssid, res->bssid) || 888 888 res->channel->band != NL80211_BAND_6GHZ) 889 889 continue; 890 890 ··· 911 911 spin_unlock_bh(&rdev->bss_lock); 912 912 } 913 913 914 - size = struct_size(request, channels, n_channels); 914 + size = struct_size(request, req.channels, n_channels); 915 915 offs_ssids = size; 916 - size += sizeof(*request->ssids) * rdev_req->n_ssids; 916 + size += sizeof(*request->req.ssids) * rdev_req->req.n_ssids; 917 917 offs_6ghz_params = size; 918 - size += sizeof(*request->scan_6ghz_params) * count; 918 + size += sizeof(*request->req.scan_6ghz_params) * count; 919 919 offs_ies = size; 920 - size += rdev_req->ie_len; 920 + size += rdev_req->req.ie_len; 921 921 922 922 request = kzalloc(size, GFP_KERNEL); 923 923 if (!request) { ··· 926 926 } 927 927 928 928 *request = *rdev_req; 929 - request->n_channels = 0; 930 - request->n_6ghz_params = 0; 931 - if (rdev_req->n_ssids) { 929 + request->req.n_channels = 0; 930 + request->req.n_6ghz_params = 0; 931 + if (rdev_req->req.n_ssids) { 932 932 /* 933 933 * Add the ssids from the parent scan request to the new 934 934 * scan request, so the driver would be able to use them 935 935 * in its probe requests to discover hidden APs on PSC 936 936 * channels. 937 937 */ 938 - request->ssids = (void *)request + offs_ssids; 939 - memcpy(request->ssids, rdev_req->ssids, 940 - sizeof(*request->ssids) * request->n_ssids); 938 + request->req.ssids = (void *)request + offs_ssids; 939 + memcpy(request->req.ssids, rdev_req->req.ssids, 940 + sizeof(*request->req.ssids) * request->req.n_ssids); 941 941 } 942 - request->scan_6ghz_params = (void *)request + offs_6ghz_params; 942 + request->req.scan_6ghz_params = (void *)request + offs_6ghz_params; 943 943 944 - if (rdev_req->ie_len) { 944 + if (rdev_req->req.ie_len) { 945 945 void *ie = (void *)request + offs_ies; 946 946 947 - memcpy(ie, rdev_req->ie, rdev_req->ie_len); 948 - request->ie = ie; 947 + memcpy(ie, rdev_req->req.ie, rdev_req->req.ie_len); 948 + request->req.ie = ie; 949 949 } 950 950 951 951 /* ··· 953 953 * and at least one of the reported co-located APs with same SSID 954 954 * indicating that all APs in the same ESS are co-located 955 955 */ 956 - if (count && request->n_ssids == 1 && request->ssids[0].ssid_len) { 956 + if (count && 957 + request->req.n_ssids == 1 && 958 + request->req.ssids[0].ssid_len) { 957 959 list_for_each_entry(ap, &coloc_ap_list, list) { 958 960 if (ap->colocated_ess && 959 - cfg80211_find_ssid_match(ap, request)) { 961 + cfg80211_find_ssid_match(ap, &request->req)) { 960 962 need_scan_psc = false; 961 963 break; 962 964 } ··· 970 968 * regardless of the collocated APs (PSC channels or all channels 971 969 * in case that NL80211_SCAN_FLAG_COLOCATED_6GHZ is not set) 972 970 */ 973 - for (i = 0; i < rdev_req->n_channels; i++) { 974 - if (rdev_req->channels[i]->band == NL80211_BAND_6GHZ && 971 + for (i = 0; i < rdev_req->req.n_channels; i++) { 972 + if (rdev_req->req.channels[i]->band == NL80211_BAND_6GHZ && 975 973 ((need_scan_psc && 976 - cfg80211_channel_is_psc(rdev_req->channels[i])) || 977 - !(rdev_req->flags & NL80211_SCAN_FLAG_COLOCATED_6GHZ))) { 978 - cfg80211_scan_req_add_chan(request, 979 - rdev_req->channels[i], 974 + cfg80211_channel_is_psc(rdev_req->req.channels[i])) || 975 + !(rdev_req->req.flags & NL80211_SCAN_FLAG_COLOCATED_6GHZ))) { 976 + cfg80211_scan_req_add_chan(&request->req, 977 + rdev_req->req.channels[i], 980 978 false); 981 979 } 982 980 } 983 981 984 - if (!(rdev_req->flags & NL80211_SCAN_FLAG_COLOCATED_6GHZ)) 982 + if (!(rdev_req->req.flags & NL80211_SCAN_FLAG_COLOCATED_6GHZ)) 985 983 goto skip; 986 984 987 985 list_for_each_entry(ap, &coloc_ap_list, list) { 988 986 bool found = false; 989 987 struct cfg80211_scan_6ghz_params *scan_6ghz_params = 990 - &request->scan_6ghz_params[request->n_6ghz_params]; 988 + &request->req.scan_6ghz_params[request->req.n_6ghz_params]; 991 989 struct ieee80211_channel *chan = 992 990 ieee80211_get_channel(&rdev->wiphy, ap->center_freq); 993 991 994 992 if (!chan || chan->flags & IEEE80211_CHAN_DISABLED || 995 - !cfg80211_wdev_channel_allowed(rdev_req->wdev, chan)) 993 + !cfg80211_wdev_channel_allowed(rdev_req->req.wdev, chan)) 996 994 continue; 997 995 998 - for (i = 0; i < rdev_req->n_channels; i++) { 999 - if (rdev_req->channels[i] == chan) 996 + for (i = 0; i < rdev_req->req.n_channels; i++) { 997 + if (rdev_req->req.channels[i] == chan) 1000 998 found = true; 1001 999 } 1002 1000 1003 1001 if (!found) 1004 1002 continue; 1005 1003 1006 - if (request->n_ssids > 0 && 1007 - !cfg80211_find_ssid_match(ap, request)) 1004 + if (request->req.n_ssids > 0 && 1005 + !cfg80211_find_ssid_match(ap, &request->req)) 1008 1006 continue; 1009 1007 1010 - if (!is_broadcast_ether_addr(request->bssid) && 1011 - !ether_addr_equal(request->bssid, ap->bssid)) 1008 + if (!is_broadcast_ether_addr(request->req.bssid) && 1009 + !ether_addr_equal(request->req.bssid, ap->bssid)) 1012 1010 continue; 1013 1011 1014 - if (!request->n_ssids && ap->multi_bss && !ap->transmitted_bssid) 1012 + if (!request->req.n_ssids && ap->multi_bss && 1013 + !ap->transmitted_bssid) 1015 1014 continue; 1016 1015 1017 - cfg80211_scan_req_add_chan(request, chan, true); 1016 + cfg80211_scan_req_add_chan(&request->req, chan, true); 1018 1017 memcpy(scan_6ghz_params->bssid, ap->bssid, ETH_ALEN); 1019 1018 scan_6ghz_params->short_ssid = ap->short_ssid; 1020 1019 scan_6ghz_params->short_ssid_valid = ap->short_ssid_valid; ··· 1031 1028 if (cfg80211_channel_is_psc(chan) && !need_scan_psc) 1032 1029 scan_6ghz_params->psc_no_listen = true; 1033 1030 1034 - request->n_6ghz_params++; 1031 + request->req.n_6ghz_params++; 1035 1032 } 1036 1033 1037 1034 skip: 1038 1035 cfg80211_free_coloc_ap_list(&coloc_ap_list); 1039 1036 1040 - if (request->n_channels) { 1041 - struct cfg80211_scan_request *old = rdev->int_scan_req; 1037 + if (request->req.n_channels) { 1038 + struct cfg80211_scan_request_int *old = rdev->int_scan_req; 1042 1039 1043 1040 rdev->int_scan_req = request; 1044 1041 ··· 1066 1063 1067 1064 int cfg80211_scan(struct cfg80211_registered_device *rdev) 1068 1065 { 1069 - struct cfg80211_scan_request *request; 1070 - struct cfg80211_scan_request *rdev_req = rdev->scan_req; 1066 + struct cfg80211_scan_request_int *request; 1067 + struct cfg80211_scan_request_int *rdev_req = rdev->scan_req; 1071 1068 u32 n_channels = 0, idx, i; 1072 1069 1073 1070 if (!(rdev->wiphy.flags & WIPHY_FLAG_SPLIT_SCAN_6GHZ)) 1074 1071 return rdev_scan(rdev, rdev_req); 1075 1072 1076 - for (i = 0; i < rdev_req->n_channels; i++) { 1077 - if (rdev_req->channels[i]->band != NL80211_BAND_6GHZ) 1073 + for (i = 0; i < rdev_req->req.n_channels; i++) { 1074 + if (rdev_req->req.channels[i]->band != NL80211_BAND_6GHZ) 1078 1075 n_channels++; 1079 1076 } 1080 1077 1081 1078 if (!n_channels) 1082 1079 return cfg80211_scan_6ghz(rdev); 1083 1080 1084 - request = kzalloc(struct_size(request, channels, n_channels), 1081 + request = kzalloc(struct_size(request, req.channels, n_channels), 1085 1082 GFP_KERNEL); 1086 1083 if (!request) 1087 1084 return -ENOMEM; 1088 1085 1089 1086 *request = *rdev_req; 1090 - request->n_channels = n_channels; 1087 + request->req.n_channels = n_channels; 1091 1088 1092 - for (i = idx = 0; i < rdev_req->n_channels; i++) { 1093 - if (rdev_req->channels[i]->band != NL80211_BAND_6GHZ) 1094 - request->channels[idx++] = rdev_req->channels[i]; 1089 + for (i = idx = 0; i < rdev_req->req.n_channels; i++) { 1090 + if (rdev_req->req.channels[i]->band != NL80211_BAND_6GHZ) 1091 + request->req.channels[idx++] = 1092 + rdev_req->req.channels[i]; 1095 1093 } 1096 1094 1097 - rdev_req->scan_6ghz = false; 1095 + rdev_req->req.scan_6ghz = false; 1098 1096 rdev->int_scan_req = request; 1099 1097 return rdev_scan(rdev, request); 1100 1098 } ··· 1103 1099 void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev, 1104 1100 bool send_message) 1105 1101 { 1106 - struct cfg80211_scan_request *request, *rdev_req; 1102 + struct cfg80211_scan_request_int *request, *rdev_req; 1107 1103 struct wireless_dev *wdev; 1108 1104 struct sk_buff *msg; 1109 1105 #ifdef CONFIG_CFG80211_WEXT ··· 1122 1118 if (!rdev_req) 1123 1119 return; 1124 1120 1125 - wdev = rdev_req->wdev; 1121 + wdev = rdev_req->req.wdev; 1126 1122 request = rdev->int_scan_req ? rdev->int_scan_req : rdev_req; 1127 1123 1128 1124 if (wdev_running(wdev) && 1129 1125 (rdev->wiphy.flags & WIPHY_FLAG_SPLIT_SCAN_6GHZ) && 1130 - !rdev_req->scan_6ghz && !request->info.aborted && 1126 + !rdev_req->req.scan_6ghz && !request->info.aborted && 1131 1127 !cfg80211_scan_6ghz(rdev)) 1132 1128 return; 1133 1129 ··· 1140 1136 cfg80211_sme_scan_done(wdev->netdev); 1141 1137 1142 1138 if (!request->info.aborted && 1143 - request->flags & NL80211_SCAN_FLAG_FLUSH) { 1139 + request->req.flags & NL80211_SCAN_FLAG_FLUSH) { 1144 1140 /* flush entries from previous scans */ 1145 1141 spin_lock_bh(&rdev->bss_lock); 1146 - __cfg80211_bss_expire(rdev, request->scan_start); 1142 + __cfg80211_bss_expire(rdev, request->req.scan_start); 1147 1143 spin_unlock_bh(&rdev->bss_lock); 1148 1144 } 1149 1145 ··· 1179 1175 void cfg80211_scan_done(struct cfg80211_scan_request *request, 1180 1176 struct cfg80211_scan_info *info) 1181 1177 { 1182 - struct cfg80211_scan_info old_info = request->info; 1178 + struct cfg80211_scan_request_int *intreq = 1179 + container_of(request, struct cfg80211_scan_request_int, req); 1180 + struct cfg80211_registered_device *rdev = wiphy_to_rdev(request->wiphy); 1181 + struct cfg80211_scan_info old_info = intreq->info; 1183 1182 1184 - trace_cfg80211_scan_done(request, info); 1185 - WARN_ON(request != wiphy_to_rdev(request->wiphy)->scan_req && 1186 - request != wiphy_to_rdev(request->wiphy)->int_scan_req); 1183 + trace_cfg80211_scan_done(intreq, info); 1184 + WARN_ON(intreq != rdev->scan_req && 1185 + intreq != rdev->int_scan_req); 1187 1186 1188 - request->info = *info; 1187 + intreq->info = *info; 1189 1188 1190 1189 /* 1191 1190 * In case the scan is split, the scan_start_tsf and tsf_bssid should ··· 1196 1189 * be non zero. 1197 1190 */ 1198 1191 if (request->scan_6ghz && old_info.scan_start_tsf) { 1199 - request->info.scan_start_tsf = old_info.scan_start_tsf; 1200 - memcpy(request->info.tsf_bssid, old_info.tsf_bssid, 1201 - sizeof(request->info.tsf_bssid)); 1192 + intreq->info.scan_start_tsf = old_info.scan_start_tsf; 1193 + memcpy(intreq->info.tsf_bssid, old_info.tsf_bssid, 1194 + sizeof(intreq->info.tsf_bssid)); 1202 1195 } 1203 1196 1204 - request->notified = true; 1205 - wiphy_work_queue(request->wiphy, 1206 - &wiphy_to_rdev(request->wiphy)->scan_done_wk); 1197 + intreq->notified = true; 1198 + wiphy_work_queue(request->wiphy, &rdev->scan_done_wk); 1207 1199 } 1208 1200 EXPORT_SYMBOL(cfg80211_scan_done); 1209 1201 ··· 3502 3496 struct cfg80211_registered_device *rdev; 3503 3497 struct wiphy *wiphy; 3504 3498 struct iw_scan_req *wreq = NULL; 3505 - struct cfg80211_scan_request *creq; 3499 + struct cfg80211_scan_request_int *creq; 3506 3500 int i, err, n_channels = 0; 3507 3501 enum nl80211_band band; 3508 3502 ··· 3532 3526 n_channels = ieee80211_get_num_supported_channels(wiphy); 3533 3527 } 3534 3528 3535 - creq = kzalloc(struct_size(creq, channels, n_channels) + 3529 + creq = kzalloc(struct_size(creq, req.channels, n_channels) + 3536 3530 sizeof(struct cfg80211_ssid), 3537 3531 GFP_ATOMIC); 3538 3532 if (!creq) 3539 3533 return -ENOMEM; 3540 3534 3541 - creq->wiphy = wiphy; 3542 - creq->wdev = dev->ieee80211_ptr; 3535 + creq->req.wiphy = wiphy; 3536 + creq->req.wdev = dev->ieee80211_ptr; 3543 3537 /* SSIDs come after channels */ 3544 - creq->ssids = (void *)creq + struct_size(creq, channels, n_channels); 3545 - creq->n_channels = n_channels; 3546 - creq->n_ssids = 1; 3547 - creq->scan_start = jiffies; 3538 + creq->req.ssids = (void *)creq + 3539 + struct_size(creq, req.channels, n_channels); 3540 + creq->req.n_channels = n_channels; 3541 + creq->req.n_ssids = 1; 3542 + creq->req.scan_start = jiffies; 3548 3543 3549 3544 /* translate "Scan on frequencies" request */ 3550 3545 i = 0; ··· 3561 3554 /* ignore disabled channels */ 3562 3555 chan = &wiphy->bands[band]->channels[j]; 3563 3556 if (chan->flags & IEEE80211_CHAN_DISABLED || 3564 - !cfg80211_wdev_channel_allowed(creq->wdev, chan)) 3557 + !cfg80211_wdev_channel_allowed(creq->req.wdev, chan)) 3565 3558 continue; 3566 3559 3567 3560 /* If we have a wireless request structure and the ··· 3584 3577 } 3585 3578 3586 3579 wext_freq_found: 3587 - creq->channels[i] = &wiphy->bands[band]->channels[j]; 3580 + creq->req.channels[i] = 3581 + &wiphy->bands[band]->channels[j]; 3588 3582 i++; 3589 3583 wext_freq_not_found: ; 3590 3584 } ··· 3596 3588 goto out; 3597 3589 } 3598 3590 3599 - /* Set real number of channels specified in creq->channels[] */ 3600 - creq->n_channels = i; 3591 + /* Set real number of channels specified in creq->req.channels[] */ 3592 + creq->req.n_channels = i; 3601 3593 3602 3594 /* translate "Scan for SSID" request */ 3603 3595 if (wreq) { 3604 3596 if (wrqu->data.flags & IW_SCAN_THIS_ESSID) { 3605 3597 if (wreq->essid_len > IEEE80211_MAX_SSID_LEN) 3606 3598 return -EINVAL; 3607 - memcpy(creq->ssids[0].ssid, wreq->essid, wreq->essid_len); 3608 - creq->ssids[0].ssid_len = wreq->essid_len; 3599 + memcpy(creq->req.ssids[0].ssid, wreq->essid, 3600 + wreq->essid_len); 3601 + creq->req.ssids[0].ssid_len = wreq->essid_len; 3609 3602 } 3610 3603 if (wreq->scan_type == IW_SCAN_TYPE_PASSIVE) { 3611 - creq->ssids = NULL; 3612 - creq->n_ssids = 0; 3604 + creq->req.ssids = NULL; 3605 + creq->req.n_ssids = 0; 3613 3606 } 3614 3607 } 3615 3608 3616 3609 for (i = 0; i < NUM_NL80211_BANDS; i++) 3617 3610 if (wiphy->bands[i]) 3618 - creq->rates[i] = (1 << wiphy->bands[i]->n_bitrates) - 1; 3611 + creq->req.rates[i] = 3612 + (1 << wiphy->bands[i]->n_bitrates) - 1; 3619 3613 3620 - eth_broadcast_addr(creq->bssid); 3614 + eth_broadcast_addr(creq->req.bssid); 3621 3615 3622 3616 scoped_guard(wiphy, &rdev->wiphy) { 3623 3617 rdev->scan_req = creq;
+20 -20
net/wireless/sme.c
··· 5 5 * (for nl80211's connect() and wext) 6 6 * 7 7 * Copyright 2009 Johannes Berg <johannes@sipsolutions.net> 8 - * Copyright (C) 2009, 2020, 2022-2024 Intel Corporation. All rights reserved. 8 + * Copyright (C) 2009, 2020, 2022-2025 Intel Corporation. All rights reserved. 9 9 * Copyright 2017 Intel Deutschland GmbH 10 10 */ 11 11 ··· 64 64 static int cfg80211_conn_scan(struct wireless_dev *wdev) 65 65 { 66 66 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); 67 - struct cfg80211_scan_request *request; 67 + struct cfg80211_scan_request_int *request; 68 68 int n_channels, err; 69 69 70 70 lockdep_assert_wiphy(wdev->wiphy); ··· 77 77 else 78 78 n_channels = ieee80211_get_num_supported_channels(wdev->wiphy); 79 79 80 - request = kzalloc(sizeof(*request) + sizeof(request->ssids[0]) + 81 - sizeof(request->channels[0]) * n_channels, 80 + request = kzalloc(sizeof(*request) + sizeof(request->req.ssids[0]) + 81 + sizeof(request->req.channels[0]) * n_channels, 82 82 GFP_KERNEL); 83 83 if (!request) 84 84 return -ENOMEM; 85 85 86 - request->n_channels = n_channels; 86 + request->req.n_channels = n_channels; 87 87 if (wdev->conn->params.channel) { 88 88 enum nl80211_band band = wdev->conn->params.channel->band; 89 89 struct ieee80211_supported_band *sband = ··· 93 93 kfree(request); 94 94 return -EINVAL; 95 95 } 96 - request->channels[0] = wdev->conn->params.channel; 97 - request->rates[band] = (1 << sband->n_bitrates) - 1; 96 + request->req.channels[0] = wdev->conn->params.channel; 97 + request->req.rates[band] = (1 << sband->n_bitrates) - 1; 98 98 } else { 99 99 int i = 0, j; 100 100 enum nl80211_band band; ··· 109 109 channel = &bands->channels[j]; 110 110 if (channel->flags & IEEE80211_CHAN_DISABLED) 111 111 continue; 112 - request->channels[i++] = channel; 112 + request->req.channels[i++] = channel; 113 113 } 114 - request->rates[band] = (1 << bands->n_bitrates) - 1; 114 + request->req.rates[band] = (1 << bands->n_bitrates) - 1; 115 115 } 116 116 n_channels = i; 117 117 } 118 - request->n_channels = n_channels; 119 - request->ssids = (void *)request + 120 - struct_size(request, channels, n_channels); 121 - request->n_ssids = 1; 118 + request->req.n_channels = n_channels; 119 + request->req.ssids = (void *)request + 120 + struct_size(request, req.channels, n_channels); 121 + request->req.n_ssids = 1; 122 122 123 - memcpy(request->ssids[0].ssid, wdev->conn->params.ssid, 124 - wdev->conn->params.ssid_len); 125 - request->ssids[0].ssid_len = wdev->conn->params.ssid_len; 123 + memcpy(request->req.ssids[0].ssid, wdev->conn->params.ssid, 124 + wdev->conn->params.ssid_len); 125 + request->req.ssids[0].ssid_len = wdev->conn->params.ssid_len; 126 126 127 - eth_broadcast_addr(request->bssid); 127 + eth_broadcast_addr(request->req.bssid); 128 128 129 - request->wdev = wdev; 130 - request->wiphy = &rdev->wiphy; 131 - request->scan_start = jiffies; 129 + request->req.wdev = wdev; 130 + request->req.wiphy = &rdev->wiphy; 131 + request->req.scan_start = jiffies; 132 132 133 133 rdev->scan_req = request; 134 134
+12 -11
net/wireless/trace.h
··· 373 373 ); 374 374 375 375 TRACE_EVENT(rdev_scan, 376 - TP_PROTO(struct wiphy *wiphy, struct cfg80211_scan_request *request), 376 + TP_PROTO(struct wiphy *wiphy, 377 + struct cfg80211_scan_request_int *request), 377 378 TP_ARGS(wiphy, request), 378 379 TP_STRUCT__entry( 379 380 WIPHY_ENTRY ··· 3717 3716 ); 3718 3717 3719 3718 TRACE_EVENT(cfg80211_scan_done, 3720 - TP_PROTO(struct cfg80211_scan_request *request, 3719 + TP_PROTO(struct cfg80211_scan_request_int *request, 3721 3720 struct cfg80211_scan_info *info), 3722 3721 TP_ARGS(request, info), 3723 3722 TP_STRUCT__entry( 3724 3723 __field(u32, n_channels) 3725 - __dynamic_array(u8, ie, request ? request->ie_len : 0) 3724 + __dynamic_array(u8, ie, request ? request->req.ie_len : 0) 3726 3725 __array(u32, rates, NUM_NL80211_BANDS) 3727 3726 __field(u32, wdev_id) 3728 3727 MAC_ENTRY(wiphy_mac) ··· 3733 3732 ), 3734 3733 TP_fast_assign( 3735 3734 if (request) { 3736 - memcpy(__get_dynamic_array(ie), request->ie, 3737 - request->ie_len); 3738 - memcpy(__entry->rates, request->rates, 3735 + memcpy(__get_dynamic_array(ie), request->req.ie, 3736 + request->req.ie_len); 3737 + memcpy(__entry->rates, request->req.rates, 3739 3738 NUM_NL80211_BANDS); 3740 - __entry->wdev_id = request->wdev ? 3741 - request->wdev->identifier : 0; 3742 - if (request->wiphy) 3739 + __entry->wdev_id = request->req.wdev ? 3740 + request->req.wdev->identifier : 0; 3741 + if (request->req.wiphy) 3743 3742 MAC_ASSIGN(wiphy_mac, 3744 - request->wiphy->perm_addr); 3745 - __entry->no_cck = request->no_cck; 3743 + request->req.wiphy->perm_addr); 3744 + __entry->no_cck = request->req.no_cck; 3746 3745 } 3747 3746 if (info) { 3748 3747 __entry->aborted = info->aborted;