wapi.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  1. /*
  2. ** Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/mgmt/wapi.c#1
  3. */
  4. /*! \file "wapi.c"
  5. \brief This file including the WAPI related function.
  6. This file provided the macros and functions library support the wapi ie parsing,
  7. cipher and AKM check to help the AP seleced deciding.
  8. */
  9. /*
  10. ** Log: wapi.c
  11. **
  12. ** 03 06 2013 wh.su
  13. ** [BORA00002446] [MT6630] [Wi-Fi] [Driver] Update the security function code
  14. ** submit some code related with security.
  15. **
  16. ** 02 19 2013 cp.wu
  17. ** [BORA00002227] [MT6630 Wi-Fi][Driver] Update for Makefile and HIFSYS modifications
  18. ** enable AIS related management modules building under Android/Linux
  19. **
  20. ** 09 17 2012 cm.chang
  21. ** [BORA00002149] [MT6630 Wi-Fi] Initial software development
  22. ** Duplicate source from MT6620 v2.3 driver branch
  23. ** (Davinci label: MT6620_WIFI_Driver_V2_3_120913_1942_As_MT6630_Base)
  24. *
  25. * 11 10 2011 wh.su
  26. * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
  27. * change the debug module level.
  28. *
  29. * 10 20 2010 wh.su
  30. * [WCXRP00000067] [MT6620 Wi-Fi][Driver] Support the android+ WAPI function
  31. * fixed the network type
  32. *
  33. * 09 01 2010 wh.su
  34. * NULL
  35. * adding the wapi support for integration test.
  36. *
  37. * 07 20 2010 wh.su
  38. *
  39. * .
  40. *
  41. * 04 06 2010 wh.su
  42. * [BORA00000680][MT6620] Support the statistic for Microsoft os query
  43. * fixed the firmware return the broadcast frame at wrong tc.
  44. *
  45. * 03 03 2010 wh.su
  46. * [BORA00000637][MT6620 Wi-Fi] [Bug] WPA2 pre-authentication timer not correctly initialize
  47. * move the AIS specific variable for security to AIS specific structure.
  48. *
  49. * 12 18 2009 cm.chang
  50. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  51. * .
  52. *
  53. * Dec 8 2009 mtk01088
  54. * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
  55. * adding the function to check and update the default wapi tx
  56. *
  57. * Dec 7 2009 mtk01088
  58. * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
  59. * adding the generate wapi ie function, and replace the tabe by space
  60. *
  61. * Nov 23 2009 mtk01088
  62. * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
  63. *
  64. */
  65. /*******************************************************************************
  66. * C O M P I L E R F L A G S
  67. ********************************************************************************
  68. */
  69. /*******************************************************************************
  70. * E X T E R N A L R E F E R E N C E S
  71. ********************************************************************************
  72. */
  73. #include "precomp.h"
  74. #if CFG_SUPPORT_WAPI
  75. /*******************************************************************************
  76. * C O N S T A N T S
  77. ********************************************************************************
  78. */
  79. /*******************************************************************************
  80. * D A T A T Y P E S
  81. ********************************************************************************
  82. */
  83. /*******************************************************************************
  84. * P U B L I C D A T A
  85. ********************************************************************************
  86. */
  87. /*******************************************************************************
  88. * P R I V A T E D A T A
  89. ********************************************************************************
  90. */
  91. /*******************************************************************************
  92. * M A C R O S
  93. ********************************************************************************
  94. */
  95. /*******************************************************************************
  96. * F U N C T I O N D E C L A R A T I O N S
  97. ********************************************************************************
  98. */
  99. /*******************************************************************************
  100. * F U N C T I O N S
  101. ********************************************************************************
  102. */
  103. /*----------------------------------------------------------------------------*/
  104. /*!
  105. *
  106. * \brief This routine is called to generate WPA IE for
  107. * associate request frame.
  108. *
  109. * \param[in] prCurrentBss The Selected BSS description
  110. *
  111. * \retval The append WPA IE length
  112. *
  113. * \note
  114. * Called by: AIS module, Associate request
  115. */
  116. /*----------------------------------------------------------------------------*/
  117. VOID wapiGenerateWAPIIE(IN P_ADAPTER_T prAdapter, IN P_MSDU_INFO_T prMsduInfo)
  118. {
  119. PUINT_8 pucBuffer;
  120. ASSERT(prAdapter);
  121. ASSERT(prMsduInfo);
  122. if (prMsduInfo->ucBssIndex != prAdapter->prAisBssInfo->ucBssIndex)
  123. return;
  124. pucBuffer = (PUINT_8) ((ULONG) prMsduInfo->prPacket + (ULONG) prMsduInfo->u2FrameLength);
  125. /* ASSOC INFO IE ID: 68 :0x44 */
  126. if (/* prWlanInfo->fgWapiMode && */ prAdapter->prGlueInfo->u2WapiAssocInfoIESz) {
  127. kalMemCopy(pucBuffer, &prAdapter->prGlueInfo->aucWapiAssocInfoIEs,
  128. prAdapter->prGlueInfo->u2WapiAssocInfoIESz);
  129. prMsduInfo->u2FrameLength += prAdapter->prGlueInfo->u2WapiAssocInfoIESz;
  130. }
  131. }
  132. /*----------------------------------------------------------------------------*/
  133. /*!
  134. * \brief This routine is called to parse WAPI IE.
  135. *
  136. * \param[in] prInfoElem Pointer to the RSN IE
  137. * \param[out] prRsnInfo Pointer to the BSSDescription structure to store the
  138. ** WAPI information from the given WAPI IE
  139. *
  140. * \retval TRUE - Succeeded
  141. * \retval FALSE - Failed
  142. */
  143. /*----------------------------------------------------------------------------*/
  144. BOOLEAN wapiParseWapiIE(IN P_WAPI_INFO_ELEM_T prInfoElem, OUT P_WAPI_INFO_T prWapiInfo)
  145. {
  146. UINT_32 i;
  147. INT_32 u4RemainWapiIeLen;
  148. UINT_16 u2Version;
  149. UINT_16 u2Cap = 0;
  150. UINT_32 u4GroupSuite = WAPI_CIPHER_SUITE_WPI;
  151. UINT_16 u2PairSuiteCount = 0;
  152. UINT_16 u2AuthSuiteCount = 0;
  153. PUCHAR pucPairSuite = NULL;
  154. PUCHAR pucAuthSuite = NULL;
  155. PUCHAR cp;
  156. DEBUGFUNC("wapiParseWapiIE");
  157. ASSERT(prInfoElem);
  158. ASSERT(prWapiInfo);
  159. /* Verify the length of the WAPI IE. */
  160. if (prInfoElem->ucLength < 6) {
  161. DBGLOG(SEC, TRACE, "WAPI IE length too short (length=%d)\n", prInfoElem->ucLength);
  162. return FALSE;
  163. }
  164. /* Check WAPI version: currently, we only support version 1. */
  165. WLAN_GET_FIELD_16(&prInfoElem->u2Version, &u2Version);
  166. if (u2Version != 1) {
  167. DBGLOG(SEC, TRACE, "Unsupported WAPI IE version: %d\n", u2Version);
  168. return FALSE;
  169. }
  170. cp = (PUCHAR) &prInfoElem->u2AuthKeyMgtSuiteCount;
  171. u4RemainWapiIeLen = (INT_32) prInfoElem->ucLength - 2;
  172. do {
  173. if (u4RemainWapiIeLen == 0)
  174. break;
  175. /*
  176. AuthCount : 2
  177. AuthSuite : 4 * authSuiteCount
  178. PairwiseCount: 2
  179. PairwiseSuite: 4 * pairSuiteCount
  180. GroupSuite : 4
  181. Cap : 2 */
  182. /* Parse the Authentication and Key Management Cipher Suite Count
  183. field. */
  184. if (u4RemainWapiIeLen < 2) {
  185. DBGLOG(SEC, TRACE,
  186. "Fail to parse WAPI IE in auth & key mgt suite count (IE len: %d)\n",
  187. prInfoElem->ucLength);
  188. return FALSE;
  189. }
  190. WLAN_GET_FIELD_16(cp, &u2AuthSuiteCount);
  191. cp += 2;
  192. u4RemainWapiIeLen -= 2;
  193. /* Parse the Authentication and Key Management Cipher Suite List
  194. field. */
  195. i = (UINT_32) u2AuthSuiteCount * 4;
  196. if (u4RemainWapiIeLen < (INT_32) i) {
  197. DBGLOG(SEC, TRACE,
  198. "Fail to parse WAPI IE in auth & key mgt suite list (IE len: %d)\n",
  199. prInfoElem->ucLength);
  200. return FALSE;
  201. }
  202. pucAuthSuite = cp;
  203. cp += i;
  204. u4RemainWapiIeLen -= (INT_32) i;
  205. if (u4RemainWapiIeLen == 0)
  206. break;
  207. /* Parse the Pairwise Key Cipher Suite Count field. */
  208. if (u4RemainWapiIeLen < 2) {
  209. DBGLOG(SEC, TRACE,
  210. "Fail to parse WAPI IE in pairwise cipher suite count (IE len: %d)\n",
  211. prInfoElem->ucLength);
  212. return FALSE;
  213. }
  214. WLAN_GET_FIELD_16(cp, &u2PairSuiteCount);
  215. cp += 2;
  216. u4RemainWapiIeLen -= 2;
  217. /* Parse the Pairwise Key Cipher Suite List field. */
  218. i = (UINT_32) u2PairSuiteCount * 4;
  219. if (u4RemainWapiIeLen < (INT_32) i) {
  220. DBGLOG(SEC, TRACE,
  221. "Fail to parse WAPI IE in pairwise cipher suite list (IE len: %d)\n",
  222. prInfoElem->ucLength);
  223. return FALSE;
  224. }
  225. pucPairSuite = cp;
  226. cp += i;
  227. u4RemainWapiIeLen -= (INT_32) i;
  228. /* Parse the Group Key Cipher Suite field. */
  229. if (u4RemainWapiIeLen < 4) {
  230. DBGLOG(SEC, TRACE,
  231. "Fail to parse WAPI IE in group cipher suite (IE len: %d)\n", prInfoElem->ucLength);
  232. return FALSE;
  233. }
  234. WLAN_GET_FIELD_32(cp, &u4GroupSuite);
  235. cp += 4;
  236. u4RemainWapiIeLen -= 4;
  237. /* Parse the WAPI u2Capabilities field. */
  238. if (u4RemainWapiIeLen < 2) {
  239. DBGLOG(SEC, TRACE,
  240. "Fail to parse WAPI IE in WAPI capabilities (IE len: %d)\n", prInfoElem->ucLength);
  241. return FALSE;
  242. }
  243. WLAN_GET_FIELD_16(cp, &u2Cap);
  244. u4RemainWapiIeLen -= 2;
  245. /* Todo:: BKID support */
  246. } while (FALSE);
  247. /* Save the WAPI information for the BSS. */
  248. prWapiInfo->ucElemId = ELEM_ID_WAPI;
  249. prWapiInfo->u2Version = u2Version;
  250. prWapiInfo->u4GroupKeyCipherSuite = u4GroupSuite;
  251. DBGLOG(SEC, LOUD, "WAPI: version %d, group key cipher suite %02x-%02x-%02x-%02x\n",
  252. u2Version, (UCHAR) (u4GroupSuite & 0x000000FF),
  253. (UCHAR) ((u4GroupSuite >> 8) & 0x000000FF),
  254. (UCHAR) ((u4GroupSuite >> 16) & 0x000000FF), (UCHAR) ((u4GroupSuite >> 24) & 0x000000FF));
  255. if (pucPairSuite) {
  256. /* The information about the pairwise key cipher suites is present. */
  257. if (u2PairSuiteCount > MAX_NUM_SUPPORTED_WAPI_CIPHER_SUITES)
  258. u2PairSuiteCount = MAX_NUM_SUPPORTED_WAPI_CIPHER_SUITES;
  259. prWapiInfo->u4PairwiseKeyCipherSuiteCount = (UINT_32) u2PairSuiteCount;
  260. for (i = 0; i < (UINT_32) u2PairSuiteCount; i++) {
  261. WLAN_GET_FIELD_32(pucPairSuite, &prWapiInfo->au4PairwiseKeyCipherSuite[i]);
  262. pucPairSuite += 4;
  263. DBGLOG(SEC, LOUD,
  264. "WAPI: pairwise key cipher suite [%d]: %02x-%02x-%02x-%02x\n",
  265. (UINT_8) i,
  266. (UCHAR) (prWapiInfo->au4PairwiseKeyCipherSuite[i] & 0x000000FF),
  267. (UCHAR) ((prWapiInfo->au4PairwiseKeyCipherSuite[i] >> 8) & 0x000000FF),
  268. (UCHAR) ((prWapiInfo->au4PairwiseKeyCipherSuite[i] >> 16) & 0x000000FF),
  269. (UCHAR) ((prWapiInfo->au4PairwiseKeyCipherSuite[i] >> 24) & 0x000000FF));
  270. }
  271. } else {
  272. /* The information about the pairwise key cipher suites is not present.
  273. Use the default chipher suite for WAPI: WPI. */
  274. prWapiInfo->u4PairwiseKeyCipherSuiteCount = 1;
  275. prWapiInfo->au4PairwiseKeyCipherSuite[0] = WAPI_CIPHER_SUITE_WPI;
  276. DBGLOG(SEC, LOUD,
  277. "WAPI: pairwise key cipher suite: %02x-%02x-%02x-%02x (default)\n",
  278. (UCHAR) (prWapiInfo->au4PairwiseKeyCipherSuite[0] & 0x000000FF),
  279. (UCHAR) ((prWapiInfo->au4PairwiseKeyCipherSuite[0] >> 8) & 0x000000FF),
  280. (UCHAR) ((prWapiInfo->au4PairwiseKeyCipherSuite[0] >> 16) & 0x000000FF),
  281. (UCHAR) ((prWapiInfo->au4PairwiseKeyCipherSuite[0] >> 24) & 0x000000FF));
  282. }
  283. if (pucAuthSuite) {
  284. /* The information about the authentication and key management suites
  285. is present. */
  286. if (u2AuthSuiteCount > MAX_NUM_SUPPORTED_WAPI_AKM_SUITES)
  287. u2AuthSuiteCount = MAX_NUM_SUPPORTED_WAPI_AKM_SUITES;
  288. prWapiInfo->u4AuthKeyMgtSuiteCount = (UINT_32) u2AuthSuiteCount;
  289. for (i = 0; i < (UINT_32) u2AuthSuiteCount; i++) {
  290. WLAN_GET_FIELD_32(pucAuthSuite, &prWapiInfo->au4AuthKeyMgtSuite[i]);
  291. pucAuthSuite += 4;
  292. DBGLOG(SEC, LOUD, "WAPI: AKM suite [%d]: %02x-%02x-%02x-%02x\n",
  293. (UINT_8) i,
  294. (UCHAR) (prWapiInfo->au4AuthKeyMgtSuite[i] & 0x000000FF),
  295. (UCHAR) ((prWapiInfo->au4AuthKeyMgtSuite[i] >> 8) & 0x000000FF),
  296. (UCHAR) ((prWapiInfo->au4AuthKeyMgtSuite[i] >> 16) & 0x000000FF),
  297. (UCHAR) ((prWapiInfo->au4AuthKeyMgtSuite[i] >> 24) & 0x000000FF));
  298. }
  299. } else {
  300. /* The information about the authentication and key management suites
  301. is not present. Use the default AKM suite for WAPI. */
  302. prWapiInfo->u4AuthKeyMgtSuiteCount = 1;
  303. prWapiInfo->au4AuthKeyMgtSuite[0] = WAPI_AKM_SUITE_802_1X;
  304. DBGLOG(SEC, LOUD, "WAPI: AKM suite: %02x-%02x-%02x-%02x (default)\n",
  305. (UCHAR) (prWapiInfo->au4AuthKeyMgtSuite[0] & 0x000000FF),
  306. (UCHAR) ((prWapiInfo->au4AuthKeyMgtSuite[0] >> 8) & 0x000000FF),
  307. (UCHAR) ((prWapiInfo->au4AuthKeyMgtSuite[0] >> 16) & 0x000000FF),
  308. (UCHAR) ((prWapiInfo->au4AuthKeyMgtSuite[0] >> 24) & 0x000000FF));
  309. }
  310. prWapiInfo->u2WapiCap = u2Cap;
  311. DBGLOG(SEC, LOUD, "WAPI: cap: 0x%04x\n", prWapiInfo->u2WapiCap);
  312. return TRUE;
  313. } /* wapiParseWapiIE */
  314. /*----------------------------------------------------------------------------*/
  315. /*!
  316. * \brief This routine is called to perform WAPI policy selection for a given BSS.
  317. *
  318. * \param[in] prAdapter Pointer to the adapter object data area.
  319. * \param[in] prBss Pointer to the BSS description
  320. *
  321. * \retval TRUE - The WAPI policy selection for the given BSS is
  322. * successful. The selected pairwise and group cipher suites
  323. * are returned in the BSS description.
  324. * \retval FALSE - The WAPI policy selection for the given BSS is failed.
  325. * The driver shall not attempt to join the given BSS.
  326. *
  327. * \note The Encrypt status matched score will save to bss for final ap select.
  328. */
  329. /*----------------------------------------------------------------------------*/
  330. BOOLEAN wapiPerformPolicySelection(IN P_ADAPTER_T prAdapter, IN P_BSS_DESC_T prBss)
  331. {
  332. UINT_32 i;
  333. UINT_32 u4PairwiseCipher = 0;
  334. UINT_32 u4GroupCipher = 0;
  335. UINT_32 u4AkmSuite = 0;
  336. P_WAPI_INFO_T prBssWapiInfo;
  337. P_WLAN_INFO_T prWlanInfo;
  338. DEBUGFUNC("wapiPerformPolicySelection");
  339. ASSERT(prBss);
  340. /* Notice!!!! WAPI AP not set the privacy bit for WAI and WAI-PSK at WZC configuration mode */
  341. prWlanInfo = &prAdapter->rWlanInfo;
  342. if (prBss->fgIEWAPI) {
  343. prBssWapiInfo = &prBss->rIEWAPI;
  344. } else {
  345. if (prAdapter->rWifiVar.rConnSettings.fgWapiMode == FALSE) {
  346. DBGLOG(SEC, TRACE, "-- No Protected BSS\n");
  347. } else {
  348. DBGLOG(SEC, TRACE, "WAPI Information Element does not exist.\n");
  349. return FALSE;
  350. }
  351. return TRUE;
  352. }
  353. /* Select pairwise/group ciphers */
  354. for (i = 0; i < prBssWapiInfo->u4PairwiseKeyCipherSuiteCount; i++) {
  355. if (prBssWapiInfo->au4PairwiseKeyCipherSuite[i] ==
  356. prAdapter->rWifiVar.rConnSettings.u4WapiSelectedPairwiseCipher) {
  357. u4PairwiseCipher = prBssWapiInfo->au4PairwiseKeyCipherSuite[i];
  358. }
  359. }
  360. if (prBssWapiInfo->u4GroupKeyCipherSuite == prAdapter->rWifiVar.rConnSettings.u4WapiSelectedGroupCipher)
  361. u4GroupCipher = prBssWapiInfo->u4GroupKeyCipherSuite;
  362. /* Exception handler */
  363. /* If we cannot find proper pairwise and group cipher suites to join the
  364. BSS, do not check the supported AKM suites. */
  365. if (u4PairwiseCipher == 0 || u4GroupCipher == 0) {
  366. DBGLOG(SEC, TRACE, "Failed to select pairwise/group cipher (0x%08lx/0x%08lx)\n",
  367. u4PairwiseCipher, u4GroupCipher);
  368. return FALSE;
  369. }
  370. /* Select AKM */
  371. /* If the driver cannot support any authentication suites advertised in
  372. the given BSS, we fail to perform RSNA policy selection. */
  373. /* Attempt to find any overlapping supported AKM suite. */
  374. for (i = 0; i < prBssWapiInfo->u4AuthKeyMgtSuiteCount; i++) {
  375. if (prBssWapiInfo->au4AuthKeyMgtSuite[i] == prAdapter->rWifiVar.rConnSettings.u4WapiSelectedAKMSuite) {
  376. u4AkmSuite = prBssWapiInfo->au4AuthKeyMgtSuite[i];
  377. break;
  378. }
  379. }
  380. if (u4AkmSuite == 0) {
  381. DBGLOG(SEC, TRACE, "Cannot support any AKM suites\n");
  382. return FALSE;
  383. }
  384. DBGLOG(SEC, TRACE,
  385. "Selected pairwise/group cipher: %02x-%02x-%02x-%02x/%02x-%02x-%02x-%02x\n",
  386. (UINT_8) (u4PairwiseCipher & 0x000000FF),
  387. (UINT_8) ((u4PairwiseCipher >> 8) & 0x000000FF),
  388. (UINT_8) ((u4PairwiseCipher >> 16) & 0x000000FF),
  389. (UINT_8) ((u4PairwiseCipher >> 24) & 0x000000FF),
  390. (UINT_8) (u4GroupCipher & 0x000000FF), (UINT_8) ((u4GroupCipher >> 8) & 0x000000FF),
  391. (UINT_8) ((u4GroupCipher >> 16) & 0x000000FF), (UINT_8) ((u4GroupCipher >> 24) & 0x000000FF));
  392. DBGLOG(SEC, TRACE, "Selected AKM suite: %02x-%02x-%02x-%02x\n",
  393. (UINT_8) (u4AkmSuite & 0x000000FF),
  394. (UINT_8) ((u4AkmSuite >> 8) & 0x000000FF),
  395. (UINT_8) ((u4AkmSuite >> 16) & 0x000000FF), (UINT_8) ((u4AkmSuite >> 24) & 0x000000FF));
  396. return TRUE;
  397. } /* wapiPerformPolicySelection */
  398. #if 0
  399. /*----------------------------------------------------------------------------*/
  400. /*!
  401. * \brief This routine is use for wapi mode, to update the current wpi tx idx ? 0 :1 .
  402. *
  403. * \param[in] prStaRec Pointer to the Sta record
  404. * \param[out] ucWlanIdx The Rx status->wlanidx field
  405. *
  406. * \retval TRUE - Succeeded
  407. * \retval FALSE - Failed
  408. */
  409. /*----------------------------------------------------------------------------*/
  410. BOOLEAN wapiUpdateTxKeyIdx(IN P_STA_RECORD_T prStaRec, IN UINT_8 ucWlanIdx)
  411. {
  412. UINT_8 ucKeyId;
  413. if ((ucWlanIdx & BITS(0, 3)) == CIPHER_SUITE_WPI) {
  414. ucKeyId = ((ucWlanIdx & BITS(4, 5)) >> 4);
  415. if (ucKeyId != g_prWifiVar->rAisSpecificBssInfo.ucWpiActivedPWKey) {
  416. DBGLOG(RSN, STATE,
  417. "Change wapi key index from %d->%d\n",
  418. g_prWifiVar->rAisSpecificBssInfo.ucWpiActivedPWKey, ucKeyId);
  419. g_prWifiVar->rAisSpecificBssInfo.ucWpiActivedPWKey = ucKeyId;
  420. prStaRec->ucWlanIndex =
  421. (ucKeyId ==
  422. WTBL_AIS_BSSID_WAPI_IDX_0) ? WTBL_AIS_BSSID_WAPI_IDX_0 : WTBL_AIS_BSSID_WAPI_IDX_1;
  423. }
  424. }
  425. }
  426. #endif
  427. #endif