On 11/27/19 6:29 PM, Daniel Danzberger wrote:
> This callback shows the currently active HTMODE of the device.
> 
> Signed-off-by: Daniel Danzberger <dan...@dd-wrt.com>
> ---
>  include/iwinfo.h |  4 ++-
>  iwinfo_nl80211.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 73 insertions(+), 1 deletion(-)
> 
> diff --git a/include/iwinfo.h b/include/iwinfo.h
> index d035c9c..5e64294 100644
> --- a/include/iwinfo.h
> +++ b/include/iwinfo.h
> @@ -88,8 +88,9 @@ enum iwinfo_htmode {
>       IWINFO_HTMODE_VHT80      = (1 << 4),
>       IWINFO_HTMODE_VHT80_80   = (1 << 5),
>       IWINFO_HTMODE_VHT160     = (1 << 6),
> +     IWINFO_HTMODE_NOHT       = (1 << 7),
>  
> -     IWINFO_HTMODE_COUNT      = 7
> +     IWINFO_HTMODE_COUNT      = 8
>  };
>  
>  extern const char *IWINFO_HTMODE_NAMES[IWINFO_HTMODE_COUNT];
> @@ -231,6 +232,7 @@ struct iwinfo_ops {
>       int (*mbssid_support)(const char *, int *);
>       int (*hwmodelist)(const char *, int *);
>       int (*htmodelist)(const char *, int *);
> +     int (*htmode)(const char *, int *);
>       int (*ssid)(const char *, char *);
>       int (*bssid)(const char *, char *);
>       int (*country)(const char *, char *);
> diff --git a/iwinfo_nl80211.c b/iwinfo_nl80211.c
> index 4b6ef91..36f1da2 100644
> --- a/iwinfo_nl80211.c
> +++ b/iwinfo_nl80211.c
> @@ -2958,6 +2958,75 @@ out:
>       return -1;
>  }
>  
> +struct chan_info {
> +     int width;
> +     int mode;
> +};
> +
> +static int nl80211_get_htmode_cb(struct nl_msg *msg, void *arg)
> +{
> +     struct nlattr **tb = nl80211_parse(msg);
> +     struct nlattr *cur;
> +     struct chan_info *chn = arg;
> +
> +     if ((cur = tb[NL80211_ATTR_CHANNEL_WIDTH]))
> +             chn->width = nla_get_u32(cur);
> +
> +     if ((cur = tb[NL80211_ATTR_BSS_HT_OPMODE]))
> +             chn->mode = nla_get_u32(cur);
> +
> +     return NL_SKIP;
> +}
> +
> +static int nl80211_get_htmode(const char *ifname, int *buf)
> +{
> +     struct chan_info chn = { .width = 0, .mode = 0 };
> +     char *res;
> +     int err;
> +
> +     res = nl80211_phy2ifname(ifname);
> +     *buf = 0;
> +
> +     err =  nl80211_request(res ? res : ifname,
> +                             NL80211_CMD_GET_INTERFACE, 0,
> +                             nl80211_get_htmode_cb, &chn);
> +     if (err)
> +             return -1;
> +
> +     switch (chn.width) {
> +     case NL80211_CHAN_WIDTH_20_NOHT:
> +             *buf = IWINFO_HTMODE_NOHT;
> +             break;
> +     case NL80211_CHAN_WIDTH_20:
> +             if (chn.mode == -1)
> +                     *buf = IWINFO_HTMODE_VHT20;
> +             else
> +                     *buf = IWINFO_HTMODE_HT20;
> +             break;
> +     case NL80211_CHAN_WIDTH_40:
> +             if (chn.mode == -1)
> +                     *buf = IWINFO_HTMODE_VHT40;
> +             else
> +                     *buf = IWINFO_HTMODE_HT40;
> +             break;
> +     case NL80211_CHAN_WIDTH_80:
> +             *buf = IWINFO_HTMODE_VHT80;
> +             break;
> +     case NL80211_CHAN_WIDTH_80P80:
> +             *buf = IWINFO_HTMODE_VHT80_80;
> +             break;
> +     case NL80211_CHAN_WIDTH_160:
> +             *buf = IWINFO_HTMODE_VHT160;
> +             break;
> +     case NL80211_CHAN_WIDTH_5:
> +     case NL80211_CHAN_WIDTH_10:

Should this also return IWINFO_HTMODE_NOHT ?

> +     default:
> +             break;

Why not return an error if nothing matches?

> +     }
> +
> +     return 0;
> +}
> +
>  static int nl80211_get_htmodelist(const char *ifname, int *buf)
>  {
>       struct nl80211_modes m = { 0 };
> @@ -3147,6 +3216,7 @@ const struct iwinfo_ops nl80211_ops = {
>       .mbssid_support   = nl80211_get_mbssid_support,
>       .hwmodelist       = nl80211_get_hwmodelist,
>       .htmodelist       = nl80211_get_htmodelist,
> +     .htmode           = nl80211_get_htmode,
>       .mode             = nl80211_get_mode,
>       .ssid             = nl80211_get_ssid,
>       .bssid            = nl80211_get_bssid,
> 


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

Reply via email to