]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
nl80211: Fetch maximum length of extra IE(s) for Probe Request frames
authorJouni Malinen <j@w1.fi>
Fri, 27 Dec 2024 18:43:42 +0000 (20:43 +0200)
committerJouni Malinen <j@w1.fi>
Fri, 27 Dec 2024 20:27:15 +0000 (22:27 +0200)
This can be helpful in determining which IE(s) to add to Probe Request
frames in scan commands based on driver capabilities.

Signed-off-by: Jouni Malinen <j@w1.fi>
src/drivers/driver.h
src/drivers/driver_nl80211.c
src/drivers/driver_nl80211_capa.c
src/drivers/driver_nl80211_scan.c
wpa_supplicant/wpa_supplicant.c
wpa_supplicant/wpa_supplicant_i.h

index fea7a7398f324e2bac34bb4b81eb7fe8b272fc81..de2b1de0977fe0008ff9e78dc263a6739dd25c0b 100644 (file)
@@ -2493,6 +2493,10 @@ struct wpa_driver_capa {
        unsigned int mbssid_max_interfaces;
        /* Maximum profile periodicity for enhanced MBSSID advertisement */
        unsigned int ema_max_periodicity;
+
+       /* Maximum number of bytes of extra IE(s) that can be added to Probe
+        * Request frames */
+       size_t max_probe_req_ie_len;
 };
 
 
index 2c94360f011c7919331b9d6524eedd27cf3c490f..68f22234fda7ac86af3536658b561845745065af 100644 (file)
@@ -11388,7 +11388,8 @@ static int wpa_driver_nl80211_status(void *priv, char *buf, size_t buflen)
                                  "capa.max_sched_scan_plan_interval=%u\n"
                                  "capa.max_sched_scan_plan_iterations=%u\n"
                                  "capa.mbssid_max_interfaces=%u\n"
-                                 "capa.ema_max_periodicity=%u\n",
+                                 "capa.ema_max_periodicity=%u\n"
+                                 "capa.max_probe_req_ie_len=%zu\n",
                                  drv->capa.key_mgmt,
                                  drv->capa.enc,
                                  drv->capa.auth,
@@ -11413,7 +11414,8 @@ static int wpa_driver_nl80211_status(void *priv, char *buf, size_t buflen)
                                  drv->capa.max_sched_scan_plan_interval,
                                  drv->capa.max_sched_scan_plan_iterations,
                                  drv->capa.mbssid_max_interfaces,
-                                 drv->capa.ema_max_periodicity);
+                                 drv->capa.ema_max_periodicity,
+                                 drv->capa.max_probe_req_ie_len);
                if (os_snprintf_error(end - pos, res))
                        return pos - buf;
                pos += res;
index 7c688acf8d72c5c85f9b6226cf2abb737cba6004..08a8552a101dd5b8fbcf06854bda4a9b2039a813 100644 (file)
@@ -959,6 +959,10 @@ static int wiphy_info_handler(struct nl_msg *msg, void *arg)
                capa->max_scan_ssids =
                        nla_get_u8(tb[NL80211_ATTR_MAX_NUM_SCAN_SSIDS]);
 
+       if (tb[NL80211_ATTR_MAX_SCAN_IE_LEN])
+               capa->max_probe_req_ie_len =
+                       nla_get_u16(tb[NL80211_ATTR_MAX_SCAN_IE_LEN]);
+
        if (tb[NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS])
                capa->max_sched_scan_ssids =
                        nla_get_u8(tb[NL80211_ATTR_MAX_NUM_SCHED_SCAN_SSIDS]);
@@ -1199,6 +1203,10 @@ static int wpa_driver_nl80211_get_info(struct wpa_driver_nl80211_data *drv,
        info->capa = &drv->capa;
        info->drv = drv;
 
+       /* Default to large buffer of extra IE(s) to maintain previous behavior
+        * if the driver does not support reporting an accurate limit. */
+       info->capa->max_probe_req_ie_len = 1500;
+
        feat = get_nl80211_protocol_features(drv);
        if (feat & NL80211_PROTOCOL_FEATURE_SPLIT_WIPHY_DUMP)
                flags = NLM_F_DUMP;
index 8e98fcdf8503bf6f0ce5947918a25342373b3ad5..f0313c1af7250d81b112bb1ad4fa7a1002ca2fc6 100644 (file)
@@ -238,6 +238,11 @@ nl80211_scan_common(struct i802_bss *bss, u8 cmd,
        if (params->extra_ies) {
                wpa_hexdump(MSG_MSGDUMP, "nl80211: Scan extra IEs",
                            params->extra_ies, params->extra_ies_len);
+               if (params->extra_ies_len > drv->capa.max_probe_req_ie_len)
+                       wpa_printf(MSG_INFO,
+                                  "nl80211: Extra IEs for scan do not fit driver limit (%zu > %zu) - this is likely to fail",
+                                  params->extra_ies_len,
+                                  drv->capa.max_probe_req_ie_len);
                if (nla_put(msg, NL80211_ATTR_IE, params->extra_ies_len,
                            params->extra_ies))
                        goto fail;
index 5267ffb300edcdc1cb30b50a8f803b98f65e818d..132d91598f4b3220136208d35b0e98eb6d43be04 100644 (file)
@@ -7728,12 +7728,15 @@ static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
                    capa.mac_addr_rand_sched_scan_supported)
                        wpa_s->mac_addr_rand_supported |=
                                (MAC_ADDR_RAND_SCHED_SCAN | MAC_ADDR_RAND_PNO);
+               wpa_s->drv_max_probe_req_ie_len = capa.max_probe_req_ie_len;
 
                wpa_drv_get_ext_capa(wpa_s, WPA_IF_STATION);
                if (wpa_s->extended_capa &&
                    wpa_s->extended_capa_len >= 3 &&
                    wpa_s->extended_capa[2] & 0x40)
                        wpa_s->multi_bss_support = 1;
+       } else {
+               wpa_s->drv_max_probe_req_ie_len = 1500;
        }
 #ifdef CONFIG_PASN
        wpa_pasn_sm_set_caps(wpa_s->wpa, wpa_s->drv_flags2);
index 726f7caec981238d9dd25d229a7a8800759d0c18..b077ee9f9f0c49cbbe5d85b22cbdd3a979c7bc4b 100644 (file)
@@ -938,6 +938,7 @@ struct wpa_supplicant {
        unsigned int drv_key_mgmt;
        unsigned int drv_rrm_flags;
        unsigned int drv_max_acl_mac_addrs;
+       size_t drv_max_probe_req_ie_len;
 
        /*
         * A bitmap of supported protocols for probe response offload. See