[OpenWrt-Devel] iwinfo: add BSS load element to scan result
diff mbox series

Message ID 20200131134503.10855-1-mail@david-bauer.net
State Accepted
Delegated to: David Bauer
Headers show
Series
  • [OpenWrt-Devel] iwinfo: add BSS load element to scan result
Related show

Commit Message

David Bauer Jan. 31, 2020, 1:45 p.m. UTC
This adds support for the BSS load information element. With this patch,
the BSS load information is visible when using the CLI as well as when
accessing scan results using the LUA binding.

Signed-off-by: David Bauer <mail@david-bauer.net>
---
 include/iwinfo.h       |  6 ++++++
 include/iwinfo/utils.h |  2 ++
 iwinfo_cli.c           | 11 ++++++++++-
 iwinfo_lua.c           | 12 ++++++++++++
 iwinfo_nl80211.c       |  4 ++++
 iwinfo_utils.c         |  8 ++++++++
 6 files changed, 42 insertions(+), 1 deletion(-)

Comments

Steve Brown Feb. 5, 2020, 1:48 p.m. UTC | #1
Hi David,

On Fri, 2020-01-31 at 14:45 +0100, David Bauer wrote:
> This adds support for the BSS load information element. With this
> patch,
> the BSS load information is visible when using the CLI as well as
> when
> accessing scan results using the LUA binding.
> 
> Signed-off-by: David Bauer <mail@david-bauer.net>
> ---
>  include/iwinfo.h       |  6 ++++++
>  include/iwinfo/utils.h |  2 ++
>  iwinfo_cli.c           | 11 ++++++++++-
>  iwinfo_lua.c           | 12 ++++++++++++
>  iwinfo_nl80211.c       |  4 ++++
>  iwinfo_utils.c         |  8 ++++++++
>  6 files changed, 42 insertions(+), 1 deletion(-)
> 
> diff --git a/include/iwinfo.h b/include/iwinfo.h
> index 5e64294..b07820d 100644
> --- a/include/iwinfo.h
> +++ b/include/iwinfo.h
> @@ -179,6 +179,12 @@ struct iwinfo_scanlist_entry {
>  	uint8_t quality;
>  	uint8_t quality_max;
>  	struct iwinfo_crypto_entry crypto;
> +
> +	/* BSS Load */
> +	uint8_t has_bss_load;
> +	uint8_t station_count;
> +	uint8_t channel_utilization;
> +	uint8_t admission_capacity;
>  };
>  
>  struct iwinfo_country_entry {
> diff --git a/include/iwinfo/utils.h b/include/iwinfo/utils.h
> index 98b9c89..a71bc9b 100644
> --- a/include/iwinfo/utils.h
> +++ b/include/iwinfo/utils.h
> @@ -53,6 +53,8 @@ struct iwinfo_hardware_entry *
> iwinfo_hardware(struct iwinfo_hardware_id *id);
>  
>  int iwinfo_hardware_id_from_mtd(struct iwinfo_hardware_id *id);
>  
> +void iwinfo_parse_bss_load(struct iwinfo_scanlist_entry *e, uint8_t
> *data);
> +
>  void iwinfo_parse_rsn(struct iwinfo_crypto_entry *c, uint8_t *data,
> uint8_t len,
>  					  uint8_t defcipher, uint8_t
> defauth);
>  
> diff --git a/iwinfo_cli.c b/iwinfo_cli.c
> index 0332bc2..5949004 100644
> --- a/iwinfo_cli.c
> +++ b/iwinfo_cli.c
> @@ -612,8 +612,17 @@ static void print_scanlist(const struct
> iwinfo_ops *iw, const char *ifname)
>  			format_signal(e->signal - 0x100),
>  			format_quality(e->quality),
>  			format_quality_max(e->quality_max));
> -		printf("          Encryption: %s\n\n",
> +		printf("          Encryption: %s\n",
>  			format_encryption(&e->crypto));
> +		if (e->has_bss_load) {
> +			printf("          Station count: %u\n",
> +				e->station_count);
> +			printf("          Channel utilization:
> %u/255\n",
> +				e->channel_utilization);
> +			printf("          Available admission capacity:
> %u (*32us)\n",
> +				e->admission_capacity);
> +		}
> +		printf("\n");
>  	}
>  }
>  
> diff --git a/iwinfo_lua.c b/iwinfo_lua.c
> index 58a5537..76160b6 100644
> --- a/iwinfo_lua.c
> +++ b/iwinfo_lua.c
> @@ -434,6 +434,18 @@ static int iwinfo_L_scanlist(lua_State *L, int
> (*func)(const char *, char *, int
>  			lua_pushnumber(L, (e->signal - 0x100));
>  			lua_setfield(L, -2, "signal");
>  
> +			/* BSS load */
> +			if (e->has_bss_load) {
> +				lua_pushnumber(L, e->station_count);
> +				lua_setfield(L, -2, "station_count");
> +
> +				lua_pushnumber(L, e-
> >channel_utilization);
> +				lua_setfield(L, -2,
> "channel_utilization");
> +
> +				lua_pushnumber(L, e-
> >admission_capacity);
> +				lua_setfield(L, -2,
> "admission_capacity");
> +			}
> +
>  			/* Crypto */
>  			iwinfo_L_cryptotable(L, &e->crypto);
>  			lua_setfield(L, -2, "encryption");
> diff --git a/iwinfo_nl80211.c b/iwinfo_nl80211.c
> index 2b2a043..7463fc7 100644
> --- a/iwinfo_nl80211.c
> +++ b/iwinfo_nl80211.c
> @@ -2296,6 +2296,10 @@ static void nl80211_get_scanlist_ie(struct
> nlattr **bss,
>  			}
>  			break;
>  
> +		case 11: /* BSS Load */
> +			iwinfo_parse_bss_load(e, ie + 2);
> +			break;
> +
>  		case 48: /* RSN */
>  			iwinfo_parse_rsn(&e->crypto, ie + 2, ie[1],
>  			                 IWINFO_CIPHER_CCMP,
> IWINFO_KMGMT_8021x);
> diff --git a/iwinfo_utils.c b/iwinfo_utils.c
> index b4f98a9..425492e 100644
> --- a/iwinfo_utils.c
> +++ b/iwinfo_utils.c
> @@ -324,6 +324,14 @@ static void iwinfo_parse_rsn_cipher(uint8_t idx,
> uint8_t *ciphers)
>  	}
>  }
>  
> +void iwinfo_parse_bss_load(struct iwinfo_scanlist_entry *e, uint8_t
> *data)
> +{
> +	e->has_bss_load = 1;
> +	e->station_count = ((data[1] << 8) | data[0]);
> +	e->channel_utilization = data[2];
> +	e->admission_capacity = ((data[4] << 8) | data[3]);
> +}
> +
>  void iwinfo_parse_rsn(struct iwinfo_crypto_entry *c, uint8_t *data,
> uint8_t len,
>  					  uint8_t defcipher, uint8_t
> defauth)
>  {

I get spurious scan results on my tplink a7v5. Reverting 96424c143,
restores normal operation.

Attached is a pdf of the scan panel.

Steve

Patch
diff mbox series

diff --git a/include/iwinfo.h b/include/iwinfo.h
index 5e64294..b07820d 100644
--- a/include/iwinfo.h
+++ b/include/iwinfo.h
@@ -179,6 +179,12 @@  struct iwinfo_scanlist_entry {
 	uint8_t quality;
 	uint8_t quality_max;
 	struct iwinfo_crypto_entry crypto;
+
+	/* BSS Load */
+	uint8_t has_bss_load;
+	uint8_t station_count;
+	uint8_t channel_utilization;
+	uint8_t admission_capacity;
 };
 
 struct iwinfo_country_entry {
diff --git a/include/iwinfo/utils.h b/include/iwinfo/utils.h
index 98b9c89..a71bc9b 100644
--- a/include/iwinfo/utils.h
+++ b/include/iwinfo/utils.h
@@ -53,6 +53,8 @@  struct iwinfo_hardware_entry * iwinfo_hardware(struct iwinfo_hardware_id *id);
 
 int iwinfo_hardware_id_from_mtd(struct iwinfo_hardware_id *id);
 
+void iwinfo_parse_bss_load(struct iwinfo_scanlist_entry *e, uint8_t *data);
+
 void iwinfo_parse_rsn(struct iwinfo_crypto_entry *c, uint8_t *data, uint8_t len,
 					  uint8_t defcipher, uint8_t defauth);
 
diff --git a/iwinfo_cli.c b/iwinfo_cli.c
index 0332bc2..5949004 100644
--- a/iwinfo_cli.c
+++ b/iwinfo_cli.c
@@ -612,8 +612,17 @@  static void print_scanlist(const struct iwinfo_ops *iw, const char *ifname)
 			format_signal(e->signal - 0x100),
 			format_quality(e->quality),
 			format_quality_max(e->quality_max));
-		printf("          Encryption: %s\n\n",
+		printf("          Encryption: %s\n",
 			format_encryption(&e->crypto));
+		if (e->has_bss_load) {
+			printf("          Station count: %u\n",
+				e->station_count);
+			printf("          Channel utilization: %u/255\n",
+				e->channel_utilization);
+			printf("          Available admission capacity: %u (*32us)\n",
+				e->admission_capacity);
+		}
+		printf("\n");
 	}
 }
 
diff --git a/iwinfo_lua.c b/iwinfo_lua.c
index 58a5537..76160b6 100644
--- a/iwinfo_lua.c
+++ b/iwinfo_lua.c
@@ -434,6 +434,18 @@  static int iwinfo_L_scanlist(lua_State *L, int (*func)(const char *, char *, int
 			lua_pushnumber(L, (e->signal - 0x100));
 			lua_setfield(L, -2, "signal");
 
+			/* BSS load */
+			if (e->has_bss_load) {
+				lua_pushnumber(L, e->station_count);
+				lua_setfield(L, -2, "station_count");
+
+				lua_pushnumber(L, e->channel_utilization);
+				lua_setfield(L, -2, "channel_utilization");
+
+				lua_pushnumber(L, e->admission_capacity);
+				lua_setfield(L, -2, "admission_capacity");
+			}
+
 			/* Crypto */
 			iwinfo_L_cryptotable(L, &e->crypto);
 			lua_setfield(L, -2, "encryption");
diff --git a/iwinfo_nl80211.c b/iwinfo_nl80211.c
index 2b2a043..7463fc7 100644
--- a/iwinfo_nl80211.c
+++ b/iwinfo_nl80211.c
@@ -2296,6 +2296,10 @@  static void nl80211_get_scanlist_ie(struct nlattr **bss,
 			}
 			break;
 
+		case 11: /* BSS Load */
+			iwinfo_parse_bss_load(e, ie + 2);
+			break;
+
 		case 48: /* RSN */
 			iwinfo_parse_rsn(&e->crypto, ie + 2, ie[1],
 			                 IWINFO_CIPHER_CCMP, IWINFO_KMGMT_8021x);
diff --git a/iwinfo_utils.c b/iwinfo_utils.c
index b4f98a9..425492e 100644
--- a/iwinfo_utils.c
+++ b/iwinfo_utils.c
@@ -324,6 +324,14 @@  static void iwinfo_parse_rsn_cipher(uint8_t idx, uint8_t *ciphers)
 	}
 }
 
+void iwinfo_parse_bss_load(struct iwinfo_scanlist_entry *e, uint8_t *data)
+{
+	e->has_bss_load = 1;
+	e->station_count = ((data[1] << 8) | data[0]);
+	e->channel_utilization = data[2];
+	e->admission_capacity = ((data[4] << 8) | data[3]);
+}
+
 void iwinfo_parse_rsn(struct iwinfo_crypto_entry *c, uint8_t *data, uint8_t len,
 					  uint8_t defcipher, uint8_t defauth)
 {