mesh: Report mesh peer AID to kernel
Previously, mesh power management functionality works only with kernel MPM. Because user space MPM did not report mesh peer AID to kernel, the kernel could not identify the bit in TIM element. So this patch reports mesh peer AID to kernel. Signed-off-by: Masashi Honma <masashi.honma@gmail.com>
This commit is contained in:
parent
e3227c32f0
commit
e347cafe57
4 changed files with 18 additions and 2 deletions
|
@ -80,6 +80,7 @@ struct sta_info {
|
||||||
enum mesh_plink_state plink_state;
|
enum mesh_plink_state plink_state;
|
||||||
u16 peer_lid;
|
u16 peer_lid;
|
||||||
u16 my_lid;
|
u16 my_lid;
|
||||||
|
u16 peer_aid;
|
||||||
u16 mpm_close_reason;
|
u16 mpm_close_reason;
|
||||||
int mpm_retries;
|
int mpm_retries;
|
||||||
u8 my_nonce[WPA_NONCE_LEN];
|
u8 my_nonce[WPA_NONCE_LEN];
|
||||||
|
|
|
@ -1425,6 +1425,7 @@ struct hostapd_sta_add_params {
|
||||||
u32 flags_mask; /* unset bits in flags */
|
u32 flags_mask; /* unset bits in flags */
|
||||||
#ifdef CONFIG_MESH
|
#ifdef CONFIG_MESH
|
||||||
enum mesh_plink_state plink_state;
|
enum mesh_plink_state plink_state;
|
||||||
|
u16 peer_aid;
|
||||||
#endif /* CONFIG_MESH */
|
#endif /* CONFIG_MESH */
|
||||||
int set; /* Set STA parameters instead of add */
|
int set; /* Set STA parameters instead of add */
|
||||||
u8 qosinfo;
|
u8 qosinfo;
|
||||||
|
|
|
@ -4032,6 +4032,15 @@ static int wpa_driver_nl80211_sta_add(void *priv,
|
||||||
if (!(params->flags & WPA_STA_ASSOCIATED))
|
if (!(params->flags & WPA_STA_ASSOCIATED))
|
||||||
upd.mask |= BIT(NL80211_STA_FLAG_ASSOCIATED);
|
upd.mask |= BIT(NL80211_STA_FLAG_ASSOCIATED);
|
||||||
}
|
}
|
||||||
|
#ifdef CONFIG_MESH
|
||||||
|
} else {
|
||||||
|
if (params->plink_state == PLINK_ESTAB && params->peer_aid) {
|
||||||
|
ret = nla_put_u16(msg, NL80211_ATTR_MESH_PEER_AID,
|
||||||
|
params->peer_aid);
|
||||||
|
if (ret)
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_MESH */
|
||||||
}
|
}
|
||||||
|
|
||||||
wpa_printf(MSG_DEBUG, " * flags set=0x%x mask=0x%x",
|
wpa_printf(MSG_DEBUG, " * flags set=0x%x mask=0x%x",
|
||||||
|
|
|
@ -191,6 +191,7 @@ static void mesh_mpm_init_link(struct wpa_supplicant *wpa_s,
|
||||||
|
|
||||||
sta->my_lid = llid;
|
sta->my_lid = llid;
|
||||||
sta->peer_lid = 0;
|
sta->peer_lid = 0;
|
||||||
|
sta->peer_aid = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We do not use wpa_mesh_set_plink_state() here because there is no
|
* We do not use wpa_mesh_set_plink_state() here because there is no
|
||||||
|
@ -390,6 +391,7 @@ void wpa_mesh_set_plink_state(struct wpa_supplicant *wpa_s,
|
||||||
os_memset(¶ms, 0, sizeof(params));
|
os_memset(¶ms, 0, sizeof(params));
|
||||||
params.addr = sta->addr;
|
params.addr = sta->addr;
|
||||||
params.plink_state = state;
|
params.plink_state = state;
|
||||||
|
params.peer_aid = sta->peer_aid;
|
||||||
params.set = 1;
|
params.set = 1;
|
||||||
|
|
||||||
ret = wpa_drv_sta_add(wpa_s, ¶ms);
|
ret = wpa_drv_sta_add(wpa_s, ¶ms);
|
||||||
|
@ -696,6 +698,7 @@ static struct sta_info * mesh_mpm_add_peer(struct wpa_supplicant *wpa_s,
|
||||||
params.addr = addr;
|
params.addr = addr;
|
||||||
params.plink_state = sta->plink_state;
|
params.plink_state = sta->plink_state;
|
||||||
params.aid = sta->aid;
|
params.aid = sta->aid;
|
||||||
|
params.peer_aid = sta->peer_aid;
|
||||||
params.listen_interval = 100;
|
params.listen_interval = 100;
|
||||||
params.ht_capabilities = sta->ht_capabilities;
|
params.ht_capabilities = sta->ht_capabilities;
|
||||||
params.vht_capabilities = sta->vht_capabilities;
|
params.vht_capabilities = sta->vht_capabilities;
|
||||||
|
@ -1037,7 +1040,7 @@ void mesh_mpm_action_rx(struct wpa_supplicant *wpa_s,
|
||||||
struct hostapd_data *hapd = wpa_s->ifmsh->bss[0];
|
struct hostapd_data *hapd = wpa_s->ifmsh->bss[0];
|
||||||
struct mesh_conf *mconf = wpa_s->ifmsh->mconf;
|
struct mesh_conf *mconf = wpa_s->ifmsh->mconf;
|
||||||
struct sta_info *sta;
|
struct sta_info *sta;
|
||||||
u16 plid = 0, llid = 0;
|
u16 plid = 0, llid = 0, aid = 0;
|
||||||
enum plink_event event;
|
enum plink_event event;
|
||||||
struct ieee802_11_elems elems;
|
struct ieee802_11_elems elems;
|
||||||
struct mesh_peer_mgmt_ie peer_mgmt_ie;
|
struct mesh_peer_mgmt_ie peer_mgmt_ie;
|
||||||
|
@ -1075,7 +1078,8 @@ void mesh_mpm_action_rx(struct wpa_supplicant *wpa_s,
|
||||||
ie_len -= 2;
|
ie_len -= 2;
|
||||||
}
|
}
|
||||||
if (action_field == PLINK_CONFIRM) {
|
if (action_field == PLINK_CONFIRM) {
|
||||||
wpa_printf(MSG_DEBUG, "MPM: AID 0x%x", WPA_GET_LE16(ies));
|
aid = WPA_GET_LE16(ies);
|
||||||
|
wpa_printf(MSG_DEBUG, "MPM: AID 0x%x", aid);
|
||||||
ies += 2; /* aid */
|
ies += 2; /* aid */
|
||||||
ie_len -= 2;
|
ie_len -= 2;
|
||||||
}
|
}
|
||||||
|
@ -1210,6 +1214,7 @@ void mesh_mpm_action_rx(struct wpa_supplicant *wpa_s,
|
||||||
} else {
|
} else {
|
||||||
if (!sta->peer_lid)
|
if (!sta->peer_lid)
|
||||||
sta->peer_lid = plid;
|
sta->peer_lid = plid;
|
||||||
|
sta->peer_aid = aid;
|
||||||
event = CNF_ACPT;
|
event = CNF_ACPT;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue