]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
wlantest: Add STA counters for disconnect reason 6/7 RX
authorJouni Malinen <jouni@qca.qualcomm.com>
Tue, 25 Oct 2011 21:06:06 +0000 (00:06 +0300)
committerJouni Malinen <j@w1.fi>
Tue, 25 Oct 2011 21:06:06 +0000 (00:06 +0300)
These can be useful in tests involving association state mismatch
between the AP and the STA (i.e., STA assumes it is still associated
but the AP does not have association state). In such a case, the AP
would be sending out unprotected Deauthentication or Disassociation
frames with reason code 6 or 7 depending on what frame is triggering
this.

wlantest/rx_mgmt.c
wlantest/wlantest_cli.c
wlantest/wlantest_ctrl.h

index 6f7fd405f55e9807e3d222e4e7d453f500c091ca..c7a93900502a5640ec93cd183fe3a302452b5e60 100644 (file)
@@ -190,6 +190,7 @@ static void rx_mgmt_deauth(struct wlantest *wt, const u8 *data, size_t len,
        const struct ieee80211_mgmt *mgmt;
        struct wlantest_bss *bss;
        struct wlantest_sta *sta;
+       u16 fc, reason;
 
        mgmt = (const struct ieee80211_mgmt *) data;
        bss = bss_get(wt, mgmt->bssid);
@@ -206,10 +207,11 @@ static void rx_mgmt_deauth(struct wlantest *wt, const u8 *data, size_t len,
                return;
        }
 
+       reason = le_to_host16(mgmt->u.deauth.reason_code);
        wpa_printf(MSG_DEBUG, "DEAUTH " MACSTR " -> " MACSTR
                   " (reason=%u) (valid=%d)",
                   MAC2STR(mgmt->sa), MAC2STR(mgmt->da),
-                  le_to_host16(mgmt->u.deauth.reason_code), valid);
+                  reason, valid);
        wpa_hexdump(MSG_MSGDUMP, "DEAUTH payload", data + 24, len - 24);
 
        if (sta == NULL) {
@@ -225,6 +227,12 @@ static void rx_mgmt_deauth(struct wlantest *wt, const u8 *data, size_t len,
                        sta->counters[WLANTEST_STA_COUNTER_DEAUTH_RX_ASLEEP]++;
                else
                        sta->counters[WLANTEST_STA_COUNTER_DEAUTH_RX_AWAKE]++;
+
+               fc = le_to_host16(mgmt->frame_control);
+               if (!(fc & WLAN_FC_ISWEP) && reason == 6)
+                       sta->counters[WLANTEST_STA_COUNTER_DEAUTH_RX_RC6]++;
+               else if (!(fc & WLAN_FC_ISWEP) && reason == 7)
+                       sta->counters[WLANTEST_STA_COUNTER_DEAUTH_RX_RC7]++;
        } else
                sta->counters[valid ? WLANTEST_STA_COUNTER_VALID_DEAUTH_TX :
                              WLANTEST_STA_COUNTER_INVALID_DEAUTH_TX]++;
@@ -526,6 +534,7 @@ static void rx_mgmt_disassoc(struct wlantest *wt, const u8 *data, size_t len,
        const struct ieee80211_mgmt *mgmt;
        struct wlantest_bss *bss;
        struct wlantest_sta *sta;
+       u16 fc, reason;
 
        mgmt = (const struct ieee80211_mgmt *) data;
        bss = bss_get(wt, mgmt->bssid);
@@ -542,10 +551,11 @@ static void rx_mgmt_disassoc(struct wlantest *wt, const u8 *data, size_t len,
                return;
        }
 
+       reason = le_to_host16(mgmt->u.disassoc.reason_code);
        wpa_printf(MSG_DEBUG, "DISASSOC " MACSTR " -> " MACSTR
                   " (reason=%u) (valid=%d)",
                   MAC2STR(mgmt->sa), MAC2STR(mgmt->da),
-                  le_to_host16(mgmt->u.disassoc.reason_code), valid);
+                  reason, valid);
        wpa_hexdump(MSG_MSGDUMP, "DISASSOC payload", data + 24, len - 24);
 
        if (sta == NULL) {
@@ -563,6 +573,12 @@ static void rx_mgmt_disassoc(struct wlantest *wt, const u8 *data, size_t len,
                else
                        sta->counters[
                                WLANTEST_STA_COUNTER_DISASSOC_RX_AWAKE]++;
+
+               fc = le_to_host16(mgmt->frame_control);
+               if (!(fc & WLAN_FC_ISWEP) && reason == 6)
+                       sta->counters[WLANTEST_STA_COUNTER_DISASSOC_RX_RC6]++;
+               else if (!(fc & WLAN_FC_ISWEP) && reason == 7)
+                       sta->counters[WLANTEST_STA_COUNTER_DISASSOC_RX_RC7]++;
        } else
                sta->counters[valid ? WLANTEST_STA_COUNTER_VALID_DISASSOC_TX :
                              WLANTEST_STA_COUNTER_INVALID_DISASSOC_TX]++;
index 319467760edfed34d12bedbe77b355adaa3275d0..6377fc141564c784e81fafc0c7ea836ec9533e93 100644 (file)
@@ -552,6 +552,10 @@ static const struct sta_counters sta_counters[] = {
        { "disassoc_rx_asleep", WLANTEST_STA_COUNTER_DISASSOC_RX_ASLEEP },
        { "disassoc_rx_awake", WLANTEST_STA_COUNTER_DISASSOC_RX_AWAKE },
        { "prot_data_tx", WLANTEST_STA_COUNTER_PROT_DATA_TX },
+       { "deauth_rx_rc6", WLANTEST_STA_COUNTER_DEAUTH_RX_RC6 },
+       { "deauth_rx_rc7", WLANTEST_STA_COUNTER_DEAUTH_RX_RC7 },
+       { "disassoc_rx_rc6", WLANTEST_STA_COUNTER_DISASSOC_RX_RC6 },
+       { "disassoc_rx_rc7", WLANTEST_STA_COUNTER_DISASSOC_RX_RC7 },
        { NULL, 0 }
 };
 
index 91f5af61f3ae53abb874e8764c9a77452eef6176..9731bd6f00e398f534260b019eaf7df2bb90bdb1 100644 (file)
@@ -107,6 +107,10 @@ enum wlantest_sta_counter {
        WLANTEST_STA_COUNTER_DISASSOC_RX_ASLEEP,
        WLANTEST_STA_COUNTER_DISASSOC_RX_AWAKE,
        WLANTEST_STA_COUNTER_PROT_DATA_TX,
+       WLANTEST_STA_COUNTER_DEAUTH_RX_RC6,
+       WLANTEST_STA_COUNTER_DEAUTH_RX_RC7,
+       WLANTEST_STA_COUNTER_DISASSOC_RX_RC6,
+       WLANTEST_STA_COUNTER_DISASSOC_RX_RC7,
        NUM_WLANTEST_STA_COUNTER
 };