]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
Add support to sched scan to report relatively better BSSs
authorvamsi krishna <vamsin@qti.qualcomm.com>
Tue, 15 Nov 2016 09:42:44 +0000 (15:12 +0530)
committerJouni Malinen <j@w1.fi>
Fri, 10 Feb 2017 17:48:12 +0000 (19:48 +0200)
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>
wpa_supplicant/ctrl_iface.c
wpa_supplicant/scan.c
wpa_supplicant/wpa_cli.c
wpa_supplicant/wpa_supplicant_i.h

index fc5955bc1a7f392c66b5445e4a4dc27b13992d36..295e50fa8ffad017d8a03eeffc143026ed4ac1da 100644 (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);
index 6eb5e052288039607c24e8855db888a108443312..6099a36c5a14e7e69c9c043a13f04c48b9f8d46f 100644 (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)
index 538d5ccdc2ec3013da52dd78ef6858f0e8641ac8..964311c55773b810b2d9103e922d25cf6e97750f 100644 (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);
 
index cb6484783aad060f7d8dcafcdae5f91e4a78a75b..b873f47260a8fffe033b068196c75ce1b166854e 100644 (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;
 };