qcacld-3.0: Add support of request peer stats info(part 2)

qcacld-2.0 to qcacld-3.0 propagation

FW has limitation to support old WMI_REQUEST_STATS_CMDID and
WMI_UPDATE_STATS_EVENTID interface on AP vDev. FW suggest to use new
WMI_REQUEST_PEER_STATS_INFO_CMDID and WMI_PEER_STATS_INFO_EVENTID to
get tx/rx rate.

This checkin is about LIM/SME/SAP layer, provide SME APIs/callbacks
to HDD layer to get SAP's peer station tx/rx related information,
fill these information from wma layer get-peer-stat-info APIs and
peer station's association request frame. It also fixed function
csr_send_assoc_ind_to_upper_layer_cnf_msg when copy information
between different structures and using offset style.

Change-Id: Icb1aaa126663af7eaedd1c4db86ca25c40ce6ee9
CRs-Fixed: 2051628
This commit is contained in:
Will Huang 2017-05-31 16:22:24 +08:00 • committed by snandini
commit 558f8085c4
12 changed files with 403 additions and 28 deletions

View file

@ -1287,6 +1287,12 @@ typedef struct sSirSmeChanInfo {
enum phy_ch_width ch_width;
} tSirSmeChanInfo, *tpSirSmeChanInfo;
enum sir_sme_phy_mode {
SIR_SME_PHY_MODE_LEGACY = 0,
SIR_SME_PHY_MODE_HT = 1,
SIR_SME_PHY_MODE_VHT = 2
};
/* / Definition for Association indication from peer */
/* / MAC ---> */
typedef struct sSirSmeAssocInd {
@ -1324,6 +1330,17 @@ typedef struct sSirSmeAssocInd {
/* Timing measurement capability */
uint8_t timingMeasCap;
tSirSmeChanInfo chan_info;
bool ampdu;
bool sgi_enable;
bool tx_stbc;
bool rx_stbc;
tSirMacHTChannelWidth ch_width;
enum sir_sme_phy_mode mode;
uint8_t max_supp_idx;
uint8_t max_ext_idx;
uint8_t max_mcs_idx;
uint8_t rx_mcs_map;
uint8_t tx_mcs_map;
} tSirSmeAssocInd, *tpSirSmeAssocInd;
/* / Definition for Association confirm */

View file

@ -2110,6 +2110,50 @@ static void lim_fill_assoc_ind_vht_info(tpAniSirGlobal mac_ctx,
return;
}
static uint8_t lim_get_max_rate_idx(tSirMacRateSet *rateset)
{
uint8_t maxidx;
int i;
maxidx = rateset->rate[0] & 0x7f;
for (i = 1; i < rateset->numRates; i++) {
if ((rateset->rate[i] & 0x7f) > maxidx)
maxidx = rateset->rate[i] & 0x7f;
}
return maxidx;
}
static void fill_mlm_assoc_ind_vht(tpSirAssocReq assocreq,
tpDphHashNode stads,
tpLimMlmAssocInd assocind)
{
if (stads->mlmStaContext.vhtCapability) {
/* ampdu */
assocind->ampdu = true;
/* sgi */
if (assocreq->VHTCaps.shortGI80MHz ||
assocreq->VHTCaps.shortGI160and80plus80MHz)
assocind->sgi_enable = true;
/* stbc */
assocind->tx_stbc = assocreq->VHTCaps.txSTBC;
assocind->rx_stbc = assocreq->VHTCaps.rxSTBC;
/* ch width */
assocind->ch_width = stads->vhtSupportedChannelWidthSet ?
eHT_CHANNEL_WIDTH_80MHZ :
stads->htSupportedChannelWidthSet ?
eHT_CHANNEL_WIDTH_40MHZ : eHT_CHANNEL_WIDTH_20MHZ;
/* mode */
assocind->mode = SIR_SME_PHY_MODE_VHT;
assocind->rx_mcs_map = assocreq->VHTCaps.rxMCSMap & 0xff;
assocind->tx_mcs_map = assocreq->VHTCaps.txMCSMap & 0xff;
}
}
/**
* lim_send_mlm_assoc_ind() - Sends assoc indication to SME
* @mac_ctx: Global Mac context
@ -2130,6 +2174,7 @@ void lim_send_mlm_assoc_ind(tpAniSirGlobal mac_ctx,
uint32_t phy_mode;
uint8_t sub_type;
uint8_t *wpsie = NULL;
uint8_t maxidx, i;
uint32_t tmp;
/* Get a copy of the already parsed Assoc Request */
@ -2295,6 +2340,57 @@ void lim_send_mlm_assoc_ind(tpAniSirGlobal mac_ctx,
assoc_ind->chan_info.nss = sta_ds->nss;
assoc_ind->chan_info.rate_flags =
lim_get_max_rate_flags(mac_ctx, sta_ds);
assoc_ind->ampdu = false;
assoc_ind->sgi_enable = false;
assoc_ind->tx_stbc = false;
assoc_ind->rx_stbc = false;
assoc_ind->ch_width = eHT_CHANNEL_WIDTH_20MHZ;
assoc_ind->mode = SIR_SME_PHY_MODE_LEGACY;
assoc_ind->max_supp_idx = 0xff;
assoc_ind->max_ext_idx = 0xff;
assoc_ind->max_mcs_idx = 0xff;
assoc_ind->rx_mcs_map = 0xff;
assoc_ind->tx_mcs_map = 0xff;
if (assoc_req->supportedRates.numRates)
assoc_ind->max_supp_idx =
lim_get_max_rate_idx(
&assoc_req->supportedRates);
if (assoc_req->extendedRates.numRates)
assoc_ind->max_ext_idx =
lim_get_max_rate_idx(
&assoc_req->extendedRates);
if (sta_ds->mlmStaContext.htCapability) {
/* ampdu */
assoc_ind->ampdu = true;
/* sgi */
if (sta_ds->htShortGI20Mhz || sta_ds->htShortGI40Mhz)
assoc_ind->sgi_enable = true;
/* stbc */
assoc_ind->tx_stbc = assoc_req->HTCaps.txSTBC;
assoc_ind->rx_stbc = assoc_req->HTCaps.rxSTBC;
/* ch width */
assoc_ind->ch_width =
sta_ds->htSupportedChannelWidthSet ?
eHT_CHANNEL_WIDTH_40MHZ :
eHT_CHANNEL_WIDTH_20MHZ;
/* mode */
assoc_ind->mode = SIR_SME_PHY_MODE_HT;
maxidx = 0;
for (i = 0; i < 8; i++) {
if (assoc_req->HTCaps.supportedMCSSet[0] &
(1 << i))
maxidx = i;
}
assoc_ind->max_mcs_idx = maxidx;
}
fill_mlm_assoc_ind_vht(assoc_req, sta_ds, assoc_ind);
/* updates VHT information in assoc indication */
lim_fill_assoc_ind_vht_info(mac_ctx, session_entry, assoc_req,
assoc_ind);

View file

@ -772,6 +772,17 @@ lim_fill_assoc_ind_params(tpAniSirGlobal mac_ctx,
sizeof(tSirSmeChanInfo));
/* Fill in WmmInfo */
sme_assoc_ind->wmmEnabledSta = assoc_ind->WmmStaInfoPresent;
sme_assoc_ind->ampdu = assoc_ind->ampdu;
sme_assoc_ind->sgi_enable = assoc_ind->sgi_enable;
sme_assoc_ind->tx_stbc = assoc_ind->tx_stbc;
sme_assoc_ind->rx_stbc = assoc_ind->rx_stbc;
sme_assoc_ind->ch_width = assoc_ind->ch_width;
sme_assoc_ind->mode = assoc_ind->mode;
sme_assoc_ind->max_supp_idx = assoc_ind->max_supp_idx;
sme_assoc_ind->max_ext_idx = assoc_ind->max_ext_idx;
sme_assoc_ind->max_mcs_idx = assoc_ind->max_mcs_idx;
sme_assoc_ind->rx_mcs_map = assoc_ind->rx_mcs_map;
sme_assoc_ind->tx_mcs_map = assoc_ind->tx_mcs_map;
}
/**

View file

@ -266,6 +266,17 @@ typedef struct sLimMlmAssocInd {
uint32_t assocReqLength;
uint8_t *assocReqPtr;
tSirSmeChanInfo chan_info;
bool ampdu;
bool sgi_enable;
bool tx_stbc;
bool rx_stbc;
tSirMacHTChannelWidth ch_width;
enum sir_sme_phy_mode mode;
uint8_t max_supp_idx;
uint8_t max_ext_idx;
uint8_t max_mcs_idx;
uint8_t rx_mcs_map;
uint8_t tx_mcs_map;
} tLimMlmAssocInd, *tpLimMlmAssocInd;
typedef struct sLimMlmReassocReq {

View file

@ -414,6 +414,8 @@ uint8_t *mac_trace_get_sme_msg_string(uint16_t sme_msg)
CASE_RETURN_STRING(eWNI_SME_DEFAULT_SCAN_IE);
CASE_RETURN_STRING(eWNI_SME_ROAM_SCAN_OFFLOAD_REQ);
CASE_RETURN_STRING(eWNI_SME_LOST_LINK_INFO_IND);
CASE_RETURN_STRING(eWNI_SME_GET_PEER_INFO_IND);
CASE_RETURN_STRING(eWNI_SME_GET_PEER_INFO_EXT_IND);
CASE_RETURN_STRING(eWNI_SME_RSO_CMD_STATUS_IND);
CASE_RETURN_STRING(eWNI_SME_MSG_TYPES_END);
default:

View file

@ -287,6 +287,17 @@ typedef struct sap_StationAssocReassocCompleteEvent_s {
uint8_t *assocRespPtr;
uint8_t timingMeasCap;
tSirSmeChanInfo chan_info;
bool ampdu;
bool sgi_enable;
bool tx_stbc;
bool rx_stbc;
tSirMacHTChannelWidth ch_width;
enum sir_sme_phy_mode mode;
uint8_t max_supp_idx;
uint8_t max_ext_idx;
uint8_t max_mcs_idx;
uint8_t rx_mcs_map;
uint8_t tx_mcs_map;
} tSap_StationAssocReassocCompleteEvent;
typedef struct sap_StationDisassocCompleteEvent_s {

View file

@ -2451,6 +2451,17 @@ QDF_STATUS sap_signal_hdd_event(ptSapContext sap_ctx,
reassoc_complete->wmmEnabled = csr_roaminfo->wmmEnabledSta;
reassoc_complete->status = (eSapStatus) context;
reassoc_complete->timingMeasCap = csr_roaminfo->timingMeasCap;
reassoc_complete->ampdu = csr_roaminfo->ampdu;
reassoc_complete->sgi_enable = csr_roaminfo->sgi_enable;
reassoc_complete->tx_stbc = csr_roaminfo->tx_stbc;
reassoc_complete->rx_stbc = csr_roaminfo->rx_stbc;
reassoc_complete->ch_width = csr_roaminfo->ch_width;
reassoc_complete->mode = csr_roaminfo->mode;
reassoc_complete->max_supp_idx = csr_roaminfo->max_supp_idx;
reassoc_complete->max_ext_idx = csr_roaminfo->max_ext_idx;
reassoc_complete->max_mcs_idx = csr_roaminfo->max_mcs_idx;
reassoc_complete->rx_mcs_map = csr_roaminfo->rx_mcs_map;
reassoc_complete->tx_mcs_map = csr_roaminfo->tx_mcs_map;
break;
case eSAP_STA_DISASSOC_EVENT:

View file

@ -1450,6 +1450,17 @@ typedef struct tagCsrRoamInfo {
tDot11fIEVHTOperation vht_operation;
tDot11fIEHTInfo ht_operation;
bool reassoc;
bool ampdu;
bool sgi_enable;
bool tx_stbc;
bool rx_stbc;
tSirMacHTChannelWidth ch_width;
enum sir_sme_phy_mode mode;
uint8_t max_supp_idx;
uint8_t max_ext_idx;
uint8_t max_mcs_idx;
uint8_t rx_mcs_map;
uint8_t tx_mcs_map;
} tCsrRoamInfo;
typedef struct tagCsrFreqScanInfo {
@ -1477,6 +1488,17 @@ typedef struct sSirSmeAssocIndToUpperLayerCnf {
uint8_t timingMeasCap;
tSirSmeChanInfo chan_info;
uint8_t target_channel;
bool ampdu;
bool sgi_enable;
bool tx_stbc;
tSirMacHTChannelWidth ch_width;
enum sir_sme_phy_mode mode;
bool rx_stbc;
uint8_t max_supp_idx;
uint8_t max_ext_idx;
uint8_t max_mcs_idx;
uint8_t rx_mcs_map;
uint8_t tx_mcs_map;
} tSirSmeAssocIndToUpperLayerCnf, *tpSirSmeAssocIndToUpperLayerCnf;
typedef struct tagCsrSummaryStatsInfo {

View file

@ -1627,4 +1627,37 @@ int sme_cli_set_command(int vdev_id, int param_id, int sval, int vpdev);
QDF_STATUS sme_set_bt_activity_info_cb(tHalHandle hal,
void (*cb)(void *, uint32_t profile_info));
/**
* sme_get_peer_info() - sme api to get peer info
* @hal: hal handle for getting global mac struct
* @req: peer info request struct send to wma
* @context: context of callback function
* @callbackfn: hdd callback function when receive response
*
* This function will send WMA_GET_PEER_INFO to WMA
*
* Return: QDF_STATUS_SUCCESS or non-zero on failure
*/
QDF_STATUS sme_get_peer_info(tHalHandle hal,
struct sir_peer_info_req req,
void *context,
void (*callbackfn)(struct sir_peer_info_resp *param,
void *pcontext));
/**
* sme_get_peer_info_ext() - sme api to get peer ext info
* @hal: hal handle for getting global mac struct
* @req: peer ext info request struct send to wma
* @context: context of callback function
* @callbackfn: hdd callback function when receive response
*
* This function will send WMA_GET_PEER_INFO_EXT to WMA
*
* Return: QDF_STATUS_SUCCESS or non-zero on failure
*/
QDF_STATUS sme_get_peer_info_ext(tHalHandle hal,
struct sir_peer_info_ext_req *req,
void *context,
void (*callbackfn)(struct sir_peer_info_ext_resp *param,
void *pcontext));
#endif /* #if !defined( __SME_API_H ) */

View file

@ -197,6 +197,14 @@ typedef struct tagSmeStruct {
void (*pLinkSpeedIndCb)(tSirLinkSpeedInfo *indParam,
void *pDevContext);
void *pLinkSpeedCbContext;
/* get peer info callback */
void (*pget_peer_info_ind_cb)(struct sir_peer_info_resp *param,
void *pcontext);
void *pget_peer_info_cb_context;
/* get extended peer info callback */
void (*pget_peer_info_ext_ind_cb)(struct sir_peer_info_ext_resp *param,
void *pcontext);
void *pget_peer_info_ext_cb_context;
#ifdef FEATURE_WLAN_EXTSCAN
void (*pExtScanIndCb)(void *, const uint16_t, void *);
#endif /* FEATURE_WLAN_EXTSCAN */

View file

@ -2413,6 +2413,18 @@ QDF_STATUS sme_process_msg(tHalHandle hHal, struct scheduler_msg *pMsg)
}
break;
#endif
case eWNI_SME_GET_PEER_INFO_IND:
if (pMac->sme.pget_peer_info_ind_cb)
pMac->sme.pget_peer_info_ind_cb(pMsg->bodyptr,
pMac->sme.pget_peer_info_cb_context);
qdf_mem_free(pMsg->bodyptr);
break;
case eWNI_SME_GET_PEER_INFO_EXT_IND:
if (pMac->sme.pget_peer_info_ext_ind_cb)
pMac->sme.pget_peer_info_ext_ind_cb(pMsg->bodyptr,
pMac->sme.pget_peer_info_ext_cb_context);
qdf_mem_free(pMsg->bodyptr);
break;
case eWNI_SME_CSA_OFFLOAD_EVENT:
if (pMsg->bodyptr) {
csr_scan_flush_bss_entry(pMac, pMsg->bodyptr);
@ -9686,6 +9698,100 @@ QDF_STATUS sme_get_link_speed(tHalHandle hHal, tSirLinkSpeedInfo *lsReq,
return status;
}
QDF_STATUS sme_get_peer_info(tHalHandle hal, struct sir_peer_info_req req,
void *context,
void (*callbackfn)(struct sir_peer_info_resp *param,
void *pcontext))
{
QDF_STATUS status;
QDF_STATUS qdf_status;
tpAniSirGlobal mac = PMAC_STRUCT(hal);
struct scheduler_msg message;
status = sme_acquire_global_lock(&mac->sme);
if (QDF_STATUS_SUCCESS == status) {
if (NULL == callbackfn) {
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
"%s: Indication Call back is NULL",
__func__);
sme_release_global_lock(&mac->sme);
return QDF_STATUS_E_FAILURE;
}
mac->sme.pget_peer_info_ind_cb = callbackfn;
mac->sme.pget_peer_info_cb_context = context;
/* serialize the req through MC thread */
message.bodyptr = qdf_mem_malloc(sizeof(req));
if (NULL == message.bodyptr) {
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
"%s: Memory allocation failed.", __func__);
sme_release_global_lock(&mac->sme);
return QDF_STATUS_E_NOMEM;
}
qdf_mem_copy(message.bodyptr, &req, sizeof(req));
message.type = WMA_GET_PEER_INFO;
qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA, &message);
if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
"%s: Post get peer info msg fail", __func__);
qdf_mem_free(message.bodyptr);
status = QDF_STATUS_E_FAILURE;
}
sme_release_global_lock(&mac->sme);
}
return status;
}
QDF_STATUS sme_get_peer_info_ext(tHalHandle hal,
struct sir_peer_info_ext_req *req,
void *context,
void (*callbackfn)(struct sir_peer_info_ext_resp *param,
void *pcontext))
{
QDF_STATUS status;
QDF_STATUS qdf_status;
tpAniSirGlobal mac = PMAC_STRUCT(hal);
struct scheduler_msg message;
status = sme_acquire_global_lock(&mac->sme);
if (QDF_STATUS_SUCCESS == status) {
if (NULL == callbackfn) {
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
"%s: Indication Call back is NULL",
__func__);
sme_release_global_lock(&mac->sme);
return QDF_STATUS_E_FAILURE;
}
mac->sme.pget_peer_info_ext_ind_cb = callbackfn;
mac->sme.pget_peer_info_ext_cb_context = context;
/* serialize the req through MC thread */
message.bodyptr =
qdf_mem_malloc(sizeof(struct sir_peer_info_ext_req));
if (NULL == message.bodyptr) {
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
"%s: Memory allocation failed.", __func__);
sme_release_global_lock(&mac->sme);
return QDF_STATUS_E_NOMEM;
}
qdf_mem_copy(message.bodyptr,
req,
sizeof(struct sir_peer_info_ext_req));
message.type = WMA_GET_PEER_INFO_EXT;
qdf_status = scheduler_post_msg(QDF_MODULE_ID_WMA, &message);
if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
"%s: Post get rssi msg fail", __func__);
qdf_mem_free(message.bodyptr);
status = QDF_STATUS_E_FAILURE;
}
sme_release_global_lock(&mac->sme);
}
return status;
}
/*
* SME API to enable/disable WLAN driver initiated SSR

View file

@ -9852,6 +9852,17 @@ void csr_roam_joined_state_msg_processor(tpAniSirGlobal pMac, void *pMsgBuf)
qdf_mem_copy(&pRoamInfo->chan_info,
&pUpperLayerAssocCnf->chan_info,
sizeof(tSirSmeChanInfo));
pRoamInfo->ampdu = pUpperLayerAssocCnf->ampdu;
pRoamInfo->sgi_enable = pUpperLayerAssocCnf->sgi_enable;
pRoamInfo->tx_stbc = pUpperLayerAssocCnf->tx_stbc;
pRoamInfo->tx_stbc = pUpperLayerAssocCnf->rx_stbc;
pRoamInfo->ch_width = pUpperLayerAssocCnf->ch_width;
pRoamInfo->mode = pUpperLayerAssocCnf->mode;
pRoamInfo->max_supp_idx = pUpperLayerAssocCnf->max_supp_idx;
pRoamInfo->max_ext_idx = pUpperLayerAssocCnf->max_ext_idx;
pRoamInfo->max_mcs_idx = pUpperLayerAssocCnf->max_mcs_idx;
pRoamInfo->rx_mcs_map = pUpperLayerAssocCnf->rx_mcs_map;
pRoamInfo->tx_mcs_map = pUpperLayerAssocCnf->tx_mcs_map;
if (CSR_IS_INFRA_AP(pRoamInfo->u.pConnectedProfile)) {
pMac->roam.roamSession[sessionId].connectState =
eCSR_ASSOC_STATE_TYPE_INFRA_CONNECTED;
@ -15171,54 +15182,90 @@ QDF_STATUS csr_send_assoc_ind_to_upper_layer_cnf_msg(tpAniSirGlobal pMac,
else
statusCode = eSIR_SME_ASSOC_REFUSED;
qdf_mem_copy(pBuf, &statusCode, sizeof(tSirResultCodes));
pBuf += sizeof(tSirResultCodes);
/* bssId */
qdf_mem_copy((tSirMacAddr *) pBuf, pAssocInd->bssId,
sizeof(tSirMacAddr));
pBuf += sizeof(tSirMacAddr);
pBuf = (uint8_t *)&pMsg->bssId;
qdf_mem_copy((tSirMacAddr *)pBuf, pAssocInd->bssId,
sizeof(tSirMacAddr));
/* peerMacAddr */
qdf_mem_copy((tSirMacAddr *) pBuf, pAssocInd->peerMacAddr,
sizeof(tSirMacAddr));
pBuf += sizeof(tSirMacAddr);
pBuf = (uint8_t *)&pMsg->peerMacAddr;
qdf_mem_copy((tSirMacAddr *)pBuf, pAssocInd->peerMacAddr,
sizeof(tSirMacAddr));
/* StaId */
pBuf = (uint8_t *)&pMsg->aid;
wTmp = pAssocInd->staId;
qdf_mem_copy(pBuf, &wTmp, sizeof(uint16_t));
pBuf += sizeof(uint16_t);
/* alternateBssId */
qdf_mem_copy((tSirMacAddr *) pBuf, pAssocInd->bssId,
sizeof(tSirMacAddr));
pBuf += sizeof(tSirMacAddr);
pBuf = (uint8_t *)&pMsg->alternateBssId;
qdf_mem_copy((tSirMacAddr *)pBuf, pAssocInd->bssId,
sizeof(tSirMacAddr));
/* alternateChannelId */
pBuf = (uint8_t *)&pMsg->alternateChannelId;
*pBuf = 11;
pBuf += sizeof(uint8_t);
/* Instead of copying roam Info, we just copy only WmmEnabled,
* RsnIE information
/*
* Instead of copying roam Info,just copy WmmEnabled,
* RsnIE information.
* Wmm
*/
/* Wmm */
pBuf = (uint8_t *)&pMsg->wmmEnabledSta;
*pBuf = pAssocInd->wmmEnabledSta;
pBuf += sizeof(uint8_t);
/* RSN IE */
qdf_mem_copy((tSirRSNie *) pBuf, &pAssocInd->rsnIE,
sizeof(tSirRSNie));
pBuf += sizeof(tSirRSNie);
pBuf = (uint8_t *)&pMsg->rsnIE;
qdf_mem_copy((tSirRSNie *)pBuf, &pAssocInd->rsnIE,
sizeof(tSirRSNie));
#ifdef FEATURE_WLAN_WAPI
/* WAPI IE */
qdf_mem_copy((tSirWAPIie *) pBuf, &pAssocInd->wapiIE,
sizeof(tSirWAPIie));
pBuf += sizeof(tSirWAPIie);
pBuf = (uint8_t *)&pMsg->wapiIE;
qdf_mem_copy((tSirWAPIie *)pBuf, &pAssocInd->wapiIE,
sizeof(tSirWAPIie));
#endif
/* Additional IE */
qdf_mem_copy((void *)pBuf, &pAssocInd->addIE,
sizeof(tSirAddie));
pBuf += sizeof(tSirAddie);
pBuf = (uint8_t *)&pMsg->addIE;
qdf_mem_copy((tSirAddie *)pBuf, &pAssocInd->addIE,
sizeof(tSirAddie));
/* reassocReq */
pBuf = (uint8_t *)&pMsg->reassocReq;
*pBuf = pAssocInd->reassocReq;
pBuf += sizeof(uint8_t);
/* timingMeasCap */
pBuf = (uint8_t *)&pMsg->timingMeasCap;
*pBuf = pAssocInd->timingMeasCap;
pBuf += sizeof(uint8_t);
/* chan_info */
pBuf = (uint8_t *)&pMsg->chan_info;
qdf_mem_copy((void *)pBuf, &pAssocInd->chan_info,
sizeof(tSirSmeChanInfo));
sizeof(tSirSmeChanInfo));
/* ampdu */
pBuf = (uint8_t *)&pMsg->ampdu;
*((bool *)pBuf) = pAssocInd->ampdu;
/* sgi_enable */
pBuf = (uint8_t *)&pMsg->sgi_enable;
*((bool *)pBuf) = pAssocInd->sgi_enable;
/* tx stbc */
pBuf = (uint8_t *)&pMsg->tx_stbc;
*((bool *)pBuf) = pAssocInd->tx_stbc;
/* ch_width */
pBuf = (uint8_t *)&pMsg->ch_width;
*((tSirMacHTChannelWidth *)pBuf) = pAssocInd->ch_width;
/* mode */
pBuf = (uint8_t *)&pMsg->mode;
*((enum sir_sme_phy_mode *)pBuf) = pAssocInd->mode;
/* rx stbc */
pBuf = (uint8_t *)&pMsg->rx_stbc;
*((bool *)pBuf) = pAssocInd->rx_stbc;
/* max supported idx */
pBuf = (uint8_t *)&pMsg->max_supp_idx;
*pBuf = pAssocInd->max_supp_idx;
/* max extended idx */
pBuf = (uint8_t *)&pMsg->max_ext_idx;
*pBuf = pAssocInd->max_ext_idx;
/* max ht mcs idx */
pBuf = (uint8_t *)&pMsg->max_mcs_idx;
*pBuf = pAssocInd->max_mcs_idx;
/* vht rx mcs map */
pBuf = (uint8_t *)&pMsg->rx_mcs_map;
*pBuf = pAssocInd->rx_mcs_map;
/* vht tx mcs map */
pBuf = (uint8_t *)&pMsg->tx_mcs_map;
*pBuf = pAssocInd->tx_mcs_map;
msgQ.type = eWNI_SME_UPPER_LAYER_ASSOC_CNF;
msgQ.bodyptr = pMsg;
msgQ.bodyval = 0;