Staging: rt3070: remove dead RT_BIG_ENDIAN code
[deliverable/linux.git] / drivers / staging / rt2860 / common / action.c
CommitLineData
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
43static 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 */
64VOID 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
93VOID 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 */
177VOID 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
262VOID MlmeQOSAction(
263 IN PRTMP_ADAPTER pAd,
264 IN MLME_QUEUE_ELEM *Elem)
265{
266}
267
268VOID MlmeDLSAction(
269 IN PRTMP_ADAPTER pAd,
270 IN MLME_QUEUE_ELEM *Elem)
271{
272}
273
274VOID 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
282VOID PeerQOSAction(
283 IN PRTMP_ADAPTER pAd,
284 IN MLME_QUEUE_ELEM *Elem)
285{
286}
287
91980990
GKH
288#ifdef DOT11_N_SUPPORT
289VOID 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
310VOID 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
319static 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
335VOID PeerRMAction(
336 IN PRTMP_ADAPTER pAd,
337 IN MLME_QUEUE_ELEM *Elem)
338
339{
340 return;
341}
342
343#ifdef DOT11_N_SUPPORT
344static 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
394VOID 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 */
478VOID 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
501VOID 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
559VOID 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
575VOID 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 */
610VOID 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}
This page took 0.155695 seconds and 5 git commands to generate.