提交 ee145775 编写于 作者: S Sara Sharon 提交者: Johannes Berg

mac80211: support max channel switch time element

2018 REVmd of the spec introduces the max channel switch time
element which is optionally included in beacons/probes when there
is a channel switch / extended channel switch element.
The value represents the maximum delay between the time the AP
transmitted the last beacon in current channel and the expected
time of the first beacon in the new channel, in TU.

Parse the value and pass it to the driver.
Signed-off-by: NSara Sharon <sara.sharon@intel.com>
Signed-off-by: NLuca Coelho <luciano.coelho@intel.com>
Signed-off-by: NJohannes Berg <johannes.berg@intel.com>
上级 4d9ec73d
...@@ -2475,6 +2475,7 @@ enum ieee80211_eid_ext { ...@@ -2475,6 +2475,7 @@ enum ieee80211_eid_ext {
WLAN_EID_EXT_HE_OPERATION = 36, WLAN_EID_EXT_HE_OPERATION = 36,
WLAN_EID_EXT_UORA = 37, WLAN_EID_EXT_UORA = 37,
WLAN_EID_EXT_HE_MU_EDCA = 38, WLAN_EID_EXT_HE_MU_EDCA = 38,
WLAN_EID_EXT_MAX_CHANNEL_SWITCH_TIME = 52,
WLAN_EID_EXT_MULTIPLE_BSSID_CONFIGURATION = 55, WLAN_EID_EXT_MULTIPLE_BSSID_CONFIGURATION = 55,
}; };
......
...@@ -1519,6 +1519,9 @@ struct ieee80211_conf { ...@@ -1519,6 +1519,9 @@ struct ieee80211_conf {
* scheduled channel switch, as indicated by the AP. * scheduled channel switch, as indicated by the AP.
* @chandef: the new channel to switch to * @chandef: the new channel to switch to
* @count: the number of TBTT's until the channel switch event * @count: the number of TBTT's until the channel switch event
* @delay: maximum delay between the time the AP transmitted the last beacon in
* current channel and the expected time of the first beacon in the new
* channel, expressed in TU.
*/ */
struct ieee80211_channel_switch { struct ieee80211_channel_switch {
u64 timestamp; u64 timestamp;
...@@ -1526,6 +1529,7 @@ struct ieee80211_channel_switch { ...@@ -1526,6 +1529,7 @@ struct ieee80211_channel_switch {
bool block_tx; bool block_tx;
struct cfg80211_chan_def chandef; struct cfg80211_chan_def chandef;
u8 count; u8 count;
u32 delay;
}; };
/** /**
......
...@@ -1453,6 +1453,7 @@ struct ieee80211_csa_ie { ...@@ -1453,6 +1453,7 @@ struct ieee80211_csa_ie {
u8 ttl; u8 ttl;
u16 pre_value; u16 pre_value;
u16 reason_code; u16 reason_code;
u32 max_switch_time;
}; };
/* Parsed Information Elements */ /* Parsed Information Elements */
...@@ -1493,6 +1494,7 @@ struct ieee802_11_elems { ...@@ -1493,6 +1494,7 @@ struct ieee802_11_elems {
const struct ieee80211_channel_sw_ie *ch_switch_ie; const struct ieee80211_channel_sw_ie *ch_switch_ie;
const struct ieee80211_ext_chansw_ie *ext_chansw_ie; const struct ieee80211_ext_chansw_ie *ext_chansw_ie;
const struct ieee80211_wide_bw_chansw_ie *wide_bw_chansw_ie; const struct ieee80211_wide_bw_chansw_ie *wide_bw_chansw_ie;
const u8 *max_channel_switch_time;
const u8 *country_elem; const u8 *country_elem;
const u8 *pwr_constr_elem; const u8 *pwr_constr_elem;
const u8 *cisco_dtpc_elem; const u8 *cisco_dtpc_elem;
......
...@@ -1352,6 +1352,7 @@ ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata, ...@@ -1352,6 +1352,7 @@ ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata,
ch_switch.block_tx = csa_ie.mode; ch_switch.block_tx = csa_ie.mode;
ch_switch.chandef = csa_ie.chandef; ch_switch.chandef = csa_ie.chandef;
ch_switch.count = csa_ie.count; ch_switch.count = csa_ie.count;
ch_switch.delay = csa_ie.max_switch_time;
if (drv_pre_channel_switch(sdata, &ch_switch)) { if (drv_pre_channel_switch(sdata, &ch_switch)) {
sdata_info(sdata, sdata_info(sdata,
......
...@@ -177,6 +177,12 @@ int ieee80211_parse_ch_switch_ie(struct ieee80211_sub_if_data *sdata, ...@@ -177,6 +177,12 @@ int ieee80211_parse_ch_switch_ie(struct ieee80211_sub_if_data *sdata,
csa_ie->chandef = new_vht_chandef; csa_ie->chandef = new_vht_chandef;
} }
if (elems->max_channel_switch_time)
csa_ie->max_switch_time =
(elems->max_channel_switch_time[0] << 0) |
(elems->max_channel_switch_time[1] << 8) |
(elems->max_channel_switch_time[2] << 16);
return 0; return 0;
} }
......
...@@ -1274,6 +1274,10 @@ _ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action, ...@@ -1274,6 +1274,10 @@ _ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
elems->he_operation = (void *)&pos[1]; elems->he_operation = (void *)&pos[1];
} else if (pos[0] == WLAN_EID_EXT_UORA && elen >= 1) { } else if (pos[0] == WLAN_EID_EXT_UORA && elen >= 1) {
elems->uora_element = (void *)&pos[1]; elems->uora_element = (void *)&pos[1];
} else if (pos[0] ==
WLAN_EID_EXT_MAX_CHANNEL_SWITCH_TIME &&
elen == 4) {
elems->max_channel_switch_time = pos + 1;
} else if (pos[0] == } else if (pos[0] ==
WLAN_EID_EXT_MULTIPLE_BSSID_CONFIGURATION && WLAN_EID_EXT_MULTIPLE_BSSID_CONFIGURATION &&
elen == 3) { elen == 3) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册