- supported.conf: Added sparse_keymap (eeepc_laptop depends on it)
[linux-flexiantxendom0-3.2.10.git] / drivers / staging / rt3090 / sta / auth_rsp.c
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
38 #include "../rt_config.h"
39
40
41 /*
42     ==========================================================================
43     Description:
44         authentication state machine init procedure
45     Parameters:
46         Sm - the state machine
47
48         IRQL = PASSIVE_LEVEL
49
50     ==========================================================================
51  */
52 VOID AuthRspStateMachineInit(
53     IN PRTMP_ADAPTER pAd,
54     IN PSTATE_MACHINE Sm,
55     IN STATE_MACHINE_FUNC Trans[])
56 {
57     StateMachineInit(Sm, Trans, MAX_AUTH_RSP_STATE, MAX_AUTH_RSP_MSG, (STATE_MACHINE_FUNC)Drop, AUTH_RSP_IDLE, AUTH_RSP_MACHINE_BASE);
58
59     // column 1
60     StateMachineSetAction(Sm, AUTH_RSP_IDLE, MT2_PEER_DEAUTH, (STATE_MACHINE_FUNC)PeerDeauthAction);
61
62     // column 2
63     StateMachineSetAction(Sm, AUTH_RSP_WAIT_CHAL, MT2_PEER_DEAUTH, (STATE_MACHINE_FUNC)PeerDeauthAction);
64
65 }
66
67 /*
68     ==========================================================================
69     Description:
70
71         IRQL = DISPATCH_LEVEL
72
73     ==========================================================================
74 */
75 VOID PeerAuthSimpleRspGenAndSend(
76     IN PRTMP_ADAPTER pAd,
77     IN PHEADER_802_11 pHdr80211,
78     IN USHORT Alg,
79     IN USHORT Seq,
80     IN USHORT Reason,
81     IN USHORT Status)
82 {
83     HEADER_802_11     AuthHdr;
84     ULONG             FrameLen = 0;
85     PUCHAR            pOutBuffer = NULL;
86     NDIS_STATUS       NStatus;
87
88     if (Reason != MLME_SUCCESS)
89     {
90         DBGPRINT(RT_DEBUG_TRACE, ("Peer AUTH fail...\n"));
91         return;
92     }
93
94         //Get an unused nonpaged memory
95     NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);
96     if (NStatus != NDIS_STATUS_SUCCESS)
97         return;
98
99     DBGPRINT(RT_DEBUG_TRACE, ("Send AUTH response (seq#2)...\n"));
100     MgtMacHeaderInit(pAd, &AuthHdr, SUBTYPE_AUTH, 0, pHdr80211->Addr2, pAd->MlmeAux.Bssid);
101     MakeOutgoingFrame(pOutBuffer,               &FrameLen,
102                       sizeof(HEADER_802_11),    &AuthHdr,
103                       2,                        &Alg,
104                       2,                        &Seq,
105                       2,                        &Reason,
106                       END_OF_ARGS);
107     MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
108         MlmeFreeMemory(pAd, pOutBuffer);
109 }
110
111 /*
112     ==========================================================================
113     Description:
114
115         IRQL = DISPATCH_LEVEL
116
117     ==========================================================================
118 */
119 VOID PeerDeauthAction(
120     IN PRTMP_ADAPTER pAd,
121     IN PMLME_QUEUE_ELEM Elem)
122 {
123     UCHAR       Addr2[MAC_ADDR_LEN];
124     USHORT      Reason;
125
126     if (PeerDeauthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Reason))
127     {
128         if (INFRA_ON(pAd)
129                         && MAC_ADDR_EQUAL(Addr2, pAd->CommonCfg.Bssid)
130                         )
131         {
132             DBGPRINT(RT_DEBUG_TRACE,("AUTH_RSP - receive DE-AUTH from our AP (Reason=%d)\n", Reason));
133
134
135 #ifdef NATIVE_WPA_SUPPLICANT_SUPPORT
136                 RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, NULL, NULL, 0);
137 #endif // NATIVE_WPA_SUPPLICANT_SUPPORT //
138
139
140                         // send wireless event - for deauthentication
141                         if (pAd->CommonCfg.bWirelessEvent)
142                                 RTMPSendWirelessEvent(pAd, IW_DEAUTH_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);
143
144             LinkDown(pAd, TRUE);
145         }
146     }
147     else
148     {
149         DBGPRINT(RT_DEBUG_TRACE,("AUTH_RSP - PeerDeauthAction() sanity check fail\n"));
150     }
151 }