mirror of
https://github.com/vanhoefm/fragattacks.git
synced 2024-11-25 00:38:24 -05:00
Ask driver to report only new scan results if requested
If the BSS table within wpa_supplicant is flushed, request the driver to flush its own scan result table during the next scan. This can avoid unexpected old BSS entries showing up after BSS_FLUSH or FLUSH command in cases where the driver may maintain its internal cache of scan results (e.g., cfg80211 BSS table persists at least for 15 seconds). In addition to doing this automatically on BSS_FLUSH/FLUSH, a new SCAN command argument, only_new=1, can be used to request a manual scan request to do same. Though, it should be noted that this maintains the BSS table within wpa_supplicant. BSS_FLUSH followed by SCAN command can be used to clear all BSS entries from both the driver and wpa_supplicant. Signed-hostap: Jouni Malinen <j@w1.fi>
This commit is contained in:
parent
a1a31b6c3f
commit
949938aadf
@ -340,6 +340,15 @@ struct wpa_driver_scan_params {
|
|||||||
* and not to transmit the frames at any of those rates.
|
* and not to transmit the frames at any of those rates.
|
||||||
*/
|
*/
|
||||||
u8 p2p_probe;
|
u8 p2p_probe;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* only_new_results - Request driver to report only new results
|
||||||
|
*
|
||||||
|
* This is used to request the driver to report only BSSes that have
|
||||||
|
* been detected after this scan request has been started, i.e., to
|
||||||
|
* flush old cached BSS entries.
|
||||||
|
*/
|
||||||
|
int only_new_results;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -4679,6 +4679,12 @@ nl80211_scan_common(struct wpa_driver_nl80211_data *drv, u8 cmd,
|
|||||||
params->filter_ssids = NULL;
|
params->filter_ssids = NULL;
|
||||||
drv->num_filter_ssids = params->num_filter_ssids;
|
drv->num_filter_ssids = params->num_filter_ssids;
|
||||||
|
|
||||||
|
if (params->only_new_results) {
|
||||||
|
wpa_printf(MSG_DEBUG, "nl80211: Add NL80211_SCAN_FLAG_FLUSH");
|
||||||
|
NLA_PUT_U32(msg, NL80211_ATTR_SCAN_FLAGS,
|
||||||
|
NL80211_SCAN_FLAG_FLUSH);
|
||||||
|
}
|
||||||
|
|
||||||
return msg;
|
return msg;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
@ -820,6 +820,8 @@ void wpa_bss_flush(struct wpa_supplicant *wpa_s)
|
|||||||
{
|
{
|
||||||
struct wpa_bss *bss, *n;
|
struct wpa_bss *bss, *n;
|
||||||
|
|
||||||
|
wpa_s->clear_driver_scan_cache = 1;
|
||||||
|
|
||||||
if (wpa_s->bss.next == NULL)
|
if (wpa_s->bss.next == NULL)
|
||||||
return; /* BSS table not yet initialized */
|
return; /* BSS table not yet initialized */
|
||||||
|
|
||||||
|
@ -5278,6 +5278,7 @@ static void wpas_ctrl_scan(struct wpa_supplicant *wpa_s, char *params,
|
|||||||
|
|
||||||
wpa_s->manual_scan_passive = 0;
|
wpa_s->manual_scan_passive = 0;
|
||||||
wpa_s->manual_scan_use_id = 0;
|
wpa_s->manual_scan_use_id = 0;
|
||||||
|
wpa_s->manual_scan_only_new = 0;
|
||||||
|
|
||||||
if (params) {
|
if (params) {
|
||||||
if (os_strncasecmp(params, "TYPE=ONLY", 9) == 0)
|
if (os_strncasecmp(params, "TYPE=ONLY", 9) == 0)
|
||||||
@ -5296,6 +5297,10 @@ static void wpas_ctrl_scan(struct wpa_supplicant *wpa_s, char *params,
|
|||||||
pos = os_strstr(params, "use_id=");
|
pos = os_strstr(params, "use_id=");
|
||||||
if (pos)
|
if (pos)
|
||||||
wpa_s->manual_scan_use_id = atoi(pos + 7);
|
wpa_s->manual_scan_use_id = atoi(pos + 7);
|
||||||
|
|
||||||
|
pos = os_strstr(params, "only_new=1");
|
||||||
|
if (pos)
|
||||||
|
wpa_s->manual_scan_only_new = 1;
|
||||||
} else {
|
} else {
|
||||||
os_free(wpa_s->manual_scan_freqs);
|
os_free(wpa_s->manual_scan_freqs);
|
||||||
wpa_s->manual_scan_freqs = NULL;
|
wpa_s->manual_scan_freqs = NULL;
|
||||||
|
@ -155,6 +155,8 @@ int wpa_supplicant_trigger_scan(struct wpa_supplicant *wpa_s,
|
|||||||
|
|
||||||
wpa_supplicant_notify_scanning(wpa_s, 1);
|
wpa_supplicant_notify_scanning(wpa_s, 1);
|
||||||
|
|
||||||
|
if (wpa_s->clear_driver_scan_cache)
|
||||||
|
params->only_new_results = 1;
|
||||||
ret = wpa_drv_scan(wpa_s, params);
|
ret = wpa_drv_scan(wpa_s, params);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
wpa_supplicant_notify_scanning(wpa_s, 0);
|
wpa_supplicant_notify_scanning(wpa_s, 0);
|
||||||
@ -164,6 +166,7 @@ int wpa_supplicant_trigger_scan(struct wpa_supplicant *wpa_s,
|
|||||||
wpa_s->scan_runs++;
|
wpa_s->scan_runs++;
|
||||||
wpa_s->normal_scans++;
|
wpa_s->normal_scans++;
|
||||||
wpa_s->own_scan_requested = 1;
|
wpa_s->own_scan_requested = 1;
|
||||||
|
params->only_new_results = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -727,6 +730,10 @@ ssid_list_set:
|
|||||||
wpa_supplicant_optimize_freqs(wpa_s, ¶ms);
|
wpa_supplicant_optimize_freqs(wpa_s, ¶ms);
|
||||||
extra_ie = wpa_supplicant_extra_ies(wpa_s);
|
extra_ie = wpa_supplicant_extra_ies(wpa_s);
|
||||||
|
|
||||||
|
if (wpa_s->last_scan_req == MANUAL_SCAN_REQ &&
|
||||||
|
wpa_s->manual_scan_only_new)
|
||||||
|
params.only_new_results = 1;
|
||||||
|
|
||||||
if (wpa_s->last_scan_req == MANUAL_SCAN_REQ && params.freqs == NULL &&
|
if (wpa_s->last_scan_req == MANUAL_SCAN_REQ && params.freqs == NULL &&
|
||||||
wpa_s->manual_scan_freqs) {
|
wpa_s->manual_scan_freqs) {
|
||||||
wpa_dbg(wpa_s, MSG_DEBUG, "Limit manual scan to specified channels");
|
wpa_dbg(wpa_s, MSG_DEBUG, "Limit manual scan to specified channels");
|
||||||
|
@ -484,9 +484,11 @@ struct wpa_supplicant {
|
|||||||
int *manual_scan_freqs;
|
int *manual_scan_freqs;
|
||||||
unsigned int manual_scan_passive:1;
|
unsigned int manual_scan_passive:1;
|
||||||
unsigned int manual_scan_use_id:1;
|
unsigned int manual_scan_use_id:1;
|
||||||
|
unsigned int manual_scan_only_new:1;
|
||||||
unsigned int own_scan_requested:1;
|
unsigned int own_scan_requested:1;
|
||||||
unsigned int own_scan_running:1;
|
unsigned int own_scan_running:1;
|
||||||
unsigned int external_scan_running:1;
|
unsigned int external_scan_running:1;
|
||||||
|
unsigned int clear_driver_scan_cache:1;
|
||||||
unsigned int manual_scan_id;
|
unsigned int manual_scan_id;
|
||||||
int scan_interval; /* time in sec between scans to find suitable AP */
|
int scan_interval; /* time in sec between scans to find suitable AP */
|
||||||
int normal_scans; /* normal scans run before sched_scan */
|
int normal_scans; /* normal scans run before sched_scan */
|
||||||
|
Loading…
Reference in New Issue
Block a user