p2p_role_state.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. #include "precomp.h"
  2. VOID
  3. p2pRoleStateInit_IDLE(IN P_ADAPTER_T prAdapter, IN P_P2P_ROLE_FSM_INFO_T prP2pRoleFsmInfo, IN P_BSS_INFO_T prP2pBssInfo)
  4. {
  5. cnmTimerStartTimer(prAdapter, &(prP2pRoleFsmInfo->rP2pRoleFsmTimeoutTimer), P2P_AP_CHNL_HOLD_TIME_MS);
  6. } /* p2pRoleStateInit_IDLE */
  7. VOID
  8. p2pRoleStateAbort_IDLE(IN P_ADAPTER_T prAdapter,
  9. IN P_P2P_ROLE_FSM_INFO_T prP2pRoleFsmInfo, IN P_P2P_CHNL_REQ_INFO_T prP2pChnlReqInfo)
  10. {
  11. /* AP mode channel hold time. */
  12. if (prP2pChnlReqInfo->fgIsChannelRequested)
  13. p2pFuncReleaseCh(prAdapter, prP2pRoleFsmInfo->ucBssIndex, prP2pChnlReqInfo);
  14. cnmTimerStopTimer(prAdapter, &(prP2pRoleFsmInfo->rP2pRoleFsmTimeoutTimer));
  15. } /* p2pRoleStateAbort_IDLE */
  16. VOID p2pRoleStateInit_SCAN(IN P_ADAPTER_T prAdapter, IN UINT_8 ucBssIndex, IN P_P2P_SCAN_REQ_INFO_T prScanReqInfo)
  17. {
  18. do {
  19. ASSERT_BREAK((prAdapter != NULL) && (prScanReqInfo != NULL));
  20. prScanReqInfo->fgIsScanRequest = TRUE;
  21. p2pFuncRequestScan(prAdapter, ucBssIndex, prScanReqInfo);
  22. } while (FALSE);
  23. } /* p2pRoleStateInit_SCAN */
  24. VOID p2pRoleStateAbort_SCAN(IN P_ADAPTER_T prAdapter, IN P_P2P_ROLE_FSM_INFO_T prP2pRoleFsmInfo)
  25. {
  26. P_P2P_SCAN_REQ_INFO_T prScanInfo = (P_P2P_SCAN_REQ_INFO_T) NULL;
  27. do {
  28. prScanInfo = &prP2pRoleFsmInfo->rScanReqInfo;
  29. p2pFuncCancelScan(prAdapter, prP2pRoleFsmInfo->ucBssIndex, prScanInfo);
  30. /* TODO: May need indicate port index to upper layer. */
  31. kalP2PIndicateScanDone(prAdapter->prGlueInfo, prP2pRoleFsmInfo->ucRoleIndex, prScanInfo->fgIsAbort);
  32. } while (FALSE);
  33. } /* p2pRoleStateAbort_SCAN */
  34. VOID
  35. p2pRoleStateInit_REQING_CHANNEL(IN P_ADAPTER_T prAdapter, IN UINT_8 ucBssIdx, IN P_P2P_CHNL_REQ_INFO_T prChnlReqInfo)
  36. {
  37. do {
  38. ASSERT_BREAK((prAdapter != NULL) && (prChnlReqInfo != NULL));
  39. p2pFuncAcquireCh(prAdapter, ucBssIdx, prChnlReqInfo);
  40. } while (FALSE);
  41. } /* p2pRoleStateInit_REQING_CHANNEL */
  42. VOID
  43. p2pRoleStateAbort_REQING_CHANNEL(IN P_ADAPTER_T prAdapter,
  44. IN P_BSS_INFO_T prP2pRoleBssInfo,
  45. IN P_P2P_ROLE_FSM_INFO_T prP2pRoleFsmInfo, IN ENUM_P2P_ROLE_STATE_T eNextState)
  46. {
  47. do {
  48. ASSERT_BREAK((prAdapter != NULL) && (prP2pRoleBssInfo != NULL) && (prP2pRoleFsmInfo != NULL));
  49. if (eNextState == P2P_ROLE_STATE_IDLE) {
  50. if (prP2pRoleBssInfo->eIntendOPMode == OP_MODE_ACCESS_POINT) {
  51. p2pFuncStartGO(prAdapter,
  52. prP2pRoleBssInfo,
  53. &(prP2pRoleFsmInfo->rConnReqInfo), &(prP2pRoleFsmInfo->rChnlReqInfo));
  54. } else {
  55. p2pFuncReleaseCh(prAdapter, prP2pRoleFsmInfo->ucBssIndex,
  56. &(prP2pRoleFsmInfo->rChnlReqInfo));
  57. }
  58. }
  59. } while (FALSE);
  60. } /* p2pRoleStateAbort_REQING_CHANNEL */
  61. VOID
  62. p2pRoleStateInit_AP_CHNL_DETECTION(IN P_ADAPTER_T prAdapter,
  63. IN UINT_8 ucBssIndex,
  64. IN P_P2P_SCAN_REQ_INFO_T prScanReqInfo, IN P_P2P_CONNECTION_REQ_INFO_T prConnReqInfo)
  65. {
  66. P_P2P_SPECIFIC_BSS_INFO_T prP2pSpecificBssInfo = (P_P2P_SPECIFIC_BSS_INFO_T) NULL;
  67. UINT_8 ucPreferedChnl = 0;
  68. ENUM_BAND_T eBand = BAND_NULL;
  69. ENUM_CHNL_EXT_T eSco = CHNL_EXT_SCN;
  70. do {
  71. ASSERT_BREAK((prAdapter != NULL) && (prScanReqInfo != NULL)
  72. && (prConnReqInfo != NULL));
  73. prP2pSpecificBssInfo = prAdapter->rWifiVar.prP2pSpecificBssInfo;
  74. if ((cnmPreferredChannel(prAdapter,
  75. &eBand,
  76. &ucPreferedChnl,
  77. &eSco) == FALSE) && (prConnReqInfo->rChannelInfo.ucChannelNum == 0)) {
  78. /* Sparse channel detection. */
  79. prP2pSpecificBssInfo->ucPreferredChannel = 0;
  80. prScanReqInfo->eScanType = SCAN_TYPE_PASSIVE_SCAN;
  81. prScanReqInfo->u2PassiveDewellTime = 50; /* 50ms for passive channel load detection */
  82. } else {
  83. /* Active scan to shorten scan time. */
  84. prScanReqInfo->eScanType = SCAN_TYPE_ACTIVE_SCAN;
  85. prScanReqInfo->u2PassiveDewellTime = 0;
  86. if (prConnReqInfo->rChannelInfo.ucChannelNum != 0) {
  87. prP2pSpecificBssInfo->ucPreferredChannel = prConnReqInfo->rChannelInfo.ucChannelNum;
  88. prP2pSpecificBssInfo->eRfBand = prConnReqInfo->rChannelInfo.eBand;
  89. prP2pSpecificBssInfo->eRfSco = CHNL_EXT_SCN;
  90. } else {
  91. prP2pSpecificBssInfo->ucPreferredChannel = ucPreferedChnl;
  92. prP2pSpecificBssInfo->eRfBand = eBand;
  93. prP2pSpecificBssInfo->eRfSco = eSco;
  94. }
  95. }
  96. /* TODO: See if channel set to include 5G or only 2.4G */
  97. prScanReqInfo->eChannelSet = SCAN_CHANNEL_2G4;
  98. prScanReqInfo->fgIsAbort = TRUE;
  99. prScanReqInfo->fgIsScanRequest = TRUE;
  100. prScanReqInfo->ucNumChannelList = 0;
  101. prScanReqInfo->u4BufLength = 0;
  102. prScanReqInfo->ucSsidNum = 1;
  103. prScanReqInfo->arSsidStruct[0].ucSsidLen = 0;
  104. p2pFuncRequestScan(prAdapter, ucBssIndex, prScanReqInfo);
  105. } while (FALSE);
  106. } /* p2pRoleStateInit_AP_CHNL_DETECTION */
  107. VOID
  108. p2pRoleStateAbort_AP_CHNL_DETECTION(IN P_ADAPTER_T prAdapter,
  109. IN UINT_8 ucBssIndex,
  110. IN P_P2P_CONNECTION_REQ_INFO_T prP2pConnReqInfo,
  111. IN P_P2P_CHNL_REQ_INFO_T prChnlReqInfo,
  112. IN P_P2P_SCAN_REQ_INFO_T prP2pScanReqInfo, IN ENUM_P2P_ROLE_STATE_T eNextState)
  113. {
  114. P_P2P_SPECIFIC_BSS_INFO_T prP2pSpecificBssInfo = (P_P2P_SPECIFIC_BSS_INFO_T) NULL;
  115. do {
  116. if (eNextState == P2P_ROLE_STATE_REQING_CHANNEL) {
  117. prP2pSpecificBssInfo = prAdapter->rWifiVar.prP2pSpecificBssInfo;
  118. if (prP2pSpecificBssInfo->ucPreferredChannel == 0) {
  119. if (scnQuerySparseChannel(prAdapter,
  120. &prP2pSpecificBssInfo->eRfBand,
  121. &prP2pSpecificBssInfo->ucPreferredChannel)) {
  122. prP2pSpecificBssInfo->eRfSco = CHNL_EXT_SCN;
  123. } else {
  124. DBGLOG(P2P, ERROR, "Sparse Channel Error, use default settings\n");
  125. /* Sparse channel false. */
  126. prP2pSpecificBssInfo->ucPreferredChannel = P2P_DEFAULT_LISTEN_CHANNEL;
  127. prP2pSpecificBssInfo->eRfBand = BAND_2G4;
  128. prP2pSpecificBssInfo->eRfSco = CHNL_EXT_SCN;
  129. }
  130. }
  131. prChnlReqInfo->u8Cookie = 0;
  132. prChnlReqInfo->ucReqChnlNum = prP2pSpecificBssInfo->ucPreferredChannel;
  133. prChnlReqInfo->eBand = prP2pSpecificBssInfo->eRfBand;
  134. prChnlReqInfo->eChnlSco = prP2pSpecificBssInfo->eRfSco;
  135. prChnlReqInfo->u4MaxInterval = P2P_AP_CHNL_HOLD_TIME_MS;
  136. prChnlReqInfo->eChnlReqType = CH_REQ_TYPE_GO_START_BSS;
  137. prChnlReqInfo->eChannelWidth = CW_20_40MHZ;
  138. prChnlReqInfo->ucCenterFreqS1 = 0;
  139. prChnlReqInfo->ucCenterFreqS2 = 0;
  140. } else {
  141. p2pFuncCancelScan(prAdapter, ucBssIndex, prP2pScanReqInfo);
  142. }
  143. } while (FALSE);
  144. }
  145. VOID
  146. p2pRoleStateInit_GC_JOIN(IN P_ADAPTER_T prAdapter,
  147. IN P_P2P_ROLE_FSM_INFO_T prP2pRoleFsmInfo, IN P_P2P_CHNL_REQ_INFO_T prChnlReqInfo)
  148. {
  149. /* P_MSG_JOIN_REQ_T prJoinReqMsg = (P_MSG_JOIN_REQ_T)NULL; */
  150. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  151. do {
  152. ASSERT_BREAK((prAdapter != NULL) && (prP2pRoleFsmInfo != NULL) && (prChnlReqInfo != NULL));
  153. prP2pBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prP2pRoleFsmInfo->ucBssIndex);
  154. /* Setup a join timer. */
  155. DBGLOG(P2P, TRACE, "Start a join init timer\n");
  156. cnmTimerStartTimer(prAdapter,
  157. &(prP2pRoleFsmInfo->rP2pRoleFsmTimeoutTimer),
  158. (prChnlReqInfo->u4MaxInterval - AIS_JOIN_CH_GRANT_THRESHOLD));
  159. p2pFuncGCJoin(prAdapter, prP2pBssInfo, &(prP2pRoleFsmInfo->rJoinInfo));
  160. } while (FALSE);
  161. } /* p2pRoleStateInit_GC_JOIN */
  162. VOID
  163. p2pRoleStateAbort_GC_JOIN(IN P_ADAPTER_T prAdapter,
  164. IN P_P2P_ROLE_FSM_INFO_T prP2pRoleFsmInfo,
  165. IN P_P2P_JOIN_INFO_T prJoinInfo, IN ENUM_P2P_ROLE_STATE_T eNextState)
  166. {
  167. do {
  168. if (prJoinInfo->fgIsJoinComplete == FALSE) {
  169. P_MSG_JOIN_ABORT_T prJoinAbortMsg = (P_MSG_JOIN_ABORT_T) NULL;
  170. prJoinAbortMsg =
  171. (P_MSG_JOIN_ABORT_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_ABORT_T));
  172. if (!prJoinAbortMsg) {
  173. DBGLOG(P2P, TRACE, "Fail to allocate join abort message buffer\n");
  174. ASSERT(FALSE);
  175. return;
  176. }
  177. prJoinAbortMsg->rMsgHdr.eMsgId = MID_P2P_SAA_FSM_ABORT;
  178. prJoinAbortMsg->ucSeqNum = prJoinInfo->ucSeqNumOfReqMsg;
  179. prJoinAbortMsg->prStaRec = prJoinInfo->prTargetStaRec;
  180. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prJoinAbortMsg, MSG_SEND_METHOD_BUF);
  181. }
  182. /* Stop Join Timer. */
  183. cnmTimerStopTimer(prAdapter, &(prP2pRoleFsmInfo->rP2pRoleFsmTimeoutTimer));
  184. /* Release channel requested. */
  185. p2pFuncReleaseCh(prAdapter, prP2pRoleFsmInfo->ucBssIndex, &(prP2pRoleFsmInfo->rChnlReqInfo));
  186. } while (FALSE);
  187. }
  188. VOID
  189. p2pRoleStatePrepare_To_REQING_CHANNEL_STATE(IN P_ADAPTER_T prAdapter,
  190. IN P_BSS_INFO_T prBssInfo,
  191. IN P_P2P_CONNECTION_REQ_INFO_T prConnReqInfo,
  192. OUT P_P2P_CHNL_REQ_INFO_T prChnlReqInfo)
  193. {
  194. ENUM_BAND_T eBand;
  195. UINT_8 ucChannel;
  196. ENUM_CHNL_EXT_T eSCO;
  197. ENUM_BAND_T eBandBackup;
  198. UINT_8 ucChannelBackup;
  199. ENUM_CHNL_EXT_T eSCOBackup;
  200. do {
  201. /* P2P BSS info is for temporarily use
  202. * Request a 80MHz channel before starting AP/GO
  203. * to prevent from STA/GC connected too early (before CH abort)
  204. * Therefore, STA/GC Rate will drop during DHCP exchange packets
  205. */
  206. /* Previous issue:
  207. * Always request 20MHz channel, but carry 40MHz HT cap/80MHz VHT cap,
  208. * then if GC/STA connected before CH abort,
  209. * GO/AP cannot listen to GC/STA's 40MHz/80MHz packets.
  210. */
  211. eBandBackup = prBssInfo->eBand;
  212. ucChannelBackup = prBssInfo->ucPrimaryChannel;
  213. eSCOBackup = prBssInfo->eBssSCO;
  214. prBssInfo->ucPrimaryChannel = prConnReqInfo->rChannelInfo.ucChannelNum;
  215. prBssInfo->eBand = prConnReqInfo->rChannelInfo.eBand;
  216. if (cnmPreferredChannel(prAdapter, &eBand, &ucChannel, &eSCO) &&
  217. eSCO != CHNL_EXT_SCN && ucChannel == prBssInfo->ucPrimaryChannel && eBand == prBssInfo->eBand) {
  218. prBssInfo->eBssSCO = eSCO;
  219. } else {
  220. prBssInfo->eBssSCO = rlmDecideScoForAP(prAdapter, prBssInfo);
  221. }
  222. ASSERT_BREAK((prAdapter != NULL) && (prConnReqInfo != NULL) && (prChnlReqInfo != NULL));
  223. prChnlReqInfo->u8Cookie = 0;
  224. prChnlReqInfo->ucReqChnlNum = prConnReqInfo->rChannelInfo.ucChannelNum;
  225. prChnlReqInfo->eBand = prConnReqInfo->rChannelInfo.eBand;
  226. prChnlReqInfo->eChnlSco = prBssInfo->eBssSCO;
  227. prChnlReqInfo->u4MaxInterval = P2P_AP_CHNL_HOLD_TIME_MS;
  228. prChnlReqInfo->eChnlReqType = CH_REQ_TYPE_GO_START_BSS;
  229. if (prBssInfo->eBand == BAND_5G)
  230. prChnlReqInfo->eChannelWidth = CW_80MHZ;
  231. else
  232. prChnlReqInfo->eChannelWidth = CW_20_40MHZ;
  233. prChnlReqInfo->ucCenterFreqS1 = nicGetVhtS1(prBssInfo->ucPrimaryChannel);
  234. prChnlReqInfo->ucCenterFreqS2 = 0;
  235. DBGLOG(P2P, TRACE, "p2pRoleStatePrepare_To_REQING_CHANNEL_STATE\n");
  236. /* Reset */
  237. prBssInfo->ucPrimaryChannel = ucChannelBackup;
  238. prBssInfo->eBand = eBandBackup;
  239. prBssInfo->eBssSCO = eSCOBackup;
  240. } while (FALSE);
  241. }