| /* |
| * ipc_wpa.c |
| * |
| * Copyright 2001-2009 Texas Instruments, Inc. - http://www.ti.com/ |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /**************************************************************************** |
| * |
| * MODULE: Ipc_Wpa.c |
| * |
| * PURPOSE: |
| * |
| * DESCRIPTION: |
| * ============ |
| * |
| * |
| ****************************************************************************/ |
| |
| /* includes */ |
| /************/ |
| #include <sys/types.h> |
| |
| |
| #include "cu_osapi.h" |
| #include "oserr.h" |
| #include "wpa_ctrl.h" |
| #include "ipc_wpa.h" |
| |
| /* defines */ |
| /***********/ |
| #define IPC_WPA_CTRL_OPEN_RETRIES 5 |
| |
| /* local types */ |
| /***************/ |
| /* Module control block */ |
| typedef struct TIpcWpa |
| { |
| struct wpa_ctrl *pWpaCtrl; |
| #if 0 |
| S32 socket; |
| struct sockaddr_in local; |
| struct sockaddr_in dest; |
| #endif |
| } TIpcWpa; |
| |
| /* local variables */ |
| /*******************/ |
| |
| /* local fucntions */ |
| /*******************/ |
| static S32 IpcWpa_Sockets_Open(TIpcWpa* pIpcWpa, PS8 pSupplIfFile) |
| { |
| #ifdef WPA_SUPPLICANT |
| S32 i; |
| |
| for(i=0; i< IPC_WPA_CTRL_OPEN_RETRIES; i++) |
| { |
| pIpcWpa->pWpaCtrl = wpa_ctrl_open((char*)pSupplIfFile); |
| if(pIpcWpa->pWpaCtrl) |
| break; |
| } |
| #else |
| pIpcWpa->pWpaCtrl = NULL; |
| #endif |
| if(pIpcWpa->pWpaCtrl == NULL) |
| { |
| os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - IpcWpa_Sockets_Open - can't connect the socket\n"); |
| return EOALERR_IPC_WPA_ERROR_CANT_CONNECT_TO_SUPPL; |
| } |
| |
| return OK; |
| } |
| |
| static VOID IpcWpa_Sockets_Close(TIpcWpa* pIpcWpa) |
| { |
| #ifdef WPA_SUPPLICANT |
| wpa_ctrl_close(pIpcWpa->pWpaCtrl); |
| #endif |
| } |
| |
| |
| /* functions */ |
| /*************/ |
| THandle IpcWpa_Create(PS32 pRes, PS8 pSupplIfFile) |
| { |
| TIpcWpa* pIpcWpa = (TIpcWpa*)os_MemoryCAlloc(sizeof(TIpcWpa), sizeof(U8)); |
| if(pIpcWpa == NULL) |
| { |
| *pRes = OK; |
| os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - IpcWpa_Create - cant allocate control block\n"); |
| return NULL; |
| } |
| |
| *pRes = IpcWpa_Sockets_Open(pIpcWpa, pSupplIfFile); |
| if(*pRes) |
| { |
| IpcWpa_Destroy(pIpcWpa); |
| return NULL; |
| } |
| |
| return pIpcWpa; |
| } |
| |
| VOID IpcWpa_Destroy(THandle hIpcWpa) |
| { |
| TIpcWpa* pIpcWpa = (TIpcWpa*)hIpcWpa; |
| |
| if(pIpcWpa->pWpaCtrl) |
| IpcWpa_Sockets_Close(pIpcWpa); |
| |
| os_MemoryFree(pIpcWpa); |
| } |
| |
| S32 IpcWpa_Command(THandle hIpcWpa, PS8 cmd, S32 print) |
| { |
| #ifdef WPA_SUPPLICANT |
| TIpcWpa* pIpcWpa = (TIpcWpa*)hIpcWpa; |
| S8 Resp[IPC_WPA_RESP_MAX_LEN]; |
| TI_SIZE_T RespLen = IPC_WPA_RESP_MAX_LEN - 1; |
| S32 ret; |
| |
| ret = wpa_ctrl_request(pIpcWpa->pWpaCtrl, (char*)cmd, os_strlen(cmd), (char*)Resp, (size_t*)&RespLen, NULL); |
| |
| if (ret == -2) |
| { |
| os_error_printf(CU_MSG_ERROR, (PS8)"'%s' command timed out.\n", cmd); |
| return EOALERR_IPC_WPA_ERROR_CMD_TIMEOUT; |
| } |
| else if (ret < 0) |
| { |
| os_error_printf(CU_MSG_ERROR, (PS8)"'%s' command failed (%d).\n", cmd, ret); |
| return EOALERR_IPC_WPA_ERROR_CMD_FAILED; |
| } |
| if (print) |
| { |
| Resp[RespLen] = '\0'; |
| os_error_printf(CU_MSG_INFO2, (PS8)"%s", Resp); |
| } |
| return OK; |
| #else |
| return EOALERR_IPC_WPA_ERROR_CMD_FAILED; |
| #endif |
| } |
| |
| S32 IpcWpa_CommandWithResp(THandle hIpcWpa, PS8 cmd, S32 print, PS8 pResp, PU32 pRespLen) |
| { |
| #ifdef WPA_SUPPLICANT |
| TIpcWpa* pIpcWpa = (TIpcWpa*)hIpcWpa; |
| S32 ret; |
| |
| *pRespLen = IPC_WPA_RESP_MAX_LEN - 1; |
| ret = wpa_ctrl_request(pIpcWpa->pWpaCtrl, (char*)cmd, os_strlen(cmd), (char*)pResp, (size_t*)pRespLen, NULL); |
| |
| if (ret == -2) |
| { |
| os_error_printf(CU_MSG_ERROR, (PS8)"'%s' command timed out.\n", cmd); |
| return EOALERR_IPC_WPA_ERROR_CMD_TIMEOUT; |
| } |
| else if (ret < 0) |
| { |
| os_error_printf(CU_MSG_ERROR, (PS8)"'%s' command failed.\n", cmd); |
| return EOALERR_IPC_WPA_ERROR_CMD_FAILED; |
| } |
| if (print) |
| { |
| pResp[*pRespLen] = '\0'; |
| os_error_printf(CU_MSG_INFO2, (PS8)"%s", pResp); |
| } |
| return OK; |
| #else |
| return EOALERR_IPC_WPA_ERROR_CMD_FAILED; |
| #endif |
| } |