[OpenWrt-Devel] [PATCH 1/2] nl80211: add htmode to iwinfo_ops
Hauke Mehrtens
hauke at hauke-m.de
Thu Dec 19 05:33:47 EST 2019
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 <daniel at 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 at lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel
More information about the openwrt-devel
mailing list