qcacld-3.0: Add mlo ie and eht cap to tdls mgmt frames

Add MLO link identifier and EHT cap to tdls discovery request,
discovery response, setup request and setup response.
Pack Multi-Link IE for TDLS mgmt frames.

Change-Id: I6a1c23087a0b7caddd840e13ed1b85b51f2da324
CRs-Fixed: 3436047
Dieser Commit ist enthalten in:
Paul Zhang
2023-04-03 13:49:05 +08:00
committet von Madan Koyyalamudi
Ursprung 84fecef03b
Commit df6ffbc178
5 geänderte Dateien mit 325 neuen und 9 gelöschten Zeilen

Datei anzeigen

@@ -1445,6 +1445,16 @@ QDF_STATUS populate_dot11f_bcn_mlo_ie(struct mac_context *mac_ctx,
QDF_STATUS populate_dot11f_probe_req_mlo_ie(struct mac_context *mac_ctx,
struct pe_session *session);
/**
* populate_dot11f_tdls_mgmt_mlo_ie() - populate mlo ie for tdls mgmt frame
* @mac_ctx: Global MAC context
* @session: PE session
*
* Return: QDF_STATUS_SUCCESS of no error
*/
QDF_STATUS populate_dot11f_tdls_mgmt_mlo_ie(struct mac_context *mac_ctx,
struct pe_session *session);
/**
* populate_dot11f_mlo_rnr() - populate rnr for mlo
* @mac_ctx: Global MAC context

Datei anzeigen

@@ -1326,6 +1326,22 @@ lim_send_probe_req_frame_mlo(struct mac_context *mac_ctx,
return session->mlo_ie_total_len;
}
uint16_t
lim_send_tdls_mgmt_frame_mlo(struct mac_context *mac_ctx,
struct pe_session *session)
{
QDF_STATUS status;
session->mlo_ie_total_len = 0;
qdf_mem_zero(&session->mlo_ie, sizeof(session->mlo_ie));
status = populate_dot11f_tdls_mgmt_mlo_ie(mac_ctx, session);
if (QDF_IS_STATUS_SUCCESS(status))
session->mlo_ie_total_len =
lim_caculate_mlo_ie_length(&session->mlo_ie);
return session->mlo_ie_total_len;
}
uint16_t
lim_get_frame_mlo_ie_len(struct pe_session *session)
{

Datei anzeigen

@@ -322,6 +322,16 @@ uint16_t
lim_send_probe_req_frame_mlo(struct mac_context *mac_ctx,
struct pe_session *session);
/**
* lim_send_tdls_mgmt_frame_mlo() - Prepare ML IE for tdls mgmt frame
* @mac_ctx: pointer to mac_context
* @session: pointer to pe_session
*
* Return: the actual ML IE length
*/
uint16_t lim_send_tdls_mgmt_frame_mlo(struct mac_context *mac_ctx,
struct pe_session *session);
/**
* lim_get_frame_mlo_ie_len() - get ML IE length
* @session: pointer to pe_session
@@ -506,6 +516,13 @@ lim_send_bcn_frame_mlo(struct mac_context *mac_ctx, struct pe_session *session)
return 0;
}
static inline uint16_t
lim_send_tdls_mgmt_frame_mlo(struct mac_context *mac_ctx,
struct pe_session *session)
{
return 0;
}
static inline
uint16_t lim_get_frame_mlo_ie_len(struct pe_session *session)
{

Datei anzeigen

@@ -75,6 +75,7 @@
#include "wlan_tdls_public_structs.h"
#include "wlan_cfg80211_tdls.h"
#include "wlan_tdls_api.h"
#include "lim_mlo.h"
/* define NO_PAD_TDLS_MIN_8023_SIZE to NOT padding: See CR#447630
There was IOT issue with cisco 1252 open mode, where it pads
@@ -558,6 +559,7 @@ static QDF_STATUS lim_send_tdls_dis_req_frame(struct mac_context *mac,
uint32_t padLen = 0;
#endif
uint8_t smeSessionId = 0;
uint16_t mlo_ie_len = 0;
if (!pe_session) {
pe_err("pe_session is NULL");
@@ -590,6 +592,9 @@ static QDF_STATUS lim_send_tdls_dis_req_frame(struct mac_context *mac,
&tdls_dis_req->LinkIdentifier,
peer_mac, TDLS_INITIATOR);
if (wlan_vdev_mlme_is_mlo_vdev(pe_session->vdev))
mlo_ie_len = lim_send_tdls_mgmt_frame_mlo(mac, pe_session);
/*
* now we pack it. First, how much space are we going to need?
*/
@@ -615,7 +620,8 @@ static QDF_STATUS lim_send_tdls_dis_req_frame(struct mac_context *mac,
? sizeof(tSirMacDataHdr3a) :
sizeof(tSirMacMgmtHdr))
+ sizeof(eth_890d_header)
+ PAYLOAD_TYPE_TDLS_SIZE;
+ PAYLOAD_TYPE_TDLS_SIZE
+ mlo_ie_len;
#ifndef NO_PAD_TDLS_MIN_8023_SIZE
/* IOT issue with some AP : some AP doesn't like the data packet size < minimum 802.3 frame length (64)
@@ -674,6 +680,19 @@ static QDF_STATUS lim_send_tdls_dis_req_frame(struct mac_context *mac,
pe_warn("There were warnings while packing TDLS Discovery Request (0x%08x)",
status);
}
if (mlo_ie_len) {
qdf_status = lim_fill_complete_mlo_ie(pe_session, mlo_ie_len,
pFrame + header_offset +
nPayload);
if (QDF_IS_STATUS_ERROR(qdf_status)) {
pe_debug("assemble ml ie error");
mlo_ie_len = 0;
}
nPayload += mlo_ie_len;
}
qdf_mem_free(tdls_dis_req);
#ifndef NO_PAD_TDLS_MIN_8023_SIZE
@@ -1442,10 +1461,53 @@ static void lim_tdls_check_and_force_he_ldpc_cap(struct pe_session *pe_session,
#endif
#ifdef WLAN_FEATURE_11BE
static uint8_t *
lim_ieee80211_pack_ehtcap_tdls(struct mac_context *mac,
struct pe_session *pe_session, uint8_t *len)
{
tDot11fIEhe_cap he_cap;
uint8_t *eht_cap_ie;
bool is_band_2g;
uint32_t self_mode;
if (!pe_session || !len)
return NULL;
eht_cap_ie = qdf_mem_malloc(WLAN_MAX_IE_LEN + 2);
if (!eht_cap_ie) {
pe_err("malloc failed for eht_cap_ie");
*len = 0;
return NULL;
}
is_band_2g = WLAN_REG_IS_24GHZ_CH_FREQ(pe_session->curr_op_freq);
self_mode = mac->mlme_cfg->dot11_mode.dot11_mode;
populate_dot11f_set_tdls_he_cap(mac, self_mode, &he_cap,
NULL, pe_session);
lim_ieee80211_pack_ehtcap(eht_cap_ie, pe_session->eht_config,
he_cap, is_band_2g);
*len = eht_cap_ie[1] + 2;
return eht_cap_ie;
}
#else
static uint8_t *
lim_ieee80211_pack_ehtcap_tdls(struct mac_context *mac,
struct pe_session *pe_session, uint8_t *len)
{
if (!mac || !pe_session || !len)
return NULL;
*len = 0;
return NULL;
}
#endif
/*
* Send TDLS discovery response frame on direct link.
*/
static QDF_STATUS lim_send_tdls_dis_rsp_frame(struct mac_context *mac,
struct qdf_mac_addr peer_mac,
uint8_t dialog,
@@ -1468,6 +1530,8 @@ static QDF_STATUS lim_send_tdls_dis_rsp_frame(struct mac_context *mac,
/* As of now, we hardcoded to max channel bonding of dot11Mode (i.e HT80 for 11ac/HT40 for 11n) */
/* uint32_t tdlsChannelBondingMode; */
uint8_t smeSessionId = 0;
uint16_t mlo_ie_len = 0;
uint8_t *eht_cap_ie = NULL, eht_cap_ie_len = 0;
if (!pe_session) {
pe_err("pe_session is NULL");
@@ -1533,6 +1597,19 @@ static QDF_STATUS lim_send_tdls_dis_rsp_frame(struct mac_context *mac,
lim_tdls_fill_dis_rsp_he_cap(mac, selfDot11Mode, tdls_dis_rsp,
pe_session);
if (wlan_vdev_mlme_is_mlo_vdev(pe_session->vdev))
mlo_ie_len = lim_send_tdls_mgmt_frame_mlo(mac, pe_session);
if (lim_is_session_eht_capable(pe_session)) {
eht_cap_ie = lim_ieee80211_pack_ehtcap_tdls(mac, pe_session,
&eht_cap_ie_len);
if (!eht_cap_ie) {
pe_err("malloc failed for eht_cap_ie");
qdf_mem_free(tdls_dis_rsp);
return QDF_STATUS_E_FAILURE;
}
}
/* Populate TDLS offchannel param only if offchannel is enabled
* and TDLS Channel Switching is not prohibited by AP in ExtCap
* IE in assoc/re-assoc response.
@@ -1572,7 +1649,8 @@ static QDF_STATUS lim_send_tdls_dis_rsp_frame(struct mac_context *mac,
* 8 bytes of RFC 1042 header
*/
nBytes = nPayload + sizeof(tSirMacMgmtHdr) + addIeLen;
nBytes = nPayload + sizeof(tSirMacMgmtHdr) + addIeLen +
eht_cap_ie_len + mlo_ie_len;
/* Ok-- try to allocate memory from MGMT PKT pool */
qdf_status = cds_packet_alloc((uint16_t) nBytes, (void **)&pFrame,
@@ -1580,6 +1658,7 @@ static QDF_STATUS lim_send_tdls_dis_rsp_frame(struct mac_context *mac,
if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
pe_err("Failed to allocate %d bytes for a TDLS Discovery Request",
nBytes);
qdf_mem_free(eht_cap_ie);
qdf_mem_free(tdls_dis_rsp);
return QDF_STATUS_E_NOMEM;
}
@@ -1610,11 +1689,11 @@ static QDF_STATUS lim_send_tdls_dis_rsp_frame(struct mac_context *mac,
status = dot11f_pack_tdls_dis_rsp(mac, tdls_dis_rsp, pFrame +
sizeof(tSirMacMgmtHdr),
nPayload, &nPayload);
if (DOT11F_FAILED(status)) {
pe_err("Failed to pack a TDLS discovery response (0x%08x)",
status);
cds_packet_free((void *)pPacket);
qdf_mem_free(eht_cap_ie);
qdf_mem_free(tdls_dis_rsp);
return QDF_STATUS_E_FAILURE;
} else if (DOT11F_WARNED(status)) {
@@ -1622,6 +1701,29 @@ static QDF_STATUS lim_send_tdls_dis_rsp_frame(struct mac_context *mac,
status);
}
if (eht_cap_ie_len) {
/* Copy the EHT IE to the end of the frame */
qdf_mem_copy(pFrame + sizeof(tSirMacMgmtHdr) + nPayload,
eht_cap_ie, eht_cap_ie_len);
qdf_mem_free(eht_cap_ie);
nPayload += eht_cap_ie_len;
}
if (mlo_ie_len) {
qdf_status = lim_fill_complete_mlo_ie(pe_session, mlo_ie_len,
pFrame +
sizeof(tSirMacMgmtHdr) +
nPayload);
if (QDF_IS_STATUS_ERROR(qdf_status)) {
pe_debug("assemble ml ie error");
mlo_ie_len = 0;
}
nPayload += mlo_ie_len;
}
qdf_mem_free(tdls_dis_rsp);
if (0 != addIeLen) {
@@ -1662,7 +1764,6 @@ static QDF_STATUS lim_send_tdls_dis_rsp_frame(struct mac_context *mac,
}
return QDF_STATUS_SUCCESS;
}
/*
@@ -1800,6 +1901,8 @@ QDF_STATUS lim_send_tdls_link_setup_req_frame(struct mac_context *mac,
uint32_t selfDot11Mode;
uint8_t smeSessionId = 0;
uint8_t sp_length = 0;
uint16_t mlo_ie_len = 0;
uint8_t *eht_cap_ie = NULL, eht_cap_ie_len = 0;
/* Placeholder to support different channel bonding mode of TDLS than AP. */
/* Today, WNI_CFG_CHANNEL_BONDING_MODE will be overwritten when connecting to AP */
@@ -1923,6 +2026,19 @@ QDF_STATUS lim_send_tdls_link_setup_req_frame(struct mac_context *mac,
populate_dotf_tdls_vht_aid(mac, selfDot11Mode, peer_mac,
&tdls_setup_req->AID, pe_session);
if (wlan_vdev_mlme_is_mlo_vdev(pe_session->vdev))
mlo_ie_len = lim_send_tdls_mgmt_frame_mlo(mac, pe_session);
if (lim_is_session_eht_capable(pe_session)) {
eht_cap_ie = lim_ieee80211_pack_ehtcap_tdls(mac, pe_session,
&eht_cap_ie_len);
if (!eht_cap_ie) {
pe_err("malloc failed for eht_cap_ie");
qdf_mem_free(tdls_setup_req);
return QDF_STATUS_E_FAILURE;
}
}
/* Populate TDLS offchannel param only if offchannel is enabled
* and TDLS Channel Switching is not prohibited by AP in ExtCap
* IE in assoc/re-assoc response.
@@ -1966,7 +2082,8 @@ QDF_STATUS lim_send_tdls_link_setup_req_frame(struct mac_context *mac,
? sizeof(tSirMacDataHdr3a) :
sizeof(tSirMacMgmtHdr))
+ sizeof(eth_890d_header)
+ PAYLOAD_TYPE_TDLS_SIZE + addIeLen;
+ PAYLOAD_TYPE_TDLS_SIZE + addIeLen + eht_cap_ie_len
+ mlo_ie_len;
/* Ok-- try to allocate memory from MGMT PKT pool */
qdf_status = cds_packet_alloc((uint16_t)nbytes, (void **)&frame,
@@ -1974,6 +2091,7 @@ QDF_STATUS lim_send_tdls_link_setup_req_frame(struct mac_context *mac,
if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
pe_err("Failed to allocate %d bytes for a TDLS Setup Request",
nbytes);
qdf_mem_free(eht_cap_ie);
qdf_mem_free(tdls_setup_req);
return QDF_STATUS_E_NOMEM;
}
@@ -2008,6 +2126,7 @@ QDF_STATUS lim_send_tdls_link_setup_req_frame(struct mac_context *mac,
pe_err("Failed to pack a TDLS Setup request (0x%08x)",
status);
cds_packet_free((void *)packet);
qdf_mem_free(eht_cap_ie);
qdf_mem_free(tdls_setup_req);
return QDF_STATUS_E_FAILURE;
} else if (DOT11F_WARNED(status)) {
@@ -2025,6 +2144,29 @@ QDF_STATUS lim_send_tdls_link_setup_req_frame(struct mac_context *mac,
pe_debug("Copy Additional Ie Len = %d", addIeLen);
qdf_mem_copy(frame + header_offset + payload, addIe,
addIeLen);
payload += addIeLen;
}
if (eht_cap_ie_len) {
/* Copy the EHT IE to the end of the frame */
qdf_mem_copy(frame + header_offset + payload,
eht_cap_ie, eht_cap_ie_len);
qdf_mem_free(eht_cap_ie);
payload += eht_cap_ie_len;
}
if (mlo_ie_len) {
qdf_status = lim_fill_complete_mlo_ie(pe_session, mlo_ie_len,
frame + header_offset +
payload);
if (QDF_IS_STATUS_ERROR(qdf_status)) {
pe_debug("assemble ml ie error");
mlo_ie_len = 0;
}
payload += mlo_ie_len;
}
pe_debug("[TDLS] action: %d (%s) -AP-> OTA peer="QDF_MAC_ADDR_FMT,
@@ -2292,6 +2434,8 @@ lim_send_tdls_setup_rsp_frame(struct mac_context *mac,
/* As of now, we hardcoded to max channel bonding of dot11Mode (i.e HT80 for 11ac/HT40 for 11n) */
/* uint32_t tdlsChannelBondingMode; */
uint8_t smeSessionId = 0;
uint16_t mlo_ie_len = 0;
uint8_t *eht_cap_ie = NULL, eht_cap_ie_len = 0;
if (!pe_session) {
pe_err("pe_session is NULL");
@@ -2333,7 +2477,6 @@ lim_send_tdls_setup_rsp_frame(struct mac_context *mac,
}
swap_bit_field16(caps, (uint16_t *)&setup_rsp->Capabilities);
/* populate supported rate and ext supported rate IE */
if (QDF_STATUS_E_FAILURE == populate_dot11f_rates_tdls(mac,
&setup_rsp->SuppRates,
&setup_rsp->ExtSuppRates,
@@ -2403,6 +2546,19 @@ lim_send_tdls_setup_rsp_frame(struct mac_context *mac,
populate_dotf_tdls_vht_aid(mac, selfDot11Mode, peer_mac,
&setup_rsp->AID, pe_session);
if (wlan_vdev_mlme_is_mlo_vdev(pe_session->vdev))
mlo_ie_len = lim_send_tdls_mgmt_frame_mlo(mac, pe_session);
if (lim_is_session_eht_capable(pe_session)) {
eht_cap_ie = lim_ieee80211_pack_ehtcap_tdls(mac, pe_session,
&eht_cap_ie_len);
if (!eht_cap_ie) {
pe_err("malloc failed for eht_cap_ie");
qdf_mem_free(setup_rsp);
return QDF_STATUS_E_FAILURE;
}
}
/* Populate TDLS offchannel param only if offchannel is enabled
* and TDLS Channel Switching is not prohibited by AP in ExtCap
* IE in assoc/re-assoc response.
@@ -2448,7 +2604,8 @@ lim_send_tdls_setup_rsp_frame(struct mac_context *mac,
? sizeof(tSirMacDataHdr3a) :
sizeof(tSirMacMgmtHdr))
+ sizeof(eth_890d_header)
+ PAYLOAD_TYPE_TDLS_SIZE + addIeLen;
+ PAYLOAD_TYPE_TDLS_SIZE + addIeLen + eht_cap_ie_len
+ mlo_ie_len;
/* Ok-- try to allocate memory from MGMT PKT pool */
qdf_status = cds_packet_alloc((uint16_t) nBytes, (void **)&pFrame,
@@ -2456,6 +2613,7 @@ lim_send_tdls_setup_rsp_frame(struct mac_context *mac,
if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
pe_err("Failed to allocate %d bytes for a TDLS Setup Response",
nBytes);
qdf_mem_free(eht_cap_ie);
qdf_mem_free(setup_rsp);
return QDF_STATUS_E_NOMEM;
}
@@ -2489,6 +2647,7 @@ lim_send_tdls_setup_rsp_frame(struct mac_context *mac,
pe_err("Failed to pack a TDLS Setup Response (0x%08x)",
status);
cds_packet_free((void *)pPacket);
qdf_mem_free(eht_cap_ie);
qdf_mem_free(setup_rsp);
return QDF_STATUS_E_FAILURE;
} else if (DOT11F_WARNED(status)) {
@@ -2505,6 +2664,29 @@ lim_send_tdls_setup_rsp_frame(struct mac_context *mac,
if (addIeLen != 0) {
qdf_mem_copy(pFrame + header_offset + nPayload, addIe,
addIeLen);
nPayload += addIeLen;
}
if (eht_cap_ie_len) {
/* Copy the EHT IE to the end of the frame */
qdf_mem_copy(pFrame + header_offset + nPayload,
eht_cap_ie, eht_cap_ie_len);
qdf_mem_free(eht_cap_ie);
nPayload += eht_cap_ie_len;
}
if (mlo_ie_len) {
qdf_status = lim_fill_complete_mlo_ie(pe_session, mlo_ie_len,
pFrame + header_offset +
nPayload);
if (QDF_IS_STATUS_ERROR(qdf_status)) {
pe_debug("assemble ml ie error");
mlo_ie_len = 0;
}
nPayload += mlo_ie_len;
}
pe_debug("[TDLS] action: %d (%s) -AP-> OTA peer="QDF_MAC_ADDR_FMT,
@@ -2557,6 +2739,8 @@ QDF_STATUS lim_send_tdls_link_setup_cnf_frame(struct mac_context *mac,
uint32_t padLen = 0;
#endif
uint8_t smeSessionId = 0;
uint16_t mlo_ie_len = 0;
uint8_t *eht_cap_ie = NULL, eht_cap_ie_len = 0;
if (!pe_session) {
pe_err("pe_session is NULL");
@@ -2614,6 +2798,18 @@ QDF_STATUS lim_send_tdls_link_setup_cnf_frame(struct mac_context *mac,
lim_tdls_fill_setup_cnf_he_op(mac, peerCapability, setup_cnf,
pe_session);
if (wlan_vdev_mlme_is_mlo_vdev(pe_session->vdev))
mlo_ie_len = lim_send_tdls_mgmt_frame_mlo(mac, pe_session);
if (lim_is_session_eht_capable(pe_session)) {
eht_cap_ie = lim_ieee80211_pack_ehtcap_tdls(mac, pe_session,
&eht_cap_ie_len);
if (!eht_cap_ie) {
pe_err("malloc failed for eht_cap_ie");
qdf_mem_free(setup_cnf);
return QDF_STATUS_E_FAILURE;
}
}
/*
* now we pack it. First, how much space are we going to need?
*/
@@ -2639,7 +2835,8 @@ QDF_STATUS lim_send_tdls_link_setup_cnf_frame(struct mac_context *mac,
? sizeof(tSirMacDataHdr3a) :
sizeof(tSirMacMgmtHdr))
+ sizeof(eth_890d_header)
+ PAYLOAD_TYPE_TDLS_SIZE + addIeLen;
+ PAYLOAD_TYPE_TDLS_SIZE + addIeLen + eht_cap_ie_len
+ mlo_ie_len;
#ifndef NO_PAD_TDLS_MIN_8023_SIZE
/* IOT issue with some AP : some AP doesn't like the data packet size < minimum 802.3 frame length (64)
@@ -2664,6 +2861,7 @@ QDF_STATUS lim_send_tdls_link_setup_cnf_frame(struct mac_context *mac,
if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
pe_err("Failed to allocate %d bytes for a TDLS Setup Confirm",
nBytes);
qdf_mem_free(eht_cap_ie);
qdf_mem_free(setup_cnf);
return QDF_STATUS_E_NOMEM;
}
@@ -2691,6 +2889,7 @@ QDF_STATUS lim_send_tdls_link_setup_cnf_frame(struct mac_context *mac,
if (DOT11F_FAILED(status)) {
pe_err("Failed to pack a TDLS discovery req (0x%08x)", status);
cds_packet_free((void *)pPacket);
qdf_mem_free(eht_cap_ie);
qdf_mem_free(setup_cnf);
return QDF_STATUS_E_FAILURE;
} else if (DOT11F_WARNED(status)) {
@@ -2707,6 +2906,29 @@ QDF_STATUS lim_send_tdls_link_setup_cnf_frame(struct mac_context *mac,
if (addIeLen != 0) {
qdf_mem_copy(pFrame + header_offset + nPayload, addIe,
addIeLen);
nPayload += addIeLen;
}
if (eht_cap_ie_len) {
/* Copy the EHT IE to the end of the frame */
qdf_mem_copy(pFrame + header_offset + nPayload,
eht_cap_ie, eht_cap_ie_len);
qdf_mem_free(eht_cap_ie);
nPayload += eht_cap_ie_len;
}
if (mlo_ie_len) {
qdf_status = lim_fill_complete_mlo_ie(pe_session, mlo_ie_len,
pFrame + header_offset +
nPayload);
if (QDF_IS_STATUS_ERROR(qdf_status)) {
pe_debug("assemble ml ie error");
mlo_ie_len = 0;
}
nPayload += mlo_ie_len;
}
#ifndef NO_PAD_TDLS_MIN_8023_SIZE
if (padLen != 0) {

Datei anzeigen

@@ -10241,6 +10241,57 @@ QDF_STATUS populate_dot11f_bcn_mlo_ie(struct mac_context *mac_ctx,
return QDF_STATUS_SUCCESS;
}
QDF_STATUS populate_dot11f_tdls_mgmt_mlo_ie(struct mac_context *mac_ctx,
struct pe_session *session)
{
struct wlan_mlo_ie *mlo_ie;
uint8_t *p_ml_ie;
uint16_t len_remaining;
uint16_t presence_bitmap = 0;
uint8_t common_info_length = 0;
if (!mac_ctx || !session)
return QDF_STATUS_E_NULL_VALUE;
mlo_ie = &session->mlo_ie;
p_ml_ie = mlo_ie->data;
len_remaining = sizeof(mlo_ie->data);
*p_ml_ie++ = WLAN_ELEMID_EXTN_ELEM;
len_remaining--;
*p_ml_ie++ = 0;
len_remaining--;
*p_ml_ie++ = WLAN_EXTN_ELEMID_MULTI_LINK;
len_remaining--;
common_info_length += WLAN_ML_BV_CINFO_LENGTH_SIZE;
presence_bitmap |= WLAN_ML_BV_CTRL_PBM_BSSPARAMCHANGECNT_P;
common_info_length += WLAN_ML_BSSPARAMCHNGCNT_SIZE;
QDF_SET_BITS(*(uint16_t *)p_ml_ie, WLAN_ML_CTRL_TYPE_IDX,
WLAN_ML_CTRL_TYPE_BITS, WLAN_ML_VARIANT_TDLS);
QDF_SET_BITS(*(uint16_t *)p_ml_ie, WLAN_ML_CTRL_PBM_IDX,
WLAN_ML_CTRL_PBM_BITS, presence_bitmap);
p_ml_ie += WLAN_ML_CTRL_SIZE;
len_remaining -= WLAN_ML_CTRL_SIZE;
*p_ml_ie++ = common_info_length;
len_remaining--;
qdf_mem_copy(p_ml_ie, session->vdev->mlo_dev_ctx->mld_addr.bytes,
QDF_MAC_ADDR_SIZE);
p_ml_ie += QDF_MAC_ADDR_SIZE;
len_remaining -= QDF_MAC_ADDR_SIZE;
mlo_ie->num_data = p_ml_ie - mlo_ie->data;
return QDF_STATUS_SUCCESS;
}
void populate_dot11f_mlo_rnr(struct mac_context *mac_ctx,
struct pe_session *session,
tDot11fIEreduced_neighbor_report *dot11f)