p2p_rlm_obss.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. /*
  2. ** Id: @(#) gl_p2p_cfg80211.c@@
  3. */
  4. /*! \file gl_p2p_cfg80211.c
  5. \brief Main routines of Linux driver interface for Wi-Fi Direct
  6. using cfg80211 interface
  7. This file contains the main routines of Linux driver for MediaTek Inc. 802.11
  8. Wireless LAN Adapters.
  9. */
  10. /*******************************************************************************
  11. * C O M P I L E R F L A G S
  12. ********************************************************************************
  13. */
  14. /*******************************************************************************
  15. * E X T E R N A L R E F E R E N C E S
  16. ********************************************************************************
  17. */
  18. /*******************************************************************************
  19. * C O N S T A N T S
  20. ********************************************************************************
  21. */
  22. /*******************************************************************************
  23. * D A T A T Y P E S
  24. ********************************************************************************
  25. */
  26. /*******************************************************************************
  27. * P U B L I C D A T A
  28. ********************************************************************************
  29. */
  30. /*******************************************************************************
  31. * P R I V A T E D A T A
  32. ********************************************************************************
  33. */
  34. /*******************************************************************************
  35. * M A C R O S
  36. ********************************************************************************
  37. */
  38. /*******************************************************************************
  39. * F U N C T I O N D E C L A R A T I O N S
  40. ********************************************************************************
  41. */
  42. /*******************************************************************************
  43. * F U N C T I O N S
  44. ********************************************************************************
  45. */
  46. #include "precomp.h"
  47. static UINT_8 rlmObssChnlLevelIn2G4(P_BSS_INFO_T prBssInfo, UINT_8 ucPriChannel, ENUM_CHNL_EXT_T eExtend);
  48. static UINT_8 rlmObssChnlLevelIn5G(P_BSS_INFO_T prBssInfo, UINT_8 ucPriChannel, ENUM_CHNL_EXT_T eExtend);
  49. /*----------------------------------------------------------------------------*/
  50. /*!
  51. * \brief Different concurrent network has itself channel lists, and
  52. * concurrent networks should have been recorded in channel lists.
  53. * If role of active P2P is GO, assume associated AP of AIS will
  54. * record our Beacon for P2P GO because of same channel.
  55. *
  56. * Note: If we have scenario of different channel in the future,
  57. * the internal FW communication channel shall be established.
  58. *
  59. * \param[in]
  60. *
  61. * \return none
  62. */
  63. /*----------------------------------------------------------------------------*/
  64. UINT_8 rlmObssChnlLevel(P_BSS_INFO_T prBssInfo, ENUM_BAND_T eBand, UINT_8 ucPriChannel, ENUM_CHNL_EXT_T eExtend)
  65. {
  66. UINT_8 ucChannelLevel;
  67. ASSERT(prBssInfo);
  68. if (eBand == BAND_2G4) {
  69. ucChannelLevel = rlmObssChnlLevelIn2G4(prBssInfo, ucPriChannel, eExtend);
  70. /* (TBD) If concurrent networks permit different channel, extra
  71. * channel judgement should be added. Please refer to
  72. * previous version of this file.
  73. */
  74. } else if (eBand == BAND_5G) {
  75. ucChannelLevel = rlmObssChnlLevelIn5G(prBssInfo, ucPriChannel, eExtend);
  76. /* (TBD) If concurrent networks permit different channel, extra
  77. * channel judgement should be added. Please refer to
  78. * previous version of this file.
  79. */
  80. } else {
  81. ucChannelLevel = CHNL_LEVEL0;
  82. }
  83. return ucChannelLevel;
  84. }
  85. /*----------------------------------------------------------------------------*/
  86. /*!
  87. * \brief
  88. *
  89. * \param[in]
  90. *
  91. * \return none
  92. */
  93. /*----------------------------------------------------------------------------*/
  94. static UINT_8 rlmObssChnlLevelIn2G4(P_BSS_INFO_T prBssInfo, UINT_8 ucPriChannel, ENUM_CHNL_EXT_T eExtend)
  95. {
  96. UINT_8 i, ucChannelLevel;
  97. UINT_8 ucSecChannel, ucCenterChannel;
  98. UINT_8 ucAffectedChnl_L, ucAffectedChnl_H;
  99. ASSERT(prBssInfo);
  100. ucChannelLevel = CHNL_LEVEL2;
  101. /* Calculate center channel for 2.4G band */
  102. if (eExtend == CHNL_EXT_SCA) {
  103. ucCenterChannel = ucPriChannel + 2;
  104. ucSecChannel = ucPriChannel + 4;
  105. } else if (eExtend == CHNL_EXT_SCB) {
  106. ucCenterChannel = ucPriChannel - 2;
  107. ucSecChannel = ucPriChannel - 4;
  108. } else {
  109. return CHNL_LEVEL0;
  110. }
  111. ASSERT(ucCenterChannel >= 1 && ucCenterChannel <= 14);
  112. /* Calculated low/upper channels in affected freq range */
  113. ucAffectedChnl_L = (ucCenterChannel <= AFFECTED_CHNL_OFFSET) ? 1 : (ucCenterChannel - AFFECTED_CHNL_OFFSET);
  114. ucAffectedChnl_H = (ucCenterChannel >= (14 - AFFECTED_CHNL_OFFSET)) ?
  115. 14 : (ucCenterChannel + AFFECTED_CHNL_OFFSET);
  116. /* Check intolerant (Non-HT) channel list */
  117. ASSERT(prBssInfo->auc2G_NonHtChnlList[0] <= CHNL_LIST_SZ_2G);
  118. for (i = 1; i <= prBssInfo->auc2G_NonHtChnlList[0] && i <= CHNL_LIST_SZ_2G; i++) {
  119. if ((prBssInfo->auc2G_NonHtChnlList[i] >= ucAffectedChnl_L &&
  120. prBssInfo->auc2G_NonHtChnlList[i] <= ucAffectedChnl_H) &&
  121. prBssInfo->auc2G_NonHtChnlList[i] != ucPriChannel) {
  122. ucChannelLevel = CHNL_LEVEL0;
  123. goto L_2G4_level_end;
  124. }
  125. }
  126. /* Check 20M BW request channel list */
  127. ASSERT(prBssInfo->auc2G_20mReqChnlList[0] <= CHNL_LIST_SZ_2G);
  128. for (i = 1; i <= prBssInfo->auc2G_20mReqChnlList[0] && i <= CHNL_LIST_SZ_2G; i++) {
  129. if ((prBssInfo->auc2G_20mReqChnlList[i] >= ucAffectedChnl_L &&
  130. prBssInfo->auc2G_20mReqChnlList[i] <= ucAffectedChnl_H)) {
  131. ucChannelLevel = CHNL_LEVEL0;
  132. goto L_2G4_level_end;
  133. }
  134. }
  135. /* Check 2.4G primary channel list */
  136. ASSERT(prBssInfo->auc2G_PriChnlList[0] <= CHNL_LIST_SZ_2G);
  137. for (i = 1; i <= prBssInfo->auc2G_PriChnlList[0] && i <= CHNL_LIST_SZ_2G; i++) {
  138. if ((prBssInfo->auc2G_PriChnlList[i] >= ucAffectedChnl_L &&
  139. prBssInfo->auc2G_PriChnlList[i] <= ucAffectedChnl_H) &&
  140. prBssInfo->auc2G_PriChnlList[i] != ucPriChannel) {
  141. ucChannelLevel = CHNL_LEVEL0;
  142. goto L_2G4_level_end;
  143. }
  144. }
  145. /* Check 2.4G secondary channel list */
  146. ASSERT(prBssInfo->auc2G_SecChnlList[0] <= CHNL_LIST_SZ_2G);
  147. for (i = 1; i <= prBssInfo->auc2G_SecChnlList[0] && i <= CHNL_LIST_SZ_2G; i++) {
  148. if ((prBssInfo->auc2G_SecChnlList[i] >= ucAffectedChnl_L &&
  149. prBssInfo->auc2G_SecChnlList[i] <= ucAffectedChnl_H) &&
  150. prBssInfo->auc2G_SecChnlList[i] != ucSecChannel) {
  151. ucChannelLevel = CHNL_LEVEL0;
  152. goto L_2G4_level_end;
  153. }
  154. }
  155. L_2G4_level_end:
  156. return ucChannelLevel;
  157. }
  158. /*----------------------------------------------------------------------------*/
  159. /*!
  160. * \brief
  161. *
  162. * \param[in]
  163. *
  164. * \return none
  165. */
  166. /*----------------------------------------------------------------------------*/
  167. static UINT_8 rlmObssChnlLevelIn5G(P_BSS_INFO_T prBssInfo, UINT_8 ucPriChannel, ENUM_CHNL_EXT_T eExtend)
  168. {
  169. UINT_8 i, ucChannelLevel;
  170. UINT_8 ucSecChannel;
  171. ASSERT(prBssInfo);
  172. ucChannelLevel = CHNL_LEVEL2;
  173. /* Calculate center channel for 2.4G band */
  174. if (eExtend == CHNL_EXT_SCA)
  175. ucSecChannel = ucPriChannel + 4;
  176. else if (eExtend == CHNL_EXT_SCB)
  177. ucSecChannel = ucPriChannel - 4;
  178. else
  179. return CHNL_LEVEL0;
  180. ASSERT(ucSecChannel >= 36);
  181. /* Check 5G primary channel list */
  182. ASSERT(prBssInfo->auc5G_PriChnlList[0] <= CHNL_LIST_SZ_5G);
  183. for (i = 1; i <= prBssInfo->auc5G_PriChnlList[0] && i <= CHNL_LIST_SZ_5G; i++) {
  184. if (prBssInfo->auc5G_PriChnlList[i] == ucSecChannel) {
  185. ucChannelLevel = CHNL_LEVEL0;
  186. goto L_5G_level_end;
  187. } else if (prBssInfo->auc5G_PriChnlList[i] == ucPriChannel) {
  188. ucChannelLevel = CHNL_LEVEL1;
  189. }
  190. }
  191. /* Check non-HT channel list */
  192. ASSERT(prBssInfo->auc5G_NonHtChnlList[0] <= CHNL_LIST_SZ_5G);
  193. for (i = 1; i <= prBssInfo->auc5G_NonHtChnlList[0] && i <= CHNL_LIST_SZ_5G; i++) {
  194. if (prBssInfo->auc5G_NonHtChnlList[i] == ucSecChannel) {
  195. ucChannelLevel = CHNL_LEVEL0;
  196. goto L_5G_level_end;
  197. } else if (prBssInfo->auc5G_NonHtChnlList[i] == ucPriChannel) {
  198. ucChannelLevel = CHNL_LEVEL1;
  199. }
  200. }
  201. /* Check secondary channel list */
  202. ASSERT(prBssInfo->auc5G_SecChnlList[0] <= CHNL_LIST_SZ_5G);
  203. for (i = 1; i <= prBssInfo->auc5G_SecChnlList[0] && i <= CHNL_LIST_SZ_5G; i++) {
  204. if (prBssInfo->auc5G_SecChnlList[i] == ucPriChannel) {
  205. ucChannelLevel = CHNL_LEVEL0;
  206. goto L_5G_level_end;
  207. }
  208. }
  209. L_5G_level_end:
  210. return ucChannelLevel;
  211. }
  212. /*----------------------------------------------------------------------------*/
  213. /*!
  214. * \brief
  215. *
  216. * \param[in]
  217. *
  218. * \return none
  219. */
  220. /*----------------------------------------------------------------------------*/
  221. VOID rlmObssScanExemptionRsp(P_ADAPTER_T prAdapter, P_BSS_INFO_T prBssInfo, P_SW_RFB_T prSwRfb)
  222. {
  223. P_MSDU_INFO_T prMsduInfo;
  224. P_ACTION_20_40_COEXIST_FRAME prTxFrame;
  225. /* To do: need an algorithm to do judgement. Now always reject request */
  226. prMsduInfo = (P_MSDU_INFO_T)cnmMgtPktAlloc(prAdapter, PUBLIC_ACTION_MAX_LEN);
  227. if (prMsduInfo == NULL)
  228. return;
  229. DBGLOG(RLM, INFO, "Send 20/40 coexistence rsp frame!\n");
  230. prTxFrame = (P_ACTION_20_40_COEXIST_FRAME) prMsduInfo->prPacket;
  231. prTxFrame->u2FrameCtrl = MAC_FRAME_ACTION;
  232. COPY_MAC_ADDR(prTxFrame->aucDestAddr, ((P_ACTION_20_40_COEXIST_FRAME) prSwRfb->pvHeader)->aucSrcAddr);
  233. COPY_MAC_ADDR(prTxFrame->aucSrcAddr, prBssInfo->aucOwnMacAddr);
  234. COPY_MAC_ADDR(prTxFrame->aucBSSID, prBssInfo->aucBSSID);
  235. prTxFrame->ucCategory = CATEGORY_PUBLIC_ACTION;
  236. prTxFrame->ucAction = ACTION_PUBLIC_20_40_COEXIST;
  237. /* To do: find correct algorithm */
  238. prTxFrame->rBssCoexist.ucId = ELEM_ID_20_40_BSS_COEXISTENCE;
  239. prTxFrame->rBssCoexist.ucLength = 1;
  240. prTxFrame->rBssCoexist.ucData = 0;
  241. ASSERT((WLAN_MAC_HEADER_LEN + 5) <= PUBLIC_ACTION_MAX_LEN);
  242. prMsduInfo->ucPacketType = HIF_TX_PACKET_TYPE_MGMT;
  243. prMsduInfo->ucStaRecIndex = prSwRfb->ucStaRecIdx;
  244. prMsduInfo->ucNetworkType = prBssInfo->ucNetTypeIndex;
  245. prMsduInfo->ucMacHeaderLength = WLAN_MAC_MGMT_HEADER_LEN;
  246. prMsduInfo->fgIs802_1x = FALSE;
  247. prMsduInfo->fgIs802_11 = TRUE;
  248. prMsduInfo->u2FrameLength = WLAN_MAC_MGMT_HEADER_HTC_LEN + 5;
  249. prMsduInfo->ucTxSeqNum = nicIncreaseTxSeqNum(prAdapter);
  250. prMsduInfo->pfTxDoneHandler = NULL;
  251. prMsduInfo->fgIsBasicRate = FALSE;
  252. /* Send them to HW queue */
  253. nicTxEnqueueMsdu(prAdapter, prMsduInfo);
  254. }