2 *************************************************************************
4 * 5F., No.36, Taiyuan St., Jhubei City,
8 * (c) Copyright 2002-2007, Ralink Technology, Inc.
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. *
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. *
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. *
25 *************************************************************************
31 Handle association related requests either from WSTA or from local MLME
35 -------- ---------- ----------------------------------------------
36 Jan Lee 2006 created for rt2860
39 #include "../rt_config.h"
42 static VOID
ReservedAction(IN PRTMP_ADAPTER pAd
, IN MLME_QUEUE_ELEM
* Elem
);
45 ==========================================================================
47 association state machine init, including state transition and timer init
49 S - pointer to the association state machine
51 The state machine looks like the following
54 MT2_MLME_DISASSOC_REQ mlme_disassoc_req_action
55 MT2_PEER_DISASSOC_REQ peer_disassoc_action
56 MT2_PEER_ASSOC_REQ drop
57 MT2_PEER_REASSOC_REQ drop
58 MT2_CLS3ERR cls3err_action
59 ==========================================================================
61 VOID
ActionStateMachineInit(IN PRTMP_ADAPTER pAd
,
63 OUT STATE_MACHINE_FUNC Trans
[])
65 StateMachineInit(S
, (STATE_MACHINE_FUNC
*) Trans
, MAX_ACT_STATE
,
66 MAX_ACT_MSG
, (STATE_MACHINE_FUNC
) Drop
, ACT_IDLE
,
69 StateMachineSetAction(S
, ACT_IDLE
, MT2_PEER_SPECTRUM_CATE
,
70 (STATE_MACHINE_FUNC
) PeerSpectrumAction
);
71 StateMachineSetAction(S
, ACT_IDLE
, MT2_PEER_QOS_CATE
,
72 (STATE_MACHINE_FUNC
) PeerQOSAction
);
74 StateMachineSetAction(S
, ACT_IDLE
, MT2_PEER_DLS_CATE
,
75 (STATE_MACHINE_FUNC
) ReservedAction
);
77 StateMachineSetAction(S
, ACT_IDLE
, MT2_PEER_BA_CATE
,
78 (STATE_MACHINE_FUNC
) PeerBAAction
);
79 StateMachineSetAction(S
, ACT_IDLE
, MT2_PEER_HT_CATE
,
80 (STATE_MACHINE_FUNC
) PeerHTAction
);
81 StateMachineSetAction(S
, ACT_IDLE
, MT2_MLME_ADD_BA_CATE
,
82 (STATE_MACHINE_FUNC
) MlmeADDBAAction
);
83 StateMachineSetAction(S
, ACT_IDLE
, MT2_MLME_ORI_DELBA_CATE
,
84 (STATE_MACHINE_FUNC
) MlmeDELBAAction
);
85 StateMachineSetAction(S
, ACT_IDLE
, MT2_MLME_REC_DELBA_CATE
,
86 (STATE_MACHINE_FUNC
) MlmeDELBAAction
);
88 StateMachineSetAction(S
, ACT_IDLE
, MT2_PEER_PUBLIC_CATE
,
89 (STATE_MACHINE_FUNC
) PeerPublicAction
);
90 StateMachineSetAction(S
, ACT_IDLE
, MT2_PEER_RM_CATE
,
91 (STATE_MACHINE_FUNC
) PeerRMAction
);
93 StateMachineSetAction(S
, ACT_IDLE
, MT2_MLME_QOS_CATE
,
94 (STATE_MACHINE_FUNC
) MlmeQOSAction
);
95 StateMachineSetAction(S
, ACT_IDLE
, MT2_MLME_DLS_CATE
,
96 (STATE_MACHINE_FUNC
) MlmeDLSAction
);
97 StateMachineSetAction(S
, ACT_IDLE
, MT2_ACT_INVALID
,
98 (STATE_MACHINE_FUNC
) MlmeInvalidAction
);
101 VOID
MlmeADDBAAction(IN PRTMP_ADAPTER pAd
, IN MLME_QUEUE_ELEM
* Elem
)
103 MLME_ADDBA_REQ_STRUCT
*pInfo
;
105 PUCHAR pOutBuffer
= NULL
;
108 FRAME_ADDBA_REQ Frame
;
110 BA_ORI_ENTRY
*pBAEntry
= NULL
;
112 pInfo
= (MLME_ADDBA_REQ_STRUCT
*) Elem
->Msg
;
113 NdisZeroMemory(&Frame
, sizeof(FRAME_ADDBA_REQ
));
115 if (MlmeAddBAReqSanity(pAd
, Elem
->Msg
, Elem
->MsgLen
, Addr
)) {
116 NStatus
= MlmeAllocateMemory(pAd
, &pOutBuffer
); /*Get an unused nonpaged memory */
117 if (NStatus
!= NDIS_STATUS_SUCCESS
) {
118 DBGPRINT(RT_DEBUG_TRACE
,
119 ("BA - MlmeADDBAAction() allocate memory failed \n"));
124 pAd
->MacTab
.Content
[pInfo
->Wcid
].BAOriWcidArray
[pInfo
->TID
];
126 MlmeFreeMemory(pAd
, pOutBuffer
);
127 DBGPRINT(RT_DEBUG_ERROR
,
128 ("BA - MlmeADDBAAction() can't find BAOriEntry \n"));
131 pBAEntry
= &pAd
->BATable
.BAOriEntry
[Idx
];
136 ActHeaderInit(pAd
, &Frame
.Hdr
, pInfo
->pAddr
,
138 pAd
->CommonCfg
.Bssid
);
140 ActHeaderInit(pAd
, &Frame
.Hdr
,
141 pAd
->CommonCfg
.Bssid
,
146 Frame
.Category
= CATEGORY_BA
;
147 Frame
.Action
= ADDBA_REQ
;
148 Frame
.BaParm
.AMSDUSupported
= 0;
149 Frame
.BaParm
.BAPolicy
= IMMED_BA
;
150 Frame
.BaParm
.TID
= pInfo
->TID
;
151 Frame
.BaParm
.BufSize
= pInfo
->BaBufSize
;
152 Frame
.Token
= pInfo
->Token
;
153 Frame
.TimeOutValue
= pInfo
->TimeOutValue
;
154 Frame
.BaStartSeq
.field
.FragNum
= 0;
155 Frame
.BaStartSeq
.field
.StartSeq
=
156 pAd
->MacTab
.Content
[pInfo
->Wcid
].TxSeq
[pInfo
->TID
];
158 *(USHORT
*) (&Frame
.BaParm
) =
159 cpu2le16(*(USHORT
*) (&Frame
.BaParm
));
160 Frame
.TimeOutValue
= cpu2le16(Frame
.TimeOutValue
);
161 Frame
.BaStartSeq
.word
= cpu2le16(Frame
.BaStartSeq
.word
);
163 MakeOutgoingFrame(pOutBuffer
, &FrameLen
,
164 sizeof(FRAME_ADDBA_REQ
), &Frame
, END_OF_ARGS
);
166 MiniportMMRequest(pAd
,
167 (MGMT_USE_QUEUE_FLAG
|
168 MapUserPriorityToAccessCategory
[pInfo
->TID
]),
169 pOutBuffer
, FrameLen
);
171 MlmeFreeMemory(pAd
, pOutBuffer
);
173 DBGPRINT(RT_DEBUG_TRACE
,
174 ("BA - Send ADDBA request. StartSeq = %x, FrameLen = %ld. BufSize = %d\n",
175 Frame
.BaStartSeq
.field
.StartSeq
, FrameLen
,
176 Frame
.BaParm
.BufSize
));
181 ==========================================================================
183 send DELBA and delete BaEntry if any
185 Elem - MLME message MLME_DELBA_REQ_STRUCT
187 IRQL = DISPATCH_LEVEL
189 ==========================================================================
191 VOID
MlmeDELBAAction(IN PRTMP_ADAPTER pAd
, IN MLME_QUEUE_ELEM
* Elem
)
193 MLME_DELBA_REQ_STRUCT
*pInfo
;
194 PUCHAR pOutBuffer
= NULL
;
195 PUCHAR pOutBuffer2
= NULL
;
198 FRAME_DELBA_REQ Frame
;
202 pInfo
= (MLME_DELBA_REQ_STRUCT
*) Elem
->Msg
;
203 /* must send back DELBA */
204 NdisZeroMemory(&Frame
, sizeof(FRAME_DELBA_REQ
));
205 DBGPRINT(RT_DEBUG_TRACE
,
206 ("==> MlmeDELBAAction(), Initiator(%d) \n", pInfo
->Initiator
));
208 if (MlmeDelBAReqSanity(pAd
, Elem
->Msg
, Elem
->MsgLen
)) {
209 NStatus
= MlmeAllocateMemory(pAd
, &pOutBuffer
); /*Get an unused nonpaged memory */
210 if (NStatus
!= NDIS_STATUS_SUCCESS
) {
211 DBGPRINT(RT_DEBUG_ERROR
,
212 ("BA - MlmeDELBAAction() allocate memory failed 1. \n"));
216 NStatus
= MlmeAllocateMemory(pAd
, &pOutBuffer2
); /*Get an unused nonpaged memory */
217 if (NStatus
!= NDIS_STATUS_SUCCESS
) {
218 MlmeFreeMemory(pAd
, pOutBuffer
);
219 DBGPRINT(RT_DEBUG_ERROR
,
220 ("BA - MlmeDELBAAction() allocate memory failed 2. \n"));
223 /* SEND BAR (Send BAR to refresh peer reordering buffer.) */
225 pAd
->MacTab
.Content
[pInfo
->Wcid
].BAOriWcidArray
[pInfo
->TID
];
227 BarHeaderInit(pAd
, &FrameBar
,
228 pAd
->MacTab
.Content
[pInfo
->Wcid
].Addr
,
229 pAd
->CurrentAddress
);
231 FrameBar
.StartingSeq
.field
.FragNum
= 0; /* make sure sequence not clear in DEL funciton. */
232 FrameBar
.StartingSeq
.field
.StartSeq
= pAd
->MacTab
.Content
[pInfo
->Wcid
].TxSeq
[pInfo
->TID
]; /* make sure sequence not clear in DEL funciton. */
233 FrameBar
.BarControl
.TID
= pInfo
->TID
; /* make sure sequence not clear in DEL funciton. */
234 FrameBar
.BarControl
.ACKPolicy
= IMMED_BA
; /* make sure sequence not clear in DEL funciton. */
235 FrameBar
.BarControl
.Compressed
= 1; /* make sure sequence not clear in DEL funciton. */
236 FrameBar
.BarControl
.MTID
= 0; /* make sure sequence not clear in DEL funciton. */
238 MakeOutgoingFrame(pOutBuffer2
, &FrameLen
,
239 sizeof(FRAME_BAR
), &FrameBar
, END_OF_ARGS
);
240 MiniportMMRequest(pAd
, QID_AC_BE
, pOutBuffer2
, FrameLen
);
241 MlmeFreeMemory(pAd
, pOutBuffer2
);
242 DBGPRINT(RT_DEBUG_TRACE
,
243 ("BA - MlmeDELBAAction() . Send BAR to refresh peer reordering buffer \n"));
245 /* SEND DELBA FRAME */
250 ActHeaderInit(pAd
, &Frame
.Hdr
,
251 pAd
->MacTab
.Content
[pInfo
->Wcid
].
252 Addr
, pAd
->CurrentAddress
,
253 pAd
->CommonCfg
.Bssid
);
255 ActHeaderInit(pAd
, &Frame
.Hdr
,
256 pAd
->CommonCfg
.Bssid
,
258 pAd
->MacTab
.Content
[pInfo
->Wcid
].
262 Frame
.Category
= CATEGORY_BA
;
263 Frame
.Action
= DELBA
;
264 Frame
.DelbaParm
.Initiator
= pInfo
->Initiator
;
265 Frame
.DelbaParm
.TID
= pInfo
->TID
;
266 Frame
.ReasonCode
= 39; /* Time Out */
267 *(USHORT
*) (&Frame
.DelbaParm
) =
268 cpu2le16(*(USHORT
*) (&Frame
.DelbaParm
));
269 Frame
.ReasonCode
= cpu2le16(Frame
.ReasonCode
);
271 MakeOutgoingFrame(pOutBuffer
, &FrameLen
,
272 sizeof(FRAME_DELBA_REQ
), &Frame
, END_OF_ARGS
);
273 MiniportMMRequest(pAd
, QID_AC_BE
, pOutBuffer
, FrameLen
);
274 MlmeFreeMemory(pAd
, pOutBuffer
);
275 DBGPRINT(RT_DEBUG_TRACE
,
276 ("BA - MlmeDELBAAction() . 3 DELBA sent. Initiator(%d)\n",
281 VOID
MlmeQOSAction(IN PRTMP_ADAPTER pAd
, IN MLME_QUEUE_ELEM
* Elem
)
285 VOID
MlmeDLSAction(IN PRTMP_ADAPTER pAd
, IN MLME_QUEUE_ELEM
* Elem
)
289 VOID
MlmeInvalidAction(IN PRTMP_ADAPTER pAd
, IN MLME_QUEUE_ELEM
* Elem
)
291 /*PUCHAR pOutBuffer = NULL; */
292 /*Return the receiving frame except the MSB of category filed set to 1. 7.3.1.11 */
295 VOID
PeerQOSAction(IN PRTMP_ADAPTER pAd
, IN MLME_QUEUE_ELEM
* Elem
)
299 VOID
PeerBAAction(IN PRTMP_ADAPTER pAd
, IN MLME_QUEUE_ELEM
* Elem
)
301 UCHAR Action
= Elem
->Msg
[LENGTH_802_11
+ 1];
305 PeerAddBAReqAction(pAd
, Elem
);
308 PeerAddBARspAction(pAd
, Elem
);
311 PeerDelBAAction(pAd
, Elem
);
316 VOID
PeerPublicAction(IN PRTMP_ADAPTER pAd
, IN MLME_QUEUE_ELEM
* Elem
)
318 if (Elem
->Wcid
>= MAX_LEN_OF_MAC_TABLE
)
322 static VOID
ReservedAction(IN PRTMP_ADAPTER pAd
, IN MLME_QUEUE_ELEM
* Elem
)
326 if (Elem
->MsgLen
<= LENGTH_802_11
) {
330 Category
= Elem
->Msg
[LENGTH_802_11
];
331 DBGPRINT(RT_DEBUG_TRACE
,
332 ("Rcv reserved category(%d) Action Frame\n", Category
));
333 hex_dump("Reserved Action Frame", &Elem
->Msg
[0], Elem
->MsgLen
);
336 VOID
PeerRMAction(IN PRTMP_ADAPTER pAd
, IN MLME_QUEUE_ELEM
* Elem
)
341 static VOID
respond_ht_information_exchange_action(IN PRTMP_ADAPTER pAd
,
342 IN MLME_QUEUE_ELEM
* Elem
)
344 PUCHAR pOutBuffer
= NULL
;
347 FRAME_HT_INFO HTINFOframe
, *pFrame
;
350 /* 2. Always send back ADDBA Response */
351 NStatus
= MlmeAllocateMemory(pAd
, &pOutBuffer
); /*Get an unused nonpaged memory */
353 if (NStatus
!= NDIS_STATUS_SUCCESS
) {
354 DBGPRINT(RT_DEBUG_TRACE
,
355 ("ACTION - respond_ht_information_exchange_action() allocate memory failed \n"));
359 pFrame
= (FRAME_HT_INFO
*) & Elem
->Msg
[0];
360 pAddr
= pFrame
->Hdr
.Addr2
;
362 NdisZeroMemory(&HTINFOframe
, sizeof(FRAME_HT_INFO
));
363 /* 2-1. Prepare ADDBA Response frame. */
366 ActHeaderInit(pAd
, &HTINFOframe
.Hdr
, pAddr
,
368 pAd
->CommonCfg
.Bssid
);
370 ActHeaderInit(pAd
, &HTINFOframe
.Hdr
,
371 pAd
->CommonCfg
.Bssid
, pAd
->CurrentAddress
,
375 HTINFOframe
.Category
= CATEGORY_HT
;
376 HTINFOframe
.Action
= HT_INFO_EXCHANGE
;
377 HTINFOframe
.HT_Info
.Request
= 0;
378 HTINFOframe
.HT_Info
.Forty_MHz_Intolerant
=
379 pAd
->CommonCfg
.HtCapability
.HtCapInfo
.Forty_Mhz_Intolerant
;
380 HTINFOframe
.HT_Info
.STA_Channel_Width
=
381 pAd
->CommonCfg
.AddHTInfo
.AddHtInfo
.RecomWidth
;
383 MakeOutgoingFrame(pOutBuffer
, &FrameLen
,
384 sizeof(FRAME_HT_INFO
), &HTINFOframe
, END_OF_ARGS
);
386 MiniportMMRequest(pAd
, QID_AC_BE
, pOutBuffer
, FrameLen
);
387 MlmeFreeMemory(pAd
, pOutBuffer
);
390 VOID
PeerHTAction(IN PRTMP_ADAPTER pAd
, IN MLME_QUEUE_ELEM
* Elem
)
392 UCHAR Action
= Elem
->Msg
[LENGTH_802_11
+ 1];
394 if (Elem
->Wcid
>= MAX_LEN_OF_MAC_TABLE
)
398 case NOTIFY_BW_ACTION
:
399 DBGPRINT(RT_DEBUG_TRACE
,
400 ("ACTION - HT Notify Channel bandwidth action----> \n"));
402 if (pAd
->StaActive
.SupportedPhyInfo
.bHtEnable
== FALSE
) {
403 /* Note, this is to patch DIR-1353 AP. When the AP set to Wep, it will use legacy mode. But AP still keeps */
404 /* sending BW_Notify Action frame, and cause us to linkup and linkdown. */
405 /* In legacy mode, don't need to parse HT action frame. */
406 DBGPRINT(RT_DEBUG_TRACE
,
407 ("ACTION -Ignore HT Notify Channel BW when link as legacy mode. BW = %d---> \n",
408 Elem
->Msg
[LENGTH_802_11
+ 2]));
412 if (Elem
->Msg
[LENGTH_802_11
+ 2] == 0) /* 7.4.8.2. if value is 1, keep the same as supported channel bandwidth. */
413 pAd
->MacTab
.Content
[Elem
->Wcid
].HTPhyMode
.field
.BW
= 0;
418 DBGPRINT(RT_DEBUG_TRACE
, ("ACTION - SMPS action----> \n"));
419 if (((Elem
->Msg
[LENGTH_802_11
+ 2] & 0x1) == 0)) {
420 pAd
->MacTab
.Content
[Elem
->Wcid
].MmpsMode
= MMPS_ENABLE
;
421 } else if (((Elem
->Msg
[LENGTH_802_11
+ 2] & 0x2) == 0)) {
422 pAd
->MacTab
.Content
[Elem
->Wcid
].MmpsMode
= MMPS_STATIC
;
424 pAd
->MacTab
.Content
[Elem
->Wcid
].MmpsMode
= MMPS_DYNAMIC
;
427 DBGPRINT(RT_DEBUG_TRACE
,
428 ("Aid(%d) MIMO PS = %d\n", Elem
->Wcid
,
429 pAd
->MacTab
.Content
[Elem
->Wcid
].MmpsMode
));
430 /* rt2860c : add something for smps change. */
435 case MIMO_CHA_MEASURE_ACTION
:
437 case HT_INFO_EXCHANGE
:
439 HT_INFORMATION_OCTET
*pHT_info
;
442 (HT_INFORMATION_OCTET
*) & Elem
->Msg
[LENGTH_802_11
+
445 DBGPRINT(RT_DEBUG_TRACE
,
446 ("ACTION - HT Information Exchange action----> \n"));
447 if (pHT_info
->Request
) {
448 respond_ht_information_exchange_action(pAd
,
457 ==========================================================================
459 Retry sending ADDBA Reqest.
461 IRQL = DISPATCH_LEVEL
464 p8023Header: if this is already 802.3 format, p8023Header is NULL
466 Return : TRUE if put into rx reordering buffer, shouldn't indicaterxhere.
467 FALSE , then continue indicaterx at this moment.
468 ==========================================================================
470 VOID
ORIBATimerTimeout(IN PRTMP_ADAPTER pAd
)
472 MAC_TABLE_ENTRY
*pEntry
;
476 total
= pAd
->MacTab
.Size
* NUM_OF_TID
;
478 for (i
= 1; ((i
< MAX_LEN_OF_BA_ORI_TABLE
) && (total
> 0)); i
++) {
479 if (pAd
->BATable
.BAOriEntry
[i
].ORI_BA_Status
== Originator_Done
) {
481 &pAd
->MacTab
.Content
[pAd
->BATable
.BAOriEntry
[i
].
483 TID
= pAd
->BATable
.BAOriEntry
[i
].TID
;
485 ASSERT(pAd
->BATable
.BAOriEntry
[i
].Wcid
<
486 MAX_LEN_OF_MAC_TABLE
);
492 VOID
SendRefreshBAR(IN PRTMP_ADAPTER pAd
, IN MAC_TABLE_ENTRY
* pEntry
)
497 PUCHAR pOutBuffer
= NULL
;
501 BA_ORI_ENTRY
*pBAEntry
;
503 for (i
= 0; i
< NUM_OF_TID
; i
++) {
504 idx
= pEntry
->BAOriWcidArray
[i
];
508 pBAEntry
= &pAd
->BATable
.BAOriEntry
[idx
];
510 if (pBAEntry
->ORI_BA_Status
== Originator_Done
) {
513 ASSERT(pBAEntry
->Wcid
< MAX_LEN_OF_MAC_TABLE
);
515 NStatus
= MlmeAllocateMemory(pAd
, &pOutBuffer
); /*Get an unused nonpaged memory */
516 if (NStatus
!= NDIS_STATUS_SUCCESS
) {
517 DBGPRINT(RT_DEBUG_ERROR
,
518 ("BA - MlmeADDBAAction() allocate memory failed \n"));
522 Sequence
= pEntry
->TxSeq
[TID
];
524 BarHeaderInit(pAd
, &FrameBar
, pEntry
->Addr
,
525 pAd
->CurrentAddress
);
527 FrameBar
.StartingSeq
.field
.FragNum
= 0; /* make sure sequence not clear in DEL function. */
528 FrameBar
.StartingSeq
.field
.StartSeq
= Sequence
; /* make sure sequence not clear in DEL funciton. */
529 FrameBar
.BarControl
.TID
= TID
; /* make sure sequence not clear in DEL funciton. */
531 MakeOutgoingFrame(pOutBuffer
, &FrameLen
,
532 sizeof(FRAME_BAR
), &FrameBar
,
534 /*if (!(CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_RALINK_CHIPSET))) */
535 if (1) /* Now we always send BAR. */
537 /*MiniportMMRequestUnlock(pAd, 0, pOutBuffer, FrameLen); */
538 MiniportMMRequest(pAd
,
539 (MGMT_USE_QUEUE_FLAG
|
540 MapUserPriorityToAccessCategory
545 MlmeFreeMemory(pAd
, pOutBuffer
);
550 VOID
ActHeaderInit(IN PRTMP_ADAPTER pAd
,
551 IN OUT PHEADER_802_11 pHdr80211
,
552 IN PUCHAR Addr1
, IN PUCHAR Addr2
, IN PUCHAR Addr3
)
554 NdisZeroMemory(pHdr80211
, sizeof(HEADER_802_11
));
555 pHdr80211
->FC
.Type
= BTYPE_MGMT
;
556 pHdr80211
->FC
.SubType
= SUBTYPE_ACTION
;
558 COPY_MAC_ADDR(pHdr80211
->Addr1
, Addr1
);
559 COPY_MAC_ADDR(pHdr80211
->Addr2
, Addr2
);
560 COPY_MAC_ADDR(pHdr80211
->Addr3
, Addr3
);
563 VOID
BarHeaderInit(IN PRTMP_ADAPTER pAd
,
564 IN OUT PFRAME_BAR pCntlBar
, IN PUCHAR pDA
, IN PUCHAR pSA
)
566 NdisZeroMemory(pCntlBar
, sizeof(FRAME_BAR
));
567 pCntlBar
->FC
.Type
= BTYPE_CNTL
;
568 pCntlBar
->FC
.SubType
= SUBTYPE_BLOCK_ACK_REQ
;
569 pCntlBar
->BarControl
.MTID
= 0;
570 pCntlBar
->BarControl
.Compressed
= 1;
571 pCntlBar
->BarControl
.ACKPolicy
= 0;
574 16 + RTMPCalcDuration(pAd
, RATE_1
, sizeof(FRAME_BA
));
576 COPY_MAC_ADDR(pCntlBar
->Addr1
, pDA
);
577 COPY_MAC_ADDR(pCntlBar
->Addr2
, pSA
);
581 ==========================================================================
583 Insert Category and action code into the action frame.
586 1. frame buffer pointer.
588 3. category code of the frame.
589 4. action code of the frame.
592 ==========================================================================
594 VOID
InsertActField(IN PRTMP_ADAPTER pAd
,
595 OUT PUCHAR pFrameBuf
,
596 OUT PULONG pFrameLen
, IN UINT8 Category
, IN UINT8 ActCode
)
600 MakeOutgoingFrame(pFrameBuf
, &TempLen
,
601 1, &Category
, 1, &ActCode
, END_OF_ARGS
);
603 *pFrameLen
= *pFrameLen
+ TempLen
;