2 ** $Id: //Department/DaVinci/TRUNK/MT6620_5931_WiFi_Driver/mgmt/wnm.c#1 $
6 \brief This file includes the 802.11v default vale and functions.
14 * 01 05 2012 tsaiyuan.hsu
15 * [WCXRP00001157] [MT6620 Wi-Fi][FW][DRV] add timing measurement support for 802.11v
16 * add timing measurement support for 802.11v.
21 /*******************************************************************************
22 * C O M P I L E R F L A G S
23 ********************************************************************************
26 /*******************************************************************************
27 * E X T E R N A L R E F E R E N C E S
28 ********************************************************************************
32 #if CFG_SUPPORT_802_11V
34 /*******************************************************************************
36 ********************************************************************************
39 #define WNM_MAX_TOD_ERROR 0
40 #define WNM_MAX_TOA_ERROR 0
41 #define MICRO_TO_10NANO(x) ((x)*100)
42 /*******************************************************************************
44 ********************************************************************************
47 /*******************************************************************************
49 ********************************************************************************
52 /*******************************************************************************
53 * P R I V A T E D A T A
54 ********************************************************************************
57 static UINT_8 ucTimingMeasToken
;
59 /*******************************************************************************
61 ********************************************************************************
64 /*******************************************************************************
65 * F U N C T I O N D E C L A R A T I O N S
66 ********************************************************************************
70 wnmRunEventTimgingMeasTxDone(IN P_ADAPTER_T prAdapter
,
71 IN P_MSDU_INFO_T prMsduInfo
, IN ENUM_TX_RESULT_CODE_T rTxDoneStatus
);
74 wnmComposeTimingMeasFrame(IN P_ADAPTER_T prAdapter
,
75 IN P_STA_RECORD_T prStaRec
, IN PFN_TX_DONE_HANDLER pfTxDoneHandler
);
77 VOID
wnmTimingMeasRequest(IN P_ADAPTER_T prAdapter
, IN P_SW_RFB_T prSwRfb
);
78 /*******************************************************************************
80 ********************************************************************************
83 /*----------------------------------------------------------------------------*/
86 * \brief This routine is called to process the 802.11v wnm category action frame.
90 * Called by: Handle Rx mgmt request
92 /*----------------------------------------------------------------------------*/
93 VOID
wnmWNMAction(IN P_ADAPTER_T prAdapter
, IN P_SW_RFB_T prSwRfb
)
95 P_WLAN_ACTION_FRAME prRxFrame
;
100 prRxFrame
= (P_WLAN_ACTION_FRAME
) prSwRfb
->pvHeader
;
102 #if CFG_SUPPORT_802_11V_TIMING_MEASUREMENT
103 if (prRxFrame
->ucAction
== ACTION_WNM_TIMING_MEASUREMENT_REQUEST
) {
104 wnmTimingMeasRequest(prAdapter
, prSwRfb
);
109 DBGLOG(WNM
, TRACE
, ("Unsupport WNM action frame: %d\n", prRxFrame
->ucAction
));
112 #if CFG_SUPPORT_802_11V_TIMING_MEASUREMENT
113 /*----------------------------------------------------------------------------*/
116 * \brief This routine is called to report timing measurement data.
119 /*----------------------------------------------------------------------------*/
121 wnmReportTimingMeas(IN P_ADAPTER_T prAdapter
,
122 IN UINT_8 ucStaRecIndex
, IN UINT_32 u4ToD
, IN UINT_32 u4ToA
)
124 P_STA_RECORD_T prStaRec
;
126 prStaRec
= cnmGetStaRecByIndex(prAdapter
, ucStaRecIndex
);
128 if ((!prStaRec
) || (!prStaRec
->fgIsInUse
)) {
132 DBGLOG(WNM
, TRACE
, ("wnmReportTimingMeas: u4ToD %x u4ToA %x", u4ToD
, u4ToA
));
134 if (!prStaRec
->rWNMTimingMsmt
.ucTrigger
)
137 prStaRec
->rWNMTimingMsmt
.u4ToD
= MICRO_TO_10NANO(u4ToD
);
138 prStaRec
->rWNMTimingMsmt
.u4ToA
= MICRO_TO_10NANO(u4ToA
);
141 /*----------------------------------------------------------------------------*/
143 * @brief This function will handle TxDone(TimingMeasurement) Event.
145 * @param[in] prAdapter Pointer to the Adapter structure.
146 * @param[in] prMsduInfo Pointer to the MSDU_INFO_T.
147 * @param[in] rTxDoneStatus Return TX status of the Timing Measurement frame.
149 * @retval WLAN_STATUS_SUCCESS
151 /*----------------------------------------------------------------------------*/
153 wnmRunEventTimgingMeasTxDone(IN P_ADAPTER_T prAdapter
,
154 IN P_MSDU_INFO_T prMsduInfo
, IN ENUM_TX_RESULT_CODE_T rTxDoneStatus
)
156 P_STA_RECORD_T prStaRec
;
161 DBGLOG(WNM
, LOUD
, ("EVENT-TX DONE: Current Time = %ld\n", kalGetTimeTick()));
163 prStaRec
= cnmGetStaRecByIndex(prAdapter
, prMsduInfo
->ucStaRecIndex
);
165 if ((!prStaRec
) || (!prStaRec
->fgIsInUse
)) {
166 return WLAN_STATUS_SUCCESS
; /* For the case of replying ERROR STATUS CODE */
170 ("wnmRunEventTimgingMeasTxDone: ucDialog %d ucFollowUp %d u4ToD %x u4ToA %x",
171 prStaRec
->rWNMTimingMsmt
.ucDialogToken
,
172 prStaRec
->rWNMTimingMsmt
.ucFollowUpDialogToken
, prStaRec
->rWNMTimingMsmt
.u4ToD
,
173 prStaRec
->rWNMTimingMsmt
.u4ToA
));
175 prStaRec
->rWNMTimingMsmt
.ucFollowUpDialogToken
= prStaRec
->rWNMTimingMsmt
.ucDialogToken
;
176 prStaRec
->rWNMTimingMsmt
.ucDialogToken
= ++ucTimingMeasToken
;
178 wnmComposeTimingMeasFrame(prAdapter
, prStaRec
, NULL
);
180 return WLAN_STATUS_SUCCESS
;
182 } /* end of wnmRunEventTimgingMeasTxDone() */
184 /*----------------------------------------------------------------------------*/
186 * @brief This function will compose the Timing Measurement frame.
188 * @param[in] prAdapter Pointer to the Adapter structure.
189 * @param[in] prStaRec Pointer to the STA_RECORD_T.
193 /*----------------------------------------------------------------------------*/
195 wnmComposeTimingMeasFrame(IN P_ADAPTER_T prAdapter
,
196 IN P_STA_RECORD_T prStaRec
, IN PFN_TX_DONE_HANDLER pfTxDoneHandler
)
198 P_MSDU_INFO_T prMsduInfo
;
199 P_BSS_INFO_T prBssInfo
;
200 P_ACTION_UNPROTECTED_WNM_TIMING_MEAS_FRAME prTxFrame
;
201 UINT_16 u2PayloadLen
;
203 prBssInfo
= &prAdapter
->rWifiVar
.arBssInfo
[prStaRec
->ucNetTypeIndex
];
206 prMsduInfo
= (P_MSDU_INFO_T
) cnmMgtPktAlloc(prAdapter
,
207 MAC_TX_RESERVED_FIELD
+ PUBLIC_ACTION_MAX_LEN
);
212 prTxFrame
= (P_ACTION_UNPROTECTED_WNM_TIMING_MEAS_FRAME
)
213 ((UINT_32
) (prMsduInfo
->prPacket
) + MAC_TX_RESERVED_FIELD
);
215 prTxFrame
->u2FrameCtrl
= MAC_FRAME_ACTION
;
217 COPY_MAC_ADDR(prTxFrame
->aucDestAddr
, prStaRec
->aucMacAddr
);
218 COPY_MAC_ADDR(prTxFrame
->aucSrcAddr
, prBssInfo
->aucOwnMacAddr
);
219 COPY_MAC_ADDR(prTxFrame
->aucBSSID
, prBssInfo
->aucBSSID
);
221 prTxFrame
->ucCategory
= CATEGORY_UNPROTECTED_WNM_ACTION
;
222 prTxFrame
->ucAction
= ACTION_UNPROTECTED_WNM_TIMING_MEASUREMENT
;
224 /* 3 Compose the frame body's frame. */
225 prTxFrame
->ucDialogToken
= prStaRec
->rWNMTimingMsmt
.ucDialogToken
;
226 prTxFrame
->ucFollowUpDialogToken
= prStaRec
->rWNMTimingMsmt
.ucFollowUpDialogToken
;
227 prTxFrame
->u4ToD
= prStaRec
->rWNMTimingMsmt
.u4ToD
;
228 prTxFrame
->u4ToA
= prStaRec
->rWNMTimingMsmt
.u4ToA
;
229 prTxFrame
->ucMaxToDErr
= WNM_MAX_TOD_ERROR
;
230 prTxFrame
->ucMaxToAErr
= WNM_MAX_TOA_ERROR
;
232 u2PayloadLen
= 2 + ACTION_UNPROTECTED_WNM_TIMING_MEAS_LEN
;
234 /* 4 Update information of MSDU_INFO_T */
235 prMsduInfo
->ucPacketType
= HIF_TX_PACKET_TYPE_MGMT
; /* Management frame */
236 prMsduInfo
->ucStaRecIndex
= prStaRec
->ucIndex
;
237 prMsduInfo
->ucNetworkType
= prStaRec
->ucNetTypeIndex
;
238 prMsduInfo
->ucMacHeaderLength
= WLAN_MAC_MGMT_HEADER_LEN
;
239 prMsduInfo
->fgIs802_1x
= FALSE
;
240 prMsduInfo
->fgIs802_11
= TRUE
;
241 prMsduInfo
->u2FrameLength
= WLAN_MAC_MGMT_HEADER_LEN
+ u2PayloadLen
;
242 prMsduInfo
->ucTxSeqNum
= nicIncreaseTxSeqNum(prAdapter
);
243 prMsduInfo
->pfTxDoneHandler
= pfTxDoneHandler
;
244 prMsduInfo
->fgIsBasicRate
= FALSE
;
247 ("wnmComposeTimingMeasFrame: ucDialogToken %d ucFollowUpDialogToken %d u4ToD %x u4ToA %x\n",
248 prTxFrame
->ucDialogToken
, prTxFrame
->ucFollowUpDialogToken
, prTxFrame
->u4ToD
,
251 /* 4 Enqueue the frame to send this action frame. */
252 nicTxEnqueueMsdu(prAdapter
, prMsduInfo
);
256 } /* end of wnmComposeTimingMeasFrame() */
258 /*----------------------------------------------------------------------------*/
261 * \brief This routine is called to process the 802.11v timing measurement request.
265 * Handle Rx mgmt request
267 /*----------------------------------------------------------------------------*/
268 VOID
wnmTimingMeasRequest(IN P_ADAPTER_T prAdapter
, IN P_SW_RFB_T prSwRfb
)
270 P_ACTION_WNM_TIMING_MEAS_REQ_FRAME prRxFrame
= NULL
;
271 P_STA_RECORD_T prStaRec
;
273 prRxFrame
= (P_ACTION_WNM_TIMING_MEAS_REQ_FRAME
) prSwRfb
->pvHeader
;
277 prStaRec
= cnmGetStaRecByIndex(prAdapter
, prSwRfb
->ucStaRecIdx
);
278 if ((!prStaRec
) || (!prStaRec
->fgIsInUse
)) {
282 DBGLOG(WNM
, TRACE
, ("IEEE 802.11: Received Timing Measuremen Request from "
283 MACSTR
"\n", MAC2STR(prStaRec
->aucMacAddr
)));
285 /* reset timing msmt */
286 prStaRec
->rWNMTimingMsmt
.fgInitiator
= TRUE
;
287 prStaRec
->rWNMTimingMsmt
.ucTrigger
= prRxFrame
->ucTrigger
;
288 if (!prRxFrame
->ucTrigger
)
291 prStaRec
->rWNMTimingMsmt
.ucDialogToken
= ++ucTimingMeasToken
;
292 prStaRec
->rWNMTimingMsmt
.ucFollowUpDialogToken
= 0;
294 wnmComposeTimingMeasFrame(prAdapter
, prStaRec
, wnmRunEventTimgingMeasTxDone
);
298 VOID
wnmTimingMeasUnitTest1(P_ADAPTER_T prAdapter
, UINT_8 ucStaRecIndex
)
300 P_STA_RECORD_T prStaRec
;
302 prStaRec
= cnmGetStaRecByIndex(prAdapter
, ucStaRecIndex
);
303 if ((!prStaRec
) || (!prStaRec
->fgIsInUse
)) {
307 DBGLOG(WNM
, INFO
, ("IEEE 802.11v: Test Timing Measuremen Request from "
308 MACSTR
"\n", MAC2STR(prStaRec
->aucMacAddr
)));
310 prStaRec
->rWNMTimingMsmt
.fgInitiator
= TRUE
;
311 prStaRec
->rWNMTimingMsmt
.ucTrigger
= 1;
313 prStaRec
->rWNMTimingMsmt
.ucDialogToken
= ++ucTimingMeasToken
;
314 prStaRec
->rWNMTimingMsmt
.ucFollowUpDialogToken
= 0;
316 wnmComposeTimingMeasFrame(prAdapter
, prStaRec
, wnmRunEventTimgingMeasTxDone
);
320 #endif /* CFG_SUPPORT_802_11V_TIMING_MEASUREMENT */
322 #endif /* CFG_SUPPORT_802_11V */