Commit 80ca2571 authored by Thomas Pedersen's avatar Thomas Pedersen Committed by Johannes Berg
Browse files

cfg80211: handle Association Response from S1G STA



The sending STA type is implicit based on beacon or probe
response content. If sending STA was an S1G STA, adjust
the Information Element location accordingly.

Signed-off-by: default avatarThomas Pedersen <thomas@adapt-ip.com>
Link: https://lore.kernel.org/r/20200922022818.15855-9-thomas@adapt-ip.com


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent cd418ba6
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -1100,6 +1100,11 @@ struct ieee80211_mgmt {
			/* followed by Supported rates */
			u8 variable[0];
		} __packed assoc_resp, reassoc_resp;
		struct {
			__le16 capab_info;
			__le16 status_code;
			u8 variable[0];
		} __packed s1g_assoc_resp, s1g_reassoc_resp;
		struct {
			__le16 capab_info;
			__le16 listen_interval;
+11 −3
Original line number Diff line number Diff line
@@ -30,6 +30,15 @@ void cfg80211_rx_assoc_resp(struct net_device *dev, struct cfg80211_bss *bss,
	struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
	struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)buf;
	struct cfg80211_connect_resp_params cr;
	const u8 *resp_ie = mgmt->u.assoc_resp.variable;
	size_t resp_ie_len = len - offsetof(struct ieee80211_mgmt,
					    u.assoc_resp.variable);

	if (bss->channel->band == NL80211_BAND_S1GHZ) {
		resp_ie = (u8 *)&mgmt->u.s1g_assoc_resp.variable;
		resp_ie_len = len - offsetof(struct ieee80211_mgmt,
					     u.s1g_assoc_resp.variable);
	}

	memset(&cr, 0, sizeof(cr));
	cr.status = (int)le16_to_cpu(mgmt->u.assoc_resp.status_code);
@@ -37,9 +46,8 @@ void cfg80211_rx_assoc_resp(struct net_device *dev, struct cfg80211_bss *bss,
	cr.bss = bss;
	cr.req_ie = req_ies;
	cr.req_ie_len = req_ies_len;
	cr.resp_ie = mgmt->u.assoc_resp.variable;
	cr.resp_ie_len =
		len - offsetof(struct ieee80211_mgmt, u.assoc_resp.variable);
	cr.resp_ie = resp_ie;
	cr.resp_ie_len = resp_ie_len;
	cr.timeout_reason = NL80211_TIMEOUT_UNSPECIFIED;

	trace_cfg80211_send_rx_assoc(dev, bss);