diff --git a/src/common/ieee802_11_defs.h b/src/common/ieee802_11_defs.h index 8cc86146b..4c8f37291 100644 --- a/src/common/ieee802_11_defs.h +++ b/src/common/ieee802_11_defs.h @@ -50,6 +50,7 @@ #define WLAN_FC_STYPE_AUTH 11 #define WLAN_FC_STYPE_DEAUTH 12 #define WLAN_FC_STYPE_ACTION 13 +#define WLAN_FC_STYPE_ACTION_NO_ACK 14 /* control */ #define WLAN_FC_STYPE_PSPOLL 10 diff --git a/wlantest/inject.c b/wlantest/inject.c index 54a055433..399f1a3c0 100644 --- a/wlantest/inject.c +++ b/wlantest/inject.c @@ -68,7 +68,8 @@ static int is_robust_mgmt(u8 *frame, size_t len) stype = WLAN_FC_GET_STYPE(fc); if (stype == WLAN_FC_STYPE_DEAUTH || stype == WLAN_FC_STYPE_DISASSOC) return 1; - if (stype == WLAN_FC_STYPE_ACTION) { + if (stype == WLAN_FC_STYPE_ACTION || + stype == WLAN_FC_STYPE_ACTION_NO_ACK) { if (len < 25) return 0; if (mgmt->u.action.category != WLAN_ACTION_PUBLIC) diff --git a/wlantest/rx_mgmt.c b/wlantest/rx_mgmt.c index 2b0580752..92d66b0f8 100644 --- a/wlantest/rx_mgmt.c +++ b/wlantest/rx_mgmt.c @@ -51,6 +51,8 @@ static const char * mgmt_stype(u16 stype) return "DEAUTH"; case WLAN_FC_STYPE_ACTION: return "ACTION"; + case WLAN_FC_STYPE_ACTION_NO_ACK: + return "ACTION-NO-ACK"; } return "??"; } @@ -2062,7 +2064,8 @@ static int check_bip(struct wlantest *wt, const u8 *data, size_t len) fc = le_to_host16(mgmt->frame_control); stype = WLAN_FC_GET_STYPE(fc); - if (stype == WLAN_FC_STYPE_ACTION) { + if (stype == WLAN_FC_STYPE_ACTION || + stype == WLAN_FC_STYPE_ACTION_NO_ACK) { if (len < 24 + 1) return 0; if (mgmt->u.action.category == WLAN_ACTION_PUBLIC) @@ -2291,7 +2294,8 @@ static int check_mgmt_ccmp(struct wlantest *wt, const u8 *data, size_t len) mgmt = (const struct ieee80211_mgmt *) data; fc = le_to_host16(mgmt->frame_control); - if (WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_ACTION) { + if (WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_ACTION || + WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_ACTION_NO_ACK) { if (len > 24 && mgmt->u.action.category == WLAN_ACTION_PUBLIC) return 0; /* Not a robust management frame */ @@ -2310,7 +2314,8 @@ static int check_mgmt_ccmp(struct wlantest *wt, const u8 *data, size_t len) if ((bss->rsn_capab & WPA_CAPABILITY_MFPC) && (sta->rsn_capab & WPA_CAPABILITY_MFPC) && (sta->state == STATE3 || - WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_ACTION)) { + WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_ACTION || + WLAN_FC_GET_STYPE(fc) == WLAN_FC_STYPE_ACTION_NO_ACK)) { add_note(wt, MSG_INFO, "Robust individually-addressed " "management frame sent without CCMP by " MACSTR, MAC2STR(mgmt->sa)); @@ -2340,7 +2345,8 @@ void rx_mgmt(struct wlantest *wt, const u8 *data, size_t len) if ((hdr->addr1[0] & 0x01) && (stype == WLAN_FC_STYPE_DEAUTH || stype == WLAN_FC_STYPE_DISASSOC || - stype == WLAN_FC_STYPE_ACTION)) { + stype == WLAN_FC_STYPE_ACTION || + stype == WLAN_FC_STYPE_ACTION_NO_ACK)) { if (check_bip(wt, data, len) < 0) valid = 0; } @@ -2360,7 +2366,8 @@ void rx_mgmt(struct wlantest *wt, const u8 *data, size_t len) !(hdr->addr1[0] & 0x01) && (stype == WLAN_FC_STYPE_DEAUTH || stype == WLAN_FC_STYPE_DISASSOC || - stype == WLAN_FC_STYPE_ACTION)) { + stype == WLAN_FC_STYPE_ACTION || + stype == WLAN_FC_STYPE_ACTION_NO_ACK)) { decrypted = mgmt_ccmp_decrypt(wt, data, len, &dlen); if (decrypted) { write_pcap_decrypted(wt, decrypted, dlen, NULL, 0); @@ -2374,7 +2381,8 @@ void rx_mgmt(struct wlantest *wt, const u8 *data, size_t len) !(hdr->addr1[0] & 0x01) && (stype == WLAN_FC_STYPE_DEAUTH || stype == WLAN_FC_STYPE_DISASSOC || - stype == WLAN_FC_STYPE_ACTION)) { + stype == WLAN_FC_STYPE_ACTION || + stype == WLAN_FC_STYPE_ACTION_NO_ACK)) { if (check_mgmt_ccmp(wt, data, len) < 0) valid = 0; } @@ -2410,6 +2418,9 @@ void rx_mgmt(struct wlantest *wt, const u8 *data, size_t len) case WLAN_FC_STYPE_ACTION: rx_mgmt_action(wt, data, len, valid); break; + case WLAN_FC_STYPE_ACTION_NO_ACK: + rx_mgmt_action(wt, data, len, valid); + break; } os_free(decrypted);