|
@@ -2269,6 +2269,49 @@ dp_rx_desc_nbuf_len_sanity_check(struct dp_soc *soc, uint32_t pkt_len) { }
|
|
|
#endif
|
|
|
|
|
|
#ifdef DP_RX_PKT_NO_PEER_DELIVER
|
|
|
+#ifdef DP_RX_UDP_OVER_PEER_ROAM
|
|
|
+/**
|
|
|
+ * dp_rx_is_udp_allowed_over_roam_peer() - check if udp data received
|
|
|
+ * during roaming
|
|
|
+ * @vdev: dp_vdev pointer
|
|
|
+ * @rx_tlv_hdr: rx tlv header
|
|
|
+ * @nbuf: pkt skb pointer
|
|
|
+ *
|
|
|
+ * This function will check if rx udp data is received from authorised
|
|
|
+ * roamed peer before peer map indication is received from FW after
|
|
|
+ * roaming. This is needed for VoIP scenarios in which packet loss
|
|
|
+ * expected during roaming is minimal.
|
|
|
+ *
|
|
|
+ * Return: bool
|
|
|
+ */
|
|
|
+static bool dp_rx_is_udp_allowed_over_roam_peer(struct dp_vdev *vdev,
|
|
|
+ uint8_t *rx_tlv_hdr,
|
|
|
+ qdf_nbuf_t nbuf)
|
|
|
+{
|
|
|
+ char *hdr_desc;
|
|
|
+ struct ieee80211_frame *wh = NULL;
|
|
|
+
|
|
|
+ hdr_desc = hal_rx_desc_get_80211_hdr(vdev->pdev->soc->hal_soc,
|
|
|
+ rx_tlv_hdr);
|
|
|
+ wh = (struct ieee80211_frame *)hdr_desc;
|
|
|
+
|
|
|
+ if (vdev->roaming_peer_status ==
|
|
|
+ WLAN_ROAM_PEER_AUTH_STATUS_AUTHENTICATED &&
|
|
|
+ !qdf_mem_cmp(vdev->roaming_peer_mac.raw, wh->i_addr2,
|
|
|
+ QDF_MAC_ADDR_SIZE) && (qdf_nbuf_is_ipv4_udp_pkt(nbuf) ||
|
|
|
+ qdf_nbuf_is_ipv6_udp_pkt(nbuf)))
|
|
|
+ return true;
|
|
|
+
|
|
|
+ return false;
|
|
|
+}
|
|
|
+#else
|
|
|
+static bool dp_rx_is_udp_allowed_over_roam_peer(struct dp_vdev *vdev,
|
|
|
+ uint8_t *rx_tlv_hdr,
|
|
|
+ qdf_nbuf_t nbuf)
|
|
|
+{
|
|
|
+ return false;
|
|
|
+}
|
|
|
+#endif
|
|
|
/**
|
|
|
* dp_rx_deliver_to_stack_no_peer() - try deliver rx data even if
|
|
|
* no corresbonding peer found
|
|
@@ -2316,7 +2359,8 @@ void dp_rx_deliver_to_stack_no_peer(struct dp_soc *soc, qdf_nbuf_t nbuf)
|
|
|
qdf_nbuf_set_pktlen(nbuf, pkt_len);
|
|
|
qdf_nbuf_pull_head(nbuf, soc->rx_pkt_tlv_size + l2_hdr_offset);
|
|
|
|
|
|
- if (dp_rx_is_special_frame(nbuf, frame_mask)) {
|
|
|
+ if (dp_rx_is_special_frame(nbuf, frame_mask) ||
|
|
|
+ dp_rx_is_udp_allowed_over_roam_peer(vdev, rx_tlv_hdr, nbuf)) {
|
|
|
qdf_nbuf_set_exc_frame(nbuf, 1);
|
|
|
if (QDF_STATUS_SUCCESS !=
|
|
|
vdev->osif_rx(vdev->osif_vdev, nbuf))
|