⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 auth.c

📁 ralink 2870 usb无线网卡 最新驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
/* ************************************************************************* * Ralink Tech Inc. * 5F., No.36, Taiyuan St., Jhubei City, * Hsinchu County 302, * Taiwan, R.O.C. * * (c) Copyright 2002-2007, Ralink Technology, Inc. * * This program is free software; you can redistribute it and/or modify  *  * it under the terms of the GNU General Public License as published by  *  * the Free Software Foundation; either version 2 of the License, or     *  * (at your option) any later version.                                   *  *                                                                       *  * This program is distributed in the hope that it will be useful,       *  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *  * GNU General Public License for more details.                          *  *                                                                       *  * You should have received a copy of the GNU General Public License     *  * along with this program; if not, write to the                         *  * Free Software Foundation, Inc.,                                       *  * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *  *                                                                       *  *************************************************************************	Module Name:	auth.c	Abstract:	Revision History:	Who			When			What	--------	----------		----------------------------------------------	John		2004-9-3		porting from RT2500*/#include "rt_config.h"/*    ==========================================================================    Description:        authenticate state machine init, including state transition and timer init    Parameters:        Sm - pointer to the auth state machine    Note:        The state machine looks like this                                AUTH_REQ_IDLE           AUTH_WAIT_SEQ2                   AUTH_WAIT_SEQ4    MT2_MLME_AUTH_REQ   mlme_auth_req_action    invalid_state_when_auth          invalid_state_when_auth    MT2_PEER_AUTH_EVEN  drop                    peer_auth_even_at_seq2_action    peer_auth_even_at_seq4_action    MT2_AUTH_TIMEOUT    Drop                    auth_timeout_action              auth_timeout_action        	IRQL = PASSIVE_LEVEL    ========================================================================== */void AuthStateMachineInit(    IN PRTMP_ADAPTER pAd,     IN STATE_MACHINE *Sm,     OUT STATE_MACHINE_FUNC Trans[]) {    StateMachineInit(Sm, Trans, MAX_AUTH_STATE, MAX_AUTH_MSG, (STATE_MACHINE_FUNC)Drop, AUTH_REQ_IDLE, AUTH_MACHINE_BASE);         // the first column    StateMachineSetAction(Sm, AUTH_REQ_IDLE, MT2_MLME_AUTH_REQ, (STATE_MACHINE_FUNC)MlmeAuthReqAction);    // the second column    StateMachineSetAction(Sm, AUTH_WAIT_SEQ2, MT2_MLME_AUTH_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenAuth);    StateMachineSetAction(Sm, AUTH_WAIT_SEQ2, MT2_PEER_AUTH_EVEN, (STATE_MACHINE_FUNC)PeerAuthRspAtSeq2Action);    StateMachineSetAction(Sm, AUTH_WAIT_SEQ2, MT2_AUTH_TIMEOUT, (STATE_MACHINE_FUNC)AuthTimeoutAction);        // the third column    StateMachineSetAction(Sm, AUTH_WAIT_SEQ4, MT2_MLME_AUTH_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenAuth);    StateMachineSetAction(Sm, AUTH_WAIT_SEQ4, MT2_PEER_AUTH_EVEN, (STATE_MACHINE_FUNC)PeerAuthRspAtSeq4Action);    StateMachineSetAction(Sm, AUTH_WAIT_SEQ4, MT2_AUTH_TIMEOUT, (STATE_MACHINE_FUNC)AuthTimeoutAction);    	RTMPInitTimer(pAd, &pAd->MlmeAux.AuthTimer, GET_TIMER_FUNCTION(AuthTimeout), pAd, FALSE);}/*    ==========================================================================    Description:        function to be executed at timer thread when auth timer expires        	IRQL = DISPATCH_LEVEL    ========================================================================== */VOID AuthTimeout(    IN PVOID SystemSpecific1,     IN PVOID FunctionContext,     IN PVOID SystemSpecific2,     IN PVOID SystemSpecific3) {    RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext;        DBGPRINT(RT_DEBUG_TRACE,("AUTH - AuthTimeout\n"));		// Do nothing if the driver is starting halt state.	// This might happen when timer already been fired before cancel timer with mlmehalt	if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))		return;		// send a de-auth to reset AP's state machine (Patch AP-Dir635)	if (pAd->Mlme.AuthMachine.CurrState == AUTH_WAIT_SEQ2)		Cls2errAction(pAd, pAd->MlmeAux.Bssid);		    MlmeEnqueue(pAd, AUTH_STATE_MACHINE, MT2_AUTH_TIMEOUT, 0, NULL);    RTMP_MLME_HANDLER(pAd);}/*    ==========================================================================    Description:        	IRQL = DISPATCH_LEVEL    ========================================================================== */VOID MlmeAuthReqAction(    IN PRTMP_ADAPTER pAd,     IN MLME_QUEUE_ELEM *Elem) {	if (AUTH_ReqSend(pAd, Elem, &pAd->MlmeAux.AuthTimer, "AUTH", 1, NULL, 0))        pAd->Mlme.AuthMachine.CurrState = AUTH_WAIT_SEQ2;    else     {		USHORT Status;		        pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;        Status = MLME_INVALID_FORMAT;        MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status);    }}/*    ==========================================================================    Description:        	IRQL = DISPATCH_LEVEL    ========================================================================== */VOID PeerAuthRspAtSeq2Action(    IN PRTMP_ADAPTER pAd,     IN MLME_QUEUE_ELEM *Elem) {    UCHAR         Addr2[MAC_ADDR_LEN];    USHORT        Seq, Status, RemoteStatus, Alg;    UCHAR         ChlgText[CIPHER_TEXT_LEN];    UCHAR         CyperChlgText[CIPHER_TEXT_LEN + 8 + 8];    UCHAR         Element[2];    HEADER_802_11 AuthHdr;    BOOLEAN       TimerCancelled;    PUCHAR        pOutBuffer = NULL;    NDIS_STATUS   NStatus;    ULONG         FrameLen = 0;    USHORT        Status2;    if (PeerAuthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Alg, &Seq, &Status, (PCHAR)ChlgText))     {        if (MAC_ADDR_EQUAL(pAd->MlmeAux.Bssid, Addr2) && Seq == 2)         {            DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Receive AUTH_RSP seq#2 to me (Alg=%d, Status=%d)\n", Alg, Status));            RTMPCancelTimer(&pAd->MlmeAux.AuthTimer, &TimerCancelled);                        if (Status == MLME_SUCCESS)             {                // Authentication Mode "LEAP" has allow for CCX 1.X                if (pAd->MlmeAux.Alg == Ndis802_11AuthModeOpen)                {                    pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;                    MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status);                }                 else                 {                    // 2. shared key, need to be challenged                    Seq++;                    RemoteStatus = MLME_SUCCESS;										// Get an unused nonpaged memory                    NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);                      if(NStatus != NDIS_STATUS_SUCCESS)                     {                        DBGPRINT(RT_DEBUG_TRACE, ("AUTH - PeerAuthRspAtSeq2Action() allocate memory fail\n"));                        pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;                        Status2 = MLME_FAIL_NO_RESOURCE;                        MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status2);                        return;                    }                                        DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Send AUTH request seq#3...\n"));                    MgtMacHeaderInit(pAd, &AuthHdr, SUBTYPE_AUTH, 0, Addr2, pAd->MlmeAux.Bssid);                    AuthHdr.FC.Wep = 1;                    // Encrypt challenge text & auth information                    RTMPInitWepEngine(                    	pAd,                    	pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].Key,                    	pAd->StaCfg.DefaultKeyId,                    	pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].KeyLen,                    	CyperChlgText);					Alg = cpu2le16(*(USHORT *)&Alg);					Seq = cpu2le16(*(USHORT *)&Seq);					RemoteStatus= cpu2le16(*(USHORT *)&RemoteStatus);                    									RTMPEncryptData(pAd, (PUCHAR) &Alg, CyperChlgText + 4, 2);					RTMPEncryptData(pAd, (PUCHAR) &Seq, CyperChlgText + 6, 2);					RTMPEncryptData(pAd, (PUCHAR) &RemoteStatus, CyperChlgText + 8, 2);					Element[0] = 16;					Element[1] = 128;					RTMPEncryptData(pAd, Element, CyperChlgText + 10, 2);					RTMPEncryptData(pAd, ChlgText, CyperChlgText + 12, 128);					RTMPSetICV(pAd, CyperChlgText + 140);                    MakeOutgoingFrame(pOutBuffer,               &FrameLen,                                       sizeof(HEADER_802_11),    &AuthHdr,                                        CIPHER_TEXT_LEN + 16,     CyperChlgText,                                       END_OF_ARGS);                    MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);                	MlmeFreeMemory(pAd, pOutBuffer);                    RTMPSetTimer(&pAd->MlmeAux.AuthTimer, AUTH_TIMEOUT);                    pAd->Mlme.AuthMachine.CurrState = AUTH_WAIT_SEQ4;                }            }             else             {                pAd->StaCfg.AuthFailReason = Status;                COPY_MAC_ADDR(pAd->StaCfg.AuthFailSta, Addr2);                pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;                MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status);            }        }    }    else    {        DBGPRINT(RT_DEBUG_TRACE, ("AUTH - PeerAuthSanity() sanity check fail\n"));    }}/*    ==========================================================================    Description:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -