Browse Source

qcacmn: Drop non-eapol packets for unauthorized peer

Until peer is authorized, drop non-eapol frames in
rx error path.

Change-Id: I339b9248b8ae63e4b6ab0268c4ed28130404ba33
Varsha Mishra 4 years ago
parent
commit
b0d37772c7
1 changed files with 18 additions and 3 deletions
  1. 18 3
      dp/wifi3.0/dp_rx_err.c

+ 18 - 3
dp/wifi3.0/dp_rx_err.c

@@ -1139,6 +1139,7 @@ dp_rx_null_q_desc_handle(struct dp_soc *soc, qdf_nbuf_t nbuf,
 	qdf_ether_header_t *eh;
 	qdf_ether_header_t *eh;
 	struct hal_rx_msdu_metadata msdu_metadata;
 	struct hal_rx_msdu_metadata msdu_metadata;
 	uint16_t sa_idx = 0;
 	uint16_t sa_idx = 0;
+	bool is_eapol;
 
 
 	qdf_nbuf_set_rx_chfrag_start(nbuf,
 	qdf_nbuf_set_rx_chfrag_start(nbuf,
 				hal_rx_msdu_end_first_msdu_get(soc->hal_soc,
 				hal_rx_msdu_end_first_msdu_get(soc->hal_soc,
@@ -1293,6 +1294,22 @@ dp_rx_null_q_desc_handle(struct dp_soc *soc, qdf_nbuf_t nbuf,
 			/* IEEE80211_SEQ_MAX indicates invalid start_seq */
 			/* IEEE80211_SEQ_MAX indicates invalid start_seq */
 	}
 	}
 
 
+	eh = (qdf_ether_header_t *)qdf_nbuf_data(nbuf);
+
+	if (!peer->authorize) {
+		is_eapol = qdf_nbuf_is_ipv4_eapol_pkt(nbuf) ||
+			   qdf_nbuf_is_ipv4_wapi_pkt(nbuf);
+
+		if (is_eapol) {
+			if (qdf_mem_cmp(eh->ether_dhost,
+					&vdev->mac_addr.raw[0],
+					QDF_MAC_ADDR_SIZE))
+				goto drop_nbuf;
+		} else {
+			goto drop_nbuf;
+		}
+	}
+
 	/*
 	/*
 	 * Drop packets in this path if cce_match is found. Packets will come
 	 * Drop packets in this path if cce_match is found. Packets will come
 	 * in following path depending on whether tidQ is setup.
 	 * in following path depending on whether tidQ is setup.
@@ -1306,8 +1323,7 @@ dp_rx_null_q_desc_handle(struct dp_soc *soc, qdf_nbuf_t nbuf,
 	 *    to stack.
 	 *    to stack.
 	 */
 	 */
 	if (qdf_unlikely(dp_rx_err_cce_drop(soc, vdev, nbuf, rx_tlv_hdr))) {
 	if (qdf_unlikely(dp_rx_err_cce_drop(soc, vdev, nbuf, rx_tlv_hdr))) {
-		qdf_nbuf_free(nbuf);
-		return QDF_STATUS_E_FAILURE;
+		goto drop_nbuf;
 	}
 	}
 
 
 	if (qdf_unlikely(vdev->rx_decap_type == htt_cmn_pkt_type_raw)) {
 	if (qdf_unlikely(vdev->rx_decap_type == htt_cmn_pkt_type_raw)) {
@@ -1334,7 +1350,6 @@ dp_rx_null_q_desc_handle(struct dp_soc *soc, qdf_nbuf_t nbuf,
 				 soc->hal_soc, rx_tlv_hdr) &&
 				 soc->hal_soc, rx_tlv_hdr) &&
 				 (vdev->rx_decap_type ==
 				 (vdev->rx_decap_type ==
 				  htt_cmn_pkt_type_ethernet))) {
 				  htt_cmn_pkt_type_ethernet))) {
-			eh = (qdf_ether_header_t *)qdf_nbuf_data(nbuf);
 			DP_STATS_INC_PKT(peer, rx.multicast, 1,
 			DP_STATS_INC_PKT(peer, rx.multicast, 1,
 					 qdf_nbuf_len(nbuf));
 					 qdf_nbuf_len(nbuf));