qcacld-3.0: Set link agnostic flag for all action frames

FW drops the management frames received on the inactive link,
so timeout happens on SCS action frames from userspace that are
sent on inactive link.

Set link agnostic flag in all management frame of subtype action
so that FW can send the packet OTA on the active link.

Change-Id: I4677617b52eca3f933aae2c4a7584750a95b3302
CRs-Fixed: 3486974
这个提交包含在:
Vinod Kumar Pirla
2023-05-03 11:30:26 -07:00
提交者 Rahul Choudhary
父节点 dcb6e11aac
当前提交 14b1df5721

查看文件

@@ -37,6 +37,7 @@
#include <wlan_mlme_main.h> #include <wlan_mlme_main.h>
#include "wlan_mlme_api.h" #include "wlan_mlme_api.h"
#include <wlan_cm_api.h> #include <wlan_cm_api.h>
#include <wlan_mlo_mgr_sta.h>
/** /**
* p2p_psoc_get_tx_ops() - get p2p tx ops * p2p_psoc_get_tx_ops() - get p2p tx ops
@@ -1209,6 +1210,13 @@ static QDF_STATUS p2p_mgmt_tx(struct tx_action_context *tx_ctx,
mac_addr = wh->i_addr1; mac_addr = wh->i_addr1;
pdev_id = wlan_get_pdev_id_from_vdev_id(psoc, tx_ctx->vdev_id, pdev_id = wlan_get_pdev_id_from_vdev_id(psoc, tx_ctx->vdev_id,
WLAN_P2P_ID); WLAN_P2P_ID);
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, tx_ctx->vdev_id,
WLAN_P2P_ID);
if (!vdev) {
p2p_err("VDEV null");
return QDF_STATUS_E_INVAL;
}
peer = wlan_objmgr_get_peer(psoc, pdev_id, mac_addr, WLAN_P2P_ID); peer = wlan_objmgr_get_peer(psoc, pdev_id, mac_addr, WLAN_P2P_ID);
if (!peer) { if (!peer) {
mac_addr = wh->i_addr2; mac_addr = wh->i_addr2;
@@ -1216,34 +1224,26 @@ static QDF_STATUS p2p_mgmt_tx(struct tx_action_context *tx_ctx,
WLAN_P2P_ID); WLAN_P2P_ID);
} }
if (!peer) { if (!peer) {
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, opmode = wlan_vdev_mlme_get_opmode(vdev);
tx_ctx->vdev_id, /*
WLAN_P2P_ID); * For NAN iface, retrieves mac address from vdev
if (vdev) { * as it is self peer. Also, rand_mac_tx would be
opmode = wlan_vdev_mlme_get_opmode(vdev); * false as tx channel is not available.
/* */
* For NAN iface, retrieves mac address from vdev if (opmode == QDF_NAN_DISC_MODE || tx_ctx->rand_mac_tx) {
* as it is self peer. Also, rand_mac_tx would be mac_addr = wlan_vdev_mlme_get_mldaddr(vdev);
* false as tx channel is not available. /* for non-MLO case, mld address will zero */
*/ if (qdf_is_macaddr_zero(
if (opmode == QDF_NAN_DISC_MODE || (struct qdf_mac_addr *)mac_addr))
tx_ctx->rand_mac_tx) { mac_addr = wlan_vdev_mlme_get_macaddr(vdev);
mac_addr = wlan_vdev_mlme_get_mldaddr(vdev);
/* for non-MLO case, mld address will zero */
if (qdf_is_macaddr_zero(
(struct qdf_mac_addr *)mac_addr))
mac_addr =
wlan_vdev_mlme_get_macaddr(vdev);
peer = wlan_objmgr_get_peer(psoc, pdev_id, peer = wlan_objmgr_get_peer(psoc, pdev_id, mac_addr,
mac_addr, WLAN_P2P_ID);
WLAN_P2P_ID);
}
wlan_objmgr_vdev_release_ref(vdev, WLAN_P2P_ID);
} }
} }
if (!peer) { if (!peer) {
p2p_err("no valid peer"); p2p_err("no valid peer");
wlan_objmgr_vdev_release_ref(vdev, WLAN_P2P_ID);
return QDF_STATUS_E_INVAL; return QDF_STATUS_E_INVAL;
} }
@@ -1264,11 +1264,17 @@ static QDF_STATUS p2p_mgmt_tx(struct tx_action_context *tx_ctx,
tx_ctx->nbuf = packet; tx_ctx->nbuf = packet;
if (mlo_is_mld_sta(vdev) && tx_ctx->frame_info.type == P2P_FRAME_MGMT &&
tx_ctx->frame_info.sub_type == P2P_MGMT_ACTION) {
mgmt_param.mlo_link_agnostic = true;
}
status = wlan_mgmt_txrx_mgmt_frame_tx(peer, tx_ctx->p2p_soc_obj, status = wlan_mgmt_txrx_mgmt_frame_tx(peer, tx_ctx->p2p_soc_obj,
packet, tx_comp_cb, tx_ota_comp_cb, packet, tx_comp_cb, tx_ota_comp_cb,
WLAN_UMAC_COMP_P2P, &mgmt_param); WLAN_UMAC_COMP_P2P, &mgmt_param);
wlan_objmgr_peer_release_ref(peer, WLAN_P2P_ID); wlan_objmgr_peer_release_ref(peer, WLAN_P2P_ID);
wlan_objmgr_vdev_release_ref(vdev, WLAN_P2P_ID);
return status; return status;
} }