]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
wlantest: Allow duplicate frame processing after decryption failure
authorJouni Malinen <jouni@codeaurora.org>
Wed, 12 Jun 2019 19:23:30 +0000 (22:23 +0300)
committerJouni Malinen <jouni@codeaurora.org>
Wed, 12 Jun 2019 19:27:34 +0000 (22:27 +0300)
If a sniffer capture does not include FCS for each frame, but may
included frames with invalid FCS, it would be possible for wlantest to
try to decrypt the first received frame and fail (e.g., due to CCMP MIC
mismatch) because that particular frame was corrupted and then ignore
the following retry of that frame as a duplicate even if that retry has
different payload (e.g., if its reception did not show corruption).

Work around this by skipping duplicate frame detection immediately
following a decryption failure.

Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
wlantest/process.c
wlantest/rx_data.c
wlantest/rx_mgmt.c
wlantest/wlantest.h

index 54ddf6badd616e6bae4c70e0d72fd25a99fba7f1..c496e0d5a911ecf5bdb566303256576238cef069 100644 (file)
@@ -161,7 +161,8 @@ static int rx_duplicate(struct wlantest *wt, const struct ieee80211_hdr *hdr,
        else
                seq_ctrl = &sta->seq_ctrl_to_sta[tid];
 
-       if ((fc & WLAN_FC_RETRY) && hdr->seq_ctrl == *seq_ctrl) {
+       if ((fc & WLAN_FC_RETRY) && hdr->seq_ctrl == *seq_ctrl &&
+           !sta->allow_duplicate) {
                u16 s = le_to_host16(hdr->seq_ctrl);
                add_note(wt, MSG_MSGDUMP, "Ignore duplicated frame (seq=%u "
                         "frag=%u A1=" MACSTR " A2=" MACSTR ")",
@@ -171,6 +172,7 @@ static int rx_duplicate(struct wlantest *wt, const struct ieee80211_hdr *hdr,
        }
 
        *seq_ctrl = hdr->seq_ctrl;
+       sta->allow_duplicate = 0;
 
        return 0;
 }
index bafc33fd95e0579d06e9c57ee5cf12a87836aa8b..28202d822f5e84951430d06ca127c660660033ce 100644 (file)
@@ -485,8 +485,16 @@ skip_replay_det:
                                dlen, 1, peer_addr);
                write_pcap_decrypted(wt, (const u8 *) hdr, hdrlen,
                                     decrypted, dlen);
-       } else if (!try_ptk_iter)
-               add_note(wt, MSG_DEBUG, "Failed to decrypt frame");
+       } else {
+               if (!try_ptk_iter)
+                       add_note(wt, MSG_DEBUG, "Failed to decrypt frame");
+
+               /* Assume the frame was corrupted and there was no FCS to check.
+                * Allow retry of this particular frame to be processed so that
+                * it could end up getting decrypted if it was received without
+                * corruption. */
+               sta->allow_duplicate = 1;
+       }
        os_free(decrypted);
 }
 
index 95ff258c2e785e01d2bb5f032ced217d921e5922..c008138315d6a24476a982adae60e6cfe56e0e74 100644 (file)
@@ -1315,6 +1315,12 @@ static u8 * mgmt_ccmp_decrypt(struct wlantest *wt, const u8 *data, size_t len,
                        os_memcpy(frame + 24, decrypted, *dlen);
                        *dlen += 24;
                }
+       } else {
+               /* Assume the frame was corrupted and there was no FCS to check.
+                * Allow retry of this particular frame to be processed so that
+                * it could end up getting decrypted if it was received without
+                * corruption. */
+               sta->allow_duplicate = 1;
        }
 
        os_free(decrypted);
index bad005d81c1e13816e19fa07ae6d803c39656147..4e313e017e6d1838223eb5f9916ee0e60acc4810 100644 (file)
@@ -93,6 +93,7 @@ struct wlantest_sta {
 
        le16 seq_ctrl_to_sta[17];
        le16 seq_ctrl_to_ap[17];
+       int allow_duplicate;
 
        int pwrmgt;
        int pspoll;