saa_fsm.c 55 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788
  1. /*
  2. ** Id: //Department/DaVinci/BRANCHES/MT6620_WIFI_DRIVER_V2_3/mgmt/saa_fsm.c#2
  3. */
  4. /*! \file "saa_fsm.c"
  5. \brief This file defines the FSM for SAA MODULE.
  6. This file defines the FSM for SAA MODULE.
  7. */
  8. /*
  9. ** Log: saa_fsm.c
  10. **
  11. ** 09 04 2013 cp.wu
  12. ** fix typo
  13. **
  14. ** 09 03 2013 cp.wu
  15. ** add path for reassociation
  16. *
  17. * 07 17 2012 yuche.tsai
  18. * NULL
  19. * Compile no error before trial run.
  20. *
  21. * 04 20 2012 cp.wu
  22. * [WCXRP00000913] [MT6620 Wi-Fi] create repository of source code dedicated for MT6620 E6 ASIC
  23. * correct macro
  24. *
  25. * 11 24 2011 wh.su
  26. * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
  27. * Adjust code for DBG and CONFIG_XLOG.
  28. *
  29. * 11 11 2011 wh.su
  30. * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
  31. * modify the xlog related code.
  32. *
  33. * 11 04 2011 cp.wu
  34. * [WCXRP00001086] [MT6620 Wi-Fi][Driver] On Android, indicate an extra DISCONNECT
  35. * for REASSOCIATED cases as an explicit trigger for Android framework
  36. * 1. for DEAUTH/DISASSOC cases, indicate for DISCONNECTION immediately.
  37. * 2. (Android only) when reassociation-and-non-roaming cases happened,
  38. * indicate an extra DISCONNECT indication to Android Wi-Fi framework
  39. *
  40. * 11 02 2011 wh.su
  41. * [WCXRP00001078] [MT6620 Wi-Fi][Driver] Adding the mediatek log improment support : XLOG
  42. * adding the code for XLOG.
  43. *
  44. * 09 30 2011 cm.chang
  45. * [WCXRP00001020] [MT6620 Wi-Fi][Driver] Handle secondary channel offset of AP in 5GHz band
  46. * Add debug message about 40MHz bandwidth allowed
  47. *
  48. * 05 12 2011 cp.wu
  49. * [WCXRP00000720] [MT6620 Wi-Fi][Driver] Do not do any further operation in case STA-REC
  50. * has been invalidated before SAA-FSM starts to roll
  51. * check for valid STA-REC before SAA-FSM starts to roll.
  52. *
  53. * 04 21 2011 terry.wu
  54. * [WCXRP00000674] [MT6620 Wi-Fi][Driver] Refine AAA authSendAuthFrame
  55. * Add network type parameter to authSendAuthFrame.
  56. *
  57. * 04 15 2011 chinghwa.yu
  58. * [WCXRP00000065] Update BoW design and settings
  59. * Add BOW short range mode.
  60. *
  61. * 04 14 2011 cm.chang
  62. * [WCXRP00000634] [MT6620 Wi-Fi][Driver][FW] 2nd BSS will not support 40MHz bandwidth for concurrency
  63. * .
  64. *
  65. * 03 31 2011 puff.wen
  66. * NULL
  67. * .
  68. *
  69. * 02 10 2011 yuche.tsai
  70. * [WCXRP00000431] [Volunteer Patch][MT6620][Driver] Add MLME support for deauthentication under AP(Hot-Spot) mode.
  71. * Add RX deauthentication & disassociation process under Hot-Spot mode.
  72. *
  73. * 01 26 2011 yuche.tsai
  74. * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
  75. * .
  76. *
  77. * 01 25 2011 yuche.tsai
  78. * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
  79. * Fix compile error of after Station Type Macro modification.
  80. *
  81. * 01 25 2011 yuche.tsai
  82. * [WCXRP00000388] [Volunteer Patch][MT6620][Driver/Fw] change Station Type in station record.
  83. * Change Station Type in Station Record, Modify MACRO definition for getting station type & network type index & Role.
  84. *
  85. * 11 29 2010 cp.wu
  86. * [WCXRP00000210] [MT6620 Wi-Fi][Driver][FW] Set RCPI value in STA_REC
  87. * for initial TX rate selection of auto-rate algorithm
  88. * update ucRcpi of STA_RECORD_T for AIS when
  89. * 1) Beacons for IBSS merge is received
  90. * 2) Associate Response for a connecting peer is received
  91. *
  92. * 10 18 2010 cp.wu
  93. * [WCXRP00000053] [MT6620 Wi-Fi][Driver] Reset incomplete
  94. * and might leads to BSOD when entering RF test with AIS associated
  95. * 1. remove redundant variables in STA_REC structure
  96. * 2. add STA-REC uninitialization routine for clearing pending events
  97. *
  98. * 09 03 2010 kevin.huang
  99. * NULL
  100. * Refine #include sequence and solve recursive/nested #include issue
  101. *
  102. * 08 30 2010 cp.wu
  103. * NULL
  104. * eliminate klockwork errors
  105. *
  106. * 08 24 2010 chinghwa.yu
  107. * NULL
  108. * Update for MID_SCN_BOW_SCAN_DONE mboxDummy.
  109. * Update saa_fsm for BOW.
  110. *
  111. * 08 16 2010 cp.wu
  112. * NULL
  113. * Replace CFG_SUPPORT_BOW by CFG_ENABLE_BT_OVER_WIFI.
  114. * There is no CFG_SUPPORT_BOW in driver domain source.
  115. *
  116. * 08 02 2010 yuche.tsai
  117. * NULL
  118. * Add support for P2P join event start.
  119. *
  120. * 07 12 2010 cp.wu
  121. *
  122. * SAA will take a record for tracking request sequence number.
  123. *
  124. * 07 08 2010 cp.wu
  125. *
  126. * [WPD00003833] [MT6620 and MT5931] Driver migration - move to new repository.
  127. *
  128. * 07 01 2010 cp.wu
  129. * [WPD00003833][MT6620 and MT5931] Driver migration
  130. * AIS-FSM integration with CNM channel request messages
  131. *
  132. * 06 23 2010 cp.wu
  133. * [WPD00003833][MT6620 and MT5931] Driver migration
  134. * sync. with main branch for resetting to state 1 when associating with another AP
  135. *
  136. * 06 21 2010 cp.wu
  137. * [WPD00003833][MT6620 and MT5931] Driver migration
  138. * refine TX-DONE callback.
  139. *
  140. * 06 21 2010 wh.su
  141. * [WPD00003840][MT6620 5931] Security migration
  142. * remove duplicate variable for migration.
  143. *
  144. * 06 18 2010 cm.chang
  145. * [WPD00003841][LITE Driver] Migrate RLM/CNM to host driver
  146. * Provide cnmMgtPktAlloc() and alloc/free function of msg/buf
  147. *
  148. * 06 18 2010 wh.su
  149. * [WPD00003840][MT6620 5931] Security migration
  150. * migration the security related function from firmware.
  151. *
  152. * 06 17 2010 yuche.tsai
  153. * [WPD00003839][MT6620 5931][P2P] Feature migration
  154. * Fix compile error when enable WiFi Direct function.
  155. *
  156. * 06 14 2010 cp.wu
  157. * [WPD00003833][MT6620 and MT5931] Driver migration
  158. * saa_fsm.c is migrated.
  159. *
  160. * 05 12 2010 kevin.huang
  161. * [BORA00000794][WIFISYS][New Feature]Power Management Support
  162. * Add Power Management - Legacy PS-POLL support.
  163. *
  164. * 04 24 2010 cm.chang
  165. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  166. * g_aprBssInfo[] depends on CFG_SUPPORT_P2P and CFG_SUPPORT_BOW
  167. *
  168. * 04 19 2010 kevin.huang
  169. * [BORA00000714][WIFISYS][New Feature]Beacon Timeout Support
  170. *
  171. * * * Add Connection Policy - Any and Rx Burst Deauth Support for WHQL
  172. *
  173. * 03 10 2010 kevin.huang
  174. * [BORA00000654][WIFISYS][New Feature] CNM Module - Ch Manager Support
  175. * Add Channel Manager for arbitration of JOIN and SCAN Req
  176. *
  177. * 02 26 2010 kevin.huang
  178. * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
  179. * Add support of Driver STA_RECORD_T activation
  180. *
  181. * 02 04 2010 kevin.huang
  182. * [BORA00000603][WIFISYS] [New Feature] AAA Module Support
  183. * Add AAA Module Support, Revise Net Type to Net Type Index for array lookup
  184. *
  185. * 01 27 2010 wh.su
  186. * [BORA00000476][Wi-Fi][firmware] Add the security module initialize code
  187. * add and fixed some security function.
  188. *
  189. * 01 12 2010 kevin.huang
  190. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  191. * Fix compile warning due to declared but not used
  192. *
  193. * 01 11 2010 kevin.huang
  194. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  195. * Add Deauth and Disassoc Handler
  196. *
  197. * 01 08 2010 kevin.huang
  198. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  199. * Refine Debug Label
  200. *
  201. * 12 18 2009 cm.chang
  202. * [BORA00000018]Integrate WIFI part into BORA for the 1st time
  203. * .
  204. *
  205. * Dec 3 2009 mtk01461
  206. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  207. * Update comment
  208. *
  209. * Dec 1 2009 mtk01088
  210. * [BORA00000476] [Wi-Fi][firmware] Add the security module initialize code
  211. * rename the function
  212. *
  213. * Nov 24 2009 mtk01461
  214. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  215. * Revise MGMT Handler with Retain Status
  216. *
  217. * Nov 23 2009 mtk01461
  218. * [BORA00000018] Integrate WIFI part into BORA for the 1st time
  219. *
  220. */
  221. /*******************************************************************************
  222. * C O M P I L E R F L A G S
  223. ********************************************************************************
  224. */
  225. /*******************************************************************************
  226. * E X T E R N A L R E F E R E N C E S
  227. ********************************************************************************
  228. */
  229. #include "precomp.h"
  230. /*******************************************************************************
  231. * C O N S T A N T S
  232. ********************************************************************************
  233. */
  234. /*******************************************************************************
  235. * D A T A T Y P E S
  236. ********************************************************************************
  237. */
  238. /*******************************************************************************
  239. * P U B L I C D A T A
  240. ********************************************************************************
  241. */
  242. /*******************************************************************************
  243. * P R I V A T E D A T A
  244. ********************************************************************************
  245. */
  246. #if DBG
  247. /*lint -save -e64 Type mismatch */
  248. static PUINT_8 apucDebugAAState[AA_STATE_NUM] = {
  249. (PUINT_8) DISP_STRING("AA_STATE_IDLE"),
  250. (PUINT_8) DISP_STRING("SAA_STATE_SEND_AUTH1"),
  251. (PUINT_8) DISP_STRING("SAA_STATE_WAIT_AUTH2"),
  252. (PUINT_8) DISP_STRING("SAA_STATE_SEND_AUTH3"),
  253. (PUINT_8) DISP_STRING("SAA_STATE_WAIT_AUTH4"),
  254. (PUINT_8) DISP_STRING("SAA_STATE_SEND_ASSOC1"),
  255. (PUINT_8) DISP_STRING("SAA_STATE_WAIT_ASSOC2"),
  256. (PUINT_8) DISP_STRING("AAA_STATE_SEND_AUTH2"),
  257. (PUINT_8) DISP_STRING("AAA_STATE_SEND_AUTH4"),
  258. (PUINT_8) DISP_STRING("AAA_STATE_SEND_ASSOC2"),
  259. (PUINT_8) DISP_STRING("AA_STATE_RESOURCE")
  260. };
  261. /*lint -restore */
  262. #endif /* DBG */
  263. /*******************************************************************************
  264. * M A C R O S
  265. ********************************************************************************
  266. */
  267. /*******************************************************************************
  268. * F U N C T I O N D E C L A R A T I O N S
  269. ********************************************************************************
  270. */
  271. /*******************************************************************************
  272. * F U N C T I O N S
  273. ********************************************************************************
  274. */
  275. /*----------------------------------------------------------------------------*/
  276. /*!
  277. * @brief The Core FSM engine of SAA Module.
  278. *
  279. * @param[in] prStaRec Pointer to the STA_RECORD_T
  280. * @param[in] eNextState The value of Next State
  281. * @param[in] prRetainedSwRfb Pointer to the retained SW_RFB_T for JOIN Success
  282. *
  283. * @return (none)
  284. */
  285. /*----------------------------------------------------------------------------*/
  286. VOID
  287. saaFsmSteps(IN P_ADAPTER_T prAdapter,
  288. IN P_STA_RECORD_T prStaRec, IN ENUM_AA_STATE_T eNextState, IN P_SW_RFB_T prRetainedSwRfb)
  289. {
  290. ENUM_AA_STATE_T ePreviousState;
  291. BOOLEAN fgIsTransition;
  292. ASSERT(prStaRec);
  293. if (!prStaRec) {
  294. return;
  295. }
  296. do {
  297. #if DBG
  298. DBGLOG(SAA, STATE, "TRANSITION: [%s] -> [%s]\n",
  299. apucDebugAAState[prStaRec->eAuthAssocState], apucDebugAAState[eNextState]);
  300. #else
  301. DBGLOG(SAA, STATE, "[%d] TRANSITION: [%d] -> [%d]\n",
  302. DBG_SAA_IDX, prStaRec->eAuthAssocState, eNextState);
  303. #endif
  304. ePreviousState = prStaRec->eAuthAssocState;
  305. /* NOTE(Kevin): This is the only place to change the eAuthAssocState(except initial) */
  306. prStaRec->eAuthAssocState = eNextState;
  307. fgIsTransition = (BOOLEAN) FALSE;
  308. switch (prStaRec->eAuthAssocState) {
  309. case AA_STATE_IDLE:
  310. if (ePreviousState != prStaRec->eAuthAssocState) { /* Only trigger this event once */
  311. if (prRetainedSwRfb) {
  312. if (saaFsmSendEventJoinComplete(prAdapter,
  313. WLAN_STATUS_SUCCESS,
  314. prStaRec,
  315. prRetainedSwRfb) == WLAN_STATUS_SUCCESS) {
  316. /* Do nothing */
  317. } else {
  318. eNextState = AA_STATE_RESOURCE;
  319. fgIsTransition = TRUE;
  320. }
  321. } else {
  322. if (saaFsmSendEventJoinComplete(prAdapter,
  323. WLAN_STATUS_FAILURE,
  324. prStaRec,
  325. NULL) == WLAN_STATUS_RESOURCES) {
  326. eNextState = AA_STATE_RESOURCE;
  327. fgIsTransition = TRUE;
  328. }
  329. }
  330. }
  331. /* Free allocated TCM memory */
  332. if (prStaRec->prChallengeText) {
  333. cnmMemFree(prAdapter, prStaRec->prChallengeText);
  334. prStaRec->prChallengeText = (P_IE_CHALLENGE_TEXT_T) NULL;
  335. }
  336. break;
  337. case SAA_STATE_SEND_AUTH1:
  338. {
  339. /* Do tasks in INIT STATE */
  340. if (prStaRec->ucTxAuthAssocRetryCount >= prStaRec->ucTxAuthAssocRetryLimit) {
  341. /* Record the Status Code of Authentication Request */
  342. prStaRec->u2StatusCode = STATUS_CODE_AUTH_TIMEOUT;
  343. eNextState = AA_STATE_IDLE;
  344. fgIsTransition = TRUE;
  345. } else {
  346. prStaRec->ucTxAuthAssocRetryCount++;
  347. /* Update Station Record - Class 1 Flag */
  348. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
  349. #if !CFG_SUPPORT_AAA
  350. if (authSendAuthFrame(prAdapter,
  351. prStaRec, AUTH_TRANSACTION_SEQ_1) != WLAN_STATUS_SUCCESS) {
  352. #else
  353. if (authSendAuthFrame(prAdapter,
  354. prStaRec,
  355. prStaRec->ucNetTypeIndex,
  356. NULL,
  357. AUTH_TRANSACTION_SEQ_1,
  358. STATUS_CODE_RESERVED) != WLAN_STATUS_SUCCESS) {
  359. #endif /* CFG_SUPPORT_AAA */
  360. cnmTimerInitTimer(prAdapter,
  361. &prStaRec->rTxReqDoneOrRxRespTimer,
  362. (PFN_MGMT_TIMEOUT_FUNC) saaFsmRunEventTxReqTimeOut,
  363. (ULONG) prStaRec);
  364. cnmTimerStartTimer(prAdapter,
  365. &prStaRec->rTxReqDoneOrRxRespTimer,
  366. TU_TO_MSEC(TX_AUTHENTICATION_RETRY_TIMEOUT_TU));
  367. }
  368. }
  369. }
  370. break;
  371. case SAA_STATE_WAIT_AUTH2:
  372. break;
  373. case SAA_STATE_SEND_AUTH3:
  374. {
  375. /* Do tasks in INIT STATE */
  376. if (prStaRec->ucTxAuthAssocRetryCount >= prStaRec->ucTxAuthAssocRetryLimit) {
  377. /* Record the Status Code of Authentication Request */
  378. prStaRec->u2StatusCode = STATUS_CODE_AUTH_TIMEOUT;
  379. eNextState = AA_STATE_IDLE;
  380. fgIsTransition = TRUE;
  381. } else {
  382. prStaRec->ucTxAuthAssocRetryCount++;
  383. #if !CFG_SUPPORT_AAA
  384. if (authSendAuthFrame(prAdapter,
  385. prStaRec, AUTH_TRANSACTION_SEQ_3) != WLAN_STATUS_SUCCESS) {
  386. #else
  387. if (authSendAuthFrame(prAdapter,
  388. prStaRec,
  389. prStaRec->ucNetTypeIndex,
  390. NULL,
  391. AUTH_TRANSACTION_SEQ_3,
  392. STATUS_CODE_RESERVED) != WLAN_STATUS_SUCCESS) {
  393. #endif /* CFG_SUPPORT_AAA */
  394. cnmTimerInitTimer(prAdapter,
  395. &prStaRec->rTxReqDoneOrRxRespTimer,
  396. (PFN_MGMT_TIMEOUT_FUNC) saaFsmRunEventTxReqTimeOut,
  397. (ULONG) prStaRec);
  398. cnmTimerStartTimer(prAdapter,
  399. &prStaRec->rTxReqDoneOrRxRespTimer,
  400. TU_TO_MSEC(TX_AUTHENTICATION_RETRY_TIMEOUT_TU));
  401. }
  402. }
  403. }
  404. break;
  405. case SAA_STATE_WAIT_AUTH4:
  406. break;
  407. case SAA_STATE_SEND_ASSOC1:
  408. /* Do tasks in INIT STATE */
  409. if (prStaRec->ucTxAuthAssocRetryCount >= prStaRec->ucTxAuthAssocRetryLimit) {
  410. /* Record the Status Code of Authentication Request */
  411. prStaRec->u2StatusCode = STATUS_CODE_ASSOC_TIMEOUT;
  412. eNextState = AA_STATE_IDLE;
  413. fgIsTransition = TRUE;
  414. } else {
  415. prStaRec->ucTxAuthAssocRetryCount++;
  416. if (assocSendReAssocReqFrame(prAdapter, prStaRec) != WLAN_STATUS_SUCCESS) {
  417. cnmTimerInitTimer(prAdapter,
  418. &prStaRec->rTxReqDoneOrRxRespTimer,
  419. (PFN_MGMT_TIMEOUT_FUNC) saaFsmRunEventTxReqTimeOut,
  420. (ULONG) prStaRec);
  421. cnmTimerStartTimer(prAdapter,
  422. &prStaRec->rTxReqDoneOrRxRespTimer,
  423. TU_TO_MSEC(TX_ASSOCIATION_RETRY_TIMEOUT_TU));
  424. }
  425. }
  426. break;
  427. case SAA_STATE_WAIT_ASSOC2:
  428. break;
  429. case AA_STATE_RESOURCE:
  430. /* TODO(Kevin) Can setup a timer and send message later */
  431. break;
  432. default:
  433. DBGLOG(SAA, ERROR, "Unknown AA STATE\n");
  434. ASSERT(0);
  435. break;
  436. }
  437. } while (fgIsTransition);
  438. return;
  439. } /* end of saaFsmSteps() */
  440. /*----------------------------------------------------------------------------*/
  441. /*!
  442. * @brief This function will send Event to AIS/BOW/P2P
  443. *
  444. * @param[in] rJoinStatus To indicate JOIN success or failure.
  445. * @param[in] prStaRec Pointer to the STA_RECORD_T
  446. * @param[in] prSwRfb Pointer to the SW_RFB_T
  447. * @return (none)
  448. */
  449. /*----------------------------------------------------------------------------*/
  450. WLAN_STATUS
  451. saaFsmSendEventJoinComplete(IN P_ADAPTER_T prAdapter,
  452. IN WLAN_STATUS rJoinStatus, IN P_STA_RECORD_T prStaRec, IN P_SW_RFB_T prSwRfb)
  453. {
  454. P_BSS_INFO_T prBssInfo;
  455. ASSERT(prStaRec);
  456. if (!prStaRec)
  457. return WLAN_STATUS_INVALID_PACKET;
  458. /* Store limitation about 40Mhz bandwidth capability during association */
  459. if (prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM) {
  460. prBssInfo = &prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex];
  461. if (rJoinStatus == WLAN_STATUS_SUCCESS)
  462. prBssInfo->fg40mBwAllowed = prBssInfo->fgAssoc40mBwAllowed;
  463. prBssInfo->fgAssoc40mBwAllowed = FALSE;
  464. }
  465. if (prStaRec->ucNetTypeIndex == NETWORK_TYPE_AIS_INDEX) {
  466. P_MSG_SAA_FSM_COMP_T prSaaFsmCompMsg;
  467. prSaaFsmCompMsg = cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SAA_FSM_COMP_T));
  468. if (!prSaaFsmCompMsg)
  469. return WLAN_STATUS_RESOURCES;
  470. prSaaFsmCompMsg->rMsgHdr.eMsgId = MID_SAA_AIS_JOIN_COMPLETE;
  471. prSaaFsmCompMsg->ucSeqNum = prStaRec->ucAuthAssocReqSeqNum;
  472. prSaaFsmCompMsg->rJoinStatus = rJoinStatus;
  473. prSaaFsmCompMsg->prStaRec = prStaRec;
  474. prSaaFsmCompMsg->prSwRfb = prSwRfb;
  475. /* NOTE(Kevin): Set to UNBUF for immediately JOIN complete */
  476. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prSaaFsmCompMsg, MSG_SEND_METHOD_UNBUF);
  477. return WLAN_STATUS_SUCCESS;
  478. }
  479. #if CFG_ENABLE_WIFI_DIRECT
  480. else if ((prAdapter->fgIsP2PRegistered) && (IS_STA_IN_P2P(prStaRec))) {
  481. P_MSG_SAA_FSM_COMP_T prSaaFsmCompMsg;
  482. prSaaFsmCompMsg = cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SAA_FSM_COMP_T));
  483. if (!prSaaFsmCompMsg)
  484. return WLAN_STATUS_RESOURCES;
  485. prSaaFsmCompMsg->rMsgHdr.eMsgId = MID_SAA_P2P_JOIN_COMPLETE;
  486. prSaaFsmCompMsg->ucSeqNum = prStaRec->ucAuthAssocReqSeqNum;
  487. prSaaFsmCompMsg->rJoinStatus = rJoinStatus;
  488. prSaaFsmCompMsg->prStaRec = prStaRec;
  489. prSaaFsmCompMsg->prSwRfb = prSwRfb;
  490. /* NOTE(Kevin): Set to UNBUF for immediately JOIN complete */
  491. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prSaaFsmCompMsg, MSG_SEND_METHOD_UNBUF);
  492. return WLAN_STATUS_SUCCESS;
  493. }
  494. #endif
  495. #if CFG_ENABLE_BT_OVER_WIFI
  496. else if (prStaRec->ucNetTypeIndex == NETWORK_TYPE_BOW_INDEX) {
  497. /* @TODO: BOW handler */
  498. P_MSG_SAA_FSM_COMP_T prSaaFsmCompMsg;
  499. prSaaFsmCompMsg = cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_SAA_FSM_COMP_T));
  500. if (!prSaaFsmCompMsg)
  501. return WLAN_STATUS_RESOURCES;
  502. prSaaFsmCompMsg->rMsgHdr.eMsgId = MID_SAA_BOW_JOIN_COMPLETE;
  503. prSaaFsmCompMsg->ucSeqNum = prStaRec->ucAuthAssocReqSeqNum;
  504. prSaaFsmCompMsg->rJoinStatus = rJoinStatus;
  505. prSaaFsmCompMsg->prStaRec = prStaRec;
  506. prSaaFsmCompMsg->prSwRfb = prSwRfb;
  507. /* NOTE(Kevin): Set to UNBUF for immediately JOIN complete */
  508. mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prSaaFsmCompMsg, MSG_SEND_METHOD_UNBUF);
  509. return WLAN_STATUS_SUCCESS;
  510. }
  511. #endif
  512. else {
  513. ASSERT(0);
  514. return WLAN_STATUS_FAILURE;
  515. }
  516. } /* end of saaFsmSendEventJoinComplete() */
  517. /*----------------------------------------------------------------------------*/
  518. /*!
  519. * @brief This function will handle the Start Event to SAA FSM.
  520. *
  521. * @param[in] prMsgHdr Message of Join Request for a particular STA.
  522. *
  523. * @return (none)
  524. */
  525. /*----------------------------------------------------------------------------*/
  526. VOID saaFsmRunEventStart(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  527. {
  528. P_MSG_SAA_FSM_START_T prSaaFsmStartMsg;
  529. P_STA_RECORD_T prStaRec;
  530. P_BSS_INFO_T prBssInfo;
  531. ASSERT(prAdapter);
  532. ASSERT(prMsgHdr);
  533. prSaaFsmStartMsg = (P_MSG_SAA_FSM_START_T) prMsgHdr;
  534. prStaRec = prSaaFsmStartMsg->prStaRec;
  535. if ((!prStaRec) || (prStaRec->fgIsInUse == FALSE)) {
  536. cnmMemFree(prAdapter, prMsgHdr);
  537. return;
  538. }
  539. ASSERT(prStaRec);
  540. DBGLOG(SAA, LOUD, "EVENT-START: Trigger SAA FSM.\n");
  541. /* record sequence number of request message */
  542. prStaRec->ucAuthAssocReqSeqNum = prSaaFsmStartMsg->ucSeqNum;
  543. cnmMemFree(prAdapter, prMsgHdr);
  544. /* 4 <1> Validation of SAA Start Event */
  545. if (!IS_AP_STA(prStaRec)) {
  546. DBGLOG(SAA, ERROR, "EVENT-START: STA Type - %d was not supported.\n", prStaRec->eStaType);
  547. /* Ignore the return value because don't care the prSwRfb */
  548. saaFsmSendEventJoinComplete(prAdapter, WLAN_STATUS_FAILURE, prStaRec, NULL);
  549. return;
  550. }
  551. /* 4 <2> The previous JOIN process is not completed ? */
  552. if (prStaRec->eAuthAssocState != AA_STATE_IDLE) {
  553. DBGLOG(SAA, ERROR, "EVENT-START: Reentry of SAA Module.\n");
  554. prStaRec->eAuthAssocState = AA_STATE_IDLE;
  555. }
  556. /* 4 <3> Reset Status Code and Time */
  557. /* Update Station Record - Status/Reason Code */
  558. prStaRec->u2StatusCode = STATUS_CODE_SUCCESSFUL;
  559. /* Update the record join time. */
  560. GET_CURRENT_SYSTIME(&prStaRec->rLastJoinTime);
  561. prStaRec->ucTxAuthAssocRetryCount = 0;
  562. if (prStaRec->prChallengeText) {
  563. cnmMemFree(prAdapter, prStaRec->prChallengeText);
  564. prStaRec->prChallengeText = (P_IE_CHALLENGE_TEXT_T) NULL;
  565. }
  566. cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer);
  567. #if CFG_PRIVACY_MIGRATION
  568. /* 4 <4> Init the sec fsm */
  569. secFsmInit(prAdapter, prStaRec);
  570. #endif
  571. /* 4 <5> Reset the STA STATE */
  572. /* Update Station Record - Class 1 Flag */
  573. /* NOTE(Kevin): Moved to AIS FSM for Reconnect issue -
  574. * We won't deactivate the same STA_RECORD_T and then activate it again for the
  575. * case of reconnection.
  576. */
  577. /* cnmStaRecChangeState(prStaRec, STA_STATE_1); */
  578. /* 4 <6> Decide if this BSS 20/40M bandwidth is allowed */
  579. if (prStaRec->ucNetTypeIndex < NETWORK_TYPE_INDEX_NUM) {
  580. prBssInfo = &prAdapter->rWifiVar.arBssInfo[prStaRec->ucNetTypeIndex];
  581. if ((prAdapter->rWifiVar.ucAvailablePhyTypeSet & PHY_TYPE_SET_802_11N)
  582. && (prStaRec->ucPhyTypeSet & PHY_TYPE_SET_802_11N)) {
  583. prBssInfo->fgAssoc40mBwAllowed = cnmBss40mBwPermitted(prAdapter, prBssInfo->ucNetTypeIndex);
  584. } else {
  585. prBssInfo->fgAssoc40mBwAllowed = FALSE;
  586. }
  587. DBGLOG(RLM, INFO, "STA 40mAllowed=%d\n", prBssInfo->fgAssoc40mBwAllowed);
  588. }
  589. /* 4 <7> Trigger SAA FSM */
  590. if (prStaRec->ucStaState == STA_STATE_1)
  591. saaFsmSteps(prAdapter, prStaRec, SAA_STATE_SEND_AUTH1, (P_SW_RFB_T) NULL);
  592. else if (prStaRec->ucStaState == STA_STATE_2 || prStaRec->ucStaState == STA_STATE_3)
  593. saaFsmSteps(prAdapter, prStaRec, SAA_STATE_SEND_ASSOC1, (P_SW_RFB_T) NULL);
  594. } /* end of saaFsmRunEventStart() */
  595. /*----------------------------------------------------------------------------*/
  596. /*!
  597. * @brief This function will handle TxDone(Auth1/Auth3/AssocReq) Event of SAA FSM.
  598. *
  599. * @param[in] prMsduInfo Pointer to the MSDU_INFO_T.
  600. * @param[in] rTxDoneStatus Return TX status of the Auth1/Auth3/AssocReq frame.
  601. *
  602. * @retval WLAN_STATUS_SUCCESS
  603. */
  604. /*----------------------------------------------------------------------------*/
  605. WLAN_STATUS
  606. saaFsmRunEventTxDone(IN P_ADAPTER_T prAdapter, IN P_MSDU_INFO_T prMsduInfo, IN ENUM_TX_RESULT_CODE_T rTxDoneStatus)
  607. {
  608. P_STA_RECORD_T prStaRec;
  609. ENUM_AA_STATE_T eNextState;
  610. ASSERT(prMsduInfo);
  611. prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
  612. if (!prStaRec) {
  613. DBGLOG(SAA, INFO, "EVENT-TX DONE: Status %d, Invalid StaRec\n", rTxDoneStatus);
  614. return WLAN_STATUS_INVALID_PACKET;
  615. }
  616. ASSERT(prStaRec);
  617. DBGLOG(SAA, INFO, "EVENT-TX DONE: Status: %d, eAuthAssocState: %d , SeqNO: %d ",
  618. rTxDoneStatus, prStaRec->eAuthAssocState,
  619. prMsduInfo->ucTxSeqNum);
  620. eNextState = prStaRec->eAuthAssocState;
  621. switch (prStaRec->eAuthAssocState) {
  622. case SAA_STATE_SEND_AUTH1:
  623. {
  624. /* Strictly check the outgoing frame is matched with current AA STATE */
  625. if (authCheckTxAuthFrame(prAdapter, prMsduInfo, AUTH_TRANSACTION_SEQ_1) != WLAN_STATUS_SUCCESS)
  626. break;
  627. if (rTxDoneStatus == TX_RESULT_SUCCESS) {
  628. eNextState = SAA_STATE_WAIT_AUTH2;
  629. cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer);
  630. cnmTimerInitTimer(prAdapter,
  631. &prStaRec->rTxReqDoneOrRxRespTimer,
  632. (PFN_MGMT_TIMEOUT_FUNC) saaFsmRunEventRxRespTimeOut,
  633. (ULONG) prStaRec);
  634. cnmTimerStartTimer(prAdapter,
  635. &prStaRec->rTxReqDoneOrRxRespTimer,
  636. TU_TO_MSEC(DOT11_AUTHENTICATION_RESPONSE_TIMEOUT_TU));
  637. }
  638. /* if TX was successful, change to next state.
  639. * if TX was failed, do retry if possible.
  640. */
  641. saaFsmSteps(prAdapter, prStaRec, eNextState, (P_SW_RFB_T) NULL);
  642. }
  643. break;
  644. case SAA_STATE_SEND_AUTH3:
  645. {
  646. /* Strictly check the outgoing frame is matched with current JOIN STATE */
  647. if (authCheckTxAuthFrame(prAdapter, prMsduInfo, AUTH_TRANSACTION_SEQ_3) != WLAN_STATUS_SUCCESS)
  648. break;
  649. if (rTxDoneStatus == TX_RESULT_SUCCESS) {
  650. eNextState = SAA_STATE_WAIT_AUTH4;
  651. cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer);
  652. cnmTimerInitTimer(prAdapter,
  653. &prStaRec->rTxReqDoneOrRxRespTimer,
  654. (PFN_MGMT_TIMEOUT_FUNC) saaFsmRunEventRxRespTimeOut,
  655. (ULONG) prStaRec);
  656. cnmTimerStartTimer(prAdapter,
  657. &prStaRec->rTxReqDoneOrRxRespTimer,
  658. TU_TO_MSEC(DOT11_AUTHENTICATION_RESPONSE_TIMEOUT_TU));
  659. }
  660. /* if TX was successful, change to next state.
  661. * if TX was failed, do retry if possible.
  662. */
  663. saaFsmSteps(prAdapter, prStaRec, eNextState, (P_SW_RFB_T) NULL);
  664. }
  665. break;
  666. case SAA_STATE_SEND_ASSOC1:
  667. {
  668. /* Strictly check the outgoing frame is matched with current SAA STATE */
  669. if (assocCheckTxReAssocReqFrame(prAdapter, prMsduInfo) != WLAN_STATUS_SUCCESS)
  670. break;
  671. if (rTxDoneStatus == TX_RESULT_SUCCESS) {
  672. eNextState = SAA_STATE_WAIT_ASSOC2;
  673. cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer);
  674. cnmTimerInitTimer(prAdapter,
  675. &prStaRec->rTxReqDoneOrRxRespTimer,
  676. (PFN_MGMT_TIMEOUT_FUNC) saaFsmRunEventRxRespTimeOut,
  677. (ULONG) prStaRec);
  678. cnmTimerStartTimer(prAdapter,
  679. &(prStaRec->rTxReqDoneOrRxRespTimer),
  680. TU_TO_MSEC(DOT11_ASSOCIATION_RESPONSE_TIMEOUT_TU));
  681. }
  682. /* if TX was successful, change to next state.
  683. * if TX was failed, do retry if possible.
  684. */
  685. saaFsmSteps(prAdapter, prStaRec, eNextState, (P_SW_RFB_T) NULL);
  686. }
  687. break;
  688. default:
  689. break; /* Ignore other cases */
  690. }
  691. return WLAN_STATUS_SUCCESS;
  692. } /* end of saaFsmRunEventTxDone() */
  693. /*----------------------------------------------------------------------------*/
  694. /*!
  695. * @brief This function will send Tx Request Timeout Event to SAA FSM.
  696. *
  697. * @param[in] prStaRec Pointer to the STA_RECORD_T
  698. *
  699. * @return (none)
  700. */
  701. /*----------------------------------------------------------------------------*/
  702. VOID saaFsmRunEventTxReqTimeOut(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prStaRec)
  703. {
  704. ASSERT(prStaRec);
  705. if (!prStaRec)
  706. return;
  707. DBGLOG(SAA, LOUD, "EVENT-TIMER: TX REQ TIMEOUT, Current Time = %u\n", kalGetTimeTick());
  708. switch (prStaRec->eAuthAssocState) {
  709. case SAA_STATE_SEND_AUTH1:
  710. case SAA_STATE_SEND_AUTH3:
  711. case SAA_STATE_SEND_ASSOC1:
  712. saaFsmSteps(prAdapter, prStaRec, prStaRec->eAuthAssocState, (P_SW_RFB_T) NULL);
  713. break;
  714. default:
  715. return;
  716. }
  717. } /* end of saaFsmRunEventTxReqTimeOut() */
  718. /*----------------------------------------------------------------------------*/
  719. /*!
  720. * @brief This function will send Rx Response Timeout Event to SAA FSM.
  721. *
  722. * @param[in] prStaRec Pointer to the STA_RECORD_T
  723. *
  724. * @return (none)
  725. */
  726. /*----------------------------------------------------------------------------*/
  727. VOID saaFsmRunEventRxRespTimeOut(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prStaRec)
  728. {
  729. ENUM_AA_STATE_T eNextState;
  730. DBGLOG(SAA, LOUD, "EVENT-TIMER: RX RESP TIMEOUT, Current Time = %u\n", kalGetTimeTick());
  731. ASSERT(prStaRec);
  732. if (!prStaRec)
  733. return;
  734. eNextState = prStaRec->eAuthAssocState;
  735. switch (prStaRec->eAuthAssocState) {
  736. case SAA_STATE_WAIT_AUTH2:
  737. /* Record the Status Code of Authentication Request */
  738. prStaRec->u2StatusCode = STATUS_CODE_AUTH_TIMEOUT;
  739. /* Pull back to earlier state to do retry */
  740. eNextState = SAA_STATE_SEND_AUTH1;
  741. break;
  742. case SAA_STATE_WAIT_AUTH4:
  743. /* Record the Status Code of Authentication Request */
  744. prStaRec->u2StatusCode = STATUS_CODE_AUTH_TIMEOUT;
  745. /* Pull back to earlier state to do retry */
  746. eNextState = SAA_STATE_SEND_AUTH3;
  747. break;
  748. case SAA_STATE_WAIT_ASSOC2:
  749. /* Record the Status Code of Authentication Request */
  750. prStaRec->u2StatusCode = STATUS_CODE_ASSOC_TIMEOUT;
  751. /* Pull back to earlier state to do retry */
  752. eNextState = SAA_STATE_SEND_ASSOC1;
  753. break;
  754. default:
  755. break; /* Ignore other cases */
  756. }
  757. if (eNextState != prStaRec->eAuthAssocState)
  758. saaFsmSteps(prAdapter, prStaRec, eNextState, (P_SW_RFB_T) NULL);
  759. } /* end of saaFsmRunEventRxRespTimeOut() */
  760. /*----------------------------------------------------------------------------*/
  761. /*!
  762. * @brief This function will process the Rx Auth Response Frame and then
  763. * trigger SAA FSM.
  764. *
  765. * @param[in] prSwRfb Pointer to the SW_RFB_T structure.
  766. *
  767. * @return (none)
  768. */
  769. /*----------------------------------------------------------------------------*/
  770. VOID saaFsmRunEventRxAuth(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb)
  771. {
  772. P_STA_RECORD_T prStaRec;
  773. UINT_16 u2StatusCode;
  774. ENUM_AA_STATE_T eNextState;
  775. ASSERT(prSwRfb);
  776. prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
  777. /* We should have the corresponding Sta Record. */
  778. if (!prStaRec) {
  779. /* Peter: we can handle the packet without station record */
  780. /* ASSERT(0); */
  781. return;
  782. }
  783. if (!IS_AP_STA(prStaRec))
  784. return;
  785. switch (prStaRec->eAuthAssocState) {
  786. case SAA_STATE_SEND_AUTH1:
  787. case SAA_STATE_WAIT_AUTH2:
  788. /* Check if the incoming frame is what we are waiting for */
  789. if (authCheckRxAuthFrameStatus(prAdapter,
  790. prSwRfb, AUTH_TRANSACTION_SEQ_2, &u2StatusCode) == WLAN_STATUS_SUCCESS) {
  791. cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer);
  792. /* Record the Status Code of Authentication Request */
  793. prStaRec->u2StatusCode = u2StatusCode;
  794. if (u2StatusCode == STATUS_CODE_SUCCESSFUL) {
  795. authProcessRxAuth2_Auth4Frame(prAdapter, prSwRfb);
  796. if (prStaRec->ucAuthAlgNum == (UINT_8) AUTH_ALGORITHM_NUM_SHARED_KEY) {
  797. eNextState = SAA_STATE_SEND_AUTH3;
  798. } else {
  799. /* Update Station Record - Class 2 Flag */
  800. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_2);
  801. eNextState = SAA_STATE_SEND_ASSOC1;
  802. }
  803. } else {
  804. DBGLOG(SAA, INFO, "Auth Req was rejected by [ %pM ], Status Code = %d\n",
  805. (prStaRec->aucMacAddr), u2StatusCode);
  806. eNextState = AA_STATE_IDLE;
  807. }
  808. /* Reset Send Auth/(Re)Assoc Frame Count */
  809. prStaRec->ucTxAuthAssocRetryCount = 0;
  810. saaFsmSteps(prAdapter, prStaRec, eNextState, (P_SW_RFB_T) NULL);
  811. }
  812. break;
  813. case SAA_STATE_SEND_AUTH3:
  814. case SAA_STATE_WAIT_AUTH4:
  815. /* Check if the incoming frame is what we are waiting for */
  816. if (authCheckRxAuthFrameStatus(prAdapter,
  817. prSwRfb, AUTH_TRANSACTION_SEQ_4, &u2StatusCode) == WLAN_STATUS_SUCCESS) {
  818. cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer);
  819. /* Record the Status Code of Authentication Request */
  820. prStaRec->u2StatusCode = u2StatusCode;
  821. if (u2StatusCode == STATUS_CODE_SUCCESSFUL) {
  822. authProcessRxAuth2_Auth4Frame(prAdapter, prSwRfb); /* Add for 802.11r handling */
  823. /* Update Station Record - Class 2 Flag */
  824. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_2);
  825. eNextState = SAA_STATE_SEND_ASSOC1;
  826. } else {
  827. DBGLOG(SAA, INFO, "Auth Req was rejected by [ %pM ], Status Code = %d\n",
  828. (prStaRec->aucMacAddr), u2StatusCode);
  829. eNextState = AA_STATE_IDLE;
  830. }
  831. /* Reset Send Auth/(Re)Assoc Frame Count */
  832. prStaRec->ucTxAuthAssocRetryCount = 0;
  833. saaFsmSteps(prAdapter, prStaRec, eNextState, (P_SW_RFB_T) NULL);
  834. }
  835. break;
  836. default:
  837. break; /* Ignore other cases */
  838. }
  839. } /* end of saaFsmRunEventRxAuth() */
  840. /*----------------------------------------------------------------------------*/
  841. /*!
  842. * @brief This function will process the Rx (Re)Association Response Frame and then
  843. * trigger SAA FSM.
  844. *
  845. * @param[in] prSwRfb Pointer to the SW_RFB_T structure.
  846. *
  847. * @retval WLAN_STATUS_SUCCESS if the status code was not success
  848. * @retval WLAN_STATUS_BUFFER_RETAINED if the status code was success
  849. */
  850. /*----------------------------------------------------------------------------*/
  851. WLAN_STATUS saaFsmRunEventRxAssoc(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb)
  852. {
  853. P_STA_RECORD_T prStaRec;
  854. UINT_16 u2StatusCode;
  855. ENUM_AA_STATE_T eNextState;
  856. P_SW_RFB_T prRetainedSwRfb = (P_SW_RFB_T) NULL;
  857. WLAN_STATUS rStatus = WLAN_STATUS_SUCCESS;
  858. ASSERT(prSwRfb);
  859. prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
  860. /* We should have the corresponding Sta Record. */
  861. if (!prStaRec) {
  862. ASSERT(0);
  863. return rStatus;
  864. }
  865. if (!IS_AP_STA(prStaRec))
  866. return rStatus;
  867. switch (prStaRec->eAuthAssocState) {
  868. case SAA_STATE_SEND_ASSOC1:
  869. case SAA_STATE_WAIT_ASSOC2:
  870. /* TRUE if the incoming frame is what we are waiting for */
  871. if (assocCheckRxReAssocRspFrameStatus(prAdapter, prSwRfb, &u2StatusCode) == WLAN_STATUS_SUCCESS) {
  872. cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer);
  873. /* Record the Status Code of Authentication Request */
  874. prStaRec->u2StatusCode = u2StatusCode;
  875. if (u2StatusCode == STATUS_CODE_SUCCESSFUL) {
  876. /* Update Station Record - Class 3 Flag */
  877. /* NOTE(Kevin): Moved to AIS FSM for roaming issue -
  878. * We should deactivate the STA_RECORD_T of previous AP before
  879. * activate new one in Driver.
  880. */
  881. /* cnmStaRecChangeState(prStaRec, STA_STATE_3); */
  882. prStaRec->ucJoinFailureCount = 0; /* Clear history. */
  883. prRetainedSwRfb = prSwRfb;
  884. rStatus = WLAN_STATUS_PENDING;
  885. } else {
  886. DBGLOG(SAA, INFO, "Assoc Req was rejected by [ %pM ], Status Code = %d\n",
  887. (prStaRec->aucMacAddr), u2StatusCode);
  888. }
  889. /* Reset Send Auth/(Re)Assoc Frame Count */
  890. prStaRec->ucTxAuthAssocRetryCount = 0;
  891. /* update RCPI */
  892. prStaRec->ucRCPI = prSwRfb->prHifRxHdr->ucRcpi;
  893. eNextState = AA_STATE_IDLE;
  894. saaFsmSteps(prAdapter, prStaRec, eNextState, prRetainedSwRfb);
  895. }
  896. break;
  897. default:
  898. break; /* Ignore other cases */
  899. }
  900. return rStatus;
  901. } /* end of saaFsmRunEventRxAssoc() */
  902. /*----------------------------------------------------------------------------*/
  903. /*!
  904. * @brief This function will check the incoming Deauth Frame.
  905. *
  906. * @param[in] prSwRfb Pointer to the SW_RFB_T structure.
  907. *
  908. * @retval WLAN_STATUS_SUCCESS Always not retain deauthentication frames
  909. */
  910. /*----------------------------------------------------------------------------*/
  911. WLAN_STATUS saaFsmRunEventRxDeauth(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb)
  912. {
  913. P_STA_RECORD_T prStaRec;
  914. P_WLAN_DEAUTH_FRAME_T prDeauthFrame;
  915. ASSERT(prSwRfb);
  916. prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
  917. if (prStaRec == NULL)
  918. return WLAN_STATUS_FAILURE;
  919. prDeauthFrame = (P_WLAN_DEAUTH_FRAME_T) prSwRfb->pvHeader;
  920. DBGLOG(SAA, INFO, "Rx Deauth frame from BSSID=[ %pM ].\n", prDeauthFrame->aucBSSID);
  921. do {
  922. if (IS_STA_IN_AIS(prStaRec)) {
  923. P_AIS_BSS_INFO_T prAisBssInfo;
  924. if (!IS_AP_STA(prStaRec))
  925. break;
  926. prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
  927. if (prStaRec->ucStaState <= STA_STATE_1)
  928. break;
  929. /* Check if this is the AP we are associated or associating with */
  930. if (authProcessRxDeauthFrame(prSwRfb,
  931. prStaRec->aucMacAddr,
  932. &prStaRec->u2ReasonCode) == WLAN_STATUS_SUCCESS) {
  933. DBGLOG(SAA, INFO, "Deauth reason = %d\n", prStaRec->u2ReasonCode);
  934. if (STA_STATE_2 <= prStaRec->ucStaState) {
  935. P_MSG_AIS_ABORT_T prAisAbortMsg;
  936. /* NOTE(Kevin): Change state immediately to avoid starvation of
  937. * MSG buffer because of too many deauth frames before changing
  938. * the STA state.
  939. */
  940. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_1);
  941. prAisAbortMsg =
  942. (P_MSG_AIS_ABORT_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG,
  943. sizeof(MSG_AIS_ABORT_T));
  944. if (!prAisAbortMsg)
  945. break;
  946. prAisAbortMsg->rMsgHdr.eMsgId = MID_SAA_AIS_FSM_ABORT;
  947. prAisAbortMsg->ucReasonOfDisconnect =
  948. DISCONNECT_REASON_CODE_DEAUTHENTICATED;
  949. prAisAbortMsg->fgDelayIndication = FALSE;
  950. mboxSendMsg(prAdapter,
  951. MBOX_ID_0,
  952. (P_MSG_HDR_T) prAisAbortMsg, MSG_SEND_METHOD_BUF);
  953. } else {
  954. /* TODO(Kevin): Joining Abort */
  955. }
  956. prAisBssInfo->u2DeauthReason = prStaRec->u2ReasonCode;
  957. }
  958. }
  959. #if CFG_ENABLE_WIFI_DIRECT
  960. else if (prAdapter->fgIsP2PRegistered && IS_STA_IN_P2P(prStaRec)) {
  961. /* TODO(Kevin) */
  962. p2pFsmRunEventRxDeauthentication(prAdapter, prStaRec, prSwRfb);
  963. }
  964. #endif
  965. #if CFG_ENABLE_BT_OVER_WIFI
  966. else if (IS_STA_IN_BOW(prStaRec))
  967. bowRunEventRxDeAuth(prAdapter, prStaRec, prSwRfb);
  968. #endif
  969. else
  970. ASSERT(0);
  971. } while (FALSE);
  972. return WLAN_STATUS_SUCCESS;
  973. } /* end of saaFsmRunEventRxDeauth() */
  974. /*----------------------------------------------------------------------------*/
  975. /*!
  976. * @brief This function will check the incoming Disassociation Frame.
  977. *
  978. * @param[in] prSwRfb Pointer to the SW_RFB_T structure.
  979. *
  980. * @retval WLAN_STATUS_SUCCESS Always not retain disassociation frames
  981. */
  982. /*----------------------------------------------------------------------------*/
  983. WLAN_STATUS saaFsmRunEventRxDisassoc(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb)
  984. {
  985. P_STA_RECORD_T prStaRec;
  986. P_WLAN_DISASSOC_FRAME_T prDisassocFrame;
  987. ASSERT(prSwRfb);
  988. prStaRec = cnmGetStaRecByIndex(prAdapter, prSwRfb->ucStaRecIdx);
  989. if (prStaRec == NULL)
  990. return WLAN_STATUS_FAILURE;
  991. prDisassocFrame = (P_WLAN_DISASSOC_FRAME_T) prSwRfb->pvHeader;
  992. DBGLOG(SAA, INFO, "Rx Disassoc frame from BSSID=[ %pM ].\n", (prDisassocFrame->aucBSSID));
  993. do {
  994. if (IS_STA_IN_AIS(prStaRec)) {
  995. P_AIS_BSS_INFO_T prAisBssInfo;
  996. if (!IS_AP_STA(prStaRec))
  997. break;
  998. prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
  999. if (prStaRec->ucStaState <= STA_STATE_1)
  1000. break;
  1001. /* Check if this is the AP we are associated or associating with */
  1002. if (assocProcessRxDisassocFrame(prAdapter,
  1003. prSwRfb,
  1004. prStaRec->aucMacAddr,
  1005. &prStaRec->u2ReasonCode) == WLAN_STATUS_SUCCESS) {
  1006. DBGLOG(SAA, INFO, "Disassoc reason = %d\n", prStaRec->u2ReasonCode);
  1007. if (STA_STATE_3 <= prStaRec->ucStaState) {
  1008. P_MSG_AIS_ABORT_T prAisAbortMsg;
  1009. /* NOTE(Chaozhong): Change state immediately to avoid starvation of
  1010. * MSG buffer because of too many disassoc frames before changing
  1011. * the STA state.
  1012. */
  1013. cnmStaRecChangeState(prAdapter, prStaRec, STA_STATE_2);
  1014. prAisAbortMsg =
  1015. (P_MSG_AIS_ABORT_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG,
  1016. sizeof(MSG_AIS_ABORT_T));
  1017. if (!prAisAbortMsg)
  1018. break;
  1019. prAisAbortMsg->rMsgHdr.eMsgId = MID_SAA_AIS_FSM_ABORT;
  1020. prAisAbortMsg->ucReasonOfDisconnect =
  1021. DISCONNECT_REASON_CODE_DISASSOCIATED;
  1022. prAisAbortMsg->fgDelayIndication = FALSE;
  1023. mboxSendMsg(prAdapter,
  1024. MBOX_ID_0,
  1025. (P_MSG_HDR_T) prAisAbortMsg, MSG_SEND_METHOD_BUF);
  1026. } else {
  1027. /* TODO(Kevin): Joining Abort */
  1028. }
  1029. prAisBssInfo->u2DeauthReason = prStaRec->u2ReasonCode;
  1030. }
  1031. }
  1032. #if CFG_ENABLE_WIFI_DIRECT
  1033. else if (prAdapter->fgIsP2PRegistered && IS_STA_IN_P2P(prStaRec)) {
  1034. /* TODO(Kevin) */
  1035. p2pFsmRunEventRxDisassociation(prAdapter, prStaRec, prSwRfb);
  1036. }
  1037. #endif
  1038. #if CFG_ENABLE_BT_OVER_WIFI
  1039. else if (IS_STA_IN_BOW(prStaRec)) {
  1040. /* Do nothing */
  1041. /* TODO(Kevin) */
  1042. }
  1043. #endif
  1044. else
  1045. ASSERT(0);
  1046. } while (FALSE);
  1047. return WLAN_STATUS_SUCCESS;
  1048. } /* end of saaFsmRunEventRxDisassoc() */
  1049. /*----------------------------------------------------------------------------*/
  1050. /*!
  1051. * @brief This function will handle the Abort Event to SAA FSM.
  1052. *
  1053. * @param[in] prMsgHdr Message of Abort Request for a particular STA.
  1054. *
  1055. * @return none
  1056. */
  1057. /*----------------------------------------------------------------------------*/
  1058. VOID saaFsmRunEventAbort(IN P_ADAPTER_T prAdapter, IN P_MSG_HDR_T prMsgHdr)
  1059. {
  1060. P_MSG_SAA_FSM_ABORT_T prSaaFsmAbortMsg;
  1061. P_STA_RECORD_T prStaRec;
  1062. ASSERT(prMsgHdr);
  1063. prSaaFsmAbortMsg = (P_MSG_SAA_FSM_ABORT_T) prMsgHdr;
  1064. prStaRec = prSaaFsmAbortMsg->prStaRec;
  1065. ASSERT(prStaRec);
  1066. if (!prStaRec) {
  1067. cnmMemFree(prAdapter, prMsgHdr);
  1068. return;
  1069. }
  1070. DBGLOG(SAA, LOUD, "EVENT-ABORT: Stop SAA FSM.\n");
  1071. cnmMemFree(prAdapter, prMsgHdr);
  1072. /* Reset Send Auth/(Re)Assoc Frame Count */
  1073. prStaRec->ucTxAuthAssocRetryCount = 0;
  1074. /* Cancel JOIN relative Timer */
  1075. cnmTimerStopTimer(prAdapter, &prStaRec->rTxReqDoneOrRxRespTimer);
  1076. if (prStaRec->eAuthAssocState != AA_STATE_IDLE) {
  1077. #if DBG
  1078. DBGLOG(SAA, LOUD, "EVENT-ABORT: Previous Auth/Assoc State == %s.\n",
  1079. apucDebugAAState[prStaRec->eAuthAssocState]);
  1080. #else
  1081. DBGLOG(SAA, LOUD, "EVENT-ABORT: Previous Auth/Assoc State == %d.\n", prStaRec->eAuthAssocState);
  1082. #endif
  1083. }
  1084. #if 0
  1085. /* For the Auth/Assoc State to IDLE */
  1086. prStaRec->eAuthAssocState = AA_STATE_IDLE;
  1087. #else
  1088. /* Free this StaRec */
  1089. cnmStaRecFree(prAdapter, prStaRec, FALSE);
  1090. #endif
  1091. } /* end of saaFsmRunEventAbort() */
  1092. /* TODO(Kevin): following code will be modified and move to AIS FSM */
  1093. #if 0
  1094. /*----------------------------------------------------------------------------*/
  1095. /*!
  1096. * \brief This function will send Join Timeout Event to JOIN FSM.
  1097. *
  1098. * \param[in] prAdapter Pointer to the Adapter structure.
  1099. *
  1100. * \retval WLAN_STATUS_FAILURE Fail because of Join Timeout
  1101. */
  1102. /*----------------------------------------------------------------------------*/
  1103. WLAN_STATUS joinFsmRunEventJoinTimeOut(IN P_ADAPTER_T prAdapter)
  1104. {
  1105. P_JOIN_INFO_T prJoinInfo;
  1106. P_STA_RECORD_T prStaRec;
  1107. DEBUGFUNC("joinFsmRunEventJoinTimeOut");
  1108. ASSERT(prAdapter);
  1109. prJoinInfo = &prAdapter->rJoinInfo;
  1110. DBGLOG(JOIN, EVENT, "JOIN EVENT: JOIN TIMEOUT\n");
  1111. /* Get a Station Record if possible, TA == BSSID for AP */
  1112. prStaRec = staRecGetStaRecordByAddr(prAdapter, prJoinInfo->prBssDesc->aucBSSID);
  1113. /* We have renew this Sta Record when in JOIN_STATE_INIT */
  1114. ASSERT(prStaRec);
  1115. /* Record the Status Code of Authentication Request */
  1116. prStaRec->u2StatusCode = STATUS_CODE_JOIN_TIMEOUT;
  1117. /* Increase Failure Count */
  1118. prStaRec->ucJoinFailureCount++;
  1119. /* Reset Send Auth/(Re)Assoc Frame Count */
  1120. prJoinInfo->ucTxAuthAssocRetryCount = 0;
  1121. /* Cancel other JOIN relative Timer */
  1122. ARB_CANCEL_TIMER(prAdapter, prJoinInfo->rTxRequestTimer);
  1123. ARB_CANCEL_TIMER(prAdapter, prJoinInfo->rRxResponseTimer);
  1124. /* Restore original setting from current BSS_INFO_T */
  1125. if (prAdapter->eConnectionState == MEDIA_STATE_CONNECTED)
  1126. joinAdoptParametersFromCurrentBss(prAdapter);
  1127. /* Pull back to IDLE */
  1128. joinFsmSteps(prAdapter, JOIN_STATE_IDLE);
  1129. return WLAN_STATUS_FAILURE;
  1130. } /* end of joinFsmRunEventJoinTimeOut() */
  1131. /*----------------------------------------------------------------------------*/
  1132. /*!
  1133. * \brief This function will adopt the parameters from Peer BSS.
  1134. *
  1135. * \param[in] prAdapter Pointer to the Adapter structure.
  1136. *
  1137. * \return (none)
  1138. */
  1139. /*----------------------------------------------------------------------------*/
  1140. VOID joinAdoptParametersFromPeerBss(IN P_ADAPTER_T prAdapter)
  1141. {
  1142. P_JOIN_INFO_T prJoinInfo;
  1143. P_BSS_DESC_T prBssDesc;
  1144. DEBUGFUNC("joinAdoptParametersFromPeerBss");
  1145. ASSERT(prAdapter);
  1146. prJoinInfo = &prAdapter->rJoinInfo;
  1147. prBssDesc = prJoinInfo->prBssDesc;
  1148. /* 4 <1> Adopt Peer BSS' PHY TYPE */
  1149. prAdapter->eCurrentPhyType = prBssDesc->ePhyType;
  1150. DBGLOG(JOIN, INFO, "Target BSS[%s]'s PhyType = %s\n",
  1151. prBssDesc->aucSSID, (prBssDesc->ePhyType == PHY_TYPE_ERP_INDEX) ? "ERP" : "HR_DSSS");
  1152. /* 4 <2> Adopt Peer BSS' Frequency(Band/Channel) */
  1153. DBGLOG(JOIN, INFO, "Target BSS's Channel = %d, Band = %d\n", prBssDesc->ucChannelNum, prBssDesc->eBand);
  1154. nicSwitchChannel(prAdapter, prBssDesc->eBand, prBssDesc->ucChannelNum, 10);
  1155. prJoinInfo->fgIsParameterAdopted = TRUE;
  1156. } /* end of joinAdoptParametersFromPeerBss() */
  1157. /*----------------------------------------------------------------------------*/
  1158. /*!
  1159. * \brief This function will adopt the parameters from current associated BSS.
  1160. *
  1161. * \param[in] prAdapter Pointer to the Adapter structure.
  1162. *
  1163. * \return (none)
  1164. */
  1165. /*----------------------------------------------------------------------------*/
  1166. VOID joinAdoptParametersFromCurrentBss(IN P_ADAPTER_T prAdapter)
  1167. {
  1168. /* P_JOIN_INFO_T prJoinInfo = &prAdapter->rJoinInfo; */
  1169. P_BSS_INFO_T prBssInfo;
  1170. ASSERT(prAdapter);
  1171. prBssInfo = &prAdapter->rBssInfo;
  1172. /* 4 <1> Adopt current BSS' PHY TYPE */
  1173. prAdapter->eCurrentPhyType = prBssInfo->ePhyType;
  1174. /* 4 <2> Adopt current BSS' Frequency(Band/Channel) */
  1175. DBGLOG(JOIN, INFO, "Current BSS's Channel = %d, Band = %d\n", prBssInfo->ucChnl, prBssInfo->eBand);
  1176. nicSwitchChannel(prAdapter, prBssInfo->eBand, prBssInfo->ucChnl, 10);
  1177. } /* end of joinAdoptParametersFromCurrentBss() */
  1178. /*----------------------------------------------------------------------------*/
  1179. /*!
  1180. * \brief This function will update all the SW variables and HW MCR registers after
  1181. * the association with target BSS.
  1182. *
  1183. * \param[in] prAdapter Pointer to the Adapter structure.
  1184. *
  1185. * \return (none)
  1186. */
  1187. /*----------------------------------------------------------------------------*/
  1188. VOID joinComplete(IN P_ADAPTER_T prAdapter)
  1189. {
  1190. P_JOIN_INFO_T prJoinInfo;
  1191. P_BSS_DESC_T prBssDesc;
  1192. P_PEER_BSS_INFO_T prPeerBssInfo;
  1193. P_BSS_INFO_T prBssInfo;
  1194. P_CONNECTION_SETTINGS_T prConnSettings;
  1195. P_STA_RECORD_T prStaRec;
  1196. P_TX_CTRL_T prTxCtrl;
  1197. #if CFG_SUPPORT_802_11D
  1198. P_IE_COUNTRY_T prIECountry;
  1199. #endif
  1200. DEBUGFUNC("joinComplete");
  1201. ASSERT(prAdapter);
  1202. prJoinInfo = &prAdapter->rJoinInfo;
  1203. prBssDesc = prJoinInfo->prBssDesc;
  1204. prPeerBssInfo = &prAdapter->rPeerBssInfo;
  1205. prBssInfo = &prAdapter->rBssInfo;
  1206. prConnSettings = &prAdapter->rConnSettings;
  1207. prTxCtrl = &prAdapter->rTxCtrl;
  1208. /* 4 <1> Update Connecting & Connected Flag of BSS_DESC_T. */
  1209. /* Remove previous AP's Connection Flags if have */
  1210. scanRemoveConnectionFlagOfBssDescByBssid(prAdapter, prBssInfo->aucBSSID);
  1211. prBssDesc->fgIsConnected = TRUE; /* Mask as Connected */
  1212. if (prBssDesc->fgIsHiddenSSID) {
  1213. /* NOTE(Kevin): This is for the case of Passive Scan and the target BSS didn't
  1214. * broadcast SSID on its Beacon Frame.
  1215. */
  1216. COPY_SSID(prBssDesc->aucSSID,
  1217. prBssDesc->ucSSIDLen, prAdapter->rConnSettings.aucSSID, prAdapter->rConnSettings.ucSSIDLen);
  1218. if (prBssDesc->ucSSIDLen)
  1219. prBssDesc->fgIsHiddenSSID = FALSE;
  1220. #if DBG
  1221. else
  1222. ASSERT(0);
  1223. #endif /* DBG */
  1224. DBGLOG(JOIN, INFO, "Hidden SSID! - Update SSID : %s\n", prBssDesc->aucSSID);
  1225. }
  1226. /* 4 <2> Update BSS_INFO_T from BSS_DESC_T */
  1227. /* 4 <2.A> PHY Type */
  1228. prBssInfo->ePhyType = prBssDesc->ePhyType;
  1229. /* 4 <2.B> BSS Type */
  1230. prBssInfo->eBSSType = BSS_TYPE_INFRASTRUCTURE;
  1231. /* 4 <2.C> BSSID */
  1232. COPY_MAC_ADDR(prBssInfo->aucBSSID, prBssDesc->aucBSSID);
  1233. DBGLOG(JOIN, INFO, "JOIN to BSSID: [%pM]\n", prBssDesc->aucBSSID);
  1234. /* 4 <2.D> SSID */
  1235. COPY_SSID(prBssInfo->aucSSID, prBssInfo->ucSSIDLen, prBssDesc->aucSSID, prBssDesc->ucSSIDLen);
  1236. /* 4 <2.E> Channel / Band information. */
  1237. prBssInfo->eBand = prBssDesc->eBand;
  1238. prBssInfo->ucChnl = prBssDesc->ucChannelNum;
  1239. /* 4 <2.F> RSN/WPA information. */
  1240. secFsmRunEventStart(prAdapter);
  1241. prBssInfo->u4RsnSelectedPairwiseCipher = prBssDesc->u4RsnSelectedPairwiseCipher;
  1242. prBssInfo->u4RsnSelectedGroupCipher = prBssDesc->u4RsnSelectedGroupCipher;
  1243. prBssInfo->u4RsnSelectedAKMSuite = prBssDesc->u4RsnSelectedAKMSuite;
  1244. if (secRsnKeyHandshakeEnabled())
  1245. prBssInfo->fgIsWPAorWPA2Enabled = TRUE;
  1246. else
  1247. prBssInfo->fgIsWPAorWPA2Enabled = FALSE;
  1248. /* 4 <2.G> Beacon interval. */
  1249. prBssInfo->u2BeaconInterval = prBssDesc->u2BeaconInterval;
  1250. /* 4 <2.H> DTIM period. */
  1251. prBssInfo->ucDtimPeriod = prBssDesc->ucDTIMPeriod;
  1252. /* 4 <2.I> ERP Information */
  1253. if ((prBssInfo->ePhyType == PHY_TYPE_ERP_INDEX) && /* Our BSS's PHY_TYPE is ERP now. */
  1254. (prBssDesc->fgIsERPPresent)) {
  1255. prBssInfo->fgIsERPPresent = TRUE;
  1256. prBssInfo->ucERP = prBssDesc->ucERP; /* Save the ERP for later check */
  1257. } else { /* Some AP, may send ProbeResp without ERP IE. Thus prBssDesc->fgIsERPPresent is FALSE. */
  1258. prBssInfo->fgIsERPPresent = FALSE;
  1259. prBssInfo->ucERP = 0;
  1260. }
  1261. #if CFG_SUPPORT_802_11D
  1262. /* 4 <2.J> Country inforamtion of the associated AP */
  1263. if (prConnSettings->fgMultiDomainCapabilityEnabled) {
  1264. DOMAIN_INFO_ENTRY rDomainInfo;
  1265. if (domainGetDomainInfoByScanResult(prAdapter, &rDomainInfo)) {
  1266. if (prBssDesc->prIECountry) {
  1267. prIECountry = prBssDesc->prIECountry;
  1268. domainParseCountryInfoElem(prIECountry, &prBssInfo->rDomainInfo);
  1269. /* use the domain get from the BSS info */
  1270. prBssInfo->fgIsCountryInfoPresent = TRUE;
  1271. nicSetupOpChnlList(prAdapter, prBssInfo->rDomainInfo.u2CountryCode, FALSE);
  1272. } else {
  1273. /* use the domain get from the scan result */
  1274. prBssInfo->fgIsCountryInfoPresent = TRUE;
  1275. nicSetupOpChnlList(prAdapter, rDomainInfo.u2CountryCode, FALSE);
  1276. }
  1277. }
  1278. }
  1279. #endif
  1280. /* 4 <2.K> Signal Power of the associated AP */
  1281. prBssInfo->rRcpi = prBssDesc->rRcpi;
  1282. prBssInfo->rRssi = RCPI_TO_dBm(prBssInfo->rRcpi);
  1283. GET_CURRENT_SYSTIME(&prBssInfo->rRssiLastUpdateTime);
  1284. /* 4 <2.L> Capability Field of the associated AP */
  1285. prBssInfo->u2CapInfo = prBssDesc->u2CapInfo;
  1286. DBGLOG(JOIN, INFO, "prBssInfo-> fgIsERPPresent = %d, ucERP = %02x, rRcpi = %d, rRssi = %ld\n",
  1287. prBssInfo->fgIsERPPresent, prBssInfo->ucERP, prBssInfo->rRcpi, prBssInfo->rRssi);
  1288. /* 4 <3> Update BSS_INFO_T from PEER_BSS_INFO_T & NIC RATE FUNC */
  1289. /* 4 <3.A> Association ID */
  1290. prBssInfo->u2AssocId = prPeerBssInfo->u2AssocId;
  1291. /* 4 <3.B> WMM Information */
  1292. if (prAdapter->fgIsEnableWMM && (prPeerBssInfo->rWmmInfo.ucWmmFlag & WMM_FLAG_SUPPORT_WMM)) {
  1293. prBssInfo->fgIsWmmAssoc = TRUE;
  1294. prTxCtrl->rTxQForVoipAccess = TXQ_AC3;
  1295. qosWmmInfoInit(&prBssInfo->rWmmInfo, (prBssInfo->ePhyType == PHY_TYPE_HR_DSSS_INDEX) ? TRUE : FALSE);
  1296. if (prPeerBssInfo->rWmmInfo.ucWmmFlag & WMM_FLAG_AC_PARAM_PRESENT) {
  1297. kalMemCopy(&prBssInfo->rWmmInfo, &prPeerBssInfo->rWmmInfo, sizeof(WMM_INFO_T));
  1298. } else {
  1299. kalMemCopy(&prBssInfo->rWmmInfo,
  1300. &prPeerBssInfo->rWmmInfo,
  1301. sizeof(WMM_INFO_T) - sizeof(prPeerBssInfo->rWmmInfo.arWmmAcParams));
  1302. }
  1303. } else {
  1304. prBssInfo->fgIsWmmAssoc = FALSE;
  1305. prTxCtrl->rTxQForVoipAccess = TXQ_AC1;
  1306. kalMemZero(&prBssInfo->rWmmInfo, sizeof(WMM_INFO_T));
  1307. }
  1308. /* 4 <3.C> Operational Rate Set & BSS Basic Rate Set */
  1309. prBssInfo->u2OperationalRateSet = prPeerBssInfo->u2OperationalRateSet;
  1310. prBssInfo->u2BSSBasicRateSet = prPeerBssInfo->u2BSSBasicRateSet;
  1311. /* 4 <3.D> Short Preamble */
  1312. if (prBssInfo->fgIsERPPresent) {
  1313. /* NOTE(Kevin 2007/12/24): Truth Table.
  1314. * Short Preamble Bit in
  1315. * <AssocReq> <AssocResp w/i ERP> <BARKER(Long)> Final Driver Setting(Short)
  1316. * TRUE FALSE FALSE FALSE(shouldn't have such case, use the AssocResp)
  1317. * TRUE FALSE TRUE FALSE
  1318. * FALSE FALSE FALSE FALSE(shouldn't have such case, use the AssocResp)
  1319. * FALSE FALSE TRUE FALSE
  1320. * TRUE TRUE FALSE TRUE(follow ERP)
  1321. * TRUE TRUE TRUE FALSE(follow ERP)
  1322. * FALSE TRUE FALSE FALSE(shouldn't have such case, and we should set to FALSE)
  1323. * FALSE TRUE TRUE FALSE(we should set to FALSE)
  1324. */
  1325. if ((prPeerBssInfo->fgIsShortPreambleAllowed) &&
  1326. ((prConnSettings->ePreambleType == PREAMBLE_TYPE_SHORT) ||
  1327. ((prConnSettings->ePreambleType == PREAMBLE_TYPE_AUTO) &&
  1328. (prBssDesc->u2CapInfo & CAP_INFO_SHORT_PREAMBLE)))) {
  1329. prBssInfo->fgIsShortPreambleAllowed = TRUE;
  1330. if (prBssInfo->ucERP & ERP_INFO_BARKER_PREAMBLE_MODE)
  1331. prBssInfo->fgUseShortPreamble = FALSE;
  1332. else
  1333. prBssInfo->fgUseShortPreamble = TRUE;
  1334. } else {
  1335. prBssInfo->fgIsShortPreambleAllowed = FALSE;
  1336. prBssInfo->fgUseShortPreamble = FALSE;
  1337. }
  1338. } else {
  1339. /* NOTE(Kevin 2007/12/24): Truth Table.
  1340. * Short Preamble Bit in
  1341. * <AssocReq> <AssocResp w/o ERP> Final Driver Setting(Short)
  1342. * TRUE FALSE FALSE
  1343. * FALSE FALSE FALSE
  1344. * TRUE TRUE TRUE
  1345. * FALSE TRUE(status success) TRUE
  1346. * --> Honor the result of prPeerBssInfo.
  1347. */
  1348. prBssInfo->fgIsShortPreambleAllowed = prBssInfo->fgUseShortPreamble =
  1349. prPeerBssInfo->fgIsShortPreambleAllowed;
  1350. }
  1351. DBGLOG(JOIN, INFO, "prBssInfo->fgIsShortPreambleAllowed = %d, prBssInfo->fgUseShortPreamble = %d\n",
  1352. prBssInfo->fgIsShortPreambleAllowed, prBssInfo->fgUseShortPreamble);
  1353. /* 4 <3.E> Short Slot Time */
  1354. prBssInfo->fgUseShortSlotTime = prPeerBssInfo->fgUseShortSlotTime; /* AP support Short Slot Time */
  1355. DBGLOG(JOIN, INFO, "prBssInfo->fgUseShortSlotTime = %d\n", prBssInfo->fgUseShortSlotTime);
  1356. nicSetSlotTime(prAdapter,
  1357. prBssInfo->ePhyType,
  1358. ((prConnSettings->fgIsShortSlotTimeOptionEnable &&
  1359. prBssInfo->fgUseShortSlotTime) ? TRUE : FALSE));
  1360. /* 4 <3.F> Update Tx Rate for Control Frame */
  1361. bssUpdateTxRateForControlFrame(prAdapter);
  1362. /* 4 <3.G> Save the available Auth Types during Roaming (Design for Fast BSS Transition). */
  1363. /* if (prAdapter->fgIsEnableRoaming) */ /* NOTE(Kevin): Always prepare info for roaming */
  1364. {
  1365. if (prJoinInfo->ucCurrAuthAlgNum == AUTH_ALGORITHM_NUM_OPEN_SYSTEM)
  1366. prJoinInfo->ucRoamingAuthTypes |= AUTH_TYPE_OPEN_SYSTEM;
  1367. else if (prJoinInfo->ucCurrAuthAlgNum == AUTH_ALGORITHM_NUM_SHARED_KEY)
  1368. prJoinInfo->ucRoamingAuthTypes |= AUTH_TYPE_SHARED_KEY;
  1369. prBssInfo->ucRoamingAuthTypes = prJoinInfo->ucRoamingAuthTypes;
  1370. /* Set the stable time of the associated BSS. We won't do roaming decision
  1371. * during the stable time.
  1372. */
  1373. SET_EXPIRATION_TIME(prBssInfo->rRoamingStableExpirationTime,
  1374. SEC_TO_SYSTIME(ROAMING_STABLE_TIMEOUT_SEC));
  1375. }
  1376. /* 4 <3.H> Update Parameter for TX Fragmentation Threshold */
  1377. #if CFG_TX_FRAGMENT
  1378. txFragInfoUpdate(prAdapter);
  1379. #endif /* CFG_TX_FRAGMENT */
  1380. /* 4 <4> Update STA_RECORD_T */
  1381. /* Get a Station Record if possible */
  1382. prStaRec = staRecGetStaRecordByAddr(prAdapter, prBssDesc->aucBSSID);
  1383. if (prStaRec) {
  1384. UINT_16 u2OperationalRateSet, u2DesiredRateSet;
  1385. /* 4 <4.A> Desired Rate Set */
  1386. u2OperationalRateSet = (rPhyAttributes[prBssInfo->ePhyType].u2SupportedRateSet &
  1387. prBssInfo->u2OperationalRateSet);
  1388. u2DesiredRateSet = (u2OperationalRateSet & prConnSettings->u2DesiredRateSet);
  1389. if (u2DesiredRateSet) {
  1390. prStaRec->u2DesiredRateSet = u2DesiredRateSet;
  1391. } else {
  1392. /* For Error Handling - The Desired Rate Set is not covered in Operational Rate Set. */
  1393. prStaRec->u2DesiredRateSet = u2OperationalRateSet;
  1394. }
  1395. /* Try to set the best initial rate for this entry */
  1396. if (!rateGetBestInitialRateIndex(prStaRec->u2DesiredRateSet,
  1397. prStaRec->rRcpi, &prStaRec->ucCurrRate1Index)) {
  1398. if (!rateGetLowestRateIndexFromRateSet(prStaRec->u2DesiredRateSet, &prStaRec->ucCurrRate1Index))
  1399. ASSERT(0);
  1400. }
  1401. DBGLOG(JOIN, INFO, "prStaRec->ucCurrRate1Index = %d\n", prStaRec->ucCurrRate1Index);
  1402. /* 4 <4.B> Preamble Mode */
  1403. prStaRec->fgIsShortPreambleOptionEnable = prBssInfo->fgUseShortPreamble;
  1404. /* 4 <4.C> QoS Flag */
  1405. prStaRec->fgIsQoS = prBssInfo->fgIsWmmAssoc;
  1406. }
  1407. #if DBG
  1408. else
  1409. ASSERT(0);
  1410. #endif /* DBG */
  1411. /* 4 <5> Update NIC */
  1412. /* 4 <5.A> Update BSSID & Operation Mode */
  1413. nicSetupBSS(prAdapter, prBssInfo);
  1414. /* 4 <5.B> Update WLAN Table. */
  1415. if (nicSetHwBySta(prAdapter, prStaRec) == FALSE)
  1416. ASSERT(FALSE);
  1417. /* 4 <5.C> Update Desired Rate Set for BT. */
  1418. #if CFG_TX_FRAGMENT
  1419. if (prConnSettings->fgIsEnableTxAutoFragmentForBT)
  1420. txRateSetInitForBT(prAdapter, prStaRec);
  1421. #endif /* CFG_TX_FRAGMENT */
  1422. /* 4 <5.D> TX AC Parameter and TX/RX Queue Control */
  1423. if (prBssInfo->fgIsWmmAssoc) {
  1424. #if CFG_TX_AGGREGATE_HW_FIFO
  1425. nicTxAggregateTXQ(prAdapter, FALSE);
  1426. #endif /* CFG_TX_AGGREGATE_HW_FIFO */
  1427. qosUpdateWMMParametersAndAssignAllowedACI(prAdapter, &prBssInfo->rWmmInfo);
  1428. } else {
  1429. #if CFG_TX_AGGREGATE_HW_FIFO
  1430. nicTxAggregateTXQ(prAdapter, TRUE);
  1431. #endif /* CFG_TX_AGGREGATE_HW_FIFO */
  1432. nicTxNonQoSAssignDefaultAdmittedTXQ(prAdapter);
  1433. nicTxNonQoSUpdateTXQParameters(prAdapter, prBssInfo->ePhyType);
  1434. }
  1435. #if CFG_TX_STOP_WRITE_TX_FIFO_UNTIL_JOIN
  1436. {
  1437. prTxCtrl->fgBlockTxDuringJoin = FALSE;
  1438. #if !CFG_TX_AGGREGATE_HW_FIFO /* TX FIFO AGGREGATE already do flush once */
  1439. nicTxFlushStopQueues(prAdapter, (UINT_8) TXQ_DATA_MASK, (UINT_8) NULL);
  1440. #endif /* CFG_TX_AGGREGATE_HW_FIFO */
  1441. nicTxRetransmitOfSendWaitQue(prAdapter);
  1442. if (prTxCtrl->fgIsPacketInOsSendQueue)
  1443. nicTxRetransmitOfOsSendQue(prAdapter);
  1444. #if CFG_SDIO_TX_ENHANCE
  1445. halTxLeftClusteredMpdu(prAdapter);
  1446. #endif /* CFG_SDIO_TX_ENHANCE */
  1447. }
  1448. #endif /* CFG_TX_STOP_WRITE_TX_FIFO_UNTIL_JOIN */
  1449. /* 4 <6> Setup CONNECTION flag. */
  1450. prAdapter->eConnectionState = MEDIA_STATE_CONNECTED;
  1451. prAdapter->eConnectionStateIndicated = MEDIA_STATE_CONNECTED;
  1452. if (prJoinInfo->fgIsReAssoc)
  1453. prAdapter->fgBypassPortCtrlForRoaming = TRUE;
  1454. else
  1455. prAdapter->fgBypassPortCtrlForRoaming = FALSE;
  1456. kalIndicateStatusAndComplete(prAdapter->prGlueInfo, WLAN_STATUS_MEDIA_CONNECT, (PVOID) NULL, 0);
  1457. } /* end of joinComplete() */
  1458. #endif