diff --git a/wlantest/process.c b/wlantest/process.c index 54ddf6bad..c496e0d5a 100644 --- a/wlantest/process.c +++ b/wlantest/process.c @@ -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; } diff --git a/wlantest/rx_data.c b/wlantest/rx_data.c index bafc33fd9..28202d822 100644 --- a/wlantest/rx_data.c +++ b/wlantest/rx_data.c @@ -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); } diff --git a/wlantest/rx_mgmt.c b/wlantest/rx_mgmt.c index 95ff258c2..c00813831 100644 --- a/wlantest/rx_mgmt.c +++ b/wlantest/rx_mgmt.c @@ -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); diff --git a/wlantest/wlantest.h b/wlantest/wlantest.h index bad005d81..4e313e017 100644 --- a/wlantest/wlantest.h +++ b/wlantest/wlantest.h @@ -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;