PageRenderTime 60ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/drivers/net/wireless/tiwlan1251/common/src/core/sme/conn/connIbss.c

http://github.com/CyanogenMod/cm-kernel
C | 530 lines | 204 code | 105 blank | 221 comment | 2 complexity | 169e2ab16841bd3e3d09b1d702f96e03 MD5 | raw file
Possible License(s): AGPL-1.0, GPL-2.0, LGPL-2.0
  1. /****************************************************************************
  2. **+-----------------------------------------------------------------------+**
  3. **| |**
  4. **| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved. |**
  5. **| All rights reserved. |**
  6. **| |**
  7. **| Redistribution and use in source and binary forms, with or without |**
  8. **| modification, are permitted provided that the following conditions |**
  9. **| are met: |**
  10. **| |**
  11. **| * Redistributions of source code must retain the above copyright |**
  12. **| notice, this list of conditions and the following disclaimer. |**
  13. **| * Redistributions in binary form must reproduce the above copyright |**
  14. **| notice, this list of conditions and the following disclaimer in |**
  15. **| the documentation and/or other materials provided with the |**
  16. **| distribution. |**
  17. **| * Neither the name Texas Instruments nor the names of its |**
  18. **| contributors may be used to endorse or promote products derived |**
  19. **| from this software without specific prior written permission. |**
  20. **| |**
  21. **| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |**
  22. **| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |**
  23. **| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
  24. **| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |**
  25. **| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
  26. **| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |**
  27. **| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
  28. **| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
  29. **| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |**
  30. **| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
  31. **| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |**
  32. **| |**
  33. **+-----------------------------------------------------------------------+**
  34. ****************************************************************************/
  35. /** \file connIbss.c
  36. * \brief IBSS connection implementation
  37. *
  38. * \see connIbss.h
  39. */
  40. #include "report.h"
  41. #include "osTIType.h"
  42. #include "osApi.h"
  43. #include "conn.h"
  44. #include "connIbss.h"
  45. #include "fsm.h"
  46. #include "siteMgrApi.h"
  47. #include "smeSmApi.h"
  48. #include "rsnApi.h"
  49. #include "DataCtrl_Api.h"
  50. #include "paramIn.h"
  51. #include "paramOut.h"
  52. #include "connApi.h"
  53. #include "EvHandler.h"
  54. #include "currBss.h"
  55. #include "TrafficMonitorAPI.h"
  56. #include "healthMonitor.h"
  57. /* Local functions prototypes */
  58. /* Local functions prototypes */
  59. static TI_STATUS idle_to_selfWait(void *pData);
  60. static TI_STATUS idle_to_rsnWait(void *pData);
  61. static TI_STATUS selfWait_to_idle(void *pData);
  62. static TI_STATUS selfWait_to_rsnWait(void *pData);
  63. static TI_STATUS rsnWait_to_idle(void *pData);
  64. static TI_STATUS rsnWait_to_connected(void *pData);
  65. static TI_STATUS connected_to_idle(void *pData);
  66. static TI_STATUS actionUnexpected(void *pData);
  67. static TI_STATUS actionNop(void *pData);
  68. /********************************************/
  69. /* Functions Implementations */
  70. /********************************************/
  71. /***********************************************************************
  72. * conn_ibssConfig
  73. ***********************************************************************
  74. DESCRIPTION: IBSS Connection configuration function, called by the conection set param function
  75. in the selection phase. Configures the connection state machine to IBSS connection mode
  76. INPUT: hConn - Connection handle.
  77. OUTPUT:
  78. RETURN: OK on success, NOK otherwise
  79. ************************************************************************/
  80. TI_STATUS conn_ibssConfig(conn_t *pConn)
  81. {
  82. fsm_actionCell_t smMatrix[CONN_IBSS_NUM_STATES][CONN_IBSS_NUM_EVENTS] =
  83. {
  84. /* next state and actions for IDLE state */
  85. { {STATE_CONN_IBSS_SELF_WAIT, idle_to_selfWait }, /* CONN_IBSS_CREATE */
  86. {STATE_CONN_IBSS_RSN_WAIT, idle_to_rsnWait }, /* CONN_IBSS_CONNECT */
  87. {STATE_CONN_IBSS_IDLE, actionNop }, /* CONN_IBSS_DISCONNECT */
  88. {STATE_CONN_IBSS_IDLE, actionUnexpected }, /* CONN_IBSS_RSN_SUCC */
  89. {STATE_CONN_IBSS_IDLE, actionUnexpected } /* CONN_IBSS_STA_JOINED */
  90. },
  91. /* next state and actions for SELF_WAIT state */
  92. { {STATE_CONN_IBSS_SELF_WAIT, actionUnexpected }, /* CONN_IBSS_CREATE */
  93. {STATE_CONN_IBSS_SELF_WAIT, actionUnexpected }, /* CONN_IBSS_CONNECT */
  94. {STATE_CONN_IBSS_IDLE, selfWait_to_idle }, /* CONN_IBSS_DISCONNECT */
  95. {STATE_CONN_IBSS_SELF_WAIT, actionUnexpected }, /* CONN_IBSS_RSN_SUCC */
  96. {STATE_CONN_IBSS_RSN_WAIT, selfWait_to_rsnWait } /* CONN_IBSS_STA_JOINED */
  97. },
  98. /* next state and actions for RSN_WAIT state */
  99. { {STATE_CONN_IBSS_RSN_WAIT, actionUnexpected }, /* CONN_IBSS_CREATE */
  100. {STATE_CONN_IBSS_RSN_WAIT, actionUnexpected }, /* CONN_IBSS_CONNECT */
  101. {STATE_CONN_IBSS_IDLE, rsnWait_to_idle }, /* CONN_IBSS_DISCONNECT */
  102. {STATE_CONN_IBSS_CONNECTED, rsnWait_to_connected}, /* CONN_IBSS_RSN_SUCC */
  103. {STATE_CONN_IBSS_RSN_WAIT, actionNop } /* CONN_IBSS_STA_JOINED */
  104. },
  105. /* next state and actions for CONNECTED state */
  106. { {STATE_CONN_IBSS_CONNECTED, actionUnexpected }, /* CONN_IBSS_CREATE */
  107. {STATE_CONN_IBSS_CONNECTED, actionUnexpected }, /* CONN_IBSS_CONNECT */
  108. {STATE_CONN_IBSS_IDLE, connected_to_idle }, /* CONN_IBSS_DISCONNECT */
  109. {STATE_CONN_IBSS_CONNECTED, actionUnexpected }, /* CONN_IBSS_RSN_SUCC */
  110. {STATE_CONN_IBSS_RSN_WAIT, actionNop } /* CONN_IBSS_STA_JOINED */
  111. }
  112. };
  113. return fsm_Config(pConn->ibss_pFsm, (fsm_Matrix_t)smMatrix, CONN_IBSS_NUM_STATES, CONN_IBSS_NUM_EVENTS, conn_ibssSMEvent, pConn->hOs);
  114. }
  115. /***********************************************************************
  116. * conn_ibssSMEvent
  117. ***********************************************************************
  118. DESCRIPTION: IBSS Connection SM event processing function, called by the connection API
  119. Perform the following:
  120. - Print the state movement as a result from the event
  121. - Calls the generic state machine event processing function which preform the following:
  122. - Calls the correspoding callback function
  123. - Move to next state
  124. INPUT: currentState - Pointer to the connection current state.
  125. event - Received event
  126. pConn - Connection handle
  127. OUTPUT:
  128. RETURN: OK on success, NOK otherwise
  129. ************************************************************************/
  130. #ifdef REPORT_LOG
  131. static char *stateDesc[CONN_IBSS_NUM_STATES] =
  132. {
  133. "STATE_CONN_IBSS_IDLE",
  134. "STATE_CONN_IBSS_SELF_WAIT",
  135. "STATE_CONN_IBSS_RSN_WAIT",
  136. "STATE_CONN_IBSS_CONNECTED"
  137. };
  138. static char *eventDesc[CONN_IBSS_NUM_EVENTS] =
  139. {
  140. "CONN_IBSS_START",
  141. "CONN_IBSS_CONNECT",
  142. "CONN_IBSS_DISCONNECT",
  143. "CONN_IBSS_RSN_SUCC",
  144. "CONN_IBSS_STA_JOINED"
  145. };
  146. #endif
  147. TI_STATUS conn_ibssSMEvent(UINT8 *currentState, UINT8 event, TI_HANDLE hConn)
  148. {
  149. conn_t *pConn = (conn_t *)hConn;
  150. TI_STATUS status;
  151. UINT8 nextState;
  152. status = fsm_GetNextState(pConn->ibss_pFsm, *currentState, event, &nextState);
  153. if (status != OK)
  154. {
  155. WLAN_REPORT_SM(pConn->hReport, CONN_MODULE_LOG, ("IBSS State machine error, failed getting next state\n"));
  156. return(NOK);
  157. }
  158. WLAN_REPORT_SM(pConn->hReport, CONN_MODULE_LOG,
  159. ("IBSS: <%s, %s> --> %s\n\n",
  160. stateDesc[*currentState],
  161. eventDesc[event],
  162. stateDesc[nextState]));
  163. status = fsm_Event(pConn->ibss_pFsm, currentState, event, (void *)pConn);
  164. return status;
  165. }
  166. /************************************************************************************************************/
  167. /* In the following section are listed the callback function used by the IBSS connection state machine */
  168. /************************************************************************************************************/
  169. /***********************************************************************
  170. * idle_to_selfWait
  171. ***********************************************************************
  172. DESCRIPTION:
  173. INPUT:
  174. OUTPUT:
  175. RETURN: OK on success, NOK otherwise
  176. ************************************************************************/
  177. static TI_STATUS idle_to_selfWait(void *pData)
  178. {
  179. UINT16 randomTime;
  180. /*Request from ELP to stay awake*/
  181. MacServices_powerAutho_AwakeRequiredUpdate(((conn_t *)pData)->hMacServices, POWERAUTHO_AWAKE_REQUIRED, POWERAUTHO_AWAKE_REASON_IBSS);
  182. siteMgr_join(((conn_t *)pData)->hSiteMgr);
  183. txData_disableTransmission(((conn_t *)pData)->hTxData, NO_DISABLE);
  184. /* get a randomTime that is constructed of the lower 13 bits ot the system time to
  185. get a MS random time of ~8000 ms */
  186. randomTime = os_timeStampMs(((conn_t *)pData)->hOs) & 0x1FFF;
  187. /* Update current BSS connection type and mode */
  188. currBSS_updateConnectedState(((conn_t *)pData)->hCurrBss, TRUE, BSS_INDEPENDENT);
  189. os_timerStart(((conn_t *)pData)->hOs, ((conn_t *)pData)->pTimer, (((conn_t *)pData)->timeout + randomTime), FALSE);
  190. return OK;
  191. }
  192. /***********************************************************************
  193. * idle_to_rsnWait
  194. ***********************************************************************
  195. DESCRIPTION:
  196. INPUT:
  197. OUTPUT:
  198. RETURN: OK on success, NOK otherwise
  199. ************************************************************************/
  200. static TI_STATUS idle_to_rsnWait(void *pData)
  201. {
  202. paramInfo_t param;
  203. /*Request from ELP to stay awake*/
  204. MacServices_powerAutho_AwakeRequiredUpdate(((conn_t *)pData)->hMacServices, POWERAUTHO_AWAKE_REQUIRED, POWERAUTHO_AWAKE_REASON_IBSS);
  205. siteMgr_join(((conn_t *)pData)->hSiteMgr);
  206. txData_disableTransmission(((conn_t *)pData)->hTxData, NO_DISABLE);
  207. param.paramType = RX_DATA_PORT_STATUS_PARAM;
  208. param.content.rxDataPortStatus = OPEN_EAPOL;
  209. rxData_setParam(((conn_t *)pData)->hRxData, &param);
  210. param.paramType = TX_DATA_PORT_STATUS_PARAM;
  211. param.content.txDataPortStatus = OPEN_EAPOL;
  212. txData_setParam(((conn_t *)pData)->hTxData, &param);
  213. /*
  214. * Notify that the driver is associated to the supplicant\IP stack.
  215. */
  216. EvHandlerSendEvent(((conn_t *)pData)->hEvHandler, IPC_EVENT_ASSOCIATED, NULL,0);
  217. /* Update current BSS connection type and mode */
  218. currBSS_updateConnectedState(((conn_t *)pData)->hCurrBss, TRUE, BSS_INDEPENDENT);
  219. return rsn_start(((conn_t *)pData)->hRsn);
  220. }
  221. /***********************************************************************
  222. * selfWait_to_idle
  223. ***********************************************************************
  224. DESCRIPTION:
  225. INPUT:
  226. OUTPUT:
  227. RETURN: OK on success, NOK otherwise
  228. ************************************************************************/
  229. static TI_STATUS selfWait_to_idle(void *pData)
  230. {
  231. paramInfo_t param;
  232. os_timerStop(((conn_t *)pData)->hOs, ((conn_t *)pData)->pTimer);
  233. siteMgr_removeSelfSite(((conn_t *)pData)->hSiteMgr);
  234. /* Update current BSS connection type and mode */
  235. currBSS_updateConnectedState(((conn_t *)pData)->hCurrBss, FALSE, BSS_INDEPENDENT);
  236. /* Release ELP */
  237. MacServices_powerAutho_AwakeRequiredUpdate(((conn_t *)pData)->hMacServices, POWERAUTHO_AWAKE_NOT_REQUIRED, POWERAUTHO_AWAKE_REASON_IBSS);
  238. /* stop beacon generation */
  239. param.paramType = RX_DATA_PORT_STATUS_PARAM;
  240. param.content.rxDataPortStatus = CLOSE;
  241. rxData_setParam(((conn_t *)pData)->hRxData, &param);
  242. param.paramType = TX_DATA_PORT_STATUS_PARAM;
  243. param.content.txDataPortStatus = CLOSE;
  244. txData_setParam(((conn_t *)pData)->hTxData, &param);
  245. whalCtrl_FwDisconnect(((conn_t *)pData)->hHalCtrl,
  246. RX_CONFIG_OPTION_MY_DST_MY_BSS,
  247. RX_FILTER_OPTION_FILTER_ALL);
  248. /* Inform the SME about the connection lost */
  249. smeSm_reportConnStatus(((conn_t *)pData)->hSmeSm, STATUS_UNSPECIFIED, 0);
  250. return OK;
  251. }
  252. /***********************************************************************
  253. * selfWait_to_rsnWait
  254. ***********************************************************************
  255. DESCRIPTION:
  256. INPUT:
  257. OUTPUT:
  258. RETURN: OK on success, NOK otherwise
  259. ************************************************************************/
  260. static TI_STATUS selfWait_to_rsnWait(void *pData)
  261. {
  262. paramInfo_t param;
  263. os_timerStop(((conn_t *)pData)->hOs, ((conn_t *)pData)->pTimer);
  264. param.paramType = RX_DATA_PORT_STATUS_PARAM;
  265. param.content.rxDataPortStatus = OPEN_EAPOL;
  266. rxData_setParam(((conn_t *)pData)->hRxData, &param);
  267. param.paramType = TX_DATA_PORT_STATUS_PARAM;
  268. param.content.txDataPortStatus = OPEN_EAPOL;
  269. txData_setParam(((conn_t *)pData)->hTxData, &param);
  270. /*
  271. * Notify that the driver is associated to the supplicant\IP stack.
  272. */
  273. EvHandlerSendEvent(((conn_t *)pData)->hEvHandler, IPC_EVENT_ASSOCIATED, NULL,0);
  274. return rsn_start(((conn_t *)pData)->hRsn);
  275. }
  276. /***********************************************************************
  277. * rsnWait_to_idle
  278. ***********************************************************************
  279. DESCRIPTION:
  280. INPUT:
  281. OUTPUT:
  282. RETURN: OK on success, NOK otherwise
  283. ************************************************************************/
  284. static TI_STATUS rsnWait_to_idle(void *pData)
  285. {
  286. paramInfo_t param;
  287. rsn_stop(((conn_t *)pData)->hRsn, FALSE);
  288. param.paramType = RX_DATA_PORT_STATUS_PARAM;
  289. param.content.rxDataPortStatus = CLOSE;
  290. rxData_setParam(((conn_t *)pData)->hRxData, &param);
  291. param.paramType = TX_DATA_PORT_STATUS_PARAM;
  292. param.content.txDataPortStatus = CLOSE;
  293. txData_setParam(((conn_t *)pData)->hTxData, &param);
  294. /* Update current BSS connection type and mode */
  295. currBSS_updateConnectedState(((conn_t *)pData)->hCurrBss, FALSE, BSS_INDEPENDENT);
  296. /* Release ELP */
  297. MacServices_powerAutho_AwakeRequiredUpdate(((conn_t *)pData)->hMacServices, POWERAUTHO_AWAKE_NOT_REQUIRED, POWERAUTHO_AWAKE_REASON_IBSS);
  298. /* stop beacon generation */
  299. whalCtrl_FwDisconnect(((conn_t *)pData)->hHalCtrl,
  300. RX_CONFIG_OPTION_MY_DST_MY_BSS,
  301. RX_FILTER_OPTION_FILTER_ALL);
  302. smeSm_reportConnStatus(((conn_t *)pData)->hSmeSm, STATUS_UNSPECIFIED, 0);
  303. return OK;
  304. }
  305. /***********************************************************************
  306. * rsnWait_to_connected
  307. ***********************************************************************
  308. DESCRIPTION:
  309. INPUT:
  310. OUTPUT:
  311. RETURN: OK on success, NOK otherwise
  312. ************************************************************************/
  313. static TI_STATUS rsnWait_to_connected(void *pData)
  314. {
  315. paramInfo_t param;
  316. conn_t *pConn=(conn_t *)pData;
  317. ctrlData_start(pConn->hCtrlData);
  318. TrafficMonitor_Start( pConn->hTrafficMonitor );
  319. healthMonitor_setState(pConn->hHealthMonitor, HEALTH_MONITOR_STATE_CONNECTED);
  320. siteMgr_start(pConn->hSiteMgr);
  321. param.paramType = RX_DATA_PORT_STATUS_PARAM;
  322. param.content.rxDataPortStatus = OPEN;
  323. rxData_setParam(((conn_t *)pData)->hRxData, &param);
  324. param.paramType = TX_DATA_PORT_STATUS_PARAM;
  325. param.content.txDataPortStatus = OPEN;
  326. txData_setParam(((conn_t *)pData)->hTxData, &param);
  327. /* Update current BSS connection type and mode */
  328. currBSS_updateConnectedState(pConn->hCurrBss, TRUE, BSS_INDEPENDENT);
  329. return smeSm_reportConnStatus(((conn_t *)pData)->hSmeSm, STATUS_SUCCESSFUL, 0);
  330. }
  331. /***********************************************************************
  332. * connected_to_idle
  333. ***********************************************************************
  334. DESCRIPTION:
  335. INPUT:
  336. OUTPUT:
  337. RETURN: OK on success, NOK otherwise
  338. ************************************************************************/
  339. static TI_STATUS connected_to_idle(void *pData)
  340. {
  341. conn_t *pConn=(conn_t *)pData;
  342. TrafficMonitor_Stop(pConn->hTrafficMonitor);
  343. healthMonitor_setState(pConn->hHealthMonitor, HEALTH_MONITOR_STATE_DISCONNECTED);
  344. /* The logic of this action is identical to rsnWait_to_idle */
  345. return rsnWait_to_idle(pConn);
  346. }
  347. /***********************************************************************
  348. * actionUnexpected
  349. ***********************************************************************
  350. DESCRIPTION:
  351. INPUT:
  352. OUTPUT:
  353. RETURN: OK on success, NOK otherwise
  354. ************************************************************************/
  355. static TI_STATUS actionUnexpected(void *pData)
  356. {
  357. conn_t *pConn = (conn_t *)pData;
  358. WLAN_REPORT_SM(pConn->hReport, CONN_MODULE_LOG, ("State machine error, unexpected Event\n\n"));
  359. return OK;
  360. }
  361. /***********************************************************************
  362. * actionNop
  363. ***********************************************************************
  364. DESCRIPTION:
  365. INPUT:
  366. OUTPUT:
  367. RETURN: OK on success, NOK otherwise
  368. ************************************************************************/
  369. static TI_STATUS actionNop(void *pData)
  370. {
  371. return OK;
  372. }