Skip to content

Commit fcea7db

Browse files
sara-sjmberg-intel
authored andcommitted
mac80211: move the bss update from elements to an helper
This will allow iterating over multiple BSSs inside cfg80211_bss, in case of multiple BSSID. Signed-off-by: Sara Sharon <[email protected]> Signed-off-by: Johannes Berg <[email protected]>
1 parent 4abb52a commit fcea7db

File tree

1 file changed

+80
-70
lines changed

1 file changed

+80
-70
lines changed

net/mac80211/scan.c

Lines changed: 80 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,85 @@ static bool is_uapsd_supported(struct ieee802_11_elems *elems)
5858
return qos_info & IEEE80211_WMM_IE_AP_QOSINFO_UAPSD;
5959
}
6060

61+
static void
62+
ieee80211_update_bss_from_elems(struct ieee80211_local *local,
63+
struct ieee80211_bss *bss,
64+
struct ieee802_11_elems *elems,
65+
struct ieee80211_rx_status *rx_status,
66+
bool beacon)
67+
{
68+
int clen, srlen;
69+
70+
if (beacon)
71+
bss->device_ts_beacon = rx_status->device_timestamp;
72+
else
73+
bss->device_ts_presp = rx_status->device_timestamp;
74+
75+
if (elems->parse_error) {
76+
if (beacon)
77+
bss->corrupt_data |= IEEE80211_BSS_CORRUPT_BEACON;
78+
else
79+
bss->corrupt_data |= IEEE80211_BSS_CORRUPT_PROBE_RESP;
80+
} else {
81+
if (beacon)
82+
bss->corrupt_data &= ~IEEE80211_BSS_CORRUPT_BEACON;
83+
else
84+
bss->corrupt_data &= ~IEEE80211_BSS_CORRUPT_PROBE_RESP;
85+
}
86+
87+
/* save the ERP value so that it is available at association time */
88+
if (elems->erp_info && (!elems->parse_error ||
89+
!(bss->valid_data & IEEE80211_BSS_VALID_ERP))) {
90+
bss->erp_value = elems->erp_info[0];
91+
bss->has_erp_value = true;
92+
if (!elems->parse_error)
93+
bss->valid_data |= IEEE80211_BSS_VALID_ERP;
94+
}
95+
96+
/* replace old supported rates if we get new values */
97+
if (!elems->parse_error ||
98+
!(bss->valid_data & IEEE80211_BSS_VALID_RATES)) {
99+
srlen = 0;
100+
if (elems->supp_rates) {
101+
clen = IEEE80211_MAX_SUPP_RATES;
102+
if (clen > elems->supp_rates_len)
103+
clen = elems->supp_rates_len;
104+
memcpy(bss->supp_rates, elems->supp_rates, clen);
105+
srlen += clen;
106+
}
107+
if (elems->ext_supp_rates) {
108+
clen = IEEE80211_MAX_SUPP_RATES - srlen;
109+
if (clen > elems->ext_supp_rates_len)
110+
clen = elems->ext_supp_rates_len;
111+
memcpy(bss->supp_rates + srlen, elems->ext_supp_rates,
112+
clen);
113+
srlen += clen;
114+
}
115+
if (srlen) {
116+
bss->supp_rates_len = srlen;
117+
if (!elems->parse_error)
118+
bss->valid_data |= IEEE80211_BSS_VALID_RATES;
119+
}
120+
}
121+
122+
if (!elems->parse_error ||
123+
!(bss->valid_data & IEEE80211_BSS_VALID_WMM)) {
124+
bss->wmm_used = elems->wmm_param || elems->wmm_info;
125+
bss->uapsd_supported = is_uapsd_supported(elems);
126+
if (!elems->parse_error)
127+
bss->valid_data |= IEEE80211_BSS_VALID_WMM;
128+
}
129+
130+
if (beacon) {
131+
struct ieee80211_supported_band *sband =
132+
local->hw.wiphy->bands[rx_status->band];
133+
if (!(rx_status->encoding == RX_ENC_HT) &&
134+
!(rx_status->encoding == RX_ENC_VHT))
135+
bss->beacon_rate =
136+
&sband->bitrates[rx_status->rate_idx];
137+
}
138+
}
139+
61140
struct ieee80211_bss *
62141
ieee80211_bss_info_update(struct ieee80211_local *local,
63142
struct ieee80211_rx_status *rx_status,
@@ -67,7 +146,6 @@ ieee80211_bss_info_update(struct ieee80211_local *local,
67146
bool beacon = ieee80211_is_beacon(mgmt->frame_control);
68147
struct cfg80211_bss *cbss;
69148
struct ieee80211_bss *bss;
70-
int clen, srlen;
71149
struct cfg80211_inform_bss bss_meta = {
72150
.boottime_ns = rx_status->boottime_ns,
73151
};
@@ -132,75 +210,7 @@ ieee80211_bss_info_update(struct ieee80211_local *local,
132210
rx_status->flag |= RX_FLAG_NO_SIGNAL_VAL;
133211

134212
bss = (void *)cbss->priv;
135-
136-
if (beacon)
137-
bss->device_ts_beacon = rx_status->device_timestamp;
138-
else
139-
bss->device_ts_presp = rx_status->device_timestamp;
140-
141-
if (elems.parse_error) {
142-
if (beacon)
143-
bss->corrupt_data |= IEEE80211_BSS_CORRUPT_BEACON;
144-
else
145-
bss->corrupt_data |= IEEE80211_BSS_CORRUPT_PROBE_RESP;
146-
} else {
147-
if (beacon)
148-
bss->corrupt_data &= ~IEEE80211_BSS_CORRUPT_BEACON;
149-
else
150-
bss->corrupt_data &= ~IEEE80211_BSS_CORRUPT_PROBE_RESP;
151-
}
152-
153-
/* save the ERP value so that it is available at association time */
154-
if (elems.erp_info && (!elems.parse_error ||
155-
!(bss->valid_data & IEEE80211_BSS_VALID_ERP))) {
156-
bss->erp_value = elems.erp_info[0];
157-
bss->has_erp_value = true;
158-
if (!elems.parse_error)
159-
bss->valid_data |= IEEE80211_BSS_VALID_ERP;
160-
}
161-
162-
/* replace old supported rates if we get new values */
163-
if (!elems.parse_error ||
164-
!(bss->valid_data & IEEE80211_BSS_VALID_RATES)) {
165-
srlen = 0;
166-
if (elems.supp_rates) {
167-
clen = IEEE80211_MAX_SUPP_RATES;
168-
if (clen > elems.supp_rates_len)
169-
clen = elems.supp_rates_len;
170-
memcpy(bss->supp_rates, elems.supp_rates, clen);
171-
srlen += clen;
172-
}
173-
if (elems.ext_supp_rates) {
174-
clen = IEEE80211_MAX_SUPP_RATES - srlen;
175-
if (clen > elems.ext_supp_rates_len)
176-
clen = elems.ext_supp_rates_len;
177-
memcpy(bss->supp_rates + srlen, elems.ext_supp_rates,
178-
clen);
179-
srlen += clen;
180-
}
181-
if (srlen) {
182-
bss->supp_rates_len = srlen;
183-
if (!elems.parse_error)
184-
bss->valid_data |= IEEE80211_BSS_VALID_RATES;
185-
}
186-
}
187-
188-
if (!elems.parse_error ||
189-
!(bss->valid_data & IEEE80211_BSS_VALID_WMM)) {
190-
bss->wmm_used = elems.wmm_param || elems.wmm_info;
191-
bss->uapsd_supported = is_uapsd_supported(&elems);
192-
if (!elems.parse_error)
193-
bss->valid_data |= IEEE80211_BSS_VALID_WMM;
194-
}
195-
196-
if (beacon) {
197-
struct ieee80211_supported_band *sband =
198-
local->hw.wiphy->bands[rx_status->band];
199-
if (!(rx_status->encoding == RX_ENC_HT) &&
200-
!(rx_status->encoding == RX_ENC_VHT))
201-
bss->beacon_rate =
202-
&sband->bitrates[rx_status->rate_idx];
203-
}
213+
ieee80211_update_bss_from_elems(local, bss, &elems, rx_status, beacon);
204214

205215
return bss;
206216
}

0 commit comments

Comments
 (0)