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 <andrei.otcheretianski@intel.com>
This commit is contained in:
Andrei Otcheretianski 2023-05-22 22:34:10 +03:00 committed by Jouni Malinen
parent 8b56536693
commit 996759ccf7
5 changed files with 9 additions and 0 deletions

View file

@ -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,

View file

@ -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;
/**

View file

@ -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;

View file

@ -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;

View file

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