diff options
author | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2009-12-11 15:23:14 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-12-11 15:23:14 -0500 |
commit | 0f65bec15b2184dcf98dbdbf03187057de842eb5 (patch) | |
tree | c767a059ee14864094952ea8c578180b46ef6115 | |
parent | 96b3c83dc27dca271594463aa99e166974a91171 (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.c | 1579 | ||||
-rw-r--r-- | drivers/staging/rt2860/sta/auth.c | 621 | ||||
-rw-r--r-- | drivers/staging/rt2860/sta/auth_rsp.c | 124 | ||||
-rw-r--r-- | drivers/staging/rt2860/sta/connect.c | 2348 | ||||
-rw-r--r-- | drivers/staging/rt2860/sta/rtmp_data.c | 2196 | ||||
-rw-r--r-- | drivers/staging/rt2860/sta/sanity.c | 489 | ||||
-rw-r--r-- | drivers/staging/rt2860/sta/sync.c | 2094 | ||||
-rw-r--r-- | drivers/staging/rt2860/sta/wpa.c | 272 |
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 | ||
39 | UCHAR CipherWpaTemplate[] = { | 39 | UCHAR 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 | ||
51 | UCHAR CipherWpa2Template[] = { | 51 | UCHAR 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 | ||
63 | UCHAR Ccx2IeInfo[] = { 0x00, 0x40, 0x96, 0x03, 0x02}; | 63 | UCHAR 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 | */ |
76 | VOID AssocStateMachineInit( | 76 | VOID 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 | */ |
139 | VOID AssocTimeout(IN PVOID SystemSpecific1, | 168 | VOID 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 | */ |
167 | VOID ReassocTimeout(IN PVOID SystemSpecific1, | 196 | VOID 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 | */ |
195 | VOID DisassocTimeout(IN PVOID SystemSpecific1, | 224 | VOID 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 | */ |
233 | VOID MlmeAssocReqAction( | 262 | VOID 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 | */ |
544 | VOID MlmeReassocReqAction( | 592 | VOID 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 | */ |
724 | VOID MlmeDisassocReqAction( | 768 | VOID 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 | */ |
797 | VOID PeerAssocRspAction( | 838 | VOID 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 | */ |
876 | VOID PeerReassocRspAction( | 927 | VOID 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 | */ |
939 | VOID AssocPostProc( | 997 | VOID 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 | */ |
1082 | VOID PeerDisassocAction( | 1147 | VOID 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 | */ |
1127 | VOID AssocTimeoutAction( | 1192 | VOID 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 | */ |
1147 | VOID ReassocTimeoutAction( | 1210 | VOID 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 | */ |
1167 | VOID DisassocTimeoutAction( | 1228 | VOID 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 | ||
1178 | VOID InvalidStateWhenAssoc( | 1238 | VOID 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 | ||
1190 | VOID InvalidStateWhenReassoc( | 1249 | VOID 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 | ||
1202 | VOID InvalidStateWhenDisassociate( | 1260 | VOID 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 | */ |
1227 | VOID Cls3errAction( | 1286 | VOID 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 | 1320 | int wext_notify_event_assoc(IN RTMP_ADAPTER * pAd) | |
1264 | int 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 | 1337 | BOOLEAN StaAddMacTableEntry(IN PRTMP_ADAPTER pAd, | |
1282 | BOOLEAN 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 | ||
58 | void AuthStateMachineInit( | 58 | void 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 | */ |
90 | VOID AuthTimeout( | 98 | VOID 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 | */ |
123 | VOID MlmeAuthReqAction( | 128 | VOID 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 | */ |
147 | VOID PeerAuthRspAtSeq2Action( | 151 | VOID 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 | */ |
252 | VOID PeerAuthRspAtSeq4Action( | 285 | VOID 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 | */ |
292 | VOID MlmeDeauthReqAction( | 324 | VOID 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 | */ |
343 | VOID AuthTimeoutAction( | 377 | VOID 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 | */ |
362 | VOID InvalidStateWhenAuth( | 394 | VOID 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 | */ |
385 | VOID Cls2errAction( | 417 | VOID 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 | ||
412 | BOOLEAN AUTH_ReqSend( | 442 | BOOLEAN 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 | */ |
50 | VOID AuthRspStateMachineInit( | 50 | VOID 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 | */ |
73 | VOID PeerAuthSimpleRspGenAndSend( | 76 | VOID 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 | */ |
117 | VOID PeerDeauthAction( | 113 | VOID 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 | ||
39 | UCHAR CipherSuiteWpaNoneTkip[] = { | 39 | UCHAR 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 | }; |
48 | UCHAR CipherSuiteWpaNoneTkipLen = (sizeof(CipherSuiteWpaNoneTkip) / sizeof(UCHAR)); | 48 | |
49 | 49 | UCHAR CipherSuiteWpaNoneTkipLen = | |
50 | UCHAR CipherSuiteWpaNoneAes[] = { | 50 | (sizeof(CipherSuiteWpaNoneTkip) / sizeof(UCHAR)); |
51 | 0x00, 0x50, 0xf2, 0x01, // oui | 51 | |
52 | 0x01, 0x00, // Version | 52 | UCHAR 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 |
59 | UCHAR CipherSuiteWpaNoneAesLen = (sizeof(CipherSuiteWpaNoneAes) / sizeof(UCHAR)); | 59 | 0x00, 0x50, 0xf2, 0x00 // authentication |
60 | }; | ||
61 | |||
62 | UCHAR 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 | */ |
101 | VOID MlmeCntlInit( | 105 | VOID 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 | */ |
119 | VOID MlmeCntlMachinePerformAction( | 121 | VOID 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 | */ |
233 | VOID CntlIdleProc( | 231 | VOID 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 | ||
284 | VOID CntlOidScanProc( | 284 | VOID 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 | */ |
333 | VOID CntlOidSsidProc( | 332 | VOID 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 | */ |
494 | VOID CntlOidRTBssidProc( | 508 | VOID 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 |
627 | VOID CntlMlmeRoamingProc( | 678 | VOID 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 | */ |
659 | VOID CntlWaitDisassocProc( | 708 | VOID 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 | */ |
702 | VOID CntlWaitJoinProc( | 752 | VOID 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 | */ |
778 | VOID CntlWaitStartProc( | 835 | VOID 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 | */ |
858 | VOID CntlWaitAuthProc( | 928 | VOID 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 | */ |
917 | VOID CntlWaitAuthProc2( | 992 | VOID 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 | */ |
972 | VOID CntlWaitAssocProc( | 1050 | VOID 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 | */ |
1010 | VOID CntlWaitReassocProc( | 1088 | VOID 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 | 1124 | VOID AdhocTurnOnQos(IN PRTMP_ADAPTER pAd) | |
1047 | VOID 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 | */ |
1090 | VOID LinkUp( | 1165 | VOID 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 | */ |
1807 | VOID LinkDown( | 1876 | VOID 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 | */ |
2069 | VOID IterateOnBssTab( | 2125 | VOID 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 |
2149 | VOID IterateOnBssTab2( | 2231 | VOID 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 | */ |
2195 | VOID JoinParmFill( | 2279 | VOID 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 | */ |
2211 | VOID ScanParmFill( | 2293 | VOID 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 | */ |
2234 | VOID StartParmFill( | 2313 | VOID 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 | */ |
2253 | VOID AuthParmFill( | 2330 | VOID 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 |
2273 | VOID ComposePsPoll( | 2348 | VOID 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 |
2285 | VOID ComposeNullFrame( | 2359 | VOID 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 |
2298 | VOID MlmeCntlConfirm( | 2371 | VOID 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 | ||
2306 | VOID ComposePsPoll( | 2377 | VOID 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 |
2334 | VOID ComposeNullFrame( | 2416 | VOID 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 | */ |
2368 | ULONG MakeIbssBeacon( | 2461 | ULONG 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 | 39 | VOID STARxEAPOLFrameIndicate(IN PRTMP_ADAPTER pAd, | |
40 | 40 | IN MAC_TABLE_ENTRY * pEntry, | |
41 | VOID 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 | ||
148 | VOID STARxDataFrameAnnounce( | 205 | VOID 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 |
216 | BOOLEAN STACheckTkipMICValue( | 268 | BOOLEAN 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 | // |
276 | VOID STAHandleRxDataFrame( | 321 | VOID 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 | ||
582 | VOID STAHandleRxMgmtFrame( | 613 | VOID 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 | ||
634 | VOID STAHandleRxControlFrame( | 659 | VOID 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 | */ |
678 | BOOLEAN STARxDoneInterruptHandle( | 701 | BOOLEAN 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 | */ |
820 | VOID RTMPHandleTwakeupInterrupt( | 836 | VOID 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 | */ |
844 | VOID STASendPackets( | 859 | VOID 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 | ======================================================================== |
900 | Routine Description: | 906 | Routine 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 | */ |
917 | NDIS_STATUS STASendPacket( | 923 | NDIS_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 |
1196 | NDIS_STATUS RTMPFreeTXDRequest( | 1192 | NDIS_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 | */ |
1244 | NDIS_STATUS RTMPFreeTXDRequest( | 1247 | NDIS_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 | ||
1291 | VOID RTMPSendDisassociationFrame( | 1292 | VOID RTMPSendDisassociationFrame(IN PRTMP_ADAPTER pAd) |
1292 | IN PRTMP_ADAPTER pAd) | ||
1293 | { | 1293 | { |
1294 | } | 1294 | } |
1295 | 1295 | ||
1296 | VOID RTMPSendNullFrame( | 1296 | VOID 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 |
1358 | VOID RTMPSendRTSFrame( | 1352 | VOID 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. |
1381 | VOID STAFindCipherAlgorithm( | 1370 | VOID 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 | 1432 | VOID STABuildCommon802_11Header(IN PRTMP_ADAPTER pAd, IN TX_BLK * pTxBlk) | |
1449 | VOID 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 | ||
1526 | VOID STABuildCache802_11Header( | 1513 | VOID 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 | ||
1571 | static inline PUCHAR STA_Build_ARalink_Frame_Header( | 1559 | static 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 | ||
1629 | static inline PUCHAR STA_Build_AMSDU_Frame_Header( | 1613 | static 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 | 1658 | VOID STA_AMPDU_Frame_Tx(IN PRTMP_ADAPTER pAd, IN TX_BLK * pTxBlk) | |
1677 | VOID 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 | 1822 | VOID STA_AMSDU_Frame_Tx(IN PRTMP_ADAPTER pAd, IN TX_BLK * pTxBlk) | |
1828 | VOID 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 | ||
1953 | VOID STA_Legacy_Frame_Tx( | 1954 | VOID 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 | 2072 | VOID STA_ARalink_Frame_Tx(IN PRTMP_ADAPTER pAd, IN TX_BLK * pTxBlk) | |
2074 | VOID 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 | 2189 | VOID STA_Fragment_Frame_Tx(IN RTMP_ADAPTER * pAd, IN TX_BLK * pTxBlk) | |
2186 | VOID 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 | */ |
2434 | NDIS_STATUS STAHardTransmit( | 2437 | NDIS_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 | ||
2521 | ULONG HashBytesPolynomial(UCHAR *value, unsigned int len) | 2526 | ULONG 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 | ||
2536 | VOID Sta_Announce_or_Forward_802_3_Packet( | 2540 | VOID 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 | ||
39 | extern UCHAR CISCO_OUI[]; | 39 | extern UCHAR CISCO_OUI[]; |
40 | 40 | ||
41 | extern UCHAR WPA_OUI[]; | 41 | extern UCHAR WPA_OUI[]; |
42 | extern UCHAR RSN_OUI[]; | 42 | extern UCHAR RSN_OUI[]; |
43 | extern UCHAR WME_INFO_ELEM[]; | 43 | extern UCHAR WME_INFO_ELEM[]; |
44 | extern UCHAR WME_PARM_ELEM[]; | 44 | extern UCHAR WME_PARM_ELEM[]; |
45 | extern UCHAR Ccx2QosInfo[]; | 45 | extern UCHAR Ccx2QosInfo[]; |
46 | extern UCHAR RALINK_OUI[]; | 46 | extern UCHAR RALINK_OUI[]; |
47 | extern UCHAR BROADCOM_OUI[]; | 47 | extern 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 | */ |
57 | BOOLEAN MlmeStartReqSanity( | 57 | BOOLEAN 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 | */ |
91 | BOOLEAN PeerAssocRspSanity( | 89 | BOOLEAN 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 | */ |
269 | BOOLEAN PeerProbeReqSanity( | 257 | BOOLEAN 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 | */ |
320 | BOOLEAN GetTimBit( | 307 | BOOLEAN 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 | */ |
54 | VOID SyncStateMachineInit( | 53 | VOID 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 | */ |
97 | VOID BeaconTimeout( | 114 | VOID 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 | */ |
138 | VOID ScanTimeout( | 154 | VOID 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 | */ |
174 | VOID MlmeScanReqAction( | 186 | VOID 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 | */ |
294 | VOID MlmeJoinReqAction( | 300 | VOID 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 | */ |
440 | VOID MlmeStartReqAction( | 440 | VOID 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 | */ |
539 | VOID PeerBeaconAtScanAction( | 553 | VOID 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 | */ |
652 | VOID PeerBeaconAtJoinAction( | 671 | VOID 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 | */ |
927 | VOID PeerBeacon( | 1044 | VOID 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 | */ |
1433 | VOID PeerProbeReqAction( | 1706 | VOID 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 | ||
1553 | VOID BeaconTimeoutAtJoinAction( | 1836 | VOID 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 | */ |
1570 | VOID ScanTimeoutAction( | 1851 | VOID 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 | */ |
1592 | VOID InvalidStateWhenScan( | 1871 | VOID 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 | */ |
1608 | VOID InvalidStateWhenJoin( | 1887 | VOID 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 | */ |
1624 | VOID InvalidStateWhenStart( | 1903 | VOID 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 | */ |
1643 | VOID EnqueuePsPoll( | 1922 | VOID 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 | */ |
1659 | VOID EnqueueProbeRequest( | 1936 | VOID 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 | ||
1690 | BOOLEAN ScanRunning( | 1966 | BOOLEAN 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 | ||
40 | void inc_byte_array(UCHAR *counter, int len); | 40 | void 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 | */ |
61 | VOID RTMPReportMicError( | 61 | VOID 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)). |
125 | INT WpaCheckEapCode( | 116 | INT 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 | ||
148 | VOID WpaSendMicFailureToWpaSupplicant( | 136 | VOID 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 | ||
163 | VOID WpaMicFailureReportFrame( | 150 | VOID 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 | */ |
265 | void inc_byte_array(UCHAR *counter, int len) | 246 | void 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 | ||
276 | VOID WpaDisassocApAndBlockAssoc( | 257 | VOID 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 | ||
294 | VOID WpaStaPairwiseKeySetting( | 277 | VOID 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 | ||
350 | VOID WpaStaGroupKeySetting( | 333 | VOID 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 | } |