qcacmn: Allow rx UDP packets during roaming before peer map is received

In VoIP cases, no or minimal packet drop is expected during
roaming. Currently, data packets are dropped in host if they
are received after roam sync indication from firmware and before
peer map indication is received due to invalid peer.
This change allows rx UDP data packets during roaming before
peer map indication is received from FW if peer's auth_status
received in roam_sync_indication from FW is authorised.

Change-Id: Ic518b7cd0aef48a2b0f8c923a2e20838b07f3d1f
CRs-Fixed: 3168603
此提交包含在:
Surabhi Vishnoi
2022-04-06 14:23:05 +05:30
提交者 Madan Koyyalamudi
父節點 5ad83e6c56
當前提交 ecaa0f1f6c
共有 7 個檔案被更改,包括 157 行新增1 行删除

查看文件

@@ -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))