eHalStatus p2pSendAction(tHalHandle hHal, tANI_U8 sessionId, const tANI_U8 *pBuf, tANI_U32 len, tANI_U16 wait, tANI_BOOLEAN noack) { eHalStatus status = eHAL_STATUS_SUCCESS; tpAniSirGlobal pMac = PMAC_STRUCT(hHal); tSirMbMsgP2p *pMsg; tANI_U16 msgLen; VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO_MED, " %s sends action frame", __func__); msgLen = (tANI_U16)((sizeof( tSirMbMsg )) + len); pMsg = vos_mem_malloc(msgLen); if ( NULL == pMsg ) status = eHAL_STATUS_FAILURE; else { vos_mem_set((void *)pMsg, msgLen, 0); pMsg->type = pal_cpu_to_be16((tANI_U16)eWNI_SME_SEND_ACTION_FRAME_IND); pMsg->msgLen = pal_cpu_to_be16(msgLen); pMsg->sessionId = sessionId; pMsg->noack = noack; pMsg->wait = (tANI_U16)wait; vos_mem_copy(pMsg->data, pBuf, len); status = palSendMBMessage(pMac->hHdd, pMsg); } return( status ); }
/* --------------------------------------------------------------------------- \fn oemData_SendMBOemDataReq \brief Request an OEM DATA REQ to be passed down to PE \param pMac: \param pOemDataReq: Pointer to the oem data request \return eHalStatus -------------------------------------------------------------------------------*/ eHalStatus oemData_SendMBOemDataReq(tpAniSirGlobal pMac, tOemDataReq *pOemDataReq) { eHalStatus status = eHAL_STATUS_SUCCESS; tSirOemDataReq* pMsg; tANI_U16 msgLen; tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, pOemDataReq->sessionId ); smsLog(pMac, LOGW, "OEM_DATA: entering Function %s", __func__); msgLen = (tANI_U16)(sizeof(tSirOemDataReq)); pMsg = vos_mem_malloc(msgLen); if ( NULL == pMsg ) status = eHAL_STATUS_FAILURE; else status = eHAL_STATUS_SUCCESS; if(HAL_STATUS_SUCCESS(status)) { vos_mem_set(pMsg, msgLen, 0); pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_OEM_DATA_REQ); pMsg->messageLen = pal_cpu_to_be16(msgLen); vos_mem_copy(pMsg->selfMacAddr, pSession->selfMacAddr, sizeof(tSirMacAddr) ); vos_mem_copy(pMsg->oemDataReq, pOemDataReq->oemDataReq, OEM_DATA_REQ_SIZE); smsLog(pMac, LOGW, "OEM_DATA: sending message to pe%s", __func__); status = palSendMBMessage(pMac->hHdd, pMsg); } smsLog(pMac, LOGW, "OEM_DATA: exiting Function %s", __func__); return status; }
/* --------------------------------------------------------------------------- \fn oemData_SendMBOemDataReq \brief Request an OEM DATA REQ to be passed down to PE \param pMac: \param pOemDataReq: Pointer to the oem data request \return eHalStatus -------------------------------------------------------------------------------*/ eHalStatus oemData_SendMBOemDataReq(tpAniSirGlobal pMac, tOemDataReq *pOemDataReq) { eHalStatus status = eHAL_STATUS_SUCCESS; tSirOemDataReq* pMsg; tANI_U16 msgLen; tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, pOemDataReq->sessionId ); smsLog(pMac, LOGW, "OEM_DATA: entering Function %s", __func__); msgLen = (tANI_U16)(sizeof(tSirOemDataReq)); status = palAllocateMemory(pMac->hHdd, (void**)&pMsg, msgLen); if(HAL_STATUS_SUCCESS(status)) { palZeroMemory(pMac->hHdd, pMsg, msgLen); pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_OEM_DATA_REQ); palCopyMemory(pMac->hHdd, pMsg->selfMacAddr, pSession->selfMacAddr, sizeof(tSirMacAddr) ); status = palCopyMemory(pMac->hHdd, pMsg->oemDataReq, pOemDataReq->oemDataReq, OEM_DATA_REQ_SIZE); if(HAL_STATUS_SUCCESS(status)) { smsLog(pMac, LOGW, "OEM_DATA: sending message to pe%s", __func__); status = palSendMBMessage(pMac->hHdd, pMsg); } else { palFreeMemory(pMac->hHdd, pMsg); } } smsLog(pMac, LOGW, "OEM_DATA: exiting Function %s", __func__); return status; }
/* * CCM_STRING_TYPE CCM_INTEGER_TYPE * |<-------- 4 ----->| |<-------- 4 ----->| * +----------+ <-- msg --> +----------+ * |type | |type | * +----------+ +----------+ * |msgLen=24 | |msgLen=16 | * +----------+----------+ +----------+----------+ * | cfgId | | cfgId | * +---------------------+ +---------------------+ * | length=11 | | length=4 | * +---------------------+ +---------------------+ * | | | value | * | | +---------------------+ * | | * | +----+ * | |////| <- padding to 4-byte boundary * +----------------+----+ */ static eHalStatus sendCfg(tpAniSirGlobal pMac, tHddHandle hHdd, tCfgReq *req, tANI_BOOLEAN fRsp) { tSirMbMsg *msg; eHalStatus status; tANI_S16 msgLen = (tANI_U16)(4 + /* 4 bytes for msg header */ CFGOBJ_ID_SIZE + CFGOBJ_LEN_SIZE + CFGOBJ_ALIGN(req->length)) ; msg = vos_mem_malloc(msgLen); if ( NULL != msg ) { if( fRsp ) { msg->type = pal_cpu_to_be16(WNI_CFG_SET_REQ); } else { msg->type = pal_cpu_to_be16(WNI_CFG_SET_REQ_NO_RSP); } msg->msgLen = pal_cpu_to_be16(msgLen); (void)encodeCfgReq(hHdd, msg->data, req->cfgId, req->length, req->ccmPtr, req->ccmValue, req->type) ; status = palSendMBMessage(hHdd, msg) ; if (status != eHAL_STATUS_SUCCESS) { smsLog( pMac, LOGW, FL("palSendMBMessage() failed")); //No need to free msg. palSendMBMessage frees it. status = eHAL_STATUS_FAILURE ; } } else { smsLog( pMac, LOGW, FL("failed to allocate memory(len=%d)"), msgLen ); status = eHAL_STATUS_FAILURE; } return status ; }
static eHalStatus sendCfg(tpAniSirGlobal pMac, tHddHandle hHdd, tCfgReq *req, tANI_BOOLEAN fRsp) { tSirMbMsg *msg; eHalStatus status; tANI_S16 msgLen = (tANI_U16)(4 + CFGOBJ_ID_SIZE + CFGOBJ_LEN_SIZE + CFGOBJ_ALIGN(req->length)) ; status = palAllocateMemory(hHdd, (void **)&msg, msgLen); if (status == eHAL_STATUS_SUCCESS) { if( fRsp ) { msg->type = pal_cpu_to_be16(WNI_CFG_SET_REQ); } else { msg->type = pal_cpu_to_be16(WNI_CFG_SET_REQ_NO_RSP); } msg->msgLen = pal_cpu_to_be16(msgLen); (void)encodeCfgReq(hHdd, msg->data, req->cfgId, req->length, req->ccmPtr, req->ccmValue, req->type) ; status = palSendMBMessage(hHdd, msg) ; if (status != eHAL_STATUS_SUCCESS) { smsLog( pMac, LOGE, FL("palSendMBMessage() failed")); status = eHAL_STATUS_FAILURE ; } } else { smsLog( pMac, LOGW, FL("palAllocateMemory(len=%d)"), msgLen ); } return status ; }
eHalStatus p2pCancelRemainOnChannel(tHalHandle hHal, tANI_U8 sessionId) { eHalStatus status = eHAL_STATUS_SUCCESS; tpAniSirGlobal pMac = PMAC_STRUCT(hHal); tSirMbMsgP2p *pMsg; tANI_U16 msgLen; //Need to check session ID to support concurrency msgLen = (tANI_U16)(sizeof( tSirMbMsg )); pMsg = vos_mem_malloc(msgLen); if ( NULL == pMsg ) status = eHAL_STATUS_FAILURE; else { vos_mem_set((void *)pMsg, msgLen, 0); pMsg->type = pal_cpu_to_be16((tANI_U16)eWNI_SME_ABORT_REMAIN_ON_CHAN_IND); pMsg->msgLen = pal_cpu_to_be16(msgLen); pMsg->sessionId = sessionId; status = palSendMBMessage(pMac->hHdd, pMsg); } return( status ); }
eHalStatus sme_FTSendUpdateKeyInd(tHalHandle hHal, tCsrRoamSetKey * pFTKeyInfo) { tSirFTUpdateKeyInfo *pMsg; tANI_U16 msgLen; eHalStatus status = eHAL_STATUS_FAILURE; tAniEdType tmpEdType; tAniKeyDirection tmpDirection; //tANI_U8 *pBuf; tANI_U8 *p = NULL; tAniEdType edType; tpAniSirGlobal pMac = PMAC_STRUCT( hHal ); int i = 0; smsLog(pMac, LOGE, FL("keyLength %d\n"), pFTKeyInfo->keyLength); for(i=0; i<pFTKeyInfo->keyLength; i++) smsLog(pMac, LOGE, FL("%02x"), pFTKeyInfo->Key[i]); msgLen = sizeof( tANI_U16) + sizeof( tANI_U16 ) + sizeof( pMsg->keyMaterial.length ) + sizeof( pMsg->keyMaterial.edType ) + sizeof( pMsg->keyMaterial.numKeys ) + sizeof( pMsg->keyMaterial.key ); status = palAllocateMemory(pMac->hHdd, (void **)&pMsg, msgLen); if ( !HAL_STATUS_SUCCESS(status) ) { return eHAL_STATUS_FAILURE; } palZeroMemory(pMac->hHdd, pMsg, msgLen); pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_FT_UPDATE_KEY); pMsg->length = pal_cpu_to_be16(msgLen); p = (tANI_U8 *)&pMsg->keyMaterial; // Set the pMsg->keyMaterial.length field (this length is defined as all data that follows the edType field // in the tSirKeyMaterial keyMaterial; field). // // !!NOTE: This keyMaterial.length contains the length of a MAX size key, though the keyLength can be // shorter than this max size. Is LIM interpreting this ok ? p = pal_set_U16( p, pal_cpu_to_be16((tANI_U16)( sizeof( pMsg->keyMaterial.numKeys ) + ( pMsg->keyMaterial.numKeys * sizeof( pMsg->keyMaterial.key ) ) )) ); // set pMsg->keyMaterial.edType edType = csrTranslateEncryptTypeToEdType( pFTKeyInfo->encType ); tmpEdType = pal_cpu_to_be32(edType); palCopyMemory( pMac->hHdd, p, (tANI_U8 *)&tmpEdType, sizeof(tAniEdType) ); p += sizeof( pMsg->keyMaterial.edType ); // set the pMsg->keyMaterial.numKeys field *p = pMsg->keyMaterial.numKeys; p += sizeof( pMsg->keyMaterial.numKeys ); // set pSirKey->keyId = keyId; *p = pMsg->keyMaterial.key[ 0 ].keyId; p += sizeof( pMsg->keyMaterial.key[ 0 ].keyId ); // set pSirKey->unicast = (tANI_U8)fUnicast; *p = (tANI_U8)eANI_BOOLEAN_TRUE; p += sizeof( pMsg->keyMaterial.key[ 0 ].unicast ); // set pSirKey->keyDirection = aniKeyDirection; tmpDirection = pal_cpu_to_be32(pFTKeyInfo->keyDirection); palCopyMemory( pMac->hHdd, p, (tANI_U8 *)&tmpDirection, sizeof(tAniKeyDirection) ); p += sizeof(tAniKeyDirection); // pSirKey->keyRsc = ;; palCopyMemory( pMac->hHdd, p, pFTKeyInfo->keyRsc, CSR_MAX_RSC_LEN ); p += sizeof( pMsg->keyMaterial.key[ 0 ].keyRsc ); // set pSirKey->paeRole *p = pFTKeyInfo->paeRole; // 0 is Supplicant p++; // set pSirKey->keyLength = keyLength; p = pal_set_U16( p, pal_cpu_to_be16(pFTKeyInfo->keyLength) ); if ( pFTKeyInfo->keyLength && pFTKeyInfo->Key ) { palCopyMemory( pMac->hHdd, p, pFTKeyInfo->Key, pFTKeyInfo->keyLength ); if(pFTKeyInfo->keyLength == 16) { smsLog(pMac, LOGE, " SME Set keyIdx (%d) encType(%d) key = %02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X\n", pFTKeyInfo->keyId, edType, pFTKeyInfo->Key[0], pFTKeyInfo->Key[1], pFTKeyInfo->Key[2], pFTKeyInfo->Key[3], pFTKeyInfo->Key[4], pFTKeyInfo->Key[5], pFTKeyInfo->Key[6], pFTKeyInfo->Key[7], pFTKeyInfo->Key[8], pFTKeyInfo->Key[9], pFTKeyInfo->Key[10], pFTKeyInfo->Key[11], pFTKeyInfo->Key[12], pFTKeyInfo->Key[13], pFTKeyInfo->Key[14], pFTKeyInfo->Key[15]); } } status = palSendMBMessage(pMac->hHdd, pMsg); return( status ); }
eHalStatus sme_FTSendUpdateKeyInd(tHalHandle hHal, tCsrRoamSetKey * pFTKeyInfo) { tSirFTUpdateKeyInfo *pMsg; tANI_U16 msgLen; eHalStatus status = eHAL_STATUS_FAILURE; tAniEdType tmpEdType; tSirKeyMaterial *keymaterial = NULL; tAniEdType edType; tpAniSirGlobal pMac = PMAC_STRUCT( hHal ); #if defined WLAN_FEATURE_VOWIFI_11R_DEBUG int i = 0; smsLog(pMac, LOG1, FL("keyLength %d"), pFTKeyInfo->keyLength); for (i=0; i<pFTKeyInfo->keyLength; i++) smsLog(pMac, LOG1, FL("%02x"), pFTKeyInfo->Key[i]); #endif msgLen = sizeof( tANI_U16) + sizeof( tANI_U16 ) + sizeof( pMsg->keyMaterial.length ) + sizeof( pMsg->keyMaterial.edType ) + sizeof( pMsg->keyMaterial.numKeys ) + sizeof( pMsg->keyMaterial.key ); pMsg = vos_mem_malloc(msgLen); if ( NULL == pMsg ) { return eHAL_STATUS_FAILURE; } vos_mem_set(pMsg, msgLen, 0); pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_FT_UPDATE_KEY); pMsg->length = pal_cpu_to_be16(msgLen); keymaterial = &pMsg->keyMaterial; keymaterial->length = pFTKeyInfo->keyLength; edType = csrTranslateEncryptTypeToEdType( pFTKeyInfo->encType ); tmpEdType = pal_cpu_to_be32(edType); keymaterial->edType = tmpEdType; // Set the pMsg->keyMaterial.length field (this length is defined as all // data that follows the edType field // in the tSirKeyMaterial keyMaterial; field). // // !!NOTE: This keyMaterial.length contains the length of a MAX size key, // though the keyLength can be // shorter than this max size. Is LIM interpreting this ok ? keymaterial->numKeys = 1; keymaterial->key[ 0 ].keyId = pFTKeyInfo->keyId; keymaterial->key[ 0 ].unicast = (tANI_U8)eANI_BOOLEAN_TRUE; keymaterial->key[ 0 ].keyDirection = pFTKeyInfo->keyDirection; vos_mem_copy(&keymaterial->key[ 0 ].keyRsc, pFTKeyInfo->keyRsc, CSR_MAX_RSC_LEN); keymaterial->key[ 0 ].paeRole = pFTKeyInfo->paeRole; keymaterial->key[ 0 ].keyLength = pFTKeyInfo->keyLength; if ( pFTKeyInfo->keyLength && pFTKeyInfo->Key ) { vos_mem_copy(&keymaterial->key[ 0 ].key, pFTKeyInfo->Key, pFTKeyInfo->keyLength); if(pFTKeyInfo->keyLength == 16) { smsLog(pMac, LOG1, "SME Set Update Ind keyIdx (%d) encType(%d) key = " "%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X", pMsg->keyMaterial.key[0].keyId, (tAniEdType)pMsg->keyMaterial.edType, pMsg->keyMaterial.key[0].key[0], pMsg->keyMaterial.key[0].key[1], pMsg->keyMaterial.key[0].key[2], pMsg->keyMaterial.key[0].key[3], pMsg->keyMaterial.key[0].key[4], pMsg->keyMaterial.key[0].key[5], pMsg->keyMaterial.key[0].key[6], pMsg->keyMaterial.key[0].key[7], pMsg->keyMaterial.key[0].key[8], pMsg->keyMaterial.key[0].key[9], pMsg->keyMaterial.key[0].key[10], pMsg->keyMaterial.key[0].key[11], pMsg->keyMaterial.key[0].key[12], pMsg->keyMaterial.key[0].key[13], pMsg->keyMaterial.key[0].key[14], pMsg->keyMaterial.key[0].key[15]); } } vos_mem_copy( &pMsg->bssId[ 0 ], &pFTKeyInfo->peerMac[ 0 ], sizeof(tCsrBssid) ); smsLog(pMac, LOG1, "BSSID = "MAC_ADDRESS_STR, MAC_ADDR_ARRAY(pMsg->bssId)); status = palSendMBMessage(pMac->hHdd, pMsg); return( status ); }
/* * Loop thru comp[] and form an ANI message which contains all completed cfgIds. * The message begins with an INTEGER parameter (cfgId=CFG_UPDATE_MAGIC_DWORD) * to mark the start of the message. */ static eHalStatus cfgUpdate(tpAniSirGlobal pMac, tHddHandle hHdd, tCcmCfgSetCallback callback) { tANI_U32 i, *pl ; tCfgReq *req ; tSirMbMsg *msg ; eHalStatus status ; tANI_S16 msgLen = 4 + /* 4 bytes for msg header */ /* for CFG_UPDATE_MAGIC_DWORD */ CFGOBJ_ID_SIZE + CFGOBJ_LEN_SIZE + CFGOBJ_INTEGER_VALUE_SIZE ; if (pMac->ccm.state == eCCM_STOPPED || pMac->ccm.replay.started) { status = eHAL_STATUS_FAILURE ; goto end ; } palSpinLockTake(hHdd, pMac->ccm.lock); pMac->ccm.replay.started = 1 ; pMac->ccm.replay.nr_param = 0 ; palSpinLockGive(hHdd, pMac->ccm.lock); /* Calculate message length */ for (i = 0 ; i < CFG_PARAM_MAX_NUM ; ++i) { if ((req = pMac->ccm.comp[i]) != NULL) { msgLen += (tANI_S16)(CFGOBJ_ID_SIZE + CFGOBJ_LEN_SIZE + CFGOBJ_ALIGN(req->length)) ; pMac->ccm.replay.nr_param += 1 ; #ifdef CCM_DEBUG smsLog(pMac, LOGW, FL("cfgId=%d"), req->cfgId); #endif } } if (pMac->ccm.replay.nr_param == 0) { if (callback) { callback((tHalHandle)pMac, WNI_CFG_SUCCESS) ; } status = eHAL_STATUS_SUCCESS ; goto end ; } pMac->ccm.replay.in_progress = 0 ; pMac->ccm.replay.result = WNI_CFG_SUCCESS ; pMac->ccm.replay.callback = callback ; pMac->ccm.replay.done = NULL ; msg = vos_mem_malloc(msgLen); if ( NULL == msg ) { pMac->ccm.replay.started = 0 ; status = eHAL_STATUS_FAILURE; goto end; } msg->type = pal_cpu_to_be16(WNI_CFG_SET_REQ); msg->msgLen = pal_cpu_to_be16(msgLen); /* Encode the starting cfgId */ pl = encodeCfgReq(hHdd, msg->data, CFG_UPDATE_MAGIC_DWORD, 4, NULL, 0, CCM_INTEGER_TYPE) ; /* Encode the saved cfg requests */ for (i = 0 ; i < CFG_PARAM_MAX_NUM ; ++i) { if ((req = pMac->ccm.comp[i]) != NULL) { pl = encodeCfgReq(hHdd, pl, req->cfgId, req->length, req->ccmPtr, req->ccmValue, req->type) ; } } status = palSendMBMessage(hHdd, msg) ; if (status != eHAL_STATUS_SUCCESS) { smsLog(pMac, LOGW, FL("palSendMBMessage() failed. status=%d"), status); pMac->ccm.replay.started = 0 ; //No need to free msg. palSendMBMessage frees it. goto end ; } end: return status ; }