utils: add and use iwinfo_format_hwmodes()
authorAndre Heider <a.heider@gmail.com>
Mon, 21 Nov 2022 16:27:20 +0000 (17:27 +0100)
committerJo-Philipp Wich <jo@mein.io>
Thu, 15 Dec 2022 23:09:07 +0000 (00:09 +0100)
Unify how hwmodes are displayed, e.g.:
"802.11ac/ax/b/g/n" instead of "802.11bgnacax".

Luci currently uses a natural sort order, but that probably doesn't work
as intended once "be" is added, so let's do this here.

Signed-off-by: Andre Heider <a.heider@gmail.com>
include/iwinfo/utils.h
iwinfo_cli.c
iwinfo_utils.c

index 1fa4f520f3a6427914c3f6a1debe99195919ccd1..6fe5785bbaf255fc01e9911957dd35f221a6543d 100644 (file)
@@ -43,6 +43,8 @@ static inline int iwinfo_mbm2dbm(int gain)
        return gain / 100;
 }
 
+size_t iwinfo_format_hwmodes(int modes, char *buf, size_t len);
+
 int iwinfo_ifup(const char *ifname);
 int iwinfo_ifdown(const char *ifname);
 int iwinfo_ifmac(const char *ifname);
index b533ffe96fefa36ae2b8b1548a9b71c661971a3f..caefac6272372556421fb019c694d25c7e49b337 100644 (file)
@@ -282,19 +282,10 @@ static char * format_encryption(struct iwinfo_crypto_entry *c)
 
 static char * format_hwmodes(int modes)
 {
-       static char buf[17];
+       static char buf[32] = "802.11";
 
-       if (modes <= 0)
+       if (iwinfo_format_hwmodes(modes, buf + 6, sizeof(buf) - 6) < 1)
                snprintf(buf, sizeof(buf), "unknown");
-       else
-               snprintf(buf, sizeof(buf), "802.11%s%s%s%s%s%s%s",
-                       (modes & IWINFO_80211_A) ? "a" : "",
-                       (modes & IWINFO_80211_B) ? "b" : "",
-                       (modes & IWINFO_80211_G) ? "g" : "",
-                       (modes & IWINFO_80211_N) ? "n" : "",
-                       (modes & IWINFO_80211_AC) ? "ac" : "",
-                       (modes & IWINFO_80211_AD) ? "ad" : "",
-                       (modes & IWINFO_80211_AX) ? "ax" : "");
 
        return buf;
 }
index c15b30517235ed0b34997922141a2b3467352cf7..63ae78c4715d875613da417c928347044c37d237 100644 (file)
@@ -77,6 +77,31 @@ int iwinfo_mw2dbm(int in)
        return (int)res;
 }
 
+size_t iwinfo_format_hwmodes(int modes, char *buf, size_t len)
+{
+       // bit numbers as per IWINFO_80211_*:  ad ac ax  a  b  g  n
+       const int order[IWINFO_80211_COUNT] = { 5, 4, 6, 0, 1, 2, 3 };
+       size_t res = 0;
+       int i;
+
+       *buf = 0;
+
+       if (!(modes & ((1 << IWINFO_80211_COUNT) - 1)))
+               return 0;
+
+       for (i = 0; i < IWINFO_80211_COUNT; i++)
+               if (modes & 1 << order[i])
+                       res += snprintf(buf + res, len - res, "%s/", IWINFO_80211_NAMES[order[i]]);
+
+       if (res > 0)
+       {
+               res--;
+               buf[res] = 0;
+       }
+
+       return res;
+}
+
 int iwinfo_ifup(const char *ifname)
 {
        struct ifreq ifr;