[OpenWrt-Devel] [PATCH] iwinfo: add BSS load element to scan result

Steve Brown sbrown at ewol.com
Wed Feb 5 08:48:35 EST 2020


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 at 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

-------------- next part --------------
A non-text attachment was scrubbed...
Name: scan.pdf
Type: application/pdf
Size: 352155 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/openwrt-devel/attachments/20200205/e20b68bb/attachment.pdf>
-------------- next part --------------
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel


More information about the openwrt-devel mailing list