Add support to sched scan to report relatively better BSSs

Add support to set sched scan relative RSSI parameters so that the
drivers can report BSSs after relative comparision with the current
connected BSS. This feature is applicable only when in connected mode.

The below commands can be used to configure relative RSSI parameters
SET relative_rssi <disable|rssi_value>
	disable - to disable the feature
	rssi_value - amount of relative RSSI in dB
SET relative_band_adjust <band:adjust_value>
	band - "2G" or "5G" for 2.4 GHz or 5 GHz respectively
	adjust_value - amount of RSSI to be adjusted in dB

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
vamsi krishna 2016-11-15 15:12:44 +05:30 committed by Jouni Malinen
parent 20c846d9ee
commit 57c3a605ce
4 changed files with 113 additions and 0 deletions

View file

@ -339,6 +339,53 @@ static int wpas_ctrl_iface_set_lci(struct wpa_supplicant *wpa_s,
}
static int
wpas_ctrl_set_relative_rssi(struct wpa_supplicant *wpa_s, const char *cmd)
{
int relative_rssi;
if (os_strcmp(cmd, "disable") == 0) {
wpa_s->srp.relative_rssi_set = 0;
return 0;
}
relative_rssi = atoi(cmd);
if (relative_rssi < 0 || relative_rssi > 100)
return -1;
wpa_s->srp.relative_rssi = relative_rssi;
wpa_s->srp.relative_rssi_set = 1;
return 0;
}
static int wpas_ctrl_set_relative_band_adjust(struct wpa_supplicant *wpa_s,
const char *cmd)
{
char *pos;
int adjust_rssi;
/* <band>:adjust_value */
pos = os_strchr(cmd, ':');
if (!pos)
return -1;
pos++;
adjust_rssi = atoi(pos);
if (adjust_rssi < -100 || adjust_rssi > 100)
return -1;
if (os_strncmp(cmd, "2G", 2) == 0)
wpa_s->srp.relative_adjust_band = WPA_SETBAND_2G;
else if (os_strncmp(cmd, "5G", 2) == 0)
wpa_s->srp.relative_adjust_band = WPA_SETBAND_5G;
else
return -1;
wpa_s->srp.relative_adjust_rssi = adjust_rssi;
return 0;
}
static int wpa_supplicant_ctrl_iface_set(struct wpa_supplicant *wpa_s,
char *cmd)
{
@ -551,6 +598,10 @@ static int wpa_supplicant_ctrl_iface_set(struct wpa_supplicant *wpa_s,
ret = wpas_ctrl_iface_set_lci(wpa_s, value);
} else if (os_strcasecmp(cmd, "tdls_trigger_control") == 0) {
ret = wpa_drv_set_tdls_mode(wpa_s, atoi(value));
} else if (os_strcasecmp(cmd, "relative_rssi") == 0) {
ret = wpas_ctrl_set_relative_rssi(wpa_s, value);
} else if (os_strcasecmp(cmd, "relative_band_adjust") == 0) {
ret = wpas_ctrl_set_relative_band_adjust(wpa_s, value);
} else {
value[-1] = '=';
ret = wpa_config_process_global(wpa_s->conf, cmd, -1);

View file

@ -1249,6 +1249,26 @@ int wpa_supplicant_delayed_sched_scan(struct wpa_supplicant *wpa_s,
}
static void
wpa_scan_set_relative_rssi_params(struct wpa_supplicant *wpa_s,
struct wpa_driver_scan_params *params)
{
if (wpa_s->wpa_state != WPA_COMPLETED ||
!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_SCHED_SCAN_RELATIVE_RSSI) ||
wpa_s->srp.relative_rssi_set == 0)
return;
params->relative_rssi_set = 1;
params->relative_rssi = wpa_s->srp.relative_rssi;
if (wpa_s->srp.relative_adjust_rssi == 0)
return;
params->relative_adjust_band = wpa_s->srp.relative_adjust_band;
params->relative_adjust_rssi = wpa_s->srp.relative_adjust_rssi;
}
/**
* wpa_supplicant_req_sched_scan - Start a periodic scheduled scan
* @wpa_s: Pointer to wpa_supplicant data
@ -1503,6 +1523,8 @@ scan:
}
}
wpa_scan_set_relative_rssi_params(wpa_s, scan_params);
ret = wpa_supplicant_start_sched_scan(wpa_s, scan_params);
wpabuf_free(extra_ie);
os_free(params.filter_ssids);
@ -2392,6 +2414,10 @@ wpa_scan_clone_params(const struct wpa_driver_scan_params *src)
params->bssid = bssid;
}
params->relative_rssi_set = src->relative_rssi_set;
params->relative_rssi = src->relative_rssi;
params->relative_adjust_band = src->relative_adjust_band;
params->relative_adjust_rssi = src->relative_adjust_rssi;
return params;
failed:
@ -2570,6 +2596,8 @@ int wpas_start_pno(struct wpa_supplicant *wpa_s)
}
}
wpa_scan_set_relative_rssi_params(wpa_s, &params);
ret = wpa_supplicant_start_sched_scan(wpa_s, &params);
os_free(params.filter_ssids);
if (ret == 0)

View file

@ -492,6 +492,7 @@ static char ** wpa_cli_complete_set(const char *str, int pos)
#ifdef CONFIG_TESTING_OPTIONS
"ignore_auth_resp",
#endif /* CONFIG_TESTING_OPTIONS */
"relative_rssi", "relative_band_adjust",
};
int i, num_fields = ARRAY_SIZE(fields);

View file

@ -1112,6 +1112,39 @@ struct wpa_supplicant {
/* FILS HLP requests (struct fils_hlp_req) */
struct dl_list fils_hlp_req;
struct sched_scan_relative_params {
/**
* relative_rssi_set - Enable relatively preferred BSS reporting
*
* 0 = Disable reporting relatively preferred BSSs
* 1 = Enable reporting relatively preferred BSSs
*/
int relative_rssi_set;
/**
* relative_rssi - Relative RSSI for reporting better BSSs
*
* Amount of RSSI by which a BSS should be better than the
* current connected BSS so that the new BSS can be reported
* to user space. This applies to sched_scan operations.
*/
int relative_rssi;
/**
* relative_adjust_band - Band in which RSSI is to be adjusted
*/
enum set_band relative_adjust_band;
/**
* relative_adjust_rssi - RSSI adjustment
*
* An amount of relative_adjust_rssi should be added to the
* BSSs that belong to the relative_adjust_band while comparing
* with other bands for BSS reporting.
*/
int relative_adjust_rssi;
} srp;
};