From: Jouni Malinen Date: Fri, 27 Dec 2024 18:43:42 +0000 (+0200) Subject: nl80211: Fetch maximum length of extra IE(s) for Probe Request frames X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=66442d1bcbf2c06c29b55ff8930dbe7d46b60e98;p=thirdparty%2Fhostap.git nl80211: Fetch maximum length of extra IE(s) for Probe Request frames 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 --- diff --git a/src/drivers/driver.h b/src/drivers/driver.h index fea7a7398..de2b1de09 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -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; }; diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index 2c94360f0..68f22234f 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -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; diff --git a/src/drivers/driver_nl80211_capa.c b/src/drivers/driver_nl80211_capa.c index 7c688acf8..08a8552a1 100644 --- a/src/drivers/driver_nl80211_capa.c +++ b/src/drivers/driver_nl80211_capa.c @@ -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; diff --git a/src/drivers/driver_nl80211_scan.c b/src/drivers/driver_nl80211_scan.c index 8e98fcdf8..f0313c1af 100644 --- a/src/drivers/driver_nl80211_scan.c +++ b/src/drivers/driver_nl80211_scan.c @@ -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; diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c index 5267ffb30..132d91598 100644 --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c @@ -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); diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h index 726f7caec..b077ee9f9 100644 --- a/wpa_supplicant/wpa_supplicant_i.h +++ b/wpa_supplicant/wpa_supplicant_i.h @@ -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