• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * externalSec.c
3  *
4  * Copyright(c) 1998 - 2009 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 /** \file externalSec.c
35  * \brief station externalSec implementation
36  *
37  * \see externalSec.h
38 */
39 
40 /****************************************************************************
41  *                                                                          *
42  *   MODULE:	station externalSec		                                    *
43  *   PURPOSE:   station uexternalSec implementation						    *
44  *                                                                          *
45  ****************************************************************************/
46 
47 #define __FILE_ID__  FILE_ID_134
48 #include "osApi.h"
49 #include "report.h"
50 #include "rsnApi.h"
51 #include "smeApi.h"
52 #include "mainSecSm.h"
53 #include "externalSec.h"
54 #include "connApi.h"
55 
56 TI_STATUS externalSecSM_Nop(struct externalSec_t *pExternalSec);
57 TI_STATUS externalSecSM_start(mainSec_t *pMainSec);
58 TI_STATUS externalSecSM_stop(mainSec_t *pMainSec);
59 TI_STATUS externalSecSM_setPort(struct externalSec_t *pExternalSec);
60 TI_STATUS externalSecSM_Unexpected(struct externalSec_t *pExternalSec);
61 /**
62 *
63 * Function  - externalSec_config.
64 *
65 * \b Description:
66 *
67 * Called by mainSecSM (mainSec_config).
68 * builds the SM and register the mainSec start and stop events.
69 *
70 * \b ARGS:
71 *
72 *
73 * \b RETURNS:
74 *
75 *  TI_STATUS - 0 on success, any other value on failure.
76 *
77 */
externalSec_config(mainSec_t * pMainSec)78 TI_STATUS externalSec_config(mainSec_t *pMainSec)
79 {
80     struct externalSec_t	 *pExtSec = pMainSec-> pExternalSec;
81 	TI_STATUS                status = TI_NOK;
82 
83 	/** Station externalSec State Machine matrix */
84     fsm_actionCell_t externalSec_matrix[EXTERNAL_SEC_NUM_STATES][EXTERNAL_SEC_NUM_EVENTS] =
85 	{
86     	/* next state and actions for IDLE state */
87         {
88             {EXTERNAL_SEC_STATE_WAIT,(fsm_Action_t)externalSecSM_Nop},       /*EXTERNAL_SEC_EVENT_START */
89             {EXTERNAL_SEC_STATE_IDLE,(fsm_Action_t)externalSecSM_Unexpected},       /*EXTERNAL_SEC_EVENT_COMPLETE*/
90             {EXTERNAL_SEC_STATE_IDLE,(fsm_Action_t)externalSecSM_Nop}        /*EXTERNAL_SEC_EVENT_STOP */
91         },
92 
93     	/* next state and actions for Wait state */
94     	{
95             {EXTERNAL_SEC_STATE_WAIT,(fsm_Action_t)externalSecSM_Unexpected},/*EXTERNAL_SEC_EVENT_START */
96             {EXTERNAL_SEC_STATE_IDLE,(fsm_Action_t)externalSecSM_setPort},    /*EXTERNAL_SEC_EVENT_COMPLETE*/
97             {EXTERNAL_SEC_STATE_IDLE,(fsm_Action_t)externalSecSM_Nop}        /*EXTERNAL_SEC_EVENT_STOP */
98     	}
99 	};
100 
101     pExtSec->hOs = pMainSec->hOs;
102     pExtSec->hReport = pMainSec->hReport;
103     pExtSec->pParent = pMainSec;
104     pMainSec->start = (mainSecSmStart_t)externalSecSM_start;
105     pMainSec->stop = (mainSecSmStart_t)externalSecSM_stop;
106     pExtSec->currentState = EXTERNAL_SEC_STATE_IDLE;
107 
108     status = fsm_Config(pExtSec->pExternalSecSm,
109 						&externalSec_matrix[0][0],
110 						EXTERNAL_SEC_NUM_STATES,
111 						EXTERNAL_SEC_NUM_EVENTS,
112 						NULL, pExtSec->hOs);
113 
114 
115 	return status;
116 }
117 
118 /**
119 *
120 * Function  - externalSec_create.
121 *
122 * \b Description:
123 *
124 * Called by mainSecSM (mainSec_create).
125 * Registers the function 'rsn_UnicastKeyRecv()' at the distributor to receive KEY frames upon receiving a KEY_RECV event.
126 *
127 * \b ARGS:
128 *
129 *
130 * \b RETURNS:
131 *
132 *  TI_STATUS - 0 on success, any other value on failure.
133 *
134 */
externalSec_create(TI_HANDLE hOs)135 struct externalSec_t* externalSec_create(TI_HANDLE hOs)
136 {
137     struct externalSec_t    *pHandle;
138     TI_STATUS		        status;
139 
140     /* allocate association context memory */
141     pHandle = (struct externalSec_t*)os_memoryAlloc(hOs, sizeof(struct externalSec_t));
142     if (pHandle == NULL)
143     {
144         return NULL;
145     }
146 
147     os_memoryZero(hOs, pHandle, sizeof(struct externalSec_t));
148 
149     /* allocate memory for association state machine */
150     status = fsm_Create(hOs,&pHandle->pExternalSecSm, EXTERNAL_SEC_NUM_STATES, EXTERNAL_SEC_NUM_EVENTS);
151 
152     if (status != TI_OK)
153     {
154         os_memoryFree(hOs, pHandle, sizeof(struct externalSec_t));
155         return NULL;
156     }
157 
158     return pHandle;
159 }
160 
161 /**
162 *
163 * Function  - externalSec_Destroy.
164 *
165 * \b Description:
166 *
167 * Called by mainSecSM (mainSec_unload).
168 *
169 * \b ARGS:
170 *
171 *
172 * \b RETURNS:
173 *
174 *  TI_STATUS - 0 on success, any other value on failure.
175 *
176 */
externalSec_Destroy(struct externalSec_t * pExternalSec)177 TI_STATUS externalSec_Destroy (struct externalSec_t *pExternalSec)
178 {
179     TI_STATUS	status;
180 
181     if (pExternalSec == NULL)
182     {
183         return TI_NOK;
184     }
185     status = fsm_Unload(pExternalSec->hOs, pExternalSec->pExternalSecSm);
186     if (status != TI_OK)
187     {
188         /* report failure but don't stop... */
189         TRACE0(pExternalSec->hReport, REPORT_SEVERITY_ERROR, "EXTERNAL SECURITY: Error releasing FSM memory \n");
190     }
191 
192     os_memoryFree(pExternalSec->hOs, pExternalSec, sizeof(struct externalSec_t));
193     return TI_OK;
194 }
195 
196 /**
197 *
198 * Function  - externalSecSM_start.
199 *
200 * \b Description:
201 *
202 * Called upon the EXTERNAL_SEC_EVENT_START event
203 *
204 * \b ARGS:
205 *
206 *
207 * \b RETURNS:
208 *
209 *  TI_STATUS - 0 on success, any other value on failure.
210 *
211 */
externalSecSM_start(mainSec_t * pMainSec)212 TI_STATUS externalSecSM_start(mainSec_t *pMainSec)
213 {
214 	/* called by the rsn_start() */
215 	return externalSec_event(pMainSec->pExternalSec, EXTERNAL_SEC_EVENT_START, pMainSec->pExternalSec);
216 }
217 
218 /**
219 *
220 * Function  - externalSecSM_stop.
221 *
222 * \b Description:
223 *
224 * Called upon the EXTERNAL_SEC_EVENT_STOP event
225 *
226 * \b ARGS:
227 *
228 *
229 * \b RETURNS:
230 *
231 *  TI_STATUS - 0 on success, any other value on failure.
232 *
233 */
externalSecSM_stop(mainSec_t * pMainSec)234 TI_STATUS externalSecSM_stop(mainSec_t *pMainSec)
235 {
236 	/* called by the rsn_stop() */
237     return externalSec_event(pMainSec->pExternalSec, EXTERNAL_SEC_EVENT_STOP, pMainSec->pExternalSec);
238 }
239 
240 /**
241 *
242 * Function  - externalSec_event.
243 *
244 * \b Description:
245 *
246 * Called by the  rsn_PortStatus_Set() API upon external set port status cmd.
247 *
248 * \b ARGS:
249 *
250 *
251 * \b RETURNS:
252 *
253 *  TI_STATUS - 0 on success, any other value on failure.
254 *
255 */
externalSec_event(struct externalSec_t * pExternalSec,TI_UINT8 event,void * pData)256 TI_STATUS externalSec_event(struct externalSec_t *pExternalSec, TI_UINT8 event, void *pData)
257 {
258     TI_STATUS   status;
259     TI_UINT8    nextState;
260 
261     status = fsm_GetNextState(pExternalSec->pExternalSecSm,
262                               pExternalSec->currentState,
263                               event,
264                               &nextState);
265     if (status != TI_OK)
266     {
267         TRACE0(pExternalSec->hReport, REPORT_SEVERITY_ERROR, "EXTERNAL_SEC_SM: ERROR: failed getting next state\n");
268         return TI_NOK;
269 	}
270 
271     TRACE3(pExternalSec->hReport, REPORT_SEVERITY_INFORMATION, "STATION_EXT_SEC_SM: <currentState = %d, event = %d> --> nextState = %d\n", pExternalSec->currentState, event, nextState);
272     status = fsm_Event(pExternalSec->pExternalSecSm,
273                        &pExternalSec->currentState,
274                        event,
275                        pData);
276 
277     return status;
278 }
279 
280 
281 /**
282 *
283 * Function  - externalSecSM_setPort.
284 *
285 * \b Description:
286 *
287 * Call the connection report status API.
288 *
289 * \b ARGS:
290 *
291 *
292 * \b RETURNS:
293 *
294 *  TI_STATUS - 0 on success, any other value on failure.
295 *
296 */
externalSecSM_setPort(struct externalSec_t * pExternalSec)297 TI_STATUS externalSecSM_setPort(struct externalSec_t *pExternalSec)
298 {
299     TI_STATUS       status = TI_OK;
300     struct _rsn_t   *pRsn;
301 
302     pRsn = pExternalSec->pParent->pParent;
303     if (TI_TRUE == pExternalSec->bPortStatus)
304     {
305         status  = conn_reportRsnStatus(pRsn->hConn, (mgmtStatus_e)STATUS_SUCCESSFUL);
306     }
307     else
308     {
309         status = conn_reportRsnStatus(pRsn->hConn, (mgmtStatus_e)STATUS_SECURITY_FAILURE);
310     }
311 
312     return status;
313 }
314 
315 
externalSec_rsnComplete(struct externalSec_t * pExternalSec)316 TI_STATUS externalSec_rsnComplete(struct externalSec_t *pExternalSec)
317 {
318 	return externalSec_event(pExternalSec, EXTERNAL_SEC_EVENT_COMPLETE, pExternalSec);
319 }
320 
321 /**
322 *
323 * Function  - externalSecSM_Nop.
324 *
325 * \b Description:
326 *
327 * Do nothing
328 *
329 * \b ARGS:
330 *
331 * \b RETURNS: TI_OK
332 *
333 */
externalSecSM_Nop(struct externalSec_t * pExternalSec)334 TI_STATUS externalSecSM_Nop(struct externalSec_t *pExternalSec)
335 {
336     return(TI_OK);
337 }
338 
339 /**
340 *
341 * Function  - externalSecSM_Unexpected.
342 *
343 * \b Description:
344 *
345 * Do nothing
346 *
347 * \b ARGS:
348 *
349 * \b RETURNS: TI_STATUS
350 *
351 */
externalSecSM_Unexpected(struct externalSec_t * pExternalSec)352 TI_STATUS externalSecSM_Unexpected(struct externalSec_t *pExternalSec)
353 {
354     TRACE0(pExternalSec->hReport, REPORT_SEVERITY_ERROR, "EXTERNAL_SEC_SM: ERROR UnExpected Event\n");
355     return(TI_OK);
356 }
357