From: Benjamin Berg <benjamin.berg@xxxxxxxxx> To support ML probe request we will need to include IEs from the other hapd instances in the response. Split the function to allow just generating the per-instance IEs separately. Signed-off-by: Benjamin Berg <benjamin.berg@xxxxxxxxx> Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@xxxxxxxxx> --- src/ap/beacon.c | 103 ++++++++++++++++++++++++++++++------------------ 1 file changed, 64 insertions(+), 39 deletions(-) diff --git a/src/ap/beacon.c b/src/ap/beacon.c index 67e69c7af3..232098328d 100644 --- a/src/ap/beacon.c +++ b/src/ap/beacon.c @@ -580,16 +580,11 @@ struct probe_resp_params { #endif /* CONFIG_IEEE80211AX */ }; -void hostapd_gen_probe_resp(struct hostapd_data *hapd, - struct probe_resp_params *params) +static size_t hostapd_probe_resp_elems_len(struct hostapd_data *hapd, + struct probe_resp_params *params) { - u8 *pos, *epos, *csa_pos; - size_t buflen; - - hapd = hostapd_mbssid_get_tx_bss(hapd); + size_t buflen = 0; -#define MAX_PROBERESP_LEN 768 - buflen = MAX_PROBERESP_LEN; #ifdef CONFIG_WPS if (hapd->wps_probe_resp_ie) buflen += wpabuf_len(hapd->wps_probe_resp_ie); @@ -652,36 +647,19 @@ void hostapd_gen_probe_resp(struct hostapd_data *hapd, buflen += hostapd_eid_owe_trans_len(hapd); buflen += hostapd_eid_dpp_cc_len(hapd); - params->resp = os_zalloc(buflen); - if (!params->resp) - return; - - epos = ((u8 *) params->resp) + MAX_PROBERESP_LEN; - - params->resp->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT, - WLAN_FC_STYPE_PROBE_RESP); - /* Unicast the response to all requests on bands other than 6 GHz. For - * the 6 GHz, unicast is used only if the actual SSID is not included in - * the Beacon frames. Otherwise, broadcast response is used per IEEE - * Std 802.11ax-2021, 26.17.2.3.2. Broadcast address is also used for - * the Probe Response frame template for the unsolicited (i.e., not as - * a response to a specific request) case. */ - if (params->req && (!is_6ghz_op_class(hapd->iconf->op_class) || - hapd->conf->ignore_broadcast_ssid)) - os_memcpy(params->resp->da, params->req->sa, ETH_ALEN); - else - os_memset(params->resp->da, 0xff, ETH_ALEN); - os_memcpy(params->resp->sa, hapd->own_addr, ETH_ALEN); + return buflen; +} - os_memcpy(params->resp->bssid, hapd->own_addr, ETH_ALEN); - params->resp->u.probe_resp.beacon_int = - host_to_le16(hapd->iconf->beacon_int); +static u8 * hostapd_probe_resp_fill_elems(struct hostapd_data *hapd, + struct probe_resp_params *params, + u8 *pos, + size_t len) +{ + u8 *csa_pos; + u8 *epos; - /* hardware or low-level driver will setup seq_ctrl and timestamp */ - params->resp->u.probe_resp.capab_info = - host_to_le16(hostapd_own_capab_info(hapd)); + epos = pos + len; - pos = params->resp->u.probe_resp.variable; *pos++ = WLAN_EID_SSID; *pos++ = hapd->conf->ssid.ssid_len; os_memcpy(pos, hapd->conf->ssid.ssid, hapd->conf->ssid.ssid_len); @@ -842,10 +820,9 @@ void hostapd_gen_probe_resp(struct hostapd_data *hapd, pos = hostapd_eid_hs20_indication(hapd, pos); #endif /* CONFIG_HS20 */ - pos = hostapd_eid_mbo(hapd, pos, (u8 *) params->resp + buflen - pos); - pos = hostapd_eid_owe_trans(hapd, pos, - (u8 *) params->resp + buflen - pos); - pos = hostapd_eid_dpp_cc(hapd, pos, (u8 *) params->resp + buflen - pos); + pos = hostapd_eid_mbo(hapd, pos, epos - pos); + pos = hostapd_eid_owe_trans(hapd, pos, epos - pos); + pos = hostapd_eid_dpp_cc(hapd, pos, epos - pos); if (hapd->conf->vendor_elements) { os_memcpy(pos, wpabuf_head(hapd->conf->vendor_elements), @@ -853,6 +830,54 @@ void hostapd_gen_probe_resp(struct hostapd_data *hapd, pos += wpabuf_len(hapd->conf->vendor_elements); } + return pos; +} + + +void hostapd_gen_probe_resp(struct hostapd_data *hapd, + struct probe_resp_params *params) +{ + u8 *pos; + size_t buflen; + + hapd = hostapd_mbssid_get_tx_bss(hapd); + +#define MAX_PROBERESP_LEN 768 + buflen = MAX_PROBERESP_LEN; + + buflen += hostapd_probe_resp_elems_len(hapd, params); + + params->resp = os_zalloc(buflen); + if (!params->resp) + return; + + params->resp->frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT, + WLAN_FC_STYPE_PROBE_RESP); + /* Unicast the response to all requests on bands other than 6 GHz. For + * the 6 GHz, unicast is used only if the actual SSID is not included in + * the Beacon frames. Otherwise, broadcast response is used per IEEE + * Std 802.11ax-2021, 26.17.2.3.2. Broadcast address is also used for + * the Probe Response frame template for the unsolicited (i.e., not as + * a response to a specific request) case. */ + if (params->req && (!is_6ghz_op_class(hapd->iconf->op_class) || + hapd->conf->ignore_broadcast_ssid)) + os_memcpy(params->resp->da, params->req->sa, ETH_ALEN); + else + os_memset(params->resp->da, 0xff, ETH_ALEN); + os_memcpy(params->resp->sa, hapd->own_addr, ETH_ALEN); + + os_memcpy(params->resp->bssid, hapd->own_addr, ETH_ALEN); + params->resp->u.probe_resp.beacon_int = + host_to_le16(hapd->iconf->beacon_int); + + /* hardware or low-level driver will setup seq_ctrl and timestamp */ + params->resp->u.probe_resp.capab_info = + host_to_le16(hostapd_own_capab_info(hapd)); + + pos = hostapd_probe_resp_fill_elems(hapd, params, + params->resp->u.probe_resp.variable, + buflen); + params->resp_len = pos - (u8 *)params->resp; } -- 2.38.1 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap