@@ -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+
61140struct ieee80211_bss *
62141ieee80211_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