AP MLD: Do not store per-supplicant AP link MAC address information
There is no need to store the AP MLD's link MAC addresses within per-supplicant data structure in struct wpa_state_machine since those MAC addresses are available from the generic authenticator data in struct wpa_authenticator. Signed-off-by: Jouni Malinen <quic_jouni@quicinc.com>
This commit is contained in:
parent
3b68eef7d7
commit
20872d5256
2 changed files with 47 additions and 10 deletions
|
@ -147,6 +147,8 @@ void wpa_release_link_auth_ref(struct wpa_state_machine *sm,
|
||||||
|
|
||||||
struct wpa_get_link_auth_ctx {
|
struct wpa_get_link_auth_ctx {
|
||||||
const u8 *addr;
|
const u8 *addr;
|
||||||
|
const u8 *mld_addr;
|
||||||
|
int link_id;
|
||||||
struct wpa_authenticator *wpa_auth;
|
struct wpa_authenticator *wpa_auth;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -154,10 +156,35 @@ static int wpa_get_link_sta_auth(struct wpa_authenticator *wpa_auth, void *data)
|
||||||
{
|
{
|
||||||
struct wpa_get_link_auth_ctx *ctx = data;
|
struct wpa_get_link_auth_ctx *ctx = data;
|
||||||
|
|
||||||
if (!ether_addr_equal(wpa_auth->addr, ctx->addr))
|
if (!wpa_auth->is_ml)
|
||||||
return 0;
|
return 0;
|
||||||
ctx->wpa_auth = wpa_auth;
|
|
||||||
return 1;
|
if (ctx->mld_addr &&
|
||||||
|
!ether_addr_equal(wpa_auth->mld_addr, ctx->mld_addr))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if ((ctx->addr && ether_addr_equal(wpa_auth->addr, ctx->addr)) ||
|
||||||
|
(ctx->link_id > -1 && wpa_auth->is_ml &&
|
||||||
|
wpa_auth->link_id == ctx->link_id)) {
|
||||||
|
ctx->wpa_auth = wpa_auth;
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static struct wpa_authenticator *
|
||||||
|
wpa_get_link_auth(struct wpa_authenticator *wpa_auth, int link_id)
|
||||||
|
{
|
||||||
|
struct wpa_get_link_auth_ctx ctx;
|
||||||
|
|
||||||
|
ctx.addr = NULL;
|
||||||
|
ctx.mld_addr = wpa_auth->mld_addr;
|
||||||
|
ctx.link_id = link_id;
|
||||||
|
ctx.wpa_auth = NULL;
|
||||||
|
wpa_auth_for_each_auth(wpa_auth, wpa_get_link_sta_auth, &ctx);
|
||||||
|
return ctx.wpa_auth;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -4415,9 +4442,15 @@ static size_t wpa_auth_ml_kdes_len(struct wpa_state_machine *sm)
|
||||||
|
|
||||||
/* MLO Link KDE for each link */
|
/* MLO Link KDE for each link */
|
||||||
for (link_id = 0; link_id < MAX_NUM_MLD_LINKS; link_id++) {
|
for (link_id = 0; link_id < MAX_NUM_MLD_LINKS; link_id++) {
|
||||||
|
struct wpa_authenticator *wpa_auth;
|
||||||
|
|
||||||
if (!sm->mld_links[link_id].valid)
|
if (!sm->mld_links[link_id].valid)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
wpa_auth = wpa_get_link_auth(sm->wpa_auth, link_id);
|
||||||
|
if (!wpa_auth)
|
||||||
|
continue;
|
||||||
|
|
||||||
kde_len += 2 + RSN_SELECTOR_LEN + 1 + ETH_ALEN +
|
kde_len += 2 + RSN_SELECTOR_LEN + 1 + ETH_ALEN +
|
||||||
sm->mld_links[link_id].rsne_len +
|
sm->mld_links[link_id].rsne_len +
|
||||||
sm->mld_links[link_id].rsnxe_len;
|
sm->mld_links[link_id].rsnxe_len;
|
||||||
|
@ -4444,9 +4477,15 @@ static u8 * wpa_auth_ml_kdes(struct wpa_state_machine *sm, u8 *pos)
|
||||||
sm->wpa_auth->mld_addr, ETH_ALEN, NULL, 0);
|
sm->wpa_auth->mld_addr, ETH_ALEN, NULL, 0);
|
||||||
|
|
||||||
for (link_id = 0; link_id < MAX_NUM_MLD_LINKS; link_id++) {
|
for (link_id = 0; link_id < MAX_NUM_MLD_LINKS; link_id++) {
|
||||||
|
struct wpa_authenticator *wpa_auth;
|
||||||
|
|
||||||
if (!sm->mld_links[link_id].valid)
|
if (!sm->mld_links[link_id].valid)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
wpa_auth = wpa_get_link_auth(sm->wpa_auth, link_id);
|
||||||
|
if (!wpa_auth)
|
||||||
|
continue;
|
||||||
|
|
||||||
wpa_printf(MSG_DEBUG,
|
wpa_printf(MSG_DEBUG,
|
||||||
"RSN: MLO Link: link=%u, len=%zu", link_id,
|
"RSN: MLO Link: link=%u, len=%zu", link_id,
|
||||||
RSN_SELECTOR_LEN + 1 + ETH_ALEN +
|
RSN_SELECTOR_LEN + 1 + ETH_ALEN +
|
||||||
|
@ -4469,7 +4508,7 @@ static u8 * wpa_auth_ml_kdes(struct wpa_state_machine *sm, u8 *pos)
|
||||||
*pos |= RSN_MLO_LINK_KDE_LI_RSNXE_INFO;
|
*pos |= RSN_MLO_LINK_KDE_LI_RSNXE_INFO;
|
||||||
|
|
||||||
pos++;
|
pos++;
|
||||||
os_memcpy(pos, sm->mld_links[link_id].own_addr, ETH_ALEN);
|
os_memcpy(pos, wpa_auth->addr, ETH_ALEN);
|
||||||
pos += ETH_ALEN;
|
pos += ETH_ALEN;
|
||||||
|
|
||||||
if (sm->mld_links[link_id].rsne_len) {
|
if (sm->mld_links[link_id].rsne_len) {
|
||||||
|
@ -7146,12 +7185,10 @@ void wpa_auth_set_ml_info(struct wpa_state_machine *sm,
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
os_memcpy(sm_link->peer_addr, link->peer_addr, ETH_ALEN);
|
os_memcpy(sm_link->peer_addr, link->peer_addr, ETH_ALEN);
|
||||||
os_memcpy(sm_link->own_addr, link->local_addr, ETH_ALEN);
|
|
||||||
|
|
||||||
wpa_printf(MSG_DEBUG,
|
wpa_printf(MSG_DEBUG,
|
||||||
"WPA_AUTH: MLD: id=%u, addr=" MACSTR " peer=" MACSTR,
|
"WPA_AUTH: MLD: id=%u, peer=" MACSTR,
|
||||||
link_id,
|
link_id,
|
||||||
MAC2STR(sm_link->own_addr),
|
|
||||||
MAC2STR(sm_link->peer_addr));
|
MAC2STR(sm_link->peer_addr));
|
||||||
|
|
||||||
ml_rsn_info.links[i++].link_id = link_id;
|
ml_rsn_info.links[i++].link_id = link_id;
|
||||||
|
@ -7159,6 +7196,8 @@ void wpa_auth_set_ml_info(struct wpa_state_machine *sm,
|
||||||
if (link_id != mld_assoc_link_id) {
|
if (link_id != mld_assoc_link_id) {
|
||||||
sm->n_mld_affiliated_links++;
|
sm->n_mld_affiliated_links++;
|
||||||
ctx.addr = link->local_addr;
|
ctx.addr = link->local_addr;
|
||||||
|
ctx.mld_addr = NULL;
|
||||||
|
ctx.link_id = -1;
|
||||||
ctx.wpa_auth = NULL;
|
ctx.wpa_auth = NULL;
|
||||||
wpa_auth_for_each_auth(sm->wpa_auth,
|
wpa_auth_for_each_auth(sm->wpa_auth,
|
||||||
wpa_get_link_sta_auth, &ctx);
|
wpa_get_link_sta_auth, &ctx);
|
||||||
|
@ -7174,9 +7213,8 @@ void wpa_auth_set_ml_info(struct wpa_state_machine *sm,
|
||||||
if (!sm_link->wpa_auth)
|
if (!sm_link->wpa_auth)
|
||||||
wpa_printf(MSG_ERROR,
|
wpa_printf(MSG_ERROR,
|
||||||
"Unable to find authenticator object for ML STA "
|
"Unable to find authenticator object for ML STA "
|
||||||
MACSTR " on link " MACSTR " link id %d",
|
MACSTR " on link id %d",
|
||||||
MAC2STR(sm->wpa_auth->mld_addr),
|
MAC2STR(sm->wpa_auth->mld_addr),
|
||||||
MAC2STR(sm_link->own_addr),
|
|
||||||
link_id);
|
link_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -179,7 +179,6 @@ struct wpa_state_machine {
|
||||||
struct mld_link {
|
struct mld_link {
|
||||||
bool valid;
|
bool valid;
|
||||||
u8 peer_addr[ETH_ALEN];
|
u8 peer_addr[ETH_ALEN];
|
||||||
u8 own_addr[ETH_ALEN];
|
|
||||||
|
|
||||||
const u8 *rsne;
|
const u8 *rsne;
|
||||||
size_t rsne_len;
|
size_t rsne_len;
|
||||||
|
|
Loading…
Reference in a new issue