PageRenderTime 77ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 1ms

/drivers/staging/vt6656/wmgr.c

https://bitbucket.org/wisechild/galaxy-nexus
C | 4895 lines | 3452 code | 597 blank | 846 comment | 901 complexity | 62d115cf82bfe43686bc621b5cf510e5 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, AGPL-1.0
  1. /*
  2. * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
  3. * All rights reserved.
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation; either version 2 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License along
  16. * with this program; if not, write to the Free Software Foundation, Inc.,
  17. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  18. *
  19. *
  20. * File: wmgr.c
  21. *
  22. * Purpose: Handles the 802.11 management functions
  23. *
  24. * Author: Lyndon Chen
  25. *
  26. * Date: May 8, 2002
  27. *
  28. * Functions:
  29. * nsMgrObjectInitial - Initialize Management Objet data structure
  30. * vMgrObjectReset - Reset Management Objet data structure
  31. * vMgrAssocBeginSta - Start associate function
  32. * vMgrReAssocBeginSta - Start reassociate function
  33. * vMgrDisassocBeginSta - Start disassociate function
  34. * s_vMgrRxAssocRequest - Handle Rcv associate_request
  35. * s_vMgrRxAssocResponse - Handle Rcv associate_response
  36. * vMrgAuthenBeginSta - Start authentication function
  37. * vMgrDeAuthenDeginSta - Start deauthentication function
  38. * s_vMgrRxAuthentication - Handle Rcv authentication
  39. * s_vMgrRxAuthenSequence_1 - Handle Rcv authentication sequence 1
  40. * s_vMgrRxAuthenSequence_2 - Handle Rcv authentication sequence 2
  41. * s_vMgrRxAuthenSequence_3 - Handle Rcv authentication sequence 3
  42. * s_vMgrRxAuthenSequence_4 - Handle Rcv authentication sequence 4
  43. * s_vMgrRxDisassociation - Handle Rcv disassociation
  44. * s_vMgrRxBeacon - Handle Rcv Beacon
  45. * vMgrCreateOwnIBSS - Create ad_hoc IBSS or AP BSS
  46. * vMgrJoinBSSBegin - Join BSS function
  47. * s_vMgrSynchBSS - Synch & adopt BSS parameters
  48. * s_MgrMakeBeacon - Create Baecon frame
  49. * s_MgrMakeProbeResponse - Create Probe Response frame
  50. * s_MgrMakeAssocRequest - Create Associate Request frame
  51. * s_MgrMakeReAssocRequest - Create ReAssociate Request frame
  52. * s_vMgrRxProbeResponse - Handle Rcv probe_response
  53. * s_vMrgRxProbeRequest - Handle Rcv probe_request
  54. * bMgrPrepareBeaconToSend - Prepare Beacon frame
  55. * s_vMgrLogStatus - Log 802.11 Status
  56. * vMgrRxManagePacket - Rcv management frame dispatch function
  57. * s_vMgrFormatTIM- Assember TIM field of beacon
  58. * vMgrTimerInit- Initial 1-sec and command call back funtions
  59. *
  60. * Revision History:
  61. *
  62. */
  63. #include "tmacro.h"
  64. #include "desc.h"
  65. #include "device.h"
  66. #include "card.h"
  67. #include "80211hdr.h"
  68. #include "80211mgr.h"
  69. #include "wmgr.h"
  70. #include "wcmd.h"
  71. #include "mac.h"
  72. #include "bssdb.h"
  73. #include "power.h"
  74. #include "datarate.h"
  75. #include "baseband.h"
  76. #include "rxtx.h"
  77. #include "wpa.h"
  78. #include "rf.h"
  79. #include "iowpa.h"
  80. #include "control.h"
  81. #include "rndis.h"
  82. /*--------------------- Static Definitions -------------------------*/
  83. /*--------------------- Static Classes ----------------------------*/
  84. /*--------------------- Static Variables --------------------------*/
  85. static int msglevel =MSG_LEVEL_INFO;
  86. //static int msglevel =MSG_LEVEL_DEBUG;
  87. /*--------------------- Static Functions --------------------------*/
  88. static BOOL ChannelExceedZoneType(
  89. PSDevice pDevice,
  90. BYTE byCurrChannel
  91. );
  92. // Association/diassociation functions
  93. static
  94. PSTxMgmtPacket
  95. s_MgrMakeAssocRequest(
  96. PSDevice pDevice,
  97. PSMgmtObject pMgmt,
  98. PBYTE pDAddr,
  99. WORD wCurrCapInfo,
  100. WORD wListenInterval,
  101. PWLAN_IE_SSID pCurrSSID,
  102. PWLAN_IE_SUPP_RATES pCurrRates,
  103. PWLAN_IE_SUPP_RATES pCurrExtSuppRates
  104. );
  105. static
  106. void
  107. s_vMgrRxAssocRequest(
  108. PSDevice pDevice,
  109. PSMgmtObject pMgmt,
  110. PSRxMgmtPacket pRxPacket,
  111. unsigned int uNodeIndex
  112. );
  113. static
  114. PSTxMgmtPacket
  115. s_MgrMakeReAssocRequest(
  116. PSDevice pDevice,
  117. PSMgmtObject pMgmt,
  118. PBYTE pDAddr,
  119. WORD wCurrCapInfo,
  120. WORD wListenInterval,
  121. PWLAN_IE_SSID pCurrSSID,
  122. PWLAN_IE_SUPP_RATES pCurrRates,
  123. PWLAN_IE_SUPP_RATES pCurrExtSuppRates
  124. );
  125. static
  126. void
  127. s_vMgrRxAssocResponse(
  128. PSDevice pDevice,
  129. PSMgmtObject pMgmt,
  130. PSRxMgmtPacket pRxPacket,
  131. BOOL bReAssocType
  132. );
  133. static
  134. void
  135. s_vMgrRxDisassociation(
  136. PSDevice pDevice,
  137. PSMgmtObject pMgmt,
  138. PSRxMgmtPacket pRxPacket
  139. );
  140. // Authentication/deauthen functions
  141. static
  142. void
  143. s_vMgrRxAuthenSequence_1(
  144. PSDevice pDevice,
  145. PSMgmtObject pMgmt,
  146. PWLAN_FR_AUTHEN pFrame
  147. );
  148. static
  149. void
  150. s_vMgrRxAuthenSequence_2(
  151. PSDevice pDevice,
  152. PSMgmtObject pMgmt,
  153. PWLAN_FR_AUTHEN pFrame
  154. );
  155. static
  156. void
  157. s_vMgrRxAuthenSequence_3(
  158. PSDevice pDevice,
  159. PSMgmtObject pMgmt,
  160. PWLAN_FR_AUTHEN pFrame
  161. );
  162. static
  163. void
  164. s_vMgrRxAuthenSequence_4(
  165. PSDevice pDevice,
  166. PSMgmtObject pMgmt,
  167. PWLAN_FR_AUTHEN pFrame
  168. );
  169. static
  170. void
  171. s_vMgrRxAuthentication(
  172. PSDevice pDevice,
  173. PSMgmtObject pMgmt,
  174. PSRxMgmtPacket pRxPacket
  175. );
  176. static
  177. void
  178. s_vMgrRxDeauthentication(
  179. PSDevice pDevice,
  180. PSMgmtObject pMgmt,
  181. PSRxMgmtPacket pRxPacket
  182. );
  183. // Scan functions
  184. // probe request/response functions
  185. static
  186. void
  187. s_vMgrRxProbeRequest(
  188. PSDevice pDevice,
  189. PSMgmtObject pMgmt,
  190. PSRxMgmtPacket pRxPacket
  191. );
  192. static
  193. void
  194. s_vMgrRxProbeResponse(
  195. PSDevice pDevice,
  196. PSMgmtObject pMgmt,
  197. PSRxMgmtPacket pRxPacket
  198. );
  199. // beacon functions
  200. static
  201. void
  202. s_vMgrRxBeacon(
  203. PSDevice pDevice,
  204. PSMgmtObject pMgmt,
  205. PSRxMgmtPacket pRxPacket,
  206. BOOL bInScan
  207. );
  208. static
  209. void
  210. s_vMgrFormatTIM(
  211. PSMgmtObject pMgmt,
  212. PWLAN_IE_TIM pTIM
  213. );
  214. static
  215. PSTxMgmtPacket
  216. s_MgrMakeBeacon(
  217. PSDevice pDevice,
  218. PSMgmtObject pMgmt,
  219. WORD wCurrCapInfo,
  220. WORD wCurrBeaconPeriod,
  221. unsigned int uCurrChannel,
  222. WORD wCurrATIMWinodw,
  223. PWLAN_IE_SSID pCurrSSID,
  224. PBYTE pCurrBSSID,
  225. PWLAN_IE_SUPP_RATES pCurrSuppRates,
  226. PWLAN_IE_SUPP_RATES pCurrExtSuppRates
  227. );
  228. // Association response
  229. static
  230. PSTxMgmtPacket
  231. s_MgrMakeAssocResponse(
  232. PSDevice pDevice,
  233. PSMgmtObject pMgmt,
  234. WORD wCurrCapInfo,
  235. WORD wAssocStatus,
  236. WORD wAssocAID,
  237. PBYTE pDstAddr,
  238. PWLAN_IE_SUPP_RATES pCurrSuppRates,
  239. PWLAN_IE_SUPP_RATES pCurrExtSuppRates
  240. );
  241. // ReAssociation response
  242. static
  243. PSTxMgmtPacket
  244. s_MgrMakeReAssocResponse(
  245. PSDevice pDevice,
  246. PSMgmtObject pMgmt,
  247. WORD wCurrCapInfo,
  248. WORD wAssocStatus,
  249. WORD wAssocAID,
  250. PBYTE pDstAddr,
  251. PWLAN_IE_SUPP_RATES pCurrSuppRates,
  252. PWLAN_IE_SUPP_RATES pCurrExtSuppRates
  253. );
  254. // Probe response
  255. static
  256. PSTxMgmtPacket
  257. s_MgrMakeProbeResponse(
  258. PSDevice pDevice,
  259. PSMgmtObject pMgmt,
  260. WORD wCurrCapInfo,
  261. WORD wCurrBeaconPeriod,
  262. unsigned int uCurrChannel,
  263. WORD wCurrATIMWinodw,
  264. PBYTE pDstAddr,
  265. PWLAN_IE_SSID pCurrSSID,
  266. PBYTE pCurrBSSID,
  267. PWLAN_IE_SUPP_RATES pCurrSuppRates,
  268. PWLAN_IE_SUPP_RATES pCurrExtSuppRates,
  269. BYTE byPHYType
  270. );
  271. // received status
  272. static
  273. void
  274. s_vMgrLogStatus(
  275. PSMgmtObject pMgmt,
  276. WORD wStatus
  277. );
  278. static
  279. void
  280. s_vMgrSynchBSS (
  281. PSDevice pDevice,
  282. unsigned int uBSSMode,
  283. PKnownBSS pCurr,
  284. PCMD_STATUS pStatus
  285. );
  286. static BOOL
  287. s_bCipherMatch (
  288. PKnownBSS pBSSNode,
  289. NDIS_802_11_ENCRYPTION_STATUS EncStatus,
  290. PBYTE pbyCCSPK,
  291. PBYTE pbyCCSGK
  292. );
  293. static void Encyption_Rebuild(
  294. PSDevice pDevice,
  295. PKnownBSS pCurr
  296. );
  297. /*--------------------- Export Variables --------------------------*/
  298. /*--------------------- Export Functions --------------------------*/
  299. /*+
  300. *
  301. * Routine Description:
  302. * Allocates and initializes the Management object.
  303. *
  304. * Return Value:
  305. * Ndis_staus.
  306. *
  307. -*/
  308. void vMgrObjectInit(void *hDeviceContext)
  309. {
  310. PSDevice pDevice = (PSDevice)hDeviceContext;
  311. PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
  312. int ii;
  313. pMgmt->pbyPSPacketPool = &pMgmt->byPSPacketPool[0];
  314. pMgmt->pbyMgmtPacketPool = &pMgmt->byMgmtPacketPool[0];
  315. pMgmt->uCurrChannel = pDevice->uChannel;
  316. for (ii = 0; ii < WLAN_BSSID_LEN; ii++)
  317. pMgmt->abyDesireBSSID[ii] = 0xFF;
  318. pMgmt->sAssocInfo.AssocInfo.Length = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);
  319. //memset(pMgmt->abyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN +1);
  320. pMgmt->byCSSPK = KEY_CTL_NONE;
  321. pMgmt->byCSSGK = KEY_CTL_NONE;
  322. pMgmt->wIBSSBeaconPeriod = DEFAULT_IBSS_BI;
  323. BSSvClearBSSList((void *) pDevice, FALSE);
  324. init_timer(&pMgmt->sTimerSecondCallback);
  325. pMgmt->sTimerSecondCallback.data = (unsigned long)pDevice;
  326. pMgmt->sTimerSecondCallback.function = (TimerFunction)BSSvSecondCallBack;
  327. pMgmt->sTimerSecondCallback.expires = RUN_AT(HZ);
  328. init_timer(&pDevice->sTimerCommand);
  329. pDevice->sTimerCommand.data = (unsigned long)pDevice;
  330. pDevice->sTimerCommand.function = (TimerFunction)vRunCommand;
  331. pDevice->sTimerCommand.expires = RUN_AT(HZ);
  332. init_timer(&pDevice->sTimerTxData);
  333. pDevice->sTimerTxData.data = (unsigned long)pDevice;
  334. pDevice->sTimerTxData.function = (TimerFunction)BSSvSecondTxData;
  335. pDevice->sTimerTxData.expires = RUN_AT(10*HZ); //10s callback
  336. pDevice->fTxDataInSleep = FALSE;
  337. pDevice->IsTxDataTrigger = FALSE;
  338. pDevice->nTxDataTimeCout = 0;
  339. pDevice->cbFreeCmdQueue = CMD_Q_SIZE;
  340. pDevice->uCmdDequeueIdx = 0;
  341. pDevice->uCmdEnqueueIdx = 0;
  342. pDevice->eCommandState = WLAN_CMD_IDLE;
  343. pDevice->bCmdRunning = FALSE;
  344. pDevice->bCmdClear = FALSE;
  345. return;
  346. }
  347. /*+
  348. *
  349. * Routine Description:
  350. * Start the station association procedure. Namely, send an
  351. * association request frame to the AP.
  352. *
  353. * Return Value:
  354. * None.
  355. *
  356. -*/
  357. void vMgrAssocBeginSta(void *hDeviceContext,
  358. PSMgmtObject pMgmt,
  359. PCMD_STATUS pStatus)
  360. {
  361. PSDevice pDevice = (PSDevice)hDeviceContext;
  362. PSTxMgmtPacket pTxPacket;
  363. pMgmt->wCurrCapInfo = 0;
  364. pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_ESS(1);
  365. if (pDevice->bEncryptionEnable) {
  366. pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_PRIVACY(1);
  367. }
  368. // always allow receive short preamble
  369. //if (pDevice->byPreambleType == 1) {
  370. // pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1);
  371. //}
  372. pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1);
  373. if (pMgmt->wListenInterval == 0)
  374. pMgmt->wListenInterval = 1; // at least one.
  375. // ERP Phy (802.11g) should support short preamble.
  376. if (pMgmt->eCurrentPHYMode == PHY_TYPE_11G) {
  377. pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1);
  378. if (pDevice->bShortSlotTime == TRUE)
  379. pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTSLOTTIME(1);
  380. } else if (pMgmt->eCurrentPHYMode == PHY_TYPE_11B) {
  381. if (pDevice->byPreambleType == 1) {
  382. pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1);
  383. }
  384. }
  385. if (pMgmt->b11hEnable == TRUE)
  386. pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SPECTRUMMNG(1);
  387. // build an assocreq frame and send it
  388. pTxPacket = s_MgrMakeAssocRequest
  389. (
  390. pDevice,
  391. pMgmt,
  392. pMgmt->abyCurrBSSID,
  393. pMgmt->wCurrCapInfo,
  394. pMgmt->wListenInterval,
  395. (PWLAN_IE_SSID)pMgmt->abyCurrSSID,
  396. (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
  397. (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates
  398. );
  399. if (pTxPacket != NULL ){
  400. // send the frame
  401. *pStatus = csMgmt_xmit(pDevice, pTxPacket);
  402. if (*pStatus == CMD_STATUS_PENDING) {
  403. pMgmt->eCurrState = WMAC_STATE_ASSOCPENDING;
  404. *pStatus = CMD_STATUS_SUCCESS;
  405. }
  406. }
  407. else
  408. *pStatus = CMD_STATUS_RESOURCES;
  409. return ;
  410. }
  411. /*+
  412. *
  413. * Routine Description:
  414. * Start the station re-association procedure.
  415. *
  416. * Return Value:
  417. * None.
  418. *
  419. -*/
  420. void vMgrReAssocBeginSta(void *hDeviceContext,
  421. PSMgmtObject pMgmt,
  422. PCMD_STATUS pStatus)
  423. {
  424. PSDevice pDevice = (PSDevice)hDeviceContext;
  425. PSTxMgmtPacket pTxPacket;
  426. pMgmt->wCurrCapInfo = 0;
  427. pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_ESS(1);
  428. if (pDevice->bEncryptionEnable) {
  429. pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_PRIVACY(1);
  430. }
  431. //if (pDevice->byPreambleType == 1) {
  432. // pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1);
  433. //}
  434. pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1);
  435. if (pMgmt->wListenInterval == 0)
  436. pMgmt->wListenInterval = 1; // at least one.
  437. // ERP Phy (802.11g) should support short preamble.
  438. if (pMgmt->eCurrentPHYMode == PHY_TYPE_11G) {
  439. pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1);
  440. if (pDevice->bShortSlotTime == TRUE)
  441. pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTSLOTTIME(1);
  442. } else if (pMgmt->eCurrentPHYMode == PHY_TYPE_11B) {
  443. if (pDevice->byPreambleType == 1) {
  444. pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1);
  445. }
  446. }
  447. if (pMgmt->b11hEnable == TRUE)
  448. pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SPECTRUMMNG(1);
  449. pTxPacket = s_MgrMakeReAssocRequest
  450. (
  451. pDevice,
  452. pMgmt,
  453. pMgmt->abyCurrBSSID,
  454. pMgmt->wCurrCapInfo,
  455. pMgmt->wListenInterval,
  456. (PWLAN_IE_SSID)pMgmt->abyCurrSSID,
  457. (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
  458. (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates
  459. );
  460. if (pTxPacket != NULL ){
  461. // send the frame
  462. *pStatus = csMgmt_xmit(pDevice, pTxPacket);
  463. if (*pStatus != CMD_STATUS_PENDING) {
  464. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Reassociation tx failed.\n");
  465. }
  466. else {
  467. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Reassociation tx sending.\n");
  468. }
  469. }
  470. return ;
  471. }
  472. /*+
  473. *
  474. * Routine Description:
  475. * Send an dis-association request frame to the AP.
  476. *
  477. * Return Value:
  478. * None.
  479. *
  480. -*/
  481. void vMgrDisassocBeginSta(void *hDeviceContext,
  482. PSMgmtObject pMgmt,
  483. PBYTE abyDestAddress,
  484. WORD wReason,
  485. PCMD_STATUS pStatus)
  486. {
  487. PSDevice pDevice = (PSDevice)hDeviceContext;
  488. PSTxMgmtPacket pTxPacket = NULL;
  489. WLAN_FR_DISASSOC sFrame;
  490. pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
  491. memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_DISASSOC_FR_MAXLEN);
  492. pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
  493. // Setup the sFrame structure
  494. sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
  495. sFrame.len = WLAN_DISASSOC_FR_MAXLEN;
  496. // format fixed field frame structure
  497. vMgrEncodeDisassociation(&sFrame);
  498. // Setup the header
  499. sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
  500. (
  501. WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
  502. WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_DISASSOC)
  503. ));
  504. memcpy( sFrame.pHdr->sA3.abyAddr1, abyDestAddress, WLAN_ADDR_LEN);
  505. memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
  506. memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
  507. // Set reason code
  508. *(sFrame.pwReason) = cpu_to_le16(wReason);
  509. pTxPacket->cbMPDULen = sFrame.len;
  510. pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
  511. // send the frame
  512. *pStatus = csMgmt_xmit(pDevice, pTxPacket);
  513. if (*pStatus == CMD_STATUS_PENDING) {
  514. pMgmt->eCurrState = WMAC_STATE_IDLE;
  515. *pStatus = CMD_STATUS_SUCCESS;
  516. }
  517. return;
  518. }
  519. /*+
  520. *
  521. * Routine Description:(AP function)
  522. * Handle incoming station association request frames.
  523. *
  524. * Return Value:
  525. * None.
  526. *
  527. -*/
  528. static
  529. void
  530. s_vMgrRxAssocRequest(
  531. PSDevice pDevice,
  532. PSMgmtObject pMgmt,
  533. PSRxMgmtPacket pRxPacket,
  534. unsigned int uNodeIndex
  535. )
  536. {
  537. WLAN_FR_ASSOCREQ sFrame;
  538. CMD_STATUS Status;
  539. PSTxMgmtPacket pTxPacket;
  540. WORD wAssocStatus = 0;
  541. WORD wAssocAID = 0;
  542. unsigned int uRateLen = WLAN_RATES_MAXLEN;
  543. BYTE abyCurrSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
  544. BYTE abyCurrExtSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
  545. if (pMgmt->eCurrMode != WMAC_MODE_ESS_AP)
  546. return;
  547. // node index not found
  548. if (!uNodeIndex)
  549. return;
  550. //check if node is authenticated
  551. //decode the frame
  552. memset(&sFrame, 0, sizeof(WLAN_FR_ASSOCREQ));
  553. memset(abyCurrSuppRates, 0, WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1);
  554. memset(abyCurrExtSuppRates, 0, WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1);
  555. sFrame.len = pRxPacket->cbMPDULen;
  556. sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
  557. vMgrDecodeAssocRequest(&sFrame);
  558. if (pMgmt->sNodeDBTable[uNodeIndex].eNodeState >= NODE_AUTH) {
  559. pMgmt->sNodeDBTable[uNodeIndex].eNodeState = NODE_ASSOC;
  560. pMgmt->sNodeDBTable[uNodeIndex].wCapInfo = cpu_to_le16(*sFrame.pwCapInfo);
  561. pMgmt->sNodeDBTable[uNodeIndex].wListenInterval = cpu_to_le16(*sFrame.pwListenInterval);
  562. pMgmt->sNodeDBTable[uNodeIndex].bPSEnable =
  563. WLAN_GET_FC_PWRMGT(sFrame.pHdr->sA3.wFrameCtl) ? TRUE : FALSE;
  564. // Todo: check sta basic rate, if ap can't support, set status code
  565. if (pDevice->byBBType == BB_TYPE_11B) {
  566. uRateLen = WLAN_RATES_MAXLEN_11B;
  567. }
  568. abyCurrSuppRates[0] = WLAN_EID_SUPP_RATES;
  569. abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pSuppRates,
  570. (PWLAN_IE_SUPP_RATES)abyCurrSuppRates,
  571. uRateLen);
  572. abyCurrExtSuppRates[0] = WLAN_EID_EXTSUPP_RATES;
  573. if (pDevice->byBBType == BB_TYPE_11G) {
  574. abyCurrExtSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pExtSuppRates,
  575. (PWLAN_IE_SUPP_RATES)abyCurrExtSuppRates,
  576. uRateLen);
  577. } else {
  578. abyCurrExtSuppRates[1] = 0;
  579. }
  580. RATEvParseMaxRate((void *)pDevice,
  581. (PWLAN_IE_SUPP_RATES)abyCurrSuppRates,
  582. (PWLAN_IE_SUPP_RATES)abyCurrExtSuppRates,
  583. FALSE, // do not change our basic rate
  584. &(pMgmt->sNodeDBTable[uNodeIndex].wMaxBasicRate),
  585. &(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate),
  586. &(pMgmt->sNodeDBTable[uNodeIndex].wSuppRate),
  587. &(pMgmt->sNodeDBTable[uNodeIndex].byTopCCKBasicRate),
  588. &(pMgmt->sNodeDBTable[uNodeIndex].byTopOFDMBasicRate)
  589. );
  590. // set max tx rate
  591. pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate =
  592. pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate;
  593. // Todo: check sta preamble, if ap can't support, set status code
  594. pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble =
  595. WLAN_GET_CAP_INFO_SHORTPREAMBLE(*sFrame.pwCapInfo);
  596. pMgmt->sNodeDBTable[uNodeIndex].bShortSlotTime =
  597. WLAN_GET_CAP_INFO_SHORTSLOTTIME(*sFrame.pwCapInfo);
  598. pMgmt->sNodeDBTable[uNodeIndex].wAID = (WORD)uNodeIndex;
  599. wAssocStatus = WLAN_MGMT_STATUS_SUCCESS;
  600. wAssocAID = (WORD)uNodeIndex;
  601. // check if ERP support
  602. if(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate > RATE_11M)
  603. pMgmt->sNodeDBTable[uNodeIndex].bERPExist = TRUE;
  604. if (pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate <= RATE_11M) {
  605. // B only STA join
  606. pDevice->bProtectMode = TRUE;
  607. pDevice->bNonERPPresent = TRUE;
  608. }
  609. if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble == FALSE) {
  610. pDevice->bBarkerPreambleMd = TRUE;
  611. }
  612. DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Associate AID= %d \n", wAssocAID);
  613. DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "MAC=%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X \n",
  614. sFrame.pHdr->sA3.abyAddr2[0],
  615. sFrame.pHdr->sA3.abyAddr2[1],
  616. sFrame.pHdr->sA3.abyAddr2[2],
  617. sFrame.pHdr->sA3.abyAddr2[3],
  618. sFrame.pHdr->sA3.abyAddr2[4],
  619. sFrame.pHdr->sA3.abyAddr2[5]
  620. ) ;
  621. DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Max Support rate = %d \n",
  622. pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate);
  623. }
  624. // assoc response reply..
  625. pTxPacket = s_MgrMakeAssocResponse
  626. (
  627. pDevice,
  628. pMgmt,
  629. pMgmt->wCurrCapInfo,
  630. wAssocStatus,
  631. wAssocAID,
  632. sFrame.pHdr->sA3.abyAddr2,
  633. (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
  634. (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates
  635. );
  636. if (pTxPacket != NULL ){
  637. if (pDevice->bEnableHostapd) {
  638. return;
  639. }
  640. /* send the frame */
  641. Status = csMgmt_xmit(pDevice, pTxPacket);
  642. if (Status != CMD_STATUS_PENDING) {
  643. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Assoc response tx failed\n");
  644. }
  645. else {
  646. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Assoc response tx sending..\n");
  647. }
  648. }
  649. return;
  650. }
  651. /*+
  652. *
  653. * Description:(AP function)
  654. * Handle incoming station re-association request frames.
  655. *
  656. * Parameters:
  657. * In:
  658. * pMgmt - Management Object structure
  659. * pRxPacket - Received Packet
  660. * Out:
  661. * none
  662. *
  663. * Return Value: None.
  664. *
  665. -*/
  666. static
  667. void
  668. s_vMgrRxReAssocRequest(
  669. PSDevice pDevice,
  670. PSMgmtObject pMgmt,
  671. PSRxMgmtPacket pRxPacket,
  672. unsigned int uNodeIndex
  673. )
  674. {
  675. WLAN_FR_REASSOCREQ sFrame;
  676. CMD_STATUS Status;
  677. PSTxMgmtPacket pTxPacket;
  678. WORD wAssocStatus = 0;
  679. WORD wAssocAID = 0;
  680. unsigned int uRateLen = WLAN_RATES_MAXLEN;
  681. BYTE abyCurrSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
  682. BYTE abyCurrExtSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1];
  683. if (pMgmt->eCurrMode != WMAC_MODE_ESS_AP)
  684. return;
  685. // node index not found
  686. if (!uNodeIndex)
  687. return;
  688. //check if node is authenticated
  689. //decode the frame
  690. memset(&sFrame, 0, sizeof(WLAN_FR_REASSOCREQ));
  691. sFrame.len = pRxPacket->cbMPDULen;
  692. sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
  693. vMgrDecodeReassocRequest(&sFrame);
  694. if (pMgmt->sNodeDBTable[uNodeIndex].eNodeState >= NODE_AUTH) {
  695. pMgmt->sNodeDBTable[uNodeIndex].eNodeState = NODE_ASSOC;
  696. pMgmt->sNodeDBTable[uNodeIndex].wCapInfo = cpu_to_le16(*sFrame.pwCapInfo);
  697. pMgmt->sNodeDBTable[uNodeIndex].wListenInterval = cpu_to_le16(*sFrame.pwListenInterval);
  698. pMgmt->sNodeDBTable[uNodeIndex].bPSEnable =
  699. WLAN_GET_FC_PWRMGT(sFrame.pHdr->sA3.wFrameCtl) ? TRUE : FALSE;
  700. // Todo: check sta basic rate, if ap can't support, set status code
  701. if (pDevice->byBBType == BB_TYPE_11B) {
  702. uRateLen = WLAN_RATES_MAXLEN_11B;
  703. }
  704. abyCurrSuppRates[0] = WLAN_EID_SUPP_RATES;
  705. abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pSuppRates,
  706. (PWLAN_IE_SUPP_RATES)abyCurrSuppRates,
  707. uRateLen);
  708. abyCurrExtSuppRates[0] = WLAN_EID_EXTSUPP_RATES;
  709. if (pDevice->byBBType == BB_TYPE_11G) {
  710. abyCurrExtSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pExtSuppRates,
  711. (PWLAN_IE_SUPP_RATES)abyCurrExtSuppRates,
  712. uRateLen);
  713. } else {
  714. abyCurrExtSuppRates[1] = 0;
  715. }
  716. RATEvParseMaxRate((void *)pDevice,
  717. (PWLAN_IE_SUPP_RATES)abyCurrSuppRates,
  718. (PWLAN_IE_SUPP_RATES)abyCurrExtSuppRates,
  719. FALSE, // do not change our basic rate
  720. &(pMgmt->sNodeDBTable[uNodeIndex].wMaxBasicRate),
  721. &(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate),
  722. &(pMgmt->sNodeDBTable[uNodeIndex].wSuppRate),
  723. &(pMgmt->sNodeDBTable[uNodeIndex].byTopCCKBasicRate),
  724. &(pMgmt->sNodeDBTable[uNodeIndex].byTopOFDMBasicRate)
  725. );
  726. // set max tx rate
  727. pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate =
  728. pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate;
  729. // Todo: check sta preamble, if ap can't support, set status code
  730. pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble =
  731. WLAN_GET_CAP_INFO_SHORTPREAMBLE(*sFrame.pwCapInfo);
  732. pMgmt->sNodeDBTable[uNodeIndex].bShortSlotTime =
  733. WLAN_GET_CAP_INFO_SHORTSLOTTIME(*sFrame.pwCapInfo);
  734. pMgmt->sNodeDBTable[uNodeIndex].wAID = (WORD)uNodeIndex;
  735. wAssocStatus = WLAN_MGMT_STATUS_SUCCESS;
  736. wAssocAID = (WORD)uNodeIndex;
  737. // if suppurt ERP
  738. if(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate > RATE_11M)
  739. pMgmt->sNodeDBTable[uNodeIndex].bERPExist = TRUE;
  740. if (pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate <= RATE_11M) {
  741. // B only STA join
  742. pDevice->bProtectMode = TRUE;
  743. pDevice->bNonERPPresent = TRUE;
  744. }
  745. if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble == FALSE) {
  746. pDevice->bBarkerPreambleMd = TRUE;
  747. }
  748. DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Rx ReAssociate AID= %d \n", wAssocAID);
  749. DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "MAC=%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X \n",
  750. sFrame.pHdr->sA3.abyAddr2[0],
  751. sFrame.pHdr->sA3.abyAddr2[1],
  752. sFrame.pHdr->sA3.abyAddr2[2],
  753. sFrame.pHdr->sA3.abyAddr2[3],
  754. sFrame.pHdr->sA3.abyAddr2[4],
  755. sFrame.pHdr->sA3.abyAddr2[5]
  756. ) ;
  757. DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Max Support rate = %d \n",
  758. pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate);
  759. }
  760. // assoc response reply..
  761. pTxPacket = s_MgrMakeReAssocResponse
  762. (
  763. pDevice,
  764. pMgmt,
  765. pMgmt->wCurrCapInfo,
  766. wAssocStatus,
  767. wAssocAID,
  768. sFrame.pHdr->sA3.abyAddr2,
  769. (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
  770. (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates
  771. );
  772. if (pTxPacket != NULL ){
  773. /* send the frame */
  774. if (pDevice->bEnableHostapd) {
  775. return;
  776. }
  777. Status = csMgmt_xmit(pDevice, pTxPacket);
  778. if (Status != CMD_STATUS_PENDING) {
  779. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:ReAssoc response tx failed\n");
  780. }
  781. else {
  782. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:ReAssoc response tx sending..\n");
  783. }
  784. }
  785. return;
  786. }
  787. /*+
  788. *
  789. * Routine Description:
  790. * Handle incoming association response frames.
  791. *
  792. * Return Value:
  793. * None.
  794. *
  795. -*/
  796. static
  797. void
  798. s_vMgrRxAssocResponse(
  799. PSDevice pDevice,
  800. PSMgmtObject pMgmt,
  801. PSRxMgmtPacket pRxPacket,
  802. BOOL bReAssocType
  803. )
  804. {
  805. WLAN_FR_ASSOCRESP sFrame;
  806. PWLAN_IE_SSID pItemSSID;
  807. PBYTE pbyIEs;
  808. viawget_wpa_header *wpahdr;
  809. if (pMgmt->eCurrState == WMAC_STATE_ASSOCPENDING ||
  810. pMgmt->eCurrState == WMAC_STATE_ASSOC) {
  811. sFrame.len = pRxPacket->cbMPDULen;
  812. sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
  813. // decode the frame
  814. vMgrDecodeAssocResponse(&sFrame);
  815. if ((sFrame.pwCapInfo == NULL)
  816. || (sFrame.pwStatus == NULL)
  817. || (sFrame.pwAid == NULL)
  818. || (sFrame.pSuppRates == NULL)) {
  819. DBG_PORT80(0xCC);
  820. return;
  821. }
  822. pMgmt->sAssocInfo.AssocInfo.ResponseFixedIEs.Capabilities = *(sFrame.pwCapInfo);
  823. pMgmt->sAssocInfo.AssocInfo.ResponseFixedIEs.StatusCode = *(sFrame.pwStatus);
  824. pMgmt->sAssocInfo.AssocInfo.ResponseFixedIEs.AssociationId = *(sFrame.pwAid);
  825. pMgmt->sAssocInfo.AssocInfo.AvailableResponseFixedIEs |= 0x07;
  826. pMgmt->sAssocInfo.AssocInfo.ResponseIELength = sFrame.len - 24 - 6;
  827. pMgmt->sAssocInfo.AssocInfo.OffsetResponseIEs = pMgmt->sAssocInfo.AssocInfo.OffsetRequestIEs + pMgmt->sAssocInfo.AssocInfo.RequestIELength;
  828. pbyIEs = pMgmt->sAssocInfo.abyIEs;
  829. pbyIEs += pMgmt->sAssocInfo.AssocInfo.RequestIELength;
  830. memcpy(pbyIEs, (sFrame.pBuf + 24 +6), pMgmt->sAssocInfo.AssocInfo.ResponseIELength);
  831. // save values and set current BSS state
  832. if (cpu_to_le16((*(sFrame.pwStatus))) == WLAN_MGMT_STATUS_SUCCESS ){
  833. // set AID
  834. pMgmt->wCurrAID = cpu_to_le16((*(sFrame.pwAid)));
  835. if ( (pMgmt->wCurrAID >> 14) != (BIT0 | BIT1) )
  836. {
  837. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "AID from AP, has two msb clear.\n");
  838. }
  839. DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Association Successful, AID=%d.\n", pMgmt->wCurrAID & ~(BIT14|BIT15));
  840. pMgmt->eCurrState = WMAC_STATE_ASSOC;
  841. BSSvUpdateAPNode((void *) pDevice,
  842. sFrame.pwCapInfo,
  843. sFrame.pSuppRates,
  844. sFrame.pExtSuppRates);
  845. pItemSSID = (PWLAN_IE_SSID)pMgmt->abyCurrSSID;
  846. DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Link with AP(SSID): %s\n", pItemSSID->abySSID);
  847. pDevice->bLinkPass = TRUE;
  848. ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_INTER);
  849. if ((pDevice->bWPADEVUp) && (pDevice->skb != NULL)) {
  850. if(skb_tailroom(pDevice->skb) <(sizeof(viawget_wpa_header)+pMgmt->sAssocInfo.AssocInfo.ResponseIELength+
  851. pMgmt->sAssocInfo.AssocInfo.RequestIELength)) { //data room not enough
  852. dev_kfree_skb(pDevice->skb);
  853. pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
  854. }
  855. wpahdr = (viawget_wpa_header *)pDevice->skb->data;
  856. wpahdr->type = VIAWGET_ASSOC_MSG;
  857. wpahdr->resp_ie_len = pMgmt->sAssocInfo.AssocInfo.ResponseIELength;
  858. wpahdr->req_ie_len = pMgmt->sAssocInfo.AssocInfo.RequestIELength;
  859. memcpy(pDevice->skb->data + sizeof(viawget_wpa_header), pMgmt->sAssocInfo.abyIEs, wpahdr->req_ie_len);
  860. memcpy(pDevice->skb->data + sizeof(viawget_wpa_header) + wpahdr->req_ie_len,
  861. pbyIEs,
  862. wpahdr->resp_ie_len
  863. );
  864. skb_put(pDevice->skb, sizeof(viawget_wpa_header) + wpahdr->resp_ie_len + wpahdr->req_ie_len);
  865. pDevice->skb->dev = pDevice->wpadev;
  866. skb_reset_mac_header(pDevice->skb);
  867. pDevice->skb->pkt_type = PACKET_HOST;
  868. pDevice->skb->protocol = htons(ETH_P_802_2);
  869. memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
  870. netif_rx(pDevice->skb);
  871. pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
  872. }
  873. #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
  874. //if(pDevice->bWPASuppWextEnabled == TRUE)
  875. {
  876. BYTE buf[512];
  877. size_t len;
  878. union iwreq_data wrqu;
  879. int we_event;
  880. memset(buf, 0, 512);
  881. len = pMgmt->sAssocInfo.AssocInfo.RequestIELength;
  882. if(len) {
  883. memcpy(buf, pMgmt->sAssocInfo.abyIEs, len);
  884. memset(&wrqu, 0, sizeof (wrqu));
  885. wrqu.data.length = len;
  886. we_event = IWEVASSOCREQIE;
  887. PRINT_K("wireless_send_event--->IWEVASSOCREQIE\n");
  888. wireless_send_event(pDevice->dev, we_event, &wrqu, buf);
  889. }
  890. memset(buf, 0, 512);
  891. len = pMgmt->sAssocInfo.AssocInfo.ResponseIELength;
  892. if(len) {
  893. memcpy(buf, pbyIEs, len);
  894. memset(&wrqu, 0, sizeof (wrqu));
  895. wrqu.data.length = len;
  896. we_event = IWEVASSOCRESPIE;
  897. PRINT_K("wireless_send_event--->IWEVASSOCRESPIE\n");
  898. wireless_send_event(pDevice->dev, we_event, &wrqu, buf);
  899. }
  900. memset(&wrqu, 0, sizeof (wrqu));
  901. memcpy(wrqu.ap_addr.sa_data, &pMgmt->abyCurrBSSID[0], ETH_ALEN);
  902. wrqu.ap_addr.sa_family = ARPHRD_ETHER;
  903. PRINT_K("wireless_send_event--->SIOCGIWAP(associated)\n");
  904. wireless_send_event(pDevice->dev, SIOCGIWAP, &wrqu, NULL);
  905. }
  906. #endif //#ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
  907. }
  908. else {
  909. if (bReAssocType) {
  910. pMgmt->eCurrState = WMAC_STATE_IDLE;
  911. }
  912. else {
  913. // jump back to the auth state and indicate the error
  914. pMgmt->eCurrState = WMAC_STATE_AUTH;
  915. }
  916. s_vMgrLogStatus(pMgmt,cpu_to_le16((*(sFrame.pwStatus))));
  917. }
  918. }
  919. #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
  920. //need clear flags related to Networkmanager
  921. pDevice->bwextstep0 = FALSE;
  922. pDevice->bwextstep1 = FALSE;
  923. pDevice->bwextstep2 = FALSE;
  924. pDevice->bwextstep3 = FALSE;
  925. pDevice->bWPASuppWextEnabled = FALSE;
  926. #endif
  927. if(pMgmt->eCurrState == WMAC_STATE_ASSOC)
  928. timer_expire(pDevice->sTimerCommand, 0);
  929. return;
  930. }
  931. /*+
  932. *
  933. * Routine Description:
  934. * Start the station authentication procedure. Namely, send an
  935. * authentication frame to the AP.
  936. *
  937. * Return Value:
  938. * None.
  939. *
  940. -*/
  941. void vMgrAuthenBeginSta(void *hDeviceContext,
  942. PSMgmtObject pMgmt,
  943. PCMD_STATUS pStatus)
  944. {
  945. PSDevice pDevice = (PSDevice)hDeviceContext;
  946. WLAN_FR_AUTHEN sFrame;
  947. PSTxMgmtPacket pTxPacket = NULL;
  948. pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
  949. memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_AUTHEN_FR_MAXLEN);
  950. pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
  951. sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
  952. sFrame.len = WLAN_AUTHEN_FR_MAXLEN;
  953. vMgrEncodeAuthen(&sFrame);
  954. /* insert values */
  955. sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
  956. (
  957. WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
  958. WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_AUTHEN)
  959. ));
  960. memcpy( sFrame.pHdr->sA3.abyAddr1, pMgmt->abyCurrBSSID, WLAN_ADDR_LEN);
  961. memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
  962. memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
  963. if (pMgmt->bShareKeyAlgorithm)
  964. *(sFrame.pwAuthAlgorithm) = cpu_to_le16(WLAN_AUTH_ALG_SHAREDKEY);
  965. else
  966. *(sFrame.pwAuthAlgorithm) = cpu_to_le16(WLAN_AUTH_ALG_OPENSYSTEM);
  967. *(sFrame.pwAuthSequence) = cpu_to_le16(1);
  968. /* Adjust the length fields */
  969. pTxPacket->cbMPDULen = sFrame.len;
  970. pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
  971. *pStatus = csMgmt_xmit(pDevice, pTxPacket);
  972. if (*pStatus == CMD_STATUS_PENDING){
  973. pMgmt->eCurrState = WMAC_STATE_AUTHPENDING;
  974. *pStatus = CMD_STATUS_SUCCESS;
  975. }
  976. return ;
  977. }
  978. /*+
  979. *
  980. * Routine Description:
  981. * Start the station(AP) deauthentication procedure. Namely, send an
  982. * deauthentication frame to the AP or Sta.
  983. *
  984. * Return Value:
  985. * None.
  986. *
  987. -*/
  988. void vMgrDeAuthenBeginSta(void *hDeviceContext,
  989. PSMgmtObject pMgmt,
  990. PBYTE abyDestAddress,
  991. WORD wReason,
  992. PCMD_STATUS pStatus)
  993. {
  994. PSDevice pDevice = (PSDevice)hDeviceContext;
  995. WLAN_FR_DEAUTHEN sFrame;
  996. PSTxMgmtPacket pTxPacket = NULL;
  997. pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
  998. memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_DEAUTHEN_FR_MAXLEN);
  999. pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
  1000. sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
  1001. sFrame.len = WLAN_DEAUTHEN_FR_MAXLEN;
  1002. vMgrEncodeDeauthen(&sFrame);
  1003. /* insert values */
  1004. sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
  1005. (
  1006. WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
  1007. WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_DEAUTHEN)
  1008. ));
  1009. memcpy( sFrame.pHdr->sA3.abyAddr1, abyDestAddress, WLAN_ADDR_LEN);
  1010. memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
  1011. memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
  1012. *(sFrame.pwReason) = cpu_to_le16(wReason); // deauthen. bcs left BSS
  1013. /* Adjust the length fields */
  1014. pTxPacket->cbMPDULen = sFrame.len;
  1015. pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
  1016. *pStatus = csMgmt_xmit(pDevice, pTxPacket);
  1017. if (*pStatus == CMD_STATUS_PENDING){
  1018. *pStatus = CMD_STATUS_SUCCESS;
  1019. }
  1020. return ;
  1021. }
  1022. /*+
  1023. *
  1024. * Routine Description:
  1025. * Handle incoming authentication frames.
  1026. *
  1027. * Return Value:
  1028. * None.
  1029. *
  1030. -*/
  1031. static
  1032. void
  1033. s_vMgrRxAuthentication(
  1034. PSDevice pDevice,
  1035. PSMgmtObject pMgmt,
  1036. PSRxMgmtPacket pRxPacket
  1037. )
  1038. {
  1039. WLAN_FR_AUTHEN sFrame;
  1040. // we better be an AP or a STA in AUTHPENDING otherwise ignore
  1041. if (!(pMgmt->eCurrMode == WMAC_MODE_ESS_AP ||
  1042. pMgmt->eCurrState == WMAC_STATE_AUTHPENDING)) {
  1043. return;
  1044. }
  1045. // decode the frame
  1046. sFrame.len = pRxPacket->cbMPDULen;
  1047. sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
  1048. vMgrDecodeAuthen(&sFrame);
  1049. switch (cpu_to_le16((*(sFrame.pwAuthSequence )))){
  1050. case 1:
  1051. //AP funciton
  1052. s_vMgrRxAuthenSequence_1(pDevice,pMgmt, &sFrame);
  1053. break;
  1054. case 2:
  1055. s_vMgrRxAuthenSequence_2(pDevice, pMgmt, &sFrame);
  1056. break;
  1057. case 3:
  1058. //AP funciton
  1059. s_vMgrRxAuthenSequence_3(pDevice, pMgmt, &sFrame);
  1060. break;
  1061. case 4:
  1062. s_vMgrRxAuthenSequence_4(pDevice, pMgmt, &sFrame);
  1063. break;
  1064. default:
  1065. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Auth Sequence error, seq = %d\n",
  1066. cpu_to_le16((*(sFrame.pwAuthSequence))));
  1067. break;
  1068. }
  1069. return;
  1070. }
  1071. /*+
  1072. *
  1073. * Routine Description:
  1074. * Handles incoming authen frames with sequence 1. Currently
  1075. * assumes we're an AP. So far, no one appears to use authentication
  1076. * in Ad-Hoc mode.
  1077. *
  1078. * Return Value:
  1079. * None.
  1080. *
  1081. -*/
  1082. static
  1083. void
  1084. s_vMgrRxAuthenSequence_1(
  1085. PSDevice pDevice,
  1086. PSMgmtObject pMgmt,
  1087. PWLAN_FR_AUTHEN pFrame
  1088. )
  1089. {
  1090. PSTxMgmtPacket pTxPacket = NULL;
  1091. unsigned int uNodeIndex;
  1092. WLAN_FR_AUTHEN sFrame;
  1093. PSKeyItem pTransmitKey;
  1094. // Insert a Node entry
  1095. if (!BSSbIsSTAInNodeDB(pDevice, pFrame->pHdr->sA3.abyAddr2, &uNodeIndex)) {
  1096. BSSvCreateOneNode((PSDevice)pDevice, &uNodeIndex);
  1097. memcpy(pMgmt->sNodeDBTable[uNodeIndex].abyMACAddr, pFrame->pHdr->sA3.abyAddr2,
  1098. WLAN_ADDR_LEN);
  1099. }
  1100. if (pMgmt->bShareKeyAlgorithm) {
  1101. pMgmt->sNodeDBTable[uNodeIndex].eNodeState = NODE_KNOWN;
  1102. pMgmt->sNodeDBTable[uNodeIndex].byAuthSequence = 1;
  1103. }
  1104. else {
  1105. pMgmt->sNodeDBTable[uNodeIndex].eNodeState = NODE_AUTH;
  1106. }
  1107. // send auth reply
  1108. pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
  1109. memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_AUTHEN_FR_MAXLEN);
  1110. pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
  1111. sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
  1112. sFrame.len = WLAN_AUTHEN_FR_MAXLEN;
  1113. // format buffer structure
  1114. vMgrEncodeAuthen(&sFrame);
  1115. // insert values
  1116. sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
  1117. (
  1118. WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
  1119. WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_AUTHEN)|
  1120. WLAN_SET_FC_ISWEP(0)
  1121. ));
  1122. memcpy( sFrame.pHdr->sA3.abyAddr1, pFrame->pHdr->sA3.abyAddr2, WLAN_ADDR_LEN);
  1123. memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
  1124. memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
  1125. *(sFrame.pwAuthAlgorithm) = *(pFrame->pwAuthAlgorithm);
  1126. *(sFrame.pwAuthSequence) = cpu_to_le16(2);
  1127. if (cpu_to_le16(*(pFrame->pwAuthAlgorithm)) == WLAN_AUTH_ALG_SHAREDKEY) {
  1128. if (pMgmt->bShareKeyAlgorithm)
  1129. *(sFrame.pwStatus) = cpu_to_le16(WLAN_MGMT_STATUS_SUCCESS);
  1130. else
  1131. *(sFrame.pwStatus) = cpu_to_le16(WLAN_MGMT_STATUS_UNSUPPORTED_AUTHALG);
  1132. }
  1133. else {
  1134. if (pMgmt->bShareKeyAlgorithm)
  1135. *(sFrame.pwStatus) = cpu_to_le16(WLAN_MGMT_STATUS_UNSUPPORTED_AUTHALG);
  1136. else
  1137. *(sFrame.pwStatus) = cpu_to_le16(WLAN_MGMT_STATUS_SUCCESS);
  1138. }
  1139. if (pMgmt->bShareKeyAlgorithm &&
  1140. (cpu_to_le16(*(sFrame.pwStatus)) == WLAN_MGMT_STATUS_SUCCESS)) {
  1141. sFrame.pChallenge = (PWLAN_IE_CHALLENGE)(sFrame.pBuf + sFrame.len);
  1142. sFrame.len += WLAN_CHALLENGE_IE_LEN;
  1143. sFrame.pChallenge->byElementID = WLAN_EID_CHALLENGE;
  1144. sFrame.pChallenge->len = WLAN_CHALLENGE_LEN;
  1145. memset(pMgmt->abyChallenge, 0, WLAN_CHALLENGE_LEN);
  1146. // get group key
  1147. if(KeybGetTransmitKey(&(pDevice->sKey), pDevice->abyBroadcastAddr, GROUP_KEY, &pTransmitKey) == TRUE) {
  1148. rc4_init(&pDevice->SBox, pDevice->abyPRNG, pTransmitKey->uKeyLength+3);
  1149. rc4_encrypt(&pDevice->SBox, pMgmt->abyChallenge, pMgmt->abyChallenge, WLAN_CHALLENGE_LEN);
  1150. }
  1151. memcpy(sFrame.pChallenge->abyChallenge, pMgmt->abyChallenge , WLAN_CHALLENGE_LEN);
  1152. }
  1153. /* Adjust the length fields */
  1154. pTxPacket->cbMPDULen = sFrame.len;
  1155. pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
  1156. // send the frame
  1157. if (pDevice->bEnableHostapd) {
  1158. return;
  1159. }
  1160. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Authreq_reply sequence_1 tx.. \n");
  1161. if (csMgmt_xmit(pDevice, pTxPacket) != CMD_STATUS_PENDING) {
  1162. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Authreq_reply sequence_1 tx failed.\n");
  1163. }
  1164. return;
  1165. }
  1166. /*+
  1167. *
  1168. * Routine Description:
  1169. * Handles incoming auth frames with sequence number 2. Currently
  1170. * assumes we're a station.
  1171. *
  1172. *
  1173. * Return Value:
  1174. * None.
  1175. *
  1176. -*/
  1177. static
  1178. void
  1179. s_vMgrRxAuthenSequence_2(
  1180. PSDevice pDevice,
  1181. PSMgmtObject pMgmt,
  1182. PWLAN_FR_AUTHEN pFrame
  1183. )
  1184. {
  1185. WLAN_FR_AUTHEN sFrame;
  1186. PSTxMgmtPacket pTxPacket = NULL;
  1187. switch (cpu_to_le16((*(pFrame->pwAuthAlgorithm))))
  1188. {
  1189. case WLAN_AUTH_ALG_OPENSYSTEM:
  1190. if ( cpu_to_le16((*(pFrame->pwStatus))) == WLAN_MGMT_STATUS_SUCCESS ){
  1191. DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "802.11 Authen (OPEN) Successful.\n");
  1192. pMgmt->eCurrState = WMAC_STATE_AUTH;
  1193. timer_expire(pDevice->sTimerCommand, 0);
  1194. }
  1195. else {
  1196. DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "802.11 Authen (OPEN) Failed.\n");
  1197. s_vMgrLogStatus(pMgmt, cpu_to_le16((*(pFrame->pwStatus))));
  1198. pMgmt->eCurrState = WMAC_STATE_IDLE;
  1199. }
  1200. if (pDevice->eCommandState == WLAN_AUTHENTICATE_WAIT) {
  1201. /* spin_unlock_irq(&pDevice->lock);
  1202. vCommandTimerWait((void *) pDevice, 0);
  1203. spin_lock_irq(&pDevice->lock); */
  1204. }
  1205. break;
  1206. case WLAN_AUTH_ALG_SHAREDKEY:
  1207. if (cpu_to_le16((*(pFrame->pwStatus))) == WLAN_MGMT_STATUS_SUCCESS) {
  1208. pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
  1209. memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_AUTHEN_FR_MAXLEN);
  1210. pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
  1211. sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
  1212. sFrame.len = WLAN_AUTHEN_FR_MAXLEN;
  1213. // format buffer structure
  1214. vMgrEncodeAuthen(&sFrame);
  1215. // insert values
  1216. sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
  1217. (
  1218. WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
  1219. WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_AUTHEN)|
  1220. WLAN_SET_FC_ISWEP(1)
  1221. ));
  1222. memcpy( sFrame.pHdr->sA3.abyAddr1, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
  1223. memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
  1224. memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
  1225. *(sFrame.pwAuthAlgorithm) = *(pFrame->pwAuthAlgorithm);
  1226. *(sFrame.pwAuthSequence) = cpu_to_le16(3);
  1227. *(sFrame.pwStatus) = cpu_to_le16(WLAN_MGMT_STATUS_SUCCESS);
  1228. sFrame.pChallenge = (PWLAN_IE_CHALLENGE)(sFrame.pBuf + sFrame.len);
  1229. sFrame.len += WLAN_CHALLENGE_IE_LEN;
  1230. sFrame.pChallenge->byElementID = WLAN_EID_CHALLENGE;
  1231. sFrame.pChallenge->len = WLAN_CHALLENGE_LEN;
  1232. memcpy( sFrame.pChallenge->abyChallenge, pFrame->pChallenge->abyChallenge, WLAN_CHALLENGE_LEN);
  1233. // Adjust the length fields
  1234. pTxPacket->cbMPDULen = sFrame.len;
  1235. pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
  1236. // send the frame
  1237. if (csMgmt_xmit(pDevice, pTxPacket) != CMD_STATUS_PENDING) {
  1238. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Auth_reply sequence_2 tx failed.\n");
  1239. }
  1240. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Auth_reply sequence_2 tx ...\n");
  1241. }
  1242. else {
  1243. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:rx Auth_reply sequence_2 status error ...\n");
  1244. if ( pDevice->eCommandState == WLAN_AUTHENTICATE_WAIT ) {
  1245. /* spin_unlock_irq(&pDevice->lock);
  1246. vCommandTimerWait((void *) pDevice, 0);
  1247. spin_lock_irq(&pDevice->lock); */
  1248. }
  1249. s_vMgrLogStatus(pMgmt, cpu_to_le16((*(pFrame->pwStatus))));
  1250. }
  1251. break;
  1252. default:
  1253. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt: rx auth.seq = 2 unknown AuthAlgorithm=%d\n", cpu_to_le16((*(pFrame->pwAuthAlgorithm))));
  1254. break;
  1255. }
  1256. return;
  1257. }
  1258. /*+
  1259. *
  1260. * Routine Description:
  1261. * Handles incoming authen frames with sequence 3. Currently
  1262. * assumes we're an AP. This function assumes the frame has
  1263. * already been successfully decrypted.
  1264. *
  1265. *
  1266. * Return Value:
  1267. * None.
  1268. *
  1269. -*/
  1270. static
  1271. void
  1272. s_vMgrRxAuthenSequence_3(
  1273. PSDevice pDevice,
  1274. PSMgmtObject pMgmt,
  1275. PWLAN_FR_AUTHEN pFrame
  1276. )
  1277. {
  1278. PSTxMgmtPacket pTxPacket = NULL;
  1279. unsigned int uStatusCode = 0 ;
  1280. unsigned int uNodeIndex = 0;
  1281. WLAN_FR_AUTHEN sFrame;
  1282. if (!WLAN_GET_FC_ISWEP(pFrame->pHdr->sA3.wFrameCtl)) {
  1283. uStatusCode = WLAN_MGMT_STATUS_CHALLENGE_FAIL;
  1284. goto reply;
  1285. }
  1286. if (BSSbIsSTAInNodeDB(pDevice, pFrame->pHdr->sA3.abyAddr2, &uNodeIndex)) {
  1287. if (pMgmt->sNodeDBTable[uNodeIndex].byAuthSequence != 1) {
  1288. uStatusCode = WLAN_MGMT_STATUS_RX_AUTH_NOSEQ;
  1289. goto reply;
  1290. }
  1291. if (memcmp(pMgmt->abyChallenge, pFrame->pChallenge->abyChallenge, WLAN_CHALLENGE_LEN) != 0) {
  1292. uStatusCode = WLAN_MGMT_STATUS_CHALLENGE_FAIL;
  1293. goto reply;
  1294. }
  1295. }
  1296. else {
  1297. uStatusCode = WLAN_MGMT_STATUS_UNSPEC_FAILURE;
  1298. goto reply;
  1299. }
  1300. if (uNodeIndex) {
  1301. pMgmt->sNodeDBTable[uNodeIndex].eNodeState = NODE_AUTH;
  1302. pMgmt->sNodeDBTable[uNodeIndex].byAuthSequence = 0;
  1303. }
  1304. uStatusCode = WLAN_MGMT_STATUS_SUCCESS;
  1305. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Challenge text check ok..\n");
  1306. reply:
  1307. // send auth reply
  1308. pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
  1309. memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_AUTHEN_FR_MAXLEN);
  1310. pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
  1311. sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
  1312. sFrame.len = WLAN_AUTHEN_FR_MAXLEN;
  1313. // format buffer structure
  1314. vMgrEncodeAuthen(&sFrame);
  1315. /* insert values */
  1316. sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
  1317. (
  1318. WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
  1319. WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_AUTHEN)|
  1320. WLAN_SET_FC_ISWEP(0)
  1321. ));
  1322. memcpy( sFrame.pHdr->sA3.abyAddr1, pFrame->pHdr->sA3.abyAddr2, WLAN_ADDR_LEN);
  1323. memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
  1324. memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
  1325. *(sFrame.pwAuthAlgorithm) = *(pFrame->pwAuthAlgorithm);
  1326. *(sFrame.pwAuthSequence) = cpu_to_le16(4);
  1327. *(sFrame.pwStatus) = cpu_to_le16(uStatusCode);
  1328. /* Adjust the length fields */
  1329. pTxPacket->cbMPDULen = sFrame.len;
  1330. pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
  1331. // send the frame
  1332. if (pDevice->bEnableHostapd) {
  1333. return;
  1334. }
  1335. if (csMgmt_xmit(pDevice, pTxPacket) != CMD_STATUS_PENDING) {
  1336. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Authreq_reply sequence_4 tx failed.\n");
  1337. }
  1338. return;
  1339. }
  1340. /*+
  1341. *
  1342. * Routine Description:
  1343. * Handles incoming authen frames with sequence 4
  1344. *
  1345. *
  1346. * Return Value:
  1347. * None.
  1348. *
  1349. -*/
  1350. static
  1351. void
  1352. s_vMgrRxAuthenSequence_4(
  1353. PSDevice pDevice,
  1354. PSMgmtObject pMgmt,
  1355. PWLAN_FR_AUTHEN pFrame
  1356. )
  1357. {
  1358. if ( cpu_to_le16((*(pFrame->pwStatus))) == WLAN_MGMT_STATUS_SUCCESS ){
  1359. DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "802.11 Authen (SHAREDKEY) Successful.\n");
  1360. pMgmt->eCurrState = WMAC_STATE_AUTH;
  1361. timer_expire(pDevice->sTimerCommand, 0);
  1362. }
  1363. else{
  1364. DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "802.11 Authen (SHAREDKEY) Failed.\n");
  1365. s_vMgrLogStatus(pMgmt, cpu_to_le16((*(pFrame->pwStatus))) );
  1366. pMgmt->eCurrState = WMAC_STATE_IDLE;
  1367. }
  1368. if ( pDevice->eCommandState == WLAN_AUTHENTICATE_WAIT ) {
  1369. /* spin_unlock_irq(&pDevice->lock);
  1370. vCommandTimerWait((void *) pDevice, 0);
  1371. spin_lock_irq(&pDevice->lock); */
  1372. }
  1373. }
  1374. /*+
  1375. *
  1376. * Routine Description:
  1377. * Handles incoming disassociation frames
  1378. *
  1379. *
  1380. * Return Value:
  1381. * None.
  1382. *
  1383. -*/
  1384. static
  1385. void
  1386. s_vMgrRxDisassociation(
  1387. PSDevice pDevice,
  1388. PSMgmtObject pMgmt,
  1389. PSRxMgmtPacket pRxPacket
  1390. )
  1391. {
  1392. WLAN_FR_DISASSOC sFrame;
  1393. unsigned int uNodeIndex = 0;
  1394. CMD_STATUS CmdStatus;
  1395. viawget_wpa_header *wpahdr;
  1396. if ( pMgmt->eCurrMode == WMAC_MODE_ESS_AP ){
  1397. // if is acting an AP..
  1398. // a STA is leaving this BSS..
  1399. sFrame.len = pRxPacket->cbMPDULen;
  1400. sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
  1401. if (BSSbIsSTAInNodeDB(pDevice, pRxPacket->p80211Header->sA3.abyAddr2, &uNodeIndex)) {
  1402. BSSvRemoveOneNode(pDevice, uNodeIndex);
  1403. }
  1404. else {
  1405. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Rx disassoc, sta not found\n");
  1406. }
  1407. }
  1408. else if (pMgmt->eCurrMode == WMAC_MODE_ESS_STA ){
  1409. sFrame.len = pRxPacket->cbMPDULen;
  1410. sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
  1411. vMgrDecodeDisassociation(&sFrame);
  1412. DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "AP disassociated me, reason=%d.\n", cpu_to_le16(*(sFrame.pwReason)));
  1413. pDevice->fWPA_Authened = FALSE;
  1414. if ((pDevice->bWPADEVUp) && (pDevice->skb != NULL)) {
  1415. wpahdr = (viawget_wpa_header *)pDevice->skb->data;
  1416. wpahdr->type = VIAWGET_DISASSOC_MSG;
  1417. wpahdr->resp_ie_len = 0;
  1418. wpahdr->req_ie_len = 0;
  1419. skb_put(pDevice->skb, sizeof(viawget_wpa_header));
  1420. pDevice->skb->dev = pDevice->wpadev;
  1421. skb_reset_mac_header(pDevice->skb);
  1422. pDevice->skb->pkt_type = PACKET_HOST;
  1423. pDevice->skb->protocol = htons(ETH_P_802_2);
  1424. memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
  1425. netif_rx(pDevice->skb);
  1426. pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
  1427. }
  1428. //TODO: do something let upper layer know or
  1429. //try to send associate packet again because of inactivity timeout
  1430. if (pMgmt->eCurrState == WMAC_STATE_ASSOC) {
  1431. pDevice->bLinkPass = FALSE;
  1432. pMgmt->sNodeDBTable[0].bActive = FALSE;
  1433. pDevice->byReAssocCount = 0;
  1434. pMgmt->eCurrState = WMAC_STATE_AUTH; // jump back to the auth state!
  1435. pDevice->eCommandState = WLAN_ASSOCIATE_WAIT;
  1436. vMgrReAssocBeginSta((PSDevice)pDevice, pMgmt, &CmdStatus);
  1437. if(CmdStatus == CMD_STATUS_PENDING) {
  1438. pDevice->byReAssocCount ++;
  1439. return; //mike add: you'll retry for many times, so it cann't be regarded as disconnected!
  1440. }
  1441. }
  1442. #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
  1443. // if(pDevice->bWPASuppWextEnabled == TRUE)
  1444. {
  1445. union iwreq_data wrqu;
  1446. memset(&wrqu, 0, sizeof (wrqu));
  1447. wrqu.ap_addr.sa_family = ARPHRD_ETHER;
  1448. PRINT_K("wireless_send_event--->SIOCGIWAP(disassociated)\n");
  1449. wireless_send_event(pDevice->dev, SIOCGIWAP, &wrqu, NULL);
  1450. }
  1451. #endif
  1452. }
  1453. /* else, ignore it */
  1454. return;
  1455. }
  1456. /*+
  1457. *
  1458. * Routine Description:
  1459. * Handles incoming deauthentication frames
  1460. *
  1461. *
  1462. * Return Value:
  1463. * None.
  1464. *
  1465. -*/
  1466. static
  1467. void
  1468. s_vMgrRxDeauthentication(
  1469. PSDevice pDevice,
  1470. PSMgmtObject pMgmt,
  1471. PSRxMgmtPacket pRxPacket
  1472. )
  1473. {
  1474. WLAN_FR_DEAUTHEN sFrame;
  1475. unsigned int uNodeIndex = 0;
  1476. viawget_wpa_header *wpahdr;
  1477. if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP ){
  1478. //Todo:
  1479. // if is acting an AP..
  1480. // a STA is leaving this BSS..
  1481. sFrame.len = pRxPacket->cbMPDULen;
  1482. sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
  1483. if (BSSbIsSTAInNodeDB(pDevice, pRxPacket->p80211Header->sA3.abyAddr2, &uNodeIndex)) {
  1484. BSSvRemoveOneNode(pDevice, uNodeIndex);
  1485. }
  1486. else {
  1487. DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Rx deauth, sta not found\n");
  1488. }
  1489. }
  1490. else {
  1491. if (pMgmt->eCurrMode == WMAC_MODE_ESS_STA ) {
  1492. sFrame.len = pRxPacket->cbMPDULen;
  1493. sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
  1494. vMgrDecodeDeauthen(&sFrame);
  1495. pDevice->fWPA_Authened = FALSE;
  1496. DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "AP deauthed me, reason=%d.\n", cpu_to_le16((*(sFrame.pwReason))));
  1497. // TODO: update BSS list for specific BSSID if pre-authentication case
  1498. if (!compare_ether_addr(sFrame.pHdr->sA3.abyAddr3,
  1499. pMgmt->abyCurrBSSID)) {
  1500. if (pMgmt->eCurrState >= WMAC_STATE_AUTHPENDING) {
  1501. pMgmt->sNodeDBTable[0].bActive = FALSE;
  1502. pMgmt->eCurrMode = WMAC_MODE_STANDBY;
  1503. pMgmt->eCurrState = WMAC_STATE_IDLE;
  1504. netif_stop_queue(pDevice->dev);
  1505. pDevice->bLinkPass = FALSE;
  1506. ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_SLOW);
  1507. }
  1508. }
  1509. if ((pDevice->bWPADEVUp) && (pDevice->skb != NULL)) {
  1510. wpahdr = (viawget_wpa_header *)pDevice->skb->data;
  1511. wpahdr->type = VIAWGET_DISASSOC_MSG;
  1512. wpahdr->resp_ie_len = 0;
  1513. wpahdr->req_ie_len = 0;
  1514. skb_put(pDevice->skb, sizeof(viawget_wpa_header));
  1515. pDevice->skb->dev = pDevice->wpadev;
  1516. skb_reset_mac_header(pDevice->skb);
  1517. pDevice->skb->pkt_type = PACKET_HOST;
  1518. pDevice->skb->protocol = htons(ETH_P_802_2);
  1519. memset(pDevice->skb->cb, 0, sizeof(pDevice->skb->cb));
  1520. netif_rx(pDevice->skb);
  1521. pDevice->skb = dev_alloc_skb((int)pDevice->rx_buf_sz);
  1522. }
  1523. #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
  1524. // if(pDevice->bWPASuppWextEnabled == TRUE)
  1525. {
  1526. union iwreq_data wrqu;
  1527. memset(&wrqu, 0, sizeof (wrqu));
  1528. wrqu.ap_addr.sa_family = ARPHRD_ETHER;
  1529. PRINT_K("wireless_send_event--->SIOCGIWAP(disauthen)\n");
  1530. wireless_send_event(pDevice->dev, SIOCGIWAP, &wrqu, NULL);
  1531. }
  1532. #endif
  1533. }
  1534. /* else, ignore it. TODO: IBSS authentication service
  1535. would be implemented here */
  1536. };
  1537. return;
  1538. }
  1539. /*+
  1540. *
  1541. * Routine Description:
  1542. * check if current channel is match ZoneType.
  1543. *for USA:1~11;
  1544. * Japan:1~13;
  1545. * Europe:1~13
  1546. * Return Value:
  1547. * True:exceed;
  1548. * False:normal case
  1549. -*/
  1550. static BOOL
  1551. ChannelExceedZoneType(
  1552. PSDevice pDevice,
  1553. BYTE byCurrChannel
  1554. )
  1555. {
  1556. BOOL exceed=FALSE;
  1557. switch(pDevice->byZoneType) {
  1558. case 0x00: //USA:1~11
  1559. if((byCurrChannel<1) ||(byCurrChannel>11))
  1560. exceed = TRUE;
  1561. break;
  1562. case 0x01: //Japan:1~13
  1563. case 0x02: //Europe:1~13
  1564. if((byCurrChannel<1) ||(byCurrChannel>13))
  1565. exceed = TRUE;
  1566. break;
  1567. default: //reserve for other zonetype
  1568. break;
  1569. }
  1570. return exceed;
  1571. }
  1572. /*+
  1573. *
  1574. * Routine Description:
  1575. * Handles and analysis incoming beacon frames.
  1576. *
  1577. *
  1578. * Return Value:
  1579. * None.
  1580. *
  1581. -*/
  1582. static
  1583. void
  1584. s_vMgrRxBeacon(
  1585. PSDevice pDevice,
  1586. PSMgmtObject pMgmt,
  1587. PSRxMgmtPacket pRxPacket,
  1588. BOOL bInScan
  1589. )
  1590. {
  1591. PKnownBSS pBSSList;
  1592. WLAN_FR_BEACON sFrame;
  1593. QWORD qwTSFOffset;
  1594. BOOL bIsBSSIDEqual = FALSE;
  1595. BOOL bIsSSIDEqual = FALSE;
  1596. BOOL bTSFLargeDiff = FALSE;
  1597. BOOL bTSFOffsetPostive = FALSE;
  1598. BOOL bUpdateTSF = FALSE;
  1599. BOOL bIsAPBeacon = FALSE;
  1600. BOOL bIsChannelEqual = FALSE;
  1601. unsigned int uLocateByteIndex;
  1602. BYTE byTIMBitOn = 0;
  1603. WORD wAIDNumber = 0;
  1604. unsigned int uNodeIndex;
  1605. QWORD qwTimestamp, qwLocalTSF;
  1606. QWORD qwCurrTSF;
  1607. WORD wStartIndex = 0;
  1608. WORD wAIDIndex = 0;
  1609. BYTE byCurrChannel = pRxPacket->byRxChannel;
  1610. ERPObject sERP;
  1611. unsigned int uRateLen = WLAN_RATES_MAXLEN;
  1612. BOOL bChannelHit = FALSE;
  1613. BYTE byOldPreambleType;
  1614. if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP)
  1615. return;
  1616. memset(&sFrame, 0, sizeof(WLAN_FR_BEACON));
  1617. sFrame.len = pRxPacket->cbMPDULen;
  1618. sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
  1619. // decode the beacon frame
  1620. vMgrDecodeBeacon(&sFrame);
  1621. if ((sFrame.pwBeaconInterval == NULL)
  1622. || (sFrame.pwCapInfo == NULL)
  1623. || (sFrame.pSSID == NULL)
  1624. || (sFrame.pSuppRates == NULL)) {
  1625. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Rx beacon frame error\n");
  1626. return;
  1627. }
  1628. if( byCurrChannel > CB_MAX_CHANNEL_24G )
  1629. {
  1630. if (sFrame.pDSParms != NULL) {
  1631. if (byCurrChannel == RFaby11aChannelIndex[sFrame.pDSParms->byCurrChannel-1])
  1632. bChannelHit = TRUE;
  1633. byCurrChannel = RFaby11aChannelIndex[sFrame.pDSParms->byCurrChannel-1];
  1634. } else {
  1635. bChannelHit = TRUE;
  1636. }
  1637. } else {
  1638. if (sFrame.pDSParms != NULL) {
  1639. if (byCurrChannel == sFrame.pDSParms->byCurrChannel)
  1640. bChannelHit = TRUE;
  1641. byCurrChannel = sFrame.pDSParms->byCurrChannel;
  1642. } else {
  1643. bChannelHit = TRUE;
  1644. }
  1645. }
  1646. if(ChannelExceedZoneType(pDevice,byCurrChannel)==TRUE)
  1647. return;
  1648. if (sFrame.pERP != NULL) {
  1649. sERP.byERP = sFrame.pERP->byContext;
  1650. sERP.bERPExist = TRUE;
  1651. } else {
  1652. sERP.bERPExist = FALSE;
  1653. sERP.byERP = 0;
  1654. }
  1655. pBSSList = BSSpAddrIsInBSSList((void *) pDevice,
  1656. sFrame.pHdr->sA3.abyAddr3,
  1657. sFrame.pSSID);
  1658. if (pBSSList == NULL) {
  1659. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Beacon/insert: RxChannel = : %d\n", byCurrChannel);
  1660. BSSbInsertToBSSList((void *) pDevice,
  1661. sFrame.pHdr->sA3.abyAddr3,
  1662. *sFrame.pqwTimestamp,
  1663. *sFrame.pwBeaconInterval,
  1664. *sFrame.pwCapInfo,
  1665. byCurrChannel,
  1666. sFrame.pSSID,
  1667. sFrame.pSuppRates,
  1668. sFrame.pExtSuppRates,
  1669. &sERP,
  1670. sFrame.pRSN,
  1671. sFrame.pRSNWPA,
  1672. sFrame.pIE_Country,
  1673. sFrame.pIE_Quiet,
  1674. sFrame.len - WLAN_HDR_ADDR3_LEN,
  1675. sFrame.pHdr->sA4.abyAddr4, // payload of beacon
  1676. (void *) pRxPacket);
  1677. }
  1678. else {
  1679. // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"update bcn: RxChannel = : %d\n", byCurrChannel);
  1680. BSSbUpdateToBSSList((void *) pDevice,
  1681. *sFrame.pqwTimestamp,
  1682. *sFrame.pwBeaconInterval,
  1683. *sFrame.pwCapInfo,
  1684. byCurrChannel,
  1685. bChannelHit,
  1686. sFrame.pSSID,
  1687. sFrame.pSuppRates,
  1688. sFrame.pExtSuppRates,
  1689. &sERP,
  1690. sFrame.pRSN,
  1691. sFrame.pRSNWPA,
  1692. sFrame.pIE_Country,
  1693. sFrame.pIE_Quiet,
  1694. pBSSList,
  1695. sFrame.len - WLAN_HDR_ADDR3_LEN,
  1696. sFrame.pHdr->sA4.abyAddr4, // payload of probresponse
  1697. (void *) pRxPacket);
  1698. }
  1699. if (bInScan) {
  1700. return;
  1701. }
  1702. if(byCurrChannel == (BYTE)pMgmt->uCurrChannel)
  1703. bIsChannelEqual = TRUE;
  1704. if (bIsChannelEqual && (pMgmt->eCurrMode == WMAC_MODE_ESS_AP)) {
  1705. // if rx beacon without ERP field
  1706. if (sERP.bERPExist) {
  1707. if (WLAN_GET_ERP_USE_PROTECTION(sERP.byERP)){
  1708. pDevice->byERPFlag |= WLAN_SET_ERP_USE_PROTECTION(1);
  1709. pDevice->wUseProtectCntDown = USE_PROTECT_PERIOD;
  1710. }
  1711. }
  1712. else {
  1713. pDevice->byERPFlag |= WLAN_SET_ERP_USE_PROTECTION(1);
  1714. pDevice->wUseProtectCntDown = USE_PROTECT_PERIOD;
  1715. }
  1716. if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
  1717. if(!WLAN_GET_CAP_INFO_SHORTPREAMBLE(*sFrame.pwCapInfo))
  1718. pDevice->byERPFlag |= WLAN_SET_ERP_BARKER_MODE(1);
  1719. if(!sERP.bERPExist)
  1720. pDevice->byERPFlag |= WLAN_SET_ERP_NONERP_PRESENT(1);
  1721. }
  1722. }
  1723. // check if BSSID the same
  1724. if (memcmp(sFrame.pHdr->sA3.abyAddr3,
  1725. pMgmt->abyCurrBSSID,
  1726. WLAN_BSSID_LEN) == 0) {
  1727. bIsBSSIDEqual = TRUE;
  1728. pDevice->uCurrRSSI = pRxPacket->uRSSI;
  1729. pDevice->byCurrSQ = pRxPacket->bySQ;
  1730. if (pMgmt->sNodeDBTable[0].uInActiveCount != 0) {
  1731. pMgmt->sNodeDBTable[0].uInActiveCount = 0;
  1732. //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BCN:Wake Count= [%d]\n", pMgmt->wCountToWakeUp);
  1733. }
  1734. }
  1735. // check if SSID the same
  1736. if (sFrame.pSSID->len == ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->len) {
  1737. if (memcmp(sFrame.pSSID->abySSID,
  1738. ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->abySSID,
  1739. sFrame.pSSID->len
  1740. ) == 0) {
  1741. bIsSSIDEqual = TRUE;
  1742. }
  1743. }
  1744. if ((WLAN_GET_CAP_INFO_ESS(*sFrame.pwCapInfo)== TRUE) &&
  1745. (bIsBSSIDEqual == TRUE) &&
  1746. (bIsSSIDEqual == TRUE) &&
  1747. (pMgmt->eCurrMode == WMAC_MODE_ESS_STA) &&
  1748. (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
  1749. // add state check to prevent reconnect fail since we'll receive Beacon
  1750. bIsAPBeacon = TRUE;
  1751. if (pBSSList != NULL) {
  1752. // Sync ERP field
  1753. if ((pBSSList->sERP.bERPExist == TRUE) && (pDevice->byBBType == BB_TYPE_11G)) {
  1754. if ((pBSSList->sERP.byERP & WLAN_EID_ERP_USE_PROTECTION) != pDevice->bProtectMode) {//0000 0010
  1755. pDevice->bProtectMode = (pBSSList->sERP.byERP & WLAN_EID_ERP_USE_PROTECTION);
  1756. if (pDevice->bProtectMode) {
  1757. MACvEnableProtectMD(pDevice);
  1758. } else {
  1759. MACvDisableProtectMD(pDevice);
  1760. }
  1761. vUpdateIFS(pDevice);
  1762. }
  1763. if ((pBSSList->sERP.byERP & WLAN_EID_ERP_NONERP_PRESENT) != pDevice->bNonERPPresent) {//0000 0001
  1764. pDevice->bNonERPPresent = (pBSSList->sERP.byERP & WLAN_EID_ERP_USE_PROTECTION);
  1765. }
  1766. if ((pBSSList->sERP.byERP & WLAN_EID_ERP_BARKER_MODE) != pDevice->bBarkerPreambleMd) {//0000 0100
  1767. pDevice->bBarkerPreambleMd = (pBSSList->sERP.byERP & WLAN_EID_ERP_BARKER_MODE);
  1768. //BarkerPreambleMd has higher priority than shortPreamble bit in Cap
  1769. if (pDevice->bBarkerPreambleMd) {
  1770. MACvEnableBarkerPreambleMd(pDevice);
  1771. } else {
  1772. MACvDisableBarkerPreambleMd(pDevice);
  1773. }
  1774. }
  1775. }
  1776. // Sync Short Slot Time
  1777. if (WLAN_GET_CAP_INFO_SHORTSLOTTIME(pBSSList->wCapInfo) != pDevice->bShortSlotTime) {
  1778. BOOL bShortSlotTime;
  1779. bShortSlotTime = WLAN_GET_CAP_INFO_SHORTSLOTTIME(pBSSList->wCapInfo);
  1780. //DBG_PRN_WLAN05(("Set Short Slot Time: %d\n", pDevice->bShortSlotTime));
  1781. //Kyle check if it is OK to set G.
  1782. if (pDevice->byBBType == BB_TYPE_11A) {
  1783. bShortSlotTime = TRUE;
  1784. }
  1785. else if (pDevice->byBBType == BB_TYPE_11B) {
  1786. bShortSlotTime = FALSE;
  1787. }
  1788. if (bShortSlotTime != pDevice->bShortSlotTime) {
  1789. pDevice->bShortSlotTime = bShortSlotTime;
  1790. BBvSetShortSlotTime(pDevice);
  1791. vUpdateIFS(pDevice);
  1792. }
  1793. }
  1794. //
  1795. // Preamble may change dynamiclly
  1796. //
  1797. byOldPreambleType = pDevice->byPreambleType;
  1798. if (WLAN_GET_CAP_INFO_SHORTPREAMBLE(pBSSList->wCapInfo)) {
  1799. pDevice->byPreambleType = pDevice->byShortPreamble;
  1800. }
  1801. else {
  1802. pDevice->byPreambleType = 0;
  1803. }
  1804. if (pDevice->byPreambleType != byOldPreambleType)
  1805. CARDvSetRSPINF(pDevice, (BYTE)pDevice->byBBType);
  1806. //
  1807. // Basic Rate Set may change dynamiclly
  1808. //
  1809. if (pBSSList->eNetworkTypeInUse == PHY_TYPE_11B) {
  1810. uRateLen = WLAN_RATES_MAXLEN_11B;
  1811. }
  1812. pMgmt->abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)pBSSList->abySuppRates,
  1813. (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
  1814. uRateLen);
  1815. pMgmt->abyCurrExtSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)pBSSList->abyExtSuppRates,
  1816. (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates,
  1817. uRateLen);
  1818. RATEvParseMaxRate((void *)pDevice,
  1819. (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
  1820. (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates,
  1821. TRUE,
  1822. &(pMgmt->sNodeDBTable[0].wMaxBasicRate),
  1823. &(pMgmt->sNodeDBTable[0].wMaxSuppRate),
  1824. &(pMgmt->sNodeDBTable[0].wSuppRate),
  1825. &(pMgmt->sNodeDBTable[0].byTopCCKBasicRate),
  1826. &(pMgmt->sNodeDBTable[0].byTopOFDMBasicRate)
  1827. );
  1828. }
  1829. }
  1830. // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Beacon 2 \n");
  1831. // check if CF field exisit
  1832. if (WLAN_GET_CAP_INFO_ESS(*sFrame.pwCapInfo)) {
  1833. if (sFrame.pCFParms->wCFPDurRemaining > 0) {
  1834. // TODO: deal with CFP period to set NAV
  1835. }
  1836. }
  1837. HIDWORD(qwTimestamp) = cpu_to_le32(HIDWORD(*sFrame.pqwTimestamp));
  1838. LODWORD(qwTimestamp) = cpu_to_le32(LODWORD(*sFrame.pqwTimestamp));
  1839. HIDWORD(qwLocalTSF) = HIDWORD(pRxPacket->qwLocalTSF);
  1840. LODWORD(qwLocalTSF) = LODWORD(pRxPacket->qwLocalTSF);
  1841. // check if beacon TSF larger or small than our local TSF
  1842. if (HIDWORD(qwTimestamp) == HIDWORD(qwLocalTSF)) {
  1843. if (LODWORD(qwTimestamp) >= LODWORD(qwLocalTSF)) {
  1844. bTSFOffsetPostive = TRUE;
  1845. }
  1846. else {
  1847. bTSFOffsetPostive = FALSE;
  1848. }
  1849. }
  1850. else if (HIDWORD(qwTimestamp) > HIDWORD(qwLocalTSF)) {
  1851. bTSFOffsetPostive = TRUE;
  1852. }
  1853. else if (HIDWORD(qwTimestamp) < HIDWORD(qwLocalTSF)) {
  1854. bTSFOffsetPostive = FALSE;
  1855. }
  1856. if (bTSFOffsetPostive) {
  1857. qwTSFOffset = CARDqGetTSFOffset(pRxPacket->byRxRate, (qwTimestamp), (qwLocalTSF));
  1858. }
  1859. else {
  1860. qwTSFOffset = CARDqGetTSFOffset(pRxPacket->byRxRate, (qwLocalTSF), (qwTimestamp));
  1861. }
  1862. if (HIDWORD(qwTSFOffset) != 0 ||
  1863. (LODWORD(qwTSFOffset) > TRIVIAL_SYNC_DIFFERENCE )) {
  1864. bTSFLargeDiff = TRUE;
  1865. }
  1866. // if infra mode
  1867. if (bIsAPBeacon == TRUE) {
  1868. // Infra mode: Local TSF always follow AP's TSF if Difference huge.
  1869. if (bTSFLargeDiff)
  1870. bUpdateTSF = TRUE;
  1871. if ((pDevice->bEnablePSMode == TRUE) && (sFrame.pTIM)) {
  1872. /* deal with DTIM, analysis TIM */
  1873. pMgmt->bMulticastTIM = WLAN_MGMT_IS_MULTICAST_TIM(sFrame.pTIM->byBitMapCtl) ? TRUE : FALSE ;
  1874. pMgmt->byDTIMCount = sFrame.pTIM->byDTIMCount;
  1875. pMgmt->byDTIMPeriod = sFrame.pTIM->byDTIMPeriod;
  1876. wAIDNumber = pMgmt->wCurrAID & ~(BIT14|BIT15);
  1877. // check if AID in TIM field bit on
  1878. // wStartIndex = N1
  1879. wStartIndex = WLAN_MGMT_GET_TIM_OFFSET(sFrame.pTIM->byBitMapCtl) << 1;
  1880. // AIDIndex = N2
  1881. wAIDIndex = (wAIDNumber >> 3);
  1882. if ((wAIDNumber > 0) && (wAIDIndex >= wStartIndex)) {
  1883. uLocateByteIndex = wAIDIndex - wStartIndex;
  1884. // len = byDTIMCount + byDTIMPeriod + byDTIMPeriod + byVirtBitMap[0~250]
  1885. if (sFrame.pTIM->len >= (uLocateByteIndex + 4)) {
  1886. byTIMBitOn = (0x01) << ((wAIDNumber) % 8);
  1887. pMgmt->bInTIM = sFrame.pTIM->byVirtBitMap[uLocateByteIndex] & byTIMBitOn ? TRUE : FALSE;
  1888. }
  1889. else {
  1890. pMgmt->bInTIM = FALSE;
  1891. };
  1892. }
  1893. else {
  1894. pMgmt->bInTIM = FALSE;
  1895. };
  1896. if (pMgmt->bInTIM ||
  1897. (pMgmt->bMulticastTIM && (pMgmt->byDTIMCount == 0))) {
  1898. pMgmt->bInTIMWake = TRUE;
  1899. // send out ps-poll packet
  1900. // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "BCN:In TIM\n");
  1901. if (pMgmt->bInTIM) {
  1902. PSvSendPSPOLL((PSDevice)pDevice);
  1903. // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "BCN:PS-POLL sent..\n");
  1904. }
  1905. }
  1906. else {
  1907. pMgmt->bInTIMWake = FALSE;
  1908. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "BCN: Not In TIM..\n");
  1909. if (pDevice->bPWBitOn == FALSE) {
  1910. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "BCN: Send Null Packet\n");
  1911. if (PSbSendNullPacket(pDevice))
  1912. pDevice->bPWBitOn = TRUE;
  1913. }
  1914. if(PSbConsiderPowerDown(pDevice, FALSE, FALSE)) {
  1915. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "BCN: Power down now...\n");
  1916. }
  1917. }
  1918. }
  1919. }
  1920. // if adhoc mode
  1921. if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) && !bIsAPBeacon && bIsChannelEqual) {
  1922. if (bIsBSSIDEqual) {
  1923. // Use sNodeDBTable[0].uInActiveCount as IBSS beacons received count.
  1924. if (pMgmt->sNodeDBTable[0].uInActiveCount != 0)
  1925. pMgmt->sNodeDBTable[0].uInActiveCount = 0;
  1926. // adhoc mode:TSF updated only when beacon larger then local TSF
  1927. if (bTSFLargeDiff && bTSFOffsetPostive &&
  1928. (pMgmt->eCurrState == WMAC_STATE_JOINTED))
  1929. bUpdateTSF = TRUE;
  1930. // During dpc, already in spinlocked.
  1931. if (BSSbIsSTAInNodeDB(pDevice, sFrame.pHdr->sA3.abyAddr2, &uNodeIndex)) {
  1932. // Update the STA, (Techically the Beacons of all the IBSS nodes
  1933. // should be identical, but that's not happening in practice.
  1934. pMgmt->abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pSuppRates,
  1935. (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
  1936. WLAN_RATES_MAXLEN_11B);
  1937. RATEvParseMaxRate((void *)pDevice,
  1938. (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
  1939. NULL,
  1940. TRUE,
  1941. &(pMgmt->sNodeDBTable[uNodeIndex].wMaxBasicRate),
  1942. &(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate),
  1943. &(pMgmt->sNodeDBTable[uNodeIndex].wSuppRate),
  1944. &(pMgmt->sNodeDBTable[uNodeIndex].byTopCCKBasicRate),
  1945. &(pMgmt->sNodeDBTable[uNodeIndex].byTopOFDMBasicRate)
  1946. );
  1947. pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble = WLAN_GET_CAP_INFO_SHORTPREAMBLE(*sFrame.pwCapInfo);
  1948. pMgmt->sNodeDBTable[uNodeIndex].bShortSlotTime = WLAN_GET_CAP_INFO_SHORTSLOTTIME(*sFrame.pwCapInfo);
  1949. pMgmt->sNodeDBTable[uNodeIndex].uInActiveCount = 0;
  1950. }
  1951. else {
  1952. // Todo, initial Node content
  1953. BSSvCreateOneNode((PSDevice)pDevice, &uNodeIndex);
  1954. pMgmt->abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pSuppRates,
  1955. (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
  1956. WLAN_RATES_MAXLEN_11B);
  1957. RATEvParseMaxRate((void *)pDevice,
  1958. (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
  1959. NULL,
  1960. TRUE,
  1961. &(pMgmt->sNodeDBTable[uNodeIndex].wMaxBasicRate),
  1962. &(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate),
  1963. &(pMgmt->sNodeDBTable[uNodeIndex].wSuppRate),
  1964. &(pMgmt->sNodeDBTable[uNodeIndex].byTopCCKBasicRate),
  1965. &(pMgmt->sNodeDBTable[uNodeIndex].byTopOFDMBasicRate)
  1966. );
  1967. memcpy(pMgmt->sNodeDBTable[uNodeIndex].abyMACAddr, sFrame.pHdr->sA3.abyAddr2, WLAN_ADDR_LEN);
  1968. pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble = WLAN_GET_CAP_INFO_SHORTPREAMBLE(*sFrame.pwCapInfo);
  1969. pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate = pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate;
  1970. /*
  1971. pMgmt->sNodeDBTable[uNodeIndex].bShortSlotTime = WLAN_GET_CAP_INFO_SHORTSLOTTIME(*sFrame.pwCapInfo);
  1972. if(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate > RATE_11M)
  1973. pMgmt->sNodeDBTable[uNodeIndex].bERPExist = TRUE;
  1974. */
  1975. }
  1976. // if other stations jointed, indicate connect to upper layer..
  1977. if (pMgmt->eCurrState == WMAC_STATE_STARTED) {
  1978. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Current IBSS State: [Started]........to: [Jointed] \n");
  1979. pMgmt->eCurrState = WMAC_STATE_JOINTED;
  1980. pDevice->bLinkPass = TRUE;
  1981. ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_INTER);
  1982. if (netif_queue_stopped(pDevice->dev)){
  1983. netif_wake_queue(pDevice->dev);
  1984. }
  1985. pMgmt->sNodeDBTable[0].bActive = TRUE;
  1986. pMgmt->sNodeDBTable[0].uInActiveCount = 0;
  1987. }
  1988. }
  1989. else if (bIsSSIDEqual) {
  1990. // See other adhoc sta with the same SSID but BSSID is different.
  1991. // adpot this vars only when TSF larger then us.
  1992. if (bTSFLargeDiff && bTSFOffsetPostive) {
  1993. // we don't support ATIM under adhoc mode
  1994. // if ( sFrame.pIBSSParms->wATIMWindow == 0) {
  1995. // adpot this vars
  1996. // TODO: check sFrame cap if privacy on, and support rate syn
  1997. memcpy(pMgmt->abyCurrBSSID, sFrame.pHdr->sA3.abyAddr3, WLAN_BSSID_LEN);
  1998. memcpy(pDevice->abyBSSID, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
  1999. pMgmt->wCurrATIMWindow = cpu_to_le16(sFrame.pIBSSParms->wATIMWindow);
  2000. pMgmt->wCurrBeaconPeriod = cpu_to_le16(*sFrame.pwBeaconInterval);
  2001. pMgmt->abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pSuppRates,
  2002. (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
  2003. WLAN_RATES_MAXLEN_11B);
  2004. // set HW beacon interval and re-synchronizing....
  2005. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Rejoining to Other Adhoc group with same SSID........\n");
  2006. MACvWriteBeaconInterval(pDevice, pMgmt->wCurrBeaconPeriod);
  2007. CARDvAdjustTSF(pDevice, pRxPacket->byRxRate, qwTimestamp, pRxPacket->qwLocalTSF);
  2008. CARDvUpdateNextTBTT(pDevice, qwTimestamp, pMgmt->wCurrBeaconPeriod);
  2009. // Turn off bssid filter to avoid filter others adhoc station which bssid is different.
  2010. MACvWriteBSSIDAddress(pDevice, pMgmt->abyCurrBSSID);
  2011. byOldPreambleType = pDevice->byPreambleType;
  2012. if (WLAN_GET_CAP_INFO_SHORTPREAMBLE(*sFrame.pwCapInfo)) {
  2013. pDevice->byPreambleType = pDevice->byShortPreamble;
  2014. }
  2015. else {
  2016. pDevice->byPreambleType = 0;
  2017. }
  2018. if (pDevice->byPreambleType != byOldPreambleType)
  2019. CARDvSetRSPINF(pDevice, (BYTE)pDevice->byBBType);
  2020. // MACvRegBitsOff(pDevice->PortOffset, MAC_REG_RCR, RCR_BSSID);
  2021. // set highest basic rate
  2022. // s_vSetHighestBasicRate(pDevice, (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates);
  2023. // Prepare beacon frame
  2024. bMgrPrepareBeaconToSend((void *) pDevice, pMgmt);
  2025. // }
  2026. }
  2027. }
  2028. }
  2029. // endian issue ???
  2030. // Update TSF
  2031. if (bUpdateTSF) {
  2032. CARDbGetCurrentTSF(pDevice, &qwCurrTSF);
  2033. CARDvAdjustTSF(pDevice, pRxPacket->byRxRate, qwTimestamp , pRxPacket->qwLocalTSF);
  2034. CARDbGetCurrentTSF(pDevice, &qwCurrTSF);
  2035. CARDvUpdateNextTBTT(pDevice, qwTimestamp, pMgmt->wCurrBeaconPeriod);
  2036. }
  2037. return;
  2038. }
  2039. /*+
  2040. *
  2041. * Routine Description:
  2042. * Instructs the hw to create a bss using the supplied
  2043. * attributes. Note that this implementation only supports Ad-Hoc
  2044. * BSS creation.
  2045. *
  2046. *
  2047. * Return Value:
  2048. * CMD_STATUS
  2049. *
  2050. -*/
  2051. void vMgrCreateOwnIBSS(void *hDeviceContext,
  2052. PCMD_STATUS pStatus)
  2053. {
  2054. PSDevice pDevice = (PSDevice)hDeviceContext;
  2055. PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
  2056. WORD wMaxBasicRate;
  2057. WORD wMaxSuppRate;
  2058. BYTE byTopCCKBasicRate;
  2059. BYTE byTopOFDMBasicRate;
  2060. QWORD qwCurrTSF;
  2061. unsigned int ii;
  2062. BYTE abyRATE[] = {0x82, 0x84, 0x8B, 0x96, 0x24, 0x30, 0x48, 0x6C, 0x0C, 0x12, 0x18, 0x60};
  2063. BYTE abyCCK_RATE[] = {0x82, 0x84, 0x8B, 0x96};
  2064. BYTE abyOFDM_RATE[] = {0x0C, 0x12, 0x18, 0x24, 0x30, 0x48, 0x60, 0x6C};
  2065. WORD wSuppRate;
  2066. HIDWORD(qwCurrTSF) = 0;
  2067. LODWORD(qwCurrTSF) = 0;
  2068. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Create Basic Service Set .......\n");
  2069. if (pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA) {
  2070. if ((pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) &&
  2071. (pDevice->eEncryptionStatus != Ndis802_11Encryption2Enabled) &&
  2072. (pDevice->eEncryptionStatus != Ndis802_11Encryption3Enabled)) {
  2073. // encryption mode error
  2074. *pStatus = CMD_STATUS_FAILURE;
  2075. return;
  2076. }
  2077. }
  2078. pMgmt->abyCurrSuppRates[0] = WLAN_EID_SUPP_RATES;
  2079. pMgmt->abyCurrExtSuppRates[0] = WLAN_EID_EXTSUPP_RATES;
  2080. if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
  2081. pMgmt->eCurrentPHYMode = pMgmt->byAPBBType;
  2082. } else {
  2083. if (pDevice->byBBType == BB_TYPE_11G)
  2084. pMgmt->eCurrentPHYMode = PHY_TYPE_11G;
  2085. if (pDevice->byBBType == BB_TYPE_11B)
  2086. pMgmt->eCurrentPHYMode = PHY_TYPE_11B;
  2087. if (pDevice->byBBType == BB_TYPE_11A)
  2088. pMgmt->eCurrentPHYMode = PHY_TYPE_11A;
  2089. }
  2090. if (pMgmt->eCurrentPHYMode != PHY_TYPE_11A) {
  2091. pMgmt->abyCurrSuppRates[1] = WLAN_RATES_MAXLEN_11B;
  2092. pMgmt->abyCurrExtSuppRates[1] = 0;
  2093. for (ii = 0; ii < 4; ii++)
  2094. pMgmt->abyCurrSuppRates[2+ii] = abyRATE[ii];
  2095. } else {
  2096. pMgmt->abyCurrSuppRates[1] = 8;
  2097. pMgmt->abyCurrExtSuppRates[1] = 0;
  2098. for (ii = 0; ii < 8; ii++)
  2099. pMgmt->abyCurrSuppRates[2+ii] = abyRATE[ii];
  2100. }
  2101. if (pMgmt->eCurrentPHYMode == PHY_TYPE_11G) {
  2102. pMgmt->abyCurrSuppRates[1] = 8;
  2103. pMgmt->abyCurrExtSuppRates[1] = 4;
  2104. for (ii = 0; ii < 4; ii++)
  2105. pMgmt->abyCurrSuppRates[2+ii] = abyCCK_RATE[ii];
  2106. for (ii = 4; ii < 8; ii++)
  2107. pMgmt->abyCurrSuppRates[2+ii] = abyOFDM_RATE[ii-4];
  2108. for (ii = 0; ii < 4; ii++)
  2109. pMgmt->abyCurrExtSuppRates[2+ii] = abyOFDM_RATE[ii+4];
  2110. }
  2111. // Disable Protect Mode
  2112. pDevice->bProtectMode = 0;
  2113. MACvDisableProtectMD(pDevice);
  2114. pDevice->bBarkerPreambleMd = 0;
  2115. MACvDisableBarkerPreambleMd(pDevice);
  2116. // Kyle Test 2003.11.04
  2117. // set HW beacon interval
  2118. if (pMgmt->wIBSSBeaconPeriod == 0)
  2119. pMgmt->wIBSSBeaconPeriod = DEFAULT_IBSS_BI;
  2120. MACvWriteBeaconInterval(pDevice, pMgmt->wIBSSBeaconPeriod);
  2121. CARDbGetCurrentTSF(pDevice, &qwCurrTSF);
  2122. // clear TSF counter
  2123. CARDbClearCurrentTSF(pDevice);
  2124. // enable TSF counter
  2125. MACvRegBitsOn(pDevice,MAC_REG_TFTCTL,TFTCTL_TSFCNTREN);
  2126. // set Next TBTT
  2127. CARDvSetFirstNextTBTT(pDevice, pMgmt->wIBSSBeaconPeriod);
  2128. pMgmt->uIBSSChannel = pDevice->uChannel;
  2129. if (pMgmt->uIBSSChannel == 0)
  2130. pMgmt->uIBSSChannel = DEFAULT_IBSS_CHANNEL;
  2131. // set channel and clear NAV
  2132. CARDbSetMediaChannel(pDevice, pMgmt->uIBSSChannel);
  2133. pMgmt->uCurrChannel = pMgmt->uIBSSChannel;
  2134. pDevice->byPreambleType = pDevice->byShortPreamble;
  2135. // set basic rate
  2136. RATEvParseMaxRate((void *)pDevice,
  2137. (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
  2138. (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates, TRUE,
  2139. &wMaxBasicRate, &wMaxSuppRate, &wSuppRate,
  2140. &byTopCCKBasicRate, &byTopOFDMBasicRate);
  2141. if (pDevice->byBBType == BB_TYPE_11A) {
  2142. pDevice->bShortSlotTime = TRUE;
  2143. } else {
  2144. pDevice->bShortSlotTime = FALSE;
  2145. }
  2146. BBvSetShortSlotTime(pDevice);
  2147. // vUpdateIFS() use pDevice->bShortSlotTime as parameter so it must be called
  2148. // after setting ShortSlotTime.
  2149. // CARDvSetBSSMode call vUpdateIFS()
  2150. CARDvSetBSSMode(pDevice);
  2151. if (pMgmt->eConfigMode == WMAC_CONFIG_AP) {
  2152. MACvRegBitsOn(pDevice, MAC_REG_HOSTCR, HOSTCR_AP);
  2153. pMgmt->eCurrMode = WMAC_MODE_ESS_AP;
  2154. }
  2155. if (pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA) {
  2156. MACvRegBitsOn(pDevice, MAC_REG_HOSTCR, HOSTCR_ADHOC);
  2157. pMgmt->eCurrMode = WMAC_MODE_IBSS_STA;
  2158. }
  2159. // Adopt pre-configured IBSS vars to current vars
  2160. pMgmt->eCurrState = WMAC_STATE_STARTED;
  2161. pMgmt->wCurrBeaconPeriod = pMgmt->wIBSSBeaconPeriod;
  2162. pMgmt->uCurrChannel = pMgmt->uIBSSChannel;
  2163. pMgmt->wCurrATIMWindow = pMgmt->wIBSSATIMWindow;
  2164. pDevice->uCurrRSSI = 0;
  2165. pDevice->byCurrSQ = 0;
  2166. memcpy(pMgmt->abyDesireSSID,pMgmt->abyAdHocSSID,
  2167. ((PWLAN_IE_SSID)pMgmt->abyAdHocSSID)->len + WLAN_IEHDR_LEN);
  2168. memset(pMgmt->abyCurrSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
  2169. memcpy(pMgmt->abyCurrSSID,
  2170. pMgmt->abyDesireSSID,
  2171. ((PWLAN_IE_SSID)pMgmt->abyDesireSSID)->len + WLAN_IEHDR_LEN
  2172. );
  2173. if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
  2174. // AP mode BSSID = MAC addr
  2175. memcpy(pMgmt->abyCurrBSSID, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
  2176. DBG_PRT(MSG_LEVEL_INFO, KERN_INFO"AP beacon created BSSID:%02x-%02x-%02x-%02x-%02x-%02x \n",
  2177. pMgmt->abyCurrBSSID[0],
  2178. pMgmt->abyCurrBSSID[1],
  2179. pMgmt->abyCurrBSSID[2],
  2180. pMgmt->abyCurrBSSID[3],
  2181. pMgmt->abyCurrBSSID[4],
  2182. pMgmt->abyCurrBSSID[5]
  2183. );
  2184. }
  2185. if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
  2186. // BSSID selected must be randomized as spec 11.1.3
  2187. pMgmt->abyCurrBSSID[5] = (BYTE) (LODWORD(qwCurrTSF)& 0x000000ff);
  2188. pMgmt->abyCurrBSSID[4] = (BYTE)((LODWORD(qwCurrTSF)& 0x0000ff00) >> 8);
  2189. pMgmt->abyCurrBSSID[3] = (BYTE)((LODWORD(qwCurrTSF)& 0x00ff0000) >> 16);
  2190. pMgmt->abyCurrBSSID[2] = (BYTE)((LODWORD(qwCurrTSF)& 0x00000ff0) >> 4);
  2191. pMgmt->abyCurrBSSID[1] = (BYTE)((LODWORD(qwCurrTSF)& 0x000ff000) >> 12);
  2192. pMgmt->abyCurrBSSID[0] = (BYTE)((LODWORD(qwCurrTSF)& 0x0ff00000) >> 20);
  2193. pMgmt->abyCurrBSSID[5] ^= pMgmt->abyMACAddr[0];
  2194. pMgmt->abyCurrBSSID[4] ^= pMgmt->abyMACAddr[1];
  2195. pMgmt->abyCurrBSSID[3] ^= pMgmt->abyMACAddr[2];
  2196. pMgmt->abyCurrBSSID[2] ^= pMgmt->abyMACAddr[3];
  2197. pMgmt->abyCurrBSSID[1] ^= pMgmt->abyMACAddr[4];
  2198. pMgmt->abyCurrBSSID[0] ^= pMgmt->abyMACAddr[5];
  2199. pMgmt->abyCurrBSSID[0] &= ~IEEE_ADDR_GROUP;
  2200. pMgmt->abyCurrBSSID[0] |= IEEE_ADDR_UNIVERSAL;
  2201. DBG_PRT(MSG_LEVEL_INFO, KERN_INFO"Adhoc beacon created bssid:%02x-%02x-%02x-%02x-%02x-%02x \n",
  2202. pMgmt->abyCurrBSSID[0],
  2203. pMgmt->abyCurrBSSID[1],
  2204. pMgmt->abyCurrBSSID[2],
  2205. pMgmt->abyCurrBSSID[3],
  2206. pMgmt->abyCurrBSSID[4],
  2207. pMgmt->abyCurrBSSID[5]
  2208. );
  2209. }
  2210. // set BSSID filter
  2211. MACvWriteBSSIDAddress(pDevice, pMgmt->abyCurrBSSID);
  2212. memcpy(pDevice->abyBSSID, pMgmt->abyCurrBSSID, WLAN_ADDR_LEN);
  2213. MACvRegBitsOn(pDevice, MAC_REG_RCR, RCR_BSSID);
  2214. pDevice->byRxMode |= RCR_BSSID;
  2215. pMgmt->bCurrBSSIDFilterOn = TRUE;
  2216. // Set Capability Info
  2217. pMgmt->wCurrCapInfo = 0;
  2218. if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
  2219. pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_ESS(1);
  2220. pMgmt->byDTIMPeriod = DEFAULT_DTIM_PERIOD;
  2221. pMgmt->byDTIMCount = pMgmt->byDTIMPeriod - 1;
  2222. pDevice->eOPMode = OP_MODE_AP;
  2223. }
  2224. if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
  2225. pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_IBSS(1);
  2226. pDevice->eOPMode = OP_MODE_ADHOC;
  2227. }
  2228. if (pDevice->bEncryptionEnable) {
  2229. pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_PRIVACY(1);
  2230. if (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) {
  2231. if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
  2232. pMgmt->byCSSPK = KEY_CTL_CCMP;
  2233. pMgmt->byCSSGK = KEY_CTL_CCMP;
  2234. } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
  2235. pMgmt->byCSSPK = KEY_CTL_TKIP;
  2236. pMgmt->byCSSGK = KEY_CTL_TKIP;
  2237. } else {
  2238. pMgmt->byCSSPK = KEY_CTL_NONE;
  2239. pMgmt->byCSSGK = KEY_CTL_WEP;
  2240. }
  2241. } else {
  2242. pMgmt->byCSSPK = KEY_CTL_WEP;
  2243. pMgmt->byCSSGK = KEY_CTL_WEP;
  2244. }
  2245. }
  2246. pMgmt->byERPContext = 0;
  2247. if (pDevice->byPreambleType == 1) {
  2248. pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1);
  2249. } else {
  2250. pMgmt->wCurrCapInfo &= (~WLAN_SET_CAP_INFO_SHORTPREAMBLE(1));
  2251. }
  2252. pMgmt->eCurrState = WMAC_STATE_STARTED;
  2253. // Prepare beacon to send
  2254. if (bMgrPrepareBeaconToSend((void *) pDevice, pMgmt))
  2255. *pStatus = CMD_STATUS_SUCCESS;
  2256. return;
  2257. }
  2258. /*+
  2259. *
  2260. * Routine Description:
  2261. * Instructs wmac to join a bss using the supplied attributes.
  2262. * The arguments may the BSSID or SSID and the rest of the
  2263. * attributes are obtained from the scan result of known bss list.
  2264. *
  2265. *
  2266. * Return Value:
  2267. * None.
  2268. *
  2269. -*/
  2270. void vMgrJoinBSSBegin(void *hDeviceContext, PCMD_STATUS pStatus)
  2271. {
  2272. PSDevice pDevice = (PSDevice)hDeviceContext;
  2273. PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
  2274. PKnownBSS pCurr = NULL;
  2275. unsigned int ii, uu;
  2276. PWLAN_IE_SUPP_RATES pItemRates = NULL;
  2277. PWLAN_IE_SUPP_RATES pItemExtRates = NULL;
  2278. PWLAN_IE_SSID pItemSSID;
  2279. unsigned int uRateLen = WLAN_RATES_MAXLEN;
  2280. WORD wMaxBasicRate = RATE_1M;
  2281. WORD wMaxSuppRate = RATE_1M;
  2282. WORD wSuppRate;
  2283. BYTE byTopCCKBasicRate = RATE_1M;
  2284. BYTE byTopOFDMBasicRate = RATE_1M;
  2285. BOOL bShortSlotTime = FALSE;
  2286. for (ii = 0; ii < MAX_BSS_NUM; ii++) {
  2287. if (pMgmt->sBSSList[ii].bActive == TRUE)
  2288. break;
  2289. }
  2290. if (ii == MAX_BSS_NUM) {
  2291. *pStatus = CMD_STATUS_RESOURCES;
  2292. DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "BSS finding:BSS list is empty.\n");
  2293. return;
  2294. }
  2295. // memset(pMgmt->abyDesireBSSID, 0, WLAN_BSSID_LEN);
  2296. // Search known BSS list for prefer BSSID or SSID
  2297. pCurr = BSSpSearchBSSList(pDevice,
  2298. pMgmt->abyDesireBSSID,
  2299. pMgmt->abyDesireSSID,
  2300. pDevice->eConfigPHYMode
  2301. );
  2302. if (pCurr == NULL){
  2303. *pStatus = CMD_STATUS_RESOURCES;
  2304. pItemSSID = (PWLAN_IE_SSID)pMgmt->abyDesireSSID;
  2305. DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Scanning [%s] not found, disconnected !\n", pItemSSID->abySSID);
  2306. return;
  2307. }
  2308. DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "AP(BSS) finding:Found a AP(BSS)..\n");
  2309. if (WLAN_GET_CAP_INFO_ESS(cpu_to_le16(pCurr->wCapInfo))){
  2310. if ((pMgmt->eAuthenMode == WMAC_AUTH_WPA) ||
  2311. (pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK)) {
  2312. /*
  2313. if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
  2314. if (WPA_SearchRSN(0, WPA_TKIP, pCurr) == FALSE) {
  2315. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"No match RSN info. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
  2316. // encryption mode error
  2317. pMgmt->eCurrState = WMAC_STATE_IDLE;
  2318. return;
  2319. }
  2320. } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
  2321. if (WPA_SearchRSN(0, WPA_AESCCMP, pCurr) == FALSE) {
  2322. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"No match RSN info. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
  2323. // encryption mode error
  2324. pMgmt->eCurrState = WMAC_STATE_IDLE;
  2325. return;
  2326. }
  2327. }
  2328. */
  2329. }
  2330. #ifdef WPA_SUPPLICANT_DRIVER_WEXT_SUPPORT
  2331. //if(pDevice->bWPASuppWextEnabled == TRUE)
  2332. Encyption_Rebuild(pDevice, pCurr);
  2333. #endif
  2334. // Infrastructure BSS
  2335. s_vMgrSynchBSS(pDevice,
  2336. WMAC_MODE_ESS_STA,
  2337. pCurr,
  2338. pStatus
  2339. );
  2340. if (*pStatus == CMD_STATUS_SUCCESS){
  2341. // Adopt this BSS state vars in Mgmt Object
  2342. pMgmt->uCurrChannel = pCurr->uChannel;
  2343. memset(pMgmt->abyCurrSuppRates, 0 , WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1);
  2344. memset(pMgmt->abyCurrExtSuppRates, 0 , WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1);
  2345. if (pCurr->eNetworkTypeInUse == PHY_TYPE_11B) {
  2346. uRateLen = WLAN_RATES_MAXLEN_11B;
  2347. }
  2348. pItemRates = (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates;
  2349. pItemExtRates = (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates;
  2350. // Parse Support Rate IE
  2351. pItemRates->byElementID = WLAN_EID_SUPP_RATES;
  2352. pItemRates->len = RATEuSetIE((PWLAN_IE_SUPP_RATES)pCurr->abySuppRates,
  2353. pItemRates,
  2354. uRateLen);
  2355. // Parse Extension Support Rate IE
  2356. pItemExtRates->byElementID = WLAN_EID_EXTSUPP_RATES;
  2357. pItemExtRates->len = RATEuSetIE((PWLAN_IE_SUPP_RATES)pCurr->abyExtSuppRates,
  2358. pItemExtRates,
  2359. uRateLen);
  2360. // Stuffing Rate IE
  2361. if ((pItemExtRates->len > 0) && (pItemRates->len < 8)) {
  2362. for (ii = 0; ii < (unsigned int) (8 - pItemRates->len); ) {
  2363. pItemRates->abyRates[pItemRates->len + ii] =
  2364. pItemExtRates->abyRates[ii];
  2365. ii++;
  2366. if (pItemExtRates->len <= ii)
  2367. break;
  2368. }
  2369. pItemRates->len += (BYTE)ii;
  2370. if (pItemExtRates->len - ii > 0) {
  2371. pItemExtRates->len -= (BYTE)ii;
  2372. for (uu = 0; uu < pItemExtRates->len; uu ++) {
  2373. pItemExtRates->abyRates[uu] = pItemExtRates->abyRates[uu + ii];
  2374. }
  2375. } else {
  2376. pItemExtRates->len = 0;
  2377. }
  2378. }
  2379. RATEvParseMaxRate((void *)pDevice, pItemRates, pItemExtRates, TRUE,
  2380. &wMaxBasicRate, &wMaxSuppRate, &wSuppRate,
  2381. &byTopCCKBasicRate, &byTopOFDMBasicRate);
  2382. vUpdateIFS(pDevice);
  2383. // TODO: deal with if wCapInfo the privacy is on, but station WEP is off
  2384. // TODO: deal with if wCapInfo the PS-Pollable is on.
  2385. pMgmt->wCurrBeaconPeriod = pCurr->wBeaconInterval;
  2386. memset(pMgmt->abyCurrSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
  2387. memcpy(pMgmt->abyCurrBSSID, pCurr->abyBSSID, WLAN_BSSID_LEN);
  2388. memcpy(pMgmt->abyCurrSSID, pCurr->abySSID, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1);
  2389. pMgmt->eCurrMode = WMAC_MODE_ESS_STA;
  2390. pMgmt->eCurrState = WMAC_STATE_JOINTED;
  2391. // Adopt BSS state in Adapter Device Object
  2392. pDevice->eOPMode = OP_MODE_INFRASTRUCTURE;
  2393. memcpy(pDevice->abyBSSID, pCurr->abyBSSID, WLAN_BSSID_LEN);
  2394. // Add current BSS to Candidate list
  2395. // This should only works for WPA2 BSS, and WPA2 BSS check must be done before.
  2396. if (pMgmt->eAuthenMode == WMAC_AUTH_WPA2) {
  2397. BOOL bResult = bAdd_PMKID_Candidate((void *) pDevice,
  2398. pMgmt->abyCurrBSSID,
  2399. &pCurr->sRSNCapObj);
  2400. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"bAdd_PMKID_Candidate: 1(%d)\n", bResult);
  2401. if (bResult == FALSE) {
  2402. vFlush_PMKID_Candidate((void *) pDevice);
  2403. DBG_PRT(MSG_LEVEL_DEBUG,
  2404. KERN_INFO "vFlush_PMKID_Candidate: 4\n");
  2405. bAdd_PMKID_Candidate((void *) pDevice,
  2406. pMgmt->abyCurrBSSID,
  2407. &pCurr->sRSNCapObj);
  2408. }
  2409. }
  2410. // Preamble type auto-switch: if AP can receive short-preamble cap,
  2411. // we can turn on too.
  2412. if (WLAN_GET_CAP_INFO_SHORTPREAMBLE(pCurr->wCapInfo)) {
  2413. pDevice->byPreambleType = pDevice->byShortPreamble;
  2414. }
  2415. else {
  2416. pDevice->byPreambleType = 0;
  2417. }
  2418. // Change PreambleType must set RSPINF again
  2419. CARDvSetRSPINF(pDevice, (BYTE)pDevice->byBBType);
  2420. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Join ESS\n");
  2421. if (pCurr->eNetworkTypeInUse == PHY_TYPE_11G) {
  2422. if ((pCurr->sERP.byERP & WLAN_EID_ERP_USE_PROTECTION) != pDevice->bProtectMode) {//0000 0010
  2423. pDevice->bProtectMode = (pCurr->sERP.byERP & WLAN_EID_ERP_USE_PROTECTION);
  2424. if (pDevice->bProtectMode) {
  2425. MACvEnableProtectMD(pDevice);
  2426. } else {
  2427. MACvDisableProtectMD(pDevice);
  2428. }
  2429. vUpdateIFS(pDevice);
  2430. }
  2431. if ((pCurr->sERP.byERP & WLAN_EID_ERP_NONERP_PRESENT) != pDevice->bNonERPPresent) {//0000 0001
  2432. pDevice->bNonERPPresent = (pCurr->sERP.byERP & WLAN_EID_ERP_USE_PROTECTION);
  2433. }
  2434. if ((pCurr->sERP.byERP & WLAN_EID_ERP_BARKER_MODE) != pDevice->bBarkerPreambleMd) {//0000 0100
  2435. pDevice->bBarkerPreambleMd = (pCurr->sERP.byERP & WLAN_EID_ERP_BARKER_MODE);
  2436. //BarkerPreambleMd has higher priority than shortPreamble bit in Cap
  2437. if (pDevice->bBarkerPreambleMd) {
  2438. MACvEnableBarkerPreambleMd(pDevice);
  2439. } else {
  2440. MACvDisableBarkerPreambleMd(pDevice);
  2441. }
  2442. }
  2443. }
  2444. //DBG_PRN_WLAN05(("wCapInfo: %X\n", pCurr->wCapInfo));
  2445. if (WLAN_GET_CAP_INFO_SHORTSLOTTIME(pCurr->wCapInfo) != pDevice->bShortSlotTime) {
  2446. if (pDevice->byBBType == BB_TYPE_11A) {
  2447. bShortSlotTime = TRUE;
  2448. }
  2449. else if (pDevice->byBBType == BB_TYPE_11B) {
  2450. bShortSlotTime = FALSE;
  2451. }
  2452. else {
  2453. bShortSlotTime = WLAN_GET_CAP_INFO_SHORTSLOTTIME(pCurr->wCapInfo);
  2454. }
  2455. //DBG_PRN_WLAN05(("Set Short Slot Time: %d\n", pDevice->bShortSlotTime));
  2456. if (bShortSlotTime != pDevice->bShortSlotTime) {
  2457. pDevice->bShortSlotTime = bShortSlotTime;
  2458. BBvSetShortSlotTime(pDevice);
  2459. vUpdateIFS(pDevice);
  2460. }
  2461. }
  2462. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"End of Join AP -- A/B/G Action\n");
  2463. }
  2464. else {
  2465. pMgmt->eCurrState = WMAC_STATE_IDLE;
  2466. };
  2467. }
  2468. else {
  2469. // ad-hoc mode BSS
  2470. if (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) {
  2471. if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) {
  2472. /*
  2473. if (WPA_SearchRSN(0, WPA_TKIP, pCurr) == FALSE) {
  2474. // encryption mode error
  2475. pMgmt->eCurrState = WMAC_STATE_IDLE;
  2476. return;
  2477. }
  2478. */
  2479. } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) {
  2480. /*
  2481. if (WPA_SearchRSN(0, WPA_AESCCMP, pCurr) == FALSE) {
  2482. // encryption mode error
  2483. pMgmt->eCurrState = WMAC_STATE_IDLE;
  2484. return;
  2485. }
  2486. */
  2487. } else {
  2488. // encryption mode error
  2489. pMgmt->eCurrState = WMAC_STATE_IDLE;
  2490. return;
  2491. }
  2492. }
  2493. s_vMgrSynchBSS(pDevice,
  2494. WMAC_MODE_IBSS_STA,
  2495. pCurr,
  2496. pStatus
  2497. );
  2498. if (*pStatus == CMD_STATUS_SUCCESS){
  2499. // Adopt this BSS state vars in Mgmt Object
  2500. // TODO: check if CapInfo privacy on, but we don't..
  2501. pMgmt->uCurrChannel = pCurr->uChannel;
  2502. // Parse Support Rate IE
  2503. pMgmt->abyCurrSuppRates[0] = WLAN_EID_SUPP_RATES;
  2504. pMgmt->abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)pCurr->abySuppRates,
  2505. (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
  2506. WLAN_RATES_MAXLEN_11B);
  2507. // set basic rate
  2508. RATEvParseMaxRate((void *)pDevice,
  2509. (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
  2510. NULL, TRUE, &wMaxBasicRate, &wMaxSuppRate, &wSuppRate,
  2511. &byTopCCKBasicRate, &byTopOFDMBasicRate);
  2512. vUpdateIFS(pDevice);
  2513. pMgmt->wCurrCapInfo = pCurr->wCapInfo;
  2514. pMgmt->wCurrBeaconPeriod = pCurr->wBeaconInterval;
  2515. memset(pMgmt->abyCurrSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN);
  2516. memcpy(pMgmt->abyCurrBSSID, pCurr->abyBSSID, WLAN_BSSID_LEN);
  2517. memcpy(pMgmt->abyCurrSSID, pCurr->abySSID, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN);
  2518. // pMgmt->wCurrATIMWindow = pCurr->wATIMWindow;
  2519. pMgmt->eCurrMode = WMAC_MODE_IBSS_STA;
  2520. pMgmt->eCurrState = WMAC_STATE_STARTED;
  2521. // Adopt BSS state in Adapter Device Object
  2522. pDevice->eOPMode = OP_MODE_ADHOC;
  2523. pDevice->bLinkPass = TRUE;
  2524. ControlvMaskByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_PAPEDELAY,LEDSTS_STS,LEDSTS_INTER);
  2525. memcpy(pDevice->abyBSSID, pCurr->abyBSSID, WLAN_BSSID_LEN);
  2526. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Join IBSS ok:%02x-%02x-%02x-%02x-%02x-%02x \n",
  2527. pMgmt->abyCurrBSSID[0],
  2528. pMgmt->abyCurrBSSID[1],
  2529. pMgmt->abyCurrBSSID[2],
  2530. pMgmt->abyCurrBSSID[3],
  2531. pMgmt->abyCurrBSSID[4],
  2532. pMgmt->abyCurrBSSID[5]
  2533. );
  2534. // Preamble type auto-switch: if AP can receive short-preamble cap,
  2535. // and if registry setting is short preamble we can turn on too.
  2536. if (WLAN_GET_CAP_INFO_SHORTPREAMBLE(pCurr->wCapInfo)) {
  2537. pDevice->byPreambleType = pDevice->byShortPreamble;
  2538. }
  2539. else {
  2540. pDevice->byPreambleType = 0;
  2541. }
  2542. // Change PreambleType must set RSPINF again
  2543. CARDvSetRSPINF(pDevice, (BYTE)pDevice->byBBType);
  2544. // Prepare beacon
  2545. bMgrPrepareBeaconToSend((void *) pDevice, pMgmt);
  2546. }
  2547. else {
  2548. pMgmt->eCurrState = WMAC_STATE_IDLE;
  2549. };
  2550. };
  2551. return;
  2552. }
  2553. /*+
  2554. *
  2555. * Routine Description:
  2556. * Set HW to synchronize a specific BSS from known BSS list.
  2557. *
  2558. *
  2559. * Return Value:
  2560. * PCM_STATUS
  2561. *
  2562. -*/
  2563. static
  2564. void
  2565. s_vMgrSynchBSS (
  2566. PSDevice pDevice,
  2567. unsigned int uBSSMode,
  2568. PKnownBSS pCurr,
  2569. PCMD_STATUS pStatus
  2570. )
  2571. {
  2572. PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
  2573. //1M, 2M, 5M, 11M, 18M, 24M, 36M, 54M
  2574. BYTE abyCurrSuppRatesG[] = {WLAN_EID_SUPP_RATES, 8, 0x02, 0x04, 0x0B, 0x16, 0x24, 0x30, 0x48, 0x6C};
  2575. BYTE abyCurrExtSuppRatesG[] = {WLAN_EID_EXTSUPP_RATES, 4, 0x0C, 0x12, 0x18, 0x60};
  2576. //6M, 9M, 12M, 48M
  2577. BYTE abyCurrSuppRatesA[] = {WLAN_EID_SUPP_RATES, 8, 0x0C, 0x12, 0x18, 0x24, 0x30, 0x48, 0x60, 0x6C};
  2578. BYTE abyCurrSuppRatesB[] = {WLAN_EID_SUPP_RATES, 4, 0x02, 0x04, 0x0B, 0x16};
  2579. *pStatus = CMD_STATUS_FAILURE;
  2580. if (s_bCipherMatch(pCurr,
  2581. pDevice->eEncryptionStatus,
  2582. &(pMgmt->byCSSPK),
  2583. &(pMgmt->byCSSGK)) == FALSE) {
  2584. DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "s_bCipherMatch Fail .......\n");
  2585. return;
  2586. }
  2587. pMgmt->pCurrBSS = pCurr;
  2588. // if previous mode is IBSS.
  2589. if(pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
  2590. MACvRegBitsOff(pDevice, MAC_REG_TCR, TCR_AUTOBCNTX);
  2591. }
  2592. // Init the BSS informations
  2593. pDevice->bCCK = TRUE;
  2594. pDevice->bProtectMode = FALSE;
  2595. MACvDisableProtectMD(pDevice);
  2596. pDevice->bBarkerPreambleMd = FALSE;
  2597. MACvDisableBarkerPreambleMd(pDevice);
  2598. pDevice->bNonERPPresent = FALSE;
  2599. pDevice->byPreambleType = 0;
  2600. pDevice->wBasicRate = 0;
  2601. // Set Basic Rate
  2602. CARDbAddBasicRate((void *)pDevice, RATE_1M);
  2603. // calculate TSF offset
  2604. // TSF Offset = Received Timestamp TSF - Marked Local's TSF
  2605. CARDvAdjustTSF(pDevice, pCurr->byRxRate, pCurr->qwBSSTimestamp, pCurr->qwLocalTSF);
  2606. // set HW beacon interval
  2607. MACvWriteBeaconInterval(pDevice, pCurr->wBeaconInterval);
  2608. // set Next TBTT
  2609. // Next TBTT = ((local_current_TSF / beacon_interval) + 1 ) * beacon_interval
  2610. CARDvSetFirstNextTBTT(pDevice, pCurr->wBeaconInterval);
  2611. // set BSSID
  2612. MACvWriteBSSIDAddress(pDevice, pCurr->abyBSSID);
  2613. memcpy(pMgmt->abyCurrBSSID, pCurr->abyBSSID, 6);
  2614. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Sync:set CurrBSSID address = %02x-%02x-%02x=%02x-%02x-%02x\n",
  2615. pMgmt->abyCurrBSSID[0],
  2616. pMgmt->abyCurrBSSID[1],
  2617. pMgmt->abyCurrBSSID[2],
  2618. pMgmt->abyCurrBSSID[3],
  2619. pMgmt->abyCurrBSSID[4],
  2620. pMgmt->abyCurrBSSID[5]);
  2621. if (pCurr->eNetworkTypeInUse == PHY_TYPE_11A) {
  2622. if ((pDevice->eConfigPHYMode == PHY_TYPE_11A) ||
  2623. (pDevice->eConfigPHYMode == PHY_TYPE_AUTO)) {
  2624. pDevice->byBBType = BB_TYPE_11A;
  2625. pMgmt->eCurrentPHYMode = PHY_TYPE_11A;
  2626. pDevice->bShortSlotTime = TRUE;
  2627. BBvSetShortSlotTime(pDevice);
  2628. CARDvSetBSSMode(pDevice);
  2629. } else {
  2630. return;
  2631. }
  2632. } else if (pCurr->eNetworkTypeInUse == PHY_TYPE_11B) {
  2633. if ((pDevice->eConfigPHYMode == PHY_TYPE_11B) ||
  2634. (pDevice->eConfigPHYMode == PHY_TYPE_11G) ||
  2635. (pDevice->eConfigPHYMode == PHY_TYPE_AUTO)) {
  2636. pDevice->byBBType = BB_TYPE_11B;
  2637. pMgmt->eCurrentPHYMode = PHY_TYPE_11B;
  2638. pDevice->bShortSlotTime = FALSE;
  2639. BBvSetShortSlotTime(pDevice);
  2640. CARDvSetBSSMode(pDevice);
  2641. } else {
  2642. return;
  2643. }
  2644. } else {
  2645. if ((pDevice->eConfigPHYMode == PHY_TYPE_11G) ||
  2646. (pDevice->eConfigPHYMode == PHY_TYPE_AUTO)) {
  2647. pDevice->byBBType = BB_TYPE_11G;
  2648. pMgmt->eCurrentPHYMode = PHY_TYPE_11G;
  2649. pDevice->bShortSlotTime = TRUE;
  2650. BBvSetShortSlotTime(pDevice);
  2651. CARDvSetBSSMode(pDevice);
  2652. } else if (pDevice->eConfigPHYMode == PHY_TYPE_11B) {
  2653. pDevice->byBBType = BB_TYPE_11B;
  2654. pDevice->bShortSlotTime = FALSE;
  2655. BBvSetShortSlotTime(pDevice);
  2656. CARDvSetBSSMode(pDevice);
  2657. } else {
  2658. return;
  2659. }
  2660. }
  2661. if (uBSSMode == WMAC_MODE_ESS_STA) {
  2662. MACvRegBitsOff(pDevice, MAC_REG_HOSTCR, HOSTCR_ADHOC);
  2663. MACvRegBitsOn(pDevice, MAC_REG_RCR, RCR_BSSID);
  2664. pDevice->byRxMode |= RCR_BSSID;
  2665. pMgmt->bCurrBSSIDFilterOn = TRUE;
  2666. }
  2667. // set channel and clear NAV
  2668. CARDbSetMediaChannel(pDevice, pCurr->uChannel);
  2669. pMgmt->uCurrChannel = pCurr->uChannel;
  2670. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "<----s_bSynchBSS Set Channel [%d]\n", pCurr->uChannel);
  2671. if ((pDevice->bUpdateBBVGA) &&
  2672. (pDevice->byBBVGACurrent != pDevice->abyBBVGA[0])) {
  2673. pDevice->byBBVGACurrent = pDevice->abyBBVGA[0];
  2674. BBvSetVGAGainOffset(pDevice, pDevice->byBBVGACurrent);
  2675. BBvSetShortSlotTime(pDevice);
  2676. }
  2677. //
  2678. // Notes:
  2679. // 1. In Ad-hoc mode : check if received others beacon as jointed indication,
  2680. // otherwise we will start own IBSS.
  2681. // 2. In Infra mode : Supposed we already synchronized with AP right now.
  2682. if (uBSSMode == WMAC_MODE_IBSS_STA) {
  2683. MACvRegBitsOn(pDevice, MAC_REG_HOSTCR, HOSTCR_ADHOC);
  2684. MACvRegBitsOn(pDevice, MAC_REG_RCR, RCR_BSSID);
  2685. pDevice->byRxMode |= RCR_BSSID;
  2686. pMgmt->bCurrBSSIDFilterOn = TRUE;
  2687. }
  2688. if (pDevice->byBBType == BB_TYPE_11A) {
  2689. memcpy(pMgmt->abyCurrSuppRates, &abyCurrSuppRatesA[0], sizeof(abyCurrSuppRatesA));
  2690. pMgmt->abyCurrExtSuppRates[1] = 0;
  2691. } else if (pDevice->byBBType == BB_TYPE_11B) {
  2692. memcpy(pMgmt->abyCurrSuppRates, &abyCurrSuppRatesB[0], sizeof(abyCurrSuppRatesB));
  2693. pMgmt->abyCurrExtSuppRates[1] = 0;
  2694. } else {
  2695. memcpy(pMgmt->abyCurrSuppRates, &abyCurrSuppRatesG[0], sizeof(abyCurrSuppRatesG));
  2696. memcpy(pMgmt->abyCurrExtSuppRates, &abyCurrExtSuppRatesG[0], sizeof(abyCurrExtSuppRatesG));
  2697. }
  2698. pMgmt->byERPContext = pCurr->sERP.byERP;
  2699. *pStatus = CMD_STATUS_SUCCESS;
  2700. return;
  2701. };
  2702. //mike add: fix NetworkManager 0.7.0 hidden ssid mode in WPA encryption
  2703. // ,need reset eAuthenMode and eEncryptionStatus
  2704. static void Encyption_Rebuild(
  2705. PSDevice pDevice,
  2706. PKnownBSS pCurr
  2707. )
  2708. {
  2709. PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
  2710. /* unsigned int ii, uSameBssidNum=0; */
  2711. // if( uSameBssidNum>=2) { //we only check AP in hidden sssid mode
  2712. if ((pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK) || //networkmanager 0.7.0 does not give the pairwise-key selsection,
  2713. (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK)) { // so we need re-selsect it according to real pairwise-key info.
  2714. if(pCurr->bWPAValid == TRUE) { //WPA-PSK
  2715. pMgmt->eAuthenMode = WMAC_AUTH_WPAPSK;
  2716. if(pCurr->abyPKType[0] == WPA_TKIP) {
  2717. pDevice->eEncryptionStatus = Ndis802_11Encryption2Enabled; //TKIP
  2718. PRINT_K("Encyption_Rebuild--->ssid reset config to [WPAPSK-TKIP]\n");
  2719. }
  2720. else if(pCurr->abyPKType[0] == WPA_AESCCMP) {
  2721. pDevice->eEncryptionStatus = Ndis802_11Encryption3Enabled; //AES
  2722. PRINT_K("Encyption_Rebuild--->ssid reset config to [WPAPSK-AES]\n");
  2723. }
  2724. }
  2725. else if(pCurr->bWPA2Valid == TRUE) { //WPA2-PSK
  2726. pMgmt->eAuthenMode = WMAC_AUTH_WPA2PSK;
  2727. if(pCurr->abyCSSPK[0] == WLAN_11i_CSS_TKIP) {
  2728. pDevice->eEncryptionStatus = Ndis802_11Encryption2Enabled; //TKIP
  2729. PRINT_K("Encyption_Rebuild--->ssid reset config to [WPA2PSK-TKIP]\n");
  2730. }
  2731. else if(pCurr->abyCSSPK[0] == WLAN_11i_CSS_CCMP) {
  2732. pDevice->eEncryptionStatus = Ndis802_11Encryption3Enabled; //AES
  2733. PRINT_K("Encyption_Rebuild--->ssid reset config to [WPA2PSK-AES]\n");
  2734. }
  2735. }
  2736. }
  2737. // }
  2738. return;
  2739. }
  2740. /*+
  2741. *
  2742. * Routine Description:
  2743. * Format TIM field
  2744. *
  2745. *
  2746. * Return Value:
  2747. * void
  2748. *
  2749. -*/
  2750. static
  2751. void
  2752. s_vMgrFormatTIM(
  2753. PSMgmtObject pMgmt,
  2754. PWLAN_IE_TIM pTIM
  2755. )
  2756. {
  2757. BYTE byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
  2758. BYTE byMap;
  2759. unsigned int ii, jj;
  2760. BOOL bStartFound = FALSE;
  2761. BOOL bMulticast = FALSE;
  2762. WORD wStartIndex = 0;
  2763. WORD wEndIndex = 0;
  2764. // Find size of partial virtual bitmap
  2765. for (ii = 0; ii < (MAX_NODE_NUM + 1); ii++) {
  2766. byMap = pMgmt->abyPSTxMap[ii];
  2767. if (!ii) {
  2768. // Mask out the broadcast bit which is indicated separately.
  2769. bMulticast = (byMap & byMask[0]) != 0;
  2770. if(bMulticast) {
  2771. pMgmt->sNodeDBTable[0].bRxPSPoll = TRUE;
  2772. }
  2773. byMap = 0;
  2774. }
  2775. if (byMap) {
  2776. if (!bStartFound) {
  2777. bStartFound = TRUE;
  2778. wStartIndex = (WORD)ii;
  2779. }
  2780. wEndIndex = (WORD)ii;
  2781. }
  2782. }
  2783. // Round start index down to nearest even number
  2784. wStartIndex &= ~BIT0;
  2785. // Round end index up to nearest even number
  2786. wEndIndex = ((wEndIndex + 1) & ~BIT0);
  2787. // Size of element payload
  2788. pTIM->len = 3 + (wEndIndex - wStartIndex) + 1;
  2789. // Fill in the Fixed parts of the TIM
  2790. pTIM->byDTIMCount = pMgmt->byDTIMCount;
  2791. pTIM->byDTIMPeriod = pMgmt->byDTIMPeriod;
  2792. pTIM->byBitMapCtl = (bMulticast ? TIM_MULTICAST_MASK : 0) |
  2793. (((wStartIndex >> 1) << 1) & TIM_BITMAPOFFSET_MASK);
  2794. // Append variable part of TIM
  2795. for (ii = wStartIndex, jj =0 ; ii <= wEndIndex; ii++, jj++) {
  2796. pTIM->byVirtBitMap[jj] = pMgmt->abyPSTxMap[ii];
  2797. }
  2798. // Aid = 0 don't used.
  2799. pTIM->byVirtBitMap[0] &= ~BIT0;
  2800. }
  2801. /*+
  2802. *
  2803. * Routine Description:
  2804. * Constructs an Beacon frame( Ad-hoc mode)
  2805. *
  2806. *
  2807. * Return Value:
  2808. * PTR to frame; or NULL on allocation failue
  2809. *
  2810. -*/
  2811. static
  2812. PSTxMgmtPacket
  2813. s_MgrMakeBeacon(
  2814. PSDevice pDevice,
  2815. PSMgmtObject pMgmt,
  2816. WORD wCurrCapInfo,
  2817. WORD wCurrBeaconPeriod,
  2818. unsigned int uCurrChannel,
  2819. WORD wCurrATIMWinodw,
  2820. PWLAN_IE_SSID pCurrSSID,
  2821. PBYTE pCurrBSSID,
  2822. PWLAN_IE_SUPP_RATES pCurrSuppRates,
  2823. PWLAN_IE_SUPP_RATES pCurrExtSuppRates
  2824. )
  2825. {
  2826. PSTxMgmtPacket pTxPacket = NULL;
  2827. WLAN_FR_BEACON sFrame;
  2828. BYTE abyBroadcastAddr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
  2829. // prepare beacon frame
  2830. pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
  2831. memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_BEACON_FR_MAXLEN);
  2832. pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
  2833. // Setup the sFrame structure.
  2834. sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
  2835. sFrame.len = WLAN_BEACON_FR_MAXLEN;
  2836. vMgrEncodeBeacon(&sFrame);
  2837. // Setup the header
  2838. sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
  2839. (
  2840. WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
  2841. WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_BEACON)
  2842. ));
  2843. if (pDevice->bEnablePSMode) {
  2844. sFrame.pHdr->sA3.wFrameCtl |= cpu_to_le16((WORD)WLAN_SET_FC_PWRMGT(1));
  2845. }
  2846. memcpy( sFrame.pHdr->sA3.abyAddr1, abyBroadcastAddr, WLAN_ADDR_LEN);
  2847. memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
  2848. memcpy( sFrame.pHdr->sA3.abyAddr3, pCurrBSSID, WLAN_BSSID_LEN);
  2849. *sFrame.pwBeaconInterval = cpu_to_le16(wCurrBeaconPeriod);
  2850. *sFrame.pwCapInfo = cpu_to_le16(wCurrCapInfo);
  2851. // Copy SSID
  2852. sFrame.pSSID = (PWLAN_IE_SSID)(sFrame.pBuf + sFrame.len);
  2853. sFrame.len += ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->len + WLAN_IEHDR_LEN;
  2854. memcpy(sFrame.pSSID,
  2855. pCurrSSID,
  2856. ((PWLAN_IE_SSID)pCurrSSID)->len + WLAN_IEHDR_LEN
  2857. );
  2858. // Copy the rate set
  2859. sFrame.pSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
  2860. sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN;
  2861. memcpy(sFrame.pSuppRates,
  2862. pCurrSuppRates,
  2863. ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN
  2864. );
  2865. // DS parameter
  2866. if (pDevice->byBBType != BB_TYPE_11A) {
  2867. sFrame.pDSParms = (PWLAN_IE_DS_PARMS)(sFrame.pBuf + sFrame.len);
  2868. sFrame.len += (1) + WLAN_IEHDR_LEN;
  2869. sFrame.pDSParms->byElementID = WLAN_EID_DS_PARMS;
  2870. sFrame.pDSParms->len = 1;
  2871. sFrame.pDSParms->byCurrChannel = (BYTE)uCurrChannel;
  2872. }
  2873. // TIM field
  2874. if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
  2875. sFrame.pTIM = (PWLAN_IE_TIM)(sFrame.pBuf + sFrame.len);
  2876. sFrame.pTIM->byElementID = WLAN_EID_TIM;
  2877. s_vMgrFormatTIM(pMgmt, sFrame.pTIM);
  2878. sFrame.len += (WLAN_IEHDR_LEN + sFrame.pTIM->len);
  2879. }
  2880. if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) {
  2881. // IBSS parameter
  2882. sFrame.pIBSSParms = (PWLAN_IE_IBSS_PARMS)(sFrame.pBuf + sFrame.len);
  2883. sFrame.len += (2) + WLAN_IEHDR_LEN;
  2884. sFrame.pIBSSParms->byElementID = WLAN_EID_IBSS_PARMS;
  2885. sFrame.pIBSSParms->len = 2;
  2886. sFrame.pIBSSParms->wATIMWindow = wCurrATIMWinodw;
  2887. if (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) {
  2888. /* RSN parameter */
  2889. sFrame.pRSNWPA = (PWLAN_IE_RSN_EXT)(sFrame.pBuf + sFrame.len);
  2890. sFrame.pRSNWPA->byElementID = WLAN_EID_RSN_WPA;
  2891. sFrame.pRSNWPA->len = 12;
  2892. sFrame.pRSNWPA->abyOUI[0] = 0x00;
  2893. sFrame.pRSNWPA->abyOUI[1] = 0x50;
  2894. sFrame.pRSNWPA->abyOUI[2] = 0xf2;
  2895. sFrame.pRSNWPA->abyOUI[3] = 0x01;
  2896. sFrame.pRSNWPA->wVersion = 1;
  2897. sFrame.pRSNWPA->abyMulticast[0] = 0x00;
  2898. sFrame.pRSNWPA->abyMulticast[1] = 0x50;
  2899. sFrame.pRSNWPA->abyMulticast[2] = 0xf2;
  2900. if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled)
  2901. sFrame.pRSNWPA->abyMulticast[3] = 0x04;//AES
  2902. else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled)
  2903. sFrame.pRSNWPA->abyMulticast[3] = 0x02;//TKIP
  2904. else if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled)
  2905. sFrame.pRSNWPA->abyMulticast[3] = 0x01;//WEP40
  2906. else
  2907. sFrame.pRSNWPA->abyMulticast[3] = 0x00;//NONE
  2908. // Pairwise Key Cipher Suite
  2909. sFrame.pRSNWPA->wPKCount = 0;
  2910. // Auth Key Management Suite
  2911. *((PWORD)(sFrame.pBuf + sFrame.len + sFrame.pRSNWPA->len))=0;
  2912. sFrame.pRSNWPA->len +=2;
  2913. // RSN Capabilites
  2914. *((PWORD)(sFrame.pBuf + sFrame.len + sFrame.pRSNWPA->len))=0;
  2915. sFrame.pRSNWPA->len +=2;
  2916. sFrame.len += sFrame.pRSNWPA->len + WLAN_IEHDR_LEN;
  2917. }
  2918. }
  2919. if (pMgmt->eCurrentPHYMode == PHY_TYPE_11G) {
  2920. sFrame.pERP = (PWLAN_IE_ERP)(sFrame.pBuf + sFrame.len);
  2921. sFrame.len += 1 + WLAN_IEHDR_LEN;
  2922. sFrame.pERP->byElementID = WLAN_EID_ERP;
  2923. sFrame.pERP->len = 1;
  2924. sFrame.pERP->byContext = 0;
  2925. if (pDevice->bProtectMode == TRUE)
  2926. sFrame.pERP->byContext |= WLAN_EID_ERP_USE_PROTECTION;
  2927. if (pDevice->bNonERPPresent == TRUE)
  2928. sFrame.pERP->byContext |= WLAN_EID_ERP_NONERP_PRESENT;
  2929. if (pDevice->bBarkerPreambleMd == TRUE)
  2930. sFrame.pERP->byContext |= WLAN_EID_ERP_BARKER_MODE;
  2931. }
  2932. if (((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len != 0) {
  2933. sFrame.pExtSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
  2934. sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
  2935. memcpy(sFrame.pExtSuppRates,
  2936. pCurrExtSuppRates,
  2937. ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN
  2938. );
  2939. }
  2940. // hostapd wpa/wpa2 IE
  2941. if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) && (pDevice->bEnableHostapd == TRUE)) {
  2942. if (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) {
  2943. if (pMgmt->wWPAIELen != 0) {
  2944. sFrame.pRSN = (PWLAN_IE_RSN)(sFrame.pBuf + sFrame.len);
  2945. memcpy(sFrame.pRSN, pMgmt->abyWPAIE, pMgmt->wWPAIELen);
  2946. sFrame.len += pMgmt->wWPAIELen;
  2947. }
  2948. }
  2949. }
  2950. /* Adjust the length fields */
  2951. pTxPacket->cbMPDULen = sFrame.len;
  2952. pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
  2953. return pTxPacket;
  2954. }
  2955. /*+
  2956. *
  2957. * Routine Description:
  2958. * Constructs an Prob-response frame
  2959. *
  2960. *
  2961. * Return Value:
  2962. * PTR to frame; or NULL on allocation failue
  2963. *
  2964. -*/
  2965. PSTxMgmtPacket
  2966. s_MgrMakeProbeResponse(
  2967. PSDevice pDevice,
  2968. PSMgmtObject pMgmt,
  2969. WORD wCurrCapInfo,
  2970. WORD wCurrBeaconPeriod,
  2971. unsigned int uCurrChannel,
  2972. WORD wCurrATIMWinodw,
  2973. PBYTE pDstAddr,
  2974. PWLAN_IE_SSID pCurrSSID,
  2975. PBYTE pCurrBSSID,
  2976. PWLAN_IE_SUPP_RATES pCurrSuppRates,
  2977. PWLAN_IE_SUPP_RATES pCurrExtSuppRates,
  2978. BYTE byPHYType
  2979. )
  2980. {
  2981. PSTxMgmtPacket pTxPacket = NULL;
  2982. WLAN_FR_PROBERESP sFrame;
  2983. pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
  2984. memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_PROBERESP_FR_MAXLEN);
  2985. pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
  2986. // Setup the sFrame structure.
  2987. sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
  2988. sFrame.len = WLAN_PROBERESP_FR_MAXLEN;
  2989. vMgrEncodeProbeResponse(&sFrame);
  2990. // Setup the header
  2991. sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
  2992. (
  2993. WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
  2994. WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_PROBERESP)
  2995. ));
  2996. memcpy( sFrame.pHdr->sA3.abyAddr1, pDstAddr, WLAN_ADDR_LEN);
  2997. memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
  2998. memcpy( sFrame.pHdr->sA3.abyAddr3, pCurrBSSID, WLAN_BSSID_LEN);
  2999. *sFrame.pwBeaconInterval = cpu_to_le16(wCurrBeaconPeriod);
  3000. *sFrame.pwCapInfo = cpu_to_le16(wCurrCapInfo);
  3001. if (byPHYType == BB_TYPE_11B) {
  3002. *sFrame.pwCapInfo &= cpu_to_le16((WORD)~(WLAN_SET_CAP_INFO_SHORTSLOTTIME(1)));
  3003. }
  3004. // Copy SSID
  3005. sFrame.pSSID = (PWLAN_IE_SSID)(sFrame.pBuf + sFrame.len);
  3006. sFrame.len += ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->len + WLAN_IEHDR_LEN;
  3007. memcpy(sFrame.pSSID,
  3008. pCurrSSID,
  3009. ((PWLAN_IE_SSID)pCurrSSID)->len + WLAN_IEHDR_LEN
  3010. );
  3011. // Copy the rate set
  3012. sFrame.pSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
  3013. sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN;
  3014. memcpy(sFrame.pSuppRates,
  3015. pCurrSuppRates,
  3016. ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN
  3017. );
  3018. // DS parameter
  3019. if (pDevice->byBBType != BB_TYPE_11A) {
  3020. sFrame.pDSParms = (PWLAN_IE_DS_PARMS)(sFrame.pBuf + sFrame.len);
  3021. sFrame.len += (1) + WLAN_IEHDR_LEN;
  3022. sFrame.pDSParms->byElementID = WLAN_EID_DS_PARMS;
  3023. sFrame.pDSParms->len = 1;
  3024. sFrame.pDSParms->byCurrChannel = (BYTE)uCurrChannel;
  3025. }
  3026. if (pMgmt->eCurrMode != WMAC_MODE_ESS_AP) {
  3027. // IBSS parameter
  3028. sFrame.pIBSSParms = (PWLAN_IE_IBSS_PARMS)(sFrame.pBuf + sFrame.len);
  3029. sFrame.len += (2) + WLAN_IEHDR_LEN;
  3030. sFrame.pIBSSParms->byElementID = WLAN_EID_IBSS_PARMS;
  3031. sFrame.pIBSSParms->len = 2;
  3032. sFrame.pIBSSParms->wATIMWindow = 0;
  3033. }
  3034. if (pDevice->byBBType == BB_TYPE_11G) {
  3035. sFrame.pERP = (PWLAN_IE_ERP)(sFrame.pBuf + sFrame.len);
  3036. sFrame.len += 1 + WLAN_IEHDR_LEN;
  3037. sFrame.pERP->byElementID = WLAN_EID_ERP;
  3038. sFrame.pERP->len = 1;
  3039. sFrame.pERP->byContext = 0;
  3040. if (pDevice->bProtectMode == TRUE)
  3041. sFrame.pERP->byContext |= WLAN_EID_ERP_USE_PROTECTION;
  3042. if (pDevice->bNonERPPresent == TRUE)
  3043. sFrame.pERP->byContext |= WLAN_EID_ERP_NONERP_PRESENT;
  3044. if (pDevice->bBarkerPreambleMd == TRUE)
  3045. sFrame.pERP->byContext |= WLAN_EID_ERP_BARKER_MODE;
  3046. }
  3047. if (((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len != 0) {
  3048. sFrame.pExtSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
  3049. sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
  3050. memcpy(sFrame.pExtSuppRates,
  3051. pCurrExtSuppRates,
  3052. ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN
  3053. );
  3054. }
  3055. // hostapd wpa/wpa2 IE
  3056. if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) && (pDevice->bEnableHostapd == TRUE)) {
  3057. if (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) {
  3058. if (pMgmt->wWPAIELen != 0) {
  3059. sFrame.pRSN = (PWLAN_IE_RSN)(sFrame.pBuf + sFrame.len);
  3060. memcpy(sFrame.pRSN, pMgmt->abyWPAIE, pMgmt->wWPAIELen);
  3061. sFrame.len += pMgmt->wWPAIELen;
  3062. }
  3063. }
  3064. }
  3065. // Adjust the length fields
  3066. pTxPacket->cbMPDULen = sFrame.len;
  3067. pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
  3068. return pTxPacket;
  3069. }
  3070. /*+
  3071. *
  3072. * Routine Description:
  3073. * Constructs an association request frame
  3074. *
  3075. *
  3076. * Return Value:
  3077. * A ptr to frame or NULL on allocation failue
  3078. *
  3079. -*/
  3080. PSTxMgmtPacket
  3081. s_MgrMakeAssocRequest(
  3082. PSDevice pDevice,
  3083. PSMgmtObject pMgmt,
  3084. PBYTE pDAddr,
  3085. WORD wCurrCapInfo,
  3086. WORD wListenInterval,
  3087. PWLAN_IE_SSID pCurrSSID,
  3088. PWLAN_IE_SUPP_RATES pCurrRates,
  3089. PWLAN_IE_SUPP_RATES pCurrExtSuppRates
  3090. )
  3091. {
  3092. PSTxMgmtPacket pTxPacket = NULL;
  3093. WLAN_FR_ASSOCREQ sFrame;
  3094. PBYTE pbyIEs;
  3095. PBYTE pbyRSN;
  3096. pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
  3097. memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_ASSOCREQ_FR_MAXLEN);
  3098. pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
  3099. // Setup the sFrame structure.
  3100. sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
  3101. sFrame.len = WLAN_ASSOCREQ_FR_MAXLEN;
  3102. // format fixed field frame structure
  3103. vMgrEncodeAssocRequest(&sFrame);
  3104. // Setup the header
  3105. sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
  3106. (
  3107. WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
  3108. WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_ASSOCREQ)
  3109. ));
  3110. memcpy( sFrame.pHdr->sA3.abyAddr1, pDAddr, WLAN_ADDR_LEN);
  3111. memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
  3112. memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
  3113. // Set the capibility and listen interval
  3114. *(sFrame.pwCapInfo) = cpu_to_le16(wCurrCapInfo);
  3115. *(sFrame.pwListenInterval) = cpu_to_le16(wListenInterval);
  3116. // sFrame.len point to end of fixed field
  3117. sFrame.pSSID = (PWLAN_IE_SSID)(sFrame.pBuf + sFrame.len);
  3118. sFrame.len += pCurrSSID->len + WLAN_IEHDR_LEN;
  3119. memcpy(sFrame.pSSID, pCurrSSID, pCurrSSID->len + WLAN_IEHDR_LEN);
  3120. pMgmt->sAssocInfo.AssocInfo.RequestIELength = pCurrSSID->len + WLAN_IEHDR_LEN;
  3121. pMgmt->sAssocInfo.AssocInfo.OffsetRequestIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);
  3122. pbyIEs = pMgmt->sAssocInfo.abyIEs;
  3123. memcpy(pbyIEs, pCurrSSID, pCurrSSID->len + WLAN_IEHDR_LEN);
  3124. pbyIEs += pCurrSSID->len + WLAN_IEHDR_LEN;
  3125. // Copy the rate set
  3126. sFrame.pSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
  3127. if ((pDevice->byBBType == BB_TYPE_11B) && (pCurrRates->len > 4))
  3128. sFrame.len += 4 + WLAN_IEHDR_LEN;
  3129. else
  3130. sFrame.len += pCurrRates->len + WLAN_IEHDR_LEN;
  3131. memcpy(sFrame.pSuppRates, pCurrRates, pCurrRates->len + WLAN_IEHDR_LEN);
  3132. // Copy the extension rate set
  3133. if ((pDevice->byBBType == BB_TYPE_11G) && (pCurrExtSuppRates->len > 0)) {
  3134. sFrame.pExtSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
  3135. sFrame.len += pCurrExtSuppRates->len + WLAN_IEHDR_LEN;
  3136. memcpy(sFrame.pExtSuppRates, pCurrExtSuppRates, pCurrExtSuppRates->len + WLAN_IEHDR_LEN);
  3137. }
  3138. pMgmt->sAssocInfo.AssocInfo.RequestIELength += pCurrRates->len + WLAN_IEHDR_LEN;
  3139. memcpy(pbyIEs, pCurrRates, pCurrRates->len + WLAN_IEHDR_LEN);
  3140. pbyIEs += pCurrRates->len + WLAN_IEHDR_LEN;
  3141. if (((pMgmt->eAuthenMode == WMAC_AUTH_WPA) ||
  3142. (pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK) ||
  3143. (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE)) &&
  3144. (pMgmt->pCurrBSS != NULL)) {
  3145. /* WPA IE */
  3146. sFrame.pRSNWPA = (PWLAN_IE_RSN_EXT)(sFrame.pBuf + sFrame.len);
  3147. sFrame.pRSNWPA->byElementID = WLAN_EID_RSN_WPA;
  3148. sFrame.pRSNWPA->len = 16;
  3149. sFrame.pRSNWPA->abyOUI[0] = 0x00;
  3150. sFrame.pRSNWPA->abyOUI[1] = 0x50;
  3151. sFrame.pRSNWPA->abyOUI[2] = 0xf2;
  3152. sFrame.pRSNWPA->abyOUI[3] = 0x01;
  3153. sFrame.pRSNWPA->wVersion = 1;
  3154. //Group Key Cipher Suite
  3155. sFrame.pRSNWPA->abyMulticast[0] = 0x00;
  3156. sFrame.pRSNWPA->abyMulticast[1] = 0x50;
  3157. sFrame.pRSNWPA->abyMulticast[2] = 0xf2;
  3158. if (pMgmt->byCSSGK == KEY_CTL_WEP) {
  3159. sFrame.pRSNWPA->abyMulticast[3] = pMgmt->pCurrBSS->byGKType;
  3160. } else if (pMgmt->byCSSGK == KEY_CTL_TKIP) {
  3161. sFrame.pRSNWPA->abyMulticast[3] = WPA_TKIP;
  3162. } else if (pMgmt->byCSSGK == KEY_CTL_CCMP) {
  3163. sFrame.pRSNWPA->abyMulticast[3] = WPA_AESCCMP;
  3164. } else {
  3165. sFrame.pRSNWPA->abyMulticast[3] = WPA_NONE;
  3166. }
  3167. // Pairwise Key Cipher Suite
  3168. sFrame.pRSNWPA->wPKCount = 1;
  3169. sFrame.pRSNWPA->PKSList[0].abyOUI[0] = 0x00;
  3170. sFrame.pRSNWPA->PKSList[0].abyOUI[1] = 0x50;
  3171. sFrame.pRSNWPA->PKSList[0].abyOUI[2] = 0xf2;
  3172. if (pMgmt->byCSSPK == KEY_CTL_TKIP) {
  3173. sFrame.pRSNWPA->PKSList[0].abyOUI[3] = WPA_TKIP;
  3174. } else if (pMgmt->byCSSPK == KEY_CTL_CCMP) {
  3175. sFrame.pRSNWPA->PKSList[0].abyOUI[3] = WPA_AESCCMP;
  3176. } else {
  3177. sFrame.pRSNWPA->PKSList[0].abyOUI[3] = WPA_NONE;
  3178. }
  3179. // Auth Key Management Suite
  3180. pbyRSN = (PBYTE)(sFrame.pBuf + sFrame.len + 2 + sFrame.pRSNWPA->len);
  3181. *pbyRSN++=0x01;
  3182. *pbyRSN++=0x00;
  3183. *pbyRSN++=0x00;
  3184. *pbyRSN++=0x50;
  3185. *pbyRSN++=0xf2;
  3186. if (pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK) {
  3187. *pbyRSN++=WPA_AUTH_PSK;
  3188. }
  3189. else if (pMgmt->eAuthenMode == WMAC_AUTH_WPA) {
  3190. *pbyRSN++=WPA_AUTH_IEEE802_1X;
  3191. }
  3192. else {
  3193. *pbyRSN++=WPA_NONE;
  3194. }
  3195. sFrame.pRSNWPA->len +=6;
  3196. // RSN Capabilites
  3197. *pbyRSN++=0x00;
  3198. *pbyRSN++=0x00;
  3199. sFrame.pRSNWPA->len +=2;
  3200. sFrame.len += sFrame.pRSNWPA->len + WLAN_IEHDR_LEN;
  3201. // copy to AssocInfo. for OID_802_11_ASSOCIATION_INFORMATION
  3202. pMgmt->sAssocInfo.AssocInfo.RequestIELength += sFrame.pRSNWPA->len + WLAN_IEHDR_LEN;
  3203. memcpy(pbyIEs, sFrame.pRSNWPA, sFrame.pRSNWPA->len + WLAN_IEHDR_LEN);
  3204. pbyIEs += sFrame.pRSNWPA->len + WLAN_IEHDR_LEN;
  3205. } else if (((pMgmt->eAuthenMode == WMAC_AUTH_WPA2) ||
  3206. (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK)) &&
  3207. (pMgmt->pCurrBSS != NULL)) {
  3208. unsigned int ii;
  3209. PWORD pwPMKID;
  3210. // WPA IE
  3211. sFrame.pRSN = (PWLAN_IE_RSN)(sFrame.pBuf + sFrame.len);
  3212. sFrame.pRSN->byElementID = WLAN_EID_RSN;
  3213. sFrame.pRSN->len = 6; //Version(2)+GK(4)
  3214. sFrame.pRSN->wVersion = 1;
  3215. //Group Key Cipher Suite
  3216. sFrame.pRSN->abyRSN[0] = 0x00;
  3217. sFrame.pRSN->abyRSN[1] = 0x0F;
  3218. sFrame.pRSN->abyRSN[2] = 0xAC;
  3219. if (pMgmt->byCSSGK == KEY_CTL_WEP) {
  3220. sFrame.pRSN->abyRSN[3] = pMgmt->pCurrBSS->byCSSGK;
  3221. } else if (pMgmt->byCSSGK == KEY_CTL_TKIP) {
  3222. sFrame.pRSN->abyRSN[3] = WLAN_11i_CSS_TKIP;
  3223. } else if (pMgmt->byCSSGK == KEY_CTL_CCMP) {
  3224. sFrame.pRSN->abyRSN[3] = WLAN_11i_CSS_CCMP;
  3225. } else {
  3226. sFrame.pRSN->abyRSN[3] = WLAN_11i_CSS_UNKNOWN;
  3227. }
  3228. // Pairwise Key Cipher Suite
  3229. sFrame.pRSN->abyRSN[4] = 1;
  3230. sFrame.pRSN->abyRSN[5] = 0;
  3231. sFrame.pRSN->abyRSN[6] = 0x00;
  3232. sFrame.pRSN->abyRSN[7] = 0x0F;
  3233. sFrame.pRSN->abyRSN[8] = 0xAC;
  3234. if (pMgmt->byCSSPK == KEY_CTL_TKIP) {
  3235. sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_TKIP;
  3236. } else if (pMgmt->byCSSPK == KEY_CTL_CCMP) {
  3237. sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_CCMP;
  3238. } else if (pMgmt->byCSSPK == KEY_CTL_NONE) {
  3239. sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_USE_GROUP;
  3240. } else {
  3241. sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_UNKNOWN;
  3242. }
  3243. sFrame.pRSN->len += 6;
  3244. // Auth Key Management Suite
  3245. sFrame.pRSN->abyRSN[10] = 1;
  3246. sFrame.pRSN->abyRSN[11] = 0;
  3247. sFrame.pRSN->abyRSN[12] = 0x00;
  3248. sFrame.pRSN->abyRSN[13] = 0x0F;
  3249. sFrame.pRSN->abyRSN[14] = 0xAC;
  3250. if (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK) {
  3251. sFrame.pRSN->abyRSN[15] = WLAN_11i_AKMSS_PSK;
  3252. } else if (pMgmt->eAuthenMode == WMAC_AUTH_WPA2) {
  3253. sFrame.pRSN->abyRSN[15] = WLAN_11i_AKMSS_802_1X;
  3254. } else {
  3255. sFrame.pRSN->abyRSN[15] = WLAN_11i_AKMSS_UNKNOWN;
  3256. }
  3257. sFrame.pRSN->len +=6;
  3258. // RSN Capabilites
  3259. if (pMgmt->pCurrBSS->sRSNCapObj.bRSNCapExist == TRUE) {
  3260. memcpy(&sFrame.pRSN->abyRSN[16], &pMgmt->pCurrBSS->sRSNCapObj.wRSNCap, 2);
  3261. } else {
  3262. sFrame.pRSN->abyRSN[16] = 0;
  3263. sFrame.pRSN->abyRSN[17] = 0;
  3264. }
  3265. sFrame.pRSN->len +=2;
  3266. if ((pDevice->gsPMKID.BSSIDInfoCount > 0) && (pDevice->bRoaming == TRUE) && (pMgmt->eAuthenMode == WMAC_AUTH_WPA2)) {
  3267. // RSN PMKID
  3268. pbyRSN = &sFrame.pRSN->abyRSN[18];
  3269. pwPMKID = (PWORD)pbyRSN; // Point to PMKID count
  3270. *pwPMKID = 0; // Initialize PMKID count
  3271. pbyRSN += 2; // Point to PMKID list
  3272. for (ii = 0; ii < pDevice->gsPMKID.BSSIDInfoCount; ii++) {
  3273. if (!memcmp(&pDevice->gsPMKID.BSSIDInfo[ii].BSSID[0],
  3274. pMgmt->abyCurrBSSID,
  3275. ETH_ALEN)) {
  3276. (*pwPMKID)++;
  3277. memcpy(pbyRSN,
  3278. pDevice->gsPMKID.BSSIDInfo[ii].PMKID,
  3279. 16);
  3280. pbyRSN += 16;
  3281. }
  3282. }
  3283. if (*pwPMKID != 0) {
  3284. sFrame.pRSN->len += (2 + (*pwPMKID)*16);
  3285. }
  3286. }
  3287. sFrame.len += sFrame.pRSN->len + WLAN_IEHDR_LEN;
  3288. // copy to AssocInfo. for OID_802_11_ASSOCIATION_INFORMATION
  3289. pMgmt->sAssocInfo.AssocInfo.RequestIELength += sFrame.pRSN->len + WLAN_IEHDR_LEN;
  3290. memcpy(pbyIEs, sFrame.pRSN, sFrame.pRSN->len + WLAN_IEHDR_LEN);
  3291. pbyIEs += sFrame.pRSN->len + WLAN_IEHDR_LEN;
  3292. }
  3293. // Adjust the length fields
  3294. pTxPacket->cbMPDULen = sFrame.len;
  3295. pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
  3296. return pTxPacket;
  3297. }
  3298. /*+
  3299. *
  3300. * Routine Description:
  3301. * Constructs an re-association request frame
  3302. *
  3303. *
  3304. * Return Value:
  3305. * A ptr to frame or NULL on allocation failue
  3306. *
  3307. -*/
  3308. PSTxMgmtPacket
  3309. s_MgrMakeReAssocRequest(
  3310. PSDevice pDevice,
  3311. PSMgmtObject pMgmt,
  3312. PBYTE pDAddr,
  3313. WORD wCurrCapInfo,
  3314. WORD wListenInterval,
  3315. PWLAN_IE_SSID pCurrSSID,
  3316. PWLAN_IE_SUPP_RATES pCurrRates,
  3317. PWLAN_IE_SUPP_RATES pCurrExtSuppRates
  3318. )
  3319. {
  3320. PSTxMgmtPacket pTxPacket = NULL;
  3321. WLAN_FR_REASSOCREQ sFrame;
  3322. PBYTE pbyIEs;
  3323. PBYTE pbyRSN;
  3324. pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
  3325. memset( pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_REASSOCREQ_FR_MAXLEN);
  3326. pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
  3327. /* Setup the sFrame structure. */
  3328. sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
  3329. sFrame.len = WLAN_REASSOCREQ_FR_MAXLEN;
  3330. // format fixed field frame structure
  3331. vMgrEncodeReassocRequest(&sFrame);
  3332. /* Setup the header */
  3333. sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
  3334. (
  3335. WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
  3336. WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_REASSOCREQ)
  3337. ));
  3338. memcpy( sFrame.pHdr->sA3.abyAddr1, pDAddr, WLAN_ADDR_LEN);
  3339. memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
  3340. memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
  3341. /* Set the capibility and listen interval */
  3342. *(sFrame.pwCapInfo) = cpu_to_le16(wCurrCapInfo);
  3343. *(sFrame.pwListenInterval) = cpu_to_le16(wListenInterval);
  3344. memcpy(sFrame.pAddrCurrAP, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
  3345. /* Copy the SSID */
  3346. /* sFrame.len point to end of fixed field */
  3347. sFrame.pSSID = (PWLAN_IE_SSID)(sFrame.pBuf + sFrame.len);
  3348. sFrame.len += pCurrSSID->len + WLAN_IEHDR_LEN;
  3349. memcpy(sFrame.pSSID, pCurrSSID, pCurrSSID->len + WLAN_IEHDR_LEN);
  3350. pMgmt->sAssocInfo.AssocInfo.RequestIELength = pCurrSSID->len + WLAN_IEHDR_LEN;
  3351. pMgmt->sAssocInfo.AssocInfo.OffsetRequestIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);
  3352. pbyIEs = pMgmt->sAssocInfo.abyIEs;
  3353. memcpy(pbyIEs, pCurrSSID, pCurrSSID->len + WLAN_IEHDR_LEN);
  3354. pbyIEs += pCurrSSID->len + WLAN_IEHDR_LEN;
  3355. /* Copy the rate set */
  3356. /* sFrame.len point to end of SSID */
  3357. sFrame.pSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
  3358. sFrame.len += pCurrRates->len + WLAN_IEHDR_LEN;
  3359. memcpy(sFrame.pSuppRates, pCurrRates, pCurrRates->len + WLAN_IEHDR_LEN);
  3360. // Copy the extension rate set
  3361. if ((pMgmt->eCurrentPHYMode == PHY_TYPE_11G) && (pCurrExtSuppRates->len > 0)) {
  3362. sFrame.pExtSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
  3363. sFrame.len += pCurrExtSuppRates->len + WLAN_IEHDR_LEN;
  3364. memcpy(sFrame.pExtSuppRates, pCurrExtSuppRates, pCurrExtSuppRates->len + WLAN_IEHDR_LEN);
  3365. }
  3366. pMgmt->sAssocInfo.AssocInfo.RequestIELength += pCurrRates->len + WLAN_IEHDR_LEN;
  3367. memcpy(pbyIEs, pCurrRates, pCurrRates->len + WLAN_IEHDR_LEN);
  3368. pbyIEs += pCurrRates->len + WLAN_IEHDR_LEN;
  3369. if (((pMgmt->eAuthenMode == WMAC_AUTH_WPA) ||
  3370. (pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK) ||
  3371. (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE)) &&
  3372. (pMgmt->pCurrBSS != NULL)) {
  3373. /* WPA IE */
  3374. sFrame.pRSNWPA = (PWLAN_IE_RSN_EXT)(sFrame.pBuf + sFrame.len);
  3375. sFrame.pRSNWPA->byElementID = WLAN_EID_RSN_WPA;
  3376. sFrame.pRSNWPA->len = 16;
  3377. sFrame.pRSNWPA->abyOUI[0] = 0x00;
  3378. sFrame.pRSNWPA->abyOUI[1] = 0x50;
  3379. sFrame.pRSNWPA->abyOUI[2] = 0xf2;
  3380. sFrame.pRSNWPA->abyOUI[3] = 0x01;
  3381. sFrame.pRSNWPA->wVersion = 1;
  3382. //Group Key Cipher Suite
  3383. sFrame.pRSNWPA->abyMulticast[0] = 0x00;
  3384. sFrame.pRSNWPA->abyMulticast[1] = 0x50;
  3385. sFrame.pRSNWPA->abyMulticast[2] = 0xf2;
  3386. if (pMgmt->byCSSGK == KEY_CTL_WEP) {
  3387. sFrame.pRSNWPA->abyMulticast[3] = pMgmt->pCurrBSS->byGKType;
  3388. } else if (pMgmt->byCSSGK == KEY_CTL_TKIP) {
  3389. sFrame.pRSNWPA->abyMulticast[3] = WPA_TKIP;
  3390. } else if (pMgmt->byCSSGK == KEY_CTL_CCMP) {
  3391. sFrame.pRSNWPA->abyMulticast[3] = WPA_AESCCMP;
  3392. } else {
  3393. sFrame.pRSNWPA->abyMulticast[3] = WPA_NONE;
  3394. }
  3395. // Pairwise Key Cipher Suite
  3396. sFrame.pRSNWPA->wPKCount = 1;
  3397. sFrame.pRSNWPA->PKSList[0].abyOUI[0] = 0x00;
  3398. sFrame.pRSNWPA->PKSList[0].abyOUI[1] = 0x50;
  3399. sFrame.pRSNWPA->PKSList[0].abyOUI[2] = 0xf2;
  3400. if (pMgmt->byCSSPK == KEY_CTL_TKIP) {
  3401. sFrame.pRSNWPA->PKSList[0].abyOUI[3] = WPA_TKIP;
  3402. } else if (pMgmt->byCSSPK == KEY_CTL_CCMP) {
  3403. sFrame.pRSNWPA->PKSList[0].abyOUI[3] = WPA_AESCCMP;
  3404. } else {
  3405. sFrame.pRSNWPA->PKSList[0].abyOUI[3] = WPA_NONE;
  3406. }
  3407. // Auth Key Management Suite
  3408. pbyRSN = (PBYTE)(sFrame.pBuf + sFrame.len + 2 + sFrame.pRSNWPA->len);
  3409. *pbyRSN++=0x01;
  3410. *pbyRSN++=0x00;
  3411. *pbyRSN++=0x00;
  3412. *pbyRSN++=0x50;
  3413. *pbyRSN++=0xf2;
  3414. if (pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK) {
  3415. *pbyRSN++=WPA_AUTH_PSK;
  3416. } else if (pMgmt->eAuthenMode == WMAC_AUTH_WPA) {
  3417. *pbyRSN++=WPA_AUTH_IEEE802_1X;
  3418. } else {
  3419. *pbyRSN++=WPA_NONE;
  3420. }
  3421. sFrame.pRSNWPA->len +=6;
  3422. // RSN Capabilites
  3423. *pbyRSN++=0x00;
  3424. *pbyRSN++=0x00;
  3425. sFrame.pRSNWPA->len +=2;
  3426. sFrame.len += sFrame.pRSNWPA->len + WLAN_IEHDR_LEN;
  3427. // copy to AssocInfo. for OID_802_11_ASSOCIATION_INFORMATION
  3428. pMgmt->sAssocInfo.AssocInfo.RequestIELength += sFrame.pRSNWPA->len + WLAN_IEHDR_LEN;
  3429. memcpy(pbyIEs, sFrame.pRSNWPA, sFrame.pRSNWPA->len + WLAN_IEHDR_LEN);
  3430. pbyIEs += sFrame.pRSNWPA->len + WLAN_IEHDR_LEN;
  3431. } else if (((pMgmt->eAuthenMode == WMAC_AUTH_WPA2) ||
  3432. (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK)) &&
  3433. (pMgmt->pCurrBSS != NULL)) {
  3434. unsigned int ii;
  3435. PWORD pwPMKID;
  3436. /* WPA IE */
  3437. sFrame.pRSN = (PWLAN_IE_RSN)(sFrame.pBuf + sFrame.len);
  3438. sFrame.pRSN->byElementID = WLAN_EID_RSN;
  3439. sFrame.pRSN->len = 6; //Version(2)+GK(4)
  3440. sFrame.pRSN->wVersion = 1;
  3441. //Group Key Cipher Suite
  3442. sFrame.pRSN->abyRSN[0] = 0x00;
  3443. sFrame.pRSN->abyRSN[1] = 0x0F;
  3444. sFrame.pRSN->abyRSN[2] = 0xAC;
  3445. if (pMgmt->byCSSGK == KEY_CTL_WEP) {
  3446. sFrame.pRSN->abyRSN[3] = pMgmt->pCurrBSS->byCSSGK;
  3447. } else if (pMgmt->byCSSGK == KEY_CTL_TKIP) {
  3448. sFrame.pRSN->abyRSN[3] = WLAN_11i_CSS_TKIP;
  3449. } else if (pMgmt->byCSSGK == KEY_CTL_CCMP) {
  3450. sFrame.pRSN->abyRSN[3] = WLAN_11i_CSS_CCMP;
  3451. } else {
  3452. sFrame.pRSN->abyRSN[3] = WLAN_11i_CSS_UNKNOWN;
  3453. }
  3454. // Pairwise Key Cipher Suite
  3455. sFrame.pRSN->abyRSN[4] = 1;
  3456. sFrame.pRSN->abyRSN[5] = 0;
  3457. sFrame.pRSN->abyRSN[6] = 0x00;
  3458. sFrame.pRSN->abyRSN[7] = 0x0F;
  3459. sFrame.pRSN->abyRSN[8] = 0xAC;
  3460. if (pMgmt->byCSSPK == KEY_CTL_TKIP) {
  3461. sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_TKIP;
  3462. } else if (pMgmt->byCSSPK == KEY_CTL_CCMP) {
  3463. sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_CCMP;
  3464. } else if (pMgmt->byCSSPK == KEY_CTL_NONE) {
  3465. sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_USE_GROUP;
  3466. } else {
  3467. sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_UNKNOWN;
  3468. }
  3469. sFrame.pRSN->len += 6;
  3470. // Auth Key Management Suite
  3471. sFrame.pRSN->abyRSN[10] = 1;
  3472. sFrame.pRSN->abyRSN[11] = 0;
  3473. sFrame.pRSN->abyRSN[12] = 0x00;
  3474. sFrame.pRSN->abyRSN[13] = 0x0F;
  3475. sFrame.pRSN->abyRSN[14] = 0xAC;
  3476. if (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK) {
  3477. sFrame.pRSN->abyRSN[15] = WLAN_11i_AKMSS_PSK;
  3478. } else if (pMgmt->eAuthenMode == WMAC_AUTH_WPA2) {
  3479. sFrame.pRSN->abyRSN[15] = WLAN_11i_AKMSS_802_1X;
  3480. } else {
  3481. sFrame.pRSN->abyRSN[15] = WLAN_11i_AKMSS_UNKNOWN;
  3482. }
  3483. sFrame.pRSN->len +=6;
  3484. // RSN Capabilites
  3485. if (pMgmt->pCurrBSS->sRSNCapObj.bRSNCapExist == TRUE) {
  3486. memcpy(&sFrame.pRSN->abyRSN[16], &pMgmt->pCurrBSS->sRSNCapObj.wRSNCap, 2);
  3487. } else {
  3488. sFrame.pRSN->abyRSN[16] = 0;
  3489. sFrame.pRSN->abyRSN[17] = 0;
  3490. }
  3491. sFrame.pRSN->len +=2;
  3492. if ((pDevice->gsPMKID.BSSIDInfoCount > 0) && (pDevice->bRoaming == TRUE) && (pMgmt->eAuthenMode == WMAC_AUTH_WPA2)) {
  3493. // RSN PMKID
  3494. pbyRSN = &sFrame.pRSN->abyRSN[18];
  3495. pwPMKID = (PWORD)pbyRSN; // Point to PMKID count
  3496. *pwPMKID = 0; // Initialize PMKID count
  3497. pbyRSN += 2; // Point to PMKID list
  3498. for (ii = 0; ii < pDevice->gsPMKID.BSSIDInfoCount; ii++) {
  3499. if (!memcmp(&pDevice->gsPMKID.BSSIDInfo[ii].BSSID[0],
  3500. pMgmt->abyCurrBSSID,
  3501. ETH_ALEN)) {
  3502. (*pwPMKID)++;
  3503. memcpy(pbyRSN,
  3504. pDevice->gsPMKID.BSSIDInfo[ii].PMKID,
  3505. 16);
  3506. pbyRSN += 16;
  3507. }
  3508. }
  3509. if (*pwPMKID != 0) {
  3510. sFrame.pRSN->len += (2 + (*pwPMKID)*16);
  3511. }
  3512. }
  3513. sFrame.len += sFrame.pRSN->len + WLAN_IEHDR_LEN;
  3514. // copy to AssocInfo. for OID_802_11_ASSOCIATION_INFORMATION
  3515. pMgmt->sAssocInfo.AssocInfo.RequestIELength += sFrame.pRSN->len + WLAN_IEHDR_LEN;
  3516. memcpy(pbyIEs, sFrame.pRSN, sFrame.pRSN->len + WLAN_IEHDR_LEN);
  3517. pbyIEs += sFrame.pRSN->len + WLAN_IEHDR_LEN;
  3518. }
  3519. /* Adjust the length fields */
  3520. pTxPacket->cbMPDULen = sFrame.len;
  3521. pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
  3522. return pTxPacket;
  3523. }
  3524. /*+
  3525. *
  3526. * Routine Description:
  3527. * Constructs an assoc-response frame
  3528. *
  3529. *
  3530. * Return Value:
  3531. * PTR to frame; or NULL on allocation failue
  3532. *
  3533. -*/
  3534. PSTxMgmtPacket
  3535. s_MgrMakeAssocResponse(
  3536. PSDevice pDevice,
  3537. PSMgmtObject pMgmt,
  3538. WORD wCurrCapInfo,
  3539. WORD wAssocStatus,
  3540. WORD wAssocAID,
  3541. PBYTE pDstAddr,
  3542. PWLAN_IE_SUPP_RATES pCurrSuppRates,
  3543. PWLAN_IE_SUPP_RATES pCurrExtSuppRates
  3544. )
  3545. {
  3546. PSTxMgmtPacket pTxPacket = NULL;
  3547. WLAN_FR_ASSOCRESP sFrame;
  3548. pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
  3549. memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_ASSOCREQ_FR_MAXLEN);
  3550. pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
  3551. // Setup the sFrame structure
  3552. sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
  3553. sFrame.len = WLAN_REASSOCRESP_FR_MAXLEN;
  3554. vMgrEncodeAssocResponse(&sFrame);
  3555. // Setup the header
  3556. sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
  3557. (
  3558. WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
  3559. WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_ASSOCRESP)
  3560. ));
  3561. memcpy( sFrame.pHdr->sA3.abyAddr1, pDstAddr, WLAN_ADDR_LEN);
  3562. memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
  3563. memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
  3564. *sFrame.pwCapInfo = cpu_to_le16(wCurrCapInfo);
  3565. *sFrame.pwStatus = cpu_to_le16(wAssocStatus);
  3566. *sFrame.pwAid = cpu_to_le16((WORD)(wAssocAID | BIT14 | BIT15));
  3567. // Copy the rate set
  3568. sFrame.pSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
  3569. sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN;
  3570. memcpy(sFrame.pSuppRates,
  3571. pCurrSuppRates,
  3572. ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN
  3573. );
  3574. if (((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len != 0) {
  3575. sFrame.pExtSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
  3576. sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
  3577. memcpy(sFrame.pExtSuppRates,
  3578. pCurrExtSuppRates,
  3579. ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN
  3580. );
  3581. }
  3582. // Adjust the length fields
  3583. pTxPacket->cbMPDULen = sFrame.len;
  3584. pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
  3585. return pTxPacket;
  3586. }
  3587. /*+
  3588. *
  3589. * Routine Description:
  3590. * Constructs an reassoc-response frame
  3591. *
  3592. *
  3593. * Return Value:
  3594. * PTR to frame; or NULL on allocation failue
  3595. *
  3596. -*/
  3597. PSTxMgmtPacket
  3598. s_MgrMakeReAssocResponse(
  3599. PSDevice pDevice,
  3600. PSMgmtObject pMgmt,
  3601. WORD wCurrCapInfo,
  3602. WORD wAssocStatus,
  3603. WORD wAssocAID,
  3604. PBYTE pDstAddr,
  3605. PWLAN_IE_SUPP_RATES pCurrSuppRates,
  3606. PWLAN_IE_SUPP_RATES pCurrExtSuppRates
  3607. )
  3608. {
  3609. PSTxMgmtPacket pTxPacket = NULL;
  3610. WLAN_FR_REASSOCRESP sFrame;
  3611. pTxPacket = (PSTxMgmtPacket)pMgmt->pbyMgmtPacketPool;
  3612. memset(pTxPacket, 0, sizeof(STxMgmtPacket) + WLAN_ASSOCREQ_FR_MAXLEN);
  3613. pTxPacket->p80211Header = (PUWLAN_80211HDR)((PBYTE)pTxPacket + sizeof(STxMgmtPacket));
  3614. // Setup the sFrame structure
  3615. sFrame.pBuf = (PBYTE)pTxPacket->p80211Header;
  3616. sFrame.len = WLAN_REASSOCRESP_FR_MAXLEN;
  3617. vMgrEncodeReassocResponse(&sFrame);
  3618. // Setup the header
  3619. sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16(
  3620. (
  3621. WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) |
  3622. WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_REASSOCRESP)
  3623. ));
  3624. memcpy( sFrame.pHdr->sA3.abyAddr1, pDstAddr, WLAN_ADDR_LEN);
  3625. memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN);
  3626. memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN);
  3627. *sFrame.pwCapInfo = cpu_to_le16(wCurrCapInfo);
  3628. *sFrame.pwStatus = cpu_to_le16(wAssocStatus);
  3629. *sFrame.pwAid = cpu_to_le16((WORD)(wAssocAID | BIT14 | BIT15));
  3630. // Copy the rate set
  3631. sFrame.pSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
  3632. sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN;
  3633. memcpy(sFrame.pSuppRates,
  3634. pCurrSuppRates,
  3635. ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN
  3636. );
  3637. if (((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len != 0) {
  3638. sFrame.pExtSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len);
  3639. sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN;
  3640. memcpy(sFrame.pExtSuppRates,
  3641. pCurrExtSuppRates,
  3642. ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN
  3643. );
  3644. }
  3645. // Adjust the length fields
  3646. pTxPacket->cbMPDULen = sFrame.len;
  3647. pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN;
  3648. return pTxPacket;
  3649. }
  3650. /*+
  3651. *
  3652. * Routine Description:
  3653. * Handles probe response management frames.
  3654. *
  3655. *
  3656. * Return Value:
  3657. * none.
  3658. *
  3659. -*/
  3660. static
  3661. void
  3662. s_vMgrRxProbeResponse(
  3663. PSDevice pDevice,
  3664. PSMgmtObject pMgmt,
  3665. PSRxMgmtPacket pRxPacket
  3666. )
  3667. {
  3668. PKnownBSS pBSSList = NULL;
  3669. WLAN_FR_PROBERESP sFrame;
  3670. BYTE byCurrChannel = pRxPacket->byRxChannel;
  3671. ERPObject sERP;
  3672. BOOL bChannelHit = TRUE;
  3673. memset(&sFrame, 0, sizeof(WLAN_FR_PROBERESP));
  3674. // decode the frame
  3675. sFrame.len = pRxPacket->cbMPDULen;
  3676. sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
  3677. vMgrDecodeProbeResponse(&sFrame);
  3678. if ((sFrame.pqwTimestamp == NULL)
  3679. || (sFrame.pwBeaconInterval == NULL)
  3680. || (sFrame.pwCapInfo == NULL)
  3681. || (sFrame.pSSID == NULL)
  3682. || (sFrame.pSuppRates == NULL)) {
  3683. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Probe resp:Fail addr:[%p]\n",
  3684. pRxPacket->p80211Header);
  3685. DBG_PORT80(0xCC);
  3686. return;
  3687. }
  3688. if(sFrame.pSSID->len == 0)
  3689. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Rx Probe resp: SSID len = 0 \n");
  3690. //{{ RobertYu:20050201, 11a byCurrChannel != sFrame.pDSParms->byCurrChannel mapping
  3691. if( byCurrChannel > CB_MAX_CHANNEL_24G )
  3692. {
  3693. if (sFrame.pDSParms) {
  3694. if (byCurrChannel ==
  3695. RFaby11aChannelIndex[sFrame.pDSParms->byCurrChannel-1])
  3696. bChannelHit = TRUE;
  3697. byCurrChannel =
  3698. RFaby11aChannelIndex[sFrame.pDSParms->byCurrChannel-1];
  3699. } else {
  3700. bChannelHit = TRUE;
  3701. }
  3702. } else {
  3703. if (sFrame.pDSParms) {
  3704. if (byCurrChannel == sFrame.pDSParms->byCurrChannel)
  3705. bChannelHit = TRUE;
  3706. byCurrChannel = sFrame.pDSParms->byCurrChannel;
  3707. } else {
  3708. bChannelHit = TRUE;
  3709. }
  3710. }
  3711. //RobertYu:20050201
  3712. if(ChannelExceedZoneType(pDevice,byCurrChannel)==TRUE)
  3713. return;
  3714. if (sFrame.pERP) {
  3715. sERP.byERP = sFrame.pERP->byContext;
  3716. sERP.bERPExist = TRUE;
  3717. } else {
  3718. sERP.bERPExist = FALSE;
  3719. sERP.byERP = 0;
  3720. }
  3721. // update or insert the bss
  3722. pBSSList = BSSpAddrIsInBSSList((void *) pDevice,
  3723. sFrame.pHdr->sA3.abyAddr3,
  3724. sFrame.pSSID);
  3725. if (pBSSList) {
  3726. BSSbUpdateToBSSList((void *) pDevice,
  3727. *sFrame.pqwTimestamp,
  3728. *sFrame.pwBeaconInterval,
  3729. *sFrame.pwCapInfo,
  3730. byCurrChannel,
  3731. bChannelHit,
  3732. sFrame.pSSID,
  3733. sFrame.pSuppRates,
  3734. sFrame.pExtSuppRates,
  3735. &sERP,
  3736. sFrame.pRSN,
  3737. sFrame.pRSNWPA,
  3738. sFrame.pIE_Country,
  3739. sFrame.pIE_Quiet,
  3740. pBSSList,
  3741. sFrame.len - WLAN_HDR_ADDR3_LEN,
  3742. /* payload of probresponse */
  3743. sFrame.pHdr->sA4.abyAddr4,
  3744. (void *) pRxPacket);
  3745. } else {
  3746. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Probe resp/insert: RxChannel = : %d\n", byCurrChannel);
  3747. BSSbInsertToBSSList((void *) pDevice,
  3748. sFrame.pHdr->sA3.abyAddr3,
  3749. *sFrame.pqwTimestamp,
  3750. *sFrame.pwBeaconInterval,
  3751. *sFrame.pwCapInfo,
  3752. byCurrChannel,
  3753. sFrame.pSSID,
  3754. sFrame.pSuppRates,
  3755. sFrame.pExtSuppRates,
  3756. &sERP,
  3757. sFrame.pRSN,
  3758. sFrame.pRSNWPA,
  3759. sFrame.pIE_Country,
  3760. sFrame.pIE_Quiet,
  3761. sFrame.len - WLAN_HDR_ADDR3_LEN,
  3762. sFrame.pHdr->sA4.abyAddr4, /* payload of beacon */
  3763. (void *) pRxPacket);
  3764. }
  3765. return;
  3766. }
  3767. /*+
  3768. *
  3769. * Routine Description:(AP)or(Ad-hoc STA)
  3770. * Handles probe request management frames.
  3771. *
  3772. *
  3773. * Return Value:
  3774. * none.
  3775. *
  3776. -*/
  3777. static
  3778. void
  3779. s_vMgrRxProbeRequest(
  3780. PSDevice pDevice,
  3781. PSMgmtObject pMgmt,
  3782. PSRxMgmtPacket pRxPacket
  3783. )
  3784. {
  3785. WLAN_FR_PROBEREQ sFrame;
  3786. CMD_STATUS Status;
  3787. PSTxMgmtPacket pTxPacket;
  3788. BYTE byPHYType = BB_TYPE_11B;
  3789. // STA in Ad-hoc mode: when latest TBTT beacon transmit success,
  3790. // STA have to response this request.
  3791. if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) ||
  3792. ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) && pDevice->bBeaconSent)) {
  3793. memset(&sFrame, 0, sizeof(WLAN_FR_PROBEREQ));
  3794. // decode the frame
  3795. sFrame.len = pRxPacket->cbMPDULen;
  3796. sFrame.pBuf = (PBYTE)pRxPacket->p80211Header;
  3797. vMgrDecodeProbeRequest(&sFrame);
  3798. /*
  3799. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Probe request rx:MAC addr:%02x-%02x-%02x=%02x-%02x-%02x \n",
  3800. sFrame.pHdr->sA3.abyAddr2[0],
  3801. sFrame.pHdr->sA3.abyAddr2[1],
  3802. sFrame.pHdr->sA3.abyAddr2[2],
  3803. sFrame.pHdr->sA3.abyAddr2[3],
  3804. sFrame.pHdr->sA3.abyAddr2[4],
  3805. sFrame.pHdr->sA3.abyAddr2[5]
  3806. );
  3807. */
  3808. if (sFrame.pSSID->len != 0) {
  3809. if (sFrame.pSSID->len != ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->len)
  3810. return;
  3811. if (memcmp(sFrame.pSSID->abySSID,
  3812. ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->abySSID,
  3813. ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->len) != 0) {
  3814. return;
  3815. }
  3816. }
  3817. if ((sFrame.pSuppRates->len > 4) || (sFrame.pExtSuppRates != NULL)) {
  3818. byPHYType = BB_TYPE_11G;
  3819. }
  3820. // Probe response reply..
  3821. pTxPacket = s_MgrMakeProbeResponse
  3822. (
  3823. pDevice,
  3824. pMgmt,
  3825. pMgmt->wCurrCapInfo,
  3826. pMgmt->wCurrBeaconPeriod,
  3827. pMgmt->uCurrChannel,
  3828. 0,
  3829. sFrame.pHdr->sA3.abyAddr2,
  3830. (PWLAN_IE_SSID)pMgmt->abyCurrSSID,
  3831. (PBYTE)pMgmt->abyCurrBSSID,
  3832. (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
  3833. (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates,
  3834. byPHYType
  3835. );
  3836. if (pTxPacket != NULL ){
  3837. /* send the frame */
  3838. Status = csMgmt_xmit(pDevice, pTxPacket);
  3839. if (Status != CMD_STATUS_PENDING) {
  3840. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Probe response tx failed\n");
  3841. }
  3842. else {
  3843. // DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Probe response tx sending..\n");
  3844. }
  3845. }
  3846. }
  3847. return;
  3848. }
  3849. /*+
  3850. *
  3851. * Routine Description:
  3852. *
  3853. * Entry point for the reception and handling of 802.11 management
  3854. * frames. Makes a determination of the frame type and then calls
  3855. * the appropriate function.
  3856. *
  3857. *
  3858. * Return Value:
  3859. * none.
  3860. *
  3861. -*/
  3862. void vMgrRxManagePacket(void *hDeviceContext,
  3863. PSMgmtObject pMgmt,
  3864. PSRxMgmtPacket pRxPacket)
  3865. {
  3866. PSDevice pDevice = (PSDevice)hDeviceContext;
  3867. BOOL bInScan = FALSE;
  3868. unsigned int uNodeIndex = 0;
  3869. NODE_STATE eNodeState = 0;
  3870. CMD_STATUS Status;
  3871. if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) {
  3872. if (BSSbIsSTAInNodeDB(pDevice, pRxPacket->p80211Header->sA3.abyAddr2, &uNodeIndex))
  3873. eNodeState = pMgmt->sNodeDBTable[uNodeIndex].eNodeState;
  3874. }
  3875. switch( WLAN_GET_FC_FSTYPE((pRxPacket->p80211Header->sA3.wFrameCtl)) ){
  3876. case WLAN_FSTYPE_ASSOCREQ:
  3877. // Frame Clase = 2
  3878. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx assocreq\n");
  3879. if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) &&
  3880. (eNodeState < NODE_AUTH)) {
  3881. // send deauth notification
  3882. // reason = (6) class 2 received from nonauth sta
  3883. vMgrDeAuthenBeginSta(pDevice,
  3884. pMgmt,
  3885. pRxPacket->p80211Header->sA3.abyAddr2,
  3886. (6),
  3887. &Status
  3888. );
  3889. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "wmgr: send vMgrDeAuthenBeginSta 1\n");
  3890. }
  3891. else {
  3892. s_vMgrRxAssocRequest(pDevice, pMgmt, pRxPacket, uNodeIndex);
  3893. }
  3894. break;
  3895. case WLAN_FSTYPE_ASSOCRESP:
  3896. // Frame Clase = 2
  3897. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx assocresp1\n");
  3898. s_vMgrRxAssocResponse(pDevice, pMgmt, pRxPacket, FALSE);
  3899. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx assocresp2\n");
  3900. break;
  3901. case WLAN_FSTYPE_REASSOCREQ:
  3902. // Frame Clase = 2
  3903. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx reassocreq\n");
  3904. // Todo: reassoc
  3905. if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) &&
  3906. (eNodeState < NODE_AUTH)) {
  3907. // send deauth notification
  3908. // reason = (6) class 2 received from nonauth sta
  3909. vMgrDeAuthenBeginSta(pDevice,
  3910. pMgmt,
  3911. pRxPacket->p80211Header->sA3.abyAddr2,
  3912. (6),
  3913. &Status
  3914. );
  3915. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "wmgr: send vMgrDeAuthenBeginSta 2\n");
  3916. }
  3917. s_vMgrRxReAssocRequest(pDevice, pMgmt, pRxPacket, uNodeIndex);
  3918. break;
  3919. case WLAN_FSTYPE_REASSOCRESP:
  3920. // Frame Clase = 2
  3921. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx reassocresp\n");
  3922. s_vMgrRxAssocResponse(pDevice, pMgmt, pRxPacket, TRUE);
  3923. break;
  3924. case WLAN_FSTYPE_PROBEREQ:
  3925. // Frame Clase = 0
  3926. //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx probereq\n");
  3927. s_vMgrRxProbeRequest(pDevice, pMgmt, pRxPacket);
  3928. break;
  3929. case WLAN_FSTYPE_PROBERESP:
  3930. // Frame Clase = 0
  3931. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx proberesp\n");
  3932. s_vMgrRxProbeResponse(pDevice, pMgmt, pRxPacket);
  3933. break;
  3934. case WLAN_FSTYPE_BEACON:
  3935. // Frame Clase = 0
  3936. //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx beacon\n");
  3937. if (pMgmt->eScanState != WMAC_NO_SCANNING) {
  3938. bInScan = TRUE;
  3939. }
  3940. s_vMgrRxBeacon(pDevice, pMgmt, pRxPacket, bInScan);
  3941. break;
  3942. case WLAN_FSTYPE_ATIM:
  3943. // Frame Clase = 1
  3944. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx atim\n");
  3945. break;
  3946. case WLAN_FSTYPE_DISASSOC:
  3947. // Frame Clase = 2
  3948. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx disassoc\n");
  3949. if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) &&
  3950. (eNodeState < NODE_AUTH)) {
  3951. // send deauth notification
  3952. // reason = (6) class 2 received from nonauth sta
  3953. vMgrDeAuthenBeginSta(pDevice,
  3954. pMgmt,
  3955. pRxPacket->p80211Header->sA3.abyAddr2,
  3956. (6),
  3957. &Status
  3958. );
  3959. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "wmgr: send vMgrDeAuthenBeginSta 3\n");
  3960. }
  3961. s_vMgrRxDisassociation(pDevice, pMgmt, pRxPacket);
  3962. break;
  3963. case WLAN_FSTYPE_AUTHEN:
  3964. // Frame Clase = 1
  3965. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx authen\n");
  3966. s_vMgrRxAuthentication(pDevice, pMgmt, pRxPacket);
  3967. break;
  3968. case WLAN_FSTYPE_DEAUTHEN:
  3969. // Frame Clase = 1
  3970. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx deauthen\n");
  3971. s_vMgrRxDeauthentication(pDevice, pMgmt, pRxPacket);
  3972. break;
  3973. default:
  3974. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx unknown mgmt\n");
  3975. }
  3976. return;
  3977. }
  3978. /*+
  3979. *
  3980. * Routine Description:
  3981. *
  3982. *
  3983. * Prepare beacon to send
  3984. *
  3985. * Return Value:
  3986. * TRUE if success; FALSE if failed.
  3987. *
  3988. -*/
  3989. BOOL bMgrPrepareBeaconToSend(void *hDeviceContext, PSMgmtObject pMgmt)
  3990. {
  3991. PSDevice pDevice = (PSDevice)hDeviceContext;
  3992. PSTxMgmtPacket pTxPacket;
  3993. // pDevice->bBeaconBufReady = FALSE;
  3994. if (pDevice->bEncryptionEnable || pDevice->bEnable8021x){
  3995. pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_PRIVACY(1);
  3996. }
  3997. else {
  3998. pMgmt->wCurrCapInfo &= ~WLAN_SET_CAP_INFO_PRIVACY(1);
  3999. }
  4000. pTxPacket = s_MgrMakeBeacon
  4001. (
  4002. pDevice,
  4003. pMgmt,
  4004. pMgmt->wCurrCapInfo,
  4005. pMgmt->wCurrBeaconPeriod,
  4006. pMgmt->uCurrChannel,
  4007. pMgmt->wCurrATIMWindow, //0,
  4008. (PWLAN_IE_SSID)pMgmt->abyCurrSSID,
  4009. (PBYTE)pMgmt->abyCurrBSSID,
  4010. (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates,
  4011. (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates
  4012. );
  4013. if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) &&
  4014. (pMgmt->abyCurrBSSID[0] == 0))
  4015. return FALSE;
  4016. csBeacon_xmit(pDevice, pTxPacket);
  4017. MACvRegBitsOn(pDevice, MAC_REG_TCR, TCR_AUTOBCNTX);
  4018. return TRUE;
  4019. }
  4020. /*+
  4021. *
  4022. * Routine Description:
  4023. *
  4024. * Log a warning message based on the contents of the Status
  4025. * Code field of an 802.11 management frame. Defines are
  4026. * derived from 802.11-1997 SPEC.
  4027. *
  4028. * Return Value:
  4029. * none.
  4030. *
  4031. -*/
  4032. static
  4033. void
  4034. s_vMgrLogStatus(
  4035. PSMgmtObject pMgmt,
  4036. WORD wStatus
  4037. )
  4038. {
  4039. switch( wStatus ){
  4040. case WLAN_MGMT_STATUS_UNSPEC_FAILURE:
  4041. DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Unspecified error.\n");
  4042. break;
  4043. case WLAN_MGMT_STATUS_CAPS_UNSUPPORTED:
  4044. DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Can't support all requested capabilities.\n");
  4045. break;
  4046. case WLAN_MGMT_STATUS_REASSOC_NO_ASSOC:
  4047. DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Reassoc denied, can't confirm original Association.\n");
  4048. break;
  4049. case WLAN_MGMT_STATUS_ASSOC_DENIED_UNSPEC:
  4050. DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Assoc denied, undefine in spec\n");
  4051. break;
  4052. case WLAN_MGMT_STATUS_UNSUPPORTED_AUTHALG:
  4053. DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Peer doesn't support authen algorithm.\n");
  4054. break;
  4055. case WLAN_MGMT_STATUS_RX_AUTH_NOSEQ:
  4056. DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Authen frame received out of sequence.\n");
  4057. break;
  4058. case WLAN_MGMT_STATUS_CHALLENGE_FAIL:
  4059. DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Authen rejected, challenge failure.\n");
  4060. break;
  4061. case WLAN_MGMT_STATUS_AUTH_TIMEOUT:
  4062. DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Authen rejected, timeout waiting for next frame.\n");
  4063. break;
  4064. case WLAN_MGMT_STATUS_ASSOC_DENIED_BUSY:
  4065. DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Assoc denied, AP too busy.\n");
  4066. break;
  4067. case WLAN_MGMT_STATUS_ASSOC_DENIED_RATES:
  4068. DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Assoc denied, we haven't enough basic rates.\n");
  4069. break;
  4070. case WLAN_MGMT_STATUS_ASSOC_DENIED_SHORTPREAMBLE:
  4071. DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Assoc denied, we do not support short preamble.\n");
  4072. break;
  4073. case WLAN_MGMT_STATUS_ASSOC_DENIED_PBCC:
  4074. DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Assoc denied, we do not support PBCC.\n");
  4075. break;
  4076. case WLAN_MGMT_STATUS_ASSOC_DENIED_AGILITY:
  4077. DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Assoc denied, we do not support channel agility.\n");
  4078. break;
  4079. default:
  4080. DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Unknown status code %d.\n", wStatus);
  4081. break;
  4082. }
  4083. }
  4084. /*
  4085. *
  4086. * Description:
  4087. * Add BSSID in PMKID Candidate list.
  4088. *
  4089. * Parameters:
  4090. * In:
  4091. * hDeviceContext - device structure point
  4092. * pbyBSSID - BSSID address for adding
  4093. * wRSNCap - BSS's RSN capability
  4094. * Out:
  4095. * none
  4096. *
  4097. * Return Value: none.
  4098. *
  4099. -*/
  4100. BOOL bAdd_PMKID_Candidate(void *hDeviceContext,
  4101. PBYTE pbyBSSID,
  4102. PSRSNCapObject psRSNCapObj)
  4103. {
  4104. PSDevice pDevice = (PSDevice)hDeviceContext;
  4105. PPMKID_CANDIDATE pCandidateList;
  4106. unsigned int ii = 0;
  4107. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"bAdd_PMKID_Candidate START: (%d)\n", (int)pDevice->gsPMKIDCandidate.NumCandidates);
  4108. if ((pDevice == NULL) || (pbyBSSID == NULL) || (psRSNCapObj == NULL))
  4109. return FALSE;
  4110. if (pDevice->gsPMKIDCandidate.NumCandidates >= MAX_PMKIDLIST)
  4111. return FALSE;
  4112. // Update Old Candidate
  4113. for (ii = 0; ii < pDevice->gsPMKIDCandidate.NumCandidates; ii++) {
  4114. pCandidateList = &pDevice->gsPMKIDCandidate.CandidateList[ii];
  4115. if (!memcmp(pCandidateList->BSSID, pbyBSSID, ETH_ALEN)) {
  4116. if ((psRSNCapObj->bRSNCapExist == TRUE)
  4117. && (psRSNCapObj->wRSNCap & BIT0)) {
  4118. pCandidateList->Flags |=
  4119. NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED;
  4120. } else {
  4121. pCandidateList->Flags &=
  4122. ~(NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED);
  4123. }
  4124. return TRUE;
  4125. }
  4126. }
  4127. // New Candidate
  4128. pCandidateList = &pDevice->gsPMKIDCandidate.CandidateList[pDevice->gsPMKIDCandidate.NumCandidates];
  4129. if ((psRSNCapObj->bRSNCapExist == TRUE) && (psRSNCapObj->wRSNCap & BIT0)) {
  4130. pCandidateList->Flags |= NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED;
  4131. } else {
  4132. pCandidateList->Flags &= ~(NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED);
  4133. }
  4134. memcpy(pCandidateList->BSSID, pbyBSSID, ETH_ALEN);
  4135. pDevice->gsPMKIDCandidate.NumCandidates++;
  4136. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"NumCandidates:%d\n", (int)pDevice->gsPMKIDCandidate.NumCandidates);
  4137. return TRUE;
  4138. }
  4139. /*
  4140. *
  4141. * Description:
  4142. * Flush PMKID Candidate list.
  4143. *
  4144. * Parameters:
  4145. * In:
  4146. * hDeviceContext - device structure point
  4147. * Out:
  4148. * none
  4149. *
  4150. * Return Value: none.
  4151. *
  4152. -*/
  4153. void vFlush_PMKID_Candidate(void *hDeviceContext)
  4154. {
  4155. PSDevice pDevice = (PSDevice)hDeviceContext;
  4156. if (pDevice == NULL)
  4157. return;
  4158. memset(&pDevice->gsPMKIDCandidate, 0, sizeof(SPMKIDCandidateEvent));
  4159. }
  4160. static BOOL
  4161. s_bCipherMatch (
  4162. PKnownBSS pBSSNode,
  4163. NDIS_802_11_ENCRYPTION_STATUS EncStatus,
  4164. PBYTE pbyCCSPK,
  4165. PBYTE pbyCCSGK
  4166. )
  4167. {
  4168. BYTE byMulticastCipher = KEY_CTL_INVALID;
  4169. BYTE byCipherMask = 0x00;
  4170. int i;
  4171. if (pBSSNode == NULL)
  4172. return FALSE;
  4173. // check cap. of BSS
  4174. if ((WLAN_GET_CAP_INFO_PRIVACY(pBSSNode->wCapInfo) != 0) &&
  4175. (EncStatus == Ndis802_11Encryption1Enabled)) {
  4176. // default is WEP only
  4177. byMulticastCipher = KEY_CTL_WEP;
  4178. }
  4179. if ((WLAN_GET_CAP_INFO_PRIVACY(pBSSNode->wCapInfo) != 0) &&
  4180. (pBSSNode->bWPA2Valid == TRUE) &&
  4181. ((EncStatus == Ndis802_11Encryption3Enabled) ||
  4182. (EncStatus == Ndis802_11Encryption2Enabled))) {
  4183. //WPA2
  4184. // check Group Key Cipher
  4185. if ((pBSSNode->byCSSGK == WLAN_11i_CSS_WEP40) ||
  4186. (pBSSNode->byCSSGK == WLAN_11i_CSS_WEP104)) {
  4187. byMulticastCipher = KEY_CTL_WEP;
  4188. } else if (pBSSNode->byCSSGK == WLAN_11i_CSS_TKIP) {
  4189. byMulticastCipher = KEY_CTL_TKIP;
  4190. } else if (pBSSNode->byCSSGK == WLAN_11i_CSS_CCMP) {
  4191. byMulticastCipher = KEY_CTL_CCMP;
  4192. } else {
  4193. byMulticastCipher = KEY_CTL_INVALID;
  4194. }
  4195. /* check Pairwise Key Cipher */
  4196. for (i = 0; i < pBSSNode->wCSSPKCount; i++) {
  4197. if ((pBSSNode->abyCSSPK[i] == WLAN_11i_CSS_WEP40) ||
  4198. (pBSSNode->abyCSSPK[i] == WLAN_11i_CSS_WEP104)) {
  4199. /* this should not happen as defined 802.11i */
  4200. byCipherMask |= 0x01;
  4201. } else if (pBSSNode->abyCSSPK[i] == WLAN_11i_CSS_TKIP) {
  4202. byCipherMask |= 0x02;
  4203. } else if (pBSSNode->abyCSSPK[i] == WLAN_11i_CSS_CCMP) {
  4204. byCipherMask |= 0x04;
  4205. } else if (pBSSNode->abyCSSPK[i] == WLAN_11i_CSS_USE_GROUP) {
  4206. /* use group key only ignore all others */
  4207. byCipherMask = 0;
  4208. i = pBSSNode->wCSSPKCount;
  4209. }
  4210. }
  4211. } else if ((WLAN_GET_CAP_INFO_PRIVACY(pBSSNode->wCapInfo) != 0) &&
  4212. (pBSSNode->bWPAValid == TRUE) &&
  4213. ((EncStatus == Ndis802_11Encryption2Enabled) || (EncStatus == Ndis802_11Encryption3Enabled))) {
  4214. //WPA
  4215. // check Group Key Cipher
  4216. if ((pBSSNode->byGKType == WPA_WEP40) ||
  4217. (pBSSNode->byGKType == WPA_WEP104)) {
  4218. byMulticastCipher = KEY_CTL_WEP;
  4219. } else if (pBSSNode->byGKType == WPA_TKIP) {
  4220. byMulticastCipher = KEY_CTL_TKIP;
  4221. } else if (pBSSNode->byGKType == WPA_AESCCMP) {
  4222. byMulticastCipher = KEY_CTL_CCMP;
  4223. } else {
  4224. byMulticastCipher = KEY_CTL_INVALID;
  4225. }
  4226. /* check Pairwise Key Cipher */
  4227. for (i = 0; i < pBSSNode->wPKCount; i++) {
  4228. if (pBSSNode->abyPKType[i] == WPA_TKIP) {
  4229. byCipherMask |= 0x02;
  4230. } else if (pBSSNode->abyPKType[i] == WPA_AESCCMP) {
  4231. byCipherMask |= 0x04;
  4232. } else if (pBSSNode->abyPKType[i] == WPA_NONE) {
  4233. /* use group key only ignore all others */
  4234. byCipherMask = 0;
  4235. i = pBSSNode->wPKCount;
  4236. }
  4237. }
  4238. }
  4239. DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%d, %d, %d, %d, EncStatus:%d\n",
  4240. byMulticastCipher, byCipherMask, pBSSNode->bWPAValid, pBSSNode->bWPA2Valid, EncStatus);
  4241. // mask our cap. with BSS
  4242. if (EncStatus == Ndis802_11Encryption1Enabled) {
  4243. // For supporting Cisco migration mode, don't care pairwise key cipher
  4244. //if ((byMulticastCipher == KEY_CTL_WEP) &&
  4245. // (byCipherMask == 0)) {
  4246. if ((byMulticastCipher == KEY_CTL_WEP) &&
  4247. (byCipherMask == 0)) {
  4248. *pbyCCSGK = KEY_CTL_WEP;
  4249. *pbyCCSPK = KEY_CTL_NONE;
  4250. return TRUE;
  4251. } else {
  4252. return FALSE;
  4253. }
  4254. } else if (EncStatus == Ndis802_11Encryption2Enabled) {
  4255. if ((byMulticastCipher == KEY_CTL_TKIP) &&
  4256. (byCipherMask == 0)) {
  4257. *pbyCCSGK = KEY_CTL_TKIP;
  4258. *pbyCCSPK = KEY_CTL_NONE;
  4259. return TRUE;
  4260. } else if ((byMulticastCipher == KEY_CTL_WEP) &&
  4261. ((byCipherMask & 0x02) != 0)) {
  4262. *pbyCCSGK = KEY_CTL_WEP;
  4263. *pbyCCSPK = KEY_CTL_TKIP;
  4264. return TRUE;
  4265. } else if ((byMulticastCipher == KEY_CTL_TKIP) &&
  4266. ((byCipherMask & 0x02) != 0)) {
  4267. *pbyCCSGK = KEY_CTL_TKIP;
  4268. *pbyCCSPK = KEY_CTL_TKIP;
  4269. return TRUE;
  4270. } else {
  4271. return FALSE;
  4272. }
  4273. } else if (EncStatus == Ndis802_11Encryption3Enabled) {
  4274. if ((byMulticastCipher == KEY_CTL_CCMP) &&
  4275. (byCipherMask == 0)) {
  4276. // When CCMP is enable, "Use group cipher suite" shall not be a valid option.
  4277. return FALSE;
  4278. } else if ((byMulticastCipher == KEY_CTL_WEP) &&
  4279. ((byCipherMask & 0x04) != 0)) {
  4280. *pbyCCSGK = KEY_CTL_WEP;
  4281. *pbyCCSPK = KEY_CTL_CCMP;
  4282. return TRUE;
  4283. } else if ((byMulticastCipher == KEY_CTL_TKIP) &&
  4284. ((byCipherMask & 0x04) != 0)) {
  4285. *pbyCCSGK = KEY_CTL_TKIP;
  4286. *pbyCCSPK = KEY_CTL_CCMP;
  4287. return TRUE;
  4288. } else if ((byMulticastCipher == KEY_CTL_CCMP) &&
  4289. ((byCipherMask & 0x04) != 0)) {
  4290. *pbyCCSGK = KEY_CTL_CCMP;
  4291. *pbyCCSPK = KEY_CTL_CCMP;
  4292. return TRUE;
  4293. } else {
  4294. return FALSE;
  4295. }
  4296. }
  4297. return TRUE;
  4298. }