mac80211: add parsing of TDLS specific IEs
These are used in TDLS channel switching code. Signed-off-by: Arik Nemtsov <arikx.nemtsov@intel.com> Signed-off-by: Arik Nemtsov <arik@wizery.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
1057d35ede
commit
5383758443
3 changed files with 33 additions and 0 deletions
|
@ -1067,6 +1067,12 @@ struct ieee80211_pspoll {
|
|||
|
||||
/* TDLS */
|
||||
|
||||
/* Channel switch timing */
|
||||
struct ieee80211_ch_switch_timing {
|
||||
__le16 switch_time;
|
||||
__le16 switch_timeout;
|
||||
} __packed;
|
||||
|
||||
/* Link-id information element */
|
||||
struct ieee80211_tdls_lnkie {
|
||||
u8 ie_type; /* Link Identifier IE */
|
||||
|
@ -1108,6 +1114,15 @@ struct ieee80211_tdls_data {
|
|||
u8 dialog_token;
|
||||
u8 variable[0];
|
||||
} __packed discover_req;
|
||||
struct {
|
||||
u8 target_channel;
|
||||
u8 oper_class;
|
||||
u8 variable[0];
|
||||
} __packed chan_switch_req;
|
||||
struct {
|
||||
__le16 status_code;
|
||||
u8 variable[0];
|
||||
} __packed chan_switch_resp;
|
||||
} u;
|
||||
} __packed;
|
||||
|
||||
|
|
|
@ -1400,6 +1400,8 @@ struct ieee802_11_elems {
|
|||
size_t total_len;
|
||||
|
||||
/* pointers to IEs */
|
||||
const struct ieee80211_tdls_lnkie *lnk_id;
|
||||
const struct ieee80211_ch_switch_timing *ch_sw_timing;
|
||||
const u8 *ext_capab;
|
||||
const u8 *ssid;
|
||||
const u8 *supp_rates;
|
||||
|
|
|
@ -832,6 +832,8 @@ u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
|
|||
case WLAN_EID_WIDE_BW_CHANNEL_SWITCH:
|
||||
case WLAN_EID_CHAN_SWITCH_PARAM:
|
||||
case WLAN_EID_EXT_CAPABILITY:
|
||||
case WLAN_EID_CHAN_SWITCH_TIMING:
|
||||
case WLAN_EID_LINK_ID:
|
||||
/*
|
||||
* not listing WLAN_EID_CHANNEL_SWITCH_WRAPPER -- it seems possible
|
||||
* that if the content gets bigger it might be needed more than once
|
||||
|
@ -851,6 +853,20 @@ u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
|
|||
elem_parse_failed = false;
|
||||
|
||||
switch (id) {
|
||||
case WLAN_EID_LINK_ID:
|
||||
if (elen + 2 != sizeof(struct ieee80211_tdls_lnkie)) {
|
||||
elem_parse_failed = true;
|
||||
break;
|
||||
}
|
||||
elems->lnk_id = (void *)(pos - 2);
|
||||
break;
|
||||
case WLAN_EID_CHAN_SWITCH_TIMING:
|
||||
if (elen != sizeof(struct ieee80211_ch_switch_timing)) {
|
||||
elem_parse_failed = true;
|
||||
break;
|
||||
}
|
||||
elems->ch_sw_timing = (void *)pos;
|
||||
break;
|
||||
case WLAN_EID_EXT_CAPABILITY:
|
||||
elems->ext_capab = pos;
|
||||
elems->ext_capab_len = elen;
|
||||
|
|
Loading…
Reference in a new issue