| /* |
| * externalSec.c |
| * |
| * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved. |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * |
| * * Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * * Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in |
| * the documentation and/or other materials provided with the |
| * distribution. |
| * * Neither the name Texas Instruments nor the names of its |
| * contributors may be used to endorse or promote products derived |
| * from this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| /** \file externalSec.c |
| * \brief station externalSec implementation |
| * |
| * \see externalSec.h |
| */ |
| |
| /**************************************************************************** |
| * * |
| * MODULE: station externalSec * |
| * PURPOSE: station uexternalSec implementation * |
| * * |
| ****************************************************************************/ |
| |
| #define __FILE_ID__ FILE_ID_134 |
| #include "osApi.h" |
| #include "report.h" |
| #include "rsnApi.h" |
| #include "smeApi.h" |
| #include "mainSecSm.h" |
| #include "externalSec.h" |
| #include "connApi.h" |
| |
| TI_STATUS externalSecSM_Nop(struct externalSec_t *pExternalSec); |
| TI_STATUS externalSecSM_start(mainSec_t *pMainSec); |
| TI_STATUS externalSecSM_stop(mainSec_t *pMainSec); |
| TI_STATUS externalSecSM_setPort(struct externalSec_t *pExternalSec); |
| TI_STATUS externalSecSM_Unexpected(struct externalSec_t *pExternalSec); |
| /** |
| * |
| * Function - externalSec_config. |
| * |
| * \b Description: |
| * |
| * Called by mainSecSM (mainSec_config). |
| * builds the SM and register the mainSec start and stop events. |
| * |
| * \b ARGS: |
| * |
| * |
| * \b RETURNS: |
| * |
| * TI_STATUS - 0 on success, any other value on failure. |
| * |
| */ |
| TI_STATUS externalSec_config(mainSec_t *pMainSec) |
| { |
| struct externalSec_t *pExtSec = pMainSec-> pExternalSec; |
| TI_STATUS status = TI_NOK; |
| |
| /** Station externalSec State Machine matrix */ |
| fsm_actionCell_t externalSec_matrix[EXTERNAL_SEC_NUM_STATES][EXTERNAL_SEC_NUM_EVENTS] = |
| { |
| /* next state and actions for IDLE state */ |
| { |
| {EXTERNAL_SEC_STATE_WAIT,(fsm_Action_t)externalSecSM_Nop}, /*EXTERNAL_SEC_EVENT_START */ |
| {EXTERNAL_SEC_STATE_IDLE,(fsm_Action_t)externalSecSM_Unexpected}, /*EXTERNAL_SEC_EVENT_COMPLETE*/ |
| {EXTERNAL_SEC_STATE_IDLE,(fsm_Action_t)externalSecSM_Nop} /*EXTERNAL_SEC_EVENT_STOP */ |
| }, |
| |
| /* next state and actions for Wait state */ |
| { |
| {EXTERNAL_SEC_STATE_WAIT,(fsm_Action_t)externalSecSM_Unexpected},/*EXTERNAL_SEC_EVENT_START */ |
| {EXTERNAL_SEC_STATE_IDLE,(fsm_Action_t)externalSecSM_setPort}, /*EXTERNAL_SEC_EVENT_COMPLETE*/ |
| {EXTERNAL_SEC_STATE_IDLE,(fsm_Action_t)externalSecSM_Nop} /*EXTERNAL_SEC_EVENT_STOP */ |
| } |
| }; |
| |
| pExtSec->hOs = pMainSec->hOs; |
| pExtSec->hReport = pMainSec->hReport; |
| pExtSec->pParent = pMainSec; |
| pMainSec->start = (mainSecSmStart_t)externalSecSM_start; |
| pMainSec->stop = (mainSecSmStart_t)externalSecSM_stop; |
| pExtSec->currentState = EXTERNAL_SEC_STATE_IDLE; |
| |
| status = fsm_Config(pExtSec->pExternalSecSm, |
| &externalSec_matrix[0][0], |
| EXTERNAL_SEC_NUM_STATES, |
| EXTERNAL_SEC_NUM_EVENTS, |
| NULL, pExtSec->hOs); |
| |
| |
| return status; |
| } |
| |
| /** |
| * |
| * Function - externalSec_create. |
| * |
| * \b Description: |
| * |
| * Called by mainSecSM (mainSec_create). |
| * Registers the function 'rsn_UnicastKeyRecv()' at the distributor to receive KEY frames upon receiving a KEY_RECV event. |
| * |
| * \b ARGS: |
| * |
| * |
| * \b RETURNS: |
| * |
| * TI_STATUS - 0 on success, any other value on failure. |
| * |
| */ |
| struct externalSec_t* externalSec_create(TI_HANDLE hOs) |
| { |
| struct externalSec_t *pHandle; |
| TI_STATUS status; |
| |
| /* allocate association context memory */ |
| pHandle = (struct externalSec_t*)os_memoryAlloc(hOs, sizeof(struct externalSec_t)); |
| if (pHandle == NULL) |
| { |
| return NULL; |
| } |
| |
| os_memoryZero(hOs, pHandle, sizeof(struct externalSec_t)); |
| |
| /* allocate memory for association state machine */ |
| status = fsm_Create(hOs,&pHandle->pExternalSecSm, EXTERNAL_SEC_NUM_STATES, EXTERNAL_SEC_NUM_EVENTS); |
| |
| if (status != TI_OK) |
| { |
| os_memoryFree(hOs, pHandle, sizeof(struct externalSec_t)); |
| return NULL; |
| } |
| |
| return pHandle; |
| } |
| |
| /** |
| * |
| * Function - externalSec_Destroy. |
| * |
| * \b Description: |
| * |
| * Called by mainSecSM (mainSec_unload). |
| * |
| * \b ARGS: |
| * |
| * |
| * \b RETURNS: |
| * |
| * TI_STATUS - 0 on success, any other value on failure. |
| * |
| */ |
| TI_STATUS externalSec_Destroy (struct externalSec_t *pExternalSec) |
| { |
| TI_STATUS status; |
| |
| if (pExternalSec == NULL) |
| { |
| return TI_NOK; |
| } |
| status = fsm_Unload(pExternalSec->hOs, pExternalSec->pExternalSecSm); |
| if (status != TI_OK) |
| { |
| /* report failure but don't stop... */ |
| TRACE0(pExternalSec->hReport, REPORT_SEVERITY_ERROR, "EXTERNAL SECURITY: Error releasing FSM memory \n"); |
| } |
| |
| os_memoryFree(pExternalSec->hOs, pExternalSec, sizeof(struct externalSec_t)); |
| return TI_OK; |
| } |
| |
| /** |
| * |
| * Function - externalSecSM_start. |
| * |
| * \b Description: |
| * |
| * Called upon the EXTERNAL_SEC_EVENT_START event |
| * |
| * \b ARGS: |
| * |
| * |
| * \b RETURNS: |
| * |
| * TI_STATUS - 0 on success, any other value on failure. |
| * |
| */ |
| TI_STATUS externalSecSM_start(mainSec_t *pMainSec) |
| { |
| /* called by the rsn_start() */ |
| return externalSec_event(pMainSec->pExternalSec, EXTERNAL_SEC_EVENT_START, pMainSec->pExternalSec); |
| } |
| |
| /** |
| * |
| * Function - externalSecSM_stop. |
| * |
| * \b Description: |
| * |
| * Called upon the EXTERNAL_SEC_EVENT_STOP event |
| * |
| * \b ARGS: |
| * |
| * |
| * \b RETURNS: |
| * |
| * TI_STATUS - 0 on success, any other value on failure. |
| * |
| */ |
| TI_STATUS externalSecSM_stop(mainSec_t *pMainSec) |
| { |
| /* called by the rsn_stop() */ |
| return externalSec_event(pMainSec->pExternalSec, EXTERNAL_SEC_EVENT_STOP, pMainSec->pExternalSec); |
| } |
| |
| /** |
| * |
| * Function - externalSec_event. |
| * |
| * \b Description: |
| * |
| * Called by the rsn_PortStatus_Set() API upon external set port status cmd. |
| * |
| * \b ARGS: |
| * |
| * |
| * \b RETURNS: |
| * |
| * TI_STATUS - 0 on success, any other value on failure. |
| * |
| */ |
| TI_STATUS externalSec_event(struct externalSec_t *pExternalSec, TI_UINT8 event, void *pData) |
| { |
| TI_STATUS status; |
| TI_UINT8 nextState; |
| |
| status = fsm_GetNextState(pExternalSec->pExternalSecSm, |
| pExternalSec->currentState, |
| event, |
| &nextState); |
| if (status != TI_OK) |
| { |
| TRACE0(pExternalSec->hReport, REPORT_SEVERITY_ERROR, "EXTERNAL_SEC_SM: ERROR: failed getting next state\n"); |
| return TI_NOK; |
| } |
| |
| TRACE3(pExternalSec->hReport, REPORT_SEVERITY_INFORMATION, "STATION_EXT_SEC_SM: <currentState = %d, event = %d> --> nextState = %d\n", pExternalSec->currentState, event, nextState); |
| status = fsm_Event(pExternalSec->pExternalSecSm, |
| &pExternalSec->currentState, |
| event, |
| pData); |
| |
| return status; |
| } |
| |
| |
| /** |
| * |
| * Function - externalSecSM_setPort. |
| * |
| * \b Description: |
| * |
| * Call the connection report status API. |
| * |
| * \b ARGS: |
| * |
| * |
| * \b RETURNS: |
| * |
| * TI_STATUS - 0 on success, any other value on failure. |
| * |
| */ |
| TI_STATUS externalSecSM_setPort(struct externalSec_t *pExternalSec) |
| { |
| TI_STATUS status = TI_OK; |
| struct _rsn_t *pRsn; |
| |
| pRsn = pExternalSec->pParent->pParent; |
| if (TI_TRUE == pExternalSec->bPortStatus) |
| { |
| status = conn_reportRsnStatus(pRsn->hConn, (mgmtStatus_e)STATUS_SUCCESSFUL); |
| } |
| else |
| { |
| status = conn_reportRsnStatus(pRsn->hConn, (mgmtStatus_e)STATUS_SECURITY_FAILURE); |
| } |
| |
| return status; |
| } |
| |
| |
| TI_STATUS externalSec_rsnComplete(struct externalSec_t *pExternalSec) |
| { |
| return externalSec_event(pExternalSec, EXTERNAL_SEC_EVENT_COMPLETE, pExternalSec); |
| } |
| |
| /** |
| * |
| * Function - externalSecSM_Nop. |
| * |
| * \b Description: |
| * |
| * Do nothing |
| * |
| * \b ARGS: |
| * |
| * \b RETURNS: TI_OK |
| * |
| */ |
| TI_STATUS externalSecSM_Nop(struct externalSec_t *pExternalSec) |
| { |
| return(TI_OK); |
| } |
| |
| /** |
| * |
| * Function - externalSecSM_Unexpected. |
| * |
| * \b Description: |
| * |
| * Do nothing |
| * |
| * \b ARGS: |
| * |
| * \b RETURNS: TI_STATUS |
| * |
| */ |
| TI_STATUS externalSecSM_Unexpected(struct externalSec_t *pExternalSec) |
| { |
| TRACE0(pExternalSec->hReport, REPORT_SEVERITY_ERROR, "EXTERNAL_SEC_SM: ERROR UnExpected Event\n"); |
| return(TI_OK); |
| } |