p2p_state.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  1. #include "p2p_precomp.h"
  2. BOOLEAN
  3. p2pStateInit_IDLE(IN P_ADAPTER_T prAdapter,
  4. IN P_P2P_FSM_INFO_T prP2pFsmInfo, IN P_BSS_INFO_T prP2pBssInfo, OUT P_ENUM_P2P_STATE_T peNextState)
  5. {
  6. BOOLEAN fgIsTransOut = FALSE;
  7. /* P_P2P_CHNL_REQ_INFO_T prChnlReqInfo = (P_P2P_CHNL_REQ_INFO_T)NULL; */
  8. do {
  9. ASSERT_BREAK((prAdapter != NULL) &&
  10. (prP2pFsmInfo != NULL) && (prP2pBssInfo != NULL) && (peNextState != NULL));
  11. if ((prP2pBssInfo->eIntendOPMode == OP_MODE_ACCESS_POINT)
  12. && IS_NET_PWR_STATE_ACTIVE(prAdapter, NETWORK_TYPE_P2P_INDEX)) {
  13. P_P2P_CHNL_REQ_INFO_T prChnlReqInfo = &(prP2pFsmInfo->rChnlReqInfo);
  14. fgIsTransOut = TRUE;
  15. prChnlReqInfo->eChannelReqType = CHANNEL_REQ_TYPE_GO_START_BSS;
  16. DBGLOG(P2P, INFO, "p2pStateInit_IDLE GO Scan\n");
  17. *peNextState = P2P_STATE_REQING_CHANNEL;
  18. } else {
  19. #if 0
  20. else
  21. if (IS_NET_PWR_STATE_ACTIVE(prAdapter, NETWORK_TYPE_P2P_INDEX)) {
  22. ASSERT((prP2pBssInfo->eCurrentOPMode == OP_MODE_ACCESS_POINT) ||
  23. (prP2pBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE));
  24. prChnlReqInfo = &prP2pFsmInfo->rChnlReqInfo;
  25. if (prChnlReqInfo->fgIsChannelRequested) {
  26. /* Start a timer for return channel. */
  27. DBGLOG(P2P, TRACE, "start a GO channel timer.\n");
  28. }
  29. }
  30. #endif
  31. cnmTimerStartTimer(prAdapter, &(prAdapter->rP2pFsmTimeoutTimer), 5000);
  32. }
  33. } while (FALSE);
  34. return fgIsTransOut;
  35. } /* p2pStateInit_IDLE */
  36. VOID p2pStateAbort_IDLE(IN P_ADAPTER_T prAdapter, IN P_P2P_FSM_INFO_T prP2pFsmInfo, IN ENUM_P2P_STATE_T eNextState)
  37. {
  38. P_P2P_CHNL_REQ_INFO_T prChnlReqInfo = (P_P2P_CHNL_REQ_INFO_T) NULL;
  39. do {
  40. ASSERT_BREAK((prAdapter != NULL) && (prP2pFsmInfo != NULL));
  41. prChnlReqInfo = &prP2pFsmInfo->rChnlReqInfo;
  42. if (prChnlReqInfo->fgIsChannelRequested) {
  43. /* Release channel before timeout. */
  44. p2pFuncReleaseCh(prAdapter, prChnlReqInfo);
  45. }
  46. /* Stop timer for leaving this state. */
  47. cnmTimerStopTimer(prAdapter, &(prAdapter->rP2pFsmTimeoutTimer));
  48. } while (FALSE);
  49. } /* p2pStateAbort_IDLE */
  50. VOID p2pStateInit_CHNL_ON_HAND(IN P_ADAPTER_T prAdapter, IN P_BSS_INFO_T prP2pBssInfo, IN P_P2P_FSM_INFO_T prP2pFsmInfo)
  51. {
  52. P_P2P_CHNL_REQ_INFO_T prChnlReqInfo = (P_P2P_CHNL_REQ_INFO_T) NULL;
  53. do {
  54. ASSERT_BREAK((prAdapter != NULL) && (prP2pFsmInfo != NULL));
  55. prChnlReqInfo = &(prP2pFsmInfo->rChnlReqInfo);
  56. /* Store the original channel info. */
  57. prChnlReqInfo->ucOriChnlNum = prP2pBssInfo->ucPrimaryChannel;
  58. prChnlReqInfo->eOriBand = prP2pBssInfo->eBand;
  59. prChnlReqInfo->eOriChnlSco = prP2pBssInfo->eBssSCO;
  60. /* RX Probe Request would check primary channel. */
  61. prP2pBssInfo->ucPrimaryChannel = prChnlReqInfo->ucReqChnlNum;
  62. prP2pBssInfo->eBand = prChnlReqInfo->eBand;
  63. prP2pBssInfo->eBssSCO = prChnlReqInfo->eChnlSco;
  64. DBGLOG(P2P, TRACE, "start a channel on hand timer.\n");
  65. cnmTimerStartTimer(prAdapter, &(prAdapter->rP2pFsmTimeoutTimer), prChnlReqInfo->u4MaxInterval);
  66. kalP2PIndicateChannelReady(prAdapter->prGlueInfo,
  67. prChnlReqInfo->u8Cookie,
  68. prChnlReqInfo->ucReqChnlNum,
  69. prChnlReqInfo->eBand, prChnlReqInfo->eChnlSco, prChnlReqInfo->u4MaxInterval);
  70. } while (FALSE);
  71. } /* p2pStateInit_CHNL_ON_HAND */
  72. VOID
  73. p2pStateAbort_CHNL_ON_HAND(IN P_ADAPTER_T prAdapter,
  74. IN P_P2P_FSM_INFO_T prP2pFsmInfo,
  75. IN P_BSS_INFO_T prP2pBssInfo, IN ENUM_P2P_STATE_T eNextState)
  76. {
  77. P_P2P_CHNL_REQ_INFO_T prChnlReqInfo = (P_P2P_CHNL_REQ_INFO_T) NULL;
  78. do {
  79. ASSERT_BREAK((prAdapter != NULL) && (prP2pFsmInfo != NULL));
  80. prChnlReqInfo = &(prP2pFsmInfo->rChnlReqInfo);
  81. cnmTimerStopTimer(prAdapter, &(prAdapter->rP2pFsmTimeoutTimer));
  82. /* Restore the original channel info. */
  83. prP2pBssInfo->ucPrimaryChannel = prChnlReqInfo->ucOriChnlNum;
  84. prP2pBssInfo->eBand = prChnlReqInfo->eOriBand;
  85. prP2pBssInfo->eBssSCO = prChnlReqInfo->eOriChnlSco;
  86. if (eNextState != P2P_STATE_CHNL_ON_HAND) {
  87. /* Indicate channel return. */
  88. kalP2PIndicateChannelExpired(prAdapter->prGlueInfo, &prP2pFsmInfo->rChnlReqInfo);
  89. /* Return Channel. */
  90. p2pFuncReleaseCh(prAdapter, &(prP2pFsmInfo->rChnlReqInfo));
  91. }
  92. } while (FALSE);
  93. } /* p2pStateAbort_CHNL_ON_HAND */
  94. VOID
  95. p2pStateAbort_REQING_CHANNEL(IN P_ADAPTER_T prAdapter, IN P_P2P_FSM_INFO_T prP2pFsmInfo, IN ENUM_P2P_STATE_T eNextState)
  96. {
  97. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  98. P_P2P_SPECIFIC_BSS_INFO_T prP2pSpecificBssInfo = (P_P2P_SPECIFIC_BSS_INFO_T) NULL;
  99. do {
  100. ASSERT_BREAK((prAdapter != NULL) && (prP2pFsmInfo != NULL) && (eNextState < P2P_STATE_NUM));
  101. prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
  102. prP2pSpecificBssInfo = prAdapter->rWifiVar.prP2pSpecificBssInfo;
  103. if (eNextState == P2P_STATE_IDLE) {
  104. if (prP2pBssInfo->eIntendOPMode == OP_MODE_ACCESS_POINT) {
  105. /* Intend to be AP. */
  106. /* Setup for AP mode. */
  107. p2pFuncStartGO(prAdapter,
  108. prP2pBssInfo,
  109. prP2pSpecificBssInfo->aucGroupSsid,
  110. prP2pSpecificBssInfo->u2GroupSsidLen,
  111. prP2pSpecificBssInfo->ucPreferredChannel,
  112. prP2pSpecificBssInfo->eRfBand,
  113. prP2pSpecificBssInfo->eRfSco, prP2pFsmInfo->fgIsApMode);
  114. } else {
  115. /* Return Channel. */
  116. p2pFuncReleaseCh(prAdapter, &(prP2pFsmInfo->rChnlReqInfo));
  117. }
  118. }
  119. } while (FALSE);
  120. } /* p2pStateInit_AP_CHANNEL_DETECT */
  121. VOID p2pStateInit_AP_CHANNEL_DETECT(IN P_ADAPTER_T prAdapter, IN P_P2P_FSM_INFO_T prP2pFsmInfo)
  122. {
  123. P_P2P_SCAN_REQ_INFO_T prScanReqInfo = (P_P2P_SCAN_REQ_INFO_T) NULL;
  124. do {
  125. ASSERT_BREAK((prAdapter != NULL) && (prP2pFsmInfo != NULL));
  126. prScanReqInfo = &(prP2pFsmInfo->rScanReqInfo);
  127. prScanReqInfo->eScanType = SCAN_TYPE_PASSIVE_SCAN;
  128. prScanReqInfo->eChannelSet = SCAN_CHANNEL_2G4;
  129. prScanReqInfo->u2PassiveDewellTime = 50; /* 50ms for passive channel load detection */
  130. prScanReqInfo->fgIsAbort = TRUE;
  131. prScanReqInfo->fgIsScanRequest = TRUE;
  132. prScanReqInfo->ucNumChannelList = 0;
  133. prScanReqInfo->u4BufLength = 0;
  134. prScanReqInfo->rSsidStruct.ucSsidLen = 0;
  135. p2pFuncRequestScan(prAdapter, prScanReqInfo);
  136. } while (FALSE);
  137. } /* p2pStateInit_AP_CHANNEL_DETECT */
  138. VOID
  139. p2pStateAbort_AP_CHANNEL_DETECT(IN P_ADAPTER_T prAdapter,
  140. IN P_P2P_FSM_INFO_T prP2pFsmInfo,
  141. IN P_P2P_SPECIFIC_BSS_INFO_T prP2pSpecificBssInfo, IN ENUM_P2P_STATE_T eNextState)
  142. {
  143. P_P2P_CHNL_REQ_INFO_T prChnlReqInfo = (P_P2P_CHNL_REQ_INFO_T) NULL;
  144. P_P2P_CONNECTION_SETTINGS_T prP2pConnSettings = (P_P2P_CONNECTION_SETTINGS_T) NULL;
  145. do {
  146. if (eNextState == P2P_STATE_REQING_CHANNEL) {
  147. UINT_8 ucPreferedChnl = 0;
  148. ENUM_BAND_T eBand = BAND_NULL;
  149. ENUM_CHNL_EXT_T eSco = CHNL_EXT_SCN;
  150. prChnlReqInfo = &(prP2pFsmInfo->rChnlReqInfo);
  151. /* Determine the channel for AP. */
  152. if (cnmPreferredChannel(prAdapter, &eBand, &ucPreferedChnl, &eSco) == FALSE) {
  153. prP2pConnSettings = prAdapter->rWifiVar.prP2PConnSettings;
  154. ucPreferedChnl = prP2pConnSettings->ucOperatingChnl;
  155. if (ucPreferedChnl == 0) {
  156. if (scnQuerySparseChannel(prAdapter, &eBand, &ucPreferedChnl) == FALSE) {
  157. /* What to do? */
  158. ASSERT(FALSE);
  159. /* TODO: Pick up a valid channel from channel list. */
  160. ucPreferedChnl = 1;
  161. eBand = BAND_2G4;
  162. }
  163. }
  164. }
  165. prChnlReqInfo->eChannelReqType = CHANNEL_REQ_TYPE_GO_START_BSS;
  166. DBGLOG(P2P, INFO, "p2pStateAbort_AP_CHANNEL_DETECT GO Scan\n");
  167. prChnlReqInfo->ucReqChnlNum = prP2pSpecificBssInfo->ucPreferredChannel = ucPreferedChnl;
  168. prChnlReqInfo->eBand = prP2pSpecificBssInfo->eRfBand = eBand;
  169. prChnlReqInfo->eChnlSco = prP2pSpecificBssInfo->eRfSco = eSco;
  170. } else {
  171. p2pFuncCancelScan(prAdapter, &(prP2pFsmInfo->rScanReqInfo));
  172. }
  173. } while (FALSE);
  174. } /* p2pStateAbort_AP_CHANNEL_DETECT */
  175. VOID p2pStateInit_SCAN(IN P_ADAPTER_T prAdapter, IN P_P2P_FSM_INFO_T prP2pFsmInfo)
  176. {
  177. P_P2P_SCAN_REQ_INFO_T prScanReqInfo = (P_P2P_SCAN_REQ_INFO_T) NULL;
  178. do {
  179. ASSERT_BREAK((prAdapter != NULL) && (prP2pFsmInfo != NULL));
  180. prScanReqInfo = &prP2pFsmInfo->rScanReqInfo;
  181. prScanReqInfo->fgIsScanRequest = TRUE;
  182. p2pFuncRequestScan(prAdapter, prScanReqInfo);
  183. } while (FALSE);
  184. } /* p2pStateInit_SCAN */
  185. VOID p2pStateAbort_SCAN(IN P_ADAPTER_T prAdapter, IN P_P2P_FSM_INFO_T prP2pFsmInfo, IN ENUM_P2P_STATE_T eNextState)
  186. {
  187. do {
  188. ASSERT_BREAK(prAdapter != NULL);
  189. /* 1. Scan cancel. (Make sure the scan request is invalid. */
  190. p2pFuncCancelScan(prAdapter, &(prP2pFsmInfo->rScanReqInfo));
  191. /* Scan done indication. */
  192. kalP2PIndicateScanDone(prAdapter->prGlueInfo, prP2pFsmInfo->rScanReqInfo.fgIsAbort);
  193. } while (FALSE);
  194. } /* p2pStateAbort_SCAN */
  195. VOID
  196. p2pStateInit_GC_JOIN(IN P_ADAPTER_T prAdapter,
  197. IN P_P2P_FSM_INFO_T prP2pFsmInfo,
  198. IN P_BSS_INFO_T prP2pBssInfo, IN P_P2P_JOIN_INFO_T prJoinInfo, IN P_BSS_DESC_T prBssDesc)
  199. {
  200. P_MSG_JOIN_REQ_T prJoinReqMsg = (P_MSG_JOIN_REQ_T) NULL;
  201. P_STA_RECORD_T prStaRec = (P_STA_RECORD_T) NULL;
  202. P_P2P_CONNECTION_SETTINGS_T prP2pConnSettings = (P_P2P_CONNECTION_SETTINGS_T) NULL;
  203. do {
  204. ASSERT_BREAK((prAdapter != NULL) &&
  205. (prP2pFsmInfo != NULL) &&
  206. (prP2pBssInfo != NULL) && (prJoinInfo != NULL) && (prBssDesc != NULL));
  207. prP2pConnSettings = prAdapter->rWifiVar.prP2PConnSettings;
  208. if (prBssDesc->ucSSIDLen) {
  209. COPY_SSID(prP2pConnSettings->aucSSID,
  210. prP2pConnSettings->ucSSIDLen, prBssDesc->aucSSID, prBssDesc->ucSSIDLen);
  211. }
  212. /* Setup a join timer. */
  213. DBGLOG(P2P, TRACE, "Start a join init timer\n");
  214. cnmTimerStartTimer(prAdapter,
  215. &(prAdapter->rP2pFsmTimeoutTimer),
  216. (prP2pFsmInfo->u4GrantInterval - AIS_JOIN_CH_GRANT_THRESHOLD));
  217. /* 2 <1> We are goin to connect to this BSS */
  218. prBssDesc->fgIsConnecting = TRUE;
  219. /* 2 <2> Setup corresponding STA_RECORD_T */
  220. prStaRec = bssCreateStaRecFromBssDesc(prAdapter,
  221. (prBssDesc->fgIsP2PPresent ? (STA_TYPE_P2P_GO)
  222. : (STA_TYPE_LEGACY_AP)), NETWORK_TYPE_P2P_INDEX, prBssDesc);
  223. if (prStaRec == NULL) {
  224. DBGLOG(P2P, TRACE, "Create station record fail\n");
  225. break;
  226. }
  227. prJoinInfo->prTargetStaRec = prStaRec;
  228. prJoinInfo->fgIsJoinComplete = FALSE;
  229. prJoinInfo->u4BufLength = 0;
  230. /* 2 <2.1> Sync. to FW domain */
  231. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
  232. if (prP2pBssInfo->eConnectionState == PARAM_MEDIA_STATE_DISCONNECTED) {
  233. P_P2P_CONNECTION_SETTINGS_T prP2pConnSettings = (P_P2P_CONNECTION_SETTINGS_T) NULL;
  234. prStaRec->fgIsReAssoc = FALSE;
  235. prP2pConnSettings = prAdapter->rWifiVar.prP2PConnSettings;
  236. switch (prP2pConnSettings->eAuthMode) {
  237. case AUTH_MODE_OPEN: /* Note: Omit break here. */
  238. case AUTH_MODE_WPA:
  239. case AUTH_MODE_WPA_PSK:
  240. case AUTH_MODE_WPA2:
  241. case AUTH_MODE_WPA2_PSK:
  242. prJoinInfo->ucAvailableAuthTypes = (UINT_8) AUTH_TYPE_OPEN_SYSTEM;
  243. break;
  244. case AUTH_MODE_SHARED:
  245. prJoinInfo->ucAvailableAuthTypes = (UINT_8) AUTH_TYPE_SHARED_KEY;
  246. break;
  247. case AUTH_MODE_AUTO_SWITCH:
  248. DBGLOG(P2P, LOUD, "JOIN INIT: eAuthMode == AUTH_MODE_AUTO_SWITCH\n");
  249. prJoinInfo->ucAvailableAuthTypes = (UINT_8) (AUTH_TYPE_OPEN_SYSTEM |
  250. AUTH_TYPE_SHARED_KEY);
  251. break;
  252. default:
  253. ASSERT(!(prP2pConnSettings->eAuthMode == AUTH_MODE_WPA_NONE));
  254. DBGLOG(P2P, ERROR, "JOIN INIT: Auth Algorithm : %d was not supported by JOIN\n",
  255. prP2pConnSettings->eAuthMode);
  256. /* TODO(Kevin): error handling ? */
  257. return;
  258. }
  259. prStaRec->ucTxAuthAssocRetryLimit = TX_AUTH_ASSOCI_RETRY_LIMIT;
  260. } else {
  261. ASSERT(FALSE);
  262. /* TODO: Shall we considering ROAMIN case for P2P Device?. */
  263. }
  264. /* 2 <4> Use an appropriate Authentication Algorithm Number among the ucAvailableAuthTypes. */
  265. if (prJoinInfo->ucAvailableAuthTypes & (UINT_8) AUTH_TYPE_OPEN_SYSTEM) {
  266. DBGLOG(P2P, TRACE, "JOIN INIT: Try to do Authentication with AuthType == OPEN_SYSTEM.\n");
  267. prJoinInfo->ucAvailableAuthTypes &= ~(UINT_8) AUTH_TYPE_OPEN_SYSTEM;
  268. prStaRec->ucAuthAlgNum = (UINT_8) AUTH_ALGORITHM_NUM_OPEN_SYSTEM;
  269. } else if (prJoinInfo->ucAvailableAuthTypes & (UINT_8) AUTH_TYPE_SHARED_KEY) {
  270. DBGLOG(P2P, TRACE, "JOIN INIT: Try to do Authentication with AuthType == SHARED_KEY.\n");
  271. prJoinInfo->ucAvailableAuthTypes &= ~(UINT_8) AUTH_TYPE_SHARED_KEY;
  272. prStaRec->ucAuthAlgNum = (UINT_8) AUTH_ALGORITHM_NUM_SHARED_KEY;
  273. } else if (prJoinInfo->ucAvailableAuthTypes & (UINT_8) AUTH_TYPE_FAST_BSS_TRANSITION) {
  274. DBGLOG(P2P, TRACE,
  275. "JOIN INIT: Try to do Authentication with AuthType == FAST_BSS_TRANSITION.\n");
  276. prJoinInfo->ucAvailableAuthTypes &= ~(UINT_8) AUTH_TYPE_FAST_BSS_TRANSITION;
  277. prStaRec->ucAuthAlgNum = (UINT_8) AUTH_ALGORITHM_NUM_FAST_BSS_TRANSITION;
  278. } else {
  279. ASSERT(0);
  280. }
  281. /* 4 <5> Overwrite Connection Setting for eConnectionPolicy == ANY (Used by Assoc Req) */
  282. if (prBssDesc->ucSSIDLen) {
  283. COPY_SSID(prJoinInfo->rSsidStruct.aucSsid,
  284. prJoinInfo->rSsidStruct.ucSsidLen, prBssDesc->aucSSID, prBssDesc->ucSSIDLen);
  285. }
  286. /* 2 <5> Backup desired channel. */
  287. /* 2 <6> Send a Msg to trigger SAA to start JOIN process. */
  288. prJoinReqMsg = (P_MSG_JOIN_REQ_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_REQ_T));
  289. if (!prJoinReqMsg) {
  290. DBGLOG(P2P, TRACE, "Allocation Join Message Fail\n");
  291. ASSERT(FALSE);
  292. return;
  293. }
  294. prJoinReqMsg->rMsgHdr.eMsgId = MID_P2P_SAA_FSM_START;
  295. prJoinReqMsg->ucSeqNum = ++prJoinInfo->ucSeqNumOfReqMsg;
  296. prJoinReqMsg->prStaRec = prStaRec;
  297. /* TODO: Consider fragmentation info in station record. */
  298. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prJoinReqMsg, MSG_SEND_METHOD_BUF);
  299. } while (FALSE);
  300. } /* p2pStateInit_GC_JOIN */
  301. /*----------------------------------------------------------------------------*/
  302. /*!
  303. * @brief Process of JOIN Abort. Leave JOIN State & Abort JOIN.
  304. *
  305. * @param (none)
  306. *
  307. * @return (none)
  308. */
  309. /*----------------------------------------------------------------------------*/
  310. VOID
  311. p2pStateAbort_GC_JOIN(IN P_ADAPTER_T prAdapter,
  312. IN P_P2P_FSM_INFO_T prP2pFsmInfo, IN P_P2P_JOIN_INFO_T prJoinInfo, IN ENUM_P2P_STATE_T eNextState)
  313. {
  314. P_MSG_JOIN_ABORT_T prJoinAbortMsg = (P_MSG_JOIN_ABORT_T) NULL;
  315. do {
  316. ASSERT_BREAK((prAdapter != NULL) && (prP2pFsmInfo != NULL) && (prJoinInfo != NULL));
  317. if (prJoinInfo->fgIsJoinComplete == FALSE) {
  318. prJoinAbortMsg =
  319. (P_MSG_JOIN_ABORT_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_JOIN_ABORT_T));
  320. if (!prJoinAbortMsg) {
  321. DBGLOG(P2P, TRACE, "Fail to allocate join abort message buffer\n");
  322. ASSERT(FALSE);
  323. return;
  324. }
  325. prJoinAbortMsg->rMsgHdr.eMsgId = MID_P2P_SAA_FSM_ABORT;
  326. prJoinAbortMsg->ucSeqNum = prJoinInfo->ucSeqNumOfReqMsg;
  327. prJoinAbortMsg->prStaRec = prJoinInfo->prTargetStaRec;
  328. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prJoinAbortMsg, MSG_SEND_METHOD_BUF);
  329. }
  330. /* Stop Join Timer. */
  331. cnmTimerStopTimer(prAdapter, &(prAdapter->rP2pFsmTimeoutTimer));
  332. /* Release channel requested. */
  333. p2pFuncReleaseCh(prAdapter, &(prP2pFsmInfo->rChnlReqInfo));
  334. } while (FALSE);
  335. return;
  336. } /* p2pStateAbort_GC_JOIN */