PageRenderTime 346ms CodeModel.GetById 30ms RepoModel.GetById 19ms app.codeStats 1ms

/drivers/net/wireless/tiwlan1251/common/src/core/sme/siteMgr/siteMgr.c

https://bitbucket.org/cyanogenmod/cm-kernel
C | 5078 lines | 3114 code | 869 blank | 1095 comment | 612 complexity | fc5aa5f93c7269c70b6e0b8c26ae5906 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, AGPL-1.0
  1. /****************************************************************************
  2. **+-----------------------------------------------------------------------+**
  3. **| |**
  4. **| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved. |**
  5. **| All rights reserved. |**
  6. **| |**
  7. **| Redistribution and use in source and binary forms, with or without |**
  8. **| modification, are permitted provided that the following conditions |**
  9. **| are met: |**
  10. **| |**
  11. **| * Redistributions of source code must retain the above copyright |**
  12. **| notice, this list of conditions and the following disclaimer. |**
  13. **| * Redistributions in binary form must reproduce the above copyright |**
  14. **| notice, this list of conditions and the following disclaimer in |**
  15. **| the documentation and/or other materials provided with the |**
  16. **| distribution. |**
  17. **| * Neither the name Texas Instruments nor the names of its |**
  18. **| contributors may be used to endorse or promote products derived |**
  19. **| from this software without specific prior written permission. |**
  20. **| |**
  21. **| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |**
  22. **| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |**
  23. **| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
  24. **| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |**
  25. **| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
  26. **| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |**
  27. **| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
  28. **| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
  29. **| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |**
  30. **| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
  31. **| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |**
  32. **| |**
  33. **+-----------------------------------------------------------------------+**
  34. ****************************************************************************/
  35. /** \file siteMgr.c
  36. * \brief Site Manager implementation
  37. *
  38. * \see siteMgr.h
  39. */
  40. #include "report.h"
  41. #include "osTIType.h"
  42. #include "osApi.h"
  43. #include "siteMgrApi.h"
  44. #include "siteHash.h"
  45. #include "smeApi.h"
  46. #include "utils.h"
  47. #include "connApi.h"
  48. #include "mlmeSm.h"
  49. #include "smeSmApi.h"
  50. #include "DataCtrl_Api.h"
  51. #include "regulatoryDomainApi.h"
  52. #include "rsnApi.h"
  53. #include "measurementMgrApi.h"
  54. #include "qosMngr_API.h"
  55. #include "PowerMgr_API.h"
  56. #include "EvHandler.h"
  57. #include "TI_IPC_Api.h"
  58. #include "MacServices_api.h"
  59. #include "whalHwDefs.h"
  60. #include "apConn.h"
  61. #include "currBss.h"
  62. #include "PowerMgr.h"
  63. #ifdef EXC_MODULE_INCLUDED
  64. #include "excMngr.h"
  65. #endif
  66. #include "configMgr.h"
  67. /* definitions */
  68. #define JOIN_RATE_MASK_1M 0x01
  69. #define JOIN_RATE_MASK_2M 0x02
  70. #define JOIN_RATE_MASK_5_5M 0x04
  71. #define JOIN_RATE_MASK_11M 0x08
  72. #define JOIN_RATE_MASK_22M 0x10
  73. #define SITE_MGR_INIT_BIT 1
  74. #define TIMER_INIT_BIT 2
  75. #define DESIRED_PARAMS_INIT_BIT 3
  76. #define MGMT_PARAMS_INIT_BIT 4
  77. #define BUILT_IN_TEST_PERIOD 500
  78. #define KEEP_ALIVE_SEND_NULL_DATA_PERIOD 10000
  79. #define SITE_MGR_IBSS_AGING_TIMEOUT_DEF 10 * 1000 /* 10 seconds */
  80. #define DEAFULT_BEACON_FILTERING_NUM (10)
  81. /* Reconfig constants */
  82. #define SCAN_FAIL_THRESHOLD_FOR_RECONFIG 4 /* After 4 times we reset the 580 register and still no AP found - make recovery */
  83. #define SCAN_FAIL_THRESHOLD_FOR_RESET_REG_580 90 /* After 90 times (45 seconds) and no AP found - reset the 580 register */
  84. #define SCAN_FAIL_RECONFIG_ENABLED TRUE
  85. #define SCAN_FAIL_RECONFIG_DISABLED FALSE
  86. /* Local Macros */
  87. #define UPDATE_BEACON_INTERVAL(pSite, pFrameInfo) pSite->beaconInterval = pFrameInfo->content.iePacket.beaconInerval
  88. #define UPDATE_CAPABILITIES(pSite, pFrameInfo) pSite->capabilities = pFrameInfo->content.iePacket.capabilities
  89. #define UPDATE_PRIVACY(pSite, pFrameInfo) pSite->privacy = ((pFrameInfo->content.iePacket.capabilities >> CAP_PRIVACY_SHIFT) & CAP_PRIVACY_MASK) ? TRUE : FALSE
  90. #define UPDATE_AGILITY(pSite, pFrameInfo) pSite->agility = ((pFrameInfo->content.iePacket.capabilities >> CAP_AGILE_SHIFT) & CAP_AGILE_MASK) ? TRUE : FALSE
  91. #define UPDATE_SLOT_TIME(pSite, pFrameInfo) pSite->newSlotTime = ((pFrameInfo->content.iePacket.capabilities >> CAP_SLOT_TIME_SHIFT) & CAP_SLOT_TIME_MASK) ? PHY_SLOT_TIME_SHORT : PHY_SLOT_TIME_LONG
  92. #define UPDATE_PROTECTION(pSite, pFrameInfo) pSite->useProtection = (pFrameInfo->content.iePacket.useProtection)
  93. #define UPDATE_SSID(pSite, pFrameInfo) if (pFrameInfo->content.iePacket.pSsid != NULL) { \
  94. pSite->ssid.len = pFrameInfo->content.iePacket.pSsid->hdr.eleLen; \
  95. os_memoryCopy(pSiteMgr->hOs, (void *)pSite->ssid.ssidString, (void *)pFrameInfo->content.iePacket.pSsid->serviceSetId, pFrameInfo->content.iePacket.pSsid->hdr.eleLen) ;}
  96. #define UPDATE_CHANNEL(pSite, pFrameInfo, rxChannel) if (pFrameInfo->content.iePacket.pDSParamsSet == NULL) \
  97. pSite->channel = rxChannel; \
  98. else \
  99. pSite->channel = pFrameInfo->content.iePacket.pDSParamsSet->currChannel;
  100. #define UPDATE_DTIM_PERIOD(pSite, pFrameInfo) if (pFrameInfo->content.iePacket.pTIM != NULL) \
  101. pSite->dtimPeriod = pFrameInfo->content.iePacket.pTIM->dtimPeriod
  102. #define UPDATE_ATIM_WINDOW(pSite, pFrameInfo) if (pFrameInfo->content.iePacket.pIBSSParamsSet != NULL) \
  103. pSite->atimWindow = pFrameInfo->content.iePacket.pIBSSParamsSet->atimWindow
  104. #define UPDATE_BEACON_AP_TX_POWER(pSite, pFrameInfo) if (pFrameInfo->content.iePacket.TPCReport != NULL) \
  105. pSite->APTxPower = pFrameInfo->content.iePacket.TPCReport->transmitPower
  106. #define UPDATE_PROBE_AP_TX_POWER(pSite, pFrameInfo) if (pFrameInfo->content.iePacket.TPCReport != NULL) \
  107. pSite->APTxPower = pFrameInfo->content.iePacket.TPCReport->transmitPower
  108. #define UPDATE_BSS_TYPE(pSite, pFrameInfo) pSite->bssType = ((pFrameInfo->content.iePacket.capabilities >> CAP_ESS_SHIFT) & CAP_ESS_MASK) ? BSS_INFRASTRUCTURE : BSS_INDEPENDENT
  109. #define UPDATE_LOCAL_TIME_STAMP(pSiteMgr, pSite, pFrameInfo) pSite->localTimeStamp = os_timeStampMs(pSiteMgr->hOs)
  110. #define UPDATE_DTIM_TIME(pSiteMgr, pSite, pFrameInfo) pSite->dtimTimeStamp = os_timeStampMs(pSiteMgr->hOs)
  111. /* Updated from beacons */
  112. #define UPDATE_BEACON_MODULATION(pSite, pFrameInfo) pSite->beaconModulation = ((pFrameInfo->content.iePacket.capabilities >> CAP_PBCC_SHIFT) & CAP_PBCC_MASK) ? DRV_MODULATION_PBCC : DRV_MODULATION_CCK
  113. /* Updated from probes */
  114. #define UPDATE_PROBE_MODULATION(pSite, pFrameInfo) pSite->probeModulation = ((pFrameInfo->content.iePacket.capabilities >> CAP_PBCC_SHIFT) & CAP_PBCC_MASK) ? DRV_MODULATION_PBCC : DRV_MODULATION_CCK
  115. #define UPDATE_BEACON_RECV(pSite) pSite->beaconRecv = TRUE
  116. #define UPDATE_PROBE_RECV(pSite) pSite->probeRecv = TRUE
  117. #define UPDATE_RSN_IE(pSite, pRsnIe, rsnIeLen) if (pRsnIe != NULL) { \
  118. UINT8 length=0, index=0;\
  119. pSite->rsnIeLen = rsnIeLen;\
  120. while ((length < pSite->rsnIeLen) && (index<MAX_RSN_IE)){\
  121. pSite->pRsnIe[index].hdr = pRsnIe->hdr;\
  122. os_memoryCopy(pSiteMgr->hOs, (void *)pSite->pRsnIe[index].rsnIeData, (void *)pRsnIe->rsnIeData, pRsnIe->hdr.eleLen);\
  123. length += (pRsnIe->hdr.eleLen+2); \
  124. pRsnIe += 1; \
  125. index++;}\
  126. } \
  127. else {pSite->rsnIeLen = 0;}
  128. #define UPDATE_BEACON_TIMESTAMP(pSiteMgr, pSite, pFrameInfo) os_memoryCopy(pSiteMgr->hOs, pSite->tsfTimeStamp, (void *)pFrameInfo->content.iePacket.timestamp, TIME_STAMP_LEN)
  129. #define SET_ENTRY_FLAG_IN_SITE_TABLE(pSite) pSite->Not_Received = 0
  130. /* Local functions definitions*/
  131. static void update_apsd(siteEntry_t *pSite, mlmeFrameInfo_t *pFrameInfo);
  132. static void release_module(siteMgr_t *pSiteMgr, UINT32 initVec);
  133. static void updateSiteInfo(siteMgr_t *pSiteMgr, mlmeFrameInfo_t *pFrameInfo, siteEntry_t *pSite, UINT8 rxChannel);
  134. static void updateRates(siteMgr_t *pSiteMgr, siteEntry_t *pSite, mlmeFrameInfo_t *pFrameInfo);
  135. static void updateBeaconQosParams(siteMgr_t *pSiteMgr, siteEntry_t *pSite, mlmeFrameInfo_t *pFrameInfo);
  136. static void updateProbeQosParams(siteMgr_t *pSiteMgr, siteEntry_t *pSite, mlmeFrameInfo_t *pFrameInfo);
  137. static void updatePreamble(siteMgr_t *pSiteMgr, siteEntry_t *pSite, mlmeFrameInfo_t *pFrameInfo);
  138. static void updateFourX(siteMgr_t *pSiteMgr, siteEntry_t *pSite, mlmeFrameInfo_t *pFrameInfo);
  139. static TI_STATUS getBssidList(siteMgr_t *pSiteMgr, OS_802_11_BSSID_LIST_EX *bssidList, UINT32* pLength, BOOL allVarIes);
  140. static void getPrimarySiteDesc(siteMgr_t *pSiteMgr, OS_802_11_BSSID *pPrimarySiteDesc, BOOL supplyExtendedInfo);
  141. static TI_STATUS getPrimaryBssid(siteMgr_t *pSiteMgr, OS_802_11_BSSID_EX *primaryBssid, UINT32 *pLength);
  142. static rate_e translateRateMaskToValue(siteMgr_t *pSiteMgr, UINT32 rateMask);
  143. static void getSupportedRateSet(siteMgr_t *pSiteMgr, rates_t *pRatesSet);
  144. static TI_STATUS setSupportedRateSet(siteMgr_t *pSiteMgr, rates_t *pRatesSet);
  145. static void validateDesiredTxRate(rate_e desiredTxRate,modulationType_e desiredModulation,UINT32 suppRates,UINT32 *bitMap,BOOL *txDesiredRateSupported);
  146. static TI_STATUS calculateBssidListSize(siteMgr_t *pSiteMgr, UINT32 *pLength, BOOL allVarIes);
  147. static void siteMgr_externalConfigurationParametersSet(TI_HANDLE hSiteMgr);
  148. void siteMgr_gotFirstBcn(TI_HANDLE hSiteMgr);
  149. /**************************************************************/
  150. /* DEBUG CLI CRASH */
  151. /**************************************************************/
  152. static whalCtrl_joinBss_t joinParams;
  153. static whalCtrl_setTemplate_t templateStruct;
  154. static probeRspTemplate_t probeRspTemplate;
  155. static nullDataTemplate_t nullDataTemplate;
  156. static psPollTemplate_t psPollTemplate;
  157. static QosNullDataTemplate_t QosNullDataTemplate;
  158. /**************************************************************/
  159. #define CHAN_FREQ_TABLE_SIZE (sizeof(ChanFreq) / sizeof(struct CHAN_FREQ))
  160. struct CHAN_FREQ {
  161. UINT8 chan;
  162. UINT32 freq;
  163. } ChanFreq[] = {
  164. {1,2412000}, {2,2417000}, {3,2422000}, {4,2427000},
  165. {5,2432000}, {6,2437000}, {7,2442000}, {8,2447000},
  166. {9,2452000},
  167. {10,2457000}, {11,2462000}, {12,2467000}, {13,2472000},
  168. {14,2484000}, {36,5180000}, {40,5200000}, {44,5220000},
  169. {48,5240000}, {52,5260000}, {56,5280000}, {60,5300000},
  170. {64,5320000},
  171. {100,5500000}, {104,5520000}, {108,5540000}, {112,5560000},
  172. {116,5580000}, {120,5600000}, {124,5620000}, {128,5640000},
  173. {132,5660000}, {136,5680000}, {140,5700000}, {149,5745000},
  174. {153,5765000}, {157,5785000}, {161,5805000} };
  175. static UINT8 Freq2Chan(UINT32 freq)
  176. {
  177. UINT32 i;
  178. for(i=0; i<CHAN_FREQ_TABLE_SIZE; i++)
  179. if(ChanFreq[i].freq == freq) return ChanFreq[i].chan;
  180. return 0;
  181. }
  182. static UINT32 Chan2Freq(UINT8 chan)
  183. {
  184. UINT32 i;
  185. for(i=0; i<CHAN_FREQ_TABLE_SIZE; i++)
  186. if(ChanFreq[i].chan == chan) return ChanFreq[i].freq;
  187. return 0;
  188. }
  189. /************************************************************************
  190. * siteMgr_setTemporaryTxPower *
  191. *************************************************************************
  192. DESCRIPTION: This function is used to start the Tx Power Control adjust mechanism
  193. in regulatoryDomain.
  194. INPUT: bActivateTempFix - Whether the power should be adjusted
  195. ************************************************************************/
  196. void siteMgr_setTemporaryTxPower(siteMgr_t* pSiteMgr, BOOL bActivateTempFix)
  197. {
  198. paramInfo_t param;
  199. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  200. ("siteMgr_setTemporaryTxPower is = %s \n", (bActivateTempFix ? "ON" : "OFF")));
  201. /* Set the temporary Power Level via the Regulatory Domain*/
  202. param.paramType = REGULATORY_DOMAIN_TEMPORARY_TX_ATTENUATION_PARAM;
  203. param.content.bActivateTempPowerFix = bActivateTempFix;
  204. regulatoryDomain_setParam(pSiteMgr->hRegulatoryDomain,&param);
  205. }
  206. /* Interface functions Implementation */
  207. /*static void UPDATE_RSN_IE (siteMgr_t* pSiteMgr, siteEntry_t *pSite, dot11_RSN_t *pRsnIe, UINT8 rsnIeLen)
  208. {
  209. if (pRsnIe != NULL) {
  210. UINT8 length=0, index=0;
  211. pSite->rsnIeLen = rsnIeLen;
  212. while ((length < pSite->rsnIeLen) && (index<MAX_RSN_IE)){
  213. pSite->pRsnIe[index].hdr = pRsnIe->hdr;
  214. os_memoryCopy(pSiteMgr->hOs, pSite->pRsnIe[index].rsnIeData, pRsnIe->rsnIeData, pRsnIe->hdr.eleLen);
  215. length += (pRsnIe->hdr.eleLen+2);
  216. pRsnIe += 1;
  217. index++;}
  218. }
  219. else {pSite->rsnIeLen = 0;}
  220. }*/
  221. /************************************************************************
  222. * siteMgr_create *
  223. ************************************************************************
  224. DESCRIPTION: Site manager module creation function, called by the config mgr in creation phase
  225. performs the following:
  226. - Allocate the site manager handle
  227. - Allocate the desired & mgmt params structure
  228. INPUT: hOs - Handle to OS
  229. OUTPUT:
  230. RETURN: Handle to the site manager module on success, NULL otherwise
  231. ************************************************************************/
  232. TI_HANDLE siteMgr_create(TI_HANDLE hOs)
  233. {
  234. siteMgr_t *pSiteMgr;
  235. UINT32 initVec;
  236. initVec = 0;
  237. pSiteMgr = os_memoryAlloc(hOs, sizeof(siteMgr_t));
  238. if (pSiteMgr == NULL)
  239. return NULL;
  240. os_memoryZero(hOs, pSiteMgr, sizeof(siteMgr_t));
  241. initVec |= (1 << SITE_MGR_INIT_BIT);
  242. pSiteMgr->pDesiredParams = os_memoryAlloc(hOs, sizeof(siteMgrInitParams_t));
  243. if (pSiteMgr->pDesiredParams == NULL)
  244. {
  245. release_module(pSiteMgr, initVec);
  246. return NULL;
  247. }
  248. initVec |= (1 << DESIRED_PARAMS_INIT_BIT);
  249. pSiteMgr->pSitesMgmtParams = os_memoryAlloc(hOs, sizeof(sitesMgmtParams_t));
  250. if (pSiteMgr->pSitesMgmtParams == NULL)
  251. {
  252. release_module(pSiteMgr, initVec);
  253. return NULL;
  254. }
  255. initVec |= (1 << MGMT_PARAMS_INIT_BIT);
  256. pSiteMgr->hOs = hOs;
  257. return(pSiteMgr);
  258. }
  259. /************************************************************************
  260. * siteMgr_config *
  261. ************************************************************************
  262. DESCRIPTION: Site manager module configuration function, called by the config mgr in configuration phase
  263. performs the following:
  264. - Reset & initiailzes local variables
  265. - Init the handles to be used by the module
  266. INPUT: hSiteMgr - site manager handle
  267. List of handles to be used by the module
  268. pSiteMgrInitParams - Init table of the module, contains the following:
  269. - Parameters read from registry
  270. - Chip parameters
  271. OUTPUT:
  272. RETURN: OK on success, NOK otherwise
  273. ************************************************************************/
  274. TI_STATUS siteMgr_config( TI_HANDLE hSiteMgr,
  275. TI_HANDLE hConn,
  276. TI_HANDLE hSmeSm,
  277. TI_HANDLE hCtrlData,
  278. TI_HANDLE hRxData,
  279. TI_HANDLE hTxData,
  280. TI_HANDLE hRsn,
  281. TI_HANDLE hAuth,
  282. TI_HANDLE hAssoc,
  283. TI_HANDLE hHalCtrl,
  284. TI_HANDLE hMlmeSm,
  285. TI_HANDLE hRegulatoryDomain,
  286. TI_HANDLE hMeasurementMgr,
  287. TI_HANDLE hApConn,
  288. TI_HANDLE hCurrBss,
  289. TI_HANDLE hReport,
  290. TI_HANDLE hOs ,
  291. TI_HANDLE hExcMngr,
  292. TI_HANDLE hQosMngr,
  293. TI_HANDLE thePowerMgrHandle,
  294. TI_HANDLE hScr,
  295. TI_HANDLE hEvHandler,
  296. TI_HANDLE hMacServices,
  297. siteMgrInitParams_t *pSiteMgrInitParams)
  298. {
  299. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  300. UINT32 timestamp;
  301. slotTime_e slotTime;
  302. paramInfo_t saParam;
  303. TI_STATUS status;
  304. /* Init handles */
  305. pSiteMgr->hConn = hConn;
  306. pSiteMgr->hSmeSm = hSmeSm;
  307. pSiteMgr->hHalCtrl = hHalCtrl;
  308. pSiteMgr->hCtrlData = hCtrlData;
  309. pSiteMgr->hRxData = hRxData;
  310. pSiteMgr->hTxData = hTxData;
  311. pSiteMgr->hRsn = hRsn;
  312. pSiteMgr->hAuth = hAuth;
  313. pSiteMgr->hAssoc = hAssoc;
  314. pSiteMgr->hRegulatoryDomain = hRegulatoryDomain;
  315. pSiteMgr->hMeasurementMgr = hMeasurementMgr;
  316. pSiteMgr->hReport = hReport;
  317. pSiteMgr->hOs = hOs;
  318. pSiteMgr->hMlmeSm = hMlmeSm;
  319. pSiteMgr->hAssoc = hAssoc;
  320. pSiteMgr->hReport = hReport;
  321. pSiteMgr->hExcMngr = hExcMngr;
  322. pSiteMgr->hApConn = hApConn;
  323. pSiteMgr->hCurrBss = hCurrBss;
  324. pSiteMgr->hQosMngr = hQosMngr;
  325. pSiteMgr->hPowerMgr = thePowerMgrHandle;
  326. pSiteMgr->hScr = hScr;
  327. pSiteMgr->hEvHandler = hEvHandler;
  328. pSiteMgr->hMacServices = hMacServices;
  329. /* Reset counter for Tx Power Control adjustment */
  330. pSiteMgr->siteMgrTxPowerCheckTime = 0;
  331. /* Init desired parameters */
  332. os_memoryCopy(hOs, pSiteMgr->pDesiredParams, pSiteMgrInitParams, sizeof(siteMgrInitParams_t));
  333. /* Init Beacon Filter Desired State */
  334. pSiteMgr->beaconFilterParams.desiredState = pSiteMgrInitParams->beaconFilterParams.desiredState;
  335. /* Init Beacon Filter numOfStored parameter */
  336. pSiteMgr->beaconFilterParams.numOfStored = pSiteMgrInitParams->beaconFilterParams.numOfStored;
  337. /* Init management params */
  338. pSiteMgr->pSitesMgmtParams->dot11A_sitesTables.maxNumOfSites = MAX_SITES_A_BAND;
  339. siteMgr_resetSiteTable(pSiteMgr,(siteTablesParams_t *)&pSiteMgr->pSitesMgmtParams->dot11A_sitesTables);
  340. pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables.maxNumOfSites = MAX_SITES_BG_BAND;
  341. siteMgr_resetSiteTable(pSiteMgr,&pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables);
  342. /* calculate random BSSID for usage in IBSS */
  343. timestamp = os_timeStampMs(pSiteMgr->hOs);
  344. os_memoryCopy(pSiteMgr->hOs, (void *)&(pSiteMgr->ibssBssid.addr[0]), &timestamp, sizeof(UINT32));
  345. pSiteMgr->ibssBssid.addr[0] = 0x00;
  346. timestamp = os_timeStampMs(pSiteMgr->hOs);
  347. os_memoryCopy(pSiteMgr->hOs, (void *)&(pSiteMgr->ibssBssid.addr[2]), &timestamp, sizeof(UINT32));
  348. /* Get the Source MAC address in order to use it for AD-Hoc BSSID, solving Conexant ST issue for WiFi test */
  349. saParam.paramType = CTRL_DATA_MAC_ADDRESS;
  350. status = ctrlData_getParam(hCtrlData, &saParam);
  351. if (status != OK)
  352. {
  353. WLAN_OS_REPORT(("\n ERROR !!! : siteMgr_config - Error in getting MAC address\n" ));
  354. return NOK;
  355. }
  356. pSiteMgr->ibssBssid.addr[0] = 0x02;
  357. pSiteMgr->ibssBssid.addr[1] = saParam.content.ctrlDataDeviceMacAddress.addr[1];
  358. pSiteMgr->ibssBssid.addr[2] = saParam.content.ctrlDataDeviceMacAddress.addr[2];
  359. pSiteMgr->keepAliveEnable = pSiteMgrInitParams->siteMgrDesiredkeepAliveEnable;
  360. pSiteMgr->numOfBeaconFiltering = DEAFULT_BEACON_FILTERING_NUM;
  361. switch(pSiteMgr->pDesiredParams->siteMgrRadioValues.siteMgr_radioType)
  362. {
  363. case MAXIM:
  364. pSiteMgr->pDesiredParams->siteMgrRadioValues.pSiteMgr_selectedRadioValues =
  365. &pSiteMgr->pDesiredParams->siteMgrRadioValues.siteMgr_maximRadioValues;
  366. pSiteMgr->pDesiredParams->siteMgrSupportedBand = RADIO_BAND_2_4_GHZ;
  367. WLAN_REPORT_INIT(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("MAXIM !!! \n"));
  368. break;
  369. case RFMD:
  370. pSiteMgr->pDesiredParams->siteMgrRadioValues.pSiteMgr_selectedRadioValues =
  371. &pSiteMgr->pDesiredParams->siteMgrRadioValues.siteMgr_rfmdRadioValues;
  372. pSiteMgr->pDesiredParams->siteMgrSupportedBand = RADIO_BAND_2_4_GHZ;
  373. WLAN_REPORT_INIT(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("RFMD !!! \n"));
  374. break;
  375. case RADIA_BG:
  376. pSiteMgr->pDesiredParams->siteMgrRadioValues.pSiteMgr_selectedRadioValues =
  377. &pSiteMgr->pDesiredParams->siteMgrRadioValues.siteMgr_radiaRadioValues;
  378. pSiteMgr->pDesiredParams->siteMgrSupportedBand = RADIO_BAND_2_4_GHZ;
  379. WLAN_REPORT_INIT(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("RADIA bg !!! \n"));
  380. break;
  381. case RADIA_ABG:
  382. pSiteMgr->pDesiredParams->siteMgrRadioValues.pSiteMgr_selectedRadioValues =
  383. &pSiteMgr->pDesiredParams->siteMgrRadioValues.siteMgr_radiaRadioValues;
  384. pSiteMgr->pDesiredParams->siteMgrSupportedBand = RADIO_BAND_DUAL;
  385. WLAN_REPORT_INIT(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("RADIA abg !!! \n"));
  386. break;
  387. default:
  388. pSiteMgr->pDesiredParams->siteMgrRadioValues.pSiteMgr_selectedRadioValues = NULL;
  389. WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  390. ("!!!.....UnKnown Radio Type !!!\n"));
  391. }
  392. pSiteMgr->beaconSentCount = 0;
  393. pSiteMgr->pDesiredParams->siteMgrDesiredAtimWindow = 0;
  394. if(pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode == DOT11_DUAL_MODE)
  395. {
  396. if(pSiteMgr->pDesiredParams->siteMgrSupportedBand == RADIO_BAND_DUAL)
  397. {
  398. pSiteMgr->siteMgrOperationalMode = DOT11_G_MODE;
  399. pSiteMgr->radioBand = RADIO_BAND_2_4_GHZ;
  400. slotTime = pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime;
  401. pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
  402. }
  403. else if(pSiteMgr->pDesiredParams->siteMgrSupportedBand == RADIO_BAND_2_4_GHZ)
  404. {
  405. pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode = DOT11_G_MODE;
  406. pSiteMgr->siteMgrOperationalMode = DOT11_G_MODE;
  407. pSiteMgr->radioBand = RADIO_BAND_2_4_GHZ;
  408. slotTime = pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime;
  409. pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
  410. }
  411. else
  412. {
  413. pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode = DOT11_A_MODE;
  414. pSiteMgr->siteMgrOperationalMode = DOT11_A_MODE;
  415. pSiteMgr->radioBand = RADIO_BAND_5_0_GHZ;
  416. slotTime = PHY_SLOT_TIME_SHORT;
  417. pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = (siteTablesParams_t *)&pSiteMgr->pSitesMgmtParams->dot11A_sitesTables;
  418. }
  419. }
  420. else if(pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode == DOT11_G_MODE)
  421. {
  422. slotTime = pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime;
  423. pSiteMgr->radioBand = RADIO_BAND_2_4_GHZ;
  424. if((pSiteMgr->pDesiredParams->siteMgrSupportedBand == RADIO_BAND_DUAL) ||
  425. (pSiteMgr->pDesiredParams->siteMgrSupportedBand == RADIO_BAND_2_4_GHZ))
  426. {
  427. pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
  428. pSiteMgr->siteMgrOperationalMode = pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode;
  429. }
  430. else
  431. {
  432. WLAN_OS_REPORT(("\nERROR !!!.....The radio doesn't support the desired dot11 mode !!! \n"));
  433. return NOK;
  434. }
  435. }
  436. else if(pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode == DOT11_B_MODE)
  437. {
  438. slotTime = PHY_SLOT_TIME_LONG;
  439. pSiteMgr->radioBand = RADIO_BAND_2_4_GHZ;
  440. if((pSiteMgr->pDesiredParams->siteMgrSupportedBand == RADIO_BAND_DUAL) ||
  441. (pSiteMgr->pDesiredParams->siteMgrSupportedBand == RADIO_BAND_2_4_GHZ))
  442. {
  443. pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
  444. pSiteMgr->siteMgrOperationalMode = pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode;
  445. }
  446. else
  447. {
  448. WLAN_OS_REPORT(("\nERROR !!!.....The radio doesn't support the desired dot11 mode !!! \n"));
  449. return NOK;
  450. }
  451. }
  452. else
  453. {
  454. slotTime = PHY_SLOT_TIME_SHORT;
  455. pSiteMgr->radioBand = RADIO_BAND_5_0_GHZ;
  456. if((pSiteMgr->pDesiredParams->siteMgrSupportedBand == RADIO_BAND_DUAL) ||
  457. (pSiteMgr->pDesiredParams->siteMgrSupportedBand == RADIO_BAND_5_0_GHZ))
  458. {
  459. pSiteMgr->siteMgrOperationalMode = pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode;
  460. pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = (siteTablesParams_t *)&pSiteMgr->pSitesMgmtParams->dot11A_sitesTables;
  461. }
  462. else
  463. {
  464. WLAN_OS_REPORT(("\nERROR !!!.....The radio doesn't support the desired dot11 mode !!! \n"));
  465. return NOK;
  466. }
  467. }
  468. /* configure hal with common core-hal parameters */
  469. whalCtrl_SetRadioBand(pSiteMgr->hHalCtrl, pSiteMgr->radioBand);
  470. whalCtrl_SetSlotTime(pSiteMgr->hHalCtrl, slotTime);
  471. siteMgr_ConfigRate(hSiteMgr);
  472. WLAN_REPORT_INIT(hReport, SITE_MGR_MODULE_LOG,
  473. (" SiteMgr - numOfElements = %d IETableSize = %d\n" , pSiteMgrInitParams->beaconFilterParams.numOfElements, pSiteMgrInitParams->beaconFilterParams.IETableSize)) ;
  474. /*send the table regardless to the state*/
  475. whalCtrl_SetBeaconFilterIETable(pSiteMgr->hHalCtrl ,(UINT8 *)&(pSiteMgrInitParams->beaconFilterParams.numOfElements), (UINT8 *)&(pSiteMgrInitParams->beaconFilterParams.IETable[0]) , (UINT8 *)&(pSiteMgrInitParams->beaconFilterParams.IETableSize)) ;
  476. /* At start-up Set the Beacon Filter state as the User required */
  477. whalCtrl_SetBeaconFiltering(pSiteMgr->hHalCtrl, pSiteMgrInitParams->beaconFilterParams.desiredState, pSiteMgr->beaconFilterParams.numOfStored);
  478. pSiteMgr->pSitesMgmtParams->pPrevPrimarySite = NULL;
  479. pSiteMgr->powerSaveLdMode = FALSE;
  480. WLAN_REPORT_INIT(hReport, SITE_MGR_MODULE_LOG, (".....Site manager configured successfully\n"));
  481. return OK;
  482. }
  483. /************************************************************************
  484. * siteMgr_unLoad *
  485. ************************************************************************
  486. DESCRIPTION: site manager module unload function, called by the config mgr in the unlod phase
  487. performs the following:
  488. - Free all memory aloocated by the module
  489. INPUT: hSiteMgr - site mgr handle.
  490. OUTPUT:
  491. RETURN: OK on success, NOK otherwise
  492. ************************************************************************/
  493. TI_STATUS siteMgr_unLoad(TI_HANDLE hSiteMgr)
  494. {
  495. UINT32 initVec;
  496. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  497. if (!pSiteMgr)
  498. return OK;
  499. initVec = 0xFFFF;
  500. release_module(pSiteMgr, initVec);
  501. return OK;
  502. }
  503. /***********************************************************************
  504. * siteMgr_setParam
  505. ***********************************************************************
  506. DESCRIPTION: site mgr set param function, called by the following:
  507. - config mgr in order to set a parameter from the OS abstraction layer.
  508. In this fuction, the site manager OS abstraction layer configures the site manager to the desired params.
  509. Sometimes it requires a re scan, depending in the parameter type
  510. INPUT: hSiteMgr - Connection handle.
  511. pParam - Pointer to the parameter
  512. OUTPUT:
  513. RETURN: RE_SCAN_NEEDED if re scan needed, OK on success, NOK on failure
  514. ************************************************************************/
  515. TI_STATUS siteMgr_setParam(TI_HANDLE hSiteMgr,
  516. paramInfo_t *pParam)
  517. {
  518. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  519. siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
  520. OS_802_11_CONFIGURATION *pConfig;
  521. UINT32 channel;
  522. slotTime_e slotTime;
  523. switch(pParam->paramType)
  524. {
  525. case SITE_MGR_CONFIGURATION_PARAM:
  526. pConfig = pParam->content.pSiteMgrConfiguration;
  527. /* for(channel = 0; channel < SITE_MGR_CHANNEL_MAX+1; channel++)
  528. {
  529. if(pConfig->channel == pSiteMgr->pDesiredParams->siteMgrFreq2ChannelTable[channel])
  530. break;
  531. }*/
  532. channel = Freq2Chan(pConfig->Union.channel);
  533. if(channel == 0 || channel > SITE_MGR_CHANNEL_MAX)
  534. return PARAM_VALUE_NOT_VALID;
  535. else
  536. pConfig->Union.channel = channel;
  537. if((pSiteMgr->pDesiredParams->siteMgrDesiredChannel != pConfig->Union.channel) ||
  538. (pSiteMgr->pDesiredParams->siteMgrDesiredChannel != pConfig->Union.channel) ||
  539. (pSiteMgr->pDesiredParams->siteMgrDesiredAtimWindow != pConfig->ATIMWindow))
  540. {
  541. pSiteMgr->pDesiredParams->siteMgrDesiredChannel = (UINT8)pConfig->Union.channel;
  542. pSiteMgr->pDesiredParams->siteMgrDesiredBeaconInterval = (UINT16)pConfig->BeaconPeriod;
  543. pSiteMgr->pDesiredParams->siteMgrDesiredAtimWindow = pConfig->ATIMWindow;
  544. }
  545. return OK;
  546. case SITE_MGR_DESIRED_CHANNEL_PARAM:
  547. if (pParam->content.siteMgrDesiredChannel > SITE_MGR_CHANNEL_MAX)
  548. return PARAM_VALUE_NOT_VALID;
  549. if (pSiteMgr->pDesiredParams->siteMgrDesiredChannel != pParam->content.siteMgrDesiredChannel)
  550. pSiteMgr->pDesiredParams->siteMgrDesiredChannel = (UINT8)pParam->content.siteMgrDesiredChannel;
  551. return OK;
  552. case SITE_MGR_DESIRED_BSSID_PARAM:
  553. os_memoryCopy(pSiteMgr->hOs, (void *)pSiteMgr->pDesiredParams->siteMgrDesiredBSSID.addr, (void *)pParam->content.siteMgrDesiredBSSID.addr, sizeof(macAddress_t));
  554. #if 0
  555. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Set BSSID = 0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x \n",
  556. pSiteMgr->pDesiredParams->siteMgrDesiredBSSID.addr[0],
  557. pSiteMgr->pDesiredParams->siteMgrDesiredBSSID.addr[1],
  558. pSiteMgr->pDesiredParams->siteMgrDesiredBSSID.addr[2],
  559. pSiteMgr->pDesiredParams->siteMgrDesiredBSSID.addr[3],
  560. pSiteMgr->pDesiredParams->siteMgrDesiredBSSID.addr[4],
  561. pSiteMgr->pDesiredParams->siteMgrDesiredBSSID.addr[5]));
  562. #endif
  563. return OK;
  564. case SITE_MGR_DESIRED_SSID_PARAM:
  565. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  566. ("\nSet new SSID=%s (len=%d) \n",
  567. pParam->content.siteMgrDesiredSSID.ssidString,
  568. pParam->content.siteMgrDesiredSSID.len));
  569. if (pParam->content.siteMgrDesiredSSID.len > MAX_SSID_LEN)
  570. return PARAM_VALUE_NOT_VALID;
  571. os_memoryCopy(pSiteMgr->hOs, &pSiteMgr->pDesiredParams->siteMgrDesiredSSID, &pParam->content.siteMgrDesiredSSID, sizeof(ssid_t));
  572. /* only add null at the end of the string if the string length is less than 32 bytes and so we have one char left
  573. TODO: another byte must be added, and the alignment change MUST be tested (esp. in CLI commands with ssid_t */
  574. if ( MAX_SSID_LEN > pSiteMgr->pDesiredParams->siteMgrDesiredSSID.len )
  575. {
  576. pSiteMgr->pDesiredParams->siteMgrDesiredSSID.ssidString[pSiteMgr->pDesiredParams->siteMgrDesiredSSID.len] = '\0';
  577. }
  578. /* increase the random IBSS BSSID calculated during init */
  579. pSiteMgr->ibssBssid.addr[MAC_ADDR_LEN - 1] ++;
  580. if (utils_isJunkSSID(&pSiteMgr->pDesiredParams->siteMgrDesiredSSID))
  581. {
  582. rsn_removedDefKeys(pSiteMgr->hRsn);
  583. }
  584. return RE_SCAN_NEEDED;
  585. case SITE_MGR_DESIRED_BSS_TYPE_PARAM:
  586. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  587. ("\nSet BssType = %d\n", pParam->content.siteMgrDesiredBSSType));
  588. if (pParam->content.siteMgrDesiredBSSType > BSS_ANY)
  589. return PARAM_VALUE_NOT_VALID;
  590. if (pSiteMgr->pDesiredParams->siteMgrDesiredBSSType != pParam->content.siteMgrDesiredBSSType)
  591. {
  592. pSiteMgr->pDesiredParams->siteMgrDesiredBSSType = pParam->content.siteMgrDesiredBSSType;
  593. /* If the new BSS type is NOT Ad_Hoc, We make sure that the rate masks are set to G */
  594. if(pSiteMgr->pDesiredParams->siteMgrDesiredBSSType != BSS_INDEPENDENT)
  595. {
  596. pSiteMgr->siteMgrOperationalMode = DOT11_G_MODE;
  597. siteMgr_ConfigRate(pSiteMgr);
  598. }
  599. /* If the new BSS type is Ad_Hoc, increase the random BSSID calculated during init */
  600. if(pSiteMgr->pDesiredParams->siteMgrDesiredBSSType == BSS_INDEPENDENT)
  601. {
  602. pSiteMgr->ibssBssid.addr[MAC_ADDR_LEN - 1] ++;
  603. }
  604. /* go to B_ONLY Mode only if WiFI bit is Set*/
  605. if (pSiteMgr->pDesiredParams->siteMgrWiFiAdhoc == TRUE)
  606. { /* Configuration For AdHoc when using external configuration */
  607. if(pSiteMgr->pDesiredParams->siteMgrExternalConfiguration == FALSE)
  608. {
  609. siteMgr_externalConfigurationParametersSet(hSiteMgr);
  610. }
  611. }
  612. }
  613. return OK;
  614. case SITE_MGR_DESIRED_MODULATION_TYPE_PARAM:
  615. if ((pParam->content.siteMgrDesiredModulationType < DRV_MODULATION_CCK) ||
  616. (pParam->content.siteMgrDesiredModulationType > DRV_MODULATION_OFDM))
  617. return PARAM_VALUE_NOT_VALID;
  618. if (pSiteMgr->pDesiredParams->siteMgrDesiredModulationType != pParam->content.siteMgrDesiredModulationType)
  619. {
  620. pSiteMgr->pDesiredParams->siteMgrDesiredModulationType = pParam->content.siteMgrDesiredModulationType;
  621. /* means that we are moving from non-pbcc network to pbcc */
  622. if (pParam->content.siteMgrDesiredModulationType == DRV_MODULATION_PBCC)
  623. return RE_SCAN_NEEDED;
  624. return OK;
  625. }
  626. return OK;
  627. case SITE_MGR_BEACON_RECV:
  628. if (!pPrimarySite)
  629. {
  630. return NO_SITE_SELECTED_YET;
  631. }
  632. pPrimarySite->beaconRecv = pParam->content.siteMgrBeaconRecv;
  633. return OK;
  634. case SITE_MGR_DESIRED_BEACON_INTERVAL_PARAM:
  635. if (pParam->content.siteMgrDesiredBeaconInterval < SITE_MGR_BEACON_INTERVAL_MIN)
  636. return PARAM_VALUE_NOT_VALID;
  637. if (pSiteMgr->pDesiredParams->siteMgrDesiredBeaconInterval != pParam->content.siteMgrDesiredBeaconInterval)
  638. pSiteMgr->pDesiredParams->siteMgrDesiredBeaconInterval = pParam->content.siteMgrDesiredBeaconInterval;
  639. return OK;
  640. case SITE_MGR_DESIRED_PREAMBLE_TYPE_PARAM:
  641. if ((pParam->content.siteMgrDesiredPreambleType != PREAMBLE_LONG) &&
  642. (pParam->content.siteMgrDesiredPreambleType != PREAMBLE_SHORT))
  643. return PARAM_VALUE_NOT_VALID;
  644. if (pSiteMgr->pDesiredParams->siteMgrDesiredPreambleType != pParam->content.siteMgrDesiredPreambleType)
  645. {
  646. pSiteMgr->pDesiredParams->siteMgrDesiredPreambleType = pParam->content.siteMgrDesiredPreambleType;
  647. }
  648. return OK;
  649. case SITE_MGR_DESIRED_SUPPORTED_RATE_SET_PARAM:
  650. return setSupportedRateSet(pSiteMgr, &(pParam->content.siteMgrDesiredSupportedRateSet));
  651. case SITE_MGR_DESIRED_DOT11_MODE_PARAM:
  652. if(pParam->content.siteMgrDot11Mode > DOT11_MAX_MODE)
  653. return PARAM_VALUE_NOT_VALID;
  654. if(pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode != pParam->content.siteMgrDot11Mode)
  655. {
  656. pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode = pParam->content.siteMgrDot11Mode;
  657. /* since the dot11ABAmode changed, the STA operational mode should be changed */
  658. if(pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode == DOT11_DUAL_MODE)
  659. {
  660. if(pSiteMgr->pDesiredParams->siteMgrSupportedBand == RADIO_BAND_DUAL)
  661. {
  662. pSiteMgr->siteMgrOperationalMode = DOT11_G_MODE;
  663. }
  664. else if(pSiteMgr->pDesiredParams->siteMgrSupportedBand == RADIO_BAND_2_4_GHZ)
  665. {
  666. pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode = DOT11_G_MODE;
  667. pSiteMgr->siteMgrOperationalMode = DOT11_G_MODE;
  668. }
  669. else
  670. {
  671. pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode = DOT11_G_MODE;
  672. pSiteMgr->siteMgrOperationalMode = DOT11_A_MODE;
  673. }
  674. }
  675. else
  676. pSiteMgr->siteMgrOperationalMode = pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode;
  677. /* configure HAL with new parameters update rates and select site table */
  678. pSiteMgr->prevRadioBand = pSiteMgr->radioBand;
  679. if(pSiteMgr->siteMgrOperationalMode == DOT11_A_MODE)
  680. {
  681. pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = (siteTablesParams_t *)&pSiteMgr->pSitesMgmtParams->dot11A_sitesTables;
  682. pSiteMgr->radioBand = RADIO_BAND_5_0_GHZ;
  683. slotTime = PHY_SLOT_TIME_SHORT;
  684. }
  685. else if(pSiteMgr->siteMgrOperationalMode == DOT11_G_MODE)
  686. {
  687. pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
  688. pSiteMgr->radioBand = RADIO_BAND_2_4_GHZ;
  689. slotTime = pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime;
  690. }
  691. else
  692. {
  693. pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
  694. pSiteMgr->radioBand = RADIO_BAND_2_4_GHZ;
  695. slotTime = PHY_SLOT_TIME_LONG;
  696. }
  697. if(pSiteMgr->prevRadioBand != pSiteMgr->radioBand)
  698. siteMgr_bandParamsConfig(pSiteMgr, TRUE);
  699. /* configure HAL */
  700. whalCtrl_SetRadioBand(pSiteMgr->hHalCtrl, pSiteMgr->radioBand);
  701. whalCtrl_SetSlotTime(pSiteMgr->hHalCtrl, slotTime);
  702. /* If the BSS type is Ad_Hoc, increase the random BSSID calculated during init */
  703. if(pSiteMgr->pDesiredParams->siteMgrDesiredBSSType == BSS_INDEPENDENT)
  704. {
  705. pSiteMgr->ibssBssid.addr[MAC_ADDR_LEN - 1] ++;
  706. }
  707. /*siteMgr_resetAllSiteTables(pSiteMgr); */
  708. return RE_SCAN_NEEDED;
  709. }
  710. return OK;
  711. case SITE_MGR_OPERATIONAL_MODE_PARAM:
  712. if(pParam->content.siteMgrDot11OperationalMode < DOT11_B_MODE ||
  713. pParam->content.siteMgrDot11OperationalMode > DOT11_G_MODE )
  714. return PARAM_VALUE_NOT_VALID;
  715. pSiteMgr->siteMgrOperationalMode = pParam->content.siteMgrDot11OperationalMode;
  716. break;
  717. case SITE_MGR_USE_DRAFT_NUM_PARAM:
  718. if(pParam->content.siteMgrUseDraftNum != DRAFT_5_AND_EARLIER &&
  719. pParam->content.siteMgrUseDraftNum != DRAFT_6_AND_LATER)
  720. return PARAM_VALUE_NOT_VALID;
  721. if(pSiteMgr->pDesiredParams->siteMgrUseDraftNum != pParam->content.siteMgrUseDraftNum)
  722. {
  723. pSiteMgr->pDesiredParams->siteMgrUseDraftNum = pParam->content.siteMgrUseDraftNum;
  724. return RE_SCAN_NEEDED;
  725. }
  726. return OK;
  727. case SITE_MGR_RADIO_BAND_PARAM:
  728. if((INT8)pParam->content.siteMgrRadioBand < RADIO_BAND_2_4_GHZ ||
  729. (INT8)pParam->content.siteMgrRadioBand > RADIO_BAND_DUAL )
  730. return PARAM_VALUE_NOT_VALID;
  731. pSiteMgr->prevRadioBand = pSiteMgr->radioBand;
  732. pSiteMgr->radioBand = pParam->content.siteMgrRadioBand;
  733. if(pSiteMgr->prevRadioBand != pSiteMgr->radioBand)
  734. siteMgr_bandParamsConfig(pSiteMgr, FALSE);
  735. break;
  736. case SITE_MGR_DESIRED_SLOT_TIME_PARAM:
  737. if(pParam->content.siteMgrSlotTime != PHY_SLOT_TIME_LONG &&
  738. pParam->content.siteMgrSlotTime != PHY_SLOT_TIME_SHORT)
  739. return PARAM_VALUE_NOT_VALID;
  740. if(pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime != pParam->content.siteMgrSlotTime)
  741. {
  742. if(pSiteMgr->siteMgrOperationalMode == DOT11_G_MODE)
  743. {
  744. pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime = pParam->content.siteMgrSlotTime;
  745. if(!pPrimarySite)
  746. whalCtrl_SetSlotTime(pSiteMgr->hHalCtrl, pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime);
  747. else if(pPrimarySite->bssType != BSS_INFRASTRUCTURE)
  748. whalCtrl_SetSlotTime(pSiteMgr->hHalCtrl, pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime);
  749. }
  750. }
  751. return OK;
  752. case SITE_MGR_BEACON_FILTER_DESIRED_STATE_PARAM:
  753. {
  754. int desiredStateBeforeChange = pSiteMgr->beaconFilterParams.desiredState;
  755. /* Set the New Desired User request of Beacon Filter */
  756. pSiteMgr->beaconFilterParams.desiredState = pParam->content.siteMgrDesiredBeaconFilterState;
  757. /* Check if the Desired mode has changed - If not no need to send the MIB to the FW */
  758. if ( pSiteMgr->beaconFilterParams.desiredState == desiredStateBeforeChange )
  759. {
  760. WLAN_REPORT_DEBUG_CONTROL(pSiteMgr->hReport,
  761. ("Beacon Filter already %s" , (TRUE == desiredStateBeforeChange)? "ENABLED":"DISABLED" ) );
  762. break;
  763. }
  764. WLAN_REPORT_DEBUG_CONTROL(pSiteMgr->hReport,
  765. ("\n New Beacon Filter Desired State is : %s pSiteMgr->beaconFilterParams.currentState %s\n" , ( TRUE == (pSiteMgr->beaconFilterParams.desiredState) )?"ENABLED":"DISABLED",( TRUE == (pSiteMgr->beaconFilterParams.currentState) )?"ENABLED":"DISABLED"));
  766. /* Check if the new Desired state is TRUE then Also check the Current State and then if FALSEdo not send the MIB to FW*/
  767. if ( (TRUE == pSiteMgr->beaconFilterParams.desiredState ) && (FALSE == pSiteMgr->beaconFilterParams.currentState ))
  768. {
  769. WLAN_REPORT_DEBUG_CONTROL(pSiteMgr->hReport,
  770. ("\n New Beacon Filter Desired State is TRUE But Current State is DISABLED So the MIBwill be sent Later !!!!"));
  771. }
  772. /* In any other cases the User required Beacon Filter Configuration will be sent to FW immediately */
  773. else
  774. {
  775. WLAN_REPORT_DEBUG_CONTROL(pSiteMgr->hReport,
  776. ("\n New Sending Beacon Filter Desired State To FW !!!!"));
  777. whalCtrl_SetBeaconFiltering(pSiteMgr->hHalCtrl, pSiteMgr->beaconFilterParams.desiredState, pSiteMgr->beaconFilterParams.numOfStored);
  778. }
  779. }
  780. break;
  781. case SITE_MGR_DISASSOCIATE_PARAM:
  782. case SITE_MGR_DEAUTHENTICATE_PARAM:
  783. if(!pPrimarySite)
  784. return OK;
  785. else { /* Set Junk SSID */
  786. pSiteMgr->pDesiredParams->siteMgrDesiredSSID.len = 4;
  787. pSiteMgr->pDesiredParams->siteMgrDesiredSSID.ssidString[0]=1;
  788. pSiteMgr->pDesiredParams->siteMgrDesiredSSID.ssidString[1]=1;
  789. pSiteMgr->pDesiredParams->siteMgrDesiredSSID.ssidString[2]=1;
  790. pSiteMgr->pDesiredParams->siteMgrDesiredSSID.ssidString[3]=1;
  791. return RE_SCAN_NEEDED;
  792. }
  793. case SITE_MGR_BSSID_LIST_SCAN_PARAM:
  794. #if 0
  795. /* TODO - merge fix from WinCE version (and generalize it if time permits) */
  796. /* Must return NOK in each case the scan is not actually performed */
  797. if(!pPrimarySite)
  798. {
  799. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  800. ("Not connected to Network => do the BSSID_LIST_SCAN command\n"));
  801. smeSm_startScan(pSiteMgr->hSmeSm);
  802. }
  803. param.paramType = RX_DATA_COUNTERS_PARAM;
  804. rxData_getParam(pSiteMgr->hRxData, &param);
  805. /* get current received data frames counter */
  806. currRxPacketsCount = param.content.siteMgrTiWlanCounters.DirectedFramesRecv;
  807. if((pSiteMgr->rxPacketsCount + 1) < currRxPacketsCount)
  808. {
  809. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  810. ("Traffic is active now => ignoring the BSSID_LIST_SCAN command\n"));
  811. return NOK;
  812. }
  813. else
  814. {
  815. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  816. ("Traffic is not active now => do the BSSID_LIST_SCAN command\n"));
  817. smeSm_startScan(pSiteMgr->hSmeSm);
  818. }
  819. }
  820. #endif
  821. return OK;
  822. case SITE_MGR_LAST_RX_RATE_PARAM:
  823. if (pPrimarySite != NULL)
  824. {
  825. pPrimarySite->rxRate = pParam->content.ctrlDataCurrentBasicRate;
  826. }
  827. break;
  828. case SITE_MGR_CURRENT_CHANNEL_PARAM:
  829. if (!pPrimarySite)
  830. {
  831. return NO_SITE_SELECTED_YET;
  832. }
  833. pPrimarySite->channel = pParam->content.siteMgrCurrentChannel;
  834. break;
  835. case SITE_MGR_CURRENT_SIGNAL_PARAM:
  836. if (!pPrimarySite)
  837. {
  838. return NO_SITE_SELECTED_YET;
  839. }
  840. pPrimarySite->rssi = pParam->content.siteMgrCurrentSignal.rssi;
  841. break;
  842. default:
  843. WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Set param, Params is not supported, %d\n", pParam->paramType));
  844. return PARAM_NOT_SUPPORTED;
  845. }
  846. return OK;
  847. }
  848. /***********************************************************************
  849. * siteMgr_getParam
  850. ***********************************************************************
  851. DESCRIPTION: Site mgr get param function, called by the following:
  852. - config mgr in order to get a parameter from the OS abstraction layer.
  853. - From inside the dirver
  854. INPUT: hSiteMgr - site mgr handle.
  855. pParam - Pointer to the parameter
  856. OUTPUT:
  857. RETURN: OK on success, NOK otherwise
  858. ************************************************************************/
  859. TI_STATUS siteMgr_getParam(TI_HANDLE hSiteMgr,
  860. paramInfo_t *pParam)
  861. {
  862. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  863. siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
  864. TI_STATUS status = OK;
  865. UINT8 siteEntryIndex;
  866. UINT32 dtimInterval;
  867. UINT32 delta;
  868. whalParamInfo_t whalParam;
  869. switch(pParam->paramType)
  870. {
  871. case SITE_MGR_CONFIGURATION_PARAM:
  872. pParam->content.pSiteMgrConfiguration->Length = sizeof(OS_802_11_CONFIGURATION);
  873. pParam->content.pSiteMgrConfiguration->ATIMWindow = pSiteMgr->pDesiredParams->siteMgrDesiredAtimWindow;
  874. pParam->content.pSiteMgrConfiguration->BeaconPeriod = pSiteMgr->pDesiredParams->siteMgrDesiredBeaconInterval;
  875. pParam->content.pSiteMgrConfiguration->Union.channel =
  876. Chan2Freq(pSiteMgr->pDesiredParams->siteMgrDesiredChannel);
  877. /*pSiteMgr->pDesiredParams->siteMgrFreq2ChannelTable[pSiteMgr->pDesiredParams->siteMgrDesiredChannel];*/
  878. if(pPrimarySite) {
  879. pParam->content.pSiteMgrConfiguration->FHConfig.DwellTime = pPrimarySite->FHParams.dwellTime;
  880. pParam->content.pSiteMgrConfiguration->FHConfig.HopPattern = pPrimarySite->FHParams.hopPattern;
  881. pParam->content.pSiteMgrConfiguration->FHConfig.HopSet = pPrimarySite->FHParams.hopSet;
  882. }
  883. else {
  884. pParam->content.pSiteMgrConfiguration->FHConfig.DwellTime = 0;
  885. pParam->content.pSiteMgrConfiguration->FHConfig.HopPattern = 0;
  886. pParam->content.pSiteMgrConfiguration->FHConfig.HopSet = 0;
  887. }
  888. pParam->content.pSiteMgrConfiguration->FHConfig.Length = sizeof(OS_802_11_CONFIGURATION_FH);
  889. break;
  890. case SITE_MGR_DESIRED_CHANNEL_PARAM:
  891. pParam->content.siteMgrDesiredChannel = pSiteMgr->pDesiredParams->siteMgrDesiredChannel;
  892. break;
  893. case SITE_MGR_DESIRED_BSSID_PARAM:
  894. os_memoryCopy(pSiteMgr->hOs, &pParam->content.siteMgrDesiredBSSID, &pSiteMgr->pDesiredParams->siteMgrDesiredBSSID, sizeof(macAddress_t));
  895. break;
  896. case SITE_MGR_DESIRED_SSID_PARAM:
  897. os_memoryCopy(pSiteMgr->hOs, &pParam->content.siteMgrDesiredSSID, &pSiteMgr->pDesiredParams->siteMgrDesiredSSID, sizeof(ssid_t));
  898. break;
  899. case SITE_MGR_DESIRED_BSS_TYPE_PARAM:
  900. pParam->content.siteMgrDesiredBSSType = pSiteMgr->pDesiredParams->siteMgrDesiredBSSType;
  901. break;
  902. case SITE_MGR_DESIRED_SUPPORTED_RATE_SET_PARAM:
  903. getSupportedRateSet(pSiteMgr, &(pParam->content.siteMgrDesiredSupportedRateSet));
  904. break;
  905. case SITE_MGR_DESIRED_MODULATION_TYPE_PARAM:
  906. pParam->content.siteMgrDesiredModulationType = pSiteMgr->pDesiredParams->siteMgrDesiredModulationType;
  907. break;
  908. case SITE_MGR_DESIRED_BEACON_INTERVAL_PARAM:
  909. pParam->content.siteMgrDesiredBeaconInterval = pSiteMgr->pDesiredParams->siteMgrDesiredBeaconInterval;
  910. break;
  911. case SITE_MGR_DESIRED_PREAMBLE_TYPE_PARAM:
  912. pParam->content.siteMgrDesiredPreambleType = pSiteMgr->pDesiredParams->siteMgrDesiredPreambleType;
  913. break;
  914. case SITE_MGR_CURRENT_RADIO_TYPE_PARAM:
  915. pParam->content.siteMgrRadioType = pSiteMgr->pDesiredParams->siteMgrRadioValues.siteMgr_radioType;
  916. break;
  917. case SITE_MGR_CURRENT_SIGNAL_PARAM:
  918. if (!pPrimarySite)
  919. {
  920. pParam->content.siteMgrCurrentSignal.rssi = 0;
  921. pParam->content.siteMgrCurrentSignal.snr = 0;
  922. return NO_SITE_SELECTED_YET;
  923. }
  924. pParam->content.siteMgrCurrentSignal.rssi = pPrimarySite->rssi;
  925. pParam->content.siteMgrCurrentSignal.snr = pPrimarySite->snr;
  926. break;
  927. case SITE_MGR_POWER_CONSTRAINT_PARAM:
  928. if (!pPrimarySite)
  929. {
  930. pParam->content.powerConstraint = 0;
  931. return NO_SITE_SELECTED_YET;
  932. }
  933. pParam->content.powerConstraint = pPrimarySite->powerConstraint;
  934. break;
  935. case SITE_MGR_DTIM_PERIOD_PARAM:
  936. if (!pPrimarySite)
  937. {
  938. pParam->content.siteMgrDtimPeriod = 0;
  939. return NO_SITE_SELECTED_YET;
  940. }
  941. pParam->content.siteMgrDtimPeriod = pPrimarySite->dtimPeriod;
  942. break;
  943. case SITE_MGR_BEACON_RECV:
  944. if (!pPrimarySite)
  945. {
  946. pParam->content.siteMgrBeaconRecv = FALSE;
  947. return NO_SITE_SELECTED_YET;
  948. }
  949. pParam->content.siteMgrBeaconRecv = pPrimarySite->beaconRecv;
  950. break;
  951. case SITE_MGR_BEACON_INTERVAL_PARAM:
  952. if (!pPrimarySite)
  953. {
  954. pParam->content.beaconInterval = 0;
  955. return NO_SITE_SELECTED_YET;
  956. }
  957. pParam->content.beaconInterval = pPrimarySite->beaconInterval;
  958. break;
  959. case SITE_MGR_AP_TX_POWER_PARAM:
  960. if (!pPrimarySite)
  961. {
  962. pParam->content.APTxPower = 0;
  963. return NO_SITE_SELECTED_YET;
  964. }
  965. pParam->content.APTxPower = pPrimarySite->APTxPower;
  966. break;
  967. case SITE_MGR_SITE_CAPABILITY_PARAM:
  968. if (!pPrimarySite)
  969. {
  970. pParam->content.siteMgrSiteCapability = 0;
  971. return NO_SITE_SELECTED_YET;
  972. }
  973. pParam->content.siteMgrSiteCapability = pPrimarySite->capabilities;
  974. break;
  975. case SITE_MGR_4X_PARAM:
  976. if(!pPrimarySite)
  977. return NO_SITE_SELECTED_YET;
  978. pParam->content.siteMgrFourxParam = pPrimarySite->fourXsupported;
  979. break;
  980. case SITE_MGR_CURRENT_CHANNEL_PARAM:
  981. if (!pPrimarySite)
  982. {
  983. pParam->content.siteMgrCurrentChannel = 0;
  984. return NO_SITE_SELECTED_YET;
  985. }
  986. pParam->content.siteMgrCurrentChannel = pPrimarySite->channel;
  987. break;
  988. case SITE_MGR_CURRENT_SSID_PARAM:
  989. if (!pPrimarySite)
  990. {
  991. os_memoryZero(pSiteMgr->hOs, (void *)pParam->content.siteMgrCurrentSSID.ssidString, MAX_SSID_LEN);
  992. pParam->content.siteMgrCurrentSSID.len = 0;
  993. return NO_SITE_SELECTED_YET;
  994. }
  995. if(pPrimarySite->ssid.len == 0)
  996. WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("siteMgr_getParam: ssid length is zero, while primarySite is selected \n"));
  997. os_memoryCopy(pSiteMgr->hOs, &pParam->content.siteMgrCurrentSSID, &pPrimarySite->ssid, sizeof(ssid_t));
  998. break;
  999. case SITE_MGR_CURRENT_BSS_TYPE_PARAM:
  1000. if (!pPrimarySite)
  1001. {
  1002. pParam->content.siteMgrCurrentBSSType = pSiteMgr->pDesiredParams->siteMgrDesiredBSSType;
  1003. WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Trying to get current BSS Type while no site is selected\n"));
  1004. }
  1005. else{
  1006. pParam->content.siteMgrCurrentBSSType = pPrimarySite->bssType;
  1007. }
  1008. break;
  1009. case SITE_MGR_CURRENT_RATE_PAIR_PARAM:
  1010. if (!pPrimarySite)
  1011. {
  1012. pParam->content.siteMgrCurrentRateMask.basicRateMask = 0;
  1013. pParam->content.siteMgrCurrentRateMask.supportedRateMask = 0;
  1014. return NO_SITE_SELECTED_YET;
  1015. }
  1016. pParam->content.siteMgrCurrentRateMask.basicRateMask = pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask;
  1017. pParam->content.siteMgrCurrentRateMask.supportedRateMask = pSiteMgr->pDesiredParams->siteMgrMatchedSuppRateMask;
  1018. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  1019. ("SITE_MGR: bitmapBasicPrimary= 0x%X,bitMapBasicDesired = 0x%X,bitMapSuppPrimary = 0x%X, bitMapSuppDesired = 0x%X\n",
  1020. pPrimarySite->rateMask.basicRateMask,pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask,
  1021. pPrimarySite->rateMask.supportedRateMask,pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.supportedRateMask));
  1022. break;
  1023. case SITE_MGR_CURRENT_MODULATION_TYPE_PARAM:
  1024. if (!pPrimarySite)
  1025. {
  1026. pParam->content.siteMgrCurrentModulationType = DRV_MODULATION_NONE;
  1027. return NO_SITE_SELECTED_YET;
  1028. }
  1029. pParam->content.siteMgrCurrentModulationType = pSiteMgr->chosenModulation;
  1030. break;
  1031. case SITE_MGR_NEXT_DTIM_TIME_STAMP_PARAM:
  1032. if (!pPrimarySite)
  1033. {
  1034. pParam->content.siteMgrNextDtimTimeStamp = 0;
  1035. return NO_SITE_SELECTED_YET;
  1036. }
  1037. /* Convert TBTT to msec (*1024/1000) */
  1038. dtimInterval = (UINT32)pPrimarySite->beaconInterval * 1024 *
  1039. (UINT32)pPrimarySite->dtimPeriod / 1000 ;
  1040. delta = os_timeStampMs(pSiteMgr->hOs) - pPrimarySite->dtimTimeStamp;
  1041. if(delta < dtimInterval)
  1042. delta = 0;
  1043. pParam->content.siteMgrNextDtimTimeStamp = pPrimarySite->dtimTimeStamp + dtimInterval + delta;
  1044. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  1045. ("Get DTIM - dtimTimeStamp=%d, dtimInterval=%d, delta=%d\n",
  1046. pPrimarySite->dtimTimeStamp, dtimInterval, delta));
  1047. break;
  1048. case SITE_MGR_DESIRED_SLOT_TIME_PARAM:
  1049. pParam->content.siteMgrSlotTime = pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime;
  1050. break;
  1051. case SITE_MGR_CURRENT_SLOT_TIME_PARAM:
  1052. if(pSiteMgr->siteMgrOperationalMode == DOT11_G_MODE)
  1053. {
  1054. if(!pPrimarySite)
  1055. pParam->content.siteMgrSlotTime = pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime;
  1056. else
  1057. pParam->content.siteMgrSlotTime = pPrimarySite->currentSlotTime;
  1058. }
  1059. else if(pSiteMgr->siteMgrOperationalMode == DOT11_A_MODE)
  1060. pParam->content.siteMgrSlotTime = PHY_SLOT_TIME_SHORT;
  1061. else
  1062. pParam->content.siteMgrSlotTime = PHY_SLOT_TIME_LONG;
  1063. break;
  1064. case SITE_MGR_BSSID_LIST_PARAM:
  1065. if (pParam->paramLength == 0)
  1066. {
  1067. calculateBssidListSize(pSiteMgr, &pParam->paramLength, FALSE);
  1068. return NOK;
  1069. }
  1070. else
  1071. {
  1072. status = getBssidList(pSiteMgr, pParam->content.pSiteMgrBssidList, &pParam->paramLength, FALSE);
  1073. }
  1074. break;
  1075. case SITE_MGR_BSSID_FULL_LIST_PARAM:
  1076. if (pParam->paramLength == 0)
  1077. {
  1078. calculateBssidListSize(pSiteMgr, &pParam->paramLength, TRUE);
  1079. return NOK;
  1080. }
  1081. else
  1082. {
  1083. status = getBssidList(pSiteMgr, pParam->content.pSiteMgrBssidList, &pParam->paramLength, TRUE);
  1084. }
  1085. break;
  1086. case SITE_MGR_LAST_BEACON_BUF_PARAM:
  1087. if (pPrimarySite != NULL)
  1088. {
  1089. if (pPrimarySite->probeRecv)
  1090. {
  1091. pParam->content.siteMgrLastBeacon.isBeacon = FALSE;
  1092. pParam->content.siteMgrLastBeacon.bufLength = pPrimarySite->probeRespLength;
  1093. pParam->content.siteMgrLastBeacon.buffer = pPrimarySite->probeRespBuffer;
  1094. }
  1095. else
  1096. {
  1097. pParam->content.siteMgrLastBeacon.isBeacon = TRUE;
  1098. pParam->content.siteMgrLastBeacon.bufLength = pPrimarySite->beaconLength;
  1099. pParam->content.siteMgrLastBeacon.buffer = pPrimarySite->beaconBuffer;
  1100. }
  1101. }
  1102. break;
  1103. case SITE_MGR_BEACON_FILTER_DESIRED_STATE_PARAM:
  1104. {
  1105. if ( NULL != pSiteMgr )
  1106. {
  1107. pParam->content.siteMgrDesiredBeaconFilterState = pSiteMgr->beaconFilterParams.desiredState;
  1108. }
  1109. else
  1110. {
  1111. WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG ,("pSite = NULL ! No info available"));
  1112. }
  1113. }
  1114. break;
  1115. case SITE_MGR_GET_SELECTED_BSSID_INFO:
  1116. getPrimarySiteDesc(pSiteMgr, pParam->content.pSiteMgrPrimarySiteDesc, FALSE);
  1117. break;
  1118. case SITE_MGR_PRIMARY_SITE_PARAM:
  1119. status = getPrimaryBssid(pSiteMgr, (OS_802_11_BSSID_EX *)pParam->content.pSiteMgrSelectedSiteInfo, &pParam->paramLength);
  1120. break;
  1121. case SITE_MGR_TI_WLAN_COUNTERS_PARAM:
  1122. pParam->paramType = RX_DATA_COUNTERS_PARAM;
  1123. rxData_getParam(pSiteMgr->hRxData, pParam);
  1124. whalParam.paramType = HAL_CTRL_COUNTERS_PARAM;
  1125. whalCtrl_GetParam(pSiteMgr->hHalCtrl, &whalParam);
  1126. pParam->content.siteMgrTiWlanCounters.RecvNoBuffer = whalParam.content.halCtrlCounters.RecvNoBuffer;
  1127. pParam->content.siteMgrTiWlanCounters.FragmentsRecv = whalParam.content.halCtrlCounters.FragmentsRecv;
  1128. pParam->content.siteMgrTiWlanCounters.FrameDuplicates = whalParam.content.halCtrlCounters.FrameDuplicates;
  1129. pParam->content.siteMgrTiWlanCounters.FcsErrors = whalParam.content.halCtrlCounters.FcsErrors;
  1130. pParam->content.siteMgrTiWlanCounters.RecvError = whalParam.content.halCtrlCounters.RecvError;
  1131. pParam->paramType = AUTH_COUNTERS_PARAM;
  1132. auth_getParam(pSiteMgr->hAuth, pParam);
  1133. pParam->paramType = ASSOC_COUNTERS_PARAM;
  1134. assoc_getParam(pSiteMgr->hAssoc, pParam);
  1135. pParam->content.siteMgrTiWlanCounters.BeaconsXmit = pSiteMgr->beaconSentCount;
  1136. break;
  1137. case SITE_MGR_EEPROM_VERSION_PARAM:
  1138. os_memoryCopy(pSiteMgr->hOs, &(pParam->content.siteMgrEEpromVersion), &(pSiteMgr->pDesiredParams->siteMgrEEpromVersion), sizeof(e2Version_t));
  1139. break;
  1140. case SITE_MGR_FIRMWARE_VERSION_PARAM:
  1141. os_memoryCopy(pSiteMgr->hOs, &(pParam->content.siteMgrFwVersion), &(pSiteMgr->pDesiredParams->siteMgrFwVersion), FW_VERSION_LEN);
  1142. break;
  1143. case SITE_MGR_DESIRED_TX_RATE_PARAM:
  1144. pParam->content.siteMgrDesiredTxRate = hostToUtilityRate(pSiteMgr->pDesiredParams->siteMgrCurrentDesiredTxRate);
  1145. break;
  1146. case SITE_MGR_CURRENT_TX_RATE_PARAM:
  1147. /* Collect txAttr from control */
  1148. { txData_attr_t txAttr;
  1149. ctrlData_getTxAttributes(pSiteMgr->hCtrlData, TX_DATA_DATA_MSDU, &txAttr, QOS_AC_BE);
  1150. pParam->content.siteMgrCurrentTxRate = hostToUtilityRate( txAttr.Rate );
  1151. }
  1152. break;
  1153. case SITE_MGR_DESIRED_DOT11_MODE_PARAM:
  1154. pParam->content.siteMgrDot11Mode = pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode;
  1155. break;
  1156. case SITE_MGR_NETWORK_TYPE_IN_USE:
  1157. if (pPrimarySite)
  1158. { /* Connected - return the current mode */
  1159. pParam->content.siteMgrDot11Mode = pSiteMgr->siteMgrOperationalMode;
  1160. }
  1161. else
  1162. { /* Disconnected - return the desired mode */
  1163. pParam->content.siteMgrDot11Mode = pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode;
  1164. }
  1165. break;
  1166. case SITE_MGR_OPERATIONAL_MODE_PARAM:
  1167. pParam->content.siteMgrDot11OperationalMode = pSiteMgr->siteMgrOperationalMode;
  1168. break;
  1169. case SITE_MGR_USE_DRAFT_NUM_PARAM:
  1170. pParam->content.siteMgrUseDraftNum = pSiteMgr->pDesiredParams->siteMgrUseDraftNum;
  1171. break;
  1172. case SITE_MGR_RADIO_BAND_PARAM:
  1173. pParam->content.siteMgrRadioBand = pSiteMgr->radioBand;
  1174. break;
  1175. case SITE_MGR_CURRENT_PREAMBLE_TYPE_PARAM:
  1176. if (!pPrimarySite)
  1177. return NO_SITE_SELECTED_YET;
  1178. pParam->content.siteMgrCurrentPreambleType = pPrimarySite->currentPreambleType;
  1179. break;
  1180. case SITE_MGR_CURRENT_BSSID_PARAM:
  1181. if (pPrimarySite != NULL)
  1182. {
  1183. os_memoryCopy(pSiteMgr->hOs, (void *)pParam->content.siteMgrDesiredBSSID.addr, (void *)pPrimarySite->bssid.addr, MAC_ADDR_LEN);
  1184. }
  1185. break;
  1186. case SITE_MGR_LAST_RX_RATE_PARAM:
  1187. if (pPrimarySite != NULL)
  1188. {
  1189. pParam->content.ctrlDataCurrentBasicRate = pPrimarySite->rxRate;
  1190. }
  1191. break;
  1192. case SITE_MGR_PREV_SITE_BSSID_PARAM:
  1193. if (pSiteMgr->pSitesMgmtParams->pPrevPrimarySite==NULL)
  1194. {
  1195. return NOK;
  1196. }
  1197. os_memoryCopy(pSiteMgr->hOs, (void *)pParam->content.siteMgrDesiredBSSID.addr, (void *)pSiteMgr->pSitesMgmtParams->pPrevPrimarySite->bssid.addr, MAC_ADDR_LEN);
  1198. break;
  1199. case SITE_MGR_PREV_SITE_SSID_PARAM:
  1200. if (pSiteMgr->pSitesMgmtParams->pPrevPrimarySite==NULL)
  1201. {
  1202. return NOK;
  1203. }
  1204. pParam->content.siteMgrDesiredSSID.len = pSiteMgr->pSitesMgmtParams->pPrevPrimarySite->ssid.len;
  1205. os_memoryCopy(pSiteMgr->hOs, (void *)pParam->content.siteMgrDesiredSSID.ssidString, (void *)pSiteMgr->pSitesMgmtParams->pPrevPrimarySite->ssid.ssidString, pSiteMgr->pSitesMgmtParams->pPrevPrimarySite->ssid.len);
  1206. break;
  1207. case SITE_MGR_PREV_SITE_CHANNEL_PARAM:
  1208. if (pSiteMgr->pSitesMgmtParams->pPrevPrimarySite==NULL)
  1209. {
  1210. return NOK;
  1211. }
  1212. pParam->content.siteMgrDesiredChannel = pSiteMgr->pSitesMgmtParams->pPrevPrimarySite->channel;
  1213. break;
  1214. case SITE_MGR_SITE_ENTRY_BY_INDEX:
  1215. siteEntryIndex = pParam->content.siteMgrIndexOfDesiredSiteEntry;
  1216. if(siteEntryIndex >= MAX_SITES_BG_BAND)
  1217. {
  1218. return NOK;
  1219. }
  1220. pParam->content.pSiteMgrDesiredSiteEntry =
  1221. (UINT8*)(&(pSiteMgr->pSitesMgmtParams->pCurrentSiteTable->siteTable[siteEntryIndex]));
  1222. break;
  1223. case SITE_MGR_CUR_NUM_OF_SITES:
  1224. pParam->content.siteMgrNumberOfSites = pSiteMgr->pSitesMgmtParams->pCurrentSiteTable->numOfSites;
  1225. break;
  1226. case SITE_MGR_CURRENT_TSF_TIME_STAMP:
  1227. os_memoryCopy(pSiteMgr->hOs, pParam->content.siteMgrCurrentTsfTimeStamp,
  1228. pSiteMgr->pSitesMgmtParams->pPrimarySite->tsfTimeStamp,
  1229. TIME_STAMP_LEN);
  1230. break;
  1231. case SITE_MGR_GET_AP_QOS_CAPABILITIES:
  1232. if (!pPrimarySite)
  1233. {
  1234. pParam->content.qosApCapabilities.uQOSFlag = 0;
  1235. pParam->content.qosApCapabilities.uAPSDFlag = 0;
  1236. return NOT_CONNECTED;
  1237. }
  1238. pParam->content.qosApCapabilities.uQOSFlag = pPrimarySite->WMESupported;
  1239. pParam->content.qosApCapabilities.uAPSDFlag = pPrimarySite->APSDSupport;
  1240. break;
  1241. default:
  1242. {
  1243. UINT8* ptr = NULL;
  1244. WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Get param, Params is not supported, %d\n", pParam->paramType));
  1245. *ptr=3;
  1246. }
  1247. return PARAM_NOT_SUPPORTED;
  1248. }
  1249. return status;
  1250. }
  1251. /***********************************************************************
  1252. * calculateHwGenTxRate
  1253. ***********************************************************************
  1254. DESCRIPTION: Service routine, which calculates the HW generated frames rate
  1255. to be used.
  1256. INPUT: basicBitMap - bit map of basic rates
  1257. mode - operating mode
  1258. OUTPUT:
  1259. RETURN: rate
  1260. ************************************************************************/
  1261. void calculateHwGenTxRate(siteMgr_t *pSiteMgr, rate_e *rate)
  1262. {
  1263. UINT32 rateBitMap = 0;
  1264. modulationType_e modulation = DRV_MODULATION_NONE; /* Not used */
  1265. mgmtCtrlTxRateOption_e mgmtCtrlTxRateOption = pSiteMgr->pDesiredParams->siteMgrRegstryDesiredMgmtCtrlTxRateOption;
  1266. UINT32 mgmtCtrlDesiredTxRateBitMap = ((0x01) << (pSiteMgr->pDesiredParams->siteMgrRegstryDesiredMgmtCtrlTxRate -1));
  1267. /* ratebitmap is the matched basic rate from the STA and AP */
  1268. if (pSiteMgr->pSitesMgmtParams->pPrimarySite->channel == SPECIAL_BG_CHANNEL)
  1269. {
  1270. rateBitMap = (UINT16)getBasicRateMaskForSpecialBGchannel() ;
  1271. }
  1272. else
  1273. {
  1274. rateBitMap = pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask;
  1275. }
  1276. /* Check if the user request specific Rate */
  1277. if(mgmtCtrlTxRateOption == SPECIFIC_TX_RATE)
  1278. {
  1279. /* If the required rate is included in the matched basic rate, this specific rate is the only one to use */
  1280. if(rateBitMap & mgmtCtrlDesiredTxRateBitMap)
  1281. {
  1282. rateBitMap = mgmtCtrlDesiredTxRateBitMap;
  1283. }
  1284. else
  1285. {
  1286. /* If the specific required Tx Rate is not in the basic rate => Use Max basic rate */
  1287. mgmtCtrlTxRateOption = MAX_BASIC_TX_RATE;
  1288. }
  1289. }
  1290. /* Now calculate HW Tx rate according to the rate bitmap */
  1291. if(mgmtCtrlTxRateOption == MAX_BASIC_TX_RATE)
  1292. getMaxRate(rateBitMap,rate,&modulation,pSiteMgr->siteMgrOperationalMode);
  1293. else
  1294. {
  1295. /* If we are here , means: The mgmtCtrlTxRateOption is either MIN_BASIC_TX_RATE or SPECIFIC_TX_RATE. */
  1296. getMinRate(rateBitMap,rate,&modulation,pSiteMgr->siteMgrOperationalMode);
  1297. }
  1298. }
  1299. /***********************************************************************
  1300. * siteMgr_join
  1301. ***********************************************************************
  1302. DESCRIPTION: Called by the connection state machine in order to join a BSS.
  1303. - If the BSS is infrastructure, sets a NULL data template to the HAL
  1304. - If the BSS is IBSS, sets a probe response & beacon template to the HAL
  1305. Call the HAL with the join parameters
  1306. INPUT: hSiteMgr - site mgr handle.
  1307. JoinCompleteCB - join command complete callback function ptr
  1308. CB_handle - handle to pass to callback function
  1309. OUTPUT:
  1310. RETURN: OK on success, NOK otherwise
  1311. ************************************************************************/
  1312. TI_STATUS siteMgr_join(TI_HANDLE hSiteMgr)
  1313. {
  1314. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  1315. siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
  1316. rate_e rate;
  1317. paramInfoPartial_t param;
  1318. if (pPrimarySite == NULL)
  1319. {
  1320. WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Join BSS, Primary Site is NULL\n"));
  1321. return OK;
  1322. }
  1323. /* Configure the system according to parameters of Primary Site */
  1324. systemConfig(pSiteMgr);
  1325. joinParams.bssType = pPrimarySite->bssType;
  1326. joinParams.beaconInterval = pPrimarySite->beaconInterval;
  1327. joinParams.dtimInterval = pPrimarySite->dtimPeriod;
  1328. joinParams.pBSSID = (UINT8 *)&(pPrimarySite->bssid.addr);
  1329. joinParams.pSSID = (UINT8 *)&(pPrimarySite->ssid.ssidString);
  1330. joinParams.ssidLength = pPrimarySite->ssid.len;
  1331. joinParams.channel = pPrimarySite->channel;
  1332. if (joinParams.channel == SPECIAL_BG_CHANNEL)
  1333. {
  1334. joinParams.basicRateSet = (UINT16)getBasicRateMaskForSpecialBGchannel() ;
  1335. joinParams.supportedRateSet = (UINT16)getSupportedRateMaskForSpecialBGchannel() ;
  1336. }
  1337. else /* != SPECIAL_BG_CHANNEL */
  1338. {
  1339. joinParams.basicRateSet = (UINT16)pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask;
  1340. joinParams.supportedRateSet = (UINT16)pSiteMgr->pDesiredParams->siteMgrMatchedSuppRateMask;
  1341. }
  1342. calculateHwGenTxRate(pSiteMgr, &rate);
  1343. joinParams.hwGenCtrlTxRate = rate;
  1344. param.paramType = CTRL_DATA_CURRENT_PREAMBLE_TYPE_PARAM;
  1345. ctrlData_getParamPartial(pSiteMgr->hCtrlData, &param);
  1346. joinParams.preamble = param.content.ctrlDataCurrentPreambleType;
  1347. /*set the preamble before the join*/
  1348. whalCtrl_SetPreamble(pSiteMgr->hHalCtrl, joinParams.preamble);
  1349. /*
  1350. * Set the radio band and the HW management Tx rate according to operational mode.
  1351. * The HW management frames includes Beacon and Probe-Response (in IBSS).
  1352. */
  1353. if(pSiteMgr->siteMgrOperationalMode == DOT11_A_MODE)
  1354. {
  1355. joinParams.radioBand = RADIO_BAND_5_0_GHZ;
  1356. joinParams.hwGenMgmtTxRate = DRV_RATE_6M;
  1357. }
  1358. else
  1359. {
  1360. joinParams.radioBand = RADIO_BAND_2_4_GHZ;
  1361. joinParams.hwGenMgmtTxRate = DRV_RATE_2M;
  1362. }
  1363. /* Now, Set templates to the HAL */
  1364. if (pPrimarySite->bssType == BSS_INDEPENDENT)
  1365. {
  1366. templateStruct.pTemplate = (UINT8 *)&probeRspTemplate;
  1367. templateStruct.templateType = PROBE_RESPONSE_TEMPLATE;
  1368. buildProbeRspTemplate(pSiteMgr, &templateStruct);
  1369. whalCtrl_SetTemplate(pSiteMgr->hHalCtrl, &templateStruct);
  1370. /* We don't have to build a beacon template, because it is equal to probe response,
  1371. we only have to change the frame sup type */
  1372. probeRspTemplate.hdr.fc = ENDIAN_HANDLE_WORD(DOT11_FC_BEACON);
  1373. templateStruct.templateType = BEACON_TEMPLATE;
  1374. whalCtrl_SetTemplate(pSiteMgr->hHalCtrl, &templateStruct);
  1375. }
  1376. else
  1377. {
  1378. templateStruct.pTemplate = (UINT8 *)&nullDataTemplate;
  1379. templateStruct.templateType = NULL_DATA_TEMPLATE;
  1380. buildNullTemplate(pSiteMgr, &templateStruct);
  1381. whalCtrl_SetTemplate(pSiteMgr->hHalCtrl, &templateStruct);
  1382. /* Send PsPoll template to HAL */
  1383. templateStruct.pTemplate = (UINT8 *)&psPollTemplate;
  1384. templateStruct.templateType = PS_POLL_TEMPLATE;
  1385. buildPsPollTemplate(pSiteMgr, &templateStruct);
  1386. whalCtrl_SetTemplate(pSiteMgr->hHalCtrl, &templateStruct);
  1387. /* Set QOS Null data template to the firmware.
  1388. Note: the AC to use with this template may change in QoS-manager. */
  1389. templateStruct.pTemplate = (UINT8 *)&QosNullDataTemplate;
  1390. templateStruct.templateType = QOS_NULL_DATA_TEMPLATE;
  1391. buildQosNullDataTemplate(pSiteMgr, &templateStruct, 0);
  1392. whalCtrl_SetTemplate(pSiteMgr->hHalCtrl, &templateStruct);
  1393. }
  1394. /* Reset the Tx Power Control adjustment in RegulatoryDomain */
  1395. siteMgr_setTemporaryTxPower(pSiteMgr, FALSE);
  1396. /*
  1397. clear the beacon receive flag to indicates when receive a beacon after the join command.
  1398. need for PowerMgr_startPS() - must be called only after join command and then only after
  1399. receiving beacon of the primary site!
  1400. */
  1401. pPrimarySite->beaconReceiveAfterJoin = FALSE;
  1402. /* Stop Tx till geting Join Event complete */
  1403. txData_disableTransmission(pSiteMgr->hTxData, DISABLE_IMMEDIATELY);
  1404. /* This is the forbidden period to enable the current state from the cli, even if desired state is TRUE */
  1405. /* Also This is set to FALSE since the First Beaqcin shall be received for the Power Manager */
  1406. pSiteMgr->beaconFilterParams.currentState = FALSE;
  1407. whalCtrl_SetBeaconFiltering(pSiteMgr->hHalCtrl, FALSE, pSiteMgr->beaconFilterParams.numOfStored);
  1408. WLAN_REPORT_INFORMATION(pSiteMgr->hReport , SITE_MGR_MODULE_LOG , ("-- Beacon Filter Active Mode Disable Beacon Filtering !!! --\n"));
  1409. return (TI_STATUS)whalCtrl_JoinBss (((siteMgr_t *)hSiteMgr)->hHalCtrl, &joinParams);
  1410. }
  1411. /***********************************************************************
  1412. * siteMgr_forceInfraJoin
  1413. ***********************************************************************
  1414. DESCRIPTION: Called by the connection state machine in order to join a BSS.
  1415. - If the BSS is infrastructure, sets a NULL data template to the HAL
  1416. - If the BSS is IBSS, sets a probe response & beacon template to the HAL
  1417. Call the HAL with the join parameters
  1418. INPUT: hSiteMgr - site mgr handle.
  1419. JoinCompleteCB - join command complete callback function ptr
  1420. CB_handle - handle to pass to callback function
  1421. OUTPUT:
  1422. RETURN: OK on success, NOK otherwise
  1423. ************************************************************************/
  1424. TI_STATUS siteMgr_forceInfraJoin(TI_HANDLE hSiteMgr)
  1425. {
  1426. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  1427. whalCtrl_joinBss_t joinParams;
  1428. UINT8 junkBSSID[MAC_ADDR_LEN] = {0xAA,0xAA,0xAA,0xAA,0xAA,0xAA};
  1429. UINT8 junkSSID[1] = {0x01};
  1430. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Force INFRA Join\n"));
  1431. joinParams.bssType = BSS_INFRASTRUCTURE;
  1432. joinParams.beaconInterval = 200;
  1433. joinParams.dtimInterval = 3;
  1434. joinParams.pBSSID = (UINT8 *)junkBSSID;
  1435. joinParams.pSSID = (UINT8 *)junkSSID;
  1436. joinParams.ssidLength = 1;
  1437. joinParams.channel = 11;
  1438. joinParams.basicRateSet = (UINT16)pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask;
  1439. joinParams.supportedRateSet = (UINT16)pSiteMgr->pDesiredParams->siteMgrMatchedSuppRateMask;
  1440. joinParams.hwGenCtrlTxRate = DRV_RATE_2M;
  1441. joinParams.hwGenMgmtTxRate = DRV_RATE_2M;
  1442. joinParams.preamble = PREAMBLE_LONG;
  1443. if(pSiteMgr->siteMgrOperationalMode == DOT11_A_MODE)
  1444. joinParams.radioBand = RADIO_BAND_5_0_GHZ;
  1445. else
  1446. joinParams.radioBand = RADIO_BAND_2_4_GHZ;
  1447. /* Stop Tx till geting Join Event complete */
  1448. txData_disableTransmission(pSiteMgr->hTxData, DISABLE_IMMEDIATELY);
  1449. return (TI_STATUS)whalCtrl_JoinBss (((siteMgr_t *)hSiteMgr)->hHalCtrl, &joinParams);
  1450. }
  1451. /***********************************************************************
  1452. * siteMgr_disJoin
  1453. ***********************************************************************
  1454. DESCRIPTION: Called by the connection state machine in order to dis join a BSS.
  1455. INPUT: hSiteMgr - site mgr handle.
  1456. OUTPUT:
  1457. RETURN: OK on success, NOK otherwise
  1458. ************************************************************************/
  1459. TI_STATUS siteMgr_disJoin(TI_HANDLE hSiteMgr)
  1460. {
  1461. #if 0
  1462. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  1463. whalCtrl_joinBss_t joinParams;
  1464. macAddress_t dummyMac = {0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD};
  1465. ssid_t dummySsid;
  1466. joinParams.bssType = BSS_INFRASTRUCTURE;
  1467. joinParams.beaconInterval = SITE_MGR_BEACON_INTERVAL_DEF;
  1468. joinParams.dtimInterval = 1;
  1469. joinParams.channel = SITE_MGR_CHANNEL_DEF;
  1470. joinParams.pBSSID = (UINT8 *)&(dummyMac.addr);
  1471. dummySsid.len = 2;
  1472. os_memoryCopy(pSiteMgr->hOs, dummySsid.ssidString, "TI_WLAN", 7);
  1473. joinParams.pSSID = (UINT8 *)&(dummySsid.ssidString);
  1474. joinParams.ssidLength = dummySsid.len;
  1475. joinParams.basicRateSet = buildRatesBitMap(pSiteMgr, SITE_MGR_DEF_RATE_SET_MAX_BASIC_DEF);
  1476. joinParams.supportedRateSet = buildRatesBitMap(pSiteMgr, SITE_MGR_DEF_RATE_SET_MAX_ACTIVE_DEF);
  1477. return whalCtrl_JoinBss (((siteMgr_t *)hSiteMgr)->hHalCtrl, &joinParams);
  1478. #else
  1479. return OK;
  1480. #endif
  1481. }
  1482. /***********************************************************************
  1483. * siteMgr_removeSelfSite
  1484. ***********************************************************************
  1485. DESCRIPTION: Called by the Self connection state machine in order to remove the self site from the site table.
  1486. Remove the site entry form the table and reset the primary site pointer
  1487. INPUT: hSiteMgr - site mgr handle.
  1488. OUTPUT:
  1489. RETURN: OK on success, NOK otherwise
  1490. ************************************************************************/
  1491. TI_STATUS siteMgr_removeSelfSite(TI_HANDLE hSiteMgr)
  1492. {
  1493. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  1494. siteTablesParams_t *currTable = pSiteMgr->pSitesMgmtParams->pCurrentSiteTable;
  1495. if(pSiteMgr->pSitesMgmtParams->pPrimarySite == NULL)
  1496. {
  1497. WLAN_REPORT_WARNING(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Remove self site Failure, pointer is NULL\n\n"));
  1498. return OK;
  1499. }
  1500. if(pSiteMgr->pSitesMgmtParams->pPrimarySite->siteType != SITE_SELF)
  1501. {
  1502. WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Remove self site Failure, site is not self\n\n"));
  1503. return OK;
  1504. }
  1505. removeSiteEntry(pSiteMgr, currTable, pSiteMgr->pSitesMgmtParams->pPrimarySite);
  1506. pSiteMgr->pSitesMgmtParams->pPrimarySite = NULL;
  1507. return OK;
  1508. }
  1509. /***********************************************************************
  1510. * siteMgr_updateSite
  1511. ***********************************************************************
  1512. DESCRIPTION: Called by the MLME parser upon receiving a beacon or probe response.
  1513. Performs the following:
  1514. - Insert the site entry into the site hash table
  1515. - Update the site information in the site table
  1516. - If the site is the primary site, it handles the PBCC algorithm if needed
  1517. - If the site is NULL (means it is the first frame received from this site)
  1518. we update the site type to be regular
  1519. - If the site type is self, we inform the self connection SM
  1520. that another station joined the network we created
  1521. INPUT: hSiteMgr - site mgr handle.
  1522. bssid - BSSID received
  1523. pFrameInfo - Frame content after the parsing
  1524. rxChannel - The channel on which frame was received
  1525. band - Band on which frame was received
  1526. measuring - Determines whether the beacon or probe response
  1527. has been received while a beacon measurement
  1528. took place
  1529. OUTPUT:
  1530. RETURN: OK on success, NOK otherwise
  1531. ************************************************************************/
  1532. TI_STATUS siteMgr_updateSite(TI_HANDLE hSiteMgr,
  1533. macAddress_t *bssid,
  1534. mlmeFrameInfo_t *pFrameInfo,
  1535. UINT8 rxChannel,
  1536. radioBand_e band,
  1537. BOOL measuring)
  1538. {
  1539. siteEntry_t *pSite;
  1540. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  1541. paramInfo_t param;
  1542. /* The following is not required, since the scanCncn is responsible to check
  1543. the channels validity before scanning.
  1544. The problem it caused was that when 802.11d is enabled,
  1545. channels that are valid for Passive only, will not be updated.*/
  1546. /*if (isChannelSupprted(pSiteMgr->hRegulatoryDomain , rxChannel) == FALSE)
  1547. {
  1548. WLAN_REPORT_WARNING(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  1549. ("Channel ERROR - try to register a site that its channel (=%d) isn't in the regulatory domain.\n\
  1550. registration ABORTED!!!",
  1551. rxChannel));
  1552. return NOK;
  1553. }*/
  1554. pSite = findAndInsertSiteEntry(pSiteMgr, bssid, band);
  1555. if (pSite == NULL)
  1556. {
  1557. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Site Update failure, table is full, bssid: %X-%X-%X-%X-%X-%X\n", bssid->addr[0], bssid->addr[1], bssid->addr[2], bssid->addr[3], bssid->addr[4], bssid->addr[5]));
  1558. return OK;
  1559. }
  1560. updateSiteInfo(pSiteMgr, pFrameInfo, pSite, rxChannel);
  1561. if (measuring != FALSE)
  1562. {
  1563. pSite->detectedWhileMeasuring = TRUE;
  1564. }
  1565. switch(pSite->siteType)
  1566. {
  1567. case SITE_PRIMARY:
  1568. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_UPDATE_MODULE_LOG, ("PRIMARY site updated, bssid: %X-%X-%X-%X-%X-%X\n\n", bssid->addr[0], bssid->addr[1], bssid->addr[2], bssid->addr[3], bssid->addr[4], bssid->addr[5]));
  1569. if (pSiteMgr->pSitesMgmtParams->pPrimarySite == NULL)
  1570. {
  1571. WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("siteMgr_updateSite: Primary Site Is NULL\n"));
  1572. pSite->siteType = SITE_REGULAR;
  1573. break;
  1574. }
  1575. /* Now, if the following is TRUE we perform the PBCC algorithm: */
  1576. /* If the BSS type is infrastructure, &&
  1577. The chosen modulation is PBCC &&
  1578. The beacon modulation is not NONE &&
  1579. The current data modulation is different than the beacon modulation. */
  1580. if ((pSite->bssType == BSS_INFRASTRUCTURE) &&
  1581. (pSiteMgr->chosenModulation == DRV_MODULATION_PBCC) &&
  1582. (pSite->beaconModulation != DRV_MODULATION_NONE) &&
  1583. (pSiteMgr->currentDataModulation != pSite->beaconModulation))
  1584. {
  1585. pSiteMgr->currentDataModulation = pSite->beaconModulation;
  1586. pbccAlgorithm(pSiteMgr);
  1587. }
  1588. /* Now handle the slot time, first check if the slot time changed since the last
  1589. setting to the HAL ,and if yes set the new value */
  1590. if((pSiteMgr->siteMgrOperationalMode == DOT11_G_MODE) &&
  1591. (pSite->bssType == BSS_INFRASTRUCTURE))
  1592. {
  1593. if (pSite->currentSlotTime != pSite->newSlotTime)
  1594. {
  1595. pSite->currentSlotTime = pSite->newSlotTime;
  1596. whalCtrl_SetSlotTime(pSiteMgr->hHalCtrl, pSite->currentSlotTime);
  1597. }
  1598. }
  1599. /* Now handle the current protection status */
  1600. if((pSiteMgr->siteMgrOperationalMode == DOT11_G_MODE) &&
  1601. (pSite->bssType == BSS_INFRASTRUCTURE))
  1602. {
  1603. param.paramType = CTRL_DATA_CURRENT_PROTECTION_STATUS_PARAM;
  1604. param.content.ctrlDataProtectionEnabled = pSite->useProtection;
  1605. ctrlData_setParam(pSiteMgr->hCtrlData, &param);
  1606. }
  1607. /* Now handle the current preamble type,
  1608. if desired preamble type is long, the ctrl data param should not be changed */
  1609. if((pSiteMgr->siteMgrOperationalMode == DOT11_G_MODE) &&
  1610. (pSite->bssType == BSS_INFRASTRUCTURE) &&
  1611. (pSiteMgr->pDesiredParams->siteMgrDesiredPreambleType != PREAMBLE_LONG))
  1612. {
  1613. param.paramType = CTRL_DATA_CURRENT_PREAMBLE_TYPE_PARAM;
  1614. if((pSite->preambleAssRspCap == PREAMBLE_LONG) ||
  1615. (pSite->barkerPreambleType == PREAMBLE_LONG))
  1616. {
  1617. param.content.ctrlDataCurrentPreambleType = PREAMBLE_LONG;
  1618. }
  1619. else
  1620. param.content.ctrlDataCurrentPreambleType = PREAMBLE_SHORT;
  1621. ctrlData_setParam(pSiteMgr->hCtrlData, &param);
  1622. }
  1623. /*
  1624. * NOTE: THIS MUST BE AFTER SETTING PREAMBLE TYPE
  1625. */
  1626. if (pSiteMgr->chosenModulation != DRV_MODULATION_PBCC)
  1627. {
  1628. if (pSiteMgr->pDesiredParams->siteMgrCurrentDesiredTxRate == DRV_RATE_AUTO)
  1629. {
  1630. param.paramType = CTRL_DATA_RATE_CONTROL_ENABLE_PARAM;
  1631. param.content.ctrlDataRateControlEnable = TRUE;
  1632. ctrlData_setParam(pSiteMgr->hCtrlData, &param);
  1633. }
  1634. else
  1635. {
  1636. param.paramType = CTRL_DATA_RATE_CONTROL_ENABLE_PARAM;
  1637. param.content.ctrlDataRateControlEnable = FALSE;
  1638. ctrlData_setParam(pSiteMgr->hCtrlData, &param);
  1639. }
  1640. }
  1641. break;
  1642. case SITE_NULL:
  1643. pSite->siteType = SITE_REGULAR;
  1644. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_UPDATE_MODULE_LOG, ("REGULAR site added, bssid: %X-%X-%X-%X-%X-%X\n\n", bssid->addr[0], bssid->addr[1], bssid->addr[2], bssid->addr[3], bssid->addr[4], bssid->addr[5]));
  1645. break;
  1646. case SITE_SELF:
  1647. pSite->siteType = SITE_PRIMARY;
  1648. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("SELF ----> PRIMARY site , bssid: %X-%X-%X-%X-%X-%X\n\n", bssid->addr[0], bssid->addr[1], bssid->addr[2], bssid->addr[3], bssid->addr[4], bssid->addr[5]));
  1649. conn_ibssStaJoined(pSiteMgr->hConn);
  1650. break;
  1651. case SITE_REGULAR:
  1652. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_UPDATE_MODULE_LOG, ("REGULAR site updated, bssid: %X-%X-%X-%X-%X-%X\n\n", bssid->addr[0], bssid->addr[1], bssid->addr[2], bssid->addr[3], bssid->addr[4], bssid->addr[5]));
  1653. break;
  1654. default:
  1655. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Setting site type failure, bssid: %X-%X-%X-%X-%X-%X\n\n", bssid->addr[0], bssid->addr[1], bssid->addr[2], bssid->addr[3], bssid->addr[4], bssid->addr[5]));
  1656. break;
  1657. }
  1658. return OK;
  1659. }
  1660. /***********************************************************************
  1661. * siteMgr_start
  1662. ***********************************************************************
  1663. DESCRIPTION: Called by the SME SM in order to start the aging timer
  1664. INPUT: hSiteMgr - site mgr handle.
  1665. OUTPUT:
  1666. RETURN: OK on success, NOK otherwise
  1667. ************************************************************************/
  1668. TI_STATUS siteMgr_start(TI_HANDLE hSiteMgr)
  1669. {
  1670. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  1671. /* update timestamp each time aging started (needed for quiet scan) */
  1672. if(pSiteMgr->pSitesMgmtParams->pPrimarySite)
  1673. pSiteMgr->pSitesMgmtParams->pPrimarySite->localTimeStamp = os_timeStampMs(pSiteMgr->hOs);
  1674. return OK;
  1675. }
  1676. /***********************************************************************
  1677. * siteMgr_stop
  1678. ***********************************************************************
  1679. DESCRIPTION: Called by the SME SM in order to stop site mgr timers
  1680. INPUT: hSiteMgr - site mgr handle.
  1681. OUTPUT:
  1682. RETURN: OK on success, NOK otherwise
  1683. ************************************************************************/
  1684. TI_STATUS siteMgr_stop(TI_HANDLE hSiteMgr)
  1685. {
  1686. return OK;
  1687. }
  1688. /***********************************************************************
  1689. * siteMgr_CheckRxSignalValidity
  1690. ***********************************************************************
  1691. DESCRIPTION: Called by the mlme_parserRecv when receiving managment frame
  1692. Find the ste in the site table and validate that the
  1693. RSSI of that site signal is not lower then -80DB + not lower
  1694. then the exising site RSSI
  1695. INPUT: hSiteMgr - site mgr handle.
  1696. rxLevel - Rx level the frame received in
  1697. bssid - BSSID of the frame
  1698. OUTPUT:
  1699. RETURN: OK / NOK
  1700. ************************************************************************/
  1701. TI_STATUS siteMgr_CheckRxSignalValidity(TI_HANDLE hSiteMgr,
  1702. INT8 rxLevel,
  1703. UINT8 channel,
  1704. macAddress_t *bssid)
  1705. {
  1706. siteEntry_t *pSite;
  1707. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  1708. pSite = NULL;
  1709. pSite = findSiteEntry(pSiteMgr, bssid);
  1710. if (pSite != NULL)
  1711. {
  1712. if ((channel != pSite->channel) &&
  1713. (rxLevel < pSite->rssi))
  1714. { /* Ignore wrong packets with lower RSSI that were detect as
  1715. ripples from different channels */
  1716. WLAN_REPORT_WARNING(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  1717. ("siteMgr_CheckRxSignalValidity:Rx RSSI =%d, on channel=%d, is lower then given RSSI =%d on channel=%d, dropping it.\n",
  1718. rxLevel, channel, pSite->rssi, pSite->channel));
  1719. return NOK;
  1720. }
  1721. }
  1722. return OK;
  1723. }
  1724. /***********************************************************************
  1725. * siteMgr_updateRxSignal
  1726. ***********************************************************************
  1727. DESCRIPTION: Called by the Rx data when receiving a frae in the RX
  1728. Find the ste in the site table and updates the SNR and RSSI
  1729. INPUT: hSiteMgr - site mgr handle.
  1730. snr - SNR the frame received in
  1731. rxLevel - Rx level the frame received in
  1732. bssid - BSSID of the frame
  1733. OUTPUT:
  1734. RETURN: OK on success, NOK otherwise
  1735. ************************************************************************/
  1736. TI_STATUS siteMgr_updateRxSignal(TI_HANDLE hSiteMgr,
  1737. UINT8 snr,
  1738. INT8 rxLevel,
  1739. rate_e rate,
  1740. macAddress_t *bssid,
  1741. BOOL dataMsdu)
  1742. {
  1743. siteEntry_t *pSite;
  1744. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  1745. pSite = findSiteEntry(pSiteMgr, bssid);
  1746. if (pSite != NULL)
  1747. {
  1748. pSite->localTimeStamp = os_timeStampMs(pSiteMgr->hOs);
  1749. pSite->snr = snr;
  1750. /* We check the rate just for finding error case */
  1751. switch(rate)
  1752. {
  1753. case DRV_RATE_1M:
  1754. case DRV_RATE_2M:
  1755. case DRV_RATE_5_5M:
  1756. case DRV_RATE_11M:
  1757. case DRV_RATE_22M:
  1758. case DRV_RATE_6M:
  1759. case DRV_RATE_9M:
  1760. case DRV_RATE_12M:
  1761. case DRV_RATE_18M:
  1762. case DRV_RATE_24M:
  1763. case DRV_RATE_36M:
  1764. case DRV_RATE_48M:
  1765. case DRV_RATE_54M:
  1766. pSite->rxRate = rate;
  1767. break;
  1768. default:
  1769. pSite->rxRate = (rate_e)0;
  1770. WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  1771. ("siteMgr_updateRxSignal:Rx Rate is GARBAGE!\nRx Rate = %d\n", rate));
  1772. break;
  1773. }
  1774. /* Is this is not a primary site, update rssi;
  1775. For the Primary site, we store average RSSI that is counted and updated from Current BSS module */
  1776. if (pSite->siteType != SITE_PRIMARY)
  1777. {
  1778. pSite->rssi = (INT8)rxLevel;
  1779. }
  1780. }
  1781. return OK;
  1782. }
  1783. /***********************************************************************
  1784. * siteMgr_updatePrimarySiteFailStatus
  1785. ***********************************************************************
  1786. DESCRIPTION: Called by the SME SM when the connection with the primary site fails
  1787. If the primary site is NULL, return.
  1788. INPUT: hSiteMgr - site mgr handle.
  1789. bRemoveSite - Whether to remove the site
  1790. OUTPUT:
  1791. RETURN: OK on success, NOK otherwise
  1792. ************************************************************************/
  1793. TI_STATUS siteMgr_updatePrimarySiteFailStatus(TI_HANDLE hSiteMgr,
  1794. BOOL bRemoveSite)
  1795. {
  1796. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  1797. siteTablesParams_t *currTable = pSiteMgr->pSitesMgmtParams->pCurrentSiteTable;
  1798. if (pSiteMgr->pSitesMgmtParams->pPrimarySite == NULL)
  1799. return OK;
  1800. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  1801. (" SITE MGR: bRemoveSite = %d \n", bRemoveSite));
  1802. if (bRemoveSite)
  1803. {
  1804. removeSiteEntry(pSiteMgr, currTable, pSiteMgr->pSitesMgmtParams->pPrimarySite);
  1805. pSiteMgr->pSitesMgmtParams->pPrimarySite = NULL;
  1806. }
  1807. else /* Currently never used */
  1808. {
  1809. pSiteMgr->pSitesMgmtParams->pPrimarySite->failStatus = STATUS_UNSPECIFIED;
  1810. pSiteMgr->pSitesMgmtParams->pPrimarySite->attemptsNumber++;
  1811. pSiteMgr->pSitesMgmtParams->pPrimarySite->attemptsNumber &= 0x0F;
  1812. }
  1813. return OK;
  1814. }
  1815. /***********************************************************************
  1816. * siteMgr_resetEventStatisticsHistory
  1817. ***********************************************************************
  1818. DESCRIPTION: Called by the SME SM when successing in establishing a connection with the primary site
  1819. If thr primary site is NULL, return.
  1820. Otherwise, reset the site rssi level
  1821. INPUT: hSiteMgr - site mgr handle.
  1822. OUTPUT:
  1823. RETURN: OK on success, NOK otherwise
  1824. ************************************************************************/
  1825. TI_STATUS siteMgr_resetEventStatisticsHistory(TI_HANDLE hSiteMgr)
  1826. {
  1827. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  1828. if (pSiteMgr->pSitesMgmtParams->pPrimarySite == NULL)
  1829. {
  1830. WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("siteMgr_resetPrimarySiteRssiPerLevelBeaconMissed: Primary Site Is NULL\n"));
  1831. return OK;
  1832. }
  1833. return OK;
  1834. }
  1835. /***********************************************************************
  1836. * siteMgr_resetPrimarySiteAttemptsNumber
  1837. ***********************************************************************
  1838. DESCRIPTION: Called by the SME SM when successing in establishing a connection with the primary site
  1839. If thr primary site is NULL, return.
  1840. Otherwise, reset the site attemptsNumber counter.
  1841. INPUT: hSiteMgr - site mgr handle.
  1842. OUTPUT:
  1843. RETURN: OK on success, NOK otherwise
  1844. ************************************************************************/
  1845. TI_STATUS siteMgr_resetPrimarySiteAttemptsNumber(TI_HANDLE hSiteMgr)
  1846. {
  1847. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  1848. if (pSiteMgr->pSitesMgmtParams->pPrimarySite == NULL)
  1849. {
  1850. WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("siteMgr_resetPrimarySiteAttemptsNumber: Primary Site Is NULL\n"));
  1851. return OK;
  1852. }
  1853. pSiteMgr->pSitesMgmtParams->pPrimarySite->attemptsNumber = 0;
  1854. return OK;
  1855. }
  1856. /***********************************************************************
  1857. * siteMgr_resetPrevPrimarySiteRssi
  1858. ***********************************************************************
  1859. DESCRIPTION: Called by the SME SM when successing in establishing a connection with the primary site
  1860. If thr primary site is NULL, return.
  1861. Otherwise, reset the site attemptsNumber counter.
  1862. INPUT: hSiteMgr - site mgr handle.
  1863. OUTPUT:
  1864. RETURN: OK on success, NOK otherwise
  1865. ************************************************************************/
  1866. TI_STATUS siteMgr_resetPrevPrimarySiteRssi(TI_HANDLE hSiteMgr)
  1867. {
  1868. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  1869. if (pSiteMgr->pSitesMgmtParams->pPrevPrimarySite == NULL)
  1870. {
  1871. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  1872. ("Previous Primary Site Is NULL\n"));
  1873. return OK;
  1874. }
  1875. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  1876. ("Resetting previous primary site RSSI\n"));
  1877. /*
  1878. pSiteMgr->pSitesMgmtParams->pPrevPrimarySite->rssi = 0;
  1879. pSiteMgr->pSitesMgmtParams->pPrevPrimarySite->attemptsNumber = 0;
  1880. */
  1881. return OK;
  1882. }
  1883. /***********************************************************************
  1884. * siteMgr_isCurrentBand24
  1885. ***********************************************************************
  1886. DESCRIPTION: The function checks the current operational mode and
  1887. returns if the current band is 2.4Ghz or 5Ghz.
  1888. INPUT: hSiteMgr - site mgr handle.
  1889. OUTPUT:
  1890. RETURN: TRUE if current band is 2.4Ghz, FALSE otherwise.
  1891. ************************************************************************/
  1892. BOOL siteMgr_isCurrentBand24(TI_HANDLE hSiteMgr)
  1893. {
  1894. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  1895. if(pSiteMgr->siteMgrOperationalMode == DOT11_A_MODE)
  1896. return FALSE;
  1897. return TRUE; /* 802.11b supports onlty 2.4G band */
  1898. }
  1899. /***********************************************************************
  1900. * siteMgr_isThereValidSSID
  1901. ***********************************************************************
  1902. DESCRIPTION: checks if a valid SSID exists
  1903. INPUT: hSiteMgr - site mgr handle.
  1904. OUTPUT:
  1905. RETURN: TRUE if valid SSID found, FALSE if not
  1906. ************************************************************************/
  1907. BOOL siteMgr_isThereValidSSID (TI_HANDLE hSiteMgr)
  1908. {
  1909. paramInfo_t param;
  1910. param.paramType = SITE_MGR_DESIRED_SSID_PARAM;
  1911. siteMgr_getParam(hSiteMgr,&param);
  1912. if((utils_isAnySSID(&param.content.siteMgrDesiredSSID)) || (utils_isJunkSSID(&param.content.siteMgrDesiredSSID)))
  1913. return (FALSE);
  1914. else
  1915. return (TRUE);
  1916. }
  1917. /***********************************************************************
  1918. * removeEldestSite
  1919. ***********************************************************************
  1920. DESCRIPTION: Called by the select when trying to create an IBSS and site table is full
  1921. Remove the eldest site from the table
  1922. INPUT: hSiteMgr - site mgr handle.
  1923. OUTPUT:
  1924. RETURN: OK on success, NOK otherwise
  1925. ************************************************************************/
  1926. TI_STATUS removeEldestSite(siteMgr_t *pSiteMgr)
  1927. {
  1928. int i;
  1929. siteEntry_t *pEldestSite = NULL, *pSiteTable = pSiteMgr->pSitesMgmtParams->pCurrentSiteTable->siteTable;
  1930. siteTablesParams_t *currTable = pSiteMgr->pSitesMgmtParams->pCurrentSiteTable;
  1931. UINT32 currentTimsStamp = os_timeStampMs(pSiteMgr->hOs);
  1932. UINT32 biggestGap = 0;
  1933. for (i = 0; i < currTable->maxNumOfSites; i++)
  1934. {
  1935. if (biggestGap < ((UINT32)(currentTimsStamp - pSiteTable[i].localTimeStamp)))
  1936. {
  1937. biggestGap = ((UINT32)(currentTimsStamp - pSiteTable[i].localTimeStamp));
  1938. pEldestSite = &(pSiteTable[i]);
  1939. }
  1940. }
  1941. removeSiteEntry(pSiteMgr, currTable, pEldestSite);
  1942. return OK;
  1943. }
  1944. /***********************************************************************
  1945. * update_apsd
  1946. ***********************************************************************
  1947. DESCRIPTION: Sets the site APSD support flag according to the
  1948. beacon's capabilities vector and the WME-params IE if exists.
  1949. INPUT: pSite - Pointer to the site entry in the site table
  1950. pFrameInfo - Frame information after the parsing
  1951. OUTPUT: pSite->APSDSupport flag
  1952. RETURN:
  1953. ************************************************************************/
  1954. static void update_apsd(siteEntry_t *pSite, mlmeFrameInfo_t *pFrameInfo)
  1955. {
  1956. /* If WME-Params IE is not included in the beacon, set the APSD-Support flag
  1957. only by the beacons capabilities bit map. */
  1958. if (pFrameInfo->content.iePacket.WMEParams == NULL)
  1959. pSite->APSDSupport = (((pFrameInfo->content.iePacket.capabilities >> CAP_APSD_SHIFT) & CAP_APSD_MASK) ? TRUE : FALSE);
  1960. /* Else, set the APSD-Support flag if either the capabilities APSD bit or the
  1961. WME-Params APSD bit indicate so. */
  1962. else
  1963. pSite->APSDSupport = ((((pFrameInfo->content.iePacket.capabilities >> CAP_APSD_SHIFT) & CAP_APSD_MASK) ? TRUE : FALSE) ||
  1964. (((pFrameInfo->content.iePacket.WMEParams->ACInfoField >> AP_QOS_INFO_UAPSD_SHIFT) & AP_QOS_INFO_UAPSD_MASK) ? TRUE : FALSE));
  1965. }
  1966. /***********************************************************************
  1967. * release_module
  1968. ***********************************************************************
  1969. DESCRIPTION: Called by the un load function
  1970. Go over the vector, for each bit that is set, release the corresponding module.
  1971. INPUT: pSiteMgr - site mgr handle.
  1972. initVec - Vector that contains a bit set for each module thah had been initiualized
  1973. OUTPUT:
  1974. RETURN: OK on success, NOK otherwise
  1975. ************************************************************************/
  1976. static void release_module(siteMgr_t *pSiteMgr, UINT32 initVec)
  1977. {
  1978. if (initVec & (1 << MGMT_PARAMS_INIT_BIT))
  1979. utils_nullMemoryFree(pSiteMgr->hOs, pSiteMgr->pSitesMgmtParams, sizeof(sitesMgmtParams_t));
  1980. if (initVec & (1 << DESIRED_PARAMS_INIT_BIT))
  1981. utils_nullMemoryFree(pSiteMgr->hOs, pSiteMgr->pDesiredParams, sizeof(siteMgrInitParams_t));
  1982. if (initVec & (1 << SITE_MGR_INIT_BIT))
  1983. utils_nullMemoryFree(pSiteMgr->hOs, pSiteMgr, sizeof(siteMgr_t));
  1984. initVec = 0;
  1985. }
  1986. /***********************************************************************
  1987. * updateSiteInfo
  1988. ***********************************************************************
  1989. DESCRIPTION: Called upon receiving a beacon or probe response
  1990. Go over the vector, for each bit that is set, release the corresponding module.
  1991. Update theaite entry in the site table with the information received in the frame
  1992. INPUT: pSiteMgr - site mgr handle.
  1993. pFrameInfo - Frame information after the parsing
  1994. pSite - Pointer to the site entry in the site table
  1995. OUTPUT:
  1996. RETURN: OK on success, NOK otherwise
  1997. ************************************************************************/
  1998. static void updateSiteInfo(siteMgr_t *pSiteMgr, mlmeFrameInfo_t *pFrameInfo, siteEntry_t *pSite, UINT8 rxChannel)
  1999. {
  2000. paramInfo_t param;
  2001. BOOL ssidUpdated;
  2002. SET_ENTRY_FLAG_IN_SITE_TABLE(pSite);
  2003. ssidUpdated = FALSE;
  2004. switch (pFrameInfo->subType)
  2005. {
  2006. case BEACON:
  2007. UPDATE_BEACON_INTERVAL(pSite, pFrameInfo);
  2008. UPDATE_CAPABILITIES(pSite, pFrameInfo);
  2009. if (utils_isIESSID_Broadcast(pFrameInfo->content.iePacket.pSsid) == FALSE)
  2010. { /* And the SSID is not Broadcast */
  2011. ssidUpdated = TRUE;
  2012. UPDATE_SSID(pSite, pFrameInfo);
  2013. }
  2014. if (ssidUpdated)
  2015. {
  2016. UPDATE_PRIVACY(pSite, pFrameInfo);
  2017. }
  2018. update_apsd(pSite, pFrameInfo);
  2019. updatePreamble(pSiteMgr, pSite, pFrameInfo);
  2020. UPDATE_AGILITY(pSite, pFrameInfo);
  2021. if(pSiteMgr->siteMgrOperationalMode == DOT11_G_MODE)
  2022. {
  2023. UPDATE_SLOT_TIME(pSite, pFrameInfo);
  2024. UPDATE_PROTECTION(pSite, pFrameInfo);
  2025. }
  2026. updateRates(pSiteMgr, pSite, pFrameInfo);
  2027. if ((pFrameInfo->content.iePacket.pDSParamsSet != NULL) &&
  2028. (pFrameInfo->content.iePacket.pDSParamsSet->currChannel!=rxChannel))
  2029. {
  2030. WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2031. ("updateSiteInfo, wrong CHANNELS:rxChannel=%d,currChannel=%d\n",
  2032. rxChannel, pFrameInfo->content.iePacket.pDSParamsSet->currChannel));
  2033. }
  2034. else
  2035. UPDATE_CHANNEL(pSite, pFrameInfo , rxChannel);
  2036. UPDATE_BSS_TYPE(pSite, pFrameInfo);
  2037. if (pSite->bssType == BSS_INFRASTRUCTURE)
  2038. UPDATE_DTIM_PERIOD(pSite, pFrameInfo);
  2039. UPDATE_ATIM_WINDOW(pSite, pFrameInfo);
  2040. UPDATE_BEACON_AP_TX_POWER(pSite, pFrameInfo);
  2041. /* Updating QoS params */
  2042. updateBeaconQosParams(pSiteMgr, pSite, pFrameInfo);
  2043. /* updating CountryIE */
  2044. if ((pFrameInfo->content.iePacket.country != NULL) &&
  2045. (pFrameInfo->content.iePacket.country->hdr.eleLen != 0))
  2046. {
  2047. /* set the country info in the regulatory domain - If a different code was detected earlier
  2048. the regDomain will ignore it */
  2049. param.paramType = REGULATORY_DOMAIN_COUNTRY_PARAM;
  2050. param.content.pCountry = (country_t *)pFrameInfo->content.iePacket.country;
  2051. regulatoryDomain_setParam(pSiteMgr->hRegulatoryDomain,&param);
  2052. }
  2053. /* Checking if this beacon is a DTIM i.e. DTIM count is zero */
  2054. if( (pFrameInfo->content.iePacket.pTIM != NULL) && (pFrameInfo->content.iePacket.pTIM->dtimCount == 0))
  2055. {
  2056. /* Update the DTIM beacon time */
  2057. UPDATE_DTIM_TIME(pSiteMgr, pSite, pFrameInfo);
  2058. }
  2059. UPDATE_LOCAL_TIME_STAMP(pSiteMgr, pSite, pFrameInfo);
  2060. UPDATE_BEACON_MODULATION(pSite, pFrameInfo);
  2061. /* If the BSS type is independent, the beacon & probe modulation are equal,
  2062. It is important to update this field here for dynamic PBCC algorithm compatibility */
  2063. if (pSite->bssType == BSS_INDEPENDENT)
  2064. UPDATE_PROBE_MODULATION(pSite, pFrameInfo);
  2065. if (pSite->siteType == SITE_PRIMARY)
  2066. {
  2067. if (pSiteMgr->pSitesMgmtParams->pPrimarySite == NULL)
  2068. {
  2069. WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("updateSiteInfo: Primary Site Is NULL\n"));
  2070. pSite->siteType = SITE_REGULAR;
  2071. }
  2072. else
  2073. {
  2074. /* If the site that we got the beacon on is the primary site - which means we are either trying */
  2075. /* to connect to it or we are already connected - send the EVENT_GOT_BEACON to the conn module (through the SME module) */
  2076. /* so the conn module will be aware of the beacon status of the site it's trying to connect to */
  2077. #ifdef EXC_MODULE_INCLUDED
  2078. UINT8 ExternTxPower;
  2079. if (pFrameInfo->content.iePacket.cellTP != NULL)
  2080. {
  2081. ExternTxPower = pFrameInfo->content.iePacket.cellTP->power;
  2082. }
  2083. else /* Set to maximum possible. Note that we add +1 so that Dbm = 26 and not 25 */
  2084. {
  2085. ExternTxPower = MAX_TX_POWER / DBM_TO_TX_POWER_FACTOR + 1;
  2086. }
  2087. param.paramType = REGULATORY_DOMAIN_EXTERN_TX_POWER_PREFERRED;
  2088. param.content.ExternTxPowerPreferred = ExternTxPower;
  2089. regulatoryDomain_setParam(pSiteMgr->hRegulatoryDomain, &param);
  2090. #endif
  2091. /* Updating the Tx Power according to the received Power Constraint */
  2092. if(pFrameInfo->content.iePacket.powerConstraint != NULL)
  2093. { /* Checking if the recieved constraint is different from the one that is already known */
  2094. if( pFrameInfo->content.iePacket.powerConstraint->powerConstraint != pSite->powerConstraint)
  2095. { /* check if Spectrum Management is enabled */
  2096. param.paramType = REGULATORY_DOMAIN_MANAGEMENT_CAPABILITY_ENABLED_PARAM;
  2097. regulatoryDomain_getParam(pSiteMgr->hRegulatoryDomain,&param);
  2098. if(param.content.spectrumManagementEnabled)
  2099. { /* setting power constraint */
  2100. pSite->powerConstraint = pFrameInfo->content.iePacket.powerConstraint->powerConstraint;
  2101. param.paramType = REGULATORY_DOMAIN_SET_POWER_CONSTRAINT_PARAM;
  2102. param.content.powerConstraint = pSite->powerConstraint;
  2103. regulatoryDomain_setParam(pSiteMgr->hRegulatoryDomain,&param);
  2104. }
  2105. }
  2106. }
  2107. if (pSite->beaconReceiveAfterJoin == FALSE)
  2108. {
  2109. /*
  2110. use for indicate to that it safe to call to PowerMgr_startPS() that can be call only
  2111. after join command followed by beacon receive later.
  2112. every join command the beaconReceiveAfterJoin flag is cleared therefor it will
  2113. be true after the join command.
  2114. the right follow is: join --> receive primary site beacon --> PowerMgr_startPS().
  2115. Note: the beaconReceiveAfterJoin flag is in use for the SME path!
  2116. */
  2117. siteMgr_gotFirstBcn(pSiteMgr);
  2118. /* set Hw not available now that the first beacon arrived */
  2119. MacServices_powerAutho_AwakeRequiredUpdate(pSiteMgr->hMacServices, POWERAUTHO_AWAKE_NOT_REQUIRED, POWERAUTHO_AWAKE_REASON_FIRST_BEACON);
  2120. pSite->beaconReceiveAfterJoin = TRUE;
  2121. WLAN_REPORT_INFORMATION(pSiteMgr->hReport,
  2122. SITE_MGR_MODULE_LOG,
  2123. ("1st beacon after join command RECEIVED!!!\n"));
  2124. }
  2125. }
  2126. }
  2127. UPDATE_BEACON_RECV(pSite);
  2128. if (ssidUpdated)
  2129. {
  2130. dot11_RSN_t *pRsnIe = pFrameInfo->content.iePacket.pRsnIe;
  2131. UINT8 rsnIeLen = pFrameInfo->content.iePacket.rsnIeLen;
  2132. UPDATE_RSN_IE(pSite, pRsnIe, rsnIeLen);
  2133. }
  2134. UPDATE_BEACON_TIMESTAMP(pSiteMgr, pSite, pFrameInfo);
  2135. break;
  2136. case PROBE_RESPONSE:
  2137. UPDATE_BEACON_INTERVAL(pSite, pFrameInfo);
  2138. UPDATE_CAPABILITIES(pSite, pFrameInfo);
  2139. ssidUpdated = TRUE;
  2140. if (pSite->siteType == SITE_PRIMARY)
  2141. { /* Primary SITE */
  2142. if ((pFrameInfo->content.iePacket.pSsid != NULL) &&
  2143. (pSiteMgr->pDesiredParams->siteMgrDesiredSSID.len>0))
  2144. { /* There's a desired SSID*/
  2145. if (os_memoryCompare(pSiteMgr->hOs, (UINT8*)(pSiteMgr->pDesiredParams->siteMgrDesiredSSID.ssidString),
  2146. (UINT8*)(pFrameInfo->content.iePacket.pSsid->serviceSetId), pFrameInfo->content.iePacket.pSsid->hdr.eleLen)!=0)
  2147. { /* Do not overwrite the primary site's SSID with a different than the desired SSID*/
  2148. ssidUpdated = FALSE;
  2149. }
  2150. }
  2151. else if (pFrameInfo->content.iePacket.pSsid == NULL)
  2152. {
  2153. WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2154. ("updateSiteInfo PROBE_RESP, pSsid=NULL\n"));
  2155. }
  2156. }
  2157. if (ssidUpdated)
  2158. {
  2159. UPDATE_SSID(pSite, pFrameInfo);
  2160. UPDATE_PRIVACY(pSite, pFrameInfo);
  2161. }
  2162. update_apsd(pSite, pFrameInfo);
  2163. if(pSiteMgr->siteMgrOperationalMode == DOT11_G_MODE)
  2164. {
  2165. UPDATE_PROTECTION(pSite, pFrameInfo);
  2166. }
  2167. updateFourX(pSiteMgr, pSite, pFrameInfo);
  2168. updatePreamble(pSiteMgr, pSite, pFrameInfo);
  2169. UPDATE_AGILITY(pSite, pFrameInfo);
  2170. updateRates(pSiteMgr, pSite, pFrameInfo);
  2171. if ((pFrameInfo->content.iePacket.pDSParamsSet != NULL) &&
  2172. (pFrameInfo->content.iePacket.pDSParamsSet->currChannel!=rxChannel))
  2173. {
  2174. WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2175. ("updateSiteInfo, wrong CHANNELS:rxChannel=%d,currChannel=%d\n",
  2176. rxChannel, pFrameInfo->content.iePacket.pDSParamsSet->currChannel));
  2177. }
  2178. else
  2179. UPDATE_CHANNEL(pSite, pFrameInfo, rxChannel);
  2180. UPDATE_BSS_TYPE(pSite, pFrameInfo);
  2181. UPDATE_ATIM_WINDOW(pSite, pFrameInfo);
  2182. UPDATE_PROBE_AP_TX_POWER(pSite, pFrameInfo);
  2183. /* Updating WME params */
  2184. updateProbeQosParams(pSiteMgr, pSite, pFrameInfo);
  2185. /* updating CountryIE */
  2186. if ((pFrameInfo->content.iePacket.country != NULL) &&
  2187. (pFrameInfo->content.iePacket.country->hdr.eleLen != 0))
  2188. {
  2189. /* set the country info in the regulatory domain - If a different code was detected earlier
  2190. the regDomain will ignore it */
  2191. param.paramType = REGULATORY_DOMAIN_COUNTRY_PARAM;
  2192. param.content.pCountry = (country_t *)pFrameInfo->content.iePacket.country;
  2193. regulatoryDomain_setParam(pSiteMgr->hRegulatoryDomain,&param);
  2194. }
  2195. UPDATE_LOCAL_TIME_STAMP(pSiteMgr, pSite, pFrameInfo);
  2196. UPDATE_PROBE_MODULATION(pSite, pFrameInfo);
  2197. /* If the BSS type is independent, the beacon & probe modulation are equal,
  2198. It is important to update this field here for dynamic PBCC algorithm compatibility */
  2199. if (pSite->bssType == BSS_INDEPENDENT)
  2200. UPDATE_BEACON_MODULATION(pSite, pFrameInfo);
  2201. UPDATE_PROBE_RECV(pSite);
  2202. if (ssidUpdated)
  2203. {
  2204. dot11_RSN_t *pRsnIe = pFrameInfo->content.iePacket.pRsnIe;
  2205. UINT8 rsnIeLen = pFrameInfo->content.iePacket.rsnIeLen;
  2206. UPDATE_RSN_IE(pSite, pRsnIe, rsnIeLen);
  2207. }
  2208. UPDATE_BEACON_TIMESTAMP(pSiteMgr, pSite, pFrameInfo);
  2209. break;
  2210. default:
  2211. WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Site Update failure, un known frame sub type %d\n\n", pFrameInfo->subType));
  2212. break;
  2213. }
  2214. }
  2215. /***********************************************************************
  2216. * updateFourX
  2217. ***********************************************************************
  2218. DESCRIPTION: Called by the function 'updateSiteInfo()'
  2219. INPUT: pSiteMgr - site mgr handle.
  2220. pFrameInfo - Frame information after the parsing
  2221. pSite - Pointer to the site entry in the site table
  2222. OUTPUT:
  2223. RETURN:
  2224. ************************************************************************/
  2225. static void updateFourX(siteMgr_t *pSiteMgr, siteEntry_t *pSite, mlmeFrameInfo_t *pFrameInfo)
  2226. {
  2227. UINT8 ti_oui[] = TI_OUI;
  2228. /* It is done to overcome interop issues. We don't send AssocReq with 4x IE
  2229. if ProbeReq without 4x IE was received previously */
  2230. if (pFrameInfo->content.iePacket.fourXParams != NULL)
  2231. {
  2232. os_memoryCopy(pSiteMgr->hOs, &pSite->fourXParams, pFrameInfo->content.iePacket.fourXParams, pFrameInfo->content.iePacket.fourXParams->hdr.eleLen+sizeof( dot11_eleHdr_t));
  2233. if( (pSite->fourXParams.hdr.eleId != DOT11_4X_ELE_ID) ||
  2234. (pSite->fourXParams.hdr.eleLen > DOT11_4X_MAX_LEN) ||
  2235. (os_memoryCompare(pSiteMgr->hOs ,ti_oui, (PUINT8)pSite->fourXParams.fourXCapabilities, DOT11_OUI_LEN) != 0) )
  2236. {
  2237. pSite->fourXsupported = FALSE;
  2238. }
  2239. }
  2240. else
  2241. pSite->fourXsupported = FALSE;
  2242. }
  2243. /***********************************************************************
  2244. * updatePreamble
  2245. ***********************************************************************
  2246. DESCRIPTION: Called by the function 'updateSiteInfo()'
  2247. INPUT: pSiteMgr - site mgr handle.
  2248. pFrameInfo - Frame information after the parsing
  2249. pSite - Pointer to the site entry in the site table
  2250. OUTPUT:
  2251. RETURN:
  2252. ************************************************************************/
  2253. static void updatePreamble(siteMgr_t *pSiteMgr, siteEntry_t *pSite, mlmeFrameInfo_t *pFrameInfo)
  2254. {
  2255. pSite->currentPreambleType = ((pFrameInfo->content.iePacket.capabilities >> CAP_PREAMBLE_SHIFT) & CAP_PREAMBLE_MASK) ? PREAMBLE_SHORT : PREAMBLE_LONG;
  2256. pSite->barkerPreambleType = pFrameInfo->content.iePacket.barkerPreambleMode;
  2257. }
  2258. /***********************************************************************
  2259. * updateBeaconQosParams
  2260. ***********************************************************************
  2261. DESCRIPTION: Called by the function 'updateSiteInfo()'
  2262. INPUT: pSiteMgr - site mgr handle.
  2263. pFrameInfo - Frame information after the parsing
  2264. pSite - Pointer to the site entry in the site table
  2265. OUTPUT:
  2266. RETURN:
  2267. ************************************************************************/
  2268. static void updateBeaconQosParams(siteMgr_t *pSiteMgr, siteEntry_t *pSite, mlmeFrameInfo_t *pFrameInfo)
  2269. {
  2270. /* Updating WME params */
  2271. if (pFrameInfo->content.iePacket.WMEParams != NULL)
  2272. {
  2273. /* Checking if this is IE includes new WME Parameters */
  2274. if(( ((pFrameInfo->content.iePacket.WMEParams->ACInfoField) & dot11_WME_ACINFO_MASK ) != pSite->lastWMEParameterCnt) ||
  2275. (!pSite->WMESupported) )
  2276. {
  2277. pSite->WMESupported = TRUE;
  2278. /* Checking if this IE is information only or is a paremeters IE */
  2279. if(pFrameInfo->content.iePacket.WMEParams->OUISubType == dot11_WME_OUI_SUB_TYPE_PARAMS_IE)
  2280. {
  2281. if(pSite->siteType == SITE_PRIMARY)
  2282. {
  2283. qosMngr_updateIEinfo(pSiteMgr->hQosMngr,(UINT8 *)(pFrameInfo->content.iePacket.WMEParams),WME);
  2284. }
  2285. /* updating the WME paraeters into the site table. */
  2286. os_memoryCopy(pSiteMgr->hOs, &pSite->WMEParameters, &(pFrameInfo->content.iePacket.WMEParams->WME_ACParameteres), sizeof( ACParameters_t));
  2287. pSite->lastWMEParameterCnt = (pFrameInfo->content.iePacket.WMEParams->ACInfoField) & dot11_WME_ACINFO_MASK;
  2288. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,("$$$$$$ WME parameters were updates according to beacon, cntSeq = %d\n",pSite->lastWMEParameterCnt));
  2289. }
  2290. }
  2291. }else
  2292. {
  2293. pSite->WMESupported = FALSE;
  2294. }
  2295. }
  2296. /***********************************************************************
  2297. * updateProbeQosParams
  2298. ***********************************************************************
  2299. DESCRIPTION: Called by the function 'updateSiteInfo()'
  2300. INPUT: pSiteMgr - site mgr handle.
  2301. pFrameInfo - Frame information after the parsing
  2302. pSite - Pointer to the site entry in the site table
  2303. OUTPUT:
  2304. RETURN:
  2305. ************************************************************************/
  2306. static void updateProbeQosParams(siteMgr_t *pSiteMgr, siteEntry_t *pSite, mlmeFrameInfo_t *pFrameInfo)
  2307. {
  2308. /* Updating WME params */
  2309. if (pFrameInfo->content.iePacket.WMEParams != NULL)
  2310. {
  2311. /* Checking if this is IE includes new WME Parameters */
  2312. if(( ((pFrameInfo->content.iePacket.WMEParams->ACInfoField) & dot11_WME_ACINFO_MASK ) != pSite->lastWMEParameterCnt) ||
  2313. (!pSite->WMESupported) )
  2314. {
  2315. pSite->WMESupported = TRUE;
  2316. /* Checking if this IE is information only or is a paremeters IE */
  2317. if(pFrameInfo->content.iePacket.WMEParams->OUISubType == dot11_WME_OUI_SUB_TYPE_PARAMS_IE)
  2318. {
  2319. if(pSite->siteType == SITE_PRIMARY)
  2320. {
  2321. qosMngr_updateIEinfo(pSiteMgr->hQosMngr,(UINT8 *)(pFrameInfo->content.iePacket.WMEParams),WME);
  2322. }
  2323. /* updating the WME paraeters into the site table. */
  2324. os_memoryCopy(pSiteMgr->hOs, &pSite->WMEParameters, &(pFrameInfo->content.iePacket.WMEParams->WME_ACParameteres), sizeof( ACParameters_t));
  2325. pSite->lastWMEParameterCnt = (pFrameInfo->content.iePacket.WMEParams->ACInfoField) & dot11_WME_ACINFO_MASK;
  2326. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,("$$$$$$ WME parameters were updates according to probe response, cntSeq = %d\n",pSite->lastWMEParameterCnt));
  2327. }
  2328. }
  2329. }else
  2330. {
  2331. pSite->WMESupported = FALSE;
  2332. }
  2333. }
  2334. /***********************************************************************
  2335. * updateRates
  2336. ***********************************************************************
  2337. DESCRIPTION: Called by the function 'updateSiteInfo()' in order to translate the rates received
  2338. in the beacon or probe response to rate used by the driver. Perfoms the following:
  2339. - Check the rates. validity. If rates are invalid, return
  2340. - Get the max active rate & max basic rate, if invalid, return
  2341. - Translate the max active rate and max basic rate from network rates to host rates.
  2342. The max active & max basic rate are used by the driver from now on in all the processes:
  2343. (selection, join, transmission, etc....)
  2344. INPUT: pSiteMgr - site mgr handle.
  2345. pFrameInfo - Frame information after the parsing
  2346. pSite - Pointer to the site entry in the site table
  2347. OUTPUT:
  2348. RETURN: OK on success, NOK otherwise
  2349. ************************************************************************/
  2350. static void updateRates(siteMgr_t *pSiteMgr, siteEntry_t *pSite, mlmeFrameInfo_t *pFrameInfo)
  2351. {
  2352. UINT8 maxBasicRate = 0, maxActiveRate = 0;
  2353. UINT32 bitMapExtSupp = 0;
  2354. paramInfo_t param;
  2355. if (pFrameInfo->content.iePacket.pRates == NULL)
  2356. {
  2357. WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("updateRates, pRates=NULL, beacon & probeResp are: \n"));
  2358. WLAN_REPORT_HEX_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2359. (UINT8*)pFrameInfo->content.iePacket.pRates, pFrameInfo->content.iePacket.pRates->hdr.eleLen+2);
  2360. WLAN_REPORT_HEX_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2361. (UINT8*)pFrameInfo->content.iePacket.pRates, pFrameInfo->content.iePacket.pRates->hdr.eleLen+2);
  2362. return;
  2363. }
  2364. /* Update the rate elements */
  2365. maxBasicRate = getMaxBasicRatefromString((UINT8 *)pFrameInfo->content.iePacket.pRates->rates,pFrameInfo->content.iePacket.pRates->hdr.eleLen, maxBasicRate);
  2366. maxActiveRate = getMaxActiveRatefromString((UINT8 *)pFrameInfo->content.iePacket.pRates->rates,pFrameInfo->content.iePacket.pRates->hdr.eleLen, maxActiveRate);
  2367. if(pFrameInfo->content.iePacket.pExtRates)
  2368. {
  2369. maxBasicRate = getMaxBasicRatefromString((UINT8 *)pFrameInfo->content.iePacket.pExtRates->rates,pFrameInfo->content.iePacket.pExtRates->hdr.eleLen, maxBasicRate);
  2370. maxActiveRate = getMaxActiveRatefromString((UINT8 *)pFrameInfo->content.iePacket.pExtRates->rates,pFrameInfo->content.iePacket.pExtRates->hdr.eleLen, maxActiveRate);
  2371. }
  2372. /*WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("1- maxBasicRate = 0x%X, maxActiveRate = 0x%X \n", maxBasicRate,maxActiveRate));*/
  2373. if (maxActiveRate == 0)
  2374. maxActiveRate = maxBasicRate;
  2375. /* Now update it from network to host rates */
  2376. pSite->maxBasicRate = networkToHostRate(maxBasicRate);
  2377. pSite->maxActiveRate = networkToHostRate(maxActiveRate);
  2378. if (pSite->maxActiveRate == DRV_RATE_INVALID)
  2379. WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Network To Host Rate failure, no active network rate\n"));
  2380. if (pSite->maxBasicRate != DRV_RATE_INVALID)
  2381. {
  2382. if (pSite->maxActiveRate != DRV_RATE_INVALID)
  2383. {
  2384. pSite->maxActiveRate = MAX(pSite->maxActiveRate,pSite->maxBasicRate);
  2385. }
  2386. } else { /* in case some vendors don't specify basic rates */
  2387. WLAN_REPORT_WARNING(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Network To Host Rate failure, no basic network rate"));
  2388. pSite->maxBasicRate = pSite->maxActiveRate;
  2389. }
  2390. /* build rates bit map */
  2391. networkStringToBitMapSuppRates((UINT32 *)&pSite->rateMask.supportedRateMask,
  2392. (UINT8 *)pFrameInfo->content.iePacket.pRates->rates,
  2393. pFrameInfo->content.iePacket.pRates->hdr.eleLen);
  2394. networkStringToBitMapBasicRates((UINT32 *)&pSite->rateMask.basicRateMask,
  2395. (UINT8 *)pFrameInfo->content.iePacket.pRates->rates,
  2396. pFrameInfo->content.iePacket.pRates->hdr.eleLen);
  2397. if(pFrameInfo->content.iePacket.pExtRates)
  2398. {
  2399. networkStringToBitMapSuppRates(&bitMapExtSupp, (UINT8 *)pFrameInfo->content.iePacket.pExtRates->rates,
  2400. pFrameInfo->content.iePacket.pExtRates->hdr.eleLen);
  2401. pSite->rateMask.supportedRateMask |= bitMapExtSupp;
  2402. networkStringToBitMapBasicRates(&bitMapExtSupp, (UINT8 *)pFrameInfo->content.iePacket.pExtRates->rates,
  2403. pFrameInfo->content.iePacket.pExtRates->hdr.eleLen);
  2404. pSite->rateMask.basicRateMask |= bitMapExtSupp;
  2405. }
  2406. param.paramType = CTRL_DATA_CURRENT_SUPPORTED_RATE_MASK_PARAM;
  2407. param.content.ctrlDataCurrentRateMask = pSite->rateMask.supportedRateMask;
  2408. /* clear the 22Mbps bit in case the PBCC is not allowed */
  2409. if(pSiteMgr->currentDataModulation != DRV_MODULATION_PBCC && pSiteMgr->currentDataModulation != DRV_MODULATION_OFDM)
  2410. {
  2411. param.content.ctrlDataCurrentRateMask &= ~DRV_RATE_MASK_22_PBCC;
  2412. }
  2413. ctrlData_setParam(pSiteMgr->hCtrlData, &param);
  2414. param.paramType = CTRL_DATA_CURRENT_BASIC_RATE_MASK_PARAM;
  2415. param.content.ctrlDataBasicRateBitMask = pSite->rateMask.basicRateMask;
  2416. ctrlData_setParam(pSiteMgr->hCtrlData, &param);
  2417. /*WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("2- pSite->maxActiveRate = 0x%X, pSite->maxBasicRate = 0x%X \n", pSite->maxActiveRate,pSite->maxBasicRate));*/
  2418. }
  2419. /***********************************************************************
  2420. * getBssidList
  2421. ***********************************************************************
  2422. DESCRIPTION: Called by the OS abstraction layer in order to get the BSSID list from the site table
  2423. INPUT: pSiteMgr - site mgr handle.
  2424. OUTPUT: bssidList - BSSID list pointer
  2425. RETURN:
  2426. ************************************************************************/
  2427. static TI_STATUS getBssidList(siteMgr_t *pSiteMgr, OS_802_11_BSSID_LIST_EX *bssidList, UINT32 *pLength, BOOL allVarIes)
  2428. {
  2429. UINT8 siteTableIndex, tableIndex, i, index, rsnIeLength;
  2430. siteEntry_t *pSiteEntry;
  2431. OS_802_11_BSSID_EX *pBssid;
  2432. OS_802_11_FIXED_IEs *pFixedIes;
  2433. OS_802_11_VARIABLE_IEs *pVarIes;
  2434. UINT32 length;
  2435. UINT8 *pData;
  2436. UINT32 len, firstOFDMloc = 0;
  2437. siteTablesParams_t *currTable;
  2438. short numOfTables;
  2439. UINT8 *pDesiredIe;
  2440. UINT8 *pSiteEntryIeBuffer;
  2441. UINT16 ieLength;
  2442. UINT8 wpsOuiBuffer[DOT11_WPS_OUI_LEN+1]=DOT11_WPS_OUI;
  2443. #ifdef DBG_BSSIS_NAME_PRINT
  2444. UINT8 tempName[33];
  2445. #endif
  2446. numOfTables = NUM_OF_SITE_TABLE;
  2447. bssidList->NumberOfItems = 0;
  2448. calculateBssidListSize(pSiteMgr, &length, allVarIes);
  2449. if (length > *pLength)
  2450. {
  2451. *pLength = length;
  2452. return NOK;
  2453. }
  2454. length = sizeof(OS_802_11_BSSID_LIST_EX) - sizeof(OS_802_11_BSSID_EX);
  2455. pData = (UINT8*)&bssidList->Bssid[0];
  2456. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Entering getBssidList, length = %d, pData = 0x%X\n", *pLength, (UINT32)pData));
  2457. currTable = pSiteMgr->pSitesMgmtParams->pCurrentSiteTable;
  2458. for (tableIndex = 0; tableIndex < numOfTables ; tableIndex++)
  2459. {
  2460. for (siteTableIndex = 0, i = 0; siteTableIndex < currTable->maxNumOfSites; siteTableIndex++)
  2461. {
  2462. pBssid = (OS_802_11_BSSID_EX*)pData;
  2463. pSiteEntry = &(currTable->siteTable[siteTableIndex]);
  2464. if (pSiteEntry->siteType == SITE_NULL)
  2465. continue;
  2466. /* MacAddress */
  2467. os_memoryCopy(pSiteMgr->hOs, (void *)pBssid->MacAddress, (void *)&(pSiteEntry->bssid.addr), MAC_ADDR_LEN);
  2468. /* Capabilities */
  2469. pBssid->Union.Capabilities = pSiteEntry->capabilities;
  2470. /* SSID */
  2471. /* This line is in order to prevent presantation problems at the utility. */
  2472. os_memoryZero(pSiteMgr->hOs, &(pBssid->Ssid.Ssid), MAX_SSID_LEN);
  2473. if (pSiteEntry->ssid.len > MAX_SSID_LEN)
  2474. {
  2475. pSiteEntry->ssid.len = MAX_SSID_LEN;
  2476. }
  2477. os_memoryCopy(pSiteMgr->hOs, (void *)pBssid->Ssid.Ssid, &(pSiteEntry->ssid.ssidString), pSiteEntry->ssid.len);
  2478. pBssid->Ssid.SsidLength = pSiteEntry->ssid.len;
  2479. /* privacy */
  2480. pBssid->Privacy = pSiteEntry->privacy;
  2481. /* RSSI */
  2482. pBssid->Rssi = (pSiteEntry->rssi);
  2483. pBssid->Configuration.Length = sizeof(OS_802_11_CONFIGURATION);
  2484. pBssid->Configuration.BeaconPeriod = pSiteEntry->beaconInterval;
  2485. pBssid->Configuration.ATIMWindow = pSiteEntry->atimWindow;
  2486. pBssid->Configuration.Union.channel = Chan2Freq(pSiteEntry->channel);
  2487. pBssid->Configuration.FHConfig.Length = sizeof(OS_802_11_CONFIGURATION_FH);
  2488. pBssid->Configuration.FHConfig.DwellTime = pSiteEntry->FHParams.dwellTime;
  2489. pBssid->Configuration.FHConfig.HopPattern = pSiteEntry->FHParams.hopPattern;
  2490. pBssid->Configuration.FHConfig.HopSet = pSiteEntry->FHParams.hopSet;
  2491. if (pSiteEntry->bssType == BSS_INDEPENDENT)
  2492. pBssid->InfrastructureMode = os802_11IBSS;
  2493. else
  2494. pBssid->InfrastructureMode = os802_11Infrastructure;
  2495. /* SupportedRates */
  2496. os_memoryZero(pSiteMgr->hOs, (void *)pBssid->SupportedRates, sizeof(OS_802_11_RATES_EX));
  2497. bitMapToNetworkStringRates(pSiteEntry->rateMask.supportedRateMask,
  2498. pSiteEntry->rateMask.basicRateMask,
  2499. (UINT8 *)pBssid->SupportedRates,
  2500. &len, &firstOFDMloc);
  2501. /* set network type acording to band and rates */
  2502. if (currTable == &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables)
  2503. {
  2504. if (firstOFDMloc == len)
  2505. {
  2506. pBssid->NetworkTypeInUse = os802_11DS;
  2507. } else {
  2508. pBssid->NetworkTypeInUse = os802_11OFDM24;
  2509. }
  2510. } else {
  2511. pBssid->NetworkTypeInUse = os802_11OFDM5;
  2512. }
  2513. pBssid->IELength = 0;
  2514. /* copy fixed IEs from site entry */
  2515. pFixedIes = (OS_802_11_FIXED_IEs*)&pBssid->IEs[pBssid->IELength];
  2516. os_memoryCopy(pSiteMgr->hOs, (void *)pFixedIes->TimeStamp, &pSiteEntry->localTimeStamp, sizeof(pSiteEntry->localTimeStamp));
  2517. pFixedIes->BeaconInterval = pSiteEntry->beaconInterval;
  2518. pFixedIes->Capabilities = pSiteEntry->capabilities;
  2519. pBssid->IELength += sizeof(OS_802_11_FIXED_IEs);
  2520. pVarIes = (OS_802_11_VARIABLE_IEs*)&pBssid->IEs[pBssid->IELength];
  2521. if (!allVarIes)
  2522. { /* copy only several variable IEs */
  2523. /* copy SSID */
  2524. pVarIes->ElementID = SSID_IE_ID;
  2525. pVarIes->Length = pSiteEntry->ssid.len;
  2526. os_memoryCopy(pSiteMgr->hOs, (void *)pVarIes->data, (void *)pSiteEntry->ssid.ssidString, pSiteEntry->ssid.len);
  2527. pBssid->IELength += (pVarIes->Length + 2);
  2528. /* copy RATES */
  2529. pVarIes = (OS_802_11_VARIABLE_IEs*)&pBssid->IEs[pBssid->IELength];
  2530. pVarIes->ElementID = SUPPORTED_RATES_IE_ID;
  2531. bitMapToNetworkStringRates(pSiteEntry->rateMask.supportedRateMask, pSiteEntry->rateMask.basicRateMask,
  2532. (UINT8 *)pVarIes->data, &len, &firstOFDMloc);
  2533. pVarIes->Length = len;
  2534. pBssid->IELength += (pVarIes->Length + 2);
  2535. /* copy FH */
  2536. pVarIes = (OS_802_11_VARIABLE_IEs*)&pBssid->IEs[pBssid->IELength];
  2537. pVarIes->ElementID = FH_PARAMETER_SET_IE_ID;
  2538. pVarIes->Length = DOT11_FH_PARAMS_ELE_LEN;
  2539. os_memoryCopy(pSiteMgr->hOs, (void *)pVarIes->data, &pSiteEntry->FHParams.dwellTime, sizeof(pSiteEntry->FHParams.dwellTime));
  2540. os_memoryCopy(pSiteMgr->hOs, (void *)&pVarIes->data[2], &pSiteEntry->FHParams.hopSet, sizeof(pSiteEntry->FHParams.hopSet));
  2541. os_memoryCopy(pSiteMgr->hOs, (void *)&pVarIes->data[3], &pSiteEntry->FHParams.hopPattern, sizeof(pSiteEntry->FHParams.hopPattern));
  2542. pVarIes->data[4] = 1;
  2543. pBssid->IELength += (pVarIes->Length + 2);
  2544. /* copy DS */
  2545. pVarIes = (OS_802_11_VARIABLE_IEs*)&pBssid->IEs[pBssid->IELength];
  2546. pVarIes->ElementID = DS_PARAMETER_SET_IE_ID;
  2547. pVarIes->Length = DOT11_DS_PARAMS_ELE_LEN;
  2548. os_memoryCopy(pSiteMgr->hOs, (void *)pVarIes->data, &pSiteEntry->channel, DOT11_DS_PARAMS_ELE_LEN);
  2549. pBssid->IELength += (pVarIes->Length + 2);
  2550. /* copy RSN information elements */
  2551. rsnIeLength = 0;
  2552. for (index=0; index<MAX_RSN_IE && pSiteEntry->pRsnIe[index].hdr.eleLen>0; index++)
  2553. {
  2554. pVarIes = (OS_802_11_VARIABLE_IEs*)&pBssid->IEs[pBssid->IELength+rsnIeLength];
  2555. pVarIes->ElementID = pSiteEntry->pRsnIe[index].hdr.eleId;
  2556. pVarIes->Length = pSiteEntry->pRsnIe[index].hdr.eleLen;
  2557. os_memoryCopy(pSiteMgr->hOs, (void *)pVarIes->data, (void *)pSiteEntry->pRsnIe[index].rsnIeData, pSiteEntry->pRsnIe[index].hdr.eleLen);
  2558. rsnIeLength += pSiteEntry->pRsnIe[index].hdr.eleLen+2;
  2559. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2560. ("RSN IE ID=%d, Length=%x\n", pVarIes->ElementID, pVarIes->Length));
  2561. WLAN_REPORT_HEX_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, (UINT8 *)pVarIes->data,pVarIes->Length);
  2562. }
  2563. pBssid->IELength += pSiteEntry->rsnIeLen;
  2564. /* create information element for the WME/EXC.
  2565. Note that the existence of these IEs should be considered as a fact that the site supports this feature.
  2566. by alcel
  2567. */
  2568. if (pSiteEntry->WMESupported)
  2569. {
  2570. /* oui */
  2571. UINT8 ouiWME[3] = { 0x50,0xf2,0x01};
  2572. dot11_WME_PARAM_t *pWMEParams;
  2573. /* fill in the general element parameters */
  2574. pVarIes = (OS_802_11_VARIABLE_IEs*)&pBssid->IEs[pBssid->IELength];
  2575. pVarIes->ElementID =DOT11_WME_ELE_ID;
  2576. pVarIes->Length = DOT11_WME_PARAM_ELE_LEN;
  2577. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2578. ("WMESupported ID=%d, Length=%x\n", pVarIes->ElementID, pVarIes->Length));
  2579. /* fill in the specific element parameters */
  2580. pWMEParams = (dot11_WME_PARAM_t *) pVarIes;
  2581. os_memoryCopy(pSiteMgr->hOs,(void *)pWMEParams->OUI,ouiWME,3);
  2582. pWMEParams->OUIType = dot11_WME_OUI_TYPE;
  2583. pWMEParams->OUISubType = dot11_WME_OUI_SUB_TYPE_PARAMS_IE;
  2584. pWMEParams->version = dot11_WME_VERSION;
  2585. pWMEParams->ACInfoField = dot11_WME_ACINFO_MASK & pSiteEntry->lastWMEParameterCnt;
  2586. /* fill in the data */
  2587. os_memoryCopy(pSiteMgr->hOs,&(pWMEParams->WME_ACParameteres),&(pSiteEntry->WMEParameters),sizeof(ACParameters_t));
  2588. /* update the general length */
  2589. pBssid->IELength += (pVarIes->Length + 2);
  2590. }
  2591. /* copy WPS information elements */
  2592. if ((pSiteEntry->probeRecv) &&
  2593. (pSiteEntry->siteType != SITE_PRIMARY))
  2594. {
  2595. pSiteEntryIeBuffer = pSiteEntry->probeRespBuffer;
  2596. ieLength = pSiteEntry->probeRespLength;
  2597. }
  2598. else
  2599. {
  2600. pSiteEntryIeBuffer = pSiteEntry->beaconBuffer;
  2601. ieLength = pSiteEntry->beaconLength;
  2602. }
  2603. parseIeBuffer(pSiteMgr->hOs, pSiteEntryIeBuffer, ieLength, DOT11_WPS_ELE_ID, &pDesiredIe, wpsOuiBuffer, DOT11_WPS_OUI_LEN);
  2604. if (pDesiredIe)
  2605. {
  2606. pVarIes = (OS_802_11_VARIABLE_IEs*)&pBssid->IEs[pBssid->IELength];
  2607. pVarIes->ElementID = DOT11_WPS_ELE_ID;
  2608. pVarIes->Length = *((UINT8*)(pDesiredIe + 1));
  2609. os_memoryCopy(pSiteMgr->hOs, (void *)pVarIes->data, (UINT8*)(pDesiredIe+2), pVarIes->Length);
  2610. pBssid->IELength += (pVarIes->Length + 2);
  2611. }
  2612. }
  2613. else
  2614. { /* Copy all variable IEs */
  2615. if ((pSiteEntry->probeRecv) &&
  2616. (pSiteEntry->siteType != SITE_PRIMARY))
  2617. {
  2618. pSiteEntryIeBuffer = pSiteEntry->probeRespBuffer;
  2619. ieLength = pSiteEntry->probeRespLength;
  2620. }
  2621. else
  2622. {
  2623. pSiteEntryIeBuffer = pSiteEntry->beaconBuffer;
  2624. ieLength = pSiteEntry->beaconLength;
  2625. }
  2626. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2627. ("Copy all variable IEs Length=%x\n", ieLength));
  2628. WLAN_REPORT_HEX_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2629. pSiteEntryIeBuffer, ieLength);
  2630. os_memoryCopy(pSiteMgr->hOs, pVarIes, pSiteEntryIeBuffer, ieLength);
  2631. pBssid->IELength += ieLength;
  2632. }
  2633. pBssid->Length = sizeof(OS_802_11_BSSID_EX) + pBssid->IELength - 1;
  2634. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2635. ("BSSID MAC = %x-%x-%x-%x-%x-%x\n",
  2636. pBssid->MacAddress[0], pBssid->MacAddress[1], pBssid->MacAddress[2],
  2637. pBssid->MacAddress[3], pBssid->MacAddress[4], pBssid->MacAddress[5]));
  2638. #ifdef DBG_BSSIS_NAME_PRINT
  2639. os_memoryCopy(pSiteMgr->hOs, tempName, &pBssid->Ssid.Ssid[0], pBssid->Ssid.SsidLength);
  2640. tempName[pBssid->Ssid.SsidLength] ='\0';
  2641. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2642. ("BSSID NAME = %s\n",tempName)) ;
  2643. #endif
  2644. /* make sure length is 4 bytes aligned */
  2645. if (pBssid->Length % 4)
  2646. {
  2647. pBssid->Length += (4 - (pBssid->Length % 4));
  2648. }
  2649. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2650. ("BSSID length after alignment = %d\n", pBssid->Length));
  2651. pData += pBssid->Length;
  2652. length += pBssid->Length;
  2653. i++;
  2654. }
  2655. bssidList->NumberOfItems += i;
  2656. if(pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode == DOT11_DUAL_MODE)
  2657. {
  2658. /* change site table */
  2659. if(currTable == &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables)
  2660. currTable = (siteTablesParams_t *)&pSiteMgr->pSitesMgmtParams->dot11A_sitesTables;
  2661. else
  2662. currTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
  2663. }
  2664. else
  2665. break;
  2666. }
  2667. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2668. ("Exiting getBssidList, site count = %i, length = %d, pData = 0x%X\n",
  2669. bssidList->NumberOfItems, length, (UINT32)pData));
  2670. *pLength = length;
  2671. return OK;
  2672. }
  2673. /***********************************************************************
  2674. * getPrimaryBssid
  2675. ***********************************************************************
  2676. DESCRIPTION: Called by the OS abstraction layer in order to get the BSSID list from the site table
  2677. INPUT: pSiteMgr - site mgr handle.
  2678. OUTPUT: bssidList - BSSID list pointer
  2679. RETURN:
  2680. ************************************************************************/
  2681. static TI_STATUS getPrimaryBssid(siteMgr_t *pSiteMgr, OS_802_11_BSSID_EX *primaryBssid, UINT32 *pLength)
  2682. {
  2683. siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
  2684. UINT32 len, firstOFDMloc = 0;
  2685. OS_802_11_FIXED_IEs *pFixedIes;
  2686. OS_802_11_VARIABLE_IEs *pVarIes;
  2687. UINT32 length;
  2688. if ((primaryBssid==NULL) || (pLength==NULL))
  2689. {
  2690. *pLength = 0;
  2691. WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2692. ("getPrimaryBssid, one of the ptr is NULL, primaryBssid=%p,pLength=%p \n",
  2693. primaryBssid, pLength));
  2694. return NOK;
  2695. }
  2696. if (pPrimarySite==NULL)
  2697. {
  2698. *pLength = 0;
  2699. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2700. ("getPrimaryBssid, pPrimarySite is NULL \n"));
  2701. return NOK;
  2702. }
  2703. length = pPrimarySite->beaconLength + sizeof(OS_802_11_BSSID_EX) + sizeof(OS_802_11_FIXED_IEs);
  2704. if (length > *pLength)
  2705. {
  2706. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2707. ("getPrimaryBssid, insufficient length, required length=%d, pLength=%d \n",
  2708. length, *pLength));
  2709. *pLength = length;
  2710. return NOK;
  2711. }
  2712. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Entering getPrimaryBssid, length = %d\n", *pLength));
  2713. primaryBssid->Length = length;
  2714. /* MacAddress */
  2715. os_memoryCopy(pSiteMgr->hOs, (void *)primaryBssid->MacAddress, (void *)&(pPrimarySite->bssid.addr), MAC_ADDR_LEN);
  2716. /* Capabilities */
  2717. primaryBssid->Union.Capabilities = pPrimarySite->capabilities;
  2718. /* SSID */
  2719. os_memoryZero(pSiteMgr->hOs, &(primaryBssid->Ssid.Ssid), MAX_SSID_LEN);
  2720. if (pPrimarySite->ssid.len > MAX_SSID_LEN)
  2721. {
  2722. pPrimarySite->ssid.len = MAX_SSID_LEN;
  2723. }
  2724. os_memoryCopy(pSiteMgr->hOs, (void *)primaryBssid->Ssid.Ssid, (void *)&(pPrimarySite->ssid.ssidString), pPrimarySite->ssid.len);
  2725. primaryBssid->Ssid.SsidLength = pPrimarySite->ssid.len;
  2726. /* privacy */
  2727. primaryBssid->Privacy = pPrimarySite->privacy;
  2728. /* RSSI */
  2729. primaryBssid->Rssi = pPrimarySite->rssi;
  2730. /* NetworkTypeInUse & SupportedRates */
  2731. /* SupportedRates */
  2732. os_memoryZero(pSiteMgr->hOs, (void *)primaryBssid->SupportedRates, sizeof(OS_802_11_RATES_EX));
  2733. bitMapToNetworkStringRates(pPrimarySite->rateMask.supportedRateMask,
  2734. pPrimarySite->rateMask.basicRateMask,
  2735. (UINT8 *)primaryBssid->SupportedRates,
  2736. &len, &firstOFDMloc);
  2737. /* set network type acording to band and rates */
  2738. if (pPrimarySite->channel <= SITE_MGR_CHANNEL_B_G_MAX)
  2739. {
  2740. if (firstOFDMloc == len)
  2741. {
  2742. primaryBssid->NetworkTypeInUse = os802_11DS;
  2743. } else {
  2744. primaryBssid->NetworkTypeInUse = os802_11OFDM24;
  2745. }
  2746. } else {
  2747. primaryBssid->NetworkTypeInUse = os802_11OFDM5;
  2748. }
  2749. /* Configuration */
  2750. primaryBssid->Configuration.Length = sizeof(OS_802_11_CONFIGURATION);
  2751. primaryBssid->Configuration.BeaconPeriod = pPrimarySite->beaconInterval;
  2752. primaryBssid->Configuration.ATIMWindow = pPrimarySite->atimWindow;
  2753. primaryBssid->Configuration.Union.channel = Chan2Freq(pPrimarySite->channel);
  2754. primaryBssid->Configuration.FHConfig.Length = sizeof(OS_802_11_CONFIGURATION_FH);
  2755. primaryBssid->Configuration.FHConfig.DwellTime = pPrimarySite->FHParams.dwellTime;
  2756. primaryBssid->Configuration.FHConfig.HopPattern = pPrimarySite->FHParams.hopPattern;
  2757. primaryBssid->Configuration.FHConfig.HopSet = pPrimarySite->FHParams.hopSet;
  2758. /* InfrastructureMode */
  2759. if (pPrimarySite->bssType == BSS_INDEPENDENT)
  2760. primaryBssid->InfrastructureMode = os802_11IBSS;
  2761. else
  2762. primaryBssid->InfrastructureMode = os802_11Infrastructure;
  2763. primaryBssid->IELength = 0;
  2764. /* copy fixed IEs from site entry */
  2765. pFixedIes = (OS_802_11_FIXED_IEs*)&primaryBssid->IEs[primaryBssid->IELength];
  2766. os_memoryCopy(pSiteMgr->hOs, (void *)pFixedIes->TimeStamp, (void *)&pPrimarySite->localTimeStamp, sizeof(pPrimarySite->localTimeStamp));
  2767. pFixedIes->BeaconInterval = pPrimarySite->beaconInterval;
  2768. pFixedIes->Capabilities = pPrimarySite->capabilities;
  2769. primaryBssid->IELength += sizeof(OS_802_11_FIXED_IEs);
  2770. pVarIes = (OS_802_11_VARIABLE_IEs*)&primaryBssid->IEs[primaryBssid->IELength];
  2771. /* Coppy all variable IEs */
  2772. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2773. ("Coppy all variable beaconLength=%d, IELength=%d\n",
  2774. pPrimarySite->beaconLength, primaryBssid->IELength));
  2775. WLAN_REPORT_HEX_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2776. pPrimarySite->beaconBuffer, pPrimarySite->beaconLength);
  2777. os_memoryCopy(pSiteMgr->hOs, pVarIes, pPrimarySite->beaconBuffer, pPrimarySite->beaconLength);
  2778. primaryBssid->IELength += pPrimarySite->beaconLength;
  2779. primaryBssid->Length = sizeof(OS_802_11_BSSID_EX) + primaryBssid->IELength - 1;
  2780. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2781. ("BSSID MAC = %x-%x-%x-%x-%x-%x\n",
  2782. primaryBssid->MacAddress[0], primaryBssid->MacAddress[1], primaryBssid->MacAddress[2],
  2783. primaryBssid->MacAddress[3], primaryBssid->MacAddress[4], primaryBssid->MacAddress[5]));
  2784. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2785. ("primaryBssid is\n"));
  2786. WLAN_REPORT_HEX_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2787. (UINT8*)primaryBssid, primaryBssid->Length);
  2788. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2789. ("Exiting getBssidList, length =%d, IELength=%d \n",
  2790. primaryBssid->Length,
  2791. primaryBssid->IELength));
  2792. *pLength = primaryBssid->Length;
  2793. return OK;
  2794. }
  2795. /***********************************************************************
  2796. * siteMgr_printPrimarySiteDesc
  2797. ***********************************************************************
  2798. DESCRIPTION: Called by the OS abstraction layer in order to get the primary site description
  2799. INPUT: pSiteMgr - site mgr handle.
  2800. supplyExtendedInfo - If OS_802_11_BSSID_EX structure should be used (extended info)
  2801. (Assuming that if this function is called with TRUE, enough memory was allocated to hold the extended info)
  2802. OUTPUT: pPrimarySiteDesc - Primary site description pointer
  2803. RETURN:
  2804. ************************************************************************/
  2805. void siteMgr_printPrimarySiteDesc(TI_HANDLE hSiteMgr )
  2806. {
  2807. siteMgr_t *pSiteMgr = (siteMgr_t*) hSiteMgr;
  2808. #ifdef REPORT_LOG
  2809. siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
  2810. macAddress_t *bssid = &pPrimarySite->bssid;
  2811. #endif
  2812. WLAN_REPORT_INFORMATION( pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2813. ("-- SSID = %s \n",pPrimarySite->ssid.ssidString) );
  2814. WLAN_REPORT_INFORMATION( pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2815. ("-- BSSID = %02X-%02X-%02X-%02X-%02X-%02X\n",
  2816. bssid->addr[0], bssid->addr[1], bssid->addr[2],
  2817. bssid->addr[3], bssid->addr[4], bssid->addr[5]) );
  2818. }
  2819. /***********************************************************************
  2820. * getPrimarySiteDesc
  2821. ***********************************************************************
  2822. DESCRIPTION: Called by the OS abstraction layer in order to get the primary site description
  2823. INPUT: pSiteMgr - site mgr handle.
  2824. supplyExtendedInfo - If OS_802_11_BSSID_EX structure should be used (extended info)
  2825. (Assuming that if this function is called with TRUE, enough memory was allocated to hold the extended info)
  2826. OUTPUT: pPrimarySiteDesc - Primary site description pointer
  2827. RETURN:
  2828. ************************************************************************/
  2829. static void getPrimarySiteDesc(siteMgr_t *pSiteMgr, OS_802_11_BSSID *pPrimarySiteDesc, BOOL supplyExtendedInfo)
  2830. {
  2831. siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
  2832. OS_802_11_BSSID_EX *pExPrimarySiteDesc = (OS_802_11_BSSID_EX *) pPrimarySiteDesc;
  2833. UINT32 len, firstOFDMloc = 0;
  2834. OS_802_11_FIXED_IEs *pFixedIes;
  2835. OS_802_11_VARIABLE_IEs *pVarIes;
  2836. UINT8 rsnIeLength,index;
  2837. OS_802_11_RATES_EX SupportedRates;
  2838. if (pPrimarySiteDesc == NULL)
  2839. {
  2840. return;
  2841. }
  2842. if (pPrimarySite == NULL)
  2843. {
  2844. os_memoryZero(pSiteMgr->hOs, pPrimarySiteDesc, sizeof(OS_802_11_BSSID));
  2845. return;
  2846. }
  2847. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2848. ("getPrimarySiteDesc - enter\n"));
  2849. /* If an "extended" request has been made - update the length accordingly */
  2850. if (supplyExtendedInfo == FALSE)
  2851. pPrimarySiteDesc->Length = sizeof(OS_802_11_BSSID);
  2852. else
  2853. pPrimarySiteDesc->Length = sizeof(OS_802_11_BSSID_EX);
  2854. /* MacAddress */
  2855. os_memoryCopy(pSiteMgr->hOs, (void *)pPrimarySiteDesc->MacAddress, (void *)&(pPrimarySite->bssid.addr), MAC_ADDR_LEN);
  2856. /* Capabilities */
  2857. pPrimarySiteDesc->Union.Capabilities = pPrimarySite->capabilities;
  2858. /* SSID */
  2859. os_memoryCopy(pSiteMgr->hOs, (void *)&(pPrimarySiteDesc->Ssid.Ssid[0]), (void *)&(pPrimarySite->ssid.ssidString[0]), pPrimarySite->ssid.len);
  2860. pPrimarySiteDesc->Ssid.SsidLength = pPrimarySite->ssid.len;
  2861. /* privacy */
  2862. pPrimarySiteDesc->Privacy = pPrimarySite->privacy;
  2863. /* RSSI */
  2864. pPrimarySiteDesc->Rssi = pPrimarySite->rssi;
  2865. bitMapToNetworkStringRates(pPrimarySite->rateMask.supportedRateMask,
  2866. pPrimarySite->rateMask.basicRateMask,
  2867. &SupportedRates[0],
  2868. &len, &firstOFDMloc);
  2869. /* set network type acording to band and rates */
  2870. if (pPrimarySite->channel <= SITE_MGR_CHANNEL_B_G_MAX)
  2871. {
  2872. if (firstOFDMloc == len)
  2873. {
  2874. pPrimarySiteDesc->NetworkTypeInUse = os802_11DS;
  2875. } else {
  2876. pPrimarySiteDesc->NetworkTypeInUse = os802_11OFDM24;
  2877. }
  2878. } else {
  2879. pPrimarySiteDesc->NetworkTypeInUse = os802_11OFDM5;
  2880. }
  2881. pPrimarySiteDesc->Configuration.Length = sizeof(OS_802_11_CONFIGURATION);
  2882. pPrimarySiteDesc->Configuration.BeaconPeriod = pPrimarySite->beaconInterval;
  2883. pPrimarySiteDesc->Configuration.ATIMWindow = pPrimarySite->atimWindow;
  2884. pPrimarySiteDesc->Configuration.Union.channel = pPrimarySite->channel;
  2885. pPrimarySiteDesc->Configuration.FHConfig.Length = sizeof(OS_802_11_CONFIGURATION_FH);
  2886. pPrimarySiteDesc->Configuration.FHConfig.DwellTime = pPrimarySite->FHParams.dwellTime;
  2887. pPrimarySiteDesc->Configuration.FHConfig.HopPattern = pPrimarySite->FHParams.hopPattern;
  2888. pPrimarySiteDesc->Configuration.FHConfig.HopSet = pPrimarySite->FHParams.hopSet;
  2889. if (pPrimarySite->bssType == BSS_INDEPENDENT)
  2890. pPrimarySiteDesc->InfrastructureMode = os802_11IBSS;
  2891. else
  2892. pPrimarySiteDesc->InfrastructureMode = os802_11Infrastructure;
  2893. /* SupportedRates */
  2894. if (supplyExtendedInfo == FALSE)
  2895. os_memoryZero(pSiteMgr->hOs, (void *)pPrimarySiteDesc->SupportedRates, sizeof(OS_802_11_RATES));
  2896. else
  2897. os_memoryZero(pSiteMgr->hOs, (void *)pPrimarySiteDesc->SupportedRates, sizeof(OS_802_11_RATES_EX));
  2898. if (supplyExtendedInfo == FALSE)
  2899. os_memoryCopy(pSiteMgr->hOs, (void *)pPrimarySiteDesc->SupportedRates, (void *)SupportedRates, sizeof(OS_802_11_RATES));
  2900. else
  2901. os_memoryCopy(pSiteMgr->hOs, (void *)pPrimarySiteDesc->SupportedRates, (void *)SupportedRates, sizeof(OS_802_11_RATES_EX));
  2902. if (supplyExtendedInfo == TRUE)
  2903. {
  2904. pExPrimarySiteDesc->IELength = 0;
  2905. /* copy fixed IEs from site entry */
  2906. pFixedIes = (OS_802_11_FIXED_IEs*)&pExPrimarySiteDesc->IEs[pExPrimarySiteDesc->IELength];
  2907. os_memoryCopy(pSiteMgr->hOs, (void *)pFixedIes->TimeStamp, (void *)&pPrimarySite->localTimeStamp, sizeof(pPrimarySite->localTimeStamp));
  2908. pFixedIes->BeaconInterval = pPrimarySite->beaconInterval;
  2909. pFixedIes->Capabilities = pPrimarySite->capabilities;
  2910. pExPrimarySiteDesc->IELength += sizeof(OS_802_11_FIXED_IEs);
  2911. /* copy variable IEs */
  2912. /* copy SSID */
  2913. pVarIes = (OS_802_11_VARIABLE_IEs*)&pExPrimarySiteDesc->IEs[pExPrimarySiteDesc->IELength];
  2914. pVarIes->ElementID = SSID_IE_ID;
  2915. pVarIes->Length = pPrimarySite->ssid.len;
  2916. os_memoryCopy(pSiteMgr->hOs, (void *)pVarIes->data, (void *)pPrimarySite->ssid.ssidString, pPrimarySite->ssid.len);
  2917. pExPrimarySiteDesc->IELength += (pVarIes->Length + 2);
  2918. /* copy RATES */
  2919. pVarIes = (OS_802_11_VARIABLE_IEs*)&pExPrimarySiteDesc->IEs[pExPrimarySiteDesc->IELength];
  2920. pVarIes->ElementID = SUPPORTED_RATES_IE_ID;
  2921. bitMapToNetworkStringRates(pPrimarySite->rateMask.supportedRateMask, pPrimarySite->rateMask.basicRateMask,
  2922. (UINT8 *)pVarIes->data, &len, &firstOFDMloc);
  2923. pVarIes->Length = len;
  2924. pExPrimarySiteDesc->IELength += (pVarIes->Length + 2);
  2925. /* copy FH */
  2926. pVarIes = (OS_802_11_VARIABLE_IEs*)&pExPrimarySiteDesc->IEs[pExPrimarySiteDesc->IELength];
  2927. pVarIes->ElementID = FH_PARAMETER_SET_IE_ID;
  2928. pVarIes->Length = DOT11_FH_PARAMS_ELE_LEN;
  2929. os_memoryCopy(pSiteMgr->hOs, (void *)pVarIes->data, (void *)&pPrimarySite->FHParams.dwellTime, sizeof(pPrimarySite->FHParams.dwellTime));
  2930. os_memoryCopy(pSiteMgr->hOs, (void *)&pVarIes->data[2], (void *)&pPrimarySite->FHParams.hopSet, sizeof(pPrimarySite->FHParams.hopSet));
  2931. os_memoryCopy(pSiteMgr->hOs, (void *)&pVarIes->data[3], (void *)&pPrimarySite->FHParams.hopPattern, sizeof(pPrimarySite->FHParams.hopPattern));
  2932. pVarIes->data[4] = 1;
  2933. pExPrimarySiteDesc->IELength += (pVarIes->Length + 2);
  2934. /* copy DS */
  2935. pVarIes = (OS_802_11_VARIABLE_IEs*)&pExPrimarySiteDesc->IEs[pExPrimarySiteDesc->IELength];
  2936. pVarIes->ElementID = DS_PARAMETER_SET_IE_ID;
  2937. pVarIes->Length = DOT11_DS_PARAMS_ELE_LEN;
  2938. os_memoryCopy(pSiteMgr->hOs, (void *)pVarIes->data, (void *)&pPrimarySite->channel, DOT11_DS_PARAMS_ELE_LEN);
  2939. pExPrimarySiteDesc->IELength += (pVarIes->Length + 2);
  2940. /* copy RSN information elements */
  2941. rsnIeLength = 0;
  2942. for (index=0; index<MAX_RSN_IE && pPrimarySite->pRsnIe[index].hdr.eleLen>0; index++)
  2943. {
  2944. pVarIes = (OS_802_11_VARIABLE_IEs*)&pExPrimarySiteDesc->IEs[pExPrimarySiteDesc->IELength+rsnIeLength];
  2945. pVarIes->ElementID = pPrimarySite->pRsnIe[index].hdr.eleId;
  2946. pVarIes->Length = pPrimarySite->pRsnIe[index].hdr.eleLen;
  2947. os_memoryCopy(pSiteMgr->hOs, (void *)pVarIes->data, (void *)pPrimarySite->pRsnIe[index].rsnIeData, pPrimarySite->pRsnIe[index].hdr.eleLen);
  2948. rsnIeLength += pPrimarySite->pRsnIe[index].hdr.eleLen+2;
  2949. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2950. ("RSN IE ID=%d, Length=%x\n", pVarIes->ElementID, pVarIes->Length));
  2951. WLAN_REPORT_HEX_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, (UINT8 *)pVarIes->data,pVarIes->Length);
  2952. }
  2953. pExPrimarySiteDesc->IELength += pPrimarySite->rsnIeLen;
  2954. pExPrimarySiteDesc->Length = sizeof(OS_802_11_BSSID_EX) + pExPrimarySiteDesc->IELength - 1;
  2955. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2956. ("BSSID MAC = %x-%x-%x-%x-%x-%x\n",
  2957. pExPrimarySiteDesc->MacAddress[0], pExPrimarySiteDesc->MacAddress[1], pExPrimarySiteDesc->MacAddress[2],
  2958. pExPrimarySiteDesc->MacAddress[3], pExPrimarySiteDesc->MacAddress[4], pExPrimarySiteDesc->MacAddress[5]));
  2959. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2960. ("pExPrimarySiteDesc length before alignment = %d\n", pExPrimarySiteDesc->Length));
  2961. /* make sure length is 4 bytes aligned */
  2962. if (pExPrimarySiteDesc->Length % 4)
  2963. {
  2964. pExPrimarySiteDesc->Length += (4 - (pExPrimarySiteDesc->Length % 4));
  2965. }
  2966. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  2967. ("pExPrimarySiteDesc length after alignment = %d\n", pExPrimarySiteDesc->Length));
  2968. }
  2969. }
  2970. /***********************************************************************
  2971. * translateRateMaskToValue
  2972. ***********************************************************************
  2973. DESCRIPTION: Called by the function 'siteMgr_config()' in order to translate the rate mask read
  2974. from registry to rate value
  2975. INPUT: pSiteMgr - site mgr handle.
  2976. rateMask - Rate mask
  2977. OUTPUT: The rate after the translation
  2978. RETURN:
  2979. ************************************************************************/
  2980. static rate_e translateRateMaskToValue(siteMgr_t *pSiteMgr, UINT32 rateMask)
  2981. {
  2982. if (rateMask & DRV_RATE_MASK_54_OFDM)
  2983. return DRV_RATE_54M;
  2984. if (rateMask & DRV_RATE_MASK_48_OFDM)
  2985. return DRV_RATE_48M;
  2986. if (rateMask & DRV_RATE_MASK_36_OFDM)
  2987. return DRV_RATE_36M;
  2988. if (rateMask & DRV_RATE_MASK_24_OFDM)
  2989. return DRV_RATE_24M;
  2990. if (rateMask & DRV_RATE_MASK_22_PBCC)
  2991. return DRV_RATE_22M;
  2992. if (rateMask & DRV_RATE_MASK_18_OFDM)
  2993. return DRV_RATE_18M;
  2994. if (rateMask & DRV_RATE_MASK_12_OFDM)
  2995. return DRV_RATE_12M;
  2996. if (rateMask & DRV_RATE_MASK_11_CCK)
  2997. return DRV_RATE_11M;
  2998. if (rateMask & DRV_RATE_MASK_9_OFDM)
  2999. return DRV_RATE_9M;
  3000. if (rateMask & DRV_RATE_MASK_6_OFDM)
  3001. return DRV_RATE_6M;
  3002. if (rateMask & DRV_RATE_MASK_5_5_CCK)
  3003. return DRV_RATE_5_5M;
  3004. if (rateMask & DRV_RATE_MASK_2_BARKER)
  3005. return DRV_RATE_2M;
  3006. if (rateMask & DRV_RATE_MASK_1_BARKER)
  3007. return DRV_RATE_1M;
  3008. WLAN_REPORT_WARNING(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Translate rate mask to value, mask is 0x%X\n", rateMask));
  3009. if(pSiteMgr->siteMgrOperationalMode != DOT11_A_MODE)
  3010. return DRV_RATE_1M;
  3011. else
  3012. return DRV_RATE_6M;
  3013. }
  3014. /***********************************************************************
  3015. * getSupportedRateSet
  3016. ***********************************************************************
  3017. DESCRIPTION: Called by the function 'siteMgr_getParam()' in order to get the supported rate set
  3018. Build an array of network rates based on the max active & max basic rates
  3019. INPUT: pSiteMgr - site mgr handle.
  3020. OUTPUT: pRatesSet - The array built
  3021. RETURN:
  3022. ************************************************************************/
  3023. static void getSupportedRateSet(siteMgr_t *pSiteMgr, rates_t *pRatesSet)
  3024. {
  3025. UINT32 dontCareParam;
  3026. UINT32 len = 0;
  3027. bitMapToNetworkStringRates(pSiteMgr->pDesiredParams->siteMgrRegstrySuppRateMask,
  3028. pSiteMgr->pDesiredParams->siteMgrRegstryBasicRateMask,
  3029. (UINT8 *)pRatesSet->ratesString, &len, &dontCareParam);
  3030. pRatesSet->len = (UINT8) len;
  3031. }
  3032. /***********************************************************************
  3033. * setSupportedRateSet
  3034. ***********************************************************************
  3035. DESCRIPTION: Called by the function 'siteMgr_setParam()' in order to set the supported rate set
  3036. Go over the input array and set the max active & max basic rates. (after translation from network
  3037. rates to host rates ofcourse)
  3038. If max basic rate is bigger than the mac active one, print an error.
  3039. If the basic or active rate are different than the ones already stored by the site manager,
  3040. it returns RE_SCAN_NEEDED
  3041. INPUT: pSiteMgr - site mgr handle.
  3042. pRatesSet - The rates array received
  3043. OUTPUT:
  3044. RETURN: RE_SCAN_NEEDED if re scan is needed, OK on success
  3045. ************************************************************************/
  3046. static TI_STATUS setSupportedRateSet(siteMgr_t *pSiteMgr, rates_t *pRatesSet)
  3047. {
  3048. UINT8 i,j, drvRate;
  3049. rate_e maxActiveRate = (rate_e)0, maxBasicRate = (rate_e)0;
  3050. UINT32 suppBitMap, basicBitMap;
  3051. static rate_e basicRates_G[] = {DRV_RATE_1M,DRV_RATE_2M,DRV_RATE_5_5M,DRV_RATE_11M};
  3052. static rate_e basicRates_A[] = {DRV_RATE_6M,DRV_RATE_12M,DRV_RATE_24M};
  3053. rate_e* currentBasicRates;
  3054. UINT32 currentBasicRatesLength;
  3055. #ifndef NET_BASIC_MASK
  3056. #define NET_BASIC_MASK 0x80 /* defined in common/src/utils/utils.c */
  3057. #endif
  3058. if(pSiteMgr->siteMgrOperationalMode == DOT11_A_MODE)
  3059. {
  3060. currentBasicRates = &basicRates_A[0];
  3061. currentBasicRatesLength = sizeof(basicRates_A) / sizeof(basicRates_A[0]);
  3062. }
  3063. else
  3064. {
  3065. currentBasicRates = &basicRates_G[0];
  3066. currentBasicRatesLength = sizeof(basicRates_G) / sizeof(basicRates_G[0]);
  3067. }
  3068. /* Basic rates must be supported. If one of 1M,2M,5.5M,11M is not supported fail.*/
  3069. for (j=0;j < currentBasicRatesLength;j++)
  3070. {
  3071. for (i = 0; i < pRatesSet->len; i++)
  3072. {
  3073. drvRate = utilityToHostRate(pRatesSet->ratesString[i]);
  3074. if ((drvRate & ( NET_BASIC_MASK-1)) == currentBasicRates[j])
  3075. break;
  3076. }
  3077. /* not all the basic rates are supported! Failure*/
  3078. if (i == pRatesSet->len)
  3079. {
  3080. WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Rates set must contain the basic set! Failing\n"));
  3081. return PARAM_VALUE_NOT_VALID;
  3082. }
  3083. }
  3084. for (i = 0; i < pRatesSet->len; i++)
  3085. {
  3086. drvRate = utilityToHostRate(pRatesSet->ratesString[i]);
  3087. if(pSiteMgr->siteMgrOperationalMode == DOT11_A_MODE)
  3088. {
  3089. if(drvRate < DRV_RATE_6M)
  3090. {
  3091. WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Notice, the driver configured in 11a mode, but CCK rate appears\n"));
  3092. return PARAM_VALUE_NOT_VALID;
  3093. }
  3094. }
  3095. else if(pSiteMgr->siteMgrOperationalMode == DOT11_B_MODE)
  3096. {
  3097. if(drvRate >= DRV_RATE_6M)
  3098. {
  3099. WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Notice, the driver configured in 11b mode, but OFDM rate appears\n"));
  3100. return PARAM_VALUE_NOT_VALID;
  3101. }
  3102. }
  3103. maxActiveRate = MAX((rate_e)drvRate, maxActiveRate);
  3104. }
  3105. for (i = 0; i < pRatesSet->len; i++)
  3106. {
  3107. if (IS_BASIC_RATE(pRatesSet->ratesString[i]))
  3108. maxBasicRate = MAX(utilityToHostRate(pRatesSet->ratesString[i]), maxBasicRate);
  3109. }
  3110. /* If the basic rate is bigger than the supported one, we print an error */
  3111. if (pSiteMgr->pDesiredParams->siteMgrDesiredRatePair.maxBasic > pSiteMgr->pDesiredParams->siteMgrDesiredRatePair.maxActive)
  3112. {
  3113. WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Notice, the rates configuration is invalid, basic rate is bigger than supported, Max Basic: %d Max Supported: %d\n", pSiteMgr->pDesiredParams->siteMgrDesiredRatePair.maxBasic, pSiteMgr->pDesiredParams->siteMgrDesiredRatePair.maxActive));
  3114. return PARAM_VALUE_NOT_VALID;
  3115. }
  3116. pSiteMgr->pDesiredParams->siteMgrDesiredRatePair.maxActive = maxActiveRate;
  3117. pSiteMgr->pDesiredParams->siteMgrDesiredRatePair.maxBasic = maxBasicRate;
  3118. /* configure desired modulation */
  3119. if(maxActiveRate == DRV_RATE_22M)
  3120. pSiteMgr->pDesiredParams->siteMgrDesiredModulationType = DRV_MODULATION_PBCC;
  3121. else if(maxActiveRate < DRV_RATE_22M)
  3122. pSiteMgr->pDesiredParams->siteMgrDesiredModulationType = DRV_MODULATION_CCK;
  3123. else
  3124. pSiteMgr->pDesiredParams->siteMgrDesiredModulationType = DRV_MODULATION_OFDM;
  3125. networkStringToBitMapSuppRates(&suppBitMap,
  3126. (UINT8 *)pRatesSet->ratesString,
  3127. pRatesSet->len);
  3128. networkStringToBitMapBasicRates(&basicBitMap,
  3129. (UINT8 *)pRatesSet->ratesString,
  3130. pRatesSet->len);
  3131. if((pSiteMgr->pDesiredParams->siteMgrRegstryBasicRateMask != basicBitMap) ||
  3132. (pSiteMgr->pDesiredParams->siteMgrRegstrySuppRateMask != suppBitMap))
  3133. {
  3134. pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.supportedRateMask = suppBitMap;
  3135. pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask = basicBitMap;
  3136. pSiteMgr->pDesiredParams->siteMgrRegstryBasicRateMask = basicBitMap;
  3137. pSiteMgr->pDesiredParams->siteMgrRegstrySuppRateMask = suppBitMap;
  3138. /* Initialize Mutual Rates Matching */
  3139. pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask = pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask;
  3140. pSiteMgr->pDesiredParams->siteMgrMatchedSuppRateMask = pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.supportedRateMask;
  3141. pSiteMgr->pDesiredParams->siteMgrMatchedMaxBasicRate = getMaxRatefromBitmap(pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask);
  3142. pSiteMgr->pDesiredParams->siteMgrMatchedMaxActiveRate = getMaxRatefromBitmap(pSiteMgr->pDesiredParams->siteMgrMatchedSuppRateMask);
  3143. return RE_SCAN_NEEDED;
  3144. }
  3145. return OK;
  3146. }
  3147. /***********************************************************************
  3148. * pbccAlgorithm
  3149. ***********************************************************************
  3150. DESCRIPTION: Called by the following functions:
  3151. - systemConfig(), in the system configuration phase after the selection
  3152. - siteMgr_updateSite(), in a case of a primary site update & if a PBCC algorithm
  3153. is needed to be performed
  3154. Performs the PBCC algorithm
  3155. INPUT: hSiteMgr - site mgr handle.
  3156. OUTPUT:
  3157. RETURN: OK on always
  3158. ************************************************************************/
  3159. TI_STATUS pbccAlgorithm(TI_HANDLE hSiteMgr)
  3160. {
  3161. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  3162. paramInfo_t param;
  3163. siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
  3164. UINT32 bitMap = 0;
  3165. BOOL desiredTxRateSupported = FALSE;
  3166. UINT32 supportedRateMask ;
  3167. /* First set the data modulation. */
  3168. param.paramType = CTRL_DATA_CURRENT_MODULATION_TYPE_PARAM; /* Current Modulation Type */
  3169. param.content.ctrlDataCurrentModulationType = pSiteMgr->currentDataModulation;
  3170. ctrlData_setParam(pSiteMgr->hCtrlData, &param);
  3171. if (pPrimarySite->channel == SPECIAL_BG_CHANNEL)
  3172. supportedRateMask = (getSupportedRateMaskForSpecialBGchannel() & pSiteMgr->pDesiredParams->siteMgrMatchedSuppRateMask) ;
  3173. else
  3174. supportedRateMask = pSiteMgr->pDesiredParams->siteMgrMatchedSuppRateMask ;
  3175. validateDesiredTxRate(pSiteMgr->pDesiredParams->siteMgrCurrentDesiredTxRate,
  3176. pSiteMgr->currentDataModulation,
  3177. supportedRateMask,
  3178. &bitMap,
  3179. &desiredTxRateSupported);
  3180. if(desiredTxRateSupported == FALSE)
  3181. {
  3182. WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Notice, the rates configuration is invalid, desired tx rate is not supported => switched to auto"));
  3183. pSiteMgr->pDesiredParams->siteMgrCurrentDesiredTxRate = DRV_RATE_AUTO;
  3184. }
  3185. param.paramType = CTRL_DATA_CURRENT_SUPPORTED_RATE_MASK_PARAM;
  3186. param.content.ctrlDataCurrentRateMask = supportedRateMask;
  3187. /* clear the 22Mbps bit in case the PBCC is not allowed */
  3188. if(pSiteMgr->currentDataModulation != DRV_MODULATION_PBCC &&
  3189. pSiteMgr->currentDataModulation != DRV_MODULATION_OFDM)
  3190. param.content.ctrlDataCurrentRateMask &= ~DRV_RATE_MASK_22_PBCC;
  3191. ctrlData_setParam(pSiteMgr->hCtrlData, &param);
  3192. param.paramType = CTRL_DATA_CURRENT_ACTIVE_RATE_PARAM;
  3193. param.content.ctrlDataCurrentActiveRate = pSiteMgr->pDesiredParams->siteMgrCurrentDesiredTxRate;
  3194. ctrlData_setParam(pSiteMgr->hCtrlData, &param);
  3195. /*
  3196. * NOTE: THIS MUST BE AFTER SETTING PREAMBLE TYPE
  3197. */
  3198. if (pSiteMgr->pDesiredParams->siteMgrCurrentDesiredTxRate == DRV_RATE_AUTO)
  3199. {
  3200. param.paramType = CTRL_DATA_RATE_CONTROL_ENABLE_PARAM;
  3201. param.content.ctrlDataRateControlEnable = TRUE;
  3202. ctrlData_setParam(pSiteMgr->hCtrlData, &param);
  3203. }
  3204. else
  3205. {
  3206. param.paramType = CTRL_DATA_RATE_CONTROL_ENABLE_PARAM;
  3207. param.content.ctrlDataRateControlEnable = FALSE;
  3208. ctrlData_setParam(pSiteMgr->hCtrlData, &param);
  3209. }
  3210. return OK;
  3211. }
  3212. /***********************************************************************
  3213. * validateDesiredTxRate
  3214. ***********************************************************************
  3215. DESCRIPTION: Called by the following functions:
  3216. - pbccAlgorithm()
  3217. INPUT: desiredTxRate - configured desired tx rate.
  3218. desiredModulation - configured desired tx modulation.
  3219. suppRates - rates, supported by both STA and primary site.
  3220. OUTPUT: bitMap - rates bit map to be set to the ctrlData module
  3221. txDesiredRateSupported - indication whether the desired tx rate supported
  3222. by both STA and the primary site.
  3223. RETURN: OK on always
  3224. ************************************************************************/
  3225. void validateDesiredTxRate(rate_e desiredTxRate, modulationType_e desiredModulation,
  3226. UINT32 suppRates, UINT32 *bitMap, BOOL *txDesiredRateSupported)
  3227. {
  3228. UINT32 maskTable[DRV_RATE_MAX+1] =
  3229. {DRV_RATE_MASK_AUTO,
  3230. DRV_RATE_MASK_1_BARKER,
  3231. DRV_RATE_MASK_2_BARKER,
  3232. DRV_RATE_MASK_5_5_CCK,
  3233. DRV_RATE_MASK_11_CCK,
  3234. DRV_RATE_MASK_22_PBCC
  3235. ,DRV_RATE_MASK_6_OFDM,
  3236. DRV_RATE_MASK_9_OFDM,
  3237. DRV_RATE_MASK_12_OFDM,
  3238. DRV_RATE_MASK_18_OFDM,
  3239. DRV_RATE_MASK_24_OFDM,
  3240. DRV_RATE_MASK_36_OFDM,
  3241. DRV_RATE_MASK_48_OFDM,
  3242. DRV_RATE_MASK_54_OFDM
  3243. };
  3244. if(desiredModulation != DRV_MODULATION_PBCC)
  3245. {
  3246. if(desiredTxRate == DRV_RATE_22M)
  3247. *bitMap = DRV_RATE_MASK_11_CCK;
  3248. else
  3249. *bitMap = maskTable[desiredTxRate];
  3250. }
  3251. else
  3252. *bitMap = maskTable[desiredTxRate];
  3253. if((suppRates & maskTable[desiredTxRate]) || (desiredTxRate == DRV_RATE_AUTO))
  3254. *txDesiredRateSupported = TRUE;
  3255. else
  3256. *txDesiredRateSupported = FALSE;
  3257. }
  3258. /***********************************************************************
  3259. * siteMgr_assocReport
  3260. ***********************************************************************
  3261. DESCRIPTION: Called by the following functions:
  3262. - assoc_recv()
  3263. INPUT: hSiteMgr - siteMgr handle.
  3264. capabilities - assoc rsp capabilities field.
  3265. bCiscoAP - whether we are connected to a Cisco AP. Used for Tx Power Control adjustment
  3266. OUTPUT:
  3267. RETURN: OK on always
  3268. ************************************************************************/
  3269. TI_STATUS siteMgr_assocReport(TI_HANDLE hSiteMgr, UINT16 capabilities, BOOL bCiscoAP)
  3270. {
  3271. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  3272. siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
  3273. /* handle AP's preamble capability */
  3274. pPrimarySite->preambleAssRspCap = ((capabilities >> CAP_PREAMBLE_SHIFT) & CAP_PREAMBLE_MASK) ? PREAMBLE_SHORT : PREAMBLE_LONG;
  3275. /*
  3276. * Enable/Disable the ATx Power Control adjustment.
  3277. * When we are connected to Cisco AP - TX Power Control adjustment is disabled.
  3278. */
  3279. pSiteMgr->bTempTxPowerEnabled = ( !bCiscoAP ) && ( pSiteMgr->pDesiredParams->TxPowerControlOn );
  3280. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  3281. ("%s: Tx Power Control adjustment is %d\n",__FUNCTION__, pSiteMgr->bTempTxPowerEnabled));
  3282. return OK;
  3283. }
  3284. /***********************************************************************
  3285. * siteMgr_setWMEParamsSite
  3286. ***********************************************************************
  3287. DESCRIPTION: Set the WME params as received from the associated
  3288. AP. The function is called by the QoS Mgr
  3289. after receving association response succefully.
  3290. INPUT: hSiteMgr - SiteMgr handle.
  3291. OUTPUT: pDot11_WME_PARAM_t - pointer to the WME Param IE.
  3292. RETURN: OK on always
  3293. ************************************************************************/
  3294. TI_STATUS siteMgr_setWMEParamsSite(TI_HANDLE hSiteMgr,dot11_WME_PARAM_t *pDot11_WME_PARAM)
  3295. {
  3296. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  3297. siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
  3298. if( pPrimarySite == NULL )
  3299. {
  3300. return OK;
  3301. }
  3302. if( pDot11_WME_PARAM == NULL )
  3303. {
  3304. pPrimarySite->WMESupported = FALSE;
  3305. return OK;
  3306. }
  3307. /* Update the WME params */
  3308. os_memoryCopy(pSiteMgr->hOs,&pPrimarySite->WMEParameters,&pDot11_WME_PARAM->WME_ACParameteres,sizeof(ACParameters_t));
  3309. pPrimarySite->lastWMEParameterCnt = (pDot11_WME_PARAM->ACInfoField & dot11_WME_ACINFO_MASK);
  3310. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,("$$$$$$ WME parameters were updates according to association response, cntSeq = %d\n",pPrimarySite->lastWMEParameterCnt));
  3311. return OK;
  3312. }
  3313. /***********************************************************************
  3314. * siteMgr_getWMEParamsSite
  3315. ***********************************************************************
  3316. DESCRIPTION: Get the WME params as recieved from the associated
  3317. AP. The function is called by the Qos Mgr in order
  3318. to set all WME parameters to the core and Hal
  3319. INPUT: hSiteMgr - SiteMgr handle.
  3320. OUTPUT: pWME_ACParameters_t - pointer to the WME Param.
  3321. RETURN: OK if there are valid WME parameters , NOK otherwise.
  3322. ************************************************************************/
  3323. TI_STATUS siteMgr_getWMEParamsSite(TI_HANDLE hSiteMgr,ACParameters_t **pWME_ACParameters_t)
  3324. {
  3325. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  3326. siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
  3327. if(pPrimarySite->WMESupported == TRUE)
  3328. {
  3329. *pWME_ACParameters_t = &pPrimarySite->WMEParameters;
  3330. return OK;
  3331. }
  3332. else
  3333. {
  3334. *pWME_ACParameters_t = NULL;
  3335. return NOK;
  3336. }
  3337. }
  3338. /***********************************************************************
  3339. * calculateBssidListSize
  3340. ***********************************************************************
  3341. DESCRIPTION: Calculate the size of memory buffer required for BSSID
  3342. List.
  3343. INPUT: hSiteMgr - site mgr handle.
  3344. OUTPUT:
  3345. RETURN: OK on always
  3346. ************************************************************************/
  3347. static TI_STATUS calculateBssidListSize(siteMgr_t *pSiteMgr, UINT32 *pLength, BOOL allVarIes)
  3348. {
  3349. UINT32 siteTableIndex, tableIndex;
  3350. UINT32 length;
  3351. siteEntry_t* pSiteEntry;
  3352. siteTablesParams_t* currTable;
  3353. *pLength = sizeof(OS_802_11_BSSID_LIST_EX) - sizeof(OS_802_11_BSSID_EX);
  3354. currTable = pSiteMgr->pSitesMgmtParams->pCurrentSiteTable;
  3355. for (tableIndex = 0; tableIndex < NUM_OF_SITE_TABLE ; tableIndex++)
  3356. {
  3357. for (siteTableIndex = 0; siteTableIndex < currTable->maxNumOfSites; siteTableIndex++)
  3358. {
  3359. pSiteEntry = (siteEntry_t*)&currTable->siteTable[siteTableIndex];
  3360. if (pSiteEntry->siteType != SITE_NULL)
  3361. {
  3362. if (allVarIes)
  3363. {
  3364. length = sizeof(OS_802_11_BSSID_EX) + sizeof(OS_802_11_FIXED_IEs);
  3365. if (pSiteEntry->probeRecv)
  3366. {
  3367. length += pSiteEntry->probeRespLength;
  3368. }
  3369. else
  3370. {
  3371. length += pSiteEntry->beaconLength;
  3372. }
  3373. }
  3374. else
  3375. {
  3376. length = (sizeof(OS_802_11_BSSID_EX) + sizeof(OS_802_11_FIXED_IEs) +
  3377. (pSiteEntry->ssid.len + 2) + (MAX_SUPPORTED_RATES + 2) +
  3378. (DOT11_FH_PARAMS_ELE_LEN + 2) + (DOT11_DS_PARAMS_ELE_LEN +2) +
  3379. pSiteEntry->rsnIeLen);
  3380. /* WME information element by alcel*/
  3381. if (pSiteEntry->WMESupported)
  3382. {
  3383. /* length of element + header*/
  3384. length += (DOT11_WME_ELE_LEN + 2);
  3385. }
  3386. }
  3387. /* make sure length is 4 bytes aligned */
  3388. if (length % 4)
  3389. {
  3390. length += (4 - (length % 4));
  3391. }
  3392. *pLength += length;
  3393. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  3394. ("BSSID length =%d on table index %d \n", length, tableIndex));
  3395. }
  3396. }
  3397. if(pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode == DOT11_DUAL_MODE)
  3398. {
  3399. /* change site table */
  3400. if(currTable == &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables)
  3401. currTable = (siteTablesParams_t *)&pSiteMgr->pSitesMgmtParams->dot11A_sitesTables;
  3402. else
  3403. currTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
  3404. }
  3405. else
  3406. break;
  3407. }
  3408. return OK;
  3409. }
  3410. /***********************************************************************
  3411. * siteMgr_setCurrentTable
  3412. ***********************************************************************
  3413. DESCRIPTION:
  3414. INPUT: hSiteMgr - SiteMgr handle.
  3415. OUTPUT:
  3416. RETURN:
  3417. ************************************************************************/
  3418. void siteMgr_setCurrentTable(TI_HANDLE hSiteMgr, radioBand_e radioBand)
  3419. {
  3420. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  3421. if(radioBand == RADIO_BAND_2_4_GHZ)
  3422. pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = &pSiteMgr->pSitesMgmtParams->dot11BG_sitesTables;
  3423. else
  3424. pSiteMgr->pSitesMgmtParams->pCurrentSiteTable = (siteTablesParams_t *)&pSiteMgr->pSitesMgmtParams->dot11A_sitesTables;
  3425. }
  3426. /***********************************************************************
  3427. * siteMgr_updateRates
  3428. ***********************************************************************
  3429. DESCRIPTION:
  3430. INPUT: hSiteMgr - SiteMgr handle.
  3431. OUTPUT:
  3432. RETURN:
  3433. ************************************************************************/
  3434. void siteMgr_updateRates(TI_HANDLE hSiteMgr, BOOL dot11a, BOOL updateToOS)
  3435. {
  3436. UINT32 statusData;
  3437. rate_e txDesiredRate;
  3438. UINT32 localSuppRateMask, localBasicRateMask;
  3439. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  3440. localSuppRateMask = pSiteMgr->pDesiredParams->siteMgrRegstrySuppRateMask;
  3441. localBasicRateMask = pSiteMgr->pDesiredParams->siteMgrRegstryBasicRateMask;
  3442. validateRatesVsBand(&localSuppRateMask, &localBasicRateMask, dot11a);
  3443. pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask = localBasicRateMask;
  3444. pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.supportedRateMask = localSuppRateMask;
  3445. /* Initialize Mutual Rates Matching */
  3446. pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask = pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask;
  3447. pSiteMgr->pDesiredParams->siteMgrMatchedSuppRateMask = pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.supportedRateMask;
  3448. pSiteMgr->pDesiredParams->siteMgrMatchedMaxBasicRate = getMaxRatefromBitmap(pSiteMgr->pDesiredParams->siteMgrMatchedBasicRateMask);
  3449. pSiteMgr->pDesiredParams->siteMgrMatchedMaxActiveRate = getMaxRatefromBitmap(pSiteMgr->pDesiredParams->siteMgrMatchedSuppRateMask);
  3450. /*If we are in dual mode and we are only scanning A band we don't have to set the siteMgrCurrentDesiredTxRate.*/
  3451. if (updateToOS == TRUE)
  3452. {
  3453. /* Validate that the masks and tx rate are OK */
  3454. txDesiredRate = pSiteMgr->pDesiredParams->siteMgrRegstryDesiredTxRate;
  3455. validateRates((UINT32 *)&pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask,
  3456. (UINT32 *)&pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.supportedRateMask,
  3457. (UINT32 *)&txDesiredRate,
  3458. &pSiteMgr->pDesiredParams->siteMgrDesiredModulationType, dot11a);
  3459. pSiteMgr->pDesiredParams->siteMgrCurrentDesiredTxRate = txDesiredRate;
  3460. }
  3461. pSiteMgr->pDesiredParams->siteMgrDesiredRatePair.maxBasic = translateRateMaskToValue(pSiteMgr, pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask);
  3462. pSiteMgr->pDesiredParams->siteMgrDesiredRatePair.maxActive = translateRateMaskToValue(pSiteMgr, pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.supportedRateMask);
  3463. if (updateToOS == TRUE) {
  3464. /* report the desired rate to OS */
  3465. statusData = hostToUtilityRate(pSiteMgr->pDesiredParams->siteMgrDesiredRatePair.maxActive);
  3466. EvHandlerSendEvent(pSiteMgr->hEvHandler, IPC_EVENT_LINK_SPEED, (UINT8 *)&statusData,sizeof(UINT32));
  3467. }
  3468. }
  3469. /***********************************************************************
  3470. * siteMgr_bandParamsConfig
  3471. ***********************************************************************
  3472. DESCRIPTION:
  3473. INPUT: hSiteMgr - SiteMgr handle.
  3474. OUTPUT:
  3475. RETURN:
  3476. ************************************************************************/
  3477. void siteMgr_bandParamsConfig(TI_HANDLE hSiteMgr, BOOL updateToOS)
  3478. {
  3479. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  3480. /* reconfig rates */
  3481. if(pSiteMgr->siteMgrOperationalMode == DOT11_A_MODE)
  3482. siteMgr_updateRates(hSiteMgr, TRUE, updateToOS);
  3483. else
  3484. siteMgr_updateRates(hSiteMgr, FALSE, updateToOS);
  3485. /* go to B_ONLY Mode only if WiFI bit is Set*/
  3486. if (pSiteMgr->pDesiredParams->siteMgrWiFiAdhoc == TRUE)
  3487. { /* Configuration For AdHoc when using external configuration */
  3488. if (pSiteMgr->pDesiredParams->siteMgrExternalConfiguration == FALSE)
  3489. {
  3490. siteMgr_externalConfigurationParametersSet(hSiteMgr);
  3491. }
  3492. }
  3493. }
  3494. void siteMgr_keepAliveSendNullDataTimer(TI_HANDLE hSiteMgr)
  3495. {
  3496. paramInfo_t param;
  3497. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  3498. UINT32 txPacketsCount = 0;
  3499. UINT32 TxQid;
  3500. if ((pSiteMgr->pSitesMgmtParams->pPrimarySite != NULL) &&
  3501. (pSiteMgr->pSitesMgmtParams->pPrimarySite->bssType != BSS_INFRASTRUCTURE))
  3502. { /* No need for kepp alive when not in Infra */
  3503. return;
  3504. }
  3505. param.paramType = TX_DATA_COUNTERS_PARAM;
  3506. txData_getParam(pSiteMgr->hTxData, &param);
  3507. /* get current tx data frames counter */
  3508. for (TxQid = 0; TxQid < MAX_NUM_OF_TX_QUEUES; TxQid++)
  3509. txPacketsCount += param.content.pTxDataCounters[TxQid].XmitOk;
  3510. if (pSiteMgr->txPacketsCount==txPacketsCount)
  3511. { /* send NULL data */
  3512. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,("siteMgr_keepAliveSendNullDataTimer\n"));
  3513. /* sending null frame with power save bit set to off (if keepAliveEnable in the registry)
  3514. Note: the Hardware modify the PS bit according to the current PS mode. */
  3515. if(pSiteMgr->keepAliveEnable == TRUE)
  3516. {
  3517. txData_sendNullFrame(pSiteMgr->hTxData, FALSE, SITE_MGR_MODULE);
  3518. }
  3519. txPacketsCount++;
  3520. }
  3521. pSiteMgr->txPacketsCount=txPacketsCount;
  3522. }
  3523. void siteMgr_ConfigRate(TI_HANDLE hSiteMgr)
  3524. {
  3525. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  3526. BOOL dot11a;
  3527. dot11mode_e OperationMode ;
  3528. OperationMode = pSiteMgr->siteMgrOperationalMode;
  3529. /* reconfig rates */
  3530. if(OperationMode == DOT11_A_MODE)
  3531. dot11a = TRUE;
  3532. else
  3533. dot11a = FALSE;
  3534. /*
  3535. ** Specific change to ch 14, that channel is only used in Japan, and is limited
  3536. ** to rates 1,2,5.5,11
  3537. */
  3538. if(pSiteMgr->pDesiredParams->siteMgrDesiredChannel == SPECIAL_BG_CHANNEL)
  3539. {
  3540. if(pSiteMgr->pDesiredParams->siteMgrRegstryBasicRate[OperationMode] > BASIC_RATE_SET_1_2_5_5_11)
  3541. pSiteMgr->pDesiredParams->siteMgrRegstryBasicRate[OperationMode] = BASIC_RATE_SET_1_2_5_5_11;
  3542. if(pSiteMgr->pDesiredParams->siteMgrRegstrySuppRate[OperationMode] > SUPPORTED_RATE_SET_1_2_5_5_11)
  3543. pSiteMgr->pDesiredParams->siteMgrRegstrySuppRate[OperationMode] = SUPPORTED_RATE_SET_1_2_5_5_11;
  3544. }
  3545. pSiteMgr->pDesiredParams->siteMgrRegstryBasicRateMask =
  3546. translateBasicRateValueToMask(pSiteMgr->pDesiredParams->siteMgrRegstryBasicRate[OperationMode], dot11a);
  3547. pSiteMgr->pDesiredParams->siteMgrRegstrySuppRateMask =
  3548. translateSupportedRateValueToMask(pSiteMgr->pDesiredParams->siteMgrRegstrySuppRate[OperationMode], dot11a);
  3549. siteMgr_updateRates(pSiteMgr, dot11a, TRUE);
  3550. /* go to B_ONLY Mode only if WiFI bit is Set*/
  3551. if (pSiteMgr->pDesiredParams->siteMgrWiFiAdhoc == TRUE)
  3552. { /* Configuration For AdHoc when using external configuration */
  3553. if (pSiteMgr->pDesiredParams->siteMgrExternalConfiguration == FALSE)
  3554. {
  3555. siteMgr_externalConfigurationParametersSet(hSiteMgr);
  3556. }
  3557. }
  3558. }
  3559. static void siteMgr_externalConfigurationParametersSet(TI_HANDLE hSiteMgr)
  3560. {
  3561. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  3562. /* Overwrite the parameters for AdHoc with External Configuration */
  3563. if( ((pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode == DOT11_A_MODE) ||
  3564. (pSiteMgr->pDesiredParams->siteMgrDesiredDot11Mode == DOT11_DUAL_MODE)) &&
  3565. !pSiteMgr->pDesiredParams->siteMgrWiFiAdhoc && pSiteMgr->pDesiredParams->siteMgrDesiredBSSType == BSS_INDEPENDENT)
  3566. return;
  3567. if(pSiteMgr->pDesiredParams->siteMgrDesiredBSSType == BSS_INDEPENDENT)
  3568. {
  3569. pSiteMgr->siteMgrOperationalMode = DOT11_B_MODE;
  3570. pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask = translateBasicRateValueToMask(BASIC_RATE_SET_1_2_5_5_11, FALSE);
  3571. pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.supportedRateMask = translateSupportedRateValueToMask(SUPPORTED_RATE_SET_1_2_5_5_11, FALSE);
  3572. pSiteMgr->pDesiredParams->siteMgrCurrentDesiredTxRate = DRV_RATE_AUTO;
  3573. pSiteMgr->pDesiredParams->siteMgrRegstryBasicRateMask = translateBasicRateValueToMask(BASIC_RATE_SET_1_2_5_5_11, FALSE);
  3574. pSiteMgr->pDesiredParams->siteMgrRegstrySuppRateMask = translateSupportedRateValueToMask(SUPPORTED_RATE_SET_1_2_5_5_11, FALSE);
  3575. pSiteMgr->pDesiredParams->siteMgrRegstryDesiredTxRate = DRV_RATE_AUTO;
  3576. pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime = PHY_SLOT_TIME_LONG;
  3577. whalCtrl_SetRadioBand(pSiteMgr->hHalCtrl, RADIO_BAND_2_4_GHZ);
  3578. whalCtrl_SetSlotTime(pSiteMgr->hHalCtrl, PHY_SLOT_TIME_LONG);
  3579. }
  3580. else
  3581. {
  3582. if(pSiteMgr->radioBand == RADIO_BAND_2_4_GHZ)
  3583. pSiteMgr->siteMgrOperationalMode = DOT11_G_MODE;
  3584. else
  3585. pSiteMgr->siteMgrOperationalMode = DOT11_A_MODE;
  3586. pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.basicRateMask = translateBasicRateValueToMask(BASIC_RATE_SET_1_2_5_5_11, FALSE);
  3587. pSiteMgr->pDesiredParams->siteMgrCurrentDesiredRateMask.supportedRateMask = translateSupportedRateValueToMask(SUPPORTED_RATE_SET_ALL, FALSE);
  3588. pSiteMgr->pDesiredParams->siteMgrCurrentDesiredTxRate = DRV_RATE_AUTO;
  3589. pSiteMgr->pDesiredParams->siteMgrRegstryBasicRateMask = translateBasicRateValueToMask(BASIC_RATE_SET_1_2_5_5_11, FALSE);
  3590. pSiteMgr->pDesiredParams->siteMgrRegstrySuppRateMask = translateSupportedRateValueToMask(SUPPORTED_RATE_SET_ALL, FALSE);
  3591. pSiteMgr->pDesiredParams->siteMgrRegstryDesiredTxRate = DRV_RATE_AUTO;
  3592. pSiteMgr->pDesiredParams->siteMgrDesiredSlotTime = PHY_SLOT_TIME_LONG;
  3593. whalCtrl_SetSlotTime(pSiteMgr->hHalCtrl, PHY_SLOT_TIME_LONG);
  3594. }
  3595. }
  3596. void siteMgr_checkTxPower(TI_HANDLE hSiteMgr)
  3597. {
  3598. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  3599. if ( (pSiteMgr->pSitesMgmtParams->pPrimarySite) && (pSiteMgr->bTempTxPowerEnabled)
  3600. && (++pSiteMgr->siteMgrTxPowerCheckTime >= pSiteMgr->pDesiredParams->TxPowerCheckTime) )
  3601. {
  3602. pSiteMgr->siteMgrTxPowerCheckTime = 0; /* reset counter for next check */
  3603. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  3604. ("%s: RSSI = %d TxPowerRssiThresh = %d TxPowerRssiRestoreThresh = %D\n",
  3605. __FUNCTION__, pSiteMgr->pSitesMgmtParams->pPrimarySite->rssi,
  3606. pSiteMgr->pDesiredParams->TxPowerRssiThresh,pSiteMgr->pDesiredParams->TxPowerRssiRestoreThresh));
  3607. if ((pSiteMgr->pSitesMgmtParams->pPrimarySite->rssi) >= (INT32) (0 - pSiteMgr->pDesiredParams->TxPowerRssiThresh))
  3608. {
  3609. /* activate Tx Power Control adjustment */
  3610. siteMgr_setTemporaryTxPower(pSiteMgr, TRUE);
  3611. }
  3612. else if (pSiteMgr->pSitesMgmtParams->pPrimarySite->rssi <= (INT32) (0 - pSiteMgr->pDesiredParams->TxPowerRssiRestoreThresh))
  3613. {
  3614. /* deactivate Tx Power Control adjustment */
  3615. siteMgr_setTemporaryTxPower(pSiteMgr, FALSE);
  3616. }
  3617. }
  3618. }
  3619. TI_STATUS siteMgr_saveProbeRespBuffer(TI_HANDLE hSiteMgr, macAddress_t *bssid, UINT8 *pProbeRespBuffer, UINT32 length)
  3620. {
  3621. siteEntry_t *pSite;
  3622. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  3623. if ((pSiteMgr==NULL) || (pProbeRespBuffer==NULL) || (length>=MAX_MGMT_BODY_LENGTH))
  3624. {
  3625. return NOK;
  3626. }
  3627. pSite = findSiteEntry(pSiteMgr, bssid);
  3628. if (pSite==NULL)
  3629. {
  3630. /*WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  3631. ("siteMgr_saveProbeRespBuffer: site doesn't exist\n"));*/
  3632. return NOK;
  3633. }
  3634. os_memoryCopy(pSiteMgr->hOs, pSite->probeRespBuffer, pProbeRespBuffer, length);
  3635. pSite->osTimeStamp = os_timeStampMs(pSiteMgr->hOs);
  3636. pSite->probeRespLength = length;
  3637. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  3638. ("siteMgr_saveProbeRespBuffer: BSSID=%x-%x-%x-%x-%x-%x, TSF=%x-%x-%x-%x-%x-%x-%x-%x, \n ts=%d, rssi=%d\n channel = %d \n",
  3639. pSite->bssid.addr[0], pSite->bssid.addr[1], pSite->bssid.addr[2],
  3640. pSite->bssid.addr[3], pSite->bssid.addr[4], pSite->bssid.addr[5],
  3641. pSite->tsfTimeStamp[0], pSite->tsfTimeStamp[1], pSite->tsfTimeStamp[2], pSite->tsfTimeStamp[3],
  3642. pSite->tsfTimeStamp[4], pSite->tsfTimeStamp[5], pSite->tsfTimeStamp[6], pSite->tsfTimeStamp[7],
  3643. pSite->osTimeStamp, pSite->rssi, pSite->channel));
  3644. return OK;
  3645. }
  3646. TI_STATUS siteMgr_saveBeaconBuffer(TI_HANDLE hSiteMgr, macAddress_t *bssid, UINT8 *pBeaconBuffer, UINT32 length)
  3647. {
  3648. siteEntry_t *pSite;
  3649. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  3650. if ((pSiteMgr==NULL) || (pBeaconBuffer==NULL) || (length>=MAX_MGMT_BODY_LENGTH))
  3651. {
  3652. return NOK;
  3653. }
  3654. pSite = findSiteEntry(pSiteMgr, bssid);
  3655. if (pSite==NULL)
  3656. {
  3657. /*WLAN_REPORT_ERROR(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  3658. ("siteMgr_saveBeaconBuffer: site doesn't exist\n"));*/
  3659. return NOK;
  3660. }
  3661. os_memoryCopy(pSiteMgr->hOs, pSite->beaconBuffer, pBeaconBuffer, length);
  3662. pSite->osTimeStamp = os_timeStampMs(pSiteMgr->hOs);
  3663. pSite->beaconLength = length;
  3664. /*if (pSiteMgr->pSitesMgmtParams->pPrimarySite!=NULL)
  3665. {
  3666. if (!os_memoryCompare(pSiteMgr->hOs, pSiteMgr->pSitesMgmtParams->pPrimarySite->ssid.ssidString, pSite->ssid.ssidString, pSiteMgr->pSitesMgmtParams->pPrimarySite->ssid.len))
  3667. {
  3668. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  3669. ("siteMgr_saveBeaconBuffer: BSSID=%x-%x-%x-%x-%x-%x, TSF=%x-%x-%x-%x-%x-%x-%x-%x, \n ts=%d, rssi=%d \n",
  3670. pSite->bssid.addr[0], pSite->bssid.addr[1], pSite->bssid.addr[2],
  3671. pSite->bssid.addr[3], pSite->bssid.addr[4], pSite->bssid.addr[5],
  3672. pSite->tsfTimeStamp[0], pSite->tsfTimeStamp[1], pSite->tsfTimeStamp[2], pSite->tsfTimeStamp[3],
  3673. pSite->tsfTimeStamp[4], pSite->tsfTimeStamp[5], pSite->tsfTimeStamp[6], pSite->tsfTimeStamp[7],
  3674. pSite->osTimeStamp, pSite->rssi));
  3675. }
  3676. }*/
  3677. pSite->ssid.ssidString[pSite->ssid.len] = '\0';
  3678. /*WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  3679. ("siteMgr_saveBeaconBuffer: BSSID=%x-%x-%x-%x-%x-%x, SSID=%s, \n ts=%d, rssi=%d\n channel = %d \n",
  3680. pSite->bssid.addr[0], pSite->bssid.addr[1], pSite->bssid.addr[2],
  3681. pSite->bssid.addr[3], pSite->bssid.addr[4], pSite->bssid.addr[5],
  3682. pSite->ssid.ssidString, pSite->osTimeStamp, pSite->rssi, pSite->channel));
  3683. */
  3684. return OK;
  3685. }
  3686. void siteMgr_resetChannelList(TI_HANDLE hSiteMgr)
  3687. {
  3688. UINT8 index;
  3689. siteMgr_t *pSiteMgr = (siteMgr_t*)hSiteMgr;
  3690. if (hSiteMgr==NULL)
  3691. {
  3692. return;
  3693. }
  3694. for (index=0; index < pSiteMgr->pSitesMgmtParams->pCurrentSiteTable->maxNumOfSites; index++)
  3695. {
  3696. if (pSiteMgr->pSitesMgmtParams->pCurrentSiteTable->siteTable[index].siteType != SITE_NULL)
  3697. {
  3698. pSiteMgr->pSitesMgmtParams->pCurrentSiteTable->siteTable[index].prioritySite = FALSE;
  3699. }
  3700. }
  3701. }
  3702. siteEntry_t *siteMgr_findSiteEntry(TI_HANDLE hSiteMgrm, macAddress_t *bssid)
  3703. {
  3704. return (findSiteEntry(hSiteMgrm, bssid));
  3705. }
  3706. void siteMgr_IsERP_Needed(TI_HANDLE hSiteMgr,BOOL *useProtection,BOOL *NonErpPresent,BOOL *barkerPreambleType)
  3707. {
  3708. siteMgr_t *pSiteMgr = (siteMgr_t*)hSiteMgr;
  3709. paramInfo_t param;
  3710. siteEntry_t *pPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
  3711. *useProtection = FALSE;
  3712. *NonErpPresent = FALSE;
  3713. *barkerPreambleType = FALSE;
  3714. param.paramType = CTRL_DATA_CURRENT_IBSS_PROTECTION_PARAM;
  3715. ctrlData_getParam(pSiteMgr->hCtrlData, &param);
  3716. /* On WifiAdhoc (for band B) The STa should not include in the beacon an ERP IE (see WiFi B clause 2.2, 5.8.2) */
  3717. if (pSiteMgr->pDesiredParams->siteMgrWiFiAdhoc == TRUE)
  3718. {
  3719. /* Return the default => ERP is not needed */
  3720. return;
  3721. }
  3722. /* check if STA is connected */
  3723. if (pPrimarySite)
  3724. {
  3725. if(pSiteMgr->siteMgrOperationalMode == DOT11_G_MODE || pSiteMgr->siteMgrOperationalMode == DOT11_DUAL_MODE)
  3726. {
  3727. if(param.content.ctrlDataIbssProtecionType == ERP_PROTECTION_STANDARD)
  3728. {
  3729. if(pPrimarySite->siteType == SITE_SELF)
  3730. {
  3731. if(pPrimarySite->channel <= SITE_MGR_CHANNEL_B_G_MAX) /* if channel B&G*/
  3732. {
  3733. *useProtection = TRUE;
  3734. *NonErpPresent = TRUE;
  3735. *barkerPreambleType = TRUE;
  3736. }
  3737. }
  3738. else if(pPrimarySite->bssType == BSS_INDEPENDENT)
  3739. {
  3740. if(pPrimarySite->useProtection == TRUE)
  3741. *useProtection = TRUE;
  3742. if(pPrimarySite->NonErpPresent == TRUE)
  3743. *NonErpPresent = TRUE;
  3744. if(pPrimarySite->barkerPreambleType == PREAMBLE_SHORT)
  3745. *barkerPreambleType = TRUE;
  3746. }
  3747. }
  3748. }
  3749. }
  3750. }
  3751. void siteMgr_gotFirstBcn(TI_HANDLE hSiteMgr)
  3752. {
  3753. siteMgr_t *pSiteMgr = (siteMgr_t*)hSiteMgr;
  3754. int status ;
  3755. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG,
  3756. ("siteMgr_gotFirstBcn: dtimPeriod=%d, beaconInterval=%d\n",
  3757. pSiteMgr->pSitesMgmtParams->pPrimarySite->dtimPeriod,
  3758. pSiteMgr->pSitesMgmtParams->pPrimarySite->beaconInterval));
  3759. /* Check if the Beacon Filter Desired State is TRUE */
  3760. pSiteMgr->beaconFilterParams.currentState = TRUE;
  3761. /* If the Beacon Filter was TRUE then send it to FW if not do not do nothing */
  3762. if( TRUE == pSiteMgr->beaconFilterParams.desiredState )
  3763. {
  3764. if ( (status = whalCtrl_SetBeaconFiltering(pSiteMgr->hHalCtrl, pSiteMgr->beaconFilterParams.desiredState, pSiteMgr->beaconFilterParams.numOfStored)) != OK)
  3765. {
  3766. WLAN_REPORT_INFORMATION(pSiteMgr->hReport,
  3767. POWER_MANAGER_MODULE_LOG,
  3768. ("%s(%d) - Error N.%d in configuring beacon filtering !\n",
  3769. __FILE__,__LINE__,status));
  3770. }
  3771. else
  3772. {
  3773. WLAN_REPORT_INFORMATION(pSiteMgr->hReport,SITE_MGR_MODULE_LOG , ("-- Beacon Filter Enable Beacon Filtering MIB Was Sent to FW !!! --\n"));
  3774. }
  3775. }
  3776. else
  3777. {
  3778. WLAN_REPORT_INFORMATION(pSiteMgr->hReport,SITE_MGR_MODULE_LOG , ("-- Beacon Filter Disable Beacon Filtering - Do not send to FW Already Disabled !!! --\n"));
  3779. }
  3780. whalCtrl_setDtimPeriod(pSiteMgr->hHalCtrl, pSiteMgr->pSitesMgmtParams->pPrimarySite->dtimPeriod,
  3781. pSiteMgr->pSitesMgmtParams->pPrimarySite->beaconInterval);
  3782. /* The power mode configuration gets overridden by the above DTIM period */
  3783. /* configuration. We use this call to send it again to the firmware. */
  3784. PowerMgr_reloadPowerMode(pSiteMgr->hPowerMgr);
  3785. }
  3786. void siteMgr_clearFirstBcnFlag(TI_HANDLE hSiteMgr)
  3787. {
  3788. siteMgr_t *pSiteMgr = (siteMgr_t*)hSiteMgr;
  3789. /* This is set to FALSE since the First Beaqcin should be received for the first beacon mechanism */
  3790. pSiteMgr->beaconFilterParams.currentState = FALSE;
  3791. whalCtrl_SetBeaconFiltering(pSiteMgr->hHalCtrl, FALSE, pSiteMgr->beaconFilterParams.numOfStored);
  3792. /* set Hw available until we get the first beacon */
  3793. MacServices_powerAutho_AwakeRequiredUpdate(pSiteMgr->hMacServices, POWERAUTHO_AWAKE_REQUIRED, POWERAUTHO_AWAKE_REASON_FIRST_BEACON);
  3794. if(pSiteMgr->pSitesMgmtParams->pPrimarySite != NULL)
  3795. pSiteMgr->pSitesMgmtParams->pPrimarySite->beaconReceiveAfterJoin = FALSE;
  3796. }
  3797. void siteMgr_setFirstBcnFlag(TI_HANDLE hSiteMgr)
  3798. {
  3799. siteMgr_t *pSiteMgr = (siteMgr_t*)hSiteMgr;
  3800. /* set Hw not available until now that the connection was closed */
  3801. MacServices_powerAutho_AwakeRequiredUpdate(pSiteMgr->hMacServices, POWERAUTHO_AWAKE_NOT_REQUIRED, POWERAUTHO_AWAKE_REASON_FIRST_BEACON);
  3802. if(pSiteMgr->pSitesMgmtParams->pPrimarySite != NULL)
  3803. pSiteMgr->pSitesMgmtParams->pPrimarySite->beaconReceiveAfterJoin = TRUE;
  3804. }
  3805. /**
  3806. *
  3807. * siteMgr_overwritePrimarySite
  3808. *
  3809. * \b Description:
  3810. *
  3811. * This function sets new AP as a primary site and, if requested, stores previous
  3812. * AP's info; called during roaming
  3813. *
  3814. * \b ARGS:
  3815. *
  3816. * I - pCurrBSS - Current BSS handle \n
  3817. *
  3818. * \b RETURNS:
  3819. *
  3820. * OK on success, NOK on failure.
  3821. *
  3822. * \sa
  3823. */
  3824. TI_STATUS siteMgr_overwritePrimarySite(TI_HANDLE hSiteMgr, bssEntry_t *newAP, BOOL requiredToStorePrevSite)
  3825. {
  3826. siteMgr_t *pSiteMgr = (siteMgr_t *)hSiteMgr;
  3827. siteEntry_t *newApEntry;
  3828. mlmeIEParsingParams_t *ieListParseParams = mlmeParser_getParseIEsBuffer(pSiteMgr->hMlmeSm);
  3829. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("siteMgr_overwritePrimarySite: new site bssid= 0x%x-0x%x-0x%x-0x%x-0x%x-0x%x\n\n",
  3830. newAP->BSSID.addr[0], newAP->BSSID.addr[1], newAP->BSSID.addr[2],
  3831. newAP->BSSID.addr[3], newAP->BSSID.addr[4], newAP->BSSID.addr[5]));
  3832. /* If previous primary site present, and requested to save it - store it */
  3833. if (requiredToStorePrevSite)
  3834. {
  3835. WLAN_REPORT_INFORMATION(pSiteMgr->hReport,
  3836. SITE_MGR_MODULE_LOG,
  3837. ("siteMgr_overwritePrimarySite: required to store prev prim site \n"));
  3838. /* Store latest primary site, make ite a regular site */
  3839. pSiteMgr->pSitesMgmtParams->pPrevPrimarySite = pSiteMgr->pSitesMgmtParams->pPrimarySite;
  3840. pSiteMgr->pSitesMgmtParams->pPrevPrimarySite->siteType = SITE_REGULAR;
  3841. }
  3842. else
  3843. {
  3844. WLAN_REPORT_INFORMATION(pSiteMgr->hReport,
  3845. SITE_MGR_MODULE_LOG,
  3846. ("siteMgr_overwritePrimarySite: not required to store prev prim site \n"));
  3847. if (pSiteMgr->pSitesMgmtParams->pPrimarySite != NULL)
  3848. {
  3849. WLAN_REPORT_INFORMATION(pSiteMgr->hReport, SITE_MGR_MODULE_LOG, ("Removing Primary ssid=%s, bssid= 0x%x-0x%x-0x%x-0x%x-0x%x-0x%x\n\n",
  3850. pSiteMgr->pSitesMgmtParams->pPrimarySite->ssid.ssidString,
  3851. pSiteMgr->pSitesMgmtParams->pPrimarySite->bssid.addr[0], pSiteMgr->pSitesMgmtParams->pPrimarySite->bssid.addr[1], pSiteMgr->pSitesMgmtParams->pPrimarySite->bssid.addr[2],
  3852. pSiteMgr->pSitesMgmtParams->pPrimarySite->bssid.addr[3], pSiteMgr->pSitesMgmtParams->pPrimarySite->bssid.addr[4], pSiteMgr->pSitesMgmtParams->pPrimarySite->bssid.addr[5] ));
  3853. pSiteMgr->pSitesMgmtParams->pPrimarySite->siteType = SITE_REGULAR;
  3854. pSiteMgr->pSitesMgmtParams->pPrimarySite->beaconRecv = FALSE;
  3855. pSiteMgr->pSitesMgmtParams->pPrimarySite->beaconReceiveAfterJoin = TRUE;
  3856. pSiteMgr->pSitesMgmtParams->pPrimarySite = NULL;
  3857. }
  3858. else
  3859. {
  3860. WLAN_REPORT_ERROR(pSiteMgr->hReport,
  3861. SITE_MGR_MODULE_LOG,
  3862. ("siteMgr_overwritePrimarySite: primary site is NULL \n"));
  3863. }
  3864. }
  3865. /* Find not occupied entry in site table, and store new AP BSSID in */
  3866. /* If pPrimarySite is not set to NULL, store it in pPrevSite before updating */
  3867. newApEntry = findAndInsertSiteEntry(pSiteMgr, &(newAP->BSSID), newAP->band);
  3868. if (newApEntry != NULL)
  3869. {
  3870. /* Zero frame content */
  3871. os_memoryZero(pSiteMgr->hOs, ieListParseParams, sizeof(mlmeIEParsingParams_t));
  3872. /* Update parameters of new AP */
  3873. newApEntry->rssi = newAP->RSSI;
  3874. newApEntry->bssType = BSS_INFRASTRUCTURE;
  3875. newApEntry->dtimPeriod = 1;
  3876. newApEntry->rxRate = (rate_e)newAP->rxRate;
  3877. /* Mark the site as regular in order to prevent from calling Power manager during beacon parsing */
  3878. newApEntry->siteType = SITE_REGULAR;
  3879. os_memoryCopy(pSiteMgr->hOs, &newApEntry->ssid, &pSiteMgr->pDesiredParams->siteMgrDesiredSSID, sizeof(ssid_t));
  3880. if (newAP->resultType == SCAN_RFT_PROBE_RESPONSE)
  3881. {
  3882. ieListParseParams->frame.subType = PROBE_RESPONSE;
  3883. siteMgr_saveProbeRespBuffer(hSiteMgr, &(newAP->BSSID), newAP->pBuffer, newAP->bufferLength);
  3884. }
  3885. else
  3886. {
  3887. ieListParseParams->frame.subType = BEACON;
  3888. siteMgr_saveBeaconBuffer(hSiteMgr, &(newAP->BSSID), newAP->pBuffer, newAP->bufferLength);
  3889. }
  3890. ieListParseParams->band = newAP->band;
  3891. ieListParseParams->rxChannel = newAP->channel;
  3892. ieListParseParams->myBssid = FALSE;
  3893. ieListParseParams->frame.content.iePacket.pRsnIe = NULL;
  3894. ieListParseParams->frame.content.iePacket.rsnIeLen = 0;
  3895. ieListParseParams->frame.content.iePacket.barkerPreambleMode = PREAMBLE_UNSPECIFIED;
  3896. os_memoryCopy(pSiteMgr->hOs, (void *)ieListParseParams->frame.content.iePacket.timestamp, (void *)&newAP->lastRxTSF, TIME_STAMP_LEN);
  3897. ieListParseParams->frame.content.iePacket.beaconInerval = newAP->beaconInterval;
  3898. ieListParseParams->frame.content.iePacket.capabilities = newAP->capabilities;
  3899. if (mlmeParser_parseIEs(pSiteMgr->hMlmeSm, newAP->pBuffer, newAP->bufferLength, ieListParseParams) != OK)
  3900. {
  3901. /* Error in parsing Probe response packet - exit */
  3902. return NOK;
  3903. }
  3904. siteMgr_updateSite(hSiteMgr, &(newAP->BSSID), &ieListParseParams->frame, newAP->channel, newAP->band, FALSE);
  3905. /* Select the entry as primary site */
  3906. newApEntry->siteType = SITE_PRIMARY;
  3907. pSiteMgr->pSitesMgmtParams->pPrimarySite = newApEntry;
  3908. return OK;
  3909. }
  3910. else
  3911. {
  3912. return NOK;
  3913. }
  3914. }
  3915. #if 0
  3916. /***********************************************************************
  3917. siteMgr_updateLowPriorityTimeout
  3918. ***********************************************************************
  3919. DESCRIPTION: Call to the PowerCtrl with the new claculated low priority
  3920. timeout that is depend on the:
  3921. - short/long doze.
  3922. - beacon filtering number.
  3923. - beacon interval.
  3924. INPUT: hSiteMgr - site mgr handle.
  3925. OUTPUT:
  3926. RETURN: UINT32 - the timeout in mSec.
  3927. ************************************************************************/
  3928. static void siteMgr_updateLowPriorityTimeout(TI_HANDLE hSiteMgr)
  3929. {
  3930. siteMgr_t *pSiteMgr = (siteMgr_t*)hSiteMgr;
  3931. UINT32 lowPriorityTimeout = 0;
  3932. if(pSiteMgr->pDesiredParams->siteMgrDesiredBSSType == BSS_INDEPENDENT)
  3933. {
  3934. lowPriorityTimeout = SITE_MGR_IBSS_AGING_TIMEOUT_DEF;
  3935. }
  3936. else
  3937. {
  3938. /*
  3939. If the pPrimarySite is NULL then we cannot update the aging timeout
  3940. */
  3941. if (pSiteMgr->pSitesMgmtParams->pPrimarySite == NULL)
  3942. {
  3943. WLAN_REPORT_ERROR(pSiteMgr->hReport,
  3944. SITE_MGR_MODULE_LOG,
  3945. ("there is NO primary site! pPrimarySite is NULL\n"));
  3946. return;
  3947. }
  3948. else
  3949. {
  3950. /*
  3951. in shortDoze and active mode the system behaviour is the same as regarding to
  3952. beacon evnets. On each beacon the TNET is awake and should received the beacon
  3953. */
  3954. if(pSiteMgr->powerSaveLdMode == FALSE)
  3955. {
  3956. lowPriorityTimeout = pSiteMgr->pSitesMgmtParams->pPrimarySite->beaconInterval;
  3957. }
  3958. else
  3959. /*
  3960. In longDoze, the interval time should based on numOfBeaconFiltering * Dtim interval
  3961. */
  3962. {
  3963. /*
  3964. if beacon filtering disable.
  3965. */
  3966. if ( 0 == pSiteMgr->numOfBeaconFiltering )
  3967. {
  3968. lowPriorityTimeout = pSiteMgr->pSitesMgmtParams->pPrimarySite->dtimPeriod * pSiteMgr->pSitesMgmtParams->pPrimarySite->beaconInterval;
  3969. }
  3970. else
  3971. {
  3972. lowPriorityTimeout = pSiteMgr->numOfBeaconFiltering * pSiteMgr->pSitesMgmtParams->pPrimarySite->dtimPeriod * pSiteMgr->pSitesMgmtParams->pPrimarySite->beaconInterval;
  3973. }
  3974. }
  3975. WLAN_REPORT_INFORMATION(pSiteMgr->hReport,
  3976. SITE_MGR_MODULE_LOG,
  3977. ("siteMgr_calcLowPriorityTimeout: lowPriorityTimeout = %d, BeaconInterval = %d, DtimPeriod = %d,powerSaveLdMode = %d, numOfBeaconFiltering = %d\n",
  3978. lowPriorityTimeout,
  3979. pSiteMgr->pSitesMgmtParams->pPrimarySite->beaconInterval,
  3980. pSiteMgr->pSitesMgmtParams->pPrimarySite->dtimPeriod,
  3981. pSiteMgr->powerSaveLdMode,
  3982. pSiteMgr->numOfBeaconFiltering));
  3983. }
  3984. }
  3985. if (lowPriorityTimeout != 0)
  3986. {
  3987. #ifdef NO_HAL_VOB
  3988. whalCtrl_setLowPriorityTimeout(pSiteMgr->hHalCtrl,
  3989. lowPriorityTimeout);
  3990. #endif
  3991. }
  3992. else
  3993. {
  3994. WLAN_REPORT_ERROR(pSiteMgr->hReport,
  3995. SITE_MGR_MODULE_LOG,
  3996. ("illegal lowPriorityTimeout (=%d), configuration ABORTED!\n",lowPriorityTimeout));
  3997. }
  3998. }
  3999. #endif