cfg80211: Report Association Request frame IEs in association events
This extends the NL80211_CMD_ASSOCIATE event case to report NL80211_ATTR_REQ_IE similarly to what is already done with the NL80211_CMD_CONNECT events if the driver provides this information. In practice, this adds (Re)Association Request frame information element reporting to mac80211 drivers for the cases where user space SME is used. This provides more information for user space to figure out which capabilities were negotiated for the association. For example, this can be used to determine whether HT, VHT, or HE is used. Signed-off-by: Jouni Malinen <jouni@codeaurora.org> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:

committed by
Johannes Berg

parent
767637416e
commit
4d9ec73d2b
@@ -556,6 +556,12 @@ struct ieee80211_if_managed {
|
||||
* get stuck in a downgraded situation and flush takes forever.
|
||||
*/
|
||||
struct delayed_work tx_tspec_wk;
|
||||
|
||||
/* Information elements from the last transmitted (Re)Association
|
||||
* Request frame.
|
||||
*/
|
||||
u8 *assoc_req_ies;
|
||||
size_t assoc_req_ies_len;
|
||||
};
|
||||
|
||||
struct ieee80211_if_ibss {
|
||||
|
@@ -644,7 +644,7 @@ static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata)
|
||||
struct ieee80211_mgd_assoc_data *assoc_data = ifmgd->assoc_data;
|
||||
struct sk_buff *skb;
|
||||
struct ieee80211_mgmt *mgmt;
|
||||
u8 *pos, qos_info;
|
||||
u8 *pos, qos_info, *ie_start;
|
||||
size_t offset = 0, noffset;
|
||||
int i, count, rates_len, supp_rates_len, shift;
|
||||
u16 capab;
|
||||
@@ -752,6 +752,7 @@ static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata)
|
||||
|
||||
/* SSID */
|
||||
pos = skb_put(skb, 2 + assoc_data->ssid_len);
|
||||
ie_start = pos;
|
||||
*pos++ = WLAN_EID_SSID;
|
||||
*pos++ = assoc_data->ssid_len;
|
||||
memcpy(pos, assoc_data->ssid, assoc_data->ssid_len);
|
||||
@@ -976,6 +977,11 @@ static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata)
|
||||
return;
|
||||
}
|
||||
|
||||
pos = skb_tail_pointer(skb);
|
||||
kfree(ifmgd->assoc_req_ies);
|
||||
ifmgd->assoc_req_ies = kmemdup(ie_start, pos - ie_start, GFP_ATOMIC);
|
||||
ifmgd->assoc_req_ies_len = pos - ie_start;
|
||||
|
||||
drv_mgd_prepare_tx(local, sdata, 0);
|
||||
|
||||
IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
|
||||
@@ -3544,7 +3550,8 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
|
||||
uapsd_queues |= ieee80211_ac_to_qos_mask[ac];
|
||||
}
|
||||
|
||||
cfg80211_rx_assoc_resp(sdata->dev, bss, (u8 *)mgmt, len, uapsd_queues);
|
||||
cfg80211_rx_assoc_resp(sdata->dev, bss, (u8 *)mgmt, len, uapsd_queues,
|
||||
ifmgd->assoc_req_ies, ifmgd->assoc_req_ies_len);
|
||||
}
|
||||
|
||||
static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
|
||||
@@ -5576,6 +5583,9 @@ void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata)
|
||||
ifmgd->teardown_skb = NULL;
|
||||
ifmgd->orig_teardown_skb = NULL;
|
||||
}
|
||||
kfree(ifmgd->assoc_req_ies);
|
||||
ifmgd->assoc_req_ies = NULL;
|
||||
ifmgd->assoc_req_ies_len = 0;
|
||||
spin_unlock_bh(&ifmgd->teardown_lock);
|
||||
del_timer_sync(&ifmgd->timer);
|
||||
sdata_unlock(sdata);
|
||||
|
Reference in New Issue
Block a user