Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2433c03b authored by Yeshwanth Sriram Guntuka's avatar Yeshwanth Sriram Guntuka Committed by Madan Koyyalamudi
Browse files

qcacmn: Do not intrabss forward EAPOL frames

Do not forward EAPOL frames that have DA different
from the SAP vdev mac addr.

Change-Id: I23959e38b5cbd845d369bebd6913150eca4551bf
CRs-Fixed: 2860248
parent 0549e6ec
Loading
Loading
Loading
Loading
+40 −1
Original line number Diff line number Diff line
@@ -2286,6 +2286,45 @@ void dp_rx_deliver_to_pkt_capture_no_peer(struct dp_soc *soc, qdf_nbuf_t nbuf,

#endif

#ifdef DISABLE_EAPOL_INTRABSS_FWD
/*
 * dp_rx_intrabss_fwd_wrapper() - Wrapper API for intrabss fwd. For EAPOL
 *  pkt with DA not equal to vdev mac addr, fwd is not allowed.
 * @soc: core txrx main context
 * @ta_peer: source peer entry
 * @rx_tlv_hdr: start address of rx tlvs
 * @nbuf: nbuf that has to be intrabss forwarded
 * @msdu_metadata: msdu metadata
 *
 * Return: true if it is forwarded else false
 */
static inline
bool dp_rx_intrabss_fwd_wrapper(struct dp_soc *soc, struct dp_peer *ta_peer,
				uint8_t *rx_tlv_hdr, qdf_nbuf_t nbuf,
				struct hal_rx_msdu_metadata msdu_metadata)
{
	if (qdf_unlikely(qdf_nbuf_is_ipv4_eapol_pkt(nbuf) &&
			 qdf_mem_cmp(qdf_nbuf_data(nbuf) +
				     QDF_NBUF_DEST_MAC_OFFSET,
				     ta_peer->vdev->mac_addr.raw,
				     QDF_MAC_ADDR_SIZE))) {
		qdf_nbuf_free(nbuf);
		DP_STATS_INC(soc, rx.err.intrabss_eapol_drop, 1);
		return true;
	}

	return dp_rx_intrabss_fwd(soc, ta_peer, rx_tlv_hdr, nbuf,
				  msdu_metadata);

}
#define DP_RX_INTRABSS_FWD(soc, peer, rx_tlv_hdr, nbuf, msdu_metadata) \
		dp_rx_intrabss_fwd_wrapper(soc, peer, rx_tlv_hdr, nbuf, \
					   msdu_metadata)
#else
#define DP_RX_INTRABSS_FWD(soc, peer, rx_tlv_hdr, nbuf, msdu_metadata) \
		dp_rx_intrabss_fwd(soc, peer, rx_tlv_hdr, nbuf, msdu_metadata)
#endif

/**
 * dp_rx_process() - Brain of the Rx processing functionality
 *		     Called from the bottom half (tasklet/NET_RX_SOFTIRQ)
@@ -2923,7 +2962,7 @@ uint32_t dp_rx_process(struct dp_intr *int_ctx, hal_ring_handle_t hal_ring_hdl,

			/* Intrabss-fwd */
			if (dp_rx_check_ap_bridge(vdev))
				if (dp_rx_intrabss_fwd(soc,
				if (DP_RX_INTRABSS_FWD(soc,
							peer,
							rx_tlv_hdr,
							nbuf,
+2 −0
Original line number Diff line number Diff line
@@ -5996,6 +5996,8 @@ void dp_txrx_path_stats(struct dp_soc *soc)
			       pdev->stats.rx.intra_bss.fail.bytes);
		DP_PRINT_STATS("intra-bss no mdns fwds %u msdus",
			       pdev->stats.rx.intra_bss.mdns_no_fwd);
		DP_PRINT_STATS("intra-bss EAPOL drops: %u",
			       soc->stats.rx.err.intrabss_eapol_drop);

		DP_PRINT_STATS("raw packets %u msdus ( %llu bytes),",
			       pdev->stats.rx.raw.num,
+2 −0
Original line number Diff line number Diff line
@@ -1008,6 +1008,8 @@ struct dp_soc_stats {
			uint32_t ssn_update_count;
			/* count of bar handling fail */
			uint32_t bar_handle_fail_count;
			/* EAPOL drop count in intrabss scenario */
			uint32_t intrabss_eapol_drop;
		} err;

		/* packet count per core - per ring */