/* --------------------------------------------------------------------------- \fn oemData_IsOemDataReqAllowed \brief This function checks if OEM DATA REQs can be performed in the current driver state \return eHalStatus -------------------------------------------------------------------------------*/ eHalStatus oemData_IsOemDataReqAllowed(tHalHandle hHal) { eHalStatus status = eHAL_STATUS_SUCCESS; tANI_U32 sessionId; tpAniSirGlobal pMac = PMAC_STRUCT(hHal); for(sessionId = 0; sessionId < CSR_ROAM_SESSION_MAX; sessionId++) { if(CSR_IS_SESSION_VALID(pMac, sessionId)) { if(csrIsConnStateIbss(pMac, sessionId) || csrIsBTAMP(pMac, sessionId) || csrIsConnStateConnectedInfraAp(pMac, sessionId) ) { //co-exist with IBSS or BT-AMP or Soft-AP mode is not supported smsLog(pMac, LOGW, "OEM DATA REQ is not allowed due to IBSS|BTAMP|SAP exist in session %d", sessionId); status = eHAL_STATUS_CSR_WRONG_STATE; break; } } } smsLog(pMac, LOG1, "Exiting oemData_IsOemDataReqAllowed with status %d", status); return (status); }
/* * TDLS request API, called from HDD to delete a TDLS peer */ eHalStatus csrTdlsDelPeerSta(tHalHandle hHal, tANI_U8 sessionId, tSirMacAddr peerMac) { tpAniSirGlobal pMac = PMAC_STRUCT( hHal ); tSmeCmd *tdlsDelStaCmd ; eHalStatus status = eHAL_STATUS_FAILURE ; //If connected and in Infra. Only then allow this if( CSR_IS_SESSION_VALID( pMac, sessionId ) && csrIsConnStateConnectedInfra( pMac, sessionId ) && (NULL != peerMac) ) { tdlsDelStaCmd = csrGetCommandBuffer(pMac) ; if(tdlsDelStaCmd) { tTdlsDelStaCmdInfo *tdlsDelStaCmdInfo = &tdlsDelStaCmd->u.tdlsCmd.u.tdlsDelStaCmdInfo ; tdlsDelStaCmd->sessionId = sessionId; vos_mem_copy(tdlsDelStaCmdInfo->peerMac, peerMac, sizeof(tSirMacAddr)) ; tdlsDelStaCmd->command = eSmeCommandTdlsDelPeer ; tdlsDelStaCmd->u.tdlsCmd.size = sizeof(tTdlsDelStaCmdInfo) ; smePushCommand(pMac, tdlsDelStaCmd, FALSE) ; status = eHAL_STATUS_SUCCESS ; } } return status ; }
CDF_STATUS sme_mgmt_frm_ind(tHalHandle hHal, tpSirSmeMgmtFrameInd pSmeMgmtFrm) { tpAniSirGlobal pMac = PMAC_STRUCT(hHal); CDF_STATUS status = CDF_STATUS_SUCCESS; tCsrRoamInfo pRoamInfo = { 0 }; uint8_t i = 0; uint32_t SessionId = pSmeMgmtFrm->sessionId; pRoamInfo.nFrameLength = pSmeMgmtFrm->mesgLen - sizeof(tSirSmeMgmtFrameInd); pRoamInfo.pbFrames = pSmeMgmtFrm->frameBuf; pRoamInfo.frameType = pSmeMgmtFrm->frameType; pRoamInfo.rxChan = pSmeMgmtFrm->rxChan; pRoamInfo.rxRssi = pSmeMgmtFrm->rxRssi; if (CSR_IS_SESSION_ANY(SessionId)) { for (i = 0; i < CSR_ROAM_SESSION_MAX; i++) { if (CSR_IS_SESSION_VALID(pMac, i)) { SessionId = i; break; } } } if (i == CSR_ROAM_SESSION_MAX) { sms_log(pMac, LOGE, FL("No valid sessions found.")); return CDF_STATUS_E_FAILURE; } /* forward the mgmt frame to HDD */ csr_roam_call_callback(pMac, SessionId, &pRoamInfo, 0, eCSR_ROAM_INDICATE_MGMT_FRAME, 0); return status; }
eHalStatus csrTdlsAddPeerSta(tHalHandle hHal, tANI_U8 sessionId, tSirMacAddr peerMac) { tpAniSirGlobal pMac = PMAC_STRUCT( hHal ); tSmeCmd *tdlsAddStaCmd ; eHalStatus status = eHAL_STATUS_FAILURE ; if( CSR_IS_SESSION_VALID( pMac, sessionId ) && csrIsConnStateConnectedInfra( pMac, sessionId ) && (NULL != peerMac) ) { tdlsAddStaCmd = csrGetCommandBuffer(pMac) ; if(tdlsAddStaCmd) { tTdlsAddStaCmdInfo *tdlsAddStaCmdInfo = &tdlsAddStaCmd->u.tdlsCmd.u.tdlsAddStaCmdInfo ; tdlsAddStaCmd->sessionId = sessionId; tdlsAddStaCmdInfo->tdlsAddOper = TDLS_OPER_ADD; palCopyMemory(pMac->hHdd, tdlsAddStaCmdInfo->peerMac, peerMac, sizeof(tSirMacAddr)) ; tdlsAddStaCmd->command = eSmeCommandTdlsAddPeer ; tdlsAddStaCmd->u.tdlsCmd.size = sizeof(tTdlsAddStaCmdInfo) ; smePushCommand(pMac, tdlsAddStaCmd, FALSE) ; status = eHAL_STATUS_SUCCESS ; } } return status ; }
/* * TDLS request API, called from HDD to send a TDLS frame * in SME/CSR and send message to PE to trigger TDLS discovery procedure. */ eHalStatus csrTdlsSendMgmtReq(tHalHandle hHal, tANI_U8 sessionId, tCsrTdlsSendMgmt *tdlsSendMgmt) { tpAniSirGlobal pMac = PMAC_STRUCT( hHal ); tSmeCmd *tdlsSendMgmtCmd ; eHalStatus status = eHAL_STATUS_FAILURE ; //If connected and in Infra. Only then allow this if( CSR_IS_SESSION_VALID( pMac, sessionId ) && csrIsConnStateConnectedInfra( pMac, sessionId ) && (NULL != tdlsSendMgmt) ) { tdlsSendMgmtCmd = csrGetCommandBuffer(pMac) ; if(tdlsSendMgmtCmd) { tTdlsSendMgmtCmdInfo *tdlsSendMgmtCmdInfo = &tdlsSendMgmtCmd->u.tdlsCmd.u.tdlsSendMgmtCmdInfo ; tdlsSendMgmtCmd->sessionId = sessionId; tdlsSendMgmtCmdInfo->frameType = tdlsSendMgmt->frameType ; tdlsSendMgmtCmdInfo->dialog = tdlsSendMgmt->dialog ; tdlsSendMgmtCmdInfo->statusCode = tdlsSendMgmt->statusCode ; tdlsSendMgmtCmdInfo->responder = tdlsSendMgmt->responder; tdlsSendMgmtCmdInfo->peerCapability = tdlsSendMgmt->peerCapability; vos_mem_copy(tdlsSendMgmtCmdInfo->peerMac, tdlsSendMgmt->peerMac, sizeof(tSirMacAddr)) ; if( (0 != tdlsSendMgmt->len) && (NULL != tdlsSendMgmt->buf) ) { tdlsSendMgmtCmdInfo->buf = vos_mem_malloc(tdlsSendMgmt->len); if ( NULL == tdlsSendMgmtCmdInfo->buf ) status = eHAL_STATUS_FAILURE; else status = eHAL_STATUS_SUCCESS; if(!HAL_STATUS_SUCCESS( status ) ) { smsLog( pMac, LOGE, FL("Alloc Failed") ); VOS_ASSERT(0) ; return status ; } vos_mem_copy(tdlsSendMgmtCmdInfo->buf, tdlsSendMgmt->buf, tdlsSendMgmt->len ); tdlsSendMgmtCmdInfo->len = tdlsSendMgmt->len; } else { tdlsSendMgmtCmdInfo->buf = NULL; tdlsSendMgmtCmdInfo->len = 0; } tdlsSendMgmtCmd->command = eSmeCommandTdlsSendMgmt ; tdlsSendMgmtCmd->u.tdlsCmd.size = sizeof(tTdlsSendMgmtCmdInfo) ; smePushCommand(pMac, tdlsSendMgmtCmd, FALSE) ; status = eHAL_STATUS_SUCCESS ; } } return status ; }
/* * TDLS request API, called from HDD to Send Link Establishment Parameters */ VOS_STATUS csrTdlsSendLinkEstablishParams(tHalHandle hHal, tANI_U8 sessionId, tSirMacAddr peerMac, tCsrTdlsLinkEstablishParams *tdlsLinkEstablishParams) { tpAniSirGlobal pMac = PMAC_STRUCT( hHal ); tSmeCmd *tdlsLinkEstablishCmd; eHalStatus status = eHAL_STATUS_FAILURE ; //If connected and in Infra. Only then allow this if( CSR_IS_SESSION_VALID( pMac, sessionId ) && csrIsConnStateConnectedInfra( pMac, sessionId ) && (NULL != peerMac) ) { tdlsLinkEstablishCmd = csrGetCommandBuffer(pMac) ; if(tdlsLinkEstablishCmd) { tTdlsLinkEstablishCmdInfo *tdlsLinkEstablishCmdInfo = &tdlsLinkEstablishCmd->u.tdlsCmd.u.tdlsLinkEstablishCmdInfo ; vos_mem_zero(&tdlsLinkEstablishCmd->u.tdlsCmd, sizeof(tTdlsCmd)); tdlsLinkEstablishCmd->sessionId = sessionId; vos_mem_copy( tdlsLinkEstablishCmdInfo->peerMac, peerMac, sizeof(tSirMacAddr)); tdlsLinkEstablishCmdInfo->isBufSta = tdlsLinkEstablishParams->isBufSta; tdlsLinkEstablishCmdInfo->isResponder = tdlsLinkEstablishParams->isResponder; tdlsLinkEstablishCmdInfo->maxSp = tdlsLinkEstablishParams->maxSp; tdlsLinkEstablishCmdInfo->uapsdQueues = tdlsLinkEstablishParams->uapsdQueues; tdlsLinkEstablishCmdInfo->isOffChannelSupported = tdlsLinkEstablishParams->isOffChannelSupported; vos_mem_copy(tdlsLinkEstablishCmdInfo->supportedChannels, tdlsLinkEstablishParams->supportedChannels, tdlsLinkEstablishParams->supportedChannelsLen); tdlsLinkEstablishCmdInfo->supportedChannelsLen = tdlsLinkEstablishParams->supportedChannelsLen; vos_mem_copy(tdlsLinkEstablishCmdInfo->supportedOperClasses, tdlsLinkEstablishParams->supportedOperClasses, tdlsLinkEstablishParams->supportedOperClassesLen); tdlsLinkEstablishCmdInfo->supportedOperClassesLen = tdlsLinkEstablishParams->supportedOperClassesLen; tdlsLinkEstablishCmdInfo->isResponder= tdlsLinkEstablishParams->isResponder; tdlsLinkEstablishCmdInfo->maxSp= tdlsLinkEstablishParams->maxSp; tdlsLinkEstablishCmdInfo->uapsdQueues= tdlsLinkEstablishParams->uapsdQueues; tdlsLinkEstablishCmd->command = eSmeCommandTdlsLinkEstablish ; tdlsLinkEstablishCmd->u.tdlsCmd.size = sizeof(tTdlsLinkEstablishCmdInfo) ; smePushCommand(pMac, tdlsLinkEstablishCmd, FALSE) ; status = eHAL_STATUS_SUCCESS ; smsLog( pMac, LOG1, FL("Successfully posted tdlsLinkEstablishCmd to SME")); } } return status ; }
/* * TDLS request API, called from HDD to Send Channel Switch Parameters */ VOS_STATUS csrTdlsSendChanSwitchReq(tHalHandle hHal, tANI_U8 sessionId, tSirMacAddr peerMac, tANI_S32 tdlsOffCh, tANI_S32 tdlsOffChBwOffset, tANI_U8 tdlsSwMode) { tpAniSirGlobal pMac = PMAC_STRUCT( hHal ); tSmeCmd *tdlsChanSwitchCmd; eHalStatus status = eHAL_STATUS_FAILURE ; //If connected and in Infra. Only then allow this if( CSR_IS_SESSION_VALID( pMac, sessionId ) && csrIsConnStateConnectedInfra( pMac, sessionId ) && (NULL != peerMac) ) { tdlsChanSwitchCmd = csrGetCommandBuffer(pMac) ; if(tdlsChanSwitchCmd) { tTdlsChanSwitchCmdInfo *tdlsChanSwitchCmdInfo = &tdlsChanSwitchCmd->u.tdlsCmd.u.tdlsChanSwitchCmdInfo; vos_mem_zero(&tdlsChanSwitchCmd->u.tdlsCmd, sizeof(tTdlsCmd)); tdlsChanSwitchCmd->sessionId = sessionId; vos_mem_copy(tdlsChanSwitchCmdInfo->peerMac, peerMac, sizeof(tSirMacAddr)); tdlsChanSwitchCmdInfo->tdlsOffCh = tdlsOffCh; tdlsChanSwitchCmdInfo->tdlsOffChBwOffset = tdlsOffChBwOffset; tdlsChanSwitchCmdInfo->tdlsSwMode = tdlsSwMode; tdlsChanSwitchCmd->command = eSmeCommandTdlsChannelSwitch; tdlsChanSwitchCmd->u.tdlsCmd.size = sizeof(tTdlsChanSwitchCmdInfo) ; smePushCommand(pMac, tdlsChanSwitchCmd, FALSE) ; status = eHAL_STATUS_SUCCESS ; smsLog( pMac, LOG1, FL("Successfully posted tdlsChanSwitchCmd to SME")); } } return status ; }
/* * TDLS request API, called from HDD to Send Link Establishment Parameters */ VOS_STATUS csrTdlsSendLinkEstablishParams(tHalHandle hHal, tANI_U8 sessionId, tSirMacAddr peerMac, tCsrTdlsLinkEstablishParams *tdlsLinkEstablishParams) { tpAniSirGlobal pMac = PMAC_STRUCT( hHal ); tSmeCmd *tdlsLinkEstablishCmd; eHalStatus status = eHAL_STATUS_FAILURE ; //If connected and in Infra. Only then allow this if( CSR_IS_SESSION_VALID( pMac, sessionId ) && csrIsConnStateConnectedInfra( pMac, sessionId ) && (NULL != peerMac) ) { tdlsLinkEstablishCmd = csrGetCommandBuffer(pMac) ; if(tdlsLinkEstablishCmd) { tTdlsLinkEstablishCmdInfo *tdlsLinkEstablishCmdInfo = &tdlsLinkEstablishCmd->u.tdlsCmd.u.tdlsLinkEstablishCmdInfo ; tdlsLinkEstablishCmd->sessionId = sessionId; palCopyMemory(pMac->hHdd, tdlsLinkEstablishCmdInfo->peerMac, peerMac, sizeof(tSirMacAddr)); tdlsLinkEstablishCmdInfo->isBufSta = tdlsLinkEstablishParams->isBufSta; tdlsLinkEstablishCmdInfo->isResponder= tdlsLinkEstablishParams->isResponder; tdlsLinkEstablishCmdInfo->maxSp= tdlsLinkEstablishParams->maxSp; tdlsLinkEstablishCmdInfo->uapsdQueues= tdlsLinkEstablishParams->uapsdQueues; tdlsLinkEstablishCmd->command = eSmeCommandTdlsLinkEstablish ; tdlsLinkEstablishCmd->u.tdlsCmd.size = sizeof(tTdlsLinkEstablishCmdInfo) ; smePushCommand(pMac, tdlsLinkEstablishCmd, FALSE) ; status = eHAL_STATUS_SUCCESS ; } } return status ; }
/* --------------------------------------------------------------------------- \fn oemData_OemDataReq \brief Request an OEM DATA RSP \param sessionId - Id of session to be used \param pOemDataReqID - pointer to an object to get back the request ID \param callback - a callback function that is called upon finish \param pContext - a pointer passed in for the callback \return eHalStatus -------------------------------------------------------------------------------*/ eHalStatus oemData_OemDataReq(tHalHandle hHal, tANI_U8 sessionId, tOemDataReqConfig *oemDataReqConfig, tANI_U32 *pOemDataReqID, oemData_OemDataReqCompleteCallback callback, void *pContext) { eHalStatus status = eHAL_STATUS_SUCCESS; tpAniSirGlobal pMac = PMAC_STRUCT( hHal ); tSmeCmd *pOemDataCmd = NULL; do { if( !CSR_IS_SESSION_VALID( pMac, sessionId ) ) { status = eHAL_STATUS_FAILURE; break; } pMac->oemData.oemDataReqConfig.sessionId = sessionId; pMac->oemData.callback = callback; pMac->oemData.pContext = pContext; pMac->oemData.oemDataReqID = *(pOemDataReqID); vos_mem_copy((v_VOID_t*)(pMac->oemData.oemDataReqConfig.oemDataReq), (v_VOID_t*)(oemDataReqConfig->oemDataReq), OEM_DATA_REQ_SIZE); pMac->oemData.oemDataReqActive = eANI_BOOLEAN_FALSE; pOemDataCmd = smeGetCommandBuffer(pMac); //fill up the command before posting it. if(pOemDataCmd) { pOemDataCmd->command = eSmeCommandOemDataReq; pOemDataCmd->u.oemDataCmd.callback = callback; pOemDataCmd->u.oemDataCmd.pContext = pContext; pOemDataCmd->u.oemDataCmd.oemDataReqID = pMac->oemData.oemDataReqID; //set the oem data request pOemDataCmd->u.oemDataCmd.oemDataReq.sessionId = pMac->oemData.oemDataReqConfig.sessionId; vos_mem_copy((v_VOID_t*)(pOemDataCmd->u.oemDataCmd.oemDataReq.oemDataReq), (v_VOID_t*)(pMac->oemData.oemDataReqConfig.oemDataReq), OEM_DATA_REQ_SIZE); } else { status = eHAL_STATUS_FAILURE; break; } //now queue this command in the sme command queue //Here since this is not interacting with the csr just push the command //into the sme queue. Also push this command with the normal priority smePushCommand(pMac, pOemDataCmd, eANI_BOOLEAN_FALSE); } while(0); if(!HAL_STATUS_SUCCESS(status) && pOemDataCmd) { oemData_ReleaseOemDataReqCommand(pMac, pOemDataCmd, eOEM_DATA_REQ_FAILURE); pMac->oemData.oemDataReqActive = eANI_BOOLEAN_FALSE; } return status; }
/* * TDLS request API, called from HDD to modify an existing TDLS peer */ eHalStatus csrTdlsChangePeerSta(tHalHandle hHal, tANI_U8 sessionId, tSirMacAddr peerMac, tCsrStaParams *pstaParams) { tpAniSirGlobal pMac = PMAC_STRUCT( hHal ); tSmeCmd *tdlsAddStaCmd ; eHalStatus status = eHAL_STATUS_FAILURE ; if (NULL == pstaParams) return status; //If connected and in Infra. Only then allow this if (CSR_IS_SESSION_VALID( pMac, sessionId ) && csrIsConnStateConnectedInfra( pMac, sessionId ) && (NULL != peerMac)){ tdlsAddStaCmd = csrGetCommandBuffer(pMac) ; if (tdlsAddStaCmd) { tTdlsAddStaCmdInfo *tdlsAddStaCmdInfo = &tdlsAddStaCmd->u.tdlsCmd.u.tdlsAddStaCmdInfo ; tdlsAddStaCmdInfo->tdlsAddOper = TDLS_OPER_UPDATE; tdlsAddStaCmd->sessionId = sessionId; vos_mem_copy(tdlsAddStaCmdInfo->peerMac, peerMac, sizeof(tSirMacAddr)) ; tdlsAddStaCmdInfo->capability = pstaParams->capability; tdlsAddStaCmdInfo->uapsdQueues = pstaParams->uapsd_queues; tdlsAddStaCmdInfo->maxSp = pstaParams->max_sp; vos_mem_copy(tdlsAddStaCmdInfo->extnCapability, pstaParams->extn_capability, sizeof(pstaParams->extn_capability)); tdlsAddStaCmdInfo->htcap_present = pstaParams->htcap_present; if(pstaParams->htcap_present) vos_mem_copy( &tdlsAddStaCmdInfo->HTCap, &pstaParams->HTCap, sizeof(pstaParams->HTCap)); else vos_mem_set(&tdlsAddStaCmdInfo->HTCap, sizeof(pstaParams->HTCap), 0); tdlsAddStaCmdInfo->vhtcap_present = pstaParams->vhtcap_present; if(pstaParams->vhtcap_present) vos_mem_copy( &tdlsAddStaCmdInfo->VHTCap, &pstaParams->VHTCap, sizeof(pstaParams->VHTCap)); else vos_mem_set(&tdlsAddStaCmdInfo->VHTCap, sizeof(pstaParams->VHTCap), 0); tdlsAddStaCmdInfo->supportedRatesLen = pstaParams->supported_rates_len; if (0 != pstaParams->supported_rates_len) vos_mem_copy( &tdlsAddStaCmdInfo->supportedRates, pstaParams->supported_rates, pstaParams->supported_rates_len); tdlsAddStaCmd->command = eSmeCommandTdlsAddPeer; tdlsAddStaCmd->u.tdlsCmd.size = sizeof(tTdlsAddStaCmdInfo) ; smePushCommand(pMac, tdlsAddStaCmd, FALSE) ; status = eHAL_STATUS_SUCCESS ; } } return status ; }