Commit | Line | Data |
---|---|---|
6fa3eb70 S |
1 | /* |
2 | ** $Id: //Department/DaVinci/TRUNK/MT6620_5931_WiFi_Driver/mgmt/wnm.c#1 $ | |
3 | */ | |
4 | ||
5 | /*! \file "wnm.c" | |
6 | \brief This file includes the 802.11v default vale and functions. | |
7 | */ | |
8 | ||
9 | ||
10 | ||
11 | /* | |
12 | ** $Log: wnm.c $ | |
13 | * | |
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. | |
17 | * | |
18 | * | |
19 | */ | |
20 | ||
21 | /******************************************************************************* | |
22 | * C O M P I L E R F L A G S | |
23 | ******************************************************************************** | |
24 | */ | |
25 | ||
26 | /******************************************************************************* | |
27 | * E X T E R N A L R E F E R E N C E S | |
28 | ******************************************************************************** | |
29 | */ | |
30 | #include "precomp.h" | |
31 | ||
32 | #if CFG_SUPPORT_802_11V | |
33 | ||
34 | /******************************************************************************* | |
35 | * C O N S T A N T S | |
36 | ******************************************************************************** | |
37 | */ | |
38 | ||
39 | #define WNM_MAX_TOD_ERROR 0 | |
40 | #define WNM_MAX_TOA_ERROR 0 | |
41 | #define MICRO_TO_10NANO(x) ((x)*100) | |
42 | /******************************************************************************* | |
43 | * D A T A T Y P E S | |
44 | ******************************************************************************** | |
45 | */ | |
46 | ||
47 | /******************************************************************************* | |
48 | * P U B L I C D A T A | |
49 | ******************************************************************************** | |
50 | */ | |
51 | ||
52 | /******************************************************************************* | |
53 | * P R I V A T E D A T A | |
54 | ******************************************************************************** | |
55 | */ | |
56 | ||
57 | static UINT_8 ucTimingMeasToken = 0; | |
58 | ||
59 | /******************************************************************************* | |
60 | * M A C R O S | |
61 | ******************************************************************************** | |
62 | */ | |
63 | ||
64 | /******************************************************************************* | |
65 | * F U N C T I O N D E C L A R A T I O N S | |
66 | ******************************************************************************** | |
67 | */ | |
68 | ||
69 | WLAN_STATUS | |
70 | wnmRunEventTimgingMeasTxDone ( | |
71 | IN P_ADAPTER_T prAdapter, | |
72 | IN P_MSDU_INFO_T prMsduInfo, | |
73 | IN ENUM_TX_RESULT_CODE_T rTxDoneStatus | |
74 | ); | |
75 | ||
76 | VOID | |
77 | wnmComposeTimingMeasFrame ( | |
78 | IN P_ADAPTER_T prAdapter, | |
79 | IN P_STA_RECORD_T prStaRec, | |
80 | IN PFN_TX_DONE_HANDLER pfTxDoneHandler | |
81 | ); | |
82 | ||
83 | VOID | |
84 | wnmTimingMeasRequest ( | |
85 | IN P_ADAPTER_T prAdapter, | |
86 | IN P_SW_RFB_T prSwRfb | |
87 | ); | |
88 | /******************************************************************************* | |
89 | * F U N C T I O N S | |
90 | ******************************************************************************** | |
91 | */ | |
92 | ||
93 | /*----------------------------------------------------------------------------*/ | |
94 | /*! | |
95 | * | |
96 | * \brief This routine is called to process the 802.11v wnm category action frame. | |
97 | * | |
98 | * | |
99 | * \note | |
100 | * Called by: Handle Rx mgmt request | |
101 | */ | |
102 | /*----------------------------------------------------------------------------*/ | |
103 | VOID | |
104 | wnmWNMAction ( | |
105 | IN P_ADAPTER_T prAdapter, | |
106 | IN P_SW_RFB_T prSwRfb | |
107 | ) | |
108 | { | |
109 | P_WLAN_ACTION_FRAME prRxFrame; | |
110 | ||
111 | ASSERT(prAdapter); | |
112 | ASSERT(prSwRfb); | |
113 | ||
114 | prRxFrame = (P_WLAN_ACTION_FRAME) prSwRfb->pvHeader; | |
115 | ||
116 | #if CFG_SUPPORT_802_11V_TIMING_MEASUREMENT | |
117 | if (prRxFrame->ucAction == ACTION_WNM_TIMING_MEASUREMENT_REQUEST) { | |
118 | wnmTimingMeasRequest(prAdapter, prSwRfb); | |
119 | return; | |
120 | } | |
121 | #endif | |
122 | ||
123 | DBGLOG(WNM, TRACE, ("Unsupport WNM action frame: %d\n", prRxFrame->ucAction)); | |
124 | } | |
125 | ||
126 | #if CFG_SUPPORT_802_11V_TIMING_MEASUREMENT | |
127 | /*----------------------------------------------------------------------------*/ | |
128 | /*! | |
129 | * | |
130 | * \brief This routine is called to report timing measurement data. | |
131 | * | |
132 | */ | |
133 | /*----------------------------------------------------------------------------*/ | |
134 | VOID | |
135 | wnmReportTimingMeas ( | |
136 | IN P_ADAPTER_T prAdapter, | |
137 | IN UINT_8 ucStaRecIndex, | |
138 | IN UINT_32 u4ToD, | |
139 | IN UINT_32 u4ToA | |
140 | ) | |
141 | { | |
142 | P_STA_RECORD_T prStaRec; | |
143 | ||
144 | prStaRec = cnmGetStaRecByIndex(prAdapter, ucStaRecIndex); | |
145 | ||
146 | if ((!prStaRec) || (!prStaRec->fgIsInUse)) { | |
147 | return; | |
148 | } | |
149 | ||
150 | DBGLOG(WNM, TRACE, ("wnmReportTimingMeas: u4ToD %x u4ToA %x", u4ToD, u4ToA)); | |
151 | ||
152 | if (!prStaRec->rWNMTimingMsmt.ucTrigger) | |
153 | return; | |
154 | ||
155 | prStaRec->rWNMTimingMsmt.u4ToD = MICRO_TO_10NANO(u4ToD); | |
156 | prStaRec->rWNMTimingMsmt.u4ToA = MICRO_TO_10NANO(u4ToA); | |
157 | } | |
158 | ||
159 | /*----------------------------------------------------------------------------*/ | |
160 | /*! | |
161 | * @brief This function will handle TxDone(TimingMeasurement) Event. | |
162 | * | |
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. | |
166 | * | |
167 | * @retval WLAN_STATUS_SUCCESS | |
168 | */ | |
169 | /*----------------------------------------------------------------------------*/ | |
170 | WLAN_STATUS | |
171 | wnmRunEventTimgingMeasTxDone ( | |
172 | IN P_ADAPTER_T prAdapter, | |
173 | IN P_MSDU_INFO_T prMsduInfo, | |
174 | IN ENUM_TX_RESULT_CODE_T rTxDoneStatus | |
175 | ) | |
176 | { | |
177 | P_STA_RECORD_T prStaRec; | |
178 | ||
179 | ASSERT(prAdapter); | |
180 | ASSERT(prMsduInfo); | |
181 | ||
182 | DBGLOG(WNM, LOUD, ("EVENT-TX DONE: Current Time = %u\n", | |
183 | kalGetTimeTick())); | |
184 | ||
185 | prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex); | |
186 | ||
187 | if ((!prStaRec) || (!prStaRec->fgIsInUse)) { | |
188 | return WLAN_STATUS_SUCCESS; /* For the case of replying ERROR STATUS CODE */ | |
189 | } | |
190 | ||
191 | DBGLOG(WNM, TRACE, ("wnmRunEventTimgingMeasTxDone: ucDialog %d ucFollowUp %d u4ToD %x u4ToA %x", | |
192 | prStaRec->rWNMTimingMsmt.ucDialogToken, | |
193 | prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken, | |
194 | prStaRec->rWNMTimingMsmt.u4ToD, | |
195 | prStaRec->rWNMTimingMsmt.u4ToA)); | |
196 | ||
197 | prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken = prStaRec->rWNMTimingMsmt.ucDialogToken; | |
198 | prStaRec->rWNMTimingMsmt.ucDialogToken = ++ucTimingMeasToken; | |
199 | ||
200 | wnmComposeTimingMeasFrame(prAdapter, prStaRec, NULL); | |
201 | ||
202 | return WLAN_STATUS_SUCCESS; | |
203 | ||
204 | } /* end of wnmRunEventTimgingMeasTxDone() */ | |
205 | ||
206 | /*----------------------------------------------------------------------------*/ | |
207 | /*! | |
208 | * @brief This function will compose the Timing Measurement frame. | |
209 | * | |
210 | * @param[in] prAdapter Pointer to the Adapter structure. | |
211 | * @param[in] prStaRec Pointer to the STA_RECORD_T. | |
212 | * | |
213 | * @return (none) | |
214 | */ | |
215 | /*----------------------------------------------------------------------------*/ | |
216 | VOID | |
217 | wnmComposeTimingMeasFrame ( | |
218 | IN P_ADAPTER_T prAdapter, | |
219 | IN P_STA_RECORD_T prStaRec, | |
220 | IN PFN_TX_DONE_HANDLER pfTxDoneHandler | |
221 | ) | |
222 | { | |
223 | P_MSDU_INFO_T prMsduInfo; | |
224 | P_BSS_INFO_T prBssInfo; | |
225 | P_ACTION_UNPROTECTED_WNM_TIMING_MEAS_FRAME prTxFrame; | |
226 | UINT_16 u2PayloadLen; | |
227 | ||
228 | prBssInfo = &prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex]; | |
229 | ASSERT(prBssInfo); | |
230 | ||
231 | prMsduInfo = (P_MSDU_INFO_T) cnmMgtPktAlloc(prAdapter, | |
232 | MAC_TX_RESERVED_FIELD + PUBLIC_ACTION_MAX_LEN); | |
233 | ||
234 | if (!prMsduInfo) | |
235 | return; | |
236 | ||
237 | prTxFrame = (P_ACTION_UNPROTECTED_WNM_TIMING_MEAS_FRAME) | |
238 | ((ULONG)(prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD); | |
239 | ||
240 | prTxFrame->u2FrameCtrl = MAC_FRAME_ACTION; | |
241 | ||
242 | COPY_MAC_ADDR(prTxFrame->aucDestAddr, prStaRec->aucMacAddr); | |
243 | COPY_MAC_ADDR(prTxFrame->aucSrcAddr, prBssInfo->aucOwnMacAddr); | |
244 | COPY_MAC_ADDR(prTxFrame->aucBSSID, prBssInfo->aucBSSID); | |
245 | ||
246 | prTxFrame->ucCategory = CATEGORY_UNPROTECTED_WNM_ACTION; | |
247 | prTxFrame->ucAction = ACTION_UNPROTECTED_WNM_TIMING_MEASUREMENT; | |
248 | ||
249 | //3 Compose the frame body's frame. | |
250 | prTxFrame->ucDialogToken = prStaRec->rWNMTimingMsmt.ucDialogToken; | |
251 | prTxFrame->ucFollowUpDialogToken = prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken; | |
252 | prTxFrame->u4ToD = prStaRec->rWNMTimingMsmt.u4ToD; | |
253 | prTxFrame->u4ToA = prStaRec->rWNMTimingMsmt.u4ToA; | |
254 | prTxFrame->ucMaxToDErr = WNM_MAX_TOD_ERROR; | |
255 | prTxFrame->ucMaxToAErr = WNM_MAX_TOA_ERROR; | |
256 | ||
257 | u2PayloadLen = 2 + ACTION_UNPROTECTED_WNM_TIMING_MEAS_LEN; | |
258 | ||
259 | //4 Update information of MSDU_INFO_T | |
260 | prMsduInfo->ucPacketType = HIF_TX_PACKET_TYPE_MGMT; /* Management frame */ | |
261 | prMsduInfo->ucStaRecIndex = prStaRec->ucIndex; | |
262 | prMsduInfo->ucNetworkType = prStaRec->ucNetTypeIndex; | |
263 | prMsduInfo->ucMacHeaderLength = WLAN_MAC_MGMT_HEADER_LEN; | |
264 | prMsduInfo->fgIs802_1x = FALSE; | |
265 | prMsduInfo->fgIs802_11 = TRUE; | |
266 | prMsduInfo->u2FrameLength = WLAN_MAC_MGMT_HEADER_LEN + u2PayloadLen; | |
267 | prMsduInfo->ucTxSeqNum = nicIncreaseTxSeqNum(prAdapter); | |
268 | prMsduInfo->pfTxDoneHandler = pfTxDoneHandler; | |
269 | prMsduInfo->fgIsBasicRate = FALSE; | |
270 | ||
271 | DBGLOG(WNM, TRACE, ("wnmComposeTimingMeasFrame: ucDialogToken %d ucFollowUpDialogToken %d u4ToD %x u4ToA %x\n", | |
272 | prTxFrame->ucDialogToken, prTxFrame->ucFollowUpDialogToken, | |
273 | prTxFrame->u4ToD, prTxFrame->u4ToA)); | |
274 | ||
275 | //4 Enqueue the frame to send this action frame. | |
276 | nicTxEnqueueMsdu(prAdapter, prMsduInfo); | |
277 | ||
278 | return; | |
279 | ||
280 | } /* end of wnmComposeTimingMeasFrame() */ | |
281 | ||
282 | /*----------------------------------------------------------------------------*/ | |
283 | /*! | |
284 | * | |
285 | * \brief This routine is called to process the 802.11v timing measurement request. | |
286 | * | |
287 | * | |
288 | * \note | |
289 | * Handle Rx mgmt request | |
290 | */ | |
291 | /*----------------------------------------------------------------------------*/ | |
292 | VOID | |
293 | wnmTimingMeasRequest ( | |
294 | IN P_ADAPTER_T prAdapter, | |
295 | IN P_SW_RFB_T prSwRfb | |
296 | ) | |
297 | { | |
298 | P_ACTION_WNM_TIMING_MEAS_REQ_FRAME prRxFrame = NULL; | |
299 | P_STA_RECORD_T prStaRec; | |
300 | ||
301 | prRxFrame = (P_ACTION_WNM_TIMING_MEAS_REQ_FRAME)prSwRfb->pvHeader; | |
302 | if (!prRxFrame) | |
303 | return; | |
304 | ||
305 | prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx); | |
306 | if ((!prStaRec) || (!prStaRec->fgIsInUse)) { | |
307 | return; | |
308 | } | |
309 | ||
310 | DBGLOG(WNM, TRACE, ("IEEE 802.11: Received Timing Measuremen Request from " | |
311 | MACSTR"\n", MAC2STR(prStaRec->aucMacAddr))); | |
312 | ||
313 | // reset timing msmt | |
314 | prStaRec->rWNMTimingMsmt.fgInitiator = TRUE; | |
315 | prStaRec->rWNMTimingMsmt.ucTrigger = prRxFrame->ucTrigger; | |
316 | if (!prRxFrame->ucTrigger) | |
317 | return; | |
318 | ||
319 | prStaRec->rWNMTimingMsmt.ucDialogToken = ++ucTimingMeasToken; | |
320 | prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken = 0; | |
321 | ||
322 | wnmComposeTimingMeasFrame(prAdapter, prStaRec, wnmRunEventTimgingMeasTxDone); | |
323 | } | |
324 | ||
325 | #if WNM_UNIT_TEST | |
326 | VOID wnmTimingMeasUnitTest1(P_ADAPTER_T prAdapter, UINT_8 ucStaRecIndex) | |
327 | { | |
328 | P_STA_RECORD_T prStaRec; | |
329 | ||
330 | prStaRec = cnmGetStaRecByIndex(prAdapter, ucStaRecIndex); | |
331 | if ((!prStaRec) || (!prStaRec->fgIsInUse)) { | |
332 | return; | |
333 | } | |
334 | ||
335 | DBGLOG(WNM, INFO, ("IEEE 802.11v: Test Timing Measuremen Request from " | |
336 | MACSTR"\n", MAC2STR(prStaRec->aucMacAddr))); | |
337 | ||
338 | prStaRec->rWNMTimingMsmt.fgInitiator = TRUE; | |
339 | prStaRec->rWNMTimingMsmt.ucTrigger = 1; | |
340 | ||
341 | prStaRec->rWNMTimingMsmt.ucDialogToken = ++ucTimingMeasToken; | |
342 | prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken = 0; | |
343 | ||
344 | wnmComposeTimingMeasFrame(prAdapter, prStaRec, wnmRunEventTimgingMeasTxDone); | |
345 | } | |
346 | #endif | |
347 | ||
348 | #endif /* CFG_SUPPORT_802_11V_TIMING_MEASUREMENT */ | |
349 | ||
350 | #endif /* CFG_SUPPORT_802_11V */ |