RE: [PATCH 24/50] AP: MLO: Handle association callback

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> -----Original Message-----
> From: Hostap <hostap-bounces@xxxxxxxxxxxxxxxxxxx> On Behalf Of Andrei
> Otcheretianski
> Sent: Thursday, February 16, 2023 4:39 AM
> To: hostap@xxxxxxxxxxxxxxxxxxx
> Cc: Ilan Peer <ilan.peer@xxxxxxxxx>; Andrei Otcheretianski
> <andrei.otcheretianski@xxxxxxxxx>
> Subject: [PATCH 24/50] AP: MLO: Handle association callback
> 
> From: Ilan Peer <ilan.peer@xxxxxxxxx>
> 
> Handle association request callback in the context of MLO.
> 
> Signed-off-by: Ilan Peer <ilan.peer@xxxxxxxxx>
> Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@xxxxxxxxx>
> ---
>  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?
>  }


_______________________________________________
Hostap mailing list
Hostap@xxxxxxxxxxxxxxxxxxx
http://lists.infradead.org/mailman/listinfo/hostap



[Index of Archives]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]

  Powered by Linux