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 = 0;
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 (
71 IN P_ADAPTER_T prAdapter,
72 IN P_MSDU_INFO_T prMsduInfo,
73 IN ENUM_TX_RESULT_CODE_T rTxDoneStatus
77 wnmComposeTimingMeasFrame (
78 IN P_ADAPTER_T prAdapter,
79 IN P_STA_RECORD_T prStaRec,
80 IN PFN_TX_DONE_HANDLER pfTxDoneHandler
84 wnmTimingMeasRequest (
85 IN P_ADAPTER_T prAdapter,
88 /*******************************************************************************
90 ********************************************************************************
93 /*----------------------------------------------------------------------------*/
96 * \brief This routine is called to process the 802.11v wnm category action frame.
100 * Called by: Handle Rx mgmt request
102 /*----------------------------------------------------------------------------*/
105 IN P_ADAPTER_T prAdapter,
106 IN P_SW_RFB_T prSwRfb
109 P_WLAN_ACTION_FRAME prRxFrame;
114 prRxFrame = (P_WLAN_ACTION_FRAME) prSwRfb->pvHeader;
116 #if CFG_SUPPORT_802_11V_TIMING_MEASUREMENT
117 if (prRxFrame->ucAction == ACTION_WNM_TIMING_MEASUREMENT_REQUEST) {
118 wnmTimingMeasRequest(prAdapter, prSwRfb);
123 DBGLOG(WNM, TRACE, ("Unsupport WNM action frame: %d\n", prRxFrame->ucAction));
126 #if CFG_SUPPORT_802_11V_TIMING_MEASUREMENT
127 /*----------------------------------------------------------------------------*/
130 * \brief This routine is called to report timing measurement data.
133 /*----------------------------------------------------------------------------*/
135 wnmReportTimingMeas (
136 IN P_ADAPTER_T prAdapter,
137 IN UINT_8 ucStaRecIndex,
142 P_STA_RECORD_T prStaRec;
144 prStaRec = cnmGetStaRecByIndex(prAdapter, ucStaRecIndex);
146 if ((!prStaRec) || (!prStaRec->fgIsInUse)) {
150 DBGLOG(WNM, TRACE, ("wnmReportTimingMeas: u4ToD %x u4ToA %x", u4ToD, u4ToA));
152 if (!prStaRec->rWNMTimingMsmt.ucTrigger)
155 prStaRec->rWNMTimingMsmt.u4ToD = MICRO_TO_10NANO(u4ToD);
156 prStaRec->rWNMTimingMsmt.u4ToA = MICRO_TO_10NANO(u4ToA);
159 /*----------------------------------------------------------------------------*/
161 * @brief This function will handle TxDone(TimingMeasurement) Event.
163 * @param[in] prAdapter Pointer to the Adapter structure.
164 * @param[in] prMsduInfo Pointer to the MSDU_INFO_T.
165 * @param[in] rTxDoneStatus Return TX status of the Timing Measurement frame.
167 * @retval WLAN_STATUS_SUCCESS
169 /*----------------------------------------------------------------------------*/
171 wnmRunEventTimgingMeasTxDone (
172 IN P_ADAPTER_T prAdapter,
173 IN P_MSDU_INFO_T prMsduInfo,
174 IN ENUM_TX_RESULT_CODE_T rTxDoneStatus
177 P_STA_RECORD_T prStaRec;
182 DBGLOG(WNM, LOUD, ("EVENT-TX DONE: Current Time = %ld\n", kalGetTimeTick()));
184 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
186 if ((!prStaRec) || (!prStaRec->fgIsInUse)) {
187 return WLAN_STATUS_SUCCESS; /* For the case of replying ERROR STATUS CODE */
190 DBGLOG(WNM, TRACE, ("wnmRunEventTimgingMeasTxDone: ucDialog %d ucFollowUp %d u4ToD %x u4ToA %x",
191 prStaRec->rWNMTimingMsmt.ucDialogToken,
192 prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken,
193 prStaRec->rWNMTimingMsmt.u4ToD,
194 prStaRec->rWNMTimingMsmt.u4ToA));
196 prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken = prStaRec->rWNMTimingMsmt.ucDialogToken;
197 prStaRec->rWNMTimingMsmt.ucDialogToken = ++ucTimingMeasToken;
199 wnmComposeTimingMeasFrame(prAdapter, prStaRec, NULL);
201 return WLAN_STATUS_SUCCESS;
203 } /* end of wnmRunEventTimgingMeasTxDone() */
205 /*----------------------------------------------------------------------------*/
207 * @brief This function will compose the Timing Measurement frame.
209 * @param[in] prAdapter Pointer to the Adapter structure.
210 * @param[in] prStaRec Pointer to the STA_RECORD_T.
214 /*----------------------------------------------------------------------------*/
216 wnmComposeTimingMeasFrame (
217 IN P_ADAPTER_T prAdapter,
218 IN P_STA_RECORD_T prStaRec,
219 IN PFN_TX_DONE_HANDLER pfTxDoneHandler
222 P_MSDU_INFO_T prMsduInfo;
223 P_BSS_INFO_T prBssInfo;
224 P_ACTION_UNPROTECTED_WNM_TIMING_MEAS_FRAME prTxFrame;
225 UINT_16 u2PayloadLen;
227 prBssInfo = &prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex];
230 prMsduInfo = (P_MSDU_INFO_T) cnmMgtPktAlloc(prAdapter,
231 MAC_TX_RESERVED_FIELD + PUBLIC_ACTION_MAX_LEN);
236 prTxFrame = (P_ACTION_UNPROTECTED_WNM_TIMING_MEAS_FRAME)
237 ((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD);
239 prTxFrame->u2FrameCtrl = MAC_FRAME_ACTION;
241 COPY_MAC_ADDR(prTxFrame->aucDestAddr, prStaRec->aucMacAddr);
242 COPY_MAC_ADDR(prTxFrame->aucSrcAddr, prBssInfo->aucOwnMacAddr);
243 COPY_MAC_ADDR(prTxFrame->aucBSSID, prBssInfo->aucBSSID);
245 prTxFrame->ucCategory = CATEGORY_UNPROTECTED_WNM_ACTION;
246 prTxFrame->ucAction = ACTION_UNPROTECTED_WNM_TIMING_MEASUREMENT;
248 //3 Compose the frame body's frame.
249 prTxFrame->ucDialogToken = prStaRec->rWNMTimingMsmt.ucDialogToken;
250 prTxFrame->ucFollowUpDialogToken = prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken;
251 prTxFrame->u4ToD = prStaRec->rWNMTimingMsmt.u4ToD;
252 prTxFrame->u4ToA = prStaRec->rWNMTimingMsmt.u4ToA;
253 prTxFrame->ucMaxToDErr = WNM_MAX_TOD_ERROR;
254 prTxFrame->ucMaxToAErr = WNM_MAX_TOA_ERROR;
256 u2PayloadLen = 2 + ACTION_UNPROTECTED_WNM_TIMING_MEAS_LEN;
258 //4 Update information of MSDU_INFO_T
259 prMsduInfo->ucPacketType = HIF_TX_PACKET_TYPE_MGMT; /* Management frame */
260 prMsduInfo->ucStaRecIndex = prStaRec->ucIndex;
261 prMsduInfo->ucNetworkType = prStaRec->ucNetTypeIndex;
262 prMsduInfo->ucMacHeaderLength = WLAN_MAC_MGMT_HEADER_LEN;
263 prMsduInfo->fgIs802_1x = FALSE;
264 prMsduInfo->fgIs802_11 = TRUE;
265 prMsduInfo->u2FrameLength = WLAN_MAC_MGMT_HEADER_LEN + u2PayloadLen;
266 prMsduInfo->ucTxSeqNum = nicIncreaseTxSeqNum(prAdapter);
267 prMsduInfo->pfTxDoneHandler = pfTxDoneHandler;
268 prMsduInfo->fgIsBasicRate = FALSE;
270 DBGLOG(WNM, TRACE, ("wnmComposeTimingMeasFrame: ucDialogToken %d ucFollowUpDialogToken %d u4ToD %x u4ToA %x\n",
271 prTxFrame->ucDialogToken, prTxFrame->ucFollowUpDialogToken,
272 prTxFrame->u4ToD, prTxFrame->u4ToA));
274 //4 Enqueue the frame to send this action frame.
275 nicTxEnqueueMsdu(prAdapter, prMsduInfo);
279 } /* end of wnmComposeTimingMeasFrame() */
281 /*----------------------------------------------------------------------------*/
284 * \brief This routine is called to process the 802.11v timing measurement request.
288 * Handle Rx mgmt request
290 /*----------------------------------------------------------------------------*/
292 wnmTimingMeasRequest (
293 IN P_ADAPTER_T prAdapter,
294 IN P_SW_RFB_T prSwRfb
297 P_ACTION_WNM_TIMING_MEAS_REQ_FRAME prRxFrame = NULL;
298 P_STA_RECORD_T prStaRec;
300 prRxFrame = (P_ACTION_WNM_TIMING_MEAS_REQ_FRAME)prSwRfb->pvHeader;
304 prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
305 if ((!prStaRec) || (!prStaRec->fgIsInUse)) {
309 DBGLOG(WNM, TRACE, ("IEEE 802.11: Received Timing Measuremen Request from "
310 MACSTR"\n", MAC2STR(prStaRec->aucMacAddr)));
313 prStaRec->rWNMTimingMsmt.fgInitiator = TRUE;
314 prStaRec->rWNMTimingMsmt.ucTrigger = prRxFrame->ucTrigger;
315 if (!prRxFrame->ucTrigger)
318 prStaRec->rWNMTimingMsmt.ucDialogToken = ++ucTimingMeasToken;
319 prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken = 0;
321 wnmComposeTimingMeasFrame(prAdapter, prStaRec, wnmRunEventTimgingMeasTxDone);
325 VOID wnmTimingMeasUnitTest1(P_ADAPTER_T prAdapter, UINT_8 ucStaRecIndex)
327 P_STA_RECORD_T prStaRec;
329 prStaRec = cnmGetStaRecByIndex(prAdapter, ucStaRecIndex);
330 if ((!prStaRec) || (!prStaRec->fgIsInUse)) {
334 DBGLOG(WNM, INFO, ("IEEE 802.11v: Test Timing Measuremen Request from "
335 MACSTR"\n", MAC2STR(prStaRec->aucMacAddr)));
337 prStaRec->rWNMTimingMsmt.fgInitiator = TRUE;
338 prStaRec->rWNMTimingMsmt.ucTrigger = 1;
340 prStaRec->rWNMTimingMsmt.ucDialogToken = ++ucTimingMeasToken;
341 prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken = 0;
343 wnmComposeTimingMeasFrame(prAdapter, prStaRec, wnmRunEventTimgingMeasTxDone);
347 #endif /* CFG_SUPPORT_802_11V_TIMING_MEASUREMENT */
349 #endif /* CFG_SUPPORT_802_11V */