VOID FT_OTA_AuthParmFill( IN PRTMP_ADAPTER pAd, IN OUT MLME_FT_OTA_AUTH_REQ_STRUCT *pFtOtaAuthReq, IN PUCHAR pAddr, IN USHORT Alg, IN PDOT11R_CMN_STRUC pCmmDot11rCfg) { COPY_MAC_ADDR(pFtOtaAuthReq->Addr, pAddr); pFtOtaAuthReq->Alg = Alg; pFtOtaAuthReq->Timeout = (AUTH_TIMEOUT * 2); /* MDIE */ pFtOtaAuthReq->MdIe.FtCapPlc.field.RsrReqCap = 0; pFtOtaAuthReq->MdIe.FtCapPlc.field.FtOverDs = 0; if (pCmmDot11rCfg->bSupportResource && pAd->MlmeAux.MdIeInfo.FtCapPlc.field.RsrReqCap) pFtOtaAuthReq->MdIe.FtCapPlc.field.RsrReqCap = 1; pFtOtaAuthReq->MdIe.FtCapPlc.field.FtOverDs = pAd->MlmeAux.MdIeInfo.FtCapPlc.field.FtOverDs; FT_SET_MDID(pFtOtaAuthReq->MdIe.MdId, pCmmDot11rCfg->MdIeInfo.MdId); }
VOID FT_OTD_ActParmFill( IN PRTMP_ADAPTER pAd, IN OUT MLME_FT_REQ_STRUCT *FtReq, IN PUCHAR pAddr, IN NDIS_802_11_AUTHENTICATION_MODE AuthMode, IN PFT_MDIE_INFO FtMdieInfo, IN PFT_FTIE_INFO FtFtieInfo, IN UCHAR VarIeLen, IN PUCHAR pVarIe) { RTMPZeroMemory(FtReq, sizeof (MLME_FT_REQ_STRUCT)); COPY_MAC_ADDR(FtReq->TargetAddr, pAddr); if (AuthMode >= Ndis802_11AuthModeWPA) FtReq->HaveRSN = 1; FtReq->Timeout = FT_ACT_TIMEOUT; FT_SET_MDID(FtReq->MdIe.MdId, FtMdieInfo->MdId); FtReq->MdIe.FtCapPlc.word = FtMdieInfo->FtCapPlc.word; RTMPMoveMemory(&FtReq->SNonce[0], FtFtieInfo->SNonce, 32); RTMPMoveMemory(&FtReq->R0khId[0], FtFtieInfo->R0khId, FtFtieInfo->R0khIdLen); FtReq->R0khIdLen = FtFtieInfo->R0khIdLen; RTMPMoveMemory(&FtReq->VIe[0], pVarIe, VarIeLen); }
BOOLEAN PeerFtAuthRspSanity( IN PRTMP_ADAPTER pAd, IN PUCHAR ApAddr, IN VOID *pMsg, IN ULONG MsgLen, OUT MAC_TABLE_ENTRY *pEntry) { PEID_STRUCT pEid; USHORT Length = 0; UCHAR Sanity = 0; PFRAME_802_11 pFrame = (PFRAME_802_11)pMsg; FT_MDIE MdIe; UINT8 PMKR0Name[16]; pEntry = &pAd->MacTab.Content[MCAST_WCID]; /* Alg: 2 bytes Seq: 2 bytes Status: 2 bytes */ pEid = (PEID_STRUCT) &pFrame->Octet[6]; while ((Length + 2 + (USHORT)pEid->Len) <= (MsgLen - LENGTH_802_11 - 6)) { switch(pEid->Eid) { case IE_FT_MDIE: if (pEid->Len == sizeof(FT_MDIE)) { NdisZeroMemory(&MdIe, sizeof(FT_MDIE)); NdisMoveMemory(&MdIe, &pEid->Octet[0], pEid->Len); FT_SET_MDID(pEntry->MdIeInfo.MdId, MdIe.MdId); pEntry->MdIeInfo.FtCapPlc.word = MdIe.FtCapPlc.word; Sanity |= 0x01; } break; case IE_FT_FTIE: if (pEid->Len) { NdisMoveMemory(&pAd->MlmeAux.FtIeInfo.ANonce[0], &pEid->Octet[18], 32); FT_FTIeParse(pEid->Len, (PFT_FTIE)pEid/*(PFT_FTIE)&pEid->Octet[0]*/, &pEntry->FtIeInfo.R1khId[0], &pEntry->FtIeInfo.GtkLen, &pEntry->FtIeInfo.GtkSubIE[0], &pEntry->FtIeInfo.R0khIdLen, &pEntry->FtIeInfo.R0khId[0]); Sanity |= 0x02; } break; case IE_RSN: if (pEid->Len > LEN_PMK_NAME) { /* Check PMKR0Name */ NdisMoveMemory(&PMKR0Name[0], &pEid->Octet[pEid->Len - LEN_PMK_NAME], LEN_PMK_NAME); if (NdisEqualMemory(&PMKR0Name[0], &pAd->StaCfg.Dot11RCommInfo.PMKR0Name[0], LEN_PMK_NAME)) Sanity |= 0x04; } break; } Length = Length + 2 + (USHORT)pEid->Len; /* Eid[1] + Len[1]+ content[Len] */ pEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len); } if ((Sanity & 0x01) == 0) { MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN, ("PeerFtAuthRspSanity - missing field, Sanity=0x%02x\n", Sanity)); return FALSE; } if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) { if ((Sanity & 0x07) == 0) { MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_WARN, ("PeerFtAuthRspSanity - missing field, Sanity=0x%02x\n", Sanity)); return FALSE; } else { return TRUE; } } return TRUE; }