diff --git a/wlantest/process.c b/wlantest/process.c index 609a23a93..a788a3650 100644 --- a/wlantest/process.c +++ b/wlantest/process.c @@ -380,5 +380,19 @@ void wlantest_process_prism(struct wlantest *wt, const u8 *data, size_t len) void wlantest_process_80211(struct wlantest *wt, const u8 *data, size_t len) { wpa_hexdump(MSG_EXCESSIVE, "Process data", data, len); + + if (wt->assume_fcs && len >= 4) { + const u8 *fcspos; + + len -= 4; + fcspos = data + len; + if (check_fcs(data, len, fcspos) < 0) { + wpa_printf(MSG_EXCESSIVE, "Drop RX frame with invalid " + "FCS"); + wt->fcs_error++; + return; + } + } + rx_frame(wt, data, len); } diff --git a/wlantest/wlantest.c b/wlantest/wlantest.c index 094ed17a4..9856d6b5a 100644 --- a/wlantest/wlantest.c +++ b/wlantest/wlantest.c @@ -25,7 +25,7 @@ static void wlantest_terminate(int sig, void *signal_ctx) static void usage(void) { - printf("wlantest [-cddhqq] [-i] [-r] " + printf("wlantest [-cddhqqF] [-i] [-r] " "[-p]\n" " [-I] [-R] " "[-P]\n" @@ -208,7 +208,7 @@ int main(int argc, char *argv[]) wlantest_init(&wt); for (;;) { - c = getopt(argc, argv, "cdf:hi:I:p:P:qr:R:w:W:"); + c = getopt(argc, argv, "cdf:Fhi:I:p:P:qr:R:w:W:"); if (c < 0) break; switch (c) { @@ -223,6 +223,9 @@ int main(int argc, char *argv[]) if (add_pmk_file(&wt, optarg) < 0) return -1; break; + case 'F': + wt.assume_fcs = 1; + break; case 'h': usage(); return 0; diff --git a/wlantest/wlantest.h b/wlantest/wlantest.h index b04e9d068..ab645a865 100644 --- a/wlantest/wlantest.h +++ b/wlantest/wlantest.h @@ -175,6 +175,8 @@ struct wlantest { u8 last_hdr[30]; size_t last_len; int last_mgmt_valid; + + unsigned int assume_fcs:1; }; int add_wep(struct wlantest *wt, const char *key);