From 996759ccf75227ebf9f8dfcb52e526abad3be60a Mon Sep 17 00:00:00 2001 From: Andrei Otcheretianski Date: Mon, 22 May 2023 22:34:10 +0300 Subject: [PATCH] AP/MLO: Forward EAPOL TX status to correct BSS In case of MLO AP and legacy client, make sure EAPOL TX status is processed on the correct BSS. Since there's only one instance of i802_bss for all BSSs in an AP MLD in the nl80211 driver interface, the link ID is needed to forward the EAPOL TX status to the correct BSS. Store the link ID when transmitting EAPOL frames over control interface and report it in TX status. Signed-off-by: Andrei Otcheretianski --- src/ap/drv_callbacks.c | 1 + src/drivers/driver.h | 2 ++ src/drivers/driver_nl80211.c | 1 + src/drivers/driver_nl80211.h | 1 + src/drivers/driver_nl80211_event.c | 4 ++++ 5 files changed, 9 insertions(+) diff --git a/src/ap/drv_callbacks.c b/src/ap/drv_callbacks.c index 6c1510a6b..ab956f0c1 100644 --- a/src/ap/drv_callbacks.c +++ b/src/ap/drv_callbacks.c @@ -1986,6 +1986,7 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event, } break; case EVENT_EAPOL_TX_STATUS: + hapd = switch_link_hapd(hapd, data->eapol_tx_status.link_id); hostapd_eapol_tx_status(hapd, data->eapol_tx_status.dst, data->eapol_tx_status.data, data->eapol_tx_status.data_len, diff --git a/src/drivers/driver.h b/src/drivers/driver.h index cd82e6501..196bcd287 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -6404,6 +6404,7 @@ union wpa_event_data { * @data: Data starting with IEEE 802.1X header (!) * @data_len: Length of data * @ack: Indicates ack or lost frame + * @link_id: MLD link id used to transmit the frame or -1 for non MLO * * This corresponds to hapd_send_eapol if the frame sent * there isn't just reported as EVENT_TX_STATUS. @@ -6413,6 +6414,7 @@ union wpa_event_data { const u8 *data; int data_len; int ack; + int link_id; } eapol_tx_status; /** diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index b15c9e419..31e0b1d2f 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -6145,6 +6145,7 @@ static int nl80211_tx_control_port(void *priv, const u8 *dest, "nl80211: tx_control_port cookie=0x%llx", (long long unsigned int) cookie); drv->eapol_tx_cookie = cookie; + drv->eapol_tx_link_id = link_id; } return ret; diff --git a/src/drivers/driver_nl80211.h b/src/drivers/driver_nl80211.h index 7586e0809..42307a9a7 100644 --- a/src/drivers/driver_nl80211.h +++ b/src/drivers/driver_nl80211.h @@ -210,6 +210,7 @@ struct wpa_driver_nl80211_data { u64 send_frame_cookies[MAX_SEND_FRAME_COOKIES]; unsigned int num_send_frame_cookies; u64 eapol_tx_cookie; + int eapol_tx_link_id; unsigned int last_mgmt_freq; diff --git a/src/drivers/driver_nl80211_event.c b/src/drivers/driver_nl80211_event.c index 82525da72..0e97a7f4f 100644 --- a/src/drivers/driver_nl80211_event.c +++ b/src/drivers/driver_nl80211_event.c @@ -3589,6 +3589,10 @@ nl80211_control_port_frame_tx_status(struct wpa_driver_nl80211_data *drv, event.eapol_tx_status.data = frame + ETH_HLEN; event.eapol_tx_status.data_len = len - ETH_HLEN; event.eapol_tx_status.ack = ack != NULL; + event.eapol_tx_status.link_id = + nla_get_u64(cookie) == drv->eapol_tx_cookie ? + drv->eapol_tx_link_id : NL80211_DRV_LINK_ID_NA; + wpa_supplicant_event(drv->ctx, EVENT_EAPOL_TX_STATUS, &event); }