|
@@ -425,11 +425,9 @@ static void ieee80211_rx_mgmt_auth_ibss(struct ieee80211_sub_if_data *sdata,
|
|
|
}
|
|
|
|
|
|
static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
|
|
|
- struct ieee80211_mgmt *mgmt,
|
|
|
- size_t len,
|
|
|
+ struct ieee80211_mgmt *mgmt, size_t len,
|
|
|
struct ieee80211_rx_status *rx_status,
|
|
|
- struct ieee802_11_elems *elems,
|
|
|
- bool beacon)
|
|
|
+ struct ieee802_11_elems *elems)
|
|
|
{
|
|
|
struct ieee80211_local *local = sdata->local;
|
|
|
int freq;
|
|
@@ -530,7 +528,7 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
|
|
|
}
|
|
|
|
|
|
bss = ieee80211_bss_info_update(local, rx_status, mgmt, len, elems,
|
|
|
- channel, beacon);
|
|
|
+ channel);
|
|
|
if (!bss)
|
|
|
return;
|
|
|
|
|
@@ -877,14 +875,21 @@ static void ieee80211_rx_mgmt_probe_req(struct ieee80211_sub_if_data *sdata,
|
|
|
ieee80211_tx_skb(sdata, skb);
|
|
|
}
|
|
|
|
|
|
-static void ieee80211_rx_mgmt_probe_resp(struct ieee80211_sub_if_data *sdata,
|
|
|
- struct ieee80211_mgmt *mgmt,
|
|
|
- size_t len,
|
|
|
- struct ieee80211_rx_status *rx_status)
|
|
|
+static
|
|
|
+void ieee80211_rx_mgmt_probe_beacon(struct ieee80211_sub_if_data *sdata,
|
|
|
+ struct ieee80211_mgmt *mgmt, size_t len,
|
|
|
+ struct ieee80211_rx_status *rx_status)
|
|
|
{
|
|
|
size_t baselen;
|
|
|
struct ieee802_11_elems elems;
|
|
|
|
|
|
+ BUILD_BUG_ON(offsetof(typeof(mgmt->u.probe_resp), variable) !=
|
|
|
+ offsetof(typeof(mgmt->u.beacon), variable));
|
|
|
+
|
|
|
+ /*
|
|
|
+ * either beacon or probe_resp but the variable field is at the
|
|
|
+ * same offset
|
|
|
+ */
|
|
|
baselen = (u8 *) mgmt->u.probe_resp.variable - (u8 *) mgmt;
|
|
|
if (baselen > len)
|
|
|
return;
|
|
@@ -892,25 +897,7 @@ static void ieee80211_rx_mgmt_probe_resp(struct ieee80211_sub_if_data *sdata,
|
|
|
ieee802_11_parse_elems(mgmt->u.probe_resp.variable, len - baselen,
|
|
|
&elems);
|
|
|
|
|
|
- ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems, false);
|
|
|
-}
|
|
|
-
|
|
|
-static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
|
|
|
- struct ieee80211_mgmt *mgmt,
|
|
|
- size_t len,
|
|
|
- struct ieee80211_rx_status *rx_status)
|
|
|
-{
|
|
|
- size_t baselen;
|
|
|
- struct ieee802_11_elems elems;
|
|
|
-
|
|
|
- /* Process beacon from the current BSS */
|
|
|
- baselen = (u8 *) mgmt->u.beacon.variable - (u8 *) mgmt;
|
|
|
- if (baselen > len)
|
|
|
- return;
|
|
|
-
|
|
|
- ieee802_11_parse_elems(mgmt->u.beacon.variable, len - baselen, &elems);
|
|
|
-
|
|
|
- ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems, true);
|
|
|
+ ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems);
|
|
|
}
|
|
|
|
|
|
void ieee80211_ibss_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
|
|
@@ -934,12 +921,9 @@ void ieee80211_ibss_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
|
|
|
ieee80211_rx_mgmt_probe_req(sdata, skb);
|
|
|
break;
|
|
|
case IEEE80211_STYPE_PROBE_RESP:
|
|
|
- ieee80211_rx_mgmt_probe_resp(sdata, mgmt, skb->len,
|
|
|
- rx_status);
|
|
|
- break;
|
|
|
case IEEE80211_STYPE_BEACON:
|
|
|
- ieee80211_rx_mgmt_beacon(sdata, mgmt, skb->len,
|
|
|
- rx_status);
|
|
|
+ ieee80211_rx_mgmt_probe_beacon(sdata, mgmt, skb->len,
|
|
|
+ rx_status);
|
|
|
break;
|
|
|
case IEEE80211_STYPE_AUTH:
|
|
|
ieee80211_rx_mgmt_auth_ibss(sdata, mgmt, skb->len);
|