Unsolicited broadcast probe response tranmission is used for in-band discovery in 6GHz band (IEEE P802.11ax/D6.0 26.17.2.3.2, AP behavior for fast passive scanning). The new attribute, NL80211_ATTR_UNSOL_BCAST_PROBE_RESP, is nested which supports following parameters: (1) NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_INT - Packet interval (2) NL80211_UNSOL_BCAST_PROBE_RESP_ATTR_TMPL - Template data Signed-off-by: Aloka Dixit <alokad@xxxxxxxxxxxxxx> --- src/drivers/driver_nl80211.c | 51 +++++++++++++++++++++++++++++++ src/drivers/driver_nl80211.h | 1 + src/drivers/driver_nl80211_capa.c | 5 +++ 3 files changed, 57 insertions(+) diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index 2ee34d11d64e..dc3c5aa672ff 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -4301,6 +4301,48 @@ static int nl80211_set_multicast_to_unicast(struct i802_bss *bss, } +#ifdef CONFIG_IEEE80211AX +static int nl80211_unsol_bcast_probe_resp(struct i802_bss *bss, + struct nl_msg *msg, + struct wpa_driver_ap_params *params) +{ + struct nlattr *attr; + + if (!bss->drv->unsol_bcast_probe_resp) { + wpa_printf(MSG_ERROR, + "nl80211: Driver does not support unsolicited broadcast probe response transmission for %s\n", + bss->ifname); + return -1; + } + + attr = nla_nest_start(msg, NL80211_ATTR_UNSOL_BCAST_PROBE_RESP); + if (!attr) + return -1; + + if (nla_put_u32(msg, NL80211_UNSOL_BCAST_PROBE_RESP_INT, + params->unsol_bcast_probe_resp_interval)) { + wpa_printf(MSG_ERROR, + "nl80211: Failed to build unsolicited broadcast probe response msg for %s\n", + bss->ifname); + return -1; + } + + if (params->unsol_bcast_probe_resp_tmpl && + nla_put(msg, NL80211_UNSOL_BCAST_PROBE_RESP_TMPL, + params->unsol_bcast_probe_resp_tmpl_len, + params->unsol_bcast_probe_resp_tmpl)) { + wpa_printf(MSG_ERROR, + "nl80211: Failed to build unsolicited broadcast probe response msg for %s\n", + bss->ifname); + return -1; + } + + nla_nest_end(msg, attr); + return 0; +} +#endif /* CONFIG_IEEE80211AX */ + + static int wpa_driver_nl80211_set_ap(void *priv, struct wpa_driver_ap_params *params) { @@ -4559,6 +4601,15 @@ static int wpa_driver_nl80211_set_ap(void *priv, if (nla_put_flag(msg, NL80211_ATTR_TWT_RESPONDER)) goto fail; } + + if (params->unsol_bcast_probe_resp_interval) { + wpa_printf(MSG_DEBUG, + "nl80211: unsolicited probe response interval = %u\n", + params->unsol_bcast_probe_resp_interval); + ret = nl80211_unsol_bcast_probe_resp(bss, msg, params); + if (ret < 0) + goto fail; + } #endif /* CONFIG_IEEE80211AX */ ret = send_and_recv_msgs_owner(drv, msg, get_connect_handle(bss), 1, diff --git a/src/drivers/driver_nl80211.h b/src/drivers/driver_nl80211.h index 017c025a0d75..5528eba85022 100644 --- a/src/drivers/driver_nl80211.h +++ b/src/drivers/driver_nl80211.h @@ -174,6 +174,7 @@ struct wpa_driver_nl80211_data { unsigned int control_port_ap:1; unsigned int multicast_registrations:1; unsigned int no_rrm:1; + unsigned int unsol_bcast_probe_resp:1; u64 vendor_scan_cookie; u64 remain_on_chan_cookie; diff --git a/src/drivers/driver_nl80211_capa.c b/src/drivers/driver_nl80211_capa.c index 46f61fdbf925..62cc9f0fda23 100644 --- a/src/drivers/driver_nl80211_capa.c +++ b/src/drivers/driver_nl80211_capa.c @@ -644,6 +644,11 @@ static void wiphy_info_ext_feature_flags(struct wiphy_info_data *info, if (ext_feature_isset(ext_features, len, NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS)) info->drv->multicast_registrations = 1; + + if (ext_feature_isset(ext_features, len, + NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP)) + info->drv->unsol_bcast_probe_resp = 1; + } -- 2.25.0 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap