--- a/station.c +++ b/station.c @@ -65,6 +65,33 @@ 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)); + } + + if (i) + 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]; @@ -89,7 +116,10 @@ static int print_sta_handler(struct nl_m [NL80211_STA_INFO_TX_FAILED] = { .type = NLA_U32 }, [NL80211_STA_INFO_STA_FLAGS] = { .minlen = sizeof(struct nl80211_sta_flag_update) }, + [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); @@ -136,12 +166,19 @@ 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); + if (sinfo[NL80211_STA_INFO_T_OFFSET]) printf("\n\tToffset:\t%lld us", (unsigned long long)nla_get_u64(sinfo[NL80211_STA_INFO_T_OFFSET]));