Add Doxygen documentation for functionality related to scanning

Signed-hostap: Jouni Malinen <j@w1.fi>
This commit is contained in:
Jouni Malinen 2012-12-27 12:29:05 +02:00
parent e28c226df0
commit 2c09af3068
4 changed files with 274 additions and 21 deletions

View File

@ -1278,7 +1278,7 @@ INCLUDE_FILE_PATTERNS =
# undefined via #undef or recursively expanded use the := operator # undefined via #undef or recursively expanded use the := operator
# instead of the = operator. # instead of the = operator.
PREDEFINED = IEEE8021X_EAPOL CONFIG_CTRL_IFACE PREDEFINED = IEEE8021X_EAPOL CONFIG_CTRL_IFACE CONFIG_P2P
# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
# this tag can be used to specify a list of macro names that should be expanded. # this tag can be used to specify a list of macro names that should be expanded.

View File

@ -1,6 +1,6 @@
/* /*
* BSS table * BSS table
* Copyright (c) 2009-2010, Jouni Malinen <j@w1.fi> * Copyright (c) 2009-2012, Jouni Malinen <j@w1.fi>
* *
* This software may be distributed under the terms of the BSD license. * This software may be distributed under the terms of the BSD license.
* See README for more details. * See README for more details.
@ -51,6 +51,14 @@ static void wpa_bss_set_hessid(struct wpa_bss *bss)
} }
/**
* wpa_bss_anqp_alloc - Allocate ANQP data structure for a BSS entry
* Returns: Allocated ANQP data structure or %NULL on failure
*
* The allocated ANQP data structure has its users count set to 1. It may be
* shared by multiple BSS entries and each shared entry is freed with
* wpa_bss_anqp_free().
*/
struct wpa_bss_anqp * wpa_bss_anqp_alloc(void) struct wpa_bss_anqp * wpa_bss_anqp_alloc(void)
{ {
struct wpa_bss_anqp *anqp; struct wpa_bss_anqp *anqp;
@ -62,6 +70,11 @@ struct wpa_bss_anqp * wpa_bss_anqp_alloc(void)
} }
/**
* wpa_bss_anqp_clone - Clone an ANQP data structure
* @anqp: ANQP data structure from wpa_bss_anqp_alloc()
* Returns: Cloned ANQP data structure or %NULL on failure
*/
static struct wpa_bss_anqp * wpa_bss_anqp_clone(struct wpa_bss_anqp *anqp) static struct wpa_bss_anqp * wpa_bss_anqp_clone(struct wpa_bss_anqp *anqp)
{ {
struct wpa_bss_anqp *n; struct wpa_bss_anqp *n;
@ -92,6 +105,14 @@ static struct wpa_bss_anqp * wpa_bss_anqp_clone(struct wpa_bss_anqp *anqp)
} }
/**
* wpa_bss_anqp_unshare_alloc - Unshare ANQP data (if shared) in a BSS entry
* @bss: BSS entry
* Returns: 0 on success, -1 on failure
*
* This function ensures the specific BSS entry has an ANQP data structure that
* is not shared with any other BSS entry.
*/
int wpa_bss_anqp_unshare_alloc(struct wpa_bss *bss) int wpa_bss_anqp_unshare_alloc(struct wpa_bss *bss)
{ {
struct wpa_bss_anqp *anqp; struct wpa_bss_anqp *anqp;
@ -116,6 +137,10 @@ int wpa_bss_anqp_unshare_alloc(struct wpa_bss *bss)
} }
/**
* wpa_bss_anqp_free - Free an ANQP data structure
* @anqp: ANQP data structure from wpa_bss_anqp_alloc() or wpa_bss_anqp_clone()
*/
static void wpa_bss_anqp_free(struct wpa_bss_anqp *anqp) static void wpa_bss_anqp_free(struct wpa_bss_anqp *anqp)
{ {
if (anqp == NULL) if (anqp == NULL)
@ -175,6 +200,14 @@ static void wpa_bss_remove(struct wpa_supplicant *wpa_s, struct wpa_bss *bss,
} }
/**
* wpa_bss_get - Fetch a BSS table entry based on BSSID and SSID
* @wpa_s: Pointer to wpa_supplicant data
* @bssid: BSSID
* @ssid: SSID
* @ssid_len: Length of @ssid
* Returns: Pointer to the BSS entry or %NULL if not found
*/
struct wpa_bss * wpa_bss_get(struct wpa_supplicant *wpa_s, const u8 *bssid, struct wpa_bss * wpa_bss_get(struct wpa_supplicant *wpa_s, const u8 *bssid,
const u8 *ssid, size_t ssid_len) const u8 *ssid, size_t ssid_len)
{ {
@ -496,6 +529,15 @@ wpa_bss_update(struct wpa_supplicant *wpa_s, struct wpa_bss *bss,
} }
/**
* wpa_bss_update_start - Start a BSS table update from scan results
* @wpa_s: Pointer to wpa_supplicant data
*
* This function is called at the start of each BSS table update round for new
* scan results. The actual scan result entries are indicated with calls to
* wpa_bss_update_scan_res() and the update round is finished with a call to
* wpa_bss_update_end().
*/
void wpa_bss_update_start(struct wpa_supplicant *wpa_s) void wpa_bss_update_start(struct wpa_supplicant *wpa_s)
{ {
wpa_s->bss_update_idx++; wpa_s->bss_update_idx++;
@ -505,6 +547,15 @@ void wpa_bss_update_start(struct wpa_supplicant *wpa_s)
} }
/**
* wpa_bss_update_scan_res - Update a BSS table entry based on a scan result
* @wpa_s: Pointer to wpa_supplicant data
* @res: Scan result
*
* This function updates a BSS table entry (or adds one) based on a scan result.
* This is called separately for each scan result between the calls to
* wpa_bss_update_start() and wpa_bss_update_end().
*/
void wpa_bss_update_scan_res(struct wpa_supplicant *wpa_s, void wpa_bss_update_scan_res(struct wpa_supplicant *wpa_s,
struct wpa_scan_res *res) struct wpa_scan_res *res)
{ {
@ -610,6 +661,16 @@ static int wpa_bss_included_in_scan(const struct wpa_bss *bss,
} }
/**
* wpa_bss_update_end - End a BSS table update from scan results
* @wpa_s: Pointer to wpa_supplicant data
* @info: Information about scan parameters
* @new_scan: Whether this update round was based on a new scan
*
* This function is called at the end of each BSS table update round for new
* scan results. The start of the update was indicated with a call to
* wpa_bss_update_start().
*/
void wpa_bss_update_end(struct wpa_supplicant *wpa_s, struct scan_info *info, void wpa_bss_update_end(struct wpa_supplicant *wpa_s, struct scan_info *info,
int new_scan) int new_scan)
{ {
@ -655,6 +716,13 @@ void wpa_bss_update_end(struct wpa_supplicant *wpa_s, struct scan_info *info,
} }
/**
* wpa_bss_flush_by_age - Flush old BSS entries
* @wpa_s: Pointer to wpa_supplicant data
* @age: Maximum entry age in seconds
*
* Remove BSS entries that have not been updated during the last @age seconds.
*/
void wpa_bss_flush_by_age(struct wpa_supplicant *wpa_s, int age) void wpa_bss_flush_by_age(struct wpa_supplicant *wpa_s, int age)
{ {
struct wpa_bss *bss, *n; struct wpa_bss *bss, *n;
@ -688,6 +756,14 @@ static void wpa_bss_timeout(void *eloop_ctx, void *timeout_ctx)
} }
/**
* wpa_bss_init - Initialize BSS table
* @wpa_s: Pointer to wpa_supplicant data
* Returns: 0 on success, -1 on failure
*
* This prepares BSS table lists and timer for periodic updates. The BSS table
* is deinitialized with wpa_bss_deinit() once not needed anymore.
*/
int wpa_bss_init(struct wpa_supplicant *wpa_s) int wpa_bss_init(struct wpa_supplicant *wpa_s)
{ {
dl_list_init(&wpa_s->bss); dl_list_init(&wpa_s->bss);
@ -698,6 +774,10 @@ int wpa_bss_init(struct wpa_supplicant *wpa_s)
} }
/**
* wpa_bss_flush - Flush all unused BSS entries
* @wpa_s: Pointer to wpa_supplicant data
*/
void wpa_bss_flush(struct wpa_supplicant *wpa_s) void wpa_bss_flush(struct wpa_supplicant *wpa_s)
{ {
struct wpa_bss *bss, *n; struct wpa_bss *bss, *n;
@ -713,6 +793,10 @@ void wpa_bss_flush(struct wpa_supplicant *wpa_s)
} }
/**
* wpa_bss_deinit - Deinitialize BSS table
* @wpa_s: Pointer to wpa_supplicant data
*/
void wpa_bss_deinit(struct wpa_supplicant *wpa_s) void wpa_bss_deinit(struct wpa_supplicant *wpa_s)
{ {
eloop_cancel_timeout(wpa_bss_timeout, wpa_s, NULL); eloop_cancel_timeout(wpa_bss_timeout, wpa_s, NULL);
@ -720,6 +804,12 @@ void wpa_bss_deinit(struct wpa_supplicant *wpa_s)
} }
/**
* wpa_bss_get_bssid - Fetch a BSS table entry based on BSSID
* @wpa_s: Pointer to wpa_supplicant data
* @bssid: BSSID
* Returns: Pointer to the BSS entry or %NULL if not found
*/
struct wpa_bss * wpa_bss_get_bssid(struct wpa_supplicant *wpa_s, struct wpa_bss * wpa_bss_get_bssid(struct wpa_supplicant *wpa_s,
const u8 *bssid) const u8 *bssid)
{ {
@ -735,6 +825,12 @@ struct wpa_bss * wpa_bss_get_bssid(struct wpa_supplicant *wpa_s,
#ifdef CONFIG_P2P #ifdef CONFIG_P2P
/**
* wpa_bss_get_p2p_dev_addr - Fetch a BSS table entry based on P2P Device Addr
* @wpa_s: Pointer to wpa_supplicant data
* @dev_addr: P2P Device Address of the GO
* Returns: Pointer to the BSS entry or %NULL if not found
*/
struct wpa_bss * wpa_bss_get_p2p_dev_addr(struct wpa_supplicant *wpa_s, struct wpa_bss * wpa_bss_get_p2p_dev_addr(struct wpa_supplicant *wpa_s,
const u8 *dev_addr) const u8 *dev_addr)
{ {
@ -751,6 +847,12 @@ struct wpa_bss * wpa_bss_get_p2p_dev_addr(struct wpa_supplicant *wpa_s,
#endif /* CONFIG_P2P */ #endif /* CONFIG_P2P */
/**
* wpa_bss_get_id - Fetch a BSS table entry based on identifier
* @wpa_s: Pointer to wpa_supplicant data
* @id: Unique identifier (struct wpa_bss::id) assigned for the entry
* Returns: Pointer to the BSS entry or %NULL if not found
*/
struct wpa_bss * wpa_bss_get_id(struct wpa_supplicant *wpa_s, unsigned int id) struct wpa_bss * wpa_bss_get_id(struct wpa_supplicant *wpa_s, unsigned int id)
{ {
struct wpa_bss *bss; struct wpa_bss *bss;
@ -762,6 +864,15 @@ struct wpa_bss * wpa_bss_get_id(struct wpa_supplicant *wpa_s, unsigned int id)
} }
/**
* wpa_bss_get_ie - Fetch a specified information element from a BSS entry
* @bss: BSS table entry
* @ie: Information element identitifier (WLAN_EID_*)
* Returns: Pointer to the information element (id field) or %NULL if not found
*
* This function returns the first matching information element in the BSS
* entry.
*/
const u8 * wpa_bss_get_ie(const struct wpa_bss *bss, u8 ie) const u8 * wpa_bss_get_ie(const struct wpa_bss *bss, u8 ie)
{ {
const u8 *end, *pos; const u8 *end, *pos;
@ -781,6 +892,15 @@ const u8 * wpa_bss_get_ie(const struct wpa_bss *bss, u8 ie)
} }
/**
* wpa_bss_get_vendor_ie - Fetch a vendor information element from a BSS entry
* @bss: BSS table entry
* @vendor_type: Vendor type (four octets starting the IE payload)
* Returns: Pointer to the information element (id field) or %NULL if not found
*
* This function returns the first matching information element in the BSS
* entry.
*/
const u8 * wpa_bss_get_vendor_ie(const struct wpa_bss *bss, u32 vendor_type) const u8 * wpa_bss_get_vendor_ie(const struct wpa_bss *bss, u32 vendor_type)
{ {
const u8 *end, *pos; const u8 *end, *pos;
@ -801,6 +921,16 @@ const u8 * wpa_bss_get_vendor_ie(const struct wpa_bss *bss, u32 vendor_type)
} }
/**
* wpa_bss_get_vendor_ie_multi - Fetch vendor IE data from a BSS entry
* @bss: BSS table entry
* @vendor_type: Vendor type (four octets starting the IE payload)
* Returns: Pointer to the information element payload or %NULL if not found
*
* This function returns concatenated payload of possibly fragmented vendor
* specific information elements in the BSS entry. The caller is responsible for
* freeing the returned buffer.
*/
struct wpabuf * wpa_bss_get_vendor_ie_multi(const struct wpa_bss *bss, struct wpabuf * wpa_bss_get_vendor_ie_multi(const struct wpa_bss *bss,
u32 vendor_type) u32 vendor_type)
{ {
@ -832,6 +962,19 @@ struct wpabuf * wpa_bss_get_vendor_ie_multi(const struct wpa_bss *bss,
} }
/**
* wpa_bss_get_vendor_ie_multi_beacon - Fetch vendor IE data from a BSS entry
* @bss: BSS table entry
* @vendor_type: Vendor type (four octets starting the IE payload)
* Returns: Pointer to the information element payload or %NULL if not found
*
* This function returns concatenated payload of possibly fragmented vendor
* specific information elements in the BSS entry. The caller is responsible for
* freeing the returned buffer.
*
* This function is like wpa_bss_get_vendor_ie_multi(), but uses IE buffer only
* from Beacon frames instead of either Beacon or Probe Response frames.
*/
struct wpabuf * wpa_bss_get_vendor_ie_multi_beacon(const struct wpa_bss *bss, struct wpabuf * wpa_bss_get_vendor_ie_multi_beacon(const struct wpa_bss *bss,
u32 vendor_type) u32 vendor_type)
{ {
@ -864,6 +1007,11 @@ struct wpabuf * wpa_bss_get_vendor_ie_multi_beacon(const struct wpa_bss *bss,
} }
/**
* wpa_bss_get_max_rate - Get maximum legacy TX rate supported in a BSS
* @bss: BSS table entry
* Returns: Maximum legacy rate in units of 500 kbps
*/
int wpa_bss_get_max_rate(const struct wpa_bss *bss) int wpa_bss_get_max_rate(const struct wpa_bss *bss)
{ {
int rate = 0; int rate = 0;
@ -886,6 +1034,15 @@ int wpa_bss_get_max_rate(const struct wpa_bss *bss)
} }
/**
* wpa_bss_get_bit_rates - Get legacy TX rates supported in a BSS
* @bss: BSS table entry
* @rates: Buffer for returning a pointer to the rates list (units of 500 kbps)
* Returns: number of legacy TX rates or -1 on failure
*
* The caller is responsible for freeing the returned buffer with os_free() in
* case of success.
*/
int wpa_bss_get_bit_rates(const struct wpa_bss *bss, u8 **rates) int wpa_bss_get_bit_rates(const struct wpa_bss *bss, u8 **rates)
{ {
const u8 *ie, *ie2; const u8 *ie, *ie2;

View File

@ -19,7 +19,11 @@ struct wpa_scan_res;
#define WPA_BSS_ASSOCIATED BIT(5) #define WPA_BSS_ASSOCIATED BIT(5)
#define WPA_BSS_ANQP_FETCH_TRIED BIT(6) #define WPA_BSS_ANQP_FETCH_TRIED BIT(6)
/**
* struct wpa_bss_anqp - ANQP data for a BSS entry (struct wpa_bss)
*/
struct wpa_bss_anqp { struct wpa_bss_anqp {
/** Number of BSS entries referring to this ANQP data instance */
unsigned int users; unsigned int users;
#ifdef CONFIG_INTERWORKING #ifdef CONFIG_INTERWORKING
struct wpabuf *venue_name; struct wpabuf *venue_name;
@ -40,49 +44,52 @@ struct wpa_bss_anqp {
/** /**
* struct wpa_bss - BSS table * struct wpa_bss - BSS table
* @list: List entry for struct wpa_supplicant::bss
* @list_id: List entry for struct wpa_supplicant::bss_id
* @id: Unique identifier for this BSS entry
* @scan_miss_count: Number of counts without seeing this BSS
* @flags: information flags about the BSS/IBSS (WPA_BSS_*)
* @last_update_idx: Index of the last scan update
* @bssid: BSSID
* @hessid: HESSID
* @freq: frequency of the channel in MHz (e.g., 2412 = channel 1)
* @beacon_int: beacon interval in TUs (host byte order)
* @caps: capability information field in host byte order
* @qual: signal quality
* @noise: noise level
* @level: signal level
* @tsf: Timestamp of last Beacon/Probe Response frame
* @last_update: Time of the last update (i.e., Beacon or Probe Response RX)
* @ie_len: length of the following IE field in octets (from Probe Response)
* @beacon_ie_len: length of the following Beacon IE field in octets
* *
* This structure is used to store information about neighboring BSSes in * This structure is used to store information about neighboring BSSes in
* generic format. It is mainly updated based on scan results from the driver. * generic format. It is mainly updated based on scan results from the driver.
*/ */
struct wpa_bss { struct wpa_bss {
/** List entry for struct wpa_supplicant::bss */
struct dl_list list; struct dl_list list;
/** List entry for struct wpa_supplicant::bss_id */
struct dl_list list_id; struct dl_list list_id;
/** Unique identifier for this BSS entry */
unsigned int id; unsigned int id;
/** Number of counts without seeing this BSS */
unsigned int scan_miss_count; unsigned int scan_miss_count;
/** Index of the last scan update */
unsigned int last_update_idx; unsigned int last_update_idx;
/** Information flags about the BSS/IBSS (WPA_BSS_*) */
unsigned int flags; unsigned int flags;
/** BSSID */
u8 bssid[ETH_ALEN]; u8 bssid[ETH_ALEN];
/** HESSID */
u8 hessid[ETH_ALEN]; u8 hessid[ETH_ALEN];
/** SSID */
u8 ssid[32]; u8 ssid[32];
/** Length of SSID */
size_t ssid_len; size_t ssid_len;
/** Frequency of the channel in MHz (e.g., 2412 = channel 1) */
int freq; int freq;
/** Beacon interval in TUs (host byte order) */
u16 beacon_int; u16 beacon_int;
/** Capability information field in host byte order */
u16 caps; u16 caps;
/** Signal quality */
int qual; int qual;
/** Noise level */
int noise; int noise;
/** Signal level */
int level; int level;
/** Timestamp of last Beacon/Probe Response frame */
u64 tsf; u64 tsf;
/** Time of the last update (i.e., Beacon or Probe Response RX) */
struct os_time last_update; struct os_time last_update;
/** ANQP data */
struct wpa_bss_anqp *anqp; struct wpa_bss_anqp *anqp;
/** Length of the following IE field in octets (from Probe Response) */
size_t ie_len; size_t ie_len;
/** Length of the following Beacon IE field in octets */
size_t beacon_ie_len; size_t beacon_ie_len;
/* followed by ie_len octets of IEs */ /* followed by ie_len octets of IEs */
/* followed by beacon_ie_len octets of IEs */ /* followed by beacon_ie_len octets of IEs */

View File

@ -1,6 +1,6 @@
/* /*
* WPA Supplicant - Scanning * WPA Supplicant - Scanning
* Copyright (c) 2003-2010, Jouni Malinen <j@w1.fi> * Copyright (c) 2003-2012, Jouni Malinen <j@w1.fi>
* *
* This software may be distributed under the terms of the BSD license. * This software may be distributed under the terms of the BSD license.
* See README for more details. * See README for more details.
@ -81,6 +81,15 @@ static int wpas_wps_in_use(struct wpa_supplicant *wpa_s,
#endif /* CONFIG_WPS */ #endif /* CONFIG_WPS */
/**
* wpa_supplicant_enabled_networks - Check whether there are enabled networks
* @wpa_s: Pointer to wpa_supplicant data
* Returns: 0 if no networks are enabled, >0 if networks are enabled
*
* This function is used to figure out whether any networks (or Interworking
* with enabled credentials and auto_interworking) are present in the current
* configuration.
*/
int wpa_supplicant_enabled_networks(struct wpa_supplicant *wpa_s) int wpa_supplicant_enabled_networks(struct wpa_supplicant *wpa_s)
{ {
struct wpa_ssid *ssid = wpa_s->conf->ssid; struct wpa_ssid *ssid = wpa_s->conf->ssid;
@ -199,6 +208,12 @@ static void int_array_sort_unique(int *a)
} }
/**
* wpa_supplicant_trigger_scan - Request driver to start a scan
* @wpa_s: Pointer to wpa_supplicant data
* @params: Scan parameters
* Returns: 0 on success, -1 on failure
*/
int wpa_supplicant_trigger_scan(struct wpa_supplicant *wpa_s, int wpa_supplicant_trigger_scan(struct wpa_supplicant *wpa_s,
struct wpa_driver_scan_params *params) struct wpa_driver_scan_params *params)
{ {
@ -847,6 +862,7 @@ void wpa_supplicant_req_scan(struct wpa_supplicant *wpa_s, int sec, int usec)
* @wpa_s: Pointer to wpa_supplicant data * @wpa_s: Pointer to wpa_supplicant data
* @sec: Number of seconds after which to scan * @sec: Number of seconds after which to scan
* @usec: Number of microseconds after which to scan * @usec: Number of microseconds after which to scan
* Returns: 0 on success or -1 otherwise
* *
* This function is used to schedule periodic scans for neighboring * This function is used to schedule periodic scans for neighboring
* access points after the specified time. * access points after the specified time.
@ -868,6 +884,7 @@ int wpa_supplicant_delayed_sched_scan(struct wpa_supplicant *wpa_s,
/** /**
* wpa_supplicant_req_sched_scan - Start a periodic scheduled scan * wpa_supplicant_req_sched_scan - Start a periodic scheduled scan
* @wpa_s: Pointer to wpa_supplicant data * @wpa_s: Pointer to wpa_supplicant data
* Returns: 0 is sched_scan was started or -1 otherwise
* *
* This function is used to schedule periodic scans for neighboring * This function is used to schedule periodic scans for neighboring
* access points repeating the scan continuously. * access points repeating the scan continuously.
@ -1116,6 +1133,16 @@ void wpa_supplicant_cancel_sched_scan(struct wpa_supplicant *wpa_s)
} }
/**
* wpa_supplicant_notify_scanning - Indicate possible scan state change
* @wpa_s: Pointer to wpa_supplicant data
* @scanning: Whether scanning is currently in progress
*
* This function is to generate scanning notifycations. It is called whenever
* there may have been a change in scanning (scan started, completed, stopped).
* wpas_notify_scanning() is called whenever the scanning state changed from the
* previously notified state.
*/
void wpa_supplicant_notify_scanning(struct wpa_supplicant *wpa_s, void wpa_supplicant_notify_scanning(struct wpa_supplicant *wpa_s,
int scanning) int scanning)
{ {
@ -1148,6 +1175,15 @@ static int wpa_scan_get_max_rate(const struct wpa_scan_res *res)
} }
/**
* wpa_scan_get_ie - Fetch a specified information element from a scan result
* @res: Scan result entry
* @ie: Information element identitifier (WLAN_EID_*)
* Returns: Pointer to the information element (id field) or %NULL if not found
*
* This function returns the first matching information element in the scan
* result.
*/
const u8 * wpa_scan_get_ie(const struct wpa_scan_res *res, u8 ie) const u8 * wpa_scan_get_ie(const struct wpa_scan_res *res, u8 ie)
{ {
const u8 *end, *pos; const u8 *end, *pos;
@ -1167,6 +1203,15 @@ const u8 * wpa_scan_get_ie(const struct wpa_scan_res *res, u8 ie)
} }
/**
* wpa_scan_get_vendor_ie - Fetch vendor information element from a scan result
* @res: Scan result entry
* @vendor_type: Vendor type (four octets starting the IE payload)
* Returns: Pointer to the information element (id field) or %NULL if not found
*
* This function returns the first matching information element in the scan
* result.
*/
const u8 * wpa_scan_get_vendor_ie(const struct wpa_scan_res *res, const u8 * wpa_scan_get_vendor_ie(const struct wpa_scan_res *res,
u32 vendor_type) u32 vendor_type)
{ {
@ -1188,6 +1233,16 @@ const u8 * wpa_scan_get_vendor_ie(const struct wpa_scan_res *res,
} }
/**
* wpa_scan_get_vendor_ie_multi - Fetch vendor IE data from a scan result
* @res: Scan result entry
* @vendor_type: Vendor type (four octets starting the IE payload)
* Returns: Pointer to the information element payload or %NULL if not found
*
* This function returns concatenated payload of possibly fragmented vendor
* specific information elements in the scan result. The caller is responsible
* for freeing the returned buffer.
*/
struct wpabuf * wpa_scan_get_vendor_ie_multi(const struct wpa_scan_res *res, struct wpabuf * wpa_scan_get_vendor_ie_multi(const struct wpa_scan_res *res,
u32 vendor_type) u32 vendor_type)
{ {
@ -1219,6 +1274,19 @@ struct wpabuf * wpa_scan_get_vendor_ie_multi(const struct wpa_scan_res *res,
} }
/**
* wpa_scan_get_vendor_ie_multi_beacon - Fetch vendor IE data from a scan result
* @res: Scan result entry
* @vendor_type: Vendor type (four octets starting the IE payload)
* Returns: Pointer to the information element payload or %NULL if not found
*
* This function returns concatenated payload of possibly fragmented vendor
* specific information elements in the scan result. The caller is responsible
* for freeing the returned buffer.
*
* This function is like wpa_scan_get_vendor_ie_multi(), but uses IE buffer only
* from Beacon frames instead of either Beacon or Probe Response frames.
*/
struct wpabuf * wpa_scan_get_vendor_ie_multi_beacon( struct wpabuf * wpa_scan_get_vendor_ie_multi_beacon(
const struct wpa_scan_res *res, u32 vendor_type) const struct wpa_scan_res *res, u32 vendor_type)
{ {
@ -1416,6 +1484,15 @@ static void dump_scan_res(struct wpa_scan_results *scan_res)
} }
/**
* wpa_supplicant_filter_bssid_match - Is the specified BSSID allowed
* @wpa_s: Pointer to wpa_supplicant data
* @bssid: BSSID to check
* Returns: 0 if the BSSID is filtered or 1 if not
*
* This function is used to filter out specific BSSIDs from scan reslts mainly
* for testing purposes (SET bssid_filter ctrl_iface command).
*/
int wpa_supplicant_filter_bssid_match(struct wpa_supplicant *wpa_s, int wpa_supplicant_filter_bssid_match(struct wpa_supplicant *wpa_s,
const u8 *bssid) const u8 *bssid)
{ {
@ -1507,6 +1584,18 @@ wpa_supplicant_get_scan_results(struct wpa_supplicant *wpa_s,
} }
/**
* wpa_supplicant_update_scan_results - Update scan results from the driver
* @wpa_s: Pointer to wpa_supplicant data
* Returns: 0 on success, -1 on failure
*
* This function updates the BSS table within wpa_supplicant based on the
* currently available scan results from the driver without requesting a new
* scan. This is used in cases where the driver indicates an association
* (including roaming within ESS) and wpa_supplicant does not yet have the
* needed information to complete the connection (e.g., to perform validation
* steps in 4-way handshake).
*/
int wpa_supplicant_update_scan_results(struct wpa_supplicant *wpa_s) int wpa_supplicant_update_scan_results(struct wpa_supplicant *wpa_s)
{ {
struct wpa_scan_results *scan_res; struct wpa_scan_results *scan_res;