Browse Source

wlantest: Add STA counters for disconnect reason 6/7 RX

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.
Jouni Malinen 13 years ago
parent
commit
62f05ce9c5
3 changed files with 26 additions and 2 deletions
  1. 18 2
      wlantest/rx_mgmt.c
  2. 4 0
      wlantest/wlantest_cli.c
  3. 4 0
      wlantest/wlantest_ctrl.h

+ 18 - 2
wlantest/rx_mgmt.c

@@ -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]++;

+ 4 - 0
wlantest/wlantest_cli.c

@@ -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 }
 };
 

+ 4 - 0
wlantest/wlantest_ctrl.h

@@ -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
 };