static void rx_data_eapol_key_1_of_4(struct wlantest *wt, const u8 *dst,
- const u8 *src, const u8 *data, size_t len)
+ const u8 *src, const u8 *bssid,
+ const u8 *data, size_t len)
{
- struct wlantest_bss *bss;
+ struct wlantest_bss *bss, *bss_mld;
struct wlantest_sta *sta;
const struct ieee802_1x_hdr *eapol;
const struct wpa_eapol_key *hdr;
wpa_printf(MSG_DEBUG, "EAPOL-Key 1/4 " MACSTR " -> " MACSTR,
MAC2STR(src), MAC2STR(dst));
- bss = bss_get(wt, src);
+ if (os_memcmp(src, bssid, ETH_ALEN) == 0) {
+ bss = bss_get(wt, src);
+ } else {
+ bss = bss_find(wt, bssid);
+ bss_mld = bss_find(wt, src);
+ if (bss_mld)
+ bss = bss_get(wt, src);
+ else
+ bss = bss_get(wt, bssid);
+ }
if (bss == NULL)
return;
sta = sta_get(bss, dst);
static void rx_data_eapol_key_2_of_4(struct wlantest *wt, const u8 *dst,
- const u8 *src, const u8 *data, size_t len)
+ const u8 *src, const u8 *bssid,
+ const u8 *data, size_t len)
{
- struct wlantest_bss *bss;
+ struct wlantest_bss *bss, *bss_mld;
struct wlantest_sta *sta;
const struct ieee802_1x_hdr *eapol;
const struct wpa_eapol_key *hdr;
wpa_printf(MSG_DEBUG, "EAPOL-Key 2/4 " MACSTR " -> " MACSTR,
MAC2STR(src), MAC2STR(dst));
- bss = bss_get(wt, dst);
+ if (os_memcmp(dst, bssid, ETH_ALEN) == 0) {
+ bss = bss_get(wt, dst);
+ } else {
+ bss = bss_find(wt, bssid);
+ bss_mld = bss_find(wt, dst);
+ if (bss_mld)
+ bss = bss_get(wt, dst);
+ else
+ bss = bss_get(wt, bssid);
+ }
if (bss == NULL)
return;
sta = sta_get(bss, src);
static void rx_data_eapol_key_3_of_4(struct wlantest *wt, const u8 *dst,
- const u8 *src, const u8 *data, size_t len)
+ const u8 *src, const u8 *bssid,
+ const u8 *data, size_t len)
{
- struct wlantest_bss *bss;
+ struct wlantest_bss *bss, *bss_mld;
struct wlantest_sta *sta;
const struct ieee802_1x_hdr *eapol;
const struct wpa_eapol_key *hdr;
wpa_printf(MSG_DEBUG, "EAPOL-Key 3/4 " MACSTR " -> " MACSTR,
MAC2STR(src), MAC2STR(dst));
- bss = bss_get(wt, src);
+ if (os_memcmp(src, bssid, ETH_ALEN) == 0) {
+ bss = bss_get(wt, src);
+ } else {
+ bss = bss_find(wt, bssid);
+ bss_mld = bss_find(wt, src);
+ if (bss_mld)
+ bss = bss_get(wt, src);
+ else
+ bss = bss_get(wt, bssid);
+ }
if (bss == NULL)
return;
sta = sta_get(bss, dst);
static void rx_data_eapol_key_4_of_4(struct wlantest *wt, const u8 *dst,
- const u8 *src, const u8 *data, size_t len)
+ const u8 *src, const u8 *bssid,
+ const u8 *data, size_t len)
{
- struct wlantest_bss *bss;
+ struct wlantest_bss *bss, *bss_mld;
struct wlantest_sta *sta;
const struct ieee802_1x_hdr *eapol;
const struct wpa_eapol_key *hdr;
wpa_printf(MSG_DEBUG, "EAPOL-Key 4/4 " MACSTR " -> " MACSTR,
MAC2STR(src), MAC2STR(dst));
- bss = bss_get(wt, dst);
+ if (os_memcmp(dst, bssid, ETH_ALEN) == 0) {
+ bss = bss_get(wt, dst);
+ } else {
+ bss = bss_find(wt, bssid);
+ bss_mld = bss_find(wt, dst);
+ if (bss_mld)
+ bss = bss_get(wt, dst);
+ else
+ bss = bss_get(wt, bssid);
+ }
if (bss == NULL)
return;
sta = sta_get(bss, src);
static void rx_data_eapol_key_1_of_2(struct wlantest *wt, const u8 *dst,
- const u8 *src, const u8 *data, size_t len)
+ const u8 *src, const u8 *bssid,
+ const u8 *data, size_t len)
{
- struct wlantest_bss *bss;
+ struct wlantest_bss *bss, *bss_mld;
struct wlantest_sta *sta;
const struct ieee802_1x_hdr *eapol;
const struct wpa_eapol_key *hdr;
wpa_printf(MSG_DEBUG, "EAPOL-Key 1/2 " MACSTR " -> " MACSTR,
MAC2STR(src), MAC2STR(dst));
- bss = bss_get(wt, src);
+ if (os_memcmp(src, bssid, ETH_ALEN) == 0) {
+ bss = bss_get(wt, src);
+ } else {
+ bss = bss_find(wt, bssid);
+ bss_mld = bss_find(wt, src);
+ if (bss_mld)
+ bss = bss_get(wt, src);
+ else
+ bss = bss_get(wt, bssid);
+ }
if (bss == NULL)
return;
sta = sta_get(bss, dst);
static void rx_data_eapol_key_2_of_2(struct wlantest *wt, const u8 *dst,
- const u8 *src, const u8 *data, size_t len)
+ const u8 *src, const u8 *bssid,
+ const u8 *data, size_t len)
{
- struct wlantest_bss *bss;
+ struct wlantest_bss *bss, *bss_mld;
struct wlantest_sta *sta;
const struct ieee802_1x_hdr *eapol;
const struct wpa_eapol_key *hdr;
wpa_printf(MSG_DEBUG, "EAPOL-Key 2/2 " MACSTR " -> " MACSTR,
MAC2STR(src), MAC2STR(dst));
- bss = bss_get(wt, dst);
+ if (os_memcmp(dst, bssid, ETH_ALEN) == 0) {
+ bss = bss_get(wt, dst);
+ } else {
+ bss = bss_find(wt, bssid);
+ bss_mld = bss_find(wt, dst);
+ if (bss_mld)
+ bss = bss_get(wt, dst);
+ else
+ bss = bss_get(wt, bssid);
+ }
if (bss == NULL)
return;
sta = sta_get(bss, src);
WPA_KEY_INFO_ACK |
WPA_KEY_INFO_INSTALL)) {
case WPA_KEY_INFO_ACK:
- rx_data_eapol_key_1_of_4(wt, dst, src, data, len);
+ rx_data_eapol_key_1_of_4(wt, dst, src, bssid,
+ data, len);
break;
case WPA_KEY_INFO_MIC:
if (key_data_length == 0 ||
is_zero(hdr->key_nonce, WPA_NONCE_LEN))
- rx_data_eapol_key_4_of_4(wt, dst, src, data,
- len);
+ rx_data_eapol_key_4_of_4(wt, dst, src, bssid,
+ data, len);
else
- rx_data_eapol_key_2_of_4(wt, dst, src, data,
- len);
+ rx_data_eapol_key_2_of_4(wt, dst, src, bssid,
+ data, len);
break;
case WPA_KEY_INFO_MIC | WPA_KEY_INFO_ACK |
WPA_KEY_INFO_INSTALL:
/* WPA does not include Secure bit in 3/4 */
- rx_data_eapol_key_3_of_4(wt, dst, src, data, len);
+ rx_data_eapol_key_3_of_4(wt, dst, src, bssid,
+ data, len);
break;
case WPA_KEY_INFO_SECURE | WPA_KEY_INFO_MIC |
WPA_KEY_INFO_ACK | WPA_KEY_INFO_INSTALL:
case WPA_KEY_INFO_SECURE |
WPA_KEY_INFO_ACK | WPA_KEY_INFO_INSTALL:
- rx_data_eapol_key_3_of_4(wt, dst, src, data, len);
+ rx_data_eapol_key_3_of_4(wt, dst, src, bssid,
+ data, len);
break;
case WPA_KEY_INFO_SECURE | WPA_KEY_INFO_MIC:
case WPA_KEY_INFO_SECURE:
if (key_data_length == 0 ||
is_zero(hdr->key_nonce, WPA_NONCE_LEN))
- rx_data_eapol_key_4_of_4(wt, dst, src, data,
- len);
+ rx_data_eapol_key_4_of_4(wt, dst, src, bssid,
+ data, len);
else
- rx_data_eapol_key_2_of_4(wt, dst, src, data,
- len);
+ rx_data_eapol_key_2_of_4(wt, dst, src, bssid,
+ data, len);
break;
default:
wpa_printf(MSG_DEBUG, "Unsupported EAPOL-Key frame");
case WPA_KEY_INFO_SECURE | WPA_KEY_INFO_MIC |
WPA_KEY_INFO_ACK:
case WPA_KEY_INFO_SECURE | WPA_KEY_INFO_ACK:
- rx_data_eapol_key_1_of_2(wt, dst, src, data, len);
+ rx_data_eapol_key_1_of_2(wt, dst, src, bssid,
+ data, len);
break;
case WPA_KEY_INFO_SECURE | WPA_KEY_INFO_MIC:
case WPA_KEY_INFO_SECURE:
- rx_data_eapol_key_2_of_2(wt, dst, src, data, len);
+ rx_data_eapol_key_2_of_2(wt, dst, src, bssid,
+ data, len);
break;
default:
wpa_printf(MSG_DEBUG, "Unsupported EAPOL-Key frame");