OSDN Git Service

Add PKTCNT_POLL command to get TX packet counters
authorYuhao Zheng <yuhaozheng@google.com>
Fri, 27 Jul 2012 17:37:52 +0000 (10:37 -0700)
committerIrfan Sheriff <isheriff@google.com>
Fri, 3 Aug 2012 17:14:55 +0000 (10:14 -0700)
- for the new WiFi watchdog
- requires kernel support (see issue 6874044)

Change-Id: Ibb59c1e0df6f5422814f2260588651e0e1490ccc

src/drivers/driver_nl80211.c
wpa_supplicant/ctrl_iface.c
wpa_supplicant/driver_i.h
wpa_supplicant/wpa_cli.c

index d54d0f5..cfcfd6b 100644 (file)
@@ -7338,6 +7338,7 @@ static int get_sta_handler(struct nl_msg *msg, void *arg)
                [NL80211_STA_INFO_TX_BYTES] = { .type = NLA_U32 },
                [NL80211_STA_INFO_RX_PACKETS] = { .type = NLA_U32 },
                [NL80211_STA_INFO_TX_PACKETS] = { .type = NLA_U32 },
+               [NL80211_STA_INFO_TX_FAILED] = { .type = NLA_U32 },
        };
 
        nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
@@ -7373,6 +7374,9 @@ static int get_sta_handler(struct nl_msg *msg, void *arg)
        if (stats[NL80211_STA_INFO_TX_PACKETS])
                data->tx_packets =
                        nla_get_u32(stats[NL80211_STA_INFO_TX_PACKETS]);
+       if (stats[NL80211_STA_INFO_TX_FAILED])
+               data->tx_retry_failed =
+                       nla_get_u32(stats[NL80211_STA_INFO_TX_FAILED]);
 
        return NL_SKIP;
 }
index 82d26e3..1065ef9 100644 (file)
@@ -4102,6 +4102,24 @@ static int wpa_supplicant_signal_poll(struct wpa_supplicant *wpa_s, char *buf,
        return ret;
 }
 
+static int wpa_supplicant_pktcnt_poll(struct wpa_supplicant *wpa_s, char *buf,
+                                     size_t buflen)
+{
+       struct hostap_sta_driver_data sta;
+       int ret;
+
+       ret = wpa_drv_pktcnt_poll(wpa_s, &sta);
+       if (ret)
+               return -1;
+
+       ret = os_snprintf(buf, buflen, "TXGOOD=%lu\nTXBAD=%lu\nRXGOOD=%lu\n",
+                   sta.tx_packets, sta.tx_retry_failed, sta.rx_packets);
+       if (ret < 0 || (unsigned int) ret > buflen)
+               return -1;
+       return ret;
+}
+
+
 #ifdef ANDROID
 static int wpa_supplicant_driver_cmd(struct wpa_supplicant *wpa_s, char *cmd,
                                     char *buf, size_t buflen)
@@ -4596,6 +4614,9 @@ char * wpa_supplicant_ctrl_iface_process(struct wpa_supplicant *wpa_s,
        } else if (os_strncmp(buf, "SIGNAL_POLL", 11) == 0) {
                reply_len = wpa_supplicant_signal_poll(wpa_s, reply,
                                                       reply_size);
+       } else if (os_strncmp(buf, "PKTCNT_POLL", 11) == 0) {
+               reply_len = wpa_supplicant_pktcnt_poll(wpa_s, reply,
+                                                      reply_size);
 #ifdef CONFIG_AUTOSCAN
        } else if (os_strncmp(buf, "AUTOSCAN ", 9) == 0) {
                if (wpa_supplicant_ctrl_iface_autoscan(wpa_s, buf + 9))
index f968251..4f2ec79 100644 (file)
@@ -463,6 +463,14 @@ static inline int wpa_drv_signal_poll(struct wpa_supplicant *wpa_s,
        return -1;
 }
 
+static inline int wpa_drv_pktcnt_poll(struct wpa_supplicant *wpa_s,
+                                     struct hostap_sta_driver_data *sta)
+{
+       if (wpa_s->driver->read_sta_data)
+               return wpa_s->driver->read_sta_data(wpa_s->drv_priv, sta, wpa_s->own_addr);
+       return -1;
+}
+
 static inline int wpa_drv_set_ap_wps_ie(struct wpa_supplicant *wpa_s,
                                        const struct wpabuf *beacon,
                                        const struct wpabuf *proberesp,
index c631cd1..a8e8488 100644 (file)
@@ -2935,6 +2935,13 @@ static int wpa_cli_cmd_signal_poll(struct wpa_ctrl *ctrl, int argc,
 }
 
 
+static int wpa_cli_cmd_pktcnt_poll(struct wpa_ctrl *ctrl, int argc,
+                                  char *argv[])
+{
+       return wpa_ctrl_command(ctrl, "PKTCNT_POLL");
+}
+
+
 static int wpa_cli_cmd_reauthenticate(struct wpa_ctrl *ctrl, int argc,
                                      char *argv[])
 {
@@ -3370,6 +3377,9 @@ static struct wpa_cli_cmd wpa_cli_commands[] = {
        { "signal_poll", wpa_cli_cmd_signal_poll,
          cli_cmd_flag_none,
          "= get signal parameters" },
+       { "pktcnt_poll", wpa_cli_cmd_pktcnt_poll,
+         cli_cmd_flag_none,
+         "= get TX/RX packet counters" },
        { "reauthenticate", wpa_cli_cmd_reauthenticate, cli_cmd_flag_none,
          "= trigger IEEE 802.1X/EAPOL reauthentication" },
 #ifdef CONFIG_AUTOSCAN