Root/package/network/utils/iw/patches/100-rx_rate.patch

1--- a/station.c
2+++ b/station.c
3@@ -29,13 +29,47 @@ enum plink_actions {
4     PLINK_ACTION_BLOCK,
5 };
6 
7+static void print_sta_bitrate(struct nlattr *nla, const char *name)
8+{
9+ struct nlattr *rinfo[NL80211_RATE_INFO_MAX + 1];
10+
11+ static struct nla_policy rate_policy[NL80211_RATE_INFO_MAX + 1] = {
12+ [NL80211_RATE_INFO_BITRATE] = { .type = NLA_U16 },
13+ [NL80211_RATE_INFO_BITRATE32] = { .type = NLA_U32 },
14+ [NL80211_RATE_INFO_MCS] = { .type = NLA_U8 },
15+ [NL80211_RATE_INFO_40_MHZ_WIDTH] = { .type = NLA_FLAG },
16+ [NL80211_RATE_INFO_SHORT_GI] = { .type = NLA_FLAG },
17+ };
18+
19+ if (!nla)
20+ return;
21+
22+ if (nla_parse_nested(rinfo, NL80211_RATE_INFO_MAX, nla, rate_policy)) {
23+ fprintf(stderr, "failed to parse nested rate attributes!\n");
24+ } else {
25+ int rate = 0;
26+ printf("\n\t%s:\t", name);
27+ if (rinfo[NL80211_RATE_INFO_BITRATE32])
28+ rate = nla_get_u32(rinfo[NL80211_RATE_INFO_BITRATE32]);
29+ else if (rinfo[NL80211_RATE_INFO_BITRATE])
30+ rate = nla_get_u16(rinfo[NL80211_RATE_INFO_BITRATE]);
31+ if (rate > 0)
32+ printf("%d.%d MBit/s", rate / 10, rate % 10);
33+
34+ if (rinfo[NL80211_RATE_INFO_MCS])
35+ printf(" MCS %d", nla_get_u8(rinfo[NL80211_RATE_INFO_MCS]));
36+ if (rinfo[NL80211_RATE_INFO_40_MHZ_WIDTH])
37+ printf(" 40Mhz");
38+ if (rinfo[NL80211_RATE_INFO_SHORT_GI])
39+ printf(" short GI");
40+ }
41+}
42 
43 static int print_sta_handler(struct nl_msg *msg, void *arg)
44 {
45     struct nlattr *tb[NL80211_ATTR_MAX + 1];
46     struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
47     struct nlattr *sinfo[NL80211_STA_INFO_MAX + 1];
48- struct nlattr *rinfo[NL80211_RATE_INFO_MAX + 1];
49     char mac_addr[20], state_name[10], dev[20];
50     struct nl80211_sta_flag_update *sta_flags;
51     static struct nla_policy stats_policy[NL80211_STA_INFO_MAX + 1] = {
52@@ -47,6 +81,7 @@ static int print_sta_handler(struct nl_m
53         [NL80211_STA_INFO_SIGNAL] = { .type = NLA_U8 },
54         [NL80211_STA_INFO_T_OFFSET] = { .type = NLA_U64 },
55         [NL80211_STA_INFO_TX_BITRATE] = { .type = NLA_NESTED },
56+ [NL80211_STA_INFO_RX_BITRATE] = { .type = NLA_NESTED },
57         [NL80211_STA_INFO_LLID] = { .type = NLA_U16 },
58         [NL80211_STA_INFO_PLID] = { .type = NLA_U16 },
59         [NL80211_STA_INFO_PLINK_STATE] = { .type = NLA_U8 },
60@@ -56,14 +91,6 @@ static int print_sta_handler(struct nl_m
61             { .minlen = sizeof(struct nl80211_sta_flag_update) },
62     };
63 
64- static struct nla_policy rate_policy[NL80211_RATE_INFO_MAX + 1] = {
65- [NL80211_RATE_INFO_BITRATE] = { .type = NLA_U16 },
66- [NL80211_RATE_INFO_BITRATE32] = { .type = NLA_U32 },
67- [NL80211_RATE_INFO_MCS] = { .type = NLA_U8 },
68- [NL80211_RATE_INFO_40_MHZ_WIDTH] = { .type = NLA_FLAG },
69- [NL80211_RATE_INFO_SHORT_GI] = { .type = NLA_FLAG },
70- };
71-
72     nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
73           genlmsg_attrlen(gnlh, 0), NULL);
74 
75@@ -119,28 +146,8 @@ static int print_sta_handler(struct nl_m
76         printf("\n\tToffset:\t%lld us",
77             (unsigned long long)nla_get_u64(sinfo[NL80211_STA_INFO_T_OFFSET]));
78 
79- if (sinfo[NL80211_STA_INFO_TX_BITRATE]) {
80- if (nla_parse_nested(rinfo, NL80211_RATE_INFO_MAX,
81- sinfo[NL80211_STA_INFO_TX_BITRATE], rate_policy)) {
82- fprintf(stderr, "failed to parse nested rate attributes!\n");
83- } else {
84- int rate = 0;
85- printf("\n\ttx bitrate:\t");
86- if (rinfo[NL80211_RATE_INFO_BITRATE32])
87- rate = nla_get_u32(rinfo[NL80211_RATE_INFO_BITRATE32]);
88- else if (rinfo[NL80211_RATE_INFO_BITRATE])
89- rate = nla_get_u16(rinfo[NL80211_RATE_INFO_BITRATE]);
90- if (rate > 0)
91- printf("%d.%d MBit/s", rate / 10, rate % 10);
92-
93- if (rinfo[NL80211_RATE_INFO_MCS])
94- printf(" MCS %d", nla_get_u8(rinfo[NL80211_RATE_INFO_MCS]));
95- if (rinfo[NL80211_RATE_INFO_40_MHZ_WIDTH])
96- printf(" 40Mhz");
97- if (rinfo[NL80211_RATE_INFO_SHORT_GI])
98- printf(" short GI");
99- }
100- }
101+ print_sta_bitrate(sinfo[NL80211_STA_INFO_TX_BITRATE], "tx bitrate");
102+ print_sta_bitrate(sinfo[NL80211_STA_INFO_RX_BITRATE], "rx bitrate");
103 
104     if (sinfo[NL80211_STA_INFO_LLID])
105         printf("\n\tmesh llid:\t%d",
106

Archive Download this file



interactive