wnm.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. /*
  2. ** Id: //Department/DaVinci/TRUNK/MT6620_5931_WiFi_Driver/mgmt/wnm.c#1
  3. */
  4. /*! \file "wnm.c"
  5. \brief This file includes the 802.11v default vale and functions.
  6. */
  7. /*
  8. ** Log: wnm.c
  9. **
  10. ** 08 13 2013 terry.wu
  11. ** [BORA00002207] [MT6630 Wi-Fi] TXM & MQM Implementation
  12. ** Remove unused code
  13. **
  14. ** 03 12 2013 terry.wu
  15. ** [BORA00002207] [MT6630 Wi-Fi] TXM & MQM Implementation
  16. ** Update Tx utility function for management frame
  17. **
  18. ** 09 17 2012 cm.chang
  19. ** [BORA00002149] [MT6630 Wi-Fi] Initial software development
  20. ** Duplicate source from MT6620 v2.3 driver branch
  21. ** (Davinci label: MT6620_WIFI_Driver_V2_3_120913_1942_As_MT6630_Base)
  22. *
  23. * 01 05 2012 tsaiyuan.hsu
  24. * [WCXRP00001157] [MT6620 Wi-Fi][FW][DRV] add timing measurement support for 802.11v
  25. * add timing measurement support for 802.11v.
  26. *
  27. *
  28. */
  29. /*******************************************************************************
  30. * C O M P I L E R F L A G S
  31. ********************************************************************************
  32. */
  33. /*******************************************************************************
  34. * E X T E R N A L R E F E R E N C E S
  35. ********************************************************************************
  36. */
  37. #include "precomp.h"
  38. #if CFG_SUPPORT_802_11V
  39. /*******************************************************************************
  40. * C O N S T A N T S
  41. ********************************************************************************
  42. */
  43. #define WNM_MAX_TOD_ERROR 0
  44. #define WNM_MAX_TOA_ERROR 0
  45. #define MICRO_TO_10NANO(x) ((x)*100)
  46. /*******************************************************************************
  47. * D A T A T Y P E S
  48. ********************************************************************************
  49. */
  50. /*******************************************************************************
  51. * P U B L I C D A T A
  52. ********************************************************************************
  53. */
  54. /*******************************************************************************
  55. * P R I V A T E D A T A
  56. ********************************************************************************
  57. */
  58. static UINT_8 ucTimingMeasToken;
  59. /*******************************************************************************
  60. * M A C R O S
  61. ********************************************************************************
  62. */
  63. /*******************************************************************************
  64. * F U N C T I O N D E C L A R A T I O N S
  65. ********************************************************************************
  66. */
  67. static WLAN_STATUS
  68. wnmRunEventTimgingMeasTxDone(IN P_ADAPTER_T prAdapter,
  69. IN P_MSDU_INFO_T prMsduInfo, IN ENUM_TX_RESULT_CODE_T rTxDoneStatus);
  70. static VOID
  71. wnmComposeTimingMeasFrame(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prStaRec, IN PFN_TX_DONE_HANDLER pfTxDoneHandler);
  72. static VOID wnmTimingMeasRequest(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb);
  73. /*******************************************************************************
  74. * F U N C T I O N S
  75. ********************************************************************************
  76. */
  77. /*----------------------------------------------------------------------------*/
  78. /*!
  79. *
  80. * \brief This routine is called to process the 802.11v wnm category action frame.
  81. *
  82. *
  83. * \note
  84. * Called by: Handle Rx mgmt request
  85. */
  86. /*----------------------------------------------------------------------------*/
  87. VOID wnmWNMAction(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb)
  88. {
  89. P_WLAN_ACTION_FRAME prRxFrame;
  90. ASSERT(prAdapter);
  91. ASSERT(prSwRfb);
  92. prRxFrame = (P_WLAN_ACTION_FRAME) prSwRfb->pvHeader;
  93. #if CFG_SUPPORT_802_11V_TIMING_MEASUREMENT
  94. if (prRxFrame->ucAction == ACTION_WNM_TIMING_MEASUREMENT_REQUEST) {
  95. wnmTimingMeasRequest(prAdapter, prSwRfb);
  96. return;
  97. }
  98. #endif
  99. DBGLOG(WNM, TRACE, "Unsupport WNM action frame: %d\n", prRxFrame->ucAction);
  100. }
  101. #if CFG_SUPPORT_802_11V_TIMING_MEASUREMENT
  102. /*----------------------------------------------------------------------------*/
  103. /*!
  104. *
  105. * \brief This routine is called to report timing measurement data.
  106. *
  107. */
  108. /*----------------------------------------------------------------------------*/
  109. VOID wnmReportTimingMeas(IN P_ADAPTER_T prAdapter, IN UINT_8 ucStaRecIndex, IN UINT_32 u4ToD, IN UINT_32 u4ToA)
  110. {
  111. P_STA_RECORD_T prStaRec;
  112. prStaRec = cnmGetStaRecByIndex(prAdapter, ucStaRecIndex);
  113. if ((!prStaRec) || (!prStaRec->fgIsInUse))
  114. return;
  115. DBGLOG(WNM, TRACE, "wnmReportTimingMeas: u4ToD %x u4ToA %x", u4ToD, u4ToA);
  116. if (!prStaRec->rWNMTimingMsmt.ucTrigger)
  117. return;
  118. prStaRec->rWNMTimingMsmt.u4ToD = MICRO_TO_10NANO(u4ToD);
  119. prStaRec->rWNMTimingMsmt.u4ToA = MICRO_TO_10NANO(u4ToA);
  120. }
  121. /*----------------------------------------------------------------------------*/
  122. /*!
  123. * @brief This function will handle TxDone(TimingMeasurement) Event.
  124. *
  125. * @param[in] prAdapter Pointer to the Adapter structure.
  126. * @param[in] prMsduInfo Pointer to the MSDU_INFO_T.
  127. * @param[in] rTxDoneStatus Return TX status of the Timing Measurement frame.
  128. *
  129. * @retval WLAN_STATUS_SUCCESS
  130. */
  131. /*----------------------------------------------------------------------------*/
  132. static WLAN_STATUS
  133. wnmRunEventTimgingMeasTxDone(IN P_ADAPTER_T prAdapter,
  134. IN P_MSDU_INFO_T prMsduInfo, IN ENUM_TX_RESULT_CODE_T rTxDoneStatus)
  135. {
  136. P_STA_RECORD_T prStaRec;
  137. ASSERT(prAdapter);
  138. ASSERT(prMsduInfo);
  139. DBGLOG(WNM, LOUD, "EVENT-TX DONE: Current Time = %ld\n", kalGetTimeTick());
  140. prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
  141. if ((!prStaRec) || (!prStaRec->fgIsInUse))
  142. return WLAN_STATUS_SUCCESS; /* For the case of replying ERROR STATUS CODE */
  143. DBGLOG(WNM, TRACE,
  144. "wnmRunEventTimgingMeasTxDone: ucDialog %d ucFollowUp %d u4ToD %x u4ToA %x",
  145. prStaRec->rWNMTimingMsmt.ucDialogToken,
  146. prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken, prStaRec->rWNMTimingMsmt.u4ToD,
  147. prStaRec->rWNMTimingMsmt.u4ToA);
  148. prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken = prStaRec->rWNMTimingMsmt.ucDialogToken;
  149. prStaRec->rWNMTimingMsmt.ucDialogToken = ++ucTimingMeasToken;
  150. wnmComposeTimingMeasFrame(prAdapter, prStaRec, NULL);
  151. return WLAN_STATUS_SUCCESS;
  152. } /* end of wnmRunEventTimgingMeasTxDone() */
  153. /*----------------------------------------------------------------------------*/
  154. /*!
  155. * @brief This function will compose the Timing Measurement frame.
  156. *
  157. * @param[in] prAdapter Pointer to the Adapter structure.
  158. * @param[in] prStaRec Pointer to the STA_RECORD_T.
  159. *
  160. * @return (none)
  161. */
  162. /*----------------------------------------------------------------------------*/
  163. static VOID
  164. wnmComposeTimingMeasFrame(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prStaRec, IN PFN_TX_DONE_HANDLER pfTxDoneHandler)
  165. {
  166. P_MSDU_INFO_T prMsduInfo;
  167. P_BSS_INFO_T prBssInfo;
  168. P_ACTION_UNPROTECTED_WNM_TIMING_MEAS_FRAME prTxFrame;
  169. UINT_16 u2PayloadLen;
  170. prBssInfo = &prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex];
  171. ASSERT(prBssInfo);
  172. prMsduInfo = (P_MSDU_INFO_T) cnmMgtPktAlloc(prAdapter, MAC_TX_RESERVED_FIELD + PUBLIC_ACTION_MAX_LEN);
  173. if (!prMsduInfo)
  174. return;
  175. prTxFrame = (P_ACTION_UNPROTECTED_WNM_TIMING_MEAS_FRAME)
  176. ((UINT_32) (prMsduInfo->prPacket) + MAC_TX_RESERVED_FIELD);
  177. prTxFrame->u2FrameCtrl = MAC_FRAME_ACTION;
  178. COPY_MAC_ADDR(prTxFrame->aucDestAddr, prStaRec->aucMacAddr);
  179. COPY_MAC_ADDR(prTxFrame->aucSrcAddr, prBssInfo->aucOwnMacAddr);
  180. COPY_MAC_ADDR(prTxFrame->aucBSSID, prBssInfo->aucBSSID);
  181. prTxFrame->ucCategory = CATEGORY_UNPROTECTED_WNM_ACTION;
  182. prTxFrame->ucAction = ACTION_UNPROTECTED_WNM_TIMING_MEASUREMENT;
  183. /* 3 Compose the frame body's frame. */
  184. prTxFrame->ucDialogToken = prStaRec->rWNMTimingMsmt.ucDialogToken;
  185. prTxFrame->ucFollowUpDialogToken = prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken;
  186. prTxFrame->u4ToD = prStaRec->rWNMTimingMsmt.u4ToD;
  187. prTxFrame->u4ToA = prStaRec->rWNMTimingMsmt.u4ToA;
  188. prTxFrame->ucMaxToDErr = WNM_MAX_TOD_ERROR;
  189. prTxFrame->ucMaxToAErr = WNM_MAX_TOA_ERROR;
  190. u2PayloadLen = 2 + ACTION_UNPROTECTED_WNM_TIMING_MEAS_LEN;
  191. /* 4 Update information of MSDU_INFO_T */
  192. TX_SET_MMPDU(prAdapter,
  193. prMsduInfo,
  194. prStaRec->ucBssIndex,
  195. prStaRec->ucIndex,
  196. WLAN_MAC_MGMT_HEADER_LEN,
  197. WLAN_MAC_MGMT_HEADER_LEN + u2PayloadLen, pfTxDoneHandler, MSDU_RATE_MODE_AUTO);
  198. DBGLOG(WNM, TRACE,
  199. "wnmComposeTimingMeasFrame: ucDialogToken %d ucFollowUpDialogToken %d u4ToD %x u4ToA %x\n",
  200. prTxFrame->ucDialogToken, prTxFrame->ucFollowUpDialogToken, prTxFrame->u4ToD, prTxFrame->u4ToA);
  201. /* 4 Enqueue the frame to send this action frame. */
  202. nicTxEnqueueMsdu(prAdapter, prMsduInfo);
  203. return;
  204. } /* end of wnmComposeTimingMeasFrame() */
  205. /*----------------------------------------------------------------------------*/
  206. /*!
  207. *
  208. * \brief This routine is called to process the 802.11v timing measurement request.
  209. *
  210. *
  211. * \note
  212. * Handle Rx mgmt request
  213. */
  214. /*----------------------------------------------------------------------------*/
  215. static VOID wnmTimingMeasRequest(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb)
  216. {
  217. P_ACTION_WNM_TIMING_MEAS_REQ_FRAME prRxFrame = NULL;
  218. P_STA_RECORD_T prStaRec;
  219. prRxFrame = (P_ACTION_WNM_TIMING_MEAS_REQ_FRAME) prSwRfb->pvHeader;
  220. if (!prRxFrame)
  221. return;
  222. prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
  223. if ((!prStaRec) || (!prStaRec->fgIsInUse))
  224. return;
  225. DBGLOG(WNM, TRACE, "IEEE 802.11: Received Timing Measuremen Request from "
  226. MACSTR "\n", MAC2STR(prStaRec->aucMacAddr));
  227. /* reset timing msmt */
  228. prStaRec->rWNMTimingMsmt.fgInitiator = TRUE;
  229. prStaRec->rWNMTimingMsmt.ucTrigger = prRxFrame->ucTrigger;
  230. if (!prRxFrame->ucTrigger)
  231. return;
  232. prStaRec->rWNMTimingMsmt.ucDialogToken = ++ucTimingMeasToken;
  233. prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken = 0;
  234. wnmComposeTimingMeasFrame(prAdapter, prStaRec, wnmRunEventTimgingMeasTxDone);
  235. }
  236. #if WNM_UNIT_TEST
  237. VOID wnmTimingMeasUnitTest1(P_ADAPTER_T prAdapter, UINT_8 ucStaRecIndex)
  238. {
  239. P_STA_RECORD_T prStaRec;
  240. prStaRec = cnmGetStaRecByIndex(prAdapter, ucStaRecIndex);
  241. if ((!prStaRec) || (!prStaRec->fgIsInUse))
  242. return;
  243. DBGLOG(WNM, INFO, "IEEE 802.11v: Test Timing Measuremen Request from "
  244. MACSTR "\n", MAC2STR(prStaRec->aucMacAddr));
  245. prStaRec->rWNMTimingMsmt.fgInitiator = TRUE;
  246. prStaRec->rWNMTimingMsmt.ucTrigger = 1;
  247. prStaRec->rWNMTimingMsmt.ucDialogToken = ++ucTimingMeasToken;
  248. prStaRec->rWNMTimingMsmt.ucFollowUpDialogToken = 0;
  249. wnmComposeTimingMeasFrame(prAdapter, prStaRec, wnmRunEventTimgingMeasTxDone);
  250. }
  251. #endif
  252. #endif /* CFG_SUPPORT_802_11V_TIMING_MEASUREMENT */
  253. #endif /* CFG_SUPPORT_802_11V */