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); }