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

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to