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.
9 /*******************************************************************************
10 * Copyright (c) 2007 MediaTek Inc.
12 * All rights reserved. Copying, compilation, modification, distribution
13 * or any other use whatsoever of this material is strictly prohibited
14 * except in accordance with a Software License Agreement with
16 ********************************************************************************
19 /*******************************************************************************
22 * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND
23 * AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK
24 * SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE
25 * PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY
26 * DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
27 * LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
28 * PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE
29 * ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY
30 * WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK
31 * SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY
32 * WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE
33 * FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO
34 * CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
36 * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
37 * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL
38 * BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT
39 * ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY
40 * BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
42 * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
43 * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT
44 * OF LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING
45 * THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN
46 * FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE
48 ********************************************************************************
54 * 01 05 2012 tsaiyuan.hsu
55 * [WCXRP00001157] [MT6620 Wi-Fi][FW][DRV] add timing measurement support for 802.11v
56 * add timing measurement support for 802.11v.
61 /*******************************************************************************
62 * C O M P I L E R F L A G S
63 ********************************************************************************
66 /*******************************************************************************
67 * E X T E R N A L R E F E R E N C E S
68 ********************************************************************************
72 #if CFG_SUPPORT_802_11V
74 /*******************************************************************************
76 ********************************************************************************
79 #define WNM_MAX_TOD_ERROR 0
80 #define WNM_MAX_TOA_ERROR 0
81 #define MICRO_TO_10NANO(x) ((x)*100)
82 /*******************************************************************************
84 ********************************************************************************
87 /*******************************************************************************
89 ********************************************************************************
92 /*******************************************************************************
93 * P R I V A T E D A T A
94 ********************************************************************************
97 static UINT_8 ucTimingMeasToken = 0;
99 /*******************************************************************************
101 ********************************************************************************
104 /*******************************************************************************
105 * F U N C T I O N D E C L A R A T I O N S
106 ********************************************************************************
110 wnmRunEventTimgingMeasTxDone (
111 IN P_ADAPTER_T prAdapter,
112 IN P_MSDU_INFO_T prMsduInfo,
113 IN ENUM_TX_RESULT_CODE_T rTxDoneStatus
117 wnmComposeTimingMeasFrame (
118 IN P_ADAPTER_T prAdapter,
119 IN P_STA_RECORD_T prStaRec,
120 IN PFN_TX_DONE_HANDLER pfTxDoneHandler
124 wnmTimingMeasRequest (
125 IN P_ADAPTER_T prAdapter,
126 IN P_SW_RFB_T prSwRfb
128 /*******************************************************************************
130 ********************************************************************************
133 /*----------------------------------------------------------------------------*/
136 * \brief This routine is called to process the 802.11v wnm category action frame.
140 * Called by: Handle Rx mgmt request
142 /*----------------------------------------------------------------------------*/
145 IN P_ADAPTER_T prAdapter,
146 IN P_SW_RFB_T prSwRfb
149 P_WLAN_ACTION_FRAME prRxFrame;
154 prRxFrame = (P_WLAN_ACTION_FRAME) prSwRfb->pvHeader;
156 #if CFG_SUPPORT_802_11V_TIMING_MEASUREMENT
157 if (prRxFrame->ucAction == ACTION_WNM_TIMING_MEASUREMENT_REQUEST) {
158 wnmTimingMeasRequest(prAdapter, prSwRfb);
163 DBGLOG(WNM, TRACE, ("Unsupport WNM action frame: %d\n", prRxFrame->ucAction));
166 #if CFG_SUPPORT_802_11V_TIMING_MEASUREMENT
167 /*----------------------------------------------------------------------------*/
170 * \brief This routine is called to report timing measurement data.
173 /*----------------------------------------------------------------------------*/
175 wnmReportTimingMeas (
176 IN P_ADAPTER_T prAdapter,
177 IN UINT_8 ucStaRecIndex,
182 P_STA_RECORD_T prStaRec;
184 prStaRec = cnmGetStaRecByIndex(prAdapter, ucStaRecIndex);
186 if ((!prStaRec) || (!prStaRec->fgIsInUse)) {
190 DBGLOG(WNM, TRACE, ("wnmReportTimingMeas: u4ToD %x u4ToA %x", u4ToD, u4ToA));
192 if (!prStaRec->rWNMTimingMsmt.ucTrigger)
195 prStaRec->rWNMTimingMsmt.u4ToD = MICRO_TO_10NANO(u4ToD);
196 prStaRec->rWNMTimingMsmt.u4ToA = MICRO_TO_10NANO(u4ToA);
199 /*----------------------------------------------------------------------------*/
201 * @brief This function will handle TxDone(TimingMeasurement) Event.
203 * @param[in] prAdapter Pointer to the Adapter structure.
204 * @param[in] prMsduInfo Pointer to the MSDU_INFO_T.
205 * @param[in] rTxDoneStatus Return TX status of the Timing Measurement frame.
207 * @retval WLAN_STATUS_SUCCESS
209 /*----------------------------------------------------------------------------*/
211 wnmRunEventTimgingMeasTxDone (
212 IN P_ADAPTER_T prAdapter,
213 IN P_MSDU_INFO_T prMsduInfo,
214 IN ENUM_TX_RESULT_CODE_T rTxDoneStatus
217 P_STA_RECORD_T prStaRec;
222 DBGLOG(WNM, LOUD, ("EVENT-TX DONE: Current Time = %ld\n", kalGetTimeTick()));
224 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
226 if ((!prStaRec) || (!prStaRec->fgIsInUse)) {
227 return WLAN_STATUS_SUCCESS; /* For the case of replying ERROR STATUS CODE */
230 DBGLOG(WNM, TRACE, ("wnmRunEventTimgingMeasTxDone: ucDialog %d ucFollowUp %d u4ToD %x u4ToA %x",
231 prStaRec->rWNMTimingMsmt.ucDialogToken,
232 prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken,
233 prStaRec->rWNMTimingMsmt.u4ToD,
234 prStaRec->rWNMTimingMsmt.u4ToA));
236 prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken = prStaRec->rWNMTimingMsmt.ucDialogToken;
237 prStaRec->rWNMTimingMsmt.ucDialogToken = ++ucTimingMeasToken;
239 wnmComposeTimingMeasFrame(prAdapter, prStaRec, NULL);
241 return WLAN_STATUS_SUCCESS;
243 } /* end of wnmRunEventTimgingMeasTxDone() */
245 /*----------------------------------------------------------------------------*/
247 * @brief This function will compose the Timing Measurement frame.
249 * @param[in] prAdapter Pointer to the Adapter structure.
250 * @param[in] prStaRec Pointer to the STA_RECORD_T.
254 /*----------------------------------------------------------------------------*/
256 wnmComposeTimingMeasFrame (
257 IN P_ADAPTER_T prAdapter,
258 IN P_STA_RECORD_T prStaRec,
259 IN PFN_TX_DONE_HANDLER pfTxDoneHandler
262 P_MSDU_INFO_T prMsduInfo;
263 P_BSS_INFO_T prBssInfo;
264 P_ACTION_UNPROTECTED_WNM_TIMING_MEAS_FRAME prTxFrame;
265 UINT_16 u2PayloadLen;
267 prBssInfo = &prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex];
270 prMsduInfo = (P_MSDU_INFO_T) cnmMgtPktAlloc(prAdapter,
271 MAC_TX_RESERVED_FIELD + PUBLIC_ACTION_MAX_LEN);
276 prTxFrame = (P_ACTION_UNPROTECTED_WNM_TIMING_MEAS_FRAME)
277 ((UINT_32)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD);
279 prTxFrame->u2FrameCtrl = MAC_FRAME_ACTION;
281 COPY_MAC_ADDR(prTxFrame->aucDestAddr, prStaRec->aucMacAddr);
282 COPY_MAC_ADDR(prTxFrame->aucSrcAddr, prBssInfo->aucOwnMacAddr);
283 COPY_MAC_ADDR(prTxFrame->aucBSSID, prBssInfo->aucBSSID);
285 prTxFrame->ucCategory = CATEGORY_UNPROTECTED_WNM_ACTION;
286 prTxFrame->ucAction = ACTION_UNPROTECTED_WNM_TIMING_MEASUREMENT;
288 //3 Compose the frame body's frame.
289 prTxFrame->ucDialogToken = prStaRec->rWNMTimingMsmt.ucDialogToken;
290 prTxFrame->ucFollowUpDialogToken = prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken;
291 prTxFrame->u4ToD = prStaRec->rWNMTimingMsmt.u4ToD;
292 prTxFrame->u4ToA = prStaRec->rWNMTimingMsmt.u4ToA;
293 prTxFrame->ucMaxToDErr = WNM_MAX_TOD_ERROR;
294 prTxFrame->ucMaxToAErr = WNM_MAX_TOA_ERROR;
296 u2PayloadLen = 2 + ACTION_UNPROTECTED_WNM_TIMING_MEAS_LEN;
298 //4 Update information of MSDU_INFO_T
299 prMsduInfo->ucPacketType = HIF_TX_PACKET_TYPE_MGMT; /* Management frame */
300 prMsduInfo->ucStaRecIndex = prStaRec->ucIndex;
301 prMsduInfo->ucNetworkType = prStaRec->ucNetTypeIndex;
302 prMsduInfo->ucMacHeaderLength = WLAN_MAC_MGMT_HEADER_LEN;
303 prMsduInfo->fgIs802_1x = FALSE;
304 prMsduInfo->fgIs802_11 = TRUE;
305 prMsduInfo->u2FrameLength = WLAN_MAC_MGMT_HEADER_LEN + u2PayloadLen;
306 prMsduInfo->ucTxSeqNum = nicIncreaseTxSeqNum(prAdapter);
307 prMsduInfo->pfTxDoneHandler = pfTxDoneHandler;
308 prMsduInfo->fgIsBasicRate = FALSE;
310 DBGLOG(WNM, TRACE, ("wnmComposeTimingMeasFrame: ucDialogToken %d ucFollowUpDialogToken %d u4ToD %x u4ToA %x\n",
311 prTxFrame->ucDialogToken, prTxFrame->ucFollowUpDialogToken,
312 prTxFrame->u4ToD, prTxFrame->u4ToA));
314 //4 Enqueue the frame to send this action frame.
315 nicTxEnqueueMsdu(prAdapter, prMsduInfo);
319 } /* end of wnmComposeTimingMeasFrame() */
321 /*----------------------------------------------------------------------------*/
324 * \brief This routine is called to process the 802.11v timing measurement request.
328 * Handle Rx mgmt request
330 /*----------------------------------------------------------------------------*/
332 wnmTimingMeasRequest (
333 IN P_ADAPTER_T prAdapter,
334 IN P_SW_RFB_T prSwRfb
337 P_ACTION_WNM_TIMING_MEAS_REQ_FRAME prRxFrame = NULL;
338 P_STA_RECORD_T prStaRec;
340 prRxFrame = (P_ACTION_WNM_TIMING_MEAS_REQ_FRAME)prSwRfb->pvHeader;
344 prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
345 if ((!prStaRec) || (!prStaRec->fgIsInUse)) {
349 DBGLOG(WNM, TRACE, ("IEEE 802.11: Received Timing Measuremen Request from "
350 MACSTR"\n", MAC2STR(prStaRec->aucMacAddr)));
353 prStaRec->rWNMTimingMsmt.fgInitiator = TRUE;
354 prStaRec->rWNMTimingMsmt.ucTrigger = prRxFrame->ucTrigger;
355 if (!prRxFrame->ucTrigger)
358 prStaRec->rWNMTimingMsmt.ucDialogToken = ++ucTimingMeasToken;
359 prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken = 0;
361 wnmComposeTimingMeasFrame(prAdapter, prStaRec, wnmRunEventTimgingMeasTxDone);
365 VOID wnmTimingMeasUnitTest1(P_ADAPTER_T prAdapter, UINT_8 ucStaRecIndex)
367 P_STA_RECORD_T prStaRec;
369 prStaRec = cnmGetStaRecByIndex(prAdapter, ucStaRecIndex);
370 if ((!prStaRec) || (!prStaRec->fgIsInUse)) {
374 DBGLOG(WNM, INFO, ("IEEE 802.11v: Test Timing Measuremen Request from "
375 MACSTR"\n", MAC2STR(prStaRec->aucMacAddr)));
377 prStaRec->rWNMTimingMsmt.fgInitiator = TRUE;
378 prStaRec->rWNMTimingMsmt.ucTrigger = 1;
380 prStaRec->rWNMTimingMsmt.ucDialogToken = ++ucTimingMeasToken;
381 prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken = 0;
383 wnmComposeTimingMeasFrame(prAdapter, prStaRec, wnmRunEventTimgingMeasTxDone);
387 #endif /* CFG_SUPPORT_802_11V_TIMING_MEASUREMENT */
389 #endif /* CFG_SUPPORT_802_11V */