]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
mac80211: move the bss update from elements to an helper
authorSara Sharon <sara.sharon@intel.com>
Wed, 16 Jan 2019 18:35:38 +0000 (20:35 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 8 Feb 2019 12:51:50 +0000 (13:51 +0100)
This will allow iterating over multiple BSSs inside
cfg80211_bss, in case of multiple BSSID.

Signed-off-by: Sara Sharon <sara.sharon@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/scan.c

index b58f75da9c844ea0b2edbc49dd475d49319656fc..20211cbc63f4feb3796749d0808471175c1442f1 100644 (file)
@@ -58,6 +58,85 @@ static bool is_uapsd_supported(struct ieee802_11_elems *elems)
        return qos_info & IEEE80211_WMM_IE_AP_QOSINFO_UAPSD;
 }
 
+static void
+ieee80211_update_bss_from_elems(struct ieee80211_local *local,
+                               struct ieee80211_bss *bss,
+                               struct ieee802_11_elems *elems,
+                               struct ieee80211_rx_status *rx_status,
+                               bool beacon)
+{
+       int clen, srlen;
+
+       if (beacon)
+               bss->device_ts_beacon = rx_status->device_timestamp;
+       else
+               bss->device_ts_presp = rx_status->device_timestamp;
+
+       if (elems->parse_error) {
+               if (beacon)
+                       bss->corrupt_data |= IEEE80211_BSS_CORRUPT_BEACON;
+               else
+                       bss->corrupt_data |= IEEE80211_BSS_CORRUPT_PROBE_RESP;
+       } else {
+               if (beacon)
+                       bss->corrupt_data &= ~IEEE80211_BSS_CORRUPT_BEACON;
+               else
+                       bss->corrupt_data &= ~IEEE80211_BSS_CORRUPT_PROBE_RESP;
+       }
+
+       /* save the ERP value so that it is available at association time */
+       if (elems->erp_info && (!elems->parse_error ||
+                               !(bss->valid_data & IEEE80211_BSS_VALID_ERP))) {
+               bss->erp_value = elems->erp_info[0];
+               bss->has_erp_value = true;
+               if (!elems->parse_error)
+                       bss->valid_data |= IEEE80211_BSS_VALID_ERP;
+       }
+
+       /* replace old supported rates if we get new values */
+       if (!elems->parse_error ||
+           !(bss->valid_data & IEEE80211_BSS_VALID_RATES)) {
+               srlen = 0;
+               if (elems->supp_rates) {
+                       clen = IEEE80211_MAX_SUPP_RATES;
+                       if (clen > elems->supp_rates_len)
+                               clen = elems->supp_rates_len;
+                       memcpy(bss->supp_rates, elems->supp_rates, clen);
+                       srlen += clen;
+               }
+               if (elems->ext_supp_rates) {
+                       clen = IEEE80211_MAX_SUPP_RATES - srlen;
+                       if (clen > elems->ext_supp_rates_len)
+                               clen = elems->ext_supp_rates_len;
+                       memcpy(bss->supp_rates + srlen, elems->ext_supp_rates,
+                              clen);
+                       srlen += clen;
+               }
+               if (srlen) {
+                       bss->supp_rates_len = srlen;
+                       if (!elems->parse_error)
+                               bss->valid_data |= IEEE80211_BSS_VALID_RATES;
+               }
+       }
+
+       if (!elems->parse_error ||
+           !(bss->valid_data & IEEE80211_BSS_VALID_WMM)) {
+               bss->wmm_used = elems->wmm_param || elems->wmm_info;
+               bss->uapsd_supported = is_uapsd_supported(elems);
+               if (!elems->parse_error)
+                       bss->valid_data |= IEEE80211_BSS_VALID_WMM;
+       }
+
+       if (beacon) {
+               struct ieee80211_supported_band *sband =
+                       local->hw.wiphy->bands[rx_status->band];
+               if (!(rx_status->encoding == RX_ENC_HT) &&
+                   !(rx_status->encoding == RX_ENC_VHT))
+                       bss->beacon_rate =
+                               &sband->bitrates[rx_status->rate_idx];
+       }
+}
+
 struct ieee80211_bss *
 ieee80211_bss_info_update(struct ieee80211_local *local,
                          struct ieee80211_rx_status *rx_status,
@@ -67,7 +146,6 @@ ieee80211_bss_info_update(struct ieee80211_local *local,
        bool beacon = ieee80211_is_beacon(mgmt->frame_control);
        struct cfg80211_bss *cbss;
        struct ieee80211_bss *bss;
-       int clen, srlen;
        struct cfg80211_inform_bss bss_meta = {
                .boottime_ns = rx_status->boottime_ns,
        };
@@ -132,75 +210,7 @@ ieee80211_bss_info_update(struct ieee80211_local *local,
                rx_status->flag |= RX_FLAG_NO_SIGNAL_VAL;
 
        bss = (void *)cbss->priv;
-
-       if (beacon)
-               bss->device_ts_beacon = rx_status->device_timestamp;
-       else
-               bss->device_ts_presp = rx_status->device_timestamp;
-
-       if (elems.parse_error) {
-               if (beacon)
-                       bss->corrupt_data |= IEEE80211_BSS_CORRUPT_BEACON;
-               else
-                       bss->corrupt_data |= IEEE80211_BSS_CORRUPT_PROBE_RESP;
-       } else {
-               if (beacon)
-                       bss->corrupt_data &= ~IEEE80211_BSS_CORRUPT_BEACON;
-               else
-                       bss->corrupt_data &= ~IEEE80211_BSS_CORRUPT_PROBE_RESP;
-       }
-
-       /* save the ERP value so that it is available at association time */
-       if (elems.erp_info && (!elems.parse_error ||
-                              !(bss->valid_data & IEEE80211_BSS_VALID_ERP))) {
-               bss->erp_value = elems.erp_info[0];
-               bss->has_erp_value = true;
-               if (!elems.parse_error)
-                       bss->valid_data |= IEEE80211_BSS_VALID_ERP;
-       }
-
-       /* replace old supported rates if we get new values */
-       if (!elems.parse_error ||
-           !(bss->valid_data & IEEE80211_BSS_VALID_RATES)) {
-               srlen = 0;
-               if (elems.supp_rates) {
-                       clen = IEEE80211_MAX_SUPP_RATES;
-                       if (clen > elems.supp_rates_len)
-                               clen = elems.supp_rates_len;
-                       memcpy(bss->supp_rates, elems.supp_rates, clen);
-                       srlen += clen;
-               }
-               if (elems.ext_supp_rates) {
-                       clen = IEEE80211_MAX_SUPP_RATES - srlen;
-                       if (clen > elems.ext_supp_rates_len)
-                               clen = elems.ext_supp_rates_len;
-                       memcpy(bss->supp_rates + srlen, elems.ext_supp_rates,
-                              clen);
-                       srlen += clen;
-               }
-               if (srlen) {
-                       bss->supp_rates_len = srlen;
-                       if (!elems.parse_error)
-                               bss->valid_data |= IEEE80211_BSS_VALID_RATES;
-               }
-       }
-
-       if (!elems.parse_error ||
-           !(bss->valid_data & IEEE80211_BSS_VALID_WMM)) {
-               bss->wmm_used = elems.wmm_param || elems.wmm_info;
-               bss->uapsd_supported = is_uapsd_supported(&elems);
-               if (!elems.parse_error)
-                       bss->valid_data |= IEEE80211_BSS_VALID_WMM;
-       }
-
-       if (beacon) {
-               struct ieee80211_supported_band *sband =
-                       local->hw.wiphy->bands[rx_status->band];
-               if (!(rx_status->encoding == RX_ENC_HT) &&
-                   !(rx_status->encoding == RX_ENC_VHT))
-                       bss->beacon_rate =
-                               &sband->bitrates[rx_status->rate_idx];
-       }
+       ieee80211_update_bss_from_elems(local, bss, &elems, rx_status, beacon);
 
        return bss;
 }