summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYeshwanth Sriram Guntuka <ysriramg@codeaurora.org>2021-02-19 19:23:23 +0530
committerchenpaul <chenpaul@google.com>2021-03-23 19:03:00 +0800
commit230f31c2170f2ebb32fd53c18ce07a4400ccecfb (patch)
treee175dff6b517d828bfa6f50ce8a701b4f9a0f56e
parent4f26d740c46ae149a04607fea45592cda522bd40 (diff)
downloadqcacld-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.c51
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);