From 4bb2e1a3f28d948ee84ea6f3c1a0ae456478437f Mon Sep 17 00:00:00 2001 From: Yu Tian Date: Tue, 27 Dec 2022 04:59:19 -0800 Subject: [PATCH] qcacmn: Add SA check for Decrypt error frame Usually decrypt error frames will be reported and cause a disconnection. In some cases, the disconnection is unwanted. Change is aimed to do additional check for frame SA, if it's received from a valid peer, then don't report it to protocol. Change-Id: I19d9acffc5ebd2c20abdf19eebc02f6875f762ca CRs-Fixed: 3363352 --- dp/wifi3.0/dp_rx.c | 16 ++++++++++++++++ dp/wifi3.0/dp_stats.c | 2 ++ dp/wifi3.0/dp_types.h | 2 ++ 3 files changed, 20 insertions(+) diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 1232f1451c..1ac232a3e4 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -1392,6 +1392,7 @@ uint8_t dp_rx_process_invalid_peer(struct dp_soc *soc, qdf_nbuf_t mpdu, struct dp_pdev *pdev; struct dp_vdev *vdev = NULL; struct ieee80211_frame *wh; + struct dp_peer *peer = NULL; uint8_t *rx_tlv_hdr = qdf_nbuf_data(mpdu); uint8_t *rx_pkt_hdr = hal_rx_pkt_hdr_get(soc->hal_soc, rx_tlv_hdr); @@ -1430,6 +1431,21 @@ uint8_t dp_rx_process_invalid_peer(struct dp_soc *soc, qdf_nbuf_t mpdu, } out: + if (vdev->opmode == wlan_op_mode_ap) { + peer = dp_peer_find_hash_find(soc, wh->i_addr2, 0, + vdev->vdev_id, + DP_MOD_ID_RX_ERR); + /* If SA is a valid peer in vdev, + * don't send disconnect + */ + if (peer) { + dp_peer_unref_delete(peer, DP_MOD_ID_RX_ERR); + DP_STATS_INC(soc, rx.err.decrypt_err_drop, 1); + dp_err_rl("invalid peer frame with correct SA/RA is freed"); + goto free; + } + } + if (soc->cdp_soc.ol_ops->rx_invalid_peer) soc->cdp_soc.ol_ops->rx_invalid_peer(vdev->vdev_id, wh); free: diff --git a/dp/wifi3.0/dp_stats.c b/dp/wifi3.0/dp_stats.c index 974f5dbefe..918fbd78de 100644 --- a/dp/wifi3.0/dp_stats.c +++ b/dp/wifi3.0/dp_stats.c @@ -8086,6 +8086,8 @@ dp_print_soc_rx_stats(struct dp_soc *soc) soc->stats.rx.err.rx_invalid_tid_err); DP_PRINT_STATS("Rx Defrag Address1 Invalid:%d", soc->stats.rx.err.defrag_ad1_invalid); + DP_PRINT_STATS("Rx decrypt error frame for valid peer:%d", + soc->stats.rx.err.decrypt_err_drop); } #ifdef FEATURE_TSO_STATS diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index ab71bfd10f..874e6810ae 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -1345,6 +1345,8 @@ struct dp_soc_stats { uint32_t rx_invalid_tid_err; /* Invalid address1 in defrag path*/ uint32_t defrag_ad1_invalid; + /* decrypt error drop */ + uint32_t decrypt_err_drop; } err; /* packet count per core - per ring */