OSDN Git Service

original
[gb-231r1-is01/GB_2.3_IS01.git] / system / wlan / ti / wilink_6_1 / CUDK / os / linux / src / ipc_wpa.c
diff --git a/system/wlan/ti/wilink_6_1/CUDK/os/linux/src/ipc_wpa.c b/system/wlan/ti/wilink_6_1/CUDK/os/linux/src/ipc_wpa.c
new file mode 100644 (file)
index 0000000..03f050d
--- /dev/null
@@ -0,0 +1,185 @@
+/*
+ * 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
+}