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"
43 static VOID
ReservedAction(
45 IN MLME_QUEUE_ELEM
*Elem
);
48 ==========================================================================
50 association state machine init, including state transition and timer init
52 S - pointer to the association state machine
54 The state machine looks like the following
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 ==========================================================================
64 VOID
ActionStateMachineInit(
67 OUT STATE_MACHINE_FUNC Trans
[])
69 StateMachineInit(S
, (STATE_MACHINE_FUNC
*)Trans
, MAX_ACT_STATE
, MAX_ACT_MSG
, (STATE_MACHINE_FUNC
)Drop
, ACT_IDLE
, ACT_MACHINE_BASE
);
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
);
74 StateMachineSetAction(S
, ACT_IDLE
, MT2_PEER_DLS_CATE
, (STATE_MACHINE_FUNC
)ReservedAction
);
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 //
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
);
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
);
92 #ifdef DOT11_N_SUPPORT
95 IN MLME_QUEUE_ELEM
*Elem
)
98 MLME_ADDBA_REQ_STRUCT
*pInfo
;
100 PUCHAR pOutBuffer
= NULL
;
103 FRAME_ADDBA_REQ Frame
;
105 BA_ORI_ENTRY
*pBAEntry
= NULL
;
107 pInfo
= (MLME_ADDBA_REQ_STRUCT
*)Elem
->Msg
;
108 NdisZeroMemory(&Frame
, sizeof(FRAME_ADDBA_REQ
));
110 if(MlmeAddBAReqSanity(pAd
, Elem
->Msg
, Elem
->MsgLen
, Addr
))
112 NStatus
= MlmeAllocateMemory(pAd
, &pOutBuffer
); //Get an unused nonpaged memory
113 if(NStatus
!= NDIS_STATUS_SUCCESS
)
115 DBGPRINT(RT_DEBUG_TRACE
,("BA - MlmeADDBAAction() allocate memory failed \n"));
119 Idx
= pAd
->MacTab
.Content
[pInfo
->Wcid
].BAOriWcidArray
[pInfo
->TID
];
122 MlmeFreeMemory(pAd
, pOutBuffer
);
123 DBGPRINT(RT_DEBUG_ERROR
,("BA - MlmeADDBAAction() can't find BAOriEntry \n"));
128 pBAEntry
=&pAd
->BATable
.BAOriEntry
[Idx
];
131 #ifdef CONFIG_STA_SUPPORT
132 IF_DEV_CONFIG_OPMODE_ON_STA(pAd
)
135 ActHeaderInit(pAd
, &Frame
.Hdr
, pInfo
->pAddr
, pAd
->CurrentAddress
, pAd
->CommonCfg
.Bssid
);
137 ActHeaderInit(pAd
, &Frame
.Hdr
, pAd
->CommonCfg
.Bssid
, pAd
->CurrentAddress
, pInfo
->pAddr
);
139 #endif // CONFIG_STA_SUPPORT //
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
];
152 *(USHORT
*)(&Frame
.BaParm
) = cpu2le16(*(USHORT
*)(&Frame
.BaParm
));
153 Frame
.TimeOutValue
= cpu2le16(Frame
.TimeOutValue
);
154 Frame
.BaStartSeq
.word
= cpu2le16(Frame
.BaStartSeq
.word
);
156 MakeOutgoingFrame(pOutBuffer
, &FrameLen
,
157 sizeof(FRAME_ADDBA_REQ
), &Frame
,
159 MiniportMMRequest(pAd
, QID_AC_BE
, pOutBuffer
, FrameLen
);
160 MlmeFreeMemory(pAd
, pOutBuffer
);
162 DBGPRINT(RT_DEBUG_TRACE
, ("BA - Send ADDBA request. StartSeq = %x, FrameLen = %ld. BufSize = %d\n", Frame
.BaStartSeq
.field
.StartSeq
, FrameLen
, Frame
.BaParm
.BufSize
));
167 ==========================================================================
169 send DELBA and delete BaEntry if any
171 Elem - MLME message MLME_DELBA_REQ_STRUCT
173 IRQL = DISPATCH_LEVEL
175 ==========================================================================
177 VOID
MlmeDELBAAction(
178 IN PRTMP_ADAPTER pAd
,
179 IN MLME_QUEUE_ELEM
*Elem
)
181 MLME_DELBA_REQ_STRUCT
*pInfo
;
182 PUCHAR pOutBuffer
= NULL
;
183 PUCHAR pOutBuffer2
= NULL
;
186 FRAME_DELBA_REQ Frame
;
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
));
195 if(MlmeDelBAReqSanity(pAd
, Elem
->Msg
, Elem
->MsgLen
))
197 NStatus
= MlmeAllocateMemory(pAd
, &pOutBuffer
); //Get an unused nonpaged memory
198 if(NStatus
!= NDIS_STATUS_SUCCESS
)
200 DBGPRINT(RT_DEBUG_ERROR
,("BA - MlmeDELBAAction() allocate memory failed 1. \n"));
204 NStatus
= MlmeAllocateMemory(pAd
, &pOutBuffer2
); //Get an unused nonpaged memory
205 if(NStatus
!= NDIS_STATUS_SUCCESS
)
207 MlmeFreeMemory(pAd
, pOutBuffer
);
208 DBGPRINT(RT_DEBUG_ERROR
, ("BA - MlmeDELBAAction() allocate memory failed 2. \n"));
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 //
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.
226 MakeOutgoingFrame(pOutBuffer2
, &FrameLen
,
227 sizeof(FRAME_BAR
), &FrameBar
,
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"));
235 #ifdef CONFIG_STA_SUPPORT
236 IF_DEV_CONFIG_OPMODE_ON_STA(pAd
)
239 ActHeaderInit(pAd
, &Frame
.Hdr
, pAd
->MacTab
.Content
[pInfo
->Wcid
].Addr
, pAd
->CurrentAddress
, pAd
->CommonCfg
.Bssid
);
241 ActHeaderInit(pAd
, &Frame
.Hdr
, pAd
->CommonCfg
.Bssid
, pAd
->CurrentAddress
, pAd
->MacTab
.Content
[pInfo
->Wcid
].Addr
);
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
);
252 MakeOutgoingFrame(pOutBuffer
, &FrameLen
,
253 sizeof(FRAME_DELBA_REQ
), &Frame
,
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
));
260 #endif // DOT11_N_SUPPORT //
263 IN PRTMP_ADAPTER pAd
,
264 IN MLME_QUEUE_ELEM
*Elem
)
269 IN PRTMP_ADAPTER pAd
,
270 IN MLME_QUEUE_ELEM
*Elem
)
274 VOID
MlmeInvalidAction(
275 IN PRTMP_ADAPTER pAd
,
276 IN MLME_QUEUE_ELEM
*Elem
)
278 //PUCHAR pOutBuffer = NULL;
279 //Return the receiving frame except the MSB of category filed set to 1. 7.3.1.11
283 IN PRTMP_ADAPTER pAd
,
284 IN MLME_QUEUE_ELEM
*Elem
)
288 #ifdef DOT11_N_SUPPORT
290 IN PRTMP_ADAPTER pAd
,
291 IN MLME_QUEUE_ELEM
*Elem
)
293 UCHAR Action
= Elem
->Msg
[LENGTH_802_11
+1];
298 PeerAddBAReqAction(pAd
,Elem
);
301 PeerAddBARspAction(pAd
,Elem
);
304 PeerDelBAAction(pAd
,Elem
);
308 #endif // DOT11_N_SUPPORT //
310 VOID
PeerPublicAction(
311 IN PRTMP_ADAPTER pAd
,
312 IN MLME_QUEUE_ELEM
*Elem
)
314 if (Elem
->Wcid
>= MAX_LEN_OF_MAC_TABLE
)
319 static VOID
ReservedAction(
320 IN PRTMP_ADAPTER pAd
,
321 IN MLME_QUEUE_ELEM
*Elem
)
325 if (Elem
->MsgLen
<= LENGTH_802_11
)
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
);
336 IN PRTMP_ADAPTER pAd
,
337 IN MLME_QUEUE_ELEM
*Elem
)
343 #ifdef DOT11_N_SUPPORT
344 static VOID
respond_ht_information_exchange_action(
345 IN PRTMP_ADAPTER pAd
,
346 IN MLME_QUEUE_ELEM
*Elem
)
348 PUCHAR pOutBuffer
= NULL
;
351 FRAME_HT_INFO HTINFOframe
, *pFrame
;
355 // 2. Always send back ADDBA Response
356 NStatus
= MlmeAllocateMemory(pAd
, &pOutBuffer
); //Get an unused nonpaged memory
358 if (NStatus
!= NDIS_STATUS_SUCCESS
)
360 DBGPRINT(RT_DEBUG_TRACE
,("ACTION - respond_ht_information_exchange_action() allocate memory failed \n"));
365 pFrame
= (FRAME_HT_INFO
*) &Elem
->Msg
[0];
366 pAddr
= pFrame
->Hdr
.Addr2
;
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
)
374 ActHeaderInit(pAd
, &HTINFOframe
.Hdr
, pAddr
, pAd
->CurrentAddress
, pAd
->CommonCfg
.Bssid
);
376 ActHeaderInit(pAd
, &HTINFOframe
.Hdr
, pAd
->CommonCfg
.Bssid
, pAd
->CurrentAddress
, pAddr
);
378 #endif // CONFIG_STA_SUPPORT //
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
;
386 MakeOutgoingFrame(pOutBuffer
, &FrameLen
,
387 sizeof(FRAME_HT_INFO
), &HTINFOframe
,
390 MiniportMMRequest(pAd
, QID_AC_BE
, pOutBuffer
, FrameLen
);
391 MlmeFreeMemory(pAd
, pOutBuffer
);
395 IN PRTMP_ADAPTER pAd
,
396 IN MLME_QUEUE_ELEM
*Elem
)
398 UCHAR Action
= Elem
->Msg
[LENGTH_802_11
+1];
400 if (Elem
->Wcid
>= MAX_LEN_OF_MAC_TABLE
)
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
)
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] ));
417 #endif // CONFIG_STA_SUPPORT //
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;
425 DBGPRINT(RT_DEBUG_TRACE
,("ACTION - SMPS action----> \n"));
426 if (((Elem
->Msg
[LENGTH_802_11
+2]&0x1) == 0))
428 pAd
->MacTab
.Content
[Elem
->Wcid
].MmpsMode
= MMPS_ENABLE
;
430 else if (((Elem
->Msg
[LENGTH_802_11
+2]&0x2) == 0))
432 pAd
->MacTab
.Content
[Elem
->Wcid
].MmpsMode
= MMPS_STATIC
;
436 pAd
->MacTab
.Content
[Elem
->Wcid
].MmpsMode
= MMPS_DYNAMIC
;
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.
445 case MIMO_CHA_MEASURE_ACTION
:
447 case HT_INFO_EXCHANGE
:
449 HT_INFORMATION_OCTET
*pHT_info
;
451 pHT_info
= (HT_INFORMATION_OCTET
*) &Elem
->Msg
[LENGTH_802_11
+2];
453 DBGPRINT(RT_DEBUG_TRACE
,("ACTION - HT Information Exchange action----> \n"));
454 if (pHT_info
->Request
)
456 respond_ht_information_exchange_action(pAd
, Elem
);
465 ==========================================================================
467 Retry sending ADDBA Reqest.
469 IRQL = DISPATCH_LEVEL
472 p8023Header: if this is already 802.3 format, p8023Header is NULL
474 Return : TRUE if put into rx reordering buffer, shouldn't indicaterxhere.
475 FALSE , then continue indicaterx at this moment.
476 ==========================================================================
478 VOID
ORIBATimerTimeout(
479 IN PRTMP_ADAPTER pAd
)
481 MAC_TABLE_ENTRY
*pEntry
;
485 total
= pAd
->MacTab
.Size
* NUM_OF_TID
;
487 for (i
= 1; ((i
<MAX_LEN_OF_BA_ORI_TABLE
) && (total
> 0)) ; i
++)
489 if (pAd
->BATable
.BAOriEntry
[i
].ORI_BA_Status
== Originator_Done
)
491 pEntry
= &pAd
->MacTab
.Content
[pAd
->BATable
.BAOriEntry
[i
].Wcid
];
492 TID
= pAd
->BATable
.BAOriEntry
[i
].TID
;
494 ASSERT(pAd
->BATable
.BAOriEntry
[i
].Wcid
< MAX_LEN_OF_MAC_TABLE
);
502 IN PRTMP_ADAPTER pAd
,
503 IN MAC_TABLE_ENTRY
*pEntry
)
508 PUCHAR pOutBuffer
= NULL
;
512 BA_ORI_ENTRY
*pBAEntry
;
514 for (i
= 0; i
<NUM_OF_TID
; i
++)
516 idx
= pEntry
->BAOriWcidArray
[i
];
521 pBAEntry
= &pAd
->BATable
.BAOriEntry
[idx
];
523 if (pBAEntry
->ORI_BA_Status
== Originator_Done
)
527 ASSERT(pBAEntry
->Wcid
< MAX_LEN_OF_MAC_TABLE
);
529 NStatus
= MlmeAllocateMemory(pAd
, &pOutBuffer
); //Get an unused nonpaged memory
530 if(NStatus
!= NDIS_STATUS_SUCCESS
)
532 DBGPRINT(RT_DEBUG_ERROR
,("BA - MlmeADDBAAction() allocate memory failed \n"));
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 //
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.
546 MakeOutgoingFrame(pOutBuffer
, &FrameLen
,
547 sizeof(FRAME_BAR
), &FrameBar
,
549 if (1) // Now we always send BAR.
551 MiniportMMRequest(pAd
, 0, pOutBuffer
, FrameLen
);
553 MlmeFreeMemory(pAd
, pOutBuffer
);
557 #endif // DOT11_N_SUPPORT //
560 IN PRTMP_ADAPTER pAd
,
561 IN OUT PHEADER_802_11 pHdr80211
,
566 NdisZeroMemory(pHdr80211
, sizeof(HEADER_802_11
));
567 pHdr80211
->FC
.Type
= BTYPE_MGMT
;
568 pHdr80211
->FC
.SubType
= SUBTYPE_ACTION
;
570 COPY_MAC_ADDR(pHdr80211
->Addr1
, Addr1
);
571 COPY_MAC_ADDR(pHdr80211
->Addr2
, Addr2
);
572 COPY_MAC_ADDR(pHdr80211
->Addr3
, Addr3
);
576 IN PRTMP_ADAPTER pAd
,
577 IN OUT PFRAME_BAR pCntlBar
,
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;
589 pCntlBar
->Duration
= 16 + RTMPCalcDuration(pAd
, RATE_1
, sizeof(FRAME_BA
));
591 COPY_MAC_ADDR(pCntlBar
->Addr1
, pDA
);
592 COPY_MAC_ADDR(pCntlBar
->Addr2
, pSA
);
597 ==========================================================================
599 Insert Category and action code into the action frame.
602 1. frame buffer pointer.
604 3. category code of the frame.
605 4. action code of the frame.
608 ==========================================================================
611 IN PRTMP_ADAPTER pAd
,
612 OUT PUCHAR pFrameBuf
,
613 OUT PULONG pFrameLen
,
619 MakeOutgoingFrame( pFrameBuf
, &TempLen
,
624 *pFrameLen
= *pFrameLen
+ TempLen
;