[PATCH 24/50] AP: MLO: Handle association callback
Rameshkumar Sundaram (QUIC)
quic_ramess at quicinc.com
Fri Feb 17 02:58:32 PST 2023
> -----Original Message-----
> From: Hostap <hostap-bounces at lists.infradead.org> On Behalf Of Andrei
> Otcheretianski
> Sent: Thursday, February 16, 2023 4:39 AM
> To: hostap at lists.infradead.org
> Cc: Ilan Peer <ilan.peer at intel.com>; Andrei Otcheretianski
> <andrei.otcheretianski at intel.com>
> Subject: [PATCH 24/50] AP: MLO: Handle association callback
>
> From: Ilan Peer <ilan.peer at intel.com>
>
> Handle association request callback in the context of MLO.
>
> Signed-off-by: Ilan Peer <ilan.peer at intel.com>
> Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski at intel.com>
> ---
> src/ap/ieee802_11.c | 112
> ++++++++++++++++++++++++++++++++++++++++++--
> 1 file changed, 108 insertions(+), 4 deletions(-)
>
> diff --git a/src/ap/ieee802_11.c b/src/ap/ieee802_11.c index
> 0516033b94..b090ee6105 100644
> --- a/src/ap/ieee802_11.c
> +++ b/src/ap/ieee802_11.c
> @@ -6041,6 +6041,97 @@ static void hostapd_set_wds_encryption(struct
> hostapd_data *hapd, }
>
>
> +#ifdef CONFIG_IEEE80211BE
> +
> +static void ieee80211_ml_link_sta_assoc_cb(struct hostapd_data *hapd,
> + struct sta_info *origin_sta,
> + struct sta_info *sta,
> + int reassoc,
> + struct mld_link_info *link,
> + int ok)
> +{
> + if (!ok) {
> + hostapd_logger(hapd, link->peer_addr,
> HOSTAPD_MODULE_IEEE80211,
> + HOSTAPD_LEVEL_DEBUG,
> + "did not acknowledge association response");
> + sta->flags &= ~WLAN_STA_ASSOC_REQ_OK;
> +
> + /* The STA is added only in case of SUCCESS */
> + if (link->status == WLAN_STATUS_SUCCESS)
> + hostapd_drv_sta_remove(hapd, sta->addr);
> +
> + return;
> + }
> +
> + if (link->status != WLAN_STATUS_SUCCESS)
> + return;
> +
> + sta->flags |= WLAN_STA_ASSOC;
> + sta->flags &= ~WLAN_STA_WNM_SLEEP_MODE;
> +
> + if (!hapd->conf->ieee802_1x && !hapd->conf->wpa)
> + ap_sta_set_authorized(hapd, sta, 1);
> +
> + hostapd_set_sta_flags(hapd, sta);
> +
> + /*
> + * TODOs:
> + * - 802.1X port enablement is not needed as done on the station
> doing
> + * the connection.
> + * - Not handling accouting
> + * - Need to handle VLAN configuration
> + */
> +}
> +
> +#endif /* CONFIG_IEEE80211BE */
> +
> +
> +static void hostapd_ml_handle_assoc_cb(struct hostapd_data *hapd,
> + struct sta_info *sta,
> + int reassoc, int ok)
> +{
> +#ifdef CONFIG_IEEE80211BE
> + u8 i, link_id;
> +
> + if (!hostapd_is_mld_ap(hapd))
> + return;
> +
> + for (link_id = 0; link_id < MAX_NUM_MLD_LINKS; link_id++) {
> + struct mld_link_info *link = &sta->mld_info.links[link_id];
> +
> + if (!link->valid)
> + continue;
> +
> + for (i = 0; i < hapd->iface->interfaces->count; i++) {
> + struct sta_info *tmp_sta;
> + struct hostapd_data *tmp_hapd =
> + hapd->iface->interfaces->iface[i]->bss[0];
> +
> + if (tmp_hapd->conf->mld_ap ||
> + hapd->conf->mld_id != tmp_hapd->conf->mld_id)
> + continue;
> +
> + for (tmp_sta = tmp_hapd->sta_list; tmp_sta;
> + tmp_sta = tmp_sta->next) {
Instead of a logic to loop through all hapd and all sta and identify partner based on mld id and assoc link id, can we link them through a list and make the handling better?
> + if (tmp_sta == sta ||
> + tmp_sta->mld_assoc_link_id !=
> + sta->mld_assoc_link_id ||
> + tmp_sta->aid != sta->aid)
> + continue;
> +
> + ieee80211_ml_link_sta_assoc_cb(tmp_hapd,
> + sta, tmp_sta,
> + reassoc,
> + link,
> + ok);
> + break;
> + }
> + }
> + }
> +#endif /* CONFIG_IEEE80211BE */
> +}
> +
> +
> static void handle_assoc_cb(struct hostapd_data *hapd,
> const struct ieee80211_mgmt *mgmt,
> size_t len, int reassoc, int ok) @@ -6056,6 +6147,16
> @@ static void handle_assoc_cb(struct hostapd_data *hapd,
> return;
> }
>
> +#ifdef CONFIG_IEEE80211BE
> + if (hapd->conf->mld_ap &&
> + hapd->conf->mld_link_id != sta->mld_assoc_link_id) {
> + wpa_printf(MSG_INFO,
> + "handle_assoc_cb: MLD: ignore on link station");
> + return;
> + }
> +
> +#endif /* CONFIG_IEEE80211BE */
> +
> if (len < IEEE80211_HDRLEN + (reassoc ? sizeof(mgmt-
> >u.reassoc_resp) :
> sizeof(mgmt->u.assoc_resp))) {
> wpa_printf(MSG_INFO,
> @@ -6079,11 +6180,11 @@ static void handle_assoc_cb(struct
> hostapd_data *hapd,
> if (status == WLAN_STATUS_SUCCESS)
> hostapd_drv_sta_remove(hapd, sta->addr);
>
> - return;
> + goto handle_ml;
> }
>
> if (status != WLAN_STATUS_SUCCESS)
> - return;
> + goto handle_ml;
>
> /* Stop previous accounting session, if one is started, and allocate
> * new session id for the new session. */ @@ -6125,11 +6226,11 @@
> static void handle_assoc_cb(struct hostapd_data *hapd,
> * interface selection is not going to change anymore.
> */
> if (ap_sta_bind_vlan(hapd, sta) < 0)
> - return;
> + goto handle_ml;
> } else if (sta->vlan_id) {
> /* VLAN ID already set (e.g., by PMKSA caching), so bind STA
> */
> if (ap_sta_bind_vlan(hapd, sta) < 0)
> - return;
> + goto handle_ml;
> }
>
> hostapd_set_sta_flags(hapd, sta);
> @@ -6193,6 +6294,9 @@ static void handle_assoc_cb(struct hostapd_data
> *hapd,
> os_free(sta->pending_eapol_rx);
> sta->pending_eapol_rx = NULL;
> }
> +
> +handle_ml:
> + hostapd_ml_handle_assoc_cb(hapd, sta, reassoc, ok);
Also, how are the sta timers managed for these ML link stations(for ex. NULLFUNC/poll timers), do we have common timer for all link sta or separate?
> }
More information about the Hostap
mailing list