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) {