mac80211: Add RRM support to assoc request
In case of a RRM-supporting connection, in the association request frame: set the RRM capability flag, and add the required IEs. Signed-off-by: Assaf Krauss <assaf.krauss@intel.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
bab5ab7d2a
commit
cd2f5dd709
|
@ -355,6 +355,7 @@ enum ieee80211_sta_flags {
|
||||||
IEEE80211_STA_DISABLE_80P80MHZ = BIT(12),
|
IEEE80211_STA_DISABLE_80P80MHZ = BIT(12),
|
||||||
IEEE80211_STA_DISABLE_160MHZ = BIT(13),
|
IEEE80211_STA_DISABLE_160MHZ = BIT(13),
|
||||||
IEEE80211_STA_DISABLE_WMM = BIT(14),
|
IEEE80211_STA_DISABLE_WMM = BIT(14),
|
||||||
|
IEEE80211_STA_ENABLE_RRM = BIT(15),
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ieee80211_mgd_auth_data {
|
struct ieee80211_mgd_auth_data {
|
||||||
|
|
|
@ -673,6 +673,9 @@ static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata)
|
||||||
(local->hw.flags & IEEE80211_HW_SPECTRUM_MGMT))
|
(local->hw.flags & IEEE80211_HW_SPECTRUM_MGMT))
|
||||||
capab |= WLAN_CAPABILITY_SPECTRUM_MGMT;
|
capab |= WLAN_CAPABILITY_SPECTRUM_MGMT;
|
||||||
|
|
||||||
|
if (ifmgd->flags & IEEE80211_STA_ENABLE_RRM)
|
||||||
|
capab |= WLAN_CAPABILITY_RADIO_MEASURE;
|
||||||
|
|
||||||
mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24);
|
mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24);
|
||||||
memset(mgmt, 0, 24);
|
memset(mgmt, 0, 24);
|
||||||
memcpy(mgmt->da, assoc_data->bss->bssid, ETH_ALEN);
|
memcpy(mgmt->da, assoc_data->bss->bssid, ETH_ALEN);
|
||||||
|
@ -738,16 +741,17 @@ static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (capab & WLAN_CAPABILITY_SPECTRUM_MGMT) {
|
if (capab & WLAN_CAPABILITY_SPECTRUM_MGMT ||
|
||||||
/* 1. power capabilities */
|
capab & WLAN_CAPABILITY_RADIO_MEASURE) {
|
||||||
pos = skb_put(skb, 4);
|
pos = skb_put(skb, 4);
|
||||||
*pos++ = WLAN_EID_PWR_CAPABILITY;
|
*pos++ = WLAN_EID_PWR_CAPABILITY;
|
||||||
*pos++ = 2;
|
*pos++ = 2;
|
||||||
*pos++ = 0; /* min tx power */
|
*pos++ = 0; /* min tx power */
|
||||||
/* max tx power */
|
/* max tx power */
|
||||||
*pos++ = ieee80211_chandef_max_power(&chanctx_conf->def);
|
*pos++ = ieee80211_chandef_max_power(&chanctx_conf->def);
|
||||||
|
}
|
||||||
|
|
||||||
/* 2. supported channels */
|
if (capab & WLAN_CAPABILITY_SPECTRUM_MGMT) {
|
||||||
/* TODO: get this in reg domain format */
|
/* TODO: get this in reg domain format */
|
||||||
pos = skb_put(skb, 2 * sband->n_channels + 2);
|
pos = skb_put(skb, 2 * sband->n_channels + 2);
|
||||||
*pos++ = WLAN_EID_SUPPORTED_CHANNELS;
|
*pos++ = WLAN_EID_SUPPORTED_CHANNELS;
|
||||||
|
@ -4410,6 +4414,11 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
|
||||||
ifmgd->flags &= ~IEEE80211_STA_MFP_ENABLED;
|
ifmgd->flags &= ~IEEE80211_STA_MFP_ENABLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (req->flags & ASSOC_REQ_USE_RRM)
|
||||||
|
ifmgd->flags |= IEEE80211_STA_ENABLE_RRM;
|
||||||
|
else
|
||||||
|
ifmgd->flags &= ~IEEE80211_STA_ENABLE_RRM;
|
||||||
|
|
||||||
if (req->crypto.control_port)
|
if (req->crypto.control_port)
|
||||||
ifmgd->flags |= IEEE80211_STA_CONTROL_PORT;
|
ifmgd->flags |= IEEE80211_STA_CONTROL_PORT;
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue