Commit | Line | Data |
---|---|---|
91980990 GKH |
1 | /* |
2 | ************************************************************************* | |
3 | * Ralink Tech Inc. | |
4 | * 5F., No.36, Taiyuan St., Jhubei City, | |
5 | * Hsinchu County 302, | |
6 | * Taiwan, R.O.C. | |
7 | * | |
8 | * (c) Copyright 2002-2007, Ralink Technology, Inc. | |
9 | * | |
10 | * This program is free software; you can redistribute it and/or modify * | |
11 | * it under the terms of the GNU General Public License as published by * | |
12 | * the Free Software Foundation; either version 2 of the License, or * | |
13 | * (at your option) any later version. * | |
14 | * * | |
15 | * This program is distributed in the hope that it will be useful, * | |
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of * | |
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * | |
18 | * GNU General Public License for more details. * | |
19 | * * | |
20 | * You should have received a copy of the GNU General Public License * | |
21 | * along with this program; if not, write to the * | |
22 | * Free Software Foundation, Inc., * | |
23 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * | |
24 | * * | |
25 | ************************************************************************* | |
26 | ||
27 | Module Name: | |
28 | action.c | |
29 | ||
30 | Abstract: | |
31 | Handle association related requests either from WSTA or from local MLME | |
32 | ||
33 | Revision History: | |
34 | Who When What | |
35 | -------- ---------- ---------------------------------------------- | |
36 | Jan Lee 2006 created for rt2860 | |
37 | */ | |
38 | ||
39 | #include "../rt_config.h" | |
40 | #include "action.h" | |
41 | ||
42 | ||
43 | static VOID ReservedAction( | |
44 | IN PRTMP_ADAPTER pAd, | |
45 | IN MLME_QUEUE_ELEM *Elem); | |
46 | ||
47 | /* | |
48 | ========================================================================== | |
49 | Description: | |
50 | association state machine init, including state transition and timer init | |
51 | Parameters: | |
52 | S - pointer to the association state machine | |
53 | Note: | |
54 | The state machine looks like the following | |
55 | ||
56 | ASSOC_IDLE | |
57 | MT2_MLME_DISASSOC_REQ mlme_disassoc_req_action | |
58 | MT2_PEER_DISASSOC_REQ peer_disassoc_action | |
59 | MT2_PEER_ASSOC_REQ drop | |
60 | MT2_PEER_REASSOC_REQ drop | |
61 | MT2_CLS3ERR cls3err_action | |
62 | ========================================================================== | |
63 | */ | |
64 | VOID ActionStateMachineInit( | |
65 | IN PRTMP_ADAPTER pAd, | |
66 | IN STATE_MACHINE *S, | |
67 | OUT STATE_MACHINE_FUNC Trans[]) | |
68 | { | |
69 | StateMachineInit(S, (STATE_MACHINE_FUNC *)Trans, MAX_ACT_STATE, MAX_ACT_MSG, (STATE_MACHINE_FUNC)Drop, ACT_IDLE, ACT_MACHINE_BASE); | |
70 | ||
71 | StateMachineSetAction(S, ACT_IDLE, MT2_PEER_SPECTRUM_CATE, (STATE_MACHINE_FUNC)PeerSpectrumAction); | |
72 | StateMachineSetAction(S, ACT_IDLE, MT2_PEER_QOS_CATE, (STATE_MACHINE_FUNC)PeerQOSAction); | |
73 | ||
74 | StateMachineSetAction(S, ACT_IDLE, MT2_PEER_DLS_CATE, (STATE_MACHINE_FUNC)ReservedAction); | |
91980990 GKH |
75 | |
76 | #ifdef DOT11_N_SUPPORT | |
77 | StateMachineSetAction(S, ACT_IDLE, MT2_PEER_BA_CATE, (STATE_MACHINE_FUNC)PeerBAAction); | |
78 | StateMachineSetAction(S, ACT_IDLE, MT2_PEER_HT_CATE, (STATE_MACHINE_FUNC)PeerHTAction); | |
79 | StateMachineSetAction(S, ACT_IDLE, MT2_MLME_ADD_BA_CATE, (STATE_MACHINE_FUNC)MlmeADDBAAction); | |
80 | StateMachineSetAction(S, ACT_IDLE, MT2_MLME_ORI_DELBA_CATE, (STATE_MACHINE_FUNC)MlmeDELBAAction); | |
81 | StateMachineSetAction(S, ACT_IDLE, MT2_MLME_REC_DELBA_CATE, (STATE_MACHINE_FUNC)MlmeDELBAAction); | |
82 | #endif // DOT11_N_SUPPORT // | |
83 | ||
84 | StateMachineSetAction(S, ACT_IDLE, MT2_PEER_PUBLIC_CATE, (STATE_MACHINE_FUNC)PeerPublicAction); | |
85 | StateMachineSetAction(S, ACT_IDLE, MT2_PEER_RM_CATE, (STATE_MACHINE_FUNC)PeerRMAction); | |
86 | ||
87 | StateMachineSetAction(S, ACT_IDLE, MT2_MLME_QOS_CATE, (STATE_MACHINE_FUNC)MlmeQOSAction); | |
88 | StateMachineSetAction(S, ACT_IDLE, MT2_MLME_DLS_CATE, (STATE_MACHINE_FUNC)MlmeDLSAction); | |
89 | StateMachineSetAction(S, ACT_IDLE, MT2_ACT_INVALID, (STATE_MACHINE_FUNC)MlmeInvalidAction); | |
90 | } | |
91 | ||
92 | #ifdef DOT11_N_SUPPORT | |
93 | VOID MlmeADDBAAction( | |
94 | IN PRTMP_ADAPTER pAd, | |
95 | IN MLME_QUEUE_ELEM *Elem) | |
96 | ||
97 | { | |
98 | MLME_ADDBA_REQ_STRUCT *pInfo; | |
99 | UCHAR Addr[6]; | |
100 | PUCHAR pOutBuffer = NULL; | |
101 | NDIS_STATUS NStatus; | |
102 | ULONG Idx; | |
103 | FRAME_ADDBA_REQ Frame; | |
104 | ULONG FrameLen; | |
105 | BA_ORI_ENTRY *pBAEntry = NULL; | |
106 | ||
107 | pInfo = (MLME_ADDBA_REQ_STRUCT *)Elem->Msg; | |
108 | NdisZeroMemory(&Frame, sizeof(FRAME_ADDBA_REQ)); | |
109 | ||
110 | if(MlmeAddBAReqSanity(pAd, Elem->Msg, Elem->MsgLen, Addr)) | |
111 | { | |
112 | NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory | |
113 | if(NStatus != NDIS_STATUS_SUCCESS) | |
114 | { | |
115 | DBGPRINT(RT_DEBUG_TRACE,("BA - MlmeADDBAAction() allocate memory failed \n")); | |
116 | return; | |
117 | } | |
118 | // 1. find entry | |
119 | Idx = pAd->MacTab.Content[pInfo->Wcid].BAOriWcidArray[pInfo->TID]; | |
120 | if (Idx == 0) | |
121 | { | |
122 | MlmeFreeMemory(pAd, pOutBuffer); | |
123 | DBGPRINT(RT_DEBUG_ERROR,("BA - MlmeADDBAAction() can't find BAOriEntry \n")); | |
124 | return; | |
125 | } | |
126 | else | |
127 | { | |
128 | pBAEntry =&pAd->BATable.BAOriEntry[Idx]; | |
129 | } | |
130 | ||
131 | #ifdef CONFIG_STA_SUPPORT | |
132 | IF_DEV_CONFIG_OPMODE_ON_STA(pAd) | |
133 | { | |
134 | if (ADHOC_ON(pAd)) | |
135 | ActHeaderInit(pAd, &Frame.Hdr, pInfo->pAddr, pAd->CurrentAddress, pAd->CommonCfg.Bssid); | |
136 | else | |
91980990 | 137 | ActHeaderInit(pAd, &Frame.Hdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pInfo->pAddr); |
91980990 GKH |
138 | } |
139 | #endif // CONFIG_STA_SUPPORT // | |
140 | ||
141 | Frame.Category = CATEGORY_BA; | |
142 | Frame.Action = ADDBA_REQ; | |
143 | Frame.BaParm.AMSDUSupported = 0; | |
144 | Frame.BaParm.BAPolicy = IMMED_BA; | |
145 | Frame.BaParm.TID = pInfo->TID; | |
146 | Frame.BaParm.BufSize = pInfo->BaBufSize; | |
147 | Frame.Token = pInfo->Token; | |
148 | Frame.TimeOutValue = pInfo->TimeOutValue; | |
149 | Frame.BaStartSeq.field.FragNum = 0; | |
150 | Frame.BaStartSeq.field.StartSeq = pAd->MacTab.Content[pInfo->Wcid].TxSeq[pInfo->TID]; | |
151 | ||
152 | *(USHORT *)(&Frame.BaParm) = cpu2le16(*(USHORT *)(&Frame.BaParm)); | |
153 | Frame.TimeOutValue = cpu2le16(Frame.TimeOutValue); | |
154 | Frame.BaStartSeq.word = cpu2le16(Frame.BaStartSeq.word); | |
155 | ||
156 | MakeOutgoingFrame(pOutBuffer, &FrameLen, | |
157 | sizeof(FRAME_ADDBA_REQ), &Frame, | |
158 | END_OF_ARGS); | |
159 | MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen); | |
160 | MlmeFreeMemory(pAd, pOutBuffer); | |
161 | ||
162 | DBGPRINT(RT_DEBUG_TRACE, ("BA - Send ADDBA request. StartSeq = %x, FrameLen = %ld. BufSize = %d\n", Frame.BaStartSeq.field.StartSeq, FrameLen, Frame.BaParm.BufSize)); | |
163 | } | |
164 | } | |
165 | ||
166 | /* | |
167 | ========================================================================== | |
168 | Description: | |
169 | send DELBA and delete BaEntry if any | |
170 | Parametrs: | |
171 | Elem - MLME message MLME_DELBA_REQ_STRUCT | |
172 | ||
173 | IRQL = DISPATCH_LEVEL | |
174 | ||
175 | ========================================================================== | |
176 | */ | |
177 | VOID MlmeDELBAAction( | |
178 | IN PRTMP_ADAPTER pAd, | |
179 | IN MLME_QUEUE_ELEM *Elem) | |
180 | { | |
181 | MLME_DELBA_REQ_STRUCT *pInfo; | |
182 | PUCHAR pOutBuffer = NULL; | |
183 | PUCHAR pOutBuffer2 = NULL; | |
184 | NDIS_STATUS NStatus; | |
185 | ULONG Idx; | |
186 | FRAME_DELBA_REQ Frame; | |
187 | ULONG FrameLen; | |
188 | FRAME_BAR FrameBar; | |
189 | ||
190 | pInfo = (MLME_DELBA_REQ_STRUCT *)Elem->Msg; | |
191 | // must send back DELBA | |
192 | NdisZeroMemory(&Frame, sizeof(FRAME_DELBA_REQ)); | |
193 | DBGPRINT(RT_DEBUG_TRACE, ("==> MlmeDELBAAction(), Initiator(%d) \n", pInfo->Initiator)); | |
194 | ||
195 | if(MlmeDelBAReqSanity(pAd, Elem->Msg, Elem->MsgLen)) | |
196 | { | |
197 | NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory | |
198 | if(NStatus != NDIS_STATUS_SUCCESS) | |
199 | { | |
200 | DBGPRINT(RT_DEBUG_ERROR,("BA - MlmeDELBAAction() allocate memory failed 1. \n")); | |
201 | return; | |
202 | } | |
203 | ||
204 | NStatus = MlmeAllocateMemory(pAd, &pOutBuffer2); //Get an unused nonpaged memory | |
205 | if(NStatus != NDIS_STATUS_SUCCESS) | |
206 | { | |
207 | MlmeFreeMemory(pAd, pOutBuffer); | |
208 | DBGPRINT(RT_DEBUG_ERROR, ("BA - MlmeDELBAAction() allocate memory failed 2. \n")); | |
209 | return; | |
210 | } | |
211 | ||
212 | // SEND BAR (Send BAR to refresh peer reordering buffer.) | |
213 | Idx = pAd->MacTab.Content[pInfo->Wcid].BAOriWcidArray[pInfo->TID]; | |
214 | #ifdef CONFIG_STA_SUPPORT | |
215 | IF_DEV_CONFIG_OPMODE_ON_STA(pAd) | |
216 | BarHeaderInit(pAd, &FrameBar, pAd->MacTab.Content[pInfo->Wcid].Addr, pAd->CurrentAddress); | |
217 | #endif // CONFIG_STA_SUPPORT // | |
218 | ||
219 | FrameBar.StartingSeq.field.FragNum = 0; // make sure sequence not clear in DEL funciton. | |
220 | FrameBar.StartingSeq.field.StartSeq = pAd->MacTab.Content[pInfo->Wcid].TxSeq[pInfo->TID]; // make sure sequence not clear in DEL funciton. | |
221 | FrameBar.BarControl.TID = pInfo->TID; // make sure sequence not clear in DEL funciton. | |
222 | FrameBar.BarControl.ACKPolicy = IMMED_BA; // make sure sequence not clear in DEL funciton. | |
223 | FrameBar.BarControl.Compressed = 1; // make sure sequence not clear in DEL funciton. | |
224 | FrameBar.BarControl.MTID = 0; // make sure sequence not clear in DEL funciton. | |
225 | ||
226 | MakeOutgoingFrame(pOutBuffer2, &FrameLen, | |
227 | sizeof(FRAME_BAR), &FrameBar, | |
228 | END_OF_ARGS); | |
229 | MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer2, FrameLen); | |
230 | MlmeFreeMemory(pAd, pOutBuffer2); | |
231 | DBGPRINT(RT_DEBUG_TRACE,("BA - MlmeDELBAAction() . Send BAR to refresh peer reordering buffer \n")); | |
232 | ||
233 | // SEND DELBA FRAME | |
234 | FrameLen = 0; | |
235 | #ifdef CONFIG_STA_SUPPORT | |
236 | IF_DEV_CONFIG_OPMODE_ON_STA(pAd) | |
237 | { | |
238 | if (ADHOC_ON(pAd)) | |
239 | ActHeaderInit(pAd, &Frame.Hdr, pAd->MacTab.Content[pInfo->Wcid].Addr, pAd->CurrentAddress, pAd->CommonCfg.Bssid); | |
240 | else | |
91980990 GKH |
241 | ActHeaderInit(pAd, &Frame.Hdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pAd->MacTab.Content[pInfo->Wcid].Addr); |
242 | } | |
243 | #endif // CONFIG_STA_SUPPORT // | |
244 | Frame.Category = CATEGORY_BA; | |
245 | Frame.Action = DELBA; | |
246 | Frame.DelbaParm.Initiator = pInfo->Initiator; | |
247 | Frame.DelbaParm.TID = pInfo->TID; | |
248 | Frame.ReasonCode = 39; // Time Out | |
249 | *(USHORT *)(&Frame.DelbaParm) = cpu2le16(*(USHORT *)(&Frame.DelbaParm)); | |
250 | Frame.ReasonCode = cpu2le16(Frame.ReasonCode); | |
251 | ||
252 | MakeOutgoingFrame(pOutBuffer, &FrameLen, | |
253 | sizeof(FRAME_DELBA_REQ), &Frame, | |
254 | END_OF_ARGS); | |
255 | MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen); | |
256 | MlmeFreeMemory(pAd, pOutBuffer); | |
257 | DBGPRINT(RT_DEBUG_TRACE, ("BA - MlmeDELBAAction() . 3 DELBA sent. Initiator(%d)\n", pInfo->Initiator)); | |
258 | } | |
259 | } | |
260 | #endif // DOT11_N_SUPPORT // | |
261 | ||
262 | VOID MlmeQOSAction( | |
263 | IN PRTMP_ADAPTER pAd, | |
264 | IN MLME_QUEUE_ELEM *Elem) | |
265 | { | |
266 | } | |
267 | ||
268 | VOID MlmeDLSAction( | |
269 | IN PRTMP_ADAPTER pAd, | |
270 | IN MLME_QUEUE_ELEM *Elem) | |
271 | { | |
272 | } | |
273 | ||
274 | VOID MlmeInvalidAction( | |
275 | IN PRTMP_ADAPTER pAd, | |
276 | IN MLME_QUEUE_ELEM *Elem) | |
277 | { | |
278 | //PUCHAR pOutBuffer = NULL; | |
279 | //Return the receiving frame except the MSB of category filed set to 1. 7.3.1.11 | |
280 | } | |
281 | ||
282 | VOID PeerQOSAction( | |
283 | IN PRTMP_ADAPTER pAd, | |
284 | IN MLME_QUEUE_ELEM *Elem) | |
285 | { | |
286 | } | |
287 | ||
91980990 GKH |
288 | #ifdef DOT11_N_SUPPORT |
289 | VOID PeerBAAction( | |
290 | IN PRTMP_ADAPTER pAd, | |
291 | IN MLME_QUEUE_ELEM *Elem) | |
292 | { | |
293 | UCHAR Action = Elem->Msg[LENGTH_802_11+1]; | |
294 | ||
295 | switch(Action) | |
296 | { | |
297 | case ADDBA_REQ: | |
298 | PeerAddBAReqAction(pAd,Elem); | |
299 | break; | |
300 | case ADDBA_RESP: | |
301 | PeerAddBARspAction(pAd,Elem); | |
302 | break; | |
303 | case DELBA: | |
304 | PeerDelBAAction(pAd,Elem); | |
305 | break; | |
306 | } | |
307 | } | |
91980990 GKH |
308 | #endif // DOT11_N_SUPPORT // |
309 | ||
310 | VOID PeerPublicAction( | |
311 | IN PRTMP_ADAPTER pAd, | |
312 | IN MLME_QUEUE_ELEM *Elem) | |
313 | { | |
91980990 GKH |
314 | if (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE) |
315 | return; | |
91980990 GKH |
316 | } |
317 | ||
318 | ||
319 | static VOID ReservedAction( | |
320 | IN PRTMP_ADAPTER pAd, | |
321 | IN MLME_QUEUE_ELEM *Elem) | |
322 | { | |
323 | UCHAR Category; | |
324 | ||
325 | if (Elem->MsgLen <= LENGTH_802_11) | |
326 | { | |
327 | return; | |
328 | } | |
329 | ||
330 | Category = Elem->Msg[LENGTH_802_11]; | |
331 | DBGPRINT(RT_DEBUG_TRACE,("Rcv reserved category(%d) Action Frame\n", Category)); | |
332 | hex_dump("Reserved Action Frame", &Elem->Msg[0], Elem->MsgLen); | |
333 | } | |
334 | ||
335 | VOID PeerRMAction( | |
336 | IN PRTMP_ADAPTER pAd, | |
337 | IN MLME_QUEUE_ELEM *Elem) | |
338 | ||
339 | { | |
340 | return; | |
341 | } | |
342 | ||
343 | #ifdef DOT11_N_SUPPORT | |
344 | static VOID respond_ht_information_exchange_action( | |
345 | IN PRTMP_ADAPTER pAd, | |
346 | IN MLME_QUEUE_ELEM *Elem) | |
347 | { | |
348 | PUCHAR pOutBuffer = NULL; | |
349 | NDIS_STATUS NStatus; | |
350 | ULONG FrameLen; | |
351 | FRAME_HT_INFO HTINFOframe, *pFrame; | |
352 | UCHAR *pAddr; | |
353 | ||
354 | ||
355 | // 2. Always send back ADDBA Response | |
356 | NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory | |
357 | ||
358 | if (NStatus != NDIS_STATUS_SUCCESS) | |
359 | { | |
360 | DBGPRINT(RT_DEBUG_TRACE,("ACTION - respond_ht_information_exchange_action() allocate memory failed \n")); | |
361 | return; | |
362 | } | |
363 | ||
364 | // get RA | |
365 | pFrame = (FRAME_HT_INFO *) &Elem->Msg[0]; | |
366 | pAddr = pFrame->Hdr.Addr2; | |
367 | ||
368 | NdisZeroMemory(&HTINFOframe, sizeof(FRAME_HT_INFO)); | |
369 | // 2-1. Prepare ADDBA Response frame. | |
370 | #ifdef CONFIG_STA_SUPPORT | |
371 | IF_DEV_CONFIG_OPMODE_ON_STA(pAd) | |
372 | { | |
373 | if (ADHOC_ON(pAd)) | |
374 | ActHeaderInit(pAd, &HTINFOframe.Hdr, pAddr, pAd->CurrentAddress, pAd->CommonCfg.Bssid); | |
375 | else | |
376 | ActHeaderInit(pAd, &HTINFOframe.Hdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pAddr); | |
377 | } | |
378 | #endif // CONFIG_STA_SUPPORT // | |
379 | ||
380 | HTINFOframe.Category = CATEGORY_HT; | |
381 | HTINFOframe.Action = HT_INFO_EXCHANGE; | |
382 | HTINFOframe.HT_Info.Request = 0; | |
383 | HTINFOframe.HT_Info.Forty_MHz_Intolerant = pAd->CommonCfg.HtCapability.HtCapInfo.Forty_Mhz_Intolerant; | |
384 | HTINFOframe.HT_Info.STA_Channel_Width = pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth; | |
385 | ||
386 | MakeOutgoingFrame(pOutBuffer, &FrameLen, | |
387 | sizeof(FRAME_HT_INFO), &HTINFOframe, | |
388 | END_OF_ARGS); | |
389 | ||
390 | MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen); | |
391 | MlmeFreeMemory(pAd, pOutBuffer); | |
392 | } | |
393 | ||
91980990 GKH |
394 | VOID PeerHTAction( |
395 | IN PRTMP_ADAPTER pAd, | |
396 | IN MLME_QUEUE_ELEM *Elem) | |
397 | { | |
398 | UCHAR Action = Elem->Msg[LENGTH_802_11+1]; | |
399 | ||
400 | if (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE) | |
401 | return; | |
402 | ||
403 | switch(Action) | |
404 | { | |
405 | case NOTIFY_BW_ACTION: | |
406 | DBGPRINT(RT_DEBUG_TRACE,("ACTION - HT Notify Channel bandwidth action----> \n")); | |
407 | #ifdef CONFIG_STA_SUPPORT | |
408 | if(pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE) | |
409 | { | |
410 | // Note, this is to patch DIR-1353 AP. When the AP set to Wep, it will use legacy mode. But AP still keeps | |
411 | // sending BW_Notify Action frame, and cause us to linkup and linkdown. | |
412 | // In legacy mode, don't need to parse HT action frame. | |
413 | DBGPRINT(RT_DEBUG_TRACE,("ACTION -Ignore HT Notify Channel BW when link as legacy mode. BW = %d---> \n", | |
414 | Elem->Msg[LENGTH_802_11+2] )); | |
415 | break; | |
416 | } | |
417 | #endif // CONFIG_STA_SUPPORT // | |
418 | ||
419 | if (Elem->Msg[LENGTH_802_11+2] == 0) // 7.4.8.2. if value is 1, keep the same as supported channel bandwidth. | |
420 | pAd->MacTab.Content[Elem->Wcid].HTPhyMode.field.BW = 0; | |
421 | ||
422 | break; | |
423 | case SMPS_ACTION: | |
424 | // 7.3.1.25 | |
425 | DBGPRINT(RT_DEBUG_TRACE,("ACTION - SMPS action----> \n")); | |
426 | if (((Elem->Msg[LENGTH_802_11+2]&0x1) == 0)) | |
427 | { | |
428 | pAd->MacTab.Content[Elem->Wcid].MmpsMode = MMPS_ENABLE; | |
429 | } | |
430 | else if (((Elem->Msg[LENGTH_802_11+2]&0x2) == 0)) | |
431 | { | |
432 | pAd->MacTab.Content[Elem->Wcid].MmpsMode = MMPS_STATIC; | |
433 | } | |
434 | else | |
435 | { | |
436 | pAd->MacTab.Content[Elem->Wcid].MmpsMode = MMPS_DYNAMIC; | |
437 | } | |
438 | ||
439 | DBGPRINT(RT_DEBUG_TRACE,("Aid(%d) MIMO PS = %d\n", Elem->Wcid, pAd->MacTab.Content[Elem->Wcid].MmpsMode)); | |
440 | // rt2860c : add something for smps change. | |
441 | break; | |
442 | ||
443 | case SETPCO_ACTION: | |
444 | break; | |
445 | case MIMO_CHA_MEASURE_ACTION: | |
446 | break; | |
447 | case HT_INFO_EXCHANGE: | |
448 | { | |
449 | HT_INFORMATION_OCTET *pHT_info; | |
450 | ||
451 | pHT_info = (HT_INFORMATION_OCTET *) &Elem->Msg[LENGTH_802_11+2]; | |
452 | // 7.4.8.10 | |
453 | DBGPRINT(RT_DEBUG_TRACE,("ACTION - HT Information Exchange action----> \n")); | |
454 | if (pHT_info->Request) | |
455 | { | |
456 | respond_ht_information_exchange_action(pAd, Elem); | |
457 | } | |
458 | } | |
459 | break; | |
460 | } | |
461 | } | |
462 | ||
463 | ||
464 | /* | |
465 | ========================================================================== | |
466 | Description: | |
467 | Retry sending ADDBA Reqest. | |
468 | ||
469 | IRQL = DISPATCH_LEVEL | |
470 | ||
471 | Parametrs: | |
472 | p8023Header: if this is already 802.3 format, p8023Header is NULL | |
473 | ||
474 | Return : TRUE if put into rx reordering buffer, shouldn't indicaterxhere. | |
475 | FALSE , then continue indicaterx at this moment. | |
476 | ========================================================================== | |
477 | */ | |
478 | VOID ORIBATimerTimeout( | |
479 | IN PRTMP_ADAPTER pAd) | |
480 | { | |
481 | MAC_TABLE_ENTRY *pEntry; | |
482 | INT i, total; | |
483 | UCHAR TID; | |
484 | ||
91980990 GKH |
485 | total = pAd->MacTab.Size * NUM_OF_TID; |
486 | ||
487 | for (i = 1; ((i <MAX_LEN_OF_BA_ORI_TABLE) && (total > 0)) ; i++) | |
488 | { | |
489 | if (pAd->BATable.BAOriEntry[i].ORI_BA_Status == Originator_Done) | |
490 | { | |
491 | pEntry = &pAd->MacTab.Content[pAd->BATable.BAOriEntry[i].Wcid]; | |
492 | TID = pAd->BATable.BAOriEntry[i].TID; | |
493 | ||
494 | ASSERT(pAd->BATable.BAOriEntry[i].Wcid < MAX_LEN_OF_MAC_TABLE); | |
495 | } | |
496 | total --; | |
497 | } | |
498 | } | |
499 | ||
500 | ||
501 | VOID SendRefreshBAR( | |
502 | IN PRTMP_ADAPTER pAd, | |
503 | IN MAC_TABLE_ENTRY *pEntry) | |
504 | { | |
505 | FRAME_BAR FrameBar; | |
506 | ULONG FrameLen; | |
507 | NDIS_STATUS NStatus; | |
508 | PUCHAR pOutBuffer = NULL; | |
509 | USHORT Sequence; | |
510 | UCHAR i, TID; | |
511 | USHORT idx; | |
512 | BA_ORI_ENTRY *pBAEntry; | |
513 | ||
514 | for (i = 0; i <NUM_OF_TID; i++) | |
515 | { | |
516 | idx = pEntry->BAOriWcidArray[i]; | |
517 | if (idx == 0) | |
518 | { | |
519 | continue; | |
520 | } | |
521 | pBAEntry = &pAd->BATable.BAOriEntry[idx]; | |
522 | ||
523 | if (pBAEntry->ORI_BA_Status == Originator_Done) | |
524 | { | |
525 | TID = pBAEntry->TID; | |
526 | ||
527 | ASSERT(pBAEntry->Wcid < MAX_LEN_OF_MAC_TABLE); | |
528 | ||
529 | NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory | |
530 | if(NStatus != NDIS_STATUS_SUCCESS) | |
531 | { | |
532 | DBGPRINT(RT_DEBUG_ERROR,("BA - MlmeADDBAAction() allocate memory failed \n")); | |
533 | return; | |
534 | } | |
535 | ||
536 | Sequence = pEntry->TxSeq[TID]; | |
537 | #ifdef CONFIG_STA_SUPPORT | |
538 | IF_DEV_CONFIG_OPMODE_ON_STA(pAd) | |
539 | BarHeaderInit(pAd, &FrameBar, pEntry->Addr, pAd->CurrentAddress); | |
540 | #endif // CONFIG_STA_SUPPORT // | |
541 | ||
542 | FrameBar.StartingSeq.field.FragNum = 0; // make sure sequence not clear in DEL function. | |
543 | FrameBar.StartingSeq.field.StartSeq = Sequence; // make sure sequence not clear in DEL funciton. | |
544 | FrameBar.BarControl.TID = TID; // make sure sequence not clear in DEL funciton. | |
545 | ||
546 | MakeOutgoingFrame(pOutBuffer, &FrameLen, | |
547 | sizeof(FRAME_BAR), &FrameBar, | |
548 | END_OF_ARGS); | |
549 | if (1) // Now we always send BAR. | |
550 | { | |
551 | MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); | |
552 | } | |
553 | MlmeFreeMemory(pAd, pOutBuffer); | |
554 | } | |
555 | } | |
556 | } | |
557 | #endif // DOT11_N_SUPPORT // | |
558 | ||
559 | VOID ActHeaderInit( | |
560 | IN PRTMP_ADAPTER pAd, | |
561 | IN OUT PHEADER_802_11 pHdr80211, | |
562 | IN PUCHAR Addr1, | |
563 | IN PUCHAR Addr2, | |
564 | IN PUCHAR Addr3) | |
565 | { | |
566 | NdisZeroMemory(pHdr80211, sizeof(HEADER_802_11)); | |
567 | pHdr80211->FC.Type = BTYPE_MGMT; | |
568 | pHdr80211->FC.SubType = SUBTYPE_ACTION; | |
569 | ||
570 | COPY_MAC_ADDR(pHdr80211->Addr1, Addr1); | |
571 | COPY_MAC_ADDR(pHdr80211->Addr2, Addr2); | |
572 | COPY_MAC_ADDR(pHdr80211->Addr3, Addr3); | |
573 | } | |
574 | ||
575 | VOID BarHeaderInit( | |
576 | IN PRTMP_ADAPTER pAd, | |
577 | IN OUT PFRAME_BAR pCntlBar, | |
578 | IN PUCHAR pDA, | |
579 | IN PUCHAR pSA) | |
580 | { | |
581 | NdisZeroMemory(pCntlBar, sizeof(FRAME_BAR)); | |
582 | pCntlBar->FC.Type = BTYPE_CNTL; | |
583 | pCntlBar->FC.SubType = SUBTYPE_BLOCK_ACK_REQ; | |
584 | pCntlBar->BarControl.MTID = 0; | |
585 | pCntlBar->BarControl.Compressed = 1; | |
586 | pCntlBar->BarControl.ACKPolicy = 0; | |
587 | ||
588 | ||
589 | pCntlBar->Duration = 16 + RTMPCalcDuration(pAd, RATE_1, sizeof(FRAME_BA)); | |
590 | ||
591 | COPY_MAC_ADDR(pCntlBar->Addr1, pDA); | |
592 | COPY_MAC_ADDR(pCntlBar->Addr2, pSA); | |
593 | } | |
594 | ||
595 | ||
596 | /* | |
597 | ========================================================================== | |
598 | Description: | |
599 | Insert Category and action code into the action frame. | |
600 | ||
601 | Parametrs: | |
602 | 1. frame buffer pointer. | |
603 | 2. frame length. | |
604 | 3. category code of the frame. | |
605 | 4. action code of the frame. | |
606 | ||
607 | Return : None. | |
608 | ========================================================================== | |
609 | */ | |
610 | VOID InsertActField( | |
611 | IN PRTMP_ADAPTER pAd, | |
612 | OUT PUCHAR pFrameBuf, | |
613 | OUT PULONG pFrameLen, | |
614 | IN UINT8 Category, | |
615 | IN UINT8 ActCode) | |
616 | { | |
617 | ULONG TempLen; | |
618 | ||
619 | MakeOutgoingFrame( pFrameBuf, &TempLen, | |
620 | 1, &Category, | |
621 | 1, &ActCode, | |
622 | END_OF_ARGS); | |
623 | ||
624 | *pFrameLen = *pFrameLen + TempLen; | |
625 | ||
626 | return; | |
627 | } |