[v3,1/2] mesh: Make NL80211_MESHCONF_RSSI_THRESHOLD configurable

Submitted by Masashi Honma on April 3, 2017, 10:28 p.m.

Details

Message ID 1491258516-16663-1-git-send-email-masashi.honma@gmail.com
State New
Headers show

Commit Message

Masashi Honma April 3, 2017, 10:28 p.m.
On 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 <masashi.honma@gmail.com>
---
 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 | 8 ++++++++
 wpa_supplicant/mesh.c        | 4 ++++
 wpa_supplicant/wpa_cli.c     | 2 +-
 7 files changed, 22 insertions(+), 2 deletions(-)

Comments

Masashi Honma April 3, 2017, 10:31 p.m.
On 2017/04/04 07:28, Masashi Honma wrote:
> diff --git a/wpa_supplicant/config_ssid.h b/wpa_supplicant/config_ssid.h
> index 869165c..c6612d0 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

I'm using DEFAULT_MESH_RSSI_THRESHOLD=1.
Because the value 0 has special mean (not using RSSI threshold).

Masashi Honma.

Patch hide | download patch | download mbox

diff --git a/src/drivers/driver.h b/src/drivers/driver.h
index fc2593e..2c82f5e 100644
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -1288,6 +1288,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.
@@ -1296,6 +1297,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 bceeba2..801fd0e 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -8774,7 +8774,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 8bfb6a1..a116536 100644
--- a/wpa_supplicant/config.c
+++ b/wpa_supplicant/config.c
@@ -2066,6 +2066,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 */
@@ -2598,6 +2599,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 e8f1149..f6732e4 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(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 869165c..c6612d0 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,13 @@  struct wpa_ssid {
 	 */
 	int no_auto_peer;
 
+#ifdef CONFIG_MESH
+	/**
+	 * mesh_rssi_threshold - Set mesh parameter mesh_rssi_threshold(dBm)
+	 */
+	int mesh_rssi_threshold;
+#endif /* CONFIG_MESH */
+
 	/**
 	 * wps_disabled - WPS disabled in AP mode
 	 *
diff --git a/wpa_supplicant/mesh.c b/wpa_supplicant/mesh.c
index 01b657e..c0c8f91 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 c5091b5..8278bd2 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 */