]> git.ipfire.org Git - thirdparty/iw.git/commitdiff
parse NL80211_ATTR_CQM_PKT_LOSS_EVENT
authorJohannes Berg <johannes.berg@intel.com>
Thu, 6 Jan 2011 14:58:58 +0000 (15:58 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 6 Jan 2011 14:58:58 +0000 (15:58 +0100)
event.c

diff --git a/event.c b/event.c
index 6f3faa25e556f91916d9933808dcf1e390daf30b..b3210db738d550f9db2a5ce1c5e6edaceb841e78 100644 (file)
--- a/event.c
+++ b/event.c
@@ -100,7 +100,7 @@ static void print_frame(struct print_event_args *args, struct nlattr *attr)
        printf("]");
 }
 
-static void parse_cqm_event(struct nlattr *tb)
+static void parse_cqm_event(struct nlattr **attrs)
 {
        static struct nla_policy cqm_policy[NL80211_ATTR_CQM_MAX + 1] = {
                [NL80211_ATTR_CQM_RSSI_THOLD] = { .type = NLA_U32 },
@@ -108,10 +108,12 @@ static void parse_cqm_event(struct nlattr *tb)
                [NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT] = { .type = NLA_U32 },
        };
        struct nlattr *cqm[NL80211_ATTR_CQM_MAX + 1];
+       struct nlattr *cqm_attr = attrs[NL80211_ATTR_CQM];
 
        printf("connection quality monitor event: ");
 
-       if (!tb || nla_parse_nested(cqm, NL80211_ATTR_CQM_MAX, tb, cqm_policy)) {
+       if (!cqm_attr ||
+           nla_parse_nested(cqm, NL80211_ATTR_CQM_MAX, cqm_attr, cqm_policy)) {
                printf("missing data!\n");
                return;
        }
@@ -120,11 +122,19 @@ static void parse_cqm_event(struct nlattr *tb)
                enum nl80211_cqm_rssi_threshold_event rssi_event;
                rssi_event = nla_get_u32(cqm[NL80211_ATTR_CQM_RSSI_THRESHOLD_EVENT]);
                if (rssi_event == NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH)
-                       printf("RSSI went above threshold");
+                       printf("RSSI went above threshold\n");
                else
-                       printf("RSSI went below threshold");
-       }
-       printf("\n");
+                       printf("RSSI went below threshold\n");
+       } else if (cqm[NL80211_ATTR_CQM_PKT_LOSS_EVENT] &&
+                  attrs[NL80211_ATTR_MAC]) {
+               uint32_t frames;
+               char buf[3*6];
+
+               frames = nla_get_u32(cqm[NL80211_ATTR_CQM_PKT_LOSS_EVENT]);
+               mac_addr_n2a(buf, nla_data(attrs[NL80211_ATTR_MAC]));
+               printf("peer %s didn't ACK %d packets\n", buf, frames);
+       } else
+               printf("unknown event\n");
 }
 
 
@@ -349,7 +359,7 @@ static int print_event(struct nl_msg *msg, void *arg)
                        (unsigned long long)nla_get_u64(tb[NL80211_ATTR_COOKIE]));
                break;
        case NL80211_CMD_NOTIFY_CQM:
-               parse_cqm_event(tb[NL80211_ATTR_CQM]);
+               parse_cqm_event(tb);
                break;
        default:
                printf("unknown event %d\n", gnlh->cmd);