void Dot11d_UpdateCountryIe(struct rtllib_device *dev, u8 *pTaddr, u16 CoutryIeLen, u8* pCoutryIe) { PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(dev); #if defined CONFIG_CRDA && LINUX_VERSION_CODE > KERNEL_VERSION(2,6,30) #else u8 i, j, NumTriples, MaxChnlNum; PCHNL_TXPOWER_TRIPLE pTriple; memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER+1); memset(pDot11dInfo->MaxTxPwrDbmList, 0xFF, MAX_CHANNEL_NUMBER+1); MaxChnlNum = 0; NumTriples = (CoutryIeLen - 3) / 3; pTriple = (PCHNL_TXPOWER_TRIPLE)(pCoutryIe + 3); for(i = 0; i < NumTriples; i++) { if(MaxChnlNum >= pTriple->FirstChnl) { printk("Dot11d_UpdateCountryIe(): Invalid country IE, skip it........1\n"); return; } if(MAX_CHANNEL_NUMBER < (pTriple->FirstChnl + pTriple->NumChnls)) { printk("Dot11d_UpdateCountryIe(): Invalid country IE, skip it........2\n"); return; } for(j = 0 ; j < pTriple->NumChnls; j++) { pDot11dInfo->channel_map[pTriple->FirstChnl + j] = 1; pDot11dInfo->MaxTxPwrDbmList[pTriple->FirstChnl + j] = pTriple->MaxTxPowerInDbm; MaxChnlNum = pTriple->FirstChnl + j; } pTriple = (PCHNL_TXPOWER_TRIPLE)((u8*)pTriple + 3); } #if 0 printk("Channel List:"); for(i=1; i<= MAX_CHANNEL_NUMBER; i++) if(pDot11dInfo->channel_map[i] > 0) printk(" %d", i); printk("\n"); #endif #endif UPDATE_CIE_SRC(dev, pTaddr); pDot11dInfo->CountryIeLen = CoutryIeLen; memcpy(pDot11dInfo->CountryIeBuf, pCoutryIe,CoutryIeLen); pDot11dInfo->State = DOT11D_STATE_LEARNED; #if defined CONFIG_CRDA && LINUX_VERSION_CODE > KERNEL_VERSION(2,6,30) queue_delayed_work_rsl(dev->wq, &dev->softmac_hint11d_wq, 0); #endif }
// // Description: // Update country IE from Beacon or Probe Resopnse // and configure PHY for operation in the regulatory domain. // // TODO: // Configure Tx power. // // Assumption: // 1. IS_DOT11D_ENABLE() is TRUE. // 2. Input IE is an valid one. // void Dot11d_UpdateCountryIe( struct ieee80211_device *dev, u8 * pTaddr, u16 CoutryIeLen, u8 * pCoutryIe ) { PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(dev); u8 i, j, NumTriples, MaxChnlNum; PCHNL_TXPOWER_TRIPLE pTriple; memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER+1); memset(pDot11dInfo->MaxTxPwrDbmList, 0xFF, MAX_CHANNEL_NUMBER+1); MaxChnlNum = 0; NumTriples = (CoutryIeLen - 3) / 3; // skip 3-byte country string. pTriple = (PCHNL_TXPOWER_TRIPLE)(pCoutryIe + 3); for(i = 0; i < NumTriples; i++) { if(MaxChnlNum >= pTriple->FirstChnl) { // It is not in a monotonically increasing order, so stop processing. printk("Dot11d_UpdateCountryIe(): Invalid country IE, skip it........1\n"); return; } if(MAX_CHANNEL_NUMBER < (pTriple->FirstChnl + pTriple->NumChnls)) { // It is not a valid set of channel id, so stop processing. printk("Dot11d_UpdateCountryIe(): Invalid country IE, skip it........2\n"); return; } for(j = 0 ; j < pTriple->NumChnls; j++) { pDot11dInfo->channel_map[pTriple->FirstChnl + j] = 1; pDot11dInfo->MaxTxPwrDbmList[pTriple->FirstChnl + j] = pTriple->MaxTxPowerInDbm; MaxChnlNum = pTriple->FirstChnl + j; } pTriple = (PCHNL_TXPOWER_TRIPLE)((u8*)pTriple + 3); } #if 1 //printk("Dot11d_UpdateCountryIe(): Channel List:\n"); printk("Channel List:"); for(i=1; i<= MAX_CHANNEL_NUMBER; i++) if(pDot11dInfo->channel_map[i] > 0) printk(" %d", i); printk("\n"); #endif UPDATE_CIE_SRC(dev, pTaddr); pDot11dInfo->CountryIeLen = CoutryIeLen; memcpy(pDot11dInfo->CountryIeBuf, pCoutryIe,CoutryIeLen); pDot11dInfo->State = DOT11D_STATE_LEARNED; }
void Dot11d_UpdateCountryIe(struct rtllib_device *dev, u8 *pTaddr, u16 CoutryIeLen, u8* pCoutryIe) { PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(dev); u8 i, j, NumTriples, MaxChnlNum; PCHNL_TXPOWER_TRIPLE pTriple; memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER+1); memset(pDot11dInfo->MaxTxPwrDbmList, 0xFF, MAX_CHANNEL_NUMBER+1); MaxChnlNum = 0; NumTriples = (CoutryIeLen - 3) / 3; pTriple = (PCHNL_TXPOWER_TRIPLE)(pCoutryIe + 3); for (i = 0; i < NumTriples; i++) { if (MaxChnlNum >= pTriple->FirstChnl) { printk("Dot11d_UpdateCountryIe(): Invalid country IE, skip it........1\n"); return; } if (MAX_CHANNEL_NUMBER < (pTriple->FirstChnl + pTriple->NumChnls)) { printk("Dot11d_UpdateCountryIe(): Invalid country IE, skip it........2\n"); return; } for (j = 0 ; j < pTriple->NumChnls; j++) { pDot11dInfo->channel_map[pTriple->FirstChnl + j] = 1; pDot11dInfo->MaxTxPwrDbmList[pTriple->FirstChnl + j] = pTriple->MaxTxPowerInDbm; MaxChnlNum = pTriple->FirstChnl + j; } pTriple = (PCHNL_TXPOWER_TRIPLE)((u8*)pTriple + 3); } printk("Channel List:"); for (i = 1; i<= MAX_CHANNEL_NUMBER; i++) if (pDot11dInfo->channel_map[i] > 0) printk(" %d", i); printk("\n"); UPDATE_CIE_SRC(dev, pTaddr); pDot11dInfo->CountryIeLen = CoutryIeLen; memcpy(pDot11dInfo->CountryIeBuf, pCoutryIe, CoutryIeLen); pDot11dInfo->State = DOT11D_STATE_LEARNED; }
void Dot11d_UpdateCountryIe(struct rtllib_device *dev, u8 *pTaddr, u16 CoutryIeLen, u8 *pCoutryIe) { struct rt_dot11d_info *pDot11dInfo = GET_DOT11D_INFO(dev); u8 i, j, NumTriples, MaxChnlNum; struct chnl_txpow_triple *pTriple; memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER + 1); memset(pDot11dInfo->MaxTxPwrDbmList, 0xFF, MAX_CHANNEL_NUMBER + 1); MaxChnlNum = 0; NumTriples = (CoutryIeLen - 3) / 3; pTriple = (struct chnl_txpow_triple *)(pCoutryIe + 3); for (i = 0; i < NumTriples; i++) { if (MaxChnlNum >= pTriple->FirstChnl) { netdev_info(dev->dev, "%s: Invalid country IE, skip it......1\n", __func__); return; } if (MAX_CHANNEL_NUMBER < (pTriple->FirstChnl + pTriple->NumChnls)) { netdev_info(dev->dev, "%s: Invalid country IE, skip it......2\n", __func__); return; } for (j = 0; j < pTriple->NumChnls; j++) { pDot11dInfo->channel_map[pTriple->FirstChnl + j] = 1; pDot11dInfo->MaxTxPwrDbmList[pTriple->FirstChnl + j] = pTriple->MaxTxPowerInDbm; MaxChnlNum = pTriple->FirstChnl + j; } pTriple = (struct chnl_txpow_triple *)((u8 *)pTriple + 3); } UPDATE_CIE_SRC(dev, pTaddr); pDot11dInfo->CountryIeLen = CoutryIeLen; memcpy(pDot11dInfo->CountryIeBuf, pCoutryIe, CoutryIeLen); pDot11dInfo->State = DOT11D_STATE_LEARNED; }