iw: update to v3.1, add support for per-chain signal strength info
[openwrt/svn-archive/archive.git] / package / iw / patches / 120-per_chain_signal_strength.patch
diff --git a/package/iw/patches/120-per_chain_signal_strength.patch b/package/iw/patches/120-per_chain_signal_strength.patch
new file mode 100644 (file)
index 0000000..abdd638
--- /dev/null
@@ -0,0 +1,68 @@
+--- a/station.c
++++ b/station.c
+@@ -61,6 +61,31 @@ static void print_sta_bitrate(struct nla
+       }
+ }
++static char *get_chain_signal(struct nlattr *attr_list)
++{
++      struct nlattr *attr;
++      static char buf[64];
++      char *cur = buf;
++      int i = 0, rem;
++      const char *prefix;
++
++      if (!attr_list)
++              return "";
++
++      nla_for_each_nested(attr, attr_list, rem) {
++              if (i++ > 0)
++                      prefix = ", ";
++              else
++                      prefix = "[";
++
++              cur += snprintf(cur, sizeof(buf) - (cur - buf), "%s%d", prefix,
++                              (int8_t) nla_get_u8(attr));
++      }
++      snprintf(cur, sizeof(buf) - (cur - buf), "] ");
++
++      return buf;
++}
++
+ static int print_sta_handler(struct nl_msg *msg, void *arg)
+ {
+       struct nlattr *tb[NL80211_ATTR_MAX + 1];
+@@ -81,7 +106,10 @@ static int print_sta_handler(struct nl_m
+               [NL80211_STA_INFO_PLINK_STATE] = { .type = NLA_U8 },
+               [NL80211_STA_INFO_TX_RETRIES] = { .type = NLA_U32 },
+               [NL80211_STA_INFO_TX_FAILED] = { .type = NLA_U32 },
++              [NL80211_STA_INFO_CHAIN_SIGNAL] = { .type = NLA_NESTED },
++              [NL80211_STA_INFO_CHAIN_SIGNAL_AVG] = { .type = NLA_NESTED },
+       };
++      char *chain;
+       nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
+                 genlmsg_attrlen(gnlh, 0), NULL);
+@@ -128,12 +156,18 @@ static int print_sta_handler(struct nl_m
+       if (sinfo[NL80211_STA_INFO_TX_FAILED])
+               printf("\n\ttx failed:\t%u",
+                       nla_get_u32(sinfo[NL80211_STA_INFO_TX_FAILED]));
++
++      chain = get_chain_signal(sinfo[NL80211_STA_INFO_CHAIN_SIGNAL]);
+       if (sinfo[NL80211_STA_INFO_SIGNAL])
+-              printf("\n\tsignal:  \t%d dBm",
+-                      (int8_t)nla_get_u8(sinfo[NL80211_STA_INFO_SIGNAL]));
++              printf("\n\tsignal:  \t%d %sdBm",
++                      (int8_t)nla_get_u8(sinfo[NL80211_STA_INFO_SIGNAL]),
++                      chain);
++
++      chain = get_chain_signal(sinfo[NL80211_STA_INFO_CHAIN_SIGNAL_AVG]);
+       if (sinfo[NL80211_STA_INFO_SIGNAL_AVG])
+-              printf("\n\tsignal avg:\t%d dBm",
+-                      (int8_t)nla_get_u8(sinfo[NL80211_STA_INFO_SIGNAL_AVG]));
++              printf("\n\tsignal avg:\t%d %sdBm",
++                      (int8_t)nla_get_u8(sinfo[NL80211_STA_INFO_SIGNAL_AVG]),
++                      chain);
+       print_sta_bitrate(sinfo[NL80211_STA_INFO_TX_BITRATE], "tx bitrate");
+       print_sta_bitrate(sinfo[NL80211_STA_INFO_RX_BITRATE], "rx bitrate");