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:
parent
20c846d9ee
commit
57c3a605ce
4 changed files with 113 additions and 0 deletions
|
@ -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);
|
||||
|
|
|
@ -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, ¶ms);
|
||||
|
||||
ret = wpa_supplicant_start_sched_scan(wpa_s, ¶ms);
|
||||
os_free(params.filter_ssids);
|
||||
if (ret == 0)
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue