Path: blob/master/ALFA-W1F1/RTL8814AU/core/rtw_wapi.c
1307 views
/******************************************************************************1*2* Copyright(c) 2016 - 2017 Realtek Corporation.3*4* This program is free software; you can redistribute it and/or modify it5* under the terms of version 2 of the GNU General Public License as6* published by the Free Software Foundation.7*8* This program is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for11* more details.12*13*****************************************************************************/14#ifdef CONFIG_WAPI_SUPPORT1516#include <linux/unistd.h>17#include <linux/etherdevice.h>18#include <drv_types.h>19#include <rtw_wapi.h>202122u32 wapi_debug_component =23/* WAPI_INIT |24* WAPI_API |25* WAPI_TX |26* WAPI_RX | */27WAPI_ERR ; /* always open err flags on */2829void WapiFreeAllStaInfo(_adapter *padapter)30{31PRT_WAPI_T pWapiInfo;32PRT_WAPI_STA_INFO pWapiStaInfo;33PRT_WAPI_BKID pWapiBkid;3435WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__);36pWapiInfo = &padapter->wapiInfo;3738/* Pust to Idle List */39rtw_wapi_return_all_sta_info(padapter);4041/* Sta Info List */42while (!list_empty(&(pWapiInfo->wapiSTAIdleList))) {43pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAIdleList.next, RT_WAPI_STA_INFO, list);44list_del_init(&pWapiStaInfo->list);45}4647/* BKID List */48while (!list_empty(&(pWapiInfo->wapiBKIDIdleList))) {49pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDIdleList.next, RT_WAPI_BKID, list);50list_del_init(&pWapiBkid->list);51}52WAPI_TRACE(WAPI_INIT, "<=========== %s\n", __FUNCTION__);53return;54}5556void WapiSetIE(_adapter *padapter)57{58PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);59/* PRT_WAPI_BKID pWapiBkid; */60u16 protocolVer = 1;61u16 akmCnt = 1;62u16 suiteCnt = 1;63u16 capability = 0;64u8 OUI[3];6566OUI[0] = 0x00;67OUI[1] = 0x14;68OUI[2] = 0x72;6970pWapiInfo->wapiIELength = 0;71/* protocol version */72memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, &protocolVer, 2);73pWapiInfo->wapiIELength += 2;74/* akm */75memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, &akmCnt, 2);76pWapiInfo->wapiIELength += 2;7778if (pWapiInfo->bWapiPSK) {79memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, OUI, 3);80pWapiInfo->wapiIELength += 3;81pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x2;82pWapiInfo->wapiIELength += 1;83} else {84memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, OUI, 3);85pWapiInfo->wapiIELength += 3;86pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1;87pWapiInfo->wapiIELength += 1;88}8990/* usk */91memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, &suiteCnt, 2);92pWapiInfo->wapiIELength += 2;93memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, OUI, 3);94pWapiInfo->wapiIELength += 3;95pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1;96pWapiInfo->wapiIELength += 1;9798/* msk */99memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, OUI, 3);100pWapiInfo->wapiIELength += 3;101pWapiInfo->wapiIE[pWapiInfo->wapiIELength] = 0x1;102pWapiInfo->wapiIELength += 1;103104/* Capbility */105memcpy(pWapiInfo->wapiIE + pWapiInfo->wapiIELength, &capability, 2);106pWapiInfo->wapiIELength += 2;107}108109110/* PN1 > PN2, return 1,111* else return 0.112*/113u32 WapiComparePN(u8 *PN1, u8 *PN2)114{115char i;116117if ((NULL == PN1) || (NULL == PN2))118return 1;119120/* overflow case */121if ((PN2[15] - PN1[15]) & 0x80)122return 1;123124for (i = 16; i > 0; i--) {125if (PN1[i - 1] == PN2[i - 1])126continue;127else if (PN1[i - 1] > PN2[i - 1])128return 1;129else130return 0;131}132133return 0;134}135136u8137WapiGetEntryForCamWrite(_adapter *padapter, u8 *pMacAddr, u8 KID, BOOLEAN IsMsk)138{139PRT_WAPI_T pWapiInfo = NULL;140/* PRT_WAPI_CAM_ENTRY pEntry=NULL; */141u8 i = 0;142u8 ret = 0xff;143144WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);145146pWapiInfo = &padapter->wapiInfo;147148/* exist? */149for (i = 0; i < WAPI_CAM_ENTRY_NUM; i++) {150if (pWapiInfo->wapiCamEntry[i].IsUsed151&& (_rtw_memcmp(pMacAddr, pWapiInfo->wapiCamEntry[i].PeerMacAddr, ETH_ALEN) == _TRUE)152&& pWapiInfo->wapiCamEntry[i].keyidx == KID153&& pWapiInfo->wapiCamEntry[i].type == IsMsk) {154ret = pWapiInfo->wapiCamEntry[i].entry_idx; /* cover it */155break;156}157}158159if (i == WAPI_CAM_ENTRY_NUM) { /* not found */160for (i = 0; i < WAPI_CAM_ENTRY_NUM; i++) {161if (pWapiInfo->wapiCamEntry[i].IsUsed == 0) {162pWapiInfo->wapiCamEntry[i].IsUsed = 1;163pWapiInfo->wapiCamEntry[i].type = IsMsk;164pWapiInfo->wapiCamEntry[i].keyidx = KID;165_rtw_memcpy(pWapiInfo->wapiCamEntry[i].PeerMacAddr, pMacAddr, ETH_ALEN);166ret = pWapiInfo->wapiCamEntry[i].entry_idx;167break;168}169}170}171172WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__);173return ret;174175/*176if(RTIsListEmpty(&pWapiInfo->wapiCamIdleList)) {177return 0;178}179180pEntry = (PRT_WAPI_CAM_ENTRY)RTRemoveHeadList(&pWapiInfo->wapiCamIdleList);181RTInsertTailList(&pWapiInfo->wapiCamUsedList, &pEntry->list);182183184return pEntry->entry_idx;*/185}186187u8 WapiGetEntryForCamClear(_adapter *padapter, u8 *pPeerMac, u8 keyid, u8 IsMsk)188{189PRT_WAPI_T pWapiInfo = NULL;190u8 i = 0;191192WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);193194pWapiInfo = &padapter->wapiInfo;195196for (i = 0; i < WAPI_CAM_ENTRY_NUM; i++) {197if (pWapiInfo->wapiCamEntry[i].IsUsed198&& (_rtw_memcmp(pPeerMac, pWapiInfo->wapiCamEntry[i].PeerMacAddr, ETH_ALEN) == _TRUE)199&& pWapiInfo->wapiCamEntry[i].keyidx == keyid200&& pWapiInfo->wapiCamEntry[i].type == IsMsk) {201pWapiInfo->wapiCamEntry[i].IsUsed = 0;202pWapiInfo->wapiCamEntry[i].keyidx = 2;203_rtw_memset(pWapiInfo->wapiCamEntry[i].PeerMacAddr, 0, ETH_ALEN);204205WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__);206return pWapiInfo->wapiCamEntry[i].entry_idx;207}208}209210WAPI_TRACE(WAPI_API, "<====WapiGetReturnCamEntry(), No this cam entry.\n");211return 0xff;212/*213if(RTIsListEmpty(&pWapiInfo->wapiCamUsedList)) {214return FALSE;215}216217pList = &pWapiInfo->wapiCamUsedList;218while(pList->Flink != &pWapiInfo->wapiCamUsedList)219{220pEntry = (PRT_WAPI_CAM_ENTRY)pList->Flink;221if(PlatformCompareMemory(pPeerMac,pEntry->PeerMacAddr, ETHER_ADDRLEN)== 0222&& keyid == pEntry->keyidx)223{224RTRemoveEntryList(pList);225RTInsertHeadList(&pWapiInfo->wapiCamIdleList, pList);226return pEntry->entry_idx;227}228pList = pList->Flink;229}230231return 0;232*/233}234235void236WapiResetAllCamEntry(_adapter *padapter)237{238PRT_WAPI_T pWapiInfo;239int i;240241WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);242243pWapiInfo = &padapter->wapiInfo;244245for (i = 0; i < WAPI_CAM_ENTRY_NUM; i++) {246_rtw_memset(pWapiInfo->wapiCamEntry[i].PeerMacAddr, 0, ETH_ALEN);247pWapiInfo->wapiCamEntry[i].IsUsed = 0;248pWapiInfo->wapiCamEntry[i].keyidx = 2; /* invalid */249pWapiInfo->wapiCamEntry[i].entry_idx = 4 + i * 2;250}251252WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__);253254return;255}256257u8 WapiWriteOneCamEntry(258_adapter *padapter,259u8 *pMacAddr,260u8 KeyId,261u8 EntryId,262u8 EncAlg,263u8 bGroupKey,264u8 *pKey265)266{267u8 retVal = 0;268u16 usConfig = 0;269270WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);271272if (EntryId >= 32) {273WAPI_TRACE(WAPI_ERR, "<=== CamAddOneEntry(): ulKeyId exceed!\n");274return retVal;275}276277usConfig = usConfig | (0x01 << 15) | ((u16)(EncAlg) << 2) | (KeyId);278279if (EncAlg == _SMS4_) {280if (bGroupKey == 1)281usConfig |= (0x01 << 6);282if ((EntryId % 2) == 1) /* ==0 sec key; == 1mic key */283usConfig |= (0x01 << 5);284}285286write_cam(padapter, EntryId, usConfig, pMacAddr, pKey);287288WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);289return 1;290}291292void rtw_wapi_init(_adapter *padapter)293{294PRT_WAPI_T pWapiInfo;295int i;296297WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__);298RT_ASSERT_RET(padapter);299300if (!padapter->WapiSupport) {301WAPI_TRACE(WAPI_INIT, "<========== %s, WAPI not supported!\n", __FUNCTION__);302return;303}304305pWapiInfo = &padapter->wapiInfo;306pWapiInfo->bWapiEnable = false;307308/* Init BKID List */309INIT_LIST_HEAD(&pWapiInfo->wapiBKIDIdleList);310INIT_LIST_HEAD(&pWapiInfo->wapiBKIDStoreList);311for (i = 0; i < WAPI_MAX_BKID_NUM; i++)312list_add_tail(&pWapiInfo->wapiBKID[i].list, &pWapiInfo->wapiBKIDIdleList);313314/* Init STA List */315INIT_LIST_HEAD(&pWapiInfo->wapiSTAIdleList);316INIT_LIST_HEAD(&pWapiInfo->wapiSTAUsedList);317for (i = 0; i < WAPI_MAX_STAINFO_NUM; i++)318list_add_tail(&pWapiInfo->wapiSta[i].list, &pWapiInfo->wapiSTAIdleList);319320for (i = 0; i < WAPI_CAM_ENTRY_NUM; i++) {321pWapiInfo->wapiCamEntry[i].IsUsed = 0;322pWapiInfo->wapiCamEntry[i].keyidx = 2; /* invalid */323pWapiInfo->wapiCamEntry[i].entry_idx = 4 + i * 2;324}325326WAPI_TRACE(WAPI_INIT, "<========== %s\n", __FUNCTION__);327}328329void rtw_wapi_free(_adapter *padapter)330{331WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__);332RT_ASSERT_RET(padapter);333334if (!padapter->WapiSupport) {335WAPI_TRACE(WAPI_INIT, "<========== %s, WAPI not supported!\n", __FUNCTION__);336return;337}338339WapiFreeAllStaInfo(padapter);340341WAPI_TRACE(WAPI_INIT, "<========== %s\n", __FUNCTION__);342}343344void rtw_wapi_disable_tx(_adapter *padapter)345{346WAPI_TRACE(WAPI_INIT, "===========> %s\n", __FUNCTION__);347RT_ASSERT_RET(padapter);348349if (!padapter->WapiSupport) {350WAPI_TRACE(WAPI_INIT, "<========== %s, WAPI not supported!\n", __FUNCTION__);351return;352}353354padapter->wapiInfo.wapiTxMsk.bTxEnable = false;355padapter->wapiInfo.wapiTxMsk.bSet = false;356357WAPI_TRACE(WAPI_INIT, "<========== %s\n", __FUNCTION__);358}359360u8 rtw_wapi_is_wai_packet(_adapter *padapter, u8 *pkt_data)361{362PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);363struct mlme_priv *pmlmepriv = &padapter->mlmepriv;364struct security_priv *psecuritypriv = &padapter->securitypriv;365PRT_WAPI_STA_INFO pWapiSta = NULL;366u8 WaiPkt = 0, *pTaddr, bFind = false;367u8 Offset_TypeWAI = 0 ; /* (mac header len + llc length) */368369WAPI_TRACE(WAPI_TX | WAPI_RX, "===========> %s\n", __FUNCTION__);370371if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) {372WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__);373return 0;374}375376Offset_TypeWAI = 24 + 6 ;377378/* YJ,add,091103. Data frame may also have skb->data[30]=0x88 and skb->data[31]=0xb4. */379if ((pkt_data[1] & 0x40) != 0) {380/* RTW_INFO("data is privacy\n"); */381return 0;382}383384pTaddr = get_addr2_ptr(pkt_data);385if (list_empty(&pWapiInfo->wapiSTAUsedList))386bFind = false;387else {388list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {389if (_rtw_memcmp(pTaddr, pWapiSta->PeerMacAddr, 6) == _TRUE) {390bFind = true;391break;392}393}394}395396WAPI_TRACE(WAPI_TX | WAPI_RX, "%s: bFind=%d pTaddr="MAC_FMT"\n", __FUNCTION__, bFind, MAC_ARG(pTaddr));397398if (pkt_data[0] == WIFI_QOS_DATA_TYPE)399Offset_TypeWAI += 2;400401/* 88b4? */402if ((pkt_data[Offset_TypeWAI] == 0x88) && (pkt_data[Offset_TypeWAI + 1] == 0xb4)) {403WaiPkt = pkt_data[Offset_TypeWAI + 5];404405psecuritypriv->hw_decrypted = _TRUE;406} else407WAPI_TRACE(WAPI_TX | WAPI_RX, "%s(): non wai packet\n", __FUNCTION__);408409WAPI_TRACE(WAPI_TX | WAPI_RX, "%s(): Recvd WAI frame. IsWAIPkt(%d)\n", __FUNCTION__, WaiPkt);410411return WaiPkt;412}413414415void rtw_wapi_update_info(_adapter *padapter, union recv_frame *precv_frame)416{417PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);418struct recv_frame_hdr *precv_hdr;419u8 *ptr;420u8 *pTA;421u8 *pRecvPN;422423424WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__);425426if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) {427WAPI_TRACE(WAPI_RX, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__);428return;429}430431precv_hdr = &precv_frame->u.hdr;432ptr = precv_hdr->rx_data;433434if (precv_hdr->attrib.qos == 1)435precv_hdr->UserPriority = GetTid(ptr);436else437precv_hdr->UserPriority = 0;438439pTA = get_addr2_ptr(ptr);440_rtw_memcpy((u8 *)precv_hdr->WapiSrcAddr, pTA, 6);441pRecvPN = ptr + precv_hdr->attrib.hdrlen + 2;442_rtw_memcpy((u8 *)precv_hdr->WapiTempPN, pRecvPN, 16);443444WAPI_TRACE(WAPI_RX, "<========== %s\n", __FUNCTION__);445}446447/****************************************************************************448TRUE-----------------Drop449FALSE---------------- handle450add to support WAPI to N-mode451*****************************************************************************/452u8 rtw_wapi_check_for_drop(453_adapter *padapter,454union recv_frame *precv_frame,455u8 *ehdr_ops456)457{458PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);459u8 *pLastRecvPN = NULL;460u8 bFind = false;461PRT_WAPI_STA_INFO pWapiSta = NULL;462u8 bDrop = false;463struct recv_frame_hdr *precv_hdr = &precv_frame->u.hdr;464u8 WapiAEPNInitialValueSrc[16] = {0x37, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;465u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;466u8 *ptr = ehdr_ops;467int i;468469WAPI_TRACE(WAPI_RX, "===========> %s\n", __FUNCTION__);470471if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) {472WAPI_TRACE(WAPI_RX, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__);473return false;474}475476if (precv_hdr->bIsWaiPacket != 0) {477if (precv_hdr->bIsWaiPacket == 0x8) {478479RTW_INFO("rtw_wapi_check_for_drop: dump packet\n");480for (i = 0; i < 50; i++) {481RTW_INFO("%02X ", ptr[i]);482if ((i + 1) % 8 == 0)483RTW_INFO("\n");484}485RTW_INFO("\n rtw_wapi_check_for_drop: dump packet\n");486487for (i = 0; i < 16; i++) {488if (ptr[i + 27] != 0)489break;490}491492if (i == 16) {493WAPI_TRACE(WAPI_RX, "rtw_wapi_check_for_drop: drop with zero BKID\n");494return true;495} else496return false;497} else498return false;499}500501if (list_empty(&pWapiInfo->wapiSTAUsedList))502bFind = false;503else {504list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {505if (_rtw_memcmp(precv_hdr->WapiSrcAddr, pWapiSta->PeerMacAddr, ETH_ALEN) == _TRUE) {506bFind = true;507break;508}509}510}511WAPI_TRACE(WAPI_RX, "%s: bFind=%d prxb->WapiSrcAddr="MAC_FMT"\n", __FUNCTION__, bFind, MAC_ARG(precv_hdr->WapiSrcAddr));512513if (bFind) {514if (IS_MCAST(precv_hdr->attrib.ra)) {515WAPI_TRACE(WAPI_RX, "rtw_wapi_check_for_drop: multicast case\n");516pLastRecvPN = pWapiSta->lastRxMulticastPN;517} else {518WAPI_TRACE(WAPI_RX, "rtw_wapi_check_for_drop: unicast case\n");519switch (precv_hdr->UserPriority) {520case 0:521case 3:522pLastRecvPN = pWapiSta->lastRxUnicastPNBEQueue;523break;524case 1:525case 2:526pLastRecvPN = pWapiSta->lastRxUnicastPNBKQueue;527break;528case 4:529case 5:530pLastRecvPN = pWapiSta->lastRxUnicastPNVIQueue;531break;532case 6:533case 7:534pLastRecvPN = pWapiSta->lastRxUnicastPNVOQueue;535break;536default:537WAPI_TRACE(WAPI_ERR, "%s: Unknown TID\n", __FUNCTION__);538break;539}540}541542if (!WapiComparePN(precv_hdr->WapiTempPN, pLastRecvPN)) {543WAPI_TRACE(WAPI_RX, "%s: Equal PN!!\n", __FUNCTION__);544if (IS_MCAST(precv_hdr->attrib.ra))545_rtw_memcpy(pLastRecvPN, WapiAEMultiCastPNInitialValueSrc, 16);546else547_rtw_memcpy(pLastRecvPN, WapiAEPNInitialValueSrc, 16);548bDrop = true;549} else550_rtw_memcpy(pLastRecvPN, precv_hdr->WapiTempPN, 16);551}552553WAPI_TRACE(WAPI_RX, "<========== %s\n", __FUNCTION__);554return bDrop;555}556557void rtw_build_probe_resp_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib)558{559PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);560u8 WapiIELength = 0;561562WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__);563564if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) {565WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported!\n", __FUNCTION__);566return;567}568569WapiSetIE(padapter);570WapiIELength = pWapiInfo->wapiIELength;571pframe[0] = _WAPI_IE_;572pframe[1] = WapiIELength;573_rtw_memcpy(pframe + 2, pWapiInfo->wapiIE, WapiIELength);574pframe += WapiIELength + 2;575pattrib->pktlen += WapiIELength + 2;576577WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__);578}579580void rtw_build_beacon_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib)581{582PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);583u8 WapiIELength = 0;584WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__);585586if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) {587WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported!\n", __FUNCTION__);588return;589}590591WapiSetIE(padapter);592WapiIELength = pWapiInfo->wapiIELength;593pframe[0] = _WAPI_IE_;594pframe[1] = WapiIELength;595_rtw_memcpy(pframe + 2, pWapiInfo->wapiIE, WapiIELength);596pframe += WapiIELength + 2;597pattrib->pktlen += WapiIELength + 2;598599WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__);600}601602void rtw_build_assoc_req_wapi_ie(_adapter *padapter, unsigned char *pframe, struct pkt_attrib *pattrib)603{604PRT_WAPI_BKID pWapiBKID;605u16 bkidNum;606PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);607u8 WapiIELength = 0;608609WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__);610611if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) {612WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported!\n", __FUNCTION__);613return;614}615616WapiSetIE(padapter);617WapiIELength = pWapiInfo->wapiIELength;618bkidNum = 0;619if (!list_empty(&(pWapiInfo->wapiBKIDStoreList))) {620list_for_each_entry(pWapiBKID, &pWapiInfo->wapiBKIDStoreList, list) {621bkidNum++;622_rtw_memcpy(pWapiInfo->wapiIE + WapiIELength + 2, pWapiBKID->bkid, 16);623WapiIELength += 16;624}625}626_rtw_memcpy(pWapiInfo->wapiIE + WapiIELength, &bkidNum, 2);627WapiIELength += 2;628629pframe[0] = _WAPI_IE_;630pframe[1] = WapiIELength;631_rtw_memcpy(pframe + 2, pWapiInfo->wapiIE, WapiIELength);632pframe += WapiIELength + 2;633pattrib->pktlen += WapiIELength + 2;634WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__);635}636637void rtw_wapi_on_assoc_ok(_adapter *padapter, PNDIS_802_11_VARIABLE_IEs pIE)638{639PRT_WAPI_T pWapiInfo = &(padapter->wapiInfo);640PRT_WAPI_STA_INFO pWapiSta;641u8 WapiAEPNInitialValueSrc[16] = {0x37, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;642/* u8 WapiASUEPNInitialValueSrc[16] = {0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C,0x36,0x5C} ; */643u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;644645WAPI_TRACE(WAPI_MLME, "===========> %s\n", __FUNCTION__);646647if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) {648WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__);649return;650}651652pWapiSta = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAIdleList.next, RT_WAPI_STA_INFO, list);653list_del_init(&pWapiSta->list);654list_add_tail(&pWapiSta->list, &pWapiInfo->wapiSTAUsedList);655_rtw_memcpy(pWapiSta->PeerMacAddr, padapter->mlmeextpriv.mlmext_info.network.MacAddress, 6);656_rtw_memcpy(pWapiSta->lastRxMulticastPN, WapiAEMultiCastPNInitialValueSrc, 16);657_rtw_memcpy(pWapiSta->lastRxUnicastPN, WapiAEPNInitialValueSrc, 16);658659/* For chenk PN error with Qos Data after s3: add by ylb 20111114 */660_rtw_memcpy(pWapiSta->lastRxUnicastPNBEQueue, WapiAEPNInitialValueSrc, 16);661_rtw_memcpy(pWapiSta->lastRxUnicastPNBKQueue, WapiAEPNInitialValueSrc, 16);662_rtw_memcpy(pWapiSta->lastRxUnicastPNVIQueue, WapiAEPNInitialValueSrc, 16);663_rtw_memcpy(pWapiSta->lastRxUnicastPNVOQueue, WapiAEPNInitialValueSrc, 16);664665WAPI_TRACE(WAPI_MLME, "<========== %s\n", __FUNCTION__);666}667668669void rtw_wapi_return_one_sta_info(_adapter *padapter, u8 *MacAddr)670{671PRT_WAPI_T pWapiInfo;672PRT_WAPI_STA_INFO pWapiStaInfo = NULL;673PRT_WAPI_BKID pWapiBkid = NULL;674struct mlme_priv *pmlmepriv = &padapter->mlmepriv;675676pWapiInfo = &padapter->wapiInfo;677678WAPI_TRACE(WAPI_API, "==========> %s\n", __FUNCTION__);679680if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) {681WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__);682return;683}684685if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {686while (!list_empty(&(pWapiInfo->wapiBKIDStoreList))) {687pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDStoreList.next, RT_WAPI_BKID, list);688list_del_init(&pWapiBkid->list);689_rtw_memset(pWapiBkid->bkid, 0, 16);690list_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDIdleList);691}692}693694695WAPI_TRACE(WAPI_API, " %s: after clear bkid\n", __FUNCTION__);696697698/* Remove STA info */699if (list_empty(&(pWapiInfo->wapiSTAUsedList))) {700WAPI_TRACE(WAPI_API, " %s: wapiSTAUsedList is null\n", __FUNCTION__);701return;702} else {703704WAPI_TRACE(WAPI_API, " %s: wapiSTAUsedList is not null\n", __FUNCTION__);705#if 0706pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry((pWapiInfo->wapiSTAUsedList.next), RT_WAPI_STA_INFO, list);707708list_for_each_entry(pWapiStaInfo, &(pWapiInfo->wapiSTAUsedList), list) {709710RTW_INFO("MAC Addr %02x-%02x-%02x-%02x-%02x-%02x\n", MacAddr[0], MacAddr[1], MacAddr[2], MacAddr[3], MacAddr[4], MacAddr[5]);711712713RTW_INFO("peer Addr %02x-%02x-%02x-%02x-%02x-%02x\n", pWapiStaInfo->PeerMacAddr[0], pWapiStaInfo->PeerMacAddr[1], pWapiStaInfo->PeerMacAddr[2], pWapiStaInfo->PeerMacAddr[3],714pWapiStaInfo->PeerMacAddr[4], pWapiStaInfo->PeerMacAddr[5]);715716if (pWapiStaInfo == NULL) {717WAPI_TRACE(WAPI_API, " %s: pWapiStaInfo == NULL Case\n", __FUNCTION__);718return;719}720721if (pWapiStaInfo->PeerMacAddr == NULL) {722WAPI_TRACE(WAPI_API, " %s: pWapiStaInfo->PeerMacAddr == NULL Case\n", __FUNCTION__);723return;724}725726if (MacAddr == NULL) {727WAPI_TRACE(WAPI_API, " %s: MacAddr == NULL Case\n", __FUNCTION__);728return;729}730731if (_rtw_memcmp(pWapiStaInfo->PeerMacAddr, MacAddr, ETH_ALEN) == _TRUE) {732pWapiStaInfo->bAuthenticateInProgress = false;733pWapiStaInfo->bSetkeyOk = false;734_rtw_memset(pWapiStaInfo->PeerMacAddr, 0, ETH_ALEN);735list_del_init(&pWapiStaInfo->list);736list_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList);737break;738}739740}741#endif742743while (!list_empty(&(pWapiInfo->wapiSTAUsedList))) {744pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAUsedList.next, RT_WAPI_STA_INFO, list);745746RTW_INFO("peer Addr %02x-%02x-%02x-%02x-%02x-%02x\n", pWapiStaInfo->PeerMacAddr[0], pWapiStaInfo->PeerMacAddr[1], pWapiStaInfo->PeerMacAddr[2], pWapiStaInfo->PeerMacAddr[3],747pWapiStaInfo->PeerMacAddr[4], pWapiStaInfo->PeerMacAddr[5]);748749list_del_init(&pWapiStaInfo->list);750memset(pWapiStaInfo->PeerMacAddr, 0, ETH_ALEN);751pWapiStaInfo->bSetkeyOk = 0;752list_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList);753}754755}756757WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__);758return;759}760761void rtw_wapi_return_all_sta_info(_adapter *padapter)762{763PRT_WAPI_T pWapiInfo;764PRT_WAPI_STA_INFO pWapiStaInfo;765PRT_WAPI_BKID pWapiBkid;766WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);767768pWapiInfo = &padapter->wapiInfo;769770if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable)) {771WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__);772return;773}774775/* Sta Info List */776while (!list_empty(&(pWapiInfo->wapiSTAUsedList))) {777pWapiStaInfo = (PRT_WAPI_STA_INFO)list_entry(pWapiInfo->wapiSTAUsedList.next, RT_WAPI_STA_INFO, list);778list_del_init(&pWapiStaInfo->list);779memset(pWapiStaInfo->PeerMacAddr, 0, ETH_ALEN);780pWapiStaInfo->bSetkeyOk = 0;781list_add_tail(&pWapiStaInfo->list, &pWapiInfo->wapiSTAIdleList);782}783784/* BKID List */785while (!list_empty(&(pWapiInfo->wapiBKIDStoreList))) {786pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDStoreList.next, RT_WAPI_BKID, list);787list_del_init(&pWapiBkid->list);788memset(pWapiBkid->bkid, 0, 16);789list_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDIdleList);790}791WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__);792}793794void CAM_empty_entry(795PADAPTER Adapter,796u8 ucIndex797)798{799rtw_hal_set_hwreg(Adapter, HW_VAR_CAM_EMPTY_ENTRY, (u8 *)(&ucIndex));800}801802void rtw_wapi_clear_cam_entry(_adapter *padapter, u8 *pMacAddr)803{804u8 UcIndex = 0;805806WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);807808if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) {809WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__);810return;811}812813UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 0, 0);814if (UcIndex != 0xff) {815/* CAM_mark_invalid(Adapter, UcIndex); */816CAM_empty_entry(padapter, UcIndex);817}818819UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 1, 0);820if (UcIndex != 0xff) {821/* CAM_mark_invalid(Adapter, UcIndex); */822CAM_empty_entry(padapter, UcIndex);823}824825UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 0, 1);826if (UcIndex != 0xff) {827/* CAM_mark_invalid(Adapter, UcIndex); */828CAM_empty_entry(padapter, UcIndex);829}830831UcIndex = WapiGetEntryForCamClear(padapter, pMacAddr, 1, 1);832if (UcIndex != 0xff) {833/* CAM_mark_invalid(padapter, UcIndex); */834CAM_empty_entry(padapter, UcIndex);835}836837WAPI_TRACE(WAPI_API, "<========== %s\n", __FUNCTION__);838}839840void rtw_wapi_clear_all_cam_entry(_adapter *padapter)841{842WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);843844if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) {845WAPI_TRACE(WAPI_MLME, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__);846return;847}848849invalidate_cam_all(padapter); /* is this ok? */850WapiResetAllCamEntry(padapter);851852WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);853}854855void rtw_wapi_set_key(_adapter *padapter, RT_WAPI_KEY *pWapiKey, RT_WAPI_STA_INFO *pWapiSta, u8 bGroupKey, u8 bUseDefaultKey)856{857PRT_WAPI_T pWapiInfo = &padapter->wapiInfo;858u8 *pMacAddr = pWapiSta->PeerMacAddr;859u32 EntryId = 0;860BOOLEAN IsPairWise = false ;861u8 EncAlgo;862863WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);864865if ((!padapter->WapiSupport) || (!padapter->wapiInfo.bWapiEnable)) {866WAPI_TRACE(WAPI_API, "<========== %s, WAPI not supported or not enabled!\n", __FUNCTION__);867return;868}869870EncAlgo = _SMS4_;871872/* For Tx bc/mc pkt,use defualt key entry */873if (bUseDefaultKey) {874/* when WAPI update key, keyid will be 0 or 1 by turns. */875if (pWapiKey->keyId == 0)876EntryId = 0;877else878EntryId = 2;879} else {880/* tx/rx unicast pkt, or rx broadcast, find the key entry by peer's MacAddr */881EntryId = WapiGetEntryForCamWrite(padapter, pMacAddr, pWapiKey->keyId, bGroupKey);882}883884if (EntryId == 0xff) {885WAPI_TRACE(WAPI_API, "===>No entry for WAPI setkey! !!\n");886return;887}888889/* EntryId is also used to diff Sec key and Mic key */890/* Sec Key */891WapiWriteOneCamEntry(padapter,892pMacAddr,893pWapiKey->keyId, /* keyid */894EntryId, /* entry */895EncAlgo, /* type */896bGroupKey, /* pairwise or group key */897pWapiKey->dataKey);898/* MIC key */899WapiWriteOneCamEntry(padapter,900pMacAddr,901pWapiKey->keyId, /* keyid */902EntryId + 1, /* entry */903EncAlgo, /* type */904bGroupKey, /* pairwise or group key */905pWapiKey->micKey);906907WAPI_TRACE(WAPI_API, "Set Wapi Key :KeyId:%d,EntryId:%d,PairwiseKey:%d.\n", pWapiKey->keyId, EntryId, !bGroupKey);908WAPI_TRACE(WAPI_API, "===========> %s\n", __FUNCTION__);909910}911912#if 0913/* YJ,test,091013 */914void wapi_test_set_key(struct _adapter *padapter, u8 *buf)915{916/*Data: keyType(1) + bTxEnable(1) + bAuthenticator(1) + bUpdate(1) + PeerAddr(6) + DataKey(16) + MicKey(16) + KeyId(1)*/917PRT_WAPI_T pWapiInfo = &padapter->wapiInfo;918PRT_WAPI_BKID pWapiBkid;919PRT_WAPI_STA_INFO pWapiSta;920u8 data[43];921bool bTxEnable;922bool bUpdate;923bool bAuthenticator;924u8 PeerAddr[6];925u8 WapiAEPNInitialValueSrc[16] = {0x37, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;926u8 WapiASUEPNInitialValueSrc[16] = {0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;927u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;928929WAPI_TRACE(WAPI_INIT, "===========>%s\n", __FUNCTION__);930931if (!padapter->WapiSupport)932return;933934copy_from_user(data, buf, 43);935bTxEnable = data[1];936bAuthenticator = data[2];937bUpdate = data[3];938memcpy(PeerAddr, data + 4, 6);939940if (data[0] == 0x3) {941if (!list_empty(&(pWapiInfo->wapiBKIDIdleList))) {942pWapiBkid = (PRT_WAPI_BKID)list_entry(pWapiInfo->wapiBKIDIdleList.next, RT_WAPI_BKID, list);943list_del_init(&pWapiBkid->list);944memcpy(pWapiBkid->bkid, data + 10, 16);945WAPI_DATA(WAPI_INIT, "SetKey - BKID", pWapiBkid->bkid, 16);946list_add_tail(&pWapiBkid->list, &pWapiInfo->wapiBKIDStoreList);947}948} else {949list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {950if (!memcmp(pWapiSta->PeerMacAddr, PeerAddr, 6)) {951pWapiSta->bAuthenticatorInUpdata = false;952switch (data[0]) {953case 1: /* usk */954if (bAuthenticator) { /* authenticator */955memcpy(pWapiSta->lastTxUnicastPN, WapiAEPNInitialValueSrc, 16);956if (!bUpdate) { /* first */957WAPI_TRACE(WAPI_INIT, "AE fisrt set usk\n");958pWapiSta->wapiUsk.bSet = true;959memcpy(pWapiSta->wapiUsk.dataKey, data + 10, 16);960memcpy(pWapiSta->wapiUsk.micKey, data + 26, 16);961pWapiSta->wapiUsk.keyId = *(data + 42);962pWapiSta->wapiUsk.bTxEnable = true;963WAPI_DATA(WAPI_INIT, "SetKey - AE USK Data Key", pWapiSta->wapiUsk.dataKey, 16);964WAPI_DATA(WAPI_INIT, "SetKey - AE USK Mic Key", pWapiSta->wapiUsk.micKey, 16);965} else { /* update */966WAPI_TRACE(WAPI_INIT, "AE update usk\n");967pWapiSta->wapiUskUpdate.bSet = true;968pWapiSta->bAuthenticatorInUpdata = true;969memcpy(pWapiSta->wapiUskUpdate.dataKey, data + 10, 16);970memcpy(pWapiSta->wapiUskUpdate.micKey, data + 26, 16);971memcpy(pWapiSta->lastRxUnicastPNBEQueue, WapiASUEPNInitialValueSrc, 16);972memcpy(pWapiSta->lastRxUnicastPNBKQueue, WapiASUEPNInitialValueSrc, 16);973memcpy(pWapiSta->lastRxUnicastPNVIQueue, WapiASUEPNInitialValueSrc, 16);974memcpy(pWapiSta->lastRxUnicastPNVOQueue, WapiASUEPNInitialValueSrc, 16);975memcpy(pWapiSta->lastRxUnicastPN, WapiASUEPNInitialValueSrc, 16);976pWapiSta->wapiUskUpdate.keyId = *(data + 42);977pWapiSta->wapiUskUpdate.bTxEnable = true;978}979} else {980if (!bUpdate) {981WAPI_TRACE(WAPI_INIT, "ASUE fisrt set usk\n");982if (bTxEnable) {983pWapiSta->wapiUsk.bTxEnable = true;984memcpy(pWapiSta->lastTxUnicastPN, WapiASUEPNInitialValueSrc, 16);985} else {986pWapiSta->wapiUsk.bSet = true;987memcpy(pWapiSta->wapiUsk.dataKey, data + 10, 16);988memcpy(pWapiSta->wapiUsk.micKey, data + 26, 16);989pWapiSta->wapiUsk.keyId = *(data + 42);990pWapiSta->wapiUsk.bTxEnable = false;991}992} else {993WAPI_TRACE(WAPI_INIT, "ASUE update usk\n");994if (bTxEnable) {995pWapiSta->wapiUskUpdate.bTxEnable = true;996if (pWapiSta->wapiUskUpdate.bSet) {997memcpy(pWapiSta->wapiUsk.dataKey, pWapiSta->wapiUskUpdate.dataKey, 16);998memcpy(pWapiSta->wapiUsk.micKey, pWapiSta->wapiUskUpdate.micKey, 16);999pWapiSta->wapiUsk.keyId = pWapiSta->wapiUskUpdate.keyId;1000memcpy(pWapiSta->lastRxUnicastPNBEQueue, WapiASUEPNInitialValueSrc, 16);1001memcpy(pWapiSta->lastRxUnicastPNBKQueue, WapiASUEPNInitialValueSrc, 16);1002memcpy(pWapiSta->lastRxUnicastPNVIQueue, WapiASUEPNInitialValueSrc, 16);1003memcpy(pWapiSta->lastRxUnicastPNVOQueue, WapiASUEPNInitialValueSrc, 16);1004memcpy(pWapiSta->lastRxUnicastPN, WapiASUEPNInitialValueSrc, 16);1005pWapiSta->wapiUskUpdate.bTxEnable = false;1006pWapiSta->wapiUskUpdate.bSet = false;1007}1008memcpy(pWapiSta->lastTxUnicastPN, WapiASUEPNInitialValueSrc, 16);1009} else {1010pWapiSta->wapiUskUpdate.bSet = true;1011memcpy(pWapiSta->wapiUskUpdate.dataKey, data + 10, 16);1012memcpy(pWapiSta->wapiUskUpdate.micKey, data + 26, 16);1013pWapiSta->wapiUskUpdate.keyId = *(data + 42);1014pWapiSta->wapiUskUpdate.bTxEnable = false;1015}1016}1017}1018break;1019case 2: /* msk */1020if (bAuthenticator) { /* authenticator */1021pWapiInfo->wapiTxMsk.bSet = true;1022memcpy(pWapiInfo->wapiTxMsk.dataKey, data + 10, 16);1023memcpy(pWapiInfo->wapiTxMsk.micKey, data + 26, 16);1024pWapiInfo->wapiTxMsk.keyId = *(data + 42);1025pWapiInfo->wapiTxMsk.bTxEnable = true;1026memcpy(pWapiInfo->lastTxMulticastPN, WapiAEMultiCastPNInitialValueSrc, 16);10271028if (!bUpdate) { /* first */1029WAPI_TRACE(WAPI_INIT, "AE fisrt set msk\n");1030if (!pWapiSta->bSetkeyOk)1031pWapiSta->bSetkeyOk = true;1032pWapiInfo->bFirstAuthentiateInProgress = false;1033} else /* update */1034WAPI_TRACE(WAPI_INIT, "AE update msk\n");10351036WAPI_DATA(WAPI_INIT, "SetKey - AE MSK Data Key", pWapiInfo->wapiTxMsk.dataKey, 16);1037WAPI_DATA(WAPI_INIT, "SetKey - AE MSK Mic Key", pWapiInfo->wapiTxMsk.micKey, 16);1038} else {1039if (!bUpdate) {1040WAPI_TRACE(WAPI_INIT, "ASUE fisrt set msk\n");1041pWapiSta->wapiMsk.bSet = true;1042memcpy(pWapiSta->wapiMsk.dataKey, data + 10, 16);1043memcpy(pWapiSta->wapiMsk.micKey, data + 26, 16);1044pWapiSta->wapiMsk.keyId = *(data + 42);1045pWapiSta->wapiMsk.bTxEnable = false;1046if (!pWapiSta->bSetkeyOk)1047pWapiSta->bSetkeyOk = true;1048pWapiInfo->bFirstAuthentiateInProgress = false;1049WAPI_DATA(WAPI_INIT, "SetKey - ASUE MSK Data Key", pWapiSta->wapiMsk.dataKey, 16);1050WAPI_DATA(WAPI_INIT, "SetKey - ASUE MSK Mic Key", pWapiSta->wapiMsk.micKey, 16);1051} else {1052WAPI_TRACE(WAPI_INIT, "ASUE update msk\n");1053pWapiSta->wapiMskUpdate.bSet = true;1054memcpy(pWapiSta->wapiMskUpdate.dataKey, data + 10, 16);1055memcpy(pWapiSta->wapiMskUpdate.micKey, data + 26, 16);1056pWapiSta->wapiMskUpdate.keyId = *(data + 42);1057pWapiSta->wapiMskUpdate.bTxEnable = false;1058}1059}1060break;1061default:1062WAPI_TRACE(WAPI_ERR, "Unknown Flag\n");1063break;1064}1065}1066}1067}1068WAPI_TRACE(WAPI_INIT, "<===========%s\n", __FUNCTION__);1069}107010711072void wapi_test_init(struct _adapter *padapter)1073{1074u8 keybuf[100];1075u8 mac_addr[ETH_ALEN] = {0x00, 0xe0, 0x4c, 0x72, 0x04, 0x70};1076u8 UskDataKey[16] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};1077u8 UskMicKey[16] = {0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f};1078u8 UskId = 0;1079u8 MskDataKey[16] = {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f};1080u8 MskMicKey[16] = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f};1081u8 MskId = 0;10821083WAPI_TRACE(WAPI_INIT, "===========>%s\n", __FUNCTION__);10841085/* Enable Wapi */1086WAPI_TRACE(WAPI_INIT, "%s: Enable wapi!!!!\n", __FUNCTION__);1087padapter->wapiInfo.bWapiEnable = true;1088padapter->pairwise_key_type = KEY_TYPE_SMS4;1089ieee->group_key_type = KEY_TYPE_SMS4;1090padapter->wapiInfo.extra_prefix_len = WAPI_EXT_LEN;1091padapter->wapiInfo.extra_postfix_len = SMS4_MIC_LEN;10921093/* set usk */1094WAPI_TRACE(WAPI_INIT, "%s: Set USK!!!!\n", __FUNCTION__);1095memset(keybuf, 0, 100);1096keybuf[0] = 1; /* set usk */1097keybuf[1] = 1; /* enable tx */1098keybuf[2] = 1; /* AE */1099keybuf[3] = 0; /* not update */11001101memcpy(keybuf + 4, mac_addr, ETH_ALEN);1102memcpy(keybuf + 10, UskDataKey, 16);1103memcpy(keybuf + 26, UskMicKey, 16);1104keybuf[42] = UskId;1105wapi_test_set_key(padapter, keybuf);11061107memset(keybuf, 0, 100);1108keybuf[0] = 1; /* set usk */1109keybuf[1] = 1; /* enable tx */1110keybuf[2] = 0; /* AE */1111keybuf[3] = 0; /* not update */11121113memcpy(keybuf + 4, mac_addr, ETH_ALEN);1114memcpy(keybuf + 10, UskDataKey, 16);1115memcpy(keybuf + 26, UskMicKey, 16);1116keybuf[42] = UskId;1117wapi_test_set_key(padapter, keybuf);11181119/* set msk */1120WAPI_TRACE(WAPI_INIT, "%s: Set MSK!!!!\n", __FUNCTION__);1121memset(keybuf, 0, 100);1122keybuf[0] = 2; /* set msk */1123keybuf[1] = 1; /* Enable TX */1124keybuf[2] = 1; /* AE */1125keybuf[3] = 0; /* not update */1126memcpy(keybuf + 4, mac_addr, ETH_ALEN);1127memcpy(keybuf + 10, MskDataKey, 16);1128memcpy(keybuf + 26, MskMicKey, 16);1129keybuf[42] = MskId;1130wapi_test_set_key(padapter, keybuf);11311132memset(keybuf, 0, 100);1133keybuf[0] = 2; /* set msk */1134keybuf[1] = 1; /* Enable TX */1135keybuf[2] = 0; /* AE */1136keybuf[3] = 0; /* not update */1137memcpy(keybuf + 4, mac_addr, ETH_ALEN);1138memcpy(keybuf + 10, MskDataKey, 16);1139memcpy(keybuf + 26, MskMicKey, 16);1140keybuf[42] = MskId;1141wapi_test_set_key(padapter, keybuf);1142WAPI_TRACE(WAPI_INIT, "<===========%s\n", __FUNCTION__);1143}1144#endif11451146void rtw_wapi_get_iv(_adapter *padapter, u8 *pRA, u8 *IV)1147{1148PWLAN_HEADER_WAPI_EXTENSION pWapiExt = NULL;1149PRT_WAPI_T pWapiInfo = &padapter->wapiInfo;1150bool bPNOverflow = false;1151bool bFindMatchPeer = false;1152PRT_WAPI_STA_INFO pWapiSta = NULL;11531154pWapiExt = (PWLAN_HEADER_WAPI_EXTENSION)IV;11551156WAPI_DATA(WAPI_RX, "wapi_get_iv: pra", pRA, 6);11571158if (IS_MCAST(pRA)) {1159if (!pWapiInfo->wapiTxMsk.bTxEnable) {1160WAPI_TRACE(WAPI_ERR, "%s: bTxEnable = 0!!\n", __FUNCTION__);1161return;1162}11631164if (pWapiInfo->wapiTxMsk.keyId <= 1) {1165pWapiExt->KeyIdx = pWapiInfo->wapiTxMsk.keyId;1166pWapiExt->Reserved = 0;1167bPNOverflow = WapiIncreasePN(pWapiInfo->lastTxMulticastPN, 1);1168memcpy(pWapiExt->PN, pWapiInfo->lastTxMulticastPN, 16);1169}1170} else {1171if (list_empty(&pWapiInfo->wapiSTAUsedList)) {1172WAPI_TRACE(WAPI_RX, "rtw_wapi_get_iv: list is empty\n");1173_rtw_memset(IV, 10, 18);1174return;1175} else {1176list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {1177WAPI_DATA(WAPI_RX, "rtw_wapi_get_iv: peermacaddr ", pWapiSta->PeerMacAddr, 6);1178if (_rtw_memcmp((u8 *)pWapiSta->PeerMacAddr, pRA, 6) == _TRUE) {1179bFindMatchPeer = true;1180break;1181}1182}11831184WAPI_TRACE(WAPI_RX, "bFindMatchPeer: %d\n", bFindMatchPeer);1185WAPI_DATA(WAPI_RX, "Addr", pRA, 6);11861187if (bFindMatchPeer) {1188if ((!pWapiSta->wapiUskUpdate.bTxEnable) && (!pWapiSta->wapiUsk.bTxEnable))1189return;11901191if (pWapiSta->wapiUsk.keyId <= 1) {1192if (pWapiSta->wapiUskUpdate.bTxEnable)1193pWapiExt->KeyIdx = pWapiSta->wapiUskUpdate.keyId;1194else1195pWapiExt->KeyIdx = pWapiSta->wapiUsk.keyId;11961197pWapiExt->Reserved = 0;1198bPNOverflow = WapiIncreasePN(pWapiSta->lastTxUnicastPN, 2);1199_rtw_memcpy(pWapiExt->PN, pWapiSta->lastTxUnicastPN, 16);12001201}1202}1203}12041205}12061207}12081209bool rtw_wapi_drop_for_key_absent(_adapter *padapter, u8 *pRA)1210{1211PRT_WAPI_T pWapiInfo = &padapter->wapiInfo;1212bool bFindMatchPeer = false;1213bool bDrop = false;1214PRT_WAPI_STA_INFO pWapiSta = NULL;1215struct security_priv *psecuritypriv = &padapter->securitypriv;12161217WAPI_DATA(WAPI_RX, "rtw_wapi_drop_for_key_absent: ra ", pRA, 6);12181219if (psecuritypriv->dot11PrivacyAlgrthm == _SMS4_) {1220if ((!padapter->WapiSupport) || (!pWapiInfo->bWapiEnable))1221return true;12221223if (IS_MCAST(pRA)) {1224if (!pWapiInfo->wapiTxMsk.bTxEnable) {1225bDrop = true;1226WAPI_TRACE(WAPI_RX, "rtw_wapi_drop_for_key_absent: multicast key is absent\n");1227return bDrop;1228}1229} else {1230if (!list_empty(&pWapiInfo->wapiSTAUsedList)) {1231list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {1232WAPI_DATA(WAPI_RX, "rtw_wapi_drop_for_key_absent: pWapiSta->PeerMacAddr ", pWapiSta->PeerMacAddr, 6);1233if (_rtw_memcmp(pRA, pWapiSta->PeerMacAddr, 6) == _TRUE) {1234bFindMatchPeer = true;1235break;1236}1237}1238if (bFindMatchPeer) {1239if (!pWapiSta->wapiUsk.bTxEnable) {1240bDrop = true;1241WAPI_TRACE(WAPI_RX, "rtw_wapi_drop_for_key_absent: unicast key is absent\n");1242return bDrop;1243}1244} else {1245bDrop = true;1246WAPI_TRACE(WAPI_RX, "rtw_wapi_drop_for_key_absent: no peer find\n");1247return bDrop;1248}12491250} else {1251bDrop = true;1252WAPI_TRACE(WAPI_RX, "rtw_wapi_drop_for_key_absent: no sta exist\n");1253return bDrop;1254}1255}1256} else1257return bDrop;12581259return bDrop;1260}12611262void rtw_wapi_set_set_encryption(_adapter *padapter, struct ieee_param *param)1263{1264struct security_priv *psecuritypriv = &padapter->securitypriv;1265struct mlme_priv *pmlmepriv = &padapter->mlmepriv;1266PRT_WAPI_T pWapiInfo = &padapter->wapiInfo;1267PRT_WAPI_STA_INFO pWapiSta;1268u8 WapiASUEPNInitialValueSrc[16] = {0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;1269u8 WapiAEPNInitialValueSrc[16] = {0x37, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;1270u8 WapiAEMultiCastPNInitialValueSrc[16] = {0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C, 0x36, 0x5C} ;12711272if (param->u.crypt.set_tx == 1) {1273list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {1274if (_rtw_memcmp(pWapiSta->PeerMacAddr, param->sta_addr, 6)) {1275_rtw_memcpy(pWapiSta->lastTxUnicastPN, WapiASUEPNInitialValueSrc, 16);12761277pWapiSta->wapiUsk.bSet = true;1278_rtw_memcpy(pWapiSta->wapiUsk.dataKey, param->u.crypt.key, 16);1279_rtw_memcpy(pWapiSta->wapiUsk.micKey, param->u.crypt.key + 16, 16);1280pWapiSta->wapiUsk.keyId = param->u.crypt.idx ;1281pWapiSta->wapiUsk.bTxEnable = true;12821283_rtw_memcpy(pWapiSta->lastRxUnicastPNBEQueue, WapiAEPNInitialValueSrc, 16);1284_rtw_memcpy(pWapiSta->lastRxUnicastPNBKQueue, WapiAEPNInitialValueSrc, 16);1285_rtw_memcpy(pWapiSta->lastRxUnicastPNVIQueue, WapiAEPNInitialValueSrc, 16);1286_rtw_memcpy(pWapiSta->lastRxUnicastPNVOQueue, WapiAEPNInitialValueSrc, 16);1287_rtw_memcpy(pWapiSta->lastRxUnicastPN, WapiAEPNInitialValueSrc, 16);1288pWapiSta->wapiUskUpdate.bTxEnable = false;1289pWapiSta->wapiUskUpdate.bSet = false;12901291if (psecuritypriv->sw_encrypt == false || psecuritypriv->sw_decrypt == false) {1292/* set unicast key for ASUE */1293rtw_wapi_set_key(padapter, &pWapiSta->wapiUsk, pWapiSta, false, false);1294}1295}1296}1297} else {1298list_for_each_entry(pWapiSta, &pWapiInfo->wapiSTAUsedList, list) {1299if (_rtw_memcmp(pWapiSta->PeerMacAddr, get_bssid(pmlmepriv), 6)) {1300pWapiSta->wapiMsk.bSet = true;1301_rtw_memcpy(pWapiSta->wapiMsk.dataKey, param->u.crypt.key, 16);1302_rtw_memcpy(pWapiSta->wapiMsk.micKey, param->u.crypt.key + 16, 16);1303pWapiSta->wapiMsk.keyId = param->u.crypt.idx ;1304pWapiSta->wapiMsk.bTxEnable = false;1305if (!pWapiSta->bSetkeyOk)1306pWapiSta->bSetkeyOk = true;1307pWapiSta->bAuthenticateInProgress = false;13081309_rtw_memcpy(pWapiSta->lastRxMulticastPN, WapiAEMultiCastPNInitialValueSrc, 16);13101311if (psecuritypriv->sw_decrypt == false) {1312/* set rx broadcast key for ASUE */1313rtw_wapi_set_key(padapter, &pWapiSta->wapiMsk, pWapiSta, true, false);1314}1315}1316}1317}1318}1319#endif132013211322