1214501Srpaulo/* 2214501Srpaulo * BSS table 3214501Srpaulo * Copyright (c) 2009-2010, Jouni Malinen <j@w1.fi> 4214501Srpaulo * 5252726Srpaulo * This software may be distributed under the terms of the BSD license. 6252726Srpaulo * See README for more details. 7214501Srpaulo */ 8214501Srpaulo 9214501Srpaulo#ifndef BSS_H 10214501Srpaulo#define BSS_H 11214501Srpaulo 12214501Srpaulostruct wpa_scan_res; 13214501Srpaulo 14214501Srpaulo#define WPA_BSS_QUAL_INVALID BIT(0) 15214501Srpaulo#define WPA_BSS_NOISE_INVALID BIT(1) 16214501Srpaulo#define WPA_BSS_LEVEL_INVALID BIT(2) 17214501Srpaulo#define WPA_BSS_LEVEL_DBM BIT(3) 18214501Srpaulo#define WPA_BSS_AUTHENTICATED BIT(4) 19214501Srpaulo#define WPA_BSS_ASSOCIATED BIT(5) 20252726Srpaulo#define WPA_BSS_ANQP_FETCH_TRIED BIT(6) 21214501Srpaulo 22214501Srpaulo/** 23252726Srpaulo * struct wpa_bss_anqp - ANQP data for a BSS entry (struct wpa_bss) 24252726Srpaulo */ 25252726Srpaulostruct wpa_bss_anqp { 26252726Srpaulo /** Number of BSS entries referring to this ANQP data instance */ 27252726Srpaulo unsigned int users; 28252726Srpaulo#ifdef CONFIG_INTERWORKING 29252726Srpaulo struct wpabuf *venue_name; 30252726Srpaulo struct wpabuf *network_auth_type; 31252726Srpaulo struct wpabuf *roaming_consortium; 32252726Srpaulo struct wpabuf *ip_addr_type_availability; 33252726Srpaulo struct wpabuf *nai_realm; 34252726Srpaulo struct wpabuf *anqp_3gpp; 35252726Srpaulo struct wpabuf *domain_name; 36252726Srpaulo#endif /* CONFIG_INTERWORKING */ 37252726Srpaulo#ifdef CONFIG_HS20 38252726Srpaulo struct wpabuf *hs20_operator_friendly_name; 39252726Srpaulo struct wpabuf *hs20_wan_metrics; 40252726Srpaulo struct wpabuf *hs20_connection_capability; 41252726Srpaulo struct wpabuf *hs20_operating_class; 42252726Srpaulo#endif /* CONFIG_HS20 */ 43252726Srpaulo}; 44252726Srpaulo 45252726Srpaulo/** 46214501Srpaulo * struct wpa_bss - BSS table 47214501Srpaulo * 48214501Srpaulo * This structure is used to store information about neighboring BSSes in 49214501Srpaulo * generic format. It is mainly updated based on scan results from the driver. 50214501Srpaulo */ 51214501Srpaulostruct wpa_bss { 52252726Srpaulo /** List entry for struct wpa_supplicant::bss */ 53214501Srpaulo struct dl_list list; 54252726Srpaulo /** List entry for struct wpa_supplicant::bss_id */ 55214501Srpaulo struct dl_list list_id; 56252726Srpaulo /** Unique identifier for this BSS entry */ 57214501Srpaulo unsigned int id; 58252726Srpaulo /** Number of counts without seeing this BSS */ 59214501Srpaulo unsigned int scan_miss_count; 60252726Srpaulo /** Index of the last scan update */ 61214501Srpaulo unsigned int last_update_idx; 62252726Srpaulo /** Information flags about the BSS/IBSS (WPA_BSS_*) */ 63214501Srpaulo unsigned int flags; 64252726Srpaulo /** BSSID */ 65214501Srpaulo u8 bssid[ETH_ALEN]; 66252726Srpaulo /** HESSID */ 67252726Srpaulo u8 hessid[ETH_ALEN]; 68252726Srpaulo /** SSID */ 69214501Srpaulo u8 ssid[32]; 70252726Srpaulo /** Length of SSID */ 71214501Srpaulo size_t ssid_len; 72252726Srpaulo /** Frequency of the channel in MHz (e.g., 2412 = channel 1) */ 73214501Srpaulo int freq; 74252726Srpaulo /** Beacon interval in TUs (host byte order) */ 75214501Srpaulo u16 beacon_int; 76252726Srpaulo /** Capability information field in host byte order */ 77214501Srpaulo u16 caps; 78252726Srpaulo /** Signal quality */ 79214501Srpaulo int qual; 80252726Srpaulo /** Noise level */ 81214501Srpaulo int noise; 82252726Srpaulo /** Signal level */ 83214501Srpaulo int level; 84252726Srpaulo /** Timestamp of last Beacon/Probe Response frame */ 85214501Srpaulo u64 tsf; 86252726Srpaulo /** Time of the last update (i.e., Beacon or Probe Response RX) */ 87214501Srpaulo struct os_time last_update; 88252726Srpaulo /** ANQP data */ 89252726Srpaulo struct wpa_bss_anqp *anqp; 90252726Srpaulo /** Length of the following IE field in octets (from Probe Response) */ 91214501Srpaulo size_t ie_len; 92252726Srpaulo /** Length of the following Beacon IE field in octets */ 93214501Srpaulo size_t beacon_ie_len; 94214501Srpaulo /* followed by ie_len octets of IEs */ 95214501Srpaulo /* followed by beacon_ie_len octets of IEs */ 96214501Srpaulo}; 97214501Srpaulo 98214501Srpaulovoid wpa_bss_update_start(struct wpa_supplicant *wpa_s); 99214501Srpaulovoid wpa_bss_update_scan_res(struct wpa_supplicant *wpa_s, 100214501Srpaulo struct wpa_scan_res *res); 101214501Srpaulovoid wpa_bss_update_end(struct wpa_supplicant *wpa_s, struct scan_info *info, 102214501Srpaulo int new_scan); 103214501Srpauloint wpa_bss_init(struct wpa_supplicant *wpa_s); 104214501Srpaulovoid wpa_bss_deinit(struct wpa_supplicant *wpa_s); 105252726Srpaulovoid wpa_bss_flush(struct wpa_supplicant *wpa_s); 106252726Srpaulovoid wpa_bss_flush_by_age(struct wpa_supplicant *wpa_s, int age); 107214501Srpaulostruct wpa_bss * wpa_bss_get(struct wpa_supplicant *wpa_s, const u8 *bssid, 108214501Srpaulo const u8 *ssid, size_t ssid_len); 109214501Srpaulostruct wpa_bss * wpa_bss_get_bssid(struct wpa_supplicant *wpa_s, 110214501Srpaulo const u8 *bssid); 111252726Srpaulostruct wpa_bss * wpa_bss_get_p2p_dev_addr(struct wpa_supplicant *wpa_s, 112252726Srpaulo const u8 *dev_addr); 113214501Srpaulostruct wpa_bss * wpa_bss_get_id(struct wpa_supplicant *wpa_s, unsigned int id); 114214501Srpauloconst u8 * wpa_bss_get_ie(const struct wpa_bss *bss, u8 ie); 115214501Srpauloconst u8 * wpa_bss_get_vendor_ie(const struct wpa_bss *bss, u32 vendor_type); 116214501Srpaulostruct wpabuf * wpa_bss_get_vendor_ie_multi(const struct wpa_bss *bss, 117214501Srpaulo u32 vendor_type); 118252726Srpaulostruct wpabuf * wpa_bss_get_vendor_ie_multi_beacon(const struct wpa_bss *bss, 119252726Srpaulo u32 vendor_type); 120214501Srpauloint wpa_bss_get_max_rate(const struct wpa_bss *bss); 121214501Srpauloint wpa_bss_get_bit_rates(const struct wpa_bss *bss, u8 **rates); 122252726Srpaulostruct wpa_bss_anqp * wpa_bss_anqp_alloc(void); 123252726Srpauloint wpa_bss_anqp_unshare_alloc(struct wpa_bss *bss); 124214501Srpaulo 125214501Srpaulo#endif /* BSS_H */ 126