diff options
author | Yeshwanth Sriram Guntuka <ysriramg@codeaurora.org> | 2021-02-19 19:23:23 +0530 |
---|---|---|
committer | chenpaul <chenpaul@google.com> | 2021-03-23 19:03:00 +0800 |
commit | 230f31c2170f2ebb32fd53c18ce07a4400ccecfb (patch) | |
tree | e175dff6b517d828bfa6f50ce8a701b4f9a0f56e | |
parent | 4f26d740c46ae149a04607fea45592cda522bd40 (diff) | |
download | qcacld-230f31c2170f2ebb32fd53c18ce07a4400ccecfb.tar.gz |
qcacld-3.0: Do not intrabss fwd EAPOL frames in IPA exc path
Do not intrabss forward EAPOL frames received in IPA
exception path.
Change-Id: I0be68ec2c186a7b64d4d2f1c3de7dbb20e49d860
CRs-Fixed: 2860225
Bug: 182958222
-rw-r--r-- | components/ipa/core/src/wlan_ipa_core.c | 51 |
1 files changed, 49 insertions, 2 deletions
diff --git a/components/ipa/core/src/wlan_ipa_core.c b/components/ipa/core/src/wlan_ipa_core.c index 0d786989d9..2aafe35d4f 100644 --- a/components/ipa/core/src/wlan_ipa_core.c +++ b/components/ipa/core/src/wlan_ipa_core.c @@ -746,6 +746,41 @@ static enum wlan_ipa_forward_type wlan_ipa_intrabss_forward( } /** + * wlan_ipa_eapol_intrabss_fwd_check() - Check if eapol pkt intrabss fwd is + * allowed or not + * @ipa_ctx: IPA global context + * @vdev_id: vdev id + * @nbuf: network buffer + * + * Return: true if intrabss fwd is allowed for eapol else false + */ +static bool +wlan_ipa_eapol_intrabss_fwd_check(struct wlan_ipa_priv *ipa_ctx, + uint8_t vdev_id, qdf_nbuf_t nbuf) +{ + struct cdp_vdev *vdev; + uint8_t *vdev_mac_addr; + + vdev = cdp_get_vdev_from_vdev_id(ipa_ctx->dp_soc, ipa_ctx->dp_pdev, + vdev_id); + if (!vdev) { + ipa_err_rl("txrx vdev is NULL for vdev_id = %d", vdev_id); + return false; + } + + vdev_mac_addr = cdp_get_vdev_mac_addr(ipa_ctx->dp_soc, vdev); + + if (!vdev_mac_addr) + return false; + + if (qdf_mem_cmp(qdf_nbuf_data(nbuf) + QDF_NBUF_DEST_MAC_OFFSET, + vdev_mac_addr, QDF_MAC_ADDR_SIZE)) + return false; + + return true; +} + +/** * __wlan_ipa_w2i_cb() - WLAN to IPA callback handler * @priv: pointer to private data registered with IPA (we register a * pointer to the global IPA context) @@ -830,9 +865,21 @@ static void __wlan_ipa_w2i_cb(void *priv, qdf_ipa_dp_evt_type_t evt, QDF_NBUF_SRC_MAC_OFFSET, QDF_MAC_ADDR_SIZE); - if (qdf_nbuf_is_ipv4_eapol_pkt(skb) || - qdf_nbuf_is_ipv4_wapi_pkt(skb)) + if (qdf_nbuf_is_ipv4_eapol_pkt(skb)) { is_eapol_wapi = true; + if (iface_context->device_mode == QDF_SAP_MODE && + !wlan_ipa_eapol_intrabss_fwd_check(ipa_ctx, + iface_context->session_id, skb)) { + ipa_err_rl("EAPOL intrabss fwd drop DA: %pM", + qdf_nbuf_data(skb) + + QDF_NBUF_DEST_MAC_OFFSET); + ipa_ctx->ipa_rx_internal_drop_count++; + dev_kfree_skb_any(skb); + return; + } + } else if (qdf_nbuf_is_ipv4_wapi_pkt(skb)) { + is_eapol_wapi = true; + } peer = cdp_peer_find_by_addr(ipa_ctx->dp_soc, ipa_ctx->dp_pdev, peer_mac_addr.bytes, &sta_idx); |