[PATCH 35/50] AP: Forward link specific events

Rameshkumar Sundaram (QUIC) quic_ramess at quicinc.com
Fri Feb 17 03:27:11 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: Andrei Otcheretianski <andrei.otcheretianski at intel.com>
> Subject: [PATCH 35/50] AP: Forward link specific events
> 
> Process management and EAPOL frames on the correct link.
> 
> Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski at intel.com>
> ---
>  src/ap/drv_callbacks.c | 51 ++++++++++++++++++++++++++++++++++++++----
>  1 file changed, 47 insertions(+), 4 deletions(-)
> 
> diff --git a/src/ap/drv_callbacks.c b/src/ap/drv_callbacks.c index
> 8dc4ad1ffb..78b4f7a8df 100644
> --- a/src/ap/drv_callbacks.c
> +++ b/src/ap/drv_callbacks.c
> @@ -1412,6 +1412,35 @@ static void hostapd_action_rx(struct
> hostapd_data *hapd,  #endif /* NEED_AP_MLME */
> 
> 
> +#ifdef CONFIG_IEEE80211BE
> +static struct hostapd_data *switch_link_hapd(struct hostapd_data *hapd,
> +int link_id) {
> +	if (hapd->conf->mld_ap && link_id >= 0) {
> +		int i;
> +
> +		for (i = 0; i < hapd->iface->interfaces->count; i++) {
> +			struct hostapd_iface *h = hapd->iface->interfaces-
> >iface[i];
> +			struct hostapd_data *h_hapd = h->bss[0];
> +			struct hostapd_bss_config *hconf = h_hapd->conf;
> +
> +			if (h == hapd->iface)
> +				continue;
> +
> +			if (!hconf->mld_ap || hconf->mld_id != hapd->conf-
> >mld_id) {
> +				wpa_printf(MSG_ERROR,
> +					   "Skip non matching mld_id");
> +				continue;
> +			}
> +
> +			if (hconf->mld_link_id == link_id)
> +				return h_hapd;
> +		}
> +	}
> +	return hapd;
> +}
> +#endif /* CONFIG_IEEE80211BE */
> +
> +
>  #ifdef NEED_AP_MLME
> 
>  #define HAPD_BROADCAST ((struct hostapd_data *) -1) @@ -1450,13
> +1479,19 @@ static void hostapd_rx_from_unknown_sta(struct
> hostapd_data *hapd,
> 
>  static int hostapd_mgmt_rx(struct hostapd_data *hapd, struct rx_mgmt
> *rx_mgmt)  {
> -	struct hostapd_iface *iface = hapd->iface;
> +	struct hostapd_iface *iface;
>  	const struct ieee80211_hdr *hdr;
>  	const u8 *bssid;
>  	struct hostapd_frame_info fi;
>  	int ret;
>  	bool is_mld = false;
> 
> +#ifdef CONFIG_IEEE80211BE
> +	hapd = switch_link_hapd(hapd, rx_mgmt->link_id); #endif /*
> +CONFIG_IEEE80211BE */
> +
> +	iface = hapd->iface;
> +
>  #ifdef CONFIG_TESTING_OPTIONS
>  	if (hapd->ext_mgmt_frame_handling) {
>  		size_t hex_len = 2 * rx_mgmt->frame_len + 1; @@ -1596,12
> +1631,19 @@ static int hostapd_event_new_sta(struct hostapd_data *hapd,
> const u8 *addr)
> 
>  static void hostapd_event_eapol_rx(struct hostapd_data *hapd, const u8
> *src,
>  				   const u8 *data, size_t data_len,
> -				   enum frame_encryption encrypted)
> +				   enum frame_encryption encrypted,
> +				   int link_id)
>  {
> -	struct hostapd_iface *iface = hapd->iface;
> +	struct hostapd_iface *iface;
>  	struct sta_info *sta;
>  	size_t j;
> 
> +#ifdef CONFIG_IEEE80211BE
> +	hapd = switch_link_hapd(hapd, link_id); #endif /*
Given that we have initialized sm (sta->sm) only on first/assoc link sta,
If this EAPOL Pkt is received in partner link and we switch the frame to partner hapd, will we be able to find the state machine on that link STA ?
> CONFIG_IEEE80211BE
> +*/
> +
> +	iface = hapd->iface;
> +
>  	for (j = 0; j < iface->num_bss; j++) {
>  		sta = ap_get_sta(iface->bss[j], src);
>  		if (sta && sta->flags & WLAN_STA_ASSOC) { @@ -2003,7
> +2045,8 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type
> event,
>  		hostapd_event_eapol_rx(hapd, data->eapol_rx.src,
>  				       data->eapol_rx.data,
>  				       data->eapol_rx.data_len,
> -				       data->eapol_rx.encrypted);
> +				       data->eapol_rx.encrypted,
> +				       data->eapol_rx.link_id);
>  		break;
>  	case EVENT_ASSOC:
>  		if (!data)
> --



More information about the Hostap mailing list