1*03f9172cSAndroid Build Coastguard Worker /*
2*03f9172cSAndroid Build Coastguard Worker * BSS table
3*03f9172cSAndroid Build Coastguard Worker * Copyright (c) 2009-2019, Jouni Malinen <[email protected]>
4*03f9172cSAndroid Build Coastguard Worker *
5*03f9172cSAndroid Build Coastguard Worker * This software may be distributed under the terms of the BSD license.
6*03f9172cSAndroid Build Coastguard Worker * See README for more details.
7*03f9172cSAndroid Build Coastguard Worker */
8*03f9172cSAndroid Build Coastguard Worker
9*03f9172cSAndroid Build Coastguard Worker #ifndef BSS_H
10*03f9172cSAndroid Build Coastguard Worker #define BSS_H
11*03f9172cSAndroid Build Coastguard Worker
12*03f9172cSAndroid Build Coastguard Worker struct wpa_scan_res;
13*03f9172cSAndroid Build Coastguard Worker
14*03f9172cSAndroid Build Coastguard Worker #define WPA_BSS_QUAL_INVALID BIT(0)
15*03f9172cSAndroid Build Coastguard Worker #define WPA_BSS_NOISE_INVALID BIT(1)
16*03f9172cSAndroid Build Coastguard Worker #define WPA_BSS_LEVEL_INVALID BIT(2)
17*03f9172cSAndroid Build Coastguard Worker #define WPA_BSS_LEVEL_DBM BIT(3)
18*03f9172cSAndroid Build Coastguard Worker #define WPA_BSS_AUTHENTICATED BIT(4)
19*03f9172cSAndroid Build Coastguard Worker #define WPA_BSS_ASSOCIATED BIT(5)
20*03f9172cSAndroid Build Coastguard Worker #define WPA_BSS_ANQP_FETCH_TRIED BIT(6)
21*03f9172cSAndroid Build Coastguard Worker #define WPA_BSS_OWE_TRANSITION BIT(7)
22*03f9172cSAndroid Build Coastguard Worker
23*03f9172cSAndroid Build Coastguard Worker #define WPA_BSS_FREQ_CHANGED_FLAG BIT(0)
24*03f9172cSAndroid Build Coastguard Worker #define WPA_BSS_SIGNAL_CHANGED_FLAG BIT(1)
25*03f9172cSAndroid Build Coastguard Worker #define WPA_BSS_PRIVACY_CHANGED_FLAG BIT(2)
26*03f9172cSAndroid Build Coastguard Worker #define WPA_BSS_MODE_CHANGED_FLAG BIT(3)
27*03f9172cSAndroid Build Coastguard Worker #define WPA_BSS_WPAIE_CHANGED_FLAG BIT(4)
28*03f9172cSAndroid Build Coastguard Worker #define WPA_BSS_RSNIE_CHANGED_FLAG BIT(5)
29*03f9172cSAndroid Build Coastguard Worker #define WPA_BSS_WPS_CHANGED_FLAG BIT(6)
30*03f9172cSAndroid Build Coastguard Worker #define WPA_BSS_RATES_CHANGED_FLAG BIT(7)
31*03f9172cSAndroid Build Coastguard Worker #define WPA_BSS_IES_CHANGED_FLAG BIT(8)
32*03f9172cSAndroid Build Coastguard Worker
33*03f9172cSAndroid Build Coastguard Worker struct wpa_bss_anqp_elem {
34*03f9172cSAndroid Build Coastguard Worker struct dl_list list;
35*03f9172cSAndroid Build Coastguard Worker u16 infoid;
36*03f9172cSAndroid Build Coastguard Worker bool protected_response; /* received in a protected GAS response */
37*03f9172cSAndroid Build Coastguard Worker struct wpabuf *payload;
38*03f9172cSAndroid Build Coastguard Worker };
39*03f9172cSAndroid Build Coastguard Worker
40*03f9172cSAndroid Build Coastguard Worker /**
41*03f9172cSAndroid Build Coastguard Worker * struct wpa_bss_anqp - ANQP data for a BSS entry (struct wpa_bss)
42*03f9172cSAndroid Build Coastguard Worker */
43*03f9172cSAndroid Build Coastguard Worker struct wpa_bss_anqp {
44*03f9172cSAndroid Build Coastguard Worker /** Number of BSS entries referring to this ANQP data instance */
45*03f9172cSAndroid Build Coastguard Worker unsigned int users;
46*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_INTERWORKING
47*03f9172cSAndroid Build Coastguard Worker struct wpabuf *capability_list;
48*03f9172cSAndroid Build Coastguard Worker struct wpabuf *venue_name;
49*03f9172cSAndroid Build Coastguard Worker struct wpabuf *network_auth_type;
50*03f9172cSAndroid Build Coastguard Worker struct wpabuf *roaming_consortium;
51*03f9172cSAndroid Build Coastguard Worker struct wpabuf *ip_addr_type_availability;
52*03f9172cSAndroid Build Coastguard Worker struct wpabuf *nai_realm;
53*03f9172cSAndroid Build Coastguard Worker struct wpabuf *anqp_3gpp;
54*03f9172cSAndroid Build Coastguard Worker struct wpabuf *domain_name;
55*03f9172cSAndroid Build Coastguard Worker struct wpabuf *fils_realm_info;
56*03f9172cSAndroid Build Coastguard Worker struct dl_list anqp_elems; /* list of struct wpa_bss_anqp_elem */
57*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_INTERWORKING */
58*03f9172cSAndroid Build Coastguard Worker #ifdef CONFIG_HS20
59*03f9172cSAndroid Build Coastguard Worker struct wpabuf *hs20_capability_list;
60*03f9172cSAndroid Build Coastguard Worker struct wpabuf *hs20_operator_friendly_name;
61*03f9172cSAndroid Build Coastguard Worker struct wpabuf *hs20_wan_metrics;
62*03f9172cSAndroid Build Coastguard Worker struct wpabuf *hs20_connection_capability;
63*03f9172cSAndroid Build Coastguard Worker struct wpabuf *hs20_operating_class;
64*03f9172cSAndroid Build Coastguard Worker struct wpabuf *hs20_osu_providers_list;
65*03f9172cSAndroid Build Coastguard Worker struct wpabuf *hs20_operator_icon_metadata;
66*03f9172cSAndroid Build Coastguard Worker struct wpabuf *hs20_osu_providers_nai_list;
67*03f9172cSAndroid Build Coastguard Worker #endif /* CONFIG_HS20 */
68*03f9172cSAndroid Build Coastguard Worker };
69*03f9172cSAndroid Build Coastguard Worker
70*03f9172cSAndroid Build Coastguard Worker /**
71*03f9172cSAndroid Build Coastguard Worker * struct wpa_bss - BSS table
72*03f9172cSAndroid Build Coastguard Worker *
73*03f9172cSAndroid Build Coastguard Worker * This structure is used to store information about neighboring BSSes in
74*03f9172cSAndroid Build Coastguard Worker * generic format. It is mainly updated based on scan results from the driver.
75*03f9172cSAndroid Build Coastguard Worker */
76*03f9172cSAndroid Build Coastguard Worker struct wpa_bss {
77*03f9172cSAndroid Build Coastguard Worker /** List entry for struct wpa_supplicant::bss */
78*03f9172cSAndroid Build Coastguard Worker struct dl_list list;
79*03f9172cSAndroid Build Coastguard Worker /** List entry for struct wpa_supplicant::bss_id */
80*03f9172cSAndroid Build Coastguard Worker struct dl_list list_id;
81*03f9172cSAndroid Build Coastguard Worker /** Unique identifier for this BSS entry */
82*03f9172cSAndroid Build Coastguard Worker unsigned int id;
83*03f9172cSAndroid Build Coastguard Worker /** Number of counts without seeing this BSS */
84*03f9172cSAndroid Build Coastguard Worker unsigned int scan_miss_count;
85*03f9172cSAndroid Build Coastguard Worker /** Index of the last scan update */
86*03f9172cSAndroid Build Coastguard Worker unsigned int last_update_idx;
87*03f9172cSAndroid Build Coastguard Worker /** Information flags about the BSS/IBSS (WPA_BSS_*) */
88*03f9172cSAndroid Build Coastguard Worker unsigned int flags;
89*03f9172cSAndroid Build Coastguard Worker /** BSSID */
90*03f9172cSAndroid Build Coastguard Worker u8 bssid[ETH_ALEN];
91*03f9172cSAndroid Build Coastguard Worker /** HESSID */
92*03f9172cSAndroid Build Coastguard Worker u8 hessid[ETH_ALEN];
93*03f9172cSAndroid Build Coastguard Worker /** SSID */
94*03f9172cSAndroid Build Coastguard Worker u8 ssid[SSID_MAX_LEN];
95*03f9172cSAndroid Build Coastguard Worker /** Length of SSID */
96*03f9172cSAndroid Build Coastguard Worker size_t ssid_len;
97*03f9172cSAndroid Build Coastguard Worker /** Frequency of the channel in MHz (e.g., 2412 = channel 1) */
98*03f9172cSAndroid Build Coastguard Worker int freq;
99*03f9172cSAndroid Build Coastguard Worker /** The max channel width supported by both the AP and the STA */
100*03f9172cSAndroid Build Coastguard Worker enum chan_width max_cw;
101*03f9172cSAndroid Build Coastguard Worker /** Beacon interval in TUs (host byte order) */
102*03f9172cSAndroid Build Coastguard Worker u16 beacon_int;
103*03f9172cSAndroid Build Coastguard Worker /** Capability information field in host byte order */
104*03f9172cSAndroid Build Coastguard Worker u16 caps;
105*03f9172cSAndroid Build Coastguard Worker /** Signal quality */
106*03f9172cSAndroid Build Coastguard Worker int qual;
107*03f9172cSAndroid Build Coastguard Worker /** Noise level */
108*03f9172cSAndroid Build Coastguard Worker int noise;
109*03f9172cSAndroid Build Coastguard Worker /** Signal level */
110*03f9172cSAndroid Build Coastguard Worker int level;
111*03f9172cSAndroid Build Coastguard Worker /** Timestamp of last Beacon/Probe Response frame */
112*03f9172cSAndroid Build Coastguard Worker u64 tsf;
113*03f9172cSAndroid Build Coastguard Worker /** Whether the Beacon frame data is known to be newer */
114*03f9172cSAndroid Build Coastguard Worker bool beacon_newer;
115*03f9172cSAndroid Build Coastguard Worker /** Time of the last update (i.e., Beacon or Probe Response RX) */
116*03f9172cSAndroid Build Coastguard Worker struct os_reltime last_update;
117*03f9172cSAndroid Build Coastguard Worker /** Estimated throughput in kbps */
118*03f9172cSAndroid Build Coastguard Worker unsigned int est_throughput;
119*03f9172cSAndroid Build Coastguard Worker /** Signal-to-noise ratio in dB */
120*03f9172cSAndroid Build Coastguard Worker int snr;
121*03f9172cSAndroid Build Coastguard Worker /** ANQP data */
122*03f9172cSAndroid Build Coastguard Worker struct wpa_bss_anqp *anqp;
123*03f9172cSAndroid Build Coastguard Worker /** Length of the following IE field in octets (from Probe Response) */
124*03f9172cSAndroid Build Coastguard Worker size_t ie_len;
125*03f9172cSAndroid Build Coastguard Worker /** Length of the following Beacon IE field in octets */
126*03f9172cSAndroid Build Coastguard Worker size_t beacon_ie_len;
127*03f9172cSAndroid Build Coastguard Worker /** MLD address of the AP */
128*03f9172cSAndroid Build Coastguard Worker u8 mld_addr[ETH_ALEN];
129*03f9172cSAndroid Build Coastguard Worker /** Link ID of this affiliated AP of the AP MLD */
130*03f9172cSAndroid Build Coastguard Worker u8 mld_link_id;
131*03f9172cSAndroid Build Coastguard Worker
132*03f9172cSAndroid Build Coastguard Worker /** An array of MLD links */
133*03f9172cSAndroid Build Coastguard Worker u16 valid_links;
134*03f9172cSAndroid Build Coastguard Worker struct mld_link {
135*03f9172cSAndroid Build Coastguard Worker u8 bssid[ETH_ALEN];
136*03f9172cSAndroid Build Coastguard Worker int freq;
137*03f9172cSAndroid Build Coastguard Worker
138*03f9172cSAndroid Build Coastguard Worker /* Whether the link is valid but currently disabled */
139*03f9172cSAndroid Build Coastguard Worker bool disabled;
140*03f9172cSAndroid Build Coastguard Worker } mld_links[MAX_NUM_MLD_LINKS];
141*03f9172cSAndroid Build Coastguard Worker
142*03f9172cSAndroid Build Coastguard Worker /* followed by ie_len octets of IEs */
143*03f9172cSAndroid Build Coastguard Worker /* followed by beacon_ie_len octets of IEs */
144*03f9172cSAndroid Build Coastguard Worker u8 ies[];
145*03f9172cSAndroid Build Coastguard Worker };
146*03f9172cSAndroid Build Coastguard Worker
wpa_bss_ie_ptr(const struct wpa_bss * bss)147*03f9172cSAndroid Build Coastguard Worker static inline const u8 * wpa_bss_ie_ptr(const struct wpa_bss *bss)
148*03f9172cSAndroid Build Coastguard Worker {
149*03f9172cSAndroid Build Coastguard Worker return bss->ies;
150*03f9172cSAndroid Build Coastguard Worker }
151*03f9172cSAndroid Build Coastguard Worker
152*03f9172cSAndroid Build Coastguard Worker void notify_bss_changes(struct wpa_supplicant *wpa_s, u32 changes,
153*03f9172cSAndroid Build Coastguard Worker const struct wpa_bss *bss);
154*03f9172cSAndroid Build Coastguard Worker void wpa_bss_update_start(struct wpa_supplicant *wpa_s);
155*03f9172cSAndroid Build Coastguard Worker void wpa_bss_update_scan_res(struct wpa_supplicant *wpa_s,
156*03f9172cSAndroid Build Coastguard Worker struct wpa_scan_res *res,
157*03f9172cSAndroid Build Coastguard Worker struct os_reltime *fetch_time);
158*03f9172cSAndroid Build Coastguard Worker void wpa_bss_remove(struct wpa_supplicant *wpa_s, struct wpa_bss *bss,
159*03f9172cSAndroid Build Coastguard Worker const char *reason);
160*03f9172cSAndroid Build Coastguard Worker void wpa_bss_update_end(struct wpa_supplicant *wpa_s, struct scan_info *info,
161*03f9172cSAndroid Build Coastguard Worker int new_scan);
162*03f9172cSAndroid Build Coastguard Worker int wpa_bss_init(struct wpa_supplicant *wpa_s);
163*03f9172cSAndroid Build Coastguard Worker void wpa_bss_deinit(struct wpa_supplicant *wpa_s);
164*03f9172cSAndroid Build Coastguard Worker void wpa_bss_flush(struct wpa_supplicant *wpa_s);
165*03f9172cSAndroid Build Coastguard Worker void wpa_bss_flush_by_age(struct wpa_supplicant *wpa_s, int age);
166*03f9172cSAndroid Build Coastguard Worker struct wpa_bss * wpa_bss_get(struct wpa_supplicant *wpa_s, const u8 *bssid,
167*03f9172cSAndroid Build Coastguard Worker const u8 *ssid, size_t ssid_len);
168*03f9172cSAndroid Build Coastguard Worker struct wpa_bss * wpa_bss_get_connection(struct wpa_supplicant *wpa_s,
169*03f9172cSAndroid Build Coastguard Worker const u8 *bssid,
170*03f9172cSAndroid Build Coastguard Worker const u8 *ssid, size_t ssid_len);
171*03f9172cSAndroid Build Coastguard Worker struct wpa_bss * wpa_bss_get_bssid(struct wpa_supplicant *wpa_s,
172*03f9172cSAndroid Build Coastguard Worker const u8 *bssid);
173*03f9172cSAndroid Build Coastguard Worker struct wpa_bss * wpa_bss_get_bssid_latest(struct wpa_supplicant *wpa_s,
174*03f9172cSAndroid Build Coastguard Worker const u8 *bssid);
175*03f9172cSAndroid Build Coastguard Worker struct wpa_bss * wpa_bss_get_p2p_dev_addr(struct wpa_supplicant *wpa_s,
176*03f9172cSAndroid Build Coastguard Worker const u8 *dev_addr);
177*03f9172cSAndroid Build Coastguard Worker struct wpa_bss * wpa_bss_get_id(struct wpa_supplicant *wpa_s, unsigned int id);
178*03f9172cSAndroid Build Coastguard Worker struct wpa_bss * wpa_bss_get_id_range(struct wpa_supplicant *wpa_s,
179*03f9172cSAndroid Build Coastguard Worker unsigned int idf, unsigned int idl);
180*03f9172cSAndroid Build Coastguard Worker const u8 * wpa_bss_get_ie(const struct wpa_bss *bss, u8 ie);
181*03f9172cSAndroid Build Coastguard Worker const u8 * wpa_bss_get_ie_beacon(const struct wpa_bss *bss, u8 ie);
182*03f9172cSAndroid Build Coastguard Worker const u8 * wpa_bss_get_ie_ext(const struct wpa_bss *bss, u8 ext);
183*03f9172cSAndroid Build Coastguard Worker const u8 * wpa_bss_get_vendor_ie(const struct wpa_bss *bss, u32 vendor_type);
184*03f9172cSAndroid Build Coastguard Worker const u8 * wpa_bss_get_vendor_ie_beacon(const struct wpa_bss *bss,
185*03f9172cSAndroid Build Coastguard Worker u32 vendor_type);
186*03f9172cSAndroid Build Coastguard Worker struct wpabuf * wpa_bss_get_vendor_ie_multi(const struct wpa_bss *bss,
187*03f9172cSAndroid Build Coastguard Worker u32 vendor_type);
188*03f9172cSAndroid Build Coastguard Worker struct wpabuf * wpa_bss_get_vendor_ie_multi_beacon(const struct wpa_bss *bss,
189*03f9172cSAndroid Build Coastguard Worker u32 vendor_type);
190*03f9172cSAndroid Build Coastguard Worker int wpa_bss_get_max_rate(const struct wpa_bss *bss);
191*03f9172cSAndroid Build Coastguard Worker int wpa_bss_get_bit_rates(const struct wpa_bss *bss, u8 **rates);
192*03f9172cSAndroid Build Coastguard Worker struct wpa_bss_anqp * wpa_bss_anqp_alloc(void);
193*03f9172cSAndroid Build Coastguard Worker int wpa_bss_anqp_unshare_alloc(struct wpa_bss *bss);
194*03f9172cSAndroid Build Coastguard Worker const u8 * wpa_bss_get_fils_cache_id(const struct wpa_bss *bss);
195*03f9172cSAndroid Build Coastguard Worker int wpa_bss_ext_capab(const struct wpa_bss *bss, unsigned int capab);
196*03f9172cSAndroid Build Coastguard Worker
bss_is_dmg(const struct wpa_bss * bss)197*03f9172cSAndroid Build Coastguard Worker static inline int bss_is_dmg(const struct wpa_bss *bss)
198*03f9172cSAndroid Build Coastguard Worker {
199*03f9172cSAndroid Build Coastguard Worker return bss->freq > 45000;
200*03f9172cSAndroid Build Coastguard Worker }
201*03f9172cSAndroid Build Coastguard Worker
202*03f9172cSAndroid Build Coastguard Worker /**
203*03f9172cSAndroid Build Coastguard Worker * Test whether a BSS is a PBSS.
204*03f9172cSAndroid Build Coastguard Worker * This checks whether a BSS is a DMG-band PBSS. PBSS is used for P2P DMG
205*03f9172cSAndroid Build Coastguard Worker * network.
206*03f9172cSAndroid Build Coastguard Worker */
bss_is_pbss(struct wpa_bss * bss)207*03f9172cSAndroid Build Coastguard Worker static inline int bss_is_pbss(struct wpa_bss *bss)
208*03f9172cSAndroid Build Coastguard Worker {
209*03f9172cSAndroid Build Coastguard Worker return bss_is_dmg(bss) &&
210*03f9172cSAndroid Build Coastguard Worker (bss->caps & IEEE80211_CAP_DMG_MASK) == IEEE80211_CAP_DMG_PBSS;
211*03f9172cSAndroid Build Coastguard Worker }
212*03f9172cSAndroid Build Coastguard Worker
wpa_bss_update_level(struct wpa_bss * bss,int new_level)213*03f9172cSAndroid Build Coastguard Worker static inline void wpa_bss_update_level(struct wpa_bss *bss, int new_level)
214*03f9172cSAndroid Build Coastguard Worker {
215*03f9172cSAndroid Build Coastguard Worker if (bss != NULL && new_level > -WPA_INVALID_NOISE && new_level < 0)
216*03f9172cSAndroid Build Coastguard Worker bss->level = new_level;
217*03f9172cSAndroid Build Coastguard Worker }
218*03f9172cSAndroid Build Coastguard Worker
219*03f9172cSAndroid Build Coastguard Worker void calculate_update_time(const struct os_reltime *fetch_time,
220*03f9172cSAndroid Build Coastguard Worker unsigned int age_ms,
221*03f9172cSAndroid Build Coastguard Worker struct os_reltime *update_time);
222*03f9172cSAndroid Build Coastguard Worker
223*03f9172cSAndroid Build Coastguard Worker int wpa_bss_parse_basic_ml_element(struct wpa_supplicant *wpa_s,
224*03f9172cSAndroid Build Coastguard Worker struct wpa_bss *bss,
225*03f9172cSAndroid Build Coastguard Worker u8 *ap_mld_addr,
226*03f9172cSAndroid Build Coastguard Worker u16 *missing_links,
227*03f9172cSAndroid Build Coastguard Worker struct wpa_ssid *ssid,
228*03f9172cSAndroid Build Coastguard Worker u8 *ap_mld_id);
229*03f9172cSAndroid Build Coastguard Worker u16 wpa_bss_parse_reconf_ml_element(struct wpa_supplicant *wpa_s,
230*03f9172cSAndroid Build Coastguard Worker struct wpa_bss *bss);
231*03f9172cSAndroid Build Coastguard Worker
232*03f9172cSAndroid Build Coastguard Worker const u8 * wpa_bss_get_rsne(struct wpa_supplicant *wpa_s,
233*03f9172cSAndroid Build Coastguard Worker const struct wpa_bss *bss, struct wpa_ssid *ssid,
234*03f9172cSAndroid Build Coastguard Worker bool mlo);
235*03f9172cSAndroid Build Coastguard Worker const u8 * wpa_bss_get_rsnxe(struct wpa_supplicant *wpa_s,
236*03f9172cSAndroid Build Coastguard Worker const struct wpa_bss *bss, struct wpa_ssid *ssid,
237*03f9172cSAndroid Build Coastguard Worker bool mlo);
238*03f9172cSAndroid Build Coastguard Worker
239*03f9172cSAndroid Build Coastguard Worker #endif /* BSS_H */
240