void sme_printBssidList(TI_HANDLE hSme) { TSme *sme = (TSme *) hSme; TI_UINT32 length; TI_UINT8 *blist; TMacAddr temp_bssid = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; length = scanResultTable_CalculateBssidListSize(sme->hScanResultTable, TI_FALSE); blist = os_memoryAlloc(NULL, length); if (!blist) { WLAN_OS_REPORT(("ERROR. sme_printBssidList(): Cannot allocate memory!! length = %d\n", length)); return; } scanResultTable_GetBssidList(sme->hScanResultTable, (POS_802_11_BSSID_LIST_EX) blist, &length, TI_FALSE); PrintBssidList((OS_802_11_BSSID_LIST_EX *) blist, 0, temp_bssid); os_memoryFree(NULL, blist, length); }
/** * \fn scanCncnApp_GetParam * \brief Parses and executes a get param command * * Parses and executes a get param command (get BSSID list) * * \param hScanCncn - handle to the scan concentrator object * \param pParam - the param to get * \return operation status (OK / NOK / PARAM_NOT_SUPPORTED) * \sa scanCncnApp_SetParam */ TI_STATUS scanCncnApp_GetParam (TI_HANDLE hScanCncn, paramInfo_t *pParam) { TScanCncn *pScanCncn = (TScanCncn*)hScanCncn; TRACE1(pScanCncn->hReport, REPORT_SEVERITY_INFORMATION , "scanCncnApp_GetParam: received request of type %d\n", pParam->paramType); switch (pParam->paramType) { case SCAN_CNCN_BSSID_LIST_SIZE_PARAM: /* retrieves the size to allocate for the app scan result taBle BBSID list (see next code) */ pParam->paramLength = sizeof(TI_UINT32); pParam->content.uBssidListSize = scanResultTable_CalculateBssidListSize (pScanCncn->hScanResultTable, TI_FALSE); break; case SCAN_CNCN_BSSID_LIST_PARAM: /* retrieve the app scan result table */ return scanResultTable_GetBssidList (pScanCncn->hScanResultTable, pParam->content.pBssidList, &pParam->paramLength, TI_FALSE); break; default: TRACE1(pScanCncn->hReport, REPORT_SEVERITY_ERROR , "scanCncnApp_GetParam: unrecognized param type :%d\n", pParam->paramType); return PARAM_NOT_SUPPORTED; } return TI_OK; }
/** * \fn scanCncnApp_GetParam * \brief Parses and executes a get param command * * Parses and executes a get param command (get BSSID list) * * \param hScanCncn - handle to the scan concentrator object * \param pParam - the param to get * \return operation status (OK / NOK / PARAM_NOT_SUPPORTED) * \sa scanCncnApp_SetParam */ TI_STATUS scanCncnApp_GetParam (TI_HANDLE hScanCncn, paramInfo_t *pParam) { TScanCncn *pScanCncn = (TScanCncn*)hScanCncn; TRACE1(pScanCncn->hReport, REPORT_SEVERITY_INFORMATION , "scanCncnApp_GetParam: received request of type %d\n", pParam->paramType); switch (pParam->paramType) { case SCAN_CNCN_NUM_BSSID_IN_LIST_PARAM: /* retrieve the number of BSSID's in the scan result table*/ pParam->paramLength = sizeof(TI_UINT32); pParam->content.uNumBssidInList = scanResultTable_GetNumOfBSSIDInTheList (pScanCncn->hScanResultTable); break; case SCAN_CNCN_BSSID_LIST_SIZE_PARAM: /* retrieves the size to allocate for the app scan result taBle BBSID list (see next code) */ pParam->paramLength = sizeof(TI_UINT32); pParam->content.uBssidListSize = scanResultTable_CalculateBssidListSize (pScanCncn->hScanResultTable, TI_TRUE); break; case SCAN_CNCN_BSSID_LIST_PARAM: /* retrieve the app scan result table */ return scanResultTable_GetBssidList (pScanCncn->hScanResultTable, pParam->content.pBssidList, &pParam->paramLength, TI_TRUE); case SCAN_CNCN_BSSID_RATE_LIST_PARAM: /* retrieve supported rates list equivalent to the supported rates list in the scan result table, but is extended to include 11n rates as well*/ return scanResultTable_GetBssidSupportedRatesList (pScanCncn->hScanResultTable, pParam->content.pRateList, &pParam->paramLength); default: TRACE1(pScanCncn->hReport, REPORT_SEVERITY_ERROR , "scanCncnApp_GetParam: unrecognized param type :%d\n", pParam->paramType); return PARAM_NOT_SUPPORTED; } return TI_OK; }
/** * \fn scanResultTable_GetBssidList * \brief Retrieves the site table content * * Retrieves the site table content * * \param hScanResultTable - handle to the scan result table object * \param pBssidList - pointer to a buffer large enough to hols the BSSID list * \param plength - length of the supplied buffer, will be overwritten with the actual list length * \param bAllVarIes - whether to include all variable size IEs * \return None * \sa scanResultTable_CalculateBssidListSize */ TI_STATUS scanResultTable_GetBssidList (TI_HANDLE hScanResultTable, OS_802_11_BSSID_LIST_EX *pBssidList, TI_UINT32 *pLength, TI_BOOL bAllVarIes) { TScanResultTable *pScanResultTable = (TScanResultTable*)hScanResultTable; TI_UINT32 uLength, uSiteIndex, rsnIndex, rsnIeLength, len, firstOFDMloc = 0; TSiteEntry *pSiteEntry; OS_802_11_BSSID_EX *pBssid; OS_802_11_FIXED_IEs *pFixedIes; OS_802_11_VARIABLE_IEs *pVarIes; TI_UINT8 *pData; /* verify the supplied length is enough */ uLength = scanResultTable_CalculateBssidListSize (hScanResultTable, bAllVarIes); if (uLength > *pLength) { *pLength = uLength; return TI_NOK; } /* Nullify number of items in the BSSID list */ pBssidList->NumberOfItems = 0; /* set length to list header size (only list count) */ uLength = sizeof(OS_802_11_BSSID_LIST_EX) - sizeof(OS_802_11_BSSID_EX); /* set data pointer to first item in list */ pData = (TI_UINT8*)&(pBssidList->Bssid[0]); for (uSiteIndex = 0; uSiteIndex < pScanResultTable->uCurrentSiteNumber; uSiteIndex++) { /* set BSSID entry pointer to current location in buffer */ pBssid = (OS_802_11_BSSID_EX*)pData; /* set pointer to site entry */ pSiteEntry = &(pScanResultTable->pTable[ uSiteIndex ]); /* start copy stuff: */ /* MacAddress */ MAC_COPY (pBssid->MacAddress, pSiteEntry->bssid); /* Capabilities */ pBssid->Capabilities = pSiteEntry->capabilities; /* SSID */ os_memoryZero (pScanResultTable->hOS, &(pBssid->Ssid.Ssid), MAX_SSID_LEN); if (pSiteEntry->ssid.len > MAX_SSID_LEN) { pSiteEntry->ssid.len = MAX_SSID_LEN; } os_memoryCopy (pScanResultTable->hOS, (void *)pBssid->Ssid.Ssid, (void *)pSiteEntry->ssid.str, pSiteEntry->ssid.len); pBssid->Ssid.SsidLength = pSiteEntry->ssid.len; /* privacy */ pBssid->Privacy = pSiteEntry->privacy; /* RSSI */ pBssid->Rssi = pSiteEntry->rssi; pBssid->Configuration.Length = sizeof(OS_802_11_CONFIGURATION); pBssid->Configuration.BeaconPeriod = pSiteEntry->beaconInterval; pBssid->Configuration.ATIMWindow = pSiteEntry->atimWindow; pBssid->Configuration.Union.channel = Chan2Freq(pSiteEntry->channel); if (pSiteEntry->bssType == BSS_INDEPENDENT) pBssid->InfrastructureMode = os802_11IBSS; else pBssid->InfrastructureMode = os802_11Infrastructure; /* Supported Rates */ os_memoryZero (pScanResultTable->hOS, (void *)pBssid->SupportedRates, sizeof(OS_802_11_RATES_EX)); rate_DrvBitmapToNetStr (pSiteEntry->rateMask.supportedRateMask, pSiteEntry->rateMask.basicRateMask, (TI_UINT8*)pBssid->SupportedRates, &len, &firstOFDMloc); /* set network type acording to band and rates */ if (RADIO_BAND_2_4_GHZ == pSiteEntry->eBand) { if (firstOFDMloc == len) { pBssid->NetworkTypeInUse = os802_11DS; } else { pBssid->NetworkTypeInUse = os802_11OFDM24; } } else { pBssid->NetworkTypeInUse = os802_11OFDM5; } /* start copy IE's: first nullify length */ pBssid->IELength = 0; /* copy fixed IEs from site entry */ pFixedIes = (OS_802_11_FIXED_IEs*)&(pBssid->IEs[ pBssid->IELength ]); os_memoryCopy (pScanResultTable->hOS, (void*)pFixedIes->TimeStamp, &(pSiteEntry->tsfTimeStamp[ 0 ]), TIME_STAMP_LEN); pFixedIes->BeaconInterval = pSiteEntry->beaconInterval; pFixedIes->Capabilities = pSiteEntry->capabilities; pBssid->IELength += sizeof(OS_802_11_FIXED_IEs); /* set pointer for variable length IE's */ pVarIes = (OS_802_11_VARIABLE_IEs*)&(pBssid->IEs[ pBssid->IELength ]); if (!bAllVarIes) { /* copy only some variable IEs */ /* copy SSID */ pVarIes->ElementID = SSID_IE_ID; pVarIes->Length = pSiteEntry->ssid.len; os_memoryCopy (pScanResultTable->hOS, (void *)pVarIes->data, (void *)pSiteEntry->ssid.str, pSiteEntry->ssid.len); pBssid->IELength += (pVarIes->Length + 2); /* copy RATES */ pVarIes = (OS_802_11_VARIABLE_IEs*)&(pBssid->IEs[ pBssid->IELength ]); pVarIes->ElementID = SUPPORTED_RATES_IE_ID; rate_DrvBitmapToNetStr (pSiteEntry->rateMask.supportedRateMask, pSiteEntry->rateMask.basicRateMask, (TI_UINT8 *)pVarIes->data, &len, &firstOFDMloc); pVarIes->Length = len; pBssid->IELength += (pVarIes->Length + 2); /* copy DS */ pVarIes = (OS_802_11_VARIABLE_IEs*)&(pBssid->IEs[ pBssid->IELength ]); pVarIes->ElementID = DS_PARAMETER_SET_IE_ID; pVarIes->Length = DOT11_DS_PARAMS_ELE_LEN; os_memoryCopy (pScanResultTable->hOS, (void *)pVarIes->data, &(pSiteEntry->channel), DOT11_DS_PARAMS_ELE_LEN); pBssid->IELength += (pVarIes->Length + 2); /* copy RSN information elements */ if (0 < pSiteEntry->rsnIeLen) { rsnIeLength = 0; for (rsnIndex=0; rsnIndex < MAX_RSN_IE && pSiteEntry->pRsnIe[ rsnIndex ].hdr[1] > 0; rsnIndex++) { pVarIes = (OS_802_11_VARIABLE_IEs*)&(pBssid->IEs[ pBssid->IELength + rsnIeLength ]); pVarIes->ElementID = pSiteEntry->pRsnIe[ rsnIndex ].hdr[0]; pVarIes->Length = pSiteEntry->pRsnIe[ rsnIndex ].hdr[1]; os_memoryCopy (pScanResultTable->hOS, (void *)pVarIes->data, (void *)pSiteEntry->pRsnIe[ rsnIndex ].rsnIeData, pSiteEntry->pRsnIe[ rsnIndex ].hdr[1]); rsnIeLength += pSiteEntry->pRsnIe[ rsnIndex ].hdr[1] + 2; } pBssid->IELength += pSiteEntry->rsnIeLen; } /* QOS_WME/XCC */ if (TI_TRUE == pSiteEntry->WMESupported) { /* oui */ TI_UINT8 ouiWME[3] = {0x50, 0xf2, 0x01}; dot11_WME_PARAM_t *pWMEParams; /* fill in the general element parameters */ pVarIes = (OS_802_11_VARIABLE_IEs*)&(pBssid->IEs[ pBssid->IELength ]); pVarIes->ElementID = DOT11_WME_ELE_ID; pVarIes->Length = DOT11_WME_PARAM_ELE_LEN; /* fill in the specific element parameters */ pWMEParams = (dot11_WME_PARAM_t*)pVarIes; os_memoryCopy (pScanResultTable->hOS, (void *)pWMEParams->OUI, ouiWME, 3); pWMEParams->OUIType = dot11_WME_OUI_TYPE; pWMEParams->OUISubType = dot11_WME_OUI_SUB_TYPE_PARAMS_IE; pWMEParams->version = dot11_WME_VERSION; pWMEParams->ACInfoField = dot11_WME_ACINFO_MASK & pSiteEntry->lastWMEParameterCnt; /* fill in the data */ os_memoryCopy (pScanResultTable->hOS, &(pWMEParams->WME_ACParameteres), &(pSiteEntry->WMEParameters), sizeof(dot11_ACParameters_t)); /* update the general length */ pBssid->IELength += (pVarIes->Length + 2); } /* Copy the unknown IEs */ if ( 0 < pSiteEntry->unknownIeLen ) { os_memoryCopy (pScanResultTable->hOS, (void *)(&pBssid->IEs[ pBssid->IELength ]), (void *)pSiteEntry->pUnknownIe, pSiteEntry->unknownIeLen ); pBssid->IELength += pSiteEntry->unknownIeLen; } } else { /* Copy all variable IEs */ if (pSiteEntry->probeRecv) { /* It looks like it never happens. Anyway decided to check */ if ( pSiteEntry->probeRespLength > MAX_BEACON_BODY_LENGTH ) /* it may have sense to check the Len here for 0 or MIN_BEACON_BODY_LENGTH also */ { handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); return TI_NOK; } os_memoryCopy (pScanResultTable->hOS, pVarIes, pSiteEntry->probeRespBuffer, pSiteEntry->probeRespLength); pBssid->IELength += pSiteEntry->probeRespLength; } else { /* It looks like it never happens. Anyway decided to check */ if ( pSiteEntry->beaconLength > MAX_BEACON_BODY_LENGTH ) /* it may have sense to check the Len here for 0 or MIN_BEACON_BODY_LENGTH also */ { handleRunProblem(PROBLEM_BUF_SIZE_VIOLATION); return TI_NOK; } os_memoryCopy (pScanResultTable->hOS, pVarIes, pSiteEntry->beaconBuffer, pSiteEntry->beaconLength); pBssid->IELength += pSiteEntry->beaconLength; } } /* -1 to remove the IEs[1] placeholder in OS_802_11_BSSID_EX which is taken into account in pBssid->IELength */ pBssid->Length = sizeof(OS_802_11_BSSID_EX) + pBssid->IELength - 1; /* make sure length is 4 bytes aligned */ if (pBssid->Length % 4) { pBssid->Length += (4 - (pBssid->Length % 4)); } pData += pBssid->Length; uLength += pBssid->Length; } pBssidList->NumberOfItems = pScanResultTable->uCurrentSiteNumber; *pLength = uLength; return TI_OK; }