p2p_role_fsm.c 54 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691
  1. #include "precomp.h"
  2. #include "p2p_role_state.h"
  3. #if 1
  4. /*lint -save -e64 Type mismatch */
  5. static PUINT_8 apucDebugP2pRoleState[P2P_ROLE_STATE_NUM] = {
  6. (PUINT_8) DISP_STRING("P2P_ROLE_STATE_IDLE"),
  7. (PUINT_8) DISP_STRING("P2P_ROLE_STATE_SCAN"),
  8. (PUINT_8) DISP_STRING("P2P_ROLE_STATE_REQING_CHANNEL"),
  9. (PUINT_8) DISP_STRING("P2P_ROLE_STATE_AP_CHNL_DETECTION"),
  10. (PUINT_8) DISP_STRING("P2P_ROLE_STATE_GC_JOIN")
  11. };
  12. /*lint -restore */
  13. #endif /* DBG */
  14. VOID
  15. p2pRoleFsmStateTransition(IN P_ADAPTER_T prAdapter,
  16. IN P_P2P_ROLE_FSM_INFO_T prP2pRoleFsmInfo, IN ENUM_P2P_ROLE_STATE_T eNextState);
  17. UINT_8 p2pRoleFsmInit(IN P_ADAPTER_T prAdapter, IN UINT_8 ucRoleIdx)
  18. {
  19. P_P2P_ROLE_FSM_INFO_T prP2pRoleFsmInfo = (P_P2P_ROLE_FSM_INFO_T) NULL;
  20. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  21. P_P2P_CHNL_REQ_INFO_T prP2pChnlReqInfo = (P_P2P_CHNL_REQ_INFO_T) NULL;
  22. do {
  23. ASSERT_BREAK(prAdapter != NULL);
  24. ASSERT_BREAK(P2P_ROLE_INDEX_2_ROLE_FSM_INFO(prAdapter, ucRoleIdx) == NULL);
  25. prP2pRoleFsmInfo = kalMemAlloc(sizeof(P2P_ROLE_FSM_INFO_T), VIR_MEM_TYPE);
  26. P2P_ROLE_INDEX_2_ROLE_FSM_INFO(prAdapter, ucRoleIdx) = prP2pRoleFsmInfo;
  27. prP2pRoleFsmInfo->ucRoleIndex = ucRoleIdx;
  28. ASSERT_BREAK(prP2pRoleFsmInfo != NULL);
  29. kalMemZero(prP2pRoleFsmInfo, sizeof(P2P_ROLE_FSM_INFO_T));
  30. prP2pRoleFsmInfo->eCurrentState = P2P_ROLE_STATE_IDLE;
  31. prP2pChnlReqInfo = &prP2pRoleFsmInfo->rChnlReqInfo;
  32. LINK_INITIALIZE(&(prP2pChnlReqInfo->rP2pChnlReqLink));
  33. cnmTimerInitTimer(prAdapter,
  34. &(prP2pRoleFsmInfo->rP2pRoleFsmTimeoutTimer),
  35. (PFN_MGMT_TIMEOUT_FUNC) p2pRoleFsmRunEventTimeout, (ULONG) prP2pRoleFsmInfo);
  36. prP2pBssInfo = cnmGetBssInfoAndInit(prAdapter, NETWORK_TYPE_P2P, FALSE);
  37. if (!prP2pBssInfo) {
  38. kalMemFree(prP2pRoleFsmInfo, VIR_MEM_TYPE, sizeof(P2P_ROLE_FSM_INFO_T));
  39. DBGLOG(P2P, ERROR, "Error allocating BSS Info Structure\n");
  40. break;
  41. }
  42. BSS_INFO_INIT(prAdapter, prP2pBssInfo);
  43. prP2pRoleFsmInfo->ucBssIndex = prP2pBssInfo->ucBssIndex;
  44. /* For state identify, not really used. */
  45. prP2pBssInfo->eIntendOPMode = OP_MODE_P2P_DEVICE;
  46. COPY_MAC_ADDR(prP2pBssInfo->aucOwnMacAddr, prAdapter->rMyMacAddr);
  47. prP2pBssInfo->aucOwnMacAddr[0] ^= 0x2; /* change to local administrated address */
  48. /* For BSS_INFO back trace to P2P Role & get Role FSM. */
  49. prP2pBssInfo->u4PrivateData = ucRoleIdx;
  50. if (p2pFuncIsAPMode(prAdapter->rWifiVar.prP2PConnSettings)) {
  51. prP2pBssInfo->ucConfigAdHocAPMode = AP_MODE_11G;
  52. prP2pBssInfo->u2HwDefaultFixedRateCode = RATE_CCK_1M_LONG;
  53. } else {
  54. prP2pBssInfo->ucConfigAdHocAPMode = AP_MODE_11G_P2P;
  55. prP2pBssInfo->u2HwDefaultFixedRateCode = RATE_OFDM_6M;
  56. }
  57. prP2pBssInfo->ucNonHTBasicPhyType = (UINT_8)
  58. rNonHTApModeAttributes[prP2pBssInfo->ucConfigAdHocAPMode].ePhyTypeIndex;
  59. prP2pBssInfo->u2BSSBasicRateSet =
  60. rNonHTApModeAttributes[prP2pBssInfo->ucConfigAdHocAPMode].u2BSSBasicRateSet;
  61. prP2pBssInfo->u2OperationalRateSet =
  62. rNonHTPhyAttributes[prP2pBssInfo->ucNonHTBasicPhyType].u2SupportedRateSet;
  63. rateGetDataRatesFromRateSet(prP2pBssInfo->u2OperationalRateSet,
  64. prP2pBssInfo->u2BSSBasicRateSet,
  65. prP2pBssInfo->aucAllSupportedRates, &prP2pBssInfo->ucAllSupportedRatesLen);
  66. prP2pBssInfo->prBeacon = cnmMgtPktAlloc(prAdapter,
  67. OFFSET_OF(WLAN_BEACON_FRAME_T, aucInfoElem[0]) + MAX_IE_LENGTH);
  68. if (prP2pBssInfo->prBeacon) {
  69. prP2pBssInfo->prBeacon->eSrc = TX_PACKET_MGMT;
  70. prP2pBssInfo->prBeacon->ucStaRecIndex = STA_REC_INDEX_BMCAST; /* NULL STA_REC */
  71. prP2pBssInfo->prBeacon->ucBssIndex = prP2pBssInfo->ucBssIndex;
  72. } else {
  73. /* Out of memory. */
  74. ASSERT(FALSE);
  75. }
  76. prP2pBssInfo->rPmProfSetupInfo.ucBmpDeliveryAC = PM_UAPSD_ALL;
  77. prP2pBssInfo->rPmProfSetupInfo.ucBmpTriggerAC = PM_UAPSD_ALL;
  78. prP2pBssInfo->rPmProfSetupInfo.ucUapsdSp = WMM_MAX_SP_LENGTH_2;
  79. prP2pBssInfo->ucPrimaryChannel = P2P_DEFAULT_LISTEN_CHANNEL;
  80. prP2pBssInfo->eBand = BAND_2G4;
  81. prP2pBssInfo->eBssSCO = CHNL_EXT_SCN;
  82. if (IS_FEATURE_ENABLED(prAdapter->rWifiVar.ucQoS))
  83. prP2pBssInfo->fgIsQBSS = TRUE;
  84. else
  85. prP2pBssInfo->fgIsQBSS = FALSE;
  86. /* SET_NET_PWR_STATE_IDLE(prAdapter, prP2pBssInfo->ucBssIndex); */
  87. p2pRoleFsmStateTransition(prAdapter, prP2pRoleFsmInfo, P2P_ROLE_STATE_IDLE);
  88. } while (FALSE);
  89. if (prP2pBssInfo)
  90. return prP2pBssInfo->ucBssIndex;
  91. else
  92. return P2P_DEV_BSS_INDEX;
  93. } /* p2pFsmInit */
  94. VOID p2pRoleFsmUninit(IN P_ADAPTER_T prAdapter, IN UINT_8 ucRoleIdx)
  95. {
  96. P_P2P_ROLE_FSM_INFO_T prP2pRoleFsmInfo = (P_P2P_ROLE_FSM_INFO_T) NULL;
  97. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  98. do {
  99. ASSERT_BREAK(prAdapter != NULL);
  100. DEBUGFUNC("p2pRoleFsmUninit()");
  101. DBGLOG(P2P, INFO, "->p2pRoleFsmUninit()\n");
  102. prP2pRoleFsmInfo = P2P_ROLE_INDEX_2_ROLE_FSM_INFO(prAdapter, ucRoleIdx);
  103. ASSERT_BREAK(prP2pRoleFsmInfo != NULL);
  104. if (!prP2pRoleFsmInfo)
  105. return;
  106. prP2pBssInfo = prAdapter->aprBssInfo[prP2pRoleFsmInfo->ucBssIndex];
  107. p2pFuncDissolve(prAdapter, prP2pBssInfo, TRUE, REASON_CODE_DEAUTH_LEAVING_BSS);
  108. SET_NET_PWR_STATE_IDLE(prAdapter, prP2pBssInfo->ucBssIndex);
  109. /* Function Dissolve should already enter IDLE state. */
  110. p2pRoleFsmStateTransition(prAdapter, prP2pRoleFsmInfo, P2P_ROLE_STATE_IDLE);
  111. p2pRoleFsmRunEventAbort(prAdapter, prP2pRoleFsmInfo);
  112. /* Clear CmdQue */
  113. kalClearMgmtFramesByBssIdx(prAdapter->prGlueInfo, prP2pBssInfo->ucBssIndex);
  114. kalClearSecurityFramesByBssIdx(prAdapter->prGlueInfo, prP2pBssInfo->ucBssIndex);
  115. /* Clear PendingCmdQue */
  116. wlanReleasePendingCMDbyBssIdx(prAdapter, prP2pBssInfo->ucBssIndex);
  117. /* Clear PendingTxMsdu */
  118. nicFreePendingTxMsduInfoByBssIdx(prAdapter, prP2pBssInfo->ucBssIndex);
  119. /* Deactivate BSS. */
  120. UNSET_NET_ACTIVE(prAdapter, prP2pRoleFsmInfo->ucBssIndex);
  121. nicDeactivateNetwork(prAdapter, prP2pRoleFsmInfo->ucBssIndex);
  122. P2P_ROLE_INDEX_2_ROLE_FSM_INFO(prAdapter, ucRoleIdx) = NULL;
  123. if (prP2pBssInfo->prBeacon) {
  124. cnmMgtPktFree(prAdapter, prP2pBssInfo->prBeacon);
  125. prP2pBssInfo->prBeacon = NULL;
  126. }
  127. cnmFreeBssInfo(prAdapter, prP2pBssInfo);
  128. if (prP2pRoleFsmInfo)
  129. kalMemFree(prP2pRoleFsmInfo, VIR_MEM_TYPE, sizeof(P2P_ROLE_FSM_INFO_T));
  130. } while (FALSE);
  131. return;
  132. #if 0
  133. P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
  134. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  135. do {
  136. ASSERT_BREAK(prAdapter != NULL);
  137. DEBUGFUNC("p2pFsmUninit()");
  138. DBGLOG(P2P, INFO, "->p2pFsmUninit()\n");
  139. prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
  140. prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
  141. p2pFuncSwitchOPMode(prAdapter, prP2pBssInfo, OP_MODE_P2P_DEVICE, TRUE);
  142. p2pFsmRunEventAbort(prAdapter, prP2pFsmInfo);
  143. p2pStateAbort_IDLE(prAdapter, prP2pFsmInfo, P2P_STATE_NUM);
  144. UNSET_NET_ACTIVE(prAdapter, NETWORK_TYPE_P2P_INDEX);
  145. wlanAcquirePowerControl(prAdapter);
  146. /* Release all pending CMD queue. */
  147. DBGLOG(P2P, TRACE,
  148. "p2pFsmUninit: wlanProcessCommandQueue, num of element:%d\n",
  149. prAdapter->prGlueInfo->rCmdQueue.u4NumElem);
  150. wlanProcessCommandQueue(prAdapter, &prAdapter->prGlueInfo->rCmdQueue);
  151. wlanReleasePowerControl(prAdapter);
  152. /* Release pending mgmt frame,
  153. * mgmt frame may be pending by CMD without resource.
  154. */
  155. kalClearMgmtFramesByBssIdx(prAdapter->prGlueInfo, NETWORK_TYPE_P2P_INDEX);
  156. /* Clear PendingCmdQue */
  157. wlanReleasePendingCMDbyBssIdx(prAdapter, NETWORK_TYPE_P2P_INDEX);
  158. if (prP2pBssInfo->prBeacon) {
  159. cnmMgtPktFree(prAdapter, prP2pBssInfo->prBeacon);
  160. prP2pBssInfo->prBeacon = NULL;
  161. }
  162. } while (FALSE);
  163. return;
  164. #endif
  165. } /* p2pRoleFsmUninit */
  166. VOID
  167. p2pRoleFsmStateTransition(IN P_ADAPTER_T prAdapter,
  168. IN P_P2P_ROLE_FSM_INFO_T prP2pRoleFsmInfo, IN ENUM_P2P_ROLE_STATE_T eNextState)
  169. {
  170. BOOLEAN fgIsTransitionOut = (BOOLEAN) FALSE;
  171. P_BSS_INFO_T prP2pRoleBssInfo = (P_BSS_INFO_T) NULL;
  172. prP2pRoleBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prP2pRoleFsmInfo->ucBssIndex);
  173. do {
  174. if (!IS_BSS_ACTIVE(prP2pRoleBssInfo)) {
  175. if (!cnmP2PIsPermitted(prAdapter))
  176. return;
  177. SET_NET_ACTIVE(prAdapter, prP2pRoleBssInfo->ucBssIndex);
  178. nicActivateNetwork(prAdapter, prP2pRoleBssInfo->ucBssIndex);
  179. }
  180. fgIsTransitionOut = fgIsTransitionOut ? FALSE : TRUE;
  181. if (!fgIsTransitionOut) {
  182. DBGLOG(P2P, STATE, "[P2P_ROLE][%d]TRANSITION: [%s] -> [%s]\n",
  183. prP2pRoleFsmInfo->ucRoleIndex,
  184. apucDebugP2pRoleState[prP2pRoleFsmInfo->eCurrentState],
  185. apucDebugP2pRoleState[eNextState]);
  186. /* Transition into current state. */
  187. prP2pRoleFsmInfo->eCurrentState = eNextState;
  188. }
  189. switch (prP2pRoleFsmInfo->eCurrentState) {
  190. case P2P_ROLE_STATE_IDLE:
  191. if (!fgIsTransitionOut)
  192. p2pRoleStateInit_IDLE(prAdapter, prP2pRoleFsmInfo, prP2pRoleBssInfo);
  193. else
  194. p2pRoleStateAbort_IDLE(prAdapter, prP2pRoleFsmInfo, &(prP2pRoleFsmInfo->rChnlReqInfo));
  195. break;
  196. case P2P_ROLE_STATE_SCAN:
  197. if (!fgIsTransitionOut) {
  198. p2pRoleStateInit_SCAN(prAdapter, prP2pRoleFsmInfo->ucBssIndex,
  199. &(prP2pRoleFsmInfo->rScanReqInfo));
  200. } else {
  201. p2pRoleStateAbort_SCAN(prAdapter, prP2pRoleFsmInfo);
  202. }
  203. break;
  204. case P2P_ROLE_STATE_REQING_CHANNEL:
  205. if (!fgIsTransitionOut) {
  206. p2pRoleStateInit_REQING_CHANNEL(prAdapter,
  207. prP2pRoleFsmInfo->ucBssIndex,
  208. &(prP2pRoleFsmInfo->rChnlReqInfo));
  209. } else {
  210. p2pRoleStateAbort_REQING_CHANNEL(prAdapter, prP2pRoleBssInfo,
  211. prP2pRoleFsmInfo, eNextState);
  212. }
  213. break;
  214. case P2P_ROLE_STATE_AP_CHNL_DETECTION:
  215. if (!fgIsTransitionOut) {
  216. p2pRoleStateInit_AP_CHNL_DETECTION(prAdapter,
  217. prP2pRoleFsmInfo->ucBssIndex,
  218. &(prP2pRoleFsmInfo->rScanReqInfo),
  219. &(prP2pRoleFsmInfo->rConnReqInfo));
  220. } else {
  221. p2pRoleStateAbort_AP_CHNL_DETECTION(prAdapter,
  222. prP2pRoleFsmInfo->ucBssIndex,
  223. &(prP2pRoleFsmInfo->rConnReqInfo),
  224. &(prP2pRoleFsmInfo->rChnlReqInfo),
  225. &(prP2pRoleFsmInfo->rScanReqInfo), eNextState);
  226. }
  227. break;
  228. case P2P_ROLE_STATE_GC_JOIN:
  229. if (!fgIsTransitionOut) {
  230. p2pRoleStateInit_GC_JOIN(prAdapter,
  231. prP2pRoleFsmInfo, &(prP2pRoleFsmInfo->rChnlReqInfo));
  232. } else {
  233. p2pRoleStateAbort_GC_JOIN(prAdapter,
  234. prP2pRoleFsmInfo, &(prP2pRoleFsmInfo->rJoinInfo), eNextState);
  235. }
  236. break;
  237. default:
  238. ASSERT(FALSE);
  239. break;
  240. }
  241. } while (fgIsTransitionOut);
  242. } /* p2pRoleFsmStateTransition */
  243. VOID p2pRoleFsmRunEventTimeout(IN P_ADAPTER_T prAdapter, IN ULONG ulParamPtr)
  244. {
  245. P_P2P_ROLE_FSM_INFO_T prP2pRoleFsmInfo = (P_P2P_ROLE_FSM_INFO_T) ulParamPtr;
  246. P_P2P_CHNL_REQ_INFO_T prP2pChnlReqInfo = (P_P2P_CHNL_REQ_INFO_T) NULL;
  247. do {
  248. ASSERT_BREAK((prAdapter != NULL) && (prP2pRoleFsmInfo != NULL));
  249. switch (prP2pRoleFsmInfo->eCurrentState) {
  250. case P2P_ROLE_STATE_IDLE:
  251. prP2pChnlReqInfo = &(prP2pRoleFsmInfo->rChnlReqInfo);
  252. if (prP2pChnlReqInfo->fgIsChannelRequested) {
  253. p2pFuncReleaseCh(prAdapter, prP2pRoleFsmInfo->ucBssIndex, prP2pChnlReqInfo);
  254. if (IS_NET_PWR_STATE_IDLE(prAdapter, prP2pRoleFsmInfo->ucBssIndex))
  255. ASSERT(FALSE);
  256. }
  257. if (IS_NET_PWR_STATE_IDLE(prAdapter, prP2pRoleFsmInfo->ucBssIndex)) {
  258. DBGLOG(P2P, TRACE, "Role BSS IDLE, deactive network.\n");
  259. UNSET_NET_ACTIVE(prAdapter, prP2pRoleFsmInfo->ucBssIndex);
  260. nicDeactivateNetwork(prAdapter, prP2pRoleFsmInfo->ucBssIndex);
  261. }
  262. break;
  263. case P2P_ROLE_STATE_GC_JOIN:
  264. DBGLOG(P2P, ERROR,
  265. "Current P2P Role State P2P_ROLE_STATE_GC_JOIN is unexpected for FSM timeout event.\n");
  266. break;
  267. default:
  268. DBGLOG(P2P, ERROR,
  269. "Current P2P Role State %d is unexpected for FSM timeout event.\n",
  270. prP2pRoleFsmInfo->eCurrentState);
  271. ASSERT(FALSE);
  272. break;
  273. }
  274. } while (FALSE);
  275. } /* p2pRoleFsmRunEventTimeout */
  276. VOID p2pRoleFsmRunEventAbort(IN P_ADAPTER_T prAdapter, IN P_P2P_ROLE_FSM_INFO_T prP2pRoleFsmInfo)
  277. {
  278. do {
  279. ASSERT_BREAK((prAdapter != NULL) && (prP2pRoleFsmInfo != NULL));
  280. if (prP2pRoleFsmInfo->eCurrentState != P2P_ROLE_STATE_IDLE) {
  281. /* Get into IDLE state. */
  282. p2pRoleFsmStateTransition(prAdapter, prP2pRoleFsmInfo, P2P_ROLE_STATE_IDLE);
  283. }
  284. /* Abort IDLE. */
  285. p2pRoleStateAbort_IDLE(prAdapter, prP2pRoleFsmInfo, &(prP2pRoleFsmInfo->rChnlReqInfo));
  286. } while (FALSE);
  287. } /* p2pRoleFsmRunEventAbort */
  288. WLAN_STATUS
  289. p2pRoleFsmRunEventDeauthTxDone(IN P_ADAPTER_T prAdapter,
  290. IN P_MSDU_INFO_T prMsduInfo, IN ENUM_TX_RESULT_CODE_T rTxDoneStatus)
  291. {
  292. WLAN_STATUS rWlanStatus = WLAN_STATUS_FAILURE;
  293. P_STA_RECORD_T prStaRec = (P_STA_RECORD_T) NULL;
  294. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  295. do {
  296. ASSERT_BREAK((prAdapter != NULL) && (prMsduInfo != NULL));
  297. DBGLOG(P2P, INFO, "Deauth TX Done,rTxDoneStatus = %d\n", rTxDoneStatus);
  298. prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
  299. if (prStaRec == NULL) {
  300. DBGLOG(P2P, TRACE, "Station Record NULL, Index:%d\n", prMsduInfo->ucStaRecIndex);
  301. break;
  302. }
  303. prP2pBssInfo = prAdapter->aprBssInfo[prMsduInfo->ucBssIndex];
  304. /* Try to remove StaRec in BSS client list before free it */
  305. bssRemoveClient(prAdapter, prP2pBssInfo, prStaRec);
  306. /* STA_RECORD free */
  307. cnmStaRecFree(prAdapter, prStaRec);
  308. if ((prP2pBssInfo->eCurrentOPMode != OP_MODE_ACCESS_POINT) ||
  309. (bssGetClientCount(prAdapter, prP2pBssInfo) == 0)) {
  310. DBGLOG(P2P, TRACE, "No More Client, Media Status DISCONNECTED\n");
  311. p2pChangeMediaState(prAdapter, prP2pBssInfo, PARAM_MEDIA_STATE_DISCONNECTED);
  312. }
  313. nicUpdateBss(prAdapter, prP2pBssInfo->ucBssIndex);
  314. } while (FALSE);
  315. return rWlanStatus;
  316. } /* p2pRoleFsmRunEventDeauthTxDone */
  317. VOID p2pRoleFsmRunEventRxDeauthentication(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prStaRec, IN P_SW_RFB_T prSwRfb)
  318. {
  319. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  320. UINT_16 u2ReasonCode = 0;
  321. do {
  322. ASSERT_BREAK((prAdapter != NULL) && (prSwRfb != NULL));
  323. if (prStaRec == NULL)
  324. prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
  325. if (!prStaRec)
  326. break;
  327. prP2pBssInfo = prAdapter->aprBssInfo[prStaRec->ucBssIndex];
  328. if (prStaRec->ucStaState == STA_STATE_1)
  329. break;
  330. DBGLOG(P2P, TRACE, "RX Deauth\n");
  331. switch (prP2pBssInfo->eCurrentOPMode) {
  332. case OP_MODE_INFRASTRUCTURE:
  333. if (authProcessRxDeauthFrame(prSwRfb,
  334. prStaRec->aucMacAddr, &u2ReasonCode) == WLAN_STATUS_SUCCESS) {
  335. P_WLAN_DEAUTH_FRAME_T prDeauthFrame = (P_WLAN_DEAUTH_FRAME_T) prSwRfb->pvHeader;
  336. UINT_16 u2IELength = 0;
  337. if (prP2pBssInfo->prStaRecOfAP != prStaRec)
  338. break;
  339. prStaRec->u2ReasonCode = u2ReasonCode;
  340. u2IELength = prSwRfb->u2PacketLen - (WLAN_MAC_HEADER_LEN + REASON_CODE_FIELD_LEN);
  341. ASSERT(prP2pBssInfo->prStaRecOfAP == prStaRec);
  342. /* Indicate disconnect to Host. */
  343. kalP2PGCIndicateConnectionStatus(prAdapter->prGlueInfo,
  344. (UINT_8) prP2pBssInfo->u4PrivateData, NULL,
  345. prDeauthFrame->aucInfoElem, u2IELength, u2ReasonCode,
  346. WLAN_STATUS_MEDIA_DISCONNECT);
  347. prP2pBssInfo->prStaRecOfAP = NULL;
  348. p2pFuncDisconnect(prAdapter, prP2pBssInfo, prStaRec, FALSE, u2ReasonCode);
  349. SET_NET_PWR_STATE_IDLE(prAdapter, prP2pBssInfo->ucBssIndex);
  350. p2pRoleFsmStateTransition(prAdapter,
  351. P2P_ROLE_INDEX_2_ROLE_FSM_INFO(prAdapter,
  352. prP2pBssInfo->u4PrivateData),
  353. P2P_ROLE_STATE_IDLE);
  354. }
  355. break;
  356. case OP_MODE_ACCESS_POINT:
  357. /* Delete client from client list. */
  358. if (authProcessRxDeauthFrame(prSwRfb,
  359. prP2pBssInfo->aucBSSID, &u2ReasonCode) == WLAN_STATUS_SUCCESS) {
  360. #if 0
  361. P_LINK_T prStaRecOfClientList = (P_LINK_T) NULL;
  362. P_LINK_ENTRY_T prLinkEntry = (P_LINK_ENTRY_T) NULL;
  363. P_STA_RECORD_T prCurrStaRec = (P_STA_RECORD_T) NULL;
  364. prStaRecOfClientList = &prP2pBssInfo->rStaRecOfClientList;
  365. LINK_FOR_EACH(prLinkEntry, prStaRecOfClientList) {
  366. prCurrStaRec = LINK_ENTRY(prLinkEntry, STA_RECORD_T, rLinkEntry);
  367. ASSERT(prCurrStaRec);
  368. if (EQUAL_MAC_ADDR(prCurrStaRec->aucMacAddr, prStaRec->aucMacAddr)) {
  369. /* Remove STA from client list. */
  370. LINK_REMOVE_KNOWN_ENTRY(prStaRecOfClientList,
  371. &prCurrStaRec->rLinkEntry);
  372. /* Indicate to Host. */
  373. /* kalP2PGOStationUpdate(prAdapter->prGlueInfo, prStaRec, FALSE); */
  374. /* Indicate disconnect to Host. */
  375. p2pFuncDisconnect(prAdapter, prP2pBssInfo, prStaRec,
  376. FALSE, u2ReasonCode);
  377. break;
  378. }
  379. }
  380. #else
  381. if (bssRemoveClient(prAdapter, prP2pBssInfo, prStaRec))
  382. /* Indicate disconnect to Host. */
  383. p2pFuncDisconnect(prAdapter, prP2pBssInfo, prStaRec, FALSE, u2ReasonCode);
  384. #endif
  385. }
  386. break;
  387. case OP_MODE_P2P_DEVICE:
  388. default:
  389. /* Findout why someone sent deauthentication frame to us. */
  390. ASSERT(FALSE);
  391. break;
  392. }
  393. DBGLOG(P2P, TRACE, "Deauth Reason:%d\n", u2ReasonCode);
  394. } while (FALSE);
  395. } /* p2pRoleFsmRunEventRxDeauthentication */
  396. VOID p2pRoleFsmRunEventRxDisassociation(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prStaRec, IN P_SW_RFB_T prSwRfb)
  397. {
  398. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  399. UINT_16 u2ReasonCode = 0;
  400. do {
  401. ASSERT_BREAK((prAdapter != NULL) && (prSwRfb != NULL));
  402. if (prStaRec == NULL) {
  403. prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
  404. if (prStaRec == NULL)
  405. break;
  406. }
  407. prP2pBssInfo = prAdapter->aprBssInfo[prStaRec->ucBssIndex];
  408. if (prStaRec->ucStaState == STA_STATE_1)
  409. break;
  410. DBGLOG(P2P, TRACE, "RX Disassoc\n");
  411. switch (prP2pBssInfo->eCurrentOPMode) {
  412. case OP_MODE_INFRASTRUCTURE:
  413. if (assocProcessRxDisassocFrame(prAdapter,
  414. prSwRfb,
  415. prStaRec->aucMacAddr,
  416. &prStaRec->u2ReasonCode) == WLAN_STATUS_SUCCESS) {
  417. P_WLAN_DISASSOC_FRAME_T prDisassocFrame = (P_WLAN_DISASSOC_FRAME_T) prSwRfb->pvHeader;
  418. UINT_16 u2IELength = 0;
  419. ASSERT(prP2pBssInfo->prStaRecOfAP == prStaRec);
  420. if (prP2pBssInfo->prStaRecOfAP != prStaRec)
  421. break;
  422. u2IELength = prSwRfb->u2PacketLen - (WLAN_MAC_HEADER_LEN + REASON_CODE_FIELD_LEN);
  423. /* Indicate disconnect to Host. */
  424. kalP2PGCIndicateConnectionStatus(prAdapter->prGlueInfo,
  425. (UINT_8) prP2pBssInfo->u4PrivateData, NULL,
  426. prDisassocFrame->aucInfoElem,
  427. u2IELength, prStaRec->u2ReasonCode,
  428. WLAN_STATUS_MEDIA_DISCONNECT);
  429. prP2pBssInfo->prStaRecOfAP = NULL;
  430. p2pFuncDisconnect(prAdapter, prP2pBssInfo, prStaRec, FALSE, prStaRec->u2ReasonCode);
  431. SET_NET_PWR_STATE_IDLE(prAdapter, prP2pBssInfo->ucBssIndex);
  432. p2pRoleFsmStateTransition(prAdapter,
  433. P2P_ROLE_INDEX_2_ROLE_FSM_INFO(prAdapter,
  434. prP2pBssInfo->u4PrivateData),
  435. P2P_ROLE_STATE_IDLE);
  436. }
  437. break;
  438. case OP_MODE_ACCESS_POINT:
  439. /* Delete client from client list. */
  440. if (assocProcessRxDisassocFrame(prAdapter,
  441. prSwRfb,
  442. prP2pBssInfo->aucBSSID, &u2ReasonCode) == WLAN_STATUS_SUCCESS) {
  443. #if 0
  444. P_LINK_T prStaRecOfClientList = (P_LINK_T) NULL;
  445. P_LINK_ENTRY_T prLinkEntry = (P_LINK_ENTRY_T) NULL;
  446. P_STA_RECORD_T prCurrStaRec = (P_STA_RECORD_T) NULL;
  447. prStaRecOfClientList = &prP2pBssInfo->rStaRecOfClientList;
  448. LINK_FOR_EACH(prLinkEntry, prStaRecOfClientList) {
  449. prCurrStaRec = LINK_ENTRY(prLinkEntry, STA_RECORD_T, rLinkEntry);
  450. ASSERT(prCurrStaRec);
  451. if (EQUAL_MAC_ADDR(prCurrStaRec->aucMacAddr, prStaRec->aucMacAddr)) {
  452. /* Remove STA from client list. */
  453. LINK_REMOVE_KNOWN_ENTRY(prStaRecOfClientList,
  454. &prCurrStaRec->rLinkEntry);
  455. /* Indicate to Host. */
  456. /* kalP2PGOStationUpdate(prAdapter->prGlueInfo, prStaRec, FALSE); */
  457. /* Indicate disconnect to Host. */
  458. p2pFuncDisconnect(prAdapter, prP2pBssInfo, prStaRec,
  459. FALSE, u2ReasonCode);
  460. break;
  461. }
  462. }
  463. #else
  464. if (bssRemoveClient(prAdapter, prP2pBssInfo, prStaRec))
  465. /* Indicate disconnect to Host. */
  466. p2pFuncDisconnect(prAdapter, prP2pBssInfo, prStaRec, FALSE, u2ReasonCode);
  467. #endif
  468. }
  469. break;
  470. case OP_MODE_P2P_DEVICE:
  471. default:
  472. ASSERT(FALSE);
  473. break;
  474. }
  475. } while (FALSE);
  476. } /* p2pRoleFsmRunEventRxDisassociation */
  477. VOID p2pRoleFsmRunEventBeaconTimeout(IN P_ADAPTER_T prAdapter, IN P_BSS_INFO_T prP2pBssInfo)
  478. {
  479. P_P2P_ROLE_FSM_INFO_T prP2pRoleFsmInfo = (P_P2P_ROLE_FSM_INFO_T) NULL;
  480. do {
  481. ASSERT_BREAK((prAdapter != NULL) && (prP2pBssInfo != NULL));
  482. prP2pRoleFsmInfo = P2P_ROLE_INDEX_2_ROLE_FSM_INFO(prAdapter, prP2pBssInfo->u4PrivateData);
  483. /* Only client mode would have beacon lost event. */
  484. if (prP2pBssInfo->eCurrentOPMode != OP_MODE_INFRASTRUCTURE) {
  485. DBGLOG(P2P, ERROR,
  486. "Error case, P2P BSS %d not INFRA mode but beacon timeout\n",
  487. prP2pRoleFsmInfo->ucRoleIndex);
  488. break;
  489. }
  490. DBGLOG(P2P, TRACE,
  491. "p2pFsmRunEventBeaconTimeout: BSS %d Beacon Timeout\n", prP2pRoleFsmInfo->ucRoleIndex);
  492. if (prP2pBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) {
  493. /* Indicate disconnect to Host. */
  494. kalP2PGCIndicateConnectionStatus(prAdapter->prGlueInfo,
  495. prP2pRoleFsmInfo->ucRoleIndex,
  496. NULL, NULL, 0, REASON_CODE_DISASSOC_INACTIVITY,
  497. WLAN_STATUS_MEDIA_DISCONNECT);
  498. if (prP2pBssInfo->prStaRecOfAP != NULL) {
  499. P_STA_RECORD_T prStaRec = prP2pBssInfo->prStaRecOfAP;
  500. prP2pBssInfo->prStaRecOfAP = NULL;
  501. p2pFuncDisconnect(prAdapter, prP2pBssInfo, prStaRec, FALSE,
  502. REASON_CODE_DISASSOC_LEAVING_BSS);
  503. SET_NET_PWR_STATE_IDLE(prAdapter, prP2pBssInfo->ucBssIndex);
  504. /* 20120830 moved into p2pFuncDisconnect() */
  505. /* cnmStaRecFree(prAdapter, prP2pBssInfo->prStaRecOfAP); */
  506. p2pRoleFsmStateTransition(prAdapter, prP2pRoleFsmInfo, P2P_ROLE_STATE_IDLE);
  507. }
  508. }
  509. } while (FALSE);
  510. } /* p2pFsmRunEventBeaconTimeout */
  511. /*================== Message Event ==================*/
  512. VOID p2pRoleFsmRunEventStartAP(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  513. {
  514. P_P2P_ROLE_FSM_INFO_T prP2pRoleFsmInfo = (P_P2P_ROLE_FSM_INFO_T) NULL;
  515. P_MSG_P2P_START_AP_T prP2pStartAPMsg = (P_MSG_P2P_START_AP_T) NULL;
  516. P_P2P_CONNECTION_REQ_INFO_T prP2pConnReqInfo = (P_P2P_CONNECTION_REQ_INFO_T) NULL;
  517. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  518. P_P2P_SPECIFIC_BSS_INFO_T prP2pSpecificBssInfo = (P_P2P_SPECIFIC_BSS_INFO_T) NULL;
  519. do {
  520. ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
  521. DBGLOG(P2P, INFO, "p2pRoleFsmRunEventStartAP\n");
  522. prP2pStartAPMsg = (P_MSG_P2P_START_AP_T) prMsgHdr;
  523. prP2pRoleFsmInfo = P2P_ROLE_INDEX_2_ROLE_FSM_INFO(prAdapter, prP2pStartAPMsg->ucRoleIdx);
  524. if (!prP2pRoleFsmInfo) {
  525. DBGLOG(P2P, ERROR,
  526. "p2pRoleFsmRunEventStartAP: Corresponding P2P Role FSM empty: %d.\n",
  527. prP2pStartAPMsg->ucRoleIdx);
  528. break;
  529. }
  530. prP2pBssInfo = prAdapter->aprBssInfo[prP2pRoleFsmInfo->ucBssIndex];
  531. prP2pSpecificBssInfo = prAdapter->rWifiVar.prP2pSpecificBssInfo;
  532. prP2pConnReqInfo = &(prP2pRoleFsmInfo->rConnReqInfo);
  533. if (prP2pStartAPMsg->u4BcnInterval) {
  534. DBGLOG(P2P, TRACE, "Beacon interval updated to :%ld\n", prP2pStartAPMsg->u4BcnInterval);
  535. prP2pBssInfo->u2BeaconInterval = (UINT_16) prP2pStartAPMsg->u4BcnInterval;
  536. } else if (prP2pBssInfo->u2BeaconInterval == 0) {
  537. prP2pBssInfo->u2BeaconInterval = DOT11_BEACON_PERIOD_DEFAULT;
  538. }
  539. if (prP2pStartAPMsg->u4DtimPeriod) {
  540. DBGLOG(P2P, TRACE, "DTIM interval updated to :%ld\n", prP2pStartAPMsg->u4DtimPeriod);
  541. prP2pBssInfo->ucDTIMPeriod = (UINT_8) prP2pStartAPMsg->u4DtimPeriod;
  542. } else if (prP2pBssInfo->ucDTIMPeriod == 0) {
  543. prP2pBssInfo->ucDTIMPeriod = DOT11_DTIM_PERIOD_DEFAULT;
  544. }
  545. if (prP2pStartAPMsg->u2SsidLen != 0) {
  546. kalMemCopy(prP2pConnReqInfo->rSsidStruct.aucSsid, prP2pStartAPMsg->aucSsid,
  547. prP2pStartAPMsg->u2SsidLen);
  548. prP2pConnReqInfo->rSsidStruct.ucSsidLen =
  549. prP2pSpecificBssInfo->u2GroupSsidLen = prP2pStartAPMsg->u2SsidLen;
  550. kalMemCopy(prP2pSpecificBssInfo->aucGroupSsid, prP2pStartAPMsg->aucSsid,
  551. prP2pStartAPMsg->u2SsidLen);
  552. }
  553. if (p2pFuncIsAPMode(prAdapter->rWifiVar.prP2PConnSettings)) {
  554. prP2pConnReqInfo->eConnRequest = P2P_CONNECTION_TYPE_PURE_AP;
  555. /* Overwrite AP channel */
  556. if (prAdapter->rWifiVar.ucApChannel) {
  557. prP2pConnReqInfo->rChannelInfo.ucChannelNum = prAdapter->rWifiVar.ucApChannel;
  558. if (prAdapter->rWifiVar.ucApChannel <= 14)
  559. prP2pConnReqInfo->rChannelInfo.eBand = BAND_2G4;
  560. else
  561. prP2pConnReqInfo->rChannelInfo.eBand = BAND_5G;
  562. }
  563. } else {
  564. prP2pConnReqInfo->eConnRequest = P2P_CONNECTION_TYPE_GO;
  565. }
  566. prP2pBssInfo->eHiddenSsidType = prP2pStartAPMsg->ucHiddenSsidType;
  567. if ((prP2pBssInfo->eCurrentOPMode != OP_MODE_ACCESS_POINT) ||
  568. (prP2pBssInfo->eIntendOPMode != OP_MODE_NUM)) {
  569. /* 1. No switch to AP mode.
  570. * 2. Not started yet.
  571. */
  572. if (prP2pRoleFsmInfo->eCurrentState != P2P_ROLE_STATE_AP_CHNL_DETECTION &&
  573. prP2pRoleFsmInfo->eCurrentState != P2P_ROLE_STATE_IDLE) {
  574. /* Make sure the state is in IDLE state. */
  575. p2pRoleFsmRunEventAbort(prAdapter, prP2pRoleFsmInfo);
  576. } else if (prP2pRoleFsmInfo->eCurrentState == P2P_ROLE_STATE_AP_CHNL_DETECTION) {
  577. break;
  578. }
  579. /* Leave IDLE state. */
  580. SET_NET_PWR_STATE_ACTIVE(prAdapter, prP2pBssInfo->ucBssIndex);
  581. prP2pBssInfo->eIntendOPMode = OP_MODE_ACCESS_POINT;
  582. if (prP2pRoleFsmInfo->rConnReqInfo.rChannelInfo.ucChannelNum != 0) {
  583. p2pRoleStatePrepare_To_REQING_CHANNEL_STATE(prAdapter,
  584. GET_BSS_INFO_BY_INDEX(prAdapter,
  585. prP2pRoleFsmInfo->ucBssIndex),
  586. &(prP2pRoleFsmInfo->rConnReqInfo),
  587. &(prP2pRoleFsmInfo->rChnlReqInfo));
  588. p2pRoleFsmStateTransition(prAdapter, prP2pRoleFsmInfo, P2P_ROLE_STATE_REQING_CHANNEL);
  589. } else {
  590. /* For AP/GO mode with specific channel or non-specific channel. */
  591. p2pRoleFsmStateTransition(prAdapter,
  592. prP2pRoleFsmInfo, P2P_ROLE_STATE_AP_CHNL_DETECTION);
  593. }
  594. } else {
  595. /* 1. Current OP mode is AP mode.
  596. * 2. && Intentd OP mode is OP_MODE_NUM. (finished start the AP mode)
  597. */
  598. /* AP mode is started, do nothing. */
  599. break;
  600. }
  601. } while (FALSE);
  602. if (prMsgHdr)
  603. cnmMemFree(prAdapter, prMsgHdr);
  604. } /* p2pRoleFsmRunEventStartAP */
  605. VOID p2pRoleFsmRunEventStopAP(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  606. {
  607. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  608. P_MSG_P2P_SWITCH_OP_MODE_T prP2pSwitchMode = (P_MSG_P2P_SWITCH_OP_MODE_T) NULL;
  609. P_P2P_ROLE_FSM_INFO_T prP2pRoleFsmInfo = (P_P2P_ROLE_FSM_INFO_T) NULL;
  610. do {
  611. ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
  612. prP2pSwitchMode = (P_MSG_P2P_SWITCH_OP_MODE_T) prMsgHdr;
  613. prP2pRoleFsmInfo = P2P_ROLE_INDEX_2_ROLE_FSM_INFO(prAdapter, prP2pSwitchMode->ucRoleIdx);
  614. if (!prP2pRoleFsmInfo) {
  615. DBGLOG(P2P, ERROR,
  616. "p2pRoleFsmRunEventStopAP: Corresponding P2P Role FSM empty: %d.\n",
  617. prP2pSwitchMode->ucRoleIdx);
  618. break;
  619. }
  620. prP2pBssInfo = prAdapter->aprBssInfo[prP2pRoleFsmInfo->ucBssIndex];
  621. if (!prP2pBssInfo)
  622. break;
  623. p2pFuncStopGO(prAdapter, prP2pBssInfo);
  624. SET_NET_PWR_STATE_IDLE(prAdapter, prP2pBssInfo->ucBssIndex);
  625. p2pRoleFsmStateTransition(prAdapter, prP2pRoleFsmInfo, P2P_ROLE_STATE_IDLE);
  626. } while (FALSE);
  627. if (prMsgHdr)
  628. cnmMemFree(prAdapter, prMsgHdr);
  629. } /* p2pRoleFsmRunEventStopAP */
  630. VOID p2pRoleFsmRunEventConnectionRequest(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  631. {
  632. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  633. P_P2P_ROLE_FSM_INFO_T prP2pRoleFsmInfo = (P_P2P_ROLE_FSM_INFO_T) NULL;
  634. P_MSG_P2P_CONNECTION_REQUEST_T prP2pConnReqMsg = (P_MSG_P2P_CONNECTION_REQUEST_T) NULL;
  635. P_P2P_CONNECTION_REQ_INFO_T prConnReqInfo = (P_P2P_CONNECTION_REQ_INFO_T) NULL;
  636. P_P2P_CHNL_REQ_INFO_T prChnlReqInfo = (P_P2P_CHNL_REQ_INFO_T) NULL;
  637. P_P2P_JOIN_INFO_T prJoinInfo = (P_P2P_JOIN_INFO_T) NULL;
  638. do {
  639. ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
  640. prP2pConnReqMsg = (P_MSG_P2P_CONNECTION_REQUEST_T) prMsgHdr;
  641. prP2pRoleFsmInfo = P2P_ROLE_INDEX_2_ROLE_FSM_INFO(prAdapter, prP2pConnReqMsg->ucRoleIdx);
  642. if (!prP2pRoleFsmInfo) {
  643. DBGLOG(P2P, ERROR,
  644. "p2pRoleFsmRunEventConnectionRequest: Corresponding P2P Role FSM empty: %d.\n",
  645. prP2pConnReqMsg->ucRoleIdx);
  646. break;
  647. }
  648. prP2pBssInfo = prAdapter->aprBssInfo[prP2pRoleFsmInfo->ucBssIndex];
  649. if (!prP2pBssInfo)
  650. break;
  651. prConnReqInfo = &(prP2pRoleFsmInfo->rConnReqInfo);
  652. prChnlReqInfo = &(prP2pRoleFsmInfo->rChnlReqInfo);
  653. prJoinInfo = &(prP2pRoleFsmInfo->rJoinInfo);
  654. DBGLOG(P2P, TRACE, "p2pFsmRunEventConnectionRequest\n");
  655. if (prP2pBssInfo->eCurrentOPMode != OP_MODE_INFRASTRUCTURE)
  656. break;
  657. SET_NET_PWR_STATE_ACTIVE(prAdapter, prP2pBssInfo->ucBssIndex);
  658. /* Make sure the state is in IDLE state. */
  659. if (prP2pRoleFsmInfo->eCurrentState != P2P_ROLE_STATE_IDLE)
  660. p2pRoleFsmRunEventAbort(prAdapter, prP2pRoleFsmInfo);
  661. /* Update connection request information. */
  662. prConnReqInfo->eConnRequest = P2P_CONNECTION_TYPE_GC;
  663. COPY_MAC_ADDR(prConnReqInfo->aucBssid, prP2pConnReqMsg->aucBssid);
  664. kalMemCopy(&(prConnReqInfo->rSsidStruct), &(prP2pConnReqMsg->rSsid), sizeof(P2P_SSID_STRUCT_T));
  665. kalMemCopy(prConnReqInfo->aucIEBuf, prP2pConnReqMsg->aucIEBuf, prP2pConnReqMsg->u4IELen);
  666. prConnReqInfo->u4BufLength = prP2pConnReqMsg->u4IELen;
  667. /* Find BSS Descriptor first. */
  668. prJoinInfo->prTargetBssDesc = scanP2pSearchDesc(prAdapter, prConnReqInfo);
  669. if (prJoinInfo->prTargetBssDesc == NULL) {
  670. /* Update scan parameter... to scan target device. */
  671. P_P2P_SCAN_REQ_INFO_T prScanReqInfo = &(prP2pRoleFsmInfo->rScanReqInfo);
  672. if (prP2pConnReqMsg->rChannelInfo.ucChannelNum) {
  673. prScanReqInfo->ucNumChannelList = 1;
  674. prScanReqInfo->eScanType = SCAN_TYPE_ACTIVE_SCAN;
  675. prScanReqInfo->eChannelSet = SCAN_CHANNEL_SPECIFIED;
  676. prScanReqInfo->arScanChannelList[0].ucChannelNum =
  677. prP2pConnReqMsg->rChannelInfo.ucChannelNum;
  678. prScanReqInfo->arScanChannelList[0].eBand = prP2pConnReqMsg->rChannelInfo.eBand;
  679. prScanReqInfo->ucSsidNum = 1;
  680. kalMemCopy(&(prScanReqInfo->arSsidStruct[0]), &(prP2pConnReqMsg->rSsid),
  681. sizeof(P2P_SSID_STRUCT_T));
  682. prScanReqInfo->u4BufLength = 0; /* Prevent other P2P ID in IE. */
  683. prScanReqInfo->fgIsAbort = TRUE;
  684. } else {
  685. /* Update scan parameter... to scan target device. */
  686. /* TODO: Need refine. */
  687. prScanReqInfo->ucNumChannelList = 1;
  688. prScanReqInfo->eScanType = SCAN_TYPE_ACTIVE_SCAN;
  689. prScanReqInfo->eChannelSet = SCAN_CHANNEL_FULL;
  690. prScanReqInfo->u4BufLength = 0; /* Prevent other P2P ID in IE. */
  691. prScanReqInfo->fgIsAbort = TRUE;
  692. }
  693. p2pRoleFsmStateTransition(prAdapter, prP2pRoleFsmInfo, P2P_ROLE_STATE_SCAN);
  694. } else {
  695. prChnlReqInfo->u8Cookie = 0;
  696. prChnlReqInfo->ucReqChnlNum = prP2pConnReqMsg->rChannelInfo.ucChannelNum;
  697. prChnlReqInfo->eBand = prP2pConnReqMsg->rChannelInfo.eBand;
  698. prChnlReqInfo->eChnlSco = prP2pConnReqMsg->eChnlSco;
  699. prChnlReqInfo->u4MaxInterval = AIS_JOIN_CH_REQUEST_INTERVAL;
  700. prChnlReqInfo->eChnlReqType = CH_REQ_TYPE_JOIN;
  701. prChnlReqInfo->eChannelWidth = prJoinInfo->prTargetBssDesc->eChannelWidth;
  702. prChnlReqInfo->ucCenterFreqS1 = prJoinInfo->prTargetBssDesc->ucCenterFreqS1;
  703. prChnlReqInfo->ucCenterFreqS2 = prJoinInfo->prTargetBssDesc->ucCenterFreqS2;
  704. p2pRoleFsmStateTransition(prAdapter, prP2pRoleFsmInfo, P2P_ROLE_STATE_REQING_CHANNEL);
  705. }
  706. } while (FALSE);
  707. if (prMsgHdr)
  708. cnmMemFree(prAdapter, prMsgHdr);
  709. return;
  710. } /* p2pRoleFsmRunEventConnectionRequest */
  711. VOID p2pRoleFsmRunEventConnectionAbort(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  712. {
  713. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  714. P_P2P_ROLE_FSM_INFO_T prP2pRoleFsmInfo = (P_P2P_ROLE_FSM_INFO_T) NULL;
  715. P_MSG_P2P_CONNECTION_ABORT_T prDisconnMsg = (P_MSG_P2P_CONNECTION_ABORT_T) NULL;
  716. do {
  717. ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
  718. prDisconnMsg = (P_MSG_P2P_CONNECTION_ABORT_T) prMsgHdr;
  719. prP2pRoleFsmInfo = P2P_ROLE_INDEX_2_ROLE_FSM_INFO(prAdapter, prDisconnMsg->ucRoleIdx);
  720. DBGLOG(P2P, TRACE, "p2pFsmRunEventConnectionAbort: Connection Abort.\n");
  721. if (!prP2pRoleFsmInfo) {
  722. DBGLOG(P2P, ERROR,
  723. "p2pRoleFsmRunEventConnectionAbort: Corresponding P2P Role FSM empty: %d.\n",
  724. prDisconnMsg->ucRoleIdx);
  725. break;
  726. }
  727. prP2pBssInfo = prAdapter->aprBssInfo[prP2pRoleFsmInfo->ucBssIndex];
  728. if (!prP2pBssInfo)
  729. break;
  730. switch (prP2pBssInfo->eCurrentOPMode) {
  731. case OP_MODE_INFRASTRUCTURE:
  732. {
  733. UINT_8 aucBCBSSID[] = BC_BSSID;
  734. if (!prP2pBssInfo->prStaRecOfAP) {
  735. DBGLOG(P2P, TRACE, "GO's StaRec is NULL\n");
  736. break;
  737. }
  738. if (UNEQUAL_MAC_ADDR(prP2pBssInfo->prStaRecOfAP->aucMacAddr, prDisconnMsg->aucTargetID)
  739. && UNEQUAL_MAC_ADDR(prDisconnMsg->aucTargetID, aucBCBSSID)) {
  740. DBGLOG(P2P, TRACE,
  741. "Unequal MAC ADDR [" MACSTR ":" MACSTR "]\n",
  742. MAC2STR(prP2pBssInfo->prStaRecOfAP->aucMacAddr),
  743. MAC2STR(prDisconnMsg->aucTargetID));
  744. break;
  745. }
  746. kalP2PGCIndicateConnectionStatus(prAdapter->prGlueInfo,
  747. prP2pRoleFsmInfo->ucRoleIndex, NULL, NULL, 0, 0,
  748. WLAN_STATUS_MEDIA_DISCONNECT_LOCALLY);
  749. /* Stop rejoin timer if it is started. */
  750. /* TODO: If it has. */
  751. p2pFuncDisconnect(prAdapter, prP2pBssInfo,
  752. prP2pBssInfo->prStaRecOfAP,
  753. prDisconnMsg->fgSendDeauth, prDisconnMsg->u2ReasonCode);
  754. /* prTargetStaRec = prP2pBssInfo->prStaRecOfAP; */
  755. /* Fix possible KE when RX Beacon & call nicPmIndicateBssConnected().
  756. * hit prStaRecOfAP == NULL. */
  757. p2pChangeMediaState(prAdapter, prP2pBssInfo, PARAM_MEDIA_STATE_DISCONNECTED);
  758. prP2pBssInfo->prStaRecOfAP = NULL;
  759. SET_NET_PWR_STATE_IDLE(prAdapter, prP2pBssInfo->ucBssIndex);
  760. p2pRoleFsmStateTransition(prAdapter, prP2pRoleFsmInfo, P2P_ROLE_STATE_IDLE);
  761. }
  762. break;
  763. case OP_MODE_ACCESS_POINT:
  764. {
  765. /* Search specific client device, and disconnect. */
  766. /* 1. Send deauthentication frame. */
  767. /* 2. Indication: Device disconnect. */
  768. P_STA_RECORD_T prCurrStaRec = (P_STA_RECORD_T) NULL;
  769. DBGLOG(P2P, TRACE, "Disconnecting with Target ID: " MACSTR "\n",
  770. MAC2STR(prDisconnMsg->aucTargetID));
  771. prCurrStaRec = bssRemoveClientByMac(prAdapter, prP2pBssInfo, prDisconnMsg->aucTargetID);
  772. if (prCurrStaRec) {
  773. DBGLOG(P2P, TRACE, "Disconnecting: " MACSTR "\n",
  774. MAC2STR(prCurrStaRec->aucMacAddr));
  775. /* Glue layer indication. */
  776. /* kalP2PGOStationUpdate(prAdapter->prGlueInfo, prCurrStaRec, FALSE); */
  777. /* Send deauth & do indication. */
  778. p2pFuncDisconnect(prAdapter, prP2pBssInfo, prCurrStaRec,
  779. prDisconnMsg->fgSendDeauth, prDisconnMsg->u2ReasonCode);
  780. }
  781. #if 0
  782. LINK_FOR_EACH(prLinkEntry, prStaRecOfClientList) {
  783. prCurrStaRec = LINK_ENTRY(prLinkEntry, STA_RECORD_T, rLinkEntry);
  784. ASSERT(prCurrStaRec);
  785. if (EQUAL_MAC_ADDR(prCurrStaRec->aucMacAddr, prDisconnMsg->aucTargetID)) {
  786. DBGLOG(P2P, TRACE,
  787. "Disconnecting: " MACSTR "\n",
  788. MAC2STR(prCurrStaRec->aucMacAddr));
  789. /* Remove STA from client list. */
  790. LINK_REMOVE_KNOWN_ENTRY(prStaRecOfClientList,
  791. &prCurrStaRec->rLinkEntry);
  792. /* Glue layer indication. */
  793. /* kalP2PGOStationUpdate(prAdapter->prGlueInfo, prCurrStaRec, FALSE); */
  794. /* Send deauth & do indication. */
  795. p2pFuncDisconnect(prAdapter, prP2pBssInfo,
  796. prCurrStaRec,
  797. prDisconnMsg->fgSendDeauth,
  798. prDisconnMsg->u2ReasonCode);
  799. /* prTargetStaRec = prCurrStaRec; */
  800. break;
  801. }
  802. }
  803. #endif
  804. }
  805. break;
  806. case OP_MODE_P2P_DEVICE:
  807. default:
  808. ASSERT(FALSE);
  809. break;
  810. }
  811. } while (FALSE);
  812. if (prMsgHdr)
  813. cnmMemFree(prAdapter, prMsgHdr);
  814. return;
  815. } /* p2pRoleFsmRunEventConnectionAbort */
  816. /*----------------------------------------------------------------------------*/
  817. /*!
  818. * \brief This function is called when JOIN complete message event is received from SAA.
  819. *
  820. * \param[in] prAdapter Pointer of ADAPTER_T
  821. *
  822. * \return none
  823. */
  824. /*----------------------------------------------------------------------------*/
  825. VOID p2pRoleFsmRunEventJoinComplete(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  826. {
  827. P_P2P_ROLE_FSM_INFO_T prP2pRoleFsmInfo = (P_P2P_ROLE_FSM_INFO_T) NULL;
  828. P_P2P_JOIN_INFO_T prJoinInfo = (P_P2P_JOIN_INFO_T) NULL;
  829. P_MSG_JOIN_COMP_T prJoinCompMsg = (P_MSG_JOIN_COMP_T) NULL;
  830. P_SW_RFB_T prAssocRspSwRfb = (P_SW_RFB_T) NULL;
  831. P_STA_RECORD_T prStaRec = (P_STA_RECORD_T) NULL;
  832. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  833. do {
  834. ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
  835. prJoinCompMsg = (P_MSG_JOIN_COMP_T) prMsgHdr;
  836. prStaRec = prJoinCompMsg->prStaRec;
  837. prAssocRspSwRfb = prJoinCompMsg->prSwRfb;
  838. DBGLOG(P2P, TRACE, "P2P BSS %d, Join Complete\n", prStaRec->ucBssIndex);
  839. if (prStaRec == NULL) {
  840. ASSERT(FALSE);
  841. break;
  842. } else if (prStaRec->ucBssIndex >= P2P_DEV_BSS_INDEX) {
  843. ASSERT(FALSE);
  844. break;
  845. }
  846. prP2pBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prStaRec->ucBssIndex);
  847. if (prP2pBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE) {
  848. if (prP2pBssInfo->u4PrivateData >= BSS_P2P_NUM)
  849. break;
  850. prP2pRoleFsmInfo = P2P_ROLE_INDEX_2_ROLE_FSM_INFO(prAdapter, prP2pBssInfo->u4PrivateData);
  851. prJoinInfo = &(prP2pRoleFsmInfo->rJoinInfo);
  852. /* Check SEQ NUM */
  853. if (prJoinCompMsg->ucSeqNum == prJoinInfo->ucSeqNumOfReqMsg) {
  854. ASSERT(prStaRec == prJoinInfo->prTargetStaRec);
  855. prJoinInfo->fgIsJoinComplete = TRUE;
  856. if (prJoinCompMsg->rJoinStatus == WLAN_STATUS_SUCCESS) {
  857. /* 4 <1.1> Change FW's Media State immediately. */
  858. p2pChangeMediaState(prAdapter, prP2pBssInfo, PARAM_MEDIA_STATE_CONNECTED);
  859. /* 4 <1.2> Deactivate previous AP's STA_RECORD_T in Driver if have. */
  860. if ((prP2pBssInfo->prStaRecOfAP) && (prP2pBssInfo->prStaRecOfAP != prStaRec)) {
  861. cnmStaRecChangeState(prAdapter,
  862. prP2pBssInfo->prStaRecOfAP, STA_STATE_1);
  863. cnmStaRecFree(prAdapter, prP2pBssInfo->prStaRecOfAP);
  864. prP2pBssInfo->prStaRecOfAP = NULL;
  865. }
  866. /* 4 <1.3> Update BSS_INFO_T */
  867. p2pFuncUpdateBssInfoForJOIN(prAdapter,
  868. prJoinInfo->prTargetBssDesc,
  869. prStaRec, prP2pBssInfo, prAssocRspSwRfb);
  870. /* 4 <1.4> Activate current AP's STA_RECORD_T in Driver. */
  871. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
  872. #if CFG_SUPPORT_P2P_RSSI_QUERY
  873. /* <1.5> Update RSSI if necessary */
  874. nicUpdateRSSI(prAdapter, prP2pBssInfo->ucBssIndex,
  875. (INT_8) (RCPI_TO_dBm(prStaRec->ucRCPI)), 0);
  876. #endif
  877. /* 4 <1.6> Indicate Connected Event to Host immediately. */
  878. /* Require BSSID, Association ID, Beacon Interval.. from AIS_BSS_INFO_T */
  879. /* p2pIndicationOfMediaStateToHost(prAdapter, PARAM_MEDIA_STATE_CONNECTED,
  880. * prStaRec->aucMacAddr); */
  881. if (prJoinInfo->prTargetBssDesc)
  882. scanReportBss2Cfg80211(prAdapter,
  883. OP_MODE_P2P_DEVICE, prJoinInfo->prTargetBssDesc);
  884. kalP2PGCIndicateConnectionStatus(prAdapter->prGlueInfo,
  885. prP2pRoleFsmInfo->ucRoleIndex,
  886. &prP2pRoleFsmInfo->rConnReqInfo,
  887. prJoinInfo->aucIEBuf,
  888. prJoinInfo->u4BufLength,
  889. prStaRec->u2StatusCode,
  890. WLAN_STATUS_MEDIA_CONNECT);
  891. } else {
  892. /* Join Fail */
  893. /* 4 <2.1> Redo JOIN process with other Auth Type if possible */
  894. if (p2pFuncRetryJOIN(prAdapter, prStaRec, prJoinInfo) == FALSE) {
  895. P_BSS_DESC_T prBssDesc;
  896. /* Increase Failure Count */
  897. prStaRec->ucJoinFailureCount++;
  898. prBssDesc = prJoinInfo->prTargetBssDesc;
  899. ASSERT(prBssDesc);
  900. ASSERT(prBssDesc->fgIsConnecting);
  901. prBssDesc->fgIsConnecting = FALSE;
  902. kalP2PGCIndicateConnectionStatus(prAdapter->prGlueInfo,
  903. prP2pRoleFsmInfo->ucRoleIndex,
  904. &prP2pRoleFsmInfo->rConnReqInfo,
  905. prJoinInfo->aucIEBuf,
  906. prJoinInfo->u4BufLength,
  907. prStaRec->u2StatusCode,
  908. WLAN_STATUS_MEDIA_DISCONNECT_LOCALLY);
  909. }
  910. }
  911. }
  912. if (prP2pRoleFsmInfo->eCurrentState == P2P_ROLE_STATE_GC_JOIN) {
  913. /* Return to IDLE state. */
  914. p2pRoleFsmStateTransition(prAdapter, prP2pRoleFsmInfo, P2P_ROLE_STATE_IDLE);
  915. }
  916. } else {
  917. ASSERT(FALSE);
  918. break;
  919. }
  920. } while (FALSE);
  921. if (prAssocRspSwRfb)
  922. nicRxReturnRFB(prAdapter, prAssocRspSwRfb);
  923. if (prMsgHdr)
  924. cnmMemFree(prAdapter, prMsgHdr);
  925. return;
  926. } /* p2pRoleFsmRunEventJoinComplete */
  927. VOID p2pRoleFsmRunEventScanRequest(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  928. {
  929. P_MSG_P2P_SCAN_REQUEST_T prP2pScanReqMsg = (P_MSG_P2P_SCAN_REQUEST_T) NULL;
  930. P_P2P_ROLE_FSM_INFO_T prP2pRoleFsmInfo = (P_P2P_ROLE_FSM_INFO_T) NULL;
  931. P_P2P_SCAN_REQ_INFO_T prScanReqInfo = (P_P2P_SCAN_REQ_INFO_T) NULL;
  932. UINT_32 u4ChnlListSize = 0;
  933. P_P2P_SSID_STRUCT_T prP2pSsidStruct = (P_P2P_SSID_STRUCT_T) NULL;
  934. P_BSS_INFO_T prP2pBssInfo = NULL;
  935. do {
  936. ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
  937. prP2pScanReqMsg = (P_MSG_P2P_SCAN_REQUEST_T) prMsgHdr;
  938. prP2pBssInfo = prAdapter->aprBssInfo[prP2pScanReqMsg->ucBssIdx];
  939. prP2pRoleFsmInfo = P2P_ROLE_INDEX_2_ROLE_FSM_INFO(prAdapter, prP2pBssInfo->u4PrivateData);
  940. if (prP2pRoleFsmInfo == NULL)
  941. break;
  942. prP2pScanReqMsg = (P_MSG_P2P_SCAN_REQUEST_T) prMsgHdr;
  943. prScanReqInfo = &(prP2pRoleFsmInfo->rScanReqInfo);
  944. DBGLOG(P2P, TRACE, "p2pDevFsmRunEventScanRequest\n");
  945. /* Do we need to be in IDLE state? */
  946. /* p2pDevFsmRunEventAbort(prAdapter, prP2pDevFsmInfo); */
  947. ASSERT(prScanReqInfo->fgIsScanRequest == FALSE);
  948. prScanReqInfo->fgIsAbort = TRUE;
  949. prScanReqInfo->eScanType = prP2pScanReqMsg->eScanType;
  950. if (prP2pScanReqMsg->u4NumChannel) {
  951. prScanReqInfo->eChannelSet = SCAN_CHANNEL_SPECIFIED;
  952. /* Channel List */
  953. prScanReqInfo->ucNumChannelList = prP2pScanReqMsg->u4NumChannel;
  954. DBGLOG(P2P, TRACE, "Scan Request Channel List Number: %d\n", prScanReqInfo->ucNumChannelList);
  955. if (prScanReqInfo->ucNumChannelList > MAXIMUM_OPERATION_CHANNEL_LIST) {
  956. DBGLOG(P2P, TRACE,
  957. "Channel List Number Overloaded: %d, change to: %d\n",
  958. prScanReqInfo->ucNumChannelList, MAXIMUM_OPERATION_CHANNEL_LIST);
  959. prScanReqInfo->ucNumChannelList = MAXIMUM_OPERATION_CHANNEL_LIST;
  960. }
  961. u4ChnlListSize = sizeof(RF_CHANNEL_INFO_T) * prScanReqInfo->ucNumChannelList;
  962. kalMemCopy(prScanReqInfo->arScanChannelList,
  963. prP2pScanReqMsg->arChannelListInfo, u4ChnlListSize);
  964. } else {
  965. /* If channel number is ZERO.
  966. * It means do a FULL channel scan.
  967. */
  968. prScanReqInfo->eChannelSet = SCAN_CHANNEL_FULL;
  969. }
  970. /* SSID */
  971. prP2pSsidStruct = prP2pScanReqMsg->prSSID;
  972. for (prScanReqInfo->ucSsidNum = 0;
  973. prScanReqInfo->ucSsidNum < prP2pScanReqMsg->i4SsidNum; prScanReqInfo->ucSsidNum++) {
  974. kalMemCopy(prScanReqInfo->arSsidStruct[prScanReqInfo->ucSsidNum].aucSsid,
  975. prP2pSsidStruct->aucSsid, prP2pSsidStruct->ucSsidLen);
  976. prScanReqInfo->arSsidStruct[prScanReqInfo->ucSsidNum].ucSsidLen = prP2pSsidStruct->ucSsidLen;
  977. prP2pSsidStruct++;
  978. }
  979. /* IE Buffer */
  980. kalMemCopy(prScanReqInfo->aucIEBuf, prP2pScanReqMsg->pucIEBuf, prP2pScanReqMsg->u4IELen);
  981. prScanReqInfo->u4BufLength = prP2pScanReqMsg->u4IELen;
  982. p2pRoleFsmStateTransition(prAdapter, prP2pRoleFsmInfo, P2P_ROLE_STATE_SCAN);
  983. } while (FALSE);
  984. if (prMsgHdr)
  985. cnmMemFree(prAdapter, prMsgHdr);
  986. } /* p2pDevFsmRunEventScanRequest */
  987. VOID
  988. p2pRoleFsmRunEventScanDone(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr, IN P_P2P_ROLE_FSM_INFO_T prP2pRoleFsmInfo)
  989. {
  990. P_MSG_SCN_SCAN_DONE prScanDoneMsg = (P_MSG_SCN_SCAN_DONE) NULL;
  991. P_P2P_SCAN_REQ_INFO_T prScanReqInfo = (P_P2P_SCAN_REQ_INFO_T) NULL;
  992. ENUM_P2P_ROLE_STATE_T eNextState = P2P_ROLE_STATE_NUM;
  993. do {
  994. ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL) && (prP2pRoleFsmInfo != NULL));
  995. DBGLOG(P2P, TRACE, "P2P Role Scan Done Event\n");
  996. prScanReqInfo = &(prP2pRoleFsmInfo->rScanReqInfo);
  997. prScanDoneMsg = (P_MSG_SCN_SCAN_DONE) prMsgHdr;
  998. if (prScanDoneMsg->ucSeqNum != prScanReqInfo->ucSeqNumOfScnMsg) {
  999. /* Scan Done message sequence number mismatch.
  1000. * Ignore this event. (P2P FSM issue two scan events.)
  1001. */
  1002. /* The scan request has been cancelled.
  1003. * Ignore this message. It is possible.
  1004. */
  1005. DBGLOG(P2P, TRACE,
  1006. "P2P Role Scan Don SeqNum Received:%d <-> P2P Role Fsm SCAN Seq Issued:%d\n",
  1007. prScanDoneMsg->ucSeqNum, prScanReqInfo->ucSeqNumOfScnMsg);
  1008. break;
  1009. }
  1010. switch (prP2pRoleFsmInfo->eCurrentState) {
  1011. case P2P_ROLE_STATE_SCAN:
  1012. {
  1013. P_P2P_CONNECTION_REQ_INFO_T prConnReqInfo = &(prP2pRoleFsmInfo->rConnReqInfo);
  1014. P_P2P_JOIN_INFO_T prP2pJoinInfo = &(prP2pRoleFsmInfo->rJoinInfo);
  1015. prScanReqInfo->fgIsAbort = FALSE;
  1016. if (prConnReqInfo->eConnRequest == P2P_CONNECTION_TYPE_GC) {
  1017. prP2pJoinInfo->prTargetBssDesc =
  1018. p2pFuncKeepOnConnection(prAdapter,
  1019. prAdapter->aprBssInfo[prP2pRoleFsmInfo->ucBssIndex],
  1020. prConnReqInfo,
  1021. &prP2pRoleFsmInfo->rChnlReqInfo,
  1022. &prP2pRoleFsmInfo->rScanReqInfo);
  1023. if ((prP2pJoinInfo->prTargetBssDesc) == NULL) {
  1024. eNextState = P2P_ROLE_STATE_SCAN;
  1025. } else {
  1026. /* For GC join. */
  1027. eNextState = P2P_ROLE_STATE_REQING_CHANNEL;
  1028. }
  1029. } else {
  1030. eNextState = P2P_ROLE_STATE_IDLE;
  1031. }
  1032. }
  1033. break;
  1034. case P2P_ROLE_STATE_AP_CHNL_DETECTION:
  1035. eNextState = P2P_ROLE_STATE_REQING_CHANNEL;
  1036. break;
  1037. default:
  1038. /* Unexpected channel scan done event without being chanceled. */
  1039. ASSERT(FALSE);
  1040. break;
  1041. }
  1042. prScanReqInfo->fgIsScanRequest = FALSE;
  1043. p2pRoleFsmStateTransition(prAdapter, prP2pRoleFsmInfo, eNextState);
  1044. } while (FALSE);
  1045. if (prMsgHdr)
  1046. cnmMemFree(prAdapter, prMsgHdr);
  1047. } /* p2pRoleFsmRunEventScanDone */
  1048. VOID
  1049. p2pRoleFsmRunEventChnlGrant(IN P_ADAPTER_T prAdapter,
  1050. IN P_MSG_HDR_T prMsgHdr, IN P_P2P_ROLE_FSM_INFO_T prP2pRoleFsmInfo)
  1051. {
  1052. P_P2P_CHNL_REQ_INFO_T prChnlReqInfo = (P_P2P_CHNL_REQ_INFO_T) NULL;
  1053. P_MSG_CH_GRANT_T prMsgChGrant = (P_MSG_CH_GRANT_T) NULL;
  1054. UINT_8 ucTokenID = 0;
  1055. do {
  1056. ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL) && (prP2pRoleFsmInfo != NULL));
  1057. DBGLOG(P2P, TRACE, "P2P Run Event Role Channel Grant\n");
  1058. prMsgChGrant = (P_MSG_CH_GRANT_T) prMsgHdr;
  1059. ucTokenID = prMsgChGrant->ucTokenID;
  1060. prChnlReqInfo = &(prP2pRoleFsmInfo->rChnlReqInfo);
  1061. if (prChnlReqInfo->u4MaxInterval != prMsgChGrant->u4GrantInterval) {
  1062. DBGLOG(P2P, WARN,
  1063. "P2P Role:%d Request Channel Interval:%d, Grant Interval:%d\n",
  1064. prP2pRoleFsmInfo->ucRoleIndex, prChnlReqInfo->u4MaxInterval,
  1065. prMsgChGrant->u4GrantInterval);
  1066. prChnlReqInfo->u4MaxInterval = prMsgChGrant->u4GrantInterval;
  1067. }
  1068. if (ucTokenID == prChnlReqInfo->ucSeqNumOfChReq) {
  1069. ENUM_P2P_ROLE_STATE_T eNextState = P2P_ROLE_STATE_NUM;
  1070. switch (prP2pRoleFsmInfo->eCurrentState) {
  1071. case P2P_ROLE_STATE_REQING_CHANNEL:
  1072. switch (prChnlReqInfo->eChnlReqType) {
  1073. case CH_REQ_TYPE_JOIN:
  1074. eNextState = P2P_ROLE_STATE_GC_JOIN;
  1075. break;
  1076. case CH_REQ_TYPE_GO_START_BSS:
  1077. eNextState = P2P_ROLE_STATE_IDLE;
  1078. break;
  1079. default:
  1080. DBGLOG(P2P, WARN,
  1081. "p2pRoleFsmRunEventChnlGrant: Invalid Channel Request Type:%d\n",
  1082. prChnlReqInfo->eChnlReqType);
  1083. ASSERT(FALSE);
  1084. break;
  1085. }
  1086. p2pRoleFsmStateTransition(prAdapter, prP2pRoleFsmInfo, eNextState);
  1087. break;
  1088. default:
  1089. /* Channel is granted under unexpected state.
  1090. * Driver should cancel channel privileagea before leaving the states.
  1091. */
  1092. if (IS_BSS_ACTIVE(prAdapter->aprBssInfo[prP2pRoleFsmInfo->ucBssIndex])) {
  1093. DBGLOG(P2P, WARN,
  1094. "p2pRoleFsmRunEventChnlGrant: Invalid CurrentState:%d\n",
  1095. prP2pRoleFsmInfo->eCurrentState);
  1096. ASSERT(FALSE);
  1097. }
  1098. break;
  1099. }
  1100. } else {
  1101. /* Channel requsted, but released. */
  1102. ASSERT(!prChnlReqInfo->fgIsChannelRequested);
  1103. }
  1104. } while (FALSE);
  1105. if (prMsgHdr)
  1106. cnmMemFree(prAdapter, prMsgHdr);
  1107. return;
  1108. } /* p2pRoleFsmRunEventChnlGrant */
  1109. /* ////////////////////////////////////// */
  1110. VOID p2pRoleFsmRunEventDissolve(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  1111. {
  1112. /* TODO: */
  1113. if (prMsgHdr)
  1114. cnmMemFree(prAdapter, prMsgHdr);
  1115. } /* p2pRoleFsmRunEventDissolve */
  1116. /*----------------------------------------------------------------------------*/
  1117. /*!
  1118. * @brief This function will indicate the Event of Successful Completion of AAA Module.
  1119. *
  1120. * @param[in] prAdapter Pointer to the Adapter structure.
  1121. * @param[in] prStaRec Pointer to the STA_RECORD_T
  1122. *
  1123. * @return (none)
  1124. */
  1125. /*----------------------------------------------------------------------------*/
  1126. WLAN_STATUS
  1127. p2pRoleFsmRunEventAAAComplete(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prStaRec, IN P_BSS_INFO_T prP2pBssInfo)
  1128. {
  1129. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  1130. ENUM_PARAM_MEDIA_STATE_T eOriMediaState;
  1131. do {
  1132. ASSERT_BREAK((prAdapter != NULL) && (prStaRec != NULL) && (prP2pBssInfo != NULL));
  1133. eOriMediaState = prP2pBssInfo->eConnectionState;
  1134. bssRemoveClient(prAdapter, prP2pBssInfo, prStaRec);
  1135. #if CFG_SUPPORT_HOTSPOT_WPS_MANAGER
  1136. if (prP2pBssInfo->rStaRecOfClientList.u4NumElem >= P2P_MAXIMUM_CLIENT_COUNT ||
  1137. kalP2PMaxClients(prAdapter->prGlueInfo, prP2pBssInfo->rStaRecOfClientList.u4NumElem)) {
  1138. #else
  1139. if (prP2pBssInfo->rStaRecOfClientList.u4NumElem >= P2P_MAXIMUM_CLIENT_COUNT) {
  1140. #endif
  1141. rStatus = WLAN_STATUS_RESOURCES;
  1142. break;
  1143. }
  1144. bssAddClient(prAdapter, prP2pBssInfo, prStaRec);
  1145. prStaRec->u2AssocId = bssAssignAssocID(prStaRec);
  1146. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_3);
  1147. p2pChangeMediaState(prAdapter, prP2pBssInfo, PARAM_MEDIA_STATE_CONNECTED);
  1148. /* Update Connected state to FW. */
  1149. if (eOriMediaState != prP2pBssInfo->eConnectionState)
  1150. nicUpdateBss(prAdapter, prP2pBssInfo->ucBssIndex);
  1151. } while (FALSE);
  1152. return rStatus;
  1153. } /* p2pRunEventAAAComplete */
  1154. /*----------------------------------------------------------------------------*/
  1155. /*!
  1156. * @brief This function will indicate the Event of Successful Completion of AAA Module.
  1157. *
  1158. * @param[in] prAdapter Pointer to the Adapter structure.
  1159. * @param[in] prStaRec Pointer to the STA_RECORD_T
  1160. *
  1161. * @return (none)
  1162. */
  1163. /*----------------------------------------------------------------------------*/
  1164. WLAN_STATUS
  1165. p2pRoleFsmRunEventAAASuccess(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prStaRec, IN P_BSS_INFO_T prP2pBssInfo)
  1166. {
  1167. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  1168. P_P2P_ROLE_FSM_INFO_T prP2pRoleFsmInfo = (P_P2P_ROLE_FSM_INFO_T) NULL;
  1169. do {
  1170. ASSERT_BREAK((prAdapter != NULL) && (prStaRec != NULL) && (prP2pBssInfo != NULL));
  1171. if ((prP2pBssInfo->eNetworkType != NETWORK_TYPE_P2P) || (prP2pBssInfo->u4PrivateData >= BSS_P2P_NUM)) {
  1172. ASSERT(FALSE);
  1173. rStatus = WLAN_STATUS_INVALID_DATA;
  1174. break;
  1175. }
  1176. ASSERT(prP2pBssInfo->ucBssIndex < P2P_DEV_BSS_INDEX);
  1177. prP2pRoleFsmInfo = P2P_ROLE_INDEX_2_ROLE_FSM_INFO(prAdapter, prP2pBssInfo->u4PrivateData);
  1178. /* Glue layer indication. */
  1179. kalP2PGOStationUpdate(prAdapter->prGlueInfo, prP2pRoleFsmInfo->ucRoleIndex, prStaRec, TRUE);
  1180. } while (FALSE);
  1181. return rStatus;
  1182. } /* p2pRoleFsmRunEventAAASuccess */
  1183. /*----------------------------------------------------------------------------*/
  1184. /*!
  1185. * @brief This function will indicate the Event of Tx Fail of AAA Module.
  1186. *
  1187. * @param[in] prAdapter Pointer to the Adapter structure.
  1188. * @param[in] prStaRec Pointer to the STA_RECORD_T
  1189. *
  1190. * @return (none)
  1191. */
  1192. /*----------------------------------------------------------------------------*/
  1193. VOID p2pRoleFsmRunEventAAATxFail(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prStaRec, IN P_BSS_INFO_T prP2pBssInfo)
  1194. {
  1195. ASSERT(prAdapter);
  1196. ASSERT(prStaRec);
  1197. bssRemoveClient(prAdapter, prP2pBssInfo, prStaRec);
  1198. p2pFuncDisconnect(prAdapter, prP2pBssInfo, prStaRec, FALSE, REASON_CODE_UNSPECIFIED);
  1199. /* 20120830 moved into p2puUncDisconnect. */
  1200. /* cnmStaRecFree(prAdapter, prStaRec); */
  1201. } /* p2pRoleFsmRunEventAAATxFail */
  1202. VOID p2pRoleFsmRunEventSwitchOPMode(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  1203. {
  1204. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  1205. P_MSG_P2P_SWITCH_OP_MODE_T prSwitchOpMode = (P_MSG_P2P_SWITCH_OP_MODE_T) prMsgHdr;
  1206. P_P2P_ROLE_FSM_INFO_T prP2pRoleFsmInfo = (P_P2P_ROLE_FSM_INFO_T) NULL;
  1207. do {
  1208. ASSERT(prSwitchOpMode->ucRoleIdx < BSS_P2P_NUM);
  1209. ASSERT_BREAK((prAdapter != NULL) && (prSwitchOpMode != NULL));
  1210. DBGLOG(P2P, TRACE, "p2pRoleFsmRunEventSwitchOPMode\n");
  1211. prP2pRoleFsmInfo = prAdapter->rWifiVar.aprP2pRoleFsmInfo[prSwitchOpMode->ucRoleIdx];
  1212. ASSERT(prP2pRoleFsmInfo->ucBssIndex < P2P_DEV_BSS_INDEX);
  1213. prP2pBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prP2pRoleFsmInfo->ucBssIndex);
  1214. if (prSwitchOpMode->eOpMode >= OP_MODE_NUM) {
  1215. ASSERT(FALSE);
  1216. break;
  1217. }
  1218. /* P2P Device / GC. */
  1219. p2pFuncSwitchOPMode(prAdapter, prP2pBssInfo, prSwitchOpMode->eOpMode, TRUE);
  1220. } while (FALSE);
  1221. if (prMsgHdr)
  1222. cnmMemFree(prAdapter, prMsgHdr);
  1223. } /* p2pRoleFsmRunEventSwitchOPMode */
  1224. /* /////////////////////////////// TO BE REFINE //////////////////////////////// */
  1225. VOID p2pFsmRunEventBeaconUpdate(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  1226. {
  1227. P_P2P_ROLE_FSM_INFO_T prRoleP2pFsmInfo = (P_P2P_ROLE_FSM_INFO_T) NULL;
  1228. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  1229. P_MSG_P2P_BEACON_UPDATE_T prBcnUpdateMsg = (P_MSG_P2P_BEACON_UPDATE_T) NULL;
  1230. P_P2P_BEACON_UPDATE_INFO_T prBcnUpdateInfo = (P_P2P_BEACON_UPDATE_INFO_T) NULL;
  1231. do {
  1232. ASSERT_BREAK((prAdapter != NULL) && (prMsgHdr != NULL));
  1233. DBGLOG(P2P, TRACE, "p2pFsmRunEventBeaconUpdate\n");
  1234. prBcnUpdateMsg = (P_MSG_P2P_BEACON_UPDATE_T) prMsgHdr;
  1235. prRoleP2pFsmInfo = P2P_ROLE_INDEX_2_ROLE_FSM_INFO(prAdapter, prBcnUpdateMsg->ucRoleIndex);
  1236. prP2pBssInfo = GET_BSS_INFO_BY_INDEX(prAdapter, prRoleP2pFsmInfo->ucBssIndex);
  1237. prBcnUpdateInfo = &(prRoleP2pFsmInfo->rBeaconUpdateInfo);
  1238. p2pFuncBeaconUpdate(prAdapter,
  1239. prP2pBssInfo,
  1240. prBcnUpdateInfo,
  1241. prBcnUpdateMsg->pucBcnHdr,
  1242. prBcnUpdateMsg->u4BcnHdrLen,
  1243. prBcnUpdateMsg->pucBcnBody, prBcnUpdateMsg->u4BcnBodyLen);
  1244. if ((prP2pBssInfo->eCurrentOPMode == OP_MODE_ACCESS_POINT) &&
  1245. (prP2pBssInfo->eIntendOPMode == OP_MODE_NUM)) {
  1246. /* AP is created, Beacon Update. */
  1247. /* nicPmIndicateBssAbort(prAdapter, NETWORK_TYPE_P2P_INDEX); */
  1248. bssUpdateBeaconContent(prAdapter, prRoleP2pFsmInfo->ucBssIndex);
  1249. /* nicPmIndicateBssCreated(prAdapter, NETWORK_TYPE_P2P_INDEX); */
  1250. }
  1251. } while (FALSE);
  1252. if (prMsgHdr)
  1253. cnmMemFree(prAdapter, prMsgHdr);
  1254. } /* p2pFsmRunEventBeaconUpdate */
  1255. VOID
  1256. p2pProcessEvent_UpdateNOAParam(IN P_ADAPTER_T prAdapter,
  1257. IN UINT_8 ucBssIdx, IN P_EVENT_UPDATE_NOA_PARAMS_T prEventUpdateNoaParam)
  1258. {
  1259. P_P2P_SPECIFIC_BSS_INFO_T prP2pSpecificBssInfo;
  1260. UINT_32 i;
  1261. BOOLEAN fgNoaAttrExisted = FALSE;
  1262. prP2pSpecificBssInfo = prAdapter->rWifiVar.prP2pSpecificBssInfo;
  1263. prP2pSpecificBssInfo->fgEnableOppPS = prEventUpdateNoaParam->ucEnableOppPS;
  1264. prP2pSpecificBssInfo->u2CTWindow = prEventUpdateNoaParam->u2CTWindow;
  1265. prP2pSpecificBssInfo->ucNoAIndex = prEventUpdateNoaParam->ucNoAIndex;
  1266. prP2pSpecificBssInfo->ucNoATimingCount = prEventUpdateNoaParam->ucNoATimingCount;
  1267. fgNoaAttrExisted |= prP2pSpecificBssInfo->fgEnableOppPS;
  1268. ASSERT(prP2pSpecificBssInfo->ucNoATimingCount <= P2P_MAXIMUM_NOA_COUNT);
  1269. for (i = 0; i < prP2pSpecificBssInfo->ucNoATimingCount; i++) {
  1270. /* in used */
  1271. prP2pSpecificBssInfo->arNoATiming[i].fgIsInUse = prEventUpdateNoaParam->arEventNoaTiming[i].ucIsInUse;
  1272. /* count */
  1273. prP2pSpecificBssInfo->arNoATiming[i].ucCount = prEventUpdateNoaParam->arEventNoaTiming[i].ucCount;
  1274. /* duration */
  1275. prP2pSpecificBssInfo->arNoATiming[i].u4Duration = prEventUpdateNoaParam->arEventNoaTiming[i].u4Duration;
  1276. /* interval */
  1277. prP2pSpecificBssInfo->arNoATiming[i].u4Interval = prEventUpdateNoaParam->arEventNoaTiming[i].u4Interval;
  1278. /* start time */
  1279. prP2pSpecificBssInfo->arNoATiming[i].u4StartTime =
  1280. prEventUpdateNoaParam->arEventNoaTiming[i].u4StartTime;
  1281. fgNoaAttrExisted |= prP2pSpecificBssInfo->arNoATiming[i].fgIsInUse;
  1282. }
  1283. prP2pSpecificBssInfo->fgIsNoaAttrExisted = fgNoaAttrExisted;
  1284. /* update beacon content by the change */
  1285. bssUpdateBeaconContent(prAdapter, ucBssIdx);
  1286. } /* p2pProcessEvent_UpdateNOAParam */