AP MLD: Ignore elements which are not meant to be included in per STA profile
There are certain elements which should not be included in a per STA profile. Ignore such elements. Signed-off-by: Sriram R <quic_srirrama@quicinc.com> Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
This commit is contained in:
parent
2042cae9b3
commit
abe990afb9
1 changed files with 46 additions and 5 deletions
|
@ -2841,6 +2841,35 @@ static int hostapd_get_probe_resp_tmpl(struct hostapd_data *hapd,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static bool is_restricted_eid_in_sta_profile(u8 eid, bool tx_vap)
|
||||||
|
{
|
||||||
|
switch (eid) {
|
||||||
|
case WLAN_EID_TIM:
|
||||||
|
case WLAN_EID_BSS_MAX_IDLE_PERIOD:
|
||||||
|
case WLAN_EID_MULTIPLE_BSSID:
|
||||||
|
case WLAN_EID_REDUCED_NEIGHBOR_REPORT:
|
||||||
|
case WLAN_EID_NEIGHBOR_REPORT:
|
||||||
|
return true;
|
||||||
|
case WLAN_EID_SSID:
|
||||||
|
/* SSID is not restricted for non-transmitted BSSID */
|
||||||
|
return tx_vap;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static bool is_restricted_ext_eid_in_sta_profile(u8 ext_id)
|
||||||
|
{
|
||||||
|
switch (ext_id) {
|
||||||
|
case WLAN_EID_EXT_MULTI_LINK:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Create the link STA profiles.
|
/* Create the link STA profiles.
|
||||||
*
|
*
|
||||||
* NOTE: The same function is used for length calculation as well as filling
|
* NOTE: The same function is used for length calculation as well as filling
|
||||||
|
@ -2848,7 +2877,8 @@ static int hostapd_get_probe_resp_tmpl(struct hostapd_data *hapd,
|
||||||
* function but filling function or vice versa.
|
* function but filling function or vice versa.
|
||||||
*/
|
*/
|
||||||
static size_t hostapd_add_sta_profile(struct ieee80211_mgmt *link_fdata,
|
static size_t hostapd_add_sta_profile(struct ieee80211_mgmt *link_fdata,
|
||||||
size_t link_data_len, u8 *sta_profile)
|
size_t link_data_len, u8 *sta_profile,
|
||||||
|
bool tx_vap)
|
||||||
{
|
{
|
||||||
const struct element *link_elem;
|
const struct element *link_elem;
|
||||||
size_t sta_profile_len = 0;
|
size_t sta_profile_len = 0;
|
||||||
|
@ -2872,6 +2902,16 @@ static size_t hostapd_add_sta_profile(struct ieee80211_mgmt *link_fdata,
|
||||||
link_elem_data = link_elem->data;
|
link_elem_data = link_elem->data;
|
||||||
link_ele_len = link_elem->datalen;
|
link_ele_len = link_elem->datalen;
|
||||||
|
|
||||||
|
if (link_elem->id == WLAN_EID_EXTENSION) {
|
||||||
|
if (is_restricted_ext_eid_in_sta_profile(
|
||||||
|
*link_elem_data))
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
if (is_restricted_eid_in_sta_profile(link_elem->id,
|
||||||
|
tx_vap))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
sta_profile_len += link_ele_len + extra_len;
|
sta_profile_len += link_ele_len + extra_len;
|
||||||
if (sta_profile) {
|
if (sta_profile) {
|
||||||
os_memcpy(sta_profile, link_elem_data - extra_len,
|
os_memcpy(sta_profile, link_elem_data - extra_len,
|
||||||
|
@ -2886,13 +2926,13 @@ static size_t hostapd_add_sta_profile(struct ieee80211_mgmt *link_fdata,
|
||||||
|
|
||||||
static u8 * hostapd_gen_sta_profile(struct ieee80211_mgmt *link_data,
|
static u8 * hostapd_gen_sta_profile(struct ieee80211_mgmt *link_data,
|
||||||
size_t link_data_len,
|
size_t link_data_len,
|
||||||
size_t *sta_profile_len)
|
size_t *sta_profile_len, bool tx_vap)
|
||||||
{
|
{
|
||||||
u8 *sta_profile;
|
u8 *sta_profile;
|
||||||
|
|
||||||
/* Get the length first */
|
/* Get the length first */
|
||||||
*sta_profile_len = hostapd_add_sta_profile(link_data, link_data_len,
|
*sta_profile_len = hostapd_add_sta_profile(link_data, link_data_len,
|
||||||
NULL);
|
NULL, tx_vap);
|
||||||
if (!(*sta_profile_len) || *sta_profile_len > EHT_ML_MAX_STA_PROF_LEN)
|
if (!(*sta_profile_len) || *sta_profile_len > EHT_ML_MAX_STA_PROF_LEN)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@ -2901,7 +2941,7 @@ static u8 * hostapd_gen_sta_profile(struct ieee80211_mgmt *link_data,
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* Now fill in the data */
|
/* Now fill in the data */
|
||||||
hostapd_add_sta_profile(link_data, link_data_len, sta_profile);
|
hostapd_add_sta_profile(link_data, link_data_len, sta_profile, tx_vap);
|
||||||
|
|
||||||
/* The caller takes care of freeing the returned sta_profile */
|
/* The caller takes care of freeing the returned sta_profile */
|
||||||
return sta_profile;
|
return sta_profile;
|
||||||
|
@ -2910,6 +2950,7 @@ static u8 * hostapd_gen_sta_profile(struct ieee80211_mgmt *link_data,
|
||||||
|
|
||||||
static void hostapd_gen_per_sta_profiles(struct hostapd_data *hapd)
|
static void hostapd_gen_per_sta_profiles(struct hostapd_data *hapd)
|
||||||
{
|
{
|
||||||
|
bool tx_vap = hapd == hostapd_mbssid_get_tx_bss(hapd);
|
||||||
size_t link_data_len, sta_profile_len;
|
size_t link_data_len, sta_profile_len;
|
||||||
struct probe_resp_params link_params;
|
struct probe_resp_params link_params;
|
||||||
struct ieee80211_mgmt *link_data;
|
struct ieee80211_mgmt *link_data;
|
||||||
|
@ -2952,7 +2993,7 @@ static void hostapd_gen_per_sta_profiles(struct hostapd_data *hapd)
|
||||||
u.probe_resp.variable);
|
u.probe_resp.variable);
|
||||||
|
|
||||||
sta_profile = hostapd_gen_sta_profile(link_data, link_data_len,
|
sta_profile = hostapd_gen_sta_profile(link_data, link_data_len,
|
||||||
&sta_profile_len);
|
&sta_profile_len, tx_vap);
|
||||||
if (!sta_profile) {
|
if (!sta_profile) {
|
||||||
wpa_printf(MSG_ERROR,
|
wpa_printf(MSG_ERROR,
|
||||||
"MLD: Could not generate link STA profile for link %d",
|
"MLD: Could not generate link STA profile for link %d",
|
||||||
|
|
Loading…
Reference in a new issue