/************************************************************************ * getMaxActiveRate * ************************************************************************ DESCRIPTION: Goes over an array of network rates and returns the max active rate INPUT: pRates - Rate array OUTPUT: RETURN: Max active rate (in network units) ************************************************************************/ ENetRate rate_GetMaxActiveFromStr (TI_UINT8 *pRatesString, TI_UINT32 len, ENetRate eMaxRate) { TI_UINT32 i; for (i = 0; i < len; i++) { if (NET_ACTIVE_RATE (pRatesString[i]) && rate_ValidateNet ((ENetRate)pRatesString[i]) == TI_OK) { eMaxRate = TI_MAX ((ENetRate)pRatesString[i], eMaxRate); } } return eMaxRate; }
/** * \fn scanResultTable_updateRates * \brief Update a scan result table entry with rates information * * Called by the function 'updateSiteInfo()' in order to translate the rates received * in the beacon or probe response to rate used by the driver. Perfoms the following: * - Check the rates. validity. If rates are invalid, return * - Get the max active rate & max basic rate, if invalid, return * - Translate the max active rate and max basic rate from network rates to host rates. * The max active & max basic rate are used by the driver from now on in all the processes: * (selection, join, transmission, etc....) * * \param hScanResultTable - handle to the scan result table object * \param pSite - a pointer to the site entry to update * \param pFrame - a pointer to the received frame * \return None * \sa scanResultTable_UpdateSiteData */ void scanResultTable_updateRates(TI_HANDLE hScanResultTable, TSiteEntry *pSite, TScanFrameInfo *pFrame) { TI_UINT8 maxBasicRate = 0, maxActiveRate = 0; TI_UINT32 bitMapExtSupp = 0; if (pFrame->parsedIEs->content.iePacket.pRates == NULL) { return; } /* Update the rate elements */ maxBasicRate = rate_GetMaxBasicFromStr ((TI_UINT8 *)pFrame->parsedIEs->content.iePacket.pRates->rates, pFrame->parsedIEs->content.iePacket.pRates->hdr[1], maxBasicRate); maxActiveRate = rate_GetMaxActiveFromStr ((TI_UINT8 *)pFrame->parsedIEs->content.iePacket.pRates->rates, pFrame->parsedIEs->content.iePacket.pRates->hdr[1], maxActiveRate); if (pFrame->parsedIEs->content.iePacket.pExtRates) { maxBasicRate = rate_GetMaxBasicFromStr ((TI_UINT8 *)pFrame->parsedIEs->content.iePacket.pExtRates->rates, pFrame->parsedIEs->content.iePacket.pExtRates->hdr[1], maxBasicRate); maxActiveRate = rate_GetMaxActiveFromStr ((TI_UINT8 *)pFrame->parsedIEs->content.iePacket.pExtRates->rates, pFrame->parsedIEs->content.iePacket.pExtRates->hdr[1], maxActiveRate); } if (maxActiveRate == 0) { maxActiveRate = maxBasicRate; } /* Now update it from network to host rates */ pSite->maxBasicRate = rate_NetToDrv (maxBasicRate); pSite->maxActiveRate = rate_NetToDrv (maxActiveRate); if (pSite->maxActiveRate == DRV_RATE_INVALID) { } if (pSite->maxBasicRate != DRV_RATE_INVALID) { if (pSite->maxActiveRate != DRV_RATE_INVALID) { pSite->maxActiveRate = TI_MAX (pSite->maxActiveRate, pSite->maxBasicRate); } } else { /* in case some vendors don't specify basic rates */ pSite->maxBasicRate = pSite->maxActiveRate; } /* build rates bit map */ rate_NetStrToDrvBitmap (&pSite->rateMask.supportedRateMask, pFrame->parsedIEs->content.iePacket.pRates->rates, pFrame->parsedIEs->content.iePacket.pRates->hdr[1]); rate_NetBasicStrToDrvBitmap (&pSite->rateMask.basicRateMask, pFrame->parsedIEs->content.iePacket.pRates->rates, pFrame->parsedIEs->content.iePacket.pRates->hdr[1]); if (pFrame->parsedIEs->content.iePacket.pExtRates) { rate_NetStrToDrvBitmap (&bitMapExtSupp, pFrame->parsedIEs->content.iePacket.pExtRates->rates, pFrame->parsedIEs->content.iePacket.pExtRates->hdr[1]); pSite->rateMask.supportedRateMask |= bitMapExtSupp; rate_NetBasicStrToDrvBitmap (&bitMapExtSupp, pFrame->parsedIEs->content.iePacket.pExtRates->rates, pFrame->parsedIEs->content.iePacket.pExtRates->hdr[1]); pSite->rateMask.basicRateMask |= bitMapExtSupp; } }