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