BOOLEAN CFG80211DRV_ApKeyAdd( VOID *pAdOrg, VOID *pData) { #ifdef CONFIG_AP_SUPPORT PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; CMD_RTPRIV_IOCTL_80211_KEY *pKeyInfo; MAC_TABLE_ENTRY *pEntry; PMULTISSID_STRUCT pMbss = &pAd->ApCfg.MBSSID[MAIN_MBSSID]; struct wifi_dev *pWdev = &pMbss->wdev; UINT8 Wcid; #ifdef RT_CFG80211_SUPPORT UINT apidx = MAIN_MBSSID; #endif /*RT_CFG80211_P2P_SUPPORT*/ DBGPRINT(RT_DEBUG_TRACE,("%s =====> \n", __FUNCTION__)); pKeyInfo = (CMD_RTPRIV_IOCTL_80211_KEY *)pData; if (pKeyInfo->KeyType == RT_CMD_80211_KEY_WEP40 || pKeyInfo->KeyType == RT_CMD_80211_KEY_WEP104) { pWdev->WepStatus = Ndis802_11WEPEnabled; { UCHAR CipherAlg; CIPHER_KEY *pSharedKey; POS_COOKIE pObj; pObj = (POS_COOKIE) pAd->OS_Cookie; pSharedKey = &pAd->SharedKey[apidx][pKeyInfo->KeyId]; NdisMoveMemory(pSharedKey->Key, pKeyInfo->KeyBuf, pKeyInfo->KeyLen); if (pKeyInfo->KeyType == RT_CMD_80211_KEY_WEP40) pAd->SharedKey[apidx][pKeyInfo->KeyId].CipherAlg = CIPHER_WEP64; else pAd->SharedKey[apidx][pKeyInfo->KeyId].CipherAlg = CIPHER_WEP128; AsicAddSharedKeyEntry(pAd, apidx, pKeyInfo->KeyId, pSharedKey); } } else if(pKeyInfo->KeyType == RT_CMD_80211_KEY_WPA) { if (pKeyInfo->cipher == Ndis802_11AESEnable) { /* AES */ //pWdev->WepStatus = Ndis802_11Encryption3Enabled; //pWdev->GroupKeyWepStatus = Ndis802_11Encryption3Enabled; #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) if (pKeyInfo->bPairwise == FALSE ) #else if (pKeyInfo->KeyId > 0) #endif /* LINUX_VERSION_CODE 2.6.37 */ { if (pWdev->GroupKeyWepStatus == Ndis802_11Encryption3Enabled) { DBGPRINT(RT_DEBUG_TRACE, ("CFG: Set AES Security Set. (GROUP) %d\n", pKeyInfo->KeyLen)); pAd->SharedKey[MAIN_MBSSID][pKeyInfo->KeyId].KeyLen= LEN_TK; NdisMoveMemory(pAd->SharedKey[MAIN_MBSSID][pKeyInfo->KeyId].Key, pKeyInfo->KeyBuf, pKeyInfo->KeyLen); pAd->SharedKey[MAIN_MBSSID][pKeyInfo->KeyId].CipherAlg = CIPHER_AES; AsicAddSharedKeyEntry(pAd, MAIN_MBSSID, pKeyInfo->KeyId, &pAd->SharedKey[MAIN_MBSSID][pKeyInfo->KeyId]); GET_GroupKey_WCID(pAd, Wcid, MAIN_MBSSID); RTMPSetWcidSecurityInfo(pAd, MAIN_MBSSID, (UINT8)(pKeyInfo->KeyId), pAd->SharedKey[MAIN_MBSSID][pKeyInfo->KeyId].CipherAlg, Wcid, SHAREDKEYTABLE); } } else { if (pKeyInfo->MAC) pEntry = MacTableLookup(pAd, pKeyInfo->MAC); if(pEntry) { DBGPRINT(RT_DEBUG_TRACE, ("CFG: Set AES Security Set. (PAIRWISE) %d\n", pKeyInfo->KeyLen)); pEntry->PairwiseKey.KeyLen = LEN_TK; NdisCopyMemory(&pEntry->PTK[OFFSET_OF_PTK_TK], pKeyInfo->KeyBuf, OFFSET_OF_PTK_TK); NdisMoveMemory(pEntry->PairwiseKey.Key, &pEntry->PTK[OFFSET_OF_PTK_TK], pKeyInfo->KeyLen); pEntry->PairwiseKey.CipherAlg = CIPHER_AES; AsicAddPairwiseKeyEntry(pAd, (UCHAR)pEntry->Aid, &pEntry->PairwiseKey); RTMPSetWcidSecurityInfo(pAd, pEntry->apidx, (UINT8)(pKeyInfo->KeyId & 0x0fff), pEntry->PairwiseKey.CipherAlg, pEntry->Aid, PAIRWISEKEYTABLE); } else { DBGPRINT(RT_DEBUG_ERROR,("CFG: Set AES Security Set. (PAIRWISE) But pEntry NULL\n")); } } }else if (pKeyInfo->cipher == Ndis802_11TKIPEnable) { /* TKIP */ //pWdev->WepStatus = Ndis802_11Encryption2Enabled; //pWdev->GroupKeyWepStatus = Ndis802_11Encryption2Enabled; #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) if (pKeyInfo->bPairwise == FALSE ) #else if (pKeyInfo->KeyId > 0) #endif /* LINUX_VERSION_CODE 2.6.37 */ { if (pWdev->GroupKeyWepStatus == Ndis802_11Encryption2Enabled) { DBGPRINT(RT_DEBUG_TRACE, ("CFG: Set TKIP Security Set. (GROUP) %d\n", pKeyInfo->KeyLen)); pAd->SharedKey[MAIN_MBSSID][pKeyInfo->KeyId].KeyLen= LEN_TK; NdisMoveMemory(pAd->SharedKey[MAIN_MBSSID][pKeyInfo->KeyId].Key, pKeyInfo->KeyBuf, pKeyInfo->KeyLen); pAd->SharedKey[MAIN_MBSSID][pKeyInfo->KeyId].CipherAlg = CIPHER_TKIP; AsicAddSharedKeyEntry(pAd, MAIN_MBSSID, pKeyInfo->KeyId, &pAd->SharedKey[MAIN_MBSSID][pKeyInfo->KeyId]); GET_GroupKey_WCID(pAd, Wcid, MAIN_MBSSID); RTMPSetWcidSecurityInfo(pAd, MAIN_MBSSID, (UINT8)(pKeyInfo->KeyId), pAd->SharedKey[MAIN_MBSSID][pKeyInfo->KeyId].CipherAlg, Wcid, SHAREDKEYTABLE); } } else { if (pKeyInfo->MAC) pEntry = MacTableLookup(pAd, pKeyInfo->MAC); if(pEntry) { DBGPRINT(RT_DEBUG_TRACE, ("CFG: Set TKIP Security Set. (PAIRWISE) %d\n", pKeyInfo->KeyLen)); pEntry->PairwiseKey.KeyLen = LEN_TK; NdisCopyMemory(&pEntry->PTK[OFFSET_OF_PTK_TK], pKeyInfo->KeyBuf, OFFSET_OF_PTK_TK); NdisMoveMemory(pEntry->PairwiseKey.Key, &pEntry->PTK[OFFSET_OF_PTK_TK], pKeyInfo->KeyLen); pEntry->PairwiseKey.CipherAlg = CIPHER_TKIP; AsicAddPairwiseKeyEntry(pAd, (UCHAR)pEntry->Aid, &pEntry->PairwiseKey); RTMPSetWcidSecurityInfo(pAd, pEntry->apidx, (UINT8)(pKeyInfo->KeyId & 0x0fff), pEntry->PairwiseKey.CipherAlg, pEntry->Aid, PAIRWISEKEYTABLE); } else { DBGPRINT(RT_DEBUG_ERROR,("CFG: Set TKIP Security Set. (PAIRWISE) But pEntry NULL\n")); } } } } #endif /* CONFIG_AP_SUPPORT */ return TRUE; }
VOID RTMPWriteTxWI_Data(RTMP_ADAPTER *pAd, TXWI_STRUC *pTxWI, TX_BLK *pTxBlk) { HTTRANSMIT_SETTING *pTransmit; MAC_TABLE_ENTRY *pMacEntry; UINT8 TXWISize = pAd->chipCap.TXWISize; UCHAR wcid, pkt_id; UCHAR sgi, mcs, bw, stbc, phy_mode, ldpc; #ifdef DOT11_N_SUPPORT UCHAR basize, ampdu, mimops = 0, mpdu_density = 0; #endif /* DOT11_N_SUPPORT */ #ifdef MCS_LUT_SUPPORT BOOLEAN lut_enable = 0; UCHAR mbc_wcid; #endif /* MCS_LUT_SUPPORT */ UCHAR tx_stream_mode = 0; ASSERT(pTxWI); pTransmit = pTxBlk->pTransmit; pMacEntry = pTxBlk->pMacEntry; /* Always use Long preamble before verifiation short preamble functionality works well. Todo: remove the following line if short preamble functionality works */ OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED); NdisZeroMemory(pTxWI, TXWISize); wcid = pTxBlk->Wcid; sgi = pTransmit->field.ShortGI; stbc = pTransmit->field.STBC; ldpc = pTransmit->field.ldpc; mcs = pTransmit->field.MCS; phy_mode = pTransmit->field.MODE; /* If CCK or OFDM, BW must be 20 */ bw = (pTransmit->field.MODE <= MODE_OFDM) ? (BW_20) : (pTransmit->field.BW); #ifdef MT76x2 if (MT_REV_GTE(pAd, MT76x2, REV_MT76x2E4)) tx_stream_mode = 0x3; else if (MT_REV_ET(pAd, MT76x2, REV_MT76x2E3)) tx_stream_mode = (pTransmit->field.MODE <= MODE_OFDM) ? 0x83 : 0x0; #endif /* MT76x2 */ #ifdef DOT11_N_SUPPORT #ifdef DOT11N_DRAFT3 if (bw) bw = (pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth == 0) ? (BW_20) : (pTransmit->field.BW); #endif /* DOT11N_DRAFT3 */ ampdu = ((pTxBlk->TxFrameType == TX_AMPDU_FRAME) ? TRUE : FALSE); basize = pAd->CommonCfg.TxBASize; if(ampdu && pMacEntry) { /* * Under HT20, 2x2 chipset, OPEN, and with some atero chipsets * reduce BASize to 7 to add one bulk A-MPDU during one TXOP * to improve throughput */ if ((pAd->CommonCfg.BBPCurrentBW == BW_20) && (pAd->Antenna.field.TxPath == 2) && (pMacEntry->bIAmBadAtheros) && (pMacEntry->WepStatus == Ndis802_11EncryptionDisabled)) { basize = 7; } else { UCHAR RABAOriIdx = pTxBlk->pMacEntry->BAOriWcidArray[pTxBlk->UserPriority]; basize = pAd->BATable.BAOriEntry[RABAOriIdx].BAWinSize; } } #endif /* DOT11_N_SUPPORT */ #ifdef DOT11_N_SUPPORT if (pMacEntry) { if ((pMacEntry->MmpsMode == MMPS_DYNAMIC) && (mcs > 7)) mimops = 1; else if (pMacEntry->MmpsMode == MMPS_STATIC) { if ((pTransmit->field.MODE == MODE_HTMIX || pTransmit->field.MODE == MODE_HTGREENFIELD) && (mcs > 7)) { mcs = 7; mimops = 0; } } if ((pAd->CommonCfg.BBPCurrentBW == BW_20) && (pMacEntry->bIAmBadAtheros)) mpdu_density = 7; else mpdu_density = pMacEntry->MpduDensity; } #endif /* DOT11_N_SUPPORT */ #ifdef DBG_DIAGNOSE if (pTxBlk->QueIdx== 0) { pAd->DiagStruct.diag_info[pAd->DiagStruct.ArrayCurIdx].TxDataCnt++; #ifdef DBG_TX_MCS pAd->DiagStruct.diag_info[pAd->DiagStruct.ArrayCurIdx].TxMcsCnt_HT[mcs]++; #endif /* DBG_TX_MCS */ } #endif /* DBG_DIAGNOSE */ /* for rate adapation*/ pkt_id = mcs; #ifdef INF_AMAZON_SE /*Iverson patch for WMM A5-T07 ,WirelessStaToWirelessSta do not bulk out aggregate */ if( RTMP_GET_PACKET_NOBULKOUT(pTxBlk->pPacket)) { if(phy_mode == MODE_CCK) pkt_id = 6; } #endif /* INF_AMAZON_SE */ #ifdef MCS_LUT_SUPPORT if ((RTMP_TEST_MORE_FLAG(pAd, fASIC_CAP_MCS_LUT)) && (wcid < 128) && (pMacEntry && pMacEntry->bAutoTxRateSwitch == TRUE)) { HTTRANSMIT_SETTING rate_ctrl; rate_ctrl.field.MODE = phy_mode; rate_ctrl.field.STBC = stbc; rate_ctrl.field.ShortGI = sgi; rate_ctrl.field.BW = bw; rate_ctrl.field.ldpc = ldpc; rate_ctrl.field.MCS = mcs; if (rate_ctrl.word == pTransmit->word) lut_enable = TRUE; } #ifdef PEER_DELBA_TX_ADAPT GET_GroupKey_WCID(pAd, mbc_wcid, pTxBlk->apidx); if (RTMP_GET_PACKET_LOWRATE(pTxBlk->pPacket) || (wcid == mbc_wcid) || (pMacEntry && (pMacEntry->MmpsMode == MMPS_STATIC))) lut_enable = FALSE; else lut_enable = TRUE; #endif /* PEER_DELBA_TX_ADAPT */ #endif /* MCS_LUT_SUPPORT */ #ifdef RLT_MAC if (pAd->chipCap.hif_type == HIF_RLT) { struct _TXWI_NMAC *txwi_n = (struct _TXWI_NMAC *)pTxWI; txwi_n->FRAG = TX_BLK_TEST_FLAG(pTxBlk, fTX_bAllowFrag); txwi_n->ACK = TX_BLK_TEST_FLAG(pTxBlk, fTX_bAckRequired); if (RTMP_GET_PACKET_TDLS_WAIT_ACK(pTxBlk->pPacket)) { txwi_n->TxPktId |= 0x80; DBGPRINT(RT_DEBUG_INFO,("PktID |= 0x80 : [%x]\n",txwi_n->TxPktId)); } else { txwi_n->TxPktId &= 0x7f; DBGPRINT(RT_DEBUG_INFO,("PktID : [%x]\n",txwi_n->TxPktId)); } #ifdef WFA_VHT_PF if (pAd->force_noack == TRUE) txwi_n->ACK = 0; #endif /* WFA_VHT_PF */ txwi_n->txop = pTxBlk->FrameGap; txwi_n->wcid = wcid; txwi_n->MPDUtotalByteCnt = pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen; txwi_n->CFACK = TX_BLK_TEST_FLAG(pTxBlk, fTX_bPiggyBack); txwi_n->ShortGI = sgi; txwi_n->STBC = stbc; txwi_n->LDPC = ldpc; txwi_n->TxStreamMode = tx_stream_mode; txwi_n->MCS = mcs; txwi_n->PHYMODE = phy_mode; txwi_n->BW = bw; txwi_n->TxPktId = pkt_id; #ifdef DOT11_N_SUPPORT txwi_n->AMPDU = ampdu; txwi_n->BAWinSize = basize; txwi_n->MIMOps = mimops; txwi_n->MpduDensity = mpdu_density; #endif /* DOT11_N_SUPPORT */ #ifdef MCS_LUT_SUPPORT txwi_n->lut_en = lut_enable; #endif /* MCS_LUT_SUPPORT */ } #endif /* RLT_MAC */ #ifdef RTMP_MAC if (pAd->chipCap.hif_type == HIF_RTMP) { struct _TXWI_OMAC *txwi_o = (struct _TXWI_OMAC *)pTxWI; txwi_o->FRAG = TX_BLK_TEST_FLAG(pTxBlk, fTX_bAllowFrag); txwi_o->ACK = TX_BLK_TEST_FLAG(pTxBlk, fTX_bAckRequired); #ifdef WFA_VHT_PF if (pAd->force_noack == TRUE) txwi_o->ACK = 0; #endif /* WFA_VHT_PF */ txwi_o->txop = pTxBlk->FrameGap; txwi_o->wcid = wcid; txwi_o->MPDUtotalByteCnt = pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen; txwi_o->CFACK = TX_BLK_TEST_FLAG(pTxBlk, fTX_bPiggyBack); txwi_o->ShortGI = sgi; txwi_o->STBC = stbc; txwi_o->MCS = mcs; txwi_o->PHYMODE = phy_mode; txwi_o->BW = bw; txwi_o->PacketId = pkt_id; #ifdef DOT11_N_SUPPORT txwi_o->AMPDU = ampdu; txwi_o->BAWinSize = basize; txwi_o->MIMOps = mimops; txwi_o->MpduDensity= mpdu_density; #endif /* DOT11_N_SUPPORT */ } #endif /* RTMP_MAC */ }
/* ========================================================================== Description: Timer execution function for periodically updating group key. Return: ========================================================================== */ VOID GREKEYPeriodicExec( IN PVOID SystemSpecific1, IN PVOID FunctionContext, IN PVOID SystemSpecific2, IN PVOID SystemSpecific3) { UINT i, apidx; ULONG temp_counter = 0; struct rtmp_adapter *pAd = (struct rtmp_adapter *)FunctionContext; PRALINK_TIMER_STRUCT pTimer = (PRALINK_TIMER_STRUCT) SystemSpecific3; MULTISSID_STRUCT *pMbss = NULL; struct rtmp_wifi_dev *wdev; for (apidx=0; apidx<pAd->ApCfg.BssidNum; apidx++) { if (&pAd->ApCfg.MBSSID[apidx].REKEYTimer == pTimer) break; } if (apidx == pAd->ApCfg.BssidNum) return; else pMbss = &pAd->ApCfg.MBSSID[apidx]; wdev = &pMbss->wdev; if (wdev->AuthMode < Ndis802_11AuthModeWPA || wdev->AuthMode > Ndis802_11AuthModeWPA1PSKWPA2PSK) return; if ((pMbss->WPAREKEY.ReKeyMethod == TIME_REKEY) && (pMbss->REKEYCOUNTER < 0xffffffff)) temp_counter = (++pMbss->REKEYCOUNTER); /* REKEYCOUNTER is incremented every MCAST packets transmitted, */ /* But the unit of Rekeyinterval is 1K packets */ else if (pMbss->WPAREKEY.ReKeyMethod == PKT_REKEY) temp_counter = pMbss->REKEYCOUNTER/1000; else { return; } if (temp_counter > (pMbss->WPAREKEY.ReKeyInterval)) { pMbss->REKEYCOUNTER = 0; pMbss->RekeyCountDown = 3; DBGPRINT(RT_DEBUG_TRACE, ("Rekey Interval Excess, GKeyDoneStations=%d\n", pMbss->StaCount)); /* take turn updating different groupkey index, */ if ((pMbss->StaCount) > 0) { /* change key index */ wdev->DefaultKeyId = (wdev->DefaultKeyId == 1) ? 2 : 1; /* Generate GNonce randomly */ GenRandom(pAd, wdev->bssid, pMbss->GNonce); /* Update GTK */ WpaDeriveGTK(pMbss->GMK, (u8 *)pMbss->GNonce, wdev->bssid, pMbss->GTK, LEN_TKIP_GTK); /* Process 2-way handshaking */ for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++) { MAC_TABLE_ENTRY *pEntry; pEntry = &pAd->MacTab.Content[i]; if (IS_ENTRY_CLIENT(pEntry) && (pEntry->WpaState == AS_PTKINITDONE) && (pEntry->apidx == apidx)) { pEntry->GTKState = REKEY_NEGOTIATING; #ifdef DROP_MASK_SUPPORT /* Disable Drop Mask */ set_drop_mask_per_client(pAd, pEntry, 1, 0); set_drop_mask_per_client(pAd, pEntry, 2, 0); #endif /* DROP_MASK_SUPPORT */ WPAStart2WayGroupHS(pAd, pEntry); DBGPRINT(RT_DEBUG_TRACE, ("Rekey interval excess, Update Group Key for %x %x %x %x %x %x , DefaultKeyId= %x \n",\ PRINT_MAC(pEntry->Addr), wdev->DefaultKeyId)); } } } } /* Use countdown to ensure the 2-way handshaking had completed */ if (pMbss->RekeyCountDown > 0) { pMbss->RekeyCountDown--; if (pMbss->RekeyCountDown == 0) { unsigned short Wcid; /* Get a specific WCID to record this MBSS key attribute */ GET_GroupKey_WCID(pAd, Wcid, apidx); /* Install shared key table */ WPAInstallSharedKey(pAd, wdev->GroupKeyWepStatus, apidx, wdev->DefaultKeyId, Wcid, true, pMbss->GTK, LEN_TKIP_GTK); } } }
BOOLEAN CFG80211DRV_ApKeyAdd( VOID *pAdOrg, VOID *pData) { #ifdef CONFIG_AP_SUPPORT PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdOrg; CMD_RTPRIV_IOCTL_80211_KEY *pKeyInfo; MAC_TABLE_ENTRY *pEntry=NULL; UINT Wcid = 0; #ifdef RT_CFG80211_P2P_SUPPORT UINT apidx = CFG_GO_BSSID_IDX; #else UINT apidx = MAIN_MBSSID; #endif /*RT_CFG80211_P2P_SUPPORT*/ BSS_STRUCT *pMbss = &pAd->ApCfg.MBSSID[apidx]; struct wifi_dev *pWdev = &pMbss->wdev; DBGPRINT(RT_DEBUG_TRACE,("%s =====> \n", __FUNCTION__)); pKeyInfo = (CMD_RTPRIV_IOCTL_80211_KEY *)pData; if (pKeyInfo->KeyType == RT_CMD_80211_KEY_WEP40 || pKeyInfo->KeyType == RT_CMD_80211_KEY_WEP104) { pWdev->WepStatus = Ndis802_11WEPEnabled; { //UCHAR CipherAlg; CIPHER_KEY *pSharedKey; POS_COOKIE pObj; pObj = (POS_COOKIE) pAd->OS_Cookie; pSharedKey = &pAd->SharedKey[apidx][pKeyInfo->KeyId]; pSharedKey->KeyLen = pKeyInfo->KeyLen; NdisMoveMemory(pSharedKey->Key, pKeyInfo->KeyBuf, pKeyInfo->KeyLen); if (pKeyInfo->KeyType == RT_CMD_80211_KEY_WEP40) pAd->SharedKey[apidx][pKeyInfo->KeyId].CipherAlg = CIPHER_WEP64; else pAd->SharedKey[apidx][pKeyInfo->KeyId].CipherAlg = CIPHER_WEP128; AsicAddSharedKeyEntry(pAd, apidx, pKeyInfo->KeyId, pSharedKey); } } else if(pKeyInfo->KeyType == RT_CMD_80211_KEY_WPA) { if (pKeyInfo->cipher == Ndis802_11AESEnable) { /* AES */ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) if (pKeyInfo->bPairwise == FALSE ) #else if (pKeyInfo->KeyId > 0) #endif /* LINUX_VERSION_CODE 2.6.37 */ { if (pWdev->GroupKeyWepStatus == Ndis802_11Encryption3Enabled) { DBGPRINT(RT_DEBUG_TRACE, ("CFG: Set AES Security Set. (GROUP) %d\n", pKeyInfo->KeyLen)); pAd->SharedKey[apidx][pKeyInfo->KeyId].KeyLen= LEN_TK; NdisMoveMemory(pAd->SharedKey[apidx][pKeyInfo->KeyId].Key, pKeyInfo->KeyBuf, pKeyInfo->KeyLen); pAd->SharedKey[apidx][pKeyInfo->KeyId].CipherAlg = CIPHER_AES; AsicAddSharedKeyEntry(pAd, apidx, pKeyInfo->KeyId, &pAd->SharedKey[apidx][pKeyInfo->KeyId]); GET_GroupKey_WCID(pAd, Wcid, apidx); RTMPSetWcidSecurityInfo(pAd, apidx, (UINT8)(pKeyInfo->KeyId), pAd->SharedKey[apidx][pKeyInfo->KeyId].CipherAlg, Wcid, SHAREDKEYTABLE); #ifdef MT_MAC if (pAd->chipCap.hif_type == HIF_MT) CmdProcAddRemoveKey(pAd, 0, apidx, pKeyInfo->KeyId, Wcid, SHAREDKEYTABLE, &pAd->SharedKey[apidx][pKeyInfo->KeyId], BROADCAST_ADDR); #endif /* MT_MAC */ } } else { if (pKeyInfo->MAC) pEntry = MacTableLookup(pAd, pKeyInfo->MAC); if(pEntry) { DBGPRINT(RT_DEBUG_TRACE, ("CFG: Set AES Security Set. (PAIRWISE) %d\n", pKeyInfo->KeyLen)); pEntry->PairwiseKey.KeyLen = LEN_TK; NdisCopyMemory(&pEntry->PTK[OFFSET_OF_PTK_TK], pKeyInfo->KeyBuf, OFFSET_OF_PTK_TK); NdisMoveMemory(pEntry->PairwiseKey.Key, &pEntry->PTK[OFFSET_OF_PTK_TK], pKeyInfo->KeyLen); pEntry->PairwiseKey.CipherAlg = CIPHER_AES; AsicAddPairwiseKeyEntry(pAd, (UCHAR)pEntry->Aid, &pEntry->PairwiseKey); RTMPSetWcidSecurityInfo(pAd, pEntry->func_tb_idx, (UINT8)(pKeyInfo->KeyId & 0x0fff), pEntry->PairwiseKey.CipherAlg, pEntry->Aid, PAIRWISEKEYTABLE); #ifdef MT_MAC if (pAd->chipCap.hif_type == HIF_MT) CmdProcAddRemoveKey(pAd, 0, apidx, pKeyInfo->KeyId, pEntry->wcid, PAIRWISEKEYTABLE, &pEntry->PairwiseKey, pEntry->Addr); #endif /* MT_MAC */ #ifdef RT_CFG80211_P2P_MULTI_CHAN_SUPPORT MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("%s: InfraCh=%d, pWdev->channel=%d\n", __FUNCTION__, pAd->MlmeAux.InfraChannel, pWdev->channel)); if (INFRA_ON(pAd) && ( ((pAd->StaCfg.wdev.bw == pWdev->bw) && (pAd->StaCfg.wdev.channel != pWdev->channel )) ||!((pAd->StaCfg.wdev.bw == pWdev->bw) && ((pAd->StaCfg.wdev.channel == pWdev->channel))))) { /*wait 1 s DHCP for P2P CLI */ OS_WAIT(1000); DBGPRINT(RT_DEBUG_TRACE, ("OS WAIT 1000 FOR DHCP\n")); // pAd->MCC_GOConnect_Protect = FALSE; // pAd->MCC_GOConnect_Count = 0; Start_MCC(pAd); MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("infra => GO test\n")); } else if((pAd->StaCfg.wdev.bw != pWdev->bw) && ((pAd->StaCfg.wdev.channel == pWdev->channel))) { MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("start bw != && SCC\n")); pAd->Mlme.bStartScc = TRUE; } /*after p2p cli connect , neet to change to default configure*/ //DBGPRINT(RT_DEBUG_TRACE, ("iversontest pWdev->bw %d \n",pWdev->bw)); if (pWdev->bw == 0) { pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW; pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40; pAd->CommonCfg.HT_Disable = 0; SetCommonHT(pAd); } #endif /* RT_CFG80211_P2P_MULTI_CHAN_SUPPORT */ } else { DBGPRINT(RT_DEBUG_ERROR,("CFG: Set AES Security Set. (PAIRWISE) But pEntry NULL\n")); } } }else if (pKeyInfo->cipher == Ndis802_11TKIPEnable){ /* TKIP */ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) if (pKeyInfo->bPairwise == FALSE ) #else if (pKeyInfo->KeyId > 0) #endif /* LINUX_VERSION_CODE 2.6.37 */ { if (pWdev->GroupKeyWepStatus == Ndis802_11Encryption2Enabled) { DBGPRINT(RT_DEBUG_TRACE, ("CFG: Set TKIP Security Set. (GROUP) %d\n", pKeyInfo->KeyLen)); pAd->SharedKey[apidx][pKeyInfo->KeyId].KeyLen= LEN_TK; NdisMoveMemory(pAd->SharedKey[apidx][pKeyInfo->KeyId].Key, pKeyInfo->KeyBuf, pKeyInfo->KeyLen); pAd->SharedKey[apidx][pKeyInfo->KeyId].CipherAlg = CIPHER_TKIP; AsicAddSharedKeyEntry(pAd, apidx, pKeyInfo->KeyId, &pAd->SharedKey[apidx][pKeyInfo->KeyId]); GET_GroupKey_WCID(pAd, Wcid, apidx); RTMPSetWcidSecurityInfo(pAd, apidx, (UINT8)(pKeyInfo->KeyId), pAd->SharedKey[apidx][pKeyInfo->KeyId].CipherAlg, Wcid, SHAREDKEYTABLE); #ifdef MT_MAC if (pAd->chipCap.hif_type == HIF_MT) CmdProcAddRemoveKey(pAd, 0, apidx, pKeyInfo->KeyId, Wcid, SHAREDKEYTABLE, &pAd->SharedKey[apidx][pKeyInfo->KeyId], BROADCAST_ADDR); #endif /* MT_MAC */ } } else { if (pKeyInfo->MAC) pEntry = MacTableLookup(pAd, pKeyInfo->MAC); if(pEntry) { DBGPRINT(RT_DEBUG_TRACE, ("CFG: Set TKIP Security Set. (PAIRWISE) %d\n", pKeyInfo->KeyLen)); pEntry->PairwiseKey.KeyLen = LEN_TK; NdisCopyMemory(&pEntry->PTK[OFFSET_OF_PTK_TK], pKeyInfo->KeyBuf, OFFSET_OF_PTK_TK); NdisMoveMemory(pEntry->PairwiseKey.Key, &pEntry->PTK[OFFSET_OF_PTK_TK], pKeyInfo->KeyLen); pEntry->PairwiseKey.CipherAlg = CIPHER_TKIP; AsicAddPairwiseKeyEntry(pAd, (UCHAR)pEntry->Aid, &pEntry->PairwiseKey); RTMPSetWcidSecurityInfo(pAd, pEntry->func_tb_idx, (UINT8)(pKeyInfo->KeyId & 0x0fff), pEntry->PairwiseKey.CipherAlg, pEntry->Aid, PAIRWISEKEYTABLE); #ifdef MT_MAC if (pAd->chipCap.hif_type == HIF_MT) CmdProcAddRemoveKey(pAd, 0, apidx, pKeyInfo->KeyId, pEntry->wcid, PAIRWISEKEYTABLE, &pEntry->PairwiseKey, pEntry->Addr); #endif /* MT_MAC */ } else { DBGPRINT(RT_DEBUG_ERROR,("CFG: Set TKIP Security Set. (PAIRWISE) But pEntry NULL\n")); } } } } #endif /* CONFIG_AP_SUPPORT */ return TRUE; }
VOID RTMPGetTxTscFromAsic( IN PRTMP_ADAPTER pAd, IN UCHAR apidx, OUT PUCHAR pTxTsc) { USHORT Wcid; USHORT offset; UCHAR IvEiv[8]; int i; /* Sanity check of apidx */ if (apidx >= MAX_MBSSID_NUM(pAd)) { DBGPRINT(RT_DEBUG_ERROR, ("RTMPGetTxTscFromAsic : invalid apidx(%d)\n", apidx)); return; } /* Initial value */ NdisZeroMemory(IvEiv, 8); NdisZeroMemory(pTxTsc, 6); /* Get apidx for this BSSID */ GET_GroupKey_WCID(pAd, Wcid, apidx); /* When the group rekey action is triggered, a count-down(3 seconds) is started. During the count-down, use the initial PN as TSC. Otherwise, get the IVEIV from ASIC. */ if (pAd->ApCfg.MBSSID[apidx].RekeyCountDown > 0) { /* In IEEE 802.11-2007 8.3.3.4.3 described : The PN shall be implemented as a 48-bit monotonically incrementing non-negative integer, initialized to 1 when the corresponding temporal key is initialized or refreshed. */ IvEiv[0] = 1; } else { UINT32 temp1, temp2; /* Read IVEIV from Asic */ offset = MAC_IVEIV_TABLE_BASE + (Wcid * HW_IVEIV_ENTRY_SIZE); /* Use Read32 to avoid endian problem */ RTMP_IO_READ32(pAd, offset, &temp1); RTMP_IO_READ32(pAd, offset+4, &temp2); for ( i=0; i<4; i++) { IvEiv[i] = (UCHAR)(temp1 >> (i*8)); IvEiv[i+4] = (UCHAR)(temp2 >> (i*8)); } } /* Record current TxTsc */ if (pAd->ApCfg.MBSSID[apidx].GroupKeyWepStatus == Ndis802_11Encryption3Enabled) { /* AES */ *pTxTsc = IvEiv[0]; *(pTxTsc+1) = IvEiv[1]; *(pTxTsc+2) = IvEiv[4]; *(pTxTsc+3) = IvEiv[5]; *(pTxTsc+4) = IvEiv[6]; *(pTxTsc+5) = IvEiv[7]; } else { /* TKIP */ *pTxTsc = IvEiv[2]; *(pTxTsc+1) = IvEiv[0]; *(pTxTsc+2) = IvEiv[4]; *(pTxTsc+3) = IvEiv[5]; *(pTxTsc+4) = IvEiv[6]; *(pTxTsc+5) = IvEiv[7]; } DBGPRINT(RT_DEBUG_TRACE, ("RTMPGetTxTscFromAsic : WCID(%d) TxTsc 0x%02x-0x%02x-0x%02x-0x%02x-0x%02x-0x%02x \n", Wcid, *pTxTsc, *(pTxTsc+1), *(pTxTsc+2), *(pTxTsc+3), *(pTxTsc+4), *(pTxTsc+5))); }