[PATCH 18/42] AP: Split probe response IE generation into separate function
Andrei Otcheretianski
andrei.otcheretianski at intel.com
Mon Nov 20 15:51:32 PST 2023
From: Benjamin Berg <benjamin.berg at intel.com>
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 at intel.com>
Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski at intel.com>
---
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
More information about the Hostap
mailing list