/* * TDLS request API, called from HDD to enable TDLS link teardown request * in SME/CSR and send message to PE to trigger TDLS link teardown procedure. */ eHalStatus csrTdlsTeardownReq(tHalHandle hHal, tANI_U8 sessionId, tCsrTdlsTeardownRequest *tdlsTeardownReq) { tpAniSirGlobal pMac = PMAC_STRUCT( hHal ); tSmeCmd *tdlsTeardownReqCmd ; eHalStatus status = eHAL_STATUS_FAILURE ; if(tdlsTeardownReq) { tdlsTeardownReqCmd = csrGetCommandBuffer(pMac) ; if(tdlsTeardownReqCmd) { tTdlsLinkTeardownCmdinfo *teardownCmdInfo = &tdlsTeardownReqCmd->u.tdlsCmd.u.tdlsLinkTeardownCmdInfo ; tdlsTeardownReqCmd->sessionId = sessionId; vos_mem_copy(teardownCmdInfo->peerMac, tdlsTeardownReq->peerMac, sizeof(tSirMacAddr)) ; tdlsTeardownReqCmd->command = eSmeCommandTdlsLinkTear ; tdlsTeardownReqCmd->u.tdlsCmd.size = sizeof(tTdlsLinkTeardownCmdinfo) ; smePushCommand(pMac, tdlsTeardownReqCmd, FALSE) ; status = eHAL_STATUS_SUCCESS ; } } 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 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 ; }
/* * TDLS request API, called from HDD to enable TDLS discovery request * in SME/CSR and send message to PE to trigger TDLS discovery procedure. */ eHalStatus csrTdlsDiscoveryReq(tHalHandle hHal, tANI_U8 sessionId, tCsrTdlsDisRequest *tdlsDisReq) { tpAniSirGlobal pMac = PMAC_STRUCT( hHal ); tSmeCmd *tdlsDisReqCmd ; eHalStatus status = eHAL_STATUS_FAILURE ; if(tdlsDisReq) { tdlsDisReqCmd = csrGetCommandBuffer(pMac) ; if(tdlsDisReqCmd) { tTdlsDisReqCmdinfo *disReqCmdInfo = &tdlsDisReqCmd->u.tdlsCmd.u.tdlsDisReqCmdInfo ; vos_mem_zero(&tdlsDisReqCmd->u.tdlsCmd, sizeof(tTdlsCmd)); tdlsDisReqCmd->sessionId = sessionId; disReqCmdInfo->tdlsDisType = tdlsDisReq->disType ; palCopyMemory(pMac->hHdd, disReqCmdInfo->peerMac, tdlsDisReq->peerMac, sizeof(tSirMacAddr)) ; tdlsDisReqCmd->command = eSmeCommandTdlsDiscovery ; tdlsDisReqCmd->u.tdlsCmd.size = sizeof(tTdlsDisReqCmdinfo) ; smePushCommand(pMac, tdlsDisReqCmd, 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 ; }
eHalStatus p2pRemainOnChannel(tHalHandle hHal, tANI_U8 sessionId, tANI_U8 channel, tANI_U32 duration, remainOnChanCallback callback, void *pContext #ifdef WLAN_FEATURE_P2P_INTERNAL , eP2PRemainOnChnReason reason #endif ) { eHalStatus status = eHAL_STATUS_SUCCESS; tpAniSirGlobal pMac = PMAC_STRUCT(hHal); tSmeCmd *pRemainChlCmd = NULL; tANI_U32 phyMode; pRemainChlCmd = smeGetCommandBuffer(pMac); if(pRemainChlCmd == NULL) return eHAL_STATUS_FAILURE; if (SIR_BAND_5_GHZ == GetRFBand(channel)) { phyMode = WNI_CFG_PHY_MODE_11A; } else { phyMode = WNI_CFG_PHY_MODE_11G; } cfgSetInt(pMac, WNI_CFG_PHY_MODE, phyMode); do { /* call set in context */ pRemainChlCmd->command = eSmeCommandRemainOnChannel; pRemainChlCmd->sessionId = sessionId; pRemainChlCmd->u.remainChlCmd.chn = channel; pRemainChlCmd->u.remainChlCmd.duration = duration; pRemainChlCmd->u.remainChlCmd.callback = callback; pRemainChlCmd->u.remainChlCmd.callbackCtx = pContext; //Put it at the head of the Q if we just finish finding the peer and ready to send a frame #ifdef WLAN_FEATURE_P2P_INTERNAL smePushCommand(pMac, pRemainChlCmd, (eP2PRemainOnChnReasonSendFrame == reason)); #else csrQueueSmeCommand(pMac, pRemainChlCmd, eANI_BOOLEAN_FALSE); #endif } while(0); smsLog(pMac, LOGW, "exiting function %s\n", __FUNCTION__); return(status); }
void csrFullPowerCallback(void *pv, eHalStatus status) { tpAniSirGlobal pMac = PMAC_STRUCT( pv ); tListElem *pEntry; tSmeCmd *pCommand; (void)status; while( NULL != ( pEntry = csrLLRemoveHead( &pMac->roam.roamCmdPendingList, eANI_BOOLEAN_TRUE ) ) ) { pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link ); smePushCommand( pMac, pCommand, eANI_BOOLEAN_FALSE ); } }
/* * 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 ; }