Exemple #1
0
/*
    ==========================================================================
    Description:
        
	IRQL = DISPATCH_LEVEL

    ==========================================================================
 */
VOID FT_OTA_MlmeAuthReqAction(
    IN PRTMP_ADAPTER pAd, 
    IN MLME_QUEUE_ELEM *Elem) 
{
	USHORT			Status;
	NDIS_STATUS		NStatus;
	PUCHAR			pOutBuffer = NULL;
	ULONG			FrameLen = 0;
	PMLME_FT_OTA_AUTH_REQ_STRUCT	pFtOtaAuthReq = (MLME_FT_OTA_AUTH_REQ_STRUCT *)Elem->Msg;
    
	NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  /*Get an unused nonpaged memory */
    if(NStatus != NDIS_STATUS_SUCCESS) 
    {
        MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("FT_OTA_AUTH - FT_OTA_MlmeAuthReqAction allocate memory failed\n"));
        pAd->Mlme.FtOtaAuthMachine.CurrState = FT_OTA_AUTH_REQ_IDLE;
        Status = MLME_FAIL_NO_RESOURCE;
        MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status, 0);
        return;
    }
	
	/* MDIE */
	FT_InsertMdIE(pAd, pOutBuffer, &FrameLen, pFtOtaAuthReq->MdIe.MdId, pFtOtaAuthReq->MdIe.FtCapPlc);

	/* work in an RSN */
	if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)
	{
		FT_ConstructAuthReqInRsn(pAd, pOutBuffer, &FrameLen);
	}

	if (AUTH_ReqSend(pAd, Elem, &pAd->MlmeAux.FtOtaAuthTimer, "FT_OTA_AUTH", 1, pOutBuffer, FrameLen))
		pAd->Mlme.FtOtaAuthMachine.CurrState = FT_OTA_AUTH_WAIT_RESP;

	MlmeFreeMemory(pAd, pOutBuffer);	
}
Exemple #2
0
/*
    ==========================================================================
    Description:
        
	IRQL = DISPATCH_LEVEL

    ==========================================================================
 */
VOID FT_OTA_PeerAuthRspAction(
    IN PRTMP_ADAPTER pAd, 
    IN MLME_QUEUE_ELEM *Elem) 
{
    UCHAR			Addr2[MAC_ADDR_LEN];
    USHORT			Seq, Status, Alg;
    BOOLEAN			TimerCancelled;
    PUCHAR			pOutBuffer = NULL;
    NDIS_STATUS		NStatus;
    ULONG			FrameLen = 0;
	UINT8			ptk_len;
	UCHAR			EleID;
	MAC_TABLE_ENTRY *pEntry = NULL;

    if (PeerAuthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Alg, &Seq, &Status, NULL))
    {
        if (MAC_ADDR_EQUAL(pAd->MlmeAux.Bssid, Addr2) && 
			(Alg == AUTH_MODE_FT) &&
			(Seq == 2))
        {
            MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("FT_OTA_AUTH - Receive FT_OTA_AUTH_RSP to me (Alg=%d, Status=%d)\n", Alg, Status));
            RTMPCancelTimer(&pAd->MlmeAux.FtOtaAuthTimer, &TimerCancelled);
            pAd->StaCfg.Dot11RCommInfo.FtRspSuccess = FT_OTA_RESPONSE;
            if ((Status == MLME_SUCCESS) &&
				(PeerFtAuthRspSanity(pAd, Addr2, Elem->Msg, Elem->MsgLen, pEntry) == TRUE)) 
            {
            	MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("%s : Ready to derive PMK \n", __FUNCTION__));

				pEntry = &pAd->MacTab.Content[MCAST_WCID];
				NdisMoveMemory(pEntry->SNonce, pAd->MlmeAux.FtIeInfo.SNonce, 32);

				/* Get ANonce from authentication-response */
				NdisMoveMemory(pEntry->ANonce, pAd->MlmeAux.FtIeInfo.ANonce, 32);

				FT_DerivePMKR1(pAd->StaCfg.Dot11RCommInfo.PMKR0, 
							 pAd->StaCfg.Dot11RCommInfo.PMKR0Name, 
							 pAd->MlmeAux.Bssid, 
							 pAd->CurrentAddress, 
							 pEntry->FT_PMK_R1, 
							 pEntry->FT_PMK_R1_NAME);

				if (pEntry->WepStatus == Ndis802_11TKIPEnable)
					ptk_len = 32+32;
				else
					ptk_len = 32+16;

				/* Derive FT PTK and PTK-NAME */
				FT_DerivePTK(pEntry->FT_PMK_R1, 
						   	pEntry->FT_PMK_R1_NAME, 
						   	pEntry->ANonce, 
						   	pEntry->SNonce, 
					   		pAd->MlmeAux.Bssid, 	
					   		pAd->CurrentAddress, 							
						   	ptk_len, 			 
						   	pEntry->PTK, 
						   	pEntry->PTK_NAME);
			
                if ((pAd->MlmeAux.MdIeInfo.FtCapPlc.field.RsrReqCap == FALSE) ||
					(pAd->StaCfg.Dot11RCommInfo.bSupportResource == FALSE))
                {
                	/* 
                		AP doesn't support resource request or
                		Station doesn't want to do resource request
					*/
                    pAd->Mlme.FtOtaAuthMachine.CurrState = FT_OTA_AUTH_REQ_IDLE;
                    MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status, 0);
                } 
                else 
                {
                	NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);  /*Get an unused nonpaged memory */
				    if(NStatus != NDIS_STATUS_SUCCESS) 
				    {
				        MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("FT_OTA_AUTH - FT_OTA_MlmeAuthReqAction allocate memory failed\n"));
				        pAd->Mlme.FtOtaAuthMachine.CurrState = FT_OTA_AUTH_REQ_IDLE;
				        Status = MLME_FAIL_NO_RESOURCE;
				        MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status, 0);
				        return;
				    }

					/* Send Auth Confirm */
					/* RSNIE */
					if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)
					{
						FT_ConstructAuthReqInRsn(pAd, pOutBuffer, &FrameLen);
					}
					
					/* MDIE */
					FT_InsertMdIE(pAd, 
								  pOutBuffer, 
								  &FrameLen, 
								  pAd->MlmeAux.MdIeInfo.MdId, 
								  pAd->MlmeAux.MdIeInfo.FtCapPlc);

					/* RIC-Request */
					EleID = IE_FT_RIC_DATA;
					
					AUTH_ReqSend(pAd, Elem, &pAd->MlmeAux.FtOtaAuthTimer, "FT_OTA_AUTH", 3, pOutBuffer, FrameLen);
					MlmeFreeMemory(pAd, pOutBuffer);
					pAd->Mlme.FtOtaAuthMachine.CurrState = FT_OTA_AUTH_WAIT_ACK;
                }
            } 
            else 
            {
                pAd->StaCfg.AuthFailReason = Status;
                COPY_MAC_ADDR(pAd->StaCfg.AuthFailSta, Addr2);
                pAd->Mlme.FtOtaAuthMachine.CurrState = FT_OTA_AUTH_REQ_IDLE;
                MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status, 0);
            }
        }
    }
    else
    {
        MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_TRACE, ("AUTH - PeerAuthSanity() sanity check fail\n"));
    }
}
/*
    ==========================================================================
    Description:

	IRQL = DISPATCH_LEVEL

    ==========================================================================
 */
VOID FT_OTD_ReqAction(
    IN PRTMP_ADAPTER pAd,
    IN MLME_QUEUE_ELEM *Elem)
{
    PUCHAR pOutBuffer = NULL;
    NDIS_STATUS NStatus;
    ULONG FrameLen = 0;
    HEADER_802_11 FtReqHdr;
    FT_MDIE MdIe;
    UCHAR Snonce[32];
    UCHAR R0KhIdLen;
    UCHAR R0KhId[FT_ROKH_ID_LEN + 1];
    UCHAR Category = FT_CATEGORY_BSS_TRANSITION;
    UCHAR Action = FT_ACTION_BT_REQ;
    ULONG Timeout = 0;
    USHORT Status;
    UCHAR TargetAddr[6];
    NDIS_802_11_VARIABLE_IEs *pRsnIE = NULL;
    USHORT LenRsnIE;

    if (!MlmeFtReqSanity
            (pAd, Elem->Msg, Elem->MsgLen, TargetAddr, &Timeout, &MdIe, Snonce,
             &R0KhIdLen, R0KhId, &LenRsnIE, pRsnIE)) {
        DBGPRINT_ERR(("FT_OTD_ACTION - FT_OTD_ReqAction() sanity check failed\n"));
        pAd->Mlme.AuthMachine.CurrState = FT_OTD_IDLE;
        Status = MLME_INVALID_FORMAT;
        MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2,
                    &Status, 0);
        return;
    }

    DBGPRINT(RT_DEBUG_TRACE, ("FT_OTD_ACTION :FT_OTD_ReqAction() \n"));

    NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);	/*Get an unused nonpaged memory */
    if (NStatus != NDIS_STATUS_SUCCESS) {
        DBGPRINT(RT_DEBUG_ERROR,
                 ("FT_OTD_ACTION :FT_OTD_ReqAction() allocate memory failed \n"));
        return;
    }

    ActHeaderInit(pAd, &FtReqHdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress,
                  pAd->CommonCfg.Bssid);

    /* Build basic frame first */
    MakeOutgoingFrame(pOutBuffer, &FrameLen,
                      sizeof (HEADER_802_11), &FtReqHdr,
                      1, &Category,
                      1, &Action,
                      6, pAd->CurrentAddress, 6, TargetAddr, END_OF_ARGS);

    /* MDIE */
    FT_InsertMdIE(pAd, pOutBuffer + FrameLen, &FrameLen, MdIe.MdId,
                  MdIe.FtCapPlc);

    /* Process with RSN */
    if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) {
        FT_ConstructAuthReqInRsn(pAd, pOutBuffer, &FrameLen);
    }

    MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);
    MlmeFreeMemory(pAd, pOutBuffer);

    RTMPSetTimer(&pAd->MlmeAux.FtOtdActTimer, Timeout);
    pAd->Mlme.FtOtdActMachine.CurrState = FT_OTD_WAIT_SEQ2;

}