aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2009-12-11 15:23:14 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2009-12-11 15:23:14 -0500
commit0f65bec15b2184dcf98dbdbf03187057de842eb5 (patch)
treec767a059ee14864094952ea8c578180b46ef6115
parent96b3c83dc27dca271594463aa99e166974a91171 (diff)
Staging: rt28x0: run sta/*.c files through Lindent
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/staging/rt2860/sta/assoc.c1579
-rw-r--r--drivers/staging/rt2860/sta/auth.c621
-rw-r--r--drivers/staging/rt2860/sta/auth_rsp.c124
-rw-r--r--drivers/staging/rt2860/sta/connect.c2348
-rw-r--r--drivers/staging/rt2860/sta/rtmp_data.c2196
-rw-r--r--drivers/staging/rt2860/sta/sanity.c489
-rw-r--r--drivers/staging/rt2860/sta/sync.c2094
-rw-r--r--drivers/staging/rt2860/sta/wpa.c272
8 files changed, 5085 insertions, 4638 deletions
diff --git a/drivers/staging/rt2860/sta/assoc.c b/drivers/staging/rt2860/sta/assoc.c
index a67e213718d..e9774164de2 100644
--- a/drivers/staging/rt2860/sta/assoc.c
+++ b/drivers/staging/rt2860/sta/assoc.c
@@ -36,31 +36,31 @@
36*/ 36*/
37#include "../rt_config.h" 37#include "../rt_config.h"
38 38
39UCHAR CipherWpaTemplate[] = { 39UCHAR CipherWpaTemplate[] = {
40 0xdd, // WPA IE 40 0xdd, // WPA IE
41 0x16, // Length 41 0x16, // Length
42 0x00, 0x50, 0xf2, 0x01, // oui 42 0x00, 0x50, 0xf2, 0x01, // oui
43 0x01, 0x00, // Version 43 0x01, 0x00, // Version
44 0x00, 0x50, 0xf2, 0x02, // Multicast 44 0x00, 0x50, 0xf2, 0x02, // Multicast
45 0x01, 0x00, // Number of unicast 45 0x01, 0x00, // Number of unicast
46 0x00, 0x50, 0xf2, 0x02, // unicast 46 0x00, 0x50, 0xf2, 0x02, // unicast
47 0x01, 0x00, // number of authentication method 47 0x01, 0x00, // number of authentication method
48 0x00, 0x50, 0xf2, 0x01 // authentication 48 0x00, 0x50, 0xf2, 0x01 // authentication
49 }; 49};
50 50
51UCHAR CipherWpa2Template[] = { 51UCHAR CipherWpa2Template[] = {
52 0x30, // RSN IE 52 0x30, // RSN IE
53 0x14, // Length 53 0x14, // Length
54 0x01, 0x00, // Version 54 0x01, 0x00, // Version
55 0x00, 0x0f, 0xac, 0x02, // group cipher, TKIP 55 0x00, 0x0f, 0xac, 0x02, // group cipher, TKIP
56 0x01, 0x00, // number of pairwise 56 0x01, 0x00, // number of pairwise
57 0x00, 0x0f, 0xac, 0x02, // unicast 57 0x00, 0x0f, 0xac, 0x02, // unicast
58 0x01, 0x00, // number of authentication method 58 0x01, 0x00, // number of authentication method
59 0x00, 0x0f, 0xac, 0x02, // authentication 59 0x00, 0x0f, 0xac, 0x02, // authentication
60 0x00, 0x00, // RSN capability 60 0x00, 0x00, // RSN capability
61 }; 61};
62 62
63UCHAR Ccx2IeInfo[] = { 0x00, 0x40, 0x96, 0x03, 0x02}; 63UCHAR Ccx2IeInfo[] = { 0x00, 0x40, 0x96, 0x03, 0x02 };
64 64
65/* 65/*
66 ========================================================================== 66 ==========================================================================
@@ -73,55 +73,84 @@ UCHAR Ccx2IeInfo[] = { 0x00, 0x40, 0x96, 0x03, 0x02};
73 73
74 ========================================================================== 74 ==========================================================================
75 */ 75 */
76VOID AssocStateMachineInit( 76VOID AssocStateMachineInit(IN PRTMP_ADAPTER pAd,
77 IN PRTMP_ADAPTER pAd, 77 IN STATE_MACHINE * S, OUT STATE_MACHINE_FUNC Trans[])
78 IN STATE_MACHINE *S,
79 OUT STATE_MACHINE_FUNC Trans[])
80{ 78{
81 StateMachineInit(S, Trans, MAX_ASSOC_STATE, MAX_ASSOC_MSG, (STATE_MACHINE_FUNC)Drop, ASSOC_IDLE, ASSOC_MACHINE_BASE); 79 StateMachineInit(S, Trans, MAX_ASSOC_STATE, MAX_ASSOC_MSG,
80 (STATE_MACHINE_FUNC) Drop, ASSOC_IDLE,
81 ASSOC_MACHINE_BASE);
82 82
83 // first column 83 // first column
84 StateMachineSetAction(S, ASSOC_IDLE, MT2_MLME_ASSOC_REQ, (STATE_MACHINE_FUNC)MlmeAssocReqAction); 84 StateMachineSetAction(S, ASSOC_IDLE, MT2_MLME_ASSOC_REQ,
85 StateMachineSetAction(S, ASSOC_IDLE, MT2_MLME_REASSOC_REQ, (STATE_MACHINE_FUNC)MlmeReassocReqAction); 85 (STATE_MACHINE_FUNC) MlmeAssocReqAction);
86 StateMachineSetAction(S, ASSOC_IDLE, MT2_MLME_DISASSOC_REQ, (STATE_MACHINE_FUNC)MlmeDisassocReqAction); 86 StateMachineSetAction(S, ASSOC_IDLE, MT2_MLME_REASSOC_REQ,
87 StateMachineSetAction(S, ASSOC_IDLE, MT2_PEER_DISASSOC_REQ, (STATE_MACHINE_FUNC)PeerDisassocAction); 87 (STATE_MACHINE_FUNC) MlmeReassocReqAction);
88 StateMachineSetAction(S, ASSOC_IDLE, MT2_MLME_DISASSOC_REQ,
89 (STATE_MACHINE_FUNC) MlmeDisassocReqAction);
90 StateMachineSetAction(S, ASSOC_IDLE, MT2_PEER_DISASSOC_REQ,
91 (STATE_MACHINE_FUNC) PeerDisassocAction);
88 92
89 // second column 93 // second column
90 StateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_MLME_ASSOC_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenAssoc); 94 StateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_MLME_ASSOC_REQ,
91 StateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_MLME_REASSOC_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenReassoc); 95 (STATE_MACHINE_FUNC) InvalidStateWhenAssoc);
92 StateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_MLME_DISASSOC_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenDisassociate); 96 StateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_MLME_REASSOC_REQ,
93 StateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_PEER_DISASSOC_REQ, (STATE_MACHINE_FUNC)PeerDisassocAction); 97 (STATE_MACHINE_FUNC) InvalidStateWhenReassoc);
94 StateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_PEER_ASSOC_RSP, (STATE_MACHINE_FUNC)PeerAssocRspAction); 98 StateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_MLME_DISASSOC_REQ,
99 (STATE_MACHINE_FUNC)
100 InvalidStateWhenDisassociate);
101 StateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_PEER_DISASSOC_REQ,
102 (STATE_MACHINE_FUNC) PeerDisassocAction);
103 StateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_PEER_ASSOC_RSP,
104 (STATE_MACHINE_FUNC) PeerAssocRspAction);
95 // 105 //
96 // Patch 3Com AP MOde:3CRWE454G72 106 // Patch 3Com AP MOde:3CRWE454G72
97 // We send Assoc request frame to this AP, it always send Reassoc Rsp not Associate Rsp. 107 // We send Assoc request frame to this AP, it always send Reassoc Rsp not Associate Rsp.
98 // 108 //
99 StateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_PEER_REASSOC_RSP, (STATE_MACHINE_FUNC)PeerAssocRspAction); 109 StateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_PEER_REASSOC_RSP,
100 StateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_ASSOC_TIMEOUT, (STATE_MACHINE_FUNC)AssocTimeoutAction); 110 (STATE_MACHINE_FUNC) PeerAssocRspAction);
111 StateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_ASSOC_TIMEOUT,
112 (STATE_MACHINE_FUNC) AssocTimeoutAction);
101 113
102 // third column 114 // third column
103 StateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_MLME_ASSOC_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenAssoc); 115 StateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_MLME_ASSOC_REQ,
104 StateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_MLME_REASSOC_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenReassoc); 116 (STATE_MACHINE_FUNC) InvalidStateWhenAssoc);
105 StateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_MLME_DISASSOC_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenDisassociate); 117 StateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_MLME_REASSOC_REQ,
106 StateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_PEER_DISASSOC_REQ, (STATE_MACHINE_FUNC)PeerDisassocAction); 118 (STATE_MACHINE_FUNC) InvalidStateWhenReassoc);
107 StateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_PEER_REASSOC_RSP, (STATE_MACHINE_FUNC)PeerReassocRspAction); 119 StateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_MLME_DISASSOC_REQ,
120 (STATE_MACHINE_FUNC)
121 InvalidStateWhenDisassociate);
122 StateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_PEER_DISASSOC_REQ,
123 (STATE_MACHINE_FUNC) PeerDisassocAction);
124 StateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_PEER_REASSOC_RSP,
125 (STATE_MACHINE_FUNC) PeerReassocRspAction);
108 // 126 //
109 // Patch, AP doesn't send Reassociate Rsp frame to Station. 127 // Patch, AP doesn't send Reassociate Rsp frame to Station.
110 // 128 //
111 StateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_PEER_ASSOC_RSP, (STATE_MACHINE_FUNC)PeerReassocRspAction); 129 StateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_PEER_ASSOC_RSP,
112 StateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_REASSOC_TIMEOUT, (STATE_MACHINE_FUNC)ReassocTimeoutAction); 130 (STATE_MACHINE_FUNC) PeerReassocRspAction);
131 StateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_REASSOC_TIMEOUT,
132 (STATE_MACHINE_FUNC) ReassocTimeoutAction);
113 133
114 // fourth column 134 // fourth column
115 StateMachineSetAction(S, DISASSOC_WAIT_RSP, MT2_MLME_ASSOC_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenAssoc); 135 StateMachineSetAction(S, DISASSOC_WAIT_RSP, MT2_MLME_ASSOC_REQ,
116 StateMachineSetAction(S, DISASSOC_WAIT_RSP, MT2_MLME_REASSOC_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenReassoc); 136 (STATE_MACHINE_FUNC) InvalidStateWhenAssoc);
117 StateMachineSetAction(S, DISASSOC_WAIT_RSP, MT2_MLME_DISASSOC_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenDisassociate); 137 StateMachineSetAction(S, DISASSOC_WAIT_RSP, MT2_MLME_REASSOC_REQ,
118 StateMachineSetAction(S, DISASSOC_WAIT_RSP, MT2_PEER_DISASSOC_REQ, (STATE_MACHINE_FUNC)PeerDisassocAction); 138 (STATE_MACHINE_FUNC) InvalidStateWhenReassoc);
119 StateMachineSetAction(S, DISASSOC_WAIT_RSP, MT2_DISASSOC_TIMEOUT, (STATE_MACHINE_FUNC)DisassocTimeoutAction); 139 StateMachineSetAction(S, DISASSOC_WAIT_RSP, MT2_MLME_DISASSOC_REQ,
140 (STATE_MACHINE_FUNC)
141 InvalidStateWhenDisassociate);
142 StateMachineSetAction(S, DISASSOC_WAIT_RSP, MT2_PEER_DISASSOC_REQ,
143 (STATE_MACHINE_FUNC) PeerDisassocAction);
144 StateMachineSetAction(S, DISASSOC_WAIT_RSP, MT2_DISASSOC_TIMEOUT,
145 (STATE_MACHINE_FUNC) DisassocTimeoutAction);
120 146
121 // initialize the timer 147 // initialize the timer
122 RTMPInitTimer(pAd, &pAd->MlmeAux.AssocTimer, GET_TIMER_FUNCTION(AssocTimeout), pAd, FALSE); 148 RTMPInitTimer(pAd, &pAd->MlmeAux.AssocTimer,
123 RTMPInitTimer(pAd, &pAd->MlmeAux.ReassocTimer, GET_TIMER_FUNCTION(ReassocTimeout), pAd, FALSE); 149 GET_TIMER_FUNCTION(AssocTimeout), pAd, FALSE);
124 RTMPInitTimer(pAd, &pAd->MlmeAux.DisassocTimer, GET_TIMER_FUNCTION(DisassocTimeout), pAd, FALSE); 150 RTMPInitTimer(pAd, &pAd->MlmeAux.ReassocTimer,
151 GET_TIMER_FUNCTION(ReassocTimeout), pAd, FALSE);
152 RTMPInitTimer(pAd, &pAd->MlmeAux.DisassocTimer,
153 GET_TIMER_FUNCTION(DisassocTimeout), pAd, FALSE);
125} 154}
126 155
127/* 156/*
@@ -137,15 +166,15 @@ VOID AssocStateMachineInit(
137 ========================================================================== 166 ==========================================================================
138 */ 167 */
139VOID AssocTimeout(IN PVOID SystemSpecific1, 168VOID AssocTimeout(IN PVOID SystemSpecific1,
140 IN PVOID FunctionContext, 169 IN PVOID FunctionContext,
141 IN PVOID SystemSpecific2, 170 IN PVOID SystemSpecific2, IN PVOID SystemSpecific3)
142 IN PVOID SystemSpecific3)
143{ 171{
144 RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext; 172 RTMP_ADAPTER *pAd = (RTMP_ADAPTER *) FunctionContext;
145 173
146 // Do nothing if the driver is starting halt state. 174 // Do nothing if the driver is starting halt state.
147 // This might happen when timer already been fired before cancel timer with mlmehalt 175 // This might happen when timer already been fired before cancel timer with mlmehalt
148 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) 176 if (RTMP_TEST_FLAG
177 (pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
149 return; 178 return;
150 179
151 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_ASSOC_TIMEOUT, 0, NULL); 180 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_ASSOC_TIMEOUT, 0, NULL);
@@ -165,15 +194,15 @@ VOID AssocTimeout(IN PVOID SystemSpecific1,
165 ========================================================================== 194 ==========================================================================
166 */ 195 */
167VOID ReassocTimeout(IN PVOID SystemSpecific1, 196VOID ReassocTimeout(IN PVOID SystemSpecific1,
168 IN PVOID FunctionContext, 197 IN PVOID FunctionContext,
169 IN PVOID SystemSpecific2, 198 IN PVOID SystemSpecific2, IN PVOID SystemSpecific3)
170 IN PVOID SystemSpecific3)
171{ 199{
172 RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext; 200 RTMP_ADAPTER *pAd = (RTMP_ADAPTER *) FunctionContext;
173 201
174 // Do nothing if the driver is starting halt state. 202 // Do nothing if the driver is starting halt state.
175 // This might happen when timer already been fired before cancel timer with mlmehalt 203 // This might happen when timer already been fired before cancel timer with mlmehalt
176 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) 204 if (RTMP_TEST_FLAG
205 (pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
177 return; 206 return;
178 207
179 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_REASSOC_TIMEOUT, 0, NULL); 208 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_REASSOC_TIMEOUT, 0, NULL);
@@ -193,15 +222,15 @@ VOID ReassocTimeout(IN PVOID SystemSpecific1,
193 ========================================================================== 222 ==========================================================================
194 */ 223 */
195VOID DisassocTimeout(IN PVOID SystemSpecific1, 224VOID DisassocTimeout(IN PVOID SystemSpecific1,
196 IN PVOID FunctionContext, 225 IN PVOID FunctionContext,
197 IN PVOID SystemSpecific2, 226 IN PVOID SystemSpecific2, IN PVOID SystemSpecific3)
198 IN PVOID SystemSpecific3)
199{ 227{
200 RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext; 228 RTMP_ADAPTER *pAd = (RTMP_ADAPTER *) FunctionContext;
201 229
202 // Do nothing if the driver is starting halt state. 230 // Do nothing if the driver is starting halt state.
203 // This might happen when timer already been fired before cancel timer with mlmehalt 231 // This might happen when timer already been fired before cancel timer with mlmehalt
204 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) 232 if (RTMP_TEST_FLAG
233 (pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
205 return; 234 return;
206 235
207 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_DISASSOC_TIMEOUT, 0, NULL); 236 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_DISASSOC_TIMEOUT, 0, NULL);
@@ -230,136 +259,145 @@ VOID DisassocTimeout(IN PVOID SystemSpecific1,
230 259
231 ========================================================================== 260 ==========================================================================
232 */ 261 */
233VOID MlmeAssocReqAction( 262VOID MlmeAssocReqAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
234 IN PRTMP_ADAPTER pAd,
235 IN MLME_QUEUE_ELEM *Elem)
236{ 263{
237 UCHAR ApAddr[6]; 264 UCHAR ApAddr[6];
238 HEADER_802_11 AssocHdr; 265 HEADER_802_11 AssocHdr;
239 UCHAR WmeIe[9] = {IE_VENDOR_SPECIFIC, 0x07, 0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; 266 UCHAR WmeIe[9] =
240 USHORT ListenIntv; 267 { IE_VENDOR_SPECIFIC, 0x07, 0x00, 0x50, 0xf2, 0x02, 0x00, 0x01,
241 ULONG Timeout; 268 0x00 };
242 USHORT CapabilityInfo; 269 USHORT ListenIntv;
243 BOOLEAN TimerCancelled; 270 ULONG Timeout;
244 PUCHAR pOutBuffer = NULL; 271 USHORT CapabilityInfo;
245 NDIS_STATUS NStatus; 272 BOOLEAN TimerCancelled;
246 ULONG FrameLen = 0; 273 PUCHAR pOutBuffer = NULL;
247 ULONG tmp; 274 NDIS_STATUS NStatus;
248 USHORT VarIesOffset; 275 ULONG FrameLen = 0;
249 USHORT Status; 276 ULONG tmp;
277 USHORT VarIesOffset;
278 USHORT Status;
250 279
251 // Block all authentication request durning WPA block period 280 // Block all authentication request durning WPA block period
252 if (pAd->StaCfg.bBlockAssoc == TRUE) 281 if (pAd->StaCfg.bBlockAssoc == TRUE) {
253 { 282 DBGPRINT(RT_DEBUG_TRACE,
254 DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - Block Assoc request durning WPA block period!\n")); 283 ("ASSOC - Block Assoc request durning WPA block period!\n"));
255 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; 284 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
256 Status = MLME_STATE_MACHINE_REJECT; 285 Status = MLME_STATE_MACHINE_REJECT;
257 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_ASSOC_CONF, 2, &Status); 286 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_ASSOC_CONF, 2,
287 &Status);
258 } 288 }
259 // check sanity first 289 // check sanity first
260 else if (MlmeAssocReqSanity(pAd, Elem->Msg, Elem->MsgLen, ApAddr, &CapabilityInfo, &Timeout, &ListenIntv)) 290 else if (MlmeAssocReqSanity
261 { 291 (pAd, Elem->Msg, Elem->MsgLen, ApAddr, &CapabilityInfo,
292 &Timeout, &ListenIntv)) {
262 RTMPCancelTimer(&pAd->MlmeAux.AssocTimer, &TimerCancelled); 293 RTMPCancelTimer(&pAd->MlmeAux.AssocTimer, &TimerCancelled);
263 COPY_MAC_ADDR(pAd->MlmeAux.Bssid, ApAddr); 294 COPY_MAC_ADDR(pAd->MlmeAux.Bssid, ApAddr);
264 295
265 // Get an unused nonpaged memory 296 // Get an unused nonpaged memory
266 NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); 297 NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);
267 if (NStatus != NDIS_STATUS_SUCCESS) 298 if (NStatus != NDIS_STATUS_SUCCESS) {
268 { 299 DBGPRINT(RT_DEBUG_TRACE,
269 DBGPRINT(RT_DEBUG_TRACE,("ASSOC - MlmeAssocReqAction() allocate memory failed \n")); 300 ("ASSOC - MlmeAssocReqAction() allocate memory failed \n"));
270 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; 301 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
271 Status = MLME_FAIL_NO_RESOURCE; 302 Status = MLME_FAIL_NO_RESOURCE;
272 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_ASSOC_CONF, 2, &Status); 303 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE,
304 MT2_ASSOC_CONF, 2, &Status);
273 return; 305 return;
274 } 306 }
275
276 // Add by James 03/06/27 307 // Add by James 03/06/27
277 pAd->StaCfg.AssocInfo.Length = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); 308 pAd->StaCfg.AssocInfo.Length =
309 sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);
278 // Association don't need to report MAC address 310 // Association don't need to report MAC address
279 pAd->StaCfg.AssocInfo.AvailableRequestFixedIEs = 311 pAd->StaCfg.AssocInfo.AvailableRequestFixedIEs =
280 NDIS_802_11_AI_REQFI_CAPABILITIES | NDIS_802_11_AI_REQFI_LISTENINTERVAL; 312 NDIS_802_11_AI_REQFI_CAPABILITIES |
281 pAd->StaCfg.AssocInfo.RequestFixedIEs.Capabilities = CapabilityInfo; 313 NDIS_802_11_AI_REQFI_LISTENINTERVAL;
282 pAd->StaCfg.AssocInfo.RequestFixedIEs.ListenInterval = ListenIntv; 314 pAd->StaCfg.AssocInfo.RequestFixedIEs.Capabilities =
315 CapabilityInfo;
316 pAd->StaCfg.AssocInfo.RequestFixedIEs.ListenInterval =
317 ListenIntv;
283 // Only reassociate need this 318 // Only reassociate need this
284 //COPY_MAC_ADDR(pAd->StaCfg.AssocInfo.RequestFixedIEs.CurrentAPAddress, ApAddr); 319 //COPY_MAC_ADDR(pAd->StaCfg.AssocInfo.RequestFixedIEs.CurrentAPAddress, ApAddr);
285 pAd->StaCfg.AssocInfo.OffsetRequestIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); 320 pAd->StaCfg.AssocInfo.OffsetRequestIEs =
321 sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);
286 322
287 NdisZeroMemory(pAd->StaCfg.ReqVarIEs, MAX_VIE_LEN); 323 NdisZeroMemory(pAd->StaCfg.ReqVarIEs, MAX_VIE_LEN);
288 // First add SSID 324 // First add SSID
289 VarIesOffset = 0; 325 VarIesOffset = 0;
290 NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &SsidIe, 1); 326 NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &SsidIe,
327 1);
291 VarIesOffset += 1; 328 VarIesOffset += 1;
292 NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &pAd->MlmeAux.SsidLen, 1); 329 NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset,
330 &pAd->MlmeAux.SsidLen, 1);
293 VarIesOffset += 1; 331 VarIesOffset += 1;
294 NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen); 332 NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset,
333 pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen);
295 VarIesOffset += pAd->MlmeAux.SsidLen; 334 VarIesOffset += pAd->MlmeAux.SsidLen;
296 335
297 // Second add Supported rates 336 // Second add Supported rates
298 NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &SupRateIe, 1); 337 NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &SupRateIe,
338 1);
299 VarIesOffset += 1; 339 VarIesOffset += 1;
300 NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &pAd->MlmeAux.SupRateLen, 1); 340 NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset,
341 &pAd->MlmeAux.SupRateLen, 1);
301 VarIesOffset += 1; 342 VarIesOffset += 1;
302 NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, pAd->MlmeAux.SupRate, pAd->MlmeAux.SupRateLen); 343 NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset,
344 pAd->MlmeAux.SupRate, pAd->MlmeAux.SupRateLen);
303 VarIesOffset += pAd->MlmeAux.SupRateLen; 345 VarIesOffset += pAd->MlmeAux.SupRateLen;
304 // End Add by James 346 // End Add by James
305 347
306 if ((pAd->CommonCfg.Channel > 14) && 348 if ((pAd->CommonCfg.Channel > 14) &&
307 (pAd->CommonCfg.bIEEE80211H == TRUE)) 349 (pAd->CommonCfg.bIEEE80211H == TRUE))
308 CapabilityInfo |= 0x0100; 350 CapabilityInfo |= 0x0100;
309 351
310 DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - Send ASSOC request...\n")); 352 DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - Send ASSOC request...\n"));
311 MgtMacHeaderInit(pAd, &AssocHdr, SUBTYPE_ASSOC_REQ, 0, ApAddr, ApAddr); 353 MgtMacHeaderInit(pAd, &AssocHdr, SUBTYPE_ASSOC_REQ, 0, ApAddr,
354 ApAddr);
312 355
313 // Build basic frame first 356 // Build basic frame first
314 MakeOutgoingFrame(pOutBuffer, &FrameLen, 357 MakeOutgoingFrame(pOutBuffer, &FrameLen,
315 sizeof(HEADER_802_11), &AssocHdr, 358 sizeof(HEADER_802_11), &AssocHdr,
316 2, &CapabilityInfo, 359 2, &CapabilityInfo,
317 2, &ListenIntv, 360 2, &ListenIntv,
318 1, &SsidIe, 361 1, &SsidIe,
319 1, &pAd->MlmeAux.SsidLen, 362 1, &pAd->MlmeAux.SsidLen,
320 pAd->MlmeAux.SsidLen, pAd->MlmeAux.Ssid, 363 pAd->MlmeAux.SsidLen, pAd->MlmeAux.Ssid,
321 1, &SupRateIe, 364 1, &SupRateIe,
322 1, &pAd->MlmeAux.SupRateLen, 365 1, &pAd->MlmeAux.SupRateLen,
323 pAd->MlmeAux.SupRateLen, pAd->MlmeAux.SupRate, 366 pAd->MlmeAux.SupRateLen, pAd->MlmeAux.SupRate,
324 END_OF_ARGS); 367 END_OF_ARGS);
325 368
326 if (pAd->MlmeAux.ExtRateLen != 0) 369 if (pAd->MlmeAux.ExtRateLen != 0) {
327 { 370 MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,
328 MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, 371 1, &ExtRateIe,
329 1, &ExtRateIe, 372 1, &pAd->MlmeAux.ExtRateLen,
330 1, &pAd->MlmeAux.ExtRateLen, 373 pAd->MlmeAux.ExtRateLen,
331 pAd->MlmeAux.ExtRateLen, pAd->MlmeAux.ExtRate, 374 pAd->MlmeAux.ExtRate, END_OF_ARGS);
332 END_OF_ARGS);
333 FrameLen += tmp; 375 FrameLen += tmp;
334 } 376 }
335
336 // HT 377 // HT
337 if ((pAd->MlmeAux.HtCapabilityLen > 0) && (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)) 378 if ((pAd->MlmeAux.HtCapabilityLen > 0)
338 { 379 && (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)) {
339 ULONG TmpLen; 380 ULONG TmpLen;
340 UCHAR HtLen; 381 UCHAR HtLen;
341 UCHAR BROADCOM[4] = {0x0, 0x90, 0x4c, 0x33}; 382 UCHAR BROADCOM[4] = { 0x0, 0x90, 0x4c, 0x33 };
342 if (pAd->StaActive.SupportedPhyInfo.bPreNHt == TRUE) 383 if (pAd->StaActive.SupportedPhyInfo.bPreNHt == TRUE) {
343 {
344 HtLen = SIZE_HT_CAP_IE + 4; 384 HtLen = SIZE_HT_CAP_IE + 4;
345 MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 385 MakeOutgoingFrame(pOutBuffer + FrameLen,
346 1, &WpaIe, 386 &TmpLen, 1, &WpaIe, 1, &HtLen,
347 1, &HtLen, 387 4, &BROADCOM[0],
348 4, &BROADCOM[0], 388 pAd->MlmeAux.HtCapabilityLen,
349 pAd->MlmeAux.HtCapabilityLen, &pAd->MlmeAux.HtCapability, 389 &pAd->MlmeAux.HtCapability,
350 END_OF_ARGS); 390 END_OF_ARGS);
351 } 391 } else {
352 else 392 MakeOutgoingFrame(pOutBuffer + FrameLen,
353 { 393 &TmpLen, 1, &HtCapIe, 1,
354 MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 394 &pAd->MlmeAux.HtCapabilityLen,
355 1, &HtCapIe, 395 pAd->MlmeAux.HtCapabilityLen,
356 1, &pAd->MlmeAux.HtCapabilityLen, 396 &pAd->MlmeAux.HtCapability,
357 pAd->MlmeAux.HtCapabilityLen, &pAd->MlmeAux.HtCapability, 397 END_OF_ARGS);
358 END_OF_ARGS);
359 } 398 }
360 FrameLen += TmpLen; 399 FrameLen += TmpLen;
361 } 400 }
362
363 // add Ralink proprietary IE to inform AP this STA is going to use AGGREGATION or PIGGY-BACK+AGGREGATION 401 // add Ralink proprietary IE to inform AP this STA is going to use AGGREGATION or PIGGY-BACK+AGGREGATION
364 // Case I: (Aggregation + Piggy-Back) 402 // Case I: (Aggregation + Piggy-Back)
365 // 1. user enable aggregation, AND 403 // 1. user enable aggregation, AND
@@ -368,63 +406,60 @@ VOID MlmeAssocReqAction(
368 // Case II: (Aggregation) 406 // Case II: (Aggregation)
369 // 1. user enable aggregation, AND 407 // 1. user enable aggregation, AND
370 // 2. AP annouces it's AGGREGATION-capable in BEACON 408 // 2. AP annouces it's AGGREGATION-capable in BEACON
371 if (pAd->CommonCfg.bAggregationCapable) 409 if (pAd->CommonCfg.bAggregationCapable) {
372 { 410 if ((pAd->CommonCfg.bPiggyBackCapable)
373 if ((pAd->CommonCfg.bPiggyBackCapable) && ((pAd->MlmeAux.APRalinkIe & 0x00000003) == 3)) 411 && ((pAd->MlmeAux.APRalinkIe & 0x00000003) == 3)) {
374 {
375 ULONG TmpLen; 412 ULONG TmpLen;
376 UCHAR RalinkIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x03, 0x00, 0x00, 0x00}; 413 UCHAR RalinkIe[9] =
377 MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 414 { IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43,
378 9, RalinkIe, 415 0x03, 0x00, 0x00, 0x00 };
379 END_OF_ARGS); 416 MakeOutgoingFrame(pOutBuffer + FrameLen,
417 &TmpLen, 9, RalinkIe,
418 END_OF_ARGS);
380 FrameLen += TmpLen; 419 FrameLen += TmpLen;
381 } 420 } else if (pAd->MlmeAux.APRalinkIe & 0x00000001) {
382 else if (pAd->MlmeAux.APRalinkIe & 0x00000001)
383 {
384 ULONG TmpLen; 421 ULONG TmpLen;
385 UCHAR RalinkIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x01, 0x00, 0x00, 0x00}; 422 UCHAR RalinkIe[9] =
386 MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 423 { IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43,
387 9, RalinkIe, 424 0x01, 0x00, 0x00, 0x00 };
388 END_OF_ARGS); 425 MakeOutgoingFrame(pOutBuffer + FrameLen,
426 &TmpLen, 9, RalinkIe,
427 END_OF_ARGS);
389 FrameLen += TmpLen; 428 FrameLen += TmpLen;
390 } 429 }
391 } 430 } else {
392 else
393 {
394 ULONG TmpLen; 431 ULONG TmpLen;
395 UCHAR RalinkIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x06, 0x00, 0x00, 0x00}; 432 UCHAR RalinkIe[9] =
396 MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 433 { IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x06,
397 9, RalinkIe, 434 0x00, 0x00, 0x00 };
398 END_OF_ARGS); 435 MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 9,
436 RalinkIe, END_OF_ARGS);
399 FrameLen += TmpLen; 437 FrameLen += TmpLen;
400 } 438 }
401 439
402 if (pAd->MlmeAux.APEdcaParm.bValid) 440 if (pAd->MlmeAux.APEdcaParm.bValid) {
403 { 441 if (pAd->CommonCfg.bAPSDCapable
404 if (pAd->CommonCfg.bAPSDCapable && pAd->MlmeAux.APEdcaParm.bAPSDCapable) 442 && pAd->MlmeAux.APEdcaParm.bAPSDCapable) {
405 {
406 QBSS_STA_INFO_PARM QosInfo; 443 QBSS_STA_INFO_PARM QosInfo;
407 444
408 NdisZeroMemory(&QosInfo, sizeof(QBSS_STA_INFO_PARM)); 445 NdisZeroMemory(&QosInfo,
446 sizeof(QBSS_STA_INFO_PARM));
409 QosInfo.UAPSD_AC_BE = pAd->CommonCfg.bAPSDAC_BE; 447 QosInfo.UAPSD_AC_BE = pAd->CommonCfg.bAPSDAC_BE;
410 QosInfo.UAPSD_AC_BK = pAd->CommonCfg.bAPSDAC_BK; 448 QosInfo.UAPSD_AC_BK = pAd->CommonCfg.bAPSDAC_BK;
411 QosInfo.UAPSD_AC_VI = pAd->CommonCfg.bAPSDAC_VI; 449 QosInfo.UAPSD_AC_VI = pAd->CommonCfg.bAPSDAC_VI;
412 QosInfo.UAPSD_AC_VO = pAd->CommonCfg.bAPSDAC_VO; 450 QosInfo.UAPSD_AC_VO = pAd->CommonCfg.bAPSDAC_VO;
413 QosInfo.MaxSPLength = pAd->CommonCfg.MaxSPLength; 451 QosInfo.MaxSPLength =
414 WmeIe[8] |= *(PUCHAR)&QosInfo; 452 pAd->CommonCfg.MaxSPLength;
415 } 453 WmeIe[8] |= *(PUCHAR) & QosInfo;
416 else 454 } else {
417 { 455 // The Parameter Set Count is set to ¡§0¡¨ in the association request frames
418 // The Parameter Set Count is set to ¡§0¡¨ in the association request frames 456 // WmeIe[8] |= (pAd->MlmeAux.APEdcaParm.EdcaUpdateCount & 0x0f);
419 // WmeIe[8] |= (pAd->MlmeAux.APEdcaParm.EdcaUpdateCount & 0x0f);
420 } 457 }
421 458
422 MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, 459 MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,
423 9, &WmeIe[0], 460 9, &WmeIe[0], END_OF_ARGS);
424 END_OF_ARGS);
425 FrameLen += tmp; 461 FrameLen += tmp;
426 } 462 }
427
428 // 463 //
429 // Let WPA(#221) Element ID on the end of this association frame. 464 // Let WPA(#221) Element ID on the end of this association frame.
430 // Otherwise some AP will fail on parsing Element ID and set status fail on Assoc Rsp. 465 // Otherwise some AP will fail on parsing Element ID and set status fail on Assoc Rsp.
@@ -432,94 +467,107 @@ VOID MlmeAssocReqAction(
432 // This happens on AP (Model No:Linksys WRK54G) 467 // This happens on AP (Model No:Linksys WRK54G)
433 // 468 //
434 if (((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) || 469 if (((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
435 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) || 470 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) ||
436 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || 471 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) ||
437 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) 472 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2)
438 ) 473 )
439 ) 474 ) {
440 {
441 UCHAR RSNIe = IE_WPA; 475 UCHAR RSNIe = IE_WPA;
442 476
443 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) || 477 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)
444 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2)) 478 || (pAd->StaCfg.AuthMode ==
445 { 479 Ndis802_11AuthModeWPA2)) {
446 RSNIe = IE_WPA2; 480 RSNIe = IE_WPA2;
447 } 481 }
448 482
449 if ((pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_ENABLE) && 483 if ((pAd->StaCfg.WpaSupplicantUP !=
450 (pAd->StaCfg.bRSN_IE_FromWpaSupplicant == FALSE)) 484 WPA_SUPPLICANT_ENABLE)
451 RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, BSS0); 485 && (pAd->StaCfg.bRSN_IE_FromWpaSupplicant == FALSE))
486 RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode,
487 pAd->StaCfg.WepStatus, BSS0);
452 488
453 // Check for WPA PMK cache list 489 // Check for WPA PMK cache list
454 if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) 490 if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) {
455 { 491 INT idx;
456 INT idx; 492 BOOLEAN FoundPMK = FALSE;
457 BOOLEAN FoundPMK = FALSE;
458 // Search chched PMKID, append it if existed 493 // Search chched PMKID, append it if existed
459 for (idx = 0; idx < PMKID_NO; idx++) 494 for (idx = 0; idx < PMKID_NO; idx++) {
460 { 495 if (NdisEqualMemory
461 if (NdisEqualMemory(ApAddr, &pAd->StaCfg.SavedPMK[idx].BSSID, 6)) 496 (ApAddr,
462 { 497 &pAd->StaCfg.SavedPMK[idx].BSSID,
498 6)) {
463 FoundPMK = TRUE; 499 FoundPMK = TRUE;
464 break; 500 break;
465 } 501 }
466 } 502 }
467 if (FoundPMK) 503 if (FoundPMK) {
468 {
469 // Set PMK number 504 // Set PMK number
470 *(PUSHORT) &pAd->StaCfg.RSN_IE[pAd->StaCfg.RSNIE_Len] = 1; 505 *(PUSHORT) & pAd->StaCfg.RSN_IE[pAd->
471 NdisMoveMemory(&pAd->StaCfg.RSN_IE[pAd->StaCfg.RSNIE_Len + 2], &pAd->StaCfg.SavedPMK[idx].PMKID, 16); 506 StaCfg.
472 pAd->StaCfg.RSNIE_Len += 18; 507 RSNIE_Len]
508 = 1;
509 NdisMoveMemory(&pAd->StaCfg.
510 RSN_IE[pAd->StaCfg.
511 RSNIE_Len + 2],
512 &pAd->StaCfg.
513 SavedPMK[idx].PMKID, 16);
514 pAd->StaCfg.RSNIE_Len += 18;
473 } 515 }
474 } 516 }
475 517
476 if ((pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_ENABLE) && 518 if ((pAd->StaCfg.WpaSupplicantUP ==
477 (pAd->StaCfg.bRSN_IE_FromWpaSupplicant == TRUE)) 519 WPA_SUPPLICANT_ENABLE)
478 { 520 && (pAd->StaCfg.bRSN_IE_FromWpaSupplicant ==
479 MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, 521 TRUE)) {
480 pAd->StaCfg.RSNIE_Len, pAd->StaCfg.RSN_IE, 522 MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,
481 END_OF_ARGS); 523 pAd->StaCfg.RSNIE_Len,
482 } 524 pAd->StaCfg.RSN_IE,
483 else 525 END_OF_ARGS);
484 { 526 } else {
485 MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, 527 MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,
486 1, &RSNIe, 528 1, &RSNIe,
487 1, &pAd->StaCfg.RSNIE_Len, 529 1, &pAd->StaCfg.RSNIE_Len,
488 pAd->StaCfg.RSNIE_Len, pAd->StaCfg.RSN_IE, 530 pAd->StaCfg.RSNIE_Len,
489 END_OF_ARGS); 531 pAd->StaCfg.RSN_IE,
532 END_OF_ARGS);
490 } 533 }
491 534
492 FrameLen += tmp; 535 FrameLen += tmp;
493 536
494 if ((pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_ENABLE) || 537 if ((pAd->StaCfg.WpaSupplicantUP !=
495 (pAd->StaCfg.bRSN_IE_FromWpaSupplicant == FALSE)) 538 WPA_SUPPLICANT_ENABLE)
496 { 539 || (pAd->StaCfg.bRSN_IE_FromWpaSupplicant ==
497 // Append Variable IE 540 FALSE)) {
498 NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &RSNIe, 1); 541 // Append Variable IE
499 VarIesOffset += 1; 542 NdisMoveMemory(pAd->StaCfg.ReqVarIEs +
500 NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &pAd->StaCfg.RSNIE_Len, 1); 543 VarIesOffset, &RSNIe, 1);
501 VarIesOffset += 1; 544 VarIesOffset += 1;
545 NdisMoveMemory(pAd->StaCfg.ReqVarIEs +
546 VarIesOffset,
547 &pAd->StaCfg.RSNIE_Len, 1);
548 VarIesOffset += 1;
502 } 549 }
503 NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, pAd->StaCfg.RSN_IE, pAd->StaCfg.RSNIE_Len); 550 NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset,
551 pAd->StaCfg.RSN_IE,
552 pAd->StaCfg.RSNIE_Len);
504 VarIesOffset += pAd->StaCfg.RSNIE_Len; 553 VarIesOffset += pAd->StaCfg.RSNIE_Len;
505 554
506 // Set Variable IEs Length 555 // Set Variable IEs Length
507 pAd->StaCfg.ReqVarIELen = VarIesOffset; 556 pAd->StaCfg.ReqVarIELen = VarIesOffset;
508 } 557 }
509 558
510
511 MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); 559 MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
512 MlmeFreeMemory(pAd, pOutBuffer); 560 MlmeFreeMemory(pAd, pOutBuffer);
513 561
514 RTMPSetTimer(&pAd->MlmeAux.AssocTimer, Timeout); 562 RTMPSetTimer(&pAd->MlmeAux.AssocTimer, Timeout);
515 pAd->Mlme.AssocMachine.CurrState = ASSOC_WAIT_RSP; 563 pAd->Mlme.AssocMachine.CurrState = ASSOC_WAIT_RSP;
516 } 564 } else {
517 else 565 DBGPRINT(RT_DEBUG_TRACE,
518 { 566 ("ASSOC - MlmeAssocReqAction() sanity check failed. BUG!!!!!! \n"));
519 DBGPRINT(RT_DEBUG_TRACE,("ASSOC - MlmeAssocReqAction() sanity check failed. BUG!!!!!! \n"));
520 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; 567 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
521 Status = MLME_INVALID_FORMAT; 568 Status = MLME_INVALID_FORMAT;
522 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_ASSOC_CONF, 2, &Status); 569 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_ASSOC_CONF, 2,
570 &Status);
523 } 571 }
524 572
525} 573}
@@ -541,121 +589,117 @@ VOID MlmeAssocReqAction(
541 589
542 ========================================================================== 590 ==========================================================================
543 */ 591 */
544VOID MlmeReassocReqAction( 592VOID MlmeReassocReqAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
545 IN PRTMP_ADAPTER pAd,
546 IN MLME_QUEUE_ELEM *Elem)
547{ 593{
548 UCHAR ApAddr[6]; 594 UCHAR ApAddr[6];
549 HEADER_802_11 ReassocHdr; 595 HEADER_802_11 ReassocHdr;
550 UCHAR WmeIe[9] = {IE_VENDOR_SPECIFIC, 0x07, 0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; 596 UCHAR WmeIe[9] =
551 USHORT CapabilityInfo, ListenIntv; 597 { IE_VENDOR_SPECIFIC, 0x07, 0x00, 0x50, 0xf2, 0x02, 0x00, 0x01,
552 ULONG Timeout; 598 0x00 };
553 ULONG FrameLen = 0; 599 USHORT CapabilityInfo, ListenIntv;
554 BOOLEAN TimerCancelled; 600 ULONG Timeout;
555 NDIS_STATUS NStatus; 601 ULONG FrameLen = 0;
556 ULONG tmp; 602 BOOLEAN TimerCancelled;
557 PUCHAR pOutBuffer = NULL; 603 NDIS_STATUS NStatus;
558 USHORT Status; 604 ULONG tmp;
605 PUCHAR pOutBuffer = NULL;
606 USHORT Status;
559 607
560 // Block all authentication request durning WPA block period 608 // Block all authentication request durning WPA block period
561 if (pAd->StaCfg.bBlockAssoc == TRUE) 609 if (pAd->StaCfg.bBlockAssoc == TRUE) {
562 { 610 DBGPRINT(RT_DEBUG_TRACE,
563 DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - Block ReAssoc request durning WPA block period!\n")); 611 ("ASSOC - Block ReAssoc request durning WPA block period!\n"));
564 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; 612 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
565 Status = MLME_STATE_MACHINE_REJECT; 613 Status = MLME_STATE_MACHINE_REJECT;
566 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_REASSOC_CONF, 2, &Status); 614 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_REASSOC_CONF, 2,
615 &Status);
567 } 616 }
568 // the parameters are the same as the association 617 // the parameters are the same as the association
569 else if(MlmeAssocReqSanity(pAd, Elem->Msg, Elem->MsgLen, ApAddr, &CapabilityInfo, &Timeout, &ListenIntv)) 618 else if (MlmeAssocReqSanity
570 { 619 (pAd, Elem->Msg, Elem->MsgLen, ApAddr, &CapabilityInfo,
620 &Timeout, &ListenIntv)) {
571 RTMPCancelTimer(&pAd->MlmeAux.ReassocTimer, &TimerCancelled); 621 RTMPCancelTimer(&pAd->MlmeAux.ReassocTimer, &TimerCancelled);
572 622
573 NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory 623 NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory
574 if(NStatus != NDIS_STATUS_SUCCESS) 624 if (NStatus != NDIS_STATUS_SUCCESS) {
575 { 625 DBGPRINT(RT_DEBUG_TRACE,
576 DBGPRINT(RT_DEBUG_TRACE,("ASSOC - MlmeReassocReqAction() allocate memory failed \n")); 626 ("ASSOC - MlmeReassocReqAction() allocate memory failed \n"));
577 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; 627 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
578 Status = MLME_FAIL_NO_RESOURCE; 628 Status = MLME_FAIL_NO_RESOURCE;
579 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_REASSOC_CONF, 2, &Status); 629 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE,
630 MT2_REASSOC_CONF, 2, &Status);
580 return; 631 return;
581 } 632 }
582 633
583 COPY_MAC_ADDR(pAd->MlmeAux.Bssid, ApAddr); 634 COPY_MAC_ADDR(pAd->MlmeAux.Bssid, ApAddr);
584 635
585 // make frame, use bssid as the AP address?? 636 // make frame, use bssid as the AP address??
586 DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - Send RE-ASSOC request...\n")); 637 DBGPRINT(RT_DEBUG_TRACE,
587 MgtMacHeaderInit(pAd, &ReassocHdr, SUBTYPE_REASSOC_REQ, 0, ApAddr, ApAddr); 638 ("ASSOC - Send RE-ASSOC request...\n"));
588 MakeOutgoingFrame(pOutBuffer, &FrameLen, 639 MgtMacHeaderInit(pAd, &ReassocHdr, SUBTYPE_REASSOC_REQ, 0,
589 sizeof(HEADER_802_11), &ReassocHdr, 640 ApAddr, ApAddr);
590 2, &CapabilityInfo, 641 MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11),
591 2, &ListenIntv, 642 &ReassocHdr, 2, &CapabilityInfo, 2,
592 MAC_ADDR_LEN, ApAddr, 643 &ListenIntv, MAC_ADDR_LEN, ApAddr, 1, &SsidIe,
593 1, &SsidIe, 644 1, &pAd->MlmeAux.SsidLen,
594 1, &pAd->MlmeAux.SsidLen, 645 pAd->MlmeAux.SsidLen, pAd->MlmeAux.Ssid, 1,
595 pAd->MlmeAux.SsidLen, pAd->MlmeAux.Ssid, 646 &SupRateIe, 1, &pAd->MlmeAux.SupRateLen,
596 1, &SupRateIe, 647 pAd->MlmeAux.SupRateLen, pAd->MlmeAux.SupRate,
597 1, &pAd->MlmeAux.SupRateLen, 648 END_OF_ARGS);
598 pAd->MlmeAux.SupRateLen, pAd->MlmeAux.SupRate, 649
599 END_OF_ARGS); 650 if (pAd->MlmeAux.ExtRateLen != 0) {
600 651 MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,
601 if (pAd->MlmeAux.ExtRateLen != 0) 652 1, &ExtRateIe,
602 { 653 1, &pAd->MlmeAux.ExtRateLen,
603 MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, 654 pAd->MlmeAux.ExtRateLen,
604 1, &ExtRateIe, 655 pAd->MlmeAux.ExtRate, END_OF_ARGS);
605 1, &pAd->MlmeAux.ExtRateLen,
606 pAd->MlmeAux.ExtRateLen, pAd->MlmeAux.ExtRate,
607 END_OF_ARGS);
608 FrameLen += tmp; 656 FrameLen += tmp;
609 } 657 }
610 658
611 if (pAd->MlmeAux.APEdcaParm.bValid) 659 if (pAd->MlmeAux.APEdcaParm.bValid) {
612 { 660 if (pAd->CommonCfg.bAPSDCapable
613 if (pAd->CommonCfg.bAPSDCapable && pAd->MlmeAux.APEdcaParm.bAPSDCapable) 661 && pAd->MlmeAux.APEdcaParm.bAPSDCapable) {
614 {
615 QBSS_STA_INFO_PARM QosInfo; 662 QBSS_STA_INFO_PARM QosInfo;
616 663
617 NdisZeroMemory(&QosInfo, sizeof(QBSS_STA_INFO_PARM)); 664 NdisZeroMemory(&QosInfo,
665 sizeof(QBSS_STA_INFO_PARM));
618 QosInfo.UAPSD_AC_BE = pAd->CommonCfg.bAPSDAC_BE; 666 QosInfo.UAPSD_AC_BE = pAd->CommonCfg.bAPSDAC_BE;
619 QosInfo.UAPSD_AC_BK = pAd->CommonCfg.bAPSDAC_BK; 667 QosInfo.UAPSD_AC_BK = pAd->CommonCfg.bAPSDAC_BK;
620 QosInfo.UAPSD_AC_VI = pAd->CommonCfg.bAPSDAC_VI; 668 QosInfo.UAPSD_AC_VI = pAd->CommonCfg.bAPSDAC_VI;
621 QosInfo.UAPSD_AC_VO = pAd->CommonCfg.bAPSDAC_VO; 669 QosInfo.UAPSD_AC_VO = pAd->CommonCfg.bAPSDAC_VO;
622 QosInfo.MaxSPLength = pAd->CommonCfg.MaxSPLength; 670 QosInfo.MaxSPLength =
623 WmeIe[8] |= *(PUCHAR)&QosInfo; 671 pAd->CommonCfg.MaxSPLength;
672 WmeIe[8] |= *(PUCHAR) & QosInfo;
624 } 673 }
625 674
626 MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, 675 MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,
627 9, &WmeIe[0], 676 9, &WmeIe[0], END_OF_ARGS);
628 END_OF_ARGS);
629 FrameLen += tmp; 677 FrameLen += tmp;
630 } 678 }
631
632 // HT 679 // HT
633 if ((pAd->MlmeAux.HtCapabilityLen > 0) && (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)) 680 if ((pAd->MlmeAux.HtCapabilityLen > 0)
634 { 681 && (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)) {
635 ULONG TmpLen; 682 ULONG TmpLen;
636 UCHAR HtLen; 683 UCHAR HtLen;
637 UCHAR BROADCOM[4] = {0x0, 0x90, 0x4c, 0x33}; 684 UCHAR BROADCOM[4] = { 0x0, 0x90, 0x4c, 0x33 };
638 if (pAd->StaActive.SupportedPhyInfo.bPreNHt == TRUE) 685 if (pAd->StaActive.SupportedPhyInfo.bPreNHt == TRUE) {
639 {
640 HtLen = SIZE_HT_CAP_IE + 4; 686 HtLen = SIZE_HT_CAP_IE + 4;
641 MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 687 MakeOutgoingFrame(pOutBuffer + FrameLen,
642 1, &WpaIe, 688 &TmpLen, 1, &WpaIe, 1, &HtLen,
643 1, &HtLen, 689 4, &BROADCOM[0],
644 4, &BROADCOM[0], 690 pAd->MlmeAux.HtCapabilityLen,
645 pAd->MlmeAux.HtCapabilityLen, &pAd->MlmeAux.HtCapability, 691 &pAd->MlmeAux.HtCapability,
646 END_OF_ARGS); 692 END_OF_ARGS);
647 } 693 } else {
648 else 694 MakeOutgoingFrame(pOutBuffer + FrameLen,
649 { 695 &TmpLen, 1, &HtCapIe, 1,
650 MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 696 &pAd->MlmeAux.HtCapabilityLen,
651 1, &HtCapIe, 697 pAd->MlmeAux.HtCapabilityLen,
652 1, &pAd->MlmeAux.HtCapabilityLen, 698 &pAd->MlmeAux.HtCapability,
653 pAd->MlmeAux.HtCapabilityLen, &pAd->MlmeAux.HtCapability, 699 END_OF_ARGS);
654 END_OF_ARGS);
655 } 700 }
656 FrameLen += TmpLen; 701 FrameLen += TmpLen;
657 } 702 }
658
659 // add Ralink proprietary IE to inform AP this STA is going to use AGGREGATION or PIGGY-BACK+AGGREGATION 703 // add Ralink proprietary IE to inform AP this STA is going to use AGGREGATION or PIGGY-BACK+AGGREGATION
660 // Case I: (Aggregation + Piggy-Back) 704 // Case I: (Aggregation + Piggy-Back)
661 // 1. user enable aggregation, AND 705 // 1. user enable aggregation, AND
@@ -664,49 +708,49 @@ VOID MlmeReassocReqAction(
664 // Case II: (Aggregation) 708 // Case II: (Aggregation)
665 // 1. user enable aggregation, AND 709 // 1. user enable aggregation, AND
666 // 2. AP annouces it's AGGREGATION-capable in BEACON 710 // 2. AP annouces it's AGGREGATION-capable in BEACON
667 if (pAd->CommonCfg.bAggregationCapable) 711 if (pAd->CommonCfg.bAggregationCapable) {
668 { 712 if ((pAd->CommonCfg.bPiggyBackCapable)
669 if ((pAd->CommonCfg.bPiggyBackCapable) && ((pAd->MlmeAux.APRalinkIe & 0x00000003) == 3)) 713 && ((pAd->MlmeAux.APRalinkIe & 0x00000003) == 3)) {
670 {
671 ULONG TmpLen; 714 ULONG TmpLen;
672 UCHAR RalinkIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x03, 0x00, 0x00, 0x00}; 715 UCHAR RalinkIe[9] =
673 MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 716 { IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43,
674 9, RalinkIe, 717 0x03, 0x00, 0x00, 0x00 };
675 END_OF_ARGS); 718 MakeOutgoingFrame(pOutBuffer + FrameLen,
719 &TmpLen, 9, RalinkIe,
720 END_OF_ARGS);
676 FrameLen += TmpLen; 721 FrameLen += TmpLen;
677 } 722 } else if (pAd->MlmeAux.APRalinkIe & 0x00000001) {
678 else if (pAd->MlmeAux.APRalinkIe & 0x00000001)
679 {
680 ULONG TmpLen; 723 ULONG TmpLen;
681 UCHAR RalinkIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x01, 0x00, 0x00, 0x00}; 724 UCHAR RalinkIe[9] =
682 MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 725 { IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43,
683 9, RalinkIe, 726 0x01, 0x00, 0x00, 0x00 };
684 END_OF_ARGS); 727 MakeOutgoingFrame(pOutBuffer + FrameLen,
728 &TmpLen, 9, RalinkIe,
729 END_OF_ARGS);
685 FrameLen += TmpLen; 730 FrameLen += TmpLen;
686 } 731 }
687 } 732 } else {
688 else
689 {
690 ULONG TmpLen; 733 ULONG TmpLen;
691 UCHAR RalinkIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x04, 0x00, 0x00, 0x00}; 734 UCHAR RalinkIe[9] =
692 MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, 735 { IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x04,
693 9, RalinkIe, 736 0x00, 0x00, 0x00 };
694 END_OF_ARGS); 737 MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 9,
738 RalinkIe, END_OF_ARGS);
695 FrameLen += TmpLen; 739 FrameLen += TmpLen;
696 } 740 }
697 741
698 MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); 742 MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
699 MlmeFreeMemory(pAd, pOutBuffer); 743 MlmeFreeMemory(pAd, pOutBuffer);
700 744
701 RTMPSetTimer(&pAd->MlmeAux.ReassocTimer, Timeout); /* in mSec */ 745 RTMPSetTimer(&pAd->MlmeAux.ReassocTimer, Timeout); /* in mSec */
702 pAd->Mlme.AssocMachine.CurrState = REASSOC_WAIT_RSP; 746 pAd->Mlme.AssocMachine.CurrState = REASSOC_WAIT_RSP;
703 } 747 } else {
704 else 748 DBGPRINT(RT_DEBUG_TRACE,
705 { 749 ("ASSOC - MlmeReassocReqAction() sanity check failed. BUG!!!! \n"));
706 DBGPRINT(RT_DEBUG_TRACE,("ASSOC - MlmeReassocReqAction() sanity check failed. BUG!!!! \n"));
707 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; 750 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
708 Status = MLME_INVALID_FORMAT; 751 Status = MLME_INVALID_FORMAT;
709 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_REASSOC_CONF, 2, &Status); 752 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_REASSOC_CONF, 2,
753 &Status);
710 } 754 }
711} 755}
712 756
@@ -721,52 +765,50 @@ VOID MlmeReassocReqAction(
721 765
722 ========================================================================== 766 ==========================================================================
723 */ 767 */
724VOID MlmeDisassocReqAction( 768VOID MlmeDisassocReqAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
725 IN PRTMP_ADAPTER pAd,
726 IN MLME_QUEUE_ELEM *Elem)
727{ 769{
728 PMLME_DISASSOC_REQ_STRUCT pDisassocReq; 770 PMLME_DISASSOC_REQ_STRUCT pDisassocReq;
729 HEADER_802_11 DisassocHdr; 771 HEADER_802_11 DisassocHdr;
730 PHEADER_802_11 pDisassocHdr; 772 PHEADER_802_11 pDisassocHdr;
731 PUCHAR pOutBuffer = NULL; 773 PUCHAR pOutBuffer = NULL;
732 ULONG FrameLen = 0; 774 ULONG FrameLen = 0;
733 NDIS_STATUS NStatus; 775 NDIS_STATUS NStatus;
734 BOOLEAN TimerCancelled; 776 BOOLEAN TimerCancelled;
735 ULONG Timeout = 500; 777 ULONG Timeout = 500;
736 USHORT Status; 778 USHORT Status;
737
738 779
739 // skip sanity check 780 // skip sanity check
740 pDisassocReq = (PMLME_DISASSOC_REQ_STRUCT)(Elem->Msg); 781 pDisassocReq = (PMLME_DISASSOC_REQ_STRUCT) (Elem->Msg);
741 782
742 NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory 783 NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory
743 if (NStatus != NDIS_STATUS_SUCCESS) 784 if (NStatus != NDIS_STATUS_SUCCESS) {
744 { 785 DBGPRINT(RT_DEBUG_TRACE,
745 DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - MlmeDisassocReqAction() allocate memory failed\n")); 786 ("ASSOC - MlmeDisassocReqAction() allocate memory failed\n"));
746 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; 787 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
747 Status = MLME_FAIL_NO_RESOURCE; 788 Status = MLME_FAIL_NO_RESOURCE;
748 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_DISASSOC_CONF, 2, &Status); 789 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_DISASSOC_CONF, 2,
790 &Status);
749 return; 791 return;
750 } 792 }
751 793
752
753
754 RTMPCancelTimer(&pAd->MlmeAux.DisassocTimer, &TimerCancelled); 794 RTMPCancelTimer(&pAd->MlmeAux.DisassocTimer, &TimerCancelled);
755 795
756 DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - Send DISASSOC request[BSSID::%02x:%02x:%02x:%02x:%02x:%02x (Reason=%d)\n", 796 DBGPRINT(RT_DEBUG_TRACE,
757 pDisassocReq->Addr[0], pDisassocReq->Addr[1], pDisassocReq->Addr[2], 797 ("ASSOC - Send DISASSOC request[BSSID::%02x:%02x:%02x:%02x:%02x:%02x (Reason=%d)\n",
758 pDisassocReq->Addr[3], pDisassocReq->Addr[4], pDisassocReq->Addr[5], pDisassocReq->Reason)); 798 pDisassocReq->Addr[0], pDisassocReq->Addr[1],
799 pDisassocReq->Addr[2], pDisassocReq->Addr[3],
800 pDisassocReq->Addr[4], pDisassocReq->Addr[5],
801 pDisassocReq->Reason));
759 MgtMacHeaderInit(pAd, &DisassocHdr, SUBTYPE_DISASSOC, 0, pDisassocReq->Addr, pDisassocReq->Addr); // patch peap ttls switching issue 802 MgtMacHeaderInit(pAd, &DisassocHdr, SUBTYPE_DISASSOC, 0, pDisassocReq->Addr, pDisassocReq->Addr); // patch peap ttls switching issue
760 MakeOutgoingFrame(pOutBuffer, &FrameLen, 803 MakeOutgoingFrame(pOutBuffer, &FrameLen,
761 sizeof(HEADER_802_11),&DisassocHdr, 804 sizeof(HEADER_802_11), &DisassocHdr,
762 2, &pDisassocReq->Reason, 805 2, &pDisassocReq->Reason, END_OF_ARGS);
763 END_OF_ARGS);
764 MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); 806 MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
765 807
766 // To patch Instance and Buffalo(N) AP 808 // To patch Instance and Buffalo(N) AP
767 // Driver has to send deauth to Instance AP, but Buffalo(N) needs to send disassoc to reset Authenticator's state machine 809 // Driver has to send deauth to Instance AP, but Buffalo(N) needs to send disassoc to reset Authenticator's state machine
768 // Therefore, we send both of them. 810 // Therefore, we send both of them.
769 pDisassocHdr = (PHEADER_802_11)pOutBuffer; 811 pDisassocHdr = (PHEADER_802_11) pOutBuffer;
770 pDisassocHdr->FC.SubType = SUBTYPE_DEAUTH; 812 pDisassocHdr->FC.SubType = SUBTYPE_DEAUTH;
771 MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); 813 MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
772 814
@@ -775,10 +817,9 @@ VOID MlmeDisassocReqAction(
775 pAd->StaCfg.DisassocReason = REASON_DISASSOC_STA_LEAVING; 817 pAd->StaCfg.DisassocReason = REASON_DISASSOC_STA_LEAVING;
776 COPY_MAC_ADDR(pAd->StaCfg.DisassocSta, pDisassocReq->Addr); 818 COPY_MAC_ADDR(pAd->StaCfg.DisassocSta, pDisassocReq->Addr);
777 819
778 RTMPSetTimer(&pAd->MlmeAux.DisassocTimer, Timeout); /* in mSec */ 820 RTMPSetTimer(&pAd->MlmeAux.DisassocTimer, Timeout); /* in mSec */
779 pAd->Mlme.AssocMachine.CurrState = DISASSOC_WAIT_RSP; 821 pAd->Mlme.AssocMachine.CurrState = DISASSOC_WAIT_RSP;
780 822
781
782 RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, NULL, NULL, 0); 823 RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, NULL, NULL, 0);
783 824
784} 825}
@@ -794,71 +835,81 @@ VOID MlmeDisassocReqAction(
794 835
795 ========================================================================== 836 ==========================================================================
796 */ 837 */
797VOID PeerAssocRspAction( 838VOID PeerAssocRspAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
798 IN PRTMP_ADAPTER pAd,
799 IN MLME_QUEUE_ELEM *Elem)
800{ 839{
801 USHORT CapabilityInfo, Status, Aid; 840 USHORT CapabilityInfo, Status, Aid;
802 UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES], SupRateLen; 841 UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES], SupRateLen;
803 UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRateLen; 842 UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRateLen;
804 UCHAR Addr2[MAC_ADDR_LEN]; 843 UCHAR Addr2[MAC_ADDR_LEN];
805 BOOLEAN TimerCancelled; 844 BOOLEAN TimerCancelled;
806 UCHAR CkipFlag; 845 UCHAR CkipFlag;
807 EDCA_PARM EdcaParm; 846 EDCA_PARM EdcaParm;
808 HT_CAPABILITY_IE HtCapability; 847 HT_CAPABILITY_IE HtCapability;
809 ADD_HT_INFO_IE AddHtInfo; // AP might use this additional ht info IE 848 ADD_HT_INFO_IE AddHtInfo; // AP might use this additional ht info IE
810 UCHAR HtCapabilityLen = 0; 849 UCHAR HtCapabilityLen = 0;
811 UCHAR AddHtInfoLen; 850 UCHAR AddHtInfoLen;
812 UCHAR NewExtChannelOffset = 0xff; 851 UCHAR NewExtChannelOffset = 0xff;
813 852
814 if (PeerAssocRspSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &CapabilityInfo, &Status, &Aid, SupRate, &SupRateLen, ExtRate, &ExtRateLen, 853 if (PeerAssocRspSanity
815 &HtCapability,&AddHtInfo, &HtCapabilityLen,&AddHtInfoLen,&NewExtChannelOffset, &EdcaParm, &CkipFlag)) 854 (pAd, Elem->Msg, Elem->MsgLen, Addr2, &CapabilityInfo, &Status,
816 { 855 &Aid, SupRate, &SupRateLen, ExtRate, &ExtRateLen, &HtCapability,
856 &AddHtInfo, &HtCapabilityLen, &AddHtInfoLen, &NewExtChannelOffset,
857 &EdcaParm, &CkipFlag)) {
817 // The frame is for me ? 858 // The frame is for me ?
818 if(MAC_ADDR_EQUAL(Addr2, pAd->MlmeAux.Bssid)) 859 if (MAC_ADDR_EQUAL(Addr2, pAd->MlmeAux.Bssid)) {
819 { 860 DBGPRINT(RT_DEBUG_TRACE,
820 DBGPRINT(RT_DEBUG_TRACE, ("PeerAssocRspAction():ASSOC - receive ASSOC_RSP to me (status=%d)\n", Status)); 861 ("PeerAssocRspAction():ASSOC - receive ASSOC_RSP to me (status=%d)\n",
821 DBGPRINT(RT_DEBUG_TRACE, ("PeerAssocRspAction():MacTable [%d].AMsduSize = %d. ClientStatusFlags = 0x%lx \n",Elem->Wcid, pAd->MacTab.Content[BSSID_WCID].AMsduSize, pAd->MacTab.Content[BSSID_WCID].ClientStatusFlags)); 862 Status));
822 RTMPCancelTimer(&pAd->MlmeAux.AssocTimer, &TimerCancelled); 863 DBGPRINT(RT_DEBUG_TRACE,
823 864 ("PeerAssocRspAction():MacTable [%d].AMsduSize = %d. ClientStatusFlags = 0x%lx \n",
824 865 Elem->Wcid,
825 if(Status == MLME_SUCCESS) 866 pAd->MacTab.Content[BSSID_WCID].AMsduSize,
826 { 867 pAd->MacTab.Content[BSSID_WCID].
827 UCHAR MaxSupportedRateIn500Kbps = 0; 868 ClientStatusFlags));
828 UCHAR idx; 869 RTMPCancelTimer(&pAd->MlmeAux.AssocTimer,
870 &TimerCancelled);
871
872 if (Status == MLME_SUCCESS) {
873 UCHAR MaxSupportedRateIn500Kbps = 0;
874 UCHAR idx;
829 875
830 // supported rates array may not be sorted. sort it and find the maximum rate 876 // supported rates array may not be sorted. sort it and find the maximum rate
831 for (idx=0; idx<SupRateLen; idx++) 877 for (idx = 0; idx < SupRateLen; idx++) {
832 { 878 if (MaxSupportedRateIn500Kbps <
833 if (MaxSupportedRateIn500Kbps < (SupRate[idx] & 0x7f)) 879 (SupRate[idx] & 0x7f))
834 MaxSupportedRateIn500Kbps = SupRate[idx] & 0x7f; 880 MaxSupportedRateIn500Kbps =
835 } 881 SupRate[idx] & 0x7f;
836 882 }
837 for (idx=0; idx<ExtRateLen; idx++) 883
838 { 884 for (idx = 0; idx < ExtRateLen; idx++) {
839 if (MaxSupportedRateIn500Kbps < (ExtRate[idx] & 0x7f)) 885 if (MaxSupportedRateIn500Kbps <
840 MaxSupportedRateIn500Kbps = ExtRate[idx] & 0x7f; 886 (ExtRate[idx] & 0x7f))
841 } 887 MaxSupportedRateIn500Kbps =
888 ExtRate[idx] & 0x7f;
889 }
842 // go to procedure listed on page 376 890 // go to procedure listed on page 376
843 AssocPostProc(pAd, Addr2, CapabilityInfo, Aid, SupRate, SupRateLen, ExtRate, ExtRateLen, 891 AssocPostProc(pAd, Addr2, CapabilityInfo, Aid,
844 &EdcaParm, &HtCapability, HtCapabilityLen, &AddHtInfo); 892 SupRate, SupRateLen, ExtRate,
893 ExtRateLen, &EdcaParm,
894 &HtCapability, HtCapabilityLen,
895 &AddHtInfo);
845 896
846 StaAddMacTableEntry(pAd, 897 StaAddMacTableEntry(pAd,
847 &pAd->MacTab.Content[BSSID_WCID], 898 &pAd->MacTab.
848 MaxSupportedRateIn500Kbps, 899 Content[BSSID_WCID],
849 &HtCapability, 900 MaxSupportedRateIn500Kbps,
850 HtCapabilityLen, 901 &HtCapability,
851 &AddHtInfo, 902 HtCapabilityLen, &AddHtInfo,
852 AddHtInfoLen, 903 AddHtInfoLen,
853 CapabilityInfo); 904 CapabilityInfo);
854 } 905 }
855 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; 906 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
856 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_ASSOC_CONF, 2, &Status); 907 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE,
908 MT2_ASSOC_CONF, 2, &Status);
857 } 909 }
858 } 910 } else {
859 else 911 DBGPRINT(RT_DEBUG_TRACE,
860 { 912 ("ASSOC - PeerAssocRspAction() sanity check fail\n"));
861 DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - PeerAssocRspAction() sanity check fail\n"));
862 } 913 }
863} 914}
864 915
@@ -873,55 +924,62 @@ VOID PeerAssocRspAction(
873 924
874 ========================================================================== 925 ==========================================================================
875 */ 926 */
876VOID PeerReassocRspAction( 927VOID PeerReassocRspAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
877 IN PRTMP_ADAPTER pAd,
878 IN MLME_QUEUE_ELEM *Elem)
879{ 928{
880 USHORT CapabilityInfo; 929 USHORT CapabilityInfo;
881 USHORT Status; 930 USHORT Status;
882 USHORT Aid; 931 USHORT Aid;
883 UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES], SupRateLen; 932 UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES], SupRateLen;
884 UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRateLen; 933 UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRateLen;
885 UCHAR Addr2[MAC_ADDR_LEN]; 934 UCHAR Addr2[MAC_ADDR_LEN];
886 UCHAR CkipFlag; 935 UCHAR CkipFlag;
887 BOOLEAN TimerCancelled; 936 BOOLEAN TimerCancelled;
888 EDCA_PARM EdcaParm; 937 EDCA_PARM EdcaParm;
889 HT_CAPABILITY_IE HtCapability; 938 HT_CAPABILITY_IE HtCapability;
890 ADD_HT_INFO_IE AddHtInfo; // AP might use this additional ht info IE 939 ADD_HT_INFO_IE AddHtInfo; // AP might use this additional ht info IE
891 UCHAR HtCapabilityLen; 940 UCHAR HtCapabilityLen;
892 UCHAR AddHtInfoLen; 941 UCHAR AddHtInfoLen;
893 UCHAR NewExtChannelOffset = 0xff; 942 UCHAR NewExtChannelOffset = 0xff;
894 943
895 if(PeerAssocRspSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &CapabilityInfo, &Status, &Aid, SupRate, &SupRateLen, ExtRate, &ExtRateLen, 944 if (PeerAssocRspSanity
896 &HtCapability, &AddHtInfo, &HtCapabilityLen, &AddHtInfoLen,&NewExtChannelOffset, &EdcaParm, &CkipFlag)) 945 (pAd, Elem->Msg, Elem->MsgLen, Addr2, &CapabilityInfo, &Status,
897 { 946 &Aid, SupRate, &SupRateLen, ExtRate, &ExtRateLen, &HtCapability,
898 if(MAC_ADDR_EQUAL(Addr2, pAd->MlmeAux.Bssid)) // The frame is for me ? 947 &AddHtInfo, &HtCapabilityLen, &AddHtInfoLen, &NewExtChannelOffset,
948 &EdcaParm, &CkipFlag)) {
949 if (MAC_ADDR_EQUAL(Addr2, pAd->MlmeAux.Bssid)) // The frame is for me ?
899 { 950 {
900 DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - receive REASSOC_RSP to me (status=%d)\n", Status)); 951 DBGPRINT(RT_DEBUG_TRACE,
901 RTMPCancelTimer(&pAd->MlmeAux.ReassocTimer, &TimerCancelled); 952 ("ASSOC - receive REASSOC_RSP to me (status=%d)\n",
953 Status));
954 RTMPCancelTimer(&pAd->MlmeAux.ReassocTimer,
955 &TimerCancelled);
902 956
903 if(Status == MLME_SUCCESS) 957 if (Status == MLME_SUCCESS) {
904 {
905 // go to procedure listed on page 376 958 // go to procedure listed on page 376
906 AssocPostProc(pAd, Addr2, CapabilityInfo, Aid, SupRate, SupRateLen, ExtRate, ExtRateLen, 959 AssocPostProc(pAd, Addr2, CapabilityInfo, Aid,
907 &EdcaParm, &HtCapability, HtCapabilityLen, &AddHtInfo); 960 SupRate, SupRateLen, ExtRate,
908 961 ExtRateLen, &EdcaParm,
962 &HtCapability, HtCapabilityLen,
963 &AddHtInfo);
909 964
910 { 965 {
911 wext_notify_event_assoc(pAd); 966 wext_notify_event_assoc(pAd);
912 RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, &pAd->MlmeAux.Bssid[0], NULL, 0); 967 RtmpOSWrielessEventSend(pAd, SIOCGIWAP,
913 } 968 -1,
914 969 &pAd->MlmeAux.
915 } 970 Bssid[0], NULL,
971 0);
972 }
916 973
917 // CkipFlag is no use for reassociate
918 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
919 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_REASSOC_CONF, 2, &Status);
920 } 974 }
975 // CkipFlag is no use for reassociate
976 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
977 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE,
978 MT2_REASSOC_CONF, 2, &Status);
921 } 979 }
922 else 980 } else {
923 { 981 DBGPRINT(RT_DEBUG_TRACE,
924 DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - PeerReassocRspAction() sanity check fail\n")); 982 ("ASSOC - PeerReassocRspAction() sanity check fail\n"));
925 } 983 }
926 984
927} 985}
@@ -936,30 +994,18 @@ VOID PeerReassocRspAction(
936 994
937 ========================================================================== 995 ==========================================================================
938 */ 996 */
939VOID AssocPostProc( 997VOID AssocPostProc(IN PRTMP_ADAPTER pAd, IN PUCHAR pAddr2, IN USHORT CapabilityInfo, IN USHORT Aid, IN UCHAR SupRate[], IN UCHAR SupRateLen, IN UCHAR ExtRate[], IN UCHAR ExtRateLen, IN PEDCA_PARM pEdcaParm, IN HT_CAPABILITY_IE * pHtCapability, IN UCHAR HtCapabilityLen, IN ADD_HT_INFO_IE * pAddHtInfo) // AP might use this additional ht info IE
940 IN PRTMP_ADAPTER pAd,
941 IN PUCHAR pAddr2,
942 IN USHORT CapabilityInfo,
943 IN USHORT Aid,
944 IN UCHAR SupRate[],
945 IN UCHAR SupRateLen,
946 IN UCHAR ExtRate[],
947 IN UCHAR ExtRateLen,
948 IN PEDCA_PARM pEdcaParm,
949 IN HT_CAPABILITY_IE *pHtCapability,
950 IN UCHAR HtCapabilityLen,
951 IN ADD_HT_INFO_IE *pAddHtInfo) // AP might use this additional ht info IE
952{ 998{
953 ULONG Idx; 999 ULONG Idx;
954 1000
955 pAd->MlmeAux.BssType = BSS_INFRA; 1001 pAd->MlmeAux.BssType = BSS_INFRA;
956 COPY_MAC_ADDR(pAd->MlmeAux.Bssid, pAddr2); 1002 COPY_MAC_ADDR(pAd->MlmeAux.Bssid, pAddr2);
957 pAd->MlmeAux.Aid = Aid; 1003 pAd->MlmeAux.Aid = Aid;
958 pAd->MlmeAux.CapabilityInfo = CapabilityInfo & SUPPORTED_CAPABILITY_INFO; 1004 pAd->MlmeAux.CapabilityInfo =
1005 CapabilityInfo & SUPPORTED_CAPABILITY_INFO;
959 1006
960 // Some HT AP might lost WMM IE. We add WMM ourselves. beacuase HT requires QoS on. 1007 // Some HT AP might lost WMM IE. We add WMM ourselves. beacuase HT requires QoS on.
961 if ((HtCapabilityLen > 0) && (pEdcaParm->bValid == FALSE)) 1008 if ((HtCapabilityLen > 0) && (pEdcaParm->bValid == FALSE)) {
962 {
963 pEdcaParm->bValid = TRUE; 1009 pEdcaParm->bValid = TRUE;
964 pEdcaParm->Aifsn[0] = 3; 1010 pEdcaParm->Aifsn[0] = 3;
965 pEdcaParm->Aifsn[1] = 7; 1011 pEdcaParm->Aifsn[1] = 7;
@@ -976,10 +1022,10 @@ VOID AssocPostProc(
976 pEdcaParm->Cwmax[2] = 4; 1022 pEdcaParm->Cwmax[2] = 4;
977 pEdcaParm->Cwmax[3] = 3; 1023 pEdcaParm->Cwmax[3] = 3;
978 1024
979 pEdcaParm->Txop[0] = 0; 1025 pEdcaParm->Txop[0] = 0;
980 pEdcaParm->Txop[1] = 0; 1026 pEdcaParm->Txop[1] = 0;
981 pEdcaParm->Txop[2] = 96; 1027 pEdcaParm->Txop[2] = 96;
982 pEdcaParm->Txop[3] = 48; 1028 pEdcaParm->Txop[3] = 48;
983 1029
984 } 1030 }
985 1031
@@ -995,75 +1041,94 @@ VOID AssocPostProc(
995 NdisMoveMemory(pAd->MlmeAux.ExtRate, ExtRate, ExtRateLen); 1041 NdisMoveMemory(pAd->MlmeAux.ExtRate, ExtRate, ExtRateLen);
996 RTMPCheckRates(pAd, pAd->MlmeAux.ExtRate, &pAd->MlmeAux.ExtRateLen); 1042 RTMPCheckRates(pAd, pAd->MlmeAux.ExtRate, &pAd->MlmeAux.ExtRateLen);
997 1043
998 if (HtCapabilityLen > 0) 1044 if (HtCapabilityLen > 0) {
999 {
1000 RTMPCheckHt(pAd, BSSID_WCID, pHtCapability, pAddHtInfo); 1045 RTMPCheckHt(pAd, BSSID_WCID, pHtCapability, pAddHtInfo);
1001 } 1046 }
1002 DBGPRINT(RT_DEBUG_TRACE, ("AssocPostProc===> AP.AMsduSize = %d. ClientStatusFlags = 0x%lx \n", pAd->MacTab.Content[BSSID_WCID].AMsduSize, pAd->MacTab.Content[BSSID_WCID].ClientStatusFlags)); 1047 DBGPRINT(RT_DEBUG_TRACE,
1048 ("AssocPostProc===> AP.AMsduSize = %d. ClientStatusFlags = 0x%lx \n",
1049 pAd->MacTab.Content[BSSID_WCID].AMsduSize,
1050 pAd->MacTab.Content[BSSID_WCID].ClientStatusFlags));
1003 1051
1004 DBGPRINT(RT_DEBUG_TRACE, ("AssocPostProc===> (Mmps=%d, AmsduSize=%d, )\n", 1052 DBGPRINT(RT_DEBUG_TRACE,
1005 pAd->MacTab.Content[BSSID_WCID].MmpsMode, pAd->MacTab.Content[BSSID_WCID].AMsduSize)); 1053 ("AssocPostProc===> (Mmps=%d, AmsduSize=%d, )\n",
1054 pAd->MacTab.Content[BSSID_WCID].MmpsMode,
1055 pAd->MacTab.Content[BSSID_WCID].AMsduSize));
1006 1056
1007 // Set New WPA information 1057 // Set New WPA information
1008 Idx = BssTableSearch(&pAd->ScanTab, pAddr2, pAd->MlmeAux.Channel); 1058 Idx = BssTableSearch(&pAd->ScanTab, pAddr2, pAd->MlmeAux.Channel);
1009 if (Idx == BSS_NOT_FOUND) 1059 if (Idx == BSS_NOT_FOUND) {
1010 {
1011 DBGPRINT_ERR(("ASSOC - Can't find BSS after receiving Assoc response\n")); 1060 DBGPRINT_ERR(("ASSOC - Can't find BSS after receiving Assoc response\n"));
1012 } 1061 } else {
1013 else
1014 {
1015 // Init variable 1062 // Init variable
1016 pAd->MacTab.Content[BSSID_WCID].RSNIE_Len = 0; 1063 pAd->MacTab.Content[BSSID_WCID].RSNIE_Len = 0;
1017 NdisZeroMemory(pAd->MacTab.Content[BSSID_WCID].RSN_IE, MAX_LEN_OF_RSNIE); 1064 NdisZeroMemory(pAd->MacTab.Content[BSSID_WCID].RSN_IE,
1065 MAX_LEN_OF_RSNIE);
1018 1066
1019 // Store appropriate RSN_IE for WPA SM negotiation later 1067 // Store appropriate RSN_IE for WPA SM negotiation later
1020 if ((pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) && (pAd->ScanTab.BssEntry[Idx].VarIELen != 0)) 1068 if ((pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)
1021 { 1069 && (pAd->ScanTab.BssEntry[Idx].VarIELen != 0)) {
1022 PUCHAR pVIE; 1070 PUCHAR pVIE;
1023 USHORT len; 1071 USHORT len;
1024 PEID_STRUCT pEid; 1072 PEID_STRUCT pEid;
1025 1073
1026 pVIE = pAd->ScanTab.BssEntry[Idx].VarIEs; 1074 pVIE = pAd->ScanTab.BssEntry[Idx].VarIEs;
1027 len = pAd->ScanTab.BssEntry[Idx].VarIELen; 1075 len = pAd->ScanTab.BssEntry[Idx].VarIELen;
1028 //KH need to check again 1076 //KH need to check again
1029 // Don't allow to go to sleep mode if authmode is WPA-related. 1077 // Don't allow to go to sleep mode if authmode is WPA-related.
1030 //This can make Authentication process more smoothly. 1078 //This can make Authentication process more smoothly.
1031 RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP); 1079 RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
1032 1080
1033 while (len > 0) 1081 while (len > 0) {
1034 {
1035 pEid = (PEID_STRUCT) pVIE; 1082 pEid = (PEID_STRUCT) pVIE;
1036 // For WPA/WPAPSK 1083 // For WPA/WPAPSK
1037 if ((pEid->Eid == IE_WPA) && (NdisEqualMemory(pEid->Octet, WPA_OUI, 4)) 1084 if ((pEid->Eid == IE_WPA)
1038 && (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA || pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK)) 1085 &&
1039 { 1086 (NdisEqualMemory(pEid->Octet, WPA_OUI, 4))
1040 NdisMoveMemory(pAd->MacTab.Content[BSSID_WCID].RSN_IE, pVIE, (pEid->Len + 2)); 1087 && (pAd->StaCfg.AuthMode ==
1041 pAd->MacTab.Content[BSSID_WCID].RSNIE_Len = (pEid->Len + 2); 1088 Ndis802_11AuthModeWPA
1042 DBGPRINT(RT_DEBUG_TRACE, ("AssocPostProc===> Store RSN_IE for WPA SM negotiation \n")); 1089 || pAd->StaCfg.AuthMode ==
1090 Ndis802_11AuthModeWPAPSK)) {
1091 NdisMoveMemory(pAd->MacTab.
1092 Content[BSSID_WCID].
1093 RSN_IE, pVIE,
1094 (pEid->Len + 2));
1095 pAd->MacTab.Content[BSSID_WCID].
1096 RSNIE_Len = (pEid->Len + 2);
1097 DBGPRINT(RT_DEBUG_TRACE,
1098 ("AssocPostProc===> Store RSN_IE for WPA SM negotiation \n"));
1043 } 1099 }
1044 // For WPA2/WPA2PSK 1100 // For WPA2/WPA2PSK
1045 else if ((pEid->Eid == IE_RSN) && (NdisEqualMemory(pEid->Octet + 2, RSN_OUI, 3)) 1101 else if ((pEid->Eid == IE_RSN)
1046 && (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2 || pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)) 1102 &&
1047 { 1103 (NdisEqualMemory
1048 NdisMoveMemory(pAd->MacTab.Content[BSSID_WCID].RSN_IE, pVIE, (pEid->Len + 2)); 1104 (pEid->Octet + 2, RSN_OUI, 3))
1049 pAd->MacTab.Content[BSSID_WCID].RSNIE_Len = (pEid->Len + 2); 1105 && (pAd->StaCfg.AuthMode ==
1050 DBGPRINT(RT_DEBUG_TRACE, ("AssocPostProc===> Store RSN_IE for WPA2 SM negotiation \n")); 1106 Ndis802_11AuthModeWPA2
1107 || pAd->StaCfg.AuthMode ==
1108 Ndis802_11AuthModeWPA2PSK)) {
1109 NdisMoveMemory(pAd->MacTab.
1110 Content[BSSID_WCID].
1111 RSN_IE, pVIE,
1112 (pEid->Len + 2));
1113 pAd->MacTab.Content[BSSID_WCID].
1114 RSNIE_Len = (pEid->Len + 2);
1115 DBGPRINT(RT_DEBUG_TRACE,
1116 ("AssocPostProc===> Store RSN_IE for WPA2 SM negotiation \n"));
1051 } 1117 }
1052 1118
1053 pVIE += (pEid->Len + 2); 1119 pVIE += (pEid->Len + 2);
1054 len -= (pEid->Len + 2); 1120 len -= (pEid->Len + 2);
1055 } 1121 }
1056 1122
1057
1058 } 1123 }
1059 1124
1060 if (pAd->MacTab.Content[BSSID_WCID].RSNIE_Len == 0) 1125 if (pAd->MacTab.Content[BSSID_WCID].RSNIE_Len == 0) {
1061 { 1126 DBGPRINT(RT_DEBUG_TRACE,
1062 DBGPRINT(RT_DEBUG_TRACE, ("AssocPostProc===> no RSN_IE \n")); 1127 ("AssocPostProc===> no RSN_IE \n"));
1063 } 1128 } else {
1064 else 1129 hex_dump("RSN_IE",
1065 { 1130 pAd->MacTab.Content[BSSID_WCID].RSN_IE,
1066 hex_dump("RSN_IE", pAd->MacTab.Content[BSSID_WCID].RSN_IE, pAd->MacTab.Content[BSSID_WCID].RSNIE_Len); 1131 pAd->MacTab.Content[BSSID_WCID].RSNIE_Len);
1067 } 1132 }
1068 } 1133 }
1069} 1134}
@@ -1079,36 +1144,36 @@ VOID AssocPostProc(
1079 1144
1080 ========================================================================== 1145 ==========================================================================
1081 */ 1146 */
1082VOID PeerDisassocAction( 1147VOID PeerDisassocAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
1083 IN PRTMP_ADAPTER pAd,
1084 IN MLME_QUEUE_ELEM *Elem)
1085{ 1148{
1086 UCHAR Addr2[MAC_ADDR_LEN]; 1149 UCHAR Addr2[MAC_ADDR_LEN];
1087 USHORT Reason; 1150 USHORT Reason;
1088 1151
1089 DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - PeerDisassocAction()\n")); 1152 DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - PeerDisassocAction()\n"));
1090 if(PeerDisassocSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Reason)) 1153 if (PeerDisassocSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Reason)) {
1091 { 1154 DBGPRINT(RT_DEBUG_TRACE,
1092 DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - PeerDisassocAction() Reason = %d\n", Reason)); 1155 ("ASSOC - PeerDisassocAction() Reason = %d\n",
1093 if (INFRA_ON(pAd) && MAC_ADDR_EQUAL(pAd->CommonCfg.Bssid, Addr2)) 1156 Reason));
1094 { 1157 if (INFRA_ON(pAd)
1095 1158 && MAC_ADDR_EQUAL(pAd->CommonCfg.Bssid, Addr2)) {
1096 if (pAd->CommonCfg.bWirelessEvent) 1159
1097 { 1160 if (pAd->CommonCfg.bWirelessEvent) {
1098 RTMPSendWirelessEvent(pAd, IW_DISASSOC_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0); 1161 RTMPSendWirelessEvent(pAd,
1162 IW_DISASSOC_EVENT_FLAG,
1163 pAd->MacTab.
1164 Content[BSSID_WCID].Addr,
1165 BSS0, 0);
1099 } 1166 }
1100 1167
1101
1102 LinkDown(pAd, TRUE); 1168 LinkDown(pAd, TRUE);
1103 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; 1169 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
1104 1170
1105 1171 RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, NULL, NULL,
1106 RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, NULL, NULL, 0); 1172 0);
1107 } 1173 }
1108 } 1174 } else {
1109 else 1175 DBGPRINT(RT_DEBUG_TRACE,
1110 { 1176 ("ASSOC - PeerDisassocAction() sanity check fail\n"));
1111 DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - PeerDisassocAction() sanity check fail\n"));
1112 } 1177 }
1113 1178
1114} 1179}
@@ -1124,11 +1189,9 @@ VOID PeerDisassocAction(
1124 1189
1125 ========================================================================== 1190 ==========================================================================
1126 */ 1191 */
1127VOID AssocTimeoutAction( 1192VOID AssocTimeoutAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
1128 IN PRTMP_ADAPTER pAd,
1129 IN MLME_QUEUE_ELEM *Elem)
1130{ 1193{
1131 USHORT Status; 1194 USHORT Status;
1132 DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - AssocTimeoutAction\n")); 1195 DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - AssocTimeoutAction\n"));
1133 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; 1196 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
1134 Status = MLME_REJ_TIMEOUT; 1197 Status = MLME_REJ_TIMEOUT;
@@ -1144,11 +1207,9 @@ VOID AssocTimeoutAction(
1144 1207
1145 ========================================================================== 1208 ==========================================================================
1146 */ 1209 */
1147VOID ReassocTimeoutAction( 1210VOID ReassocTimeoutAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
1148 IN PRTMP_ADAPTER pAd,
1149 IN MLME_QUEUE_ELEM *Elem)
1150{ 1211{
1151 USHORT Status; 1212 USHORT Status;
1152 DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - ReassocTimeoutAction\n")); 1213 DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - ReassocTimeoutAction\n"));
1153 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; 1214 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
1154 Status = MLME_REJ_TIMEOUT; 1215 Status = MLME_REJ_TIMEOUT;
@@ -1164,51 +1225,49 @@ VOID ReassocTimeoutAction(
1164 1225
1165 ========================================================================== 1226 ==========================================================================
1166 */ 1227 */
1167VOID DisassocTimeoutAction( 1228VOID DisassocTimeoutAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
1168 IN PRTMP_ADAPTER pAd,
1169 IN MLME_QUEUE_ELEM *Elem)
1170{ 1229{
1171 USHORT Status; 1230 USHORT Status;
1172 DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - DisassocTimeoutAction\n")); 1231 DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - DisassocTimeoutAction\n"));
1173 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; 1232 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
1174 Status = MLME_SUCCESS; 1233 Status = MLME_SUCCESS;
1175 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_DISASSOC_CONF, 2, &Status); 1234 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_DISASSOC_CONF, 2,
1235 &Status);
1176} 1236}
1177 1237
1178VOID InvalidStateWhenAssoc( 1238VOID InvalidStateWhenAssoc(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
1179 IN PRTMP_ADAPTER pAd,
1180 IN MLME_QUEUE_ELEM *Elem)
1181{ 1239{
1182 USHORT Status; 1240 USHORT Status;
1183 DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - InvalidStateWhenAssoc(state=%ld), reset ASSOC state machine\n", 1241 DBGPRINT(RT_DEBUG_TRACE,
1184 pAd->Mlme.AssocMachine.CurrState)); 1242 ("ASSOC - InvalidStateWhenAssoc(state=%ld), reset ASSOC state machine\n",
1243 pAd->Mlme.AssocMachine.CurrState));
1185 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; 1244 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
1186 Status = MLME_STATE_MACHINE_REJECT; 1245 Status = MLME_STATE_MACHINE_REJECT;
1187 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_ASSOC_CONF, 2, &Status); 1246 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_ASSOC_CONF, 2, &Status);
1188} 1247}
1189 1248
1190VOID InvalidStateWhenReassoc( 1249VOID InvalidStateWhenReassoc(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
1191 IN PRTMP_ADAPTER pAd,
1192 IN MLME_QUEUE_ELEM *Elem)
1193{ 1250{
1194 USHORT Status; 1251 USHORT Status;
1195 DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - InvalidStateWhenReassoc(state=%ld), reset ASSOC state machine\n", 1252 DBGPRINT(RT_DEBUG_TRACE,
1196 pAd->Mlme.AssocMachine.CurrState)); 1253 ("ASSOC - InvalidStateWhenReassoc(state=%ld), reset ASSOC state machine\n",
1254 pAd->Mlme.AssocMachine.CurrState));
1197 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; 1255 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
1198 Status = MLME_STATE_MACHINE_REJECT; 1256 Status = MLME_STATE_MACHINE_REJECT;
1199 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_REASSOC_CONF, 2, &Status); 1257 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_REASSOC_CONF, 2, &Status);
1200} 1258}
1201 1259
1202VOID InvalidStateWhenDisassociate( 1260VOID InvalidStateWhenDisassociate(IN PRTMP_ADAPTER pAd,
1203 IN PRTMP_ADAPTER pAd, 1261 IN MLME_QUEUE_ELEM * Elem)
1204 IN MLME_QUEUE_ELEM *Elem)
1205{ 1262{
1206 USHORT Status; 1263 USHORT Status;
1207 DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - InvalidStateWhenDisassoc(state=%ld), reset ASSOC state machine\n", 1264 DBGPRINT(RT_DEBUG_TRACE,
1208 pAd->Mlme.AssocMachine.CurrState)); 1265 ("ASSOC - InvalidStateWhenDisassoc(state=%ld), reset ASSOC state machine\n",
1266 pAd->Mlme.AssocMachine.CurrState));
1209 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; 1267 pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
1210 Status = MLME_STATE_MACHINE_REJECT; 1268 Status = MLME_STATE_MACHINE_REJECT;
1211 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_DISASSOC_CONF, 2, &Status); 1269 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_DISASSOC_CONF, 2,
1270 &Status);
1212} 1271}
1213 1272
1214/* 1273/*
@@ -1224,33 +1283,31 @@ VOID InvalidStateWhenDisassociate(
1224 1283
1225 ========================================================================== 1284 ==========================================================================
1226 */ 1285 */
1227VOID Cls3errAction( 1286VOID Cls3errAction(IN PRTMP_ADAPTER pAd, IN PUCHAR pAddr)
1228 IN PRTMP_ADAPTER pAd,
1229 IN PUCHAR pAddr)
1230{ 1287{
1231 HEADER_802_11 DisassocHdr; 1288 HEADER_802_11 DisassocHdr;
1232 PHEADER_802_11 pDisassocHdr; 1289 PHEADER_802_11 pDisassocHdr;
1233 PUCHAR pOutBuffer = NULL; 1290 PUCHAR pOutBuffer = NULL;
1234 ULONG FrameLen = 0; 1291 ULONG FrameLen = 0;
1235 NDIS_STATUS NStatus; 1292 NDIS_STATUS NStatus;
1236 USHORT Reason = REASON_CLS3ERR; 1293 USHORT Reason = REASON_CLS3ERR;
1237 1294
1238 NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory 1295 NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory
1239 if (NStatus != NDIS_STATUS_SUCCESS) 1296 if (NStatus != NDIS_STATUS_SUCCESS)
1240 return; 1297 return;
1241 1298
1242 DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - Class 3 Error, Send DISASSOC frame\n")); 1299 DBGPRINT(RT_DEBUG_TRACE,
1300 ("ASSOC - Class 3 Error, Send DISASSOC frame\n"));
1243 MgtMacHeaderInit(pAd, &DisassocHdr, SUBTYPE_DISASSOC, 0, pAddr, pAd->CommonCfg.Bssid); // patch peap ttls switching issue 1301 MgtMacHeaderInit(pAd, &DisassocHdr, SUBTYPE_DISASSOC, 0, pAddr, pAd->CommonCfg.Bssid); // patch peap ttls switching issue
1244 MakeOutgoingFrame(pOutBuffer, &FrameLen, 1302 MakeOutgoingFrame(pOutBuffer, &FrameLen,
1245 sizeof(HEADER_802_11),&DisassocHdr, 1303 sizeof(HEADER_802_11), &DisassocHdr,
1246 2, &Reason, 1304 2, &Reason, END_OF_ARGS);
1247 END_OF_ARGS);
1248 MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); 1305 MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
1249 1306
1250 // To patch Instance and Buffalo(N) AP 1307 // To patch Instance and Buffalo(N) AP
1251 // Driver has to send deauth to Instance AP, but Buffalo(N) needs to send disassoc to reset Authenticator's state machine 1308 // Driver has to send deauth to Instance AP, but Buffalo(N) needs to send disassoc to reset Authenticator's state machine
1252 // Therefore, we send both of them. 1309 // Therefore, we send both of them.
1253 pDisassocHdr = (PHEADER_802_11)pOutBuffer; 1310 pDisassocHdr = (PHEADER_802_11) pOutBuffer;
1254 pDisassocHdr->FC.SubType = SUBTYPE_DEAUTH; 1311 pDisassocHdr->FC.SubType = SUBTYPE_DEAUTH;
1255 MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); 1312 MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
1256 1313
@@ -1260,206 +1317,248 @@ VOID Cls3errAction(
1260 COPY_MAC_ADDR(pAd->StaCfg.DisassocSta, pAddr); 1317 COPY_MAC_ADDR(pAd->StaCfg.DisassocSta, pAddr);
1261} 1318}
1262 1319
1263 1320int wext_notify_event_assoc(IN RTMP_ADAPTER * pAd)
1264int wext_notify_event_assoc(
1265 IN RTMP_ADAPTER *pAd)
1266{ 1321{
1267 char custom[IW_CUSTOM_MAX] = {0}; 1322 char custom[IW_CUSTOM_MAX] = { 0 };
1268 1323
1269 if (pAd->StaCfg.ReqVarIELen <= IW_CUSTOM_MAX) 1324 if (pAd->StaCfg.ReqVarIELen <= IW_CUSTOM_MAX) {
1270 { 1325 NdisMoveMemory(custom, pAd->StaCfg.ReqVarIEs,
1271 NdisMoveMemory(custom, pAd->StaCfg.ReqVarIEs, pAd->StaCfg.ReqVarIELen); 1326 pAd->StaCfg.ReqVarIELen);
1272 RtmpOSWrielessEventSend(pAd, IWEVASSOCREQIE, -1, NULL, custom, pAd->StaCfg.ReqVarIELen); 1327 RtmpOSWrielessEventSend(pAd, IWEVASSOCREQIE, -1, NULL, custom,
1273 } 1328 pAd->StaCfg.ReqVarIELen);
1274 else 1329 } else
1275 DBGPRINT(RT_DEBUG_TRACE, ("pAd->StaCfg.ReqVarIELen > MAX_CUSTOM_LEN\n")); 1330 DBGPRINT(RT_DEBUG_TRACE,
1331 ("pAd->StaCfg.ReqVarIELen > MAX_CUSTOM_LEN\n"));
1276 1332
1277 return 0; 1333 return 0;
1278 1334
1279} 1335}
1280 1336
1281 1337BOOLEAN StaAddMacTableEntry(IN PRTMP_ADAPTER pAd,
1282BOOLEAN StaAddMacTableEntry( 1338 IN PMAC_TABLE_ENTRY pEntry,
1283 IN PRTMP_ADAPTER pAd, 1339 IN UCHAR MaxSupportedRateIn500Kbps,
1284 IN PMAC_TABLE_ENTRY pEntry, 1340 IN HT_CAPABILITY_IE * pHtCapability,
1285 IN UCHAR MaxSupportedRateIn500Kbps, 1341 IN UCHAR HtCapabilityLen,
1286 IN HT_CAPABILITY_IE *pHtCapability, 1342 IN ADD_HT_INFO_IE * pAddHtInfo,
1287 IN UCHAR HtCapabilityLen, 1343 IN UCHAR AddHtInfoLen, IN USHORT CapabilityInfo)
1288 IN ADD_HT_INFO_IE *pAddHtInfo,
1289 IN UCHAR AddHtInfoLen,
1290 IN USHORT CapabilityInfo)
1291{ 1344{
1292 UCHAR MaxSupportedRate = RATE_11; 1345 UCHAR MaxSupportedRate = RATE_11;
1293 1346
1294 if (ADHOC_ON(pAd)) 1347 if (ADHOC_ON(pAd))
1295 CLIENT_STATUS_CLEAR_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE); 1348 CLIENT_STATUS_CLEAR_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE);
1296 1349
1297 switch (MaxSupportedRateIn500Kbps) 1350 switch (MaxSupportedRateIn500Kbps) {
1298 { 1351 case 108:
1299 case 108: MaxSupportedRate = RATE_54; break; 1352 MaxSupportedRate = RATE_54;
1300 case 96: MaxSupportedRate = RATE_48; break; 1353 break;
1301 case 72: MaxSupportedRate = RATE_36; break; 1354 case 96:
1302 case 48: MaxSupportedRate = RATE_24; break; 1355 MaxSupportedRate = RATE_48;
1303 case 36: MaxSupportedRate = RATE_18; break; 1356 break;
1304 case 24: MaxSupportedRate = RATE_12; break; 1357 case 72:
1305 case 18: MaxSupportedRate = RATE_9; break; 1358 MaxSupportedRate = RATE_36;
1306 case 12: MaxSupportedRate = RATE_6; break; 1359 break;
1307 case 22: MaxSupportedRate = RATE_11; break; 1360 case 48:
1308 case 11: MaxSupportedRate = RATE_5_5; break; 1361 MaxSupportedRate = RATE_24;
1309 case 4: MaxSupportedRate = RATE_2; break; 1362 break;
1310 case 2: MaxSupportedRate = RATE_1; break; 1363 case 36:
1311 default: MaxSupportedRate = RATE_11; break; 1364 MaxSupportedRate = RATE_18;
1312 } 1365 break;
1313 1366 case 24:
1314 if ((pAd->CommonCfg.PhyMode == PHY_11G) && (MaxSupportedRate < RATE_FIRST_OFDM_RATE)) 1367 MaxSupportedRate = RATE_12;
1315 return FALSE; 1368 break;
1369 case 18:
1370 MaxSupportedRate = RATE_9;
1371 break;
1372 case 12:
1373 MaxSupportedRate = RATE_6;
1374 break;
1375 case 22:
1376 MaxSupportedRate = RATE_11;
1377 break;
1378 case 11:
1379 MaxSupportedRate = RATE_5_5;
1380 break;
1381 case 4:
1382 MaxSupportedRate = RATE_2;
1383 break;
1384 case 2:
1385 MaxSupportedRate = RATE_1;
1386 break;
1387 default:
1388 MaxSupportedRate = RATE_11;
1389 break;
1390 }
1391
1392 if ((pAd->CommonCfg.PhyMode == PHY_11G)
1393 && (MaxSupportedRate < RATE_FIRST_OFDM_RATE))
1394 return FALSE;
1316 1395
1317 // 11n only 1396 // 11n only
1318 if (((pAd->CommonCfg.PhyMode == PHY_11N_2_4G) || (pAd->CommonCfg.PhyMode == PHY_11N_5G))&& (HtCapabilityLen == 0)) 1397 if (((pAd->CommonCfg.PhyMode == PHY_11N_2_4G)
1398 || (pAd->CommonCfg.PhyMode == PHY_11N_5G))
1399 && (HtCapabilityLen == 0))
1319 return FALSE; 1400 return FALSE;
1320 1401
1321 if (!pEntry) 1402 if (!pEntry)
1322 return FALSE; 1403 return FALSE;
1323 1404
1324 NdisAcquireSpinLock(&pAd->MacTabLock); 1405 NdisAcquireSpinLock(&pAd->MacTabLock);
1325 if (pEntry) 1406 if (pEntry) {
1326 {
1327 pEntry->PortSecured = WPA_802_1X_PORT_SECURED; 1407 pEntry->PortSecured = WPA_802_1X_PORT_SECURED;
1328 if ((MaxSupportedRate < RATE_FIRST_OFDM_RATE) || 1408 if ((MaxSupportedRate < RATE_FIRST_OFDM_RATE) ||
1329 (pAd->CommonCfg.PhyMode == PHY_11B)) 1409 (pAd->CommonCfg.PhyMode == PHY_11B)) {
1330 {
1331 pEntry->RateLen = 4; 1410 pEntry->RateLen = 4;
1332 if (MaxSupportedRate >= RATE_FIRST_OFDM_RATE) 1411 if (MaxSupportedRate >= RATE_FIRST_OFDM_RATE)
1333 MaxSupportedRate = RATE_11; 1412 MaxSupportedRate = RATE_11;
1334 } 1413 } else
1335 else
1336 pEntry->RateLen = 12; 1414 pEntry->RateLen = 12;
1337 1415
1338 pEntry->MaxHTPhyMode.word = 0; 1416 pEntry->MaxHTPhyMode.word = 0;
1339 pEntry->MinHTPhyMode.word = 0; 1417 pEntry->MinHTPhyMode.word = 0;
1340 pEntry->HTPhyMode.word = 0; 1418 pEntry->HTPhyMode.word = 0;
1341 pEntry->MaxSupportedRate = MaxSupportedRate; 1419 pEntry->MaxSupportedRate = MaxSupportedRate;
1342 if (pEntry->MaxSupportedRate < RATE_FIRST_OFDM_RATE) 1420 if (pEntry->MaxSupportedRate < RATE_FIRST_OFDM_RATE) {
1343 {
1344 pEntry->MaxHTPhyMode.field.MODE = MODE_CCK; 1421 pEntry->MaxHTPhyMode.field.MODE = MODE_CCK;
1345 pEntry->MaxHTPhyMode.field.MCS = pEntry->MaxSupportedRate; 1422 pEntry->MaxHTPhyMode.field.MCS =
1423 pEntry->MaxSupportedRate;
1346 pEntry->MinHTPhyMode.field.MODE = MODE_CCK; 1424 pEntry->MinHTPhyMode.field.MODE = MODE_CCK;
1347 pEntry->MinHTPhyMode.field.MCS = pEntry->MaxSupportedRate; 1425 pEntry->MinHTPhyMode.field.MCS =
1426 pEntry->MaxSupportedRate;
1348 pEntry->HTPhyMode.field.MODE = MODE_CCK; 1427 pEntry->HTPhyMode.field.MODE = MODE_CCK;
1349 pEntry->HTPhyMode.field.MCS = pEntry->MaxSupportedRate; 1428 pEntry->HTPhyMode.field.MCS = pEntry->MaxSupportedRate;
1350 } 1429 } else {
1351 else
1352 {
1353 pEntry->MaxHTPhyMode.field.MODE = MODE_OFDM; 1430 pEntry->MaxHTPhyMode.field.MODE = MODE_OFDM;
1354 pEntry->MaxHTPhyMode.field.MCS = OfdmRateToRxwiMCS[pEntry->MaxSupportedRate]; 1431 pEntry->MaxHTPhyMode.field.MCS =
1432 OfdmRateToRxwiMCS[pEntry->MaxSupportedRate];
1355 pEntry->MinHTPhyMode.field.MODE = MODE_OFDM; 1433 pEntry->MinHTPhyMode.field.MODE = MODE_OFDM;
1356 pEntry->MinHTPhyMode.field.MCS = OfdmRateToRxwiMCS[pEntry->MaxSupportedRate]; 1434 pEntry->MinHTPhyMode.field.MCS =
1435 OfdmRateToRxwiMCS[pEntry->MaxSupportedRate];
1357 pEntry->HTPhyMode.field.MODE = MODE_OFDM; 1436 pEntry->HTPhyMode.field.MODE = MODE_OFDM;
1358 pEntry->HTPhyMode.field.MCS = OfdmRateToRxwiMCS[pEntry->MaxSupportedRate]; 1437 pEntry->HTPhyMode.field.MCS =
1438 OfdmRateToRxwiMCS[pEntry->MaxSupportedRate];
1359 } 1439 }
1360 pEntry->CapabilityInfo = CapabilityInfo; 1440 pEntry->CapabilityInfo = CapabilityInfo;
1361 CLIENT_STATUS_CLEAR_FLAG(pEntry, fCLIENT_STATUS_AGGREGATION_CAPABLE); 1441 CLIENT_STATUS_CLEAR_FLAG(pEntry,
1362 CLIENT_STATUS_CLEAR_FLAG(pEntry, fCLIENT_STATUS_PIGGYBACK_CAPABLE); 1442 fCLIENT_STATUS_AGGREGATION_CAPABLE);
1443 CLIENT_STATUS_CLEAR_FLAG(pEntry,
1444 fCLIENT_STATUS_PIGGYBACK_CAPABLE);
1363 } 1445 }
1364 1446
1365 NdisZeroMemory(&pEntry->HTCapability, sizeof(pEntry->HTCapability)); 1447 NdisZeroMemory(&pEntry->HTCapability, sizeof(pEntry->HTCapability));
1366 // If this Entry supports 802.11n, upgrade to HT rate. 1448 // If this Entry supports 802.11n, upgrade to HT rate.
1367 if ((HtCapabilityLen != 0) && (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)) 1449 if ((HtCapabilityLen != 0)
1368 { 1450 && (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)) {
1369 UCHAR j, bitmask; //k,bitmask; 1451 UCHAR j, bitmask; //k,bitmask;
1370 CHAR i; 1452 CHAR i;
1371 1453
1372 if (ADHOC_ON(pAd)) 1454 if (ADHOC_ON(pAd))
1373 CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE); 1455 CLIENT_STATUS_SET_FLAG(pEntry,
1374 if ((pHtCapability->HtCapInfo.GF) && (pAd->CommonCfg.DesiredHtPhy.GF)) 1456 fCLIENT_STATUS_WMM_CAPABLE);
1375 { 1457 if ((pHtCapability->HtCapInfo.GF)
1458 && (pAd->CommonCfg.DesiredHtPhy.GF)) {
1376 pEntry->MaxHTPhyMode.field.MODE = MODE_HTGREENFIELD; 1459 pEntry->MaxHTPhyMode.field.MODE = MODE_HTGREENFIELD;
1377 } 1460 } else {
1378 else
1379 {
1380 pEntry->MaxHTPhyMode.field.MODE = MODE_HTMIX; 1461 pEntry->MaxHTPhyMode.field.MODE = MODE_HTMIX;
1381 pAd->MacTab.fAnyStationNonGF = TRUE; 1462 pAd->MacTab.fAnyStationNonGF = TRUE;
1382 pAd->CommonCfg.AddHTInfo.AddHtInfo2.NonGfPresent = 1; 1463 pAd->CommonCfg.AddHTInfo.AddHtInfo2.NonGfPresent = 1;
1383 } 1464 }
1384 1465
1385 if ((pHtCapability->HtCapInfo.ChannelWidth) && 1466 if ((pHtCapability->HtCapInfo.ChannelWidth) &&
1386 (pAd->CommonCfg.DesiredHtPhy.ChannelWidth) && 1467 (pAd->CommonCfg.DesiredHtPhy.ChannelWidth) &&
1387 ((pAd->StaCfg.BssType == BSS_INFRA) || ((pAd->StaCfg.BssType == BSS_ADHOC) && (pAddHtInfo->AddHtInfo.ExtChanOffset == pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset)))) 1468 ((pAd->StaCfg.BssType == BSS_INFRA)
1388 { 1469 || ((pAd->StaCfg.BssType == BSS_ADHOC)
1389 pEntry->MaxHTPhyMode.field.BW= BW_40; 1470 && (pAddHtInfo->AddHtInfo.ExtChanOffset ==
1390 pEntry->MaxHTPhyMode.field.ShortGI = ((pAd->CommonCfg.DesiredHtPhy.ShortGIfor40)&(pHtCapability->HtCapInfo.ShortGIfor40)); 1471 pAd->CommonCfg.AddHTInfo.AddHtInfo.
1391 } 1472 ExtChanOffset)))) {
1392 else 1473 pEntry->MaxHTPhyMode.field.BW = BW_40;
1393 { 1474 pEntry->MaxHTPhyMode.field.ShortGI =
1475 ((pAd->CommonCfg.DesiredHtPhy.
1476 ShortGIfor40) & (pHtCapability->HtCapInfo.
1477 ShortGIfor40));
1478 } else {
1394 pEntry->MaxHTPhyMode.field.BW = BW_20; 1479 pEntry->MaxHTPhyMode.field.BW = BW_20;
1395 pEntry->MaxHTPhyMode.field.ShortGI = ((pAd->CommonCfg.DesiredHtPhy.ShortGIfor20)&(pHtCapability->HtCapInfo.ShortGIfor20)); 1480 pEntry->MaxHTPhyMode.field.ShortGI =
1481 ((pAd->CommonCfg.DesiredHtPhy.
1482 ShortGIfor20) & (pHtCapability->HtCapInfo.
1483 ShortGIfor20));
1396 pAd->MacTab.fAnyStation20Only = TRUE; 1484 pAd->MacTab.fAnyStation20Only = TRUE;
1397 } 1485 }
1398 1486
1399 // 3*3 1487 // 3*3
1400 if (pAd->MACVersion >= RALINK_2883_VERSION && pAd->MACVersion < RALINK_3070_VERSION) 1488 if (pAd->MACVersion >= RALINK_2883_VERSION
1401 pEntry->MaxHTPhyMode.field.TxBF = pAd->CommonCfg.RegTransmitSetting.field.TxBF; 1489 && pAd->MACVersion < RALINK_3070_VERSION)
1490 pEntry->MaxHTPhyMode.field.TxBF =
1491 pAd->CommonCfg.RegTransmitSetting.field.TxBF;
1402 1492
1403 // find max fixed rate 1493 // find max fixed rate
1404 for (i=23; i>=0; i--) // 3*3 1494 for (i = 23; i >= 0; i--) // 3*3
1405 { 1495 {
1406 j = i/8; 1496 j = i / 8;
1407 bitmask = (1<<(i-(j*8))); 1497 bitmask = (1 << (i - (j * 8)));
1408 if ((pAd->StaCfg.DesiredHtPhyInfo.MCSSet[j] & bitmask) && (pHtCapability->MCSSet[j] & bitmask)) 1498 if ((pAd->StaCfg.DesiredHtPhyInfo.MCSSet[j] & bitmask)
1409 { 1499 && (pHtCapability->MCSSet[j] & bitmask)) {
1410 pEntry->MaxHTPhyMode.field.MCS = i; 1500 pEntry->MaxHTPhyMode.field.MCS = i;
1411 break; 1501 break;
1412 } 1502 }
1413 if (i==0) 1503 if (i == 0)
1414 break; 1504 break;
1415 } 1505 }
1416 1506
1417 1507 if (pAd->StaCfg.DesiredTransmitSetting.field.MCS != MCS_AUTO) {
1418 if (pAd->StaCfg.DesiredTransmitSetting.field.MCS != MCS_AUTO) 1508 if (pAd->StaCfg.DesiredTransmitSetting.field.MCS == 32) {
1419 {
1420 if (pAd->StaCfg.DesiredTransmitSetting.field.MCS == 32)
1421 {
1422 // Fix MCS as HT Duplicated Mode 1509 // Fix MCS as HT Duplicated Mode
1423 pEntry->MaxHTPhyMode.field.BW = 1; 1510 pEntry->MaxHTPhyMode.field.BW = 1;
1424 pEntry->MaxHTPhyMode.field.MODE = MODE_HTMIX; 1511 pEntry->MaxHTPhyMode.field.MODE = MODE_HTMIX;
1425 pEntry->MaxHTPhyMode.field.STBC = 0; 1512 pEntry->MaxHTPhyMode.field.STBC = 0;
1426 pEntry->MaxHTPhyMode.field.ShortGI = 0; 1513 pEntry->MaxHTPhyMode.field.ShortGI = 0;
1427 pEntry->MaxHTPhyMode.field.MCS = 32; 1514 pEntry->MaxHTPhyMode.field.MCS = 32;
1428 } 1515 } else if (pEntry->MaxHTPhyMode.field.MCS >
1429 else if (pEntry->MaxHTPhyMode.field.MCS > pAd->StaCfg.HTPhyMode.field.MCS) 1516 pAd->StaCfg.HTPhyMode.field.MCS) {
1430 {
1431 // STA supports fixed MCS 1517 // STA supports fixed MCS
1432 pEntry->MaxHTPhyMode.field.MCS = pAd->StaCfg.HTPhyMode.field.MCS; 1518 pEntry->MaxHTPhyMode.field.MCS =
1519 pAd->StaCfg.HTPhyMode.field.MCS;
1433 } 1520 }
1434 } 1521 }
1435 1522
1436 pEntry->MaxHTPhyMode.field.STBC = (pHtCapability->HtCapInfo.RxSTBC & (pAd->CommonCfg.DesiredHtPhy.TxSTBC)); 1523 pEntry->MaxHTPhyMode.field.STBC =
1524 (pHtCapability->HtCapInfo.
1525 RxSTBC & (pAd->CommonCfg.DesiredHtPhy.TxSTBC));
1437 pEntry->MpduDensity = pHtCapability->HtCapParm.MpduDensity; 1526 pEntry->MpduDensity = pHtCapability->HtCapParm.MpduDensity;
1438 pEntry->MaxRAmpduFactor = pHtCapability->HtCapParm.MaxRAmpduFactor; 1527 pEntry->MaxRAmpduFactor =
1439 pEntry->MmpsMode = (UCHAR)pHtCapability->HtCapInfo.MimoPs; 1528 pHtCapability->HtCapParm.MaxRAmpduFactor;
1440 pEntry->AMsduSize = (UCHAR)pHtCapability->HtCapInfo.AMsduSize; 1529 pEntry->MmpsMode = (UCHAR) pHtCapability->HtCapInfo.MimoPs;
1530 pEntry->AMsduSize = (UCHAR) pHtCapability->HtCapInfo.AMsduSize;
1441 pEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word; 1531 pEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word;
1442 1532
1443 if (pAd->CommonCfg.DesiredHtPhy.AmsduEnable && (pAd->CommonCfg.REGBACapability.field.AutoBA == FALSE)) 1533 if (pAd->CommonCfg.DesiredHtPhy.AmsduEnable
1444 CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_AMSDU_INUSED); 1534 && (pAd->CommonCfg.REGBACapability.field.AutoBA == FALSE))
1535 CLIENT_STATUS_SET_FLAG(pEntry,
1536 fCLIENT_STATUS_AMSDU_INUSED);
1445 if (pHtCapability->HtCapInfo.ShortGIfor20) 1537 if (pHtCapability->HtCapInfo.ShortGIfor20)
1446 CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI20_CAPABLE); 1538 CLIENT_STATUS_SET_FLAG(pEntry,
1539 fCLIENT_STATUS_SGI20_CAPABLE);
1447 if (pHtCapability->HtCapInfo.ShortGIfor40) 1540 if (pHtCapability->HtCapInfo.ShortGIfor40)
1448 CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI40_CAPABLE); 1541 CLIENT_STATUS_SET_FLAG(pEntry,
1542 fCLIENT_STATUS_SGI40_CAPABLE);
1449 if (pHtCapability->HtCapInfo.TxSTBC) 1543 if (pHtCapability->HtCapInfo.TxSTBC)
1450 CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_TxSTBC_CAPABLE); 1544 CLIENT_STATUS_SET_FLAG(pEntry,
1545 fCLIENT_STATUS_TxSTBC_CAPABLE);
1451 if (pHtCapability->HtCapInfo.RxSTBC) 1546 if (pHtCapability->HtCapInfo.RxSTBC)
1452 CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RxSTBC_CAPABLE); 1547 CLIENT_STATUS_SET_FLAG(pEntry,
1548 fCLIENT_STATUS_RxSTBC_CAPABLE);
1453 if (pHtCapability->ExtHtCapInfo.PlusHTC) 1549 if (pHtCapability->ExtHtCapInfo.PlusHTC)
1454 CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_HTC_CAPABLE); 1550 CLIENT_STATUS_SET_FLAG(pEntry,
1455 if (pAd->CommonCfg.bRdg && pHtCapability->ExtHtCapInfo.RDGSupport) 1551 fCLIENT_STATUS_HTC_CAPABLE);
1456 CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RDG_CAPABLE); 1552 if (pAd->CommonCfg.bRdg
1553 && pHtCapability->ExtHtCapInfo.RDGSupport)
1554 CLIENT_STATUS_SET_FLAG(pEntry,
1555 fCLIENT_STATUS_RDG_CAPABLE);
1457 if (pHtCapability->ExtHtCapInfo.MCSFeedback == 0x03) 1556 if (pHtCapability->ExtHtCapInfo.MCSFeedback == 0x03)
1458 CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_MCSFEEDBACK_CAPABLE); 1557 CLIENT_STATUS_SET_FLAG(pEntry,
1459 NdisMoveMemory(&pEntry->HTCapability, pHtCapability, HtCapabilityLen); 1558 fCLIENT_STATUS_MCSFEEDBACK_CAPABLE);
1460 } 1559 NdisMoveMemory(&pEntry->HTCapability, pHtCapability,
1461 else 1560 HtCapabilityLen);
1462 { 1561 } else {
1463 pAd->MacTab.fAnyStationIsLegacy = TRUE; 1562 pAd->MacTab.fAnyStationIsLegacy = TRUE;
1464 } 1563 }
1465 1564
@@ -1467,22 +1566,22 @@ BOOLEAN StaAddMacTableEntry(
1467 pEntry->CurrTxRate = pEntry->MaxSupportedRate; 1566 pEntry->CurrTxRate = pEntry->MaxSupportedRate;
1468 1567
1469 // Set asic auto fall back 1568 // Set asic auto fall back
1470 if (pAd->StaCfg.bAutoTxRateSwitch == TRUE) 1569 if (pAd->StaCfg.bAutoTxRateSwitch == TRUE) {
1471 { 1570 PUCHAR pTable;
1472 PUCHAR pTable; 1571 UCHAR TableSize = 0;
1473 UCHAR TableSize = 0;
1474 1572
1475 MlmeSelectTxRateTable(pAd, pEntry, &pTable, &TableSize, &pEntry->CurrTxRateIndex); 1573 MlmeSelectTxRateTable(pAd, pEntry, &pTable, &TableSize,
1574 &pEntry->CurrTxRateIndex);
1476 pEntry->bAutoTxRateSwitch = TRUE; 1575 pEntry->bAutoTxRateSwitch = TRUE;
1477 } 1576 } else {
1478 else 1577 pEntry->HTPhyMode.field.MODE = pAd->StaCfg.HTPhyMode.field.MODE;
1479 { 1578 pEntry->HTPhyMode.field.MCS = pAd->StaCfg.HTPhyMode.field.MCS;
1480 pEntry->HTPhyMode.field.MODE = pAd->StaCfg.HTPhyMode.field.MODE;
1481 pEntry->HTPhyMode.field.MCS = pAd->StaCfg.HTPhyMode.field.MCS;
1482 pEntry->bAutoTxRateSwitch = FALSE; 1579 pEntry->bAutoTxRateSwitch = FALSE;
1483 1580
1484 // If the legacy mode is set, overwrite the transmit setting of this entry. 1581 // If the legacy mode is set, overwrite the transmit setting of this entry.
1485 RTMPUpdateLegacyTxSetting((UCHAR)pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode, pEntry); 1582 RTMPUpdateLegacyTxSetting((UCHAR) pAd->StaCfg.
1583 DesiredTransmitSetting.field.
1584 FixedTxMode, pEntry);
1486 } 1585 }
1487 1586
1488 pEntry->PortSecured = WPA_802_1X_PORT_SECURED; 1587 pEntry->PortSecured = WPA_802_1X_PORT_SECURED;
@@ -1493,14 +1592,14 @@ BOOLEAN StaAddMacTableEntry(
1493 1592
1494 NdisReleaseSpinLock(&pAd->MacTabLock); 1593 NdisReleaseSpinLock(&pAd->MacTabLock);
1495 1594
1496 { 1595 {
1497 union iwreq_data wrqu; 1596 union iwreq_data wrqu;
1498 wext_notify_event_assoc(pAd); 1597 wext_notify_event_assoc(pAd);
1499 1598
1500 memset(wrqu.ap_addr.sa_data, 0, MAC_ADDR_LEN); 1599 memset(wrqu.ap_addr.sa_data, 0, MAC_ADDR_LEN);
1501 memcpy(wrqu.ap_addr.sa_data, pAd->MlmeAux.Bssid, MAC_ADDR_LEN); 1600 memcpy(wrqu.ap_addr.sa_data, pAd->MlmeAux.Bssid, MAC_ADDR_LEN);
1502 wireless_send_event(pAd->net_dev, SIOCGIWAP, &wrqu, NULL); 1601 wireless_send_event(pAd->net_dev, SIOCGIWAP, &wrqu, NULL);
1503 1602
1504 } 1603 }
1505 return TRUE; 1604 return TRUE;
1506} 1605}
diff --git a/drivers/staging/rt2860/sta/auth.c b/drivers/staging/rt2860/sta/auth.c
index 7fb0760dabc..8b75b4676e1 100644
--- a/drivers/staging/rt2860/sta/auth.c
+++ b/drivers/staging/rt2860/sta/auth.c
@@ -55,27 +55,35 @@
55 ========================================================================== 55 ==========================================================================
56 */ 56 */
57 57
58void AuthStateMachineInit( 58void AuthStateMachineInit(IN PRTMP_ADAPTER pAd,
59 IN PRTMP_ADAPTER pAd, 59 IN STATE_MACHINE * Sm, OUT STATE_MACHINE_FUNC Trans[])
60 IN STATE_MACHINE *Sm,
61 OUT STATE_MACHINE_FUNC Trans[])
62{ 60{
63 StateMachineInit(Sm, Trans, MAX_AUTH_STATE, MAX_AUTH_MSG, (STATE_MACHINE_FUNC)Drop, AUTH_REQ_IDLE, AUTH_MACHINE_BASE); 61 StateMachineInit(Sm, Trans, MAX_AUTH_STATE, MAX_AUTH_MSG,
64 62 (STATE_MACHINE_FUNC) Drop, AUTH_REQ_IDLE,
65 // the first column 63 AUTH_MACHINE_BASE);
66 StateMachineSetAction(Sm, AUTH_REQ_IDLE, MT2_MLME_AUTH_REQ, (STATE_MACHINE_FUNC)MlmeAuthReqAction); 64
67 65 // the first column
68 // the second column 66 StateMachineSetAction(Sm, AUTH_REQ_IDLE, MT2_MLME_AUTH_REQ,
69 StateMachineSetAction(Sm, AUTH_WAIT_SEQ2, MT2_MLME_AUTH_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenAuth); 67 (STATE_MACHINE_FUNC) MlmeAuthReqAction);
70 StateMachineSetAction(Sm, AUTH_WAIT_SEQ2, MT2_PEER_AUTH_EVEN, (STATE_MACHINE_FUNC)PeerAuthRspAtSeq2Action); 68
71 StateMachineSetAction(Sm, AUTH_WAIT_SEQ2, MT2_AUTH_TIMEOUT, (STATE_MACHINE_FUNC)AuthTimeoutAction); 69 // the second column
72 70 StateMachineSetAction(Sm, AUTH_WAIT_SEQ2, MT2_MLME_AUTH_REQ,
73 // the third column 71 (STATE_MACHINE_FUNC) InvalidStateWhenAuth);
74 StateMachineSetAction(Sm, AUTH_WAIT_SEQ4, MT2_MLME_AUTH_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenAuth); 72 StateMachineSetAction(Sm, AUTH_WAIT_SEQ2, MT2_PEER_AUTH_EVEN,
75 StateMachineSetAction(Sm, AUTH_WAIT_SEQ4, MT2_PEER_AUTH_EVEN, (STATE_MACHINE_FUNC)PeerAuthRspAtSeq4Action); 73 (STATE_MACHINE_FUNC) PeerAuthRspAtSeq2Action);
76 StateMachineSetAction(Sm, AUTH_WAIT_SEQ4, MT2_AUTH_TIMEOUT, (STATE_MACHINE_FUNC)AuthTimeoutAction); 74 StateMachineSetAction(Sm, AUTH_WAIT_SEQ2, MT2_AUTH_TIMEOUT,
77 75 (STATE_MACHINE_FUNC) AuthTimeoutAction);
78 RTMPInitTimer(pAd, &pAd->MlmeAux.AuthTimer, GET_TIMER_FUNCTION(AuthTimeout), pAd, FALSE); 76
77 // the third column
78 StateMachineSetAction(Sm, AUTH_WAIT_SEQ4, MT2_MLME_AUTH_REQ,
79 (STATE_MACHINE_FUNC) InvalidStateWhenAuth);
80 StateMachineSetAction(Sm, AUTH_WAIT_SEQ4, MT2_PEER_AUTH_EVEN,
81 (STATE_MACHINE_FUNC) PeerAuthRspAtSeq4Action);
82 StateMachineSetAction(Sm, AUTH_WAIT_SEQ4, MT2_AUTH_TIMEOUT,
83 (STATE_MACHINE_FUNC) AuthTimeoutAction);
84
85 RTMPInitTimer(pAd, &pAd->MlmeAux.AuthTimer,
86 GET_TIMER_FUNCTION(AuthTimeout), pAd, FALSE);
79} 87}
80 88
81/* 89/*
@@ -87,31 +95,28 @@ void AuthStateMachineInit(
87 95
88 ========================================================================== 96 ==========================================================================
89 */ 97 */
90VOID AuthTimeout( 98VOID AuthTimeout(IN PVOID SystemSpecific1,
91 IN PVOID SystemSpecific1, 99 IN PVOID FunctionContext,
92 IN PVOID FunctionContext, 100 IN PVOID SystemSpecific2, IN PVOID SystemSpecific3)
93 IN PVOID SystemSpecific2,
94 IN PVOID SystemSpecific3)
95{ 101{
96 RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext; 102 RTMP_ADAPTER *pAd = (RTMP_ADAPTER *) FunctionContext;
97 103
98 DBGPRINT(RT_DEBUG_TRACE,("AUTH - AuthTimeout\n")); 104 DBGPRINT(RT_DEBUG_TRACE, ("AUTH - AuthTimeout\n"));
99 105
100 // Do nothing if the driver is starting halt state. 106 // Do nothing if the driver is starting halt state.
101 // This might happen when timer already been fired before cancel timer with mlmehalt 107 // This might happen when timer already been fired before cancel timer with mlmehalt
102 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) 108 if (RTMP_TEST_FLAG
109 (pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
103 return; 110 return;
104 111
105 // send a de-auth to reset AP's state machine (Patch AP-Dir635) 112 // send a de-auth to reset AP's state machine (Patch AP-Dir635)
106 if (pAd->Mlme.AuthMachine.CurrState == AUTH_WAIT_SEQ2) 113 if (pAd->Mlme.AuthMachine.CurrState == AUTH_WAIT_SEQ2)
107 Cls2errAction(pAd, pAd->MlmeAux.Bssid); 114 Cls2errAction(pAd, pAd->MlmeAux.Bssid);
108 115
109 116 MlmeEnqueue(pAd, AUTH_STATE_MACHINE, MT2_AUTH_TIMEOUT, 0, NULL);
110 MlmeEnqueue(pAd, AUTH_STATE_MACHINE, MT2_AUTH_TIMEOUT, 0, NULL); 117 RTMP_MLME_HANDLER(pAd);
111 RTMP_MLME_HANDLER(pAd);
112} 118}
113 119
114
115/* 120/*
116 ========================================================================== 121 ==========================================================================
117 Description: 122 Description:
@@ -120,20 +125,19 @@ VOID AuthTimeout(
120 125
121 ========================================================================== 126 ==========================================================================
122 */ 127 */
123VOID MlmeAuthReqAction( 128VOID MlmeAuthReqAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
124 IN PRTMP_ADAPTER pAd,
125 IN MLME_QUEUE_ELEM *Elem)
126{ 129{
127 if (AUTH_ReqSend(pAd, Elem, &pAd->MlmeAux.AuthTimer, "AUTH", 1, NULL, 0)) 130 if (AUTH_ReqSend
128 pAd->Mlme.AuthMachine.CurrState = AUTH_WAIT_SEQ2; 131 (pAd, Elem, &pAd->MlmeAux.AuthTimer, "AUTH", 1, NULL, 0))
129 else 132 pAd->Mlme.AuthMachine.CurrState = AUTH_WAIT_SEQ2;
130 { 133 else {
131 USHORT Status; 134 USHORT Status;
132 135
133 pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; 136 pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;
134 Status = MLME_INVALID_FORMAT; 137 Status = MLME_INVALID_FORMAT;
135 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status); 138 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2,
136 } 139 &Status);
140 }
137} 141}
138 142
139/* 143/*
@@ -144,101 +148,130 @@ VOID MlmeAuthReqAction(
144 148
145 ========================================================================== 149 ==========================================================================
146 */ 150 */
147VOID PeerAuthRspAtSeq2Action( 151VOID PeerAuthRspAtSeq2Action(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
148 IN PRTMP_ADAPTER pAd,
149 IN MLME_QUEUE_ELEM *Elem)
150{ 152{
151 UCHAR Addr2[MAC_ADDR_LEN]; 153 UCHAR Addr2[MAC_ADDR_LEN];
152 USHORT Seq, Status, RemoteStatus, Alg; 154 USHORT Seq, Status, RemoteStatus, Alg;
153 UCHAR ChlgText[CIPHER_TEXT_LEN]; 155 UCHAR ChlgText[CIPHER_TEXT_LEN];
154 UCHAR CyperChlgText[CIPHER_TEXT_LEN + 8 + 8]; 156 UCHAR CyperChlgText[CIPHER_TEXT_LEN + 8 + 8];
155 UCHAR Element[2]; 157 UCHAR Element[2];
156 HEADER_802_11 AuthHdr; 158 HEADER_802_11 AuthHdr;
157 BOOLEAN TimerCancelled; 159 BOOLEAN TimerCancelled;
158 PUCHAR pOutBuffer = NULL; 160 PUCHAR pOutBuffer = NULL;
159 NDIS_STATUS NStatus; 161 NDIS_STATUS NStatus;
160 ULONG FrameLen = 0; 162 ULONG FrameLen = 0;
161 USHORT Status2; 163 USHORT Status2;
162 164
163 if (PeerAuthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Alg, &Seq, &Status, (PCHAR)ChlgText)) 165 if (PeerAuthSanity
164 { 166 (pAd, Elem->Msg, Elem->MsgLen, Addr2, &Alg, &Seq, &Status,
165 if (MAC_ADDR_EQUAL(pAd->MlmeAux.Bssid, Addr2) && Seq == 2) 167 (PCHAR) ChlgText)) {
166 { 168 if (MAC_ADDR_EQUAL(pAd->MlmeAux.Bssid, Addr2) && Seq == 2) {
167 DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Receive AUTH_RSP seq#2 to me (Alg=%d, Status=%d)\n", Alg, Status)); 169 DBGPRINT(RT_DEBUG_TRACE,
168 RTMPCancelTimer(&pAd->MlmeAux.AuthTimer, &TimerCancelled); 170 ("AUTH - Receive AUTH_RSP seq#2 to me (Alg=%d, Status=%d)\n",
169 171 Alg, Status));
170 if (Status == MLME_SUCCESS) 172 RTMPCancelTimer(&pAd->MlmeAux.AuthTimer,
171 { 173 &TimerCancelled);
172 // Authentication Mode "LEAP" has allow for CCX 1.X 174
173 if (pAd->MlmeAux.Alg == Ndis802_11AuthModeOpen) 175 if (Status == MLME_SUCCESS) {
174 { 176 // Authentication Mode "LEAP" has allow for CCX 1.X
175 pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; 177 if (pAd->MlmeAux.Alg == Ndis802_11AuthModeOpen) {
176 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status); 178 pAd->Mlme.AuthMachine.CurrState =
177 } 179 AUTH_REQ_IDLE;
178 else 180 MlmeEnqueue(pAd,
179 { 181 MLME_CNTL_STATE_MACHINE,
180 // 2. shared key, need to be challenged 182 MT2_AUTH_CONF, 2, &Status);
181 Seq++; 183 } else {
182 RemoteStatus = MLME_SUCCESS; 184 // 2. shared key, need to be challenged
185 Seq++;
186 RemoteStatus = MLME_SUCCESS;
183 187
184 // Get an unused nonpaged memory 188 // Get an unused nonpaged memory
185 NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); 189 NStatus =
186 if(NStatus != NDIS_STATUS_SUCCESS) 190 MlmeAllocateMemory(pAd,
187 { 191 &pOutBuffer);
188 DBGPRINT(RT_DEBUG_TRACE, ("AUTH - PeerAuthRspAtSeq2Action() allocate memory fail\n")); 192 if (NStatus != NDIS_STATUS_SUCCESS) {
189 pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; 193 DBGPRINT(RT_DEBUG_TRACE,
190 Status2 = MLME_FAIL_NO_RESOURCE; 194 ("AUTH - PeerAuthRspAtSeq2Action() allocate memory fail\n"));
191 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status2); 195 pAd->Mlme.AuthMachine.
192 return; 196 CurrState = AUTH_REQ_IDLE;
193 } 197 Status2 = MLME_FAIL_NO_RESOURCE;
194 198 MlmeEnqueue(pAd,
195 DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Send AUTH request seq#3...\n")); 199 MLME_CNTL_STATE_MACHINE,
196 MgtMacHeaderInit(pAd, &AuthHdr, SUBTYPE_AUTH, 0, Addr2, pAd->MlmeAux.Bssid); 200 MT2_AUTH_CONF, 2,
197 AuthHdr.FC.Wep = 1; 201 &Status2);
198 // Encrypt challenge text & auth information 202 return;
199 RTMPInitWepEngine( 203 }
200 pAd, 204
201 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].Key, 205 DBGPRINT(RT_DEBUG_TRACE,
202 pAd->StaCfg.DefaultKeyId, 206 ("AUTH - Send AUTH request seq#3...\n"));
203 pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].KeyLen, 207 MgtMacHeaderInit(pAd, &AuthHdr,
204 CyperChlgText); 208 SUBTYPE_AUTH, 0, Addr2,
205 209 pAd->MlmeAux.Bssid);
206 Alg = cpu2le16(*(USHORT *)&Alg); 210 AuthHdr.FC.Wep = 1;
207 Seq = cpu2le16(*(USHORT *)&Seq); 211 // Encrypt challenge text & auth information
208 RemoteStatus= cpu2le16(*(USHORT *)&RemoteStatus); 212 RTMPInitWepEngine(pAd,
209 213 pAd->
210 RTMPEncryptData(pAd, (PUCHAR) &Alg, CyperChlgText + 4, 2); 214 SharedKey[BSS0][pAd->
211 RTMPEncryptData(pAd, (PUCHAR) &Seq, CyperChlgText + 6, 2); 215 StaCfg.
212 RTMPEncryptData(pAd, (PUCHAR) &RemoteStatus, CyperChlgText + 8, 2); 216 DefaultKeyId].
217 Key,
218 pAd->StaCfg.
219 DefaultKeyId,
220 pAd->
221 SharedKey[BSS0][pAd->
222 StaCfg.
223 DefaultKeyId].
224 KeyLen,
225 CyperChlgText);
226
227 Alg = cpu2le16(*(USHORT *) & Alg);
228 Seq = cpu2le16(*(USHORT *) & Seq);
229 RemoteStatus =
230 cpu2le16(*(USHORT *) &
231 RemoteStatus);
232
233 RTMPEncryptData(pAd, (PUCHAR) & Alg,
234 CyperChlgText + 4, 2);
235 RTMPEncryptData(pAd, (PUCHAR) & Seq,
236 CyperChlgText + 6, 2);
237 RTMPEncryptData(pAd,
238 (PUCHAR) & RemoteStatus,
239 CyperChlgText + 8, 2);
213 Element[0] = 16; 240 Element[0] = 16;
214 Element[1] = 128; 241 Element[1] = 128;
215 RTMPEncryptData(pAd, Element, CyperChlgText + 10, 2); 242 RTMPEncryptData(pAd, Element,
216 RTMPEncryptData(pAd, ChlgText, CyperChlgText + 12, 128); 243 CyperChlgText + 10, 2);
244 RTMPEncryptData(pAd, ChlgText,
245 CyperChlgText + 12,
246 128);
217 RTMPSetICV(pAd, CyperChlgText + 140); 247 RTMPSetICV(pAd, CyperChlgText + 140);
218 MakeOutgoingFrame(pOutBuffer, &FrameLen, 248 MakeOutgoingFrame(pOutBuffer, &FrameLen,
219 sizeof(HEADER_802_11), &AuthHdr, 249 sizeof(HEADER_802_11),
220 CIPHER_TEXT_LEN + 16, CyperChlgText, 250 &AuthHdr,
221 END_OF_ARGS); 251 CIPHER_TEXT_LEN + 16,
222 MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); 252 CyperChlgText,
223 MlmeFreeMemory(pAd, pOutBuffer); 253 END_OF_ARGS);
224 254 MiniportMMRequest(pAd, 0, pOutBuffer,
225 RTMPSetTimer(&pAd->MlmeAux.AuthTimer, AUTH_TIMEOUT); 255 FrameLen);
226 pAd->Mlme.AuthMachine.CurrState = AUTH_WAIT_SEQ4; 256 MlmeFreeMemory(pAd, pOutBuffer);
227 } 257
228 } 258 RTMPSetTimer(&pAd->MlmeAux.AuthTimer,
229 else 259 AUTH_TIMEOUT);
230 { 260 pAd->Mlme.AuthMachine.CurrState =
231 pAd->StaCfg.AuthFailReason = Status; 261 AUTH_WAIT_SEQ4;
232 COPY_MAC_ADDR(pAd->StaCfg.AuthFailSta, Addr2); 262 }
233 pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; 263 } else {
234 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status); 264 pAd->StaCfg.AuthFailReason = Status;
235 } 265 COPY_MAC_ADDR(pAd->StaCfg.AuthFailSta, Addr2);
236 } 266 pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;
237 } 267 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE,
238 else 268 MT2_AUTH_CONF, 2, &Status);
239 { 269 }
240 DBGPRINT(RT_DEBUG_TRACE, ("AUTH - PeerAuthSanity() sanity check fail\n")); 270 }
241 } 271 } else {
272 DBGPRINT(RT_DEBUG_TRACE,
273 ("AUTH - PeerAuthSanity() sanity check fail\n"));
274 }
242} 275}
243 276
244/* 277/*
@@ -249,36 +282,35 @@ VOID PeerAuthRspAtSeq2Action(
249 282
250 ========================================================================== 283 ==========================================================================
251 */ 284 */
252VOID PeerAuthRspAtSeq4Action( 285VOID PeerAuthRspAtSeq4Action(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
253 IN PRTMP_ADAPTER pAd,
254 IN MLME_QUEUE_ELEM *Elem)
255{ 286{
256 UCHAR Addr2[MAC_ADDR_LEN]; 287 UCHAR Addr2[MAC_ADDR_LEN];
257 USHORT Alg, Seq, Status; 288 USHORT Alg, Seq, Status;
258 CHAR ChlgText[CIPHER_TEXT_LEN]; 289 CHAR ChlgText[CIPHER_TEXT_LEN];
259 BOOLEAN TimerCancelled; 290 BOOLEAN TimerCancelled;
260 291
261 if(PeerAuthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Alg, &Seq, &Status, ChlgText)) 292 if (PeerAuthSanity
262 { 293 (pAd, Elem->Msg, Elem->MsgLen, Addr2, &Alg, &Seq, &Status,
263 if(MAC_ADDR_EQUAL(pAd->MlmeAux.Bssid, Addr2) && Seq == 4) 294 ChlgText)) {
264 { 295 if (MAC_ADDR_EQUAL(pAd->MlmeAux.Bssid, Addr2) && Seq == 4) {
265 DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Receive AUTH_RSP seq#4 to me\n")); 296 DBGPRINT(RT_DEBUG_TRACE,
266 RTMPCancelTimer(&pAd->MlmeAux.AuthTimer, &TimerCancelled); 297 ("AUTH - Receive AUTH_RSP seq#4 to me\n"));
267 298 RTMPCancelTimer(&pAd->MlmeAux.AuthTimer,
268 if (Status != MLME_SUCCESS) 299 &TimerCancelled);
269 { 300
270 pAd->StaCfg.AuthFailReason = Status; 301 if (Status != MLME_SUCCESS) {
271 COPY_MAC_ADDR(pAd->StaCfg.AuthFailSta, Addr2); 302 pAd->StaCfg.AuthFailReason = Status;
272 } 303 COPY_MAC_ADDR(pAd->StaCfg.AuthFailSta, Addr2);
273 304 }
274 pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; 305
275 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status); 306 pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;
276 } 307 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF,
277 } 308 2, &Status);
278 else 309 }
279 { 310 } else {
280 DBGPRINT(RT_DEBUG_TRACE, ("AUTH - PeerAuthRspAtSeq4Action() sanity check fail\n")); 311 DBGPRINT(RT_DEBUG_TRACE,
281 } 312 ("AUTH - PeerAuthRspAtSeq4Action() sanity check fail\n"));
313 }
282} 314}
283 315
284/* 316/*
@@ -289,47 +321,49 @@ VOID PeerAuthRspAtSeq4Action(
289 321
290 ========================================================================== 322 ==========================================================================
291 */ 323 */
292VOID MlmeDeauthReqAction( 324VOID MlmeDeauthReqAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
293 IN PRTMP_ADAPTER pAd,
294 IN MLME_QUEUE_ELEM *Elem)
295{ 325{
296 MLME_DEAUTH_REQ_STRUCT *pInfo; 326 MLME_DEAUTH_REQ_STRUCT *pInfo;
297 HEADER_802_11 DeauthHdr; 327 HEADER_802_11 DeauthHdr;
298 PUCHAR pOutBuffer = NULL; 328 PUCHAR pOutBuffer = NULL;
299 NDIS_STATUS NStatus; 329 NDIS_STATUS NStatus;
300 ULONG FrameLen = 0; 330 ULONG FrameLen = 0;
301 USHORT Status; 331 USHORT Status;
302 332
303 pInfo = (MLME_DEAUTH_REQ_STRUCT *)Elem->Msg; 333 pInfo = (MLME_DEAUTH_REQ_STRUCT *) Elem->Msg;
304 334
305 NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory 335 NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory
306 if (NStatus != NDIS_STATUS_SUCCESS) 336 if (NStatus != NDIS_STATUS_SUCCESS) {
307 { 337 DBGPRINT(RT_DEBUG_TRACE,
308 DBGPRINT(RT_DEBUG_TRACE, ("AUTH - MlmeDeauthReqAction() allocate memory fail\n")); 338 ("AUTH - MlmeDeauthReqAction() allocate memory fail\n"));
309 pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; 339 pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;
310 Status = MLME_FAIL_NO_RESOURCE; 340 Status = MLME_FAIL_NO_RESOURCE;
311 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_DEAUTH_CONF, 2, &Status); 341 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_DEAUTH_CONF, 2,
312 return; 342 &Status);
313 } 343 return;
314 344 }
315 DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Send DE-AUTH request (Reason=%d)...\n", pInfo->Reason)); 345
316 MgtMacHeaderInit(pAd, &DeauthHdr, SUBTYPE_DEAUTH, 0, pInfo->Addr, pAd->MlmeAux.Bssid); 346 DBGPRINT(RT_DEBUG_TRACE,
317 MakeOutgoingFrame(pOutBuffer, &FrameLen, 347 ("AUTH - Send DE-AUTH request (Reason=%d)...\n",
318 sizeof(HEADER_802_11),&DeauthHdr, 348 pInfo->Reason));
319 2, &pInfo->Reason, 349 MgtMacHeaderInit(pAd, &DeauthHdr, SUBTYPE_DEAUTH, 0, pInfo->Addr,
320 END_OF_ARGS); 350 pAd->MlmeAux.Bssid);
321 MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); 351 MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11),
352 &DeauthHdr, 2, &pInfo->Reason, END_OF_ARGS);
353 MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
322 MlmeFreeMemory(pAd, pOutBuffer); 354 MlmeFreeMemory(pAd, pOutBuffer);
323 355
324 pAd->StaCfg.DeauthReason = pInfo->Reason; 356 pAd->StaCfg.DeauthReason = pInfo->Reason;
325 COPY_MAC_ADDR(pAd->StaCfg.DeauthSta, pInfo->Addr); 357 COPY_MAC_ADDR(pAd->StaCfg.DeauthSta, pInfo->Addr);
326 pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; 358 pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;
327 Status = MLME_SUCCESS; 359 Status = MLME_SUCCESS;
328 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_DEAUTH_CONF, 2, &Status); 360 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_DEAUTH_CONF, 2, &Status);
329 361
330 // send wireless event - for deauthentication 362 // send wireless event - for deauthentication
331 if (pAd->CommonCfg.bWirelessEvent) 363 if (pAd->CommonCfg.bWirelessEvent)
332 RTMPSendWirelessEvent(pAd, IW_DEAUTH_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0); 364 RTMPSendWirelessEvent(pAd, IW_DEAUTH_EVENT_FLAG,
365 pAd->MacTab.Content[BSSID_WCID].Addr,
366 BSS0, 0);
333} 367}
334 368
335/* 369/*
@@ -340,15 +374,13 @@ VOID MlmeDeauthReqAction(
340 374
341 ========================================================================== 375 ==========================================================================
342 */ 376 */
343VOID AuthTimeoutAction( 377VOID AuthTimeoutAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
344 IN PRTMP_ADAPTER pAd,
345 IN MLME_QUEUE_ELEM *Elem)
346{ 378{
347 USHORT Status; 379 USHORT Status;
348 DBGPRINT(RT_DEBUG_TRACE, ("AUTH - AuthTimeoutAction\n")); 380 DBGPRINT(RT_DEBUG_TRACE, ("AUTH - AuthTimeoutAction\n"));
349 pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; 381 pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;
350 Status = MLME_REJ_TIMEOUT; 382 Status = MLME_REJ_TIMEOUT;
351 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status); 383 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status);
352} 384}
353 385
354/* 386/*
@@ -359,15 +391,15 @@ VOID AuthTimeoutAction(
359 391
360 ========================================================================== 392 ==========================================================================
361 */ 393 */
362VOID InvalidStateWhenAuth( 394VOID InvalidStateWhenAuth(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
363 IN PRTMP_ADAPTER pAd,
364 IN MLME_QUEUE_ELEM *Elem)
365{ 395{
366 USHORT Status; 396 USHORT Status;
367 DBGPRINT(RT_DEBUG_TRACE, ("AUTH - InvalidStateWhenAuth (state=%ld), reset AUTH state machine\n", pAd->Mlme.AuthMachine.CurrState)); 397 DBGPRINT(RT_DEBUG_TRACE,
368 pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; 398 ("AUTH - InvalidStateWhenAuth (state=%ld), reset AUTH state machine\n",
369 Status = MLME_STATE_MACHINE_REJECT; 399 pAd->Mlme.AuthMachine.CurrState));
370 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status); 400 pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;
401 Status = MLME_STATE_MACHINE_REJECT;
402 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status);
371} 403}
372 404
373/* 405/*
@@ -382,109 +414,104 @@ VOID InvalidStateWhenAuth(
382 414
383 ========================================================================== 415 ==========================================================================
384 */ 416 */
385VOID Cls2errAction( 417VOID Cls2errAction(IN PRTMP_ADAPTER pAd, IN PUCHAR pAddr)
386 IN PRTMP_ADAPTER pAd,
387 IN PUCHAR pAddr)
388{ 418{
389 HEADER_802_11 DeauthHdr; 419 HEADER_802_11 DeauthHdr;
390 PUCHAR pOutBuffer = NULL; 420 PUCHAR pOutBuffer = NULL;
391 NDIS_STATUS NStatus; 421 NDIS_STATUS NStatus;
392 ULONG FrameLen = 0; 422 ULONG FrameLen = 0;
393 USHORT Reason = REASON_CLS2ERR; 423 USHORT Reason = REASON_CLS2ERR;
394 424
395 NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory 425 NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory
396 if (NStatus != NDIS_STATUS_SUCCESS) 426 if (NStatus != NDIS_STATUS_SUCCESS)
397 return; 427 return;
398 428
399 DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Class 2 error, Send DEAUTH frame...\n")); 429 DBGPRINT(RT_DEBUG_TRACE,
400 MgtMacHeaderInit(pAd, &DeauthHdr, SUBTYPE_DEAUTH, 0, pAddr, pAd->MlmeAux.Bssid); 430 ("AUTH - Class 2 error, Send DEAUTH frame...\n"));
401 MakeOutgoingFrame(pOutBuffer, &FrameLen, 431 MgtMacHeaderInit(pAd, &DeauthHdr, SUBTYPE_DEAUTH, 0, pAddr,
402 sizeof(HEADER_802_11),&DeauthHdr, 432 pAd->MlmeAux.Bssid);
403 2, &Reason, 433 MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11),
404 END_OF_ARGS); 434 &DeauthHdr, 2, &Reason, END_OF_ARGS);
405 MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); 435 MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
406 MlmeFreeMemory(pAd, pOutBuffer); 436 MlmeFreeMemory(pAd, pOutBuffer);
407 437
408 pAd->StaCfg.DeauthReason = Reason; 438 pAd->StaCfg.DeauthReason = Reason;
409 COPY_MAC_ADDR(pAd->StaCfg.DeauthSta, pAddr); 439 COPY_MAC_ADDR(pAd->StaCfg.DeauthSta, pAddr);
410} 440}
411 441
412BOOLEAN AUTH_ReqSend( 442BOOLEAN AUTH_ReqSend(IN PRTMP_ADAPTER pAd,
413 IN PRTMP_ADAPTER pAd, 443 IN PMLME_QUEUE_ELEM pElem,
414 IN PMLME_QUEUE_ELEM pElem, 444 IN PRALINK_TIMER_STRUCT pAuthTimer,
415 IN PRALINK_TIMER_STRUCT pAuthTimer, 445 IN PSTRING pSMName,
416 IN PSTRING pSMName, 446 IN USHORT SeqNo,
417 IN USHORT SeqNo, 447 IN PUCHAR pNewElement, IN ULONG ElementLen)
418 IN PUCHAR pNewElement,
419 IN ULONG ElementLen)
420{ 448{
421 USHORT Alg, Seq, Status; 449 USHORT Alg, Seq, Status;
422 UCHAR Addr[6]; 450 UCHAR Addr[6];
423 ULONG Timeout; 451 ULONG Timeout;
424 HEADER_802_11 AuthHdr; 452 HEADER_802_11 AuthHdr;
425 BOOLEAN TimerCancelled; 453 BOOLEAN TimerCancelled;
426 NDIS_STATUS NStatus; 454 NDIS_STATUS NStatus;
427 PUCHAR pOutBuffer = NULL; 455 PUCHAR pOutBuffer = NULL;
428 ULONG FrameLen = 0, tmp = 0; 456 ULONG FrameLen = 0, tmp = 0;
429 457
430 // Block all authentication request durning WPA block period 458 // Block all authentication request durning WPA block period
431 if (pAd->StaCfg.bBlockAssoc == TRUE) 459 if (pAd->StaCfg.bBlockAssoc == TRUE) {
432 { 460 DBGPRINT(RT_DEBUG_TRACE,
433 DBGPRINT(RT_DEBUG_TRACE, ("%s - Block Auth request durning WPA block period!\n", pSMName)); 461 ("%s - Block Auth request durning WPA block period!\n",
434 pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; 462 pSMName));
435 Status = MLME_STATE_MACHINE_REJECT; 463 pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;
436 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status); 464 Status = MLME_STATE_MACHINE_REJECT;
437 } 465 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2,
438 else if(MlmeAuthReqSanity(pAd, pElem->Msg, pElem->MsgLen, Addr, &Timeout, &Alg)) 466 &Status);
439 { 467 } else
440 /* reset timer */ 468 if (MlmeAuthReqSanity
469 (pAd, pElem->Msg, pElem->MsgLen, Addr, &Timeout, &Alg)) {
470 /* reset timer */
441 RTMPCancelTimer(pAuthTimer, &TimerCancelled); 471 RTMPCancelTimer(pAuthTimer, &TimerCancelled);
442 472
443 COPY_MAC_ADDR(pAd->MlmeAux.Bssid, Addr); 473 COPY_MAC_ADDR(pAd->MlmeAux.Bssid, Addr);
444 pAd->MlmeAux.Alg = Alg; 474 pAd->MlmeAux.Alg = Alg;
445 Seq = SeqNo; 475 Seq = SeqNo;
446 Status = MLME_SUCCESS; 476 Status = MLME_SUCCESS;
447 477
448 NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory 478 NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory
449 if(NStatus != NDIS_STATUS_SUCCESS) 479 if (NStatus != NDIS_STATUS_SUCCESS) {
450 { 480 DBGPRINT(RT_DEBUG_TRACE,
451 DBGPRINT(RT_DEBUG_TRACE, ("%s - MlmeAuthReqAction(Alg:%d) allocate memory failed\n", pSMName, Alg)); 481 ("%s - MlmeAuthReqAction(Alg:%d) allocate memory failed\n",
452 pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; 482 pSMName, Alg));
453 Status = MLME_FAIL_NO_RESOURCE; 483 pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;
454 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status); 484 Status = MLME_FAIL_NO_RESOURCE;
455 return FALSE; 485 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF,
456 } 486 2, &Status);
457 487 return FALSE;
458 DBGPRINT(RT_DEBUG_TRACE, ("%s - Send AUTH request seq#1 (Alg=%d)...\n", pSMName, Alg)); 488 }
459 MgtMacHeaderInit(pAd, &AuthHdr, SUBTYPE_AUTH, 0, Addr, pAd->MlmeAux.Bssid); 489
460 MakeOutgoingFrame(pOutBuffer, &FrameLen, 490 DBGPRINT(RT_DEBUG_TRACE,
461 sizeof(HEADER_802_11),&AuthHdr, 491 ("%s - Send AUTH request seq#1 (Alg=%d)...\n", pSMName,
462 2, &Alg, 492 Alg));
463 2, &Seq, 493 MgtMacHeaderInit(pAd, &AuthHdr, SUBTYPE_AUTH, 0, Addr,
464 2, &Status, 494 pAd->MlmeAux.Bssid);
465 END_OF_ARGS); 495 MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11),
466 496 &AuthHdr, 2, &Alg, 2, &Seq, 2, &Status,
467 if (pNewElement && ElementLen)
468 {
469 MakeOutgoingFrame(pOutBuffer+FrameLen, &tmp,
470 ElementLen, pNewElement,
471 END_OF_ARGS); 497 END_OF_ARGS);
498
499 if (pNewElement && ElementLen) {
500 MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,
501 ElementLen, pNewElement, END_OF_ARGS);
472 FrameLen += tmp; 502 FrameLen += tmp;
473 } 503 }
474 504
475 MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); 505 MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
476 MlmeFreeMemory(pAd, pOutBuffer); 506 MlmeFreeMemory(pAd, pOutBuffer);
477 507
478 RTMPSetTimer(pAuthTimer, Timeout); 508 RTMPSetTimer(pAuthTimer, Timeout);
479 return TRUE; 509 return TRUE;
480 } 510 } else {
481 else 511 DBGPRINT_ERR(("%s - MlmeAuthReqAction() sanity check failed\n",
482 { 512 pSMName));
483 DBGPRINT_ERR(("%s - MlmeAuthReqAction() sanity check failed\n", pSMName));
484 return FALSE; 513 return FALSE;
485 } 514 }
486 515
487 return TRUE; 516 return TRUE;
488} 517}
489
490
diff --git a/drivers/staging/rt2860/sta/auth_rsp.c b/drivers/staging/rt2860/sta/auth_rsp.c
index 9c2fde479af..3f383c519bb 100644
--- a/drivers/staging/rt2860/sta/auth_rsp.c
+++ b/drivers/staging/rt2860/sta/auth_rsp.c
@@ -47,18 +47,21 @@
47 47
48 ========================================================================== 48 ==========================================================================
49 */ 49 */
50VOID AuthRspStateMachineInit( 50VOID AuthRspStateMachineInit(IN PRTMP_ADAPTER pAd,
51 IN PRTMP_ADAPTER pAd, 51 IN PSTATE_MACHINE Sm,
52 IN PSTATE_MACHINE Sm, 52 IN STATE_MACHINE_FUNC Trans[])
53 IN STATE_MACHINE_FUNC Trans[])
54{ 53{
55 StateMachineInit(Sm, Trans, MAX_AUTH_RSP_STATE, MAX_AUTH_RSP_MSG, (STATE_MACHINE_FUNC)Drop, AUTH_RSP_IDLE, AUTH_RSP_MACHINE_BASE); 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);
56 57
57 // column 1 58 // column 1
58 StateMachineSetAction(Sm, AUTH_RSP_IDLE, MT2_PEER_DEAUTH, (STATE_MACHINE_FUNC)PeerDeauthAction); 59 StateMachineSetAction(Sm, AUTH_RSP_IDLE, MT2_PEER_DEAUTH,
60 (STATE_MACHINE_FUNC) PeerDeauthAction);
59 61
60 // column 2 62 // column 2
61 StateMachineSetAction(Sm, AUTH_RSP_WAIT_CHAL, MT2_PEER_DEAUTH, (STATE_MACHINE_FUNC)PeerDeauthAction); 63 StateMachineSetAction(Sm, AUTH_RSP_WAIT_CHAL, MT2_PEER_DEAUTH,
64 (STATE_MACHINE_FUNC) PeerDeauthAction);
62 65
63} 66}
64 67
@@ -70,39 +73,32 @@ VOID AuthRspStateMachineInit(
70 73
71 ========================================================================== 74 ==========================================================================
72*/ 75*/
73VOID PeerAuthSimpleRspGenAndSend( 76VOID PeerAuthSimpleRspGenAndSend(IN PRTMP_ADAPTER pAd,
74 IN PRTMP_ADAPTER pAd, 77 IN PHEADER_802_11 pHdr80211,
75 IN PHEADER_802_11 pHdr80211, 78 IN USHORT Alg,
76 IN USHORT Alg, 79 IN USHORT Seq,
77 IN USHORT Seq, 80 IN USHORT Reason, IN USHORT Status)
78 IN USHORT Reason,
79 IN USHORT Status)
80{ 81{
81 HEADER_802_11 AuthHdr; 82 HEADER_802_11 AuthHdr;
82 ULONG FrameLen = 0; 83 ULONG FrameLen = 0;
83 PUCHAR pOutBuffer = NULL; 84 PUCHAR pOutBuffer = NULL;
84 NDIS_STATUS NStatus; 85 NDIS_STATUS NStatus;
85 86
86 if (Reason != MLME_SUCCESS) 87 if (Reason != MLME_SUCCESS) {
87 { 88 DBGPRINT(RT_DEBUG_TRACE, ("Peer AUTH fail...\n"));
88 DBGPRINT(RT_DEBUG_TRACE, ("Peer AUTH fail...\n")); 89 return;
89 return; 90 }
90 }
91
92 //Get an unused nonpaged memory 91 //Get an unused nonpaged memory
93 NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); 92 NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);
94 if (NStatus != NDIS_STATUS_SUCCESS) 93 if (NStatus != NDIS_STATUS_SUCCESS)
95 return; 94 return;
96 95
97 DBGPRINT(RT_DEBUG_TRACE, ("Send AUTH response (seq#2)...\n")); 96 DBGPRINT(RT_DEBUG_TRACE, ("Send AUTH response (seq#2)...\n"));
98 MgtMacHeaderInit(pAd, &AuthHdr, SUBTYPE_AUTH, 0, pHdr80211->Addr2, pAd->MlmeAux.Bssid); 97 MgtMacHeaderInit(pAd, &AuthHdr, SUBTYPE_AUTH, 0, pHdr80211->Addr2,
99 MakeOutgoingFrame(pOutBuffer, &FrameLen, 98 pAd->MlmeAux.Bssid);
100 sizeof(HEADER_802_11), &AuthHdr, 99 MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(HEADER_802_11),
101 2, &Alg, 100 &AuthHdr, 2, &Alg, 2, &Seq, 2, &Reason, END_OF_ARGS);
102 2, &Seq, 101 MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
103 2, &Reason,
104 END_OF_ARGS);
105 MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
106 MlmeFreeMemory(pAd, pOutBuffer); 102 MlmeFreeMemory(pAd, pOutBuffer);
107} 103}
108 104
@@ -114,35 +110,33 @@ VOID PeerAuthSimpleRspGenAndSend(
114 110
115 ========================================================================== 111 ==========================================================================
116*/ 112*/
117VOID PeerDeauthAction( 113VOID PeerDeauthAction(IN PRTMP_ADAPTER pAd, IN PMLME_QUEUE_ELEM Elem)
118 IN PRTMP_ADAPTER pAd,
119 IN PMLME_QUEUE_ELEM Elem)
120{ 114{
121 UCHAR Addr2[MAC_ADDR_LEN]; 115 UCHAR Addr2[MAC_ADDR_LEN];
122 USHORT Reason; 116 USHORT Reason;
123
124 if (PeerDeauthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Reason))
125 {
126 if (INFRA_ON(pAd)
127 && MAC_ADDR_EQUAL(Addr2, pAd->CommonCfg.Bssid)
128 )
129 {
130 DBGPRINT(RT_DEBUG_TRACE,("AUTH_RSP - receive DE-AUTH from our AP (Reason=%d)\n", Reason));
131 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));
132 125
133 RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, NULL, NULL, 0); 126 RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, NULL, NULL,
134 127 0);
135 128
136 // send wireless event - for deauthentication 129 // send wireless event - for deauthentication
137 if (pAd->CommonCfg.bWirelessEvent) 130 if (pAd->CommonCfg.bWirelessEvent)
138 RTMPSendWirelessEvent(pAd, IW_DEAUTH_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0); 131 RTMPSendWirelessEvent(pAd, IW_DEAUTH_EVENT_FLAG,
139 132 pAd->MacTab.
140 LinkDown(pAd, TRUE); 133 Content[BSSID_WCID].Addr,
141 } 134 BSS0, 0);
142 } 135
143 else 136 LinkDown(pAd, TRUE);
144 { 137 }
145 DBGPRINT(RT_DEBUG_TRACE,("AUTH_RSP - PeerDeauthAction() sanity check fail\n")); 138 } else {
146 } 139 DBGPRINT(RT_DEBUG_TRACE,
140 ("AUTH_RSP - PeerDeauthAction() sanity check fail\n"));
141 }
147} 142}
148
diff --git a/drivers/staging/rt2860/sta/connect.c b/drivers/staging/rt2860/sta/connect.c
index 43edd8e1f28..dc8b2d54a9f 100644
--- a/drivers/staging/rt2860/sta/connect.c
+++ b/drivers/staging/rt2860/sta/connect.c
@@ -36,27 +36,31 @@
36*/ 36*/
37#include "../rt_config.h" 37#include "../rt_config.h"
38 38
39UCHAR CipherSuiteWpaNoneTkip[] = { 39UCHAR CipherSuiteWpaNoneTkip[] = {
40 0x00, 0x50, 0xf2, 0x01, // oui 40 0x00, 0x50, 0xf2, 0x01, // oui
41 0x01, 0x00, // Version 41 0x01, 0x00, // Version
42 0x00, 0x50, 0xf2, 0x02, // Multicast 42 0x00, 0x50, 0xf2, 0x02, // Multicast
43 0x01, 0x00, // Number of unicast 43 0x01, 0x00, // Number of unicast
44 0x00, 0x50, 0xf2, 0x02, // unicast 44 0x00, 0x50, 0xf2, 0x02, // unicast
45 0x01, 0x00, // number of authentication method 45 0x01, 0x00, // number of authentication method
46 0x00, 0x50, 0xf2, 0x00 // authentication 46 0x00, 0x50, 0xf2, 0x00 // authentication
47 }; 47};
48UCHAR CipherSuiteWpaNoneTkipLen = (sizeof(CipherSuiteWpaNoneTkip) / sizeof(UCHAR)); 48
49 49UCHAR CipherSuiteWpaNoneTkipLen =
50UCHAR CipherSuiteWpaNoneAes[] = { 50 (sizeof(CipherSuiteWpaNoneTkip) / sizeof(UCHAR));
51 0x00, 0x50, 0xf2, 0x01, // oui 51
52 0x01, 0x00, // Version 52UCHAR CipherSuiteWpaNoneAes[] = {
53 0x00, 0x50, 0xf2, 0x04, // Multicast 53 0x00, 0x50, 0xf2, 0x01, // oui
54 0x01, 0x00, // Number of unicast 54 0x01, 0x00, // Version
55 0x00, 0x50, 0xf2, 0x04, // unicast 55 0x00, 0x50, 0xf2, 0x04, // Multicast
56 0x01, 0x00, // number of authentication method 56 0x01, 0x00, // Number of unicast
57 0x00, 0x50, 0xf2, 0x00 // authentication 57 0x00, 0x50, 0xf2, 0x04, // unicast
58 }; 58 0x01, 0x00, // number of authentication method
59UCHAR CipherSuiteWpaNoneAesLen = (sizeof(CipherSuiteWpaNoneAes) / sizeof(UCHAR)); 59 0x00, 0x50, 0xf2, 0x00 // authentication
60};
61
62UCHAR CipherSuiteWpaNoneAesLen =
63 (sizeof(CipherSuiteWpaNoneAes) / sizeof(UCHAR));
60 64
61// The following MACRO is called after 1. starting an new IBSS, 2. succesfully JOIN an IBSS, 65// The following MACRO is called after 1. starting an new IBSS, 2. succesfully JOIN an IBSS,
62// or 3. succesfully ASSOCIATE to a BSS, 4. successfully RE_ASSOCIATE to a BSS 66// or 3. succesfully ASSOCIATE to a BSS, 4. successfully RE_ASSOCIATE to a BSS
@@ -98,10 +102,8 @@ UCHAR CipherSuiteWpaNoneAesLen = (sizeof(CipherSuiteWpaNoneAes) / sizeof(UCHAR))
98 102
99 ========================================================================== 103 ==========================================================================
100*/ 104*/
101VOID MlmeCntlInit( 105VOID MlmeCntlInit(IN PRTMP_ADAPTER pAd,
102 IN PRTMP_ADAPTER pAd, 106 IN STATE_MACHINE * S, OUT STATE_MACHINE_FUNC Trans[])
103 IN STATE_MACHINE *S,
104 OUT STATE_MACHINE_FUNC Trans[])
105{ 107{
106 // Control state machine differs from other state machines, the interface 108 // Control state machine differs from other state machines, the interface
107 // follows the standard interface 109 // follows the standard interface
@@ -116,22 +118,20 @@ VOID MlmeCntlInit(
116 118
117 ========================================================================== 119 ==========================================================================
118*/ 120*/
119VOID MlmeCntlMachinePerformAction( 121VOID MlmeCntlMachinePerformAction(IN PRTMP_ADAPTER pAd,
120 IN PRTMP_ADAPTER pAd, 122 IN STATE_MACHINE * S,
121 IN STATE_MACHINE *S, 123 IN MLME_QUEUE_ELEM * Elem)
122 IN MLME_QUEUE_ELEM *Elem)
123{ 124{
124 switch(pAd->Mlme.CntlMachine.CurrState) 125 switch (pAd->Mlme.CntlMachine.CurrState) {
125 { 126 case CNTL_IDLE:
126 case CNTL_IDLE: 127 CntlIdleProc(pAd, Elem);
127 CntlIdleProc(pAd, Elem); 128 break;
128 break; 129 case CNTL_WAIT_DISASSOC:
129 case CNTL_WAIT_DISASSOC: 130 CntlWaitDisassocProc(pAd, Elem);
130 CntlWaitDisassocProc(pAd, Elem); 131 break;
131 break; 132 case CNTL_WAIT_JOIN:
132 case CNTL_WAIT_JOIN: 133 CntlWaitJoinProc(pAd, Elem);
133 CntlWaitJoinProc(pAd, Elem); 134 break;
134 break;
135 135
136 // CNTL_WAIT_REASSOC is the only state in CNTL machine that does 136 // CNTL_WAIT_REASSOC is the only state in CNTL machine that does
137 // not triggered directly or indirectly by "RTMPSetInformation(OID_xxx)". 137 // not triggered directly or indirectly by "RTMPSetInformation(OID_xxx)".
@@ -139,89 +139,87 @@ VOID MlmeCntlMachinePerformAction(
139 // rule. Which means NDIS may SET OID in the middle of ROAMing attempts. 139 // rule. Which means NDIS may SET OID in the middle of ROAMing attempts.
140 // Current approach is to block new SET request at RTMPSetInformation() 140 // Current approach is to block new SET request at RTMPSetInformation()
141 // when CntlMachine.CurrState is not CNTL_IDLE 141 // when CntlMachine.CurrState is not CNTL_IDLE
142 case CNTL_WAIT_REASSOC: 142 case CNTL_WAIT_REASSOC:
143 CntlWaitReassocProc(pAd, Elem); 143 CntlWaitReassocProc(pAd, Elem);
144 break; 144 break;
145 145
146 case CNTL_WAIT_START: 146 case CNTL_WAIT_START:
147 CntlWaitStartProc(pAd, Elem); 147 CntlWaitStartProc(pAd, Elem);
148 break; 148 break;
149 case CNTL_WAIT_AUTH: 149 case CNTL_WAIT_AUTH:
150 CntlWaitAuthProc(pAd, Elem); 150 CntlWaitAuthProc(pAd, Elem);
151 break; 151 break;
152 case CNTL_WAIT_AUTH2: 152 case CNTL_WAIT_AUTH2:
153 CntlWaitAuthProc2(pAd, Elem); 153 CntlWaitAuthProc2(pAd, Elem);
154 break; 154 break;
155 case CNTL_WAIT_ASSOC: 155 case CNTL_WAIT_ASSOC:
156 CntlWaitAssocProc(pAd, Elem); 156 CntlWaitAssocProc(pAd, Elem);
157 break; 157 break;
158
159 case CNTL_WAIT_OID_LIST_SCAN:
160 if (Elem->MsgType == MT2_SCAN_CONF) {
161 // Resume TxRing after SCANING complete. We hope the out-of-service time
162 // won't be too long to let upper layer time-out the waiting frames
163 RTMPResumeMsduTransmission(pAd);
158 164
159 case CNTL_WAIT_OID_LIST_SCAN: 165 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
160 if(Elem->MsgType == MT2_SCAN_CONF)
161 {
162 // Resume TxRing after SCANING complete. We hope the out-of-service time
163 // won't be too long to let upper layer time-out the waiting frames
164 RTMPResumeMsduTransmission(pAd);
165
166 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
167 166
168 // 167 //
169 // Set LED status to previous status. 168 // Set LED status to previous status.
170 // 169 //
171 if (pAd->bLedOnScanning) 170 if (pAd->bLedOnScanning) {
172 { 171 pAd->bLedOnScanning = FALSE;
173 pAd->bLedOnScanning = FALSE; 172 RTMPSetLED(pAd, pAd->LedStatus);
174 RTMPSetLED(pAd, pAd->LedStatus);
175 }
176 } 173 }
177 break; 174 }
175 break;
178 176
179 case CNTL_WAIT_OID_DISASSOC: 177 case CNTL_WAIT_OID_DISASSOC:
180 if (Elem->MsgType == MT2_DISASSOC_CONF) 178 if (Elem->MsgType == MT2_DISASSOC_CONF) {
181 { 179 LinkDown(pAd, FALSE);
182 LinkDown(pAd, FALSE); 180 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
183 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; 181 }
184 } 182 break;
185 break;
186#ifdef RTMP_MAC_USB 183#ifdef RTMP_MAC_USB
187 // 184 //
188 // This state is for that we want to connect to an AP but 185 // This state is for that we want to connect to an AP but
189 // it didn't find on BSS List table. So we need to scan the air first, 186 // it didn't find on BSS List table. So we need to scan the air first,
190 // after that we can try to connect to the desired AP if available. 187 // after that we can try to connect to the desired AP if available.
191 // 188 //
192 case CNTL_WAIT_SCAN_FOR_CONNECT: 189 case CNTL_WAIT_SCAN_FOR_CONNECT:
193 if(Elem->MsgType == MT2_SCAN_CONF) 190 if (Elem->MsgType == MT2_SCAN_CONF) {
194 { 191 // Resume TxRing after SCANING complete. We hope the out-of-service time
195 // Resume TxRing after SCANING complete. We hope the out-of-service time 192 // won't be too long to let upper layer time-out the waiting frames
196 // won't be too long to let upper layer time-out the waiting frames 193 RTMPResumeMsduTransmission(pAd);
197 RTMPResumeMsduTransmission(pAd);
198#ifdef CCX_SUPPORT 194#ifdef CCX_SUPPORT
199 if (pAd->StaCfg.CCXReqType != MSRN_TYPE_UNUSED) 195 if (pAd->StaCfg.CCXReqType != MSRN_TYPE_UNUSED) {
200 { 196 // Cisco scan request is finished, prepare beacon report
201 // Cisco scan request is finished, prepare beacon report 197 MlmeEnqueue(pAd, AIRONET_STATE_MACHINE,
202 MlmeEnqueue(pAd, AIRONET_STATE_MACHINE, MT2_AIRONET_SCAN_DONE, 0, NULL); 198 MT2_AIRONET_SCAN_DONE, 0, NULL);
203 } 199 }
204#endif // CCX_SUPPORT // 200#endif // CCX_SUPPORT //
205 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; 201 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
206 202
207 // 203 //
208 // Check if we can connect to. 204 // Check if we can connect to.
209 // 205 //
210 BssTableSsidSort(pAd, &pAd->MlmeAux.SsidBssTab, (CHAR *) pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen); 206 BssTableSsidSort(pAd, &pAd->MlmeAux.SsidBssTab,
211 if (pAd->MlmeAux.SsidBssTab.BssNr > 0) 207 (CHAR *) pAd->MlmeAux.
212 { 208 AutoReconnectSsid,
213 MlmeAutoReconnectLastSSID(pAd); 209 pAd->MlmeAux.AutoReconnectSsidLen);
214 } 210 if (pAd->MlmeAux.SsidBssTab.BssNr > 0) {
211 MlmeAutoReconnectLastSSID(pAd);
215 } 212 }
216 break; 213 }
214 break;
217#endif // RTMP_MAC_USB // 215#endif // RTMP_MAC_USB //
218 default: 216 default:
219 DBGPRINT_ERR(("!ERROR! CNTL - Illegal message type(=%ld)", Elem->MsgType)); 217 DBGPRINT_ERR(("!ERROR! CNTL - Illegal message type(=%ld)",
220 break; 218 Elem->MsgType));
219 break;
221 } 220 }
222} 221}
223 222
224
225/* 223/*
226 ========================================================================== 224 ==========================================================================
227 Description: 225 Description:
@@ -230,94 +228,95 @@ VOID MlmeCntlMachinePerformAction(
230 228
231 ========================================================================== 229 ==========================================================================
232*/ 230*/
233VOID CntlIdleProc( 231VOID CntlIdleProc(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
234 IN PRTMP_ADAPTER pAd,
235 IN MLME_QUEUE_ELEM *Elem)
236{ 232{
237 MLME_DISASSOC_REQ_STRUCT DisassocReq; 233 MLME_DISASSOC_REQ_STRUCT DisassocReq;
238 234
239 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)) 235 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))
240 return; 236 return;
241 237
242 switch(Elem->MsgType) 238 switch (Elem->MsgType) {
243 { 239 case OID_802_11_SSID:
244 case OID_802_11_SSID: 240 CntlOidSsidProc(pAd, Elem);
245 CntlOidSsidProc(pAd, Elem); 241 break;
246 break;
247 242
248 case OID_802_11_BSSID: 243 case OID_802_11_BSSID:
249 CntlOidRTBssidProc(pAd,Elem); 244 CntlOidRTBssidProc(pAd, Elem);
250 break; 245 break;
251 246
252 case OID_802_11_BSSID_LIST_SCAN: 247 case OID_802_11_BSSID_LIST_SCAN:
253 CntlOidScanProc(pAd,Elem); 248 CntlOidScanProc(pAd, Elem);
254 break; 249 break;
255 250
256 case OID_802_11_DISASSOCIATE: 251 case OID_802_11_DISASSOCIATE:
257 DisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid, REASON_DISASSOC_STA_LEAVING); 252 DisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid,
258 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ, sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq); 253 REASON_DISASSOC_STA_LEAVING);
259 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_DISASSOC; 254 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ,
260 255 sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq);
261 if (pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_ENABLE_WITH_WEB_UI) 256 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_DISASSOC;
262 { 257
263 // Set the AutoReconnectSsid to prevent it reconnect to old SSID 258 if (pAd->StaCfg.WpaSupplicantUP !=
264 // Since calling this indicate user don't want to connect to that SSID anymore. 259 WPA_SUPPLICANT_ENABLE_WITH_WEB_UI) {
265 pAd->MlmeAux.AutoReconnectSsidLen= 32; 260 // Set the AutoReconnectSsid to prevent it reconnect to old SSID
266 NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen); 261 // Since calling this indicate user don't want to connect to that SSID anymore.
267 } 262 pAd->MlmeAux.AutoReconnectSsidLen = 32;
268 break; 263 NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid,
264 pAd->MlmeAux.AutoReconnectSsidLen);
265 }
266 break;
269 267
270 case MT2_MLME_ROAMING_REQ: 268 case MT2_MLME_ROAMING_REQ:
271 CntlMlmeRoamingProc(pAd, Elem); 269 CntlMlmeRoamingProc(pAd, Elem);
272 break; 270 break;
273 271
274 case OID_802_11_MIC_FAILURE_REPORT_FRAME: 272 case OID_802_11_MIC_FAILURE_REPORT_FRAME:
275 WpaMicFailureReportFrame(pAd, Elem); 273 WpaMicFailureReportFrame(pAd, Elem);
276 break; 274 break;
277 275
278 default: 276 default:
279 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Illegal message in CntlIdleProc(MsgType=%ld)\n",Elem->MsgType)); 277 DBGPRINT(RT_DEBUG_TRACE,
280 break; 278 ("CNTL - Illegal message in CntlIdleProc(MsgType=%ld)\n",
279 Elem->MsgType));
280 break;
281 } 281 }
282} 282}
283 283
284VOID CntlOidScanProc( 284VOID CntlOidScanProc(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
285 IN PRTMP_ADAPTER pAd,
286 IN MLME_QUEUE_ELEM *Elem)
287{ 285{
288 MLME_SCAN_REQ_STRUCT ScanReq; 286 MLME_SCAN_REQ_STRUCT ScanReq;
289 ULONG BssIdx = BSS_NOT_FOUND; 287 ULONG BssIdx = BSS_NOT_FOUND;
290 BSS_ENTRY CurrBss; 288 BSS_ENTRY CurrBss;
291
292
293 289
294 // record current BSS if network is connected. 290 // record current BSS if network is connected.
295 // 2003-2-13 do not include current IBSS if this is the only STA in this IBSS. 291 // 2003-2-13 do not include current IBSS if this is the only STA in this IBSS.
296 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) 292 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) {
297 { 293 BssIdx =
298 BssIdx = BssSsidTableSearch(&pAd->ScanTab, pAd->CommonCfg.Bssid, (PUCHAR)pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen, pAd->CommonCfg.Channel); 294 BssSsidTableSearch(&pAd->ScanTab, pAd->CommonCfg.Bssid,
299 if (BssIdx != BSS_NOT_FOUND) 295 (PUCHAR) pAd->CommonCfg.Ssid,
300 { 296 pAd->CommonCfg.SsidLen,
301 NdisMoveMemory(&CurrBss, &pAd->ScanTab.BssEntry[BssIdx], sizeof(BSS_ENTRY)); 297 pAd->CommonCfg.Channel);
298 if (BssIdx != BSS_NOT_FOUND) {
299 NdisMoveMemory(&CurrBss, &pAd->ScanTab.BssEntry[BssIdx],
300 sizeof(BSS_ENTRY));
302 } 301 }
303 } 302 }
304
305 // clean up previous SCAN result, add current BSS back to table if any 303 // clean up previous SCAN result, add current BSS back to table if any
306 BssTableInit(&pAd->ScanTab); 304 BssTableInit(&pAd->ScanTab);
307 if (BssIdx != BSS_NOT_FOUND) 305 if (BssIdx != BSS_NOT_FOUND) {
308 {
309 // DDK Note: If the NIC is associated with a particular BSSID and SSID 306 // DDK Note: If the NIC is associated with a particular BSSID and SSID
310 // that are not contained in the list of BSSIDs generated by this scan, the 307 // that are not contained in the list of BSSIDs generated by this scan, the
311 // BSSID description of the currently associated BSSID and SSID should be 308 // BSSID description of the currently associated BSSID and SSID should be
312 // appended to the list of BSSIDs in the NIC's database. 309 // appended to the list of BSSIDs in the NIC's database.
313 // To ensure this, we append this BSS as the first entry in SCAN result 310 // To ensure this, we append this BSS as the first entry in SCAN result
314 NdisMoveMemory(&pAd->ScanTab.BssEntry[0], &CurrBss, sizeof(BSS_ENTRY)); 311 NdisMoveMemory(&pAd->ScanTab.BssEntry[0], &CurrBss,
312 sizeof(BSS_ENTRY));
315 pAd->ScanTab.BssNr = 1; 313 pAd->ScanTab.BssNr = 1;
316 } 314 }
317 315
318 ScanParmFill(pAd, &ScanReq, (PSTRING) Elem->Msg, Elem->MsgLen, BSS_ANY, SCAN_ACTIVE); 316 ScanParmFill(pAd, &ScanReq, (PSTRING) Elem->Msg, Elem->MsgLen, BSS_ANY,
317 SCAN_ACTIVE);
319 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ, 318 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ,
320 sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq); 319 sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq);
321 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN; 320 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN;
322} 321}
323 322
@@ -330,19 +329,16 @@ VOID CntlOidScanProc(
330 329
331 ========================================================================== 330 ==========================================================================
332*/ 331*/
333VOID CntlOidSsidProc( 332VOID CntlOidSsidProc(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
334 IN PRTMP_ADAPTER pAd,
335 IN MLME_QUEUE_ELEM * Elem)
336{ 333{
337 PNDIS_802_11_SSID pOidSsid = (NDIS_802_11_SSID *)Elem->Msg; 334 PNDIS_802_11_SSID pOidSsid = (NDIS_802_11_SSID *) Elem->Msg;
338 MLME_DISASSOC_REQ_STRUCT DisassocReq; 335 MLME_DISASSOC_REQ_STRUCT DisassocReq;
339 ULONG Now; 336 ULONG Now;
340
341 337
342 // Step 1. record the desired user settings to MlmeAux 338 // Step 1. record the desired user settings to MlmeAux
343 NdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID); 339 NdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID);
344 NdisMoveMemory(pAd->MlmeAux.Ssid, pOidSsid->Ssid, pOidSsid->SsidLength); 340 NdisMoveMemory(pAd->MlmeAux.Ssid, pOidSsid->Ssid, pOidSsid->SsidLength);
345 pAd->MlmeAux.SsidLen = (UCHAR)pOidSsid->SsidLength; 341 pAd->MlmeAux.SsidLen = (UCHAR) pOidSsid->SsidLength;
346 NdisZeroMemory(pAd->MlmeAux.Bssid, MAC_ADDR_LEN); 342 NdisZeroMemory(pAd->MlmeAux.Bssid, MAC_ADDR_LEN);
347 pAd->MlmeAux.BssType = pAd->StaCfg.BssType; 343 pAd->MlmeAux.BssType = pAd->StaCfg.BssType;
348 344
@@ -352,83 +348,97 @@ VOID CntlOidSsidProc(
352 // Update Reconnect Ssid, that user desired to connect. 348 // Update Reconnect Ssid, that user desired to connect.
353 // 349 //
354 NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, MAX_LEN_OF_SSID); 350 NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, MAX_LEN_OF_SSID);
355 NdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen); 351 NdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.Ssid,
352 pAd->MlmeAux.SsidLen);
356 pAd->MlmeAux.AutoReconnectSsidLen = pAd->MlmeAux.SsidLen; 353 pAd->MlmeAux.AutoReconnectSsidLen = pAd->MlmeAux.SsidLen;
357 354
358 // step 2. find all matching BSS in the lastest SCAN result (inBssTab) 355 // step 2. find all matching BSS in the lastest SCAN result (inBssTab)
359 // & log them into MlmeAux.SsidBssTab for later-on iteration. Sort by RSSI order 356 // & log them into MlmeAux.SsidBssTab for later-on iteration. Sort by RSSI order
360 BssTableSsidSort(pAd, &pAd->MlmeAux.SsidBssTab, (PCHAR)pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen); 357 BssTableSsidSort(pAd, &pAd->MlmeAux.SsidBssTab,
358 (PCHAR) pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen);
361 359
362 DBGPRINT(RT_DEBUG_TRACE, ("CntlOidSsidProc():CNTL - %d BSS of %d BSS match the desire (%d)SSID - %s\n", 360 DBGPRINT(RT_DEBUG_TRACE,
363 pAd->MlmeAux.SsidBssTab.BssNr, pAd->ScanTab.BssNr, pAd->MlmeAux.SsidLen, pAd->MlmeAux.Ssid)); 361 ("CntlOidSsidProc():CNTL - %d BSS of %d BSS match the desire (%d)SSID - %s\n",
362 pAd->MlmeAux.SsidBssTab.BssNr, pAd->ScanTab.BssNr,
363 pAd->MlmeAux.SsidLen, pAd->MlmeAux.Ssid));
364 NdisGetSystemUpTime(&Now); 364 NdisGetSystemUpTime(&Now);
365 365
366 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && 366 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) &&
367 (pAd->CommonCfg.SsidLen == pAd->MlmeAux.SsidBssTab.BssEntry[0].SsidLen) && 367 (pAd->CommonCfg.SsidLen ==
368 NdisEqualMemory(pAd->CommonCfg.Ssid, pAd->MlmeAux.SsidBssTab.BssEntry[0].Ssid, pAd->CommonCfg.SsidLen) && 368 pAd->MlmeAux.SsidBssTab.BssEntry[0].SsidLen)
369 MAC_ADDR_EQUAL(pAd->CommonCfg.Bssid, pAd->MlmeAux.SsidBssTab.BssEntry[0].Bssid)) 369 && NdisEqualMemory(pAd->CommonCfg.Ssid,
370 { 370 pAd->MlmeAux.SsidBssTab.BssEntry[0].Ssid,
371 pAd->CommonCfg.SsidLen)
372 && MAC_ADDR_EQUAL(pAd->CommonCfg.Bssid,
373 pAd->MlmeAux.SsidBssTab.BssEntry[0].Bssid)) {
371 // Case 1. already connected with an AP who has the desired SSID 374 // Case 1. already connected with an AP who has the desired SSID
372 // with highest RSSI 375 // with highest RSSI
373 376
374 // Add checking Mode "LEAP" for CCX 1.0 377 // Add checking Mode "LEAP" for CCX 1.0
375 if (((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || 378 if (((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) ||
376 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) || 379 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
377 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) || 380 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) ||
378 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) 381 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)
379 ) && 382 ) &&
380 (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED)) 383 (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED)) {
381 {
382 // case 1.1 For WPA, WPA-PSK, if the 1x port is not secured, we have to redo 384 // case 1.1 For WPA, WPA-PSK, if the 1x port is not secured, we have to redo
383 // connection process 385 // connection process
384 DBGPRINT(RT_DEBUG_TRACE, ("CntlOidSsidProc():CNTL - disassociate with current AP...\n")); 386 DBGPRINT(RT_DEBUG_TRACE,
385 DisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid, REASON_DISASSOC_STA_LEAVING); 387 ("CntlOidSsidProc():CNTL - disassociate with current AP...\n"));
386 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ, 388 DisassocParmFill(pAd, &DisassocReq,
387 sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq); 389 pAd->CommonCfg.Bssid,
390 REASON_DISASSOC_STA_LEAVING);
391 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE,
392 MT2_MLME_DISASSOC_REQ,
393 sizeof(MLME_DISASSOC_REQ_STRUCT),
394 &DisassocReq);
388 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC; 395 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC;
389 } 396 } else if (pAd->bConfigChanged == TRUE) {
390 else if (pAd->bConfigChanged == TRUE)
391 {
392 // case 1.2 Important Config has changed, we have to reconnect to the same AP 397 // case 1.2 Important Config has changed, we have to reconnect to the same AP
393 DBGPRINT(RT_DEBUG_TRACE, ("CntlOidSsidProc():CNTL - disassociate with current AP Because config changed...\n")); 398 DBGPRINT(RT_DEBUG_TRACE,
394 DisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid, REASON_DISASSOC_STA_LEAVING); 399 ("CntlOidSsidProc():CNTL - disassociate with current AP Because config changed...\n"));
395 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ, 400 DisassocParmFill(pAd, &DisassocReq,
396 sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq); 401 pAd->CommonCfg.Bssid,
402 REASON_DISASSOC_STA_LEAVING);
403 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE,
404 MT2_MLME_DISASSOC_REQ,
405 sizeof(MLME_DISASSOC_REQ_STRUCT),
406 &DisassocReq);
397 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC; 407 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC;
398 } 408 } else {
399 else
400 {
401 // case 1.3. already connected to the SSID with highest RSSI. 409 // case 1.3. already connected to the SSID with highest RSSI.
402 DBGPRINT(RT_DEBUG_TRACE, ("CntlOidSsidProc():CNTL - already with this BSSID. ignore this SET_SSID request\n")); 410 DBGPRINT(RT_DEBUG_TRACE,
411 ("CntlOidSsidProc():CNTL - already with this BSSID. ignore this SET_SSID request\n"));
403 // 412 //
404 // (HCT 12.1) 1c_wlan_mediaevents required 413 // (HCT 12.1) 1c_wlan_mediaevents required
405 // media connect events are indicated when associating with the same AP 414 // media connect events are indicated when associating with the same AP
406 // 415 //
407 if (INFRA_ON(pAd)) 416 if (INFRA_ON(pAd)) {
408 {
409 // 417 //
410 // Since MediaState already is NdisMediaStateConnected 418 // Since MediaState already is NdisMediaStateConnected
411 // We just indicate the connect event again to meet the WHQL required. 419 // We just indicate the connect event again to meet the WHQL required.
412 // 420 //
413 pAd->IndicateMediaState = NdisMediaStateConnected; 421 pAd->IndicateMediaState =
422 NdisMediaStateConnected;
414 RTMP_IndicateMediaState(pAd); 423 RTMP_IndicateMediaState(pAd);
415 pAd->ExtraInfo = GENERAL_LINK_UP; // Update extra information to link is up 424 pAd->ExtraInfo = GENERAL_LINK_UP; // Update extra information to link is up
416 } 425 }
417 426
418 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; 427 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
419 RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, &pAd->MlmeAux.Bssid[0], NULL, 0); 428 RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1,
429 &pAd->MlmeAux.Bssid[0], NULL,
430 0);
420 } 431 }
421 } 432 } else if (INFRA_ON(pAd)) {
422 else if (INFRA_ON(pAd))
423 {
424 // 433 //
425 // For RT61 434 // For RT61
426 // [88888] OID_802_11_SSID should have returned NDTEST_WEP_AP2(Returned: ) 435 // [88888] OID_802_11_SSID should have returned NDTEST_WEP_AP2(Returned: )
427 // RT61 may lost SSID, and not connect to NDTEST_WEP_AP2 and will connect to NDTEST_WEP_AP2 by Autoreconnect 436 // RT61 may lost SSID, and not connect to NDTEST_WEP_AP2 and will connect to NDTEST_WEP_AP2 by Autoreconnect
428 // But media status is connected, so the SSID not report correctly. 437 // But media status is connected, so the SSID not report correctly.
429 // 438 //
430 if (!SSID_EQUAL(pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen, pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen)) 439 if (!SSID_EQUAL
431 { 440 (pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen,
441 pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen)) {
432 // 442 //
433 // Different SSID means not Roaming case, so we let LinkDown() to Indicate a disconnect event. 443 // Different SSID means not Roaming case, so we let LinkDown() to Indicate a disconnect event.
434 // 444 //
@@ -440,49 +450,53 @@ VOID CntlOidSsidProc(
440 // disassociate with the current associated AP, 450 // disassociate with the current associated AP,
441 // then perform a new association with this new SSID, no matter the 451 // then perform a new association with this new SSID, no matter the
442 // new/old SSID are the same or not. 452 // new/old SSID are the same or not.
443 DBGPRINT(RT_DEBUG_TRACE, ("CntlOidSsidProc():CNTL - disassociate with current AP...\n")); 453 DBGPRINT(RT_DEBUG_TRACE,
444 DisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid, REASON_DISASSOC_STA_LEAVING); 454 ("CntlOidSsidProc():CNTL - disassociate with current AP...\n"));
455 DisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid,
456 REASON_DISASSOC_STA_LEAVING);
445 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ, 457 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ,
446 sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq); 458 sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq);
447 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC; 459 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC;
448 } 460 } else {
449 else 461 if (ADHOC_ON(pAd)) {
450 { 462 DBGPRINT(RT_DEBUG_TRACE,
451 if (ADHOC_ON(pAd)) 463 ("CntlOidSsidProc():CNTL - drop current ADHOC\n"));
452 {
453 DBGPRINT(RT_DEBUG_TRACE, ("CntlOidSsidProc():CNTL - drop current ADHOC\n"));
454 LinkDown(pAd, FALSE); 464 LinkDown(pAd, FALSE);
455 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); 465 OPSTATUS_CLEAR_FLAG(pAd,
466 fOP_STATUS_MEDIA_STATE_CONNECTED);
456 pAd->IndicateMediaState = NdisMediaStateDisconnected; 467 pAd->IndicateMediaState = NdisMediaStateDisconnected;
457 RTMP_IndicateMediaState(pAd); 468 RTMP_IndicateMediaState(pAd);
458 pAd->ExtraInfo = GENERAL_LINK_DOWN; 469 pAd->ExtraInfo = GENERAL_LINK_DOWN;
459 DBGPRINT(RT_DEBUG_TRACE, ("CntlOidSsidProc():NDIS_STATUS_MEDIA_DISCONNECT Event C!\n")); 470 DBGPRINT(RT_DEBUG_TRACE,
471 ("CntlOidSsidProc():NDIS_STATUS_MEDIA_DISCONNECT Event C!\n"));
460 } 472 }
461 473
462 if ((pAd->MlmeAux.SsidBssTab.BssNr == 0) && 474 if ((pAd->MlmeAux.SsidBssTab.BssNr == 0) &&
463 (pAd->StaCfg.bAutoReconnect == TRUE) && 475 (pAd->StaCfg.bAutoReconnect == TRUE) &&
464 (pAd->MlmeAux.BssType == BSS_INFRA) && 476 (pAd->MlmeAux.BssType == BSS_INFRA) &&
465 (MlmeValidateSSID(pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen) == TRUE) 477 (MlmeValidateSSID(pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen)
466 ) 478 == TRUE)
467 { 479 ) {
468 MLME_SCAN_REQ_STRUCT ScanReq; 480 MLME_SCAN_REQ_STRUCT ScanReq;
469 481
470 DBGPRINT(RT_DEBUG_TRACE, ("CntlOidSsidProc():CNTL - No matching BSS, start a new scan\n")); 482 DBGPRINT(RT_DEBUG_TRACE,
471 ScanParmFill(pAd, &ScanReq, (PSTRING) pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen, BSS_ANY, SCAN_ACTIVE); 483 ("CntlOidSsidProc():CNTL - No matching BSS, start a new scan\n"));
472 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ, sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq); 484 ScanParmFill(pAd, &ScanReq, (PSTRING) pAd->MlmeAux.Ssid,
473 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN; 485 pAd->MlmeAux.SsidLen, BSS_ANY,
486 SCAN_ACTIVE);
487 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ,
488 sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq);
489 pAd->Mlme.CntlMachine.CurrState =
490 CNTL_WAIT_OID_LIST_SCAN;
474 // Reset Missed scan number 491 // Reset Missed scan number
475 pAd->StaCfg.LastScanTime = Now; 492 pAd->StaCfg.LastScanTime = Now;
476 } 493 } else {
477 else
478 {
479 pAd->MlmeAux.BssIdx = 0; 494 pAd->MlmeAux.BssIdx = 0;
480 IterateOnBssTab(pAd); 495 IterateOnBssTab(pAd);
481 } 496 }
482 } 497 }
483} 498}
484 499
485
486/* 500/*
487 ========================================================================== 501 ==========================================================================
488 Description: 502 Description:
@@ -491,14 +505,12 @@ VOID CntlOidSsidProc(
491 505
492 ========================================================================== 506 ==========================================================================
493*/ 507*/
494VOID CntlOidRTBssidProc( 508VOID CntlOidRTBssidProc(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
495 IN PRTMP_ADAPTER pAd,
496 IN MLME_QUEUE_ELEM * Elem)
497{ 509{
498 ULONG BssIdx; 510 ULONG BssIdx;
499 PUCHAR pOidBssid = (PUCHAR)Elem->Msg; 511 PUCHAR pOidBssid = (PUCHAR) Elem->Msg;
500 MLME_DISASSOC_REQ_STRUCT DisassocReq; 512 MLME_DISASSOC_REQ_STRUCT DisassocReq;
501 MLME_JOIN_REQ_STRUCT JoinReq; 513 MLME_JOIN_REQ_STRUCT JoinReq;
502 514
503 // record user desired settings 515 // record user desired settings
504 COPY_MAC_ADDR(pAd->MlmeAux.Bssid, pOidBssid); 516 COPY_MAC_ADDR(pAd->MlmeAux.Bssid, pOidBssid);
@@ -506,110 +518,149 @@ VOID CntlOidRTBssidProc(
506 518
507 // find the desired BSS in the latest SCAN result table 519 // find the desired BSS in the latest SCAN result table
508 BssIdx = BssTableSearch(&pAd->ScanTab, pOidBssid, pAd->MlmeAux.Channel); 520 BssIdx = BssTableSearch(&pAd->ScanTab, pOidBssid, pAd->MlmeAux.Channel);
509 if (BssIdx == BSS_NOT_FOUND) 521 if (BssIdx == BSS_NOT_FOUND) {
510 { 522 MLME_SCAN_REQ_STRUCT ScanReq;
511 MLME_SCAN_REQ_STRUCT ScanReq;
512 523
513 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - BSSID not found. reply NDIS_STATUS_NOT_ACCEPTED\n")); 524 DBGPRINT(RT_DEBUG_TRACE,
525 ("CNTL - BSSID not found. reply NDIS_STATUS_NOT_ACCEPTED\n"));
514 //pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; 526 //pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
515 527
516 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - BSSID not found. start a new scan\n")); 528 DBGPRINT(RT_DEBUG_TRACE,
517 ScanParmFill(pAd, &ScanReq, (PSTRING) pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen, BSS_ANY, SCAN_ACTIVE); 529 ("CNTL - BSSID not found. start a new scan\n"));
518 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ, sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq); 530 ScanParmFill(pAd, &ScanReq, (PSTRING) pAd->MlmeAux.Ssid,
531 pAd->MlmeAux.SsidLen, BSS_ANY, SCAN_ACTIVE);
532 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ,
533 sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq);
519 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN; 534 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN;
520 // Reset Missed scan number 535 // Reset Missed scan number
521 NdisGetSystemUpTime(&pAd->StaCfg.LastScanTime); 536 NdisGetSystemUpTime(&pAd->StaCfg.LastScanTime);
522 return; 537 return;
523 } 538 }
524
525 // 539 //
526 // Update Reconnect Ssid, that user desired to connect. 540 // Update Reconnect Ssid, that user desired to connect.
527 // 541 //
528 NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, MAX_LEN_OF_SSID); 542 NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, MAX_LEN_OF_SSID);
529 pAd->MlmeAux.AutoReconnectSsidLen = pAd->ScanTab.BssEntry[BssIdx].SsidLen; 543 pAd->MlmeAux.AutoReconnectSsidLen =
530 NdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->ScanTab.BssEntry[BssIdx].Ssid, pAd->ScanTab.BssEntry[BssIdx].SsidLen); 544 pAd->ScanTab.BssEntry[BssIdx].SsidLen;
545 NdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid,
546 pAd->ScanTab.BssEntry[BssIdx].Ssid,
547 pAd->ScanTab.BssEntry[BssIdx].SsidLen);
531 548
532 // copy the matched BSS entry from ScanTab to MlmeAux.SsidBssTab. Why? 549 // copy the matched BSS entry from ScanTab to MlmeAux.SsidBssTab. Why?
533 // Because we need this entry to become the JOIN target in later on SYNC state machine 550 // Because we need this entry to become the JOIN target in later on SYNC state machine
534 pAd->MlmeAux.BssIdx = 0; 551 pAd->MlmeAux.BssIdx = 0;
535 pAd->MlmeAux.SsidBssTab.BssNr = 1; 552 pAd->MlmeAux.SsidBssTab.BssNr = 1;
536 NdisMoveMemory(&pAd->MlmeAux.SsidBssTab.BssEntry[0], &pAd->ScanTab.BssEntry[BssIdx], sizeof(BSS_ENTRY)); 553 NdisMoveMemory(&pAd->MlmeAux.SsidBssTab.BssEntry[0],
554 &pAd->ScanTab.BssEntry[BssIdx], sizeof(BSS_ENTRY));
537 555
538 // Add SSID into MlmeAux for site surey joining hidden SSID 556 // Add SSID into MlmeAux for site surey joining hidden SSID
539 pAd->MlmeAux.SsidLen = pAd->ScanTab.BssEntry[BssIdx].SsidLen; 557 pAd->MlmeAux.SsidLen = pAd->ScanTab.BssEntry[BssIdx].SsidLen;
540 NdisMoveMemory(pAd->MlmeAux.Ssid, pAd->ScanTab.BssEntry[BssIdx].Ssid, pAd->MlmeAux.SsidLen); 558 NdisMoveMemory(pAd->MlmeAux.Ssid, pAd->ScanTab.BssEntry[BssIdx].Ssid,
559 pAd->MlmeAux.SsidLen);
541 560
542 { 561 {
543 if (INFRA_ON(pAd)) 562 if (INFRA_ON(pAd)) {
544 {
545 // disassoc from current AP first 563 // disassoc from current AP first
546 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - disassociate with current AP ...\n")); 564 DBGPRINT(RT_DEBUG_TRACE,
547 DisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid, REASON_DISASSOC_STA_LEAVING); 565 ("CNTL - disassociate with current AP ...\n"));
548 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ, 566 DisassocParmFill(pAd, &DisassocReq,
549 sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq); 567 pAd->CommonCfg.Bssid,
568 REASON_DISASSOC_STA_LEAVING);
569 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE,
570 MT2_MLME_DISASSOC_REQ,
571 sizeof(MLME_DISASSOC_REQ_STRUCT),
572 &DisassocReq);
550 573
551 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC; 574 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC;
552 } 575 } else {
553 else 576 if (ADHOC_ON(pAd)) {
554 { 577 DBGPRINT(RT_DEBUG_TRACE,
555 if (ADHOC_ON(pAd)) 578 ("CNTL - drop current ADHOC\n"));
556 {
557 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - drop current ADHOC\n"));
558 LinkDown(pAd, FALSE); 579 LinkDown(pAd, FALSE);
559 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); 580 OPSTATUS_CLEAR_FLAG(pAd,
560 pAd->IndicateMediaState = NdisMediaStateDisconnected; 581 fOP_STATUS_MEDIA_STATE_CONNECTED);
582 pAd->IndicateMediaState =
583 NdisMediaStateDisconnected;
561 RTMP_IndicateMediaState(pAd); 584 RTMP_IndicateMediaState(pAd);
562 pAd->ExtraInfo = GENERAL_LINK_DOWN; 585 pAd->ExtraInfo = GENERAL_LINK_DOWN;
563 DBGPRINT(RT_DEBUG_TRACE, ("NDIS_STATUS_MEDIA_DISCONNECT Event C!\n")); 586 DBGPRINT(RT_DEBUG_TRACE,
587 ("NDIS_STATUS_MEDIA_DISCONNECT Event C!\n"));
564 } 588 }
565
566 // Change the wepstatus to original wepstatus 589 // Change the wepstatus to original wepstatus
567 pAd->StaCfg.WepStatus = pAd->StaCfg.OrigWepStatus; 590 pAd->StaCfg.WepStatus = pAd->StaCfg.OrigWepStatus;
568 pAd->StaCfg.PairCipher = pAd->StaCfg.OrigWepStatus; 591 pAd->StaCfg.PairCipher = pAd->StaCfg.OrigWepStatus;
569 pAd->StaCfg.GroupCipher = pAd->StaCfg.OrigWepStatus; 592 pAd->StaCfg.GroupCipher = pAd->StaCfg.OrigWepStatus;
570 593
571 // Check cipher suite, AP must have more secured cipher than station setting 594 // Check cipher suite, AP must have more secured cipher than station setting
572 // Set the Pairwise and Group cipher to match the intended AP setting 595 // Set the Pairwise and Group cipher to match the intended AP setting
573 // We can only connect to AP with less secured cipher setting 596 // We can only connect to AP with less secured cipher setting
574 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK)) 597 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA)
575 { 598 || (pAd->StaCfg.AuthMode ==
576 pAd->StaCfg.GroupCipher = pAd->ScanTab.BssEntry[BssIdx].WPA.GroupCipher; 599 Ndis802_11AuthModeWPAPSK)) {
577 600 pAd->StaCfg.GroupCipher =
578 if (pAd->StaCfg.WepStatus == pAd->ScanTab.BssEntry[BssIdx].WPA.PairCipher) 601 pAd->ScanTab.BssEntry[BssIdx].WPA.
579 pAd->StaCfg.PairCipher = pAd->ScanTab.BssEntry[BssIdx].WPA.PairCipher; 602 GroupCipher;
580 else if (pAd->ScanTab.BssEntry[BssIdx].WPA.PairCipherAux != Ndis802_11WEPDisabled) 603
581 pAd->StaCfg.PairCipher = pAd->ScanTab.BssEntry[BssIdx].WPA.PairCipherAux; 604 if (pAd->StaCfg.WepStatus ==
605 pAd->ScanTab.BssEntry[BssIdx].WPA.
606 PairCipher)
607 pAd->StaCfg.PairCipher =
608 pAd->ScanTab.BssEntry[BssIdx].WPA.
609 PairCipher;
610 else if (pAd->ScanTab.BssEntry[BssIdx].WPA.
611 PairCipherAux != Ndis802_11WEPDisabled)
612 pAd->StaCfg.PairCipher =
613 pAd->ScanTab.BssEntry[BssIdx].WPA.
614 PairCipherAux;
582 else // There is no PairCipher Aux, downgrade our capability to TKIP 615 else // There is no PairCipher Aux, downgrade our capability to TKIP
583 pAd->StaCfg.PairCipher = Ndis802_11Encryption2Enabled; 616 pAd->StaCfg.PairCipher =
584 } 617 Ndis802_11Encryption2Enabled;
585 else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)) 618 } else
586 { 619 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2)
587 pAd->StaCfg.GroupCipher = pAd->ScanTab.BssEntry[BssIdx].WPA2.GroupCipher; 620 || (pAd->StaCfg.AuthMode ==
588 621 Ndis802_11AuthModeWPA2PSK)) {
589 if (pAd->StaCfg.WepStatus == pAd->ScanTab.BssEntry[BssIdx].WPA2.PairCipher) 622 pAd->StaCfg.GroupCipher =
590 pAd->StaCfg.PairCipher = pAd->ScanTab.BssEntry[BssIdx].WPA2.PairCipher; 623 pAd->ScanTab.BssEntry[BssIdx].WPA2.
591 else if (pAd->ScanTab.BssEntry[BssIdx].WPA2.PairCipherAux != Ndis802_11WEPDisabled) 624 GroupCipher;
592 pAd->StaCfg.PairCipher = pAd->ScanTab.BssEntry[BssIdx].WPA2.PairCipherAux; 625
626 if (pAd->StaCfg.WepStatus ==
627 pAd->ScanTab.BssEntry[BssIdx].WPA2.
628 PairCipher)
629 pAd->StaCfg.PairCipher =
630 pAd->ScanTab.BssEntry[BssIdx].WPA2.
631 PairCipher;
632 else if (pAd->ScanTab.BssEntry[BssIdx].WPA2.
633 PairCipherAux != Ndis802_11WEPDisabled)
634 pAd->StaCfg.PairCipher =
635 pAd->ScanTab.BssEntry[BssIdx].WPA2.
636 PairCipherAux;
593 else // There is no PairCipher Aux, downgrade our capability to TKIP 637 else // There is no PairCipher Aux, downgrade our capability to TKIP
594 pAd->StaCfg.PairCipher = Ndis802_11Encryption2Enabled; 638 pAd->StaCfg.PairCipher =
639 Ndis802_11Encryption2Enabled;
595 640
596 // RSN capability 641 // RSN capability
597 pAd->StaCfg.RsnCapability = pAd->ScanTab.BssEntry[BssIdx].WPA2.RsnCapability; 642 pAd->StaCfg.RsnCapability =
643 pAd->ScanTab.BssEntry[BssIdx].WPA2.
644 RsnCapability;
598 } 645 }
599
600 // Set Mix cipher flag 646 // Set Mix cipher flag
601 pAd->StaCfg.bMixCipher = (pAd->StaCfg.PairCipher == pAd->StaCfg.GroupCipher) ? FALSE : TRUE; 647 pAd->StaCfg.bMixCipher =
648 (pAd->StaCfg.PairCipher ==
649 pAd->StaCfg.GroupCipher) ? FALSE : TRUE;
602 /*if (pAd->StaCfg.bMixCipher == TRUE) 650 /*if (pAd->StaCfg.bMixCipher == TRUE)
603 { 651 {
604 // If mix cipher, re-build RSNIE 652 // If mix cipher, re-build RSNIE
605 RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, 0); 653 RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, 0);
606 }*/ 654 } */
607 // No active association, join the BSS immediately 655 // No active association, join the BSS immediately
608 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - joining %02x:%02x:%02x:%02x:%02x:%02x ...\n", 656 DBGPRINT(RT_DEBUG_TRACE,
609 pOidBssid[0],pOidBssid[1],pOidBssid[2],pOidBssid[3],pOidBssid[4],pOidBssid[5])); 657 ("CNTL - joining %02x:%02x:%02x:%02x:%02x:%02x ...\n",
658 pOidBssid[0], pOidBssid[1], pOidBssid[2],
659 pOidBssid[3], pOidBssid[4], pOidBssid[5]));
610 660
611 JoinParmFill(pAd, &JoinReq, pAd->MlmeAux.BssIdx); 661 JoinParmFill(pAd, &JoinReq, pAd->MlmeAux.BssIdx);
612 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_JOIN_REQ, sizeof(MLME_JOIN_REQ_STRUCT), &JoinReq); 662 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_JOIN_REQ,
663 sizeof(MLME_JOIN_REQ_STRUCT), &JoinReq);
613 664
614 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_JOIN; 665 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_JOIN;
615 } 666 }
@@ -624,13 +675,11 @@ VOID CntlOidRTBssidProc(
624// or been corrupted by other "SET OID"? 675// or been corrupted by other "SET OID"?
625// 676//
626// IRQL = DISPATCH_LEVEL 677// IRQL = DISPATCH_LEVEL
627VOID CntlMlmeRoamingProc( 678VOID CntlMlmeRoamingProc(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
628 IN PRTMP_ADAPTER pAd,
629 IN MLME_QUEUE_ELEM *Elem)
630{ 679{
631 UCHAR BBPValue = 0; 680 UCHAR BBPValue = 0;
632 681
633 DBGPRINT(RT_DEBUG_TRACE,("CNTL - Roaming in MlmeAux.RoamTab...\n")); 682 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Roaming in MlmeAux.RoamTab...\n"));
634 683
635 { 684 {
636 //Let BBP register at 20MHz to do (fast) roaming. 685 //Let BBP register at 20MHz to do (fast) roaming.
@@ -638,16 +687,16 @@ VOID CntlMlmeRoamingProc(
638 BBPValue &= (~0x18); 687 BBPValue &= (~0x18);
639 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue); 688 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
640 689
641 NdisMoveMemory(&pAd->MlmeAux.SsidBssTab, &pAd->MlmeAux.RoamTab, sizeof(pAd->MlmeAux.RoamTab)); 690 NdisMoveMemory(&pAd->MlmeAux.SsidBssTab, &pAd->MlmeAux.RoamTab,
642 pAd->MlmeAux.SsidBssTab.BssNr = pAd->MlmeAux.RoamTab.BssNr; 691 sizeof(pAd->MlmeAux.RoamTab));
692 pAd->MlmeAux.SsidBssTab.BssNr = pAd->MlmeAux.RoamTab.BssNr;
643 693
644 BssTableSortByRssi(&pAd->MlmeAux.SsidBssTab); 694 BssTableSortByRssi(&pAd->MlmeAux.SsidBssTab);
645 pAd->MlmeAux.BssIdx = 0; 695 pAd->MlmeAux.BssIdx = 0;
646 IterateOnBssTab(pAd); 696 IterateOnBssTab(pAd);
647 } 697 }
648} 698}
649 699
650
651/* 700/*
652 ========================================================================== 701 ==========================================================================
653 Description: 702 Description:
@@ -656,34 +705,35 @@ VOID CntlMlmeRoamingProc(
656 705
657 ========================================================================== 706 ==========================================================================
658*/ 707*/
659VOID CntlWaitDisassocProc( 708VOID CntlWaitDisassocProc(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
660 IN PRTMP_ADAPTER pAd,
661 IN MLME_QUEUE_ELEM *Elem)
662{ 709{
663 MLME_START_REQ_STRUCT StartReq; 710 MLME_START_REQ_STRUCT StartReq;
664 711
665 if (Elem->MsgType == MT2_DISASSOC_CONF) 712 if (Elem->MsgType == MT2_DISASSOC_CONF) {
666 {
667 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Dis-associate successful\n")); 713 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Dis-associate successful\n"));
668 714
669 if (pAd->CommonCfg.bWirelessEvent) 715 if (pAd->CommonCfg.bWirelessEvent) {
670 { 716 RTMPSendWirelessEvent(pAd, IW_DISASSOC_EVENT_FLAG,
671 RTMPSendWirelessEvent(pAd, IW_DISASSOC_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0); 717 pAd->MacTab.Content[BSSID_WCID].
718 Addr, BSS0, 0);
672 } 719 }
673 720
674 LinkDown(pAd, FALSE); 721 LinkDown(pAd, FALSE);
675 722
676 // case 1. no matching BSS, and user wants ADHOC, so we just start a new one 723 // case 1. no matching BSS, and user wants ADHOC, so we just start a new one
677 if ((pAd->MlmeAux.SsidBssTab.BssNr==0) && (pAd->StaCfg.BssType == BSS_ADHOC)) 724 if ((pAd->MlmeAux.SsidBssTab.BssNr == 0)
678 { 725 && (pAd->StaCfg.BssType == BSS_ADHOC)) {
679 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - No matching BSS, start a new ADHOC (Ssid=%s)...\n",pAd->MlmeAux.Ssid)); 726 DBGPRINT(RT_DEBUG_TRACE,
680 StartParmFill(pAd, &StartReq, (PCHAR)pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen); 727 ("CNTL - No matching BSS, start a new ADHOC (Ssid=%s)...\n",
681 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_START_REQ, sizeof(MLME_START_REQ_STRUCT), &StartReq); 728 pAd->MlmeAux.Ssid));
729 StartParmFill(pAd, &StartReq, (PCHAR) pAd->MlmeAux.Ssid,
730 pAd->MlmeAux.SsidLen);
731 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_START_REQ,
732 sizeof(MLME_START_REQ_STRUCT), &StartReq);
682 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_START; 733 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_START;
683 } 734 }
684 // case 2. try each matched BSS 735 // case 2. try each matched BSS
685 else 736 else {
686 {
687 pAd->MlmeAux.BssIdx = 0; 737 pAd->MlmeAux.BssIdx = 0;
688 738
689 IterateOnBssTab(pAd); 739 IterateOnBssTab(pAd);
@@ -699,66 +749,74 @@ VOID CntlWaitDisassocProc(
699 749
700 ========================================================================== 750 ==========================================================================
701*/ 751*/
702VOID CntlWaitJoinProc( 752VOID CntlWaitJoinProc(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
703 IN PRTMP_ADAPTER pAd,
704 IN MLME_QUEUE_ELEM *Elem)
705{ 753{
706 USHORT Reason; 754 USHORT Reason;
707 MLME_AUTH_REQ_STRUCT AuthReq; 755 MLME_AUTH_REQ_STRUCT AuthReq;
708 756
709 if (Elem->MsgType == MT2_JOIN_CONF) 757 if (Elem->MsgType == MT2_JOIN_CONF) {
710 {
711 NdisMoveMemory(&Reason, Elem->Msg, sizeof(USHORT)); 758 NdisMoveMemory(&Reason, Elem->Msg, sizeof(USHORT));
712 if (Reason == MLME_SUCCESS) 759 if (Reason == MLME_SUCCESS) {
713 {
714 // 1. joined an IBSS, we are pretty much done here 760 // 1. joined an IBSS, we are pretty much done here
715 if (pAd->MlmeAux.BssType == BSS_ADHOC) 761 if (pAd->MlmeAux.BssType == BSS_ADHOC) {
716 { 762 //
717 //
718 // 5G bands rules of Japan: 763 // 5G bands rules of Japan:
719 // Ad hoc must be disabled in W53(ch52,56,60,64) channels. 764 // Ad hoc must be disabled in W53(ch52,56,60,64) channels.
720 // 765 //
721 if ( (pAd->CommonCfg.bIEEE80211H == 1) && 766 if ((pAd->CommonCfg.bIEEE80211H == 1) &&
722 RadarChannelCheck(pAd, pAd->CommonCfg.Channel) 767 RadarChannelCheck(pAd,
723 ) 768 pAd->CommonCfg.Channel)
724 { 769 ) {
725 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; 770 pAd->Mlme.CntlMachine.CurrState =
726 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Channel=%d, Join adhoc on W53(52,56,60,64) Channels are not accepted\n", pAd->CommonCfg.Channel)); 771 CNTL_IDLE;
772 DBGPRINT(RT_DEBUG_TRACE,
773 ("CNTL - Channel=%d, Join adhoc on W53(52,56,60,64) Channels are not accepted\n",
774 pAd->CommonCfg.Channel));
727 return; 775 return;
728 } 776 }
729 777
730 LinkUp(pAd, BSS_ADHOC); 778 LinkUp(pAd, BSS_ADHOC);
731 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; 779 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
732 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - join the IBSS = %02x:%02x:%02x:%02x:%02x:%02x ...\n", 780 DBGPRINT(RT_DEBUG_TRACE,
733 pAd->CommonCfg.Bssid[0],pAd->CommonCfg.Bssid[1],pAd->CommonCfg.Bssid[2], 781 ("CNTL - join the IBSS = %02x:%02x:%02x:%02x:%02x:%02x ...\n",
734 pAd->CommonCfg.Bssid[3],pAd->CommonCfg.Bssid[4],pAd->CommonCfg.Bssid[5])); 782 pAd->CommonCfg.Bssid[0],
735 783 pAd->CommonCfg.Bssid[1],
736 pAd->IndicateMediaState = NdisMediaStateConnected; 784 pAd->CommonCfg.Bssid[2],
737 pAd->ExtraInfo = GENERAL_LINK_UP; 785 pAd->CommonCfg.Bssid[3],
786 pAd->CommonCfg.Bssid[4],
787 pAd->CommonCfg.Bssid[5]));
788
789 pAd->IndicateMediaState =
790 NdisMediaStateConnected;
791 pAd->ExtraInfo = GENERAL_LINK_UP;
738 } 792 }
739 // 2. joined a new INFRA network, start from authentication 793 // 2. joined a new INFRA network, start from authentication
740 else 794 else {
741 {
742 { 795 {
743 // either Ndis802_11AuthModeShared or Ndis802_11AuthModeAutoSwitch, try shared key first 796 // either Ndis802_11AuthModeShared or Ndis802_11AuthModeAutoSwitch, try shared key first
744 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeShared) || 797 if ((pAd->StaCfg.AuthMode ==
745 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeAutoSwitch)) 798 Ndis802_11AuthModeShared)
746 { 799 || (pAd->StaCfg.AuthMode ==
747 AuthParmFill(pAd, &AuthReq, pAd->MlmeAux.Bssid, AUTH_MODE_KEY); 800 Ndis802_11AuthModeAutoSwitch)) {
801 AuthParmFill(pAd, &AuthReq,
802 pAd->MlmeAux.Bssid,
803 AUTH_MODE_KEY);
804 } else {
805 AuthParmFill(pAd, &AuthReq,
806 pAd->MlmeAux.Bssid,
807 AUTH_MODE_OPEN);
748 } 808 }
749 else 809 MlmeEnqueue(pAd, AUTH_STATE_MACHINE,
750 { 810 MT2_MLME_AUTH_REQ,
751 AuthParmFill(pAd, &AuthReq, pAd->MlmeAux.Bssid, AUTH_MODE_OPEN); 811 sizeof
752 } 812 (MLME_AUTH_REQ_STRUCT),
753 MlmeEnqueue(pAd, AUTH_STATE_MACHINE, MT2_MLME_AUTH_REQ, 813 &AuthReq);
754 sizeof(MLME_AUTH_REQ_STRUCT), &AuthReq);
755 } 814 }
756 815
757 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_AUTH; 816 pAd->Mlme.CntlMachine.CurrState =
817 CNTL_WAIT_AUTH;
758 } 818 }
759 } 819 } else {
760 else
761 {
762 // 3. failed, try next BSS 820 // 3. failed, try next BSS
763 pAd->MlmeAux.BssIdx++; 821 pAd->MlmeAux.BssIdx++;
764 IterateOnBssTab(pAd); 822 IterateOnBssTab(pAd);
@@ -766,7 +824,6 @@ VOID CntlWaitJoinProc(
766 } 824 }
767} 825}
768 826
769
770/* 827/*
771 ========================================================================== 828 ==========================================================================
772 Description: 829 Description:
@@ -775,73 +832,86 @@ VOID CntlWaitJoinProc(
775 832
776 ========================================================================== 833 ==========================================================================
777*/ 834*/
778VOID CntlWaitStartProc( 835VOID CntlWaitStartProc(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
779 IN PRTMP_ADAPTER pAd,
780 IN MLME_QUEUE_ELEM *Elem)
781{ 836{
782 USHORT Result; 837 USHORT Result;
783 838
784 if (Elem->MsgType == MT2_START_CONF) 839 if (Elem->MsgType == MT2_START_CONF) {
785 {
786 NdisMoveMemory(&Result, Elem->Msg, sizeof(USHORT)); 840 NdisMoveMemory(&Result, Elem->Msg, sizeof(USHORT));
787 if (Result == MLME_SUCCESS) 841 if (Result == MLME_SUCCESS) {
788 { 842 //
789 //
790 // 5G bands rules of Japan: 843 // 5G bands rules of Japan:
791 // Ad hoc must be disabled in W53(ch52,56,60,64) channels. 844 // Ad hoc must be disabled in W53(ch52,56,60,64) channels.
792 // 845 //
793 if ( (pAd->CommonCfg.bIEEE80211H == 1) && 846 if ((pAd->CommonCfg.bIEEE80211H == 1) &&
794 RadarChannelCheck(pAd, pAd->CommonCfg.Channel) 847 RadarChannelCheck(pAd, pAd->CommonCfg.Channel)
795 ) 848 ) {
796 {
797 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; 849 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
798 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Channel=%d, Start adhoc on W53(52,56,60,64) Channels are not accepted\n", pAd->CommonCfg.Channel)); 850 DBGPRINT(RT_DEBUG_TRACE,
851 ("CNTL - Channel=%d, Start adhoc on W53(52,56,60,64) Channels are not accepted\n",
852 pAd->CommonCfg.Channel));
799 return; 853 return;
800 } 854 }
801 NdisZeroMemory(&pAd->StaActive.SupportedPhyInfo.MCSSet[0], 16); 855 NdisZeroMemory(&pAd->StaActive.SupportedPhyInfo.
802 if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) 856 MCSSet[0], 16);
803 { 857 if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) {
804 N_ChannelCheck(pAd); 858 N_ChannelCheck(pAd);
805 SetCommonHT(pAd); 859 SetCommonHT(pAd);
806 NdisMoveMemory(&pAd->MlmeAux.AddHtInfo, &pAd->CommonCfg.AddHTInfo, sizeof(ADD_HT_INFO_IE)); 860 NdisMoveMemory(&pAd->MlmeAux.AddHtInfo,
807 RTMPCheckHt(pAd, BSSID_WCID, &pAd->CommonCfg.HtCapability, &pAd->CommonCfg.AddHTInfo); 861 &pAd->CommonCfg.AddHTInfo,
808 pAd->StaActive.SupportedPhyInfo.bHtEnable = TRUE; 862 sizeof(ADD_HT_INFO_IE));
809 NdisMoveMemory(&pAd->StaActive.SupportedPhyInfo.MCSSet[0], &pAd->CommonCfg.HtCapability.MCSSet[0], 16); 863 RTMPCheckHt(pAd, BSSID_WCID,
810 COPY_HTSETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(pAd); 864 &pAd->CommonCfg.HtCapability,
811 865 &pAd->CommonCfg.AddHTInfo);
812 if ((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40) && 866 pAd->StaActive.SupportedPhyInfo.bHtEnable =
813 (pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset == EXTCHA_ABOVE)) 867 TRUE;
814 { 868 NdisMoveMemory(&pAd->StaActive.SupportedPhyInfo.
815 pAd->MlmeAux.CentralChannel = pAd->CommonCfg.Channel + 2; 869 MCSSet[0],
870 &pAd->CommonCfg.HtCapability.
871 MCSSet[0], 16);
872 COPY_HTSETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG
873 (pAd);
874
875 if ((pAd->CommonCfg.HtCapability.HtCapInfo.
876 ChannelWidth == BW_40)
877 && (pAd->CommonCfg.AddHTInfo.AddHtInfo.
878 ExtChanOffset == EXTCHA_ABOVE)) {
879 pAd->MlmeAux.CentralChannel =
880 pAd->CommonCfg.Channel + 2;
881 } else
882 if ((pAd->CommonCfg.HtCapability.HtCapInfo.
883 ChannelWidth == BW_40)
884 && (pAd->CommonCfg.AddHTInfo.AddHtInfo.
885 ExtChanOffset == EXTCHA_BELOW)) {
886 pAd->MlmeAux.CentralChannel =
887 pAd->CommonCfg.Channel - 2;
816 } 888 }
817 else if ((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40) && 889 } else {
818 (pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset == EXTCHA_BELOW)) 890 pAd->StaActive.SupportedPhyInfo.bHtEnable =
819 { 891 FALSE;
820 pAd->MlmeAux.CentralChannel = pAd->CommonCfg.Channel - 2;
821 }
822 }
823 else
824 {
825 pAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE;
826 } 892 }
827 LinkUp(pAd, BSS_ADHOC); 893 LinkUp(pAd, BSS_ADHOC);
828 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; 894 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
829 // Before send beacon, driver need do radar detection 895 // Before send beacon, driver need do radar detection
830 if ((pAd->CommonCfg.Channel > 14 ) 896 if ((pAd->CommonCfg.Channel > 14)
831 && (pAd->CommonCfg.bIEEE80211H == 1) 897 && (pAd->CommonCfg.bIEEE80211H == 1)
832 && RadarChannelCheck(pAd, pAd->CommonCfg.Channel)) 898 && RadarChannelCheck(pAd, pAd->CommonCfg.Channel)) {
833 { 899 pAd->CommonCfg.RadarDetect.RDMode =
834 pAd->CommonCfg.RadarDetect.RDMode = RD_SILENCE_MODE; 900 RD_SILENCE_MODE;
835 pAd->CommonCfg.RadarDetect.RDCount = 0; 901 pAd->CommonCfg.RadarDetect.RDCount = 0;
836 } 902 }
837 903
838 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - start a new IBSS = %02x:%02x:%02x:%02x:%02x:%02x ...\n", 904 DBGPRINT(RT_DEBUG_TRACE,
839 pAd->CommonCfg.Bssid[0],pAd->CommonCfg.Bssid[1],pAd->CommonCfg.Bssid[2], 905 ("CNTL - start a new IBSS = %02x:%02x:%02x:%02x:%02x:%02x ...\n",
840 pAd->CommonCfg.Bssid[3],pAd->CommonCfg.Bssid[4],pAd->CommonCfg.Bssid[5])); 906 pAd->CommonCfg.Bssid[0],
841 } 907 pAd->CommonCfg.Bssid[1],
842 else 908 pAd->CommonCfg.Bssid[2],
843 { 909 pAd->CommonCfg.Bssid[3],
844 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Start IBSS fail. BUG!!!!!\n")); 910 pAd->CommonCfg.Bssid[4],
911 pAd->CommonCfg.Bssid[5]));
912 } else {
913 DBGPRINT(RT_DEBUG_TRACE,
914 ("CNTL - Start IBSS fail. BUG!!!!!\n"));
845 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; 915 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
846 } 916 }
847 } 917 }
@@ -855,50 +925,55 @@ VOID CntlWaitStartProc(
855 925
856 ========================================================================== 926 ==========================================================================
857*/ 927*/
858VOID CntlWaitAuthProc( 928VOID CntlWaitAuthProc(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
859 IN PRTMP_ADAPTER pAd,
860 IN MLME_QUEUE_ELEM *Elem)
861{ 929{
862 USHORT Reason; 930 USHORT Reason;
863 MLME_ASSOC_REQ_STRUCT AssocReq; 931 MLME_ASSOC_REQ_STRUCT AssocReq;
864 MLME_AUTH_REQ_STRUCT AuthReq; 932 MLME_AUTH_REQ_STRUCT AuthReq;
865 933
866 if (Elem->MsgType == MT2_AUTH_CONF) 934 if (Elem->MsgType == MT2_AUTH_CONF) {
867 {
868 NdisMoveMemory(&Reason, Elem->Msg, sizeof(USHORT)); 935 NdisMoveMemory(&Reason, Elem->Msg, sizeof(USHORT));
869 if (Reason == MLME_SUCCESS) 936 if (Reason == MLME_SUCCESS) {
870 {
871 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - AUTH OK\n")); 937 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - AUTH OK\n"));
872 AssocParmFill(pAd, &AssocReq, pAd->MlmeAux.Bssid, pAd->MlmeAux.CapabilityInfo, 938 AssocParmFill(pAd, &AssocReq, pAd->MlmeAux.Bssid,
873 ASSOC_TIMEOUT, pAd->StaCfg.DefaultListenCount); 939 pAd->MlmeAux.CapabilityInfo,
940 ASSOC_TIMEOUT,
941 pAd->StaCfg.DefaultListenCount);
874 942
875 { 943 {
876 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_ASSOC_REQ, 944 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE,
877 sizeof(MLME_ASSOC_REQ_STRUCT), &AssocReq); 945 MT2_MLME_ASSOC_REQ,
946 sizeof(MLME_ASSOC_REQ_STRUCT),
947 &AssocReq);
878 948
879 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_ASSOC; 949 pAd->Mlme.CntlMachine.CurrState =
950 CNTL_WAIT_ASSOC;
880 } 951 }
881 } 952 } else {
882 else
883 {
884 // This fail may because of the AP already keep us in its MAC table without 953 // This fail may because of the AP already keep us in its MAC table without
885 // ageing-out. The previous authentication attempt must have let it remove us. 954 // ageing-out. The previous authentication attempt must have let it remove us.
886 // so try Authentication again may help. For D-Link DWL-900AP+ compatibility. 955 // so try Authentication again may help. For D-Link DWL-900AP+ compatibility.
887 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - AUTH FAIL, try again...\n")); 956 DBGPRINT(RT_DEBUG_TRACE,
957 ("CNTL - AUTH FAIL, try again...\n"));
888 958
889 { 959 {
890 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeShared) || 960 if ((pAd->StaCfg.AuthMode ==
891 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeAutoSwitch)) 961 Ndis802_11AuthModeShared)
892 { 962 || (pAd->StaCfg.AuthMode ==
963 Ndis802_11AuthModeAutoSwitch)) {
893 // either Ndis802_11AuthModeShared or Ndis802_11AuthModeAutoSwitch, try shared key first 964 // either Ndis802_11AuthModeShared or Ndis802_11AuthModeAutoSwitch, try shared key first
894 AuthParmFill(pAd, &AuthReq, pAd->MlmeAux.Bssid, AUTH_MODE_KEY); 965 AuthParmFill(pAd, &AuthReq,
966 pAd->MlmeAux.Bssid,
967 AUTH_MODE_KEY);
968 } else {
969 AuthParmFill(pAd, &AuthReq,
970 pAd->MlmeAux.Bssid,
971 AUTH_MODE_OPEN);
895 } 972 }
896 else 973 MlmeEnqueue(pAd, AUTH_STATE_MACHINE,
897 { 974 MT2_MLME_AUTH_REQ,
898 AuthParmFill(pAd, &AuthReq, pAd->MlmeAux.Bssid, AUTH_MODE_OPEN); 975 sizeof(MLME_AUTH_REQ_STRUCT),
899 } 976 &AuthReq);
900 MlmeEnqueue(pAd, AUTH_STATE_MACHINE, MT2_MLME_AUTH_REQ,
901 sizeof(MLME_AUTH_REQ_STRUCT), &AuthReq);
902 977
903 } 978 }
904 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_AUTH2; 979 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_AUTH2;
@@ -914,46 +989,49 @@ VOID CntlWaitAuthProc(
914 989
915 ========================================================================== 990 ==========================================================================
916*/ 991*/
917VOID CntlWaitAuthProc2( 992VOID CntlWaitAuthProc2(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
918 IN PRTMP_ADAPTER pAd,
919 IN MLME_QUEUE_ELEM *Elem)
920{ 993{
921 USHORT Reason; 994 USHORT Reason;
922 MLME_ASSOC_REQ_STRUCT AssocReq; 995 MLME_ASSOC_REQ_STRUCT AssocReq;
923 MLME_AUTH_REQ_STRUCT AuthReq; 996 MLME_AUTH_REQ_STRUCT AuthReq;
924 997
925 if (Elem->MsgType == MT2_AUTH_CONF) 998 if (Elem->MsgType == MT2_AUTH_CONF) {
926 {
927 NdisMoveMemory(&Reason, Elem->Msg, sizeof(USHORT)); 999 NdisMoveMemory(&Reason, Elem->Msg, sizeof(USHORT));
928 if (Reason == MLME_SUCCESS) 1000 if (Reason == MLME_SUCCESS) {
929 {
930 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - AUTH OK\n")); 1001 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - AUTH OK\n"));
931 AssocParmFill(pAd, &AssocReq, pAd->MlmeAux.Bssid, pAd->MlmeAux.CapabilityInfo, 1002 AssocParmFill(pAd, &AssocReq, pAd->MlmeAux.Bssid,
932 ASSOC_TIMEOUT, pAd->StaCfg.DefaultListenCount); 1003 pAd->MlmeAux.CapabilityInfo,
1004 ASSOC_TIMEOUT,
1005 pAd->StaCfg.DefaultListenCount);
933 { 1006 {
934 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_ASSOC_REQ, 1007 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE,
935 sizeof(MLME_ASSOC_REQ_STRUCT), &AssocReq); 1008 MT2_MLME_ASSOC_REQ,
1009 sizeof(MLME_ASSOC_REQ_STRUCT),
1010 &AssocReq);
936 1011
937 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_ASSOC; 1012 pAd->Mlme.CntlMachine.CurrState =
938 } 1013 CNTL_WAIT_ASSOC;
939 }
940 else
941 {
942 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeAutoSwitch) &&
943 (pAd->MlmeAux.Alg == Ndis802_11AuthModeShared))
944 {
945 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - AUTH FAIL, try OPEN system...\n"));
946 AuthParmFill(pAd, &AuthReq, pAd->MlmeAux.Bssid, Ndis802_11AuthModeOpen);
947 MlmeEnqueue(pAd, AUTH_STATE_MACHINE, MT2_MLME_AUTH_REQ,
948 sizeof(MLME_AUTH_REQ_STRUCT), &AuthReq);
949
950 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_AUTH2;
951 } 1014 }
952 else 1015 } else {
953 { 1016 if ((pAd->StaCfg.AuthMode ==
1017 Ndis802_11AuthModeAutoSwitch)
1018 && (pAd->MlmeAux.Alg == Ndis802_11AuthModeShared)) {
1019 DBGPRINT(RT_DEBUG_TRACE,
1020 ("CNTL - AUTH FAIL, try OPEN system...\n"));
1021 AuthParmFill(pAd, &AuthReq, pAd->MlmeAux.Bssid,
1022 Ndis802_11AuthModeOpen);
1023 MlmeEnqueue(pAd, AUTH_STATE_MACHINE,
1024 MT2_MLME_AUTH_REQ,
1025 sizeof(MLME_AUTH_REQ_STRUCT),
1026 &AuthReq);
1027
1028 pAd->Mlme.CntlMachine.CurrState =
1029 CNTL_WAIT_AUTH2;
1030 } else {
954 // not success, try next BSS 1031 // not success, try next BSS
955 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - AUTH FAIL, give up; try next BSS\n")); 1032 DBGPRINT(RT_DEBUG_TRACE,
956 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; //??????? 1033 ("CNTL - AUTH FAIL, give up; try next BSS\n"));
1034 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; //???????
957 pAd->MlmeAux.BssIdx++; 1035 pAd->MlmeAux.BssIdx++;
958 IterateOnBssTab(pAd); 1036 IterateOnBssTab(pAd);
959 } 1037 }
@@ -969,30 +1047,30 @@ VOID CntlWaitAuthProc2(
969 1047
970 ========================================================================== 1048 ==========================================================================
971*/ 1049*/
972VOID CntlWaitAssocProc( 1050VOID CntlWaitAssocProc(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
973 IN PRTMP_ADAPTER pAd,
974 IN MLME_QUEUE_ELEM *Elem)
975{ 1051{
976 USHORT Reason; 1052 USHORT Reason;
977 1053
978 if (Elem->MsgType == MT2_ASSOC_CONF) 1054 if (Elem->MsgType == MT2_ASSOC_CONF) {
979 {
980 NdisMoveMemory(&Reason, Elem->Msg, sizeof(USHORT)); 1055 NdisMoveMemory(&Reason, Elem->Msg, sizeof(USHORT));
981 if (Reason == MLME_SUCCESS) 1056 if (Reason == MLME_SUCCESS) {
982 { 1057 if (pAd->CommonCfg.bWirelessEvent) {
983 if (pAd->CommonCfg.bWirelessEvent) 1058 RTMPSendWirelessEvent(pAd, IW_ASSOC_EVENT_FLAG,
984 { 1059 pAd->MacTab.
985 RTMPSendWirelessEvent(pAd, IW_ASSOC_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0); 1060 Content[BSSID_WCID].Addr,
1061 BSS0, 0);
986 } 1062 }
987 1063
988 LinkUp(pAd, BSS_INFRA); 1064 LinkUp(pAd, BSS_INFRA);
989 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; 1065 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
990 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Association successful on BSS #%ld\n",pAd->MlmeAux.BssIdx)); 1066 DBGPRINT(RT_DEBUG_TRACE,
991 } 1067 ("CNTL - Association successful on BSS #%ld\n",
992 else 1068 pAd->MlmeAux.BssIdx));
993 { 1069 } else {
994 // not success, try next BSS 1070 // not success, try next BSS
995 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Association fails on BSS #%ld\n",pAd->MlmeAux.BssIdx)); 1071 DBGPRINT(RT_DEBUG_TRACE,
1072 ("CNTL - Association fails on BSS #%ld\n",
1073 pAd->MlmeAux.BssIdx));
996 pAd->MlmeAux.BssIdx++; 1074 pAd->MlmeAux.BssIdx++;
997 IterateOnBssTab(pAd); 1075 IterateOnBssTab(pAd);
998 } 1076 }
@@ -1007,21 +1085,19 @@ VOID CntlWaitAssocProc(
1007 1085
1008 ========================================================================== 1086 ==========================================================================
1009*/ 1087*/
1010VOID CntlWaitReassocProc( 1088VOID CntlWaitReassocProc(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
1011 IN PRTMP_ADAPTER pAd,
1012 IN MLME_QUEUE_ELEM *Elem)
1013{ 1089{
1014 USHORT Result; 1090 USHORT Result;
1015 1091
1016 if (Elem->MsgType == MT2_REASSOC_CONF) 1092 if (Elem->MsgType == MT2_REASSOC_CONF) {
1017 {
1018 NdisMoveMemory(&Result, Elem->Msg, sizeof(USHORT)); 1093 NdisMoveMemory(&Result, Elem->Msg, sizeof(USHORT));
1019 if (Result == MLME_SUCCESS) 1094 if (Result == MLME_SUCCESS) {
1020 {
1021 // send wireless event - for association 1095 // send wireless event - for association
1022 if (pAd->CommonCfg.bWirelessEvent) 1096 if (pAd->CommonCfg.bWirelessEvent)
1023 RTMPSendWirelessEvent(pAd, IW_ASSOC_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0); 1097 RTMPSendWirelessEvent(pAd, IW_ASSOC_EVENT_FLAG,
1024 1098 pAd->MacTab.
1099 Content[BSSID_WCID].Addr,
1100 BSS0, 0);
1025 1101
1026 // 1102 //
1027 // NDIS requires a new Link UP indication but no Link Down for RE-ASSOC 1103 // NDIS requires a new Link UP indication but no Link Down for RE-ASSOC
@@ -1029,23 +1105,23 @@ VOID CntlWaitReassocProc(
1029 LinkUp(pAd, BSS_INFRA); 1105 LinkUp(pAd, BSS_INFRA);
1030 1106
1031 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; 1107 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
1032 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Re-assocition successful on BSS #%ld\n", pAd->MlmeAux.RoamIdx)); 1108 DBGPRINT(RT_DEBUG_TRACE,
1033 } 1109 ("CNTL - Re-assocition successful on BSS #%ld\n",
1034 else 1110 pAd->MlmeAux.RoamIdx));
1035 { 1111 } else {
1036 // reassoc failed, try to pick next BSS in the BSS Table 1112 // reassoc failed, try to pick next BSS in the BSS Table
1037 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Re-assocition fails on BSS #%ld\n", pAd->MlmeAux.RoamIdx)); 1113 DBGPRINT(RT_DEBUG_TRACE,
1114 ("CNTL - Re-assocition fails on BSS #%ld\n",
1115 pAd->MlmeAux.RoamIdx));
1038 { 1116 {
1039 pAd->MlmeAux.RoamIdx++; 1117 pAd->MlmeAux.RoamIdx++;
1040 IterateOnBssTab2(pAd); 1118 IterateOnBssTab2(pAd);
1119 }
1041 } 1120 }
1042 } 1121 }
1043 }
1044} 1122}
1045 1123
1046 1124VOID AdhocTurnOnQos(IN PRTMP_ADAPTER pAd)
1047VOID AdhocTurnOnQos(
1048 IN PRTMP_ADAPTER pAd)
1049{ 1125{
1050#define AC0_DEF_TXOP 0 1126#define AC0_DEF_TXOP 0
1051#define AC1_DEF_TXOP 0 1127#define AC1_DEF_TXOP 0
@@ -1053,8 +1129,7 @@ VOID AdhocTurnOnQos(
1053#define AC3_DEF_TXOP 47 1129#define AC3_DEF_TXOP 47
1054 1130
1055 // Turn on QOs if use HT rate. 1131 // Turn on QOs if use HT rate.
1056 if (pAd->CommonCfg.APEdcaParm.bValid == FALSE) 1132 if (pAd->CommonCfg.APEdcaParm.bValid == FALSE) {
1057 {
1058 pAd->CommonCfg.APEdcaParm.bValid = TRUE; 1133 pAd->CommonCfg.APEdcaParm.bValid = TRUE;
1059 pAd->CommonCfg.APEdcaParm.Aifsn[0] = 3; 1134 pAd->CommonCfg.APEdcaParm.Aifsn[0] = 3;
1060 pAd->CommonCfg.APEdcaParm.Aifsn[1] = 7; 1135 pAd->CommonCfg.APEdcaParm.Aifsn[1] = 7;
@@ -1071,10 +1146,10 @@ VOID AdhocTurnOnQos(
1071 pAd->CommonCfg.APEdcaParm.Cwmax[2] = 4; 1146 pAd->CommonCfg.APEdcaParm.Cwmax[2] = 4;
1072 pAd->CommonCfg.APEdcaParm.Cwmax[3] = 3; 1147 pAd->CommonCfg.APEdcaParm.Cwmax[3] = 3;
1073 1148
1074 pAd->CommonCfg.APEdcaParm.Txop[0] = 0; 1149 pAd->CommonCfg.APEdcaParm.Txop[0] = 0;
1075 pAd->CommonCfg.APEdcaParm.Txop[1] = 0; 1150 pAd->CommonCfg.APEdcaParm.Txop[1] = 0;
1076 pAd->CommonCfg.APEdcaParm.Txop[2] = AC2_DEF_TXOP; 1151 pAd->CommonCfg.APEdcaParm.Txop[2] = AC2_DEF_TXOP;
1077 pAd->CommonCfg.APEdcaParm.Txop[3] = AC3_DEF_TXOP; 1152 pAd->CommonCfg.APEdcaParm.Txop[3] = AC3_DEF_TXOP;
1078 } 1153 }
1079 AsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm); 1154 AsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm);
1080} 1155}
@@ -1087,27 +1162,23 @@ VOID AdhocTurnOnQos(
1087 1162
1088 ========================================================================== 1163 ==========================================================================
1089*/ 1164*/
1090VOID LinkUp( 1165VOID LinkUp(IN PRTMP_ADAPTER pAd, IN UCHAR BssType)
1091 IN PRTMP_ADAPTER pAd,
1092 IN UCHAR BssType)
1093{ 1166{
1094 ULONG Now; 1167 ULONG Now;
1095 UINT32 Data; 1168 UINT32 Data;
1096 BOOLEAN Cancelled; 1169 BOOLEAN Cancelled;
1097 UCHAR Value = 0, idx = 0, HashIdx = 0; 1170 UCHAR Value = 0, idx = 0, HashIdx = 0;
1098 MAC_TABLE_ENTRY *pEntry = NULL, *pCurrEntry = NULL; 1171 MAC_TABLE_ENTRY *pEntry = NULL, *pCurrEntry = NULL;
1099 1172
1100 // Init ChannelQuality to prevent DEAD_CQI at initial LinkUp 1173 // Init ChannelQuality to prevent DEAD_CQI at initial LinkUp
1101 pAd->Mlme.ChannelQuality = 50; 1174 pAd->Mlme.ChannelQuality = 50;
1102 1175
1103 pEntry = MacTableLookup(pAd, pAd->CommonCfg.Bssid); 1176 pEntry = MacTableLookup(pAd, pAd->CommonCfg.Bssid);
1104 if (pEntry) 1177 if (pEntry) {
1105 {
1106 MacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr); 1178 MacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr);
1107 pEntry = NULL; 1179 pEntry = NULL;
1108 } 1180 }
1109 1181
1110
1111 pEntry = &pAd->MacTab.Content[BSSID_WCID]; 1182 pEntry = &pAd->MacTab.Content[BSSID_WCID];
1112 1183
1113 // 1184 //
@@ -1119,7 +1190,7 @@ VOID LinkUp(
1119 // To prevent DisassocTimeoutAction to call Link down after we link up, 1190 // To prevent DisassocTimeoutAction to call Link down after we link up,
1120 // cancel the DisassocTimer no matter what it start or not. 1191 // cancel the DisassocTimer no matter what it start or not.
1121 // 1192 //
1122 RTMPCancelTimer(&pAd->MlmeAux.DisassocTimer, &Cancelled); 1193 RTMPCancelTimer(&pAd->MlmeAux.DisassocTimer, &Cancelled);
1123 1194
1124 COPY_SETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(pAd); 1195 COPY_SETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(pAd);
1125 1196
@@ -1129,39 +1200,30 @@ VOID LinkUp(
1129 // Before power save before link up function, We will force use 1R. 1200 // Before power save before link up function, We will force use 1R.
1130 // So after link up, check Rx antenna # again. 1201 // So after link up, check Rx antenna # again.
1131 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value); 1202 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value);
1132 if(pAd->Antenna.field.RxPath == 3) 1203 if (pAd->Antenna.field.RxPath == 3) {
1133 {
1134 Value |= (0x10); 1204 Value |= (0x10);
1135 } 1205 } else if (pAd->Antenna.field.RxPath == 2) {
1136 else if(pAd->Antenna.field.RxPath == 2)
1137 {
1138 Value |= (0x8); 1206 Value |= (0x8);
1139 } 1207 } else if (pAd->Antenna.field.RxPath == 1) {
1140 else if(pAd->Antenna.field.RxPath == 1)
1141 {
1142 Value |= (0x0); 1208 Value |= (0x0);
1143 } 1209 }
1144 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value); 1210 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
1145 pAd->StaCfg.BBPR3 = Value; 1211 pAd->StaCfg.BBPR3 = Value;
1146#endif // RTMP_MAC_PCI // 1212#endif // RTMP_MAC_PCI //
1147 1213
1148 if (BssType == BSS_ADHOC) 1214 if (BssType == BSS_ADHOC) {
1149 {
1150 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_ADHOC_ON); 1215 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_ADHOC_ON);
1151 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_INFRA_ON); 1216 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_INFRA_ON);
1152 1217
1153
1154 if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) 1218 if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)
1155 AdhocTurnOnQos(pAd); 1219 AdhocTurnOnQos(pAd);
1156 1220
1157 DBGPRINT(RT_DEBUG_TRACE, ("!!!Adhoc LINK UP !!! \n" )); 1221 DBGPRINT(RT_DEBUG_TRACE, ("!!!Adhoc LINK UP !!! \n"));
1158 } 1222 } else {
1159 else
1160 {
1161 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_INFRA_ON); 1223 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_INFRA_ON);
1162 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADHOC_ON); 1224 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADHOC_ON);
1163 1225
1164 DBGPRINT(RT_DEBUG_TRACE, ("!!!Infra LINK UP !!! \n" )); 1226 DBGPRINT(RT_DEBUG_TRACE, ("!!!Infra LINK UP !!! \n"));
1165 } 1227 }
1166 1228
1167 // 3*3 1229 // 3*3
@@ -1172,8 +1234,8 @@ VOID LinkUp(
1172 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value); 1234 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value);
1173 1235
1174 // Change to AP channel 1236 // Change to AP channel
1175 if ((pAd->CommonCfg.CentralChannel > pAd->CommonCfg.Channel) && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40)) 1237 if ((pAd->CommonCfg.CentralChannel > pAd->CommonCfg.Channel)
1176 { 1238 && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40)) {
1177 // Must using 40MHz. 1239 // Must using 40MHz.
1178 pAd->CommonCfg.BBPCurrentBW = BW_40; 1240 pAd->CommonCfg.BBPCurrentBW = BW_40;
1179 AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE); 1241 AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
@@ -1189,29 +1251,30 @@ VOID LinkUp(
1189 Value &= (~0x20); 1251 Value &= (~0x20);
1190 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value); 1252 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
1191#ifdef RTMP_MAC_PCI 1253#ifdef RTMP_MAC_PCI
1192 pAd->StaCfg.BBPR3 = Value; 1254 pAd->StaCfg.BBPR3 = Value;
1193#endif // RTMP_MAC_PCI // 1255#endif // RTMP_MAC_PCI //
1194 1256
1195 RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data); 1257 RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data);
1196 Data &= 0xfffffffe; 1258 Data &= 0xfffffffe;
1197 RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data); 1259 RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data);
1198 1260
1199 if (pAd->MACVersion == 0x28600100) 1261 if (pAd->MACVersion == 0x28600100) {
1200 {
1201 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1A); 1262 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1A);
1202 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A); 1263 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A);
1203 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x16); 1264 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x16);
1204 DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" )); 1265 DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n"));
1205 } 1266 }
1206 1267
1207 DBGPRINT(RT_DEBUG_TRACE, ("!!!40MHz Lower LINK UP !!! Control Channel at Below. Central = %d \n", pAd->CommonCfg.CentralChannel )); 1268 DBGPRINT(RT_DEBUG_TRACE,
1208 } 1269 ("!!!40MHz Lower LINK UP !!! Control Channel at Below. Central = %d \n",
1209 else if ((pAd->CommonCfg.CentralChannel < pAd->CommonCfg.Channel) && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40)) 1270 pAd->CommonCfg.CentralChannel));
1210 { 1271 } else if ((pAd->CommonCfg.CentralChannel < pAd->CommonCfg.Channel)
1211 // Must using 40MHz. 1272 && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth ==
1273 BW_40)) {
1274 // Must using 40MHz.
1212 pAd->CommonCfg.BBPCurrentBW = BW_40; 1275 pAd->CommonCfg.BBPCurrentBW = BW_40;
1213 AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE); 1276 AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
1214 AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel); 1277 AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
1215 1278
1216 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value); 1279 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value);
1217 Value &= (~0x18); 1280 Value &= (~0x18);
@@ -1223,25 +1286,24 @@ VOID LinkUp(
1223 RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data); 1286 RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data);
1224 1287
1225 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value); 1288 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value);
1226 Value |= (0x20); 1289 Value |= (0x20);
1227 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value); 1290 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
1228#ifdef RTMP_MAC_PCI 1291#ifdef RTMP_MAC_PCI
1229 pAd->StaCfg.BBPR3 = Value; 1292 pAd->StaCfg.BBPR3 = Value;
1230#endif // RTMP_MAC_PCI // 1293#endif // RTMP_MAC_PCI //
1231 1294
1232 if (pAd->MACVersion == 0x28600100) 1295 if (pAd->MACVersion == 0x28600100) {
1233 {
1234 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1A); 1296 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1A);
1235 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A); 1297 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A);
1236 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x16); 1298 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x16);
1237 DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" )); 1299 DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n"));
1238 } 1300 }
1239 1301
1240 DBGPRINT(RT_DEBUG_TRACE, ("!!! 40MHz Upper LINK UP !!! Control Channel at UpperCentral = %d \n", pAd->CommonCfg.CentralChannel )); 1302 DBGPRINT(RT_DEBUG_TRACE,
1241 } 1303 ("!!! 40MHz Upper LINK UP !!! Control Channel at UpperCentral = %d \n",
1242 else 1304 pAd->CommonCfg.CentralChannel));
1243 { 1305 } else {
1244 pAd->CommonCfg.BBPCurrentBW = BW_20; 1306 pAd->CommonCfg.BBPCurrentBW = BW_20;
1245 pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel; 1307 pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;
1246 AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE); 1308 AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
1247 AsicLockChannel(pAd, pAd->CommonCfg.Channel); 1309 AsicLockChannel(pAd, pAd->CommonCfg.Channel);
@@ -1258,80 +1320,82 @@ VOID LinkUp(
1258 Value &= (~0x20); 1320 Value &= (~0x20);
1259 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value); 1321 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
1260#ifdef RTMP_MAC_PCI 1322#ifdef RTMP_MAC_PCI
1261 pAd->StaCfg.BBPR3 = Value; 1323 pAd->StaCfg.BBPR3 = Value;
1262#endif // RTMP_MAC_PCI // 1324#endif // RTMP_MAC_PCI //
1263 1325
1264 if (pAd->MACVersion == 0x28600100) 1326 if (pAd->MACVersion == 0x28600100) {
1265 {
1266 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16); 1327 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16);
1267 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x08); 1328 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x08);
1268 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x11); 1329 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x11);
1269 DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" )); 1330 DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n"));
1270 } 1331 }
1271 1332
1272 DBGPRINT(RT_DEBUG_TRACE, ("!!! 20MHz LINK UP !!! \n" )); 1333 DBGPRINT(RT_DEBUG_TRACE, ("!!! 20MHz LINK UP !!! \n"));
1273 } 1334 }
1274 1335
1275 RTMPSetAGCInitValue(pAd, pAd->CommonCfg.BBPCurrentBW); 1336 RTMPSetAGCInitValue(pAd, pAd->CommonCfg.BBPCurrentBW);
1276 1337
1277 // 1338 //
1278 // Save BBP_R66 value, it will be used in RTUSBResumeMsduTransmission 1339 // Save BBP_R66 value, it will be used in RTUSBResumeMsduTransmission
1279 // 1340 //
1280 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R66, &pAd->BbpTuning.R66CurrentValue); 1341 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R66,
1342 &pAd->BbpTuning.R66CurrentValue);
1281 1343
1282 DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK UP !!! (BssType=%d, AID=%d, ssid=%s, Channel=%d, CentralChannel = %d)\n", 1344 DBGPRINT(RT_DEBUG_TRACE,
1283 BssType, pAd->StaActive.Aid, pAd->CommonCfg.Ssid, pAd->CommonCfg.Channel, pAd->CommonCfg.CentralChannel)); 1345 ("!!! LINK UP !!! (BssType=%d, AID=%d, ssid=%s, Channel=%d, CentralChannel = %d)\n",
1346 BssType, pAd->StaActive.Aid, pAd->CommonCfg.Ssid,
1347 pAd->CommonCfg.Channel, pAd->CommonCfg.CentralChannel));
1284 1348
1285 DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK UP !!! (Density =%d, )\n", pAd->MacTab.Content[BSSID_WCID].MpduDensity)); 1349 DBGPRINT(RT_DEBUG_TRACE,
1350 ("!!! LINK UP !!! (Density =%d, )\n",
1351 pAd->MacTab.Content[BSSID_WCID].MpduDensity));
1286 1352
1287 AsicSetBssid(pAd, pAd->CommonCfg.Bssid); 1353 AsicSetBssid(pAd, pAd->CommonCfg.Bssid);
1288 1354
1289 AsicSetSlotTime(pAd, TRUE); 1355 AsicSetSlotTime(pAd, TRUE);
1290 AsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm); 1356 AsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm);
1291 1357
1292 // Call this for RTS protectionfor legacy rate, we will always enable RTS threshold, but normally it will not hit 1358 // Call this for RTS protectionfor legacy rate, we will always enable RTS threshold, but normally it will not hit
1293 AsicUpdateProtect(pAd, 0, (OFDMSETPROTECT | CCKSETPROTECT), TRUE, FALSE); 1359 AsicUpdateProtect(pAd, 0, (OFDMSETPROTECT | CCKSETPROTECT), TRUE,
1360 FALSE);
1294 1361
1295 if ((pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE)) 1362 if ((pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE)) {
1296 {
1297 // Update HT protectionfor based on AP's operating mode. 1363 // Update HT protectionfor based on AP's operating mode.
1298 if (pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent == 1) 1364 if (pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent == 1) {
1299 { 1365 AsicUpdateProtect(pAd,
1300 AsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode, ALLN_SETPROTECT, FALSE, TRUE); 1366 pAd->MlmeAux.AddHtInfo.AddHtInfo2.
1301 } 1367 OperaionMode, ALLN_SETPROTECT, FALSE,
1302 else 1368 TRUE);
1303 AsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode, ALLN_SETPROTECT, FALSE, FALSE); 1369 } else
1370 AsicUpdateProtect(pAd,
1371 pAd->MlmeAux.AddHtInfo.AddHtInfo2.
1372 OperaionMode, ALLN_SETPROTECT, FALSE,
1373 FALSE);
1304 } 1374 }
1305 1375
1306 NdisZeroMemory(&pAd->DrsCounters, sizeof(COUNTER_DRS)); 1376 NdisZeroMemory(&pAd->DrsCounters, sizeof(COUNTER_DRS));
1307 1377
1308 NdisGetSystemUpTime(&Now); 1378 NdisGetSystemUpTime(&Now);
1309 pAd->StaCfg.LastBeaconRxTime = Now; // last RX timestamp 1379 pAd->StaCfg.LastBeaconRxTime = Now; // last RX timestamp
1310 1380
1311 if ((pAd->CommonCfg.TxPreamble != Rt802_11PreambleLong) && 1381 if ((pAd->CommonCfg.TxPreamble != Rt802_11PreambleLong) &&
1312 CAP_IS_SHORT_PREAMBLE_ON(pAd->StaActive.CapabilityInfo)) 1382 CAP_IS_SHORT_PREAMBLE_ON(pAd->StaActive.CapabilityInfo)) {
1313 {
1314 MlmeSetTxPreamble(pAd, Rt802_11PreambleShort); 1383 MlmeSetTxPreamble(pAd, Rt802_11PreambleShort);
1315 } 1384 }
1316 1385
1317 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED); 1386 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED);
1318 1387
1319 if (pAd->CommonCfg.RadarDetect.RDMode == RD_SILENCE_MODE) 1388 if (pAd->CommonCfg.RadarDetect.RDMode == RD_SILENCE_MODE) {
1320 {
1321 } 1389 }
1322 pAd->CommonCfg.RadarDetect.RDMode = RD_NORMAL_MODE; 1390 pAd->CommonCfg.RadarDetect.RDMode = RD_NORMAL_MODE;
1323 1391
1324 if (BssType == BSS_ADHOC) 1392 if (BssType == BSS_ADHOC) {
1325 {
1326 MakeIbssBeacon(pAd); 1393 MakeIbssBeacon(pAd);
1327 if ((pAd->CommonCfg.Channel > 14) 1394 if ((pAd->CommonCfg.Channel > 14)
1328 && (pAd->CommonCfg.bIEEE80211H == 1) 1395 && (pAd->CommonCfg.bIEEE80211H == 1)
1329 && RadarChannelCheck(pAd, pAd->CommonCfg.Channel)) 1396 && RadarChannelCheck(pAd, pAd->CommonCfg.Channel)) {
1330 { 1397 ; //Do nothing
1331 ; //Do nothing 1398 } else {
1332 }
1333 else
1334 {
1335 AsicEnableIbssSync(pAd); 1399 AsicEnableIbssSync(pAd);
1336 } 1400 }
1337 1401
@@ -1343,82 +1407,92 @@ VOID LinkUp(
1343 // If WEP is enabled, add key material and cipherAlg into Asic 1407 // If WEP is enabled, add key material and cipherAlg into Asic
1344 // Fill in Shared Key Table(offset: 0x6c00) and Shared Key Mode(offset: 0x7000) 1408 // Fill in Shared Key Table(offset: 0x6c00) and Shared Key Mode(offset: 0x7000)
1345 1409
1346 if (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled) 1410 if (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled) {
1347 { 1411 PUCHAR Key;
1348 PUCHAR Key; 1412 UCHAR CipherAlg;
1349 UCHAR CipherAlg;
1350 1413
1351 for (idx=0; idx < SHARE_KEY_NUM; idx++) 1414 for (idx = 0; idx < SHARE_KEY_NUM; idx++) {
1352 {
1353 CipherAlg = pAd->SharedKey[BSS0][idx].CipherAlg; 1415 CipherAlg = pAd->SharedKey[BSS0][idx].CipherAlg;
1354 Key = pAd->SharedKey[BSS0][idx].Key; 1416 Key = pAd->SharedKey[BSS0][idx].Key;
1355 1417
1356 if (pAd->SharedKey[BSS0][idx].KeyLen > 0) 1418 if (pAd->SharedKey[BSS0][idx].KeyLen > 0) {
1357 {
1358 // Set key material and cipherAlg to Asic 1419 // Set key material and cipherAlg to Asic
1359 AsicAddSharedKeyEntry(pAd, BSS0, idx, CipherAlg, Key, NULL, NULL); 1420 AsicAddSharedKeyEntry(pAd, BSS0, idx,
1421 CipherAlg, Key,
1422 NULL, NULL);
1360 1423
1361 if (idx == pAd->StaCfg.DefaultKeyId) 1424 if (idx == pAd->StaCfg.DefaultKeyId) {
1362 {
1363 // Update WCID attribute table and IVEIV table for this group key table 1425 // Update WCID attribute table and IVEIV table for this group key table
1364 RTMPAddWcidAttributeEntry(pAd, BSS0, idx, CipherAlg, NULL); 1426 RTMPAddWcidAttributeEntry(pAd,
1427 BSS0,
1428 idx,
1429 CipherAlg,
1430 NULL);
1365 } 1431 }
1366 } 1432 }
1367 1433
1368
1369 } 1434 }
1370 } 1435 }
1371 // If WPANone is enabled, add key material and cipherAlg into Asic 1436 // If WPANone is enabled, add key material and cipherAlg into Asic
1372 // Fill in Shared Key Table(offset: 0x6c00) and Shared Key Mode(offset: 0x7000) 1437 // Fill in Shared Key Table(offset: 0x6c00) and Shared Key Mode(offset: 0x7000)
1373 else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone) 1438 else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone) {
1374 {
1375 pAd->StaCfg.DefaultKeyId = 0; // always be zero 1439 pAd->StaCfg.DefaultKeyId = 0; // always be zero
1376 1440
1377 NdisZeroMemory(&pAd->SharedKey[BSS0][0], sizeof(CIPHER_KEY)); 1441 NdisZeroMemory(&pAd->SharedKey[BSS0][0],
1378 pAd->SharedKey[BSS0][0].KeyLen = LEN_TKIP_EK; 1442 sizeof(CIPHER_KEY));
1379 NdisMoveMemory(pAd->SharedKey[BSS0][0].Key, pAd->StaCfg.PMK, LEN_TKIP_EK); 1443 pAd->SharedKey[BSS0][0].KeyLen = LEN_TKIP_EK;
1380 1444 NdisMoveMemory(pAd->SharedKey[BSS0][0].Key,
1381 if (pAd->StaCfg.PairCipher == Ndis802_11Encryption2Enabled) 1445 pAd->StaCfg.PMK, LEN_TKIP_EK);
1382 { 1446
1383 NdisMoveMemory(pAd->SharedKey[BSS0][0].RxMic, &pAd->StaCfg.PMK[16], LEN_TKIP_RXMICK); 1447 if (pAd->StaCfg.PairCipher ==
1384 NdisMoveMemory(pAd->SharedKey[BSS0][0].TxMic, &pAd->StaCfg.PMK[16], LEN_TKIP_TXMICK); 1448 Ndis802_11Encryption2Enabled) {
1385 } 1449 NdisMoveMemory(pAd->SharedKey[BSS0][0].RxMic,
1386 1450 &pAd->StaCfg.PMK[16],
1451 LEN_TKIP_RXMICK);
1452 NdisMoveMemory(pAd->SharedKey[BSS0][0].TxMic,
1453 &pAd->StaCfg.PMK[16],
1454 LEN_TKIP_TXMICK);
1455 }
1387 // Decide its ChiperAlg 1456 // Decide its ChiperAlg
1388 if (pAd->StaCfg.PairCipher == Ndis802_11Encryption2Enabled) 1457 if (pAd->StaCfg.PairCipher ==
1458 Ndis802_11Encryption2Enabled)
1389 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_TKIP; 1459 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_TKIP;
1390 else if (pAd->StaCfg.PairCipher == Ndis802_11Encryption3Enabled) 1460 else if (pAd->StaCfg.PairCipher ==
1461 Ndis802_11Encryption3Enabled)
1391 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_AES; 1462 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_AES;
1392 else 1463 else {
1393 { 1464 DBGPRINT(RT_DEBUG_TRACE,
1394 DBGPRINT(RT_DEBUG_TRACE, ("Unknow Cipher (=%d), set Cipher to AES\n", pAd->StaCfg.PairCipher)); 1465 ("Unknow Cipher (=%d), set Cipher to AES\n",
1466 pAd->StaCfg.PairCipher));
1395 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_AES; 1467 pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_AES;
1396 } 1468 }
1397 1469
1398 // Set key material and cipherAlg to Asic 1470 // Set key material and cipherAlg to Asic
1399 AsicAddSharedKeyEntry(pAd, 1471 AsicAddSharedKeyEntry(pAd,
1400 BSS0, 1472 BSS0,
1401 0, 1473 0,
1402 pAd->SharedKey[BSS0][0].CipherAlg, 1474 pAd->SharedKey[BSS0][0].CipherAlg,
1403 pAd->SharedKey[BSS0][0].Key, 1475 pAd->SharedKey[BSS0][0].Key,
1404 pAd->SharedKey[BSS0][0].TxMic, 1476 pAd->SharedKey[BSS0][0].TxMic,
1405 pAd->SharedKey[BSS0][0].RxMic); 1477 pAd->SharedKey[BSS0][0].RxMic);
1406 1478
1407 // Update WCID attribute table and IVEIV table for this group key table 1479 // Update WCID attribute table and IVEIV table for this group key table
1408 RTMPAddWcidAttributeEntry(pAd, BSS0, 0, pAd->SharedKey[BSS0][0].CipherAlg, NULL); 1480 RTMPAddWcidAttributeEntry(pAd, BSS0, 0,
1481 pAd->SharedKey[BSS0][0].
1482 CipherAlg, NULL);
1409 1483
1410 } 1484 }
1411 1485
1412 } 1486 } else // BSS_INFRA
1413 else // BSS_INFRA
1414 { 1487 {
1415 // Check the new SSID with last SSID 1488 // Check the new SSID with last SSID
1416 while (Cancelled == TRUE) 1489 while (Cancelled == TRUE) {
1417 { 1490 if (pAd->CommonCfg.LastSsidLen ==
1418 if (pAd->CommonCfg.LastSsidLen == pAd->CommonCfg.SsidLen) 1491 pAd->CommonCfg.SsidLen) {
1419 { 1492 if (RTMPCompareMemory
1420 if (RTMPCompareMemory(pAd->CommonCfg.LastSsid, pAd->CommonCfg.Ssid, pAd->CommonCfg.LastSsidLen) == 0) 1493 (pAd->CommonCfg.LastSsid,
1421 { 1494 pAd->CommonCfg.Ssid,
1495 pAd->CommonCfg.LastSsidLen) == 0) {
1422 // Link to the old one no linkdown is required. 1496 // Link to the old one no linkdown is required.
1423 break; 1497 break;
1424 } 1498 }
@@ -1426,8 +1500,9 @@ VOID LinkUp(
1426 // Send link down event before set to link up 1500 // Send link down event before set to link up
1427 pAd->IndicateMediaState = NdisMediaStateDisconnected; 1501 pAd->IndicateMediaState = NdisMediaStateDisconnected;
1428 RTMP_IndicateMediaState(pAd); 1502 RTMP_IndicateMediaState(pAd);
1429 pAd->ExtraInfo = GENERAL_LINK_DOWN; 1503 pAd->ExtraInfo = GENERAL_LINK_DOWN;
1430 DBGPRINT(RT_DEBUG_TRACE, ("NDIS_STATUS_MEDIA_DISCONNECT Event AA!\n")); 1504 DBGPRINT(RT_DEBUG_TRACE,
1505 ("NDIS_STATUS_MEDIA_DISCONNECT Event AA!\n"));
1431 break; 1506 break;
1432 } 1507 }
1433 1508
@@ -1435,15 +1510,15 @@ VOID LinkUp(
1435 // On WPA mode, Remove All Keys if not connect to the last BSSID 1510 // On WPA mode, Remove All Keys if not connect to the last BSSID
1436 // Key will be set after 4-way handshake. 1511 // Key will be set after 4-way handshake.
1437 // 1512 //
1438 if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) 1513 if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) {
1439 { 1514 ULONG IV;
1440 ULONG IV;
1441 1515
1442 // Remove all WPA keys 1516 // Remove all WPA keys
1443 RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP); 1517 RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
1444 RTMPWPARemoveAllKeys(pAd); 1518 RTMPWPARemoveAllKeys(pAd);
1445 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED; 1519 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
1446 pAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilter8021xWEP; 1520 pAd->StaCfg.PrivacyFilter =
1521 Ndis802_11PrivFilter8021xWEP;
1447 1522
1448 // Fixed connection failed with Range Maximizer - 515 AP (Marvell Chip) when security is WPAPSK/TKIP 1523 // Fixed connection failed with Range Maximizer - 515 AP (Marvell Chip) when security is WPAPSK/TKIP
1449 // If IV related values are too large in GroupMsg2, AP would ignore this message. 1524 // If IV related values are too large in GroupMsg2, AP would ignore this message.
@@ -1451,7 +1526,6 @@ VOID LinkUp(
1451 IV |= (pAd->StaCfg.DefaultKeyId << 30); 1526 IV |= (pAd->StaCfg.DefaultKeyId << 30);
1452 AsicUpdateWCIDIVEIV(pAd, BSSID_WCID, IV, 0); 1527 AsicUpdateWCIDIVEIV(pAd, BSSID_WCID, IV, 0);
1453 } 1528 }
1454
1455 // NOTE: 1529 // NOTE:
1456 // the decision of using "short slot time" or not may change dynamically due to 1530 // the decision of using "short slot time" or not may change dynamically due to
1457 // new STA association to the AP. so we have to decide that upon parsing BEACON, not here 1531 // new STA association to the AP. so we have to decide that upon parsing BEACON, not here
@@ -1463,84 +1537,85 @@ VOID LinkUp(
1463 ComposePsPoll(pAd); 1537 ComposePsPoll(pAd);
1464 ComposeNullFrame(pAd); 1538 ComposeNullFrame(pAd);
1465 1539
1466 AsicEnableBssSync(pAd); 1540 AsicEnableBssSync(pAd);
1467 1541
1468 // Add BSSID to WCID search table 1542 // Add BSSID to WCID search table
1469 AsicUpdateRxWCIDTable(pAd, BSSID_WCID, pAd->CommonCfg.Bssid); 1543 AsicUpdateRxWCIDTable(pAd, BSSID_WCID, pAd->CommonCfg.Bssid);
1470 1544
1471 // If WEP is enabled, add paiewise and shared key 1545 // If WEP is enabled, add paiewise and shared key
1472 if (((pAd->StaCfg.WpaSupplicantUP)&& 1546 if (((pAd->StaCfg.WpaSupplicantUP) &&
1473 (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled)&& 1547 (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled) &&
1474 (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_SECURED)) || 1548 (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_SECURED)) ||
1475 ((pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_DISABLE)&& 1549 ((pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_DISABLE) &&
1476 (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled))) 1550 (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled))) {
1477 { 1551 PUCHAR Key;
1478 PUCHAR Key; 1552 UCHAR CipherAlg;
1479 UCHAR CipherAlg; 1553
1480 1554 for (idx = 0; idx < SHARE_KEY_NUM; idx++) {
1481 for (idx=0; idx < SHARE_KEY_NUM; idx++)
1482 {
1483 CipherAlg = pAd->SharedKey[BSS0][idx].CipherAlg; 1555 CipherAlg = pAd->SharedKey[BSS0][idx].CipherAlg;
1484 Key = pAd->SharedKey[BSS0][idx].Key; 1556 Key = pAd->SharedKey[BSS0][idx].Key;
1485 1557
1486 if (pAd->SharedKey[BSS0][idx].KeyLen > 0) 1558 if (pAd->SharedKey[BSS0][idx].KeyLen > 0) {
1487 {
1488 // Set key material and cipherAlg to Asic 1559 // Set key material and cipherAlg to Asic
1489 AsicAddSharedKeyEntry(pAd, BSS0, idx, CipherAlg, Key, NULL, NULL); 1560 AsicAddSharedKeyEntry(pAd, BSS0, idx,
1561 CipherAlg, Key,
1562 NULL, NULL);
1490 1563
1491 if (idx == pAd->StaCfg.DefaultKeyId) 1564 if (idx == pAd->StaCfg.DefaultKeyId) {
1492 {
1493 // Assign group key info 1565 // Assign group key info
1494 RTMPAddWcidAttributeEntry(pAd, BSS0, idx, CipherAlg, NULL); 1566 RTMPAddWcidAttributeEntry(pAd,
1567 BSS0,
1568 idx,
1569 CipherAlg,
1570 NULL);
1495 1571
1496 pEntry->Aid = BSSID_WCID; 1572 pEntry->Aid = BSSID_WCID;
1497 // Assign pairwise key info 1573 // Assign pairwise key info
1498 RTMPAddWcidAttributeEntry(pAd, BSS0, idx, CipherAlg, pEntry); 1574 RTMPAddWcidAttributeEntry(pAd,
1575 BSS0,
1576 idx,
1577 CipherAlg,
1578 pEntry);
1499 } 1579 }
1500 } 1580 }
1501 } 1581 }
1502 } 1582 }
1503
1504 // only INFRASTRUCTURE mode need to indicate connectivity immediately; ADHOC mode 1583 // only INFRASTRUCTURE mode need to indicate connectivity immediately; ADHOC mode
1505 // should wait until at least 2 active nodes in this BSSID. 1584 // should wait until at least 2 active nodes in this BSSID.
1506 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); 1585 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);
1507 1586
1508 // For GUI ++ 1587 // For GUI ++
1509 if (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA) 1588 if (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA) {
1510 {
1511 pAd->IndicateMediaState = NdisMediaStateConnected; 1589 pAd->IndicateMediaState = NdisMediaStateConnected;
1512 pAd->ExtraInfo = GENERAL_LINK_UP; 1590 pAd->ExtraInfo = GENERAL_LINK_UP;
1513 RTMP_IndicateMediaState(pAd); 1591 RTMP_IndicateMediaState(pAd);
1514 } 1592 } else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
1515 else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) || 1593 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK))
1516 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK))
1517 { 1594 {
1518 if (pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_DISABLE) 1595 if (pAd->StaCfg.WpaSupplicantUP ==
1519 RTMPSetTimer(&pAd->Mlme.LinkDownTimer, LINK_DOWN_TIMEOUT); 1596 WPA_SUPPLICANT_DISABLE)
1597 RTMPSetTimer(&pAd->Mlme.LinkDownTimer,
1598 LINK_DOWN_TIMEOUT);
1520 } 1599 }
1521 // -- 1600 // --
1522 1601
1523 // Add BSSID in my MAC Table. 1602 // Add BSSID in my MAC Table.
1524 NdisAcquireSpinLock(&pAd->MacTabLock); 1603 NdisAcquireSpinLock(&pAd->MacTabLock);
1525 // add this MAC entry into HASH table 1604 // add this MAC entry into HASH table
1526 if (pEntry) 1605 if (pEntry) {
1527 {
1528 HashIdx = MAC_ADDR_HASH_INDEX(pAd->CommonCfg.Bssid); 1606 HashIdx = MAC_ADDR_HASH_INDEX(pAd->CommonCfg.Bssid);
1529 if (pAd->MacTab.Hash[HashIdx] == NULL) 1607 if (pAd->MacTab.Hash[HashIdx] == NULL) {
1530 {
1531 pAd->MacTab.Hash[HashIdx] = pEntry; 1608 pAd->MacTab.Hash[HashIdx] = pEntry;
1532 } 1609 } else {
1533 else
1534 {
1535 pCurrEntry = pAd->MacTab.Hash[HashIdx]; 1610 pCurrEntry = pAd->MacTab.Hash[HashIdx];
1536 while (pCurrEntry->pNext != NULL) 1611 while (pCurrEntry->pNext != NULL) {
1537 {
1538 pCurrEntry = pCurrEntry->pNext; 1612 pCurrEntry = pCurrEntry->pNext;
1539 } 1613 }
1540 pCurrEntry->pNext = pEntry; 1614 pCurrEntry->pNext = pEntry;
1541 } 1615 }
1542 } 1616 }
1543 RTMPMoveMemory(pEntry->Addr, pAd->CommonCfg.Bssid, MAC_ADDR_LEN); 1617 RTMPMoveMemory(pEntry->Addr, pAd->CommonCfg.Bssid,
1618 MAC_ADDR_LEN);
1544 pEntry->Aid = BSSID_WCID; 1619 pEntry->Aid = BSSID_WCID;
1545 pEntry->pAd = pAd; 1620 pEntry->pAd = pAd;
1546 pEntry->ValidAsCLI = TRUE; //Although this is bssid..still set ValidAsCl 1621 pEntry->ValidAsCLI = TRUE; //Although this is bssid..still set ValidAsCl
@@ -1549,130 +1624,132 @@ VOID LinkUp(
1549 pEntry->AuthState = SST_ASSOC; 1624 pEntry->AuthState = SST_ASSOC;
1550 pEntry->AuthMode = pAd->StaCfg.AuthMode; 1625 pEntry->AuthMode = pAd->StaCfg.AuthMode;
1551 pEntry->WepStatus = pAd->StaCfg.WepStatus; 1626 pEntry->WepStatus = pAd->StaCfg.WepStatus;
1552 if (pEntry->AuthMode < Ndis802_11AuthModeWPA) 1627 if (pEntry->AuthMode < Ndis802_11AuthModeWPA) {
1553 {
1554 pEntry->WpaState = AS_NOTUSE; 1628 pEntry->WpaState = AS_NOTUSE;
1555 pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll; 1629 pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll;
1556 } 1630 } else {
1557 else
1558 {
1559 pEntry->WpaState = AS_PTKSTART; 1631 pEntry->WpaState = AS_PTKSTART;
1560 pEntry->PrivacyFilter = Ndis802_11PrivFilter8021xWEP; 1632 pEntry->PrivacyFilter = Ndis802_11PrivFilter8021xWEP;
1561 } 1633 }
1562 NdisReleaseSpinLock(&pAd->MacTabLock); 1634 NdisReleaseSpinLock(&pAd->MacTabLock);
1563 1635
1564 DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK UP !!! ClientStatusFlags=%lx)\n", 1636 DBGPRINT(RT_DEBUG_TRACE,
1565 pAd->MacTab.Content[BSSID_WCID].ClientStatusFlags)); 1637 ("!!! LINK UP !!! ClientStatusFlags=%lx)\n",
1638 pAd->MacTab.Content[BSSID_WCID].ClientStatusFlags));
1566 1639
1567 MlmeUpdateTxRates(pAd, TRUE, BSS0); 1640 MlmeUpdateTxRates(pAd, TRUE, BSS0);
1568 MlmeUpdateHtTxRates(pAd, BSS0); 1641 MlmeUpdateHtTxRates(pAd, BSS0);
1569 DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK UP !! (StaActive.bHtEnable =%d, )\n", pAd->StaActive.SupportedPhyInfo.bHtEnable)); 1642 DBGPRINT(RT_DEBUG_TRACE,
1570 1643 ("!!! LINK UP !! (StaActive.bHtEnable =%d, )\n",
1571 if (pAd->CommonCfg.bAggregationCapable) 1644 pAd->StaActive.SupportedPhyInfo.bHtEnable));
1572 { 1645
1573 if ((pAd->CommonCfg.bPiggyBackCapable) && (pAd->MlmeAux.APRalinkIe & 0x00000003) == 3) 1646 if (pAd->CommonCfg.bAggregationCapable) {
1574 { 1647 if ((pAd->CommonCfg.bPiggyBackCapable)
1575 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_PIGGYBACK_INUSED); 1648 && (pAd->MlmeAux.APRalinkIe & 0x00000003) == 3) {
1576 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED); 1649 OPSTATUS_SET_FLAG(pAd,
1577 CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_AGGREGATION_CAPABLE); 1650 fOP_STATUS_PIGGYBACK_INUSED);
1578 CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_PIGGYBACK_CAPABLE); 1651 OPSTATUS_SET_FLAG(pAd,
1579 RTMPSetPiggyBack(pAd, TRUE); 1652 fOP_STATUS_AGGREGATION_INUSED);
1580 DBGPRINT(RT_DEBUG_TRACE, ("Turn on Piggy-Back\n")); 1653 CLIENT_STATUS_SET_FLAG(pEntry,
1581 } 1654 fCLIENT_STATUS_AGGREGATION_CAPABLE);
1582 else if (pAd->MlmeAux.APRalinkIe & 0x00000001) 1655 CLIENT_STATUS_SET_FLAG(pEntry,
1583 { 1656 fCLIENT_STATUS_PIGGYBACK_CAPABLE);
1584 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED); 1657 RTMPSetPiggyBack(pAd, TRUE);
1585 CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_AGGREGATION_CAPABLE); 1658 DBGPRINT(RT_DEBUG_TRACE,
1586 DBGPRINT(RT_DEBUG_TRACE, ("Ralink Aggregation\n")); 1659 ("Turn on Piggy-Back\n"));
1660 } else if (pAd->MlmeAux.APRalinkIe & 0x00000001) {
1661 OPSTATUS_SET_FLAG(pAd,
1662 fOP_STATUS_AGGREGATION_INUSED);
1663 CLIENT_STATUS_SET_FLAG(pEntry,
1664 fCLIENT_STATUS_AGGREGATION_CAPABLE);
1665 DBGPRINT(RT_DEBUG_TRACE,
1666 ("Ralink Aggregation\n"));
1587 } 1667 }
1588 } 1668 }
1589 1669
1590 if (pAd->MlmeAux.APRalinkIe != 0x0) 1670 if (pAd->MlmeAux.APRalinkIe != 0x0) {
1591 { 1671 if (CLIENT_STATUS_TEST_FLAG
1592 if (CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_RDG_CAPABLE)) 1672 (pEntry, fCLIENT_STATUS_RDG_CAPABLE)) {
1593 {
1594 AsicEnableRDG(pAd); 1673 AsicEnableRDG(pAd);
1595 } 1674 }
1596 OPSTATUS_SET_FLAG(pAd, fCLIENT_STATUS_RALINK_CHIPSET); 1675 OPSTATUS_SET_FLAG(pAd, fCLIENT_STATUS_RALINK_CHIPSET);
1597 CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RALINK_CHIPSET); 1676 CLIENT_STATUS_SET_FLAG(pEntry,
1598 } 1677 fCLIENT_STATUS_RALINK_CHIPSET);
1599 else 1678 } else {
1600 {
1601 OPSTATUS_CLEAR_FLAG(pAd, fCLIENT_STATUS_RALINK_CHIPSET); 1679 OPSTATUS_CLEAR_FLAG(pAd, fCLIENT_STATUS_RALINK_CHIPSET);
1602 CLIENT_STATUS_CLEAR_FLAG(pEntry, fCLIENT_STATUS_RALINK_CHIPSET); 1680 CLIENT_STATUS_CLEAR_FLAG(pEntry,
1681 fCLIENT_STATUS_RALINK_CHIPSET);
1603 } 1682 }
1604 } 1683 }
1605 1684
1606 DBGPRINT(RT_DEBUG_TRACE, ("NDIS_STATUS_MEDIA_CONNECT Event B!.BACapability = %x. ClientStatusFlags = %lx\n", pAd->CommonCfg.BACapability.word, pAd->MacTab.Content[BSSID_WCID].ClientStatusFlags)); 1685 DBGPRINT(RT_DEBUG_TRACE,
1686 ("NDIS_STATUS_MEDIA_CONNECT Event B!.BACapability = %x. ClientStatusFlags = %lx\n",
1687 pAd->CommonCfg.BACapability.word,
1688 pAd->MacTab.Content[BSSID_WCID].ClientStatusFlags));
1607 1689
1608 // Set LED 1690 // Set LED
1609 RTMPSetLED(pAd, LED_LINK_UP); 1691 RTMPSetLED(pAd, LED_LINK_UP);
1610 1692
1611 pAd->Mlme.PeriodicRound = 0; 1693 pAd->Mlme.PeriodicRound = 0;
1612 pAd->Mlme.OneSecPeriodicRound = 0; 1694 pAd->Mlme.OneSecPeriodicRound = 0;
1613 pAd->bConfigChanged = FALSE; // Reset config flag 1695 pAd->bConfigChanged = FALSE; // Reset config flag
1614 pAd->ExtraInfo = GENERAL_LINK_UP; // Update extra information to link is up 1696 pAd->ExtraInfo = GENERAL_LINK_UP; // Update extra information to link is up
1615 1697
1616 // Set asic auto fall back 1698 // Set asic auto fall back
1617 { 1699 {
1618 PUCHAR pTable; 1700 PUCHAR pTable;
1619 UCHAR TableSize = 0; 1701 UCHAR TableSize = 0;
1620 1702
1621 MlmeSelectTxRateTable(pAd, &pAd->MacTab.Content[BSSID_WCID], &pTable, &TableSize, &pAd->CommonCfg.TxRateIndex); 1703 MlmeSelectTxRateTable(pAd, &pAd->MacTab.Content[BSSID_WCID],
1704 &pTable, &TableSize,
1705 &pAd->CommonCfg.TxRateIndex);
1622 AsicUpdateAutoFallBackTable(pAd, pTable); 1706 AsicUpdateAutoFallBackTable(pAd, pTable);
1623 } 1707 }
1624 1708
1625 NdisAcquireSpinLock(&pAd->MacTabLock); 1709 NdisAcquireSpinLock(&pAd->MacTabLock);
1626 pEntry->HTPhyMode.word = pAd->StaCfg.HTPhyMode.word; 1710 pEntry->HTPhyMode.word = pAd->StaCfg.HTPhyMode.word;
1627 pEntry->MaxHTPhyMode.word = pAd->StaCfg.HTPhyMode.word; 1711 pEntry->MaxHTPhyMode.word = pAd->StaCfg.HTPhyMode.word;
1628 if (pAd->StaCfg.bAutoTxRateSwitch == FALSE) 1712 if (pAd->StaCfg.bAutoTxRateSwitch == FALSE) {
1629 {
1630 pEntry->bAutoTxRateSwitch = FALSE; 1713 pEntry->bAutoTxRateSwitch = FALSE;
1631 1714
1632 if (pEntry->HTPhyMode.field.MCS == 32) 1715 if (pEntry->HTPhyMode.field.MCS == 32)
1633 pEntry->HTPhyMode.field.ShortGI = GI_800; 1716 pEntry->HTPhyMode.field.ShortGI = GI_800;
1634 1717
1635 if ((pEntry->HTPhyMode.field.MCS > MCS_7) || (pEntry->HTPhyMode.field.MCS == 32)) 1718 if ((pEntry->HTPhyMode.field.MCS > MCS_7)
1719 || (pEntry->HTPhyMode.field.MCS == 32))
1636 pEntry->HTPhyMode.field.STBC = STBC_NONE; 1720 pEntry->HTPhyMode.field.STBC = STBC_NONE;
1637 1721
1638 // If the legacy mode is set, overwrite the transmit setting of this entry. 1722 // If the legacy mode is set, overwrite the transmit setting of this entry.
1639 if (pEntry->HTPhyMode.field.MODE <= MODE_OFDM) 1723 if (pEntry->HTPhyMode.field.MODE <= MODE_OFDM)
1640 RTMPUpdateLegacyTxSetting((UCHAR)pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode, pEntry); 1724 RTMPUpdateLegacyTxSetting((UCHAR) pAd->StaCfg.
1641 } 1725 DesiredTransmitSetting.field.
1642 else 1726 FixedTxMode, pEntry);
1727 } else
1643 pEntry->bAutoTxRateSwitch = TRUE; 1728 pEntry->bAutoTxRateSwitch = TRUE;
1644 NdisReleaseSpinLock(&pAd->MacTabLock); 1729 NdisReleaseSpinLock(&pAd->MacTabLock);
1645 1730
1646 // Let Link Status Page display first initial rate. 1731 // Let Link Status Page display first initial rate.
1647 pAd->LastTxRate = (USHORT)(pEntry->HTPhyMode.word); 1732 pAd->LastTxRate = (USHORT) (pEntry->HTPhyMode.word);
1648 // Select DAC according to HT or Legacy 1733 // Select DAC according to HT or Legacy
1649 if (pAd->StaActive.SupportedPhyInfo.MCSSet[0] != 0x00) 1734 if (pAd->StaActive.SupportedPhyInfo.MCSSet[0] != 0x00) {
1650 {
1651 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &Value); 1735 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &Value);
1652 Value &= (~0x18); 1736 Value &= (~0x18);
1653 if (pAd->Antenna.field.TxPath == 2) 1737 if (pAd->Antenna.field.TxPath == 2) {
1654 { 1738 Value |= 0x10;
1655 Value |= 0x10;
1656 } 1739 }
1657 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, Value); 1740 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, Value);
1658 } 1741 } else {
1659 else
1660 {
1661 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &Value); 1742 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &Value);
1662 Value &= (~0x18); 1743 Value &= (~0x18);
1663 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, Value); 1744 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, Value);
1664 } 1745 }
1665 1746
1666 if (pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE) 1747 if (pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE) {
1667 { 1748 } else if (pEntry->MaxRAmpduFactor == 0) {
1668 } 1749 // If HT AP doesn't support MaxRAmpduFactor = 1, we need to set max PSDU to 0.
1669 else if (pEntry->MaxRAmpduFactor == 0) 1750 // Because our Init value is 1 at MACRegTable.
1670 {
1671 // If HT AP doesn't support MaxRAmpduFactor = 1, we need to set max PSDU to 0.
1672 // Because our Init value is 1 at MACRegTable.
1673 RTMP_IO_WRITE32(pAd, MAX_LEN_CFG, 0x0fff); 1751 RTMP_IO_WRITE32(pAd, MAX_LEN_CFG, 0x0fff);
1674 } 1752 }
1675
1676 // Patch for Marvel AP to gain high throughput 1753 // Patch for Marvel AP to gain high throughput
1677 // Need to set as following, 1754 // Need to set as following,
1678 // 1. Set txop in register-EDCA_AC0_CFG as 0x60 1755 // 1. Set txop in register-EDCA_AC0_CFG as 0x60
@@ -1683,34 +1760,31 @@ VOID LinkUp(
1683 // Txop can only be modified when RDG is off, WMM is disable and TxBurst is enable 1760 // Txop can only be modified when RDG is off, WMM is disable and TxBurst is enable
1684 // 1761 //
1685 // if 1. Legacy AP WMM on, or 2. 11n AP, AMPDU disable. Force turn off burst no matter what bEnableTxBurst is. 1762 // if 1. Legacy AP WMM on, or 2. 11n AP, AMPDU disable. Force turn off burst no matter what bEnableTxBurst is.
1686 if (!((pAd->CommonCfg.RxStream == 1)&&(pAd->CommonCfg.TxStream == 1)) && 1763 if (!((pAd->CommonCfg.RxStream == 1) && (pAd->CommonCfg.TxStream == 1))
1687 (pAd->StaCfg.bForceTxBurst == FALSE) && 1764 && (pAd->StaCfg.bForceTxBurst == FALSE)
1688 (((pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED)) 1765 &&
1689 || ((pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE) && (pAd->CommonCfg.BACapability.field.Policy == BA_NOTUSE)))) 1766 (((pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE)
1690 { 1767 && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED))
1768 || ((pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE)
1769 && (pAd->CommonCfg.BACapability.field.Policy == BA_NOTUSE)))) {
1691 RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data); 1770 RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data);
1692 Data &= 0xFFFFFF00; 1771 Data &= 0xFFFFFF00;
1693 RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data); 1772 RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data);
1694 1773
1695 RTMP_IO_WRITE32(pAd, PBF_MAX_PCNT, 0x1F3F7F9F); 1774 RTMP_IO_WRITE32(pAd, PBF_MAX_PCNT, 0x1F3F7F9F);
1696 DBGPRINT(RT_DEBUG_TRACE, ("Txburst 1\n")); 1775 DBGPRINT(RT_DEBUG_TRACE, ("Txburst 1\n"));
1697 } 1776 } else if (pAd->CommonCfg.bEnableTxBurst) {
1698 else
1699 if (pAd->CommonCfg.bEnableTxBurst)
1700 {
1701 RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data); 1777 RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data);
1702 Data &= 0xFFFFFF00; 1778 Data &= 0xFFFFFF00;
1703 Data |= 0x60; 1779 Data |= 0x60;
1704 RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data); 1780 RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data);
1705 pAd->CommonCfg.IOTestParm.bNowAtherosBurstOn = TRUE; 1781 pAd->CommonCfg.IOTestParm.bNowAtherosBurstOn = TRUE;
1706 1782
1707 RTMP_IO_WRITE32(pAd, PBF_MAX_PCNT, 0x1F3FBF9F); 1783 RTMP_IO_WRITE32(pAd, PBF_MAX_PCNT, 0x1F3FBF9F);
1708 DBGPRINT(RT_DEBUG_TRACE, ("Txburst 2\n")); 1784 DBGPRINT(RT_DEBUG_TRACE, ("Txburst 2\n"));
1709 } 1785 } else {
1710 else
1711 {
1712 RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data); 1786 RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data);
1713 Data &= 0xFFFFFF00; 1787 Data &= 0xFFFFFF00;
1714 RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data); 1788 RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data);
1715 1789
1716 RTMP_IO_WRITE32(pAd, PBF_MAX_PCNT, 0x1F3F7F9F); 1790 RTMP_IO_WRITE32(pAd, PBF_MAX_PCNT, 0x1F3F7F9F);
@@ -1718,59 +1792,54 @@ VOID LinkUp(
1718 } 1792 }
1719 1793
1720 // Re-check to turn on TX burst or not. 1794 // Re-check to turn on TX burst or not.
1721 if ((pAd->CommonCfg.IOTestParm.bLastAtheros == TRUE) && ((STA_WEP_ON(pAd))||(STA_TKIP_ON(pAd)))) 1795 if ((pAd->CommonCfg.IOTestParm.bLastAtheros == TRUE)
1722 { 1796 && ((STA_WEP_ON(pAd)) || (STA_TKIP_ON(pAd)))) {
1723 pAd->CommonCfg.IOTestParm.bNextDisableRxBA = TRUE; 1797 pAd->CommonCfg.IOTestParm.bNextDisableRxBA = TRUE;
1724 if (pAd->CommonCfg.bEnableTxBurst) 1798 if (pAd->CommonCfg.bEnableTxBurst) {
1725 { 1799 UINT32 MACValue = 0;
1726 UINT32 MACValue = 0;
1727 // Force disable TXOP value in this case. The same action in MLMEUpdateProtect too. 1800 // Force disable TXOP value in this case. The same action in MLMEUpdateProtect too.
1728 // I didn't change PBF_MAX_PCNT setting. 1801 // I didn't change PBF_MAX_PCNT setting.
1729 RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &MACValue); 1802 RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &MACValue);
1730 MACValue &= 0xFFFFFF00; 1803 MACValue &= 0xFFFFFF00;
1731 RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, MACValue); 1804 RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, MACValue);
1732 pAd->CommonCfg.IOTestParm.bNowAtherosBurstOn = FALSE; 1805 pAd->CommonCfg.IOTestParm.bNowAtherosBurstOn = FALSE;
1733 } 1806 }
1734 } 1807 } else {
1735 else
1736 {
1737 pAd->CommonCfg.IOTestParm.bNextDisableRxBA = FALSE; 1808 pAd->CommonCfg.IOTestParm.bNextDisableRxBA = FALSE;
1738 } 1809 }
1739 1810
1740 pAd->CommonCfg.IOTestParm.bLastAtheros = FALSE; 1811 pAd->CommonCfg.IOTestParm.bLastAtheros = FALSE;
1741 COPY_MAC_ADDR(pAd->CommonCfg.LastBssid, pAd->CommonCfg.Bssid); 1812 COPY_MAC_ADDR(pAd->CommonCfg.LastBssid, pAd->CommonCfg.Bssid);
1742 DBGPRINT(RT_DEBUG_TRACE, ("!!!pAd->bNextDisableRxBA= %d \n", pAd->CommonCfg.IOTestParm.bNextDisableRxBA)); 1813 DBGPRINT(RT_DEBUG_TRACE,
1814 ("!!!pAd->bNextDisableRxBA= %d \n",
1815 pAd->CommonCfg.IOTestParm.bNextDisableRxBA));
1743 // BSSID add in one MAC entry too. Because in Tx, ASIC need to check Cipher and IV/EIV, BAbitmap 1816 // BSSID add in one MAC entry too. Because in Tx, ASIC need to check Cipher and IV/EIV, BAbitmap
1744 // Pther information in MACTab.Content[BSSID_WCID] is not necessary for driver. 1817 // Pther information in MACTab.Content[BSSID_WCID] is not necessary for driver.
1745 // Note: As STA, The MACTab.Content[BSSID_WCID]. PairwiseKey and Shared Key for BSS0 are the same. 1818 // Note: As STA, The MACTab.Content[BSSID_WCID]. PairwiseKey and Shared Key for BSS0 are the same.
1746 1819
1747 if (pAd->StaCfg.WepStatus <= Ndis802_11WEPDisabled) 1820 if (pAd->StaCfg.WepStatus <= Ndis802_11WEPDisabled) {
1748 {
1749 if (pAd->StaCfg.WpaSupplicantUP && 1821 if (pAd->StaCfg.WpaSupplicantUP &&
1750 (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled) && 1822 (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled) &&
1751 (pAd->StaCfg.IEEE8021X == TRUE)) 1823 (pAd->StaCfg.IEEE8021X == TRUE)) ;
1752 ; 1824 else {
1753 else 1825 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;
1754 { 1826 pAd->StaCfg.PrivacyFilter =
1755 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; 1827 Ndis802_11PrivFilterAcceptAll;
1756 pAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilterAcceptAll; 1828 }
1757 }
1758 } 1829 }
1759 1830
1760 NdisAcquireSpinLock(&pAd->MacTabLock); 1831 NdisAcquireSpinLock(&pAd->MacTabLock);
1761 pEntry->PortSecured = pAd->StaCfg.PortSecured; 1832 pEntry->PortSecured = pAd->StaCfg.PortSecured;
1762 NdisReleaseSpinLock(&pAd->MacTabLock); 1833 NdisReleaseSpinLock(&pAd->MacTabLock);
1763 1834
1764 // 1835 //
1765 // Patch Atheros AP TX will breakdown issue. 1836 // Patch Atheros AP TX will breakdown issue.
1766 // AP Model: DLink DWL-8200AP 1837 // AP Model: DLink DWL-8200AP
1767 // 1838 //
1768 if (INFRA_ON(pAd) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) && STA_TKIP_ON(pAd)) 1839 if (INFRA_ON(pAd) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED)
1769 { 1840 && STA_TKIP_ON(pAd)) {
1770 RTMP_IO_WRITE32(pAd, RX_PARSER_CFG, 0x01); 1841 RTMP_IO_WRITE32(pAd, RX_PARSER_CFG, 0x01);
1771 } 1842 } else {
1772 else
1773 {
1774 RTMP_IO_WRITE32(pAd, RX_PARSER_CFG, 0x00); 1843 RTMP_IO_WRITE32(pAd, RX_PARSER_CFG, 0x00);
1775 } 1844 }
1776 1845
@@ -1804,11 +1873,9 @@ VOID LinkUp(
1804 1873
1805 ========================================================================== 1874 ==========================================================================
1806*/ 1875*/
1807VOID LinkDown( 1876VOID LinkDown(IN PRTMP_ADAPTER pAd, IN BOOLEAN IsReqFromAP)
1808 IN PRTMP_ADAPTER pAd,
1809 IN BOOLEAN IsReqFromAP)
1810{ 1877{
1811 UCHAR i, ByteValue = 0; 1878 UCHAR i, ByteValue = 0;
1812 1879
1813 // Do nothing if monitor mode is on 1880 // Do nothing if monitor mode is on
1814 if (MONITOR_ON(pAd)) 1881 if (MONITOR_ON(pAd))
@@ -1816,45 +1883,43 @@ VOID LinkDown(
1816 1883
1817 RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_GO_TO_SLEEP_NOW); 1884 RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_GO_TO_SLEEP_NOW);
1818 //Comment the codes, beasue the line 2291 call the same function. 1885 //Comment the codes, beasue the line 2291 call the same function.
1819 //RTMPCancelTimer(&pAd->Mlme.PsPollTimer, &Cancelled); 1886 //RTMPCancelTimer(&pAd->Mlme.PsPollTimer, &Cancelled);
1820 // Not allow go to sleep within linkdown function. 1887 // Not allow go to sleep within linkdown function.
1821 RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP); 1888 RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
1822 1889
1823 if (pAd->CommonCfg.bWirelessEvent) 1890 if (pAd->CommonCfg.bWirelessEvent) {
1824 { 1891 RTMPSendWirelessEvent(pAd, IW_STA_LINKDOWN_EVENT_FLAG,
1825 RTMPSendWirelessEvent(pAd, IW_STA_LINKDOWN_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0); 1892 pAd->MacTab.Content[BSSID_WCID].Addr,
1893 BSS0, 0);
1826 } 1894 }
1827 1895
1828 DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK DOWN !!!\n")); 1896 DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK DOWN !!!\n"));
1829 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED); 1897 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED);
1830 1898
1831#ifdef RTMP_MAC_PCI 1899#ifdef RTMP_MAC_PCI
1832 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)) 1900 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)) {
1833 { 1901 BOOLEAN Cancelled;
1834 BOOLEAN Cancelled; 1902 pAd->Mlme.bPsPollTimerRunning = FALSE;
1835 pAd->Mlme.bPsPollTimerRunning = FALSE; 1903 RTMPCancelTimer(&pAd->Mlme.PsPollTimer, &Cancelled);
1836 RTMPCancelTimer(&pAd->Mlme.PsPollTimer, &Cancelled); 1904 }
1837 }
1838 1905
1839 pAd->bPCIclkOff = FALSE; 1906 pAd->bPCIclkOff = FALSE;
1840#endif // RTMP_MAC_PCI // 1907#endif // RTMP_MAC_PCI //
1841 1908
1842 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE) 1909 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)
1843|| RTMP_TEST_PSFLAG(pAd, fRTMP_PS_SET_PCI_CLK_OFF_COMMAND) 1910 || RTMP_TEST_PSFLAG(pAd, fRTMP_PS_SET_PCI_CLK_OFF_COMMAND)
1844 || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF)) 1911 || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF)) {
1845 { 1912 AUTO_WAKEUP_STRUC AutoWakeupCfg;
1846 AUTO_WAKEUP_STRUC AutoWakeupCfg;
1847 AsicForceWakeup(pAd, TRUE); 1913 AsicForceWakeup(pAd, TRUE);
1848 AutoWakeupCfg.word = 0; 1914 AutoWakeupCfg.word = 0;
1849 RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word); 1915 RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word);
1850 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE); 1916 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);
1851 } 1917 }
1852
1853#ifdef RTMP_MAC_PCI 1918#ifdef RTMP_MAC_PCI
1854 pAd->bPCIclkOff = FALSE; 1919 pAd->bPCIclkOff = FALSE;
1855#endif // RTMP_MAC_PCI // 1920#endif // RTMP_MAC_PCI //
1856 1921
1857 if (ADHOC_ON(pAd)) // Adhoc mode link down 1922 if (ADHOC_ON(pAd)) // Adhoc mode link down
1858 { 1923 {
1859 DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK DOWN 1!!!\n")); 1924 DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK DOWN 1!!!\n"));
1860 1925
@@ -1862,11 +1927,12 @@ VOID LinkDown(
1862 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); 1927 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);
1863 pAd->IndicateMediaState = NdisMediaStateDisconnected; 1928 pAd->IndicateMediaState = NdisMediaStateDisconnected;
1864 RTMP_IndicateMediaState(pAd); 1929 RTMP_IndicateMediaState(pAd);
1865 pAd->ExtraInfo = GENERAL_LINK_DOWN; 1930 pAd->ExtraInfo = GENERAL_LINK_DOWN;
1866 BssTableDeleteEntry(&pAd->ScanTab, pAd->CommonCfg.Bssid, pAd->CommonCfg.Channel); 1931 BssTableDeleteEntry(&pAd->ScanTab, pAd->CommonCfg.Bssid,
1867 DBGPRINT(RT_DEBUG_TRACE, ("!!! MacTab.Size=%d !!!\n", pAd->MacTab.Size)); 1932 pAd->CommonCfg.Channel);
1868 } 1933 DBGPRINT(RT_DEBUG_TRACE,
1869 else // Infra structure mode 1934 ("!!! MacTab.Size=%d !!!\n", pAd->MacTab.Size));
1935 } else // Infra structure mode
1870 { 1936 {
1871 DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK DOWN 2!!!\n")); 1937 DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK DOWN 2!!!\n"));
1872 1938
@@ -1875,25 +1941,25 @@ VOID LinkDown(
1875 1941
1876 // Saved last SSID for linkup comparison 1942 // Saved last SSID for linkup comparison
1877 pAd->CommonCfg.LastSsidLen = pAd->CommonCfg.SsidLen; 1943 pAd->CommonCfg.LastSsidLen = pAd->CommonCfg.SsidLen;
1878 NdisMoveMemory(pAd->CommonCfg.LastSsid, pAd->CommonCfg.Ssid, pAd->CommonCfg.LastSsidLen); 1944 NdisMoveMemory(pAd->CommonCfg.LastSsid, pAd->CommonCfg.Ssid,
1945 pAd->CommonCfg.LastSsidLen);
1879 COPY_MAC_ADDR(pAd->CommonCfg.LastBssid, pAd->CommonCfg.Bssid); 1946 COPY_MAC_ADDR(pAd->CommonCfg.LastBssid, pAd->CommonCfg.Bssid);
1880 if (pAd->MlmeAux.CurrReqIsFromNdis == TRUE) 1947 if (pAd->MlmeAux.CurrReqIsFromNdis == TRUE) {
1881 {
1882 pAd->IndicateMediaState = NdisMediaStateDisconnected; 1948 pAd->IndicateMediaState = NdisMediaStateDisconnected;
1883 RTMP_IndicateMediaState(pAd); 1949 RTMP_IndicateMediaState(pAd);
1884 pAd->ExtraInfo = GENERAL_LINK_DOWN; 1950 pAd->ExtraInfo = GENERAL_LINK_DOWN;
1885 DBGPRINT(RT_DEBUG_TRACE, ("NDIS_STATUS_MEDIA_DISCONNECT Event A!\n")); 1951 DBGPRINT(RT_DEBUG_TRACE,
1952 ("NDIS_STATUS_MEDIA_DISCONNECT Event A!\n"));
1886 pAd->MlmeAux.CurrReqIsFromNdis = FALSE; 1953 pAd->MlmeAux.CurrReqIsFromNdis = FALSE;
1887 } 1954 } else {
1888 else 1955 //
1889 {
1890 //
1891 // If disassociation request is from NDIS, then we don't need to delete BSSID from entry. 1956 // If disassociation request is from NDIS, then we don't need to delete BSSID from entry.
1892 // Otherwise lost beacon or receive De-Authentication from AP, 1957 // Otherwise lost beacon or receive De-Authentication from AP,
1893 // then we should delete BSSID from BssTable. 1958 // then we should delete BSSID from BssTable.
1894 // If we don't delete from entry, roaming will fail. 1959 // If we don't delete from entry, roaming will fail.
1895 // 1960 //
1896 BssTableDeleteEntry(&pAd->ScanTab, pAd->CommonCfg.Bssid, pAd->CommonCfg.Channel); 1961 BssTableDeleteEntry(&pAd->ScanTab, pAd->CommonCfg.Bssid,
1962 pAd->CommonCfg.Channel);
1897 } 1963 }
1898 1964
1899 // restore back to - 1965 // restore back to -
@@ -1902,31 +1968,28 @@ VOID LinkDown(
1902 // 3. short preamble 1968 // 3. short preamble
1903 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED); 1969 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED);
1904 1970
1905
1906 } 1971 }
1907 1972
1908 1973 for (i = 1; i < MAX_LEN_OF_MAC_TABLE; i++) {
1909 for (i=1; i<MAX_LEN_OF_MAC_TABLE; i++)
1910 {
1911 if (pAd->MacTab.Content[i].ValidAsCLI == TRUE) 1974 if (pAd->MacTab.Content[i].ValidAsCLI == TRUE)
1912 MacTableDeleteEntry(pAd, pAd->MacTab.Content[i].Aid, pAd->MacTab.Content[i].Addr); 1975 MacTableDeleteEntry(pAd, pAd->MacTab.Content[i].Aid,
1976 pAd->MacTab.Content[i].Addr);
1913 } 1977 }
1914 1978
1915 AsicSetSlotTime(pAd, TRUE); //FALSE); 1979 AsicSetSlotTime(pAd, TRUE); //FALSE);
1916 AsicSetEdcaParm(pAd, NULL); 1980 AsicSetEdcaParm(pAd, NULL);
1917 1981
1918 // Set LED 1982 // Set LED
1919 RTMPSetLED(pAd, LED_LINK_DOWN); 1983 RTMPSetLED(pAd, LED_LINK_DOWN);
1920 pAd->LedIndicatorStrength = 0xF0; 1984 pAd->LedIndicatorStrength = 0xF0;
1921 RTMPSetSignalLED(pAd, -100); // Force signal strength Led to be turned off, firmware is not done it. 1985 RTMPSetSignalLED(pAd, -100); // Force signal strength Led to be turned off, firmware is not done it.
1922 1986
1923 AsicDisableSync(pAd); 1987 AsicDisableSync(pAd);
1924 1988
1925 pAd->Mlme.PeriodicRound = 0; 1989 pAd->Mlme.PeriodicRound = 0;
1926 pAd->Mlme.OneSecPeriodicRound = 0; 1990 pAd->Mlme.OneSecPeriodicRound = 0;
1927 1991
1928 if (pAd->StaCfg.BssType == BSS_INFRA) 1992 if (pAd->StaCfg.BssType == BSS_INFRA) {
1929 {
1930 // Remove StaCfg Information after link down 1993 // Remove StaCfg Information after link down
1931 NdisZeroMemory(pAd->CommonCfg.Bssid, MAC_ADDR_LEN); 1994 NdisZeroMemory(pAd->CommonCfg.Bssid, MAC_ADDR_LEN);
1932 NdisZeroMemory(pAd->CommonCfg.Ssid, MAX_LEN_OF_SSID); 1995 NdisZeroMemory(pAd->CommonCfg.Ssid, MAX_LEN_OF_SSID);
@@ -1939,36 +2002,29 @@ VOID LinkDown(
1939 pAd->MlmeAux.NewExtChannelOffset = 0xff; 2002 pAd->MlmeAux.NewExtChannelOffset = 0xff;
1940 2003
1941 // Reset WPA-PSK state. Only reset when supplicant enabled 2004 // Reset WPA-PSK state. Only reset when supplicant enabled
1942 if (pAd->StaCfg.WpaState != SS_NOTUSE) 2005 if (pAd->StaCfg.WpaState != SS_NOTUSE) {
1943 {
1944 pAd->StaCfg.WpaState = SS_START; 2006 pAd->StaCfg.WpaState = SS_START;
1945 // Clear Replay counter 2007 // Clear Replay counter
1946 NdisZeroMemory(pAd->StaCfg.ReplayCounter, 8); 2008 NdisZeroMemory(pAd->StaCfg.ReplayCounter, 8);
1947 2009
1948 } 2010 }
1949
1950 // 2011 //
1951 // if link down come from AP, we need to remove all WPA keys on WPA mode. 2012 // if link down come from AP, we need to remove all WPA keys on WPA mode.
1952 // otherwise will cause 4-way handshaking failed, since the WPA key not empty. 2013 // otherwise will cause 4-way handshaking failed, since the WPA key not empty.
1953 // 2014 //
1954 if ((IsReqFromAP) && (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)) 2015 if ((IsReqFromAP) && (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)) {
1955 {
1956 // Remove all WPA keys 2016 // Remove all WPA keys
1957 RTMPWPARemoveAllKeys(pAd); 2017 RTMPWPARemoveAllKeys(pAd);
1958 } 2018 }
1959
1960 // 802.1x port control 2019 // 802.1x port control
1961 2020
1962 // Prevent clear PortSecured here with static WEP 2021 // Prevent clear PortSecured here with static WEP
1963 // NetworkManger set security policy first then set SSID to connect AP. 2022 // NetworkManger set security policy first then set SSID to connect AP.
1964 if (pAd->StaCfg.WpaSupplicantUP && 2023 if (pAd->StaCfg.WpaSupplicantUP &&
1965 (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled) && 2024 (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled) &&
1966 (pAd->StaCfg.IEEE8021X == FALSE)) 2025 (pAd->StaCfg.IEEE8021X == FALSE)) {
1967 {
1968 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; 2026 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;
1969 } 2027 } else {
1970 else
1971 {
1972 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED; 2028 pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
1973 pAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilter8021xWEP; 2029 pAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilter8021xWEP;
1974 } 2030 }
@@ -1980,19 +2036,21 @@ VOID LinkDown(
1980 2036
1981 pAd->StaCfg.MicErrCnt = 0; 2037 pAd->StaCfg.MicErrCnt = 0;
1982 2038
1983 pAd->IndicateMediaState = NdisMediaStateDisconnected; 2039 pAd->IndicateMediaState = NdisMediaStateDisconnected;
1984 // Update extra information to link is up 2040 // Update extra information to link is up
1985 pAd->ExtraInfo = GENERAL_LINK_DOWN; 2041 pAd->ExtraInfo = GENERAL_LINK_DOWN;
1986 2042
1987 pAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE; 2043 pAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE;
1988 2044
1989#ifdef RTMP_MAC_USB 2045#ifdef RTMP_MAC_USB
1990 pAd->bUsbTxBulkAggre = FALSE; 2046 pAd->bUsbTxBulkAggre = FALSE;
1991#endif // RTMP_MAC_USB // 2047#endif // RTMP_MAC_USB //
1992 2048
1993 // Clean association information 2049 // Clean association information
1994 NdisZeroMemory(&pAd->StaCfg.AssocInfo, sizeof(NDIS_802_11_ASSOCIATION_INFORMATION)); 2050 NdisZeroMemory(&pAd->StaCfg.AssocInfo,
1995 pAd->StaCfg.AssocInfo.Length = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); 2051 sizeof(NDIS_802_11_ASSOCIATION_INFORMATION));
2052 pAd->StaCfg.AssocInfo.Length =
2053 sizeof(NDIS_802_11_ASSOCIATION_INFORMATION);
1996 pAd->StaCfg.ReqVarIELen = 0; 2054 pAd->StaCfg.ReqVarIELen = 0;
1997 pAd->StaCfg.ResVarIELen = 0; 2055 pAd->StaCfg.ResVarIELen = 0;
1998 2056
@@ -2013,30 +2071,29 @@ VOID LinkDown(
2013 // 2071 //
2014 // After Link down, reset piggy-back setting in ASIC. Disable RDG. 2072 // After Link down, reset piggy-back setting in ASIC. Disable RDG.
2015 // 2073 //
2016 if (pAd->CommonCfg.BBPCurrentBW == BW_40) 2074 if (pAd->CommonCfg.BBPCurrentBW == BW_40) {
2017 {
2018 pAd->CommonCfg.BBPCurrentBW = BW_20; 2075 pAd->CommonCfg.BBPCurrentBW = BW_20;
2019 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &ByteValue); 2076 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &ByteValue);
2020 ByteValue &= (~0x18); 2077 ByteValue &= (~0x18);
2021 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, ByteValue); 2078 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, ByteValue);
2022 } 2079 }
2023
2024 // Reset DAC 2080 // Reset DAC
2025 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &ByteValue); 2081 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &ByteValue);
2026 ByteValue &= (~0x18); 2082 ByteValue &= (~0x18);
2027 if (pAd->Antenna.field.TxPath == 2) 2083 if (pAd->Antenna.field.TxPath == 2) {
2028 {
2029 ByteValue |= 0x10; 2084 ByteValue |= 0x10;
2030 } 2085 }
2031 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, ByteValue); 2086 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, ByteValue);
2032 2087
2033 RTMPSetPiggyBack(pAd,FALSE); 2088 RTMPSetPiggyBack(pAd, FALSE);
2034 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_PIGGYBACK_INUSED); 2089 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_PIGGYBACK_INUSED);
2035 2090
2036 pAd->CommonCfg.BACapability.word = pAd->CommonCfg.REGBACapability.word; 2091 pAd->CommonCfg.BACapability.word = pAd->CommonCfg.REGBACapability.word;
2037 2092
2038 // Restore all settings in the following. 2093 // Restore all settings in the following.
2039 AsicUpdateProtect(pAd, 0, (ALLN_SETPROTECT|CCKSETPROTECT|OFDMSETPROTECT), TRUE, FALSE); 2094 AsicUpdateProtect(pAd, 0,
2095 (ALLN_SETPROTECT | CCKSETPROTECT | OFDMSETPROTECT),
2096 TRUE, FALSE);
2040 AsicDisableRDG(pAd); 2097 AsicDisableRDG(pAd);
2041 pAd->CommonCfg.IOTestParm.bCurrentAtheros = FALSE; 2098 pAd->CommonCfg.IOTestParm.bCurrentAtheros = FALSE;
2042 pAd->CommonCfg.IOTestParm.bNowAtherosBurstOn = FALSE; 2099 pAd->CommonCfg.IOTestParm.bNowAtherosBurstOn = FALSE;
@@ -2050,9 +2107,8 @@ VOID LinkDown(
2050 RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, NULL, NULL, 0); 2107 RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, NULL, NULL, 0);
2051 2108
2052#ifdef RT30xx 2109#ifdef RT30xx
2053 if ((IS_RT30xx(pAd) || IS_RT3090(pAd)||IS_RT3390(pAd)) 2110 if ((IS_RT30xx(pAd) || IS_RT3090(pAd) || IS_RT3390(pAd))
2054 &&(pAd->Antenna.field.RxPath>1||pAd->Antenna.field.TxPath>1)) 2111 && (pAd->Antenna.field.RxPath > 1 || pAd->Antenna.field.TxPath > 1)) {
2055 {
2056 RTMP_ASIC_MMPS_DISABLE(pAd); 2112 RTMP_ASIC_MMPS_DISABLE(pAd);
2057 } 2113 }
2058#endif // RT30xx // 2114#endif // RT30xx //
@@ -2066,78 +2122,104 @@ VOID LinkDown(
2066 2122
2067 ========================================================================== 2123 ==========================================================================
2068*/ 2124*/
2069VOID IterateOnBssTab( 2125VOID IterateOnBssTab(IN PRTMP_ADAPTER pAd)
2070 IN PRTMP_ADAPTER pAd)
2071{ 2126{
2072 MLME_START_REQ_STRUCT StartReq; 2127 MLME_START_REQ_STRUCT StartReq;
2073 MLME_JOIN_REQ_STRUCT JoinReq; 2128 MLME_JOIN_REQ_STRUCT JoinReq;
2074 ULONG BssIdx; 2129 ULONG BssIdx;
2075 2130
2076 // Change the wepstatus to original wepstatus 2131 // Change the wepstatus to original wepstatus
2077 pAd->StaCfg.WepStatus = pAd->StaCfg.OrigWepStatus; 2132 pAd->StaCfg.WepStatus = pAd->StaCfg.OrigWepStatus;
2078 pAd->StaCfg.PairCipher = pAd->StaCfg.OrigWepStatus; 2133 pAd->StaCfg.PairCipher = pAd->StaCfg.OrigWepStatus;
2079 pAd->StaCfg.GroupCipher = pAd->StaCfg.OrigWepStatus; 2134 pAd->StaCfg.GroupCipher = pAd->StaCfg.OrigWepStatus;
2080 2135
2081 BssIdx = pAd->MlmeAux.BssIdx; 2136 BssIdx = pAd->MlmeAux.BssIdx;
2082 if (BssIdx < pAd->MlmeAux.SsidBssTab.BssNr) 2137 if (BssIdx < pAd->MlmeAux.SsidBssTab.BssNr) {
2083 {
2084 // Check cipher suite, AP must have more secured cipher than station setting 2138 // Check cipher suite, AP must have more secured cipher than station setting
2085 // Set the Pairwise and Group cipher to match the intended AP setting 2139 // Set the Pairwise and Group cipher to match the intended AP setting
2086 // We can only connect to AP with less secured cipher setting 2140 // We can only connect to AP with less secured cipher setting
2087 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK)) 2141 if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA)
2088 { 2142 || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK)) {
2089 pAd->StaCfg.GroupCipher = pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA.GroupCipher; 2143 pAd->StaCfg.GroupCipher =
2090 2144 pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA.
2091 if (pAd->StaCfg.WepStatus == pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA.PairCipher) 2145 GroupCipher;
2092 pAd->StaCfg.PairCipher = pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA.PairCipher; 2146
2093 else if (pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA.PairCipherAux != Ndis802_11WEPDisabled) 2147 if (pAd->StaCfg.WepStatus ==
2094 pAd->StaCfg.PairCipher = pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA.PairCipherAux; 2148 pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA.
2149 PairCipher)
2150 pAd->StaCfg.PairCipher =
2151 pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].
2152 WPA.PairCipher;
2153 else if (pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA.
2154 PairCipherAux != Ndis802_11WEPDisabled)
2155 pAd->StaCfg.PairCipher =
2156 pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].
2157 WPA.PairCipherAux;
2095 else // There is no PairCipher Aux, downgrade our capability to TKIP 2158 else // There is no PairCipher Aux, downgrade our capability to TKIP
2096 pAd->StaCfg.PairCipher = Ndis802_11Encryption2Enabled; 2159 pAd->StaCfg.PairCipher =
2097 } 2160 Ndis802_11Encryption2Enabled;
2098 else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)) 2161 } else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2)
2099 { 2162 || (pAd->StaCfg.AuthMode ==
2100 pAd->StaCfg.GroupCipher = pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA2.GroupCipher; 2163 Ndis802_11AuthModeWPA2PSK)) {
2101 2164 pAd->StaCfg.GroupCipher =
2102 if (pAd->StaCfg.WepStatus == pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA2.PairCipher) 2165 pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA2.
2103 pAd->StaCfg.PairCipher = pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA2.PairCipher; 2166 GroupCipher;
2104 else if (pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA2.PairCipherAux != Ndis802_11WEPDisabled) 2167
2105 pAd->StaCfg.PairCipher = pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA2.PairCipherAux; 2168 if (pAd->StaCfg.WepStatus ==
2169 pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA2.
2170 PairCipher)
2171 pAd->StaCfg.PairCipher =
2172 pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].
2173 WPA2.PairCipher;
2174 else if (pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA2.
2175 PairCipherAux != Ndis802_11WEPDisabled)
2176 pAd->StaCfg.PairCipher =
2177 pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].
2178 WPA2.PairCipherAux;
2106 else // There is no PairCipher Aux, downgrade our capability to TKIP 2179 else // There is no PairCipher Aux, downgrade our capability to TKIP
2107 pAd->StaCfg.PairCipher = Ndis802_11Encryption2Enabled; 2180 pAd->StaCfg.PairCipher =
2181 Ndis802_11Encryption2Enabled;
2108 2182
2109 // RSN capability 2183 // RSN capability
2110 pAd->StaCfg.RsnCapability = pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA2.RsnCapability; 2184 pAd->StaCfg.RsnCapability =
2185 pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA2.
2186 RsnCapability;
2111 } 2187 }
2112
2113 // Set Mix cipher flag 2188 // Set Mix cipher flag
2114 pAd->StaCfg.bMixCipher = (pAd->StaCfg.PairCipher == pAd->StaCfg.GroupCipher) ? FALSE : TRUE; 2189 pAd->StaCfg.bMixCipher =
2190 (pAd->StaCfg.PairCipher ==
2191 pAd->StaCfg.GroupCipher) ? FALSE : TRUE;
2115 /*if (pAd->StaCfg.bMixCipher == TRUE) 2192 /*if (pAd->StaCfg.bMixCipher == TRUE)
2116 { 2193 {
2117 // If mix cipher, re-build RSNIE 2194 // If mix cipher, re-build RSNIE
2118 RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, 0); 2195 RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, 0);
2119 }*/ 2196 } */
2120 2197
2121 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - iterate BSS %ld of %d\n", BssIdx, pAd->MlmeAux.SsidBssTab.BssNr)); 2198 DBGPRINT(RT_DEBUG_TRACE,
2199 ("CNTL - iterate BSS %ld of %d\n", BssIdx,
2200 pAd->MlmeAux.SsidBssTab.BssNr));
2122 JoinParmFill(pAd, &JoinReq, BssIdx); 2201 JoinParmFill(pAd, &JoinReq, BssIdx);
2123 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_JOIN_REQ, sizeof(MLME_JOIN_REQ_STRUCT), 2202 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_JOIN_REQ,
2124 &JoinReq); 2203 sizeof(MLME_JOIN_REQ_STRUCT), &JoinReq);
2125 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_JOIN; 2204 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_JOIN;
2126 } 2205 } else if (pAd->StaCfg.BssType == BSS_ADHOC) {
2127 else if (pAd->StaCfg.BssType == BSS_ADHOC) 2206 DBGPRINT(RT_DEBUG_TRACE,
2128 { 2207 ("CNTL - All BSS fail; start a new ADHOC (Ssid=%s)...\n",
2129 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - All BSS fail; start a new ADHOC (Ssid=%s)...\n",pAd->MlmeAux.Ssid)); 2208 pAd->MlmeAux.Ssid));
2130 StartParmFill(pAd, &StartReq, (PCHAR)pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen); 2209 StartParmFill(pAd, &StartReq, (PCHAR) pAd->MlmeAux.Ssid,
2131 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_START_REQ, sizeof(MLME_START_REQ_STRUCT), &StartReq); 2210 pAd->MlmeAux.SsidLen);
2211 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_START_REQ,
2212 sizeof(MLME_START_REQ_STRUCT), &StartReq);
2132 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_START; 2213 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_START;
2133 } 2214 } else // no more BSS
2134 else // no more BSS
2135 { 2215 {
2136 2216
2137 { 2217 {
2138 AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE); 2218 AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
2139 AsicLockChannel(pAd, pAd->CommonCfg.Channel); 2219 AsicLockChannel(pAd, pAd->CommonCfg.Channel);
2140 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - All roaming failed, restore to channel %d, Total BSS[%02d]\n",pAd->CommonCfg.Channel, pAd->ScanTab.BssNr)); 2220 DBGPRINT(RT_DEBUG_TRACE,
2221 ("CNTL - All roaming failed, restore to channel %d, Total BSS[%02d]\n",
2222 pAd->CommonCfg.Channel, pAd->ScanTab.BssNr));
2141 } 2223 }
2142 2224
2143 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; 2225 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
@@ -2146,38 +2228,40 @@ VOID IterateOnBssTab(
2146 2228
2147// for re-association only 2229// for re-association only
2148// IRQL = DISPATCH_LEVEL 2230// IRQL = DISPATCH_LEVEL
2149VOID IterateOnBssTab2( 2231VOID IterateOnBssTab2(IN PRTMP_ADAPTER pAd)
2150 IN PRTMP_ADAPTER pAd)
2151{ 2232{
2152 MLME_REASSOC_REQ_STRUCT ReassocReq; 2233 MLME_REASSOC_REQ_STRUCT ReassocReq;
2153 ULONG BssIdx; 2234 ULONG BssIdx;
2154 BSS_ENTRY *pBss; 2235 BSS_ENTRY *pBss;
2155 2236
2156 BssIdx = pAd->MlmeAux.RoamIdx; 2237 BssIdx = pAd->MlmeAux.RoamIdx;
2157 pBss = &pAd->MlmeAux.RoamTab.BssEntry[BssIdx]; 2238 pBss = &pAd->MlmeAux.RoamTab.BssEntry[BssIdx];
2158 2239
2159 if (BssIdx < pAd->MlmeAux.RoamTab.BssNr) 2240 if (BssIdx < pAd->MlmeAux.RoamTab.BssNr) {
2160 { 2241 DBGPRINT(RT_DEBUG_TRACE,
2161 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - iterate BSS %ld of %d\n", BssIdx, pAd->MlmeAux.RoamTab.BssNr)); 2242 ("CNTL - iterate BSS %ld of %d\n", BssIdx,
2243 pAd->MlmeAux.RoamTab.BssNr));
2162 2244
2163 AsicSwitchChannel(pAd, pBss->Channel, FALSE); 2245 AsicSwitchChannel(pAd, pBss->Channel, FALSE);
2164 AsicLockChannel(pAd, pBss->Channel); 2246 AsicLockChannel(pAd, pBss->Channel);
2165 2247
2166 // reassociate message has the same structure as associate message 2248 // reassociate message has the same structure as associate message
2167 AssocParmFill(pAd, &ReassocReq, pBss->Bssid, pBss->CapabilityInfo, 2249 AssocParmFill(pAd, &ReassocReq, pBss->Bssid,
2168 ASSOC_TIMEOUT, pAd->StaCfg.DefaultListenCount); 2250 pBss->CapabilityInfo, ASSOC_TIMEOUT,
2251 pAd->StaCfg.DefaultListenCount);
2169 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_REASSOC_REQ, 2252 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_REASSOC_REQ,
2170 sizeof(MLME_REASSOC_REQ_STRUCT), &ReassocReq); 2253 sizeof(MLME_REASSOC_REQ_STRUCT), &ReassocReq);
2171 2254
2172 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_REASSOC; 2255 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_REASSOC;
2173 } 2256 } else // no more BSS
2174 else // no more BSS
2175 { 2257 {
2176 2258
2177 { 2259 {
2178 AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE); 2260 AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
2179 AsicLockChannel(pAd, pAd->CommonCfg.Channel); 2261 AsicLockChannel(pAd, pAd->CommonCfg.Channel);
2180 DBGPRINT(RT_DEBUG_TRACE, ("CNTL - All roaming failed, restore to channel %d, Total BSS[%02d]\n",pAd->CommonCfg.Channel, pAd->ScanTab.BssNr)); 2262 DBGPRINT(RT_DEBUG_TRACE,
2263 ("CNTL - All roaming failed, restore to channel %d, Total BSS[%02d]\n",
2264 pAd->CommonCfg.Channel, pAd->ScanTab.BssNr));
2181 } 2265 }
2182 2266
2183 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; 2267 pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
@@ -2192,10 +2276,8 @@ VOID IterateOnBssTab2(
2192 2276
2193 ========================================================================== 2277 ==========================================================================
2194*/ 2278*/
2195VOID JoinParmFill( 2279VOID JoinParmFill(IN PRTMP_ADAPTER pAd,
2196 IN PRTMP_ADAPTER pAd, 2280 IN OUT MLME_JOIN_REQ_STRUCT * JoinReq, IN ULONG BssIdx)
2197 IN OUT MLME_JOIN_REQ_STRUCT *JoinReq,
2198 IN ULONG BssIdx)
2199{ 2281{
2200 JoinReq->BssIdx = BssIdx; 2282 JoinReq->BssIdx = BssIdx;
2201} 2283}
@@ -2208,15 +2290,12 @@ VOID JoinParmFill(
2208 2290
2209 ========================================================================== 2291 ==========================================================================
2210*/ 2292*/
2211VOID ScanParmFill( 2293VOID ScanParmFill(IN PRTMP_ADAPTER pAd,
2212 IN PRTMP_ADAPTER pAd, 2294 IN OUT MLME_SCAN_REQ_STRUCT * ScanReq,
2213 IN OUT MLME_SCAN_REQ_STRUCT *ScanReq, 2295 IN STRING Ssid[],
2214 IN STRING Ssid[], 2296 IN UCHAR SsidLen, IN UCHAR BssType, IN UCHAR ScanType)
2215 IN UCHAR SsidLen,
2216 IN UCHAR BssType,
2217 IN UCHAR ScanType)
2218{ 2297{
2219 NdisZeroMemory(ScanReq->Ssid, MAX_LEN_OF_SSID); 2298 NdisZeroMemory(ScanReq->Ssid, MAX_LEN_OF_SSID);
2220 ScanReq->SsidLen = SsidLen; 2299 ScanReq->SsidLen = SsidLen;
2221 NdisMoveMemory(ScanReq->Ssid, Ssid, SsidLen); 2300 NdisMoveMemory(ScanReq->Ssid, Ssid, SsidLen);
2222 ScanReq->BssType = BssType; 2301 ScanReq->BssType = BssType;
@@ -2231,11 +2310,9 @@ VOID ScanParmFill(
2231 2310
2232 ========================================================================== 2311 ==========================================================================
2233*/ 2312*/
2234VOID StartParmFill( 2313VOID StartParmFill(IN PRTMP_ADAPTER pAd,
2235 IN PRTMP_ADAPTER pAd, 2314 IN OUT MLME_START_REQ_STRUCT * StartReq,
2236 IN OUT MLME_START_REQ_STRUCT *StartReq, 2315 IN CHAR Ssid[], IN UCHAR SsidLen)
2237 IN CHAR Ssid[],
2238 IN UCHAR SsidLen)
2239{ 2316{
2240 ASSERT(SsidLen <= MAX_LEN_OF_SSID); 2317 ASSERT(SsidLen <= MAX_LEN_OF_SSID);
2241 NdisMoveMemory(StartReq->Ssid, Ssid, SsidLen); 2318 NdisMoveMemory(StartReq->Ssid, Ssid, SsidLen);
@@ -2250,11 +2327,9 @@ VOID StartParmFill(
2250 2327
2251 ========================================================================== 2328 ==========================================================================
2252*/ 2329*/
2253VOID AuthParmFill( 2330VOID AuthParmFill(IN PRTMP_ADAPTER pAd,
2254 IN PRTMP_ADAPTER pAd, 2331 IN OUT MLME_AUTH_REQ_STRUCT * AuthReq,
2255 IN OUT MLME_AUTH_REQ_STRUCT *AuthReq, 2332 IN PUCHAR pAddr, IN USHORT Alg)
2256 IN PUCHAR pAddr,
2257 IN USHORT Alg)
2258{ 2333{
2259 COPY_MAC_ADDR(AuthReq->Addr, pAddr); 2334 COPY_MAC_ADDR(AuthReq->Addr, pAddr);
2260 AuthReq->Alg = Alg; 2335 AuthReq->Alg = Alg;
@@ -2270,8 +2345,7 @@ VOID AuthParmFill(
2270 ========================================================================== 2345 ==========================================================================
2271 */ 2346 */
2272#ifdef RTMP_MAC_PCI 2347#ifdef RTMP_MAC_PCI
2273VOID ComposePsPoll( 2348VOID ComposePsPoll(IN PRTMP_ADAPTER pAd)
2274 IN PRTMP_ADAPTER pAd)
2275{ 2349{
2276 NdisZeroMemory(&pAd->PsPollFrame, sizeof(PSPOLL_FRAME)); 2350 NdisZeroMemory(&pAd->PsPollFrame, sizeof(PSPOLL_FRAME));
2277 pAd->PsPollFrame.FC.Type = BTYPE_CNTL; 2351 pAd->PsPollFrame.FC.Type = BTYPE_CNTL;
@@ -2282,8 +2356,7 @@ VOID ComposePsPoll(
2282} 2356}
2283 2357
2284// IRQL = DISPATCH_LEVEL 2358// IRQL = DISPATCH_LEVEL
2285VOID ComposeNullFrame( 2359VOID ComposeNullFrame(IN PRTMP_ADAPTER pAd)
2286 IN PRTMP_ADAPTER pAd)
2287{ 2360{
2288 NdisZeroMemory(&pAd->NullFrame, sizeof(HEADER_802_11)); 2361 NdisZeroMemory(&pAd->NullFrame, sizeof(HEADER_802_11));
2289 pAd->NullFrame.FC.Type = BTYPE_DATA; 2362 pAd->NullFrame.FC.Type = BTYPE_DATA;
@@ -2295,19 +2368,16 @@ VOID ComposeNullFrame(
2295} 2368}
2296#endif // RTMP_MAC_PCI // 2369#endif // RTMP_MAC_PCI //
2297#ifdef RTMP_MAC_USB 2370#ifdef RTMP_MAC_USB
2298VOID MlmeCntlConfirm( 2371VOID MlmeCntlConfirm(IN PRTMP_ADAPTER pAd, IN ULONG MsgType, IN USHORT Msg)
2299 IN PRTMP_ADAPTER pAd,
2300 IN ULONG MsgType,
2301 IN USHORT Msg)
2302{ 2372{
2303 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MsgType, sizeof(USHORT), &Msg); 2373 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MsgType, sizeof(USHORT),
2374 &Msg);
2304} 2375}
2305 2376
2306VOID ComposePsPoll( 2377VOID ComposePsPoll(IN PRTMP_ADAPTER pAd)
2307 IN PRTMP_ADAPTER pAd)
2308{ 2378{
2309 PTXINFO_STRUC pTxInfo; 2379 PTXINFO_STRUC pTxInfo;
2310 PTXWI_STRUC pTxWI; 2380 PTXWI_STRUC pTxWI;
2311 2381
2312 DBGPRINT(RT_DEBUG_TRACE, ("ComposePsPoll\n")); 2382 DBGPRINT(RT_DEBUG_TRACE, ("ComposePsPoll\n"));
2313 NdisZeroMemory(&pAd->PsPollFrame, sizeof(PSPOLL_FRAME)); 2383 NdisZeroMemory(&pAd->PsPollFrame, sizeof(PSPOLL_FRAME));
@@ -2319,23 +2389,34 @@ VOID ComposePsPoll(
2319 COPY_MAC_ADDR(pAd->PsPollFrame.Bssid, pAd->CommonCfg.Bssid); 2389 COPY_MAC_ADDR(pAd->PsPollFrame.Bssid, pAd->CommonCfg.Bssid);
2320 COPY_MAC_ADDR(pAd->PsPollFrame.Ta, pAd->CurrentAddress); 2390 COPY_MAC_ADDR(pAd->PsPollFrame.Ta, pAd->CurrentAddress);
2321 2391
2322 RTMPZeroMemory(&pAd->PsPollContext.TransferBuffer->field.WirelessPacket[0], 100); 2392 RTMPZeroMemory(&pAd->PsPollContext.TransferBuffer->field.
2323 pTxInfo = (PTXINFO_STRUC)&pAd->PsPollContext.TransferBuffer->field.WirelessPacket[0]; 2393 WirelessPacket[0], 100);
2324 RTMPWriteTxInfo(pAd, pTxInfo, (USHORT)(sizeof(PSPOLL_FRAME)+TXWI_SIZE), TRUE, EpToQueue[MGMTPIPEIDX], FALSE, FALSE); 2394 pTxInfo =
2325 pTxWI = (PTXWI_STRUC)&pAd->PsPollContext.TransferBuffer->field.WirelessPacket[TXINFO_SIZE]; 2395 (PTXINFO_STRUC) & pAd->PsPollContext.TransferBuffer->field.
2326 RTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, 0, BSSID_WCID, (sizeof(PSPOLL_FRAME)), 2396 WirelessPacket[0];
2327 0, 0, (UCHAR)pAd->CommonCfg.MlmeTransmit.field.MCS, IFS_BACKOFF, FALSE, &pAd->CommonCfg.MlmeTransmit); 2397 RTMPWriteTxInfo(pAd, pTxInfo,
2328 RTMPMoveMemory(&pAd->PsPollContext.TransferBuffer->field.WirelessPacket[TXWI_SIZE+TXINFO_SIZE], &pAd->PsPollFrame, sizeof(PSPOLL_FRAME)); 2398 (USHORT) (sizeof(PSPOLL_FRAME) + TXWI_SIZE), TRUE,
2399 EpToQueue[MGMTPIPEIDX], FALSE, FALSE);
2400 pTxWI =
2401 (PTXWI_STRUC) & pAd->PsPollContext.TransferBuffer->field.
2402 WirelessPacket[TXINFO_SIZE];
2403 RTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, 0,
2404 BSSID_WCID, (sizeof(PSPOLL_FRAME)), 0, 0,
2405 (UCHAR) pAd->CommonCfg.MlmeTransmit.field.MCS,
2406 IFS_BACKOFF, FALSE, &pAd->CommonCfg.MlmeTransmit);
2407 RTMPMoveMemory(&pAd->PsPollContext.TransferBuffer->field.
2408 WirelessPacket[TXWI_SIZE + TXINFO_SIZE],
2409 &pAd->PsPollFrame, sizeof(PSPOLL_FRAME));
2329 // Append 4 extra zero bytes. 2410 // Append 4 extra zero bytes.
2330 pAd->PsPollContext.BulkOutSize = TXINFO_SIZE + TXWI_SIZE + sizeof(PSPOLL_FRAME) + 4; 2411 pAd->PsPollContext.BulkOutSize =
2412 TXINFO_SIZE + TXWI_SIZE + sizeof(PSPOLL_FRAME) + 4;
2331} 2413}
2332 2414
2333// IRQL = DISPATCH_LEVEL 2415// IRQL = DISPATCH_LEVEL
2334VOID ComposeNullFrame( 2416VOID ComposeNullFrame(IN PRTMP_ADAPTER pAd)
2335 IN PRTMP_ADAPTER pAd)
2336{ 2417{
2337 PTXINFO_STRUC pTxInfo; 2418 PTXINFO_STRUC pTxInfo;
2338 PTXWI_STRUC pTxWI; 2419 PTXWI_STRUC pTxWI;
2339 2420
2340 NdisZeroMemory(&pAd->NullFrame, sizeof(HEADER_802_11)); 2421 NdisZeroMemory(&pAd->NullFrame, sizeof(HEADER_802_11));
2341 pAd->NullFrame.FC.Type = BTYPE_DATA; 2422 pAd->NullFrame.FC.Type = BTYPE_DATA;
@@ -2344,14 +2425,26 @@ VOID ComposeNullFrame(
2344 COPY_MAC_ADDR(pAd->NullFrame.Addr1, pAd->CommonCfg.Bssid); 2425 COPY_MAC_ADDR(pAd->NullFrame.Addr1, pAd->CommonCfg.Bssid);
2345 COPY_MAC_ADDR(pAd->NullFrame.Addr2, pAd->CurrentAddress); 2426 COPY_MAC_ADDR(pAd->NullFrame.Addr2, pAd->CurrentAddress);
2346 COPY_MAC_ADDR(pAd->NullFrame.Addr3, pAd->CommonCfg.Bssid); 2427 COPY_MAC_ADDR(pAd->NullFrame.Addr3, pAd->CommonCfg.Bssid);
2347 RTMPZeroMemory(&pAd->NullContext.TransferBuffer->field.WirelessPacket[0], 100); 2428 RTMPZeroMemory(&pAd->NullContext.TransferBuffer->field.
2348 pTxInfo = (PTXINFO_STRUC)&pAd->NullContext.TransferBuffer->field.WirelessPacket[0]; 2429 WirelessPacket[0], 100);
2349 RTMPWriteTxInfo(pAd, pTxInfo, (USHORT)(sizeof(HEADER_802_11)+TXWI_SIZE), TRUE, EpToQueue[MGMTPIPEIDX], FALSE, FALSE); 2430 pTxInfo =
2350 pTxWI = (PTXWI_STRUC)&pAd->NullContext.TransferBuffer->field.WirelessPacket[TXINFO_SIZE]; 2431 (PTXINFO_STRUC) & pAd->NullContext.TransferBuffer->field.
2351 RTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, 0, BSSID_WCID, (sizeof(HEADER_802_11)), 2432 WirelessPacket[0];
2352 0, 0, (UCHAR)pAd->CommonCfg.MlmeTransmit.field.MCS, IFS_BACKOFF, FALSE, &pAd->CommonCfg.MlmeTransmit); 2433 RTMPWriteTxInfo(pAd, pTxInfo,
2353 RTMPMoveMemory(&pAd->NullContext.TransferBuffer->field.WirelessPacket[TXWI_SIZE+TXINFO_SIZE], &pAd->NullFrame, sizeof(HEADER_802_11)); 2434 (USHORT) (sizeof(HEADER_802_11) + TXWI_SIZE), TRUE,
2354 pAd->NullContext.BulkOutSize = TXINFO_SIZE + TXWI_SIZE + sizeof(pAd->NullFrame) + 4; 2435 EpToQueue[MGMTPIPEIDX], FALSE, FALSE);
2436 pTxWI =
2437 (PTXWI_STRUC) & pAd->NullContext.TransferBuffer->field.
2438 WirelessPacket[TXINFO_SIZE];
2439 RTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, 0,
2440 BSSID_WCID, (sizeof(HEADER_802_11)), 0, 0,
2441 (UCHAR) pAd->CommonCfg.MlmeTransmit.field.MCS,
2442 IFS_BACKOFF, FALSE, &pAd->CommonCfg.MlmeTransmit);
2443 RTMPMoveMemory(&pAd->NullContext.TransferBuffer->field.
2444 WirelessPacket[TXWI_SIZE + TXINFO_SIZE], &pAd->NullFrame,
2445 sizeof(HEADER_802_11));
2446 pAd->NullContext.BulkOutSize =
2447 TXINFO_SIZE + TXWI_SIZE + sizeof(pAd->NullFrame) + 4;
2355} 2448}
2356#endif // RTMP_MAC_USB // 2449#endif // RTMP_MAC_USB //
2357 2450
@@ -2365,45 +2458,42 @@ VOID ComposeNullFrame(
2365 2458
2366 ========================================================================== 2459 ==========================================================================
2367*/ 2460*/
2368ULONG MakeIbssBeacon( 2461ULONG MakeIbssBeacon(IN PRTMP_ADAPTER pAd)
2369 IN PRTMP_ADAPTER pAd)
2370{ 2462{
2371 UCHAR DsLen = 1, IbssLen = 2; 2463 UCHAR DsLen = 1, IbssLen = 2;
2372 UCHAR LocalErpIe[3] = {IE_ERP, 1, 0x04}; 2464 UCHAR LocalErpIe[3] = { IE_ERP, 1, 0x04 };
2373 HEADER_802_11 BcnHdr; 2465 HEADER_802_11 BcnHdr;
2374 USHORT CapabilityInfo; 2466 USHORT CapabilityInfo;
2375 LARGE_INTEGER FakeTimestamp; 2467 LARGE_INTEGER FakeTimestamp;
2376 ULONG FrameLen = 0; 2468 ULONG FrameLen = 0;
2377 PTXWI_STRUC pTxWI = &pAd->BeaconTxWI; 2469 PTXWI_STRUC pTxWI = &pAd->BeaconTxWI;
2378 UCHAR *pBeaconFrame = pAd->BeaconBuf; 2470 UCHAR *pBeaconFrame = pAd->BeaconBuf;
2379 BOOLEAN Privacy; 2471 BOOLEAN Privacy;
2380 UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES]; 2472 UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES];
2381 UCHAR SupRateLen = 0; 2473 UCHAR SupRateLen = 0;
2382 UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES]; 2474 UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES];
2383 UCHAR ExtRateLen = 0; 2475 UCHAR ExtRateLen = 0;
2384 UCHAR RSNIe = IE_WPA; 2476 UCHAR RSNIe = IE_WPA;
2385 2477
2386 if ((pAd->CommonCfg.PhyMode == PHY_11B) && (pAd->CommonCfg.Channel <= 14)) 2478 if ((pAd->CommonCfg.PhyMode == PHY_11B)
2387 { 2479 && (pAd->CommonCfg.Channel <= 14)) {
2388 SupRate[0] = 0x82; // 1 mbps 2480 SupRate[0] = 0x82; // 1 mbps
2389 SupRate[1] = 0x84; // 2 mbps 2481 SupRate[1] = 0x84; // 2 mbps
2390 SupRate[2] = 0x8b; // 5.5 mbps 2482 SupRate[2] = 0x8b; // 5.5 mbps
2391 SupRate[3] = 0x96; // 11 mbps 2483 SupRate[3] = 0x96; // 11 mbps
2392 SupRateLen = 4; 2484 SupRateLen = 4;
2393 ExtRateLen = 0; 2485 ExtRateLen = 0;
2394 } 2486 } else if (pAd->CommonCfg.Channel > 14) {
2395 else if (pAd->CommonCfg.Channel > 14) 2487 SupRate[0] = 0x8C; // 6 mbps, in units of 0.5 Mbps, basic rate
2396 { 2488 SupRate[1] = 0x12; // 9 mbps, in units of 0.5 Mbps
2397 SupRate[0] = 0x8C; // 6 mbps, in units of 0.5 Mbps, basic rate 2489 SupRate[2] = 0x98; // 12 mbps, in units of 0.5 Mbps, basic rate
2398 SupRate[1] = 0x12; // 9 mbps, in units of 0.5 Mbps 2490 SupRate[3] = 0x24; // 18 mbps, in units of 0.5 Mbps
2399 SupRate[2] = 0x98; // 12 mbps, in units of 0.5 Mbps, basic rate 2491 SupRate[4] = 0xb0; // 24 mbps, in units of 0.5 Mbps, basic rate
2400 SupRate[3] = 0x24; // 18 mbps, in units of 0.5 Mbps 2492 SupRate[5] = 0x48; // 36 mbps, in units of 0.5 Mbps
2401 SupRate[4] = 0xb0; // 24 mbps, in units of 0.5 Mbps, basic rate 2493 SupRate[6] = 0x60; // 48 mbps, in units of 0.5 Mbps
2402 SupRate[5] = 0x48; // 36 mbps, in units of 0.5 Mbps 2494 SupRate[7] = 0x6c; // 54 mbps, in units of 0.5 Mbps
2403 SupRate[6] = 0x60; // 48 mbps, in units of 0.5 Mbps 2495 SupRateLen = 8;
2404 SupRate[7] = 0x6c; // 54 mbps, in units of 0.5 Mbps 2496 ExtRateLen = 0;
2405 SupRateLen = 8;
2406 ExtRateLen = 0;
2407 2497
2408 // 2498 //
2409 // Also Update MlmeRate & RtsRate for G only & A only 2499 // Also Update MlmeRate & RtsRate for G only & A only
@@ -2411,27 +2501,28 @@ ULONG MakeIbssBeacon(
2411 pAd->CommonCfg.MlmeRate = RATE_6; 2501 pAd->CommonCfg.MlmeRate = RATE_6;
2412 pAd->CommonCfg.RtsRate = RATE_6; 2502 pAd->CommonCfg.RtsRate = RATE_6;
2413 pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM; 2503 pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM;
2414 pAd->CommonCfg.MlmeTransmit.field.MCS = OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate]; 2504 pAd->CommonCfg.MlmeTransmit.field.MCS =
2415 pAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MODE = MODE_OFDM; 2505 OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate];
2416 pAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MCS = OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate]; 2506 pAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MODE =
2417 } 2507 MODE_OFDM;
2418 else 2508 pAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MCS =
2419 { 2509 OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate];
2420 SupRate[0] = 0x82; // 1 mbps 2510 } else {
2421 SupRate[1] = 0x84; // 2 mbps 2511 SupRate[0] = 0x82; // 1 mbps
2422 SupRate[2] = 0x8b; // 5.5 mbps 2512 SupRate[1] = 0x84; // 2 mbps
2423 SupRate[3] = 0x96; // 11 mbps 2513 SupRate[2] = 0x8b; // 5.5 mbps
2514 SupRate[3] = 0x96; // 11 mbps
2424 SupRateLen = 4; 2515 SupRateLen = 4;
2425 2516
2426 ExtRate[0] = 0x0C; // 6 mbps, in units of 0.5 Mbps, 2517 ExtRate[0] = 0x0C; // 6 mbps, in units of 0.5 Mbps,
2427 ExtRate[1] = 0x12; // 9 mbps, in units of 0.5 Mbps 2518 ExtRate[1] = 0x12; // 9 mbps, in units of 0.5 Mbps
2428 ExtRate[2] = 0x18; // 12 mbps, in units of 0.5 Mbps, 2519 ExtRate[2] = 0x18; // 12 mbps, in units of 0.5 Mbps,
2429 ExtRate[3] = 0x24; // 18 mbps, in units of 0.5 Mbps 2520 ExtRate[3] = 0x24; // 18 mbps, in units of 0.5 Mbps
2430 ExtRate[4] = 0x30; // 24 mbps, in units of 0.5 Mbps, 2521 ExtRate[4] = 0x30; // 24 mbps, in units of 0.5 Mbps,
2431 ExtRate[5] = 0x48; // 36 mbps, in units of 0.5 Mbps 2522 ExtRate[5] = 0x48; // 36 mbps, in units of 0.5 Mbps
2432 ExtRate[6] = 0x60; // 48 mbps, in units of 0.5 Mbps 2523 ExtRate[6] = 0x60; // 48 mbps, in units of 0.5 Mbps
2433 ExtRate[7] = 0x6c; // 54 mbps, in units of 0.5 Mbps 2524 ExtRate[7] = 0x6c; // 54 mbps, in units of 0.5 Mbps
2434 ExtRateLen = 8; 2525 ExtRateLen = 8;
2435 } 2526 }
2436 2527
2437 pAd->StaActive.SupRateLen = SupRateLen; 2528 pAd->StaActive.SupRateLen = SupRateLen;
@@ -2440,61 +2531,59 @@ ULONG MakeIbssBeacon(
2440 NdisMoveMemory(pAd->StaActive.ExtRate, ExtRate, ExtRateLen); 2531 NdisMoveMemory(pAd->StaActive.ExtRate, ExtRate, ExtRateLen);
2441 2532
2442 // compose IBSS beacon frame 2533 // compose IBSS beacon frame
2443 MgtMacHeaderInit(pAd, &BcnHdr, SUBTYPE_BEACON, 0, BROADCAST_ADDR, pAd->CommonCfg.Bssid); 2534 MgtMacHeaderInit(pAd, &BcnHdr, SUBTYPE_BEACON, 0, BROADCAST_ADDR,
2444 Privacy = (pAd->StaCfg.WepStatus == Ndis802_11Encryption1Enabled) || 2535 pAd->CommonCfg.Bssid);
2445 (pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled) || 2536 Privacy = (pAd->StaCfg.WepStatus == Ndis802_11Encryption1Enabled)
2446 (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled); 2537 || (pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled)
2447 CapabilityInfo = CAP_GENERATE(0, 1, Privacy, (pAd->CommonCfg.TxPreamble == Rt802_11PreambleShort), 0, 0); 2538 || (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled);
2448 2539 CapabilityInfo =
2449 MakeOutgoingFrame(pBeaconFrame, &FrameLen, 2540 CAP_GENERATE(0, 1, Privacy,
2450 sizeof(HEADER_802_11), &BcnHdr, 2541 (pAd->CommonCfg.TxPreamble == Rt802_11PreambleShort),
2451 TIMESTAMP_LEN, &FakeTimestamp, 2542 0, 0);
2452 2, &pAd->CommonCfg.BeaconPeriod, 2543
2453 2, &CapabilityInfo, 2544 MakeOutgoingFrame(pBeaconFrame, &FrameLen,
2454 1, &SsidIe, 2545 sizeof(HEADER_802_11), &BcnHdr,
2455 1, &pAd->CommonCfg.SsidLen, 2546 TIMESTAMP_LEN, &FakeTimestamp,
2456 pAd->CommonCfg.SsidLen, pAd->CommonCfg.Ssid, 2547 2, &pAd->CommonCfg.BeaconPeriod,
2457 1, &SupRateIe, 2548 2, &CapabilityInfo,
2458 1, &SupRateLen, 2549 1, &SsidIe,
2459 SupRateLen, SupRate, 2550 1, &pAd->CommonCfg.SsidLen,
2460 1, &DsIe, 2551 pAd->CommonCfg.SsidLen, pAd->CommonCfg.Ssid,
2461 1, &DsLen, 2552 1, &SupRateIe,
2462 1, &pAd->CommonCfg.Channel, 2553 1, &SupRateLen,
2463 1, &IbssIe, 2554 SupRateLen, SupRate,
2464 1, &IbssLen, 2555 1, &DsIe,
2465 2, &pAd->StaActive.AtimWin, 2556 1, &DsLen,
2466 END_OF_ARGS); 2557 1, &pAd->CommonCfg.Channel,
2558 1, &IbssIe,
2559 1, &IbssLen, 2, &pAd->StaActive.AtimWin, END_OF_ARGS);
2467 2560
2468 // add ERP_IE and EXT_RAE IE of in 802.11g 2561 // add ERP_IE and EXT_RAE IE of in 802.11g
2469 if (ExtRateLen) 2562 if (ExtRateLen) {
2470 { 2563 ULONG tmp;
2471 ULONG tmp; 2564
2472 2565 MakeOutgoingFrame(pBeaconFrame + FrameLen, &tmp,
2473 MakeOutgoingFrame(pBeaconFrame + FrameLen, &tmp, 2566 3, LocalErpIe,
2474 3, LocalErpIe, 2567 1, &ExtRateIe,
2475 1, &ExtRateIe, 2568 1, &ExtRateLen,
2476 1, &ExtRateLen, 2569 ExtRateLen, ExtRate, END_OF_ARGS);
2477 ExtRateLen, ExtRate,
2478 END_OF_ARGS);
2479 FrameLen += tmp; 2570 FrameLen += tmp;
2480 } 2571 }
2481
2482 // If adhoc secruity is set for WPA-None, append the cipher suite IE 2572 // If adhoc secruity is set for WPA-None, append the cipher suite IE
2483 if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone) 2573 if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone) {
2484 {
2485 ULONG tmp; 2574 ULONG tmp;
2486 RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, BSS0); 2575 RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus,
2487 2576 BSS0);
2488 MakeOutgoingFrame(pBeaconFrame + FrameLen, &tmp, 2577
2489 1, &RSNIe, 2578 MakeOutgoingFrame(pBeaconFrame + FrameLen, &tmp,
2490 1, &pAd->StaCfg.RSNIE_Len, 2579 1, &RSNIe,
2491 pAd->StaCfg.RSNIE_Len, pAd->StaCfg.RSN_IE, 2580 1, &pAd->StaCfg.RSNIE_Len,
2492 END_OF_ARGS); 2581 pAd->StaCfg.RSNIE_Len, pAd->StaCfg.RSN_IE,
2582 END_OF_ARGS);
2493 FrameLen += tmp; 2583 FrameLen += tmp;
2494 } 2584 }
2495 2585
2496 if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)) 2586 if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)) {
2497 {
2498 ULONG TmpLen; 2587 ULONG TmpLen;
2499 UCHAR HtLen, HtLen1; 2588 UCHAR HtLen, HtLen1;
2500 2589
@@ -2502,34 +2591,35 @@ ULONG MakeIbssBeacon(
2502 HtLen = sizeof(pAd->CommonCfg.HtCapability); 2591 HtLen = sizeof(pAd->CommonCfg.HtCapability);
2503 HtLen1 = sizeof(pAd->CommonCfg.AddHTInfo); 2592 HtLen1 = sizeof(pAd->CommonCfg.AddHTInfo);
2504 2593
2505 MakeOutgoingFrame(pBeaconFrame+FrameLen, &TmpLen, 2594 MakeOutgoingFrame(pBeaconFrame + FrameLen, &TmpLen,
2506 1, &HtCapIe, 2595 1, &HtCapIe,
2507 1, &HtLen, 2596 1, &HtLen,
2508 HtLen, &pAd->CommonCfg.HtCapability, 2597 HtLen, &pAd->CommonCfg.HtCapability,
2509 1, &AddHtInfoIe, 2598 1, &AddHtInfoIe,
2510 1, &HtLen1, 2599 1, &HtLen1,
2511 HtLen1, &pAd->CommonCfg.AddHTInfo, 2600 HtLen1, &pAd->CommonCfg.AddHTInfo,
2512 END_OF_ARGS); 2601 END_OF_ARGS);
2513 2602
2514 FrameLen += TmpLen; 2603 FrameLen += TmpLen;
2515 } 2604 }
2516
2517 //beacon use reserved WCID 0xff 2605 //beacon use reserved WCID 0xff
2518 if (pAd->CommonCfg.Channel > 14) 2606 if (pAd->CommonCfg.Channel > 14) {
2519 { 2607 RTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, TRUE, FALSE, FALSE,
2520 RTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, 0, 0xff, FrameLen, 2608 TRUE, 0, 0xff, FrameLen, PID_MGMT, PID_BEACON,
2521 PID_MGMT, PID_BEACON, RATE_1, IFS_HTTXOP, FALSE, &pAd->CommonCfg.MlmeTransmit); 2609 RATE_1, IFS_HTTXOP, FALSE,
2522 } 2610 &pAd->CommonCfg.MlmeTransmit);
2523 else 2611 } else {
2524 { 2612 // Set to use 1Mbps for Adhoc beacon.
2525 // Set to use 1Mbps for Adhoc beacon.
2526 HTTRANSMIT_SETTING Transmit; 2613 HTTRANSMIT_SETTING Transmit;
2527 Transmit.word = 0; 2614 Transmit.word = 0;
2528 RTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, 0, 0xff, FrameLen, 2615 RTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, TRUE, FALSE, FALSE,
2529 PID_MGMT, PID_BEACON, RATE_1, IFS_HTTXOP, FALSE, &Transmit); 2616 TRUE, 0, 0xff, FrameLen, PID_MGMT, PID_BEACON,
2530 } 2617 RATE_1, IFS_HTTXOP, FALSE, &Transmit);
2618 }
2531 2619
2532 DBGPRINT(RT_DEBUG_TRACE, ("MakeIbssBeacon (len=%ld), SupRateLen=%d, ExtRateLen=%d, Channel=%d, PhyMode=%d\n", 2620 DBGPRINT(RT_DEBUG_TRACE,
2533 FrameLen, SupRateLen, ExtRateLen, pAd->CommonCfg.Channel, pAd->CommonCfg.PhyMode)); 2621 ("MakeIbssBeacon (len=%ld), SupRateLen=%d, ExtRateLen=%d, Channel=%d, PhyMode=%d\n",
2622 FrameLen, SupRateLen, ExtRateLen, pAd->CommonCfg.Channel,
2623 pAd->CommonCfg.PhyMode));
2534 return FrameLen; 2624 return FrameLen;
2535} 2625}
diff --git a/drivers/staging/rt2860/sta/rtmp_data.c b/drivers/staging/rt2860/sta/rtmp_data.c
index 0ab3dce5d1a..3a93ef699ce 100644
--- a/drivers/staging/rt2860/sta/rtmp_data.c
+++ b/drivers/staging/rt2860/sta/rtmp_data.c
@@ -36,107 +36,164 @@
36*/ 36*/
37#include "../rt_config.h" 37#include "../rt_config.h"
38 38
39 39VOID STARxEAPOLFrameIndicate(IN PRTMP_ADAPTER pAd,
40 40 IN MAC_TABLE_ENTRY * pEntry,
41VOID STARxEAPOLFrameIndicate( 41 IN RX_BLK * pRxBlk, IN UCHAR FromWhichBSSID)
42 IN PRTMP_ADAPTER pAd,
43 IN MAC_TABLE_ENTRY *pEntry,
44 IN RX_BLK *pRxBlk,
45 IN UCHAR FromWhichBSSID)
46{ 42{
47 PRT28XX_RXD_STRUC pRxD = &(pRxBlk->RxD); 43 PRT28XX_RXD_STRUC pRxD = &(pRxBlk->RxD);
48 PRXWI_STRUC pRxWI = pRxBlk->pRxWI; 44 PRXWI_STRUC pRxWI = pRxBlk->pRxWI;
49 UCHAR *pTmpBuf; 45 UCHAR *pTmpBuf;
50 46
51 if (pAd->StaCfg.WpaSupplicantUP) 47 if (pAd->StaCfg.WpaSupplicantUP) {
52 {
53 // All EAPoL frames have to pass to upper layer (ex. WPA_SUPPLICANT daemon) 48 // All EAPoL frames have to pass to upper layer (ex. WPA_SUPPLICANT daemon)
54 // TBD : process fragmented EAPol frames 49 // TBD : process fragmented EAPol frames
55 { 50 {
56 // In 802.1x mode, if the received frame is EAP-SUCCESS packet, turn on the PortSecured variable 51 // In 802.1x mode, if the received frame is EAP-SUCCESS packet, turn on the PortSecured variable
57 if ( pAd->StaCfg.IEEE8021X == TRUE && 52 if (pAd->StaCfg.IEEE8021X == TRUE &&
58 (EAP_CODE_SUCCESS == WpaCheckEapCode(pAd, pRxBlk->pData, pRxBlk->DataSize, LENGTH_802_1_H))) 53 (EAP_CODE_SUCCESS ==
59 { 54 WpaCheckEapCode(pAd, pRxBlk->pData,
60 PUCHAR Key; 55 pRxBlk->DataSize,
61 UCHAR CipherAlg; 56 LENGTH_802_1_H))) {
62 int idx = 0; 57 PUCHAR Key;
63 58 UCHAR CipherAlg;
64 DBGPRINT_RAW(RT_DEBUG_TRACE, ("Receive EAP-SUCCESS Packet\n")); 59 int idx = 0;
60
61 DBGPRINT_RAW(RT_DEBUG_TRACE,
62 ("Receive EAP-SUCCESS Packet\n"));
65 //pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; 63 //pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;
66 STA_PORT_SECURED(pAd); 64 STA_PORT_SECURED(pAd);
67 65
68 if (pAd->StaCfg.IEEE8021x_required_keys == FALSE) 66 if (pAd->StaCfg.IEEE8021x_required_keys ==
69 { 67 FALSE) {
70 idx = pAd->StaCfg.DesireSharedKeyId; 68 idx = pAd->StaCfg.DesireSharedKeyId;
71 CipherAlg = pAd->StaCfg.DesireSharedKey[idx].CipherAlg; 69 CipherAlg =
72 Key = pAd->StaCfg.DesireSharedKey[idx].Key; 70 pAd->StaCfg.DesireSharedKey[idx].
73 71 CipherAlg;
74 if (pAd->StaCfg.DesireSharedKey[idx].KeyLen > 0) 72 Key =
75 { 73 pAd->StaCfg.DesireSharedKey[idx].
74 Key;
75
76 if (pAd->StaCfg.DesireSharedKey[idx].
77 KeyLen > 0) {
76#ifdef RTMP_MAC_PCI 78#ifdef RTMP_MAC_PCI
77 MAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[BSSID_WCID]; 79 MAC_TABLE_ENTRY *pEntry =
80 &pAd->MacTab.
81 Content[BSSID_WCID];
78 82
79 // Set key material and cipherAlg to Asic 83 // Set key material and cipherAlg to Asic
80 AsicAddSharedKeyEntry(pAd, BSS0, idx, CipherAlg, Key, NULL, NULL); 84 AsicAddSharedKeyEntry(pAd, BSS0,
85 idx,
86 CipherAlg,
87 Key, NULL,
88 NULL);
81 89
82 // Assign group key info 90 // Assign group key info
83 RTMPAddWcidAttributeEntry(pAd, BSS0, idx, CipherAlg, NULL); 91 RTMPAddWcidAttributeEntry(pAd,
92 BSS0,
93 idx,
94 CipherAlg,
95 NULL);
84 96
85 // Assign pairwise key info 97 // Assign pairwise key info
86 RTMPAddWcidAttributeEntry(pAd, BSS0, idx, CipherAlg, pEntry); 98 RTMPAddWcidAttributeEntry(pAd,
87 99 BSS0,
88 pAd->IndicateMediaState = NdisMediaStateConnected; 100 idx,
89 pAd->ExtraInfo = GENERAL_LINK_UP; 101 CipherAlg,
102 pEntry);
103
104 pAd->IndicateMediaState =
105 NdisMediaStateConnected;
106 pAd->ExtraInfo =
107 GENERAL_LINK_UP;
90#endif // RTMP_MAC_PCI // 108#endif // RTMP_MAC_PCI //
91#ifdef RTMP_MAC_USB 109#ifdef RTMP_MAC_USB
92 union 110 union {
93 { 111 char buf[sizeof
94 char buf[sizeof(NDIS_802_11_WEP)+MAX_LEN_OF_KEY- 1]; 112 (NDIS_802_11_WEP)
113 +
114 MAX_LEN_OF_KEY
115 - 1];
95 NDIS_802_11_WEP keyinfo; 116 NDIS_802_11_WEP keyinfo;
96 } WepKey; 117 }
118 WepKey;
97 int len; 119 int len;
98 120
99 121 NdisZeroMemory(&WepKey,
100 NdisZeroMemory(&WepKey, sizeof(WepKey)); 122 sizeof(WepKey));
101 len =pAd->StaCfg.DesireSharedKey[idx].KeyLen; 123 len =
102 124 pAd->StaCfg.
103 NdisMoveMemory(WepKey.keyinfo.KeyMaterial, 125 DesireSharedKey[idx].KeyLen;
104 pAd->StaCfg.DesireSharedKey[idx].Key, 126
105 pAd->StaCfg.DesireSharedKey[idx].KeyLen); 127 NdisMoveMemory(WepKey.keyinfo.
106 128 KeyMaterial,
107 WepKey.keyinfo.KeyIndex = 0x80000000 + idx; 129 pAd->StaCfg.
130 DesireSharedKey
131 [idx].Key,
132 pAd->StaCfg.
133 DesireSharedKey
134 [idx].KeyLen);
135
136 WepKey.keyinfo.KeyIndex =
137 0x80000000 + idx;
108 WepKey.keyinfo.KeyLength = len; 138 WepKey.keyinfo.KeyLength = len;
109 pAd->SharedKey[BSS0][idx].KeyLen =(UCHAR) (len <= 5 ? 5 : 13); 139 pAd->SharedKey[BSS0][idx].
110 140 KeyLen =
111 pAd->IndicateMediaState = NdisMediaStateConnected; 141 (UCHAR) (len <= 5 ? 5 : 13);
112 pAd->ExtraInfo = GENERAL_LINK_UP; 142
143 pAd->IndicateMediaState =
144 NdisMediaStateConnected;
145 pAd->ExtraInfo =
146 GENERAL_LINK_UP;
113 // need to enqueue cmd to thread 147 // need to enqueue cmd to thread
114 RTUSBEnqueueCmdFromNdis(pAd, OID_802_11_ADD_WEP, TRUE, &WepKey, sizeof(WepKey.keyinfo) + len - 1); 148 RTUSBEnqueueCmdFromNdis(pAd,
149 OID_802_11_ADD_WEP,
150 TRUE,
151 &WepKey,
152 sizeof
153 (WepKey.
154 keyinfo)
155 + len -
156 1);
115#endif // RTMP_MAC_USB // 157#endif // RTMP_MAC_USB //
116 // For Preventing ShardKey Table is cleared by remove key procedure. 158 // For Preventing ShardKey Table is cleared by remove key procedure.
117 pAd->SharedKey[BSS0][idx].CipherAlg = CipherAlg; 159 pAd->SharedKey[BSS0][idx].
118 pAd->SharedKey[BSS0][idx].KeyLen = pAd->StaCfg.DesireSharedKey[idx].KeyLen; 160 CipherAlg = CipherAlg;
119 NdisMoveMemory(pAd->SharedKey[BSS0][idx].Key, 161 pAd->SharedKey[BSS0][idx].
120 pAd->StaCfg.DesireSharedKey[idx].Key, 162 KeyLen =
121 pAd->StaCfg.DesireSharedKey[idx].KeyLen); 163 pAd->StaCfg.
122 } 164 DesireSharedKey[idx].KeyLen;
165 NdisMoveMemory(pAd->
166 SharedKey[BSS0]
167 [idx].Key,
168 pAd->StaCfg.
169 DesireSharedKey
170 [idx].Key,
171 pAd->StaCfg.
172 DesireSharedKey
173 [idx].KeyLen);
174 }
123 } 175 }
124 } 176 }
125 177
126 Indicate_Legacy_Packet(pAd, pRxBlk, FromWhichBSSID); 178 Indicate_Legacy_Packet(pAd, pRxBlk, FromWhichBSSID);
127 return; 179 return;
128 } 180 }
129 } 181 } else {
130 else
131 {
132 // Special DATA frame that has to pass to MLME 182 // Special DATA frame that has to pass to MLME
133 // 1. Cisco Aironet frames for CCX2. We need pass it to MLME for special process 183 // 1. Cisco Aironet frames for CCX2. We need pass it to MLME for special process
134 // 2. EAPOL handshaking frames when driver supplicant enabled, pass to MLME for special process 184 // 2. EAPOL handshaking frames when driver supplicant enabled, pass to MLME for special process
135 { 185 {
136 pTmpBuf = pRxBlk->pData - LENGTH_802_11; 186 pTmpBuf = pRxBlk->pData - LENGTH_802_11;
137 NdisMoveMemory(pTmpBuf, pRxBlk->pHeader, LENGTH_802_11); 187 NdisMoveMemory(pTmpBuf, pRxBlk->pHeader, LENGTH_802_11);
138 REPORT_MGMT_FRAME_TO_MLME(pAd, pRxWI->WirelessCliID, pTmpBuf, pRxBlk->DataSize + LENGTH_802_11, pRxWI->RSSI0, pRxWI->RSSI1, pRxWI->RSSI2, pRxD->PlcpSignal); 188 REPORT_MGMT_FRAME_TO_MLME(pAd, pRxWI->WirelessCliID,
139 DBGPRINT_RAW(RT_DEBUG_TRACE, ("!!! report EAPOL/AIRONET DATA to MLME (len=%d) !!!\n", pRxBlk->DataSize)); 189 pTmpBuf,
190 pRxBlk->DataSize +
191 LENGTH_802_11, pRxWI->RSSI0,
192 pRxWI->RSSI1, pRxWI->RSSI2,
193 pRxD->PlcpSignal);
194 DBGPRINT_RAW(RT_DEBUG_TRACE,
195 ("!!! report EAPOL/AIRONET DATA to MLME (len=%d) !!!\n",
196 pRxBlk->DataSize));
140 } 197 }
141 } 198 }
142 199
@@ -145,126 +202,114 @@ VOID STARxEAPOLFrameIndicate(
145 202
146} 203}
147 204
148VOID STARxDataFrameAnnounce( 205VOID STARxDataFrameAnnounce(IN PRTMP_ADAPTER pAd,
149 IN PRTMP_ADAPTER pAd, 206 IN MAC_TABLE_ENTRY * pEntry,
150 IN MAC_TABLE_ENTRY *pEntry, 207 IN RX_BLK * pRxBlk, IN UCHAR FromWhichBSSID)
151 IN RX_BLK *pRxBlk,
152 IN UCHAR FromWhichBSSID)
153{ 208{
154 209
155 // non-EAP frame 210 // non-EAP frame
156 if (!RTMPCheckWPAframe(pAd, pEntry, pRxBlk->pData, pRxBlk->DataSize, FromWhichBSSID)) 211 if (!RTMPCheckWPAframe
157 { 212 (pAd, pEntry, pRxBlk->pData, pRxBlk->DataSize, FromWhichBSSID)) {
158 213
159 { 214 {
160 // drop all non-EAP DATA frame before 215 // drop all non-EAP DATA frame before
161 // this client's Port-Access-Control is secured 216 // this client's Port-Access-Control is secured
162 if (pRxBlk->pHeader->FC.Wep) 217 if (pRxBlk->pHeader->FC.Wep) {
163 {
164 // unsupported cipher suite 218 // unsupported cipher suite
165 if (pAd->StaCfg.WepStatus == Ndis802_11EncryptionDisabled) 219 if (pAd->StaCfg.WepStatus ==
166 { 220 Ndis802_11EncryptionDisabled) {
167 // release packet 221 // release packet
168 RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE); 222 RELEASE_NDIS_PACKET(pAd,
223 pRxBlk->pRxPacket,
224 NDIS_STATUS_FAILURE);
169 return; 225 return;
170 } 226 }
171 } 227 } else {
172 else
173 {
174 // encryption in-use but receive a non-EAPOL clear text frame, drop it 228 // encryption in-use but receive a non-EAPOL clear text frame, drop it
175 if ((pAd->StaCfg.WepStatus != Ndis802_11EncryptionDisabled) && 229 if ((pAd->StaCfg.WepStatus !=
176 (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED)) 230 Ndis802_11EncryptionDisabled)
177 { 231 && (pAd->StaCfg.PortSecured ==
232 WPA_802_1X_PORT_NOT_SECURED)) {
178 // release packet 233 // release packet
179 RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE); 234 RELEASE_NDIS_PACKET(pAd,
235 pRxBlk->pRxPacket,
236 NDIS_STATUS_FAILURE);
180 return; 237 return;
181 } 238 }
182 } 239 }
183 } 240 }
184 RX_BLK_CLEAR_FLAG(pRxBlk, fRX_EAP); 241 RX_BLK_CLEAR_FLAG(pRxBlk, fRX_EAP);
185 if (!RX_BLK_TEST_FLAG(pRxBlk, fRX_ARALINK)) 242 if (!RX_BLK_TEST_FLAG(pRxBlk, fRX_ARALINK)) {
186 {
187 // Normal legacy, AMPDU or AMSDU 243 // Normal legacy, AMPDU or AMSDU
188 CmmRxnonRalinkFrameIndicate(pAd, pRxBlk, FromWhichBSSID); 244 CmmRxnonRalinkFrameIndicate(pAd, pRxBlk,
245 FromWhichBSSID);
189 246
190 } 247 } else {
191 else
192 {
193 // ARALINK 248 // ARALINK
194 CmmRxRalinkFrameIndicate(pAd, pEntry, pRxBlk, FromWhichBSSID); 249 CmmRxRalinkFrameIndicate(pAd, pEntry, pRxBlk,
250 FromWhichBSSID);
195 } 251 }
196 } 252 } else {
197 else
198 {
199 RX_BLK_SET_FLAG(pRxBlk, fRX_EAP); 253 RX_BLK_SET_FLAG(pRxBlk, fRX_EAP);
200 254
201 if (RX_BLK_TEST_FLAG(pRxBlk, fRX_AMPDU) && (pAd->CommonCfg.bDisableReordering == 0)) 255 if (RX_BLK_TEST_FLAG(pRxBlk, fRX_AMPDU)
202 { 256 && (pAd->CommonCfg.bDisableReordering == 0)) {
203 Indicate_AMPDU_Packet(pAd, pRxBlk, FromWhichBSSID); 257 Indicate_AMPDU_Packet(pAd, pRxBlk, FromWhichBSSID);
204 } 258 } else {
205 else
206 {
207 // Determin the destination of the EAP frame 259 // Determin the destination of the EAP frame
208 // to WPA state machine or upper layer 260 // to WPA state machine or upper layer
209 STARxEAPOLFrameIndicate(pAd, pEntry, pRxBlk, FromWhichBSSID); 261 STARxEAPOLFrameIndicate(pAd, pEntry, pRxBlk,
262 FromWhichBSSID);
210 } 263 }
211 } 264 }
212} 265}
213 266
214
215// For TKIP frame, calculate the MIC value 267// For TKIP frame, calculate the MIC value
216BOOLEAN STACheckTkipMICValue( 268BOOLEAN STACheckTkipMICValue(IN PRTMP_ADAPTER pAd,
217 IN PRTMP_ADAPTER pAd, 269 IN MAC_TABLE_ENTRY * pEntry, IN RX_BLK * pRxBlk)
218 IN MAC_TABLE_ENTRY *pEntry,
219 IN RX_BLK *pRxBlk)
220{ 270{
221 PHEADER_802_11 pHeader = pRxBlk->pHeader; 271 PHEADER_802_11 pHeader = pRxBlk->pHeader;
222 UCHAR *pData = pRxBlk->pData; 272 UCHAR *pData = pRxBlk->pData;
223 USHORT DataSize = pRxBlk->DataSize; 273 USHORT DataSize = pRxBlk->DataSize;
224 UCHAR UserPriority = pRxBlk->UserPriority; 274 UCHAR UserPriority = pRxBlk->UserPriority;
225 PCIPHER_KEY pWpaKey; 275 PCIPHER_KEY pWpaKey;
226 UCHAR *pDA, *pSA; 276 UCHAR *pDA, *pSA;
227 277
228 pWpaKey = &pAd->SharedKey[BSS0][pRxBlk->pRxWI->KeyIndex]; 278 pWpaKey = &pAd->SharedKey[BSS0][pRxBlk->pRxWI->KeyIndex];
229 279
230 pDA = pHeader->Addr1; 280 pDA = pHeader->Addr1;
231 if (RX_BLK_TEST_FLAG(pRxBlk, fRX_INFRA)) 281 if (RX_BLK_TEST_FLAG(pRxBlk, fRX_INFRA)) {
232 {
233 pSA = pHeader->Addr3; 282 pSA = pHeader->Addr3;
234 } 283 } else {
235 else
236 {
237 pSA = pHeader->Addr2; 284 pSA = pHeader->Addr2;
238 } 285 }
239 286
240 if (RTMPTkipCompareMICValue(pAd, 287 if (RTMPTkipCompareMICValue(pAd,
241 pData, 288 pData,
242 pDA, 289 pDA,
243 pSA, 290 pSA,
244 pWpaKey->RxMic, 291 pWpaKey->RxMic,
245 UserPriority, 292 UserPriority, DataSize) == FALSE) {
246 DataSize) == FALSE) 293 DBGPRINT_RAW(RT_DEBUG_ERROR, ("Rx MIC Value error 2\n"));
247 { 294
248 DBGPRINT_RAW(RT_DEBUG_ERROR,("Rx MIC Value error 2\n")); 295 if (pAd->StaCfg.WpaSupplicantUP) {
249 296 WpaSendMicFailureToWpaSupplicant(pAd,
250 if (pAd->StaCfg.WpaSupplicantUP) 297 (pWpaKey->Type ==
251 { 298 PAIRWISEKEY) ? TRUE :
252 WpaSendMicFailureToWpaSupplicant(pAd, (pWpaKey->Type == PAIRWISEKEY) ? TRUE : FALSE); 299 FALSE);
253 } 300 } else {
254 else
255 {
256 RTMPReportMicError(pAd, pWpaKey); 301 RTMPReportMicError(pAd, pWpaKey);
257 } 302 }
258 303
259 // release packet 304 // release packet
260 RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE); 305 RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket,
306 NDIS_STATUS_FAILURE);
261 return FALSE; 307 return FALSE;
262 } 308 }
263 309
264 return TRUE; 310 return TRUE;
265} 311}
266 312
267
268// 313//
269// All Rx routines use RX_BLK structure to hande rx events 314// All Rx routines use RX_BLK structure to hande rx events
270// It is very important to build pRxBlk attributes 315// It is very important to build pRxBlk attributes
@@ -273,106 +318,112 @@ BOOLEAN STACheckTkipMICValue(
273// 3. set payload size including LLC to DataSize 318// 3. set payload size including LLC to DataSize
274// 4. set some flags with RX_BLK_SET_FLAG() 319// 4. set some flags with RX_BLK_SET_FLAG()
275// 320//
276VOID STAHandleRxDataFrame( 321VOID STAHandleRxDataFrame(IN PRTMP_ADAPTER pAd, IN RX_BLK * pRxBlk)
277 IN PRTMP_ADAPTER pAd,
278 IN RX_BLK *pRxBlk)
279{ 322{
280 PRT28XX_RXD_STRUC pRxD = &(pRxBlk->RxD); 323 PRT28XX_RXD_STRUC pRxD = &(pRxBlk->RxD);
281 PRXWI_STRUC pRxWI = pRxBlk->pRxWI; 324 PRXWI_STRUC pRxWI = pRxBlk->pRxWI;
282 PHEADER_802_11 pHeader = pRxBlk->pHeader; 325 PHEADER_802_11 pHeader = pRxBlk->pHeader;
283 PNDIS_PACKET pRxPacket = pRxBlk->pRxPacket; 326 PNDIS_PACKET pRxPacket = pRxBlk->pRxPacket;
284 BOOLEAN bFragment = FALSE; 327 BOOLEAN bFragment = FALSE;
285 MAC_TABLE_ENTRY *pEntry = NULL; 328 MAC_TABLE_ENTRY *pEntry = NULL;
286 UCHAR FromWhichBSSID = BSS0; 329 UCHAR FromWhichBSSID = BSS0;
287 UCHAR UserPriority = 0; 330 UCHAR UserPriority = 0;
288 331
289 { 332 {
290 // before LINK UP, all DATA frames are rejected 333 // before LINK UP, all DATA frames are rejected
291 if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) 334 if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) {
292 {
293 // release packet 335 // release packet
294 RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); 336 RELEASE_NDIS_PACKET(pAd, pRxPacket,
337 NDIS_STATUS_FAILURE);
295 return; 338 return;
296 } 339 }
297
298 // Drop not my BSS frames 340 // Drop not my BSS frames
299 if (pRxD->MyBss == 0) 341 if (pRxD->MyBss == 0) {
300 {
301 { 342 {
302 // release packet 343 // release packet
303 RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); 344 RELEASE_NDIS_PACKET(pAd, pRxPacket,
345 NDIS_STATUS_FAILURE);
304 return; 346 return;
305 } 347 }
306 } 348 }
307 349
308 pAd->RalinkCounters.RxCountSinceLastNULL++; 350 pAd->RalinkCounters.RxCountSinceLastNULL++;
309 if (pAd->CommonCfg.bAPSDCapable && pAd->CommonCfg.APEdcaParm.bAPSDCapable && (pHeader->FC.SubType & 0x08)) 351 if (pAd->CommonCfg.bAPSDCapable
310 { 352 && pAd->CommonCfg.APEdcaParm.bAPSDCapable
353 && (pHeader->FC.SubType & 0x08)) {
311 UCHAR *pData; 354 UCHAR *pData;
312 DBGPRINT(RT_DEBUG_INFO,("bAPSDCapable\n")); 355 DBGPRINT(RT_DEBUG_INFO, ("bAPSDCapable\n"));
313 356
314 // Qos bit 4 357 // Qos bit 4
315 pData = (PUCHAR)pHeader + LENGTH_802_11; 358 pData = (PUCHAR) pHeader + LENGTH_802_11;
316 if ((*pData >> 4) & 0x01) 359 if ((*pData >> 4) & 0x01) {
317 { 360 DBGPRINT(RT_DEBUG_INFO,
318 DBGPRINT(RT_DEBUG_INFO,("RxDone- Rcv EOSP frame, driver may fall into sleep\n")); 361 ("RxDone- Rcv EOSP frame, driver may fall into sleep\n"));
319 pAd->CommonCfg.bInServicePeriod = FALSE; 362 pAd->CommonCfg.bInServicePeriod = FALSE;
320 363
321 // Force driver to fall into sleep mode when rcv EOSP frame 364 // Force driver to fall into sleep mode when rcv EOSP frame
322 if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) 365 if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) {
323 { 366 USHORT TbttNumToNextWakeUp;
324 USHORT TbttNumToNextWakeUp; 367 USHORT NextDtim =
325 USHORT NextDtim = pAd->StaCfg.DtimPeriod; 368 pAd->StaCfg.DtimPeriod;
326 ULONG Now; 369 ULONG Now;
327 370
328 NdisGetSystemUpTime(&Now); 371 NdisGetSystemUpTime(&Now);
329 NextDtim -= (USHORT)(Now - pAd->StaCfg.LastBeaconRxTime)/pAd->CommonCfg.BeaconPeriod; 372 NextDtim -=
330 373 (USHORT) (Now -
331 TbttNumToNextWakeUp = pAd->StaCfg.DefaultListenCount; 374 pAd->StaCfg.
332 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM) && (TbttNumToNextWakeUp > NextDtim)) 375 LastBeaconRxTime) /
376 pAd->CommonCfg.BeaconPeriod;
377
378 TbttNumToNextWakeUp =
379 pAd->StaCfg.DefaultListenCount;
380 if (OPSTATUS_TEST_FLAG
381 (pAd, fOP_STATUS_RECEIVE_DTIM)
382 && (TbttNumToNextWakeUp > NextDtim))
333 TbttNumToNextWakeUp = NextDtim; 383 TbttNumToNextWakeUp = NextDtim;
334 384
335 RTMP_SET_PSM_BIT(pAd, PWR_SAVE); 385 RTMP_SET_PSM_BIT(pAd, PWR_SAVE);
336 // if WMM-APSD is failed, try to disable following line 386 // if WMM-APSD is failed, try to disable following line
337 AsicSleepThenAutoWakeup(pAd, TbttNumToNextWakeUp); 387 AsicSleepThenAutoWakeup(pAd,
388 TbttNumToNextWakeUp);
338 } 389 }
339 } 390 }
340 391
341 if ((pHeader->FC.MoreData) && (pAd->CommonCfg.bInServicePeriod)) 392 if ((pHeader->FC.MoreData)
342 { 393 && (pAd->CommonCfg.bInServicePeriod)) {
343 DBGPRINT(RT_DEBUG_TRACE,("Sending another trigger frame when More Data bit is set to 1\n")); 394 DBGPRINT(RT_DEBUG_TRACE,
395 ("Sending another trigger frame when More Data bit is set to 1\n"));
344 } 396 }
345 } 397 }
346
347 // Drop NULL, CF-ACK(no data), CF-POLL(no data), and CF-ACK+CF-POLL(no data) data frame 398 // Drop NULL, CF-ACK(no data), CF-POLL(no data), and CF-ACK+CF-POLL(no data) data frame
348 if ((pHeader->FC.SubType & 0x04)) // bit 2 : no DATA 399 if ((pHeader->FC.SubType & 0x04)) // bit 2 : no DATA
349 { 400 {
350 // release packet 401 // release packet
351 RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); 402 RELEASE_NDIS_PACKET(pAd, pRxPacket,
403 NDIS_STATUS_FAILURE);
352 return; 404 return;
353 } 405 }
406 // Drop not my BSS frame (we can not only check the MyBss bit in RxD)
354 407
355 // Drop not my BSS frame (we can not only check the MyBss bit in RxD) 408 if (INFRA_ON(pAd)) {
356
357 if (INFRA_ON(pAd))
358 {
359 // Infrastructure mode, check address 2 for BSSID 409 // Infrastructure mode, check address 2 for BSSID
360 if (!RTMPEqualMemory(&pHeader->Addr2, &pAd->CommonCfg.Bssid, 6)) 410 if (!RTMPEqualMemory
361 { 411 (&pHeader->Addr2, &pAd->CommonCfg.Bssid, 6)) {
362 // Receive frame not my BSSID 412 // Receive frame not my BSSID
363 // release packet 413 // release packet
364 RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); 414 RELEASE_NDIS_PACKET(pAd, pRxPacket,
415 NDIS_STATUS_FAILURE);
365 return; 416 return;
366 } 417 }
367 } 418 } else // Ad-Hoc mode or Not associated
368 else // Ad-Hoc mode or Not associated
369 { 419 {
370 // Ad-Hoc mode, check address 3 for BSSID 420 // Ad-Hoc mode, check address 3 for BSSID
371 if (!RTMPEqualMemory(&pHeader->Addr3, &pAd->CommonCfg.Bssid, 6)) 421 if (!RTMPEqualMemory
372 { 422 (&pHeader->Addr3, &pAd->CommonCfg.Bssid, 6)) {
373 // Receive frame not my BSSID 423 // Receive frame not my BSSID
374 // release packet 424 // release packet
375 RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); 425 RELEASE_NDIS_PACKET(pAd, pRxPacket,
426 NDIS_STATUS_FAILURE);
376 return; 427 return;
377 } 428 }
378 } 429 }
@@ -380,39 +431,35 @@ VOID STAHandleRxDataFrame(
380 // 431 //
381 // find pEntry 432 // find pEntry
382 // 433 //
383 if (pRxWI->WirelessCliID < MAX_LEN_OF_MAC_TABLE) 434 if (pRxWI->WirelessCliID < MAX_LEN_OF_MAC_TABLE) {
384 {
385 pEntry = &pAd->MacTab.Content[pRxWI->WirelessCliID]; 435 pEntry = &pAd->MacTab.Content[pRxWI->WirelessCliID];
386 } 436 } else {
387 else
388 {
389 // 1. release packet if infra mode 437 // 1. release packet if infra mode
390 // 2. new a pEntry if ad-hoc mode 438 // 2. new a pEntry if ad-hoc mode
391 RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); 439 RELEASE_NDIS_PACKET(pAd, pRxPacket,
440 NDIS_STATUS_FAILURE);
392 return; 441 return;
393 } 442 }
394 443
395 // infra or ad-hoc 444 // infra or ad-hoc
396 if (INFRA_ON(pAd)) 445 if (INFRA_ON(pAd)) {
397 {
398 RX_BLK_SET_FLAG(pRxBlk, fRX_INFRA); 446 RX_BLK_SET_FLAG(pRxBlk, fRX_INFRA);
399 ASSERT(pRxWI->WirelessCliID == BSSID_WCID); 447 ASSERT(pRxWI->WirelessCliID == BSSID_WCID);
400 } 448 }
401
402 // check Atheros Client 449 // check Atheros Client
403 if ((pEntry->bIAmBadAtheros == FALSE) && (pRxD->AMPDU == 1) && (pHeader->FC.Retry )) 450 if ((pEntry->bIAmBadAtheros == FALSE) && (pRxD->AMPDU == 1)
404 { 451 && (pHeader->FC.Retry)) {
405 pEntry->bIAmBadAtheros = TRUE; 452 pEntry->bIAmBadAtheros = TRUE;
406 pAd->CommonCfg.IOTestParm.bCurrentAtheros = TRUE; 453 pAd->CommonCfg.IOTestParm.bCurrentAtheros = TRUE;
407 pAd->CommonCfg.IOTestParm.bLastAtheros = TRUE; 454 pAd->CommonCfg.IOTestParm.bLastAtheros = TRUE;
408 if (!STA_AES_ON(pAd)) 455 if (!STA_AES_ON(pAd)) {
409 { 456 AsicUpdateProtect(pAd, 8, ALLN_SETPROTECT, TRUE,
410 AsicUpdateProtect(pAd, 8, ALLN_SETPROTECT, TRUE, FALSE); 457 FALSE);
411 } 458 }
412 } 459 }
413 } 460 }
414 461
415 pRxBlk->pData = (UCHAR *)pHeader; 462 pRxBlk->pData = (UCHAR *) pHeader;
416 463
417 // 464 //
418 // update RxBlk->pData, DataSize 465 // update RxBlk->pData, DataSize
@@ -426,48 +473,41 @@ VOID STAHandleRxDataFrame(
426 } 473 }
427 474
428 // 2. QOS 475 // 2. QOS
429 if (pHeader->FC.SubType & 0x08) 476 if (pHeader->FC.SubType & 0x08) {
430 {
431 RX_BLK_SET_FLAG(pRxBlk, fRX_QOS); 477 RX_BLK_SET_FLAG(pRxBlk, fRX_QOS);
432 UserPriority = *(pRxBlk->pData) & 0x0f; 478 UserPriority = *(pRxBlk->pData) & 0x0f;
433 // bit 7 in QoS Control field signals the HT A-MSDU format 479 // bit 7 in QoS Control field signals the HT A-MSDU format
434 if ((*pRxBlk->pData) & 0x80) 480 if ((*pRxBlk->pData) & 0x80) {
435 {
436 RX_BLK_SET_FLAG(pRxBlk, fRX_AMSDU); 481 RX_BLK_SET_FLAG(pRxBlk, fRX_AMSDU);
437 } 482 }
438
439 // skip QOS contorl field 483 // skip QOS contorl field
440 pRxBlk->pData += 2; 484 pRxBlk->pData += 2;
441 pRxBlk->DataSize -=2; 485 pRxBlk->DataSize -= 2;
442 } 486 }
443 pRxBlk->UserPriority = UserPriority; 487 pRxBlk->UserPriority = UserPriority;
444 488
445 /* check if need to resend PS Poll when received packet with MoreData = 1 */ 489 /* check if need to resend PS Poll when received packet with MoreData = 1 */
446 if ((pAd->StaCfg.Psm == PWR_SAVE) && (pHeader->FC.MoreData == 1)) 490 if ((pAd->StaCfg.Psm == PWR_SAVE) && (pHeader->FC.MoreData == 1)) {
447 {
448 if ((((UserPriority == 0) || (UserPriority == 3)) && 491 if ((((UserPriority == 0) || (UserPriority == 3)) &&
449 pAd->CommonCfg.bAPSDAC_BE == 0) || 492 pAd->CommonCfg.bAPSDAC_BE == 0) ||
450 (((UserPriority == 1) || (UserPriority == 2)) && 493 (((UserPriority == 1) || (UserPriority == 2)) &&
451 pAd->CommonCfg.bAPSDAC_BK == 0) || 494 pAd->CommonCfg.bAPSDAC_BK == 0) ||
452 (((UserPriority == 4) || (UserPriority == 5)) && 495 (((UserPriority == 4) || (UserPriority == 5)) &&
453 pAd->CommonCfg.bAPSDAC_VI == 0) || 496 pAd->CommonCfg.bAPSDAC_VI == 0) ||
454 (((UserPriority == 6) || (UserPriority == 7)) && 497 (((UserPriority == 6) || (UserPriority == 7)) &&
455 pAd->CommonCfg.bAPSDAC_VO == 0)) 498 pAd->CommonCfg.bAPSDAC_VO == 0)) {
456 {
457 /* non-UAPSD delivery-enabled AC */ 499 /* non-UAPSD delivery-enabled AC */
458 RTMP_PS_POLL_ENQUEUE(pAd); 500 RTMP_PS_POLL_ENQUEUE(pAd);
459 } 501 }
460 } 502 }
461
462 // 3. Order bit: A-Ralink or HTC+ 503 // 3. Order bit: A-Ralink or HTC+
463 if (pHeader->FC.Order) 504 if (pHeader->FC.Order) {
464 {
465#ifdef AGGREGATION_SUPPORT 505#ifdef AGGREGATION_SUPPORT
466 if ((pRxWI->PHYMODE <= MODE_OFDM) && (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED))) 506 if ((pRxWI->PHYMODE <= MODE_OFDM)
507 && (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED)))
467 { 508 {
468 RX_BLK_SET_FLAG(pRxBlk, fRX_ARALINK); 509 RX_BLK_SET_FLAG(pRxBlk, fRX_ARALINK);
469 } 510 } else
470 else
471#endif // AGGREGATION_SUPPORT // 511#endif // AGGREGATION_SUPPORT //
472 { 512 {
473 RX_BLK_SET_FLAG(pRxBlk, fRX_HTC); 513 RX_BLK_SET_FLAG(pRxBlk, fRX_HTC);
@@ -476,102 +516,93 @@ VOID STAHandleRxDataFrame(
476 pRxBlk->DataSize -= 4; 516 pRxBlk->DataSize -= 4;
477 } 517 }
478 } 518 }
479
480 // 4. skip HW padding 519 // 4. skip HW padding
481 if (pRxD->L2PAD) 520 if (pRxD->L2PAD) {
482 {
483 // just move pData pointer 521 // just move pData pointer
484 // because DataSize excluding HW padding 522 // because DataSize excluding HW padding
485 RX_BLK_SET_FLAG(pRxBlk, fRX_PAD); 523 RX_BLK_SET_FLAG(pRxBlk, fRX_PAD);
486 pRxBlk->pData += 2; 524 pRxBlk->pData += 2;
487 } 525 }
488 526
489 if (pRxD->BA) 527 if (pRxD->BA) {
490 {
491 RX_BLK_SET_FLAG(pRxBlk, fRX_AMPDU); 528 RX_BLK_SET_FLAG(pRxBlk, fRX_AMPDU);
492 } 529 }
493
494 // 530 //
495 // Case I Process Broadcast & Multicast data frame 531 // Case I Process Broadcast & Multicast data frame
496 // 532 //
497 if (pRxD->Bcast || pRxD->Mcast) 533 if (pRxD->Bcast || pRxD->Mcast) {
498 {
499 INC_COUNTER64(pAd->WlanCounters.MulticastReceivedFrameCount); 534 INC_COUNTER64(pAd->WlanCounters.MulticastReceivedFrameCount);
500 535
501 // Drop Mcast/Bcast frame with fragment bit on 536 // Drop Mcast/Bcast frame with fragment bit on
502 if (pHeader->FC.MoreFrag) 537 if (pHeader->FC.MoreFrag) {
503 {
504 // release packet 538 // release packet
505 RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); 539 RELEASE_NDIS_PACKET(pAd, pRxPacket,
540 NDIS_STATUS_FAILURE);
506 return; 541 return;
507 } 542 }
508
509 // Filter out Bcast frame which AP relayed for us 543 // Filter out Bcast frame which AP relayed for us
510 if (pHeader->FC.FrDs && MAC_ADDR_EQUAL(pHeader->Addr3, pAd->CurrentAddress)) 544 if (pHeader->FC.FrDs
511 { 545 && MAC_ADDR_EQUAL(pHeader->Addr3, pAd->CurrentAddress)) {
512 // release packet 546 // release packet
513 RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); 547 RELEASE_NDIS_PACKET(pAd, pRxPacket,
548 NDIS_STATUS_FAILURE);
514 return; 549 return;
515 } 550 }
516 551
517 Indicate_Legacy_Packet(pAd, pRxBlk, FromWhichBSSID); 552 Indicate_Legacy_Packet(pAd, pRxBlk, FromWhichBSSID);
518 return; 553 return;
519 } 554 } else if (pRxD->U2M) {
520 else if (pRxD->U2M) 555 pAd->LastRxRate =
521 { 556 (USHORT) ((pRxWI->MCS) + (pRxWI->BW << 7) +
522 pAd->LastRxRate = (USHORT)((pRxWI->MCS) + (pRxWI->BW <<7) + (pRxWI->ShortGI <<8)+ (pRxWI->PHYMODE <<14)) ; 557 (pRxWI->ShortGI << 8) + (pRxWI->PHYMODE << 14));
523 558
524 if (ADHOC_ON(pAd)) 559 if (ADHOC_ON(pAd)) {
525 {
526 pEntry = MacTableLookup(pAd, pHeader->Addr2); 560 pEntry = MacTableLookup(pAd, pHeader->Addr2);
527 if (pEntry) 561 if (pEntry)
528 Update_Rssi_Sample(pAd, &pEntry->RssiSample, pRxWI); 562 Update_Rssi_Sample(pAd, &pEntry->RssiSample,
563 pRxWI);
529 } 564 }
530 565
531
532 Update_Rssi_Sample(pAd, &pAd->StaCfg.RssiSample, pRxWI); 566 Update_Rssi_Sample(pAd, &pAd->StaCfg.RssiSample, pRxWI);
533 567
534 pAd->StaCfg.LastSNR0 = (UCHAR)(pRxWI->SNR0); 568 pAd->StaCfg.LastSNR0 = (UCHAR) (pRxWI->SNR0);
535 pAd->StaCfg.LastSNR1 = (UCHAR)(pRxWI->SNR1); 569 pAd->StaCfg.LastSNR1 = (UCHAR) (pRxWI->SNR1);
536 570
537 pAd->RalinkCounters.OneSecRxOkDataCnt++; 571 pAd->RalinkCounters.OneSecRxOkDataCnt++;
538 572
573 if (!((pHeader->Frag == 0) && (pHeader->FC.MoreFrag == 0))) {
574 // re-assemble the fragmented packets
575 // return complete frame (pRxPacket) or NULL
576 bFragment = TRUE;
577 pRxPacket = RTMPDeFragmentDataFrame(pAd, pRxBlk);
578 }
539 579
540 if (!((pHeader->Frag == 0) && (pHeader->FC.MoreFrag == 0))) 580 if (pRxPacket) {
541 {
542 // re-assemble the fragmented packets
543 // return complete frame (pRxPacket) or NULL
544 bFragment = TRUE;
545 pRxPacket = RTMPDeFragmentDataFrame(pAd, pRxBlk);
546 }
547
548 if (pRxPacket)
549 {
550 pEntry = &pAd->MacTab.Content[pRxWI->WirelessCliID]; 581 pEntry = &pAd->MacTab.Content[pRxWI->WirelessCliID];
551 582
552 // process complete frame 583 // process complete frame
553 if (bFragment && (pRxD->Decrypted) && (pEntry->WepStatus == Ndis802_11Encryption2Enabled)) 584 if (bFragment && (pRxD->Decrypted)
554 { 585 && (pEntry->WepStatus ==
586 Ndis802_11Encryption2Enabled)) {
555 // Minus MIC length 587 // Minus MIC length
556 pRxBlk->DataSize -= 8; 588 pRxBlk->DataSize -= 8;
557 589
558 // For TKIP frame, calculate the MIC value 590 // For TKIP frame, calculate the MIC value
559 if (STACheckTkipMICValue(pAd, pEntry, pRxBlk) == FALSE) 591 if (STACheckTkipMICValue(pAd, pEntry, pRxBlk) ==
560 { 592 FALSE) {
561 return; 593 return;
562 } 594 }
563 } 595 }
564 596
565 STARxDataFrameAnnounce(pAd, pEntry, pRxBlk, FromWhichBSSID); 597 STARxDataFrameAnnounce(pAd, pEntry, pRxBlk,
598 FromWhichBSSID);
599 return;
600 } else {
601 // just return
602 // because RTMPDeFragmentDataFrame() will release rx packet,
603 // if packet is fragmented
566 return; 604 return;
567 } 605 }
568 else
569 {
570 // just return
571 // because RTMPDeFragmentDataFrame() will release rx packet,
572 // if packet is fragmented
573 return;
574 }
575 } 606 }
576 607
577 ASSERT(0); 608 ASSERT(0);
@@ -579,25 +610,20 @@ VOID STAHandleRxDataFrame(
579 RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); 610 RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);
580} 611}
581 612
582VOID STAHandleRxMgmtFrame( 613VOID STAHandleRxMgmtFrame(IN PRTMP_ADAPTER pAd, IN RX_BLK * pRxBlk)
583 IN PRTMP_ADAPTER pAd,
584 IN RX_BLK *pRxBlk)
585{ 614{
586 PRT28XX_RXD_STRUC pRxD = &(pRxBlk->RxD); 615 PRT28XX_RXD_STRUC pRxD = &(pRxBlk->RxD);
587 PRXWI_STRUC pRxWI = pRxBlk->pRxWI; 616 PRXWI_STRUC pRxWI = pRxBlk->pRxWI;
588 PHEADER_802_11 pHeader = pRxBlk->pHeader; 617 PHEADER_802_11 pHeader = pRxBlk->pHeader;
589 PNDIS_PACKET pRxPacket = pRxBlk->pRxPacket; 618 PNDIS_PACKET pRxPacket = pRxBlk->pRxPacket;
590
591 do
592 {
593 619
620 do {
594 621
595 /* check if need to resend PS Poll when received packet with MoreData = 1 */ 622 /* check if need to resend PS Poll when received packet with MoreData = 1 */
596 if ((pAd->StaCfg.Psm == PWR_SAVE) && (pHeader->FC.MoreData == 1)) 623 if ((pAd->StaCfg.Psm == PWR_SAVE)
597 { 624 && (pHeader->FC.MoreData == 1)) {
598 /* for UAPSD, all management frames will be VO priority */ 625 /* for UAPSD, all management frames will be VO priority */
599 if (pAd->CommonCfg.bAPSDAC_VO == 0) 626 if (pAd->CommonCfg.bAPSDAC_VO == 0) {
600 {
601 /* non-UAPSD delivery-enabled AC */ 627 /* non-UAPSD delivery-enabled AC */
602 RTMP_PS_POLL_ENQUEUE(pAd); 628 RTMP_PS_POLL_ENQUEUE(pAd);
603 } 629 }
@@ -605,57 +631,54 @@ VOID STAHandleRxMgmtFrame(
605 631
606 /* TODO: if MoreData == 0, station can go to sleep */ 632 /* TODO: if MoreData == 0, station can go to sleep */
607 633
608
609 // We should collect RSSI not only U2M data but also my beacon 634 // We should collect RSSI not only U2M data but also my beacon
610 if ((pHeader->FC.SubType == SUBTYPE_BEACON) && (MAC_ADDR_EQUAL(&pAd->CommonCfg.Bssid, &pHeader->Addr2)) 635 if ((pHeader->FC.SubType == SUBTYPE_BEACON)
611 && (pAd->RxAnt.EvaluatePeriod == 0)) 636 && (MAC_ADDR_EQUAL(&pAd->CommonCfg.Bssid, &pHeader->Addr2))
612 { 637 && (pAd->RxAnt.EvaluatePeriod == 0)) {
613 Update_Rssi_Sample(pAd, &pAd->StaCfg.RssiSample, pRxWI); 638 Update_Rssi_Sample(pAd, &pAd->StaCfg.RssiSample, pRxWI);
614 639
615 pAd->StaCfg.LastSNR0 = (UCHAR)(pRxWI->SNR0); 640 pAd->StaCfg.LastSNR0 = (UCHAR) (pRxWI->SNR0);
616 pAd->StaCfg.LastSNR1 = (UCHAR)(pRxWI->SNR1); 641 pAd->StaCfg.LastSNR1 = (UCHAR) (pRxWI->SNR1);
617 } 642 }
618 643
619
620 // First check the size, it MUST not exceed the mlme queue size 644 // First check the size, it MUST not exceed the mlme queue size
621 if (pRxWI->MPDUtotalByteCount > MGMT_DMA_BUFFER_SIZE) 645 if (pRxWI->MPDUtotalByteCount > MGMT_DMA_BUFFER_SIZE) {
622 {
623 DBGPRINT_ERR(("STAHandleRxMgmtFrame: frame too large, size = %d \n", pRxWI->MPDUtotalByteCount)); 646 DBGPRINT_ERR(("STAHandleRxMgmtFrame: frame too large, size = %d \n", pRxWI->MPDUtotalByteCount));
624 break; 647 break;
625 } 648 }
626 649
627 REPORT_MGMT_FRAME_TO_MLME(pAd, pRxWI->WirelessCliID, pHeader, pRxWI->MPDUtotalByteCount, 650 REPORT_MGMT_FRAME_TO_MLME(pAd, pRxWI->WirelessCliID, pHeader,
628 pRxWI->RSSI0, pRxWI->RSSI1, pRxWI->RSSI2, pRxD->PlcpSignal); 651 pRxWI->MPDUtotalByteCount,
652 pRxWI->RSSI0, pRxWI->RSSI1,
653 pRxWI->RSSI2, pRxD->PlcpSignal);
629 } while (FALSE); 654 } while (FALSE);
630 655
631 RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_SUCCESS); 656 RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_SUCCESS);
632} 657}
633 658
634VOID STAHandleRxControlFrame( 659VOID STAHandleRxControlFrame(IN PRTMP_ADAPTER pAd, IN RX_BLK * pRxBlk)
635 IN PRTMP_ADAPTER pAd,
636 IN RX_BLK *pRxBlk)
637{ 660{
638 PRXWI_STRUC pRxWI = pRxBlk->pRxWI; 661 PRXWI_STRUC pRxWI = pRxBlk->pRxWI;
639 PHEADER_802_11 pHeader = pRxBlk->pHeader; 662 PHEADER_802_11 pHeader = pRxBlk->pHeader;
640 PNDIS_PACKET pRxPacket = pRxBlk->pRxPacket; 663 PNDIS_PACKET pRxPacket = pRxBlk->pRxPacket;
641 664
642 switch (pHeader->FC.SubType) 665 switch (pHeader->FC.SubType) {
643 { 666 case SUBTYPE_BLOCK_ACK_REQ:
644 case SUBTYPE_BLOCK_ACK_REQ: 667 {
645 { 668 CntlEnqueueForRecv(pAd, pRxWI->WirelessCliID,
646 CntlEnqueueForRecv(pAd, pRxWI->WirelessCliID, (pRxWI->MPDUtotalByteCount), (PFRAME_BA_REQ)pHeader); 669 (pRxWI->MPDUtotalByteCount),
647 } 670 (PFRAME_BA_REQ) pHeader);
648 break; 671 }
649 case SUBTYPE_BLOCK_ACK: 672 break;
650 case SUBTYPE_ACK: 673 case SUBTYPE_BLOCK_ACK:
651 default: 674 case SUBTYPE_ACK:
652 break; 675 default:
676 break;
653 } 677 }
654 678
655 RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); 679 RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE);
656} 680}
657 681
658
659/* 682/*
660 ======================================================================== 683 ========================================================================
661 684
@@ -675,45 +698,39 @@ VOID STAHandleRxControlFrame(
675 Need to consider QOS DATA format when converting to 802.3 698 Need to consider QOS DATA format when converting to 802.3
676 ======================================================================== 699 ========================================================================
677*/ 700*/
678BOOLEAN STARxDoneInterruptHandle( 701BOOLEAN STARxDoneInterruptHandle(IN PRTMP_ADAPTER pAd, IN BOOLEAN argc)
679 IN PRTMP_ADAPTER pAd,
680 IN BOOLEAN argc)
681{ 702{
682 NDIS_STATUS Status; 703 NDIS_STATUS Status;
683 UINT32 RxProcessed, RxPending; 704 UINT32 RxProcessed, RxPending;
684 BOOLEAN bReschedule = FALSE; 705 BOOLEAN bReschedule = FALSE;
685 RT28XX_RXD_STRUC *pRxD; 706 RT28XX_RXD_STRUC *pRxD;
686 UCHAR *pData; 707 UCHAR *pData;
687 PRXWI_STRUC pRxWI; 708 PRXWI_STRUC pRxWI;
688 PNDIS_PACKET pRxPacket; 709 PNDIS_PACKET pRxPacket;
689 PHEADER_802_11 pHeader; 710 PHEADER_802_11 pHeader;
690 RX_BLK RxCell; 711 RX_BLK RxCell;
691 712
692 RxProcessed = RxPending = 0; 713 RxProcessed = RxPending = 0;
693 714
694 // process whole rx ring 715 // process whole rx ring
695 while (1) 716 while (1) {
696 {
697 717
698 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF | 718 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF |
699 fRTMP_ADAPTER_RESET_IN_PROGRESS | 719 fRTMP_ADAPTER_RESET_IN_PROGRESS |
700 fRTMP_ADAPTER_HALT_IN_PROGRESS | 720 fRTMP_ADAPTER_HALT_IN_PROGRESS |
701 fRTMP_ADAPTER_NIC_NOT_EXIST) || 721 fRTMP_ADAPTER_NIC_NOT_EXIST) ||
702 !RTMP_TEST_FLAG(pAd,fRTMP_ADAPTER_START_UP)) 722 !RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP)) {
703 {
704 break; 723 break;
705 } 724 }
706
707#ifdef RTMP_MAC_PCI 725#ifdef RTMP_MAC_PCI
708 if (RxProcessed++ > MAX_RX_PROCESS_CNT) 726 if (RxProcessed++ > MAX_RX_PROCESS_CNT) {
709 {
710 // need to reschedule rx handle 727 // need to reschedule rx handle
711 bReschedule = TRUE; 728 bReschedule = TRUE;
712 break; 729 break;
713 } 730 }
714#endif // RTMP_MAC_PCI // 731#endif // RTMP_MAC_PCI //
715 732
716 RxProcessed ++; // test 733 RxProcessed++; // test
717 734
718 // 1. allocate a new data packet into rx ring to replace received packet 735 // 1. allocate a new data packet into rx ring to replace received packet
719 // then processing the received packet 736 // then processing the received packet
@@ -722,19 +739,19 @@ BOOLEAN STARxDoneInterruptHandle(
722 // the rx packet must 739 // the rx packet must
723 // a. be indicated to upper layer or 740 // a. be indicated to upper layer or
724 // b. be released if it is discarded 741 // b. be released if it is discarded
725 pRxPacket = GetPacketFromRxRing(pAd, &(RxCell.RxD), &bReschedule, &RxPending); 742 pRxPacket =
726 if (pRxPacket == NULL) 743 GetPacketFromRxRing(pAd, &(RxCell.RxD), &bReschedule,
727 { 744 &RxPending);
745 if (pRxPacket == NULL) {
728 // no more packet to process 746 // no more packet to process
729 break; 747 break;
730 } 748 }
731
732 // get rx ring descriptor 749 // get rx ring descriptor
733 pRxD = &(RxCell.RxD); 750 pRxD = &(RxCell.RxD);
734 // get rx data buffer 751 // get rx data buffer
735 pData = GET_OS_PKT_DATAPTR(pRxPacket); 752 pData = GET_OS_PKT_DATAPTR(pRxPacket);
736 pRxWI = (PRXWI_STRUC) pData; 753 pRxWI = (PRXWI_STRUC) pData;
737 pHeader = (PHEADER_802_11) (pData+RXWI_SIZE) ; 754 pHeader = (PHEADER_802_11) (pData + RXWI_SIZE);
738 755
739 // build RxCell 756 // build RxCell
740 RxCell.pRxWI = pRxWI; 757 RxCell.pRxWI = pRxWI;
@@ -745,18 +762,19 @@ BOOLEAN STARxDoneInterruptHandle(
745 RxCell.Flags = 0; 762 RxCell.Flags = 0;
746 763
747 // Increase Total receive byte counter after real data received no mater any error or not 764 // Increase Total receive byte counter after real data received no mater any error or not
748 pAd->RalinkCounters.ReceivedByteCount += pRxWI->MPDUtotalByteCount; 765 pAd->RalinkCounters.ReceivedByteCount +=
749 pAd->RalinkCounters.OneSecReceivedByteCount += pRxWI->MPDUtotalByteCount; 766 pRxWI->MPDUtotalByteCount;
750 pAd->RalinkCounters.RxCount ++; 767 pAd->RalinkCounters.OneSecReceivedByteCount +=
768 pRxWI->MPDUtotalByteCount;
769 pAd->RalinkCounters.RxCount++;
751 770
752 INC_COUNTER64(pAd->WlanCounters.ReceivedFragmentCount); 771 INC_COUNTER64(pAd->WlanCounters.ReceivedFragmentCount);
753 772
754 if (pRxWI->MPDUtotalByteCount < 14) 773 if (pRxWI->MPDUtotalByteCount < 14)
755 Status = NDIS_STATUS_FAILURE; 774 Status = NDIS_STATUS_FAILURE;
756 775
757 if (MONITOR_ON(pAd)) 776 if (MONITOR_ON(pAd)) {
758 { 777 send_monitor_packets(pAd, &RxCell);
759 send_monitor_packets(pAd, &RxCell);
760 break; 778 break;
761 } 779 }
762 780
@@ -766,40 +784,38 @@ BOOLEAN STARxDoneInterruptHandle(
766 Status = RTMPCheckRxError(pAd, pHeader, pRxWI, pRxD); 784 Status = RTMPCheckRxError(pAd, pHeader, pRxWI, pRxD);
767 785
768 // Handle the received frame 786 // Handle the received frame
769 if (Status == NDIS_STATUS_SUCCESS) 787 if (Status == NDIS_STATUS_SUCCESS) {
770 { 788 switch (pHeader->FC.Type) {
771 switch (pHeader->FC.Type)
772 {
773 // CASE I, receive a DATA frame 789 // CASE I, receive a DATA frame
774 case BTYPE_DATA: 790 case BTYPE_DATA:
775 { 791 {
776 // process DATA frame 792 // process DATA frame
777 STAHandleRxDataFrame(pAd, &RxCell); 793 STAHandleRxDataFrame(pAd, &RxCell);
778 } 794 }
779 break; 795 break;
780 // CASE II, receive a MGMT frame 796 // CASE II, receive a MGMT frame
781 case BTYPE_MGMT: 797 case BTYPE_MGMT:
782 { 798 {
783 STAHandleRxMgmtFrame(pAd, &RxCell); 799 STAHandleRxMgmtFrame(pAd, &RxCell);
784 } 800 }
785 break; 801 break;
786 // CASE III. receive a CNTL frame 802 // CASE III. receive a CNTL frame
787 case BTYPE_CNTL: 803 case BTYPE_CNTL:
788 { 804 {
789 STAHandleRxControlFrame(pAd, &RxCell); 805 STAHandleRxControlFrame(pAd, &RxCell);
790 } 806 }
791 break; 807 break;
792 // discard other type 808 // discard other type
793 default: 809 default:
794 RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); 810 RELEASE_NDIS_PACKET(pAd, pRxPacket,
795 break; 811 NDIS_STATUS_FAILURE);
812 break;
796 } 813 }
797 } 814 } else {
798 else
799 {
800 pAd->Counters8023.RxErrors++; 815 pAd->Counters8023.RxErrors++;
801 // discard this frame 816 // discard this frame
802 RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); 817 RELEASE_NDIS_PACKET(pAd, pRxPacket,
818 NDIS_STATUS_FAILURE);
803 } 819 }
804 } 820 }
805 821
@@ -817,8 +833,7 @@ BOOLEAN STARxDoneInterruptHandle(
817 833
818 ======================================================================== 834 ========================================================================
819*/ 835*/
820VOID RTMPHandleTwakeupInterrupt( 836VOID RTMPHandleTwakeupInterrupt(IN PRTMP_ADAPTER pAd)
821 IN PRTMP_ADAPTER pAd)
822{ 837{
823 AsicForceWakeup(pAd, FALSE); 838 AsicForceWakeup(pAd, FALSE);
824} 839}
@@ -841,47 +856,39 @@ Note:
841 You only can put OS-depened & STA related code in here. 856 You only can put OS-depened & STA related code in here.
842======================================================================== 857========================================================================
843*/ 858*/
844VOID STASendPackets( 859VOID STASendPackets(IN NDIS_HANDLE MiniportAdapterContext,
845 IN NDIS_HANDLE MiniportAdapterContext, 860 IN PPNDIS_PACKET ppPacketArray, IN UINT NumberOfPackets)
846 IN PPNDIS_PACKET ppPacketArray,
847 IN UINT NumberOfPackets)
848{ 861{
849 UINT Index; 862 UINT Index;
850 PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) MiniportAdapterContext; 863 PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) MiniportAdapterContext;
851 PNDIS_PACKET pPacket; 864 PNDIS_PACKET pPacket;
852 BOOLEAN allowToSend = FALSE; 865 BOOLEAN allowToSend = FALSE;
853
854 866
855 for (Index = 0; Index < NumberOfPackets; Index++) 867 for (Index = 0; Index < NumberOfPackets; Index++) {
856 {
857 pPacket = ppPacketArray[Index]; 868 pPacket = ppPacketArray[Index];
858 869
859 do 870 do {
860 { 871 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)
861 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS) || 872 || RTMP_TEST_FLAG(pAd,
862 RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS) || 873 fRTMP_ADAPTER_HALT_IN_PROGRESS)
863 RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)) 874 || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)) {
864 {
865 // Drop send request since hardware is in reset state 875 // Drop send request since hardware is in reset state
866 break; 876 break;
867 } 877 } else if (!INFRA_ON(pAd) && !ADHOC_ON(pAd)) {
868 else if (!INFRA_ON(pAd) && !ADHOC_ON(pAd))
869 {
870 // Drop send request since there are no physical connection yet 878 // Drop send request since there are no physical connection yet
871 break; 879 break;
872 } 880 } else {
873 else
874 {
875 // Record that orignal packet source is from NDIS layer,so that 881 // Record that orignal packet source is from NDIS layer,so that
876 // later on driver knows how to release this NDIS PACKET 882 // later on driver knows how to release this NDIS PACKET
877 RTMP_SET_PACKET_WCID(pPacket, 0); // this field is useless when in STA mode 883 RTMP_SET_PACKET_WCID(pPacket, 0); // this field is useless when in STA mode
878 RTMP_SET_PACKET_SOURCE(pPacket, PKTSRC_NDIS); 884 RTMP_SET_PACKET_SOURCE(pPacket, PKTSRC_NDIS);
879 NDIS_SET_PACKET_STATUS(pPacket, NDIS_STATUS_PENDING); 885 NDIS_SET_PACKET_STATUS(pPacket,
886 NDIS_STATUS_PENDING);
880 pAd->RalinkCounters.PendingNdisPacketCount++; 887 pAd->RalinkCounters.PendingNdisPacketCount++;
881 888
882 allowToSend = TRUE; 889 allowToSend = TRUE;
883 } 890 }
884 } while(FALSE); 891 } while (FALSE);
885 892
886 if (allowToSend == TRUE) 893 if (allowToSend == TRUE)
887 STASendPacket(pAd, pPacket); 894 STASendPacket(pAd, pPacket);
@@ -894,7 +901,6 @@ VOID STASendPackets(
894 901
895} 902}
896 903
897
898/* 904/*
899======================================================================== 905========================================================================
900Routine Description: 906Routine Description:
@@ -914,72 +920,64 @@ Note:
914 You only can put OS-indepened & STA related code in here. 920 You only can put OS-indepened & STA related code in here.
915======================================================================== 921========================================================================
916*/ 922*/
917NDIS_STATUS STASendPacket( 923NDIS_STATUS STASendPacket(IN PRTMP_ADAPTER pAd, IN PNDIS_PACKET pPacket)
918 IN PRTMP_ADAPTER pAd,
919 IN PNDIS_PACKET pPacket)
920{ 924{
921 PACKET_INFO PacketInfo; 925 PACKET_INFO PacketInfo;
922 PUCHAR pSrcBufVA; 926 PUCHAR pSrcBufVA;
923 UINT SrcBufLen; 927 UINT SrcBufLen;
924 UINT AllowFragSize; 928 UINT AllowFragSize;
925 UCHAR NumberOfFrag; 929 UCHAR NumberOfFrag;
926 UCHAR RTSRequired; 930 UCHAR RTSRequired;
927 UCHAR QueIdx, UserPriority; 931 UCHAR QueIdx, UserPriority;
928 MAC_TABLE_ENTRY *pEntry = NULL; 932 MAC_TABLE_ENTRY *pEntry = NULL;
929 unsigned int IrqFlags; 933 unsigned int IrqFlags;
930 UCHAR FlgIsIP = 0; 934 UCHAR FlgIsIP = 0;
931 UCHAR Rate; 935 UCHAR Rate;
932 936
933 // Prepare packet information structure for buffer descriptor 937 // Prepare packet information structure for buffer descriptor
934 // chained within a single NDIS packet. 938 // chained within a single NDIS packet.
935 RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pSrcBufVA, &SrcBufLen); 939 RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pSrcBufVA, &SrcBufLen);
936 940
937 if (pSrcBufVA == NULL) 941 if (pSrcBufVA == NULL) {
938 { 942 DBGPRINT(RT_DEBUG_ERROR,
939 DBGPRINT(RT_DEBUG_ERROR,("STASendPacket --> pSrcBufVA == NULL !!!SrcBufLen=%x\n",SrcBufLen)); 943 ("STASendPacket --> pSrcBufVA == NULL !!!SrcBufLen=%x\n",
944 SrcBufLen));
940 // Resourece is low, system did not allocate virtual address 945 // Resourece is low, system did not allocate virtual address
941 // return NDIS_STATUS_FAILURE directly to upper layer 946 // return NDIS_STATUS_FAILURE directly to upper layer
942 RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); 947 RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
943 return NDIS_STATUS_FAILURE; 948 return NDIS_STATUS_FAILURE;
944 } 949 }
945 950
946 951 if (SrcBufLen < 14) {
947 if (SrcBufLen < 14) 952 DBGPRINT(RT_DEBUG_ERROR,
948 { 953 ("STASendPacket --> Ndis Packet buffer error !!!\n"));
949 DBGPRINT(RT_DEBUG_ERROR,("STASendPacket --> Ndis Packet buffer error !!!\n"));
950 RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); 954 RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
951 return (NDIS_STATUS_FAILURE); 955 return (NDIS_STATUS_FAILURE);
952 } 956 }
953
954 // In HT rate adhoc mode, A-MPDU is often used. So need to lookup BA Table and MAC Entry. 957 // In HT rate adhoc mode, A-MPDU is often used. So need to lookup BA Table and MAC Entry.
955 // Note multicast packets in adhoc also use BSSID_WCID index. 958 // Note multicast packets in adhoc also use BSSID_WCID index.
956 { 959 {
957 if(INFRA_ON(pAd)) 960 if (INFRA_ON(pAd)) {
958 {
959 {
960 pEntry = &pAd->MacTab.Content[BSSID_WCID];
961 RTMP_SET_PACKET_WCID(pPacket, BSSID_WCID);
962 Rate = pAd->CommonCfg.TxRate;
963 }
964 }
965 else if (ADHOC_ON(pAd))
966 {
967 if (*pSrcBufVA & 0x01)
968 { 961 {
962 pEntry = &pAd->MacTab.Content[BSSID_WCID];
963 RTMP_SET_PACKET_WCID(pPacket, BSSID_WCID);
964 Rate = pAd->CommonCfg.TxRate;
965 }
966 } else if (ADHOC_ON(pAd)) {
967 if (*pSrcBufVA & 0x01) {
969 RTMP_SET_PACKET_WCID(pPacket, MCAST_WCID); 968 RTMP_SET_PACKET_WCID(pPacket, MCAST_WCID);
970 pEntry = &pAd->MacTab.Content[MCAST_WCID]; 969 pEntry = &pAd->MacTab.Content[MCAST_WCID];
971 } 970 } else {
972 else
973 {
974 pEntry = MacTableLookup(pAd, pSrcBufVA); 971 pEntry = MacTableLookup(pAd, pSrcBufVA);
975 } 972 }
976 Rate = pAd->CommonCfg.TxRate; 973 Rate = pAd->CommonCfg.TxRate;
977 } 974 }
978 } 975 }
979 976
980 if (!pEntry) 977 if (!pEntry) {
981 { 978 DBGPRINT(RT_DEBUG_ERROR,
982 DBGPRINT(RT_DEBUG_ERROR,("STASendPacket->Cannot find pEntry(%2x:%2x:%2x:%2x:%2x:%2x) in MacTab!\n", PRINT_MAC(pSrcBufVA))); 979 ("STASendPacket->Cannot find pEntry(%2x:%2x:%2x:%2x:%2x:%2x) in MacTab!\n",
980 PRINT_MAC(pSrcBufVA)));
983 // Resourece is low, system did not allocate virtual address 981 // Resourece is low, system did not allocate virtual address
984 // return NDIS_STATUS_FAILURE directly to upper layer 982 // return NDIS_STATUS_FAILURE directly to upper layer
985 RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); 983 RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
@@ -987,44 +985,39 @@ NDIS_STATUS STASendPacket(
987 } 985 }
988 986
989 if (ADHOC_ON(pAd) 987 if (ADHOC_ON(pAd)
990 ) 988 ) {
991 { 989 RTMP_SET_PACKET_WCID(pPacket, (UCHAR) pEntry->Aid);
992 RTMP_SET_PACKET_WCID(pPacket, (UCHAR)pEntry->Aid);
993 } 990 }
994
995 // 991 //
996 // Check the Ethernet Frame type of this packet, and set the RTMP_SET_PACKET_SPECIFIC flags. 992 // Check the Ethernet Frame type of this packet, and set the RTMP_SET_PACKET_SPECIFIC flags.
997 // Here we set the PACKET_SPECIFIC flags(LLC, VLAN, DHCP/ARP, EAPOL). 993 // Here we set the PACKET_SPECIFIC flags(LLC, VLAN, DHCP/ARP, EAPOL).
998 RTMPCheckEtherType(pAd, pPacket); 994 RTMPCheckEtherType(pAd, pPacket);
999 995
1000
1001
1002 // 996 //
1003 // WPA 802.1x secured port control - drop all non-802.1x frame before port secured 997 // WPA 802.1x secured port control - drop all non-802.1x frame before port secured
1004 // 998 //
1005 if (((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || 999 if (((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) ||
1006 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) || 1000 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
1007 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) || 1001 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) ||
1008 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) 1002 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)
1009 || (pAd->StaCfg.IEEE8021X == TRUE) 1003 || (pAd->StaCfg.IEEE8021X == TRUE)
1010 ) 1004 )
1011 && ((pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED) || (pAd->StaCfg.MicErrCnt >= 2)) 1005 && ((pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED)
1012 && (RTMP_GET_PACKET_EAPOL(pPacket)== FALSE) 1006 || (pAd->StaCfg.MicErrCnt >= 2))
1013 ) 1007 && (RTMP_GET_PACKET_EAPOL(pPacket) == FALSE)
1014 { 1008 ) {
1015 DBGPRINT(RT_DEBUG_TRACE,("STASendPacket --> Drop packet before port secured !!!\n")); 1009 DBGPRINT(RT_DEBUG_TRACE,
1010 ("STASendPacket --> Drop packet before port secured !!!\n"));
1016 RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); 1011 RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
1017 1012
1018 return (NDIS_STATUS_FAILURE); 1013 return (NDIS_STATUS_FAILURE);
1019 } 1014 }
1020 1015
1021
1022 // STEP 1. Decide number of fragments required to deliver this MSDU. 1016 // STEP 1. Decide number of fragments required to deliver this MSDU.
1023 // The estimation here is not very accurate because difficult to 1017 // The estimation here is not very accurate because difficult to
1024 // take encryption overhead into consideration here. The result 1018 // take encryption overhead into consideration here. The result
1025 // "NumberOfFrag" is then just used to pre-check if enough free 1019 // "NumberOfFrag" is then just used to pre-check if enough free
1026 // TXD are available to hold this MSDU. 1020 // TXD are available to hold this MSDU.
1027
1028 1021
1029 if (*pSrcBufVA & 0x01) // fragmentation not allowed on multicast & broadcast 1022 if (*pSrcBufVA & 0x01) // fragmentation not allowed on multicast & broadcast
1030 NumberOfFrag = 1; 1023 NumberOfFrag = 1;
@@ -1032,10 +1025,10 @@ NDIS_STATUS STASendPacket(
1032 NumberOfFrag = 1; // Aggregation overwhelms fragmentation 1025 NumberOfFrag = 1; // Aggregation overwhelms fragmentation
1033 else if (CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_AMSDU_INUSED)) 1026 else if (CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_AMSDU_INUSED))
1034 NumberOfFrag = 1; // Aggregation overwhelms fragmentation 1027 NumberOfFrag = 1; // Aggregation overwhelms fragmentation
1035 else if ((pAd->StaCfg.HTPhyMode.field.MODE == MODE_HTMIX) || (pAd->StaCfg.HTPhyMode.field.MODE == MODE_HTGREENFIELD)) 1028 else if ((pAd->StaCfg.HTPhyMode.field.MODE == MODE_HTMIX)
1029 || (pAd->StaCfg.HTPhyMode.field.MODE == MODE_HTGREENFIELD))
1036 NumberOfFrag = 1; // MIMO RATE overwhelms fragmentation 1030 NumberOfFrag = 1; // MIMO RATE overwhelms fragmentation
1037 else 1031 else {
1038 {
1039 // The calculated "NumberOfFrag" is a rough estimation because of various 1032 // The calculated "NumberOfFrag" is a rough estimation because of various
1040 // encryption/encapsulation overhead not taken into consideration. This number is just 1033 // encryption/encapsulation overhead not taken into consideration. This number is just
1041 // used to make sure enough free TXD are available before fragmentation takes place. 1034 // used to make sure enough free TXD are available before fragmentation takes place.
@@ -1045,11 +1038,15 @@ NDIS_STATUS STASendPacket(
1045 // resource, and the NDIS packet will be indicated NDIS_STATUS_FAILURE. This should 1038 // resource, and the NDIS packet will be indicated NDIS_STATUS_FAILURE. This should
1046 // rarely happen and the penalty is just like a TX RETRY fail. Affordable. 1039 // rarely happen and the penalty is just like a TX RETRY fail. Affordable.
1047 1040
1048 AllowFragSize = (pAd->CommonCfg.FragmentThreshold) - LENGTH_802_11 - LENGTH_CRC; 1041 AllowFragSize =
1049 NumberOfFrag = ((PacketInfo.TotalPacketLength - LENGTH_802_3 + LENGTH_802_1_H) / AllowFragSize) + 1; 1042 (pAd->CommonCfg.FragmentThreshold) - LENGTH_802_11 -
1043 LENGTH_CRC;
1044 NumberOfFrag =
1045 ((PacketInfo.TotalPacketLength - LENGTH_802_3 +
1046 LENGTH_802_1_H) / AllowFragSize) + 1;
1050 // To get accurate number of fragmentation, Minus 1 if the size just match to allowable fragment size 1047 // To get accurate number of fragmentation, Minus 1 if the size just match to allowable fragment size
1051 if (((PacketInfo.TotalPacketLength - LENGTH_802_3 + LENGTH_802_1_H) % AllowFragSize) == 0) 1048 if (((PacketInfo.TotalPacketLength - LENGTH_802_3 +
1052 { 1049 LENGTH_802_1_H) % AllowFragSize) == 0) {
1053 NumberOfFrag--; 1050 NumberOfFrag--;
1054 } 1051 }
1055 } 1052 }
@@ -1057,16 +1054,19 @@ NDIS_STATUS STASendPacket(
1057 // Save fragment number to Ndis packet reserved field 1054 // Save fragment number to Ndis packet reserved field
1058 RTMP_SET_PACKET_FRAGMENTS(pPacket, NumberOfFrag); 1055 RTMP_SET_PACKET_FRAGMENTS(pPacket, NumberOfFrag);
1059 1056
1060
1061 // STEP 2. Check the requirement of RTS: 1057 // STEP 2. Check the requirement of RTS:
1062 // If multiple fragment required, RTS is required only for the first fragment 1058 // If multiple fragment required, RTS is required only for the first fragment
1063 // if the fragment size large than RTS threshold 1059 // if the fragment size large than RTS threshold
1064 // For RT28xx, Let ASIC send RTS/CTS 1060 // For RT28xx, Let ASIC send RTS/CTS
1065// RTMP_SET_PACKET_RTS(pPacket, 0); 1061// RTMP_SET_PACKET_RTS(pPacket, 0);
1066 if (NumberOfFrag > 1) 1062 if (NumberOfFrag > 1)
1067 RTSRequired = (pAd->CommonCfg.FragmentThreshold > pAd->CommonCfg.RtsThreshold) ? 1 : 0; 1063 RTSRequired =
1064 (pAd->CommonCfg.FragmentThreshold >
1065 pAd->CommonCfg.RtsThreshold) ? 1 : 0;
1068 else 1066 else
1069 RTSRequired = (PacketInfo.TotalPacketLength > pAd->CommonCfg.RtsThreshold) ? 1 : 0; 1067 RTSRequired =
1068 (PacketInfo.TotalPacketLength >
1069 pAd->CommonCfg.RtsThreshold) ? 1 : 0;
1070 1070
1071 // Save RTS requirement to Ndis packet reserved field 1071 // Save RTS requirement to Ndis packet reserved field
1072 RTMP_SET_PACKET_RTS(pPacket, RTSRequired); 1072 RTMP_SET_PACKET_RTS(pPacket, RTSRequired);
@@ -1076,32 +1076,33 @@ NDIS_STATUS STASendPacket(
1076 // STEP 3. Traffic classification. outcome = <UserPriority, QueIdx> 1076 // STEP 3. Traffic classification. outcome = <UserPriority, QueIdx>
1077 // 1077 //
1078 UserPriority = 0; 1078 UserPriority = 0;
1079 QueIdx = QID_AC_BE; 1079 QueIdx = QID_AC_BE;
1080 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) && 1080 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) &&
1081 CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE)) 1081 CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE)) {
1082 {
1083 USHORT Protocol; 1082 USHORT Protocol;
1084 UCHAR LlcSnapLen = 0, Byte0, Byte1; 1083 UCHAR LlcSnapLen = 0, Byte0, Byte1;
1085 do 1084 do {
1086 {
1087 // get Ethernet protocol field 1085 // get Ethernet protocol field
1088 Protocol = (USHORT)((pSrcBufVA[12] << 8) + pSrcBufVA[13]); 1086 Protocol =
1089 if (Protocol <= 1500) 1087 (USHORT) ((pSrcBufVA[12] << 8) + pSrcBufVA[13]);
1090 { 1088 if (Protocol <= 1500) {
1091 // get Ethernet protocol field from LLC/SNAP 1089 // get Ethernet protocol field from LLC/SNAP
1092 if (Sniff2BytesFromNdisBuffer(PacketInfo.pFirstBuffer, LENGTH_802_3 + 6, &Byte0, &Byte1) != NDIS_STATUS_SUCCESS) 1090 if (Sniff2BytesFromNdisBuffer
1091 (PacketInfo.pFirstBuffer, LENGTH_802_3 + 6,
1092 &Byte0, &Byte1) != NDIS_STATUS_SUCCESS)
1093 break; 1093 break;
1094 1094
1095 Protocol = (USHORT)((Byte0 << 8) + Byte1); 1095 Protocol = (USHORT) ((Byte0 << 8) + Byte1);
1096 LlcSnapLen = 8; 1096 LlcSnapLen = 8;
1097 } 1097 }
1098
1099 // always AC_BE for non-IP packet 1098 // always AC_BE for non-IP packet
1100 if (Protocol != 0x0800) 1099 if (Protocol != 0x0800)
1101 break; 1100 break;
1102 1101
1103 // get IP header 1102 // get IP header
1104 if (Sniff2BytesFromNdisBuffer(PacketInfo.pFirstBuffer, LENGTH_802_3 + LlcSnapLen, &Byte0, &Byte1) != NDIS_STATUS_SUCCESS) 1103 if (Sniff2BytesFromNdisBuffer
1104 (PacketInfo.pFirstBuffer, LENGTH_802_3 + LlcSnapLen,
1105 &Byte0, &Byte1) != NDIS_STATUS_SUCCESS)
1105 break; 1106 break;
1106 1107
1107 // return AC_BE if packet is not IPv4 1108 // return AC_BE if packet is not IPv4
@@ -1115,61 +1116,56 @@ NDIS_STATUS STASendPacket(
1115 // TODO: have to check ACM bit. apply TSPEC if ACM is ON 1116 // TODO: have to check ACM bit. apply TSPEC if ACM is ON
1116 // TODO: downgrade UP & QueIdx before passing ACM 1117 // TODO: downgrade UP & QueIdx before passing ACM
1117 /* 1118 /*
1118 Under WMM ACM control, we dont need to check the bit; 1119 Under WMM ACM control, we dont need to check the bit;
1119 Or when a TSPEC is built for VO but we will change to issue 1120 Or when a TSPEC is built for VO but we will change to issue
1120 BA session for BE here, so we will not use BA to send VO packets. 1121 BA session for BE here, so we will not use BA to send VO packets.
1121 */ 1122 */
1122 if (pAd->CommonCfg.APEdcaParm.bACM[QueIdx]) 1123 if (pAd->CommonCfg.APEdcaParm.bACM[QueIdx]) {
1123 {
1124 UserPriority = 0; 1124 UserPriority = 0;
1125 QueIdx = QID_AC_BE; 1125 QueIdx = QID_AC_BE;
1126 } 1126 }
1127 } while (FALSE); 1127 } while (FALSE);
1128 } 1128 }
1129 1129
1130 RTMP_SET_PACKET_UP(pPacket, UserPriority); 1130 RTMP_SET_PACKET_UP(pPacket, UserPriority);
1131 1131
1132
1133
1134 // Make sure SendTxWait queue resource won't be used by other threads 1132 // Make sure SendTxWait queue resource won't be used by other threads
1135 RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags); 1133 RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);
1136 if (pAd->TxSwQueue[QueIdx].Number >= MAX_PACKETS_IN_QUEUE) 1134 if (pAd->TxSwQueue[QueIdx].Number >= MAX_PACKETS_IN_QUEUE) {
1137 {
1138 RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags); 1135 RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);
1139 RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); 1136 RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
1140 1137
1141 return NDIS_STATUS_FAILURE; 1138 return NDIS_STATUS_FAILURE;
1142 } 1139 } else {
1143 else 1140 InsertTailQueueAc(pAd, pEntry, &pAd->TxSwQueue[QueIdx],
1144 { 1141 PACKET_TO_QUEUE_ENTRY(pPacket));
1145 InsertTailQueueAc(pAd, pEntry, &pAd->TxSwQueue[QueIdx], PACKET_TO_QUEUE_ENTRY(pPacket));
1146 } 1142 }
1147 RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags); 1143 RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);
1148 1144
1149 if ((pAd->CommonCfg.BACapability.field.AutoBA == TRUE)&& 1145 if ((pAd->CommonCfg.BACapability.field.AutoBA == TRUE) &&
1150 IS_HT_STA(pEntry)) 1146 IS_HT_STA(pEntry)) {
1151 { 1147 //PMAC_TABLE_ENTRY pMacEntry = &pAd->MacTab.Content[BSSID_WCID];
1152 //PMAC_TABLE_ENTRY pMacEntry = &pAd->MacTab.Content[BSSID_WCID]; 1148 if (((pEntry->TXBAbitmap & (1 << UserPriority)) == 0) &&
1153 if (((pEntry->TXBAbitmap & (1<<UserPriority)) == 0) && 1149 ((pEntry->BADeclineBitmap & (1 << UserPriority)) == 0) &&
1154 ((pEntry->BADeclineBitmap & (1<<UserPriority)) == 0) && 1150 (pEntry->PortSecured == WPA_802_1X_PORT_SECURED)
1155 (pEntry->PortSecured == WPA_802_1X_PORT_SECURED) 1151 // For IOT compatibility, if
1156 // For IOT compatibility, if 1152 // 1. It is Ralink chip or
1157 // 1. It is Ralink chip or 1153 // 2. It is OPEN or AES mode,
1158 // 2. It is OPEN or AES mode, 1154 // then BA session can be bulit.
1159 // then BA session can be bulit. 1155 && ((pEntry->ValidAsCLI && pAd->MlmeAux.APRalinkIe != 0x0)
1160 && ((pEntry->ValidAsCLI && pAd->MlmeAux.APRalinkIe != 0x0) || 1156 || (pEntry->WepStatus != Ndis802_11WEPEnabled
1161 (pEntry->WepStatus != Ndis802_11WEPEnabled && pEntry->WepStatus != Ndis802_11Encryption2Enabled)) 1157 && pEntry->WepStatus !=
1162 ) 1158 Ndis802_11Encryption2Enabled))
1163 { 1159 ) {
1164 BAOriSessionSetUp(pAd, pEntry, UserPriority, 0, 10, FALSE); 1160 BAOriSessionSetUp(pAd, pEntry, UserPriority, 0, 10,
1161 FALSE);
1165 } 1162 }
1166 } 1163 }
1167 1164
1168 pAd->RalinkCounters.OneSecOsTxCount[QueIdx]++; // TODO: for debug only. to be removed 1165 pAd->RalinkCounters.OneSecOsTxCount[QueIdx]++; // TODO: for debug only. to be removed
1169 return NDIS_STATUS_SUCCESS; 1166 return NDIS_STATUS_SUCCESS;
1170} 1167}
1171 1168
1172
1173/* 1169/*
1174 ======================================================================== 1170 ========================================================================
1175 1171
@@ -1193,45 +1189,52 @@ NDIS_STATUS STASendPacket(
1193 ======================================================================== 1189 ========================================================================
1194*/ 1190*/
1195#ifdef RTMP_MAC_PCI 1191#ifdef RTMP_MAC_PCI
1196NDIS_STATUS RTMPFreeTXDRequest( 1192NDIS_STATUS RTMPFreeTXDRequest(IN PRTMP_ADAPTER pAd,
1197 IN PRTMP_ADAPTER pAd, 1193 IN UCHAR QueIdx,
1198 IN UCHAR QueIdx, 1194 IN UCHAR NumberRequired, IN PUCHAR FreeNumberIs)
1199 IN UCHAR NumberRequired,
1200 IN PUCHAR FreeNumberIs)
1201{ 1195{
1202 ULONG FreeNumber = 0; 1196 ULONG FreeNumber = 0;
1203 NDIS_STATUS Status = NDIS_STATUS_FAILURE; 1197 NDIS_STATUS Status = NDIS_STATUS_FAILURE;
1204 1198
1205 switch (QueIdx) 1199 switch (QueIdx) {
1206 { 1200 case QID_AC_BK:
1207 case QID_AC_BK: 1201 case QID_AC_BE:
1208 case QID_AC_BE: 1202 case QID_AC_VI:
1209 case QID_AC_VI: 1203 case QID_AC_VO:
1210 case QID_AC_VO: 1204 if (pAd->TxRing[QueIdx].TxSwFreeIdx >
1211 if (pAd->TxRing[QueIdx].TxSwFreeIdx > pAd->TxRing[QueIdx].TxCpuIdx) 1205 pAd->TxRing[QueIdx].TxCpuIdx)
1212 FreeNumber = pAd->TxRing[QueIdx].TxSwFreeIdx - pAd->TxRing[QueIdx].TxCpuIdx - 1; 1206 FreeNumber =
1213 else 1207 pAd->TxRing[QueIdx].TxSwFreeIdx -
1214 FreeNumber = pAd->TxRing[QueIdx].TxSwFreeIdx + TX_RING_SIZE - pAd->TxRing[QueIdx].TxCpuIdx - 1; 1208 pAd->TxRing[QueIdx].TxCpuIdx - 1;
1215 1209 else
1216 if (FreeNumber >= NumberRequired) 1210 FreeNumber =
1217 Status = NDIS_STATUS_SUCCESS; 1211 pAd->TxRing[QueIdx].TxSwFreeIdx + TX_RING_SIZE -
1218 break; 1212 pAd->TxRing[QueIdx].TxCpuIdx - 1;
1219 1213
1220 case QID_MGMT: 1214 if (FreeNumber >= NumberRequired)
1221 if (pAd->MgmtRing.TxSwFreeIdx > pAd->MgmtRing.TxCpuIdx) 1215 Status = NDIS_STATUS_SUCCESS;
1222 FreeNumber = pAd->MgmtRing.TxSwFreeIdx - pAd->MgmtRing.TxCpuIdx - 1; 1216 break;
1223 else 1217
1224 FreeNumber = pAd->MgmtRing.TxSwFreeIdx + MGMT_RING_SIZE - pAd->MgmtRing.TxCpuIdx - 1; 1218 case QID_MGMT:
1225 1219 if (pAd->MgmtRing.TxSwFreeIdx > pAd->MgmtRing.TxCpuIdx)
1226 if (FreeNumber >= NumberRequired) 1220 FreeNumber =
1227 Status = NDIS_STATUS_SUCCESS; 1221 pAd->MgmtRing.TxSwFreeIdx - pAd->MgmtRing.TxCpuIdx -
1228 break; 1222 1;
1229 1223 else
1230 default: 1224 FreeNumber =
1231 DBGPRINT(RT_DEBUG_ERROR,("RTMPFreeTXDRequest::Invalid QueIdx(=%d)\n", QueIdx)); 1225 pAd->MgmtRing.TxSwFreeIdx + MGMT_RING_SIZE -
1232 break; 1226 pAd->MgmtRing.TxCpuIdx - 1;
1227
1228 if (FreeNumber >= NumberRequired)
1229 Status = NDIS_STATUS_SUCCESS;
1230 break;
1231
1232 default:
1233 DBGPRINT(RT_DEBUG_ERROR,
1234 ("RTMPFreeTXDRequest::Invalid QueIdx(=%d)\n", QueIdx));
1235 break;
1233 } 1236 }
1234 *FreeNumberIs = (UCHAR)FreeNumber; 1237 *FreeNumberIs = (UCHAR) FreeNumber;
1235 1238
1236 return (Status); 1239 return (Status);
1237} 1240}
@@ -1241,76 +1244,69 @@ NDIS_STATUS RTMPFreeTXDRequest(
1241 Actually, this function used to check if the TxHardware Queue still has frame need to send. 1244 Actually, this function used to check if the TxHardware Queue still has frame need to send.
1242 If no frame need to send, go to sleep, else, still wake up. 1245 If no frame need to send, go to sleep, else, still wake up.
1243*/ 1246*/
1244NDIS_STATUS RTMPFreeTXDRequest( 1247NDIS_STATUS RTMPFreeTXDRequest(IN PRTMP_ADAPTER pAd,
1245 IN PRTMP_ADAPTER pAd, 1248 IN UCHAR QueIdx,
1246 IN UCHAR QueIdx, 1249 IN UCHAR NumberRequired, IN PUCHAR FreeNumberIs)
1247 IN UCHAR NumberRequired,
1248 IN PUCHAR FreeNumberIs)
1249{ 1250{
1250 //ULONG FreeNumber = 0; 1251 //ULONG FreeNumber = 0;
1251 NDIS_STATUS Status = NDIS_STATUS_FAILURE; 1252 NDIS_STATUS Status = NDIS_STATUS_FAILURE;
1252 unsigned long IrqFlags; 1253 unsigned long IrqFlags;
1253 HT_TX_CONTEXT *pHTTXContext; 1254 HT_TX_CONTEXT *pHTTXContext;
1254 1255
1255 switch (QueIdx) 1256 switch (QueIdx) {
1256 { 1257 case QID_AC_BK:
1257 case QID_AC_BK: 1258 case QID_AC_BE:
1258 case QID_AC_BE: 1259 case QID_AC_VI:
1259 case QID_AC_VI: 1260 case QID_AC_VO:
1260 case QID_AC_VO: 1261 {
1261 { 1262 pHTTXContext = &pAd->TxContext[QueIdx];
1262 pHTTXContext = &pAd->TxContext[QueIdx]; 1263 RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[QueIdx],
1263 RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags); 1264 IrqFlags);
1264 if ((pHTTXContext->CurWritePosition != pHTTXContext->ENextBulkOutPosition) || 1265 if ((pHTTXContext->CurWritePosition !=
1265 (pHTTXContext->IRPPending == TRUE)) 1266 pHTTXContext->ENextBulkOutPosition)
1266 { 1267 || (pHTTXContext->IRPPending == TRUE)) {
1267 Status = NDIS_STATUS_FAILURE;
1268 }
1269 else
1270 {
1271 Status = NDIS_STATUS_SUCCESS;
1272 }
1273 RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);
1274 }
1275 break;
1276 case QID_MGMT:
1277 if (pAd->MgmtRing.TxSwFreeIdx != MGMT_RING_SIZE)
1278 Status = NDIS_STATUS_FAILURE; 1268 Status = NDIS_STATUS_FAILURE;
1279 else 1269 } else {
1280 Status = NDIS_STATUS_SUCCESS; 1270 Status = NDIS_STATUS_SUCCESS;
1281 break; 1271 }
1282 default: 1272 RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx],
1283 DBGPRINT(RT_DEBUG_ERROR,("RTMPFreeTXDRequest::Invalid QueIdx(=%d)\n", QueIdx)); 1273 IrqFlags);
1284 break; 1274 }
1275 break;
1276 case QID_MGMT:
1277 if (pAd->MgmtRing.TxSwFreeIdx != MGMT_RING_SIZE)
1278 Status = NDIS_STATUS_FAILURE;
1279 else
1280 Status = NDIS_STATUS_SUCCESS;
1281 break;
1282 default:
1283 DBGPRINT(RT_DEBUG_ERROR,
1284 ("RTMPFreeTXDRequest::Invalid QueIdx(=%d)\n", QueIdx));
1285 break;
1285 } 1286 }
1286 1287
1287 return (Status); 1288 return (Status);
1288} 1289}
1289#endif // RTMP_MAC_USB // 1290#endif // RTMP_MAC_USB //
1290 1291
1291VOID RTMPSendDisassociationFrame( 1292VOID RTMPSendDisassociationFrame(IN PRTMP_ADAPTER pAd)
1292 IN PRTMP_ADAPTER pAd)
1293{ 1293{
1294} 1294}
1295 1295
1296VOID RTMPSendNullFrame( 1296VOID RTMPSendNullFrame(IN PRTMP_ADAPTER pAd,
1297 IN PRTMP_ADAPTER pAd, 1297 IN UCHAR TxRate, IN BOOLEAN bQosNull)
1298 IN UCHAR TxRate,
1299 IN BOOLEAN bQosNull)
1300{ 1298{
1301 UCHAR NullFrame[48]; 1299 UCHAR NullFrame[48];
1302 ULONG Length; 1300 ULONG Length;
1303 PHEADER_802_11 pHeader_802_11; 1301 PHEADER_802_11 pHeader_802_11;
1304 1302
1305 // WPA 802.1x secured port control 1303 // WPA 802.1x secured port control
1306 if (((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || 1304 if (((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) ||
1307 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) || 1305 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) ||
1308 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) || 1306 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) ||
1309 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) 1307 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)
1310 || (pAd->StaCfg.IEEE8021X == TRUE) 1308 || (pAd->StaCfg.IEEE8021X == TRUE)
1311 ) && 1309 ) && (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED)) {
1312 (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED))
1313 {
1314 return; 1310 return;
1315 } 1311 }
1316 1312
@@ -1326,28 +1322,26 @@ VOID RTMPSendNullFrame(
1326 COPY_MAC_ADDR(pHeader_802_11->Addr2, pAd->CurrentAddress); 1322 COPY_MAC_ADDR(pHeader_802_11->Addr2, pAd->CurrentAddress);
1327 COPY_MAC_ADDR(pHeader_802_11->Addr3, pAd->CommonCfg.Bssid); 1323 COPY_MAC_ADDR(pHeader_802_11->Addr3, pAd->CommonCfg.Bssid);
1328 1324
1329 if (pAd->CommonCfg.bAPSDForcePowerSave) 1325 if (pAd->CommonCfg.bAPSDForcePowerSave) {
1330 {
1331 pHeader_802_11->FC.PwrMgmt = PWR_SAVE; 1326 pHeader_802_11->FC.PwrMgmt = PWR_SAVE;
1327 } else {
1328 pHeader_802_11->FC.PwrMgmt =
1329 (pAd->StaCfg.Psm == PWR_SAVE) ? 1 : 0;
1332 } 1330 }
1333 else 1331 pHeader_802_11->Duration =
1334 { 1332 pAd->CommonCfg.Dsifs + RTMPCalcDuration(pAd, TxRate, 14);
1335 pHeader_802_11->FC.PwrMgmt = (pAd->StaCfg.Psm == PWR_SAVE) ? 1: 0;
1336 }
1337 pHeader_802_11->Duration = pAd->CommonCfg.Dsifs + RTMPCalcDuration(pAd, TxRate, 14);
1338 1333
1339 pAd->Sequence++; 1334 pAd->Sequence++;
1340 pHeader_802_11->Sequence = pAd->Sequence; 1335 pHeader_802_11->Sequence = pAd->Sequence;
1341 1336
1342 // Prepare QosNull function frame 1337 // Prepare QosNull function frame
1343 if (bQosNull) 1338 if (bQosNull) {
1344 {
1345 pHeader_802_11->FC.SubType = SUBTYPE_QOS_NULL; 1339 pHeader_802_11->FC.SubType = SUBTYPE_QOS_NULL;
1346 1340
1347 // copy QOS control bytes 1341 // copy QOS control bytes
1348 NullFrame[Length] = 0; 1342 NullFrame[Length] = 0;
1349 NullFrame[Length+1] = 0; 1343 NullFrame[Length + 1] = 0;
1350 Length += 2;// if pad with 2 bytes for alignment, APSD will fail 1344 Length += 2; // if pad with 2 bytes for alignment, APSD will fail
1351 } 1345 }
1352 1346
1353 HAL_KickOutNullFrameTx(pAd, 0, NullFrame, Length); 1347 HAL_KickOutNullFrameTx(pAd, 0, NullFrame, Length);
@@ -1355,68 +1349,57 @@ VOID RTMPSendNullFrame(
1355} 1349}
1356 1350
1357// IRQL = DISPATCH_LEVEL 1351// IRQL = DISPATCH_LEVEL
1358VOID RTMPSendRTSFrame( 1352VOID RTMPSendRTSFrame(IN PRTMP_ADAPTER pAd,
1359 IN PRTMP_ADAPTER pAd, 1353 IN PUCHAR pDA,
1360 IN PUCHAR pDA, 1354 IN unsigned int NextMpduSize,
1361 IN unsigned int NextMpduSize, 1355 IN UCHAR TxRate,
1362 IN UCHAR TxRate, 1356 IN UCHAR RTSRate,
1363 IN UCHAR RTSRate, 1357 IN USHORT AckDuration, IN UCHAR QueIdx, IN UCHAR FrameGap)
1364 IN USHORT AckDuration,
1365 IN UCHAR QueIdx,
1366 IN UCHAR FrameGap)
1367{ 1358{
1368} 1359}
1369 1360
1370
1371
1372// -------------------------------------------------------- 1361// --------------------------------------------------------
1373// FIND ENCRYPT KEY AND DECIDE CIPHER ALGORITHM 1362// FIND ENCRYPT KEY AND DECIDE CIPHER ALGORITHM
1374// Find the WPA key, either Group or Pairwise Key 1363// Find the WPA key, either Group or Pairwise Key
1375// LEAP + TKIP also use WPA key. 1364// LEAP + TKIP also use WPA key.
1376// -------------------------------------------------------- 1365// --------------------------------------------------------
1377// Decide WEP bit and cipher suite to be used. Same cipher suite should be used for whole fragment burst 1366// Decide WEP bit and cipher suite to be used. Same cipher suite should be used for whole fragment burst
1378// In Cisco CCX 2.0 Leap Authentication 1367// In Cisco CCX 2.0 Leap Authentication
1379// WepStatus is Ndis802_11Encryption1Enabled but the key will use PairwiseKey 1368// WepStatus is Ndis802_11Encryption1Enabled but the key will use PairwiseKey
1380// Instead of the SharedKey, SharedKey Length may be Zero. 1369// Instead of the SharedKey, SharedKey Length may be Zero.
1381VOID STAFindCipherAlgorithm( 1370VOID STAFindCipherAlgorithm(IN PRTMP_ADAPTER pAd, IN TX_BLK * pTxBlk)
1382 IN PRTMP_ADAPTER pAd,
1383 IN TX_BLK *pTxBlk)
1384{ 1371{
1385 NDIS_802_11_ENCRYPTION_STATUS Cipher; // To indicate cipher used for this packet 1372 NDIS_802_11_ENCRYPTION_STATUS Cipher; // To indicate cipher used for this packet
1386 UCHAR CipherAlg = CIPHER_NONE; // cipher alogrithm 1373 UCHAR CipherAlg = CIPHER_NONE; // cipher alogrithm
1387 UCHAR KeyIdx = 0xff; 1374 UCHAR KeyIdx = 0xff;
1388 PUCHAR pSrcBufVA; 1375 PUCHAR pSrcBufVA;
1389 PCIPHER_KEY pKey = NULL; 1376 PCIPHER_KEY pKey = NULL;
1390 1377
1391 pSrcBufVA = GET_OS_PKT_DATAPTR(pTxBlk->pPacket); 1378 pSrcBufVA = GET_OS_PKT_DATAPTR(pTxBlk->pPacket);
1392 1379
1393 { 1380 {
1394 // Select Cipher 1381 // Select Cipher
1395 if ((*pSrcBufVA & 0x01) && (ADHOC_ON(pAd))) 1382 if ((*pSrcBufVA & 0x01) && (ADHOC_ON(pAd)))
1396 Cipher = pAd->StaCfg.GroupCipher; // Cipher for Multicast or Broadcast 1383 Cipher = pAd->StaCfg.GroupCipher; // Cipher for Multicast or Broadcast
1397 else 1384 else
1398 Cipher = pAd->StaCfg.PairCipher; // Cipher for Unicast 1385 Cipher = pAd->StaCfg.PairCipher; // Cipher for Unicast
1399 1386
1400 if (RTMP_GET_PACKET_EAPOL(pTxBlk->pPacket)) 1387 if (RTMP_GET_PACKET_EAPOL(pTxBlk->pPacket)) {
1401 { 1388 ASSERT(pAd->SharedKey[BSS0][0].CipherAlg <=
1402 ASSERT(pAd->SharedKey[BSS0][0].CipherAlg <= CIPHER_CKIP128); 1389 CIPHER_CKIP128);
1403 1390
1404 // 4-way handshaking frame must be clear 1391 // 4-way handshaking frame must be clear
1405 if (!(TX_BLK_TEST_FLAG(pTxBlk, fTX_bClearEAPFrame)) && (pAd->SharedKey[BSS0][0].CipherAlg) && 1392 if (!(TX_BLK_TEST_FLAG(pTxBlk, fTX_bClearEAPFrame))
1406 (pAd->SharedKey[BSS0][0].KeyLen)) 1393 && (pAd->SharedKey[BSS0][0].CipherAlg)
1407 { 1394 && (pAd->SharedKey[BSS0][0].KeyLen)) {
1408 CipherAlg = pAd->SharedKey[BSS0][0].CipherAlg; 1395 CipherAlg = pAd->SharedKey[BSS0][0].CipherAlg;
1409 KeyIdx = 0; 1396 KeyIdx = 0;
1410 } 1397 }
1411 } 1398 } else if (Cipher == Ndis802_11Encryption1Enabled) {
1412 else if (Cipher == Ndis802_11Encryption1Enabled) 1399 KeyIdx = pAd->StaCfg.DefaultKeyId;
1413 { 1400 } else if ((Cipher == Ndis802_11Encryption2Enabled) ||
1414 KeyIdx = pAd->StaCfg.DefaultKeyId; 1401 (Cipher == Ndis802_11Encryption3Enabled)) {
1415 } 1402 if ((*pSrcBufVA & 0x01) && (ADHOC_ON(pAd))) // multicast
1416 else if ((Cipher == Ndis802_11Encryption2Enabled) ||
1417 (Cipher == Ndis802_11Encryption3Enabled))
1418 {
1419 if ((*pSrcBufVA & 0x01) && (ADHOC_ON(pAd))) // multicast
1420 KeyIdx = pAd->StaCfg.DefaultKeyId; 1403 KeyIdx = pAd->StaCfg.DefaultKeyId;
1421 else if (pAd->SharedKey[BSS0][0].KeyLen) 1404 else if (pAd->SharedKey[BSS0][0].KeyLen)
1422 KeyIdx = 0; 1405 KeyIdx = 0;
@@ -1426,15 +1409,16 @@ VOID STAFindCipherAlgorithm(
1426 1409
1427 if (KeyIdx == 0xff) 1410 if (KeyIdx == 0xff)
1428 CipherAlg = CIPHER_NONE; 1411 CipherAlg = CIPHER_NONE;
1429 else if ((Cipher == Ndis802_11EncryptionDisabled) || (pAd->SharedKey[BSS0][KeyIdx].KeyLen == 0)) 1412 else if ((Cipher == Ndis802_11EncryptionDisabled)
1413 || (pAd->SharedKey[BSS0][KeyIdx].KeyLen == 0))
1430 CipherAlg = CIPHER_NONE; 1414 CipherAlg = CIPHER_NONE;
1431 else if ( pAd->StaCfg.WpaSupplicantUP && 1415 else if (pAd->StaCfg.WpaSupplicantUP &&
1432 (Cipher == Ndis802_11Encryption1Enabled) && 1416 (Cipher == Ndis802_11Encryption1Enabled) &&
1433 (pAd->StaCfg.IEEE8021X == TRUE) && 1417 (pAd->StaCfg.IEEE8021X == TRUE) &&
1434 (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED)) 1418 (pAd->StaCfg.PortSecured ==
1435 CipherAlg = CIPHER_NONE; 1419 WPA_802_1X_PORT_NOT_SECURED))
1436 else 1420 CipherAlg = CIPHER_NONE;
1437 { 1421 else {
1438 //Header_802_11.FC.Wep = 1; 1422 //Header_802_11.FC.Wep = 1;
1439 CipherAlg = pAd->SharedKey[BSS0][KeyIdx].CipherAlg; 1423 CipherAlg = pAd->SharedKey[BSS0][KeyIdx].CipherAlg;
1440 pKey = &pAd->SharedKey[BSS0][KeyIdx]; 1424 pKey = &pAd->SharedKey[BSS0][KeyIdx];
@@ -1445,12 +1429,9 @@ VOID STAFindCipherAlgorithm(
1445 pTxBlk->pKey = pKey; 1429 pTxBlk->pKey = pKey;
1446} 1430}
1447 1431
1448 1432VOID STABuildCommon802_11Header(IN PRTMP_ADAPTER pAd, IN TX_BLK * pTxBlk)
1449VOID STABuildCommon802_11Header(
1450 IN PRTMP_ADAPTER pAd,
1451 IN TX_BLK *pTxBlk)
1452{ 1433{
1453 HEADER_802_11 *pHeader_802_11; 1434 HEADER_802_11 *pHeader_802_11;
1454 1435
1455 // 1436 //
1456 // MAKE A COMMON 802.11 HEADER 1437 // MAKE A COMMON 802.11 HEADER
@@ -1459,33 +1440,36 @@ VOID STABuildCommon802_11Header(
1459 // normal wlan header size : 24 octets 1440 // normal wlan header size : 24 octets
1460 pTxBlk->MpduHeaderLen = sizeof(HEADER_802_11); 1441 pTxBlk->MpduHeaderLen = sizeof(HEADER_802_11);
1461 1442
1462 pHeader_802_11 = (HEADER_802_11 *) &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWI_SIZE]; 1443 pHeader_802_11 =
1444 (HEADER_802_11 *) & pTxBlk->HeaderBuf[TXINFO_SIZE + TXWI_SIZE];
1463 1445
1464 NdisZeroMemory(pHeader_802_11, sizeof(HEADER_802_11)); 1446 NdisZeroMemory(pHeader_802_11, sizeof(HEADER_802_11));
1465 1447
1466 pHeader_802_11->FC.FrDs = 0; 1448 pHeader_802_11->FC.FrDs = 0;
1467 pHeader_802_11->FC.Type = BTYPE_DATA; 1449 pHeader_802_11->FC.Type = BTYPE_DATA;
1468 pHeader_802_11->FC.SubType = ((TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM)) ? SUBTYPE_QDATA : SUBTYPE_DATA); 1450 pHeader_802_11->FC.SubType =
1469 1451 ((TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM)) ? SUBTYPE_QDATA :
1470 if (pTxBlk->pMacEntry) 1452 SUBTYPE_DATA);
1471 { 1453
1472 if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bForceNonQoS)) 1454 if (pTxBlk->pMacEntry) {
1473 { 1455 if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bForceNonQoS)) {
1474 pHeader_802_11->Sequence = pTxBlk->pMacEntry->NonQosDataSeq; 1456 pHeader_802_11->Sequence =
1475 pTxBlk->pMacEntry->NonQosDataSeq = (pTxBlk->pMacEntry->NonQosDataSeq+1) & MAXSEQ; 1457 pTxBlk->pMacEntry->NonQosDataSeq;
1476 } 1458 pTxBlk->pMacEntry->NonQosDataSeq =
1477 else 1459 (pTxBlk->pMacEntry->NonQosDataSeq + 1) & MAXSEQ;
1478 { 1460 } else {
1479 { 1461 {
1480 pHeader_802_11->Sequence = pTxBlk->pMacEntry->TxSeq[pTxBlk->UserPriority]; 1462 pHeader_802_11->Sequence =
1481 pTxBlk->pMacEntry->TxSeq[pTxBlk->UserPriority] = (pTxBlk->pMacEntry->TxSeq[pTxBlk->UserPriority]+1) & MAXSEQ; 1463 pTxBlk->pMacEntry->TxSeq[pTxBlk->
1482 } 1464 UserPriority];
1483 } 1465 pTxBlk->pMacEntry->TxSeq[pTxBlk->UserPriority] =
1484 } 1466 (pTxBlk->pMacEntry->
1485 else 1467 TxSeq[pTxBlk->UserPriority] + 1) & MAXSEQ;
1486 { 1468 }
1469 }
1470 } else {
1487 pHeader_802_11->Sequence = pAd->Sequence; 1471 pHeader_802_11->Sequence = pAd->Sequence;
1488 pAd->Sequence = (pAd->Sequence+1) & MAXSEQ; // next sequence 1472 pAd->Sequence = (pAd->Sequence + 1) & MAXSEQ; // next sequence
1489 } 1473 }
1490 1474
1491 pHeader_802_11->Frag = 0; 1475 pHeader_802_11->Frag = 0;
@@ -1493,20 +1477,23 @@ VOID STABuildCommon802_11Header(
1493 pHeader_802_11->FC.MoreData = TX_BLK_TEST_FLAG(pTxBlk, fTX_bMoreData); 1477 pHeader_802_11->FC.MoreData = TX_BLK_TEST_FLAG(pTxBlk, fTX_bMoreData);
1494 1478
1495 { 1479 {
1496 if (INFRA_ON(pAd)) 1480 if (INFRA_ON(pAd)) {
1497 {
1498 { 1481 {
1499 COPY_MAC_ADDR(pHeader_802_11->Addr1, pAd->CommonCfg.Bssid); 1482 COPY_MAC_ADDR(pHeader_802_11->Addr1,
1500 COPY_MAC_ADDR(pHeader_802_11->Addr2, pAd->CurrentAddress); 1483 pAd->CommonCfg.Bssid);
1501 COPY_MAC_ADDR(pHeader_802_11->Addr3, pTxBlk->pSrcBufHeader); 1484 COPY_MAC_ADDR(pHeader_802_11->Addr2,
1502 pHeader_802_11->FC.ToDs = 1; 1485 pAd->CurrentAddress);
1503 } 1486 COPY_MAC_ADDR(pHeader_802_11->Addr3,
1504 } 1487 pTxBlk->pSrcBufHeader);
1505 else if (ADHOC_ON(pAd)) 1488 pHeader_802_11->FC.ToDs = 1;
1506 { 1489 }
1507 COPY_MAC_ADDR(pHeader_802_11->Addr1, pTxBlk->pSrcBufHeader); 1490 } else if (ADHOC_ON(pAd)) {
1508 COPY_MAC_ADDR(pHeader_802_11->Addr2, pAd->CurrentAddress); 1491 COPY_MAC_ADDR(pHeader_802_11->Addr1,
1509 COPY_MAC_ADDR(pHeader_802_11->Addr3, pAd->CommonCfg.Bssid); 1492 pTxBlk->pSrcBufHeader);
1493 COPY_MAC_ADDR(pHeader_802_11->Addr2,
1494 pAd->CurrentAddress);
1495 COPY_MAC_ADDR(pHeader_802_11->Addr3,
1496 pAd->CommonCfg.Bssid);
1510 pHeader_802_11->FC.ToDs = 0; 1497 pHeader_802_11->FC.ToDs = 0;
1511 } 1498 }
1512 } 1499 }
@@ -1518,20 +1505,18 @@ VOID STABuildCommon802_11Header(
1518 // STEP 2. MAKE A COMMON 802.11 HEADER SHARED BY ENTIRE FRAGMENT BURST. Fill sequence later. 1505 // STEP 2. MAKE A COMMON 802.11 HEADER SHARED BY ENTIRE FRAGMENT BURST. Fill sequence later.
1519 // ----------------------------------------------------------------- 1506 // -----------------------------------------------------------------
1520 if (pAd->CommonCfg.bAPSDForcePowerSave) 1507 if (pAd->CommonCfg.bAPSDForcePowerSave)
1521 pHeader_802_11->FC.PwrMgmt = PWR_SAVE; 1508 pHeader_802_11->FC.PwrMgmt = PWR_SAVE;
1522 else 1509 else
1523 pHeader_802_11->FC.PwrMgmt = (pAd->StaCfg.Psm == PWR_SAVE); 1510 pHeader_802_11->FC.PwrMgmt = (pAd->StaCfg.Psm == PWR_SAVE);
1524} 1511}
1525 1512
1526VOID STABuildCache802_11Header( 1513VOID STABuildCache802_11Header(IN RTMP_ADAPTER * pAd,
1527 IN RTMP_ADAPTER *pAd, 1514 IN TX_BLK * pTxBlk, IN UCHAR * pHeader)
1528 IN TX_BLK *pTxBlk,
1529 IN UCHAR *pHeader)
1530{ 1515{
1531 MAC_TABLE_ENTRY *pMacEntry; 1516 MAC_TABLE_ENTRY *pMacEntry;
1532 PHEADER_802_11 pHeader80211; 1517 PHEADER_802_11 pHeader80211;
1533 1518
1534 pHeader80211 = (PHEADER_802_11)pHeader; 1519 pHeader80211 = (PHEADER_802_11) pHeader;
1535 pMacEntry = pTxBlk->pMacEntry; 1520 pMacEntry = pTxBlk->pMacEntry;
1536 1521
1537 // 1522 //
@@ -1546,7 +1531,8 @@ VOID STABuildCache802_11Header(
1546 1531
1547 // Sequence 1532 // Sequence
1548 pHeader80211->Sequence = pMacEntry->TxSeq[pTxBlk->UserPriority]; 1533 pHeader80211->Sequence = pMacEntry->TxSeq[pTxBlk->UserPriority];
1549 pMacEntry->TxSeq[pTxBlk->UserPriority] = (pMacEntry->TxSeq[pTxBlk->UserPriority]+1) & MAXSEQ; 1534 pMacEntry->TxSeq[pTxBlk->UserPriority] =
1535 (pMacEntry->TxSeq[pTxBlk->UserPriority] + 1) & MAXSEQ;
1550 1536
1551 { 1537 {
1552 // Check if the frame can be sent through DLS direct link interface 1538 // Check if the frame can be sent through DLS direct link interface
@@ -1554,34 +1540,34 @@ VOID STABuildCache802_11Header(
1554 1540
1555 // The addr3 of normal packet send from DS is Dest Mac address. 1541 // The addr3 of normal packet send from DS is Dest Mac address.
1556 if (ADHOC_ON(pAd)) 1542 if (ADHOC_ON(pAd))
1557 COPY_MAC_ADDR(pHeader80211->Addr3, pAd->CommonCfg.Bssid); 1543 COPY_MAC_ADDR(pHeader80211->Addr3,
1544 pAd->CommonCfg.Bssid);
1558 else 1545 else
1559 COPY_MAC_ADDR(pHeader80211->Addr3, pTxBlk->pSrcBufHeader); 1546 COPY_MAC_ADDR(pHeader80211->Addr3,
1547 pTxBlk->pSrcBufHeader);
1560 } 1548 }
1561 1549
1562 // ----------------------------------------------------------------- 1550 // -----------------------------------------------------------------
1563 // STEP 2. MAKE A COMMON 802.11 HEADER SHARED BY ENTIRE FRAGMENT BURST. Fill sequence later. 1551 // STEP 2. MAKE A COMMON 802.11 HEADER SHARED BY ENTIRE FRAGMENT BURST. Fill sequence later.
1564 // ----------------------------------------------------------------- 1552 // -----------------------------------------------------------------
1565 if (pAd->CommonCfg.bAPSDForcePowerSave) 1553 if (pAd->CommonCfg.bAPSDForcePowerSave)
1566 pHeader80211->FC.PwrMgmt = PWR_SAVE; 1554 pHeader80211->FC.PwrMgmt = PWR_SAVE;
1567 else 1555 else
1568 pHeader80211->FC.PwrMgmt = (pAd->StaCfg.Psm == PWR_SAVE); 1556 pHeader80211->FC.PwrMgmt = (pAd->StaCfg.Psm == PWR_SAVE);
1569} 1557}
1570 1558
1571static inline PUCHAR STA_Build_ARalink_Frame_Header( 1559static inline PUCHAR STA_Build_ARalink_Frame_Header(IN RTMP_ADAPTER * pAd,
1572 IN RTMP_ADAPTER *pAd, 1560 IN TX_BLK * pTxBlk)
1573 IN TX_BLK *pTxBlk)
1574{ 1561{
1575 PUCHAR pHeaderBufPtr; 1562 PUCHAR pHeaderBufPtr;
1576 HEADER_802_11 *pHeader_802_11; 1563 HEADER_802_11 *pHeader_802_11;
1577 PNDIS_PACKET pNextPacket; 1564 PNDIS_PACKET pNextPacket;
1578 UINT32 nextBufLen; 1565 UINT32 nextBufLen;
1579 PQUEUE_ENTRY pQEntry; 1566 PQUEUE_ENTRY pQEntry;
1580 1567
1581 STAFindCipherAlgorithm(pAd, pTxBlk); 1568 STAFindCipherAlgorithm(pAd, pTxBlk);
1582 STABuildCommon802_11Header(pAd, pTxBlk); 1569 STABuildCommon802_11Header(pAd, pTxBlk);
1583 1570
1584
1585 pHeaderBufPtr = &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWI_SIZE]; 1571 pHeaderBufPtr = &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWI_SIZE];
1586 pHeader_802_11 = (HEADER_802_11 *) pHeaderBufPtr; 1572 pHeader_802_11 = (HEADER_802_11 *) pHeaderBufPtr;
1587 1573
@@ -1591,22 +1577,20 @@ static inline PUCHAR STA_Build_ARalink_Frame_Header(
1591 // skip common header 1577 // skip common header
1592 pHeaderBufPtr += pTxBlk->MpduHeaderLen; 1578 pHeaderBufPtr += pTxBlk->MpduHeaderLen;
1593 1579
1594 if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM)) 1580 if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM)) {
1595 {
1596 // 1581 //
1597 // build QOS Control bytes 1582 // build QOS Control bytes
1598 // 1583 //
1599 *pHeaderBufPtr = (pTxBlk->UserPriority & 0x0F); 1584 *pHeaderBufPtr = (pTxBlk->UserPriority & 0x0F);
1600 1585
1601 *(pHeaderBufPtr+1) = 0; 1586 *(pHeaderBufPtr + 1) = 0;
1602 pHeaderBufPtr +=2; 1587 pHeaderBufPtr += 2;
1603 pTxBlk->MpduHeaderLen += 2; 1588 pTxBlk->MpduHeaderLen += 2;
1604 } 1589 }
1605
1606 // padding at front of LLC header. LLC header should at 4-bytes aligment. 1590 // padding at front of LLC header. LLC header should at 4-bytes aligment.
1607 pTxBlk->HdrPadLen = (ULONG)pHeaderBufPtr; 1591 pTxBlk->HdrPadLen = (ULONG) pHeaderBufPtr;
1608 pHeaderBufPtr = (PUCHAR)ROUND_UP(pHeaderBufPtr, 4); 1592 pHeaderBufPtr = (PUCHAR) ROUND_UP(pHeaderBufPtr, 4);
1609 pTxBlk->HdrPadLen = (ULONG)(pHeaderBufPtr - pTxBlk->HdrPadLen); 1593 pTxBlk->HdrPadLen = (ULONG) (pHeaderBufPtr - pTxBlk->HdrPadLen);
1610 1594
1611 // For RA Aggregation, 1595 // For RA Aggregation,
1612 // put the 2nd MSDU length(extra 2-byte field) after QOS_CONTROL in little endian format 1596 // put the 2nd MSDU length(extra 2-byte field) after QOS_CONTROL in little endian format
@@ -1616,8 +1600,8 @@ static inline PUCHAR STA_Build_ARalink_Frame_Header(
1616 if (RTMP_GET_PACKET_VLAN(pNextPacket)) 1600 if (RTMP_GET_PACKET_VLAN(pNextPacket))
1617 nextBufLen -= LENGTH_802_1Q; 1601 nextBufLen -= LENGTH_802_1Q;
1618 1602
1619 *pHeaderBufPtr = (UCHAR)nextBufLen & 0xff; 1603 *pHeaderBufPtr = (UCHAR) nextBufLen & 0xff;
1620 *(pHeaderBufPtr+1) = (UCHAR)(nextBufLen >> 8); 1604 *(pHeaderBufPtr + 1) = (UCHAR) (nextBufLen >> 8);
1621 1605
1622 pHeaderBufPtr += 2; 1606 pHeaderBufPtr += 2;
1623 pTxBlk->MpduHeaderLen += 2; 1607 pTxBlk->MpduHeaderLen += 2;
@@ -1626,13 +1610,11 @@ static inline PUCHAR STA_Build_ARalink_Frame_Header(
1626 1610
1627} 1611}
1628 1612
1629static inline PUCHAR STA_Build_AMSDU_Frame_Header( 1613static inline PUCHAR STA_Build_AMSDU_Frame_Header(IN RTMP_ADAPTER * pAd,
1630 IN RTMP_ADAPTER *pAd, 1614 IN TX_BLK * pTxBlk)
1631 IN TX_BLK *pTxBlk)
1632{ 1615{
1633 PUCHAR pHeaderBufPtr;//, pSaveBufPtr; 1616 PUCHAR pHeaderBufPtr; //, pSaveBufPtr;
1634 HEADER_802_11 *pHeader_802_11; 1617 HEADER_802_11 *pHeader_802_11;
1635
1636 1618
1637 STAFindCipherAlgorithm(pAd, pTxBlk); 1619 STAFindCipherAlgorithm(pAd, pTxBlk);
1638 STABuildCommon802_11Header(pAd, pTxBlk); 1620 STABuildCommon802_11Header(pAd, pTxBlk);
@@ -1653,8 +1635,8 @@ static inline PUCHAR STA_Build_AMSDU_Frame_Header(
1653 // 1635 //
1654 *pHeaderBufPtr |= 0x80; 1636 *pHeaderBufPtr |= 0x80;
1655 1637
1656 *(pHeaderBufPtr+1) = 0; 1638 *(pHeaderBufPtr + 1) = 0;
1657 pHeaderBufPtr +=2; 1639 pHeaderBufPtr += 2;
1658 pTxBlk->MpduHeaderLen += 2; 1640 pTxBlk->MpduHeaderLen += 2;
1659 1641
1660 //pSaveBufPtr = pHeaderBufPtr; 1642 //pSaveBufPtr = pHeaderBufPtr;
@@ -1665,57 +1647,56 @@ static inline PUCHAR STA_Build_AMSDU_Frame_Header(
1665 // 1647 //
1666 // @@@ MpduHeaderLen excluding padding @@@ 1648 // @@@ MpduHeaderLen excluding padding @@@
1667 // 1649 //
1668 pTxBlk->HdrPadLen = (ULONG)pHeaderBufPtr; 1650 pTxBlk->HdrPadLen = (ULONG) pHeaderBufPtr;
1669 pHeaderBufPtr = (PUCHAR) ROUND_UP(pHeaderBufPtr, 4); 1651 pHeaderBufPtr = (PUCHAR) ROUND_UP(pHeaderBufPtr, 4);
1670 pTxBlk->HdrPadLen = (ULONG)(pHeaderBufPtr - pTxBlk->HdrPadLen); 1652 pTxBlk->HdrPadLen = (ULONG) (pHeaderBufPtr - pTxBlk->HdrPadLen);
1671 1653
1672 return pHeaderBufPtr; 1654 return pHeaderBufPtr;
1673 1655
1674} 1656}
1675 1657
1676 1658VOID STA_AMPDU_Frame_Tx(IN PRTMP_ADAPTER pAd, IN TX_BLK * pTxBlk)
1677VOID STA_AMPDU_Frame_Tx(
1678 IN PRTMP_ADAPTER pAd,
1679 IN TX_BLK *pTxBlk)
1680{ 1659{
1681 HEADER_802_11 *pHeader_802_11; 1660 HEADER_802_11 *pHeader_802_11;
1682 PUCHAR pHeaderBufPtr; 1661 PUCHAR pHeaderBufPtr;
1683 USHORT FreeNumber; 1662 USHORT FreeNumber;
1684 MAC_TABLE_ENTRY *pMacEntry; 1663 MAC_TABLE_ENTRY *pMacEntry;
1685 BOOLEAN bVLANPkt; 1664 BOOLEAN bVLANPkt;
1686 PQUEUE_ENTRY pQEntry; 1665 PQUEUE_ENTRY pQEntry;
1687 1666
1688 ASSERT(pTxBlk); 1667 ASSERT(pTxBlk);
1689 1668
1690 while(pTxBlk->TxPacketList.Head) 1669 while (pTxBlk->TxPacketList.Head) {
1691 {
1692 pQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList); 1670 pQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList);
1693 pTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry); 1671 pTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);
1694 if ( RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE) 1672 if (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE) {
1695 { 1673 RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket,
1696 RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE); 1674 NDIS_STATUS_FAILURE);
1697 continue; 1675 continue;
1698 } 1676 }
1699 1677
1700 bVLANPkt = (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) ? TRUE : FALSE); 1678 bVLANPkt =
1679 (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) ? TRUE : FALSE);
1701 1680
1702 pMacEntry = pTxBlk->pMacEntry; 1681 pMacEntry = pTxBlk->pMacEntry;
1703 if (pMacEntry->isCached) 1682 if (pMacEntry->isCached) {
1704 {
1705 // NOTE: Please make sure the size of pMacEntry->CachedBuf[] is smaller than pTxBlk->HeaderBuf[]!!!! 1683 // NOTE: Please make sure the size of pMacEntry->CachedBuf[] is smaller than pTxBlk->HeaderBuf[]!!!!
1706 NdisMoveMemory((PUCHAR)&pTxBlk->HeaderBuf[TXINFO_SIZE], (PUCHAR)&pMacEntry->CachedBuf[0], TXWI_SIZE + sizeof(HEADER_802_11)); 1684 NdisMoveMemory((PUCHAR) & pTxBlk->
1707 pHeaderBufPtr = (PUCHAR)(&pTxBlk->HeaderBuf[TXINFO_SIZE + TXWI_SIZE]); 1685 HeaderBuf[TXINFO_SIZE],
1686 (PUCHAR) & pMacEntry->CachedBuf[0],
1687 TXWI_SIZE + sizeof(HEADER_802_11));
1688 pHeaderBufPtr =
1689 (PUCHAR) (&pTxBlk->
1690 HeaderBuf[TXINFO_SIZE + TXWI_SIZE]);
1708 STABuildCache802_11Header(pAd, pTxBlk, pHeaderBufPtr); 1691 STABuildCache802_11Header(pAd, pTxBlk, pHeaderBufPtr);
1709 } 1692 } else {
1710 else
1711 {
1712 STAFindCipherAlgorithm(pAd, pTxBlk); 1693 STAFindCipherAlgorithm(pAd, pTxBlk);
1713 STABuildCommon802_11Header(pAd, pTxBlk); 1694 STABuildCommon802_11Header(pAd, pTxBlk);
1714 1695
1715 pHeaderBufPtr = &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWI_SIZE]; 1696 pHeaderBufPtr =
1697 &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWI_SIZE];
1716 } 1698 }
1717 1699
1718
1719 pHeader_802_11 = (HEADER_802_11 *) pHeaderBufPtr; 1700 pHeader_802_11 = (HEADER_802_11 *) pHeaderBufPtr;
1720 1701
1721 // skip common header 1702 // skip common header
@@ -1725,87 +1706,101 @@ VOID STA_AMPDU_Frame_Tx(
1725 // build QOS Control bytes 1706 // build QOS Control bytes
1726 // 1707 //
1727 *pHeaderBufPtr = (pTxBlk->UserPriority & 0x0F); 1708 *pHeaderBufPtr = (pTxBlk->UserPriority & 0x0F);
1728 *(pHeaderBufPtr+1) = 0; 1709 *(pHeaderBufPtr + 1) = 0;
1729 pHeaderBufPtr +=2; 1710 pHeaderBufPtr += 2;
1730 pTxBlk->MpduHeaderLen += 2; 1711 pTxBlk->MpduHeaderLen += 2;
1731 1712
1732 // 1713 //
1733 // build HTC+ 1714 // build HTC+
1734 // HTC control filed following QoS field 1715 // HTC control filed following QoS field
1735 // 1716 //
1736 if ((pAd->CommonCfg.bRdg == TRUE) && CLIENT_STATUS_TEST_FLAG(pTxBlk->pMacEntry, fCLIENT_STATUS_RDG_CAPABLE)) 1717 if ((pAd->CommonCfg.bRdg == TRUE)
1737 { 1718 && CLIENT_STATUS_TEST_FLAG(pTxBlk->pMacEntry,
1738 if (pMacEntry->isCached == FALSE) 1719 fCLIENT_STATUS_RDG_CAPABLE)) {
1739 { 1720 if (pMacEntry->isCached == FALSE) {
1740 // mark HTC bit 1721 // mark HTC bit
1741 pHeader_802_11->FC.Order = 1; 1722 pHeader_802_11->FC.Order = 1;
1742 1723
1743 NdisZeroMemory(pHeaderBufPtr, 4); 1724 NdisZeroMemory(pHeaderBufPtr, 4);
1744 *(pHeaderBufPtr+3) |= 0x80; 1725 *(pHeaderBufPtr + 3) |= 0x80;
1745 } 1726 }
1746 pHeaderBufPtr += 4; 1727 pHeaderBufPtr += 4;
1747 pTxBlk->MpduHeaderLen += 4; 1728 pTxBlk->MpduHeaderLen += 4;
1748 } 1729 }
1749
1750 //pTxBlk->MpduHeaderLen = pHeaderBufPtr - pTxBlk->HeaderBuf - TXWI_SIZE - TXINFO_SIZE; 1730 //pTxBlk->MpduHeaderLen = pHeaderBufPtr - pTxBlk->HeaderBuf - TXWI_SIZE - TXINFO_SIZE;
1751 ASSERT(pTxBlk->MpduHeaderLen >= 24); 1731 ASSERT(pTxBlk->MpduHeaderLen >= 24);
1752 1732
1753 // skip 802.3 header 1733 // skip 802.3 header
1754 pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3; 1734 pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3;
1755 pTxBlk->SrcBufLen -= LENGTH_802_3; 1735 pTxBlk->SrcBufLen -= LENGTH_802_3;
1756 1736
1757 // skip vlan tag 1737 // skip vlan tag
1758 if (bVLANPkt) 1738 if (bVLANPkt) {
1759 { 1739 pTxBlk->pSrcBufData += LENGTH_802_1Q;
1760 pTxBlk->pSrcBufData += LENGTH_802_1Q; 1740 pTxBlk->SrcBufLen -= LENGTH_802_1Q;
1761 pTxBlk->SrcBufLen -= LENGTH_802_1Q;
1762 } 1741 }
1763
1764 // 1742 //
1765 // padding at front of LLC header 1743 // padding at front of LLC header
1766 // LLC header should locate at 4-octets aligment 1744 // LLC header should locate at 4-octets aligment
1767 // 1745 //
1768 // @@@ MpduHeaderLen excluding padding @@@ 1746 // @@@ MpduHeaderLen excluding padding @@@
1769 // 1747 //
1770 pTxBlk->HdrPadLen = (ULONG)pHeaderBufPtr; 1748 pTxBlk->HdrPadLen = (ULONG) pHeaderBufPtr;
1771 pHeaderBufPtr = (PUCHAR) ROUND_UP(pHeaderBufPtr, 4); 1749 pHeaderBufPtr = (PUCHAR) ROUND_UP(pHeaderBufPtr, 4);
1772 pTxBlk->HdrPadLen = (ULONG)(pHeaderBufPtr - pTxBlk->HdrPadLen); 1750 pTxBlk->HdrPadLen = (ULONG) (pHeaderBufPtr - pTxBlk->HdrPadLen);
1773 1751
1774 { 1752 {
1775 1753
1776 // 1754 //
1777 // Insert LLC-SNAP encapsulation - 8 octets 1755 // Insert LLC-SNAP encapsulation - 8 octets
1778 // 1756 //
1779 EXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(pTxBlk->pSrcBufData-2, pTxBlk->pExtraLlcSnapEncap); 1757 EXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(pTxBlk->
1780 if (pTxBlk->pExtraLlcSnapEncap) 1758 pSrcBufData - 2,
1781 { 1759 pTxBlk->
1782 NdisMoveMemory(pHeaderBufPtr, pTxBlk->pExtraLlcSnapEncap, 6); 1760 pExtraLlcSnapEncap);
1761 if (pTxBlk->pExtraLlcSnapEncap) {
1762 NdisMoveMemory(pHeaderBufPtr,
1763 pTxBlk->pExtraLlcSnapEncap, 6);
1783 pHeaderBufPtr += 6; 1764 pHeaderBufPtr += 6;
1784 // get 2 octets (TypeofLen) 1765 // get 2 octets (TypeofLen)
1785 NdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufData-2, 2); 1766 NdisMoveMemory(pHeaderBufPtr,
1767 pTxBlk->pSrcBufData - 2, 2);
1786 pHeaderBufPtr += 2; 1768 pHeaderBufPtr += 2;
1787 pTxBlk->MpduHeaderLen += LENGTH_802_1_H; 1769 pTxBlk->MpduHeaderLen += LENGTH_802_1_H;
1788 } 1770 }
1789 1771
1790 } 1772 }
1791 1773
1792 if (pMacEntry->isCached) 1774 if (pMacEntry->isCached) {
1793 { 1775 RTMPWriteTxWI_Cache(pAd,
1794 RTMPWriteTxWI_Cache(pAd, (PTXWI_STRUC)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk); 1776 (PTXWI_STRUC) (&pTxBlk->
1795 } 1777 HeaderBuf
1796 else 1778 [TXINFO_SIZE]),
1797 { 1779 pTxBlk);
1798 RTMPWriteTxWI_Data(pAd, (PTXWI_STRUC)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk); 1780 } else {
1799 1781 RTMPWriteTxWI_Data(pAd,
1800 NdisZeroMemory((PUCHAR)(&pMacEntry->CachedBuf[0]), sizeof(pMacEntry->CachedBuf)); 1782 (PTXWI_STRUC) (&pTxBlk->
1801 NdisMoveMemory((PUCHAR)(&pMacEntry->CachedBuf[0]), (PUCHAR)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), (pHeaderBufPtr - (PUCHAR)(&pTxBlk->HeaderBuf[TXINFO_SIZE]))); 1783 HeaderBuf
1784 [TXINFO_SIZE]),
1785 pTxBlk);
1786
1787 NdisZeroMemory((PUCHAR) (&pMacEntry->CachedBuf[0]),
1788 sizeof(pMacEntry->CachedBuf));
1789 NdisMoveMemory((PUCHAR) (&pMacEntry->CachedBuf[0]),
1790 (PUCHAR) (&pTxBlk->
1791 HeaderBuf[TXINFO_SIZE]),
1792 (pHeaderBufPtr -
1793 (PUCHAR) (&pTxBlk->
1794 HeaderBuf[TXINFO_SIZE])));
1802 pMacEntry->isCached = TRUE; 1795 pMacEntry->isCached = TRUE;
1803 } 1796 }
1804 1797
1805 // calculate Transmitted AMPDU count and ByteCount 1798 // calculate Transmitted AMPDU count and ByteCount
1806 { 1799 {
1807 pAd->RalinkCounters.TransmittedMPDUsInAMPDUCount.u.LowPart ++; 1800 pAd->RalinkCounters.TransmittedMPDUsInAMPDUCount.u.
1808 pAd->RalinkCounters.TransmittedOctetsInAMPDUCount.QuadPart += pTxBlk->SrcBufLen; 1801 LowPart++;
1802 pAd->RalinkCounters.TransmittedOctetsInAMPDUCount.
1803 QuadPart += pTxBlk->SrcBufLen;
1809 } 1804 }
1810 1805
1811 //FreeNumber = GET_TXRING_FREENO(pAd, QueIdx); 1806 //FreeNumber = GET_TXRING_FREENO(pAd, QueIdx);
@@ -1824,62 +1819,64 @@ VOID STA_AMPDU_Frame_Tx(
1824 1819
1825} 1820}
1826 1821
1827 1822VOID STA_AMSDU_Frame_Tx(IN PRTMP_ADAPTER pAd, IN TX_BLK * pTxBlk)
1828VOID STA_AMSDU_Frame_Tx(
1829 IN PRTMP_ADAPTER pAd,
1830 IN TX_BLK *pTxBlk)
1831{ 1823{
1832 PUCHAR pHeaderBufPtr; 1824 PUCHAR pHeaderBufPtr;
1833 USHORT FreeNumber; 1825 USHORT FreeNumber;
1834 USHORT subFramePayloadLen = 0; // AMSDU Subframe length without AMSDU-Header / Padding. 1826 USHORT subFramePayloadLen = 0; // AMSDU Subframe length without AMSDU-Header / Padding.
1835 USHORT totalMPDUSize=0; 1827 USHORT totalMPDUSize = 0;
1836 UCHAR *subFrameHeader; 1828 UCHAR *subFrameHeader;
1837 UCHAR padding = 0; 1829 UCHAR padding = 0;
1838 USHORT FirstTx = 0, LastTxIdx = 0; 1830 USHORT FirstTx = 0, LastTxIdx = 0;
1839 BOOLEAN bVLANPkt; 1831 BOOLEAN bVLANPkt;
1840 int frameNum = 0; 1832 int frameNum = 0;
1841 PQUEUE_ENTRY pQEntry; 1833 PQUEUE_ENTRY pQEntry;
1842
1843 1834
1844 ASSERT(pTxBlk); 1835 ASSERT(pTxBlk);
1845 1836
1846 ASSERT((pTxBlk->TxPacketList.Number > 1)); 1837 ASSERT((pTxBlk->TxPacketList.Number > 1));
1847 1838
1848 while(pTxBlk->TxPacketList.Head) 1839 while (pTxBlk->TxPacketList.Head) {
1849 {
1850 pQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList); 1840 pQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList);
1851 pTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry); 1841 pTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);
1852 if (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE) 1842 if (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE) {
1853 { 1843 RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket,
1854 RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE); 1844 NDIS_STATUS_FAILURE);
1855 continue; 1845 continue;
1856 } 1846 }
1857 1847
1858 bVLANPkt = (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) ? TRUE : FALSE); 1848 bVLANPkt =
1849 (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) ? TRUE : FALSE);
1859 1850
1860 // skip 802.3 header 1851 // skip 802.3 header
1861 pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3; 1852 pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3;
1862 pTxBlk->SrcBufLen -= LENGTH_802_3; 1853 pTxBlk->SrcBufLen -= LENGTH_802_3;
1863 1854
1864 // skip vlan tag 1855 // skip vlan tag
1865 if (bVLANPkt) 1856 if (bVLANPkt) {
1866 { 1857 pTxBlk->pSrcBufData += LENGTH_802_1Q;
1867 pTxBlk->pSrcBufData += LENGTH_802_1Q; 1858 pTxBlk->SrcBufLen -= LENGTH_802_1Q;
1868 pTxBlk->SrcBufLen -= LENGTH_802_1Q;
1869 } 1859 }
1870 1860
1871 if (frameNum == 0) 1861 if (frameNum == 0) {
1872 { 1862 pHeaderBufPtr =
1873 pHeaderBufPtr = STA_Build_AMSDU_Frame_Header(pAd, pTxBlk); 1863 STA_Build_AMSDU_Frame_Header(pAd, pTxBlk);
1874 1864
1875 // NOTE: TxWI->MPDUtotalByteCount will be updated after final frame was handled. 1865 // NOTE: TxWI->MPDUtotalByteCount will be updated after final frame was handled.
1876 RTMPWriteTxWI_Data(pAd, (PTXWI_STRUC)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk); 1866 RTMPWriteTxWI_Data(pAd,
1877 } 1867 (PTXWI_STRUC) (&pTxBlk->
1878 else 1868 HeaderBuf
1879 { 1869 [TXINFO_SIZE]),
1870 pTxBlk);
1871 } else {
1880 pHeaderBufPtr = &pTxBlk->HeaderBuf[0]; 1872 pHeaderBufPtr = &pTxBlk->HeaderBuf[0];
1881 padding = ROUND_UP(LENGTH_AMSDU_SUBFRAMEHEAD + subFramePayloadLen, 4) - (LENGTH_AMSDU_SUBFRAMEHEAD + subFramePayloadLen); 1873 padding =
1882 NdisZeroMemory(pHeaderBufPtr, padding + LENGTH_AMSDU_SUBFRAMEHEAD); 1874 ROUND_UP(LENGTH_AMSDU_SUBFRAMEHEAD +
1875 subFramePayloadLen,
1876 4) - (LENGTH_AMSDU_SUBFRAMEHEAD +
1877 subFramePayloadLen);
1878 NdisZeroMemory(pHeaderBufPtr,
1879 padding + LENGTH_AMSDU_SUBFRAMEHEAD);
1883 pHeaderBufPtr += padding; 1880 pHeaderBufPtr += padding;
1884 pTxBlk->MpduHeaderLen = padding; 1881 pTxBlk->MpduHeaderLen = padding;
1885 } 1882 }
@@ -1893,39 +1890,42 @@ VOID STA_AMSDU_Frame_Tx(
1893 1890
1894 NdisMoveMemory(subFrameHeader, pTxBlk->pSrcBufHeader, 12); 1891 NdisMoveMemory(subFrameHeader, pTxBlk->pSrcBufHeader, 12);
1895 1892
1896
1897 pHeaderBufPtr += LENGTH_AMSDU_SUBFRAMEHEAD; 1893 pHeaderBufPtr += LENGTH_AMSDU_SUBFRAMEHEAD;
1898 pTxBlk->MpduHeaderLen += LENGTH_AMSDU_SUBFRAMEHEAD; 1894 pTxBlk->MpduHeaderLen += LENGTH_AMSDU_SUBFRAMEHEAD;
1899 1895
1900
1901 // 1896 //
1902 // Insert LLC-SNAP encapsulation - 8 octets 1897 // Insert LLC-SNAP encapsulation - 8 octets
1903 // 1898 //
1904 EXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(pTxBlk->pSrcBufData-2, pTxBlk->pExtraLlcSnapEncap); 1899 EXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(pTxBlk->pSrcBufData - 2,
1900 pTxBlk->pExtraLlcSnapEncap);
1905 1901
1906 subFramePayloadLen = pTxBlk->SrcBufLen; 1902 subFramePayloadLen = pTxBlk->SrcBufLen;
1907 1903
1908 if (pTxBlk->pExtraLlcSnapEncap) 1904 if (pTxBlk->pExtraLlcSnapEncap) {
1909 { 1905 NdisMoveMemory(pHeaderBufPtr,
1910 NdisMoveMemory(pHeaderBufPtr, pTxBlk->pExtraLlcSnapEncap, 6); 1906 pTxBlk->pExtraLlcSnapEncap, 6);
1911 pHeaderBufPtr += 6; 1907 pHeaderBufPtr += 6;
1912 // get 2 octets (TypeofLen) 1908 // get 2 octets (TypeofLen)
1913 NdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufData-2, 2); 1909 NdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufData - 2,
1910 2);
1914 pHeaderBufPtr += 2; 1911 pHeaderBufPtr += 2;
1915 pTxBlk->MpduHeaderLen += LENGTH_802_1_H; 1912 pTxBlk->MpduHeaderLen += LENGTH_802_1_H;
1916 subFramePayloadLen += LENGTH_802_1_H; 1913 subFramePayloadLen += LENGTH_802_1_H;
1917 } 1914 }
1918
1919 // update subFrame Length field 1915 // update subFrame Length field
1920 subFrameHeader[12] = (subFramePayloadLen & 0xFF00) >> 8; 1916 subFrameHeader[12] = (subFramePayloadLen & 0xFF00) >> 8;
1921 subFrameHeader[13] = subFramePayloadLen & 0xFF; 1917 subFrameHeader[13] = subFramePayloadLen & 0xFF;
1922 1918
1923 totalMPDUSize += pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen; 1919 totalMPDUSize += pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen;
1924 1920
1925 if (frameNum ==0) 1921 if (frameNum == 0)
1926 FirstTx = HAL_WriteMultiTxResource(pAd, pTxBlk, frameNum, &FreeNumber); 1922 FirstTx =
1923 HAL_WriteMultiTxResource(pAd, pTxBlk, frameNum,
1924 &FreeNumber);
1927 else 1925 else
1928 LastTxIdx = HAL_WriteMultiTxResource(pAd, pTxBlk, frameNum, &FreeNumber); 1926 LastTxIdx =
1927 HAL_WriteMultiTxResource(pAd, pTxBlk, frameNum,
1928 &FreeNumber);
1929 1929
1930 frameNum++; 1930 frameNum++;
1931 1931
@@ -1934,8 +1934,9 @@ VOID STA_AMSDU_Frame_Tx(
1934 1934
1935 // calculate Transmitted AMSDU Count and ByteCount 1935 // calculate Transmitted AMSDU Count and ByteCount
1936 { 1936 {
1937 pAd->RalinkCounters.TransmittedAMSDUCount.u.LowPart ++; 1937 pAd->RalinkCounters.TransmittedAMSDUCount.u.LowPart++;
1938 pAd->RalinkCounters.TransmittedOctetsInAMSDU.QuadPart += totalMPDUSize; 1938 pAd->RalinkCounters.TransmittedOctetsInAMSDU.QuadPart +=
1939 totalMPDUSize;
1939 } 1940 }
1940 1941
1941 } 1942 }
@@ -1950,29 +1951,24 @@ VOID STA_AMSDU_Frame_Tx(
1950 HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx); 1951 HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);
1951} 1952}
1952 1953
1953VOID STA_Legacy_Frame_Tx( 1954VOID STA_Legacy_Frame_Tx(IN PRTMP_ADAPTER pAd, IN TX_BLK * pTxBlk)
1954 IN PRTMP_ADAPTER pAd,
1955 IN TX_BLK *pTxBlk)
1956{ 1955{
1957 HEADER_802_11 *pHeader_802_11; 1956 HEADER_802_11 *pHeader_802_11;
1958 PUCHAR pHeaderBufPtr; 1957 PUCHAR pHeaderBufPtr;
1959 USHORT FreeNumber; 1958 USHORT FreeNumber;
1960 BOOLEAN bVLANPkt; 1959 BOOLEAN bVLANPkt;
1961 PQUEUE_ENTRY pQEntry; 1960 PQUEUE_ENTRY pQEntry;
1962 1961
1963 ASSERT(pTxBlk); 1962 ASSERT(pTxBlk);
1964 1963
1965
1966 pQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList); 1964 pQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList);
1967 pTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry); 1965 pTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);
1968 if (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE) 1966 if (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE) {
1969 {
1970 RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE); 1967 RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE);
1971 return; 1968 return;
1972 } 1969 }
1973 1970
1974 if (pTxBlk->TxFrameType == TX_MCAST_FRAME) 1971 if (pTxBlk->TxFrameType == TX_MCAST_FRAME) {
1975 {
1976 INC_COUNTER64(pAd->WlanCounters.MulticastTransmittedFrameCount); 1972 INC_COUNTER64(pAd->WlanCounters.MulticastTransmittedFrameCount);
1977 } 1973 }
1978 1974
@@ -1989,16 +1985,14 @@ VOID STA_Legacy_Frame_Tx(
1989 STAFindCipherAlgorithm(pAd, pTxBlk); 1985 STAFindCipherAlgorithm(pAd, pTxBlk);
1990 STABuildCommon802_11Header(pAd, pTxBlk); 1986 STABuildCommon802_11Header(pAd, pTxBlk);
1991 1987
1992
1993 // skip 802.3 header 1988 // skip 802.3 header
1994 pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3; 1989 pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3;
1995 pTxBlk->SrcBufLen -= LENGTH_802_3; 1990 pTxBlk->SrcBufLen -= LENGTH_802_3;
1996 1991
1997 // skip vlan tag 1992 // skip vlan tag
1998 if (bVLANPkt) 1993 if (bVLANPkt) {
1999 { 1994 pTxBlk->pSrcBufData += LENGTH_802_1Q;
2000 pTxBlk->pSrcBufData += LENGTH_802_1Q; 1995 pTxBlk->SrcBufLen -= LENGTH_802_1Q;
2001 pTxBlk->SrcBufLen -= LENGTH_802_1Q;
2002 } 1996 }
2003 1997
2004 pHeaderBufPtr = &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWI_SIZE]; 1998 pHeaderBufPtr = &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWI_SIZE];
@@ -2007,21 +2001,22 @@ VOID STA_Legacy_Frame_Tx(
2007 // skip common header 2001 // skip common header
2008 pHeaderBufPtr += pTxBlk->MpduHeaderLen; 2002 pHeaderBufPtr += pTxBlk->MpduHeaderLen;
2009 2003
2010 if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM)) 2004 if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM)) {
2011 {
2012 // 2005 //
2013 // build QOS Control bytes 2006 // build QOS Control bytes
2014 // 2007 //
2015 *(pHeaderBufPtr) = ((pTxBlk->UserPriority & 0x0F) | (pAd->CommonCfg.AckPolicy[pTxBlk->QueIdx]<<5)); 2008 *(pHeaderBufPtr) =
2016 *(pHeaderBufPtr+1) = 0; 2009 ((pTxBlk->UserPriority & 0x0F) | (pAd->CommonCfg.
2017 pHeaderBufPtr +=2; 2010 AckPolicy[pTxBlk->
2011 QueIdx] << 5));
2012 *(pHeaderBufPtr + 1) = 0;
2013 pHeaderBufPtr += 2;
2018 pTxBlk->MpduHeaderLen += 2; 2014 pTxBlk->MpduHeaderLen += 2;
2019 } 2015 }
2020
2021 // The remaining content of MPDU header should locate at 4-octets aligment 2016 // The remaining content of MPDU header should locate at 4-octets aligment
2022 pTxBlk->HdrPadLen = (ULONG)pHeaderBufPtr; 2017 pTxBlk->HdrPadLen = (ULONG) pHeaderBufPtr;
2023 pHeaderBufPtr = (PUCHAR) ROUND_UP(pHeaderBufPtr, 4); 2018 pHeaderBufPtr = (PUCHAR) ROUND_UP(pHeaderBufPtr, 4);
2024 pTxBlk->HdrPadLen = (ULONG)(pHeaderBufPtr - pTxBlk->HdrPadLen); 2019 pTxBlk->HdrPadLen = (ULONG) (pHeaderBufPtr - pTxBlk->HdrPadLen);
2025 2020
2026 { 2021 {
2027 2022
@@ -2029,20 +2024,23 @@ VOID STA_Legacy_Frame_Tx(
2029 // Insert LLC-SNAP encapsulation - 8 octets 2024 // Insert LLC-SNAP encapsulation - 8 octets
2030 // 2025 //
2031 // 2026 //
2032 // if original Ethernet frame contains no LLC/SNAP, 2027 // if original Ethernet frame contains no LLC/SNAP,
2033 // then an extra LLC/SNAP encap is required 2028 // then an extra LLC/SNAP encap is required
2034 // 2029 //
2035 EXTRA_LLCSNAP_ENCAP_FROM_PKT_START(pTxBlk->pSrcBufHeader, pTxBlk->pExtraLlcSnapEncap); 2030 EXTRA_LLCSNAP_ENCAP_FROM_PKT_START(pTxBlk->pSrcBufHeader,
2036 if (pTxBlk->pExtraLlcSnapEncap) 2031 pTxBlk->pExtraLlcSnapEncap);
2037 { 2032 if (pTxBlk->pExtraLlcSnapEncap) {
2038 UCHAR vlan_size; 2033 UCHAR vlan_size;
2039 2034
2040 NdisMoveMemory(pHeaderBufPtr, pTxBlk->pExtraLlcSnapEncap, 6); 2035 NdisMoveMemory(pHeaderBufPtr,
2036 pTxBlk->pExtraLlcSnapEncap, 6);
2041 pHeaderBufPtr += 6; 2037 pHeaderBufPtr += 6;
2042 // skip vlan tag 2038 // skip vlan tag
2043 vlan_size = (bVLANPkt) ? LENGTH_802_1Q : 0; 2039 vlan_size = (bVLANPkt) ? LENGTH_802_1Q : 0;
2044 // get 2 octets (TypeofLen) 2040 // get 2 octets (TypeofLen)
2045 NdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufHeader+12+vlan_size, 2); 2041 NdisMoveMemory(pHeaderBufPtr,
2042 pTxBlk->pSrcBufHeader + 12 + vlan_size,
2043 2);
2046 pHeaderBufPtr += 2; 2044 pHeaderBufPtr += 2;
2047 pTxBlk->MpduHeaderLen += LENGTH_802_1_H; 2045 pTxBlk->MpduHeaderLen += LENGTH_802_1_H;
2048 } 2046 }
@@ -2054,7 +2052,8 @@ VOID STA_Legacy_Frame_Tx(
2054 // use Wcid as Key Index 2052 // use Wcid as Key Index
2055 // 2053 //
2056 2054
2057 RTMPWriteTxWI_Data(pAd, (PTXWI_STRUC)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk); 2055 RTMPWriteTxWI_Data(pAd, (PTXWI_STRUC) (&pTxBlk->HeaderBuf[TXINFO_SIZE]),
2056 pTxBlk);
2058 2057
2059 //FreeNumber = GET_TXRING_FREENO(pAd, QueIdx); 2058 //FreeNumber = GET_TXRING_FREENO(pAd, QueIdx);
2060 2059
@@ -2070,87 +2069,88 @@ VOID STA_Legacy_Frame_Tx(
2070 HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx); 2069 HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);
2071} 2070}
2072 2071
2073 2072VOID STA_ARalink_Frame_Tx(IN PRTMP_ADAPTER pAd, IN TX_BLK * pTxBlk)
2074VOID STA_ARalink_Frame_Tx(
2075 IN PRTMP_ADAPTER pAd,
2076 IN TX_BLK *pTxBlk)
2077{ 2073{
2078 PUCHAR pHeaderBufPtr; 2074 PUCHAR pHeaderBufPtr;
2079 USHORT FreeNumber; 2075 USHORT FreeNumber;
2080 USHORT totalMPDUSize=0; 2076 USHORT totalMPDUSize = 0;
2081 USHORT FirstTx, LastTxIdx; 2077 USHORT FirstTx, LastTxIdx;
2082 int frameNum = 0; 2078 int frameNum = 0;
2083 BOOLEAN bVLANPkt; 2079 BOOLEAN bVLANPkt;
2084 PQUEUE_ENTRY pQEntry; 2080 PQUEUE_ENTRY pQEntry;
2085
2086 2081
2087 ASSERT(pTxBlk); 2082 ASSERT(pTxBlk);
2088 2083
2089 ASSERT((pTxBlk->TxPacketList.Number== 2)); 2084 ASSERT((pTxBlk->TxPacketList.Number == 2));
2090 2085
2091 2086 FirstTx = LastTxIdx = 0; // Is it ok init they as 0?
2092 FirstTx = LastTxIdx = 0; // Is it ok init they as 0? 2087 while (pTxBlk->TxPacketList.Head) {
2093 while(pTxBlk->TxPacketList.Head)
2094 {
2095 pQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList); 2088 pQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList);
2096 pTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry); 2089 pTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);
2097 2090
2098 if (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE) 2091 if (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE) {
2099 { 2092 RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket,
2100 RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE); 2093 NDIS_STATUS_FAILURE);
2101 continue; 2094 continue;
2102 } 2095 }
2103 2096
2104 bVLANPkt = (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) ? TRUE : FALSE); 2097 bVLANPkt =
2098 (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) ? TRUE : FALSE);
2105 2099
2106 // skip 802.3 header 2100 // skip 802.3 header
2107 pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3; 2101 pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3;
2108 pTxBlk->SrcBufLen -= LENGTH_802_3; 2102 pTxBlk->SrcBufLen -= LENGTH_802_3;
2109 2103
2110 // skip vlan tag 2104 // skip vlan tag
2111 if (bVLANPkt) 2105 if (bVLANPkt) {
2112 { 2106 pTxBlk->pSrcBufData += LENGTH_802_1Q;
2113 pTxBlk->pSrcBufData += LENGTH_802_1Q; 2107 pTxBlk->SrcBufLen -= LENGTH_802_1Q;
2114 pTxBlk->SrcBufLen -= LENGTH_802_1Q;
2115 } 2108 }
2116 2109
2117 if (frameNum == 0) 2110 if (frameNum == 0) { // For first frame, we need to create the 802.11 header + padding(optional) + RA-AGG-LEN + SNAP Header
2118 { // For first frame, we need to create the 802.11 header + padding(optional) + RA-AGG-LEN + SNAP Header
2119 2111
2120 pHeaderBufPtr = STA_Build_ARalink_Frame_Header(pAd, pTxBlk); 2112 pHeaderBufPtr =
2113 STA_Build_ARalink_Frame_Header(pAd, pTxBlk);
2121 2114
2122 // It's ok write the TxWI here, because the TxWI->MPDUtotalByteCount 2115 // It's ok write the TxWI here, because the TxWI->MPDUtotalByteCount
2123 // will be updated after final frame was handled. 2116 // will be updated after final frame was handled.
2124 RTMPWriteTxWI_Data(pAd, (PTXWI_STRUC)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk); 2117 RTMPWriteTxWI_Data(pAd,
2125 2118 (PTXWI_STRUC) (&pTxBlk->
2119 HeaderBuf
2120 [TXINFO_SIZE]),
2121 pTxBlk);
2126 2122
2127 // 2123 //
2128 // Insert LLC-SNAP encapsulation - 8 octets 2124 // Insert LLC-SNAP encapsulation - 8 octets
2129 // 2125 //
2130 EXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(pTxBlk->pSrcBufData-2, pTxBlk->pExtraLlcSnapEncap); 2126 EXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(pTxBlk->
2131 2127 pSrcBufData - 2,
2132 if (pTxBlk->pExtraLlcSnapEncap) 2128 pTxBlk->
2133 { 2129 pExtraLlcSnapEncap);
2134 NdisMoveMemory(pHeaderBufPtr, pTxBlk->pExtraLlcSnapEncap, 6); 2130
2131 if (pTxBlk->pExtraLlcSnapEncap) {
2132 NdisMoveMemory(pHeaderBufPtr,
2133 pTxBlk->pExtraLlcSnapEncap, 6);
2135 pHeaderBufPtr += 6; 2134 pHeaderBufPtr += 6;
2136 // get 2 octets (TypeofLen) 2135 // get 2 octets (TypeofLen)
2137 NdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufData-2, 2); 2136 NdisMoveMemory(pHeaderBufPtr,
2137 pTxBlk->pSrcBufData - 2, 2);
2138 pHeaderBufPtr += 2; 2138 pHeaderBufPtr += 2;
2139 pTxBlk->MpduHeaderLen += LENGTH_802_1_H; 2139 pTxBlk->MpduHeaderLen += LENGTH_802_1_H;
2140 } 2140 }
2141 } 2141 } else { // For second aggregated frame, we need create the 802.3 header to headerBuf, because PCI will copy it to SDPtr0.
2142 else
2143 { // For second aggregated frame, we need create the 802.3 header to headerBuf, because PCI will copy it to SDPtr0.
2144 2142
2145 pHeaderBufPtr = &pTxBlk->HeaderBuf[0]; 2143 pHeaderBufPtr = &pTxBlk->HeaderBuf[0];
2146 pTxBlk->MpduHeaderLen = 0; 2144 pTxBlk->MpduHeaderLen = 0;
2147 2145
2148 // A-Ralink sub-sequent frame header is the same as 802.3 header. 2146 // A-Ralink sub-sequent frame header is the same as 802.3 header.
2149 // DA(6)+SA(6)+FrameType(2) 2147 // DA(6)+SA(6)+FrameType(2)
2150 NdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufHeader, 12); 2148 NdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufHeader,
2149 12);
2151 pHeaderBufPtr += 12; 2150 pHeaderBufPtr += 12;
2152 // get 2 octets (TypeofLen) 2151 // get 2 octets (TypeofLen)
2153 NdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufData-2, 2); 2152 NdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufData - 2,
2153 2);
2154 pHeaderBufPtr += 2; 2154 pHeaderBufPtr += 2;
2155 pTxBlk->MpduHeaderLen = LENGTH_ARALINK_SUBFRAMEHEAD; 2155 pTxBlk->MpduHeaderLen = LENGTH_ARALINK_SUBFRAMEHEAD;
2156 } 2156 }
@@ -2158,10 +2158,14 @@ VOID STA_ARalink_Frame_Tx(
2158 totalMPDUSize += pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen; 2158 totalMPDUSize += pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen;
2159 2159
2160 //FreeNumber = GET_TXRING_FREENO(pAd, QueIdx); 2160 //FreeNumber = GET_TXRING_FREENO(pAd, QueIdx);
2161 if (frameNum ==0) 2161 if (frameNum == 0)
2162 FirstTx = HAL_WriteMultiTxResource(pAd, pTxBlk, frameNum, &FreeNumber); 2162 FirstTx =
2163 HAL_WriteMultiTxResource(pAd, pTxBlk, frameNum,
2164 &FreeNumber);
2163 else 2165 else
2164 LastTxIdx = HAL_WriteMultiTxResource(pAd, pTxBlk, frameNum, &FreeNumber); 2166 LastTxIdx =
2167 HAL_WriteMultiTxResource(pAd, pTxBlk, frameNum,
2168 &FreeNumber);
2165 2169
2166 frameNum++; 2170 frameNum++;
2167 2171
@@ -2182,31 +2186,26 @@ VOID STA_ARalink_Frame_Tx(
2182 2186
2183} 2187}
2184 2188
2185 2189VOID STA_Fragment_Frame_Tx(IN RTMP_ADAPTER * pAd, IN TX_BLK * pTxBlk)
2186VOID STA_Fragment_Frame_Tx(
2187 IN RTMP_ADAPTER *pAd,
2188 IN TX_BLK *pTxBlk)
2189{ 2190{
2190 HEADER_802_11 *pHeader_802_11; 2191 HEADER_802_11 *pHeader_802_11;
2191 PUCHAR pHeaderBufPtr; 2192 PUCHAR pHeaderBufPtr;
2192 USHORT FreeNumber; 2193 USHORT FreeNumber;
2193 UCHAR fragNum = 0; 2194 UCHAR fragNum = 0;
2194 PACKET_INFO PacketInfo; 2195 PACKET_INFO PacketInfo;
2195 USHORT EncryptionOverhead = 0; 2196 USHORT EncryptionOverhead = 0;
2196 UINT32 FreeMpduSize, SrcRemainingBytes; 2197 UINT32 FreeMpduSize, SrcRemainingBytes;
2197 USHORT AckDuration; 2198 USHORT AckDuration;
2198 UINT NextMpduSize; 2199 UINT NextMpduSize;
2199 BOOLEAN bVLANPkt; 2200 BOOLEAN bVLANPkt;
2200 PQUEUE_ENTRY pQEntry; 2201 PQUEUE_ENTRY pQEntry;
2201 HTTRANSMIT_SETTING *pTransmit; 2202 HTTRANSMIT_SETTING *pTransmit;
2202
2203 2203
2204 ASSERT(pTxBlk); 2204 ASSERT(pTxBlk);
2205 2205
2206 pQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList); 2206 pQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList);
2207 pTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry); 2207 pTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);
2208 if (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE) 2208 if (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE) {
2209 {
2210 RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE); 2209 RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE);
2211 return; 2210 return;
2212 } 2211 }
@@ -2217,104 +2216,100 @@ VOID STA_Fragment_Frame_Tx(
2217 STAFindCipherAlgorithm(pAd, pTxBlk); 2216 STAFindCipherAlgorithm(pAd, pTxBlk);
2218 STABuildCommon802_11Header(pAd, pTxBlk); 2217 STABuildCommon802_11Header(pAd, pTxBlk);
2219 2218
2220 if (pTxBlk->CipherAlg == CIPHER_TKIP) 2219 if (pTxBlk->CipherAlg == CIPHER_TKIP) {
2221 { 2220 pTxBlk->pPacket =
2222 pTxBlk->pPacket = duplicate_pkt_with_TKIP_MIC(pAd, pTxBlk->pPacket); 2221 duplicate_pkt_with_TKIP_MIC(pAd, pTxBlk->pPacket);
2223 if (pTxBlk->pPacket == NULL) 2222 if (pTxBlk->pPacket == NULL)
2224 return; 2223 return;
2225 RTMP_QueryPacketInfo(pTxBlk->pPacket, &PacketInfo, &pTxBlk->pSrcBufHeader, &pTxBlk->SrcBufLen); 2224 RTMP_QueryPacketInfo(pTxBlk->pPacket, &PacketInfo,
2225 &pTxBlk->pSrcBufHeader,
2226 &pTxBlk->SrcBufLen);
2226 } 2227 }
2227
2228 // skip 802.3 header 2228 // skip 802.3 header
2229 pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3; 2229 pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3;
2230 pTxBlk->SrcBufLen -= LENGTH_802_3; 2230 pTxBlk->SrcBufLen -= LENGTH_802_3;
2231
2232 2231
2233 // skip vlan tag 2232 // skip vlan tag
2234 if (bVLANPkt) 2233 if (bVLANPkt) {
2235 { 2234 pTxBlk->pSrcBufData += LENGTH_802_1Q;
2236 pTxBlk->pSrcBufData += LENGTH_802_1Q; 2235 pTxBlk->SrcBufLen -= LENGTH_802_1Q;
2237 pTxBlk->SrcBufLen -= LENGTH_802_1Q;
2238 } 2236 }
2239 2237
2240 pHeaderBufPtr = &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWI_SIZE]; 2238 pHeaderBufPtr = &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWI_SIZE];
2241 pHeader_802_11 = (HEADER_802_11 *)pHeaderBufPtr; 2239 pHeader_802_11 = (HEADER_802_11 *) pHeaderBufPtr;
2242
2243 2240
2244 // skip common header 2241 // skip common header
2245 pHeaderBufPtr += pTxBlk->MpduHeaderLen; 2242 pHeaderBufPtr += pTxBlk->MpduHeaderLen;
2246 2243
2247 if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM)) 2244 if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM)) {
2248 {
2249 // 2245 //
2250 // build QOS Control bytes 2246 // build QOS Control bytes
2251 // 2247 //
2252 *pHeaderBufPtr = (pTxBlk->UserPriority & 0x0F); 2248 *pHeaderBufPtr = (pTxBlk->UserPriority & 0x0F);
2253 2249
2254 *(pHeaderBufPtr+1) = 0; 2250 *(pHeaderBufPtr + 1) = 0;
2255 pHeaderBufPtr +=2; 2251 pHeaderBufPtr += 2;
2256 pTxBlk->MpduHeaderLen += 2; 2252 pTxBlk->MpduHeaderLen += 2;
2257 } 2253 }
2258
2259 // 2254 //
2260 // padding at front of LLC header 2255 // padding at front of LLC header
2261 // LLC header should locate at 4-octets aligment 2256 // LLC header should locate at 4-octets aligment
2262 // 2257 //
2263 pTxBlk->HdrPadLen = (ULONG)pHeaderBufPtr; 2258 pTxBlk->HdrPadLen = (ULONG) pHeaderBufPtr;
2264 pHeaderBufPtr = (PUCHAR) ROUND_UP(pHeaderBufPtr, 4); 2259 pHeaderBufPtr = (PUCHAR) ROUND_UP(pHeaderBufPtr, 4);
2265 pTxBlk->HdrPadLen = (ULONG)(pHeaderBufPtr - pTxBlk->HdrPadLen); 2260 pTxBlk->HdrPadLen = (ULONG) (pHeaderBufPtr - pTxBlk->HdrPadLen);
2266
2267
2268 2261
2269 // 2262 //
2270 // Insert LLC-SNAP encapsulation - 8 octets 2263 // Insert LLC-SNAP encapsulation - 8 octets
2271 // 2264 //
2272 // 2265 //
2273 // if original Ethernet frame contains no LLC/SNAP, 2266 // if original Ethernet frame contains no LLC/SNAP,
2274 // then an extra LLC/SNAP encap is required 2267 // then an extra LLC/SNAP encap is required
2275 // 2268 //
2276 EXTRA_LLCSNAP_ENCAP_FROM_PKT_START(pTxBlk->pSrcBufHeader, pTxBlk->pExtraLlcSnapEncap); 2269 EXTRA_LLCSNAP_ENCAP_FROM_PKT_START(pTxBlk->pSrcBufHeader,
2277 if (pTxBlk->pExtraLlcSnapEncap) 2270 pTxBlk->pExtraLlcSnapEncap);
2278 { 2271 if (pTxBlk->pExtraLlcSnapEncap) {
2279 UCHAR vlan_size; 2272 UCHAR vlan_size;
2280 2273
2281 NdisMoveMemory(pHeaderBufPtr, pTxBlk->pExtraLlcSnapEncap, 6); 2274 NdisMoveMemory(pHeaderBufPtr, pTxBlk->pExtraLlcSnapEncap, 6);
2282 pHeaderBufPtr += 6; 2275 pHeaderBufPtr += 6;
2283 // skip vlan tag 2276 // skip vlan tag
2284 vlan_size = (bVLANPkt) ? LENGTH_802_1Q : 0; 2277 vlan_size = (bVLANPkt) ? LENGTH_802_1Q : 0;
2285 // get 2 octets (TypeofLen) 2278 // get 2 octets (TypeofLen)
2286 NdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufHeader+12+vlan_size, 2); 2279 NdisMoveMemory(pHeaderBufPtr,
2280 pTxBlk->pSrcBufHeader + 12 + vlan_size, 2);
2287 pHeaderBufPtr += 2; 2281 pHeaderBufPtr += 2;
2288 pTxBlk->MpduHeaderLen += LENGTH_802_1_H; 2282 pTxBlk->MpduHeaderLen += LENGTH_802_1_H;
2289 } 2283 }
2290 2284
2291
2292 // If TKIP is used and fragmentation is required. Driver has to 2285 // If TKIP is used and fragmentation is required. Driver has to
2293 // append TKIP MIC at tail of the scatter buffer 2286 // append TKIP MIC at tail of the scatter buffer
2294 // MAC ASIC will only perform IV/EIV/ICV insertion but no TKIP MIC 2287 // MAC ASIC will only perform IV/EIV/ICV insertion but no TKIP MIC
2295 if (pTxBlk->CipherAlg == CIPHER_TKIP) 2288 if (pTxBlk->CipherAlg == CIPHER_TKIP) {
2296 { 2289 RTMPCalculateMICValue(pAd, pTxBlk->pPacket,
2297 RTMPCalculateMICValue(pAd, pTxBlk->pPacket, pTxBlk->pExtraLlcSnapEncap, pTxBlk->pKey, 0); 2290 pTxBlk->pExtraLlcSnapEncap, pTxBlk->pKey,
2291 0);
2298 2292
2299 // NOTE: DON'T refer the skb->len directly after following copy. Becasue the length is not adjust 2293 // NOTE: DON'T refer the skb->len directly after following copy. Becasue the length is not adjust
2300 // to correct lenght, refer to pTxBlk->SrcBufLen for the packet length in following progress. 2294 // to correct lenght, refer to pTxBlk->SrcBufLen for the packet length in following progress.
2301 NdisMoveMemory(pTxBlk->pSrcBufData + pTxBlk->SrcBufLen, &pAd->PrivateInfo.Tx.MIC[0], 8); 2295 NdisMoveMemory(pTxBlk->pSrcBufData + pTxBlk->SrcBufLen,
2296 &pAd->PrivateInfo.Tx.MIC[0], 8);
2302 //skb_put((RTPKT_TO_OSPKT(pTxBlk->pPacket))->tail, 8); 2297 //skb_put((RTPKT_TO_OSPKT(pTxBlk->pPacket))->tail, 8);
2303 pTxBlk->SrcBufLen += 8; 2298 pTxBlk->SrcBufLen += 8;
2304 pTxBlk->TotalFrameLen += 8; 2299 pTxBlk->TotalFrameLen += 8;
2305 pTxBlk->CipherAlg = CIPHER_TKIP_NO_MIC; 2300 pTxBlk->CipherAlg = CIPHER_TKIP_NO_MIC;
2306 } 2301 }
2307
2308 // 2302 //
2309 // calcuate the overhead bytes that encryption algorithm may add. This 2303 // calcuate the overhead bytes that encryption algorithm may add. This
2310 // affects the calculate of "duration" field 2304 // affects the calculate of "duration" field
2311 // 2305 //
2312 if ((pTxBlk->CipherAlg == CIPHER_WEP64) || (pTxBlk->CipherAlg == CIPHER_WEP128)) 2306 if ((pTxBlk->CipherAlg == CIPHER_WEP64)
2313 EncryptionOverhead = 8; //WEP: IV[4] + ICV[4]; 2307 || (pTxBlk->CipherAlg == CIPHER_WEP128))
2308 EncryptionOverhead = 8; //WEP: IV[4] + ICV[4];
2314 else if (pTxBlk->CipherAlg == CIPHER_TKIP_NO_MIC) 2309 else if (pTxBlk->CipherAlg == CIPHER_TKIP_NO_MIC)
2315 EncryptionOverhead = 12;//TKIP: IV[4] + EIV[4] + ICV[4], MIC will be added to TotalPacketLength 2310 EncryptionOverhead = 12; //TKIP: IV[4] + EIV[4] + ICV[4], MIC will be added to TotalPacketLength
2316 else if (pTxBlk->CipherAlg == CIPHER_TKIP) 2311 else if (pTxBlk->CipherAlg == CIPHER_TKIP)
2317 EncryptionOverhead = 20;//TKIP: IV[4] + EIV[4] + ICV[4] + MIC[8] 2312 EncryptionOverhead = 20; //TKIP: IV[4] + EIV[4] + ICV[4] + MIC[8]
2318 else if (pTxBlk->CipherAlg == CIPHER_AES) 2313 else if (pTxBlk->CipherAlg == CIPHER_AES)
2319 EncryptionOverhead = 16; // AES: IV[4] + EIV[4] + MIC[8] 2314 EncryptionOverhead = 16; // AES: IV[4] + EIV[4] + MIC[8]
2320 else 2315 else
@@ -2331,7 +2326,11 @@ VOID STA_Fragment_Frame_Tx(
2331 2326
2332 // decide how much time an ACK/CTS frame will consume in the air 2327 // decide how much time an ACK/CTS frame will consume in the air
2333 if (pTxBlk->TxRate <= RATE_LAST_OFDM_RATE) 2328 if (pTxBlk->TxRate <= RATE_LAST_OFDM_RATE)
2334 AckDuration = RTMPCalcDuration(pAd, pAd->CommonCfg.ExpectedACKRate[pTxBlk->TxRate], 14); 2329 AckDuration =
2330 RTMPCalcDuration(pAd,
2331 pAd->CommonCfg.ExpectedACKRate[pTxBlk->
2332 TxRate],
2333 14);
2335 else 2334 else
2336 AckDuration = RTMPCalcDuration(pAd, RATE_6_5, 14); 2335 AckDuration = RTMPCalcDuration(pAd, RATE_6_5, 14);
2337 2336
@@ -2346,25 +2345,28 @@ VOID STA_Fragment_Frame_Tx(
2346 2345
2347 FreeMpduSize -= pTxBlk->MpduHeaderLen; 2346 FreeMpduSize -= pTxBlk->MpduHeaderLen;
2348 2347
2349 if (SrcRemainingBytes <= FreeMpduSize) 2348 if (SrcRemainingBytes <= FreeMpduSize) { // this is the last or only fragment
2350 { // this is the last or only fragment
2351 2349
2352 pTxBlk->SrcBufLen = SrcRemainingBytes; 2350 pTxBlk->SrcBufLen = SrcRemainingBytes;
2353 2351
2354 pHeader_802_11->FC.MoreFrag = 0; 2352 pHeader_802_11->FC.MoreFrag = 0;
2355 pHeader_802_11->Duration = pAd->CommonCfg.Dsifs + AckDuration; 2353 pHeader_802_11->Duration =
2354 pAd->CommonCfg.Dsifs + AckDuration;
2356 2355
2357 // Indicate the lower layer that this's the last fragment. 2356 // Indicate the lower layer that this's the last fragment.
2358 pTxBlk->TotalFragNum = fragNum; 2357 pTxBlk->TotalFragNum = fragNum;
2359 } 2358 } else { // more fragment is required
2360 else
2361 { // more fragment is required
2362 2359
2363 pTxBlk->SrcBufLen = FreeMpduSize; 2360 pTxBlk->SrcBufLen = FreeMpduSize;
2364 2361
2365 NextMpduSize = min(((UINT)SrcRemainingBytes - pTxBlk->SrcBufLen), ((UINT)pAd->CommonCfg.FragmentThreshold)); 2362 NextMpduSize =
2363 min(((UINT) SrcRemainingBytes - pTxBlk->SrcBufLen),
2364 ((UINT) pAd->CommonCfg.FragmentThreshold));
2366 pHeader_802_11->FC.MoreFrag = 1; 2365 pHeader_802_11->FC.MoreFrag = 1;
2367 pHeader_802_11->Duration = (3 * pAd->CommonCfg.Dsifs) + (2 * AckDuration) + RTMPCalcDuration(pAd, pTxBlk->TxRate, NextMpduSize + EncryptionOverhead); 2366 pHeader_802_11->Duration =
2367 (3 * pAd->CommonCfg.Dsifs) + (2 * AckDuration) +
2368 RTMPCalcDuration(pAd, pTxBlk->TxRate,
2369 NextMpduSize + EncryptionOverhead);
2368 } 2370 }
2369 2371
2370 if (fragNum == 0) 2372 if (fragNum == 0)
@@ -2372,7 +2374,10 @@ VOID STA_Fragment_Frame_Tx(
2372 else 2374 else
2373 pTxBlk->FrameGap = IFS_SIFS; 2375 pTxBlk->FrameGap = IFS_SIFS;
2374 2376
2375 RTMPWriteTxWI_Data(pAd, (PTXWI_STRUC)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk); 2377 RTMPWriteTxWI_Data(pAd,
2378 (PTXWI_STRUC) (&pTxBlk->
2379 HeaderBuf[TXINFO_SIZE]),
2380 pTxBlk);
2376 2381
2377 HAL_WriteFragTxResource(pAd, pTxBlk, fragNum, &FreeNumber); 2382 HAL_WriteFragTxResource(pAd, pTxBlk, fragNum, &FreeNumber);
2378 2383
@@ -2389,18 +2394,17 @@ VOID STA_Fragment_Frame_Tx(
2389 SrcRemainingBytes -= pTxBlk->SrcBufLen; 2394 SrcRemainingBytes -= pTxBlk->SrcBufLen;
2390 pTxBlk->pSrcBufData += pTxBlk->SrcBufLen; 2395 pTxBlk->pSrcBufData += pTxBlk->SrcBufLen;
2391 2396
2392 pHeader_802_11->Frag++; // increase Frag # 2397 pHeader_802_11->Frag++; // increase Frag #
2393 2398
2394 }while(SrcRemainingBytes > 0); 2399 } while (SrcRemainingBytes > 0);
2395 2400
2396 // 2401 //
2397 // Kick out Tx 2402 // Kick out Tx
2398 // 2403 //
2399 if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX)) 2404 if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX))
2400 HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx); 2405 HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);
2401} 2406}
2402 2407
2403
2404#define RELEASE_FRAMES_OF_TXBLK(_pAd, _pTxBlk, _pQEntry, _Status) \ 2408#define RELEASE_FRAMES_OF_TXBLK(_pAd, _pTxBlk, _pQEntry, _Status) \
2405 while(_pTxBlk->TxPacketList.Head) \ 2409 while(_pTxBlk->TxPacketList.Head) \
2406 { \ 2410 { \
@@ -2408,7 +2412,6 @@ VOID STA_Fragment_Frame_Tx(
2408 RELEASE_NDIS_PACKET(_pAd, QUEUE_ENTRY_TO_PACKET(_pQEntry), _Status); \ 2412 RELEASE_NDIS_PACKET(_pAd, QUEUE_ENTRY_TO_PACKET(_pQEntry), _Status); \
2409 } 2413 }
2410 2414
2411
2412/* 2415/*
2413 ======================================================================== 2416 ========================================================================
2414 2417
@@ -2431,22 +2434,21 @@ VOID STA_Fragment_Frame_Tx(
2431 2434
2432 ======================================================================== 2435 ========================================================================
2433*/ 2436*/
2434NDIS_STATUS STAHardTransmit( 2437NDIS_STATUS STAHardTransmit(IN PRTMP_ADAPTER pAd,
2435 IN PRTMP_ADAPTER pAd, 2438 IN TX_BLK * pTxBlk, IN UCHAR QueIdx)
2436 IN TX_BLK *pTxBlk,
2437 IN UCHAR QueIdx)
2438{ 2439{
2439 NDIS_PACKET *pPacket; 2440 NDIS_PACKET *pPacket;
2440 PQUEUE_ENTRY pQEntry; 2441 PQUEUE_ENTRY pQEntry;
2441 2442
2442 // --------------------------------------------- 2443 // ---------------------------------------------
2443 // STEP 0. DO SANITY CHECK AND SOME EARLY PREPARATION. 2444 // STEP 0. DO SANITY CHECK AND SOME EARLY PREPARATION.
2444 // --------------------------------------------- 2445 // ---------------------------------------------
2445 // 2446 //
2446 ASSERT(pTxBlk->TxPacketList.Number); 2447 ASSERT(pTxBlk->TxPacketList.Number);
2447 if (pTxBlk->TxPacketList.Head == NULL) 2448 if (pTxBlk->TxPacketList.Head == NULL) {
2448 { 2449 DBGPRINT(RT_DEBUG_ERROR,
2449 DBGPRINT(RT_DEBUG_ERROR, ("pTxBlk->TotalFrameNum == %ld!\n", pTxBlk->TxPacketList.Number)); 2450 ("pTxBlk->TotalFrameNum == %ld!\n",
2451 pTxBlk->TxPacketList.Number));
2450 return NDIS_STATUS_FAILURE; 2452 return NDIS_STATUS_FAILURE;
2451 } 2453 }
2452 2454
@@ -2454,13 +2456,13 @@ NDIS_STATUS STAHardTransmit(
2454 2456
2455 // ------------------------------------------------------------------ 2457 // ------------------------------------------------------------------
2456 // STEP 1. WAKE UP PHY 2458 // STEP 1. WAKE UP PHY
2457 // outgoing frame always wakeup PHY to prevent frame lost and 2459 // outgoing frame always wakeup PHY to prevent frame lost and
2458 // turn off PSM bit to improve performance 2460 // turn off PSM bit to improve performance
2459 // ------------------------------------------------------------------ 2461 // ------------------------------------------------------------------
2460 // not to change PSM bit, just send this frame out? 2462 // not to change PSM bit, just send this frame out?
2461 if ((pAd->StaCfg.Psm == PWR_SAVE) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) 2463 if ((pAd->StaCfg.Psm == PWR_SAVE)
2462 { 2464 && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) {
2463 DBGPRINT_RAW(RT_DEBUG_INFO, ("AsicForceWakeup At HardTx\n")); 2465 DBGPRINT_RAW(RT_DEBUG_INFO, ("AsicForceWakeup At HardTx\n"));
2464#ifdef RTMP_MAC_PCI 2466#ifdef RTMP_MAC_PCI
2465 AsicForceWakeup(pAd, TRUE); 2467 AsicForceWakeup(pAd, TRUE);
2466#endif // RTMP_MAC_PCI // 2468#endif // RTMP_MAC_PCI //
@@ -2468,85 +2470,81 @@ NDIS_STATUS STAHardTransmit(
2468 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_FORCE_WAKE_UP, NULL, 0); 2470 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_FORCE_WAKE_UP, NULL, 0);
2469#endif // RTMP_MAC_USB // 2471#endif // RTMP_MAC_USB //
2470 } 2472 }
2471
2472 // It should not change PSM bit, when APSD turn on. 2473 // It should not change PSM bit, when APSD turn on.
2473 if ((!(pAd->CommonCfg.bAPSDCapable && pAd->CommonCfg.APEdcaParm.bAPSDCapable) && (pAd->CommonCfg.bAPSDForcePowerSave == FALSE)) 2474 if ((!
2474 || (RTMP_GET_PACKET_EAPOL(pTxBlk->pPacket)) 2475 (pAd->CommonCfg.bAPSDCapable
2475 || (RTMP_GET_PACKET_WAI(pTxBlk->pPacket))) 2476 && pAd->CommonCfg.APEdcaParm.bAPSDCapable)
2476 { 2477 && (pAd->CommonCfg.bAPSDForcePowerSave == FALSE))
2478 || (RTMP_GET_PACKET_EAPOL(pTxBlk->pPacket))
2479 || (RTMP_GET_PACKET_WAI(pTxBlk->pPacket))) {
2477 if ((pAd->StaCfg.Psm == PWR_SAVE) && 2480 if ((pAd->StaCfg.Psm == PWR_SAVE) &&
2478 (pAd->StaCfg.WindowsPowerMode == Ndis802_11PowerModeFast_PSP)) 2481 (pAd->StaCfg.WindowsPowerMode ==
2482 Ndis802_11PowerModeFast_PSP))
2479 RTMP_SET_PSM_BIT(pAd, PWR_ACTIVE); 2483 RTMP_SET_PSM_BIT(pAd, PWR_ACTIVE);
2480 } 2484 }
2481 2485
2482 switch (pTxBlk->TxFrameType) 2486 switch (pTxBlk->TxFrameType) {
2483 { 2487 case TX_AMPDU_FRAME:
2484 case TX_AMPDU_FRAME: 2488 STA_AMPDU_Frame_Tx(pAd, pTxBlk);
2485 STA_AMPDU_Frame_Tx(pAd, pTxBlk); 2489 break;
2486 break; 2490 case TX_AMSDU_FRAME:
2487 case TX_AMSDU_FRAME: 2491 STA_AMSDU_Frame_Tx(pAd, pTxBlk);
2488 STA_AMSDU_Frame_Tx(pAd, pTxBlk); 2492 break;
2489 break; 2493 case TX_LEGACY_FRAME:
2490 case TX_LEGACY_FRAME: 2494 STA_Legacy_Frame_Tx(pAd, pTxBlk);
2491 STA_Legacy_Frame_Tx(pAd, pTxBlk); 2495 break;
2492 break; 2496 case TX_MCAST_FRAME:
2493 case TX_MCAST_FRAME: 2497 STA_Legacy_Frame_Tx(pAd, pTxBlk);
2494 STA_Legacy_Frame_Tx(pAd, pTxBlk); 2498 break;
2495 break; 2499 case TX_RALINK_FRAME:
2496 case TX_RALINK_FRAME: 2500 STA_ARalink_Frame_Tx(pAd, pTxBlk);
2497 STA_ARalink_Frame_Tx(pAd, pTxBlk); 2501 break;
2498 break; 2502 case TX_FRAG_FRAME:
2499 case TX_FRAG_FRAME: 2503 STA_Fragment_Frame_Tx(pAd, pTxBlk);
2500 STA_Fragment_Frame_Tx(pAd, pTxBlk); 2504 break;
2501 break; 2505 default:
2502 default: 2506 {
2503 { 2507 // It should not happened!
2504 // It should not happened! 2508 DBGPRINT(RT_DEBUG_ERROR,
2505 DBGPRINT(RT_DEBUG_ERROR, ("Send a pacekt was not classified!! It should not happen!\n")); 2509 ("Send a pacekt was not classified!! It should not happen!\n"));
2506 while(pTxBlk->TxPacketList.Number) 2510 while (pTxBlk->TxPacketList.Number) {
2507 { 2511 pQEntry =
2508 pQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList); 2512 RemoveHeadQueue(&pTxBlk->TxPacketList);
2509 pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry); 2513 pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);
2510 if (pPacket) 2514 if (pPacket)
2511 RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); 2515 RELEASE_NDIS_PACKET(pAd, pPacket,
2512 } 2516 NDIS_STATUS_FAILURE);
2513 } 2517 }
2514 break; 2518 }
2519 break;
2515 } 2520 }
2516 2521
2517 return (NDIS_STATUS_SUCCESS); 2522 return (NDIS_STATUS_SUCCESS);
2518 2523
2519} 2524}
2520 2525
2521ULONG HashBytesPolynomial(UCHAR *value, unsigned int len) 2526ULONG HashBytesPolynomial(UCHAR * value, unsigned int len)
2522{ 2527{
2523 unsigned char *word = value; 2528 unsigned char *word = value;
2524 unsigned int ret = 0; 2529 unsigned int ret = 0;
2525 unsigned int i; 2530 unsigned int i;
2526 2531
2527 for(i=0; i < len; i++) 2532 for (i = 0; i < len; i++) {
2528 { 2533 int mod = i % 32;
2529 int mod = i % 32; 2534 ret ^= (unsigned int)(word[i]) << mod;
2530 ret ^=(unsigned int) (word[i]) << mod; 2535 ret ^= (unsigned int)(word[i]) >> (32 - mod);
2531 ret ^=(unsigned int) (word[i]) >> (32 - mod); 2536 }
2532 } 2537 return ret;
2533 return ret;
2534} 2538}
2535 2539
2536VOID Sta_Announce_or_Forward_802_3_Packet( 2540VOID Sta_Announce_or_Forward_802_3_Packet(IN PRTMP_ADAPTER pAd,
2537 IN PRTMP_ADAPTER pAd, 2541 IN PNDIS_PACKET pPacket,
2538 IN PNDIS_PACKET pPacket, 2542 IN UCHAR FromWhichBSSID)
2539 IN UCHAR FromWhichBSSID)
2540{ 2543{
2541 if (TRUE 2544 if (TRUE) {
2542 )
2543 {
2544 announce_802_3_packet(pAd, pPacket); 2545 announce_802_3_packet(pAd, pPacket);
2545 } 2546 } else {
2546 else
2547 {
2548 // release packet 2547 // release packet
2549 RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); 2548 RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
2550 } 2549 }
2551} 2550}
2552
diff --git a/drivers/staging/rt2860/sta/sanity.c b/drivers/staging/rt2860/sta/sanity.c
index 292baa86196..3986478bf28 100644
--- a/drivers/staging/rt2860/sta/sanity.c
+++ b/drivers/staging/rt2860/sta/sanity.c
@@ -36,15 +36,15 @@
36*/ 36*/
37#include "../rt_config.h" 37#include "../rt_config.h"
38 38
39extern UCHAR CISCO_OUI[]; 39extern UCHAR CISCO_OUI[];
40 40
41extern UCHAR WPA_OUI[]; 41extern UCHAR WPA_OUI[];
42extern UCHAR RSN_OUI[]; 42extern UCHAR RSN_OUI[];
43extern UCHAR WME_INFO_ELEM[]; 43extern UCHAR WME_INFO_ELEM[];
44extern UCHAR WME_PARM_ELEM[]; 44extern UCHAR WME_PARM_ELEM[];
45extern UCHAR Ccx2QosInfo[]; 45extern UCHAR Ccx2QosInfo[];
46extern UCHAR RALINK_OUI[]; 46extern UCHAR RALINK_OUI[];
47extern UCHAR BROADCOM_OUI[]; 47extern UCHAR BROADCOM_OUI[];
48 48
49/* 49/*
50 ========================================================================== 50 ==========================================================================
@@ -54,27 +54,25 @@ extern UCHAR BROADCOM_OUI[];
54 TRUE if all parameters are OK, FALSE otherwise 54 TRUE if all parameters are OK, FALSE otherwise
55 ========================================================================== 55 ==========================================================================
56 */ 56 */
57BOOLEAN MlmeStartReqSanity( 57BOOLEAN MlmeStartReqSanity(IN PRTMP_ADAPTER pAd,
58 IN PRTMP_ADAPTER pAd, 58 IN VOID * Msg,
59 IN VOID *Msg, 59 IN ULONG MsgLen,
60 IN ULONG MsgLen, 60 OUT CHAR Ssid[], OUT UCHAR * pSsidLen)
61 OUT CHAR Ssid[],
62 OUT UCHAR *pSsidLen)
63{ 61{
64 MLME_START_REQ_STRUCT *Info; 62 MLME_START_REQ_STRUCT *Info;
65 63
66 Info = (MLME_START_REQ_STRUCT *)(Msg); 64 Info = (MLME_START_REQ_STRUCT *) (Msg);
67 65
68 if (Info->SsidLen > MAX_LEN_OF_SSID) 66 if (Info->SsidLen > MAX_LEN_OF_SSID) {
69 { 67 DBGPRINT(RT_DEBUG_TRACE,
70 DBGPRINT(RT_DEBUG_TRACE, ("MlmeStartReqSanity fail - wrong SSID length\n")); 68 ("MlmeStartReqSanity fail - wrong SSID length\n"));
71 return FALSE; 69 return FALSE;
72 } 70 }
73 71
74 *pSsidLen = Info->SsidLen; 72 *pSsidLen = Info->SsidLen;
75 NdisMoveMemory(Ssid, Info->Ssid, *pSsidLen); 73 NdisMoveMemory(Ssid, Info->Ssid, *pSsidLen);
76 74
77 return TRUE; 75 return TRUE;
78} 76}
79 77
80/* 78/*
@@ -88,171 +86,161 @@ BOOLEAN MlmeStartReqSanity(
88 86
89 ========================================================================== 87 ==========================================================================
90 */ 88 */
91BOOLEAN PeerAssocRspSanity( 89BOOLEAN PeerAssocRspSanity(IN PRTMP_ADAPTER pAd, IN VOID * pMsg, IN ULONG MsgLen, OUT PUCHAR pAddr2, OUT USHORT * pCapabilityInfo, OUT USHORT * pStatus, OUT USHORT * pAid, OUT UCHAR SupRate[], OUT UCHAR * pSupRateLen, OUT UCHAR ExtRate[], OUT UCHAR * pExtRateLen, OUT HT_CAPABILITY_IE * pHtCapability, OUT ADD_HT_INFO_IE * pAddHtInfo, // AP might use this additional ht info IE
92 IN PRTMP_ADAPTER pAd, 90 OUT UCHAR * pHtCapabilityLen,
93 IN VOID *pMsg, 91 OUT UCHAR * pAddHtInfoLen,
94 IN ULONG MsgLen, 92 OUT UCHAR * pNewExtChannelOffset,
95 OUT PUCHAR pAddr2, 93 OUT PEDCA_PARM pEdcaParm, OUT UCHAR * pCkipFlag)
96 OUT USHORT *pCapabilityInfo,
97 OUT USHORT *pStatus,
98 OUT USHORT *pAid,
99 OUT UCHAR SupRate[],
100 OUT UCHAR *pSupRateLen,
101 OUT UCHAR ExtRate[],
102 OUT UCHAR *pExtRateLen,
103 OUT HT_CAPABILITY_IE *pHtCapability,
104 OUT ADD_HT_INFO_IE *pAddHtInfo, // AP might use this additional ht info IE
105 OUT UCHAR *pHtCapabilityLen,
106 OUT UCHAR *pAddHtInfoLen,
107 OUT UCHAR *pNewExtChannelOffset,
108 OUT PEDCA_PARM pEdcaParm,
109 OUT UCHAR *pCkipFlag)
110{ 94{
111 CHAR IeType, *Ptr; 95 CHAR IeType, *Ptr;
112 PFRAME_802_11 pFrame = (PFRAME_802_11)pMsg; 96 PFRAME_802_11 pFrame = (PFRAME_802_11) pMsg;
113 PEID_STRUCT pEid; 97 PEID_STRUCT pEid;
114 ULONG Length = 0; 98 ULONG Length = 0;
115 99
116 *pNewExtChannelOffset = 0xff; 100 *pNewExtChannelOffset = 0xff;
117 *pHtCapabilityLen = 0; 101 *pHtCapabilityLen = 0;
118 *pAddHtInfoLen = 0; 102 *pAddHtInfoLen = 0;
119 COPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2); 103 COPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2);
120 Ptr = (PCHAR)pFrame->Octet; 104 Ptr = (PCHAR) pFrame->Octet;
121 Length += LENGTH_802_11; 105 Length += LENGTH_802_11;
122 106
123 NdisMoveMemory(pCapabilityInfo, &pFrame->Octet[0], 2); 107 NdisMoveMemory(pCapabilityInfo, &pFrame->Octet[0], 2);
124 Length += 2; 108 Length += 2;
125 NdisMoveMemory(pStatus, &pFrame->Octet[2], 2); 109 NdisMoveMemory(pStatus, &pFrame->Octet[2], 2);
126 Length += 2; 110 Length += 2;
127 *pCkipFlag = 0; 111 *pCkipFlag = 0;
128 *pExtRateLen = 0; 112 *pExtRateLen = 0;
129 pEdcaParm->bValid = FALSE; 113 pEdcaParm->bValid = FALSE;
130 114
131 if (*pStatus != MLME_SUCCESS) 115 if (*pStatus != MLME_SUCCESS)
132 return TRUE; 116 return TRUE;
133 117
134 NdisMoveMemory(pAid, &pFrame->Octet[4], 2); 118 NdisMoveMemory(pAid, &pFrame->Octet[4], 2);
135 Length += 2; 119 Length += 2;
136 120
137 // Aid already swaped byte order in RTMPFrameEndianChange() for big endian platform 121 // Aid already swaped byte order in RTMPFrameEndianChange() for big endian platform
138 *pAid = (*pAid) & 0x3fff; // AID is low 14-bit 122 *pAid = (*pAid) & 0x3fff; // AID is low 14-bit
139 123
140 // -- get supported rates from payload and advance the pointer 124 // -- get supported rates from payload and advance the pointer
141 IeType = pFrame->Octet[6]; 125 IeType = pFrame->Octet[6];
142 *pSupRateLen = pFrame->Octet[7]; 126 *pSupRateLen = pFrame->Octet[7];
143 if ((IeType != IE_SUPP_RATES) || (*pSupRateLen > MAX_LEN_OF_SUPPORTED_RATES)) 127 if ((IeType != IE_SUPP_RATES)
144 { 128 || (*pSupRateLen > MAX_LEN_OF_SUPPORTED_RATES)) {
145 DBGPRINT(RT_DEBUG_TRACE, ("PeerAssocRspSanity fail - wrong SupportedRates IE\n")); 129 DBGPRINT(RT_DEBUG_TRACE,
146 return FALSE; 130 ("PeerAssocRspSanity fail - wrong SupportedRates IE\n"));
147 } 131 return FALSE;
148 else 132 } else
149 NdisMoveMemory(SupRate, &pFrame->Octet[8], *pSupRateLen); 133 NdisMoveMemory(SupRate, &pFrame->Octet[8], *pSupRateLen);
150 134
151 Length = Length + 2 + *pSupRateLen; 135 Length = Length + 2 + *pSupRateLen;
152 136
153 // many AP implement proprietary IEs in non-standard order, we'd better 137 // many AP implement proprietary IEs in non-standard order, we'd better
154 // tolerate mis-ordered IEs to get best compatibility 138 // tolerate mis-ordered IEs to get best compatibility
155 pEid = (PEID_STRUCT) &pFrame->Octet[8 + (*pSupRateLen)]; 139 pEid = (PEID_STRUCT) & pFrame->Octet[8 + (*pSupRateLen)];
156 140
157 // get variable fields from payload and advance the pointer 141 // get variable fields from payload and advance the pointer
158 while ((Length + 2 + pEid->Len) <= MsgLen) 142 while ((Length + 2 + pEid->Len) <= MsgLen) {
159 { 143 switch (pEid->Eid) {
160 switch (pEid->Eid) 144 case IE_EXT_SUPP_RATES:
161 { 145 if (pEid->Len <= MAX_LEN_OF_SUPPORTED_RATES) {
162 case IE_EXT_SUPP_RATES: 146 NdisMoveMemory(ExtRate, pEid->Octet, pEid->Len);
163 if (pEid->Len <= MAX_LEN_OF_SUPPORTED_RATES) 147 *pExtRateLen = pEid->Len;
164 { 148 }
165 NdisMoveMemory(ExtRate, pEid->Octet, pEid->Len); 149 break;
166 *pExtRateLen = pEid->Len; 150
167 } 151 case IE_HT_CAP:
168 break; 152 case IE_HT_CAP2:
169 153 if (pEid->Len >= SIZE_HT_CAP_IE) //Note: allow extension.!!
170 case IE_HT_CAP:
171 case IE_HT_CAP2:
172 if (pEid->Len >= SIZE_HT_CAP_IE) //Note: allow extension.!!
173 { 154 {
174 NdisMoveMemory(pHtCapability, pEid->Octet, SIZE_HT_CAP_IE); 155 NdisMoveMemory(pHtCapability, pEid->Octet,
156 SIZE_HT_CAP_IE);
175 157
176 *(USHORT *)(&pHtCapability->HtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->HtCapInfo)); 158 *(USHORT *) (&pHtCapability->HtCapInfo) =
177 *(USHORT *)(&pHtCapability->ExtHtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->ExtHtCapInfo)); 159 cpu2le16(*(USHORT *)
160 (&pHtCapability->HtCapInfo));
161 *(USHORT *) (&pHtCapability->ExtHtCapInfo) =
162 cpu2le16(*(USHORT *)
163 (&pHtCapability->ExtHtCapInfo));
178 164
179 *pHtCapabilityLen = SIZE_HT_CAP_IE; 165 *pHtCapabilityLen = SIZE_HT_CAP_IE;
180 } 166 } else {
181 else 167 DBGPRINT(RT_DEBUG_WARN,
182 { 168 ("PeerAssocRspSanity - wrong IE_HT_CAP. \n"));
183 DBGPRINT(RT_DEBUG_WARN, ("PeerAssocRspSanity - wrong IE_HT_CAP. \n"));
184 } 169 }
185 170
186 break; 171 break;
187 case IE_ADD_HT: 172 case IE_ADD_HT:
188 case IE_ADD_HT2: 173 case IE_ADD_HT2:
189 if (pEid->Len >= sizeof(ADD_HT_INFO_IE)) 174 if (pEid->Len >= sizeof(ADD_HT_INFO_IE)) {
190 {
191 // This IE allows extension, but we can ignore extra bytes beyond our knowledge , so only 175 // This IE allows extension, but we can ignore extra bytes beyond our knowledge , so only
192 // copy first sizeof(ADD_HT_INFO_IE) 176 // copy first sizeof(ADD_HT_INFO_IE)
193 NdisMoveMemory(pAddHtInfo, pEid->Octet, sizeof(ADD_HT_INFO_IE)); 177 NdisMoveMemory(pAddHtInfo, pEid->Octet,
178 sizeof(ADD_HT_INFO_IE));
194 179
195 *(USHORT *)(&pAddHtInfo->AddHtInfo2) = cpu2le16(*(USHORT *)(&pAddHtInfo->AddHtInfo2)); 180 *(USHORT *) (&pAddHtInfo->AddHtInfo2) =
196 *(USHORT *)(&pAddHtInfo->AddHtInfo3) = cpu2le16(*(USHORT *)(&pAddHtInfo->AddHtInfo3)); 181 cpu2le16(*(USHORT *)
182 (&pAddHtInfo->AddHtInfo2));
183 *(USHORT *) (&pAddHtInfo->AddHtInfo3) =
184 cpu2le16(*(USHORT *)
185 (&pAddHtInfo->AddHtInfo3));
197 186
198 *pAddHtInfoLen = SIZE_ADD_HT_INFO_IE; 187 *pAddHtInfoLen = SIZE_ADD_HT_INFO_IE;
199 } 188 } else {
200 else 189 DBGPRINT(RT_DEBUG_WARN,
201 { 190 ("PeerAssocRspSanity - wrong IE_ADD_HT. \n"));
202 DBGPRINT(RT_DEBUG_WARN, ("PeerAssocRspSanity - wrong IE_ADD_HT. \n"));
203 } 191 }
204 192
205 break; 193 break;
206 case IE_SECONDARY_CH_OFFSET: 194 case IE_SECONDARY_CH_OFFSET:
207 if (pEid->Len == 1) 195 if (pEid->Len == 1) {
208 {
209 *pNewExtChannelOffset = pEid->Octet[0]; 196 *pNewExtChannelOffset = pEid->Octet[0];
197 } else {
198 DBGPRINT(RT_DEBUG_WARN,
199 ("PeerAssocRspSanity - wrong IE_SECONDARY_CH_OFFSET. \n"));
210 } 200 }
211 else 201 break;
212 { 202
213 DBGPRINT(RT_DEBUG_WARN, ("PeerAssocRspSanity - wrong IE_SECONDARY_CH_OFFSET. \n")); 203 case IE_VENDOR_SPECIFIC:
204 // handle WME PARAMTER ELEMENT
205 if (NdisEqualMemory(pEid->Octet, WME_PARM_ELEM, 6)
206 && (pEid->Len == 24)) {
207 PUCHAR ptr;
208 int i;
209
210 // parsing EDCA parameters
211 pEdcaParm->bValid = TRUE;
212 pEdcaParm->bQAck = FALSE; // pEid->Octet[0] & 0x10;
213 pEdcaParm->bQueueRequest = FALSE; // pEid->Octet[0] & 0x20;
214 pEdcaParm->bTxopRequest = FALSE; // pEid->Octet[0] & 0x40;
215 //pEdcaParm->bMoreDataAck = FALSE; // pEid->Octet[0] & 0x80;
216 pEdcaParm->EdcaUpdateCount =
217 pEid->Octet[6] & 0x0f;
218 pEdcaParm->bAPSDCapable =
219 (pEid->Octet[6] & 0x80) ? 1 : 0;
220 ptr = (PUCHAR) & pEid->Octet[8];
221 for (i = 0; i < 4; i++) {
222 UCHAR aci = (*ptr & 0x60) >> 5; // b5~6 is AC INDEX
223 pEdcaParm->bACM[aci] = (((*ptr) & 0x10) == 0x10); // b5 is ACM
224 pEdcaParm->Aifsn[aci] = (*ptr) & 0x0f; // b0~3 is AIFSN
225 pEdcaParm->Cwmin[aci] = *(ptr + 1) & 0x0f; // b0~4 is Cwmin
226 pEdcaParm->Cwmax[aci] = *(ptr + 1) >> 4; // b5~8 is Cwmax
227 pEdcaParm->Txop[aci] = *(ptr + 2) + 256 * (*(ptr + 3)); // in unit of 32-us
228 ptr += 4; // point to next AC
229 }
214 } 230 }
215 break; 231 break;
216 232 default:
217 case IE_VENDOR_SPECIFIC: 233 DBGPRINT(RT_DEBUG_TRACE,
218 // handle WME PARAMTER ELEMENT 234 ("PeerAssocRspSanity - ignore unrecognized EID = %d\n",
219 if (NdisEqualMemory(pEid->Octet, WME_PARM_ELEM, 6) && (pEid->Len == 24)) 235 pEid->Eid));
220 { 236 break;
221 PUCHAR ptr; 237 }
222 int i; 238
223 239 Length = Length + 2 + pEid->Len;
224 // parsing EDCA parameters 240 pEid = (PEID_STRUCT) ((UCHAR *) pEid + 2 + pEid->Len);
225 pEdcaParm->bValid = TRUE; 241 }
226 pEdcaParm->bQAck = FALSE; // pEid->Octet[0] & 0x10; 242
227 pEdcaParm->bQueueRequest = FALSE; // pEid->Octet[0] & 0x20; 243 return TRUE;
228 pEdcaParm->bTxopRequest = FALSE; // pEid->Octet[0] & 0x40;
229 //pEdcaParm->bMoreDataAck = FALSE; // pEid->Octet[0] & 0x80;
230 pEdcaParm->EdcaUpdateCount = pEid->Octet[6] & 0x0f;
231 pEdcaParm->bAPSDCapable = (pEid->Octet[6] & 0x80) ? 1 : 0;
232 ptr = (PUCHAR)&pEid->Octet[8];
233 for (i=0; i<4; i++)
234 {
235 UCHAR aci = (*ptr & 0x60) >> 5; // b5~6 is AC INDEX
236 pEdcaParm->bACM[aci] = (((*ptr) & 0x10) == 0x10); // b5 is ACM
237 pEdcaParm->Aifsn[aci] = (*ptr) & 0x0f; // b0~3 is AIFSN
238 pEdcaParm->Cwmin[aci] = *(ptr+1) & 0x0f; // b0~4 is Cwmin
239 pEdcaParm->Cwmax[aci] = *(ptr+1) >> 4; // b5~8 is Cwmax
240 pEdcaParm->Txop[aci] = *(ptr+2) + 256 * (*(ptr+3)); // in unit of 32-us
241 ptr += 4; // point to next AC
242 }
243 }
244 break;
245 default:
246 DBGPRINT(RT_DEBUG_TRACE, ("PeerAssocRspSanity - ignore unrecognized EID = %d\n", pEid->Eid));
247 break;
248 }
249
250 Length = Length + 2 + pEid->Len;
251 pEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len);
252 }
253
254
255 return TRUE;
256} 244}
257 245
258/* 246/*
@@ -266,47 +254,46 @@ BOOLEAN PeerAssocRspSanity(
266 254
267 ========================================================================== 255 ==========================================================================
268 */ 256 */
269BOOLEAN PeerProbeReqSanity( 257BOOLEAN PeerProbeReqSanity(IN PRTMP_ADAPTER pAd,
270 IN PRTMP_ADAPTER pAd, 258 IN VOID * Msg,
271 IN VOID *Msg, 259 IN ULONG MsgLen,
272 IN ULONG MsgLen, 260 OUT PUCHAR pAddr2,
273 OUT PUCHAR pAddr2, 261 OUT CHAR Ssid[], OUT UCHAR * pSsidLen)
274 OUT CHAR Ssid[],
275 OUT UCHAR *pSsidLen)
276{ 262{
277 UCHAR Idx; 263 UCHAR Idx;
278 UCHAR RateLen; 264 UCHAR RateLen;
279 CHAR IeType; 265 CHAR IeType;
280 PFRAME_802_11 pFrame = (PFRAME_802_11)Msg; 266 PFRAME_802_11 pFrame = (PFRAME_802_11) Msg;
281 267
282 COPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2); 268 COPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2);
283 269
284 if ((pFrame->Octet[0] != IE_SSID) || (pFrame->Octet[1] > MAX_LEN_OF_SSID)) 270 if ((pFrame->Octet[0] != IE_SSID)
285 { 271 || (pFrame->Octet[1] > MAX_LEN_OF_SSID)) {
286 DBGPRINT(RT_DEBUG_TRACE, ("PeerProbeReqSanity fail - wrong SSID IE(Type=%d,Len=%d)\n",pFrame->Octet[0],pFrame->Octet[1])); 272 DBGPRINT(RT_DEBUG_TRACE,
287 return FALSE; 273 ("PeerProbeReqSanity fail - wrong SSID IE(Type=%d,Len=%d)\n",
288 } 274 pFrame->Octet[0], pFrame->Octet[1]));
289 275 return FALSE;
290 *pSsidLen = pFrame->Octet[1]; 276 }
291 NdisMoveMemory(Ssid, &pFrame->Octet[2], *pSsidLen); 277
292 278 *pSsidLen = pFrame->Octet[1];
293 Idx = *pSsidLen + 2; 279 NdisMoveMemory(Ssid, &pFrame->Octet[2], *pSsidLen);
294 280
295 // -- get supported rates from payload and advance the pointer 281 Idx = *pSsidLen + 2;
296 IeType = pFrame->Octet[Idx]; 282
297 RateLen = pFrame->Octet[Idx + 1]; 283 // -- get supported rates from payload and advance the pointer
298 if (IeType != IE_SUPP_RATES) 284 IeType = pFrame->Octet[Idx];
299 { 285 RateLen = pFrame->Octet[Idx + 1];
300 DBGPRINT(RT_DEBUG_TRACE, ("PeerProbeReqSanity fail - wrong SupportRates IE(Type=%d,Len=%d)\n",pFrame->Octet[Idx],pFrame->Octet[Idx+1])); 286 if (IeType != IE_SUPP_RATES) {
301 return FALSE; 287 DBGPRINT(RT_DEBUG_TRACE,
302 } 288 ("PeerProbeReqSanity fail - wrong SupportRates IE(Type=%d,Len=%d)\n",
303 else 289 pFrame->Octet[Idx], pFrame->Octet[Idx + 1]));
304 { 290 return FALSE;
305 if ((pAd->CommonCfg.PhyMode == PHY_11G) && (RateLen < 8)) 291 } else {
306 return (FALSE); 292 if ((pAd->CommonCfg.PhyMode == PHY_11G) && (RateLen < 8))
307 } 293 return (FALSE);
308 294 }
309 return TRUE; 295
296 return TRUE;
310} 297}
311 298
312/* 299/*
@@ -317,62 +304,58 @@ BOOLEAN PeerProbeReqSanity(
317 304
318 ========================================================================== 305 ==========================================================================
319 */ 306 */
320BOOLEAN GetTimBit( 307BOOLEAN GetTimBit(IN CHAR * Ptr,
321 IN CHAR *Ptr, 308 IN USHORT Aid,
322 IN USHORT Aid, 309 OUT UCHAR * TimLen,
323 OUT UCHAR *TimLen, 310 OUT UCHAR * BcastFlag,
324 OUT UCHAR *BcastFlag, 311 OUT UCHAR * DtimCount,
325 OUT UCHAR *DtimCount, 312 OUT UCHAR * DtimPeriod, OUT UCHAR * MessageToMe)
326 OUT UCHAR *DtimPeriod,
327 OUT UCHAR *MessageToMe)
328{ 313{
329 UCHAR BitCntl, N1, N2, MyByte, MyBit; 314 UCHAR BitCntl, N1, N2, MyByte, MyBit;
330 CHAR *IdxPtr; 315 CHAR *IdxPtr;
331 316
332 IdxPtr = Ptr; 317 IdxPtr = Ptr;
333 318
334 IdxPtr ++; 319 IdxPtr++;
335 *TimLen = *IdxPtr; 320 *TimLen = *IdxPtr;
336 321
337 // get DTIM Count from TIM element 322 // get DTIM Count from TIM element
338 IdxPtr ++; 323 IdxPtr++;
339 *DtimCount = *IdxPtr; 324 *DtimCount = *IdxPtr;
340 325
341 // get DTIM Period from TIM element 326 // get DTIM Period from TIM element
342 IdxPtr++; 327 IdxPtr++;
343 *DtimPeriod = *IdxPtr; 328 *DtimPeriod = *IdxPtr;
344 329
345 // get Bitmap Control from TIM element 330 // get Bitmap Control from TIM element
346 IdxPtr++; 331 IdxPtr++;
347 BitCntl = *IdxPtr; 332 BitCntl = *IdxPtr;
348 333
349 if ((*DtimCount == 0) && (BitCntl & 0x01)) 334 if ((*DtimCount == 0) && (BitCntl & 0x01))
350 *BcastFlag = TRUE; 335 *BcastFlag = TRUE;
351 else 336 else
352 *BcastFlag = FALSE; 337 *BcastFlag = FALSE;
353 338
354 // Parse Partial Virtual Bitmap from TIM element 339 // Parse Partial Virtual Bitmap from TIM element
355 N1 = BitCntl & 0xfe; // N1 is the first bitmap byte# 340 N1 = BitCntl & 0xfe; // N1 is the first bitmap byte#
356 N2 = *TimLen - 4 + N1; // N2 is the last bitmap byte# 341 N2 = *TimLen - 4 + N1; // N2 is the last bitmap byte#
357 342
358 if ((Aid < (N1 << 3)) || (Aid >= ((N2 + 1) << 3))) 343 if ((Aid < (N1 << 3)) || (Aid >= ((N2 + 1) << 3)))
359 *MessageToMe = FALSE; 344 *MessageToMe = FALSE;
360 else 345 else {
361 { 346 MyByte = (Aid >> 3) - N1; // my byte position in the bitmap byte-stream
362 MyByte = (Aid >> 3) - N1; // my byte position in the bitmap byte-stream 347 MyBit = Aid % 16 - ((MyByte & 0x01) ? 8 : 0);
363 MyBit = Aid % 16 - ((MyByte & 0x01)? 8:0);
364 348
365 IdxPtr += (MyByte + 1); 349 IdxPtr += (MyByte + 1);
366 350
367 //if (*IdxPtr) 351 //if (*IdxPtr)
368 // DBGPRINT(RT_DEBUG_WARN, ("TIM bitmap = 0x%02x\n", *IdxPtr)); 352 // DBGPRINT(RT_DEBUG_WARN, ("TIM bitmap = 0x%02x\n", *IdxPtr));
369 353
370 if (*IdxPtr & (0x01 << MyBit)) 354 if (*IdxPtr & (0x01 << MyBit))
371 *MessageToMe = TRUE; 355 *MessageToMe = TRUE;
372 else 356 else
373 *MessageToMe = FALSE; 357 *MessageToMe = FALSE;
374 } 358 }
375 359
376 return TRUE; 360 return TRUE;
377} 361}
378
diff --git a/drivers/staging/rt2860/sta/sync.c b/drivers/staging/rt2860/sta/sync.c
index dc71c1dabc7..56bb797e61a 100644
--- a/drivers/staging/rt2860/sta/sync.c
+++ b/drivers/staging/rt2860/sta/sync.c
@@ -37,7 +37,6 @@
37*/ 37*/
38#include "../rt_config.h" 38#include "../rt_config.h"
39 39
40
41#define ADHOC_ENTRY_BEACON_LOST_TIME (2*OS_HZ) // 2 sec 40#define ADHOC_ENTRY_BEACON_LOST_TIME (2*OS_HZ) // 2 sec
42 41
43/* 42/*
@@ -51,38 +50,56 @@
51 50
52 ========================================================================== 51 ==========================================================================
53 */ 52 */
54VOID SyncStateMachineInit( 53VOID SyncStateMachineInit(IN PRTMP_ADAPTER pAd,
55 IN PRTMP_ADAPTER pAd, 54 IN STATE_MACHINE * Sm, OUT STATE_MACHINE_FUNC Trans[])
56 IN STATE_MACHINE *Sm,
57 OUT STATE_MACHINE_FUNC Trans[])
58{ 55{
59 StateMachineInit(Sm, Trans, MAX_SYNC_STATE, MAX_SYNC_MSG, (STATE_MACHINE_FUNC)Drop, SYNC_IDLE, SYNC_MACHINE_BASE); 56 StateMachineInit(Sm, Trans, MAX_SYNC_STATE, MAX_SYNC_MSG,
57 (STATE_MACHINE_FUNC) Drop, SYNC_IDLE,
58 SYNC_MACHINE_BASE);
60 59
61 // column 1 60 // column 1
62 StateMachineSetAction(Sm, SYNC_IDLE, MT2_MLME_SCAN_REQ, (STATE_MACHINE_FUNC)MlmeScanReqAction); 61 StateMachineSetAction(Sm, SYNC_IDLE, MT2_MLME_SCAN_REQ,
63 StateMachineSetAction(Sm, SYNC_IDLE, MT2_MLME_JOIN_REQ, (STATE_MACHINE_FUNC)MlmeJoinReqAction); 62 (STATE_MACHINE_FUNC) MlmeScanReqAction);
64 StateMachineSetAction(Sm, SYNC_IDLE, MT2_MLME_START_REQ, (STATE_MACHINE_FUNC)MlmeStartReqAction); 63 StateMachineSetAction(Sm, SYNC_IDLE, MT2_MLME_JOIN_REQ,
65 StateMachineSetAction(Sm, SYNC_IDLE, MT2_PEER_BEACON, (STATE_MACHINE_FUNC)PeerBeacon); 64 (STATE_MACHINE_FUNC) MlmeJoinReqAction);
66 StateMachineSetAction(Sm, SYNC_IDLE, MT2_PEER_PROBE_REQ, (STATE_MACHINE_FUNC)PeerProbeReqAction); 65 StateMachineSetAction(Sm, SYNC_IDLE, MT2_MLME_START_REQ,
66 (STATE_MACHINE_FUNC) MlmeStartReqAction);
67 StateMachineSetAction(Sm, SYNC_IDLE, MT2_PEER_BEACON,
68 (STATE_MACHINE_FUNC) PeerBeacon);
69 StateMachineSetAction(Sm, SYNC_IDLE, MT2_PEER_PROBE_REQ,
70 (STATE_MACHINE_FUNC) PeerProbeReqAction);
67 71
68 //column 2 72 //column 2
69 StateMachineSetAction(Sm, JOIN_WAIT_BEACON, MT2_MLME_SCAN_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenScan); 73 StateMachineSetAction(Sm, JOIN_WAIT_BEACON, MT2_MLME_SCAN_REQ,
70 StateMachineSetAction(Sm, JOIN_WAIT_BEACON, MT2_MLME_JOIN_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenJoin); 74 (STATE_MACHINE_FUNC) InvalidStateWhenScan);
71 StateMachineSetAction(Sm, JOIN_WAIT_BEACON, MT2_MLME_START_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenStart); 75 StateMachineSetAction(Sm, JOIN_WAIT_BEACON, MT2_MLME_JOIN_REQ,
72 StateMachineSetAction(Sm, JOIN_WAIT_BEACON, MT2_PEER_BEACON, (STATE_MACHINE_FUNC)PeerBeaconAtJoinAction); 76 (STATE_MACHINE_FUNC) InvalidStateWhenJoin);
73 StateMachineSetAction(Sm, JOIN_WAIT_BEACON, MT2_BEACON_TIMEOUT, (STATE_MACHINE_FUNC)BeaconTimeoutAtJoinAction); 77 StateMachineSetAction(Sm, JOIN_WAIT_BEACON, MT2_MLME_START_REQ,
78 (STATE_MACHINE_FUNC) InvalidStateWhenStart);
79 StateMachineSetAction(Sm, JOIN_WAIT_BEACON, MT2_PEER_BEACON,
80 (STATE_MACHINE_FUNC) PeerBeaconAtJoinAction);
81 StateMachineSetAction(Sm, JOIN_WAIT_BEACON, MT2_BEACON_TIMEOUT,
82 (STATE_MACHINE_FUNC) BeaconTimeoutAtJoinAction);
74 83
75 // column 3 84 // column 3
76 StateMachineSetAction(Sm, SCAN_LISTEN, MT2_MLME_SCAN_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenScan); 85 StateMachineSetAction(Sm, SCAN_LISTEN, MT2_MLME_SCAN_REQ,
77 StateMachineSetAction(Sm, SCAN_LISTEN, MT2_MLME_JOIN_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenJoin); 86 (STATE_MACHINE_FUNC) InvalidStateWhenScan);
78 StateMachineSetAction(Sm, SCAN_LISTEN, MT2_MLME_START_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenStart); 87 StateMachineSetAction(Sm, SCAN_LISTEN, MT2_MLME_JOIN_REQ,
79 StateMachineSetAction(Sm, SCAN_LISTEN, MT2_PEER_BEACON, (STATE_MACHINE_FUNC)PeerBeaconAtScanAction); 88 (STATE_MACHINE_FUNC) InvalidStateWhenJoin);
80 StateMachineSetAction(Sm, SCAN_LISTEN, MT2_PEER_PROBE_RSP, (STATE_MACHINE_FUNC)PeerBeaconAtScanAction); 89 StateMachineSetAction(Sm, SCAN_LISTEN, MT2_MLME_START_REQ,
81 StateMachineSetAction(Sm, SCAN_LISTEN, MT2_SCAN_TIMEOUT, (STATE_MACHINE_FUNC)ScanTimeoutAction); 90 (STATE_MACHINE_FUNC) InvalidStateWhenStart);
91 StateMachineSetAction(Sm, SCAN_LISTEN, MT2_PEER_BEACON,
92 (STATE_MACHINE_FUNC) PeerBeaconAtScanAction);
93 StateMachineSetAction(Sm, SCAN_LISTEN, MT2_PEER_PROBE_RSP,
94 (STATE_MACHINE_FUNC) PeerBeaconAtScanAction);
95 StateMachineSetAction(Sm, SCAN_LISTEN, MT2_SCAN_TIMEOUT,
96 (STATE_MACHINE_FUNC) ScanTimeoutAction);
82 97
83 // timer init 98 // timer init
84 RTMPInitTimer(pAd, &pAd->MlmeAux.BeaconTimer, GET_TIMER_FUNCTION(BeaconTimeout), pAd, FALSE); 99 RTMPInitTimer(pAd, &pAd->MlmeAux.BeaconTimer,
85 RTMPInitTimer(pAd, &pAd->MlmeAux.ScanTimer, GET_TIMER_FUNCTION(ScanTimeout), pAd, FALSE); 100 GET_TIMER_FUNCTION(BeaconTimeout), pAd, FALSE);
101 RTMPInitTimer(pAd, &pAd->MlmeAux.ScanTimer,
102 GET_TIMER_FUNCTION(ScanTimeout), pAd, FALSE);
86} 103}
87 104
88/* 105/*
@@ -94,15 +111,13 @@ VOID SyncStateMachineInit(
94 111
95 ========================================================================== 112 ==========================================================================
96 */ 113 */
97VOID BeaconTimeout( 114VOID BeaconTimeout(IN PVOID SystemSpecific1,
98 IN PVOID SystemSpecific1, 115 IN PVOID FunctionContext,
99 IN PVOID FunctionContext, 116 IN PVOID SystemSpecific2, IN PVOID SystemSpecific3)
100 IN PVOID SystemSpecific2,
101 IN PVOID SystemSpecific3)
102{ 117{
103 RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext; 118 RTMP_ADAPTER *pAd = (RTMP_ADAPTER *) FunctionContext;
104 119
105 DBGPRINT(RT_DEBUG_TRACE,("SYNC - BeaconTimeout\n")); 120 DBGPRINT(RT_DEBUG_TRACE, ("SYNC - BeaconTimeout\n"));
106 121
107 // Do nothing if the driver is starting halt state. 122 // Do nothing if the driver is starting halt state.
108 // This might happen when timer already been fired before cancel timer with mlmehalt 123 // This might happen when timer already been fired before cancel timer with mlmehalt
@@ -110,16 +125,17 @@ VOID BeaconTimeout(
110 return; 125 return;
111 126
112 if ((pAd->CommonCfg.BBPCurrentBW == BW_40) 127 if ((pAd->CommonCfg.BBPCurrentBW == BW_40)
113 ) 128 ) {
114 { 129 UCHAR BBPValue = 0;
115 UCHAR BBPValue = 0;
116 AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE); 130 AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
117 AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel); 131 AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
118 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue); 132 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
119 BBPValue &= (~0x18); 133 BBPValue &= (~0x18);
120 BBPValue |= 0x10; 134 BBPValue |= 0x10;
121 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue); 135 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
122 DBGPRINT(RT_DEBUG_TRACE, ("SYNC - End of SCAN, restore to 40MHz channel %d, Total BSS[%02d]\n",pAd->CommonCfg.CentralChannel, pAd->ScanTab.BssNr)); 136 DBGPRINT(RT_DEBUG_TRACE,
137 ("SYNC - End of SCAN, restore to 40MHz channel %d, Total BSS[%02d]\n",
138 pAd->CommonCfg.CentralChannel, pAd->ScanTab.BssNr));
123 } 139 }
124 140
125 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_BEACON_TIMEOUT, 0, NULL); 141 MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_BEACON_TIMEOUT, 0, NULL);
@@ -135,32 +151,28 @@ VOID BeaconTimeout(
135 151
136 ========================================================================== 152 ==========================================================================
137 */ 153 */
138VOID ScanTimeout( 154VOID ScanTimeout(IN PVOID SystemSpecific1,
139 IN PVOID SystemSpecific1, 155 IN PVOID FunctionContext,
140 IN PVOID FunctionContext, 156 IN PVOID SystemSpecific2, IN PVOID SystemSpecific3)
141 IN PVOID SystemSpecific2,
142 IN PVOID SystemSpecific3)
143{ 157{
144 RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext; 158 RTMP_ADAPTER *pAd = (RTMP_ADAPTER *) FunctionContext;
145
146 159
147 // Do nothing if the driver is starting halt state. 160 // Do nothing if the driver is starting halt state.
148 // This might happen when timer already been fired before cancel timer with mlmehalt 161 // This might happen when timer already been fired before cancel timer with mlmehalt
149 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) 162 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS))
150 return; 163 return;
151 164
152 if (MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_SCAN_TIMEOUT, 0, NULL)) 165 if (MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_SCAN_TIMEOUT, 0, NULL)) {
153 { 166 RTMP_MLME_HANDLER(pAd);
154 RTMP_MLME_HANDLER(pAd); 167 } else {
155}
156 else
157 {
158 // To prevent SyncMachine.CurrState is SCAN_LISTEN forever. 168 // To prevent SyncMachine.CurrState is SCAN_LISTEN forever.
159 pAd->MlmeAux.Channel = 0; 169 pAd->MlmeAux.Channel = 0;
160 ScanNextChannel(pAd); 170 ScanNextChannel(pAd);
161 if (pAd->CommonCfg.bWirelessEvent) 171 if (pAd->CommonCfg.bWirelessEvent) {
162 { 172 RTMPSendWirelessEvent(pAd,
163 RTMPSendWirelessEvent(pAd, IW_SCAN_ENQUEUE_FAIL_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0); 173 IW_SCAN_ENQUEUE_FAIL_EVENT_FLAG,
174 pAd->MacTab.Content[BSSID_WCID].
175 Addr, BSS0, 0);
164 } 176 }
165 } 177 }
166} 178}
@@ -171,83 +183,78 @@ VOID ScanTimeout(
171 MLME SCAN req state machine procedure 183 MLME SCAN req state machine procedure
172 ========================================================================== 184 ==========================================================================
173 */ 185 */
174VOID MlmeScanReqAction( 186VOID MlmeScanReqAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
175 IN PRTMP_ADAPTER pAd,
176 IN MLME_QUEUE_ELEM *Elem)
177{ 187{
178 UCHAR Ssid[MAX_LEN_OF_SSID], SsidLen, ScanType, BssType, BBPValue = 0; 188 UCHAR Ssid[MAX_LEN_OF_SSID], SsidLen, ScanType, BssType, BBPValue = 0;
179 BOOLEAN TimerCancelled; 189 BOOLEAN TimerCancelled;
180 ULONG Now; 190 ULONG Now;
181 USHORT Status; 191 USHORT Status;
182 PHEADER_802_11 pHdr80211; 192 PHEADER_802_11 pHdr80211;
183 PUCHAR pOutBuffer = NULL; 193 PUCHAR pOutBuffer = NULL;
184 NDIS_STATUS NStatus; 194 NDIS_STATUS NStatus;
185 195
186 // Check the total scan tries for one single OID command 196 // Check the total scan tries for one single OID command
187 // If this is the CCX 2.0 Case, skip that! 197 // If this is the CCX 2.0 Case, skip that!
188 if ( !RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP)) 198 if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP)) {
189 { 199 DBGPRINT(RT_DEBUG_TRACE,
190 DBGPRINT(RT_DEBUG_TRACE, ("SYNC - MlmeScanReqAction before Startup\n")); 200 ("SYNC - MlmeScanReqAction before Startup\n"));
191 return; 201 return;
192 } 202 }
193
194 // Increase the scan retry counters. 203 // Increase the scan retry counters.
195 pAd->StaCfg.ScanCnt++; 204 pAd->StaCfg.ScanCnt++;
196 205
197#ifdef RTMP_MAC_PCI 206#ifdef RTMP_MAC_PCI
198 if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)) && 207 if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)) &&
199 (IDLE_ON(pAd)) && 208 (IDLE_ON(pAd)) &&
200 (pAd->StaCfg.bRadio == TRUE) && 209 (pAd->StaCfg.bRadio == TRUE) &&
201 (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF))) 210 (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF))) {
202 { 211 if (pAd->StaCfg.PSControl.field.EnableNewPS == FALSE) {
203 if (pAd->StaCfg.PSControl.field.EnableNewPS == FALSE) 212 AsicSendCommandToMcu(pAd, 0x31, PowerWakeCID, 0x00,
204 { 213 0x02);
205 AsicSendCommandToMcu(pAd, 0x31, PowerWakeCID, 0x00, 0x02);
206 AsicCheckCommanOk(pAd, PowerWakeCID); 214 AsicCheckCommanOk(pAd, PowerWakeCID);
207 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF); 215 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF);
208 DBGPRINT(RT_DEBUG_TRACE, ("PSM - Issue Wake up command \n")); 216 DBGPRINT(RT_DEBUG_TRACE,
217 ("PSM - Issue Wake up command \n"));
218 } else {
219 RT28xxPciAsicRadioOn(pAd, GUI_IDLE_POWER_SAVE);
209 } 220 }
210 else
211 {
212 RT28xxPciAsicRadioOn(pAd, GUI_IDLE_POWER_SAVE);
213 }
214 } 221 }
215#endif // RTMP_MAC_PCI // 222#endif // RTMP_MAC_PCI //
216 223
217 // first check the parameter sanity 224 // first check the parameter sanity
218 if (MlmeScanReqSanity(pAd, 225 if (MlmeScanReqSanity(pAd,
219 Elem->Msg, 226 Elem->Msg,
220 Elem->MsgLen, 227 Elem->MsgLen,
221 &BssType, 228 &BssType, (PCHAR) Ssid, &SsidLen, &ScanType)) {
222 (PCHAR)Ssid,
223 &SsidLen,
224 &ScanType))
225 {
226 229
227 // Check for channel load and noise hist request 230 // Check for channel load and noise hist request
228 // Suspend MSDU only at scan request, not the last two mentioned 231 // Suspend MSDU only at scan request, not the last two mentioned
229 // Suspend MSDU transmission here 232 // Suspend MSDU transmission here
230 RTMPSuspendMsduTransmission(pAd); 233 RTMPSuspendMsduTransmission(pAd);
231 234
232 // 235 //
233 // To prevent data lost. 236 // To prevent data lost.
234 // Send an NULL data with turned PSM bit on to current associated AP before SCAN progress. 237 // Send an NULL data with turned PSM bit on to current associated AP before SCAN progress.
235 // And should send an NULL data with turned PSM bit off to AP, when scan progress done 238 // And should send an NULL data with turned PSM bit off to AP, when scan progress done
236 // 239 //
237 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && (INFRA_ON(pAd))) 240 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)
238 { 241 && (INFRA_ON(pAd))) {
239 NStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer); 242 NStatus = MlmeAllocateMemory(pAd, (PVOID) & pOutBuffer);
240 if (NStatus == NDIS_STATUS_SUCCESS) 243 if (NStatus == NDIS_STATUS_SUCCESS) {
241 {
242 pHdr80211 = (PHEADER_802_11) pOutBuffer; 244 pHdr80211 = (PHEADER_802_11) pOutBuffer;
243 MgtMacHeaderInit(pAd, pHdr80211, SUBTYPE_NULL_FUNC, 1, pAd->CommonCfg.Bssid, pAd->CommonCfg.Bssid); 245 MgtMacHeaderInit(pAd, pHdr80211,
246 SUBTYPE_NULL_FUNC, 1,
247 pAd->CommonCfg.Bssid,
248 pAd->CommonCfg.Bssid);
244 pHdr80211->Duration = 0; 249 pHdr80211->Duration = 0;
245 pHdr80211->FC.Type = BTYPE_DATA; 250 pHdr80211->FC.Type = BTYPE_DATA;
246 pHdr80211->FC.PwrMgmt = PWR_SAVE; 251 pHdr80211->FC.PwrMgmt = PWR_SAVE;
247 252
248 // Send using priority queue 253 // Send using priority queue
249 MiniportMMRequest(pAd, 0, pOutBuffer, sizeof(HEADER_802_11)); 254 MiniportMMRequest(pAd, 0, pOutBuffer,
250 DBGPRINT(RT_DEBUG_TRACE, ("MlmeScanReqAction -- Send PSM Data frame for off channel RM\n")); 255 sizeof(HEADER_802_11));
256 DBGPRINT(RT_DEBUG_TRACE,
257 ("MlmeScanReqAction -- Send PSM Data frame for off channel RM\n"));
251 MlmeFreeMemory(pAd, pOutBuffer); 258 MlmeFreeMemory(pAd, pOutBuffer);
252 RTMPusecDelay(5000); 259 RTMPusecDelay(5000);
253 } 260 }
@@ -263,7 +270,7 @@ VOID MlmeScanReqAction(
263 pAd->MlmeAux.BssType = BssType; 270 pAd->MlmeAux.BssType = BssType;
264 pAd->MlmeAux.ScanType = ScanType; 271 pAd->MlmeAux.ScanType = ScanType;
265 pAd->MlmeAux.SsidLen = SsidLen; 272 pAd->MlmeAux.SsidLen = SsidLen;
266 NdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID); 273 NdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID);
267 NdisMoveMemory(pAd->MlmeAux.Ssid, Ssid, SsidLen); 274 NdisMoveMemory(pAd->MlmeAux.Ssid, Ssid, SsidLen);
268 275
269 // start from the first channel 276 // start from the first channel
@@ -275,13 +282,12 @@ VOID MlmeScanReqAction(
275 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue); 282 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
276 DBGPRINT(RT_DEBUG_TRACE, ("SYNC - BBP R4 to 20MHz.l\n")); 283 DBGPRINT(RT_DEBUG_TRACE, ("SYNC - BBP R4 to 20MHz.l\n"));
277 ScanNextChannel(pAd); 284 ScanNextChannel(pAd);
278 } 285 } else {
279 else
280 {
281 DBGPRINT_ERR(("SYNC - MlmeScanReqAction() sanity check fail\n")); 286 DBGPRINT_ERR(("SYNC - MlmeScanReqAction() sanity check fail\n"));
282 pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE; 287 pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;
283 Status = MLME_INVALID_FORMAT; 288 Status = MLME_INVALID_FORMAT;
284 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status); 289 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2,
290 &Status);
285 } 291 }
286} 292}
287 293
@@ -291,33 +297,31 @@ VOID MlmeScanReqAction(
291 MLME JOIN req state machine procedure 297 MLME JOIN req state machine procedure
292 ========================================================================== 298 ==========================================================================
293 */ 299 */
294VOID MlmeJoinReqAction( 300VOID MlmeJoinReqAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
295 IN PRTMP_ADAPTER pAd,
296 IN MLME_QUEUE_ELEM *Elem)
297{ 301{
298 UCHAR BBPValue = 0; 302 UCHAR BBPValue = 0;
299 BSS_ENTRY *pBss; 303 BSS_ENTRY *pBss;
300 BOOLEAN TimerCancelled; 304 BOOLEAN TimerCancelled;
301 HEADER_802_11 Hdr80211; 305 HEADER_802_11 Hdr80211;
302 NDIS_STATUS NStatus; 306 NDIS_STATUS NStatus;
303 ULONG FrameLen = 0; 307 ULONG FrameLen = 0;
304 PUCHAR pOutBuffer = NULL; 308 PUCHAR pOutBuffer = NULL;
305 PUCHAR pSupRate = NULL; 309 PUCHAR pSupRate = NULL;
306 UCHAR SupRateLen; 310 UCHAR SupRateLen;
307 PUCHAR pExtRate = NULL; 311 PUCHAR pExtRate = NULL;
308 UCHAR ExtRateLen; 312 UCHAR ExtRateLen;
309 UCHAR ASupRate[] = {0x8C, 0x12, 0x98, 0x24, 0xb0, 0x48, 0x60, 0x6C}; 313 UCHAR ASupRate[] = { 0x8C, 0x12, 0x98, 0x24, 0xb0, 0x48, 0x60, 0x6C };
310 UCHAR ASupRateLen = sizeof(ASupRate)/sizeof(UCHAR); 314 UCHAR ASupRateLen = sizeof(ASupRate) / sizeof(UCHAR);
311 MLME_JOIN_REQ_STRUCT *pInfo = (MLME_JOIN_REQ_STRUCT *)(Elem->Msg); 315 MLME_JOIN_REQ_STRUCT *pInfo = (MLME_JOIN_REQ_STRUCT *) (Elem->Msg);
312 316
313 DBGPRINT(RT_DEBUG_TRACE, ("SYNC - MlmeJoinReqAction(BSS #%ld)\n", pInfo->BssIdx)); 317 DBGPRINT(RT_DEBUG_TRACE,
318 ("SYNC - MlmeJoinReqAction(BSS #%ld)\n", pInfo->BssIdx));
314 319
315#ifdef RTMP_MAC_PCI 320#ifdef RTMP_MAC_PCI
316 if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)) && 321 if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)) &&
317 (IDLE_ON(pAd)) && 322 (IDLE_ON(pAd)) &&
318 (pAd->StaCfg.bRadio == TRUE) && 323 (pAd->StaCfg.bRadio == TRUE) &&
319 (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF))) 324 (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF))) {
320 {
321 RT28xxPciAsicRadioOn(pAd, GUI_IDLE_POWER_SAVE); 325 RT28xxPciAsicRadioOn(pAd, GUI_IDLE_POWER_SAVE);
322 } 326 }
323#endif // RTMP_MAC_PCI // 327#endif // RTMP_MAC_PCI //
@@ -332,8 +336,7 @@ VOID MlmeJoinReqAction(
332 COPY_MAC_ADDR(pAd->MlmeAux.Bssid, pBss->Bssid); 336 COPY_MAC_ADDR(pAd->MlmeAux.Bssid, pBss->Bssid);
333 337
334 // If AP's SSID is not hidden, it is OK for updating ssid to MlmeAux again. 338 // If AP's SSID is not hidden, it is OK for updating ssid to MlmeAux again.
335 if (pBss->Hidden == 0) 339 if (pBss->Hidden == 0) {
336 {
337 RTMPZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID); 340 RTMPZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID);
338 NdisMoveMemory(pAd->MlmeAux.Ssid, pBss->Ssid, pBss->SsidLen); 341 NdisMoveMemory(pAd->MlmeAux.Ssid, pBss->Ssid, pBss->SsidLen);
339 pAd->MlmeAux.SsidLen = pBss->SsidLen; 342 pAd->MlmeAux.SsidLen = pBss->SsidLen;
@@ -343,7 +346,6 @@ VOID MlmeJoinReqAction(
343 pAd->MlmeAux.Channel = pBss->Channel; 346 pAd->MlmeAux.Channel = pBss->Channel;
344 pAd->MlmeAux.CentralChannel = pBss->CentralChannel; 347 pAd->MlmeAux.CentralChannel = pBss->CentralChannel;
345 348
346
347 // Let BBP register at 20MHz to do scan 349 // Let BBP register at 20MHz to do scan
348 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue); 350 RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
349 BBPValue &= (~0x18); 351 BBPValue &= (~0x18);
@@ -356,35 +358,28 @@ VOID MlmeJoinReqAction(
356 AsicLockChannel(pAd, pAd->MlmeAux.Channel); 358 AsicLockChannel(pAd, pAd->MlmeAux.Channel);
357 RTMPSetTimer(&pAd->MlmeAux.BeaconTimer, JOIN_TIMEOUT); 359 RTMPSetTimer(&pAd->MlmeAux.BeaconTimer, JOIN_TIMEOUT);
358 360
359 do 361 do {
360 {
361 if (((pAd->CommonCfg.bIEEE80211H == 1) && 362 if (((pAd->CommonCfg.bIEEE80211H == 1) &&
362 (pAd->MlmeAux.Channel > 14) && 363 (pAd->MlmeAux.Channel > 14) &&
363 RadarChannelCheck(pAd, pAd->MlmeAux.Channel)) 364 RadarChannelCheck(pAd, pAd->MlmeAux.Channel))
364 ) 365 ) {
365 {
366 // 366 //
367 // We can't send any Probe request frame to meet 802.11h. 367 // We can't send any Probe request frame to meet 802.11h.
368 // 368 //
369 if (pBss->Hidden == 0) 369 if (pBss->Hidden == 0)
370 break; 370 break;
371 } 371 }
372
373 // 372 //
374 // send probe request 373 // send probe request
375 // 374 //
376 NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); 375 NStatus = MlmeAllocateMemory(pAd, &pOutBuffer);
377 if (NStatus == NDIS_STATUS_SUCCESS) 376 if (NStatus == NDIS_STATUS_SUCCESS) {
378 { 377 if (pAd->MlmeAux.Channel <= 14) {
379 if (pAd->MlmeAux.Channel <= 14)
380 {
381 pSupRate = pAd->CommonCfg.SupRate; 378 pSupRate = pAd->CommonCfg.SupRate;
382 SupRateLen = pAd->CommonCfg.SupRateLen; 379 SupRateLen = pAd->CommonCfg.SupRateLen;
383 pExtRate = pAd->CommonCfg.ExtRate; 380 pExtRate = pAd->CommonCfg.ExtRate;
384 ExtRateLen = pAd->CommonCfg.ExtRateLen; 381 ExtRateLen = pAd->CommonCfg.ExtRateLen;
385 } 382 } else {
386 else
387 {
388 // 383 //
389 // Overwrite Support Rate, CCK rate are not allowed 384 // Overwrite Support Rate, CCK rate are not allowed
390 // 385 //
@@ -394,39 +389,44 @@ VOID MlmeJoinReqAction(
394 } 389 }
395 390
396 if (pAd->MlmeAux.BssType == BSS_INFRA) 391 if (pAd->MlmeAux.BssType == BSS_INFRA)
397 MgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0, pAd->MlmeAux.Bssid, pAd->MlmeAux.Bssid); 392 MgtMacHeaderInit(pAd, &Hdr80211,
393 SUBTYPE_PROBE_REQ, 0,
394 pAd->MlmeAux.Bssid,
395 pAd->MlmeAux.Bssid);
398 else 396 else
399 MgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0, BROADCAST_ADDR, BROADCAST_ADDR); 397 MgtMacHeaderInit(pAd, &Hdr80211,
400 398 SUBTYPE_PROBE_REQ, 0,
401 MakeOutgoingFrame(pOutBuffer, &FrameLen, 399 BROADCAST_ADDR,
402 sizeof(HEADER_802_11), &Hdr80211, 400 BROADCAST_ADDR);
403 1, &SsidIe, 401
404 1, &pAd->MlmeAux.SsidLen, 402 MakeOutgoingFrame(pOutBuffer, &FrameLen,
405 pAd->MlmeAux.SsidLen, pAd->MlmeAux.Ssid, 403 sizeof(HEADER_802_11), &Hdr80211,
406 1, &SupRateIe, 404 1, &SsidIe,
407 1, &SupRateLen, 405 1, &pAd->MlmeAux.SsidLen,
408 SupRateLen, pSupRate, 406 pAd->MlmeAux.SsidLen,
409 END_OF_ARGS); 407 pAd->MlmeAux.Ssid, 1, &SupRateIe, 1,
410 408 &SupRateLen, SupRateLen, pSupRate,
411 if (ExtRateLen) 409 END_OF_ARGS);
412 { 410
411 if (ExtRateLen) {
413 ULONG Tmp; 412 ULONG Tmp;
414 MakeOutgoingFrame(pOutBuffer + FrameLen, &Tmp, 413 MakeOutgoingFrame(pOutBuffer + FrameLen, &Tmp,
415 1, &ExtRateIe, 414 1, &ExtRateIe,
416 1, &ExtRateLen, 415 1, &ExtRateLen,
417 ExtRateLen, pExtRate, 416 ExtRateLen, pExtRate,
418 END_OF_ARGS); 417 END_OF_ARGS);
419 FrameLen += Tmp; 418 FrameLen += Tmp;
420 } 419 }
421 420
422
423 MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); 421 MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
424 MlmeFreeMemory(pAd, pOutBuffer); 422 MlmeFreeMemory(pAd, pOutBuffer);
425 } 423 }
426 } while (FALSE); 424 } while (FALSE);
427 425
428 DBGPRINT(RT_DEBUG_TRACE, ("SYNC - Switch to ch %d, Wait BEACON from %02x:%02x:%02x:%02x:%02x:%02x\n", 426 DBGPRINT(RT_DEBUG_TRACE,
429 pBss->Channel, pBss->Bssid[0], pBss->Bssid[1], pBss->Bssid[2], pBss->Bssid[3], pBss->Bssid[4], pBss->Bssid[5])); 427 ("SYNC - Switch to ch %d, Wait BEACON from %02x:%02x:%02x:%02x:%02x:%02x\n",
428 pBss->Channel, pBss->Bssid[0], pBss->Bssid[1], pBss->Bssid[2],
429 pBss->Bssid[3], pBss->Bssid[4], pBss->Bssid[5]));
430 430
431 pAd->Mlme.SyncMachine.CurrState = JOIN_WAIT_BEACON; 431 pAd->Mlme.SyncMachine.CurrState = JOIN_WAIT_BEACON;
432} 432}
@@ -437,28 +437,26 @@ VOID MlmeJoinReqAction(
437 MLME START Request state machine procedure, starting an IBSS 437 MLME START Request state machine procedure, starting an IBSS
438 ========================================================================== 438 ==========================================================================
439 */ 439 */
440VOID MlmeStartReqAction( 440VOID MlmeStartReqAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
441 IN PRTMP_ADAPTER pAd,
442 IN MLME_QUEUE_ELEM *Elem)
443{ 441{
444 UCHAR Ssid[MAX_LEN_OF_SSID], SsidLen; 442 UCHAR Ssid[MAX_LEN_OF_SSID], SsidLen;
445 BOOLEAN TimerCancelled; 443 BOOLEAN TimerCancelled;
446 444
447 // New for WPA security suites 445 // New for WPA security suites
448 UCHAR VarIE[MAX_VIE_LEN]; // Total VIE length = MAX_VIE_LEN - -5 446 UCHAR VarIE[MAX_VIE_LEN]; // Total VIE length = MAX_VIE_LEN - -5
449 NDIS_802_11_VARIABLE_IEs *pVIE = NULL; 447 NDIS_802_11_VARIABLE_IEs *pVIE = NULL;
450 LARGE_INTEGER TimeStamp; 448 LARGE_INTEGER TimeStamp;
451 BOOLEAN Privacy; 449 BOOLEAN Privacy;
452 USHORT Status; 450 USHORT Status;
453 451
454 // Init Variable IE structure 452 // Init Variable IE structure
455 pVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE; 453 pVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE;
456 pVIE->Length = 0; 454 pVIE->Length = 0;
457 TimeStamp.u.LowPart = 0; 455 TimeStamp.u.LowPart = 0;
458 TimeStamp.u.HighPart = 0; 456 TimeStamp.u.HighPart = 0;
459 457
460 if (MlmeStartReqSanity(pAd, Elem->Msg, Elem->MsgLen, (PCHAR)Ssid, &SsidLen)) 458 if (MlmeStartReqSanity
461 { 459 (pAd, Elem->Msg, Elem->MsgLen, (PCHAR) Ssid, &SsidLen)) {
462 // reset all the timers 460 // reset all the timers
463 RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &TimerCancelled); 461 RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &TimerCancelled);
464 RTMPCancelTimer(&pAd->MlmeAux.BeaconTimer, &TimerCancelled); 462 RTMPCancelTimer(&pAd->MlmeAux.BeaconTimer, &TimerCancelled);
@@ -466,67 +464,83 @@ VOID MlmeStartReqAction(
466 // 464 //
467 // Start a new IBSS. All IBSS parameters are decided now.... 465 // Start a new IBSS. All IBSS parameters are decided now....
468 // 466 //
469 DBGPRINT(RT_DEBUG_TRACE, ("MlmeStartReqAction - Start a new IBSS. All IBSS parameters are decided now.... \n")); 467 DBGPRINT(RT_DEBUG_TRACE,
470 pAd->MlmeAux.BssType = BSS_ADHOC; 468 ("MlmeStartReqAction - Start a new IBSS. All IBSS parameters are decided now.... \n"));
469 pAd->MlmeAux.BssType = BSS_ADHOC;
471 NdisMoveMemory(pAd->MlmeAux.Ssid, Ssid, SsidLen); 470 NdisMoveMemory(pAd->MlmeAux.Ssid, Ssid, SsidLen);
472 pAd->MlmeAux.SsidLen = SsidLen; 471 pAd->MlmeAux.SsidLen = SsidLen;
473 472
474 // generate a radom number as BSSID 473 // generate a radom number as BSSID
475 MacAddrRandomBssid(pAd, pAd->MlmeAux.Bssid); 474 MacAddrRandomBssid(pAd, pAd->MlmeAux.Bssid);
476 DBGPRINT(RT_DEBUG_TRACE, ("MlmeStartReqAction - generate a radom number as BSSID \n")); 475 DBGPRINT(RT_DEBUG_TRACE,
477 476 ("MlmeStartReqAction - generate a radom number as BSSID \n"));
478 Privacy = (pAd->StaCfg.WepStatus == Ndis802_11Encryption1Enabled) || 477
479 (pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled) || 478 Privacy =
480 (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled); 479 (pAd->StaCfg.WepStatus == Ndis802_11Encryption1Enabled)
481 pAd->MlmeAux.CapabilityInfo = CAP_GENERATE(0,1,Privacy, (pAd->CommonCfg.TxPreamble == Rt802_11PreambleShort), 1, 0); 480 || (pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled)
482 pAd->MlmeAux.BeaconPeriod = pAd->CommonCfg.BeaconPeriod; 481 || (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled);
483 pAd->MlmeAux.AtimWin = pAd->StaCfg.AtimWin; 482 pAd->MlmeAux.CapabilityInfo =
484 pAd->MlmeAux.Channel = pAd->CommonCfg.Channel; 483 CAP_GENERATE(0, 1, Privacy,
485 484 (pAd->CommonCfg.TxPreamble ==
486 pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel; 485 Rt802_11PreambleShort), 1, 0);
487 pAd->MlmeAux.CentralChannel = pAd->CommonCfg.CentralChannel; 486 pAd->MlmeAux.BeaconPeriod = pAd->CommonCfg.BeaconPeriod;
488 487 pAd->MlmeAux.AtimWin = pAd->StaCfg.AtimWin;
489 pAd->MlmeAux.SupRateLen= pAd->CommonCfg.SupRateLen; 488 pAd->MlmeAux.Channel = pAd->CommonCfg.Channel;
490 NdisMoveMemory(pAd->MlmeAux.SupRate, pAd->CommonCfg.SupRate, MAX_LEN_OF_SUPPORTED_RATES); 489
491 RTMPCheckRates(pAd, pAd->MlmeAux.SupRate, &pAd->MlmeAux.SupRateLen); 490 pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;
491 pAd->MlmeAux.CentralChannel = pAd->CommonCfg.CentralChannel;
492
493 pAd->MlmeAux.SupRateLen = pAd->CommonCfg.SupRateLen;
494 NdisMoveMemory(pAd->MlmeAux.SupRate, pAd->CommonCfg.SupRate,
495 MAX_LEN_OF_SUPPORTED_RATES);
496 RTMPCheckRates(pAd, pAd->MlmeAux.SupRate,
497 &pAd->MlmeAux.SupRateLen);
492 pAd->MlmeAux.ExtRateLen = pAd->CommonCfg.ExtRateLen; 498 pAd->MlmeAux.ExtRateLen = pAd->CommonCfg.ExtRateLen;
493 NdisMoveMemory(pAd->MlmeAux.ExtRate, pAd->CommonCfg.ExtRate, MAX_LEN_OF_SUPPORTED_RATES); 499 NdisMoveMemory(pAd->MlmeAux.ExtRate, pAd->CommonCfg.ExtRate,
494 RTMPCheckRates(pAd, pAd->MlmeAux.ExtRate, &pAd->MlmeAux.ExtRateLen); 500 MAX_LEN_OF_SUPPORTED_RATES);
495 501 RTMPCheckRates(pAd, pAd->MlmeAux.ExtRate,
496 if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) 502 &pAd->MlmeAux.ExtRateLen);
497 { 503
498 RTMPUpdateHTIE(&pAd->CommonCfg.DesiredHtPhy, &pAd->StaCfg.DesiredHtPhyInfo.MCSSet[0], &pAd->MlmeAux.HtCapability, &pAd->MlmeAux.AddHtInfo); 504 if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) {
505 RTMPUpdateHTIE(&pAd->CommonCfg.DesiredHtPhy,
506 &pAd->StaCfg.DesiredHtPhyInfo.MCSSet[0],
507 &pAd->MlmeAux.HtCapability,
508 &pAd->MlmeAux.AddHtInfo);
499 pAd->MlmeAux.HtCapabilityLen = sizeof(HT_CAPABILITY_IE); 509 pAd->MlmeAux.HtCapabilityLen = sizeof(HT_CAPABILITY_IE);
500 // Not turn pAd->StaActive.SupportedHtPhy.bHtEnable = TRUE here. 510 // Not turn pAd->StaActive.SupportedHtPhy.bHtEnable = TRUE here.
501 DBGPRINT(RT_DEBUG_TRACE, ("SYNC -pAd->StaActive.SupportedHtPhy.bHtEnable = TRUE\n")); 511 DBGPRINT(RT_DEBUG_TRACE,
502 } 512 ("SYNC -pAd->StaActive.SupportedHtPhy.bHtEnable = TRUE\n"));
503 else 513 } else {
504 {
505 pAd->MlmeAux.HtCapabilityLen = 0; 514 pAd->MlmeAux.HtCapabilityLen = 0;
506 pAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE; 515 pAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE;
507 NdisZeroMemory(&pAd->StaActive.SupportedPhyInfo.MCSSet[0], 16); 516 NdisZeroMemory(&pAd->StaActive.SupportedPhyInfo.
517 MCSSet[0], 16);
508 } 518 }
509 // temporarily not support QOS in IBSS 519 // temporarily not support QOS in IBSS
510 NdisZeroMemory(&pAd->MlmeAux.APEdcaParm, sizeof(EDCA_PARM)); 520 NdisZeroMemory(&pAd->MlmeAux.APEdcaParm, sizeof(EDCA_PARM));
511 NdisZeroMemory(&pAd->MlmeAux.APQbssLoad, sizeof(QBSS_LOAD_PARM)); 521 NdisZeroMemory(&pAd->MlmeAux.APQbssLoad,
512 NdisZeroMemory(&pAd->MlmeAux.APQosCapability, sizeof(QOS_CAPABILITY_PARM)); 522 sizeof(QBSS_LOAD_PARM));
523 NdisZeroMemory(&pAd->MlmeAux.APQosCapability,
524 sizeof(QOS_CAPABILITY_PARM));
513 525
514 AsicSwitchChannel(pAd, pAd->MlmeAux.Channel, FALSE); 526 AsicSwitchChannel(pAd, pAd->MlmeAux.Channel, FALSE);
515 AsicLockChannel(pAd, pAd->MlmeAux.Channel); 527 AsicLockChannel(pAd, pAd->MlmeAux.Channel);
516 528
517 DBGPRINT(RT_DEBUG_TRACE, ("SYNC - MlmeStartReqAction(ch= %d,sup rates= %d, ext rates=%d)\n", 529 DBGPRINT(RT_DEBUG_TRACE,
518 pAd->MlmeAux.Channel, pAd->MlmeAux.SupRateLen, pAd->MlmeAux.ExtRateLen)); 530 ("SYNC - MlmeStartReqAction(ch= %d,sup rates= %d, ext rates=%d)\n",
531 pAd->MlmeAux.Channel, pAd->MlmeAux.SupRateLen,
532 pAd->MlmeAux.ExtRateLen));
519 533
520 pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE; 534 pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;
521 Status = MLME_SUCCESS; 535 Status = MLME_SUCCESS;
522 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_START_CONF, 2, &Status); 536 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_START_CONF, 2,
523 } 537 &Status);
524 else 538 } else {
525 {
526 DBGPRINT_ERR(("SYNC - MlmeStartReqAction() sanity check fail.\n")); 539 DBGPRINT_ERR(("SYNC - MlmeStartReqAction() sanity check fail.\n"));
527 pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE; 540 pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;
528 Status = MLME_INVALID_FORMAT; 541 Status = MLME_INVALID_FORMAT;
529 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_START_CONF, 2, &Status); 542 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_START_CONF, 2,
543 &Status);
530 } 544 }
531} 545}
532 546
@@ -536,35 +550,33 @@ VOID MlmeStartReqAction(
536 peer sends beacon back when scanning 550 peer sends beacon back when scanning
537 ========================================================================== 551 ==========================================================================
538 */ 552 */
539VOID PeerBeaconAtScanAction( 553VOID PeerBeaconAtScanAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
540 IN PRTMP_ADAPTER pAd,
541 IN MLME_QUEUE_ELEM *Elem)
542{ 554{
543 UCHAR Bssid[MAC_ADDR_LEN], Addr2[MAC_ADDR_LEN]; 555 UCHAR Bssid[MAC_ADDR_LEN], Addr2[MAC_ADDR_LEN];
544 UCHAR Ssid[MAX_LEN_OF_SSID], BssType, Channel, NewChannel, 556 UCHAR Ssid[MAX_LEN_OF_SSID], BssType, Channel, NewChannel,
545 SsidLen, DtimCount, DtimPeriod, BcastFlag, MessageToMe; 557 SsidLen, DtimCount, DtimPeriod, BcastFlag, MessageToMe;
546 CF_PARM CfParm; 558 CF_PARM CfParm;
547 USHORT BeaconPeriod, AtimWin, CapabilityInfo; 559 USHORT BeaconPeriod, AtimWin, CapabilityInfo;
548 PFRAME_802_11 pFrame; 560 PFRAME_802_11 pFrame;
549 LARGE_INTEGER TimeStamp; 561 LARGE_INTEGER TimeStamp;
550 UCHAR Erp; 562 UCHAR Erp;
551 UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRate[MAX_LEN_OF_SUPPORTED_RATES]; 563 UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES],
552 UCHAR SupRateLen, ExtRateLen; 564 ExtRate[MAX_LEN_OF_SUPPORTED_RATES];
553 USHORT LenVIE; 565 UCHAR SupRateLen, ExtRateLen;
554 UCHAR CkipFlag; 566 USHORT LenVIE;
555 UCHAR AironetCellPowerLimit; 567 UCHAR CkipFlag;
556 EDCA_PARM EdcaParm; 568 UCHAR AironetCellPowerLimit;
557 QBSS_LOAD_PARM QbssLoad; 569 EDCA_PARM EdcaParm;
570 QBSS_LOAD_PARM QbssLoad;
558 QOS_CAPABILITY_PARM QosCapability; 571 QOS_CAPABILITY_PARM QosCapability;
559 ULONG RalinkIe; 572 ULONG RalinkIe;
560 UCHAR VarIE[MAX_VIE_LEN]; // Total VIE length = MAX_VIE_LEN - -5 573 UCHAR VarIE[MAX_VIE_LEN]; // Total VIE length = MAX_VIE_LEN - -5
561 NDIS_802_11_VARIABLE_IEs *pVIE = NULL; 574 NDIS_802_11_VARIABLE_IEs *pVIE = NULL;
562 HT_CAPABILITY_IE HtCapability; 575 HT_CAPABILITY_IE HtCapability;
563 ADD_HT_INFO_IE AddHtInfo; // AP might use this additional ht info IE 576 ADD_HT_INFO_IE AddHtInfo; // AP might use this additional ht info IE
564 UCHAR HtCapabilityLen = 0, PreNHtCapabilityLen = 0; 577 UCHAR HtCapabilityLen = 0, PreNHtCapabilityLen = 0;
565 UCHAR AddHtInfoLen; 578 UCHAR AddHtInfoLen;
566 UCHAR NewExtChannelOffset = 0xff; 579 UCHAR NewExtChannelOffset = 0xff;
567
568 580
569 // NdisFillMemory(Ssid, MAX_LEN_OF_SSID, 0x00); 581 // NdisFillMemory(Ssid, MAX_LEN_OF_SSID, 0x00);
570 pFrame = (PFRAME_802_11) Elem->Msg; 582 pFrame = (PFRAME_802_11) Elem->Msg;
@@ -572,49 +584,46 @@ VOID PeerBeaconAtScanAction(
572 pVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE; 584 pVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE;
573 pVIE->Length = 0; 585 pVIE->Length = 0;
574 586
575 RTMPZeroMemory(&HtCapability, sizeof(HtCapability)); 587 RTMPZeroMemory(&HtCapability, sizeof(HtCapability));
576 RTMPZeroMemory(&AddHtInfo, sizeof(ADD_HT_INFO_IE)); 588 RTMPZeroMemory(&AddHtInfo, sizeof(ADD_HT_INFO_IE));
577 589
578 if (PeerBeaconAndProbeRspSanity(pAd, 590 if (PeerBeaconAndProbeRspSanity(pAd,
579 Elem->Msg, 591 Elem->Msg,
580 Elem->MsgLen, 592 Elem->MsgLen,
581 Elem->Channel, 593 Elem->Channel,
582 Addr2, 594 Addr2,
583 Bssid, 595 Bssid,
584 (PCHAR)Ssid, 596 (PCHAR) Ssid,
585 &SsidLen, 597 &SsidLen,
586 &BssType, 598 &BssType,
587 &BeaconPeriod, 599 &BeaconPeriod,
588 &Channel, 600 &Channel,
589 &NewChannel, 601 &NewChannel,
590 &TimeStamp, 602 &TimeStamp,
591 &CfParm, 603 &CfParm,
592 &AtimWin, 604 &AtimWin,
593 &CapabilityInfo, 605 &CapabilityInfo,
594 &Erp, 606 &Erp,
595 &DtimCount, 607 &DtimCount,
596 &DtimPeriod, 608 &DtimPeriod,
597 &BcastFlag, 609 &BcastFlag,
598 &MessageToMe, 610 &MessageToMe,
599 SupRate, 611 SupRate,
600 &SupRateLen, 612 &SupRateLen,
601 ExtRate, 613 ExtRate,
602 &ExtRateLen, 614 &ExtRateLen,
603 &CkipFlag, 615 &CkipFlag,
604 &AironetCellPowerLimit, 616 &AironetCellPowerLimit,
605 &EdcaParm, 617 &EdcaParm,
606 &QbssLoad, 618 &QbssLoad,
607 &QosCapability, 619 &QosCapability,
608 &RalinkIe, 620 &RalinkIe,
609 &HtCapabilityLen, 621 &HtCapabilityLen,
610 &PreNHtCapabilityLen, 622 &PreNHtCapabilityLen,
611 &HtCapability, 623 &HtCapability,
612 &AddHtInfoLen, 624 &AddHtInfoLen,
613 &AddHtInfo, 625 &AddHtInfo,
614 &NewExtChannelOffset, 626 &NewExtChannelOffset, &LenVIE, pVIE)) {
615 &LenVIE,
616 pVIE))
617 {
618 ULONG Idx; 627 ULONG Idx;
619 CHAR Rssi = 0; 628 CHAR Rssi = 0;
620 629
@@ -622,22 +631,32 @@ VOID PeerBeaconAtScanAction(
622 if (Idx != BSS_NOT_FOUND) 631 if (Idx != BSS_NOT_FOUND)
623 Rssi = pAd->ScanTab.BssEntry[Idx].Rssi; 632 Rssi = pAd->ScanTab.BssEntry[Idx].Rssi;
624 633
625 Rssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, Elem->Rssi0, RSSI_0), ConvertToRssi(pAd, Elem->Rssi1, RSSI_1), ConvertToRssi(pAd, Elem->Rssi2, RSSI_2)); 634 Rssi =
635 RTMPMaxRssi(pAd, ConvertToRssi(pAd, Elem->Rssi0, RSSI_0),
636 ConvertToRssi(pAd, Elem->Rssi1, RSSI_1),
637 ConvertToRssi(pAd, Elem->Rssi2, RSSI_2));
626 638
627 if ((HtCapabilityLen > 0) || (PreNHtCapabilityLen > 0)) 639 if ((HtCapabilityLen > 0) || (PreNHtCapabilityLen > 0))
628 HtCapabilityLen = SIZE_HT_CAP_IE; 640 HtCapabilityLen = SIZE_HT_CAP_IE;
629 641
630 Idx = BssTableSetEntry(pAd, &pAd->ScanTab, Bssid, (PCHAR)Ssid, SsidLen, BssType, BeaconPeriod, 642 Idx =
631 &CfParm, AtimWin, CapabilityInfo, SupRate, SupRateLen, ExtRate, ExtRateLen, &HtCapability, 643 BssTableSetEntry(pAd, &pAd->ScanTab, Bssid, (PCHAR) Ssid,
632 &AddHtInfo, HtCapabilityLen, AddHtInfoLen, NewExtChannelOffset, Channel, Rssi, TimeStamp, CkipFlag, 644 SsidLen, BssType, BeaconPeriod, &CfParm,
633 &EdcaParm, &QosCapability, &QbssLoad, LenVIE, pVIE); 645 AtimWin, CapabilityInfo, SupRate,
634 646 SupRateLen, ExtRate, ExtRateLen,
635 if (Idx != BSS_NOT_FOUND) 647 &HtCapability, &AddHtInfo, HtCapabilityLen,
636 { 648 AddHtInfoLen, NewExtChannelOffset, Channel,
637 NdisMoveMemory(pAd->ScanTab.BssEntry[Idx].PTSF, &Elem->Msg[24], 4); 649 Rssi, TimeStamp, CkipFlag, &EdcaParm,
638 NdisMoveMemory(&pAd->ScanTab.BssEntry[Idx].TTSF[0], &Elem->TimeStamp.u.LowPart, 4); 650 &QosCapability, &QbssLoad, LenVIE, pVIE);
639 NdisMoveMemory(&pAd->ScanTab.BssEntry[Idx].TTSF[4], &Elem->TimeStamp.u.LowPart, 4); 651
640 } 652 if (Idx != BSS_NOT_FOUND) {
653 NdisMoveMemory(pAd->ScanTab.BssEntry[Idx].PTSF,
654 &Elem->Msg[24], 4);
655 NdisMoveMemory(&pAd->ScanTab.BssEntry[Idx].TTSF[0],
656 &Elem->TimeStamp.u.LowPart, 4);
657 NdisMoveMemory(&pAd->ScanTab.BssEntry[Idx].TTSF[4],
658 &Elem->TimeStamp.u.LowPart, 4);
659 }
641 660
642 } 661 }
643 // sanity check fail, ignored 662 // sanity check fail, ignored
@@ -649,88 +668,85 @@ VOID PeerBeaconAtScanAction(
649 When waiting joining the (I)BSS, beacon received from external 668 When waiting joining the (I)BSS, beacon received from external
650 ========================================================================== 669 ==========================================================================
651 */ 670 */
652VOID PeerBeaconAtJoinAction( 671VOID PeerBeaconAtJoinAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
653 IN PRTMP_ADAPTER pAd,
654 IN MLME_QUEUE_ELEM *Elem)
655{ 672{
656 UCHAR Bssid[MAC_ADDR_LEN], Addr2[MAC_ADDR_LEN]; 673 UCHAR Bssid[MAC_ADDR_LEN], Addr2[MAC_ADDR_LEN];
657 UCHAR Ssid[MAX_LEN_OF_SSID], SsidLen, BssType, Channel, MessageToMe, 674 UCHAR Ssid[MAX_LEN_OF_SSID], SsidLen, BssType, Channel, MessageToMe,
658 DtimCount, DtimPeriod, BcastFlag, NewChannel; 675 DtimCount, DtimPeriod, BcastFlag, NewChannel;
659 LARGE_INTEGER TimeStamp; 676 LARGE_INTEGER TimeStamp;
660 USHORT BeaconPeriod, AtimWin, CapabilityInfo; 677 USHORT BeaconPeriod, AtimWin, CapabilityInfo;
661 CF_PARM Cf; 678 CF_PARM Cf;
662 BOOLEAN TimerCancelled; 679 BOOLEAN TimerCancelled;
663 UCHAR Erp; 680 UCHAR Erp;
664 UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRate[MAX_LEN_OF_SUPPORTED_RATES]; 681 UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES],
665 UCHAR SupRateLen, ExtRateLen; 682 ExtRate[MAX_LEN_OF_SUPPORTED_RATES];
666 UCHAR CkipFlag; 683 UCHAR SupRateLen, ExtRateLen;
667 USHORT LenVIE; 684 UCHAR CkipFlag;
668 UCHAR AironetCellPowerLimit; 685 USHORT LenVIE;
669 EDCA_PARM EdcaParm; 686 UCHAR AironetCellPowerLimit;
670 QBSS_LOAD_PARM QbssLoad; 687 EDCA_PARM EdcaParm;
688 QBSS_LOAD_PARM QbssLoad;
671 QOS_CAPABILITY_PARM QosCapability; 689 QOS_CAPABILITY_PARM QosCapability;
672 USHORT Status; 690 USHORT Status;
673 UCHAR VarIE[MAX_VIE_LEN]; // Total VIE length = MAX_VIE_LEN - -5 691 UCHAR VarIE[MAX_VIE_LEN]; // Total VIE length = MAX_VIE_LEN - -5
674 NDIS_802_11_VARIABLE_IEs *pVIE = NULL; 692 NDIS_802_11_VARIABLE_IEs *pVIE = NULL;
675 ULONG RalinkIe; 693 ULONG RalinkIe;
676 ULONG Idx; 694 ULONG Idx;
677 HT_CAPABILITY_IE HtCapability; 695 HT_CAPABILITY_IE HtCapability;
678 ADD_HT_INFO_IE AddHtInfo; // AP might use this additional ht info IE 696 ADD_HT_INFO_IE AddHtInfo; // AP might use this additional ht info IE
679 UCHAR HtCapabilityLen = 0, PreNHtCapabilityLen = 0; 697 UCHAR HtCapabilityLen = 0, PreNHtCapabilityLen = 0;
680 UCHAR AddHtInfoLen; 698 UCHAR AddHtInfoLen;
681 UCHAR NewExtChannelOffset = 0xff; 699 UCHAR NewExtChannelOffset = 0xff;
682 UCHAR CentralChannel; 700 UCHAR CentralChannel;
683 BOOLEAN bAllowNrate = FALSE; 701 BOOLEAN bAllowNrate = FALSE;
684 702
685 // Init Variable IE structure 703 // Init Variable IE structure
686 pVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE; 704 pVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE;
687 pVIE->Length = 0; 705 pVIE->Length = 0;
688 RTMPZeroMemory(&HtCapability, sizeof(HtCapability)); 706 RTMPZeroMemory(&HtCapability, sizeof(HtCapability));
689 RTMPZeroMemory(&AddHtInfo, sizeof(ADD_HT_INFO_IE)); 707 RTMPZeroMemory(&AddHtInfo, sizeof(ADD_HT_INFO_IE));
690 708
691
692 if (PeerBeaconAndProbeRspSanity(pAd, 709 if (PeerBeaconAndProbeRspSanity(pAd,
693 Elem->Msg, 710 Elem->Msg,
694 Elem->MsgLen, 711 Elem->MsgLen,
695 Elem->Channel, 712 Elem->Channel,
696 Addr2, 713 Addr2,
697 Bssid, 714 Bssid,
698 (PCHAR)Ssid, 715 (PCHAR) Ssid,
699 &SsidLen, 716 &SsidLen,
700 &BssType, 717 &BssType,
701 &BeaconPeriod, 718 &BeaconPeriod,
702 &Channel, 719 &Channel,
703 &NewChannel, 720 &NewChannel,
704 &TimeStamp, 721 &TimeStamp,
705 &Cf, 722 &Cf,
706 &AtimWin, 723 &AtimWin,
707 &CapabilityInfo, 724 &CapabilityInfo,
708 &Erp, 725 &Erp,
709 &DtimCount, 726 &DtimCount,
710 &DtimPeriod, 727 &DtimPeriod,
711 &BcastFlag, 728 &BcastFlag,
712 &MessageToMe, 729 &MessageToMe,
713 SupRate, 730 SupRate,
714 &SupRateLen, 731 &SupRateLen,
715 ExtRate, 732 ExtRate,
716 &ExtRateLen, 733 &ExtRateLen,
717 &CkipFlag, 734 &CkipFlag,
718 &AironetCellPowerLimit, 735 &AironetCellPowerLimit,
719 &EdcaParm, 736 &EdcaParm,
720 &QbssLoad, 737 &QbssLoad,
721 &QosCapability, 738 &QosCapability,
722 &RalinkIe, 739 &RalinkIe,
723 &HtCapabilityLen, 740 &HtCapabilityLen,
724 &PreNHtCapabilityLen, 741 &PreNHtCapabilityLen,
725 &HtCapability, 742 &HtCapability,
726 &AddHtInfoLen, 743 &AddHtInfoLen,
727 &AddHtInfo, 744 &AddHtInfo,
728 &NewExtChannelOffset, 745 &NewExtChannelOffset, &LenVIE, pVIE)) {
729 &LenVIE,
730 pVIE))
731 {
732 // Disqualify 11b only adhoc when we are in 11g only adhoc mode 746 // Disqualify 11b only adhoc when we are in 11g only adhoc mode
733 if ((BssType == BSS_ADHOC) && (pAd->CommonCfg.PhyMode == PHY_11G) && ((SupRateLen+ExtRateLen)< 12)) 747 if ((BssType == BSS_ADHOC)
748 && (pAd->CommonCfg.PhyMode == PHY_11G)
749 && ((SupRateLen + ExtRateLen) < 12))
734 return; 750 return;
735 751
736 // BEACON from desired BSS/IBSS found. We should be able to decide most 752 // BEACON from desired BSS/IBSS found. We should be able to decide most
@@ -739,61 +755,120 @@ VOID PeerBeaconAtJoinAction(
739 // Do we need to receover back all parameters belonging to previous BSS? 755 // Do we need to receover back all parameters belonging to previous BSS?
740 // A. Should be not. There's no back-door recover to previous AP. It still need 756 // A. Should be not. There's no back-door recover to previous AP. It still need
741 // a new JOIN-AUTH-ASSOC sequence. 757 // a new JOIN-AUTH-ASSOC sequence.
742 if (MAC_ADDR_EQUAL(pAd->MlmeAux.Bssid, Bssid)) 758 if (MAC_ADDR_EQUAL(pAd->MlmeAux.Bssid, Bssid)) {
743 { 759 DBGPRINT(RT_DEBUG_TRACE,
744 DBGPRINT(RT_DEBUG_TRACE, ("SYNC - receive desired BEACON at JoinWaitBeacon... Channel = %d\n", Channel)); 760 ("SYNC - receive desired BEACON at JoinWaitBeacon... Channel = %d\n",
745 RTMPCancelTimer(&pAd->MlmeAux.BeaconTimer, &TimerCancelled); 761 Channel));
762 RTMPCancelTimer(&pAd->MlmeAux.BeaconTimer,
763 &TimerCancelled);
746 764
747 // Update RSSI to prevent No signal display when cards first initialized 765 // Update RSSI to prevent No signal display when cards first initialized
748 pAd->StaCfg.RssiSample.LastRssi0 = ConvertToRssi(pAd, Elem->Rssi0, RSSI_0); 766 pAd->StaCfg.RssiSample.LastRssi0 =
749 pAd->StaCfg.RssiSample.LastRssi1 = ConvertToRssi(pAd, Elem->Rssi1, RSSI_1); 767 ConvertToRssi(pAd, Elem->Rssi0, RSSI_0);
750 pAd->StaCfg.RssiSample.LastRssi2 = ConvertToRssi(pAd, Elem->Rssi2, RSSI_2); 768 pAd->StaCfg.RssiSample.LastRssi1 =
751 pAd->StaCfg.RssiSample.AvgRssi0 = pAd->StaCfg.RssiSample.LastRssi0; 769 ConvertToRssi(pAd, Elem->Rssi1, RSSI_1);
752 pAd->StaCfg.RssiSample.AvgRssi0X8 = pAd->StaCfg.RssiSample.AvgRssi0 << 3; 770 pAd->StaCfg.RssiSample.LastRssi2 =
753 pAd->StaCfg.RssiSample.AvgRssi1 = pAd->StaCfg.RssiSample.LastRssi1; 771 ConvertToRssi(pAd, Elem->Rssi2, RSSI_2);
754 pAd->StaCfg.RssiSample.AvgRssi1X8 = pAd->StaCfg.RssiSample.AvgRssi1 << 3; 772 pAd->StaCfg.RssiSample.AvgRssi0 =
755 pAd->StaCfg.RssiSample.AvgRssi2 = pAd->StaCfg.RssiSample.LastRssi2; 773 pAd->StaCfg.RssiSample.LastRssi0;
756 pAd->StaCfg.RssiSample.AvgRssi2X8 = pAd->StaCfg.RssiSample.AvgRssi2 << 3; 774 pAd->StaCfg.RssiSample.AvgRssi0X8 =
775 pAd->StaCfg.RssiSample.AvgRssi0 << 3;
776 pAd->StaCfg.RssiSample.AvgRssi1 =
777 pAd->StaCfg.RssiSample.LastRssi1;
778 pAd->StaCfg.RssiSample.AvgRssi1X8 =
779 pAd->StaCfg.RssiSample.AvgRssi1 << 3;
780 pAd->StaCfg.RssiSample.AvgRssi2 =
781 pAd->StaCfg.RssiSample.LastRssi2;
782 pAd->StaCfg.RssiSample.AvgRssi2X8 =
783 pAd->StaCfg.RssiSample.AvgRssi2 << 3;
757 784
758 // 785 //
759 // We need to check if SSID only set to any, then we can record the current SSID. 786 // We need to check if SSID only set to any, then we can record the current SSID.
760 // Otherwise will cause hidden SSID association failed. 787 // Otherwise will cause hidden SSID association failed.
761 // 788 //
762 if (pAd->MlmeAux.SsidLen == 0) 789 if (pAd->MlmeAux.SsidLen == 0) {
763 { 790 NdisMoveMemory(pAd->MlmeAux.Ssid, Ssid,
764 NdisMoveMemory(pAd->MlmeAux.Ssid, Ssid, SsidLen); 791 SsidLen);
765 pAd->MlmeAux.SsidLen = SsidLen; 792 pAd->MlmeAux.SsidLen = SsidLen;
766 } 793 } else {
767 else 794 Idx =
768 { 795 BssSsidTableSearch(&pAd->ScanTab, Bssid,
769 Idx = BssSsidTableSearch(&pAd->ScanTab, Bssid, pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen, Channel); 796 pAd->MlmeAux.Ssid,
770 797 pAd->MlmeAux.SsidLen,
771 if (Idx == BSS_NOT_FOUND) 798 Channel);
772 { 799
800 if (Idx == BSS_NOT_FOUND) {
773 CHAR Rssi = 0; 801 CHAR Rssi = 0;
774 Rssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, Elem->Rssi0, RSSI_0), ConvertToRssi(pAd, Elem->Rssi1, RSSI_1), ConvertToRssi(pAd, Elem->Rssi2, RSSI_2)); 802 Rssi =
775 Idx = BssTableSetEntry(pAd, &pAd->ScanTab, Bssid, (CHAR *) Ssid, SsidLen, BssType, BeaconPeriod, 803 RTMPMaxRssi(pAd,
776 &Cf, AtimWin, CapabilityInfo, SupRate, SupRateLen, ExtRate, ExtRateLen, &HtCapability, 804 ConvertToRssi(pAd,
777 &AddHtInfo, HtCapabilityLen, AddHtInfoLen, NewExtChannelOffset, Channel, Rssi, TimeStamp, CkipFlag, 805 Elem->
778 &EdcaParm, &QosCapability, &QbssLoad, LenVIE, pVIE); 806 Rssi0,
779 if (Idx != BSS_NOT_FOUND) 807 RSSI_0),
780 { 808 ConvertToRssi(pAd,
781 NdisMoveMemory(pAd->ScanTab.BssEntry[Idx].PTSF, &Elem->Msg[24], 4); 809 Elem->
782 NdisMoveMemory(&pAd->ScanTab.BssEntry[Idx].TTSF[0], &Elem->TimeStamp.u.LowPart, 4); 810 Rssi1,
783 NdisMoveMemory(&pAd->ScanTab.BssEntry[Idx].TTSF[4], &Elem->TimeStamp.u.LowPart, 4); 811 RSSI_1),
784 CapabilityInfo = pAd->ScanTab.BssEntry[Idx].CapabilityInfo; 812 ConvertToRssi(pAd,
813 Elem->
814 Rssi2,
815 RSSI_2));
816 Idx =
817 BssTableSetEntry(pAd, &pAd->ScanTab,
818 Bssid,
819 (CHAR *) Ssid,
820 SsidLen, BssType,
821 BeaconPeriod, &Cf,
822 AtimWin,
823 CapabilityInfo,
824 SupRate,
825 SupRateLen,
826 ExtRate,
827 ExtRateLen,
828 &HtCapability,
829 &AddHtInfo,
830 HtCapabilityLen,
831 AddHtInfoLen,
832 NewExtChannelOffset,
833 Channel, Rssi,
834 TimeStamp,
835 CkipFlag,
836 &EdcaParm,
837 &QosCapability,
838 &QbssLoad, LenVIE,
839 pVIE);
840 if (Idx != BSS_NOT_FOUND) {
841 NdisMoveMemory(pAd->ScanTab.
842 BssEntry[Idx].
843 PTSF,
844 &Elem->Msg[24],
845 4);
846 NdisMoveMemory(&pAd->ScanTab.
847 BssEntry[Idx].
848 TTSF[0],
849 &Elem->TimeStamp.
850 u.LowPart, 4);
851 NdisMoveMemory(&pAd->ScanTab.
852 BssEntry[Idx].
853 TTSF[4],
854 &Elem->TimeStamp.
855 u.LowPart, 4);
856 CapabilityInfo =
857 pAd->ScanTab.BssEntry[Idx].
858 CapabilityInfo;
785 } 859 }
786 } 860 } else {
787 else
788 {
789 // 861 //
790 // Multiple SSID case, used correct CapabilityInfo 862 // Multiple SSID case, used correct CapabilityInfo
791 // 863 //
792 CapabilityInfo = pAd->ScanTab.BssEntry[Idx].CapabilityInfo; 864 CapabilityInfo =
865 pAd->ScanTab.BssEntry[Idx].
866 CapabilityInfo;
793 } 867 }
794 } 868 }
795 NdisMoveMemory(pAd->MlmeAux.Bssid, Bssid, MAC_ADDR_LEN); 869 NdisMoveMemory(pAd->MlmeAux.Bssid, Bssid, MAC_ADDR_LEN);
796 pAd->MlmeAux.CapabilityInfo = CapabilityInfo & SUPPORTED_CAPABILITY_INFO; 870 pAd->MlmeAux.CapabilityInfo =
871 CapabilityInfo & SUPPORTED_CAPABILITY_INFO;
797 pAd->MlmeAux.BssType = BssType; 872 pAd->MlmeAux.BssType = BssType;
798 pAd->MlmeAux.BeaconPeriod = BeaconPeriod; 873 pAd->MlmeAux.BeaconPeriod = BeaconPeriod;
799 pAd->MlmeAux.Channel = Channel; 874 pAd->MlmeAux.Channel = Channel;
@@ -805,110 +880,152 @@ VOID PeerBeaconAtJoinAction(
805 // Copy AP's supported rate to MlmeAux for creating assoication request 880 // Copy AP's supported rate to MlmeAux for creating assoication request
806 // Also filter out not supported rate 881 // Also filter out not supported rate
807 pAd->MlmeAux.SupRateLen = SupRateLen; 882 pAd->MlmeAux.SupRateLen = SupRateLen;
808 NdisMoveMemory(pAd->MlmeAux.SupRate, SupRate, SupRateLen); 883 NdisMoveMemory(pAd->MlmeAux.SupRate, SupRate,
809 RTMPCheckRates(pAd, pAd->MlmeAux.SupRate, &pAd->MlmeAux.SupRateLen); 884 SupRateLen);
885 RTMPCheckRates(pAd, pAd->MlmeAux.SupRate,
886 &pAd->MlmeAux.SupRateLen);
810 pAd->MlmeAux.ExtRateLen = ExtRateLen; 887 pAd->MlmeAux.ExtRateLen = ExtRateLen;
811 NdisMoveMemory(pAd->MlmeAux.ExtRate, ExtRate, ExtRateLen); 888 NdisMoveMemory(pAd->MlmeAux.ExtRate, ExtRate,
812 RTMPCheckRates(pAd, pAd->MlmeAux.ExtRate, &pAd->MlmeAux.ExtRateLen); 889 ExtRateLen);
813 890 RTMPCheckRates(pAd, pAd->MlmeAux.ExtRate,
814 NdisZeroMemory(pAd->StaActive.SupportedPhyInfo.MCSSet, 16); 891 &pAd->MlmeAux.ExtRateLen);
815 892
816 893 NdisZeroMemory(pAd->StaActive.SupportedPhyInfo.MCSSet,
817 if (((pAd->StaCfg.WepStatus != Ndis802_11WEPEnabled) && (pAd->StaCfg.WepStatus != Ndis802_11Encryption2Enabled)) 894 16);
818 || (pAd->CommonCfg.HT_DisallowTKIP == FALSE)) 895
819 { 896 if (((pAd->StaCfg.WepStatus != Ndis802_11WEPEnabled)
897 && (pAd->StaCfg.WepStatus !=
898 Ndis802_11Encryption2Enabled))
899 || (pAd->CommonCfg.HT_DisallowTKIP == FALSE)) {
820 bAllowNrate = TRUE; 900 bAllowNrate = TRUE;
821 } 901 }
822 902
823 pAd->MlmeAux.NewExtChannelOffset = NewExtChannelOffset; 903 pAd->MlmeAux.NewExtChannelOffset = NewExtChannelOffset;
824 pAd->MlmeAux.HtCapabilityLen = HtCapabilityLen; 904 pAd->MlmeAux.HtCapabilityLen = HtCapabilityLen;
825 905
826 RTMPZeroMemory(&pAd->MlmeAux.HtCapability, SIZE_HT_CAP_IE); 906 RTMPZeroMemory(&pAd->MlmeAux.HtCapability,
907 SIZE_HT_CAP_IE);
827 // filter out un-supported ht rates 908 // filter out un-supported ht rates
828 if (((HtCapabilityLen > 0) || (PreNHtCapabilityLen > 0)) && 909 if (((HtCapabilityLen > 0) || (PreNHtCapabilityLen > 0))
829 ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) && (bAllowNrate))) 910 && ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)
830 { 911 && (bAllowNrate))) {
831 RTMPMoveMemory(&pAd->MlmeAux.AddHtInfo, &AddHtInfo, SIZE_ADD_HT_INFO_IE); 912 RTMPMoveMemory(&pAd->MlmeAux.AddHtInfo,
913 &AddHtInfo, SIZE_ADD_HT_INFO_IE);
832 914
833 // StaActive.SupportedHtPhy.MCSSet stores Peer AP's 11n Rx capability 915 // StaActive.SupportedHtPhy.MCSSet stores Peer AP's 11n Rx capability
834 NdisMoveMemory(pAd->StaActive.SupportedPhyInfo.MCSSet, HtCapability.MCSSet, 16); 916 NdisMoveMemory(pAd->StaActive.SupportedPhyInfo.
835 pAd->MlmeAux.NewExtChannelOffset = NewExtChannelOffset; 917 MCSSet, HtCapability.MCSSet, 16);
918 pAd->MlmeAux.NewExtChannelOffset =
919 NewExtChannelOffset;
836 pAd->MlmeAux.HtCapabilityLen = SIZE_HT_CAP_IE; 920 pAd->MlmeAux.HtCapabilityLen = SIZE_HT_CAP_IE;
837 pAd->StaActive.SupportedPhyInfo.bHtEnable = TRUE; 921 pAd->StaActive.SupportedPhyInfo.bHtEnable =
922 TRUE;
838 if (PreNHtCapabilityLen > 0) 923 if (PreNHtCapabilityLen > 0)
839 pAd->StaActive.SupportedPhyInfo.bPreNHt = TRUE; 924 pAd->StaActive.SupportedPhyInfo.
840 RTMPCheckHt(pAd, BSSID_WCID, &HtCapability, &AddHtInfo); 925 bPreNHt = TRUE;
926 RTMPCheckHt(pAd, BSSID_WCID, &HtCapability,
927 &AddHtInfo);
841 // Copy AP Parameter to StaActive. This is also in LinkUp. 928 // Copy AP Parameter to StaActive. This is also in LinkUp.
842 DBGPRINT(RT_DEBUG_TRACE, ("PeerBeaconAtJoinAction! (MpduDensity=%d, MaxRAmpduFactor=%d, BW=%d)\n", 929 DBGPRINT(RT_DEBUG_TRACE,
843 pAd->StaActive.SupportedHtPhy.MpduDensity, pAd->StaActive.SupportedHtPhy.MaxRAmpduFactor, HtCapability.HtCapInfo.ChannelWidth)); 930 ("PeerBeaconAtJoinAction! (MpduDensity=%d, MaxRAmpduFactor=%d, BW=%d)\n",
844 931 pAd->StaActive.SupportedHtPhy.
845 if (AddHtInfoLen > 0) 932 MpduDensity,
846 { 933 pAd->StaActive.SupportedHtPhy.
934 MaxRAmpduFactor,
935 HtCapability.HtCapInfo.ChannelWidth));
936
937 if (AddHtInfoLen > 0) {
847 CentralChannel = AddHtInfo.ControlChan; 938 CentralChannel = AddHtInfo.ControlChan;
848 // Check again the Bandwidth capability of this AP. 939 // Check again the Bandwidth capability of this AP.
849 if ((AddHtInfo.ControlChan > 2)&& (AddHtInfo.AddHtInfo.ExtChanOffset == EXTCHA_BELOW) && (HtCapability.HtCapInfo.ChannelWidth == BW_40)) 940 if ((AddHtInfo.ControlChan > 2)
850 { 941 && (AddHtInfo.AddHtInfo.
851 CentralChannel = AddHtInfo.ControlChan - 2; 942 ExtChanOffset == EXTCHA_BELOW)
852 } 943 && (HtCapability.HtCapInfo.
853 else if ((AddHtInfo.AddHtInfo.ExtChanOffset == EXTCHA_ABOVE) && (HtCapability.HtCapInfo.ChannelWidth == BW_40)) 944 ChannelWidth == BW_40)) {
854 { 945 CentralChannel =
855 CentralChannel = AddHtInfo.ControlChan + 2; 946 AddHtInfo.ControlChan - 2;
856 } 947 } else
857 948 if ((AddHtInfo.AddHtInfo.
949 ExtChanOffset == EXTCHA_ABOVE)
950 && (HtCapability.HtCapInfo.
951 ChannelWidth == BW_40)) {
952 CentralChannel =
953 AddHtInfo.ControlChan + 2;
954 }
858 // Check Error . 955 // Check Error .
859 if (pAd->MlmeAux.CentralChannel != CentralChannel) 956 if (pAd->MlmeAux.CentralChannel !=
860 DBGPRINT(RT_DEBUG_ERROR, ("PeerBeaconAtJoinAction HT===>Beacon Central Channel = %d, Control Channel = %d. Mlmeaux CentralChannel = %d\n", CentralChannel, AddHtInfo.ControlChan, pAd->MlmeAux.CentralChannel)); 957 CentralChannel)
861 958 DBGPRINT(RT_DEBUG_ERROR,
862 DBGPRINT(RT_DEBUG_TRACE, ("PeerBeaconAtJoinAction HT===>Central Channel = %d, Control Channel = %d, .\n", CentralChannel, AddHtInfo.ControlChan)); 959 ("PeerBeaconAtJoinAction HT===>Beacon Central Channel = %d, Control Channel = %d. Mlmeaux CentralChannel = %d\n",
960 CentralChannel,
961 AddHtInfo.ControlChan,
962 pAd->MlmeAux.
963 CentralChannel));
964
965 DBGPRINT(RT_DEBUG_TRACE,
966 ("PeerBeaconAtJoinAction HT===>Central Channel = %d, Control Channel = %d, .\n",
967 CentralChannel,
968 AddHtInfo.ControlChan));
863 969
864 } 970 }
865 971
866 } 972 } else {
867 else 973 // To prevent error, let legacy AP must have same CentralChannel and Channel.
868 { 974 if ((HtCapabilityLen == 0)
869 // To prevent error, let legacy AP must have same CentralChannel and Channel. 975 && (PreNHtCapabilityLen == 0))
870 if ((HtCapabilityLen == 0) && (PreNHtCapabilityLen == 0)) 976 pAd->MlmeAux.CentralChannel =
871 pAd->MlmeAux.CentralChannel = pAd->MlmeAux.Channel; 977 pAd->MlmeAux.Channel;
872 978
873 pAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE; 979 pAd->StaActive.SupportedPhyInfo.bHtEnable =
980 FALSE;
874 pAd->MlmeAux.NewExtChannelOffset = 0xff; 981 pAd->MlmeAux.NewExtChannelOffset = 0xff;
875 RTMPZeroMemory(&pAd->MlmeAux.HtCapability, SIZE_HT_CAP_IE); 982 RTMPZeroMemory(&pAd->MlmeAux.HtCapability,
983 SIZE_HT_CAP_IE);
876 pAd->MlmeAux.HtCapabilityLen = 0; 984 pAd->MlmeAux.HtCapabilityLen = 0;
877 RTMPZeroMemory(&pAd->MlmeAux.AddHtInfo, SIZE_ADD_HT_INFO_IE); 985 RTMPZeroMemory(&pAd->MlmeAux.AddHtInfo,
986 SIZE_ADD_HT_INFO_IE);
878 } 987 }
879 988
880 RTMPUpdateMlmeRate(pAd); 989 RTMPUpdateMlmeRate(pAd);
881 990
882 // copy QOS related information 991 // copy QOS related information
883 if ((pAd->CommonCfg.bWmmCapable) 992 if ((pAd->CommonCfg.bWmmCapable)
884 || (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) 993 || (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)
885 ) 994 ) {
886 { 995 NdisMoveMemory(&pAd->MlmeAux.APEdcaParm,
887 NdisMoveMemory(&pAd->MlmeAux.APEdcaParm, &EdcaParm, sizeof(EDCA_PARM)); 996 &EdcaParm, sizeof(EDCA_PARM));
888 NdisMoveMemory(&pAd->MlmeAux.APQbssLoad, &QbssLoad, sizeof(QBSS_LOAD_PARM)); 997 NdisMoveMemory(&pAd->MlmeAux.APQbssLoad,
889 NdisMoveMemory(&pAd->MlmeAux.APQosCapability, &QosCapability, sizeof(QOS_CAPABILITY_PARM)); 998 &QbssLoad,
890 } 999 sizeof(QBSS_LOAD_PARM));
891 else 1000 NdisMoveMemory(&pAd->MlmeAux.APQosCapability,
892 { 1001 &QosCapability,
893 NdisZeroMemory(&pAd->MlmeAux.APEdcaParm, sizeof(EDCA_PARM)); 1002 sizeof(QOS_CAPABILITY_PARM));
894 NdisZeroMemory(&pAd->MlmeAux.APQbssLoad, sizeof(QBSS_LOAD_PARM)); 1003 } else {
895 NdisZeroMemory(&pAd->MlmeAux.APQosCapability, sizeof(QOS_CAPABILITY_PARM)); 1004 NdisZeroMemory(&pAd->MlmeAux.APEdcaParm,
1005 sizeof(EDCA_PARM));
1006 NdisZeroMemory(&pAd->MlmeAux.APQbssLoad,
1007 sizeof(QBSS_LOAD_PARM));
1008 NdisZeroMemory(&pAd->MlmeAux.APQosCapability,
1009 sizeof(QOS_CAPABILITY_PARM));
896 } 1010 }
897 1011
898 DBGPRINT(RT_DEBUG_TRACE, ("SYNC - after JOIN, SupRateLen=%d, ExtRateLen=%d\n", 1012 DBGPRINT(RT_DEBUG_TRACE,
899 pAd->MlmeAux.SupRateLen, pAd->MlmeAux.ExtRateLen)); 1013 ("SYNC - after JOIN, SupRateLen=%d, ExtRateLen=%d\n",
1014 pAd->MlmeAux.SupRateLen,
1015 pAd->MlmeAux.ExtRateLen));
900 1016
901 if (AironetCellPowerLimit != 0xFF) 1017 if (AironetCellPowerLimit != 0xFF) {
902 {
903 //We need to change our TxPower for CCX 2.0 AP Control of Client Transmit Power 1018 //We need to change our TxPower for CCX 2.0 AP Control of Client Transmit Power
904 ChangeToCellPowerLimit(pAd, AironetCellPowerLimit); 1019 ChangeToCellPowerLimit(pAd,
905 } 1020 AironetCellPowerLimit);
906 else //Used the default TX Power Percentage. 1021 } else //Used the default TX Power Percentage.
907 pAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault; 1022 pAd->CommonCfg.TxPowerPercentage =
1023 pAd->CommonCfg.TxPowerDefault;
908 1024
909 pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE; 1025 pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;
910 Status = MLME_SUCCESS; 1026 Status = MLME_SUCCESS;
911 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_JOIN_CONF, 2, &Status); 1027 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_JOIN_CONF,
1028 2, &Status);
912 } 1029 }
913 // not to me BEACON, ignored 1030 // not to me BEACON, ignored
914 } 1031 }
@@ -924,98 +1041,99 @@ VOID PeerBeaconAtJoinAction(
924 1041
925 ========================================================================== 1042 ==========================================================================
926 */ 1043 */
927VOID PeerBeacon( 1044VOID PeerBeacon(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
928 IN PRTMP_ADAPTER pAd,
929 IN MLME_QUEUE_ELEM *Elem)
930{ 1045{
931 UCHAR Bssid[MAC_ADDR_LEN], Addr2[MAC_ADDR_LEN]; 1046 UCHAR Bssid[MAC_ADDR_LEN], Addr2[MAC_ADDR_LEN];
932 CHAR Ssid[MAX_LEN_OF_SSID]; 1047 CHAR Ssid[MAX_LEN_OF_SSID];
933 CF_PARM CfParm; 1048 CF_PARM CfParm;
934 UCHAR SsidLen, MessageToMe=0, BssType, Channel, NewChannel, index=0; 1049 UCHAR SsidLen, MessageToMe = 0, BssType, Channel, NewChannel, index = 0;
935 UCHAR DtimCount=0, DtimPeriod=0, BcastFlag=0; 1050 UCHAR DtimCount = 0, DtimPeriod = 0, BcastFlag = 0;
936 USHORT CapabilityInfo, AtimWin, BeaconPeriod; 1051 USHORT CapabilityInfo, AtimWin, BeaconPeriod;
937 LARGE_INTEGER TimeStamp; 1052 LARGE_INTEGER TimeStamp;
938 USHORT TbttNumToNextWakeUp; 1053 USHORT TbttNumToNextWakeUp;
939 UCHAR Erp; 1054 UCHAR Erp;
940 UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRate[MAX_LEN_OF_SUPPORTED_RATES]; 1055 UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES],
941 UCHAR SupRateLen, ExtRateLen; 1056 ExtRate[MAX_LEN_OF_SUPPORTED_RATES];
942 UCHAR CkipFlag; 1057 UCHAR SupRateLen, ExtRateLen;
943 USHORT LenVIE; 1058 UCHAR CkipFlag;
944 UCHAR AironetCellPowerLimit; 1059 USHORT LenVIE;
945 EDCA_PARM EdcaParm; 1060 UCHAR AironetCellPowerLimit;
946 QBSS_LOAD_PARM QbssLoad; 1061 EDCA_PARM EdcaParm;
1062 QBSS_LOAD_PARM QbssLoad;
947 QOS_CAPABILITY_PARM QosCapability; 1063 QOS_CAPABILITY_PARM QosCapability;
948 ULONG RalinkIe; 1064 ULONG RalinkIe;
949 // New for WPA security suites 1065 // New for WPA security suites
950 UCHAR VarIE[MAX_VIE_LEN]; // Total VIE length = MAX_VIE_LEN - -5 1066 UCHAR VarIE[MAX_VIE_LEN]; // Total VIE length = MAX_VIE_LEN - -5
951 NDIS_802_11_VARIABLE_IEs *pVIE = NULL; 1067 NDIS_802_11_VARIABLE_IEs *pVIE = NULL;
952 HT_CAPABILITY_IE HtCapability; 1068 HT_CAPABILITY_IE HtCapability;
953 ADD_HT_INFO_IE AddHtInfo; // AP might use this additional ht info IE 1069 ADD_HT_INFO_IE AddHtInfo; // AP might use this additional ht info IE
954 UCHAR HtCapabilityLen, PreNHtCapabilityLen; 1070 UCHAR HtCapabilityLen, PreNHtCapabilityLen;
955 UCHAR AddHtInfoLen; 1071 UCHAR AddHtInfoLen;
956 UCHAR NewExtChannelOffset = 0xff; 1072 UCHAR NewExtChannelOffset = 0xff;
957 1073
958 if (!(INFRA_ON(pAd) || ADHOC_ON(pAd) 1074 if (!(INFRA_ON(pAd) || ADHOC_ON(pAd)
959 )) 1075 ))
960 return; 1076 return;
961 1077
962 // Init Variable IE structure 1078 // Init Variable IE structure
963 pVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE; 1079 pVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE;
964 pVIE->Length = 0; 1080 pVIE->Length = 0;
965 RTMPZeroMemory(&HtCapability, sizeof(HtCapability)); 1081 RTMPZeroMemory(&HtCapability, sizeof(HtCapability));
966 RTMPZeroMemory(&AddHtInfo, sizeof(ADD_HT_INFO_IE)); 1082 RTMPZeroMemory(&AddHtInfo, sizeof(ADD_HT_INFO_IE));
967 1083
968 if (PeerBeaconAndProbeRspSanity(pAd, 1084 if (PeerBeaconAndProbeRspSanity(pAd,
969 Elem->Msg, 1085 Elem->Msg,
970 Elem->MsgLen, 1086 Elem->MsgLen,
971 Elem->Channel, 1087 Elem->Channel,
972 Addr2, 1088 Addr2,
973 Bssid, 1089 Bssid,
974 Ssid, 1090 Ssid,
975 &SsidLen, 1091 &SsidLen,
976 &BssType, 1092 &BssType,
977 &BeaconPeriod, 1093 &BeaconPeriod,
978 &Channel, 1094 &Channel,
979 &NewChannel, 1095 &NewChannel,
980 &TimeStamp, 1096 &TimeStamp,
981 &CfParm, 1097 &CfParm,
982 &AtimWin, 1098 &AtimWin,
983 &CapabilityInfo, 1099 &CapabilityInfo,
984 &Erp, 1100 &Erp,
985 &DtimCount, 1101 &DtimCount,
986 &DtimPeriod, 1102 &DtimPeriod,
987 &BcastFlag, 1103 &BcastFlag,
988 &MessageToMe, 1104 &MessageToMe,
989 SupRate, 1105 SupRate,
990 &SupRateLen, 1106 &SupRateLen,
991 ExtRate, 1107 ExtRate,
992 &ExtRateLen, 1108 &ExtRateLen,
993 &CkipFlag, 1109 &CkipFlag,
994 &AironetCellPowerLimit, 1110 &AironetCellPowerLimit,
995 &EdcaParm, 1111 &EdcaParm,
996 &QbssLoad, 1112 &QbssLoad,
997 &QosCapability, 1113 &QosCapability,
998 &RalinkIe, 1114 &RalinkIe,
999 &HtCapabilityLen, 1115 &HtCapabilityLen,
1000 &PreNHtCapabilityLen, 1116 &PreNHtCapabilityLen,
1001 &HtCapability, 1117 &HtCapability,
1002 &AddHtInfoLen, 1118 &AddHtInfoLen,
1003 &AddHtInfo, 1119 &AddHtInfo,
1004 &NewExtChannelOffset, 1120 &NewExtChannelOffset, &LenVIE, pVIE)) {
1005 &LenVIE,
1006 pVIE))
1007 {
1008 BOOLEAN is_my_bssid, is_my_ssid; 1121 BOOLEAN is_my_bssid, is_my_ssid;
1009 ULONG Bssidx, Now; 1122 ULONG Bssidx, Now;
1010 BSS_ENTRY *pBss; 1123 BSS_ENTRY *pBss;
1011 CHAR RealRssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, Elem->Rssi0, RSSI_0), ConvertToRssi(pAd, Elem->Rssi1, RSSI_1), ConvertToRssi(pAd, Elem->Rssi2, RSSI_2)); 1124 CHAR RealRssi =
1012 1125 RTMPMaxRssi(pAd, ConvertToRssi(pAd, Elem->Rssi0, RSSI_0),
1013 is_my_bssid = MAC_ADDR_EQUAL(Bssid, pAd->CommonCfg.Bssid)? TRUE : FALSE; 1126 ConvertToRssi(pAd, Elem->Rssi1, RSSI_1),
1014 is_my_ssid = SSID_EQUAL(Ssid, SsidLen, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen)? TRUE:FALSE; 1127 ConvertToRssi(pAd, Elem->Rssi2, RSSI_2));
1015 1128
1129 is_my_bssid =
1130 MAC_ADDR_EQUAL(Bssid, pAd->CommonCfg.Bssid) ? TRUE : FALSE;
1131 is_my_ssid =
1132 SSID_EQUAL(Ssid, SsidLen, pAd->CommonCfg.Ssid,
1133 pAd->CommonCfg.SsidLen) ? TRUE : FALSE;
1016 1134
1017 // ignore BEACON not for my SSID 1135 // ignore BEACON not for my SSID
1018 if ((! is_my_ssid) && (! is_my_bssid)) 1136 if ((!is_my_ssid) && (!is_my_bssid))
1019 return; 1137 return;
1020 1138
1021 // It means STA waits disassoc completely from this AP, ignores this beacon. 1139 // It means STA waits disassoc completely from this AP, ignores this beacon.
@@ -1033,177 +1151,194 @@ VOID PeerBeacon(
1033 // Housekeeping "SsidBssTab" table for later-on ROAMing usage. 1151 // Housekeeping "SsidBssTab" table for later-on ROAMing usage.
1034 // 1152 //
1035 Bssidx = BssTableSearch(&pAd->ScanTab, Bssid, Channel); 1153 Bssidx = BssTableSearch(&pAd->ScanTab, Bssid, Channel);
1036 if (Bssidx == BSS_NOT_FOUND) 1154 if (Bssidx == BSS_NOT_FOUND) {
1037 {
1038 // discover new AP of this network, create BSS entry 1155 // discover new AP of this network, create BSS entry
1039 Bssidx = BssTableSetEntry(pAd, &pAd->ScanTab, Bssid, Ssid, SsidLen, BssType, BeaconPeriod, 1156 Bssidx =
1040 &CfParm, AtimWin, CapabilityInfo, SupRate, SupRateLen, ExtRate, ExtRateLen, 1157 BssTableSetEntry(pAd, &pAd->ScanTab, Bssid, Ssid,
1041 &HtCapability, &AddHtInfo,HtCapabilityLen,AddHtInfoLen,NewExtChannelOffset, Channel, 1158 SsidLen, BssType, BeaconPeriod,
1042 RealRssi, TimeStamp, CkipFlag, &EdcaParm, &QosCapability, 1159 &CfParm, AtimWin, CapabilityInfo,
1043 &QbssLoad, LenVIE, pVIE); 1160 SupRate, SupRateLen, ExtRate,
1044 if (Bssidx == BSS_NOT_FOUND) // return if BSS table full 1161 ExtRateLen, &HtCapability,
1162 &AddHtInfo, HtCapabilityLen,
1163 AddHtInfoLen, NewExtChannelOffset,
1164 Channel, RealRssi, TimeStamp,
1165 CkipFlag, &EdcaParm,
1166 &QosCapability, &QbssLoad, LenVIE,
1167 pVIE);
1168 if (Bssidx == BSS_NOT_FOUND) // return if BSS table full
1045 return; 1169 return;
1046 1170
1047 NdisMoveMemory(pAd->ScanTab.BssEntry[Bssidx].PTSF, &Elem->Msg[24], 4); 1171 NdisMoveMemory(pAd->ScanTab.BssEntry[Bssidx].PTSF,
1048 NdisMoveMemory(&pAd->ScanTab.BssEntry[Bssidx].TTSF[0], &Elem->TimeStamp.u.LowPart, 4); 1172 &Elem->Msg[24], 4);
1049 NdisMoveMemory(&pAd->ScanTab.BssEntry[Bssidx].TTSF[4], &Elem->TimeStamp.u.LowPart, 4); 1173 NdisMoveMemory(&pAd->ScanTab.BssEntry[Bssidx].TTSF[0],
1050 1174 &Elem->TimeStamp.u.LowPart, 4);
1051 1175 NdisMoveMemory(&pAd->ScanTab.BssEntry[Bssidx].TTSF[4],
1176 &Elem->TimeStamp.u.LowPart, 4);
1052 1177
1053 } 1178 }
1054 1179
1055 if ((pAd->CommonCfg.bIEEE80211H == 1) && (NewChannel != 0) && (Channel != NewChannel)) 1180 if ((pAd->CommonCfg.bIEEE80211H == 1) && (NewChannel != 0)
1056 { 1181 && (Channel != NewChannel)) {
1057 // Switching to channel 1 can prevent from rescanning the current channel immediately (by auto reconnection). 1182 // Switching to channel 1 can prevent from rescanning the current channel immediately (by auto reconnection).
1058 // In addition, clear the MLME queue and the scan table to discard the RX packets and previous scanning results. 1183 // In addition, clear the MLME queue and the scan table to discard the RX packets and previous scanning results.
1059 AsicSwitchChannel(pAd, 1, FALSE); 1184 AsicSwitchChannel(pAd, 1, FALSE);
1060 AsicLockChannel(pAd, 1); 1185 AsicLockChannel(pAd, 1);
1061 LinkDown(pAd, FALSE); 1186 LinkDown(pAd, FALSE);
1062 MlmeQueueInit(&pAd->Mlme.Queue); 1187 MlmeQueueInit(&pAd->Mlme.Queue);
1063 BssTableInit(&pAd->ScanTab); 1188 BssTableInit(&pAd->ScanTab);
1064 RTMPusecDelay(1000000); // use delay to prevent STA do reassoc 1189 RTMPusecDelay(1000000); // use delay to prevent STA do reassoc
1065 1190
1066 // channel sanity check 1191 // channel sanity check
1067 for (index = 0 ; index < pAd->ChannelListNum; index++) 1192 for (index = 0; index < pAd->ChannelListNum; index++) {
1068 { 1193 if (pAd->ChannelList[index].Channel ==
1069 if (pAd->ChannelList[index].Channel == NewChannel) 1194 NewChannel) {
1070 { 1195 pAd->ScanTab.BssEntry[Bssidx].Channel =
1071 pAd->ScanTab.BssEntry[Bssidx].Channel = NewChannel; 1196 NewChannel;
1072 pAd->CommonCfg.Channel = NewChannel; 1197 pAd->CommonCfg.Channel = NewChannel;
1073 AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE); 1198 AsicSwitchChannel(pAd,
1074 AsicLockChannel(pAd, pAd->CommonCfg.Channel); 1199 pAd->CommonCfg.
1075 DBGPRINT(RT_DEBUG_TRACE, ("PeerBeacon - STA receive channel switch announcement IE (New Channel =%d)\n", NewChannel)); 1200 Channel, FALSE);
1201 AsicLockChannel(pAd,
1202 pAd->CommonCfg.Channel);
1203 DBGPRINT(RT_DEBUG_TRACE,
1204 ("PeerBeacon - STA receive channel switch announcement IE (New Channel =%d)\n",
1205 NewChannel));
1076 break; 1206 break;
1077 } 1207 }
1078 } 1208 }
1079 1209
1080 if (index >= pAd->ChannelListNum) 1210 if (index >= pAd->ChannelListNum) {
1081 {
1082 DBGPRINT_ERR(("PeerBeacon(can not find New Channel=%d in ChannelList[%d]\n", pAd->CommonCfg.Channel, pAd->ChannelListNum)); 1211 DBGPRINT_ERR(("PeerBeacon(can not find New Channel=%d in ChannelList[%d]\n", pAd->CommonCfg.Channel, pAd->ChannelListNum));
1083 } 1212 }
1084 } 1213 }
1085
1086 // if the ssid matched & bssid unmatched, we should select the bssid with large value. 1214 // if the ssid matched & bssid unmatched, we should select the bssid with large value.
1087 // This might happened when two STA start at the same time 1215 // This might happened when two STA start at the same time
1088 if ((! is_my_bssid) && ADHOC_ON(pAd)) 1216 if ((!is_my_bssid) && ADHOC_ON(pAd)) {
1089 { 1217 INT i;
1090 INT i;
1091 1218
1092 // Add the safeguard against the mismatch of adhoc wep status 1219 // Add the safeguard against the mismatch of adhoc wep status
1093 if (pAd->StaCfg.WepStatus != pAd->ScanTab.BssEntry[Bssidx].WepStatus) 1220 if (pAd->StaCfg.WepStatus !=
1094 { 1221 pAd->ScanTab.BssEntry[Bssidx].WepStatus) {
1095 return; 1222 return;
1096 } 1223 }
1097
1098 // collapse into the ADHOC network which has bigger BSSID value. 1224 // collapse into the ADHOC network which has bigger BSSID value.
1099 for (i = 0; i < 6; i++) 1225 for (i = 0; i < 6; i++) {
1100 { 1226 if (Bssid[i] > pAd->CommonCfg.Bssid[i]) {
1101 if (Bssid[i] > pAd->CommonCfg.Bssid[i]) 1227 DBGPRINT(RT_DEBUG_TRACE,
1102 { 1228 ("SYNC - merge to the IBSS with bigger BSSID=%02x:%02x:%02x:%02x:%02x:%02x\n",
1103 DBGPRINT(RT_DEBUG_TRACE, ("SYNC - merge to the IBSS with bigger BSSID=%02x:%02x:%02x:%02x:%02x:%02x\n", 1229 Bssid[0], Bssid[1], Bssid[2],
1104 Bssid[0], Bssid[1], Bssid[2], Bssid[3], Bssid[4], Bssid[5])); 1230 Bssid[3], Bssid[4],
1231 Bssid[5]));
1105 AsicDisableSync(pAd); 1232 AsicDisableSync(pAd);
1106 COPY_MAC_ADDR(pAd->CommonCfg.Bssid, Bssid); 1233 COPY_MAC_ADDR(pAd->CommonCfg.Bssid,
1234 Bssid);
1107 AsicSetBssid(pAd, pAd->CommonCfg.Bssid); 1235 AsicSetBssid(pAd, pAd->CommonCfg.Bssid);
1108 MakeIbssBeacon(pAd); // re-build BEACON frame 1236 MakeIbssBeacon(pAd); // re-build BEACON frame
1109 AsicEnableIbssSync(pAd); // copy BEACON frame to on-chip memory 1237 AsicEnableIbssSync(pAd); // copy BEACON frame to on-chip memory
1110 is_my_bssid = TRUE; 1238 is_my_bssid = TRUE;
1111 break; 1239 break;
1112 } 1240 } else if (Bssid[i] < pAd->CommonCfg.Bssid[i])
1113 else if (Bssid[i] < pAd->CommonCfg.Bssid[i])
1114 break; 1241 break;
1115 } 1242 }
1116 } 1243 }
1117 1244
1118
1119 NdisGetSystemUpTime(&Now); 1245 NdisGetSystemUpTime(&Now);
1120 pBss = &pAd->ScanTab.BssEntry[Bssidx]; 1246 pBss = &pAd->ScanTab.BssEntry[Bssidx];
1121 pBss->Rssi = RealRssi; // lastest RSSI 1247 pBss->Rssi = RealRssi; // lastest RSSI
1122 pBss->LastBeaconRxTime = Now; // last RX timestamp 1248 pBss->LastBeaconRxTime = Now; // last RX timestamp
1123 1249
1124 // 1250 //
1125 // BEACON from my BSSID - either IBSS or INFRA network 1251 // BEACON from my BSSID - either IBSS or INFRA network
1126 // 1252 //
1127 if (is_my_bssid) 1253 if (is_my_bssid) {
1128 { 1254 RXWI_STRUC RxWI;
1129 RXWI_STRUC RxWI;
1130 1255
1131 pAd->StaCfg.DtimCount = DtimCount; 1256 pAd->StaCfg.DtimCount = DtimCount;
1132 pAd->StaCfg.DtimPeriod = DtimPeriod; 1257 pAd->StaCfg.DtimPeriod = DtimPeriod;
1133 pAd->StaCfg.LastBeaconRxTime = Now; 1258 pAd->StaCfg.LastBeaconRxTime = Now;
1134 1259
1135
1136 RxWI.RSSI0 = Elem->Rssi0; 1260 RxWI.RSSI0 = Elem->Rssi0;
1137 RxWI.RSSI1 = Elem->Rssi1; 1261 RxWI.RSSI1 = Elem->Rssi1;
1138 RxWI.RSSI2 = Elem->Rssi2; 1262 RxWI.RSSI2 = Elem->Rssi2;
1139 1263
1140 Update_Rssi_Sample(pAd, &pAd->StaCfg.RssiSample, &RxWI); 1264 Update_Rssi_Sample(pAd, &pAd->StaCfg.RssiSample, &RxWI);
1141 if (AironetCellPowerLimit != 0xFF) 1265 if (AironetCellPowerLimit != 0xFF) {
1142 {
1143 // 1266 //
1144 // We get the Cisco (ccx) "TxPower Limit" required 1267 // We get the Cisco (ccx) "TxPower Limit" required
1145 // Changed to appropriate TxPower Limit for Ciso Compatible Extensions 1268 // Changed to appropriate TxPower Limit for Ciso Compatible Extensions
1146 // 1269 //
1147 ChangeToCellPowerLimit(pAd, AironetCellPowerLimit); 1270 ChangeToCellPowerLimit(pAd,
1148 } 1271 AironetCellPowerLimit);
1149 else 1272 } else {
1150 {
1151 // 1273 //
1152 // AironetCellPowerLimit equal to 0xFF means the Cisco (ccx) "TxPower Limit" not exist. 1274 // AironetCellPowerLimit equal to 0xFF means the Cisco (ccx) "TxPower Limit" not exist.
1153 // Used the default TX Power Percentage, that set from UI. 1275 // Used the default TX Power Percentage, that set from UI.
1154 // 1276 //
1155 pAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault; 1277 pAd->CommonCfg.TxPowerPercentage =
1278 pAd->CommonCfg.TxPowerDefault;
1156 } 1279 }
1157 1280
1158 if (ADHOC_ON(pAd) && (CAP_IS_IBSS_ON(CapabilityInfo))) 1281 if (ADHOC_ON(pAd) && (CAP_IS_IBSS_ON(CapabilityInfo))) {
1159 { 1282 UCHAR MaxSupportedRateIn500Kbps = 0;
1160 UCHAR MaxSupportedRateIn500Kbps = 0; 1283 UCHAR idx;
1161 UCHAR idx;
1162 MAC_TABLE_ENTRY *pEntry; 1284 MAC_TABLE_ENTRY *pEntry;
1163 1285
1164 // supported rates array may not be sorted. sort it and find the maximum rate 1286 // supported rates array may not be sorted. sort it and find the maximum rate
1165 for (idx=0; idx<SupRateLen; idx++) 1287 for (idx = 0; idx < SupRateLen; idx++) {
1166 { 1288 if (MaxSupportedRateIn500Kbps <
1167 if (MaxSupportedRateIn500Kbps < (SupRate[idx] & 0x7f)) 1289 (SupRate[idx] & 0x7f))
1168 MaxSupportedRateIn500Kbps = SupRate[idx] & 0x7f; 1290 MaxSupportedRateIn500Kbps =
1169 } 1291 SupRate[idx] & 0x7f;
1170 1292 }
1171 for (idx=0; idx<ExtRateLen; idx++) 1293
1172 { 1294 for (idx = 0; idx < ExtRateLen; idx++) {
1173 if (MaxSupportedRateIn500Kbps < (ExtRate[idx] & 0x7f)) 1295 if (MaxSupportedRateIn500Kbps <
1174 MaxSupportedRateIn500Kbps = ExtRate[idx] & 0x7f; 1296 (ExtRate[idx] & 0x7f))
1175 } 1297 MaxSupportedRateIn500Kbps =
1298 ExtRate[idx] & 0x7f;
1299 }
1176 1300
1177 // look up the existing table 1301 // look up the existing table
1178 pEntry = MacTableLookup(pAd, Addr2); 1302 pEntry = MacTableLookup(pAd, Addr2);
1179 1303
1180 // Ad-hoc mode is using MAC address as BA session. So we need to continuously find newly joined adhoc station by receiving beacon. 1304 // Ad-hoc mode is using MAC address as BA session. So we need to continuously find newly joined adhoc station by receiving beacon.
1181 // To prevent always check this, we use wcid == RESERVED_WCID to recognize it as newly joined adhoc station. 1305 // To prevent always check this, we use wcid == RESERVED_WCID to recognize it as newly joined adhoc station.
1182 if ((ADHOC_ON(pAd) && (Elem->Wcid == RESERVED_WCID)) || 1306 if ((ADHOC_ON(pAd)
1183 (pEntry && ((pEntry->LastBeaconRxTime + ADHOC_ENTRY_BEACON_LOST_TIME) < Now))) 1307 && (Elem->Wcid == RESERVED_WCID))
1184 { 1308 || (pEntry
1309 &&
1310 ((pEntry->LastBeaconRxTime +
1311 ADHOC_ENTRY_BEACON_LOST_TIME) <
1312 Now))) {
1185 if (pEntry == NULL) 1313 if (pEntry == NULL)
1186 // Another adhoc joining, add to our MAC table. 1314 // Another adhoc joining, add to our MAC table.
1187 pEntry = MacTableInsertEntry(pAd, Addr2, BSS0, FALSE); 1315 pEntry =
1316 MacTableInsertEntry(pAd,
1317 Addr2,
1318 BSS0,
1319 FALSE);
1188 1320
1189 if (StaAddMacTableEntry(pAd, 1321 if (StaAddMacTableEntry(pAd,
1190 pEntry, 1322 pEntry,
1191 MaxSupportedRateIn500Kbps, 1323 MaxSupportedRateIn500Kbps,
1192 &HtCapability, 1324 &HtCapability,
1193 HtCapabilityLen, 1325 HtCapabilityLen,
1194 &AddHtInfo, 1326 &AddHtInfo,
1195 AddHtInfoLen, 1327 AddHtInfoLen,
1196 CapabilityInfo) == FALSE) 1328 CapabilityInfo)
1197 { 1329 == FALSE) {
1198 DBGPRINT(RT_DEBUG_TRACE, ("ADHOC - Add Entry failed.\n")); 1330 DBGPRINT(RT_DEBUG_TRACE,
1331 ("ADHOC - Add Entry failed.\n"));
1199 return; 1332 return;
1200 } 1333 }
1201 1334
1202 if (pEntry && 1335 if (pEntry &&
1203 (Elem->Wcid == RESERVED_WCID)) 1336 (Elem->Wcid == RESERVED_WCID)) {
1204 {
1205 idx = pAd->StaCfg.DefaultKeyId; 1337 idx = pAd->StaCfg.DefaultKeyId;
1206 RTMP_STA_SECURITY_INFO_ADD(pAd, BSS0, idx, pEntry); 1338 RTMP_STA_SECURITY_INFO_ADD(pAd,
1339 BSS0,
1340 idx,
1341 pEntry);
1207 } 1342 }
1208 } 1343 }
1209 1344
@@ -1211,33 +1346,62 @@ VOID PeerBeacon(
1211 pEntry->LastBeaconRxTime = Now; 1346 pEntry->LastBeaconRxTime = Now;
1212 1347
1213 // At least another peer in this IBSS, declare MediaState as CONNECTED 1348 // At least another peer in this IBSS, declare MediaState as CONNECTED
1214 if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) 1349 if (!OPSTATUS_TEST_FLAG
1215 { 1350 (pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) {
1216 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); 1351 OPSTATUS_SET_FLAG(pAd,
1352 fOP_STATUS_MEDIA_STATE_CONNECTED);
1217 1353
1218 pAd->IndicateMediaState = NdisMediaStateConnected; 1354 pAd->IndicateMediaState =
1355 NdisMediaStateConnected;
1219 RTMP_IndicateMediaState(pAd); 1356 RTMP_IndicateMediaState(pAd);
1220 pAd->ExtraInfo = GENERAL_LINK_UP; 1357 pAd->ExtraInfo = GENERAL_LINK_UP;
1221 AsicSetBssid(pAd, pAd->CommonCfg.Bssid); 1358 AsicSetBssid(pAd, pAd->CommonCfg.Bssid);
1222 1359
1223 // 2003/03/12 - john 1360 // 2003/03/12 - john
1224 // Make sure this entry in "ScanTab" table, thus complies to Microsoft's policy that 1361 // Make sure this entry in "ScanTab" table, thus complies to Microsoft's policy that
1225 // "site survey" result should always include the current connected network. 1362 // "site survey" result should always include the current connected network.
1226 // 1363 //
1227 Bssidx = BssTableSearch(&pAd->ScanTab, Bssid, Channel); 1364 Bssidx =
1228 if (Bssidx == BSS_NOT_FOUND) 1365 BssTableSearch(&pAd->ScanTab, Bssid,
1229 { 1366 Channel);
1230 Bssidx = BssTableSetEntry(pAd, &pAd->ScanTab, Bssid, Ssid, SsidLen, BssType, BeaconPeriod, 1367 if (Bssidx == BSS_NOT_FOUND) {
1231 &CfParm, AtimWin, CapabilityInfo, SupRate, SupRateLen, ExtRate, ExtRateLen, &HtCapability, 1368 Bssidx =
1232 &AddHtInfo, HtCapabilityLen, AddHtInfoLen, NewExtChannelOffset, Channel, RealRssi, TimeStamp, 0, 1369 BssTableSetEntry(pAd,
1233 &EdcaParm, &QosCapability, &QbssLoad, LenVIE, pVIE); 1370 &pAd->
1371 ScanTab,
1372 Bssid,
1373 Ssid,
1374 SsidLen,
1375 BssType,
1376 BeaconPeriod,
1377 &CfParm,
1378 AtimWin,
1379 CapabilityInfo,
1380 SupRate,
1381 SupRateLen,
1382 ExtRate,
1383 ExtRateLen,
1384 &HtCapability,
1385 &AddHtInfo,
1386 HtCapabilityLen,
1387 AddHtInfoLen,
1388 NewExtChannelOffset,
1389 Channel,
1390 RealRssi,
1391 TimeStamp,
1392 0,
1393 &EdcaParm,
1394 &QosCapability,
1395 &QbssLoad,
1396 LenVIE,
1397 pVIE);
1234 } 1398 }
1235 DBGPRINT(RT_DEBUG_TRACE, ("ADHOC fOP_STATUS_MEDIA_STATE_CONNECTED.\n")); 1399 DBGPRINT(RT_DEBUG_TRACE,
1400 ("ADHOC fOP_STATUS_MEDIA_STATE_CONNECTED.\n"));
1236 } 1401 }
1237 } 1402 }
1238 1403
1239 if (INFRA_ON(pAd)) 1404 if (INFRA_ON(pAd)) {
1240 {
1241 BOOLEAN bUseShortSlot, bUseBGProtection; 1405 BOOLEAN bUseShortSlot, bUseBGProtection;
1242 1406
1243 // decide to use/change to - 1407 // decide to use/change to -
@@ -1246,174 +1410,283 @@ VOID PeerBeacon(
1246 // 3. short preamble 1410 // 3. short preamble
1247 1411
1248 //bUseShortSlot = pAd->CommonCfg.bUseShortSlotTime && CAP_IS_SHORT_SLOT(CapabilityInfo); 1412 //bUseShortSlot = pAd->CommonCfg.bUseShortSlotTime && CAP_IS_SHORT_SLOT(CapabilityInfo);
1249 bUseShortSlot = CAP_IS_SHORT_SLOT(CapabilityInfo); 1413 bUseShortSlot =
1250 if (bUseShortSlot != OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED)) 1414 CAP_IS_SHORT_SLOT(CapabilityInfo);
1415 if (bUseShortSlot !=
1416 OPSTATUS_TEST_FLAG(pAd,
1417 fOP_STATUS_SHORT_SLOT_INUSED))
1251 AsicSetSlotTime(pAd, bUseShortSlot); 1418 AsicSetSlotTime(pAd, bUseShortSlot);
1252 1419
1253 bUseBGProtection = (pAd->CommonCfg.UseBGProtection == 1) || // always use 1420 bUseBGProtection = (pAd->CommonCfg.UseBGProtection == 1) || // always use
1254 ((pAd->CommonCfg.UseBGProtection == 0) && ERP_IS_USE_PROTECTION(Erp)); 1421 ((pAd->CommonCfg.UseBGProtection == 0)
1422 && ERP_IS_USE_PROTECTION(Erp));
1255 1423
1256 if (pAd->CommonCfg.Channel > 14) // always no BG protection in A-band. falsely happened when switching A/G band to a dual-band AP 1424 if (pAd->CommonCfg.Channel > 14) // always no BG protection in A-band. falsely happened when switching A/G band to a dual-band AP
1257 bUseBGProtection = FALSE; 1425 bUseBGProtection = FALSE;
1258 1426
1259 if (bUseBGProtection != OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED)) 1427 if (bUseBGProtection !=
1428 OPSTATUS_TEST_FLAG(pAd,
1429 fOP_STATUS_BG_PROTECTION_INUSED))
1260 { 1430 {
1261 if (bUseBGProtection) 1431 if (bUseBGProtection) {
1262 { 1432 OPSTATUS_SET_FLAG(pAd,
1263 OPSTATUS_SET_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED); 1433 fOP_STATUS_BG_PROTECTION_INUSED);
1264 AsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode, (OFDMSETPROTECT|CCKSETPROTECT|ALLN_SETPROTECT),FALSE,(pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent == 1)); 1434 AsicUpdateProtect(pAd,
1265 } 1435 pAd->MlmeAux.
1266 else 1436 AddHtInfo.
1267 { 1437 AddHtInfo2.
1268 OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED); 1438 OperaionMode,
1269 AsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode, (OFDMSETPROTECT|CCKSETPROTECT|ALLN_SETPROTECT),TRUE,(pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent == 1)); 1439 (OFDMSETPROTECT
1440 |
1441 CCKSETPROTECT
1442 |
1443 ALLN_SETPROTECT),
1444 FALSE,
1445 (pAd->MlmeAux.
1446 AddHtInfo.
1447 AddHtInfo2.
1448 NonGfPresent
1449 == 1));
1450 } else {
1451 OPSTATUS_CLEAR_FLAG(pAd,
1452 fOP_STATUS_BG_PROTECTION_INUSED);
1453 AsicUpdateProtect(pAd,
1454 pAd->MlmeAux.
1455 AddHtInfo.
1456 AddHtInfo2.
1457 OperaionMode,
1458 (OFDMSETPROTECT
1459 |
1460 CCKSETPROTECT
1461 |
1462 ALLN_SETPROTECT),
1463 TRUE,
1464 (pAd->MlmeAux.
1465 AddHtInfo.
1466 AddHtInfo2.
1467 NonGfPresent
1468 == 1));
1270 } 1469 }
1271 1470
1272 DBGPRINT(RT_DEBUG_WARN, ("SYNC - AP changed B/G protection to %d\n", bUseBGProtection)); 1471 DBGPRINT(RT_DEBUG_WARN,
1472 ("SYNC - AP changed B/G protection to %d\n",
1473 bUseBGProtection));
1273 } 1474 }
1274
1275 // check Ht protection mode. and adhere to the Non-GF device indication by AP. 1475 // check Ht protection mode. and adhere to the Non-GF device indication by AP.
1276 if ((AddHtInfoLen != 0) && 1476 if ((AddHtInfoLen != 0) &&
1277 ((AddHtInfo.AddHtInfo2.OperaionMode != pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode) || 1477 ((AddHtInfo.AddHtInfo2.OperaionMode !=
1278 (AddHtInfo.AddHtInfo2.NonGfPresent != pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent))) 1478 pAd->MlmeAux.AddHtInfo.AddHtInfo2.
1279 { 1479 OperaionMode)
1280 pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent = AddHtInfo.AddHtInfo2.NonGfPresent; 1480 || (AddHtInfo.AddHtInfo2.NonGfPresent !=
1281 pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode = AddHtInfo.AddHtInfo2.OperaionMode; 1481 pAd->MlmeAux.AddHtInfo.AddHtInfo2.
1282 if (pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent == 1) 1482 NonGfPresent))) {
1283 { 1483 pAd->MlmeAux.AddHtInfo.AddHtInfo2.
1284 AsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode, ALLN_SETPROTECT, FALSE, TRUE); 1484 NonGfPresent =
1285 } 1485 AddHtInfo.AddHtInfo2.NonGfPresent;
1286 else 1486 pAd->MlmeAux.AddHtInfo.AddHtInfo2.
1287 AsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode, ALLN_SETPROTECT, FALSE, FALSE); 1487 OperaionMode =
1288 1488 AddHtInfo.AddHtInfo2.OperaionMode;
1289 DBGPRINT(RT_DEBUG_TRACE, ("SYNC - AP changed N OperaionMode to %d\n", pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode)); 1489 if (pAd->MlmeAux.AddHtInfo.AddHtInfo2.
1490 NonGfPresent == 1) {
1491 AsicUpdateProtect(pAd,
1492 pAd->MlmeAux.
1493 AddHtInfo.
1494 AddHtInfo2.
1495 OperaionMode,
1496 ALLN_SETPROTECT,
1497 FALSE, TRUE);
1498 } else
1499 AsicUpdateProtect(pAd,
1500 pAd->MlmeAux.
1501 AddHtInfo.
1502 AddHtInfo2.
1503 OperaionMode,
1504 ALLN_SETPROTECT,
1505 FALSE, FALSE);
1506
1507 DBGPRINT(RT_DEBUG_TRACE,
1508 ("SYNC - AP changed N OperaionMode to %d\n",
1509 pAd->MlmeAux.AddHtInfo.
1510 AddHtInfo2.OperaionMode));
1290 } 1511 }
1291 1512
1292 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED) && 1513 if (OPSTATUS_TEST_FLAG
1293 ERP_IS_USE_BARKER_PREAMBLE(Erp)) 1514 (pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED)
1294 { 1515 && ERP_IS_USE_BARKER_PREAMBLE(Erp)) {
1295 MlmeSetTxPreamble(pAd, Rt802_11PreambleLong); 1516 MlmeSetTxPreamble(pAd,
1296 DBGPRINT(RT_DEBUG_TRACE, ("SYNC - AP forced to use LONG preamble\n")); 1517 Rt802_11PreambleLong);
1518 DBGPRINT(RT_DEBUG_TRACE,
1519 ("SYNC - AP forced to use LONG preamble\n"));
1297 } 1520 }
1298 1521
1299 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) && 1522 if (OPSTATUS_TEST_FLAG
1300 (EdcaParm.bValid == TRUE) && 1523 (pAd, fOP_STATUS_WMM_INUSED)
1301 (EdcaParm.EdcaUpdateCount != pAd->CommonCfg.APEdcaParm.EdcaUpdateCount)) 1524 && (EdcaParm.bValid == TRUE)
1302 { 1525 && (EdcaParm.EdcaUpdateCount !=
1303 DBGPRINT(RT_DEBUG_TRACE, ("SYNC - AP change EDCA parameters(from %d to %d)\n", 1526 pAd->CommonCfg.APEdcaParm.
1304 pAd->CommonCfg.APEdcaParm.EdcaUpdateCount, 1527 EdcaUpdateCount)) {
1305 EdcaParm.EdcaUpdateCount)); 1528 DBGPRINT(RT_DEBUG_TRACE,
1529 ("SYNC - AP change EDCA parameters(from %d to %d)\n",
1530 pAd->CommonCfg.APEdcaParm.
1531 EdcaUpdateCount,
1532 EdcaParm.EdcaUpdateCount));
1306 AsicSetEdcaParm(pAd, &EdcaParm); 1533 AsicSetEdcaParm(pAd, &EdcaParm);
1307 } 1534 }
1308
1309 // copy QOS related information 1535 // copy QOS related information
1310 NdisMoveMemory(&pAd->CommonCfg.APQbssLoad, &QbssLoad, sizeof(QBSS_LOAD_PARM)); 1536 NdisMoveMemory(&pAd->CommonCfg.APQbssLoad,
1311 NdisMoveMemory(&pAd->CommonCfg.APQosCapability, &QosCapability, sizeof(QOS_CAPABILITY_PARM)); 1537 &QbssLoad,
1538 sizeof(QBSS_LOAD_PARM));
1539 NdisMoveMemory(&pAd->CommonCfg.APQosCapability,
1540 &QosCapability,
1541 sizeof(QOS_CAPABILITY_PARM));
1312 } 1542 }
1313
1314 // only INFRASTRUCTURE mode support power-saving feature 1543 // only INFRASTRUCTURE mode support power-saving feature
1315 if ((INFRA_ON(pAd) && (pAd->StaCfg.Psm == PWR_SAVE)) || (pAd->CommonCfg.bAPSDForcePowerSave)) 1544 if ((INFRA_ON(pAd) && (pAd->StaCfg.Psm == PWR_SAVE))
1316 { 1545 || (pAd->CommonCfg.bAPSDForcePowerSave)) {
1317 UCHAR FreeNumber; 1546 UCHAR FreeNumber;
1318 // 1. AP has backlogged unicast-to-me frame, stay AWAKE, send PSPOLL 1547 // 1. AP has backlogged unicast-to-me frame, stay AWAKE, send PSPOLL
1319 // 2. AP has backlogged broadcast/multicast frame and we want those frames, stay AWAKE 1548 // 2. AP has backlogged broadcast/multicast frame and we want those frames, stay AWAKE
1320 // 3. we have outgoing frames in TxRing or MgmtRing, better stay AWAKE 1549 // 3. we have outgoing frames in TxRing or MgmtRing, better stay AWAKE
1321 // 4. Psm change to PWR_SAVE, but AP not been informed yet, we better stay AWAKE 1550 // 4. Psm change to PWR_SAVE, but AP not been informed yet, we better stay AWAKE
1322 // 5. otherwise, put PHY back to sleep to save battery. 1551 // 5. otherwise, put PHY back to sleep to save battery.
1323 if (MessageToMe) 1552 if (MessageToMe) {
1324 {
1325#ifdef RTMP_MAC_PCI 1553#ifdef RTMP_MAC_PCI
1326 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)) 1554 if (OPSTATUS_TEST_FLAG
1327 { 1555 (pAd, fOP_STATUS_PCIE_DEVICE)) {
1328 // Restore to correct BBP R3 value 1556 // Restore to correct BBP R3 value
1329 if (pAd->Antenna.field.RxPath > 1) 1557 if (pAd->Antenna.field.RxPath >
1330 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, pAd->StaCfg.BBPR3); 1558 1)
1559 RTMP_BBP_IO_WRITE8_BY_REG_ID
1560 (pAd, BBP_R3,
1561 pAd->StaCfg.BBPR3);
1331 // Turn clk to 80Mhz. 1562 // Turn clk to 80Mhz.
1332 } 1563 }
1333#endif // RTMP_MAC_PCI // 1564#endif // RTMP_MAC_PCI //
1334 if (pAd->CommonCfg.bAPSDCapable && pAd->CommonCfg.APEdcaParm.bAPSDCapable && 1565 if (pAd->CommonCfg.bAPSDCapable
1335 pAd->CommonCfg.bAPSDAC_BE && pAd->CommonCfg.bAPSDAC_BK && pAd->CommonCfg.bAPSDAC_VI && pAd->CommonCfg.bAPSDAC_VO) 1566 && pAd->CommonCfg.APEdcaParm.
1336 { 1567 bAPSDCapable
1337 pAd->CommonCfg.bNeedSendTriggerFrame = TRUE; 1568 && pAd->CommonCfg.bAPSDAC_BE
1338 } 1569 && pAd->CommonCfg.bAPSDAC_BK
1339 else 1570 && pAd->CommonCfg.bAPSDAC_VI
1571 && pAd->CommonCfg.bAPSDAC_VO) {
1572 pAd->CommonCfg.
1573 bNeedSendTriggerFrame =
1574 TRUE;
1575 } else
1340 RTMP_PS_POLL_ENQUEUE(pAd); 1576 RTMP_PS_POLL_ENQUEUE(pAd);
1341 } 1577 } else if (BcastFlag && (DtimCount == 0)
1342 else if (BcastFlag && (DtimCount == 0) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM)) 1578 && OPSTATUS_TEST_FLAG(pAd,
1579 fOP_STATUS_RECEIVE_DTIM))
1343 { 1580 {
1344#ifdef RTMP_MAC_PCI 1581#ifdef RTMP_MAC_PCI
1345 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)) 1582 if (OPSTATUS_TEST_FLAG
1346 { 1583 (pAd, fOP_STATUS_PCIE_DEVICE)) {
1347 if (pAd->Antenna.field.RxPath > 1) 1584 if (pAd->Antenna.field.RxPath >
1348 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, pAd->StaCfg.BBPR3); 1585 1)
1586 RTMP_BBP_IO_WRITE8_BY_REG_ID
1587 (pAd, BBP_R3,
1588 pAd->StaCfg.BBPR3);
1349 } 1589 }
1350#endif // RTMP_MAC_PCI // 1590#endif // RTMP_MAC_PCI //
1351 } 1591 } else
1352 else if ((pAd->TxSwQueue[QID_AC_BK].Number != 0) || 1592 if ((pAd->TxSwQueue[QID_AC_BK].Number != 0)
1353 (pAd->TxSwQueue[QID_AC_BE].Number != 0) || 1593 || (pAd->TxSwQueue[QID_AC_BE].Number !=
1354 (pAd->TxSwQueue[QID_AC_VI].Number != 0) || 1594 0)
1355 (pAd->TxSwQueue[QID_AC_VO].Number != 0) || 1595 || (pAd->TxSwQueue[QID_AC_VI].Number !=
1356 (RTMPFreeTXDRequest(pAd, QID_AC_BK, TX_RING_SIZE - 1, &FreeNumber) != NDIS_STATUS_SUCCESS) || 1596 0)
1357 (RTMPFreeTXDRequest(pAd, QID_AC_BE, TX_RING_SIZE - 1, &FreeNumber) != NDIS_STATUS_SUCCESS) || 1597 || (pAd->TxSwQueue[QID_AC_VO].Number !=
1358 (RTMPFreeTXDRequest(pAd, QID_AC_VI, TX_RING_SIZE - 1, &FreeNumber) != NDIS_STATUS_SUCCESS) || 1598 0)
1359 (RTMPFreeTXDRequest(pAd, QID_AC_VO, TX_RING_SIZE - 1, &FreeNumber) != NDIS_STATUS_SUCCESS) || 1599 ||
1360 (RTMPFreeTXDRequest(pAd, QID_MGMT, MGMT_RING_SIZE - 1, &FreeNumber) != NDIS_STATUS_SUCCESS)) 1600 (RTMPFreeTXDRequest
1361 { 1601 (pAd, QID_AC_BK, TX_RING_SIZE - 1,
1602 &FreeNumber) != NDIS_STATUS_SUCCESS)
1603 ||
1604 (RTMPFreeTXDRequest
1605 (pAd, QID_AC_BE, TX_RING_SIZE - 1,
1606 &FreeNumber) != NDIS_STATUS_SUCCESS)
1607 ||
1608 (RTMPFreeTXDRequest
1609 (pAd, QID_AC_VI, TX_RING_SIZE - 1,
1610 &FreeNumber) != NDIS_STATUS_SUCCESS)
1611 ||
1612 (RTMPFreeTXDRequest
1613 (pAd, QID_AC_VO, TX_RING_SIZE - 1,
1614 &FreeNumber) != NDIS_STATUS_SUCCESS)
1615 ||
1616 (RTMPFreeTXDRequest
1617 (pAd, QID_MGMT, MGMT_RING_SIZE - 1,
1618 &FreeNumber) !=
1619 NDIS_STATUS_SUCCESS)) {
1362 // TODO: consider scheduled HCCA. might not be proper to use traditional DTIM-based power-saving scheme 1620 // TODO: consider scheduled HCCA. might not be proper to use traditional DTIM-based power-saving scheme
1363 // can we cheat here (i.e. just check MGMT & AC_BE) for better performance? 1621 // can we cheat here (i.e. just check MGMT & AC_BE) for better performance?
1364#ifdef RTMP_MAC_PCI 1622#ifdef RTMP_MAC_PCI
1365 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_PCIE_DEVICE)) 1623 if (OPSTATUS_TEST_FLAG
1366 { 1624 (pAd, fOP_STATUS_PCIE_DEVICE)) {
1367 if (pAd->Antenna.field.RxPath > 1) 1625 if (pAd->Antenna.field.RxPath >
1368 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, pAd->StaCfg.BBPR3); 1626 1)
1627 RTMP_BBP_IO_WRITE8_BY_REG_ID
1628 (pAd, BBP_R3,
1629 pAd->StaCfg.BBPR3);
1369 } 1630 }
1370#endif // RTMP_MAC_PCI // 1631#endif // RTMP_MAC_PCI //
1371 } 1632 } else {
1372 else 1633 if ((pAd->CommonCfg.
1373 { 1634 bACMAPSDTr[QID_AC_VO])
1374 if ((pAd->CommonCfg.bACMAPSDTr[QID_AC_VO]) || 1635 || (pAd->CommonCfg.
1375 (pAd->CommonCfg.bACMAPSDTr[QID_AC_VI]) || 1636 bACMAPSDTr[QID_AC_VI])
1376 (pAd->CommonCfg.bACMAPSDTr[QID_AC_BK]) || 1637 || (pAd->CommonCfg.
1377 (pAd->CommonCfg.bACMAPSDTr[QID_AC_BE])) 1638 bACMAPSDTr[QID_AC_BK])
1378 { 1639 || (pAd->CommonCfg.
1640 bACMAPSDTr[QID_AC_BE])) {
1379 /* 1641 /*
1380 WMM Spec v1.0 3.6.2.4, 1642 WMM Spec v1.0 3.6.2.4,
1381 The WMM STA shall remain awake until it receives a 1643 The WMM STA shall remain awake until it receives a
1382 QoS Data or Null frame addressed to it, with the 1644 QoS Data or Null frame addressed to it, with the
1383 EOSP subfield in QoS Control field set to 1. 1645 EOSP subfield in QoS Control field set to 1.
1384 1646
1385 So we can not sleep here or we will suffer a case: 1647 So we can not sleep here or we will suffer a case:
1386 1648
1387 PS Management Frame --> 1649 PS Management Frame -->
1388 Trigger frame --> 1650 Trigger frame -->
1389 Beacon (TIM=0) (Beacon is closer to Trig frame) --> 1651 Beacon (TIM=0) (Beacon is closer to Trig frame) -->
1390 Station goes to sleep --> 1652 Station goes to sleep -->
1391 AP delivery queued UAPSD packets --> 1653 AP delivery queued UAPSD packets -->
1392 Station can NOT receive the reply 1654 Station can NOT receive the reply
1393 1655
1394 Maybe we need a timeout timer to avoid that we do 1656 Maybe we need a timeout timer to avoid that we do
1395 NOT receive the EOSP frame. 1657 NOT receive the EOSP frame.
1396 1658
1397 We can not use More Data to check if SP is ended 1659 We can not use More Data to check if SP is ended
1398 due to MaxSPLength. 1660 due to MaxSPLength.
1399 */ 1661 */
1400 } 1662 } else {
1401 else 1663 USHORT NextDtim = DtimCount;
1402 { 1664
1403 USHORT NextDtim = DtimCount; 1665 if (NextDtim == 0)
1404 1666 NextDtim = DtimPeriod;
1405 if (NextDtim == 0) 1667
1406 NextDtim = DtimPeriod; 1668 TbttNumToNextWakeUp =
1407 1669 pAd->StaCfg.
1408 TbttNumToNextWakeUp = pAd->StaCfg.DefaultListenCount; 1670 DefaultListenCount;
1409 if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM) && (TbttNumToNextWakeUp > NextDtim)) 1671 if (OPSTATUS_TEST_FLAG
1410 TbttNumToNextWakeUp = NextDtim; 1672 (pAd,
1411 1673 fOP_STATUS_RECEIVE_DTIM)
1412 if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) 1674 && (TbttNumToNextWakeUp >
1413 { 1675 NextDtim))
1414 // Set a flag to go to sleep . Then after parse this RxDoneInterrupt, will go to sleep mode. 1676 TbttNumToNextWakeUp =
1415 pAd->ThisTbttNumToNextWakeUp = TbttNumToNextWakeUp; 1677 NextDtim;
1416 AsicSleepThenAutoWakeup(pAd, pAd->ThisTbttNumToNextWakeUp); 1678
1679 if (!OPSTATUS_TEST_FLAG
1680 (pAd, fOP_STATUS_DOZE)) {
1681 // Set a flag to go to sleep . Then after parse this RxDoneInterrupt, will go to sleep mode.
1682 pAd->
1683 ThisTbttNumToNextWakeUp
1684 =
1685 TbttNumToNextWakeUp;
1686 AsicSleepThenAutoWakeup
1687 (pAd,
1688 pAd->
1689 ThisTbttNumToNextWakeUp);
1417 } 1690 }
1418 } 1691 }
1419 } 1692 }
@@ -1430,116 +1703,126 @@ VOID PeerBeacon(
1430 Receive PROBE REQ from remote peer when operating in IBSS mode 1703 Receive PROBE REQ from remote peer when operating in IBSS mode
1431 ========================================================================== 1704 ==========================================================================
1432 */ 1705 */
1433VOID PeerProbeReqAction( 1706VOID PeerProbeReqAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
1434 IN PRTMP_ADAPTER pAd,
1435 IN MLME_QUEUE_ELEM *Elem)
1436{ 1707{
1437 UCHAR Addr2[MAC_ADDR_LEN]; 1708 UCHAR Addr2[MAC_ADDR_LEN];
1438 CHAR Ssid[MAX_LEN_OF_SSID]; 1709 CHAR Ssid[MAX_LEN_OF_SSID];
1439 UCHAR SsidLen; 1710 UCHAR SsidLen;
1440 UCHAR HtLen, AddHtLen, NewExtLen; 1711 UCHAR HtLen, AddHtLen, NewExtLen;
1441 HEADER_802_11 ProbeRspHdr; 1712 HEADER_802_11 ProbeRspHdr;
1442 NDIS_STATUS NStatus; 1713 NDIS_STATUS NStatus;
1443 PUCHAR pOutBuffer = NULL; 1714 PUCHAR pOutBuffer = NULL;
1444 ULONG FrameLen = 0; 1715 ULONG FrameLen = 0;
1445 LARGE_INTEGER FakeTimestamp; 1716 LARGE_INTEGER FakeTimestamp;
1446 UCHAR DsLen = 1, IbssLen = 2; 1717 UCHAR DsLen = 1, IbssLen = 2;
1447 UCHAR LocalErpIe[3] = {IE_ERP, 1, 0}; 1718 UCHAR LocalErpIe[3] = { IE_ERP, 1, 0 };
1448 BOOLEAN Privacy; 1719 BOOLEAN Privacy;
1449 USHORT CapabilityInfo; 1720 USHORT CapabilityInfo;
1450 UCHAR RSNIe = IE_WPA; 1721 UCHAR RSNIe = IE_WPA;
1451 1722
1452 if (! ADHOC_ON(pAd)) 1723 if (!ADHOC_ON(pAd))
1453 return; 1724 return;
1454 1725
1455 if (PeerProbeReqSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, Ssid, &SsidLen)) 1726 if (PeerProbeReqSanity
1456 { 1727 (pAd, Elem->Msg, Elem->MsgLen, Addr2, Ssid, &SsidLen)) {
1457 if ((SsidLen == 0) || SSID_EQUAL(Ssid, SsidLen, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen)) 1728 if ((SsidLen == 0)
1458 { 1729 || SSID_EQUAL(Ssid, SsidLen, pAd->CommonCfg.Ssid,
1730 pAd->CommonCfg.SsidLen)) {
1459 // allocate and send out ProbeRsp frame 1731 // allocate and send out ProbeRsp frame
1460 NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory 1732 NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory
1461 if (NStatus != NDIS_STATUS_SUCCESS) 1733 if (NStatus != NDIS_STATUS_SUCCESS)
1462 return; 1734 return;
1463 1735
1464 //pAd->StaCfg.AtimWin = 0; // ?????? 1736 //pAd->StaCfg.AtimWin = 0; // ??????
1465 1737
1466 Privacy = (pAd->StaCfg.WepStatus == Ndis802_11Encryption1Enabled) || 1738 Privacy =
1467 (pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled) || 1739 (pAd->StaCfg.WepStatus ==
1468 (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled); 1740 Ndis802_11Encryption1Enabled)
1469 CapabilityInfo = CAP_GENERATE(0, 1, Privacy, (pAd->CommonCfg.TxPreamble == Rt802_11PreambleShort), 0, 0); 1741 || (pAd->StaCfg.WepStatus ==
1470 1742 Ndis802_11Encryption2Enabled)
1471 MakeOutgoingFrame(pOutBuffer, &FrameLen, 1743 || (pAd->StaCfg.WepStatus ==
1472 sizeof(HEADER_802_11), &ProbeRspHdr, 1744 Ndis802_11Encryption3Enabled);
1473 TIMESTAMP_LEN, &FakeTimestamp, 1745 CapabilityInfo =
1474 2, &pAd->CommonCfg.BeaconPeriod, 1746 CAP_GENERATE(0, 1, Privacy,
1475 2, &CapabilityInfo, 1747 (pAd->CommonCfg.TxPreamble ==
1476 1, &SsidIe, 1748 Rt802_11PreambleShort), 0, 0);
1477 1, &pAd->CommonCfg.SsidLen, 1749
1478 pAd->CommonCfg.SsidLen, pAd->CommonCfg.Ssid, 1750 MakeOutgoingFrame(pOutBuffer, &FrameLen,
1479 1, &SupRateIe, 1751 sizeof(HEADER_802_11), &ProbeRspHdr,
1480 1, &pAd->StaActive.SupRateLen, 1752 TIMESTAMP_LEN, &FakeTimestamp,
1481 pAd->StaActive.SupRateLen, pAd->StaActive.SupRate, 1753 2, &pAd->CommonCfg.BeaconPeriod,
1482 1, &DsIe, 1754 2, &CapabilityInfo,
1483 1, &DsLen, 1755 1, &SsidIe,
1484 1, &pAd->CommonCfg.Channel, 1756 1, &pAd->CommonCfg.SsidLen,
1485 1, &IbssIe, 1757 pAd->CommonCfg.SsidLen,
1486 1, &IbssLen, 1758 pAd->CommonCfg.Ssid, 1, &SupRateIe, 1,
1487 2, &pAd->StaActive.AtimWin, 1759 &pAd->StaActive.SupRateLen,
1488 END_OF_ARGS); 1760 pAd->StaActive.SupRateLen,
1489 1761 pAd->StaActive.SupRate, 1, &DsIe, 1,
1490 if (pAd->StaActive.ExtRateLen) 1762 &DsLen, 1, &pAd->CommonCfg.Channel, 1,
1491 { 1763 &IbssIe, 1, &IbssLen, 2,
1764 &pAd->StaActive.AtimWin, END_OF_ARGS);
1765
1766 if (pAd->StaActive.ExtRateLen) {
1492 ULONG tmp; 1767 ULONG tmp;
1493 MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, 1768 MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,
1494 3, LocalErpIe, 1769 3, LocalErpIe,
1495 1, &ExtRateIe, 1770 1, &ExtRateIe,
1496 1, &pAd->StaActive.ExtRateLen, 1771 1, &pAd->StaActive.ExtRateLen,
1497 pAd->StaActive.ExtRateLen, &pAd->StaActive.ExtRate, 1772 pAd->StaActive.ExtRateLen,
1498 END_OF_ARGS); 1773 &pAd->StaActive.ExtRate,
1774 END_OF_ARGS);
1499 FrameLen += tmp; 1775 FrameLen += tmp;
1500 } 1776 }
1501
1502 // If adhoc secruity is set for WPA-None, append the cipher suite IE 1777 // If adhoc secruity is set for WPA-None, append the cipher suite IE
1503 if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone) 1778 if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone) {
1504 {
1505 ULONG tmp; 1779 ULONG tmp;
1506 MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, 1780 MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,
1507 1, &RSNIe, 1781 1, &RSNIe,
1508 1, &pAd->StaCfg.RSNIE_Len, 1782 1, &pAd->StaCfg.RSNIE_Len,
1509 pAd->StaCfg.RSNIE_Len, pAd->StaCfg.RSN_IE, 1783 pAd->StaCfg.RSNIE_Len,
1510 END_OF_ARGS); 1784 pAd->StaCfg.RSN_IE,
1785 END_OF_ARGS);
1511 FrameLen += tmp; 1786 FrameLen += tmp;
1512 } 1787 }
1513 1788
1514 if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) 1789 if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) {
1515 {
1516 ULONG TmpLen; 1790 ULONG TmpLen;
1517 UCHAR BROADCOM[4] = {0x0, 0x90, 0x4c, 0x33}; 1791 UCHAR BROADCOM[4] = { 0x0, 0x90, 0x4c, 0x33 };
1518 HtLen = sizeof(pAd->CommonCfg.HtCapability); 1792 HtLen = sizeof(pAd->CommonCfg.HtCapability);
1519 AddHtLen = sizeof(pAd->CommonCfg.AddHTInfo); 1793 AddHtLen = sizeof(pAd->CommonCfg.AddHTInfo);
1520 NewExtLen = 1; 1794 NewExtLen = 1;
1521 //New extension channel offset IE is included in Beacon, Probe Rsp or channel Switch Announcement Frame 1795 //New extension channel offset IE is included in Beacon, Probe Rsp or channel Switch Announcement Frame
1522 if (pAd->bBroadComHT == TRUE) 1796 if (pAd->bBroadComHT == TRUE) {
1523 { 1797 MakeOutgoingFrame(pOutBuffer + FrameLen,
1524 MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1798 &TmpLen, 1, &WpaIe, 4,
1525 1, &WpaIe, 1799 &BROADCOM[0],
1526 4, &BROADCOM[0], 1800 pAd->MlmeAux.
1527 pAd->MlmeAux.HtCapabilityLen, &pAd->MlmeAux.HtCapability, 1801 HtCapabilityLen,
1528 END_OF_ARGS); 1802 &pAd->MlmeAux.
1529 } 1803 HtCapability,
1530 else 1804 END_OF_ARGS);
1531 { 1805 } else {
1532 MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, 1806 MakeOutgoingFrame(pOutBuffer + FrameLen,
1533 1, &HtCapIe, 1807 &TmpLen, 1, &HtCapIe,
1534 1, &HtLen, 1808 1, &HtLen,
1535 sizeof(HT_CAPABILITY_IE), &pAd->CommonCfg.HtCapability, 1809 sizeof
1536 1, &AddHtInfoIe, 1810 (HT_CAPABILITY_IE),
1537 1, &AddHtLen, 1811 &pAd->CommonCfg.
1538 sizeof(ADD_HT_INFO_IE), &pAd->CommonCfg.AddHTInfo, 1812 HtCapability, 1,
1539 1, &NewExtChanIe, 1813 &AddHtInfoIe, 1,
1540 1, &NewExtLen, 1814 &AddHtLen,
1541 sizeof(NEW_EXT_CHAN_IE), &pAd->CommonCfg.NewExtChanOffset, 1815 sizeof
1542 END_OF_ARGS); 1816 (ADD_HT_INFO_IE),
1817 &pAd->CommonCfg.
1818 AddHTInfo, 1,
1819 &NewExtChanIe, 1,
1820 &NewExtLen,
1821 sizeof
1822 (NEW_EXT_CHAN_IE),
1823 &pAd->CommonCfg.
1824 NewExtChanOffset,
1825 END_OF_ARGS);
1543 } 1826 }
1544 FrameLen += TmpLen; 1827 FrameLen += TmpLen;
1545 } 1828 }
@@ -1550,9 +1833,7 @@ VOID PeerProbeReqAction(
1550 } 1833 }
1551} 1834}
1552 1835
1553VOID BeaconTimeoutAtJoinAction( 1836VOID BeaconTimeoutAtJoinAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
1554 IN PRTMP_ADAPTER pAd,
1555 IN MLME_QUEUE_ELEM *Elem)
1556{ 1837{
1557 USHORT Status; 1838 USHORT Status;
1558 DBGPRINT(RT_DEBUG_TRACE, ("SYNC - BeaconTimeoutAtJoinAction\n")); 1839 DBGPRINT(RT_DEBUG_TRACE, ("SYNC - BeaconTimeoutAtJoinAction\n"));
@@ -1567,17 +1848,15 @@ VOID BeaconTimeoutAtJoinAction(
1567 Scan timeout procedure. basically add channel index by 1 and rescan 1848 Scan timeout procedure. basically add channel index by 1 and rescan
1568 ========================================================================== 1849 ==========================================================================
1569 */ 1850 */
1570VOID ScanTimeoutAction( 1851VOID ScanTimeoutAction(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
1571 IN PRTMP_ADAPTER pAd,
1572 IN MLME_QUEUE_ELEM *Elem)
1573{ 1852{
1574 pAd->MlmeAux.Channel = NextChannel(pAd, pAd->MlmeAux.Channel); 1853 pAd->MlmeAux.Channel = NextChannel(pAd, pAd->MlmeAux.Channel);
1575 1854
1576 // Only one channel scanned for CISCO beacon request 1855 // Only one channel scanned for CISCO beacon request
1577 if ((pAd->MlmeAux.ScanType == SCAN_CISCO_ACTIVE) || 1856 if ((pAd->MlmeAux.ScanType == SCAN_CISCO_ACTIVE) ||
1578 (pAd->MlmeAux.ScanType == SCAN_CISCO_PASSIVE) || 1857 (pAd->MlmeAux.ScanType == SCAN_CISCO_PASSIVE) ||
1579 (pAd->MlmeAux.ScanType == SCAN_CISCO_NOISE) || 1858 (pAd->MlmeAux.ScanType == SCAN_CISCO_NOISE) ||
1580 (pAd->MlmeAux.ScanType == SCAN_CISCO_CHANNEL_LOAD)) 1859 (pAd->MlmeAux.ScanType == SCAN_CISCO_CHANNEL_LOAD))
1581 pAd->MlmeAux.Channel = 0; 1860 pAd->MlmeAux.Channel = 0;
1582 1861
1583 // this routine will stop if pAd->MlmeAux.Channel == 0 1862 // this routine will stop if pAd->MlmeAux.Channel == 0
@@ -1589,12 +1868,12 @@ VOID ScanTimeoutAction(
1589 Description: 1868 Description:
1590 ========================================================================== 1869 ==========================================================================
1591 */ 1870 */
1592VOID InvalidStateWhenScan( 1871VOID InvalidStateWhenScan(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
1593 IN PRTMP_ADAPTER pAd,
1594 IN MLME_QUEUE_ELEM *Elem)
1595{ 1872{
1596 USHORT Status; 1873 USHORT Status;
1597 DBGPRINT(RT_DEBUG_TRACE, ("AYNC - InvalidStateWhenScan(state=%ld). Reset SYNC machine\n", pAd->Mlme.SyncMachine.CurrState)); 1874 DBGPRINT(RT_DEBUG_TRACE,
1875 ("AYNC - InvalidStateWhenScan(state=%ld). Reset SYNC machine\n",
1876 pAd->Mlme.SyncMachine.CurrState));
1598 pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE; 1877 pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;
1599 Status = MLME_STATE_MACHINE_REJECT; 1878 Status = MLME_STATE_MACHINE_REJECT;
1600 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status); 1879 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status);
@@ -1605,12 +1884,12 @@ VOID InvalidStateWhenScan(
1605 Description: 1884 Description:
1606 ========================================================================== 1885 ==========================================================================
1607 */ 1886 */
1608VOID InvalidStateWhenJoin( 1887VOID InvalidStateWhenJoin(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
1609 IN PRTMP_ADAPTER pAd,
1610 IN MLME_QUEUE_ELEM *Elem)
1611{ 1888{
1612 USHORT Status; 1889 USHORT Status;
1613 DBGPRINT(RT_DEBUG_TRACE, ("InvalidStateWhenJoin(state=%ld). Reset SYNC machine\n", pAd->Mlme.SyncMachine.CurrState)); 1890 DBGPRINT(RT_DEBUG_TRACE,
1891 ("InvalidStateWhenJoin(state=%ld). Reset SYNC machine\n",
1892 pAd->Mlme.SyncMachine.CurrState));
1614 pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE; 1893 pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;
1615 Status = MLME_STATE_MACHINE_REJECT; 1894 Status = MLME_STATE_MACHINE_REJECT;
1616 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_JOIN_CONF, 2, &Status); 1895 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_JOIN_CONF, 2, &Status);
@@ -1621,12 +1900,12 @@ VOID InvalidStateWhenJoin(
1621 Description: 1900 Description:
1622 ========================================================================== 1901 ==========================================================================
1623 */ 1902 */
1624VOID InvalidStateWhenStart( 1903VOID InvalidStateWhenStart(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
1625 IN PRTMP_ADAPTER pAd,
1626 IN MLME_QUEUE_ELEM *Elem)
1627{ 1904{
1628 USHORT Status; 1905 USHORT Status;
1629 DBGPRINT(RT_DEBUG_TRACE, ("InvalidStateWhenStart(state=%ld). Reset SYNC machine\n", pAd->Mlme.SyncMachine.CurrState)); 1906 DBGPRINT(RT_DEBUG_TRACE,
1907 ("InvalidStateWhenStart(state=%ld). Reset SYNC machine\n",
1908 pAd->Mlme.SyncMachine.CurrState));
1630 pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE; 1909 pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;
1631 Status = MLME_STATE_MACHINE_REJECT; 1910 Status = MLME_STATE_MACHINE_REJECT;
1632 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_START_CONF, 2, &Status); 1911 MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_START_CONF, 2, &Status);
@@ -1640,56 +1919,51 @@ VOID InvalidStateWhenStart(
1640 1919
1641 ========================================================================== 1920 ==========================================================================
1642 */ 1921 */
1643VOID EnqueuePsPoll( 1922VOID EnqueuePsPoll(IN PRTMP_ADAPTER pAd)
1644 IN PRTMP_ADAPTER pAd)
1645{ 1923{
1646 1924
1647
1648 if (pAd->StaCfg.WindowsPowerMode == Ndis802_11PowerModeLegacy_PSP) 1925 if (pAd->StaCfg.WindowsPowerMode == Ndis802_11PowerModeLegacy_PSP)
1649 pAd->PsPollFrame.FC.PwrMgmt = PWR_SAVE; 1926 pAd->PsPollFrame.FC.PwrMgmt = PWR_SAVE;
1650 MiniportMMRequest(pAd, 0, (PUCHAR)&pAd->PsPollFrame, sizeof(PSPOLL_FRAME)); 1927 MiniportMMRequest(pAd, 0, (PUCHAR) & pAd->PsPollFrame,
1928 sizeof(PSPOLL_FRAME));
1651} 1929}
1652 1930
1653
1654/* 1931/*
1655 ========================================================================== 1932 ==========================================================================
1656 Description: 1933 Description:
1657 ========================================================================== 1934 ==========================================================================
1658 */ 1935 */
1659VOID EnqueueProbeRequest( 1936VOID EnqueueProbeRequest(IN PRTMP_ADAPTER pAd)
1660 IN PRTMP_ADAPTER pAd)
1661{ 1937{
1662 NDIS_STATUS NState; 1938 NDIS_STATUS NState;
1663 PUCHAR pOutBuffer; 1939 PUCHAR pOutBuffer;
1664 ULONG FrameLen = 0; 1940 ULONG FrameLen = 0;
1665 HEADER_802_11 Hdr80211; 1941 HEADER_802_11 Hdr80211;
1666 1942
1667 DBGPRINT(RT_DEBUG_TRACE, ("force out a ProbeRequest ...\n")); 1943 DBGPRINT(RT_DEBUG_TRACE, ("force out a ProbeRequest ...\n"));
1668 1944
1669 NState = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory 1945 NState = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory
1670 if (NState == NDIS_STATUS_SUCCESS) 1946 if (NState == NDIS_STATUS_SUCCESS) {
1671 { 1947 MgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0,
1672 MgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0, BROADCAST_ADDR, BROADCAST_ADDR); 1948 BROADCAST_ADDR, BROADCAST_ADDR);
1673 1949
1674 // this ProbeRequest explicitly specify SSID to reduce unwanted ProbeResponse 1950 // this ProbeRequest explicitly specify SSID to reduce unwanted ProbeResponse
1675 MakeOutgoingFrame(pOutBuffer, &FrameLen, 1951 MakeOutgoingFrame(pOutBuffer, &FrameLen,
1676 sizeof(HEADER_802_11), &Hdr80211, 1952 sizeof(HEADER_802_11), &Hdr80211,
1677 1, &SsidIe, 1953 1, &SsidIe,
1678 1, &pAd->CommonCfg.SsidLen, 1954 1, &pAd->CommonCfg.SsidLen,
1679 pAd->CommonCfg.SsidLen, pAd->CommonCfg.Ssid, 1955 pAd->CommonCfg.SsidLen, pAd->CommonCfg.Ssid,
1680 1, &SupRateIe, 1956 1, &SupRateIe,
1681 1, &pAd->StaActive.SupRateLen, 1957 1, &pAd->StaActive.SupRateLen,
1682 pAd->StaActive.SupRateLen, pAd->StaActive.SupRate, 1958 pAd->StaActive.SupRateLen,
1683 END_OF_ARGS); 1959 pAd->StaActive.SupRate, END_OF_ARGS);
1684 MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); 1960 MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
1685 MlmeFreeMemory(pAd, pOutBuffer); 1961 MlmeFreeMemory(pAd, pOutBuffer);
1686 } 1962 }
1687 1963
1688} 1964}
1689 1965
1690BOOLEAN ScanRunning( 1966BOOLEAN ScanRunning(IN PRTMP_ADAPTER pAd)
1691 IN PRTMP_ADAPTER pAd)
1692{ 1967{
1693 return (pAd->Mlme.SyncMachine.CurrState == SCAN_LISTEN) ? TRUE : FALSE; 1968 return (pAd->Mlme.SyncMachine.CurrState == SCAN_LISTEN) ? TRUE : FALSE;
1694} 1969}
1695
diff --git a/drivers/staging/rt2860/sta/wpa.c b/drivers/staging/rt2860/sta/wpa.c
index c6c3f3bc418..0a45643eedd 100644
--- a/drivers/staging/rt2860/sta/wpa.c
+++ b/drivers/staging/rt2860/sta/wpa.c
@@ -37,7 +37,7 @@
37*/ 37*/
38#include "../rt_config.h" 38#include "../rt_config.h"
39 39
40void inc_byte_array(UCHAR *counter, int len); 40void inc_byte_array(UCHAR * counter, int len);
41 41
42/* 42/*
43 ======================================================================== 43 ========================================================================
@@ -58,33 +58,29 @@ void inc_byte_array(UCHAR *counter, int len);
58 58
59 ======================================================================== 59 ========================================================================
60*/ 60*/
61VOID RTMPReportMicError( 61VOID RTMPReportMicError(IN PRTMP_ADAPTER pAd, IN PCIPHER_KEY pWpaKey)
62 IN PRTMP_ADAPTER pAd,
63 IN PCIPHER_KEY pWpaKey)
64{ 62{
65 ULONG Now; 63 ULONG Now;
66 UCHAR unicastKey = (pWpaKey->Type == PAIRWISE_KEY ? 1:0); 64 UCHAR unicastKey = (pWpaKey->Type == PAIRWISE_KEY ? 1 : 0);
67 65
68 // Record Last MIC error time and count 66 // Record Last MIC error time and count
69 NdisGetSystemUpTime(&Now); 67 NdisGetSystemUpTime(&Now);
70 if (pAd->StaCfg.MicErrCnt == 0) 68 if (pAd->StaCfg.MicErrCnt == 0) {
71 {
72 pAd->StaCfg.MicErrCnt++; 69 pAd->StaCfg.MicErrCnt++;
73 pAd->StaCfg.LastMicErrorTime = Now; 70 pAd->StaCfg.LastMicErrorTime = Now;
74 NdisZeroMemory(pAd->StaCfg.ReplayCounter, 8); 71 NdisZeroMemory(pAd->StaCfg.ReplayCounter, 8);
75 } 72 } else if (pAd->StaCfg.MicErrCnt == 1) {
76 else if (pAd->StaCfg.MicErrCnt == 1) 73 if ((pAd->StaCfg.LastMicErrorTime + (60 * OS_HZ)) < Now) {
77 {
78 if ((pAd->StaCfg.LastMicErrorTime + (60 * OS_HZ)) < Now)
79 {
80 // Update Last MIC error time, this did not violate two MIC errors within 60 seconds 74 // Update Last MIC error time, this did not violate two MIC errors within 60 seconds
81 pAd->StaCfg.LastMicErrorTime = Now; 75 pAd->StaCfg.LastMicErrorTime = Now;
82 } 76 } else {
83 else
84 {
85 77
86 if (pAd->CommonCfg.bWirelessEvent) 78 if (pAd->CommonCfg.bWirelessEvent)
87 RTMPSendWirelessEvent(pAd, IW_COUNTER_MEASURES_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0); 79 RTMPSendWirelessEvent(pAd,
80 IW_COUNTER_MEASURES_EVENT_FLAG,
81 pAd->MacTab.
82 Content[BSSID_WCID].Addr,
83 BSS0, 0);
88 84
89 pAd->StaCfg.LastMicErrorTime = Now; 85 pAd->StaCfg.LastMicErrorTime = Now;
90 // Violate MIC error counts, MIC countermeasures kicks in 86 // Violate MIC error counts, MIC countermeasures kicks in
@@ -101,154 +97,139 @@ VOID RTMPReportMicError(
101 // RTMPRingCleanUp(pAd, QID_AC_VO); 97 // RTMPRingCleanUp(pAd, QID_AC_VO);
102 // RTMPRingCleanUp(pAd, QID_HCCA); 98 // RTMPRingCleanUp(pAd, QID_HCCA);
103 } 99 }
104 } 100 } else {
105 else
106 {
107 // MIC error count >= 2 101 // MIC error count >= 2
108 // This should not happen 102 // This should not happen
109 ; 103 ;
110 } 104 }
111 MlmeEnqueue(pAd, 105 MlmeEnqueue(pAd,
112 MLME_CNTL_STATE_MACHINE, 106 MLME_CNTL_STATE_MACHINE,
113 OID_802_11_MIC_FAILURE_REPORT_FRAME, 107 OID_802_11_MIC_FAILURE_REPORT_FRAME, 1, &unicastKey);
114 1, 108
115 &unicastKey); 109 if (pAd->StaCfg.MicErrCnt == 2) {
116 110 RTMPSetTimer(&pAd->StaCfg.WpaDisassocAndBlockAssocTimer, 100);
117 if (pAd->StaCfg.MicErrCnt == 2) 111 }
118 {
119 RTMPSetTimer(&pAd->StaCfg.WpaDisassocAndBlockAssocTimer, 100);
120 }
121} 112}
122 113
123#define LENGTH_EAP_H 4 114#define LENGTH_EAP_H 4
124// If the received frame is EAP-Packet ,find out its EAP-Code (Request(0x01), Response(0x02), Success(0x03), Failure(0x04)). 115// If the received frame is EAP-Packet ,find out its EAP-Code (Request(0x01), Response(0x02), Success(0x03), Failure(0x04)).
125INT WpaCheckEapCode( 116INT WpaCheckEapCode(IN PRTMP_ADAPTER pAd,
126 IN PRTMP_ADAPTER pAd, 117 IN PUCHAR pFrame, IN USHORT FrameLen, IN USHORT OffSet)
127 IN PUCHAR pFrame,
128 IN USHORT FrameLen,
129 IN USHORT OffSet)
130{ 118{
131 119
132 PUCHAR pData; 120 PUCHAR pData;
133 INT result = 0; 121 INT result = 0;
134 122
135 if( FrameLen < OffSet + LENGTH_EAPOL_H + LENGTH_EAP_H ) 123 if (FrameLen < OffSet + LENGTH_EAPOL_H + LENGTH_EAP_H)
136 return result; 124 return result;
137 125
138 pData = pFrame + OffSet; // skip offset bytes 126 pData = pFrame + OffSet; // skip offset bytes
139 127
140 if(*(pData+1) == EAPPacket) // 802.1x header - Packet Type 128 if (*(pData + 1) == EAPPacket) // 802.1x header - Packet Type
141 { 129 {
142 result = *(pData+4); // EAP header - Code 130 result = *(pData + 4); // EAP header - Code
143 } 131 }
144 132
145 return result; 133 return result;
146} 134}
147 135
148VOID WpaSendMicFailureToWpaSupplicant( 136VOID WpaSendMicFailureToWpaSupplicant(IN PRTMP_ADAPTER pAd, IN BOOLEAN bUnicast)
149 IN PRTMP_ADAPTER pAd,
150 IN BOOLEAN bUnicast)
151{ 137{
152 char custom[IW_CUSTOM_MAX] = {0}; 138 char custom[IW_CUSTOM_MAX] = { 0 };
153 139
154 sprintf(custom, "MLME-MICHAELMICFAILURE.indication"); 140 sprintf(custom, "MLME-MICHAELMICFAILURE.indication");
155 if(bUnicast) 141 if (bUnicast)
156 sprintf(custom, "%s unicast", custom); 142 sprintf(custom, "%s unicast", custom);
157 143
158 RtmpOSWrielessEventSend(pAd, IWEVCUSTOM, -1, NULL, (PUCHAR)custom, strlen(custom)); 144 RtmpOSWrielessEventSend(pAd, IWEVCUSTOM, -1, NULL, (PUCHAR) custom,
145 strlen(custom));
159 146
160 return; 147 return;
161} 148}
162 149
163VOID WpaMicFailureReportFrame( 150VOID WpaMicFailureReportFrame(IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM * Elem)
164 IN PRTMP_ADAPTER pAd,
165 IN MLME_QUEUE_ELEM *Elem)
166{ 151{
167 PUCHAR pOutBuffer = NULL; 152 PUCHAR pOutBuffer = NULL;
168 UCHAR Header802_3[14]; 153 UCHAR Header802_3[14];
169 ULONG FrameLen = 0; 154 ULONG FrameLen = 0;
170 EAPOL_PACKET Packet; 155 EAPOL_PACKET Packet;
171 UCHAR Mic[16]; 156 UCHAR Mic[16];
172 BOOLEAN bUnicast; 157 BOOLEAN bUnicast;
173 158
174 DBGPRINT(RT_DEBUG_TRACE, ("WpaMicFailureReportFrame ----->\n")); 159 DBGPRINT(RT_DEBUG_TRACE, ("WpaMicFailureReportFrame ----->\n"));
175 160
176 bUnicast = (Elem->Msg[0] == 1 ? TRUE:FALSE); 161 bUnicast = (Elem->Msg[0] == 1 ? TRUE : FALSE);
177 pAd->Sequence = ((pAd->Sequence) + 1) & (MAX_SEQ_NUMBER); 162 pAd->Sequence = ((pAd->Sequence) + 1) & (MAX_SEQ_NUMBER);
178 163
179 // init 802.3 header and Fill Packet 164 // init 802.3 header and Fill Packet
180 MAKE_802_3_HEADER(Header802_3, pAd->CommonCfg.Bssid, pAd->CurrentAddress, EAPOL); 165 MAKE_802_3_HEADER(Header802_3, pAd->CommonCfg.Bssid,
166 pAd->CurrentAddress, EAPOL);
181 167
182 NdisZeroMemory(&Packet, sizeof(Packet)); 168 NdisZeroMemory(&Packet, sizeof(Packet));
183 Packet.ProVer = EAPOL_VER; 169 Packet.ProVer = EAPOL_VER;
184 Packet.ProType = EAPOLKey; 170 Packet.ProType = EAPOLKey;
185 171
186 Packet.KeyDesc.Type = WPA1_KEY_DESC; 172 Packet.KeyDesc.Type = WPA1_KEY_DESC;
187 173
188 // Request field presented 174 // Request field presented
189 Packet.KeyDesc.KeyInfo.Request = 1; 175 Packet.KeyDesc.KeyInfo.Request = 1;
190 176
191 if(pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled) 177 if (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled) {
192 {
193 Packet.KeyDesc.KeyInfo.KeyDescVer = 2; 178 Packet.KeyDesc.KeyInfo.KeyDescVer = 2;
194 } 179 } else // TKIP
195 else // TKIP
196 { 180 {
197 Packet.KeyDesc.KeyInfo.KeyDescVer = 1; 181 Packet.KeyDesc.KeyInfo.KeyDescVer = 1;
198 } 182 }
199 183
200 Packet.KeyDesc.KeyInfo.KeyType = (bUnicast ? PAIRWISEKEY : GROUPKEY); 184 Packet.KeyDesc.KeyInfo.KeyType = (bUnicast ? PAIRWISEKEY : GROUPKEY);
201 185
202 // KeyMic field presented 186 // KeyMic field presented
203 Packet.KeyDesc.KeyInfo.KeyMic = 1; 187 Packet.KeyDesc.KeyInfo.KeyMic = 1;
204 188
205 // Error field presented 189 // Error field presented
206 Packet.KeyDesc.KeyInfo.Error = 1; 190 Packet.KeyDesc.KeyInfo.Error = 1;
207 191
208 // Update packet length after decide Key data payload 192 // Update packet length after decide Key data payload
209 SET_UINT16_TO_ARRARY(Packet.Body_Len, LEN_EAPOL_KEY_MSG) 193 SET_UINT16_TO_ARRARY(Packet.Body_Len, LEN_EAPOL_KEY_MSG)
210 194 // Key Replay Count
211 // Key Replay Count 195 NdisMoveMemory(Packet.KeyDesc.ReplayCounter,
212 NdisMoveMemory(Packet.KeyDesc.ReplayCounter, pAd->StaCfg.ReplayCounter, LEN_KEY_DESC_REPLAY); 196 pAd->StaCfg.ReplayCounter, LEN_KEY_DESC_REPLAY);
213 inc_byte_array(pAd->StaCfg.ReplayCounter, 8); 197 inc_byte_array(pAd->StaCfg.ReplayCounter, 8);
214 198
215 // Convert to little-endian format. 199 // Convert to little-endian format.
216 *((USHORT *)&Packet.KeyDesc.KeyInfo) = cpu2le16(*((USHORT *)&Packet.KeyDesc.KeyInfo)); 200 *((USHORT *) & Packet.KeyDesc.KeyInfo) =
217 201 cpu2le16(*((USHORT *) & Packet.KeyDesc.KeyInfo));
218 202
219 MlmeAllocateMemory(pAd, (PUCHAR *)&pOutBuffer); // allocate memory 203 MlmeAllocateMemory(pAd, (PUCHAR *) & pOutBuffer); // allocate memory
220 if(pOutBuffer == NULL) 204 if (pOutBuffer == NULL) {
221 {
222 return; 205 return;
223 } 206 }
224
225 // Prepare EAPOL frame for MIC calculation 207 // Prepare EAPOL frame for MIC calculation
226 // Be careful, only EAPOL frame is counted for MIC calculation 208 // Be careful, only EAPOL frame is counted for MIC calculation
227 MakeOutgoingFrame(pOutBuffer, &FrameLen, 209 MakeOutgoingFrame(pOutBuffer, &FrameLen,
228 CONV_ARRARY_TO_UINT16(Packet.Body_Len) + 4, &Packet, 210 CONV_ARRARY_TO_UINT16(Packet.Body_Len) + 4, &Packet,
229 END_OF_ARGS); 211 END_OF_ARGS);
230 212
231 // Prepare and Fill MIC value 213 // Prepare and Fill MIC value
232 NdisZeroMemory(Mic, sizeof(Mic)); 214 NdisZeroMemory(Mic, sizeof(Mic));
233 if(pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled) 215 if (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled) { // AES
234 { // AES 216 UCHAR digest[20] = { 0 };
235 UCHAR digest[20] = {0}; 217 HMAC_SHA1(pAd->StaCfg.PTK, LEN_EAP_MICK, pOutBuffer, FrameLen,
236 HMAC_SHA1(pAd->StaCfg.PTK, LEN_EAP_MICK, pOutBuffer, FrameLen, digest, SHA1_DIGEST_SIZE); 218 digest, SHA1_DIGEST_SIZE);
237 NdisMoveMemory(Mic, digest, LEN_KEY_DESC_MIC); 219 NdisMoveMemory(Mic, digest, LEN_KEY_DESC_MIC);
238 } 220 } else { // TKIP
239 else 221 HMAC_MD5(pAd->StaCfg.PTK, LEN_EAP_MICK, pOutBuffer, FrameLen,
240 { // TKIP 222 Mic, MD5_DIGEST_SIZE);
241 HMAC_MD5(pAd->StaCfg.PTK, LEN_EAP_MICK, pOutBuffer, FrameLen, Mic, MD5_DIGEST_SIZE);
242 } 223 }
243 NdisMoveMemory(Packet.KeyDesc.KeyMic, Mic, LEN_KEY_DESC_MIC); 224 NdisMoveMemory(Packet.KeyDesc.KeyMic, Mic, LEN_KEY_DESC_MIC);
244 225
245 // copy frame to Tx ring and send MIC failure report frame to authenticator 226 // copy frame to Tx ring and send MIC failure report frame to authenticator
246 RTMPToWirelessSta(pAd, &pAd->MacTab.Content[BSSID_WCID], 227 RTMPToWirelessSta(pAd, &pAd->MacTab.Content[BSSID_WCID],
247 Header802_3, LENGTH_802_3, 228 Header802_3, LENGTH_802_3,
248 (PUCHAR)&Packet, 229 (PUCHAR) & Packet,
249 CONV_ARRARY_TO_UINT16(Packet.Body_Len) + 4, FALSE); 230 CONV_ARRARY_TO_UINT16(Packet.Body_Len) + 4, FALSE);
250 231
251 MlmeFreeMemory(pAd, (PUCHAR)pOutBuffer); 232 MlmeFreeMemory(pAd, (PUCHAR) pOutBuffer);
252 233
253 DBGPRINT(RT_DEBUG_TRACE, ("WpaMicFailureReportFrame <-----\n")); 234 DBGPRINT(RT_DEBUG_TRACE, ("WpaMicFailureReportFrame <-----\n"));
254} 235}
@@ -262,7 +243,7 @@ VOID WpaMicFailureReportFrame(
262 * rolling over to more significant bytes if the byte was incremented from 243 * rolling over to more significant bytes if the byte was incremented from
263 * 0xff to 0x00. 244 * 0xff to 0x00.
264 */ 245 */
265void inc_byte_array(UCHAR *counter, int len) 246void inc_byte_array(UCHAR * counter, int len)
266{ 247{
267 int pos = len - 1; 248 int pos = len - 1;
268 while (pos >= 0) { 249 while (pos >= 0) {
@@ -273,26 +254,27 @@ void inc_byte_array(UCHAR *counter, int len)
273 } 254 }
274} 255}
275 256
276VOID WpaDisassocApAndBlockAssoc( 257VOID WpaDisassocApAndBlockAssoc(IN PVOID SystemSpecific1,
277 IN PVOID SystemSpecific1, 258 IN PVOID FunctionContext,
278 IN PVOID FunctionContext, 259 IN PVOID SystemSpecific2,
279 IN PVOID SystemSpecific2, 260 IN PVOID SystemSpecific3)
280 IN PVOID SystemSpecific3)
281{ 261{
282 RTMP_ADAPTER *pAd = (PRTMP_ADAPTER)FunctionContext; 262 RTMP_ADAPTER *pAd = (PRTMP_ADAPTER) FunctionContext;
283 MLME_DISASSOC_REQ_STRUCT DisassocReq; 263 MLME_DISASSOC_REQ_STRUCT DisassocReq;
284 264
285 // disassoc from current AP first 265 // disassoc from current AP first
286 DBGPRINT(RT_DEBUG_TRACE, ("RTMPReportMicError - disassociate with current AP after sending second continuous EAPOL frame\n")); 266 DBGPRINT(RT_DEBUG_TRACE,
287 DisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid, REASON_MIC_FAILURE); 267 ("RTMPReportMicError - disassociate with current AP after sending second continuous EAPOL frame\n"));
288 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ, sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq); 268 DisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid,
269 REASON_MIC_FAILURE);
270 MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ,
271 sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq);
289 272
290 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC; 273 pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC;
291 pAd->StaCfg.bBlockAssoc = TRUE; 274 pAd->StaCfg.bBlockAssoc = TRUE;
292} 275}
293 276
294VOID WpaStaPairwiseKeySetting( 277VOID WpaStaPairwiseKeySetting(IN PRTMP_ADAPTER pAd)
295 IN PRTMP_ADAPTER pAd)
296{ 278{
297 PCIPHER_KEY pSharedKey; 279 PCIPHER_KEY pSharedKey;
298 PMAC_TABLE_ENTRY pEntry; 280 PMAC_TABLE_ENTRY pEntry;
@@ -307,9 +289,11 @@ VOID WpaStaPairwiseKeySetting(
307 // Prepare pair-wise key information into shared key table 289 // Prepare pair-wise key information into shared key table
308 NdisZeroMemory(pSharedKey, sizeof(CIPHER_KEY)); 290 NdisZeroMemory(pSharedKey, sizeof(CIPHER_KEY));
309 pSharedKey->KeyLen = LEN_TKIP_EK; 291 pSharedKey->KeyLen = LEN_TKIP_EK;
310 NdisMoveMemory(pSharedKey->Key, &pAd->StaCfg.PTK[32], LEN_TKIP_EK); 292 NdisMoveMemory(pSharedKey->Key, &pAd->StaCfg.PTK[32], LEN_TKIP_EK);
311 NdisMoveMemory(pSharedKey->RxMic, &pAd->StaCfg.PTK[48], LEN_TKIP_RXMICK); 293 NdisMoveMemory(pSharedKey->RxMic, &pAd->StaCfg.PTK[48],
312 NdisMoveMemory(pSharedKey->TxMic, &pAd->StaCfg.PTK[48+LEN_TKIP_RXMICK], LEN_TKIP_TXMICK); 294 LEN_TKIP_RXMICK);
295 NdisMoveMemory(pSharedKey->TxMic,
296 &pAd->StaCfg.PTK[48 + LEN_TKIP_RXMICK], LEN_TKIP_TXMICK);
313 297
314 // Decide its ChiperAlg 298 // Decide its ChiperAlg
315 if (pAd->StaCfg.PairCipher == Ndis802_11Encryption2Enabled) 299 if (pAd->StaCfg.PairCipher == Ndis802_11Encryption2Enabled)
@@ -320,37 +304,35 @@ VOID WpaStaPairwiseKeySetting(
320 pSharedKey->CipherAlg = CIPHER_NONE; 304 pSharedKey->CipherAlg = CIPHER_NONE;
321 305
322 // Update these related information to MAC_TABLE_ENTRY 306 // Update these related information to MAC_TABLE_ENTRY
323 NdisMoveMemory(pEntry->PairwiseKey.Key, &pAd->StaCfg.PTK[32], LEN_TKIP_EK); 307 NdisMoveMemory(pEntry->PairwiseKey.Key, &pAd->StaCfg.PTK[32],
324 NdisMoveMemory(pEntry->PairwiseKey.RxMic, &pAd->StaCfg.PTK[48], LEN_TKIP_RXMICK); 308 LEN_TKIP_EK);
325 NdisMoveMemory(pEntry->PairwiseKey.TxMic, &pAd->StaCfg.PTK[48+LEN_TKIP_RXMICK], LEN_TKIP_TXMICK); 309 NdisMoveMemory(pEntry->PairwiseKey.RxMic, &pAd->StaCfg.PTK[48],
310 LEN_TKIP_RXMICK);
311 NdisMoveMemory(pEntry->PairwiseKey.TxMic,
312 &pAd->StaCfg.PTK[48 + LEN_TKIP_RXMICK], LEN_TKIP_TXMICK);
326 pEntry->PairwiseKey.CipherAlg = pSharedKey->CipherAlg; 313 pEntry->PairwiseKey.CipherAlg = pSharedKey->CipherAlg;
327 314
328 // Update pairwise key information to ASIC Shared Key Table 315 // Update pairwise key information to ASIC Shared Key Table
329 AsicAddSharedKeyEntry(pAd, 316 AsicAddSharedKeyEntry(pAd,
330 BSS0, 317 BSS0,
331 0, 318 0,
332 pSharedKey->CipherAlg, 319 pSharedKey->CipherAlg,
333 pSharedKey->Key, 320 pSharedKey->Key,
334 pSharedKey->TxMic, 321 pSharedKey->TxMic, pSharedKey->RxMic);
335 pSharedKey->RxMic);
336 322
337 // Update ASIC WCID attribute table and IVEIV table 323 // Update ASIC WCID attribute table and IVEIV table
338 RTMPAddWcidAttributeEntry(pAd, 324 RTMPAddWcidAttributeEntry(pAd, BSS0, 0, pSharedKey->CipherAlg, pEntry);
339 BSS0,
340 0,
341 pSharedKey->CipherAlg,
342 pEntry);
343 STA_PORT_SECURED(pAd); 325 STA_PORT_SECURED(pAd);
344 pAd->IndicateMediaState = NdisMediaStateConnected; 326 pAd->IndicateMediaState = NdisMediaStateConnected;
345 327
346 DBGPRINT(RT_DEBUG_TRACE, ("%s : AID(%d) port secured\n", __func__, pEntry->Aid)); 328 DBGPRINT(RT_DEBUG_TRACE,
329 ("%s : AID(%d) port secured\n", __func__, pEntry->Aid));
347 330
348} 331}
349 332
350VOID WpaStaGroupKeySetting( 333VOID WpaStaGroupKeySetting(IN PRTMP_ADAPTER pAd)
351 IN PRTMP_ADAPTER pAd)
352{ 334{
353 PCIPHER_KEY pSharedKey; 335 PCIPHER_KEY pSharedKey;
354 336
355 pSharedKey = &pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId]; 337 pSharedKey = &pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId];
356 338
@@ -358,8 +340,10 @@ VOID WpaStaGroupKeySetting(
358 NdisZeroMemory(pSharedKey, sizeof(CIPHER_KEY)); 340 NdisZeroMemory(pSharedKey, sizeof(CIPHER_KEY));
359 pSharedKey->KeyLen = LEN_TKIP_EK; 341 pSharedKey->KeyLen = LEN_TKIP_EK;
360 NdisMoveMemory(pSharedKey->Key, pAd->StaCfg.GTK, LEN_TKIP_EK); 342 NdisMoveMemory(pSharedKey->Key, pAd->StaCfg.GTK, LEN_TKIP_EK);
361 NdisMoveMemory(pSharedKey->RxMic, &pAd->StaCfg.GTK[16], LEN_TKIP_RXMICK); 343 NdisMoveMemory(pSharedKey->RxMic, &pAd->StaCfg.GTK[16],
362 NdisMoveMemory(pSharedKey->TxMic, &pAd->StaCfg.GTK[24], LEN_TKIP_TXMICK); 344 LEN_TKIP_RXMICK);
345 NdisMoveMemory(pSharedKey->TxMic, &pAd->StaCfg.GTK[24],
346 LEN_TKIP_TXMICK);
363 347
364 // Update Shared Key CipherAlg 348 // Update Shared Key CipherAlg
365 pSharedKey->CipherAlg = CIPHER_NONE; 349 pSharedKey->CipherAlg = CIPHER_NONE;
@@ -374,18 +358,16 @@ VOID WpaStaGroupKeySetting(
374 358
375 // Update group key information to ASIC Shared Key Table 359 // Update group key information to ASIC Shared Key Table
376 AsicAddSharedKeyEntry(pAd, 360 AsicAddSharedKeyEntry(pAd,
377 BSS0, 361 BSS0,
378 pAd->StaCfg.DefaultKeyId, 362 pAd->StaCfg.DefaultKeyId,
379 pSharedKey->CipherAlg, 363 pSharedKey->CipherAlg,
380 pSharedKey->Key, 364 pSharedKey->Key,
381 pSharedKey->TxMic, 365 pSharedKey->TxMic, pSharedKey->RxMic);
382 pSharedKey->RxMic);
383 366
384 // Update ASIC WCID attribute table and IVEIV table 367 // Update ASIC WCID attribute table and IVEIV table
385 RTMPAddWcidAttributeEntry(pAd, 368 RTMPAddWcidAttributeEntry(pAd,
386 BSS0, 369 BSS0,
387 pAd->StaCfg.DefaultKeyId, 370 pAd->StaCfg.DefaultKeyId,
388 pSharedKey->CipherAlg, 371 pSharedKey->CipherAlg, NULL);
389 NULL);
390 372
391} 373}