1 /*
2  *************************************************************************
3  * Ralink Tech Inc.
4  * 5F., No.36, Taiyuan St., Jhubei City,
5  * Hsinchu County 302,
6  * Taiwan, R.O.C.
7  *
8  * (c) Copyright 2002-2007, Ralink Technology, Inc.
9  *
10  * This program is free software; you can redistribute it and/or modify  *
11  * it under the terms of the GNU General Public License as published by  *
12  * the Free Software Foundation; either version 2 of the License, or     *
13  * (at your option) any later version.                                   *
14  *                                                                       *
15  * This program is distributed in the hope that it will be useful,       *
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
18  * GNU General Public License for more details.                          *
19  *                                                                       *
20  * You should have received a copy of the GNU General Public License     *
21  * along with this program; if not, write to the                         *
22  * Free Software Foundation, Inc.,                                       *
23  * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
24  *                                                                       *
25  *************************************************************************
26 
27 	Module Name:
28 	auth_rsp.c
29 
30 	Abstract:
31 
32 	Revision History:
33 	Who			When			What
34 	--------	----------		----------------------------------------------
35 	John		2004-10-1		copy from RT2560
36 */
37 #include "../rt_config.h"
38 
39 /*
40     ==========================================================================
41     Description:
42         authentication state machine init procedure
43     Parameters:
44         Sm - the state machine
45 
46 	IRQL = PASSIVE_LEVEL
47 
48     ==========================================================================
49  */
AuthRspStateMachineInit(struct rt_rtmp_adapter * pAd,struct rt_state_machine * Sm,IN STATE_MACHINE_FUNC Trans[])50 void AuthRspStateMachineInit(struct rt_rtmp_adapter *pAd,
51 			     struct rt_state_machine *Sm,
52 			     IN STATE_MACHINE_FUNC Trans[])
53 {
54 	StateMachineInit(Sm, Trans, MAX_AUTH_RSP_STATE, MAX_AUTH_RSP_MSG,
55 			 (STATE_MACHINE_FUNC) Drop, AUTH_RSP_IDLE,
56 			 AUTH_RSP_MACHINE_BASE);
57 
58 	/* column 1 */
59 	StateMachineSetAction(Sm, AUTH_RSP_IDLE, MT2_PEER_DEAUTH,
60 			      (STATE_MACHINE_FUNC) PeerDeauthAction);
61 
62 	/* column 2 */
63 	StateMachineSetAction(Sm, AUTH_RSP_WAIT_CHAL, MT2_PEER_DEAUTH,
64 			      (STATE_MACHINE_FUNC) PeerDeauthAction);
65 
66 }
67 
68 /*
69     ==========================================================================
70     Description:
71 
72 	IRQL = DISPATCH_LEVEL
73 
74     ==========================================================================
75 */
PeerAuthSimpleRspGenAndSend(struct rt_rtmp_adapter * pAd,struct rt_header_802_11 * pHdr80211,u16 Alg,u16 Seq,u16 Reason,u16 Status)76 void PeerAuthSimpleRspGenAndSend(struct rt_rtmp_adapter *pAd,
77 				 struct rt_header_802_11 * pHdr80211,
78 				 u16 Alg,
79 				 u16 Seq,
80 				 u16 Reason, u16 Status)
81 {
82 	struct rt_header_802_11 AuthHdr;
83 	unsigned long FrameLen = 0;
84 	u8 *pOutBuffer = NULL;
85 	int NStatus;
86 
87 	if (Reason != MLME_SUCCESS) {
88 		DBGPRINT(RT_DEBUG_TRACE, ("Peer AUTH fail...\n"));
89 		return;
90 	}
91 	/*Get an unused nonpaged memory */
92 	NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);
93 	if (NStatus != NDIS_STATUS_SUCCESS)
94 		return;
95 
96 	DBGPRINT(RT_DEBUG_TRACE, ("Send AUTH response (seq#2)...\n"));
97 	MgtMacHeaderInit(pAd, &AuthHdr, SUBTYPE_AUTH, 0, pHdr80211->Addr2,
98 			 pAd->MlmeAux.Bssid);
99 	MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(struct rt_header_802_11),
100 			  &AuthHdr, 2, &Alg, 2, &Seq, 2, &Reason, END_OF_ARGS);
101 	MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
102 	MlmeFreeMemory(pAd, pOutBuffer);
103 }
104 
105 /*
106     ==========================================================================
107     Description:
108 
109 	IRQL = DISPATCH_LEVEL
110 
111     ==========================================================================
112 */
PeerDeauthAction(struct rt_rtmp_adapter * pAd,struct rt_mlme_queue_elem * Elem)113 void PeerDeauthAction(struct rt_rtmp_adapter *pAd, struct rt_mlme_queue_elem *Elem)
114 {
115 	u8 Addr2[MAC_ADDR_LEN];
116 	u16 Reason;
117 
118 	if (PeerDeauthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Reason)) {
119 		if (INFRA_ON(pAd)
120 		    && MAC_ADDR_EQUAL(Addr2, pAd->CommonCfg.Bssid)
121 		    ) {
122 			DBGPRINT(RT_DEBUG_TRACE,
123 				 ("AUTH_RSP - receive DE-AUTH from our AP (Reason=%d)\n",
124 				  Reason));
125 
126 			RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, NULL, NULL,
127 						0);
128 
129 			/* send wireless event - for deauthentication */
130 			if (pAd->CommonCfg.bWirelessEvent)
131 				RTMPSendWirelessEvent(pAd, IW_DEAUTH_EVENT_FLAG,
132 						      pAd->MacTab.
133 						      Content[BSSID_WCID].Addr,
134 						      BSS0, 0);
135 
136 			LinkDown(pAd, TRUE);
137 		}
138 	} else {
139 		DBGPRINT(RT_DEBUG_TRACE,
140 			 ("AUTH_RSP - PeerDeauthAction() sanity check fail\n"));
141 	}
142 }
143