|
@@ -804,6 +804,35 @@ void dp_rx_da_learn(struct dp_soc *soc, uint8_t *rx_tlv_hdr,
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
+#ifdef QCA_SUPPORT_TX_MIN_RATES_FOR_SPECIAL_FRAMES
|
|
|
|
+/*
|
|
|
|
+ * dp_classify_critical_pkts() - API for marking critical packets
|
|
|
|
+ * @soc: dp_soc context
|
|
|
|
+ * @vdev: vdev on which packet is to be sent
|
|
|
|
+ * @nbuf: nbuf that has to be classified
|
|
|
|
+ *
|
|
|
|
+ * The function parses the packet, identifies whether its a critical frame and
|
|
|
|
+ * marks QDF_NBUF_CB_TX_EXTRA_IS_CRITICAL bit in qdf_nbuf_cb for the nbuf.
|
|
|
|
+ * Code for marking which frames are CRITICAL is accessed via callback.
|
|
|
|
+ * EAPOL, ARP, DHCP, DHCPv6, ICMPv6 NS/NA are the typical critical frames.
|
|
|
|
+ *
|
|
|
|
+ * Return: None
|
|
|
|
+ */
|
|
|
|
+static
|
|
|
|
+void dp_classify_critical_pkts(struct dp_soc *soc, struct dp_vdev *vdev,
|
|
|
|
+ qdf_nbuf_t nbuf)
|
|
|
|
+{
|
|
|
|
+ if (vdev->tx_classify_critical_pkt_cb)
|
|
|
|
+ vdev->tx_classify_critical_pkt_cb(vdev->osif_vdev, nbuf);
|
|
|
|
+}
|
|
|
|
+#else
|
|
|
|
+static inline
|
|
|
|
+void dp_classify_critical_pkts(struct dp_soc *soc, struct dp_vdev *vdev,
|
|
|
|
+ qdf_nbuf_t nbuf)
|
|
|
|
+{
|
|
|
|
+}
|
|
|
|
+#endif
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* dp_rx_intrabss_mcbc_fwd() - Does intrabss forward for mcast packets
|
|
* dp_rx_intrabss_mcbc_fwd() - Does intrabss forward for mcast packets
|
|
*
|
|
*
|
|
@@ -840,8 +869,12 @@ bool dp_rx_intrabss_mcbc_fwd(struct dp_soc *soc, struct dp_txrx_peer *ta_peer,
|
|
return false;
|
|
return false;
|
|
|
|
|
|
len = QDF_NBUF_CB_RX_PKT_LEN(nbuf);
|
|
len = QDF_NBUF_CB_RX_PKT_LEN(nbuf);
|
|
|
|
+
|
|
qdf_nbuf_set_tx_fctx_type(nbuf_copy, &ta_peer->peer_id,
|
|
qdf_nbuf_set_tx_fctx_type(nbuf_copy, &ta_peer->peer_id,
|
|
CB_FTYPE_INTRABSS_FWD);
|
|
CB_FTYPE_INTRABSS_FWD);
|
|
|
|
+
|
|
|
|
+ dp_classify_critical_pkts(soc, ta_peer->vdev, nbuf_copy);
|
|
|
|
+
|
|
if (dp_tx_send((struct cdp_soc_t *)soc,
|
|
if (dp_tx_send((struct cdp_soc_t *)soc,
|
|
ta_peer->vdev->vdev_id, nbuf_copy)) {
|
|
ta_peer->vdev->vdev_id, nbuf_copy)) {
|
|
DP_PEER_PER_PKT_STATS_INC_PKT(ta_peer, rx.intra_bss.fail, 1,
|
|
DP_PEER_PER_PKT_STATS_INC_PKT(ta_peer, rx.intra_bss.fail, 1,
|
|
@@ -899,6 +932,8 @@ bool dp_rx_intrabss_ucast_fwd(struct dp_soc *soc, struct dp_txrx_peer *ta_peer,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ dp_classify_critical_pkts(soc, ta_peer->vdev, nbuf);
|
|
|
|
+
|
|
if (!dp_tx_send((struct cdp_soc_t *)soc,
|
|
if (!dp_tx_send((struct cdp_soc_t *)soc,
|
|
tx_vdev_id, nbuf)) {
|
|
tx_vdev_id, nbuf)) {
|
|
DP_PEER_PER_PKT_STATS_INC_PKT(ta_peer, rx.intra_bss.pkts, 1,
|
|
DP_PEER_PER_PKT_STATS_INC_PKT(ta_peer, rx.intra_bss.pkts, 1,
|