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