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