From 31a856a127706c5047038ab0c7c5a07054432ebf Mon Sep 17 00:00:00 2001 From: Masashi Honma Date: Tue, 4 Apr 2017 07:28:35 +0900 Subject: [PATCH] mesh: Make NL80211_MESHCONF_RSSI_THRESHOLD configurable In some practical cases, it is useful to suppress joining to node in the distance. The new field mesh_rssi_threshold could be used as RSSI threshold for joining. Signed-off-by: Masashi Honma --- src/drivers/driver.h | 2 ++ src/drivers/driver_nl80211.c | 5 ++++- wpa_supplicant/config.c | 2 ++ wpa_supplicant/config_file.c | 1 + wpa_supplicant/config_ssid.h | 10 ++++++++++ wpa_supplicant/mesh.c | 4 ++++ wpa_supplicant/wpa_cli.c | 2 +- 7 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/drivers/driver.h b/src/drivers/driver.h index 014c7b712..8103c28e4 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -1388,6 +1388,7 @@ struct wpa_driver_mesh_bss_params { #define WPA_DRIVER_MESH_CONF_FLAG_PEER_LINK_TIMEOUT 0x00000002 #define WPA_DRIVER_MESH_CONF_FLAG_MAX_PEER_LINKS 0x00000004 #define WPA_DRIVER_MESH_CONF_FLAG_HT_OP_MODE 0x00000008 +#define WPA_DRIVER_MESH_CONF_FLAG_RSSI_THRESHOLD 0x00000010 /* * TODO: Other mesh configuration parameters would go here. * See NL80211_MESHCONF_* for all the mesh config parameters. @@ -1396,6 +1397,7 @@ struct wpa_driver_mesh_bss_params { int auto_plinks; int peer_link_timeout; int max_peer_links; + int rssi_threshold; u16 ht_opmode; }; diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index 9f60504eb..af1cb843d 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -8870,7 +8870,10 @@ static int nl80211_put_mesh_config(struct nl_msg *msg, params->auto_plinks)) || ((params->flags & WPA_DRIVER_MESH_CONF_FLAG_MAX_PEER_LINKS) && nla_put_u16(msg, NL80211_MESHCONF_MAX_PEER_LINKS, - params->max_peer_links))) + params->max_peer_links)) || + ((params->flags & WPA_DRIVER_MESH_CONF_FLAG_RSSI_THRESHOLD) && + nla_put_u32(msg, NL80211_MESHCONF_RSSI_THRESHOLD, + params->rssi_threshold))) return -1; /* diff --git a/wpa_supplicant/config.c b/wpa_supplicant/config.c index 9ef11d86d..8a88a8dff 100644 --- a/wpa_supplicant/config.c +++ b/wpa_supplicant/config.c @@ -2107,6 +2107,7 @@ static const struct parse_data ssid_fields[] = { #ifdef CONFIG_MESH { INT_RANGE(mode, 0, 5) }, { INT_RANGE(no_auto_peer, 0, 1) }, + { INT_RANGE(mesh_rssi_threshold, -255, 1) }, #else /* CONFIG_MESH */ { INT_RANGE(mode, 0, 4) }, #endif /* CONFIG_MESH */ @@ -2639,6 +2640,7 @@ void wpa_config_set_network_defaults(struct wpa_ssid *ssid) ssid->dot11MeshRetryTimeout = DEFAULT_MESH_RETRY_TIMEOUT; ssid->dot11MeshConfirmTimeout = DEFAULT_MESH_CONFIRM_TIMEOUT; ssid->dot11MeshHoldingTimeout = DEFAULT_MESH_HOLDING_TIMEOUT; + ssid->mesh_rssi_threshold = DEFAULT_MESH_RSSI_THRESHOLD; #endif /* CONFIG_MESH */ #ifdef CONFIG_HT_OVERRIDES ssid->disable_ht = DEFAULT_DISABLE_HT; diff --git a/wpa_supplicant/config_file.c b/wpa_supplicant/config_file.c index 3a44c8a0d..7069b1624 100644 --- a/wpa_supplicant/config_file.c +++ b/wpa_supplicant/config_file.c @@ -783,6 +783,7 @@ static void wpa_config_write_network(FILE *f, struct wpa_ssid *ssid) #endif /* IEEE8021X_EAPOL */ INT(mode); INT(no_auto_peer); + INT_DEF(mesh_rssi_threshold, DEFAULT_MESH_RSSI_THRESHOLD); INT(frequency); INT(fixed_freq); #ifdef CONFIG_ACS diff --git a/wpa_supplicant/config_ssid.h b/wpa_supplicant/config_ssid.h index 869165c89..7153042f9 100644 --- a/wpa_supplicant/config_ssid.h +++ b/wpa_supplicant/config_ssid.h @@ -28,6 +28,7 @@ #define DEFAULT_MESH_RETRY_TIMEOUT 40 #define DEFAULT_MESH_CONFIRM_TIMEOUT 40 #define DEFAULT_MESH_HOLDING_TIMEOUT 40 +#define DEFAULT_MESH_RSSI_THRESHOLD 1 /* no change */ #define DEFAULT_DISABLE_HT 0 #define DEFAULT_DISABLE_HT40 0 #define DEFAULT_DISABLE_SGI 0 @@ -807,6 +808,15 @@ struct wpa_ssid { */ int no_auto_peer; + /** + * mesh_rssi_threshold - Set mesh parameter mesh_rssi_threshold (dBm) + * + * -255..-1 = threshold value in dBm + * 0 = not using RSSI threshold + * 1 = do not change driver default + */ + int mesh_rssi_threshold; + /** * wps_disabled - WPS disabled in AP mode * diff --git a/wpa_supplicant/mesh.c b/wpa_supplicant/mesh.c index 01b657e33..c0c8f9131 100644 --- a/wpa_supplicant/mesh.c +++ b/wpa_supplicant/mesh.c @@ -413,6 +413,10 @@ int wpa_supplicant_join_mesh(struct wpa_supplicant *wpa_s, else if (wpa_s->conf->dtim_period > 0) params.dtim_period = wpa_s->conf->dtim_period; params.conf.max_peer_links = wpa_s->conf->max_peer_links; + if (ssid->mesh_rssi_threshold < DEFAULT_MESH_RSSI_THRESHOLD) { + params.conf.rssi_threshold = ssid->mesh_rssi_threshold; + params.conf.flags |= WPA_DRIVER_MESH_CONF_FLAG_RSSI_THRESHOLD; + } if (ssid->key_mgmt & WPA_KEY_MGMT_SAE) { params.flags |= WPA_DRIVER_MESH_FLAG_SAE_AUTH; diff --git a/wpa_supplicant/wpa_cli.c b/wpa_supplicant/wpa_cli.c index c5091b5de..8278bd2f0 100644 --- a/wpa_supplicant/wpa_cli.c +++ b/wpa_supplicant/wpa_cli.c @@ -1392,7 +1392,7 @@ static const char *network_fields[] = { "eap_workaround", "pac_file", "fragment_size", "ocsp", #endif /* IEEE8021X_EAPOL */ #ifdef CONFIG_MESH - "mode", "no_auto_peer", + "mode", "no_auto_peer", "mesh_rssi_threshold", #else /* CONFIG_MESH */ "mode", #endif /* CONFIG_MESH */