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

Commit e1faf406 authored by Surabhi Vishnoi's avatar Surabhi Vishnoi Committed by Madan Koyyalamudi
Browse files

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
parent 528e81a1
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
/*
 * Copyright (c) 2011-2020 The Linux Foundation. All rights reserved.
 * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
 *
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
@@ -694,6 +695,33 @@ cdp_peer_delete(ol_txrx_soc_handle soc, uint8_t vdev_id,
	soc->ops->cmn_drv_ops->txrx_peer_delete(soc, vdev_id, peer_mac, bitmap);
}

#ifdef DP_RX_UDP_OVER_PEER_ROAM
static inline void
cdp_update_roaming_peer_in_vdev(ol_txrx_soc_handle soc, uint8_t vdev_id,
				uint8_t *peer_mac, uint32_t auth_status)
{
	if (!soc || !soc->ops) {
		QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG,
				"%s: Invalid Instance:", __func__);
		QDF_BUG(0);
		return;
	}

	if (!soc->ops->cmn_drv_ops ||
	    !soc->ops->cmn_drv_ops->txrx_update_roaming_peer)
		return;

	soc->ops->cmn_drv_ops->txrx_update_roaming_peer(soc, vdev_id,
							peer_mac, auth_status);
}
#else
static inline void
cdp_update_roaming_peer_in_vdev(ol_txrx_soc_handle soc, uint8_t vdev_id,
				uint8_t *peer_mac, uint32_t auth_status)
{
}
#endif

/**
 * cdp_peer_detach_sync() - peer detach sync callback
 * @soc: datapath soc handle
+7 −0
Original line number Diff line number Diff line
@@ -558,6 +558,13 @@ struct cdp_cmn_ops {
	QDF_STATUS (*set_vdev_pcp_tid_map)(struct cdp_soc_t *soc,
					   uint8_t vdev_id,
					   uint8_t pcp, uint8_t tid);
#ifdef DP_RX_UDP_OVER_PEER_ROAM
	QDF_STATUS (*txrx_update_roaming_peer)(struct cdp_soc_t *soc,
					       uint8_t vdev_id,
					       uint8_t *peer_mac,
					       uint32_t auth_status);
#endif

#ifdef QCA_MULTIPASS_SUPPORT
	QDF_STATUS (*set_vlan_groupkey)(struct cdp_soc_t *soc, uint8_t vdev_id,
					uint16_t vlan_id, uint16_t group_key);
+23 −0
Original line number Diff line number Diff line
@@ -7267,6 +7267,26 @@ static QDF_STATUS dp_peer_delete_wifi3(struct cdp_soc_t *soc_hdl,
	return QDF_STATUS_SUCCESS;
}

#ifdef DP_RX_UDP_OVER_PEER_ROAM
static QDF_STATUS dp_update_roaming_peer_wifi3(struct cdp_soc_t *soc_hdl,
					       uint8_t vdev_id,
					       uint8_t *peer_mac,
					       uint32_t auth_status)
{
	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
						     DP_MOD_ID_CDP);
	if (!vdev)
		return QDF_STATUS_E_FAILURE;

	vdev->roaming_peer_status = auth_status;
	qdf_mem_copy(vdev->roaming_peer_mac.raw, peer_mac,
		     QDF_MAC_ADDR_SIZE);
	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);

	return QDF_STATUS_SUCCESS;
}
#endif
/*
 * dp_get_vdev_mac_addr_wifi3() – Detach txrx peer
 * @soc_hdl: Datapath soc handle
@@ -11332,6 +11352,9 @@ static struct cdp_cmn_ops dp_ops_cmn = {
	.txrx_peer_ast_delete_by_pdev =
		dp_peer_ast_entry_del_by_pdev,
	.txrx_peer_delete = dp_peer_delete_wifi3,
#ifdef DP_RX_UDP_OVER_PEER_ROAM
	.txrx_update_roaming_peer = dp_update_roaming_peer_wifi3,
#endif
	.txrx_vdev_register = dp_vdev_register_wifi3,
	.txrx_soc_detach = dp_soc_detach_wifi3,
	.txrx_soc_deinit = dp_soc_deinit_wifi3,
+22 −0
Original line number Diff line number Diff line
@@ -2095,6 +2095,26 @@ static inline struct dp_peer *dp_peer_find_add_id(struct dp_soc *soc,
	return NULL;
}

#ifdef DP_RX_UDP_OVER_PEER_ROAM
void dp_rx_reset_roaming_peer(struct dp_soc *soc, uint8_t vdev_id,
			      uint8_t *peer_mac_addr)
{
	struct dp_vdev *vdev = NULL;

	vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_HTT);
	if (vdev) {
		if (qdf_mem_cmp(vdev->roaming_peer_mac.raw, peer_mac_addr,
				QDF_MAC_ADDR_SIZE) == 0) {
			vdev->roaming_peer_status =
						WLAN_ROAM_PEER_AUTH_STATUS_NONE;
			qdf_mem_zero(vdev->roaming_peer_mac.raw,
				     QDF_MAC_ADDR_SIZE);
		}
		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_HTT);
	}
}
#endif

/**
 * dp_rx_peer_map_handler() - handle peer map event from firmware
 * @soc_handle - genereic soc handle
@@ -2188,6 +2208,8 @@ dp_rx_peer_map_handler(struct dp_soc *soc, uint16_t peer_id,
				      vdev_id, ast_hash, is_wds);
	}

	dp_rx_reset_roaming_peer(soc, vdev_id, peer_mac_addr);

	return err;
}

+23 −0
Original line number Diff line number Diff line
/*
 * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
 * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
 *
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
@@ -542,6 +543,28 @@ dp_peer_update_state(struct dp_soc *soc,
}

void dp_print_ast_stats(struct dp_soc *soc);

#ifdef DP_RX_UDP_OVER_PEER_ROAM
/**
 * dp_rx_reset_roaming_peer() - Reset the roamed peer in vdev
 * @soc - dp soc pointer
 * @vdev_id - vdev id
 * @peer_mac_addr - mac address of the peer
 *
 * This function resets the roamed peer auth status and mac address
 * after peer map indication of same peer is received from firmware.
 *
 * Return: None
 */
void dp_rx_reset_roaming_peer(struct dp_soc *soc, uint8_t vdev_id,
			      uint8_t *peer_mac_addr);
#else
static inline void dp_rx_reset_roaming_peer(struct dp_soc *soc, uint8_t vdev_id,
					    uint8_t *peer_mac_addr)
{
}
#endif

QDF_STATUS dp_rx_peer_map_handler(struct dp_soc *soc, uint16_t peer_id,
				  uint16_t hw_peer_id, uint8_t vdev_id,
				  uint8_t *peer_mac_addr, uint16_t ast_hash,
Loading