v_VOID_t vos_mem_dma_free( v_VOID_t *ptr ) { if (ptr != NULL) { VOS_STATUS vosStatus; struct s_vos_mem_struct* memStruct = ((struct s_vos_mem_struct*)ptr) - 1; spin_lock(&vosMemList.lock); vosStatus = hdd_list_remove_node(&vosMemList, &memStruct->pNode); spin_unlock(&vosMemList.lock); if(VOS_STATUS_SUCCESS == vosStatus) { if(0 == vos_mem_compare(memStruct->header, &WLAN_MEM_HEADER[0], sizeof(WLAN_MEM_HEADER)) ) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL, "Memory Header is corrupted. MemInfo: Filename %s, LineNum %d", memStruct->fileName, (int)memStruct->lineNum); } if(0 == vos_mem_compare( (v_U8_t*)ptr + memStruct->size, &WLAN_MEM_TAIL[0], sizeof(WLAN_MEM_TAIL ) ) ) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL, "Memory Trailer is corrupted. MemInfo: Filename %s, LineNum %d", memStruct->fileName, (int)memStruct->lineNum); } kfree((v_VOID_t*)memStruct); } } }
void limDeletePreAuthNode(tpAniSirGlobal pMac, tSirMacAddr macAddr) { struct tLimPreAuthNode *pPrevNode, *pTempNode; pTempNode = pPrevNode = pMac->lim.pLimPreAuthList; if (pTempNode == NULL) return; if (vos_mem_compare( (tANI_U8 *) macAddr, (tANI_U8 *) &pTempNode->peerMacAddr, sizeof(tSirMacAddr)) ) { // First node to be deleted pMac->lim.pLimPreAuthList = pTempNode->next; limLog(pMac, LOG1, FL(" first node to delete")); limLog(pMac, LOG1, FL(" Release data entry:%p idx %d peer: " MAC_ADDRESS_STR), pTempNode, pTempNode->authNodeIdx, MAC_ADDR_ARRAY(macAddr)); limReleasePreAuthNode(pMac, pTempNode); return; } pTempNode = pTempNode->next; while (pTempNode != NULL) { if (vos_mem_compare( (tANI_U8 *) macAddr, (tANI_U8 *) &pTempNode->peerMacAddr, sizeof(tSirMacAddr)) ) { // Found node to be deleted pPrevNode->next = pTempNode->next; limLog(pMac, LOG1, FL(" subsequent node to delete")); limLog(pMac, LOG1, FL("Release data entry: %p id %d peer: "MAC_ADDRESS_STR), pTempNode, pTempNode->authNodeIdx, MAC_ADDR_ARRAY(macAddr)); limReleasePreAuthNode(pMac, pTempNode); return; } pPrevNode = pTempNode; pTempNode = pTempNode->next; } // Should not be here // Log error limLog(pMac, LOGP, FL("peer not found in pre-auth list, addr= ")); limPrintMacAddr(pMac, macAddr, LOGP); } /*** end limDeletePreAuthNode() ***/
v_VOID_t vos_mem_free( v_VOID_t *ptr ) { unsigned long IrqFlags; if (ptr == NULL) return; if (!memory_dbug_flag) { #ifdef CONFIG_WCNSS_MEM_PRE_ALLOC if (wcnss_prealloc_put(ptr)) return; #endif kfree(ptr); } else { VOS_STATUS vosStatus; struct s_vos_mem_struct* memStruct = ((struct s_vos_mem_struct*)ptr) - 1; spin_lock_irqsave(&vosMemList.lock, IrqFlags); vosStatus = hdd_list_remove_node(&vosMemList, &memStruct->pNode); spin_unlock_irqrestore(&vosMemList.lock, IrqFlags); if(VOS_STATUS_SUCCESS == vosStatus) { if(0 == vos_mem_compare(memStruct->header, &WLAN_MEM_HEADER[0], sizeof(WLAN_MEM_HEADER)) ) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL, "Memory Header is corrupted. MemInfo: Filename %s, LineNum %d", memStruct->fileName, (int)memStruct->lineNum); } if(0 == vos_mem_compare( (v_U8_t*)ptr + memStruct->size, &WLAN_MEM_TAIL[0], sizeof(WLAN_MEM_TAIL ) ) ) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL, "Memory Trailer is corrupted. MemInfo: Filename %s, LineNum %d", memStruct->fileName, (int)memStruct->lineNum); } kfree((v_VOID_t*)memStruct); } else { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL, "%s: Unallocated memory (double free?)", __func__); VOS_BUG(0); } } }
static int checkInfoElement(tSuppRsnFsm *fsm, tAniEapolKeyAvailEventData *data) { tAniEapolRsnKeyDesc *desc; v_U8_t *ieApBytes; int ieApLen; desc = (tAniEapolRsnKeyDesc *) data->keyDesc; if( NULL == desc ) { return ANI_E_NULL_VALUE; } ieApLen = aniAsfPacketGetBytes(fsm->suppCtx->ieAp, &ieApBytes); if( ANI_IS_STATUS_SUCCESS( ieApLen ) ) { if ((desc->keyDataLen != ieApLen) || ( vos_mem_compare(desc->keyData, ieApBytes, ieApLen) )) { // TODO: Send a fault here VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "Supp AP sent inconsistent RSN IE!\n" ); return ANI_E_FAILED; } } return ANI_OK; }
/* * Find specific TDLS peer (based on peer MAC address). */ tCsrTdlsPeerLinkinfo *findTdlsPeer(tpAniSirGlobal pMac, tDblLinkList *peerList, tSirMacAddr peerMac) { tListElem *pEntry = NULL ; tCsrTdlsPeerLinkinfo *peerLinkInfo = NULL ; tSirTdlsPeerInfo *peerInfo = NULL ; pEntry = csrLLPeekHead( peerList, LL_ACCESS_LOCK ); while(pEntry) { peerLinkInfo = GET_BASE_ADDR( pEntry, tCsrTdlsPeerLinkinfo, tdlsPeerStaLink) ; peerInfo = &peerLinkInfo->tdlsDisPeerInfo ; if ( vos_mem_compare( (tANI_U8 *)peerInfo->peerMac, (tANI_U8 *) peerMac, sizeof(tSirMacAddr)) ) { break ; } pEntry = csrLLNext( peerList, pEntry, LL_ACCESS_LOCK) ; } return ((pEntry) ? peerLinkInfo: NULL) ; }
static int checkInfoElement(tAuthRsnFsm *fsm, tAniEapolKeyAvailEventData *data) { tAniEapolRsnKeyDesc *desc; v_U8_t *ieStaBytes; int ieStaLen; desc = (tAniEapolRsnKeyDesc *) data->keyDesc; if( desc ) { ieStaLen = aniAsfPacketGetBytes(fsm->staCtx->ieSta, &ieStaBytes); if( !ANI_IS_STATUS_SUCCESS( ieStaLen ) ) { return ieStaLen; } if ((desc->keyDataLen != ieStaLen) || ( !vos_mem_compare(desc->keyData, ieStaBytes, ieStaLen-2) )) { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "Auth STA sent inconsistent RSN IE!\n"); return ANI_E_FAILED; } // Copy RSN IE //vos_mem_copy(fsm->advertizedRsnIe, desc->keyData, ieStaLen); vos_mem_copy(fsm->advertizedRsnIe, ieStaBytes, ieStaLen); return ANI_OK; } else { return ANI_E_NULL_VALUE; } }
tSirRetStatus schGetP2pIeOffset(tANI_U8 *pExtraIe, tANI_U32 extraIeLen, tANI_U16 *pP2pIeOffset) { tSirRetStatus status = eSIR_FAILURE; *pP2pIeOffset = 0; if(0 == extraIeLen) { return status; } do { if(*pExtraIe == 0xDD) { if ( vos_mem_compare ( (void *)(pExtraIe+2), &P2pOui, sizeof(P2pOui) ) ) { status = eSIR_SUCCESS; break; } } (*pP2pIeOffset)++; pExtraIe++; }while(--extraIeLen > 0); return status; }
static int checkRsnKeyMic(v_U32_t cryptHandle, tAniPacket *eapolFrame, tAniEapolRsnKeyDesc *rsnDesc, v_U8_t *micKey, v_U32_t micKeyLen) { int retVal = ANI_ERROR; int len; v_U8_t *ptr = NULL; v_U8_t *micPos = NULL; v_U8_t result[VOS_DIGEST_SHA1_SIZE]; // Larger of the two v_U8_t incomingMic[ANI_EAPOL_KEY_RSN_MIC_SIZE]; if (!rsnDesc->info.micFlag) { VOS_ASSERT( 0 ); return ANI_E_ILLEGAL_ARG; } len = aniAsfPacketGetBytes(eapolFrame, &ptr); if( ANI_IS_STATUS_SUCCESS( len ) ) { micPos = ptr + ANI_SSM_RSN_KEY_MIC_OFFSET; // Skip to the EAPOL version field for MIC computation ptr += EAPOL_VERSION_POS; len -= EAPOL_VERSION_POS; // Copy existing MIC to temporary location and zero it out vos_mem_copy( incomingMic, micPos, ANI_EAPOL_KEY_RSN_MIC_SIZE ); vos_mem_zero( micPos, ANI_EAPOL_KEY_RSN_MIC_SIZE ); if (rsnDesc->info.keyDescVers == ANI_EAPOL_KEY_DESC_VERS_AES) { if( VOS_IS_STATUS_SUCCESS( vos_sha1_hmac_str(cryptHandle, ptr, len, micKey, micKeyLen, result) ) ) { retVal = ANI_OK; } } else { VOS_ASSERT( 0 ); retVal = ANI_E_ILLEGAL_ARG; } if (retVal == ANI_OK) { if ( !vos_mem_compare(incomingMic, result, ANI_EAPOL_KEY_RSN_MIC_SIZE)) { retVal = ANI_E_MIC_FAILED; } } } return retVal; }
static tLimIbssPeerNode * ibss_peer_find( tpAniSirGlobal pMac, tSirMacAddr macAddr) { tLimIbssPeerNode *pTempNode = pMac->lim.gLimIbssPeerList; while (pTempNode != NULL) { if (vos_mem_compare((tANI_U8 *) macAddr, (tANI_U8 *) &pTempNode->peerMacAddr, sizeof(tSirMacAddr))) break; pTempNode = pTempNode->next; } return pTempNode; }
struct tLimPreAuthNode * limSearchPreAuthList(tpAniSirGlobal pMac, tSirMacAddr macAddr) { struct tLimPreAuthNode *pTempNode = pMac->lim.pLimPreAuthList; while (pTempNode != NULL) { if (vos_mem_compare( (tANI_U8 *) macAddr, (tANI_U8 *) &pTempNode->peerMacAddr, sizeof(tSirMacAddr)) ) break; pTempNode = pTempNode->next; } return pTempNode; } /*** end limSearchPreAuthList() ***/
/** * @brief wpalMemoryCompare - compare memory * @param buf1 address of buffer1 * @param buf2 address of buffer2 * @param size number of bytes to compare * * @return wpt_boolean * eWLAN_PAL_TRUE - if two buffers have same content * eWLAN_PAL_FALSE - not match */ wpt_boolean wpalMemoryCompare(void * buf1, void * buf2, wpt_uint32 size) { return (wpt_boolean)vos_mem_compare( buf1, buf2, size ); }
/*=========================================================================== FUNCTION WLANBAP_XlateRxDataPkt DESCRIPTION HDD will call this API when it has received a 802.3 (TL/UMA has Xlated from 802.11) frame from TL and it wants to form a BT HCI Data Packet - ready to signal up to the BT stack application. PARAMETERS btampHandle: The BT-AMP PAL handle returned in WLANBAP_GetNewHndl. pucAC: Pointer to return the access category vosDataBuff: The data buffer containing the 802.3 frame to be translated to BT HCI Data Packet RETURN VALUE The result code associated with performing the operation VOS_STATUS_E_INVAL: Input parameters are invalid VOS_STATUS_E_FAULT: BAP handle is NULL VOS_STATUS_SUCCESS: Everything is good :) SIDE EFFECTS ============================================================================*/ VOS_STATUS WLANBAP_XlateRxDataPkt ( ptBtampHandle btampHandle, v_U8_t phy_link_handle, /* Used by BAP to indentify the WLAN assoc. (StaId) */ WLANTL_ACEnumType *pucAC, /* Return the AC here. I don't think this is needed */ vos_pkt_t *vosDataBuff ) { WLANBAP_8023HeaderType w8023Header; WLANBAP_HCIACLHeaderType hciACLHeader; v_U8_t aucLLCHeader[WLANBAP_LLC_HEADER_LEN]; ptBtampContext pBtampCtx = (ptBtampContext) btampHandle; VOS_STATUS vosStatus; //v_PVOID_t pHddHdl; /* Handle to return BSL context in */ v_U16_t hciDataLength; /* The HCI packet data length*/ v_U16_t protoType = WLANBAP_BT_AMP_TYPE_DATA; /* The protocol type bytes*/ /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/ /*------------------------------------------------------------------------ Sanity check params ------------------------------------------------------------------------*/ if ( NULL == pBtampCtx) { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "Invalid BAP handle value in %s", __FUNCTION__); return VOS_STATUS_E_FAULT; } // Here, I have to make the assumption that this is an // 802.3 header followed by an LLC/SNAP packet. vos_mem_set( &w8023Header, sizeof(w8023Header), 0 ); vosStatus = vos_pkt_pop_head( vosDataBuff, &w8023Header, sizeof(w8023Header)); if ( VOS_STATUS_SUCCESS != vosStatus ) { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "WLAN BAP: Failed to pop 802.3 header from packet %d", vosStatus); return vosStatus; } // Here, is that LLC/SNAP header. // With the BT SIG OUI that I am being handed. vos_mem_set( aucLLCHeader, WLANBAP_LLC_HEADER_LEN, 0 ); vosStatus = vos_pkt_pop_head( vosDataBuff, aucLLCHeader, WLANBAP_LLC_HEADER_LEN); if ( VOS_STATUS_SUCCESS != vosStatus ) { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "WLAN BAP: Failed to pop LLC/SNAP header from packet %d", vosStatus); return vosStatus; } #ifdef BAP_DEBUG // JEZ081003: Remove this after debugging // Should I double check that I am getting the BT SIG OUI ? if ( !(vos_mem_compare( aucLLCHeader, WLANBAP_LLC_HEADER, sizeof(WLANBAP_LLC_HEADER) - WLANBAP_LLC_OUI_SIZE) /* Don't check the last three bytes here */ && vos_mem_compare( &aucLLCHeader[WLANBAP_LLC_OUI_OFFSET], (v_VOID_t*)WLANBAP_BT_AMP_OUI, WLANBAP_LLC_OUI_SIZE))) /* check them here */ { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "Invalid LLC header for BT-AMP packet in %s", __FUNCTION__); return VOS_STATUS_E_FAULT; } #endif //BAP_DEBUG /* Now adjust the protocol type bytes*/ protoType = vos_cpu_to_be16( protoType); // check if this is a data frame or other, internal to BAP, type... // we are only handling data frames in here... // The others (Security and AR) are handled by TLs BAP client API. // (Verify with TL) if ( !(vos_mem_compare( &aucLLCHeader[WLANBAP_LLC_PROTO_TYPE_OFFSET], &protoType, //WLANBAP_BT_AMP_TYPE_DATA WLANBAP_LLC_PROTO_TYPE_SIZE))) { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "Invalid (non-data) frame type in %s", __FUNCTION__); return VOS_STATUS_E_FAULT; } #ifdef BAP_DEBUG // JEZ081003: Remove this after debugging /*------------------------------------------------------------------------ Sanity check the MAC address in the physical link context against the value in the incoming Rx Frame. ------------------------------------------------------------------------*/ if ( !(vos_mem_compare( w8023Header.vDA, pBtampCtx->self_mac_addr, VOS_MAC_ADDR_SIZE) && vos_mem_compare( w8023Header.vSA, pBtampCtx->peer_mac_addr, VOS_MAC_ADDR_SIZE))) { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "MAC address mismatch in %s", __FUNCTION__); return VOS_STATUS_E_FAULT; } #endif //BAP_DEBUG /* No lookup is needed. Because TL has already told WLANBAP_STARxCB * the StaId. And I told WLANBAP_STARxCBType the corresponding BSL context * Which he used to lookup the phy_link_handle value. */ // Start filling in the HCI header hciACLHeader.phyLinkHandle = phy_link_handle; // Continue filling in the HCI header //JEZ100913: On Rx the Logical Link is ALWAYS 0. See Vol 2, Sec E, 5.4.2 of spec. hciACLHeader.logLinkHandle = 0; hciACLHeader.PBFlag = WLANBAP_HCI_PKT_AMP; hciACLHeader.BCFlag = 0; /* Now the length field is big-endian?! */ hciDataLength = vos_be16_to_cpu(w8023Header.usLenType); /* Max length WLANBAP_MAX_80211_PAL_PDU_SIZE (1492) */ hciDataLength -= WLANBAP_LLC_HEADER_LEN; /* The HCI packet data length is Little-endian */ hciACLHeader.dataLength = vos_cpu_to_le16(hciDataLength); /* Return the AC here. * (I can't because there is no way to figure out what it is.) */ *pucAC = 0; /* Push on the HCI header */ vos_pkt_push_head(vosDataBuff, &hciACLHeader, WLANBAP_HCI_ACL_HEADER_LEN); return VOS_STATUS_SUCCESS; } /* WLANBAP_XlateRxDataPkt */
tANI_BOOLEAN palEqualMemory( tHddHandle hHdd, void *pMemory1, void *pMemory2, tANI_U32 numBytes ) { return( vos_mem_compare( pMemory1, pMemory2, numBytes ) ); }
static eHalStatus hdd_IndicateScanResult(hdd_scan_info_t *scanInfo, tCsrScanResultInfo *scan_result) { hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(scanInfo->dev) ; tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter); tSirBssDescription *descriptor = &scan_result->BssDescriptor; struct iw_event event; char *current_event = scanInfo->start; char *end = scanInfo->end; char *last_event; char *current_pad; v_U16_t ie_length = 0; v_U16_t capabilityInfo; char *modestr; int error; char custom[MAX_CUSTOM_LEN]; char *p; hddLog( LOG1, "hdd_IndicateScanResult %02x:%02x:%02x:%02x:%02x:%02x", descriptor->bssId[0], descriptor->bssId[1], descriptor->bssId[2], descriptor->bssId[3], descriptor->bssId[4], descriptor->bssId[5]); error = 0; last_event = current_event; vos_mem_zero(&event, sizeof (event)); event.cmd = SIOCGIWAP; event.u.ap_addr.sa_family = ARPHRD_ETHER; vos_mem_copy (event.u.ap_addr.sa_data, descriptor->bssId, sizeof (descriptor->bssId)); current_event = iwe_stream_add_event(scanInfo->info,current_event, end, &event, IW_EV_ADDR_LEN); if (last_event == current_event) { hddLog( LOGW, "hdd_IndicateScanResult: no space for SIOCGIWAP "); return -E2BIG; } last_event = current_event; vos_mem_zero(&event, sizeof (struct iw_event)); event.cmd = SIOCGIWNAME; switch (descriptor->nwType) { case eSIR_11A_NW_TYPE: modestr = "a"; break; case eSIR_11B_NW_TYPE: modestr = "b"; break; case eSIR_11G_NW_TYPE: modestr = "g"; break; case eSIR_11N_NW_TYPE: modestr = "n"; break; default: hddLog( LOGW, "%s: Unknown network type [%d]", __func__, descriptor->nwType); modestr = "?"; break; } snprintf(event.u.name, IFNAMSIZ, "IEEE 802.11%s", modestr); current_event = iwe_stream_add_event(scanInfo->info,current_event, end, &event, IW_EV_CHAR_LEN); if (last_event == current_event) { hddLog( LOGW, "hdd_IndicateScanResult: no space for SIOCGIWNAME"); return -E2BIG; } last_event = current_event; vos_mem_zero( &event, sizeof (struct iw_event)); event.cmd = SIOCGIWFREQ; event.u.freq.m = descriptor->channelId; event.u.freq.e = 0; event.u.freq.i = 0; current_event = iwe_stream_add_event(scanInfo->info,current_event, end, &event, IW_EV_FREQ_LEN); if (last_event == current_event) { return -E2BIG; } last_event = current_event; vos_mem_zero( &event, sizeof (struct iw_event)); event.cmd = SIOCGIWMODE; capabilityInfo = descriptor->capabilityInfo; if (SIR_MAC_GET_ESS(capabilityInfo)) { event.u.mode = IW_MODE_INFRA; } else if (SIR_MAC_GET_IBSS(capabilityInfo)) { event.u.mode = IW_MODE_ADHOC; } else { event.u.mode = IW_MODE_AUTO; } current_event = iwe_stream_add_event(scanInfo->info,current_event, end, &event, IW_EV_UINT_LEN); if (last_event == current_event) { hddLog( LOGW, "hdd_IndicateScanResult: no space for SIOCGIWMODE"); return -E2BIG; } ie_length = GET_IE_LEN_IN_BSS( descriptor->length ); if (ie_length > 0) { static tDot11fBeaconIEs dot11BeaconIEs; tDot11fIESSID *pDot11SSID; tDot11fIESuppRates *pDot11SuppRates; tDot11fIEExtSuppRates *pDot11ExtSuppRates; tDot11fIEHTCaps *pDot11IEHTCaps; int numBasicRates = 0; int maxNumRates = 0; pDot11IEHTCaps = NULL; dot11fUnpackBeaconIEs ((tpAniSirGlobal) hHal, (tANI_U8 *) descriptor->ieFields, ie_length, &dot11BeaconIEs); pDot11SSID = &dot11BeaconIEs.SSID; if (pDot11SSID->present ) { last_event = current_event; vos_mem_zero (&event, sizeof (struct iw_event)); event.cmd = SIOCGIWESSID; event.u.data.flags = 1; event.u.data.length = scan_result->ssId.length; current_event = iwe_stream_add_point (scanInfo->info,current_event, end, &event, (char *)scan_result->ssId.ssId); if(last_event == current_event) { hddLog( LOGW, "hdd_IndicateScanResult: no space for SIOCGIWESSID"); return -E2BIG; } } if( hdd_GetWPARSNIEs( ( tANI_U8 *) descriptor->ieFields, ie_length, &last_event, ¤t_event, scanInfo ) < 0 ) { hddLog( LOGW, "hdd_IndicateScanResult: no space for SIOCGIWESSID"); return -E2BIG; } last_event = current_event; current_pad = current_event + IW_EV_LCP_LEN; vos_mem_zero( &event, sizeof (struct iw_event)); event.cmd = SIOCGIWRATE; pDot11SuppRates = &dot11BeaconIEs.SuppRates; if (pDot11SuppRates->present ) { int i; numBasicRates = pDot11SuppRates->num_rates; for (i=0; i<pDot11SuppRates->num_rates; i++) { if (0 != (pDot11SuppRates->rates[i] & 0x7F)) { event.u.bitrate.value = hdd_TranslateABGRateToMbpsRate ( &pDot11SuppRates->rates[i]); current_pad = iwe_stream_add_value (scanInfo->info,current_event, current_pad, end, &event, IW_EV_PARAM_LEN); } } } pDot11ExtSuppRates = &dot11BeaconIEs.ExtSuppRates; if (pDot11ExtSuppRates->present ) { int i,no_of_rates; maxNumRates = numBasicRates + pDot11ExtSuppRates->num_rates; maxNumRates = VOS_MIN(maxNumRates , IW_MAX_BITRATES); if((maxNumRates - numBasicRates) > MAX_RATES) { no_of_rates = MAX_RATES; hddLog( LOGW, "Accessing array out of bound that array is pDot11ExtSuppRates->rates "); } else { no_of_rates = maxNumRates - numBasicRates; } for ( i=0; i< no_of_rates ; i++ ) { if (0 != (pDot11ExtSuppRates->rates[i] & 0x7F)) { event.u.bitrate.value = hdd_TranslateABGRateToMbpsRate ( &pDot11ExtSuppRates->rates[i]); current_pad = iwe_stream_add_value (scanInfo->info,current_event, current_pad, end, &event, IW_EV_PARAM_LEN); } } } if ((current_pad - current_event) >= IW_EV_LCP_LEN) { current_event = current_pad; } else { if (last_event == current_event) { hddLog( LOGW, "hdd_IndicateScanResult: no space for SIOCGIWRATE"); return -E2BIG; } } last_event = current_event; vos_mem_zero (&event, sizeof (struct iw_event)); event.cmd = SIOCGIWENCODE; if (SIR_MAC_GET_PRIVACY(capabilityInfo)) { event.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY; } else { event.u.data.flags = IW_ENCODE_DISABLED; } event.u.data.length = 0; current_event = iwe_stream_add_point(scanInfo->info,current_event, end, &event, (char *)pDot11SSID->ssid); if(last_event == current_event) { return -E2BIG; } } last_event = current_event; vos_mem_zero( &event, sizeof (struct iw_event)); event.cmd = IWEVQUAL; event.u.qual.qual = descriptor->rssi; event.u.qual.noise = descriptor->sinr; if (( eConnectionState_Associated == pAdapter->sessionCtx.station.conn_info.connState ) && ( VOS_TRUE == vos_mem_compare(descriptor->bssId, pAdapter->sessionCtx.station.conn_info.bssId, WNI_CFG_BSSID_LEN))) { event.u.qual.level = pAdapter->rssi; } else { event.u.qual.level = VOS_MIN ((descriptor->rssi + descriptor->sinr), 0); } event.u.qual.updated = IW_QUAL_ALL_UPDATED; current_event = iwe_stream_add_event(scanInfo->info,current_event, end, &event, IW_EV_QUAL_LEN); if(last_event == current_event) { hddLog( LOGW, "hdd_IndicateScanResult: no space for IWEVQUAL"); return -E2BIG; } event.cmd = IWEVCUSTOM; p = custom; p += scnprintf(p, MAX_CUSTOM_LEN, " Age: %lu", vos_timer_get_system_ticks() - descriptor->nReceivedTime); event.u.data.length = p - custom; current_event = iwe_stream_add_point (scanInfo->info,current_event, end, &event, custom); if(last_event == current_event) { hddLog( LOGW, "hdd_IndicateScanResult: no space for IWEVCUSTOM (age)"); return -E2BIG; } scanInfo->start = current_event; return 0; }
static eHalStatus hdd_IndicateScanResult(hdd_scan_info_t *scanInfo, tCsrScanResultInfo *scan_result) { hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(scanInfo->dev) ; tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(pAdapter); tSirBssDescription *descriptor = &scan_result->BssDescriptor; struct iw_event event; char *current_event = scanInfo->start; char *end = scanInfo->end; char *last_event; char *current_pad; v_U16_t ie_length = 0; v_U16_t capabilityInfo; char *modestr; int error; char custom[MAX_CUSTOM_LEN]; char *p; hddLog( LOG1, "hdd_IndicateScanResult " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(descriptor->bssId)); error = 0; last_event = current_event; vos_mem_zero(&event, sizeof (event)); /* BSSID */ event.cmd = SIOCGIWAP; event.u.ap_addr.sa_family = ARPHRD_ETHER; vos_mem_copy (event.u.ap_addr.sa_data, descriptor->bssId, sizeof (descriptor->bssId)); current_event = iwe_stream_add_event(scanInfo->info,current_event, end, &event, IW_EV_ADDR_LEN); if (last_event == current_event) { /* no space to add event */ /* Error code may be E2BIG */ hddLog( LOGE, "hdd_IndicateScanResult: no space for SIOCGIWAP "); return -E2BIG; } last_event = current_event; vos_mem_zero(&event, sizeof (struct iw_event)); /* Protocol Name */ event.cmd = SIOCGIWNAME; switch (descriptor->nwType) { case eSIR_11A_NW_TYPE: modestr = "a"; break; case eSIR_11B_NW_TYPE: modestr = "b"; break; case eSIR_11G_NW_TYPE: modestr = "g"; break; case eSIR_11N_NW_TYPE: modestr = "n"; break; default: hddLog( LOGW, "%s: Unknown network type [%d]", __func__, descriptor->nwType); modestr = "?"; break; } snprintf(event.u.name, IFNAMSIZ, "IEEE 802.11%s", modestr); current_event = iwe_stream_add_event(scanInfo->info,current_event, end, &event, IW_EV_CHAR_LEN); if (last_event == current_event) { /* no space to add event */ hddLog( LOGE, "hdd_IndicateScanResult: no space for SIOCGIWNAME"); /* Error code, may be E2BIG */ return -E2BIG; } last_event = current_event; vos_mem_zero( &event, sizeof (struct iw_event)); /*Freq*/ event.cmd = SIOCGIWFREQ; event.u.freq.m = descriptor->channelId; event.u.freq.e = 0; event.u.freq.i = 0; current_event = iwe_stream_add_event(scanInfo->info,current_event, end, &event, IW_EV_FREQ_LEN); if (last_event == current_event) { /* no space to add event */ hddLog( LOGE, "hdd_IndicateScanResult: no space for SIOCGIWFREQ"); return -E2BIG; } last_event = current_event; vos_mem_zero( &event, sizeof (struct iw_event)); /* BSS Mode */ event.cmd = SIOCGIWMODE; capabilityInfo = descriptor->capabilityInfo; if (SIR_MAC_GET_ESS(capabilityInfo)) { event.u.mode = IW_MODE_MASTER; } else if (SIR_MAC_GET_IBSS(capabilityInfo)) { event.u.mode = IW_MODE_ADHOC; } else { /* neither ESS or IBSS */ event.u.mode = IW_MODE_AUTO; } current_event = iwe_stream_add_event(scanInfo->info,current_event, end, &event, IW_EV_UINT_LEN); if (last_event == current_event) { /* no space to add event */ hddLog( LOGE, "hdd_IndicateScanResult: no space for SIOCGIWMODE"); return -E2BIG; } /* To extract SSID */ ie_length = GET_IE_LEN_IN_BSS( descriptor->length ); if (ie_length > 0) { /* dot11BeaconIEs is a large struct, so we make it static to avoid stack overflow. This API is only invoked via ioctl, so it is serialized by the kernel rtnl_lock and hence does not need to be reentrant */ static tDot11fBeaconIEs dot11BeaconIEs; tDot11fIESSID *pDot11SSID; tDot11fIESuppRates *pDot11SuppRates; tDot11fIEExtSuppRates *pDot11ExtSuppRates; tDot11fIEHTCaps *pDot11IEHTCaps; int numBasicRates = 0; int maxNumRates = 0; pDot11IEHTCaps = NULL; dot11fUnpackBeaconIEs ((tpAniSirGlobal) hHal, (tANI_U8 *) descriptor->ieFields, ie_length, &dot11BeaconIEs); pDot11SSID = &dot11BeaconIEs.SSID; if (pDot11SSID->present ) { last_event = current_event; vos_mem_zero (&event, sizeof (struct iw_event)); event.cmd = SIOCGIWESSID; event.u.data.flags = 1; event.u.data.length = scan_result->ssId.length; current_event = iwe_stream_add_point (scanInfo->info,current_event, end, &event, (char *)scan_result->ssId.ssId); if(last_event == current_event) { /* no space to add event */ hddLog( LOGE, "hdd_IndicateScanResult: no space for SIOCGIWESSID"); return -E2BIG; } } if( hdd_GetWPARSNIEs( ( tANI_U8 *) descriptor->ieFields, ie_length, &last_event, ¤t_event, scanInfo ) < 0 ) { hddLog( LOGE, "hdd_IndicateScanResult: no space for SIOCGIWESSID"); return -E2BIG; } last_event = current_event; current_pad = current_event + IW_EV_LCP_LEN; vos_mem_zero( &event, sizeof (struct iw_event)); /*Rates*/ event.cmd = SIOCGIWRATE; pDot11SuppRates = &dot11BeaconIEs.SuppRates; if (pDot11SuppRates->present ) { int i; numBasicRates = pDot11SuppRates->num_rates; for (i=0; i<pDot11SuppRates->num_rates; i++) { if (0 != (pDot11SuppRates->rates[i] & 0x7F)) { event.u.bitrate.value = hdd_TranslateABGRateToMbpsRate ( &pDot11SuppRates->rates[i]); current_pad = iwe_stream_add_value (scanInfo->info,current_event, current_pad, end, &event, IW_EV_PARAM_LEN); } } } pDot11ExtSuppRates = &dot11BeaconIEs.ExtSuppRates; if (pDot11ExtSuppRates->present ) { int i,no_of_rates; maxNumRates = numBasicRates + pDot11ExtSuppRates->num_rates; /* Check to make sure the total number of rates doesn't exceed IW_MAX_BITRATES */ maxNumRates = VOS_MIN(maxNumRates , IW_MAX_BITRATES); if((maxNumRates - numBasicRates) > MAX_RATES) { no_of_rates = MAX_RATES; hddLog( LOGW, "Accessing array out of bound that array is pDot11ExtSuppRates->rates "); } else { no_of_rates = maxNumRates - numBasicRates; } for ( i=0; i< no_of_rates ; i++ ) { if (0 != (pDot11ExtSuppRates->rates[i] & 0x7F)) { event.u.bitrate.value = hdd_TranslateABGRateToMbpsRate ( &pDot11ExtSuppRates->rates[i]); current_pad = iwe_stream_add_value (scanInfo->info,current_event, current_pad, end, &event, IW_EV_PARAM_LEN); } } } if ((current_pad - current_event) >= IW_EV_LCP_LEN) { current_event = current_pad; } else { if (last_event == current_event) { /* no space to add event */ hddLog( LOGE, "hdd_IndicateScanResult: no space for SIOCGIWRATE"); return -E2BIG; } } last_event = current_event; vos_mem_zero (&event, sizeof (struct iw_event)); event.cmd = SIOCGIWENCODE; if (SIR_MAC_GET_PRIVACY(capabilityInfo)) { event.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY; } else { event.u.data.flags = IW_ENCODE_DISABLED; } event.u.data.length = 0; current_event = iwe_stream_add_point(scanInfo->info,current_event, end, &event, (char *)pDot11SSID->ssid); if(last_event == current_event) { /* no space to add event Error code, may be E2BIG */ hddLog( LOGE, "hdd_IndicateScanResult: no space for SIOCGIWENCODE"); return -E2BIG; } } last_event = current_event; vos_mem_zero( &event, sizeof (struct iw_event)); /*RSSI*/ event.cmd = IWEVQUAL; event.u.qual.qual = descriptor->rssi; event.u.qual.noise = descriptor->sinr; /*To keep the rssi icon of the connected AP in the scan window *and the rssi icon of the wireless networks in sync */ if (( eConnectionState_Associated == pAdapter->sessionCtx.station.conn_info.connState ) && ( VOS_TRUE == vos_mem_compare(descriptor->bssId, pAdapter->sessionCtx.station.conn_info.bssId, VOS_MAC_ADDR_SIZE))) { event.u.qual.level = pAdapter->rssi; } else { event.u.qual.level = VOS_MIN ((descriptor->rssi + descriptor->sinr), 0); } event.u.qual.updated = IW_QUAL_ALL_UPDATED; current_event = iwe_stream_add_event(scanInfo->info,current_event, end, &event, IW_EV_QUAL_LEN); if(last_event == current_event) { /* no space to add event */ hddLog( LOGE, "hdd_IndicateScanResult: no space for IWEVQUAL"); return -E2BIG; } /* AGE */ event.cmd = IWEVCUSTOM; p = custom; p += scnprintf(p, MAX_CUSTOM_LEN, " Age: %lu", vos_timer_get_system_ticks() - descriptor->nReceivedTime); event.u.data.length = p - custom; current_event = iwe_stream_add_point (scanInfo->info,current_event, end, &event, custom); if(last_event == current_event) { /* no space to add event */ hddLog( LOGE, "hdd_IndicateScanResult: no space for IWEVCUSTOM (age)"); return -E2BIG; } scanInfo->start = current_event; return 0; }
/*=========================================================================== FUNCTION WLANBAP_RxProcLsPkt DESCRIPTION This API will be called when Link Supervision frames are received at BAP PARAMETERS btampHandle: The BT-AMP PAL handle returned in WLANBAP_GetNewHndl. pucAC: Pointer to return the access category vosDataBuff: The data buffer containing the 802.3 frame to be translated to BT HCI Data Packet RETURN VALUE The result code associated with performing the operation VOS_STATUS_E_INVAL: Input parameters are invalid VOS_STATUS_E_FAULT: BAP handle is NULL VOS_STATUS_SUCCESS: Everything is good :) SIDE EFFECTS ============================================================================*/ VOS_STATUS WLANBAP_RxProcLsPkt ( ptBtampHandle btampHandle, v_U8_t phy_link_handle, /* Used by BAP to indentify the WLAN assoc. (StaId) */ v_U16_t RxProtoType, /* Protocol Type from the frame received */ vos_pkt_t *vosRxLsBuff ) { VOS_STATUS vosStatus; ptBtampContext pBtampCtx = (ptBtampContext) btampHandle; WLANBAP_8023HeaderType w8023Header; v_SIZE_t HeaderLen = sizeof(w8023Header); /*------------------------------------------------------------------------ Sanity check params ------------------------------------------------------------------------*/ if ( NULL == pBtampCtx) { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "Invalid BAP handle value in %s", __FUNCTION__); return VOS_STATUS_E_FAULT; } VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "In %s Received RxProtoType=%x", __FUNCTION__,RxProtoType); vos_pkt_extract_data(vosRxLsBuff,0,(v_VOID_t*)&w8023Header,&HeaderLen); if ( !(vos_mem_compare( w8023Header.vDA, pBtampCtx->self_mac_addr, VOS_MAC_ADDR_SIZE) && vos_mem_compare( w8023Header.vSA, pBtampCtx->peer_mac_addr, VOS_MAC_ADDR_SIZE))) { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "MAC address mismatch in %s", __FUNCTION__); return VOS_STATUS_E_FAULT; } /*Free the vos packet*/ vosStatus = vos_pkt_return_packet( vosRxLsBuff ); if ( VOS_STATUS_SUCCESS != vosStatus) { VOS_TRACE( VOS_MODULE_ID_BAP, VOS_TRACE_LEVEL_ERROR, "Failed to free VOS packet in %s", __FUNCTION__); return VOS_STATUS_E_FAULT; } /* Reset Link Supervision timer */ if (RxProtoType == WLANTL_BT_AMP_TYPE_LS_REP) { pBtampCtx->lsReqPktPending = FALSE; pBtampCtx->retries = 0; if (pBtampCtx->bapLinkSupervisionTimerInterval) { /* Restart the LS timer */ WLANBAP_StopLinkSupervisionTimer(pBtampCtx); vosStatus = WLANBAP_StartLinkSupervisionTimer (pBtampCtx, pBtampCtx->bapLinkSupervisionTimerInterval * WLANBAP_BREDR_BASEBAND_SLOT_TIME); } } else if(RxProtoType == WLANTL_BT_AMP_TYPE_LS_REQ) { if (pBtampCtx->bapLinkSupervisionTimerInterval) { /* Restart the LS timer */ WLANBAP_StopLinkSupervisionTimer(pBtampCtx); vosStatus = WLANBAP_StartLinkSupervisionTimer (pBtampCtx, pBtampCtx->bapLinkSupervisionTimerInterval * WLANBAP_BREDR_BASEBAND_SLOT_TIME); } pBtampCtx->pPacket = pBtampCtx->lsRepPacket; // Handle LS rep frame vosStatus = WLANBAP_TxLinkSupervision( btampHandle, phy_link_handle, pBtampCtx->pPacket, WLANTL_BT_AMP_TYPE_LS_REP); } return vosStatus; }