[OpenWrt-Devel] [PATCH 2/2] add channel information for scan results

Jo-Philipp Wich jo at mein.io
Sun Jul 15 14:59:28 EDT 2018


Hi,

comments inline.

~ Jo

> diff --git a/include/iwinfo.h b/include/iwinfo.h
> index c3c25ff..b1b39a1 100644
> --- a/include/iwinfo.h
> +++ b/include/iwinfo.h
> @@ -145,6 +145,24 @@ struct iwinfo_crypto_entry {
>  	uint8_t auth_suites;
>  	uint8_t auth_algs;
>  };
> +struct iwinfo_channel_info_entry {
> +	/**
> +	 * sec_channel_offset - Secondary channel offset for HT40
> +	 *
> +	 * 0 = HT40 disabled,
> +	 * -1 = HT40 enabled, secondary channel below primary,
> +	 * 1 = HT40 enabled, secondary channel above primary
> +	 */
> +	int sec_channel_offset;
> +	/**
> +	 * Center channel for VHT80
> +	 */
> +	int center_idx0;
> +	/**
> +	 * Center channel for VHT160
> +	 */
> +	int center_idx1;
> +};

Do we really need three ints? I think the sec_channel_offset could be an
u8 and the channel indexes u8 or u16 values.

>  
>  struct iwinfo_scanlist_entry {
>  	uint8_t mac[6];
> @@ -154,8 +172,9 @@ struct iwinfo_scanlist_entry {
>  	uint8_t signal;
>  	uint8_t quality;
>  	uint8_t quality_max;
> -    int htmodelist;
> +	int htmodelist;

Please use an u8 here.

>  	struct iwinfo_crypto_entry crypto;
> +	struct iwinfo_channel_info_entry channel_info;
>  };
>  
>  struct iwinfo_country_entry {
> diff --git a/iwinfo_cli.c b/iwinfo_cli.c
> index 2d58020..0d899e0 100644
> --- a/iwinfo_cli.c
> +++ b/iwinfo_cli.c
> @@ -612,6 +612,16 @@ static void print_scanlist(const struct iwinfo_ops *iw, const char *ifname)
>  				if (e->htmodelist & (1 << h))
>  					printf("%s ", IWINFO_HTMODE_NAMES[h]);
>  			printf ("\n");
> +			if (e->channel_info.sec_channel_offset)
> +				printf ("              HT secondary channel is %s\n",
> +						e->channel_info.sec_channel_offset < 0 ? "below" :
> +							"above");
> +			if (e->channel_info.center_idx0)
> +				printf ("              VHT Center IDX0: %d\n",
> +						e->channel_info.center_idx0);
> +			if (e->channel_info.center_idx1)
> +				printf ("              VHT Center IDX1: %d\n",
> +						e->channel_info.center_idx1);
>  		}
>  		printf ("\n");
>  	}
> diff --git a/iwinfo_lua.c b/iwinfo_lua.c
> index 01581a3..bd7f0d3 100644
> --- a/iwinfo_lua.c
> +++ b/iwinfo_lua.c
> @@ -446,6 +446,17 @@ static int iwinfo_L_scanlist(lua_State *L, int (*func)(const char *, char *, int
>  				lua_pushnil(L);
>  			lua_setfield(L, -2, "htmodelist");
>  
> +			lua_pushinteger(L, e->channel_info.sec_channel_offset);
> +			lua_setfield(L, -2, "sec_channel_offset");
> +			if (e->channel_info.center_idx0) {
> +				lua_pushinteger(L, e->channel_info.center_idx0);
> +				lua_setfield(L, -2, "center_idx0");
> +			}
> +			if (e->channel_info.center_idx1) {
> +				lua_pushinteger(L, e->channel_info.center_idx1);
> +				lua_setfield(L, -2, "center_idx1");
> +			}
> +
>  			lua_rawseti(L, -2, x);
>  		}
>  	}
> diff --git a/iwinfo_nl80211.c b/iwinfo_nl80211.c
> index 542ac7d..fb137b2 100644
> --- a/iwinfo_nl80211.c
> +++ b/iwinfo_nl80211.c
> @@ -1996,6 +1996,27 @@ static void nl80211_parse_ht_capa(struct iwinfo_scanlist_entry *e,
>  			e->htmodelist |= IWINFO_HTMODE_VHT40;
>  	}
>  }
> +static void nl80211_parse_ht_oper(struct iwinfo_scanlist_entry *e,
> +								  unsigned char *ie,
> +								  int len)
> +{
> +	uint8_t oper_info;
> +
> +	if (len < 6)
> +		return;
> +	oper_info = ie[1];
> +	switch (oper_info & 3) {
> +	case 0:
> +		e->channel_info.sec_channel_offset = 0;
> +		break;
> +	case 1:
> +		e->channel_info.sec_channel_offset = 1;
> +		break;
> +	case 3:
> +		e->channel_info.sec_channel_offset = -1;
> +		break;
> +	}
> +}
>  static void nl80211_parse_vht_capa(struct iwinfo_scanlist_entry *e,
>  								   unsigned char *ie,
>  								   int len)
> @@ -2024,7 +2045,7 @@ static void nl80211_parse_vht_oper(struct iwinfo_scanlist_entry *e,
>  								   int len)
>  {
>  	int chanwidth;
> -	if (len < 1)
> +	if (len < 3)
>  		return;
>  	chanwidth = ie[0];
>  
> @@ -2036,6 +2057,7 @@ static void nl80211_parse_vht_oper(struct iwinfo_scanlist_entry *e,
>  	/*case 0: 20 or 40 MHz */
>  	case 1:
>  		e->htmodelist |= IWINFO_HTMODE_VHT80;
> +		e->channel_info.center_idx0 = ie[1];
>  		break;
>  	case 2:
>  		e->htmodelist |= IWINFO_HTMODE_VHT160;
> @@ -2044,10 +2066,12 @@ static void nl80211_parse_vht_oper(struct iwinfo_scanlist_entry *e,
>  		e->htmodelist |= IWINFO_HTMODE_VHT80_80;
>  		break;
>  	}
> +	e->channel_info.center_idx0 = ie[1];
> +	e->channel_info.center_idx1 = ie[2];
>  }
>  
>  static void nl80211_get_scanlist_ie(struct nlattr **bss,
> -                                    struct iwinfo_scanlist_entry *e)
> +									struct iwinfo_scanlist_entry *e)
>  {
>  	int ielen = nla_len(bss[NL80211_BSS_INFORMATION_ELEMENTS]);
>  	unsigned char *ie = nla_data(bss[NL80211_BSS_INFORMATION_ELEMENTS]);
> @@ -2073,6 +2097,10 @@ static void nl80211_get_scanlist_ie(struct nlattr **bss,
>  			                 IWINFO_CIPHER_CCMP, IWINFO_KMGMT_8021x);
>  			break;
>  
> +		case 61: /* HT Operation */
> +			nl80211_parse_ht_oper(e, ie + 2, ie[1]);
> +			break;
> +
>  		case 191: /* VHT Capabilities */
>  			nl80211_parse_vht_capa(e, ie + 2, ie[1]);
>  			break;
> 

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <http://lists.infradead.org/pipermail/openwrt-devel/attachments/20180715/27f258df/attachment.sig>
-------------- 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