rtw_wapi.c 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2016 - 2017 Realtek Corporation.
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of version 2 of the GNU General Public License as
  7. * published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12. * more details.
  13. *
  14. *****************************************************************************/
  15. #ifdef CONFIG_WAPI_SUPPORT
  16. #include <linux/unistd.h>
  17. #include <linux/etherdevice.h>
  18. #include <drv_types.h>
  19. #include <rtw_wapi.h>
  20. u32 wapi_debug_component =
  21. /* WAPI_INIT |
  22. * WAPI_API |
  23. * WAPI_TX |
  24. * WAPI_RX | */
  25. WAPI_ERR ; /* always open err flags on */
  26. void WapiFreeAllStaInfo(_adapter *padapter)
  27. {
  28. PRT_WAPI_T pWapiInfo;
  29. PRT_WAPI_STA_INFO pWapiStaInfo;
  30. PRT_WAPI_BKID pWapiBkid;
  31. WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__);
  32. pWapiInfo = &padapter->wapiInfo;
  33. /* Pust to Idle List */
  34. rtw_wapi_return_all_sta_info(padapter);
  35. /* Sta Info List */
  36. while (!list_empty(&(pWapiInfo->wapiSTAIdleList))) {
  37. pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAIdleList.next, RT_WAPI_STA_INFO, list);
  38. list_del_init(&pWapiStaInfo->list);
  39. }
  40. /* BKID List */
  41. while (!list_empty(&(pWapiInfo->wapiBKIDIdleList))) {
  42. pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDIdleList.next, RT_WAPI_BKID, list);
  43. list_del_init(&pWapiBkid->list);
  44. }
  45. WAPI_TRACE(WAPI_INIT, "<=========== %s\n", __FUNCTION__);
  46. return;
  47. }
  48. void WapiSetIE(_adapter *padapter)
  49. {
  50. PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);
  51. /* PRT_WAPI_BKID pWapiBkid; */
  52. u16 protocolVer = 1;
  53. u16 akmCnt = 1;
  54. u16 suiteCnt = 1;
  55. u16 capability = 0;
  56. u8 OUI[3];
  57. OUI[0] = 0x00;
  58. OUI[1] = 0x14;
  59. OUI[2] = 0x72;
  60. pWapiInfo->wapiIELength = 0;
  61. /* protocol version */
  62. memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, &protocolVer, 2);
  63. pWapiInfo->wapiIELength += 2;
  64. /* akm */
  65. memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, &akmCnt, 2);
  66. pWapiInfo->wapiIELength += 2;
  67. if (pWapiInfo->bWapiPSK) {
  68. memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, OUI, 3);
  69. pWapiInfo->wapiIELength += 3;
  70. pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x2;
  71. pWapiInfo->wapiIELength += 1;
  72. } else {
  73. memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, OUI, 3);
  74. pWapiInfo->wapiIELength += 3;
  75. pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1;
  76. pWapiInfo->wapiIELength += 1;
  77. }
  78. /* usk */
  79. memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, &suiteCnt, 2);
  80. pWapiInfo->wapiIELength += 2;
  81. memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, OUI, 3);
  82. pWapiInfo->wapiIELength += 3;
  83. pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1;
  84. pWapiInfo->wapiIELength += 1;
  85. /* msk */
  86. memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, OUI, 3);
  87. pWapiInfo->wapiIELength += 3;
  88. pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1;
  89. pWapiInfo->wapiIELength += 1;
  90. /* Capbility */
  91. memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, &capability, 2);
  92. pWapiInfo->wapiIELength += 2;
  93. }
  94. /* PN1 > PN2, return 1,
  95. * else return 0.
  96. */
  97. u32 WapiComparePN(u8 *PN1, u8 *PN2)
  98. {
  99. char i;
  100. if ((NULL == PN1) || (NULL == PN2))
  101. return 1;
  102. /* overflow case */
  103. if ((PN2[15] - PN1[15]) & 0x80)
  104. return 1;
  105. for (i = 16; i > 0; i--) {
  106. if (PN1[i - 1] == PN2[i - 1])
  107. continue;
  108. else if (PN1[i - 1] > PN2[i - 1])
  109. return 1;
  110. else
  111. return 0;
  112. }
  113. return 0;
  114. }
  115. u8
  116. WapiGetEntryForCamWrite(_adapter *padapter, u8 *pMacAddr, u8 KID, BOOLEAN IsMsk)
  117. {
  118. PRT_WAPI_T pWapiInfo = NULL;
  119. /* PRT_WAPI_CAM_ENTRY pEntry=NULL; */
  120. u8 i = 0;
  121. u8 ret = 0xff;
  122. WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);
  123. pWapiInfo = &padapter->wapiInfo;
  124. /* exist? */
  125. for (i = 0; i < WAPI_CAM_ENTRY_NUM; i++) {
  126. if (pWapiInfo->wapiCamEntry[i].IsUsed
  127. && (_rtw_memcmp(pMacAddr, pWapiInfo->wapiCamEntry[i].PeerMacAddr, ETH_ALEN) == _TRUE)
  128. && pWapiInfo->wapiCamEntry[i].keyidx == KID
  129. && pWapiInfo->wapiCamEntry[i].type == IsMsk) {
  130. ret = pWapiInfo->wapiCamEntry[i].entry_idx; /* cover it */
  131. break;
  132. }
  133. }
  134. if (i == WAPI_CAM_ENTRY_NUM) { /* not found */
  135. for (i = 0; i < WAPI_CAM_ENTRY_NUM; i++) {
  136. if (pWapiInfo->wapiCamEntry[i].IsUsed == 0) {
  137. pWapiInfo->wapiCamEntry[i].IsUsed = 1;
  138. pWapiInfo->wapiCamEntry[i].type = IsMsk;
  139. pWapiInfo->wapiCamEntry[i].keyidx = KID;
  140. _rtw_memcpy(pWapiInfo->wapiCamEntry[i].PeerMacAddr, pMacAddr, ETH_ALEN);
  141. ret = pWapiInfo->wapiCamEntry[i].entry_idx;
  142. break;
  143. }
  144. }
  145. }
  146. WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__);
  147. return ret;
  148. /*
  149. if(RTIsListEmpty(&pWapiInfo->wapiCamIdleList)) {
  150. return 0;
  151. }
  152. pEntry = (PRT_WAPI_CAM_ENTRY)RTRemoveHeadList(&pWapiInfo->wapiCamIdleList);
  153. RTInsertTailList(&pWapiInfo->wapiCamUsedList, &pEntry->list);
  154. return pEntry->entry_idx;*/
  155. }
  156. u8 WapiGetEntryForCamClear(_adapter *padapter, u8 *pPeerMac, u8 keyid, u8 IsMsk)
  157. {
  158. PRT_WAPI_T pWapiInfo = NULL;
  159. u8 i = 0;
  160. WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);
  161. pWapiInfo = &padapter->wapiInfo;
  162. for (i = 0; i < WAPI_CAM_ENTRY_NUM; i++) {
  163. if (pWapiInfo->wapiCamEntry[i].IsUsed
  164. && (_rtw_memcmp(pPeerMac, pWapiInfo->wapiCamEntry[i].PeerMacAddr, ETH_ALEN) == _TRUE)
  165. && pWapiInfo->wapiCamEntry[i].keyidx == keyid
  166. && pWapiInfo->wapiCamEntry[i].type == IsMsk) {
  167. pWapiInfo->wapiCamEntry[i].IsUsed = 0;
  168. pWapiInfo->wapiCamEntry[i].keyidx = 2;
  169. _rtw_memset(pWapiInfo->wapiCamEntry[i].PeerMacAddr, 0, ETH_ALEN);
  170. WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__);
  171. return pWapiInfo->wapiCamEntry[i].entry_idx;
  172. }
  173. }
  174. WAPI_TRACE(WAPI_API, "<====WapiGetReturnCamEntry(), No this cam entry.\n");
  175. return 0xff;
  176. /*
  177. if(RTIsListEmpty(&pWapiInfo->wapiCamUsedList)) {
  178. return FALSE;
  179. }
  180. pList = &pWapiInfo->wapiCamUsedList;
  181. while(pList->Flink != &pWapiInfo->wapiCamUsedList)
  182. {
  183. pEntry = (PRT_WAPI_CAM_ENTRY)pList->Flink;
  184. if(PlatformCompareMemory(pPeerMac,pEntry->PeerMacAddr, ETHER_ADDRLEN)== 0
  185. && keyid == pEntry->keyidx)
  186. {
  187. RTRemoveEntryList(pList);
  188. RTInsertHeadList(&pWapiInfo->wapiCamIdleList, pList);
  189. return pEntry->entry_idx;
  190. }
  191. pList = pList->Flink;
  192. }
  193. return 0;
  194. */
  195. }
  196. void
  197. WapiResetAllCamEntry(_adapter *padapter)
  198. {
  199. PRT_WAPI_T pWapiInfo;
  200. int i;
  201. WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);
  202. pWapiInfo = &padapter->wapiInfo;
  203. for (i = 0; i < WAPI_CAM_ENTRY_NUM; i++) {
  204. _rtw_memset(pWapiInfo->wapiCamEntry[i].PeerMacAddr, 0, ETH_ALEN);
  205. pWapiInfo->wapiCamEntry[i].IsUsed = 0;
  206. pWapiInfo->wapiCamEntry[i].keyidx = 2; /* invalid */
  207. pWapiInfo->wapiCamEntry[i].entry_idx = 4 + i * 2;
  208. }
  209. WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__);
  210. return;
  211. }
  212. u8 WapiWriteOneCamEntry(
  213. _adapter *padapter,
  214. u8 *pMacAddr,
  215. u8 KeyId,
  216. u8 EntryId,
  217. u8 EncAlg,
  218. u8 bGroupKey,
  219. u8 *pKey
  220. )
  221. {
  222. u8 retVal = 0;
  223. u16 usConfig = 0;
  224. WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);
  225. if (EntryId >= 32) {
  226. WAPI_TRACE(WAPI_ERR, "<=== CamAddOneEntry(): ulKeyId exceed!\n");
  227. return retVal;
  228. }
  229. usConfig = usConfig | (0x01 << 15) | ((u16)(EncAlg) << 2) | (KeyId);
  230. if (EncAlg == _SMS4_) {
  231. if (bGroupKey == 1)
  232. usConfig |= (0x01 << 6);
  233. if ((EntryId % 2) == 1) /* ==0 sec key; == 1mic key */
  234. usConfig |= (0x01 << 5);
  235. }
  236. write_cam(padapter, EntryId, usConfig, pMacAddr, pKey);
  237. WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);
  238. return 1;
  239. }
  240. void rtw_wapi_init(_adapter *padapter)
  241. {
  242. PRT_WAPI_T pWapiInfo;
  243. int i;
  244. WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__);
  245. RT_ASSERT_RET(padapter);
  246. if (!padapter->WapiSupport) {
  247. WAPI_TRACE(WAPI_INIT, "<========== %s, WAPI not supported!\n", __FUNCTION__);
  248. return;
  249. }
  250. pWapiInfo = &padapter->wapiInfo;
  251. pWapiInfo->bWapiEnable = false;
  252. /* Init BKID List */
  253. INIT_LIST_HEAD(&pWapiInfo->wapiBKIDIdleList);
  254. INIT_LIST_HEAD(&pWapiInfo->wapiBKIDStoreList);
  255. for (i = 0; i < WAPI_MAX_BKID_NUM; i++)
  256. list_add_tail(&pWapiInfo->wapiBKID[i].list, &pWapiInfo->wapiBKIDIdleList);
  257. /* Init STA List */
  258. INIT_LIST_HEAD(&pWapiInfo->wapiSTAIdleList);
  259. INIT_LIST_HEAD(&pWapiInfo->wapiSTAUsedList);
  260. for (i = 0; i < WAPI_MAX_STAINFO_NUM; i++)
  261. list_add_tail(&pWapiInfo->wapiSta[i].list, &pWapiInfo->wapiSTAIdleList);
  262. for (i = 0; i < WAPI_CAM_ENTRY_NUM; i++) {
  263. pWapiInfo->wapiCamEntry[i].IsUsed = 0;
  264. pWapiInfo->wapiCamEntry[i].keyidx = 2; /* invalid */
  265. pWapiInfo->wapiCamEntry[i].entry_idx = 4 + i * 2;
  266. }
  267. WAPI_TRACE(WAPI_INIT, "<========== %s\n", __FUNCTION__);
  268. }
  269. void rtw_wapi_free(_adapter *padapter)
  270. {
  271. WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__);
  272. RT_ASSERT_RET(padapter);
  273. if (!padapter->WapiSupport) {
  274. WAPI_TRACE(WAPI_INIT, "<========== %s, WAPI not supported!\n", __FUNCTION__);
  275. return;
  276. }
  277. WapiFreeAllStaInfo(padapter);
  278. WAPI_TRACE(WAPI_INIT, "<========== %s\n", __FUNCTION__);
  279. }
  280. void rtw_wapi_disable_tx(_adapter *padapter)
  281. {
  282. WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__);
  283. RT_ASSERT_RET(padapter);
  284. if (!padapter->WapiSupport) {
  285. WAPI_TRACE(WAPI_INIT, "<========== %s, WAPI not supported!\n", __FUNCTION__);
  286. return;
  287. }
  288. padapter->wapiInfo.wapiTxMsk.bTxEnable = false;
  289. padapter->wapiInfo.wapiTxMsk.bSet = false;
  290. WAPI_TRACE(WAPI_INIT, "<========== %s\n", __FUNCTION__);
  291. }
  292. u8 rtw_wapi_is_wai_packet(_adapter *padapter, u8 *pkt_data)
  293. {
  294. PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);
  295. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  296. struct security_priv *psecuritypriv = &padapter->securitypriv;
  297. PRT_WAPI_STA_INFO pWapiSta = NULL;
  298. u8 WaiPkt = 0, *pTaddr, bFind = false;
  299. u8 Offset_TypeWAI = 0 ; /* (mac header len + llc length) */
  300. WAPI_TRACE(WAPI_TX | WAPI_RX, "===========> %s\n", __FUNCTION__);
  301. if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) {
  302. WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__);
  303. return 0;
  304. }
  305. Offset_TypeWAI = 24 + 6 ;
  306. /* YJ,add,091103. Data frame may also have skb->data[30]=0x88 and skb->data[31]=0xb4. */
  307. if ((pkt_data[1] & 0x40) != 0) {
  308. /* RTW_INFO("data is privacy\n"); */
  309. return 0;
  310. }
  311. pTaddr = get_addr2_ptr(pkt_data);
  312. if (list_empty(&pWapiInfo->wapiSTAUsedList))
  313. bFind = false;
  314. else {
  315. list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {
  316. if (_rtw_memcmp(pTaddr, pWapiSta->PeerMacAddr, 6) == _TRUE) {
  317. bFind = true;
  318. break;
  319. }
  320. }
  321. }
  322. WAPI_TRACE(WAPI_TX | WAPI_RX, "%s: bFind=%d pTaddr="MAC_FMT"\n", __FUNCTION__, bFind, MAC_ARG(pTaddr));
  323. if (pkt_data[0] == WIFI_QOS_DATA_TYPE)
  324. Offset_TypeWAI += 2;
  325. /* 88b4? */
  326. if ((pkt_data[Offset_TypeWAI] == 0x88) && (pkt_data[Offset_TypeWAI + 1] == 0xb4)) {
  327. WaiPkt = pkt_data[Offset_TypeWAI + 5];
  328. psecuritypriv->hw_decrypted = _TRUE;
  329. } else
  330. WAPI_TRACE(WAPI_TX | WAPI_RX, "%s(): non wai packet\n", __FUNCTION__);
  331. WAPI_TRACE(WAPI_TX | WAPI_RX, "%s(): Recvd WAI frame. IsWAIPkt(%d)\n", __FUNCTION__, WaiPkt);
  332. return WaiPkt;
  333. }
  334. void rtw_wapi_update_info(_adapter *padapter, union recv_frame *precv_frame)
  335. {
  336. PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);
  337. struct recv_frame_hdr *precv_hdr;
  338. u8 *ptr;
  339. u8 *pTA;
  340. u8 *pRecvPN;
  341. WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__);
  342. if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) {
  343. WAPI_TRACE(WAPI_RX, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__);
  344. return;
  345. }
  346. precv_hdr = &precv_frame->u.hdr;
  347. ptr = precv_hdr->rx_data;
  348. if (precv_hdr->attrib.qos == 1)
  349. precv_hdr->UserPriority = GetTid(ptr);
  350. else
  351. precv_hdr->UserPriority = 0;
  352. pTA = get_addr2_ptr(ptr);
  353. _rtw_memcpy((u8 *)precv_hdr->WapiSrcAddr, pTA, 6);
  354. pRecvPN = ptr + precv_hdr->attrib.hdrlen + 2;
  355. _rtw_memcpy((u8 *)precv_hdr->WapiTempPN, pRecvPN, 16);
  356. WAPI_TRACE(WAPI_RX, "<========== %s\n", __FUNCTION__);
  357. }
  358. /****************************************************************************
  359. TRUE-----------------Drop
  360. FALSE---------------- handle
  361. add to support WAPI to N-mode
  362. *****************************************************************************/
  363. u8 rtw_wapi_check_for_drop(
  364. _adapter *padapter,
  365. union recv_frame *precv_frame,
  366. u8 *ehdr_ops
  367. )
  368. {
  369. PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);
  370. u8 *pLastRecvPN = NULL;
  371. u8 bFind = false;
  372. PRT_WAPI_STA_INFO pWapiSta = NULL;
  373. u8 bDrop = false;
  374. struct recv_frame_hdr *precv_hdr = &precv_frame->u.hdr;
  375. u8 WapiAEPNInitialValueSrc[16] = {0x37, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;
  376. u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;
  377. u8 *ptr = ehdr_ops;
  378. int i;
  379. WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__);
  380. if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) {
  381. WAPI_TRACE(WAPI_RX, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__);
  382. return false;
  383. }
  384. if (precv_hdr->bIsWaiPacket != 0) {
  385. if (precv_hdr->bIsWaiPacket == 0x8) {
  386. RTW_INFO("rtw_wapi_check_for_drop: dump packet\n");
  387. for (i = 0; i < 50; i++) {
  388. RTW_INFO("%02X ", ptr[i]);
  389. if ((i + 1) % 8 == 0)
  390. RTW_INFO("\n");
  391. }
  392. RTW_INFO("\n rtw_wapi_check_for_drop: dump packet\n");
  393. for (i = 0; i < 16; i++) {
  394. if (ptr[i + 27] != 0)
  395. break;
  396. }
  397. if (i == 16) {
  398. WAPI_TRACE(WAPI_RX, "rtw_wapi_check_for_drop: drop with zero BKID\n");
  399. return true;
  400. } else
  401. return false;
  402. } else
  403. return false;
  404. }
  405. if (list_empty(&pWapiInfo->wapiSTAUsedList))
  406. bFind = false;
  407. else {
  408. list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {
  409. if (_rtw_memcmp(precv_hdr->WapiSrcAddr, pWapiSta->PeerMacAddr, ETH_ALEN) == _TRUE) {
  410. bFind = true;
  411. break;
  412. }
  413. }
  414. }
  415. WAPI_TRACE(WAPI_RX, "%s: bFind=%d prxb->WapiSrcAddr="MAC_FMT"\n", __FUNCTION__, bFind, MAC_ARG(precv_hdr->WapiSrcAddr));
  416. if (bFind) {
  417. if (IS_MCAST(precv_hdr->attrib.ra)) {
  418. WAPI_TRACE(WAPI_RX, "rtw_wapi_check_for_drop: multicast case\n");
  419. pLastRecvPN = pWapiSta->lastRxMulticastPN;
  420. } else {
  421. WAPI_TRACE(WAPI_RX, "rtw_wapi_check_for_drop: unicast case\n");
  422. switch (precv_hdr->UserPriority) {
  423. case 0:
  424. case 3:
  425. pLastRecvPN = pWapiSta->lastRxUnicastPNBEQueue;
  426. break;
  427. case 1:
  428. case 2:
  429. pLastRecvPN = pWapiSta->lastRxUnicastPNBKQueue;
  430. break;
  431. case 4:
  432. case 5:
  433. pLastRecvPN = pWapiSta->lastRxUnicastPNVIQueue;
  434. break;
  435. case 6:
  436. case 7:
  437. pLastRecvPN = pWapiSta->lastRxUnicastPNVOQueue;
  438. break;
  439. default:
  440. WAPI_TRACE(WAPI_ERR, "%s: Unknown TID\n", __FUNCTION__);
  441. break;
  442. }
  443. }
  444. if (!WapiComparePN(precv_hdr->WapiTempPN, pLastRecvPN)) {
  445. WAPI_TRACE(WAPI_RX, "%s: Equal PN!!\n", __FUNCTION__);
  446. if (IS_MCAST(precv_hdr->attrib.ra))
  447. _rtw_memcpy(pLastRecvPN, WapiAEMultiCastPNInitialValueSrc, 16);
  448. else
  449. _rtw_memcpy(pLastRecvPN, WapiAEPNInitialValueSrc, 16);
  450. bDrop = true;
  451. } else
  452. _rtw_memcpy(pLastRecvPN, precv_hdr->WapiTempPN, 16);
  453. }
  454. WAPI_TRACE(WAPI_RX, "<========== %s\n", __FUNCTION__);
  455. return bDrop;
  456. }
  457. void rtw_build_probe_resp_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib)
  458. {
  459. PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);
  460. u8 WapiIELength = 0;
  461. WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__);
  462. if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) {
  463. WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported!\n", __FUNCTION__);
  464. return;
  465. }
  466. WapiSetIE(padapter);
  467. WapiIELength = pWapiInfo->wapiIELength;
  468. pframe[0] = _WAPI_IE_;
  469. pframe[1] = WapiIELength;
  470. _rtw_memcpy(pframe + 2, pWapiInfo->wapiIE, WapiIELength);
  471. pframe += WapiIELength + 2;
  472. pattrib->pktlen += WapiIELength + 2;
  473. WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__);
  474. }
  475. void rtw_build_beacon_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib)
  476. {
  477. PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);
  478. u8 WapiIELength = 0;
  479. WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__);
  480. if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) {
  481. WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported!\n", __FUNCTION__);
  482. return;
  483. }
  484. WapiSetIE(padapter);
  485. WapiIELength = pWapiInfo->wapiIELength;
  486. pframe[0] = _WAPI_IE_;
  487. pframe[1] = WapiIELength;
  488. _rtw_memcpy(pframe + 2, pWapiInfo->wapiIE, WapiIELength);
  489. pframe += WapiIELength + 2;
  490. pattrib->pktlen += WapiIELength + 2;
  491. WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__);
  492. }
  493. void rtw_build_assoc_req_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib)
  494. {
  495. PRT_WAPI_BKID pWapiBKID;
  496. u16 bkidNum;
  497. PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);
  498. u8 WapiIELength = 0;
  499. WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__);
  500. if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) {
  501. WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported!\n", __FUNCTION__);
  502. return;
  503. }
  504. WapiSetIE(padapter);
  505. WapiIELength = pWapiInfo->wapiIELength;
  506. bkidNum = 0;
  507. if (!list_empty(&(pWapiInfo->wapiBKIDStoreList))) {
  508. list_for_each_entry(pWapiBKID, &pWapiInfo->wapiBKIDStoreList, list) {
  509. bkidNum++;
  510. _rtw_memcpy(pWapiInfo->wapiIE + WapiIELength + 2, pWapiBKID->bkid, 16);
  511. WapiIELength += 16;
  512. }
  513. }
  514. _rtw_memcpy(pWapiInfo->wapiIE + WapiIELength, &bkidNum, 2);
  515. WapiIELength += 2;
  516. pframe[0] = _WAPI_IE_;
  517. pframe[1] = WapiIELength;
  518. _rtw_memcpy(pframe + 2, pWapiInfo->wapiIE, WapiIELength);
  519. pframe += WapiIELength + 2;
  520. pattrib->pktlen += WapiIELength + 2;
  521. WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__);
  522. }
  523. void rtw_wapi_on_assoc_ok(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)
  524. {
  525. PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);
  526. PRT_WAPI_STA_INFO pWapiSta;
  527. u8 WapiAEPNInitialValueSrc[16] = {0x37, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;
  528. /* u8 WapiASUEPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; */
  529. u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;
  530. WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__);
  531. if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) {
  532. WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__);
  533. return;
  534. }
  535. pWapiSta = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAIdleList.next, RT_WAPI_STA_INFO, list);
  536. list_del_init(&pWapiSta->list);
  537. list_add_tail(&pWapiSta->list, &pWapiInfo->wapiSTAUsedList);
  538. _rtw_memcpy(pWapiSta->PeerMacAddr, padapter->mlmeextpriv.mlmext_info.network.MacAddress, 6);
  539. _rtw_memcpy(pWapiSta->lastRxMulticastPN, WapiAEMultiCastPNInitialValueSrc, 16);
  540. _rtw_memcpy(pWapiSta->lastRxUnicastPN, WapiAEPNInitialValueSrc, 16);
  541. /* For chenk PN error with Qos Data after s3: add by ylb 20111114 */
  542. _rtw_memcpy(pWapiSta->lastRxUnicastPNBEQueue, WapiAEPNInitialValueSrc, 16);
  543. _rtw_memcpy(pWapiSta->lastRxUnicastPNBKQueue, WapiAEPNInitialValueSrc, 16);
  544. _rtw_memcpy(pWapiSta->lastRxUnicastPNVIQueue, WapiAEPNInitialValueSrc, 16);
  545. _rtw_memcpy(pWapiSta->lastRxUnicastPNVOQueue, WapiAEPNInitialValueSrc, 16);
  546. WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__);
  547. }
  548. void rtw_wapi_return_one_sta_info(_adapter *padapter, u8 *MacAddr)
  549. {
  550. PRT_WAPI_T pWapiInfo;
  551. PRT_WAPI_STA_INFO pWapiStaInfo = NULL;
  552. PRT_WAPI_BKID pWapiBkid = NULL;
  553. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  554. pWapiInfo = &padapter->wapiInfo;
  555. WAPI_TRACE(WAPI_API, "==========> %s\n", __FUNCTION__);
  556. if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) {
  557. WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__);
  558. return;
  559. }
  560. if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
  561. while (!list_empty(&(pWapiInfo->wapiBKIDStoreList))) {
  562. pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDStoreList.next, RT_WAPI_BKID, list);
  563. list_del_init(&pWapiBkid->list);
  564. _rtw_memset(pWapiBkid->bkid, 0, 16);
  565. list_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDIdleList);
  566. }
  567. }
  568. WAPI_TRACE(WAPI_API, " %s: after clear bkid\n", __FUNCTION__);
  569. /* Remove STA info */
  570. if (list_empty(&(pWapiInfo->wapiSTAUsedList))) {
  571. WAPI_TRACE(WAPI_API, " %s: wapiSTAUsedList is null\n", __FUNCTION__);
  572. return;
  573. } else {
  574. WAPI_TRACE(WAPI_API, " %s: wapiSTAUsedList is not null\n", __FUNCTION__);
  575. #if 0
  576. pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry((pWapiInfo->wapiSTAUsedList.next), RT_WAPI_STA_INFO, list);
  577. list_for_each_entry(pWapiStaInfo, &(pWapiInfo->wapiSTAUsedList), list) {
  578. RTW_INFO("MAC Addr %02x-%02x-%02x-%02x-%02x-%02x\n", MacAddr[0], MacAddr[1], MacAddr[2], MacAddr[3], MacAddr[4], MacAddr[5]);
  579. RTW_INFO("peer Addr %02x-%02x-%02x-%02x-%02x-%02x\n", pWapiStaInfo->PeerMacAddr[0], pWapiStaInfo->PeerMacAddr[1], pWapiStaInfo->PeerMacAddr[2], pWapiStaInfo->PeerMacAddr[3],
  580. pWapiStaInfo->PeerMacAddr[4], pWapiStaInfo->PeerMacAddr[5]);
  581. if (pWapiStaInfo == NULL) {
  582. WAPI_TRACE(WAPI_API, " %s: pWapiStaInfo == NULL Case\n", __FUNCTION__);
  583. return;
  584. }
  585. if (pWapiStaInfo->PeerMacAddr == NULL) {
  586. WAPI_TRACE(WAPI_API, " %s: pWapiStaInfo->PeerMacAddr == NULL Case\n", __FUNCTION__);
  587. return;
  588. }
  589. if (MacAddr == NULL) {
  590. WAPI_TRACE(WAPI_API, " %s: MacAddr == NULL Case\n", __FUNCTION__);
  591. return;
  592. }
  593. if (_rtw_memcmp(pWapiStaInfo->PeerMacAddr, MacAddr, ETH_ALEN) == _TRUE) {
  594. pWapiStaInfo->bAuthenticateInProgress = false;
  595. pWapiStaInfo->bSetkeyOk = false;
  596. _rtw_memset(pWapiStaInfo->PeerMacAddr, 0, ETH_ALEN);
  597. list_del_init(&pWapiStaInfo->list);
  598. list_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList);
  599. break;
  600. }
  601. }
  602. #endif
  603. while (!list_empty(&(pWapiInfo->wapiSTAUsedList))) {
  604. pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAUsedList.next, RT_WAPI_STA_INFO, list);
  605. RTW_INFO("peer Addr %02x-%02x-%02x-%02x-%02x-%02x\n", pWapiStaInfo->PeerMacAddr[0], pWapiStaInfo->PeerMacAddr[1], pWapiStaInfo->PeerMacAddr[2], pWapiStaInfo->PeerMacAddr[3],
  606. pWapiStaInfo->PeerMacAddr[4], pWapiStaInfo->PeerMacAddr[5]);
  607. list_del_init(&pWapiStaInfo->list);
  608. memset(pWapiStaInfo->PeerMacAddr, 0, ETH_ALEN);
  609. pWapiStaInfo->bSetkeyOk = 0;
  610. list_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList);
  611. }
  612. }
  613. WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__);
  614. return;
  615. }
  616. void rtw_wapi_return_all_sta_info(_adapter *padapter)
  617. {
  618. PRT_WAPI_T pWapiInfo;
  619. PRT_WAPI_STA_INFO pWapiStaInfo;
  620. PRT_WAPI_BKID pWapiBkid;
  621. WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);
  622. pWapiInfo = &padapter->wapiInfo;
  623. if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) {
  624. WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__);
  625. return;
  626. }
  627. /* Sta Info List */
  628. while (!list_empty(&(pWapiInfo->wapiSTAUsedList))) {
  629. pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAUsedList.next, RT_WAPI_STA_INFO, list);
  630. list_del_init(&pWapiStaInfo->list);
  631. memset(pWapiStaInfo->PeerMacAddr, 0, ETH_ALEN);
  632. pWapiStaInfo->bSetkeyOk = 0;
  633. list_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList);
  634. }
  635. /* BKID List */
  636. while (!list_empty(&(pWapiInfo->wapiBKIDStoreList))) {
  637. pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDStoreList.next, RT_WAPI_BKID, list);
  638. list_del_init(&pWapiBkid->list);
  639. memset(pWapiBkid->bkid, 0, 16);
  640. list_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDIdleList);
  641. }
  642. WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__);
  643. }
  644. void rtw_wapi_clear_cam_entry(_adapter *padapter, u8 *pMacAddr)
  645. {
  646. u8 UcIndex = 0;
  647. WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);
  648. if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) {
  649. WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__);
  650. return;
  651. }
  652. UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 0, 0);
  653. if (UcIndex != 0xff) {
  654. /* CAM_mark_invalid(Adapter, UcIndex); */
  655. CAM_empty_entry(padapter, UcIndex);
  656. }
  657. UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 1, 0);
  658. if (UcIndex != 0xff) {
  659. /* CAM_mark_invalid(Adapter, UcIndex); */
  660. CAM_empty_entry(padapter, UcIndex);
  661. }
  662. UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 0, 1);
  663. if (UcIndex != 0xff) {
  664. /* CAM_mark_invalid(Adapter, UcIndex); */
  665. CAM_empty_entry(padapter, UcIndex);
  666. }
  667. UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 1, 1);
  668. if (UcIndex != 0xff) {
  669. /* CAM_mark_invalid(padapter, UcIndex); */
  670. CAM_empty_entry(padapter, UcIndex);
  671. }
  672. WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__);
  673. }
  674. void rtw_wapi_clear_all_cam_entry(_adapter *padapter)
  675. {
  676. WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);
  677. if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) {
  678. WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__);
  679. return;
  680. }
  681. invalidate_cam_all(padapter); /* is this ok? */
  682. WapiResetAllCamEntry(padapter);
  683. WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);
  684. }
  685. void rtw_wapi_set_key(_adapter *padapter, RT_WAPI_KEY *pWapiKey, RT_WAPI_STA_INFO *pWapiSta, u8 bGroupKey, u8 bUseDefaultKey)
  686. {
  687. PRT_WAPI_T pWapiInfo = &padapter->wapiInfo;
  688. u8 *pMacAddr = pWapiSta->PeerMacAddr;
  689. u32 EntryId = 0;
  690. BOOLEAN IsPairWise = false ;
  691. u8 EncAlgo;
  692. WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);
  693. if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) {
  694. WAPI_TRACE(WAPI_API, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__);
  695. return;
  696. }
  697. EncAlgo = _SMS4_;
  698. /* For Tx bc/mc pkt,use defualt key entry */
  699. if (bUseDefaultKey) {
  700. /* when WAPI update key, keyid will be 0 or 1 by turns. */
  701. if (pWapiKey->keyId == 0)
  702. EntryId = 0;
  703. else
  704. EntryId = 2;
  705. } else {
  706. /* tx/rx unicast pkt, or rx broadcast, find the key entry by peer's MacAddr */
  707. EntryId = WapiGetEntryForCamWrite(padapter, pMacAddr, pWapiKey->keyId, bGroupKey);
  708. }
  709. if (EntryId == 0xff) {
  710. WAPI_TRACE(WAPI_API, "===>No entry for WAPI setkey! !!\n");
  711. return;
  712. }
  713. /* EntryId is also used to diff Sec key and Mic key */
  714. /* Sec Key */
  715. WapiWriteOneCamEntry(padapter,
  716. pMacAddr,
  717. pWapiKey->keyId, /* keyid */
  718. EntryId, /* entry */
  719. EncAlgo, /* type */
  720. bGroupKey, /* pairwise or group key */
  721. pWapiKey->dataKey);
  722. /* MIC key */
  723. WapiWriteOneCamEntry(padapter,
  724. pMacAddr,
  725. pWapiKey->keyId, /* keyid */
  726. EntryId + 1, /* entry */
  727. EncAlgo, /* type */
  728. bGroupKey, /* pairwise or group key */
  729. pWapiKey->micKey);
  730. WAPI_TRACE(WAPI_API, "Set Wapi Key :KeyId:%d,EntryId:%d,PairwiseKey:%d.\n", pWapiKey->keyId, EntryId, !bGroupKey);
  731. WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);
  732. }
  733. #if 0
  734. /* YJ,test,091013 */
  735. void wapi_test_set_key(struct _adapter *padapter, u8 *buf)
  736. {
  737. /*Data: keyType(1) + bTxEnable(1) + bAuthenticator(1) + bUpdate(1) + PeerAddr(6) + DataKey(16) + MicKey(16) + KeyId(1)*/
  738. PRT_WAPI_T pWapiInfo = &padapter->wapiInfo;
  739. PRT_WAPI_BKID pWapiBkid;
  740. PRT_WAPI_STA_INFO pWapiSta;
  741. u8 data[43];
  742. bool bTxEnable;
  743. bool bUpdate;
  744. bool bAuthenticator;
  745. u8 PeerAddr[6];
  746. u8 WapiAEPNInitialValueSrc[16] = {0x37, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;
  747. u8 WapiASUEPNInitialValueSrc[16] = {0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;
  748. u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;
  749. WAPI_TRACE(WAPI_INIT, "===========>%s\n", __FUNCTION__);
  750. if (!padapter->WapiSupport)
  751. return;
  752. copy_from_user(data, buf, 43);
  753. bTxEnable = data[1];
  754. bAuthenticator = data[2];
  755. bUpdate = data[3];
  756. memcpy(PeerAddr, data + 4, 6);
  757. if (data[0] == 0x3) {
  758. if (!list_empty(&(pWapiInfo->wapiBKIDIdleList))) {
  759. pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDIdleList.next, RT_WAPI_BKID, list);
  760. list_del_init(&pWapiBkid->list);
  761. memcpy(pWapiBkid->bkid, data + 10, 16);
  762. WAPI_DATA(WAPI_INIT, "SetKey - BKID", pWapiBkid->bkid, 16);
  763. list_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDStoreList);
  764. }
  765. } else {
  766. list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {
  767. if (!memcmp(pWapiSta->PeerMacAddr, PeerAddr, 6)) {
  768. pWapiSta->bAuthenticatorInUpdata = false;
  769. switch (data[0]) {
  770. case 1: /* usk */
  771. if (bAuthenticator) { /* authenticator */
  772. memcpy(pWapiSta->lastTxUnicastPN, WapiAEPNInitialValueSrc, 16);
  773. if (!bUpdate) { /* first */
  774. WAPI_TRACE(WAPI_INIT, "AE fisrt set usk\n");
  775. pWapiSta->wapiUsk.bSet = true;
  776. memcpy(pWapiSta->wapiUsk.dataKey, data + 10, 16);
  777. memcpy(pWapiSta->wapiUsk.micKey, data + 26, 16);
  778. pWapiSta->wapiUsk.keyId = *(data + 42);
  779. pWapiSta->wapiUsk.bTxEnable = true;
  780. WAPI_DATA(WAPI_INIT, "SetKey - AE USK Data Key", pWapiSta->wapiUsk.dataKey, 16);
  781. WAPI_DATA(WAPI_INIT, "SetKey - AE USK Mic Key", pWapiSta->wapiUsk.micKey, 16);
  782. } else { /* update */
  783. WAPI_TRACE(WAPI_INIT, "AE update usk\n");
  784. pWapiSta->wapiUskUpdate.bSet = true;
  785. pWapiSta->bAuthenticatorInUpdata = true;
  786. memcpy(pWapiSta->wapiUskUpdate.dataKey, data + 10, 16);
  787. memcpy(pWapiSta->wapiUskUpdate.micKey, data + 26, 16);
  788. memcpy(pWapiSta->lastRxUnicastPNBEQueue, WapiASUEPNInitialValueSrc, 16);
  789. memcpy(pWapiSta->lastRxUnicastPNBKQueue, WapiASUEPNInitialValueSrc, 16);
  790. memcpy(pWapiSta->lastRxUnicastPNVIQueue, WapiASUEPNInitialValueSrc, 16);
  791. memcpy(pWapiSta->lastRxUnicastPNVOQueue, WapiASUEPNInitialValueSrc, 16);
  792. memcpy(pWapiSta->lastRxUnicastPN, WapiASUEPNInitialValueSrc, 16);
  793. pWapiSta->wapiUskUpdate.keyId = *(data + 42);
  794. pWapiSta->wapiUskUpdate.bTxEnable = true;
  795. }
  796. } else {
  797. if (!bUpdate) {
  798. WAPI_TRACE(WAPI_INIT, "ASUE fisrt set usk\n");
  799. if (bTxEnable) {
  800. pWapiSta->wapiUsk.bTxEnable = true;
  801. memcpy(pWapiSta->lastTxUnicastPN, WapiASUEPNInitialValueSrc, 16);
  802. } else {
  803. pWapiSta->wapiUsk.bSet = true;
  804. memcpy(pWapiSta->wapiUsk.dataKey, data + 10, 16);
  805. memcpy(pWapiSta->wapiUsk.micKey, data + 26, 16);
  806. pWapiSta->wapiUsk.keyId = *(data + 42);
  807. pWapiSta->wapiUsk.bTxEnable = false;
  808. }
  809. } else {
  810. WAPI_TRACE(WAPI_INIT, "ASUE update usk\n");
  811. if (bTxEnable) {
  812. pWapiSta->wapiUskUpdate.bTxEnable = true;
  813. if (pWapiSta->wapiUskUpdate.bSet) {
  814. memcpy(pWapiSta->wapiUsk.dataKey, pWapiSta->wapiUskUpdate.dataKey, 16);
  815. memcpy(pWapiSta->wapiUsk.micKey, pWapiSta->wapiUskUpdate.micKey, 16);
  816. pWapiSta->wapiUsk.keyId = pWapiSta->wapiUskUpdate.keyId;
  817. memcpy(pWapiSta->lastRxUnicastPNBEQueue, WapiASUEPNInitialValueSrc, 16);
  818. memcpy(pWapiSta->lastRxUnicastPNBKQueue, WapiASUEPNInitialValueSrc, 16);
  819. memcpy(pWapiSta->lastRxUnicastPNVIQueue, WapiASUEPNInitialValueSrc, 16);
  820. memcpy(pWapiSta->lastRxUnicastPNVOQueue, WapiASUEPNInitialValueSrc, 16);
  821. memcpy(pWapiSta->lastRxUnicastPN, WapiASUEPNInitialValueSrc, 16);
  822. pWapiSta->wapiUskUpdate.bTxEnable = false;
  823. pWapiSta->wapiUskUpdate.bSet = false;
  824. }
  825. memcpy(pWapiSta->lastTxUnicastPN, WapiASUEPNInitialValueSrc, 16);
  826. } else {
  827. pWapiSta->wapiUskUpdate.bSet = true;
  828. memcpy(pWapiSta->wapiUskUpdate.dataKey, data + 10, 16);
  829. memcpy(pWapiSta->wapiUskUpdate.micKey, data + 26, 16);
  830. pWapiSta->wapiUskUpdate.keyId = *(data + 42);
  831. pWapiSta->wapiUskUpdate.bTxEnable = false;
  832. }
  833. }
  834. }
  835. break;
  836. case 2: /* msk */
  837. if (bAuthenticator) { /* authenticator */
  838. pWapiInfo->wapiTxMsk.bSet = true;
  839. memcpy(pWapiInfo->wapiTxMsk.dataKey, data + 10, 16);
  840. memcpy(pWapiInfo->wapiTxMsk.micKey, data + 26, 16);
  841. pWapiInfo->wapiTxMsk.keyId = *(data + 42);
  842. pWapiInfo->wapiTxMsk.bTxEnable = true;
  843. memcpy(pWapiInfo->lastTxMulticastPN, WapiAEMultiCastPNInitialValueSrc, 16);
  844. if (!bUpdate) { /* first */
  845. WAPI_TRACE(WAPI_INIT, "AE fisrt set msk\n");
  846. if (!pWapiSta->bSetkeyOk)
  847. pWapiSta->bSetkeyOk = true;
  848. pWapiInfo->bFirstAuthentiateInProgress = false;
  849. } else /* update */
  850. WAPI_TRACE(WAPI_INIT, "AE update msk\n");
  851. WAPI_DATA(WAPI_INIT, "SetKey - AE MSK Data Key", pWapiInfo->wapiTxMsk.dataKey, 16);
  852. WAPI_DATA(WAPI_INIT, "SetKey - AE MSK Mic Key", pWapiInfo->wapiTxMsk.micKey, 16);
  853. } else {
  854. if (!bUpdate) {
  855. WAPI_TRACE(WAPI_INIT, "ASUE fisrt set msk\n");
  856. pWapiSta->wapiMsk.bSet = true;
  857. memcpy(pWapiSta->wapiMsk.dataKey, data + 10, 16);
  858. memcpy(pWapiSta->wapiMsk.micKey, data + 26, 16);
  859. pWapiSta->wapiMsk.keyId = *(data + 42);
  860. pWapiSta->wapiMsk.bTxEnable = false;
  861. if (!pWapiSta->bSetkeyOk)
  862. pWapiSta->bSetkeyOk = true;
  863. pWapiInfo->bFirstAuthentiateInProgress = false;
  864. WAPI_DATA(WAPI_INIT, "SetKey - ASUE MSK Data Key", pWapiSta->wapiMsk.dataKey, 16);
  865. WAPI_DATA(WAPI_INIT, "SetKey - ASUE MSK Mic Key", pWapiSta->wapiMsk.micKey, 16);
  866. } else {
  867. WAPI_TRACE(WAPI_INIT, "ASUE update msk\n");
  868. pWapiSta->wapiMskUpdate.bSet = true;
  869. memcpy(pWapiSta->wapiMskUpdate.dataKey, data + 10, 16);
  870. memcpy(pWapiSta->wapiMskUpdate.micKey, data + 26, 16);
  871. pWapiSta->wapiMskUpdate.keyId = *(data + 42);
  872. pWapiSta->wapiMskUpdate.bTxEnable = false;
  873. }
  874. }
  875. break;
  876. default:
  877. WAPI_TRACE(WAPI_ERR, "Unknown Flag\n");
  878. break;
  879. }
  880. }
  881. }
  882. }
  883. WAPI_TRACE(WAPI_INIT, "<===========%s\n", __FUNCTION__);
  884. }
  885. void wapi_test_init(struct _adapter *padapter)
  886. {
  887. u8 keybuf[100];
  888. u8 mac_addr[ETH_ALEN] = {0x00, 0xe0, 0x4c, 0x72, 0x04, 0x70};
  889. u8 UskDataKey[16] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
  890. u8 UskMicKey[16] = {0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f};
  891. u8 UskId = 0;
  892. u8 MskDataKey[16] = {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f};
  893. u8 MskMicKey[16] = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f};
  894. u8 MskId = 0;
  895. WAPI_TRACE(WAPI_INIT, "===========>%s\n", __FUNCTION__);
  896. /* Enable Wapi */
  897. WAPI_TRACE(WAPI_INIT, "%s: Enable wapi!!!!\n", __FUNCTION__);
  898. padapter->wapiInfo.bWapiEnable = true;
  899. padapter->pairwise_key_type = KEY_TYPE_SMS4;
  900. ieee->group_key_type = KEY_TYPE_SMS4;
  901. padapter->wapiInfo.extra_prefix_len = WAPI_EXT_LEN;
  902. padapter->wapiInfo.extra_postfix_len = SMS4_MIC_LEN;
  903. /* set usk */
  904. WAPI_TRACE(WAPI_INIT, "%s: Set USK!!!!\n", __FUNCTION__);
  905. memset(keybuf, 0, 100);
  906. keybuf[0] = 1; /* set usk */
  907. keybuf[1] = 1; /* enable tx */
  908. keybuf[2] = 1; /* AE */
  909. keybuf[3] = 0; /* not update */
  910. memcpy(keybuf + 4, mac_addr, ETH_ALEN);
  911. memcpy(keybuf + 10, UskDataKey, 16);
  912. memcpy(keybuf + 26, UskMicKey, 16);
  913. keybuf[42] = UskId;
  914. wapi_test_set_key(padapter, keybuf);
  915. memset(keybuf, 0, 100);
  916. keybuf[0] = 1; /* set usk */
  917. keybuf[1] = 1; /* enable tx */
  918. keybuf[2] = 0; /* AE */
  919. keybuf[3] = 0; /* not update */
  920. memcpy(keybuf + 4, mac_addr, ETH_ALEN);
  921. memcpy(keybuf + 10, UskDataKey, 16);
  922. memcpy(keybuf + 26, UskMicKey, 16);
  923. keybuf[42] = UskId;
  924. wapi_test_set_key(padapter, keybuf);
  925. /* set msk */
  926. WAPI_TRACE(WAPI_INIT, "%s: Set MSK!!!!\n", __FUNCTION__);
  927. memset(keybuf, 0, 100);
  928. keybuf[0] = 2; /* set msk */
  929. keybuf[1] = 1; /* Enable TX */
  930. keybuf[2] = 1; /* AE */
  931. keybuf[3] = 0; /* not update */
  932. memcpy(keybuf + 4, mac_addr, ETH_ALEN);
  933. memcpy(keybuf + 10, MskDataKey, 16);
  934. memcpy(keybuf + 26, MskMicKey, 16);
  935. keybuf[42] = MskId;
  936. wapi_test_set_key(padapter, keybuf);
  937. memset(keybuf, 0, 100);
  938. keybuf[0] = 2; /* set msk */
  939. keybuf[1] = 1; /* Enable TX */
  940. keybuf[2] = 0; /* AE */
  941. keybuf[3] = 0; /* not update */
  942. memcpy(keybuf + 4, mac_addr, ETH_ALEN);
  943. memcpy(keybuf + 10, MskDataKey, 16);
  944. memcpy(keybuf + 26, MskMicKey, 16);
  945. keybuf[42] = MskId;
  946. wapi_test_set_key(padapter, keybuf);
  947. WAPI_TRACE(WAPI_INIT, "<===========%s\n", __FUNCTION__);
  948. }
  949. #endif
  950. void rtw_wapi_get_iv(_adapter *padapter, u8 *pRA, u8 *IV)
  951. {
  952. PWLAN_HEADER_WAPI_EXTENSION pWapiExt = NULL;
  953. PRT_WAPI_T pWapiInfo = &padapter->wapiInfo;
  954. bool bPNOverflow = false;
  955. bool bFindMatchPeer = false;
  956. PRT_WAPI_STA_INFO pWapiSta = NULL;
  957. pWapiExt = (PWLAN_HEADER_WAPI_EXTENSION)IV;
  958. WAPI_DATA(WAPI_RX, "wapi_get_iv: pra", pRA, 6);
  959. if (IS_MCAST(pRA)) {
  960. if (!pWapiInfo->wapiTxMsk.bTxEnable) {
  961. WAPI_TRACE(WAPI_ERR, "%s: bTxEnable = 0!!\n", __FUNCTION__);
  962. return;
  963. }
  964. if (pWapiInfo->wapiTxMsk.keyId <= 1) {
  965. pWapiExt->KeyIdx = pWapiInfo->wapiTxMsk.keyId;
  966. pWapiExt->Reserved = 0;
  967. bPNOverflow = WapiIncreasePN(pWapiInfo->lastTxMulticastPN, 1);
  968. memcpy(pWapiExt->PN, pWapiInfo->lastTxMulticastPN, 16);
  969. }
  970. } else {
  971. if (list_empty(&pWapiInfo->wapiSTAUsedList)) {
  972. WAPI_TRACE(WAPI_RX, "rtw_wapi_get_iv: list is empty\n");
  973. _rtw_memset(IV, 10, 18);
  974. return;
  975. } else {
  976. list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {
  977. WAPI_DATA(WAPI_RX, "rtw_wapi_get_iv: peermacaddr ", pWapiSta->PeerMacAddr, 6);
  978. if (_rtw_memcmp((u8 *)pWapiSta->PeerMacAddr, pRA, 6) == _TRUE) {
  979. bFindMatchPeer = true;
  980. break;
  981. }
  982. }
  983. WAPI_TRACE(WAPI_RX, "bFindMatchPeer: %d\n", bFindMatchPeer);
  984. WAPI_DATA(WAPI_RX, "Addr", pRA, 6);
  985. if (bFindMatchPeer) {
  986. if ((!pWapiSta->wapiUskUpdate.bTxEnable) && (!pWapiSta->wapiUsk.bTxEnable))
  987. return;
  988. if (pWapiSta->wapiUsk.keyId <= 1) {
  989. if (pWapiSta->wapiUskUpdate.bTxEnable)
  990. pWapiExt->KeyIdx = pWapiSta->wapiUskUpdate.keyId;
  991. else
  992. pWapiExt->KeyIdx = pWapiSta->wapiUsk.keyId;
  993. pWapiExt->Reserved = 0;
  994. bPNOverflow = WapiIncreasePN(pWapiSta->lastTxUnicastPN, 2);
  995. _rtw_memcpy(pWapiExt->PN, pWapiSta->lastTxUnicastPN, 16);
  996. }
  997. }
  998. }
  999. }
  1000. }
  1001. bool rtw_wapi_drop_for_key_absent(_adapter *padapter, u8 *pRA)
  1002. {
  1003. PRT_WAPI_T pWapiInfo = &padapter->wapiInfo;
  1004. bool bFindMatchPeer = false;
  1005. bool bDrop = false;
  1006. PRT_WAPI_STA_INFO pWapiSta = NULL;
  1007. struct security_priv *psecuritypriv = &padapter->securitypriv;
  1008. WAPI_DATA(WAPI_RX, "rtw_wapi_drop_for_key_absent: ra ", pRA, 6);
  1009. if (psecuritypriv->dot11PrivacyAlgrthm == _SMS4_) {
  1010. if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable))
  1011. return true;
  1012. if (IS_MCAST(pRA)) {
  1013. if (!pWapiInfo->wapiTxMsk.bTxEnable) {
  1014. bDrop = true;
  1015. WAPI_TRACE(WAPI_RX, "rtw_wapi_drop_for_key_absent: multicast key is absent\n");
  1016. return bDrop;
  1017. }
  1018. } else {
  1019. if (!list_empty(&pWapiInfo->wapiSTAUsedList)) {
  1020. list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {
  1021. WAPI_DATA(WAPI_RX, "rtw_wapi_drop_for_key_absent: pWapiSta->PeerMacAddr ", pWapiSta->PeerMacAddr, 6);
  1022. if (_rtw_memcmp(pRA, pWapiSta->PeerMacAddr, 6) == _TRUE) {
  1023. bFindMatchPeer = true;
  1024. break;
  1025. }
  1026. }
  1027. if (bFindMatchPeer) {
  1028. if (!pWapiSta->wapiUsk.bTxEnable) {
  1029. bDrop = true;
  1030. WAPI_TRACE(WAPI_RX, "rtw_wapi_drop_for_key_absent: unicast key is absent\n");
  1031. return bDrop;
  1032. }
  1033. } else {
  1034. bDrop = true;
  1035. WAPI_TRACE(WAPI_RX, "rtw_wapi_drop_for_key_absent: no peer find\n");
  1036. return bDrop;
  1037. }
  1038. } else {
  1039. bDrop = true;
  1040. WAPI_TRACE(WAPI_RX, "rtw_wapi_drop_for_key_absent: no sta exist\n");
  1041. return bDrop;
  1042. }
  1043. }
  1044. } else
  1045. return bDrop;
  1046. return bDrop;
  1047. }
  1048. void rtw_wapi_set_set_encryption(_adapter *padapter, struct ieee_param *param)
  1049. {
  1050. struct security_priv *psecuritypriv = &padapter->securitypriv;
  1051. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  1052. PRT_WAPI_T pWapiInfo = &padapter->wapiInfo;
  1053. PRT_WAPI_STA_INFO pWapiSta;
  1054. u8 WapiASUEPNInitialValueSrc[16] = {0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;
  1055. u8 WapiAEPNInitialValueSrc[16] = {0x37, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;
  1056. u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;
  1057. if (param->u.crypt.set_tx == 1) {
  1058. list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {
  1059. if (_rtw_memcmp(pWapiSta->PeerMacAddr, param->sta_addr, 6)) {
  1060. _rtw_memcpy(pWapiSta->lastTxUnicastPN, WapiASUEPNInitialValueSrc, 16);
  1061. pWapiSta->wapiUsk.bSet = true;
  1062. _rtw_memcpy(pWapiSta->wapiUsk.dataKey, param->u.crypt.key, 16);
  1063. _rtw_memcpy(pWapiSta->wapiUsk.micKey, param->u.crypt.key + 16, 16);
  1064. pWapiSta->wapiUsk.keyId = param->u.crypt.idx ;
  1065. pWapiSta->wapiUsk.bTxEnable = true;
  1066. _rtw_memcpy(pWapiSta->lastRxUnicastPNBEQueue, WapiAEPNInitialValueSrc, 16);
  1067. _rtw_memcpy(pWapiSta->lastRxUnicastPNBKQueue, WapiAEPNInitialValueSrc, 16);
  1068. _rtw_memcpy(pWapiSta->lastRxUnicastPNVIQueue, WapiAEPNInitialValueSrc, 16);
  1069. _rtw_memcpy(pWapiSta->lastRxUnicastPNVOQueue, WapiAEPNInitialValueSrc, 16);
  1070. _rtw_memcpy(pWapiSta->lastRxUnicastPN, WapiAEPNInitialValueSrc, 16);
  1071. pWapiSta->wapiUskUpdate.bTxEnable = false;
  1072. pWapiSta->wapiUskUpdate.bSet = false;
  1073. if (psecuritypriv->sw_encrypt == false || psecuritypriv->sw_decrypt == false) {
  1074. /* set unicast key for ASUE */
  1075. rtw_wapi_set_key(padapter, &pWapiSta->wapiUsk, pWapiSta, false, false);
  1076. }
  1077. }
  1078. }
  1079. } else {
  1080. list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {
  1081. if (_rtw_memcmp(pWapiSta->PeerMacAddr, get_bssid(pmlmepriv), 6)) {
  1082. pWapiSta->wapiMsk.bSet = true;
  1083. _rtw_memcpy(pWapiSta->wapiMsk.dataKey, param->u.crypt.key, 16);
  1084. _rtw_memcpy(pWapiSta->wapiMsk.micKey, param->u.crypt.key + 16, 16);
  1085. pWapiSta->wapiMsk.keyId = param->u.crypt.idx ;
  1086. pWapiSta->wapiMsk.bTxEnable = false;
  1087. if (!pWapiSta->bSetkeyOk)
  1088. pWapiSta->bSetkeyOk = true;
  1089. pWapiSta->bAuthenticateInProgress = false;
  1090. _rtw_memcpy(pWapiSta->lastRxMulticastPN, WapiAEMultiCastPNInitialValueSrc, 16);
  1091. if (psecuritypriv->sw_decrypt == false) {
  1092. /* set rx broadcast key for ASUE */
  1093. rtw_wapi_set_key(padapter, &pWapiSta->wapiMsk, pWapiSta, true, false);
  1094. }
  1095. }
  1096. }
  1097. }
  1098. }
  1099. #endif