From 41027215e1f4572655e0d301413ca63653336648 Mon Sep 17 00:00:00 2001 From: Raj Kushwaha Date: Wed, 13 Oct 2010 00:11:12 -0700 Subject: [PATCH] Add new features:- 1. AP Auto shut off 2. Energy Detect Threshold Change-Id: I454dd0c999131a0d0910b415cf73590d3458f2ad --- softap/jni/QWiFiSoftApCfg.c | 798 +++++++++++++------------- softap/jni/QWiFiSoftApCfg.h | 174 +++--- softap/sdk/qsap.c | 896 +++++++++++++++--------------- softap/sdk/qsap_api.c | 177 +++++- softap/sdk/qsap_api.h | 1044 ++++++++++++++++++----------------- 5 files changed, 1659 insertions(+), 1430 deletions(-) diff --git a/softap/jni/QWiFiSoftApCfg.c b/softap/jni/QWiFiSoftApCfg.c index 9b0a186..87bd3c9 100644 --- a/softap/jni/QWiFiSoftApCfg.c +++ b/softap/jni/QWiFiSoftApCfg.c @@ -1,393 +1,405 @@ -/* - * Copyright (c) 2010, Code Aurora Forum. 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 of Code Aurora Forum, Inc. 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 "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * 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. - */ - - -#include "QWiFiSoftApCfg.h" - -#define UPDATE_ERROR_CODE(msg, code) \ - { \ - int rc; \ - rc = snprintf(resp, sizeof(resp), "failure %s:%s",msg, code); \ - if ( rc == sizeof(resp)) resp[sizeof(resp)-1] = 0; \ - LOGE(resp); \ - } - -static struct sockaddr_nl rtnl_local; -static int rtnl_fd = -1; -static char evt_buf[MAX_EVT_BUF_SIZE]; -static int evt_len; - - -static void softap_handle_associated_event(char *mac_addr) -{ - snprintf(evt_buf, sizeof(evt_buf), "102 Station " HWA_FORM " Associated", - HWA_ARG(mac_addr)); -} - -static void softap_handle_disassociated_event(char *mac_addr) -{ - snprintf(evt_buf, sizeof(evt_buf), "103 Station " HWA_FORM " Disassociated", - HWA_ARG(mac_addr)); -} - -static void softap_handle_wireless_event(char *atr, int atrlen) -{ - int len = 0; - struct iw_event iwe; - char *buffer = atr + RTA_ALIGN(RTATTRLEN); - - atrlen -= RTA_ALIGN(RTATTRLEN); - - while ((len + (int)IW_EV_LCP_LEN) < atrlen) { - memcpy((char *)&iwe, buffer + len, sizeof(struct iw_event)); - - if (iwe.len <= IW_EV_LCP_LEN) - break; - - LOGD("Received Wireless Event: cmd=0x%x len=%d", - iwe.cmd, iwe.len); - - switch (iwe.cmd) { - case IWEVEXPIRED: - LOGD("EVENT: IWEVEXPIRED\n"); - softap_handle_disassociated_event(iwe.u.addr.sa_data); - break; - - case IWEVREGISTERED: - LOGD("EVENT: IWEVREGISTERED\n"); - softap_handle_associated_event(iwe.u.addr.sa_data); - break; - - default: - break; - } - - len += iwe.len; - } - - return; -} - -void softap_handle_rtm_link_event(struct nlmsghdr *hdr) -{ - char *ptr = (char *)NLMSG_DATA(hdr); - struct rtattr *atr; - int atr_len; - - if ((hdr->nlmsg_len - MSGHDRLEN) < IFINFOLEN) { - LOGD("Message Length Problem1"); - return; - } - - if ((atr_len = hdr->nlmsg_len - NLMSG_ALIGN(IFINFOLEN)) < 0) { - LOGD("Message Length Problem2"); - return; - } - - ptr += NLMSG_ALIGN(IFINFOLEN); - atr = (struct rtattr *)ptr; - - while (RTA_OK(atr, atr_len)) { - switch (atr->rta_type) { - case IFLA_WIRELESS: - softap_handle_wireless_event((char *)atr, - atr->rta_len); - break; - - default: - break; - } - - atr = RTA_NEXT(atr, atr_len); - } - - return; -} - -static void softap_handle_iface_event(void) -{ - int cnt, mlen = 0; - char *ptr, buffer[MAX_RECV_BUF_SIZE]; - socklen_t slen; - struct nlmsghdr * hdr; - - while (1) { - cnt = recvfrom(rtnl_fd, buffer, sizeof(buffer), - MSG_DONTWAIT, - (struct sockaddr *)&rtnl_local, &slen); - - if (cnt <= 0) { - buffer[0] = '\0'; - LOGD("recvfrom failed"); - return; - } - - ptr = buffer; - - while (cnt >= MSGHDRLEN) { - hdr = (struct nlmsghdr *)ptr; - - mlen = hdr->nlmsg_len; - - if ((mlen > cnt) || ((mlen - MSGHDRLEN) < 0)) { - break; - } - - switch (hdr->nlmsg_type) { - case RTM_NEWLINK: - case RTM_DELLINK: - softap_handle_rtm_link_event(hdr); - break; - } - - mlen = NLMSG_ALIGN(hdr->nlmsg_len); - cnt -= mlen; - ptr += mlen; - } - } - - return; -} - -static inline int softap_rtnl_wait(void) -{ - fd_set fds; - int oldfd, ret; - - if (rtnl_fd < 0) { - LOGD("Netlink Socket Not Available"); - return -1; - } - - /* Initialize fds */ - FD_ZERO(&fds); - FD_SET(rtnl_fd, &fds); - oldfd = rtnl_fd; - - /* Wait for some trigger event */ - ret = select(oldfd + 1, &fds, NULL, NULL, NULL); - - if (ret < 0) { - /* Error Occurred */ - LOGD("Select on Netlink Socket Failed"); - return ret; - } else if (!ret) { - LOGD("Select on Netlink Socket Timed Out"); - /* Timeout Occurred */ - return -1; - } - - /* Check if any event is available for us */ - if (FD_ISSET(rtnl_fd, &fds)) { - softap_handle_iface_event(); - } - - return 0; -} - -static void softap_rtnl_close(void) -{ - close(rtnl_fd); -} - -static int softap_rtnl_open(void) -{ - int addr_len; - - rtnl_fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE); - - if (rtnl_fd < 0) { - LOGE("open netlink socket failed"); - return -1; - } - - memset(&rtnl_local, 0, sizeof(rtnl_local)); - rtnl_local.nl_family = AF_NETLINK; - rtnl_local.nl_groups = RTMGRP_LINK; - - if (bind(rtnl_fd, (struct sockaddr*)&rtnl_local, - sizeof(rtnl_local)) < 0) { - LOGE("bind netlink socket failed"); - return -1; - } - - addr_len = sizeof(rtnl_local); - - if (getsockname(rtnl_fd, (struct sockaddr*)&rtnl_local, - (socklen_t *) &addr_len) < 0) { - LOGE("getsockname failed"); - return -1; - } - - if (addr_len != sizeof(rtnl_local)) { - LOGE("Wrong address length %d\n", addr_len); - return -1; - } - - if (rtnl_local.nl_family != AF_NETLINK) { - LOGE("Wrong address family %d\n", rtnl_local.nl_family); - return -1; - } - - return 0; -} - -JNIEXPORT void JNICALL - Java_com_qualcomm_wifi_softap_QWiFiSoftApCfg_SapCloseNetlink - (JNIEnv *env, jobject obj) -{ - softap_rtnl_close(); - return; -} - -JNIEXPORT jstring JNICALL - Java_com_qualcomm_wifi_softap_QWiFiSoftApCfg_SapWaitForEvent - (JNIEnv *env, jobject obj) -{ - int ret; - - do { - evt_len = 0; - memset(evt_buf, 0, sizeof(evt_buf)); - - ret = softap_rtnl_wait(); - } while (!strlen(evt_buf)); - - return (*env)->NewStringUTF(env, evt_buf); -} - -JNIEXPORT jboolean JNICALL - Java_com_qualcomm_wifi_softap_QWiFiSoftApCfg_SapOpenNetlink - (JNIEnv *env, jobject obj) -{ - if (softap_rtnl_open() != 0) { - LOGD("Netlink Open Fail"); - return JNI_FALSE; - } - - return JNI_TRUE; -} - -JNIEXPORT jstring JNICALL - Java_com_qualcomm_wifi_softap_QWiFiSoftApCfg_SapSendCommand - (JNIEnv *env, jobject obj, jstring jcmd) -{ - const char *pcmd; - char cmd[MAX_CMD_SIZE]; - char resp[MAX_RESP_SIZE]; - int sock, rc; - int done = 0; - char code[32] = {0}; - int connect_retry; - - strncpy(cmd, "softap qccmd ", sizeof(cmd)); - - pcmd = (char *) ((*env)->GetStringUTFChars(env, jcmd, NULL)); - - if ( pcmd == NULL ) { - UPDATE_ERROR_CODE("Command not handled",""); - goto end; - } - - LOGD("Received Command: %s\n", pcmd); - - if ((strlen(cmd) + strlen(pcmd)) > sizeof(cmd)) { - UPDATE_ERROR_CODE("Command length is larger than MAX_CMD_SIZE", ""); - goto end; - } - - strcat(cmd, pcmd); - - connect_retry = 0; - - while ( 1 ) { - if ((sock = socket_local_client("netd", - ANDROID_SOCKET_NAMESPACE_RESERVED, - SOCK_STREAM)) < 0) { - if (connect_retry > 3) { - UPDATE_ERROR_CODE("Error connecting", - strerror(errno)); - goto end; - } - - LOGW("netd might have crashed, wait for it to " - "start back\n"); - sleep(1); - } else { - break; - } - - connect_retry++; - } - - if (write(sock, cmd, strlen(cmd) + 1) < 0) { - UPDATE_ERROR_CODE("Error Writing to socket", strerror(errno)); - goto end; - } - - while (!done) { - int i; - - if ((rc = read(sock, resp, sizeof(resp))) <= 0) { - if (rc == 0) { - UPDATE_ERROR_CODE("Lost connection to Netd", - strerror(errno)); - } else { - UPDATE_ERROR_CODE("Error reading data", - strerror(errno)); - } - - done = 1; - } else { - /* skip broadcase messages */ - i = 0; - - while(resp[i] && (i<(int)(sizeof(code)-1)) && - (resp[i] != ' ') && (resp[i] != '\t')) { - code[i] = resp[i]; - i++; - } - - code[i] = '\0'; - - if ( (!strcmp(code, "success")) || - (!strcmp(code, "failure")) ) { - done=1; - } else { - LOGW("Code(%s)\n", code); - LOGW("Ignore messages : %s\n", resp); - } - } - } - -end: - (*env)->ReleaseStringUTFChars(env, jcmd, pcmd); - - return (*env)->NewStringUTF(env, resp); -} +/* + * Copyright (c) 2010, Code Aurora Forum. 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 of Code Aurora Forum, Inc. 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 "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * 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. + */ + + +#include "QWiFiSoftApCfg.h" + +#define UPDATE_ERROR_CODE(msg, code) \ + { \ + int rc; \ + rc = snprintf(resp, sizeof(resp), "failure %s:%s",msg, code); \ + if ( rc == sizeof(resp)) resp[sizeof(resp)-1] = 0; \ + LOGE(resp); \ + } + +static struct sockaddr_nl rtnl_local; +static int rtnl_fd = -1; +static char evt_buf[MAX_EVT_BUF_SIZE]; +static int evt_len; + +static void softap_handle_custom_event(char * buf, int len) +{ + if (strncmp(buf, "AUTO-SHUT.indication ", strlen("AUTO-SHUT.indication ")) == 0) + { + LOGD("EVENT: Custom Event\n"); + snprintf(evt_buf, sizeof(evt_buf), "105 AP Shutdown"); + } +} + +static void softap_handle_associated_event(char *mac_addr) +{ + snprintf(evt_buf, sizeof(evt_buf), "102 Station " HWA_FORM " Associated", + HWA_ARG(mac_addr)); +} + +static void softap_handle_disassociated_event(char *mac_addr) +{ + snprintf(evt_buf, sizeof(evt_buf), "103 Station " HWA_FORM " Disassociated", + HWA_ARG(mac_addr)); +} + +static void softap_handle_wireless_event(char *atr, int atrlen) +{ + int len = 0; + struct iw_event iwe; + char *buffer = atr + RTA_ALIGN(RTATTRLEN); + + atrlen -= RTA_ALIGN(RTATTRLEN); + + while ((len + (int)IW_EV_LCP_LEN) < atrlen) { + memcpy((char *)&iwe, buffer + len, sizeof(struct iw_event)); + + if (iwe.len <= IW_EV_LCP_LEN) + break; + + LOGD("Received Wireless Event: cmd=0x%x len=%d", iwe.cmd, iwe.len); + + switch (iwe.cmd) { + case IWEVEXPIRED: + LOGD("EVENT: IWEVEXPIRED\n"); + softap_handle_disassociated_event(iwe.u.addr.sa_data); + break; + + case IWEVREGISTERED: + LOGD("EVENT: IWEVREGISTERED\n"); + softap_handle_associated_event(iwe.u.addr.sa_data); + break; + + case IWEVCUSTOM: + LOGD("EVENT: Custom Event\n"); + softap_handle_custom_event(buffer + len + IW_EV_POINT_LEN, iwe.u.data.length); + break; + + default: + break; + } + + len += iwe.len; + } + + return; +} + +void softap_handle_rtm_link_event(struct nlmsghdr *hdr) +{ + char *ptr = (char *)NLMSG_DATA(hdr); + struct rtattr *atr; + int atr_len; + + if ((hdr->nlmsg_len - MSGHDRLEN) < IFINFOLEN) { + LOGD("Message Length Problem1"); + return; + } + + if ((atr_len = hdr->nlmsg_len - NLMSG_ALIGN(IFINFOLEN)) < 0) { + LOGD("Message Length Problem2"); + return; + } + + ptr += NLMSG_ALIGN(IFINFOLEN); + atr = (struct rtattr *)ptr; + + while (RTA_OK(atr, atr_len)) { + switch (atr->rta_type) { + case IFLA_WIRELESS: + softap_handle_wireless_event((char *)atr, + atr->rta_len); + break; + + default: + break; + } + + atr = RTA_NEXT(atr, atr_len); + } + + return; +} + +static void softap_handle_iface_event(void) +{ + int cnt, mlen = 0; + char *ptr, buffer[MAX_RECV_BUF_SIZE]; + socklen_t slen; + struct nlmsghdr * hdr; + + while (1) { + cnt = recvfrom(rtnl_fd, buffer, sizeof(buffer), + MSG_DONTWAIT, + (struct sockaddr *)&rtnl_local, &slen); + + if (cnt <= 0) { + buffer[0] = '\0'; + LOGD("recvfrom failed"); + return; + } + + ptr = buffer; + + while (cnt >= MSGHDRLEN) { + hdr = (struct nlmsghdr *)ptr; + + mlen = hdr->nlmsg_len; + + if ((mlen > cnt) || ((mlen - MSGHDRLEN) < 0)) { + break; + } + + switch (hdr->nlmsg_type) { + case RTM_NEWLINK: + case RTM_DELLINK: + softap_handle_rtm_link_event(hdr); + break; + } + + mlen = NLMSG_ALIGN(hdr->nlmsg_len); + cnt -= mlen; + ptr += mlen; + } + } + + return; +} + +static inline int softap_rtnl_wait(void) +{ + fd_set fds; + int oldfd, ret; + + if (rtnl_fd < 0) { + LOGD("Netlink Socket Not Available"); + return -1; + } + + /* Initialize fds */ + FD_ZERO(&fds); + FD_SET(rtnl_fd, &fds); + oldfd = rtnl_fd; + + /* Wait for some trigger event */ + ret = select(oldfd + 1, &fds, NULL, NULL, NULL); + + if (ret < 0) { + /* Error Occurred */ + LOGD("Select on Netlink Socket Failed"); + return ret; + } else if (!ret) { + LOGD("Select on Netlink Socket Timed Out"); + /* Timeout Occurred */ + return -1; + } + + /* Check if any event is available for us */ + if (FD_ISSET(rtnl_fd, &fds)) { + softap_handle_iface_event(); + } + + return 0; +} + +static void softap_rtnl_close(void) +{ + close(rtnl_fd); +} + +static int softap_rtnl_open(void) +{ + int addr_len; + + rtnl_fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE); + + if (rtnl_fd < 0) { + LOGE("open netlink socket failed"); + return -1; + } + + memset(&rtnl_local, 0, sizeof(rtnl_local)); + rtnl_local.nl_family = AF_NETLINK; + rtnl_local.nl_groups = RTMGRP_LINK; + + if (bind(rtnl_fd, (struct sockaddr*)&rtnl_local, + sizeof(rtnl_local)) < 0) { + LOGE("bind netlink socket failed"); + return -1; + } + + addr_len = sizeof(rtnl_local); + + if (getsockname(rtnl_fd, (struct sockaddr*)&rtnl_local, + (socklen_t *) &addr_len) < 0) { + LOGE("getsockname failed"); + return -1; + } + + if (addr_len != sizeof(rtnl_local)) { + LOGE("Wrong address length %d\n", addr_len); + return -1; + } + + if (rtnl_local.nl_family != AF_NETLINK) { + LOGE("Wrong address family %d\n", rtnl_local.nl_family); + return -1; + } + + return 0; +} + +JNIEXPORT void JNICALL + Java_com_qualcomm_wifi_softap_QWiFiSoftApCfg_SapCloseNetlink + (JNIEnv *env, jobject obj) +{ + softap_rtnl_close(); + return; +} + +JNIEXPORT jstring JNICALL + Java_com_qualcomm_wifi_softap_QWiFiSoftApCfg_SapWaitForEvent + (JNIEnv *env, jobject obj) +{ + int ret; + + do { + evt_len = 0; + memset(evt_buf, 0, sizeof(evt_buf)); + + ret = softap_rtnl_wait(); + } while (!strlen(evt_buf)); + + return (*env)->NewStringUTF(env, evt_buf); +} + +JNIEXPORT jboolean JNICALL + Java_com_qualcomm_wifi_softap_QWiFiSoftApCfg_SapOpenNetlink + (JNIEnv *env, jobject obj) +{ + if (softap_rtnl_open() != 0) { + LOGD("Netlink Open Fail"); + return JNI_FALSE; + } + + return JNI_TRUE; +} + +JNIEXPORT jstring JNICALL + Java_com_qualcomm_wifi_softap_QWiFiSoftApCfg_SapSendCommand + (JNIEnv *env, jobject obj, jstring jcmd) +{ + const char *pcmd; + char cmd[MAX_CMD_SIZE]; + char resp[MAX_RESP_SIZE]; + int sock, rc; + int done = 0; + char code[32] = {0}; + int connect_retry; + + strncpy(cmd, "softap qccmd ", sizeof(cmd)); + + pcmd = (char *) ((*env)->GetStringUTFChars(env, jcmd, NULL)); + + if ( pcmd == NULL ) { + UPDATE_ERROR_CODE("Command not handled",""); + goto end; + } + + LOGD("Received Command: %s\n", pcmd); + + if ((strlen(cmd) + strlen(pcmd)) > sizeof(cmd)) { + UPDATE_ERROR_CODE("Command length is larger than MAX_CMD_SIZE", ""); + goto end; + } + + strcat(cmd, pcmd); + + connect_retry = 0; + + while ( 1 ) { + if ((sock = socket_local_client("netd", + ANDROID_SOCKET_NAMESPACE_RESERVED, + SOCK_STREAM)) < 0) { + if (connect_retry > 3) { + UPDATE_ERROR_CODE("Error connecting", + strerror(errno)); + goto end; + } + + LOGW("netd might have crashed, wait for it to " + "start back\n"); + sleep(1); + } else { + break; + } + + connect_retry++; + } + + if (write(sock, cmd, strlen(cmd) + 1) < 0) { + UPDATE_ERROR_CODE("Error Writing to socket", strerror(errno)); + goto end; + } + + while (!done) { + int i; + + if ((rc = read(sock, resp, sizeof(resp))) <= 0) { + if (rc == 0) { + UPDATE_ERROR_CODE("Lost connection to Netd", + strerror(errno)); + } else { + UPDATE_ERROR_CODE("Error reading data", + strerror(errno)); + } + + done = 1; + } else { + /* skip broadcase messages */ + i = 0; + + while(resp[i] && (i<(int)(sizeof(code)-1)) && + (resp[i] != ' ') && (resp[i] != '\t')) { + code[i] = resp[i]; + i++; + } + + code[i] = '\0'; + + if ( (!strcmp(code, "success")) || + (!strcmp(code, "failure")) ) { + done=1; + } else { + LOGW("Code(%s)\n", code); + LOGW("Ignore messages : %s\n", resp); + } + } + } + +end: + (*env)->ReleaseStringUTFChars(env, jcmd, pcmd); + + return (*env)->NewStringUTF(env, resp); +} diff --git a/softap/jni/QWiFiSoftApCfg.h b/softap/jni/QWiFiSoftApCfg.h index c7aaec3..1eac0d5 100644 --- a/softap/jni/QWiFiSoftApCfg.h +++ b/softap/jni/QWiFiSoftApCfg.h @@ -1,87 +1,87 @@ -/* - * Copyright (c) 2010, Code Aurora Forum. 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 of Code Aurora Forum, Inc. 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 "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * 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. - */ - - -#ifndef __QWIFISOFTAPCFG -#define __QWIFISOFTAPCFG - -#define LOG_TAG "QWIFIAPCFG" - -#include "jni.h" -#include - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include - -typedef unsigned char u8; - -#define HWA_FORM "%02X:%02X:%02X:%02X:%02X:%02X" -#define HWA_ARG(x) *(((u8 *)x + 0)), *(((u8 *)x + 1)), \ - *(((u8 *)x + 2)), *(((u8 *)x + 3)), \ - *(((u8 *)x + 4)), *(((u8 *)x + 5)) - -#define MAX_RESP_SIZE 256 -#define MAX_CMD_SIZE 256 -#define MAX_EVT_BUF_SIZE 256 -#define MAX_RECV_BUF_SIZE 256 - -#define MSGHDRLEN ((int)(sizeof(struct nlmsghdr))) -#define IFINFOLEN ((int)(sizeof(struct ifinfomsg))) -#define RTATTRLEN ((int)(sizeof(struct rtattr))) - -#ifndef IFLA_WIRELESS -#define IFLA_WIRELESS (IFLA_MASTER + 1) -#endif - -#endif +/* + * Copyright (c) 2010, Code Aurora Forum. 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 of Code Aurora Forum, Inc. 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 "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * 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. + */ + + +#ifndef __QWIFISOFTAPCFG +#define __QWIFISOFTAPCFG + +#define LOG_TAG "QWIFIAPCFG" + +#include "jni.h" +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +typedef unsigned char u8; + +#define HWA_FORM "%02X:%02X:%02X:%02X:%02X:%02X" +#define HWA_ARG(x) *(((u8 *)x + 0)), *(((u8 *)x + 1)), \ + *(((u8 *)x + 2)), *(((u8 *)x + 3)), \ + *(((u8 *)x + 4)), *(((u8 *)x + 5)) + +#define MAX_RESP_SIZE 256 +#define MAX_CMD_SIZE 256 +#define MAX_EVT_BUF_SIZE 256 +#define MAX_RECV_BUF_SIZE 256 + +#define MSGHDRLEN ((int)(sizeof(struct nlmsghdr))) +#define IFINFOLEN ((int)(sizeof(struct ifinfomsg))) +#define RTATTRLEN ((int)(sizeof(struct rtattr))) + +#ifndef IFLA_WIRELESS +#define IFLA_WIRELESS (IFLA_MASTER + 1) +#endif + +#endif diff --git a/softap/sdk/qsap.c b/softap/sdk/qsap.c index 61c6b07..6c37c22 100644 --- a/softap/sdk/qsap.c +++ b/softap/sdk/qsap.c @@ -1,437 +1,459 @@ -/* - * Copyright (c) 2010, Code Aurora Forum. 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 of Code Aurora Forum, Inc. 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 "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * 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. - */ - - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define LOG_TAG "QCLDR-" - -#include "cutils/log.h" -#include "cutils/memory.h" -#include "cutils/misc.h" -#include "cutils/properties.h" -#include "private/android_filesystem_config.h" - -#include "qsap_api.h" -#include "qsap.h" -#include "libwpa_client/wpa_ctrl.h" - -#include - -#ifndef WIFI_DRIVER_MODULE_PATH -#define WIFI_DRIVER_MODULE_PATH "/system/lib/modules/wlan.ko" -#endif - -#ifndef WIFI_DRIVER_MODULE_NAME -#define WIFI_DRIVER_MODULE_NAME "wlan" -#endif - -#ifndef WIFI_SDIO_IF_DRIVER_MODULE_PATH -#define WIFI_SDIO_IF_DRIVER_MODULE_PATH "/system/lib/modules/librasdioif.ko" -#endif - -#ifndef WIFI_SDIO_IF_DRIVER_MODULE_NAME -#define WIFI_SDIO_IF_DRIVER_MODULE_NAME "librasdioif" -#endif - -#ifndef WIFI_SDIO_IF_DRIVER_MODULE_ARG -#define WIFI_SDIO_IF_DRIVER_MODULE_ARG "" -#endif - -#ifdef WIFI_DRIVER_MODULE_ARG -#undef WIFI_DRIVER_MODULE_ARG -#endif - -#define WIFI_DRIVER_MODULE_ARG "con_mode=1" - -extern int init_module(const char *name, u32, const s8 *); -extern int delete_module(const char *name, int); - -static s32 check_driver_loaded( const s8 * tag) -{ - FILE *proc; - s8 line[126]; - - if ((proc = fopen("/proc/modules", "r")) == NULL) { - LOGW("Could not open %s: %s", "/proc/modules", strerror(errno)); - return 0; - } - - while ((fgets(line, sizeof(line), proc)) != NULL) { - if (strncmp(line, tag, strlen(tag)) == 0) { - fclose(proc); - return 1; - } - } - - fclose(proc); - - return 0; -} - -static s32 insmod(const s8 *filename, const s8 *args, const s8 * tag) -{ -#ifndef SDK_TEST - void *module; - s32 size; - s32 ret = 0; - - if ( check_driver_loaded(tag) ) { - LOGE("Driver: %s already loaded\n", filename); - return ret; - } - - LOGD("Loading Driver: %s %s\n", filename, args); - - module = (void*)load_file(filename, (unsigned int*)&size); - - if (!module) { - LOGE("Cannot load file: %s\n", filename); - return -1; - } - - ret = init_module(module, size, args); - - if ( ret ) { - LOGE("init_module (%s:%d) failed\n", filename, (int)size); - } - - free(module); - - return ret; -#else - return 0; -#endif -} - -static s32 rmmod(const s8 *modname) -{ -#ifndef SDK_TEST - s32 ret = 0; - s32 maxtry = 10; - - while (maxtry-- > 0) { - ret = delete_module(modname, O_NONBLOCK | O_EXCL); - - if (ret < 0 && errno == EAGAIN){ - usleep(50000); - } else { - break; - } - } - - if (ret != 0) { - LOGD("Unable to unload driver module \"%s\": %s\n", - modname, strerror(errno)); - } - - return ret; -#else - return 0; -#endif -} - -static const s8 SDIO_POLLING_ON[] = "/etc/init.qcom.sdio.sh 1"; -static const s8 SDIO_POLLING_OFF[] = "/etc/init.qcom.sdio.sh 0"; - -s32 wifi_qsap_load_driver(void) -{ - s32 size; - s32 ret = 0; - s32 retry; - - /* Unload the station mode driver first */ - wifi_qsap_unload_wifi_sta_driver(); - - if (system(SDIO_POLLING_ON)) { - LOGE("Could not turn on the polling..."); - } - - ret = insmod(WIFI_SDIO_IF_DRIVER_MODULE_PATH, WIFI_SDIO_IF_DRIVER_MODULE_ARG, WIFI_SDIO_IF_DRIVER_MODULE_NAME " "); - - if ( ret != 0 ) { - LOGE("init_module failed sdioif\n"); - goto end; - } - - sched_yield(); - - ret = insmod(WIFI_DRIVER_MODULE_PATH, WIFI_DRIVER_MODULE_ARG, WIFI_DRIVER_MODULE_NAME " "); - - if ( ret != 0 ) { - LOGE("init_module failed libra_softap\n"); - goto end; - } - - sched_yield(); -end: - if(system(SDIO_POLLING_OFF)) { - LOGE("Could not turn off the polling..."); - } - - return ret; -} - -s32 wifi_qsap_unload_wifi_sta_driver(void) -{ - s32 ret = 0; - - if(system(SDIO_POLLING_ON)) { - LOGE("Could not turn on the polling..."); - } - - if ( check_driver_loaded(WIFI_DRIVER_MODULE_NAME " ") ) { - if ( rmmod(WIFI_DRIVER_MODULE_NAME) ) { - LOGE("Unable to unload the station mode wifi driver...\n"); - ret = 1; - goto end; - } - } - - sched_yield(); - - if ( check_driver_loaded(WIFI_SDIO_IF_DRIVER_MODULE_NAME " ") ) { - if ( rmmod(WIFI_SDIO_IF_DRIVER_MODULE_NAME) ) { - LOGE("Unable to unload the station mode librasdioif driver\n"); - ret = 1; - goto end; - } - } - -end: - if(system(SDIO_POLLING_OFF)) { - LOGE("Could not turn off the polling..."); - } - sched_yield(); - return 0; -} - -s32 wifi_qsap_unload_driver() -{ - s32 ret = 0; - - if(system(SDIO_POLLING_ON)) { - LOGE("Could not turn on the polling..."); - } - - if ( check_driver_loaded(WIFI_DRIVER_MODULE_NAME " ") ) { - if ( rmmod(WIFI_DRIVER_MODULE_NAME) ) { - LOGE("Unable to unload the libra_softap driver\n"); - ret = 1; - goto end; - } - } - - sched_yield(); - - if ( check_driver_loaded(WIFI_SDIO_IF_DRIVER_MODULE_NAME " ") ) { - if ( rmmod(WIFI_SDIO_IF_DRIVER_MODULE_NAME) ) { - LOGE("Unable to unload the librasdioif driver\n"); - ret = 1; - goto end; - } - } -end: - if(system(SDIO_POLLING_OFF)) { - LOGE("Could not turn off the polling..."); - } - - return 0; -} - -s32 wifi_qsap_stop_bss(void) -{ -#define QCIEEE80211_IOCTL_STOPBSS (SIOCIWFIRSTPRIV + 6) - s32 sock; - s32 ret = eERR_STOP_BSS; - s8 cmd[] = "stopbss"; - s8 interface[128]; - s8 *iface; - s32 len = 128; - struct iwreq wrq; - struct iw_priv_args *priv_ptr; - - if(NULL == (iface = qsap_get_config_value(CONFIG_FILE, "interface", interface, (u32*)&len))) { - LOGE("%s :interface error \n", __func__); - return ret; - } - - /* Issue the stopbss command to driver */ - sock = socket(AF_INET, SOCK_DGRAM, 0); - - if (sock < 0) { - LOGE("Failed to open socket"); - return eERR_STOP_BSS; - } - - strncpy(wrq.ifr_name, iface, sizeof(wrq.ifr_name)); - wrq.u.data.length = sizeof(cmd); - wrq.u.data.pointer = cmd; - wrq.u.data.flags = 0; - - ret = ioctl(sock, QCIEEE80211_IOCTL_STOPBSS, &wrq); - - /* Here IOCTL is always returning non Zero: temporary fix untill driver is fixed*/ - ret = 0; - close(sock); - - if (ret) { - LOGE("IOCTL stopbss failed: %ld", ret); - ret = eERR_STOP_BSS; - } else { - LOGD("STOP BSS ISSUED"); - ret = eSUCCESS; - } - - sched_yield(); - return ret; -} - -s32 is_softap_enabled(void) -{ - s8 stat[32] = {0}; - - if ( property_get("init.svc.hostapd", stat, NULL) && - (strcmp(stat, "running") == 0)) { - LOGD("HOSTAPD enabled \n"); - return ENABLE; - } - - LOGD("HOSTAPD disabled \n"); - return DISABLE; -} - -s32 commit(void) -{ -#ifndef SDK_TEST - s32 ret = eERR_COMMIT; - - if ( is_softap_enabled() ) { - /** Stop BSS */ - if(eSUCCESS != wifi_qsap_stop_bss()) { - LOGE("%s: stop bss failed \n", __func__); - return ret; - } - sleep(1); - } - - ret = wifi_qsap_start_softap(); - - if( eSUCCESS != ret ) - wifi_qsap_unload_driver(); - - return ret; -#else - return eSUCCESS; -#endif -} - -s32 wifi_qsap_start_softap() -{ - s32 retry = 4; - - LOGD("Starting Soft AP...\n"); - - while(--retry ) { - /** Stop hostapd */ - if(0 != property_set("ctl.start", "hostapd")) { - LOGE("failed \n"); - continue; - } - - sleep(1); - - if ( is_softap_enabled() ) { - LOGD("success \n"); - return eSUCCESS; - } - } - - LOGE("Unable to start the SoftAP\n"); - return eERR_START_SAP; -} - -s32 wifi_qsap_stop_softap() -{ - if ( is_softap_enabled() ) { - LOGD("Stopping BSS ..... "); - - /** Stop the BSS */ - if (eSUCCESS != wifi_qsap_stop_bss()) { - LOGE("failed \n"); - return eERR_STOP_SAP; - } - sleep(1); - } - - return eSUCCESS; -} - -s32 wifi_qsap_reload_softap() -{ - s32 ret = eERR_RELOAD_SAP; - - /** SDK API to reload the firmware */ - if (eSUCCESS != wifi_qsap_stop_softap()) { - return ret; - } - - if (eSUCCESS != wifi_qsap_unload_driver()) { - return ret; - } - - usleep(500000); - - if (eSUCCESS != wifi_qsap_load_driver()) { - return ret; - } - - sleep(1); - - if (eSUCCESS != wifi_qsap_start_softap()) { - wifi_qsap_unload_driver(); - return ret; - } - - return eSUCCESS; -} +/* + * Copyright (c) 2010, Code Aurora Forum. 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 of Code Aurora Forum, Inc. 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 "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * 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. + */ + + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define LOG_TAG "QCLDR-" + +#include "cutils/log.h" +#include "cutils/memory.h" +#include "cutils/misc.h" +#include "cutils/properties.h" +#include "private/android_filesystem_config.h" + +#include "qsap_api.h" +#include "qsap.h" +#include "libwpa_client/wpa_ctrl.h" + +#include + +#ifndef WIFI_DRIVER_MODULE_PATH +#define WIFI_DRIVER_MODULE_PATH "/system/lib/modules/wlan.ko" +#endif + +#ifndef WIFI_DRIVER_MODULE_NAME +#define WIFI_DRIVER_MODULE_NAME "wlan" +#endif + +#ifndef WIFI_SDIO_IF_DRIVER_MODULE_PATH +#define WIFI_SDIO_IF_DRIVER_MODULE_PATH "/system/lib/modules/librasdioif.ko" +#endif + +#ifndef WIFI_SDIO_IF_DRIVER_MODULE_NAME +#define WIFI_SDIO_IF_DRIVER_MODULE_NAME "librasdioif" +#endif + +#ifndef WIFI_SDIO_IF_DRIVER_MODULE_ARG +#define WIFI_SDIO_IF_DRIVER_MODULE_ARG "" +#endif + +#ifdef WIFI_DRIVER_MODULE_ARG +#undef WIFI_DRIVER_MODULE_ARG +#endif + +#define WIFI_DRIVER_MODULE_ARG "con_mode=1" + +extern int init_module(const char *name, u32, const s8 *); +extern int delete_module(const char *name, int); + +static s32 check_driver_loaded( const s8 * tag) +{ + FILE *proc; + s8 line[126]; + + if ((proc = fopen("/proc/modules", "r")) == NULL) { + LOGW("Could not open %s: %s", "/proc/modules", strerror(errno)); + return 0; + } + + while ((fgets(line, sizeof(line), proc)) != NULL) { + if (strncmp(line, tag, strlen(tag)) == 0) { + fclose(proc); + return 1; + } + } + + fclose(proc); + + return 0; +} + +static s32 insmod(const s8 *filename, const s8 *args, const s8 * tag) +{ +#ifndef SDK_TEST + void *module; + s32 size; + s32 ret = 0; + + if ( check_driver_loaded(tag) ) { + LOGE("Driver: %s already loaded\n", filename); + return ret; + } + + LOGD("Loading Driver: %s %s\n", filename, args); + + module = (void*)load_file(filename, (unsigned int*)&size); + + if (!module) { + LOGE("Cannot load file: %s\n", filename); + return -1; + } + + ret = init_module(module, size, args); + + if ( ret ) { + LOGE("init_module (%s:%d) failed\n", filename, (int)size); + } + + free(module); + + return ret; +#else + return 0; +#endif +} + +static s32 rmmod(const s8 *modname) +{ +#ifndef SDK_TEST + s32 ret = 0; + s32 maxtry = 10; + + while (maxtry-- > 0) { + ret = delete_module(modname, O_NONBLOCK | O_EXCL); + + if (ret < 0 && errno == EAGAIN){ + usleep(50000); + } else { + break; + } + } + + if (ret != 0) { + LOGD("Unable to unload driver module \"%s\": %s\n", + modname, strerror(errno)); + } + + return ret; +#else + return 0; +#endif +} + +static const s8 SDIO_POLLING_ON[] = "/etc/init.qcom.sdio.sh 1"; +static const s8 SDIO_POLLING_OFF[] = "/etc/init.qcom.sdio.sh 0"; + +s32 wifi_qsap_load_driver(void) +{ + s32 size; + s32 ret = 0; + s32 retry; + + /* Unload the station mode driver first */ + wifi_qsap_unload_wifi_sta_driver(); + + if (system(SDIO_POLLING_ON)) { + LOGE("Could not turn on the polling..."); + } + + ret = insmod(WIFI_SDIO_IF_DRIVER_MODULE_PATH, WIFI_SDIO_IF_DRIVER_MODULE_ARG, WIFI_SDIO_IF_DRIVER_MODULE_NAME " "); + + if ( ret != 0 ) { + LOGE("init_module failed sdioif\n"); + ret = eERR_LOAD_FAILED_SDIOIF; + goto end; + } + + sched_yield(); + + ret = insmod(WIFI_DRIVER_MODULE_PATH, WIFI_DRIVER_MODULE_ARG, WIFI_DRIVER_MODULE_NAME " "); + + if ( ret != 0 ) { + if ( check_driver_loaded(WIFI_SDIO_IF_DRIVER_MODULE_NAME " ") ) { + if ( rmmod(WIFI_SDIO_IF_DRIVER_MODULE_NAME) ) { + LOGE("Unable to unload the station mode librasdioif driver\n"); + } + } + LOGE("init_module failed libra_softap\n"); + ret = eERR_LOAD_FAILED_SOFTAP; + goto end; + } + + sched_yield(); + + ret = eSUCCESS; + +end: + if(system(SDIO_POLLING_OFF)) { + LOGE("Could not turn off the polling..."); + } + + return ret; +} + +s32 wifi_qsap_unload_wifi_sta_driver(void) +{ + s32 ret = 0; + + if(system(SDIO_POLLING_ON)) { + LOGE("Could not turn on the polling..."); + } + + if ( check_driver_loaded(WIFI_DRIVER_MODULE_NAME " ") ) { + if ( rmmod(WIFI_DRIVER_MODULE_NAME) ) { + LOGE("Unable to unload the station mode wifi driver...\n"); + ret = 1; + goto end; + } + } + + sched_yield(); + + if ( check_driver_loaded(WIFI_SDIO_IF_DRIVER_MODULE_NAME " ") ) { + if ( rmmod(WIFI_SDIO_IF_DRIVER_MODULE_NAME) ) { + LOGE("Unable to unload the station mode librasdioif driver\n"); + ret = 1; + goto end; + } + } + +end: + if(system(SDIO_POLLING_OFF)) { + LOGE("Could not turn off the polling..."); + } + sched_yield(); + return 0; +} + +s32 wifi_qsap_unload_driver() +{ + s32 ret = eSUCCESS; + + if(system(SDIO_POLLING_ON)) { + LOGE("Could not turn on the polling..."); + } + + if ( check_driver_loaded(WIFI_DRIVER_MODULE_NAME " ") ) { + if ( rmmod(WIFI_DRIVER_MODULE_NAME) ) { + LOGE("Unable to unload the libra_softap driver\n"); + ret = eERR_UNLOAD_FAILED_SOFTAP; + goto end; + } + } + + sched_yield(); + + if ( check_driver_loaded(WIFI_SDIO_IF_DRIVER_MODULE_NAME " ") ) { + if ( rmmod(WIFI_SDIO_IF_DRIVER_MODULE_NAME) ) { + LOGE("Unable to unload the librasdioif driver\n"); + ret = eERR_UNLOAD_FAILED_SDIO; + goto end; + } + } +end: + if(system(SDIO_POLLING_OFF)) { + LOGE("Could not turn off the polling..."); + } + + return ret; +} + +s32 wifi_qsap_stop_bss(void) +{ +#define QCIEEE80211_IOCTL_STOPBSS (SIOCIWFIRSTPRIV + 6) + s32 sock; + s32 ret = eERR_STOP_BSS; + s8 cmd[] = "stopbss"; + s8 interface[128]; + s8 *iface; + s32 len = 128; + struct iwreq wrq; + struct iw_priv_args *priv_ptr; + + if(ENABLE != is_softap_enabled()) { + ret = eERR_BSS_NOT_STARTED; + return ret; + } + + if(NULL == (iface = qsap_get_config_value(CONFIG_FILE, "interface", interface, (u32*)&len))) { + LOGE("%s :interface error \n", __func__); + return ret; + } + + /* Issue the stopbss command to driver */ + sock = socket(AF_INET, SOCK_DGRAM, 0); + + if (sock < 0) { + LOGE("Failed to open socket"); + return eERR_STOP_BSS; + } + + strncpy(wrq.ifr_name, iface, sizeof(wrq.ifr_name)); + wrq.u.data.length = sizeof(cmd); + wrq.u.data.pointer = cmd; + wrq.u.data.flags = 0; + + ret = ioctl(sock, QCIEEE80211_IOCTL_STOPBSS, &wrq); + + /* Here IOCTL is always returning non Zero: temporary fix untill driver is fixed*/ + ret = 0; + close(sock); + + if (ret) { + LOGE("IOCTL stopbss failed: %ld", ret); + ret = eERR_STOP_BSS; + } else { + LOGD("STOP BSS ISSUED"); + ret = eSUCCESS; + } + + sched_yield(); + return ret; +} + +s32 is_softap_enabled(void) +{ + s8 stat[32] = {0}; + + if ( property_get("init.svc.hostapd", stat, NULL) && + (strcmp(stat, "running") == 0)) { + LOGD("HOSTAPD enabled \n"); + return ENABLE; + } + + LOGD("HOSTAPD disabled \n"); + return DISABLE; +} + +s32 commit(void) +{ +#ifndef SDK_TEST + s32 ret = eERR_COMMIT; + + if ( is_softap_enabled() ) { + /** Stop BSS */ + if(eSUCCESS != (ret = wifi_qsap_stop_bss())) { + LOGE("%s: stop bss failed \n", __func__); + return ret; + } + sleep(1); + } + + ret = wifi_qsap_start_softap(); + + if( eSUCCESS != ret ) + wifi_qsap_unload_driver(); + + return ret; +#else + return eSUCCESS; +#endif +} + +s32 wifi_qsap_start_softap() +{ + s32 retry = 4; + + LOGD("Starting Soft AP...\n"); + + /* Delete control interface if it was left over because of previous crash */ + if ( !is_softap_enabled() ) { + qsap_del_ctrl_iface(); + } + + while(--retry ) { + /** Stop hostapd */ + if(0 != property_set("ctl.start", "hostapd")) { + LOGE("failed \n"); + continue; + } + + sleep(1); + + if ( is_softap_enabled() ) { + LOGD("success \n"); + return eSUCCESS; + } + } + + LOGE("Unable to start the SoftAP\n"); + return eERR_START_SAP; +} + +s32 wifi_qsap_stop_softap() +{ + s32 ret = eSUCCESS; + + if ( is_softap_enabled() ) { + LOGD("Stopping BSS ..... "); + + /** Stop the BSS */ + if (eSUCCESS != (ret = wifi_qsap_stop_bss()) ) { + LOGE("failed \n"); + return ret; + } + sleep(1); + } + + return ret; +} + +s32 wifi_qsap_reload_softap() +{ + s32 ret = eERR_RELOAD_SAP; + + /** SDK API to reload the firmware */ + if (eSUCCESS != (ret = wifi_qsap_stop_softap())) { + return ret; + } + + if (eSUCCESS != (ret = wifi_qsap_unload_driver())) { + return ret; + } + + usleep(500000); + + if (eSUCCESS != (ret = wifi_qsap_load_driver())) { + return ret; + } + + sleep(1); + + if (eSUCCESS != (ret = wifi_qsap_start_softap())) { + wifi_qsap_unload_driver(); + return ret; + } + + return eSUCCESS; +} diff --git a/softap/sdk/qsap_api.c b/softap/sdk/qsap_api.c index 8f0bf9c..6e998eb 100644 --- a/softap/sdk/qsap_api.c +++ b/softap/sdk/qsap_api.c @@ -48,6 +48,7 @@ #define QCSAP_IOCTL_GET_CHANNEL (SIOCIWFIRSTPRIV+9) #define QCSAP_IOCTL_ASSOC_STA_MACADDR (SIOCIWFIRSTPRIV+10) #define QCSAP_IOCTL_DISASSOC_STA (SIOCIWFIRSTPRIV+11) +#define QCSAP_IOCTL_AP_STATS (SIOCIWFIRSTPRIV+12) //#define LOG_TAG "QCSDK-" @@ -134,6 +135,9 @@ static s8 *cmd_list[eCMD_LAST] = { "country_code", "intra_bss_forward", "regulatory_domain", + "apstat", + "auto_shut_off_time", + "energy_detect_threshold", }; static s8 *qsap_str[eSTR_LAST] = { @@ -153,7 +157,9 @@ static s8 *qsap_str[eSTR_LAST] = { "ieee80211n", "ctrl_interface", "interface", - "eap_server" + "eap_server", + "gAPAutoShutOff", + "gEnablePhyAgcListenMode", }; /** Supported operating mode */ @@ -775,7 +781,7 @@ static void qsap_remove_from_file(s8 *pfile, s8 *pVal, s8 *presp, u32 *plen) } if(MAX_CONF_LINE_LEN == snprintf(buf, MAX_CONF_LINE_LEN, "%s~", pfile)) { - buf[MAX_CONF_LINE_LEN] = '\0'; + buf[MAX_CONF_LINE_LEN-1] = '\0'; } /** Open a temporary file */ @@ -827,7 +833,7 @@ static void qsap_remove_from_file(s8 *pfile, s8 *pVal, s8 *presp, u32 *plen) fclose(ftmp); if(MAX_CONF_LINE_LEN == snprintf(buf, MAX_CONF_LINE_LEN, "%s~", pfile)) { - buf[MAX_CONF_LINE_LEN] = '\0'; + buf[MAX_CONF_LINE_LEN-1] = '\0'; } /** Restore the configuration file */ @@ -1106,6 +1112,10 @@ int qsap_get_operating_channel(s32 *pchan) s8 *pif; int ret; + if(ENABLE != is_softap_enabled()) { + goto error; + } + if(NULL == (pif = qsap_get_config_value(pconffile, qsap_str[STR_INTERFACE], interface, &len))) { LOGE("%s :interface error \n", __func__); goto error; @@ -1209,6 +1219,10 @@ void qsap_get_associated_sta_mac(s8 *presp, u32 *plen) u32 recvLen; u32 tlen; + if(ENABLE != is_softap_enabled()) { + goto error; + } + if(NULL == (pif = qsap_get_config_value(pconffile, qsap_str[STR_INTERFACE], interface, &len))) { LOGE("%s :interface error \n", __func__); goto error; @@ -1290,6 +1304,90 @@ static void qsap_read_wep_key(s8 *pfile, s8 *pcmd, s8 *presp, u32 *plen, s8 *var return; } +void qsap_read_ap_stats(s8 *presp, u32 *plen) +{ + int sock, ret; + struct iwreq wrq; + s8 interface[MAX_CONF_LINE_LEN]; + u32 len = MAX_CONF_LINE_LEN; + s8 *pif; + s8 *pbuf, *pout; + u32 recvLen; + u32 tlen; + + if(ENABLE != is_softap_enabled()) { + *plen = snprintf(presp, *plen, "%s", ERR_SOFTAP_NOT_STARTED); + return; + } + + if(NULL == (pif = qsap_get_config_value(pconffile, qsap_str[STR_INTERFACE], interface, &len))) { + LOGE("%s :interface error \n", __func__); + goto error; + } + interface[len] = '\0'; + + sock = socket(AF_INET, SOCK_DGRAM, 0); + if(sock < 0) { + LOGE("%s :socket failure \n", __func__); + goto error; + } + + pbuf = (s8 *)malloc(MAX_RESP_LEN); + if(NULL == pbuf) { + LOGE("%s :No memory \n", __func__); + goto error; + } + + strncpy(wrq.ifr_name, pif, sizeof(wrq.ifr_name)); + wrq.u.data.length = MAX_RESP_LEN; + wrq.u.data.pointer = (void *)pbuf; + wrq.u.data.flags = 0; + + ret = ioctl(sock, QCSAP_IOCTL_AP_STATS, &wrq); + if(ret < 0) { + LOGE("%s :ioctl failure \n", __func__); + free(pbuf); + goto error; + } + + if(*plen == (recvLen = snprintf(presp, *plen, "%s %s=%s", SUCCESS, cmd_list[eCMD_AP_STATISTICS], pbuf))){ + presp[recvLen-1] = '\0'; + } + + *plen = recvLen; + + free(pbuf); + + return; + +error: + *plen = snprintf(presp, *plen, "%s", ERR_UNKNOWN); + + return; +} + +void qsap_read_autoshutoff(s8 *presp, u32 *plen) +{ + u32 tlen, time = 0; + s8 *ptime; + + tlen = *plen; + + if(NULL == (ptime = qsap_get_config_value(fIni, qsap_str[STR_AP_AUTOSHUTOFF], presp, &tlen))) { + /** unable to read the AP shutoff time */ + LOGE("%s :Failed to read AP shutoff time\n", __func__); + } + else { + time = atoi(ptime); + time = time / 60; /** Convert seconds to minutes */ + } + + *plen = snprintf(presp, *plen, "success %s=%ld", cmd_list[eCMD_AP_AUTOSHUTOFF], time); + + return; +} + + /** * @brief * Get the configuration information from the softAP configuration @@ -1429,6 +1527,18 @@ static void qsap_get_from_config(esap_cmd_t cNum, s8 *presp, u32 *plen) qsap_read_cfg(fIni, qsap_str[STR_COUNTRY_CODE_IN_INI], presp, plen, cmd_list[eCMD_COUNTRY_CODE], GET_ENABLED_ONLY); break; + case eCMD_AP_STATISTICS: + qsap_read_ap_stats(presp, plen); + break; + + case eCMD_AP_AUTOSHUTOFF: + qsap_read_autoshutoff(presp, plen); + break; + + case eCMD_AP_ENERGY_DETECT_TH: + qsap_read_cfg(fIni, qsap_str[STR_AP_ENERGY_DETECT_TH], presp, plen, cmd_list[eCMD_AP_ENERGY_DETECT_TH], GET_ENABLED_ONLY); + break; + default: /** Error case */ *plen = snprintf(presp, *plen, "%s", ERR_INVALID_ARG); @@ -1576,7 +1686,7 @@ static s16 wifi_qsap_reset_to_default(s8 *pcfgfile, s8 *pdefault) } if(MAX_CONF_LINE_LEN == snprintf(buf, MAX_CONF_LINE_LEN, "%s~", pcfgfile)) { - buf[MAX_CONF_LINE_LEN] = '\0'; + buf[MAX_CONF_LINE_LEN-1] = '\0'; } ftmp = fopen(buf, "w+"); @@ -1594,7 +1704,7 @@ static s16 wifi_qsap_reset_to_default(s8 *pcfgfile, s8 *pdefault) fclose(ftmp); if(MAX_CONF_LINE_LEN == snprintf(buf, MAX_CONF_LINE_LEN, "%s~", pcfgfile)) { - buf[MAX_CONF_LINE_LEN] = '\0'; + buf[MAX_CONF_LINE_LEN-1] = '\0'; } if(eERR_UNKNOWN == rename(buf, pcfgfile)) @@ -1607,6 +1717,39 @@ static s16 wifi_qsap_reset_to_default(s8 *pcfgfile, s8 *pdefault) } #define CTRL_IFACE_PATH_LEN (128) + +void qsap_del_ctrl_iface(void) +{ + u32 len; + s8 dst_path[CTRL_IFACE_PATH_LEN], *pcif, *pif; + s8 interface[64]; + s8 path[CTRL_IFACE_PATH_LEN + 64]; + + len = CTRL_IFACE_PATH_LEN; + + if(NULL == (pcif = qsap_get_config_value(pconffile, qsap_str[STR_CTRL_INTERFACE], dst_path, &len))) { + LOGE("%s :ctrl_iface path error \n", __func__); + goto error; + } + + len = 64; + + if(NULL == (pif = qsap_get_config_value(pconffile, qsap_str[STR_INTERFACE], interface, &len))) { + LOGE("%s :interface error \n", __func__); + goto error; + } + + if((int)sizeof(path) <= snprintf(path, sizeof(path)-1, "%s/%s", pcif, pif)) { + LOGE("Iface path : error, %s \n", path); + goto error; + } + + unlink(path); + +error: + return; +} + static int qsap_send_cmd_to_hostapd(s8 *pcmd) { int sock; @@ -1895,6 +2038,10 @@ void qsap_disassociate_sta(s8 *pVal, s8 *presp, u32 *plen) u32 len = MAX_CONF_LINE_LEN; s8 *pif; + if(ENABLE != is_softap_enabled()) { + goto end; + } + if(NULL == (pif = qsap_get_config_value(pconffile, qsap_str[STR_INTERFACE], pbuf, &len))) { LOGE("%s :interface error \n", __func__); goto end; @@ -2561,6 +2708,26 @@ static void qsap_handle_set_request(s8 *pcmd, s8 *presp, u32 *plen) ini = INI_CONF_FILE; break; + case eCMD_AP_AUTOSHUTOFF: + value = atoi(pVal); + if(TRUE != IS_VALID_APSHUTOFFTIME(value)) + goto error; + + snprintf(pVal, MAX_INT_STR, "%ld", value*60); + cNum = STR_AP_AUTOSHUTOFF; + ini = INI_CONF_FILE; + break; + + case eCMD_AP_ENERGY_DETECT_TH: + value = atoi(pVal); + if(TRUE != IS_VALID_ENERGY_DETECT_TH(value)) + goto error; + + snprintf(pVal, MAX_INT_STR, "%ld", value); + cNum = STR_AP_ENERGY_DETECT_TH; + ini = INI_CONF_FILE; + break; + default: ; /** Do not goto error, in default case */ } diff --git a/softap/sdk/qsap_api.h b/softap/sdk/qsap_api.h index 894ab40..009edc4 100644 --- a/softap/sdk/qsap_api.h +++ b/softap/sdk/qsap_api.h @@ -1,508 +1,536 @@ -/* - * Copyright (c) 2010, Code Aurora Forum. 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 of Code Aurora Forum, Inc. 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 "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * 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. - */ - - -#ifndef _QSAP_API_H_ -#define _QSAP_API_H_ - -#if __cplusplus -extern "C" { -#endif - -typedef unsigned char u8; -typedef char s8; -typedef unsigned short int u16; -typedef signed short int s16; -typedef unsigned long int u32; -typedef signed long int s32; - -/** Success and error messages */ -#define SUCCESS "success" -#define ERR_INVALID_ARG "failure invalid arguments" -#define ERR_INVALID_PARAM "failure invalid parameter" -#define ERR_UNKNOWN "failure unknown error" -#define ERR_INVALIDCMD "failure invalid command" -#define ERR_INVALIDREQ "failure invalid request" -#define ERR_FEATURE_NOT_ENABLED "failure feature not enabled" -#define ERR_NOT_SUPPORTED "failure not supported" -#define ERR_NOT_READY "failure not ready" -#define ERR_RES_UNAVAILABLE "failure resource unavailable" - -/** Error numbers used with the SDK */ -enum error_val { - eERR_UNKNOWN = -1, - eSUCCESS = 0, - eERR_STOP_BSS, - eERR_COMMIT, - eERR_START_SAP, - eERR_STOP_SAP, - eERR_RELOAD_SAP, - eERR_FILE_OPEN, - eERR_CONF_FILE, - eERR_INVALID_MAC_ADDR, - eERR_SEND_TO_HOSTAPD, - eERR_CONFIG_PARAM_MISSING, - eERR_CHAN_READ, - eERR_FEATURE_NOT_ENABLED -}; - -/** Soft AP SDK version */ -#define QSAP_SDK_VERSION "1.0" - -/** Configuration file name */ -#define CONFIG_FILE "/data/hostapd/hostapd.conf" - -/** Default configuration file path */ -#define DEFAULT_CONFIG_FILE_PATH "/persist/qcom/softap/hostapd_default.conf" - -/** Ini file */ -#define INI_FILE "/system/etc/firmware/wlan/qcom_cfg.ini" - -/** Default Ini file */ -#define DEFAULT_INI_FILE "/persist/qcom/softap/qcom_cfg_default.ini" - -/** SDK control interface path */ -#define SDK_CTRL_IF "/data/hostapd/softap_sdk_ctrl" - -/** Maximum length of the line in the configuration file */ -#define MAX_CONF_LINE_LEN (156) - -/** MAC address length in acsii string format*/ -#define MAC_ADDR_LEN (17) - -/** MAC address length, as integer */ -#define MAC_ADDR_LEN_INT (6) -/** Maximum number of MAC address in the allow / deny MAC list */ -#define MAX_ALLOWED_MAC (15) - -/** Maximum length of the file path */ -#define MAX_FILE_PATH_LEN (128) - -/** WPS key length - 8 digit key, usually*/ -#define WPS_KEY_LEN (8) - -/** Maximum length of the SSID */ -#define SSD_MAX_LEN (32) - -/** Beacon interval 50 to 65535 */ -#define BCN_INTERVAL_MIN (1) -#define BCN_INTERVAL_MAX (65535) - -/** Passphrase max length 63 bytes, Minumum lenght is 8. - * NOTE: If Passphrase length is 64, then phassphrase is treated as PSK. - */ -#define PASSPHRASE_MIN (8) -#define PASSPHRASE_MAX (63) - -/** DTIM period 1 to 255 -- Qualcomm 10 */ -#define DTIM_PERIOD_MIN (1) -#define DTIM_PERIOD_MAX (255) - -/** RTS threshold 1 to 2347 */ -#define RTS_THRESHOLD_MAX (2347) - -/** Fragmentation threshold 256 to 2346 */ -#define FRAG_THRESHOLD_MAX (2346) - -/** WEP key lengths in ASCII and hex */ -#define WEP_64_KEY_ASCII (5) -#define WEP_64_KEY_HEX (10) - -#define WEP_128_KEY_ASCII (13) -#define WEP_128_KEY_HEX (26) - -#define WEP_152_KEY_ASCII (16) -#define WEP_152_KEY_HEX (32) - -#define WPS_PIN_LEN (8) - -#define CHANNEL_MIN (0) -#define CHANNEL_MAX (14) -#define AUTO_CHANNEL (0) -#define BG_MAX_CHANNEL (11) - -#define FRAG_THRESHOLD_MIN (256) -#define FRAG_THRESHOLD_MAX (2346) - -#define RTS_THRESHOLD_MIN (0) -#define RTS_THRESHOLD_MAX (2347) - -#define MIN_UUID_LEN (1) -#define MAX_UUID_LEN (36) - -#define MIN_DEVICENAME_LEN (1) -#define MAX_DEVICENAME_LEN (32) - -#define MIN_MANUFACTURER_LEN (1) -#define MAX_MANUFACTURER_LEN (64) - -#define MIN_MODELNAME_LEN (1) -#define MAX_MODELNAME_LEN (32) - -#define MIN_MODELNUM_LEN (1) -#define MAX_MODELNUM_LEN (32) - -#define MIN_SERIALNUM_LEN (1) -#define MAX_SERIALNUM_LEN (32) - -#define MIN_DEV_TYPE_LEN (1) -#define MAX_DEV_TYPE_LEN (20) - -#define MIN_OS_VERSION_LEN (1) -#define MAX_OS_VERSION_LEN (12) - -#define MIN_FRIENDLY_NAME_LEN (1) -#define MAX_FRIENDLY_NAME_LEN (64) - -#define MAX_URL_LEN (128) - -#define MIN_MODEL_DESC_LEN (1) -#define MAX_MODEL_DESC_LEN (128) - -#define MIN_UPC_LEN (1) -#define MAX_UPC_LEN (128) - -#define GTK_MIN (600) - -#define MAX_INT_STR (8) - -/** Tx Power range 2dBm to 18 dBm */ -#define MIN_TX_POWER (2) -#define MAX_TX_POWER (30) - -/** Data rate index */ -#define MIN_DATA_RATE_IDX (0) -#define MAX_DATA_RATE_IDX (28) -#define AUTO_DATA_RATE (0) -#define B_MODE_MAX_DATA_RATE_IDX (4) -#define G_ONLY_MODE_MAX_DATA_RATE_IDX (12) - -/** parameters for read config */ -#define GET_COMMENTED_VALUE 1 -#define GET_ENABLED_ONLY 0 - -/** command request index - in the array Cmd_req[] */ -enum eCmd_req { - eCMD_GET = 0, - eCMD_SET = 1, - - eCMD_REQ_LAST -}; - -/** - * Command numbers, these numbers form the index into the array of - * command names stored in the 'cmd_list'. - * - * Warning: An addtion of an entry in 'esap_cmd', should be followed - * by an addition of a command name string in the 'cmd_list' array - */ -typedef enum esap_cmd { - eCMD_INVALID = -1, - eCMD_SSID = 0, - eCMD_BSSID = 1, - eCMD_CHAN = 2, - eCMD_BCN_INTERVAL = 3, - eCMD_DTIM_PERIOD = 4, - eCMD_HW_MODE = 5, - eCMD_AUTH_ALGS = 6, - eCMD_SEC_MODE = 7, - eCMD_WEP_KEY0 = 8, - eCMD_WEP_KEY1 = 9, - eCMD_WEP_KEY2 = 10, - eCMD_WEP_KEY3 = 11, - eCMD_DEFAULT_KEY = 12, - eCMD_PASSPHRASE = 13, - eCMD_WPA_PAIRWISE = 14, - eCMD_RSN_PAIRWISE = 15, - eCMD_MAC_ADDR = 16, - eCMD_RESET_AP = 17, - eCMD_MAC_ACL = 18, - eCMD_ADD_TO_ALLOW = 19, - eCMD_ADD_TO_DENY = 20, - eCMD_REMOVE_FROM_ALLOW = 21, - eCMD_REMOVE_FROM_DENY = 22, - eCMD_ALLOW_LIST = 23, - eCMD_DENY_LIST = 24, - eCMD_COMMIT = 25, - eCMD_ENABLE_SOFTAP = 26, - eCMD_DISASSOC_STA = 27, - eCMD_RESET_TO_DEFAULT = 28, - eCMD_PROTECTION_FLAG = 29, - eCMD_DATA_RATES = 30, - eCMD_ASSOC_STA_MACS = 31, - eCMD_TX_POWER = 32, - eCMD_SDK_VERSION = 33, - eCMD_WMM_STATE = 34, - - /** WARNING: The order of WPS commands should not be altered. - New commands SHOULD be added above or below this */ - eCMD_WPS_STATE = 35, - eCMD_WPS_CONFIG_METHOD = 36, - eCMD_UUID = 37, - eCMD_DEVICE_NAME = 38, - eCMD_MANUFACTURER = 39, - eCMD_MODEL_NAME = 40, - eCMD_MODEL_NUMBER = 41, - eCMD_SERIAL_NUMBER = 42, - eCMD_DEVICE_TYPE = 43, - eCMD_OS_VERSION = 44, - eCMD_FRIENDLY_NAME = 45, - eCMD_MANUFACTURER_URL = 46, - eCMD_MODEL_DESC = 47, - eCMD_MODEL_URL = 48, - eCMD_UPC = 49, - /******************************************************/ - - eCMD_FRAG_THRESHOLD = 50, - eCMD_RTS_THRESHOLD = 51, - eCMD_GTK_TIMEOUT = 52, - eCMD_COUNTRY_CODE = 53, - eCMD_INTRA_BSS_FORWARD = 54, - eCMD_REGULATORY_DOMAIN = 55, - - eCMD_LAST /** New command numbers should be added above this */ -} esap_cmd_t; - -/** non-commands */ -typedef enum esap_str { - STR_WPA = 0, - STR_ACCEPT_MAC_FILE = 1, - STR_DENY_MAC_FILE = 2, - STR_MAC_IN_INI = 3, - STR_PROT_FLAG_IN_INI = 4, - STR_DATA_RATE_IN_INI = 5, - STR_TX_POWER_IN_INI = 6, - STR_FRAG_THRESHOLD_IN_INI = 7, - STR_RTS_THRESHOLD_IN_INI = 8, - STR_COUNTRY_CODE_IN_INI = 9, - STR_INTRA_BSS_FORWARD_IN_INI = 10, - STR_WMM_IN_INI = 11, - STR_802DOT11D_IN_INI = 12, - STR_HT_80211N = 13, - STR_CTRL_INTERFACE = 14, - STR_INTERFACE = 15, - STR_EAP_SERVER = 16, - eSTR_LAST -} esap_str_t; - -/** Supported security mode */ -typedef enum sec_mode { - SEC_MODE_NONE = 0, - SEC_MODE_WEP = 1, - SEC_MODE_WPA_PSK = 2, - SEC_MODE_WPA2_PSK = 3, - SEC_MODE_WPA_WPA2_PSK = 4, - - SEC_MODE_INVALID -} sec_mode_t; - -/** security mode in the configuration file */ -enum wpa_in_conf_file { - WPA_IN_CONF_FILE = 1, - WPA2_IN_CONF_FILE = 2, - WPA_WPA2_IN_CONF_FILE = 3 -}; - -enum { - DISABLE = 0, - ENABLE = 1 -}; - -enum { - FALSE = 0, - TRUE = 1 -}; - -/** IEEE 802.11 operating mode */ -enum oper_mode { - HW_MODE_B = 0, - HW_MODE_G = 1, - HW_MODE_N = 2, - HW_MODE_G_ONLY = 3, - HW_MODE_N_ONLY = 4, - - HW_MODE_UNKNOWN -}; - -/** Authentication algorithm */ -enum auth_alg { - AHTH_ALG_OPEN = 1, - AUTH_ALG_SHARED = 2, - AUTH_ALG_OPEN_SHARED = 3, - - AUTH_ALG_INVALID -}; - -/** Allow or Deny MAC address list selection */ -enum macaddr_acl { - ACL_DENY_LIST = 0, - ACL_ALLOW_LIST = 1 -}; - -enum ap_reset { - SAP_RESET_BSS = 0, - SAP_RESET_DRIVER_BSS = 1, - SAP_STOP_BSS = 2, - SAP_STOP_DRIVER_BSS = 3, - SAP_RESET_INVALID -}; - -enum wmm_state { - WMM_ENABLED_IN_INI = 1, - WMM_DISABLED_IN_INI = 2 -}; - -enum wps_state { - WPS_STATE_DISABLE = 0, - WPS_STATE_ENABLE = 2 -}; - - -enum wps_config { - WPS_CONFIG_PBC = 0, - WPS_CONFIG_PIN = 1, -}; - -/** Choose the configuration file */ -enum eChoose_conf_file { - HOSTAPD_CONF_FILE = 0, - INI_CONF_FILE = 1 -}; - -/** Validate enable / disable softap */ -#define IS_VALID_SOFTAP_ENABLE(x) (((value == ENABLE) || (value == DISABLE)) ? TRUE: FALSE) - -/** Validate the channel */ -#define IS_VALID_CHANNEL(x) ((value >= CHANNEL_MIN) && (value <= CHANNEL_MAX) ? TRUE : FALSE) - -/** Validate the security mode */ -#define IS_VALID_SEC_MODE(x) (((x >= SEC_MODE_NONE) && (x < SEC_MODE_INVALID)) ? TRUE : FALSE) - -/** Validate the selection of access or deny MAC address list */ -#define IS_VALID_MAC_ACL(x) (((x==ACL_DENY_LIST) || (x==ACL_ALLOW_LIST)) ? TRUE : FALSE) - -/** Validate the broadcast SSID status */ -#define IS_VALID_BSSID(x) (((value == ENABLE) || (value == DISABLE)) ? TRUE: FALSE) - -/** Validate the length of the passphrase */ -#define IS_VALID_PASSPHRASE_LEN(x) (((x >= PASSPHRASE_MIN) && (x <= PASSPHRASE_MAX)) ? TRUE: FALSE) - -/** Validate the beacon interval */ -#define IS_VALID_BEACON(x) (((x >= BCN_INTERVAL_MIN) && (x <= BCN_INTERVAL_MAX)) ? TRUE: FALSE) - -/** Validate the DTIM period */ -#define IS_VALID_DTIM_PERIOD(x) (((x >= DTIM_PERIOD_MIN) && (x <= DTIM_PERIOD_MAX)) ? TRUE: FALSE) - -/** Validate the WEP index */ -#define IS_VALID_WEP_KEY_IDX(x) ((x >= 0) && (x < 4) ? TRUE : FALSE) - -/** Validate the pairwise encryption */ -#define IS_VALID_PAIRWISE(x) (((!strcmp(x, "TKIP")) || (!strcmp(x, "CCMP")) || \ - (!strcmp(x, "TKIP CCMP")) || (!strcmp(x, "CCMP TKIP"))) ? TRUE : FALSE) - -/** Validate the WMM status */ -#define IS_VALID_WMM_STATE(x) (((x == ENABLE) || (x == DISABLE)) ? TRUE: FALSE) - -/** Validate the WPS status */ -#define IS_VALID_WPS_STATE(x) (((x == ENABLE) || (x == DISABLE)) ? TRUE: FALSE) - -/** Validate the fragmentation threshold */ -#define IS_VALID_FRAG_THRESHOLD(x) (((x >= FRAG_THRESHOLD_MIN) && (x <= FRAG_THRESHOLD_MAX)) ? TRUE: FALSE) - -/** Validate the RTS threshold value */ -#define IS_VALID_RTS_THRESHOLD(x) (((x >= RTS_THRESHOLD_MIN) && (x <= RTS_THRESHOLD_MAX)) ? TRUE: FALSE) - -/** Validate the GTK */ -#define IS_VALID_GTK(x) ((x >= GTK_MIN) ? TRUE: FALSE) - -/** Validate the intra-bss forwarding status */ -#define IS_VALID_INTRA_BSS_STATUS(x) (((x == ENABLE) || (x == DISABLE)) ? TRUE: FALSE) - -/** Validate the protection flag */ -#define IS_VALID_PROTECTION(x) (((x == ENABLE) || (x == DISABLE)) ? TRUE: FALSE) - -/** Validate the UUID length */ -#define IS_VALID_UUID_LEN(x) (((x >= MIN_UUID_LEN) && (x <= MAX_UUID_LEN)) ? TRUE : FALSE) - -/** Validate the device name length */ -#define IS_VALID_DEVICENAME_LEN(x) (((x >= MIN_DEVICENAME_LEN) && (x <= MAX_DEVICENAME_LEN)) ? TRUE : FALSE) - -/** Validate the Manufacturer length */ -#define IS_VALID_MANUFACTURER_LEN(x) (((x >= MIN_MANUFACTURER_LEN) && (x <= MAX_MANUFACTURER_LEN)) ? TRUE : FALSE) - -/** Validate the Model name length */ -#define IS_VALID_MODELNAME_LEN(x) (((x >= MIN_MODELNAME_LEN) && (x <= MAX_MODELNAME_LEN)) ? TRUE : FALSE) - -/** Validate the Model number length */ -#define IS_VALID_MODELNUM_LEN(x) (((x >= MIN_MODELNUM_LEN) && (x <= MAX_MODELNUM_LEN)) ? TRUE : FALSE) - -/** Validate the Model serial number length */ -#define IS_VALID_SERIALNUM_LEN(x) (((x >= MIN_SERIALNUM_LEN) && (x <= MAX_SERIALNUM_LEN)) ? TRUE : FALSE) - -/** Validate the Primary device type length */ -#define IS_VALID_DEV_TYPE_LEN(x) (((x >= MIN_DEV_TYPE_LEN) && (x <= MAX_DEV_TYPE_LEN)) ? TRUE : FALSE) - -/** Validate the OS version length */ -#define IS_VALID_OS_VERSION_LEN(x) (((x >= MIN_OS_VERSION_LEN) && (x <= MAX_OS_VERSION_LEN)) ? TRUE : FALSE) - -/** Validate the friendly name length */ -#define IS_VALID_FRIENDLY_NAME_LEN(x) (((x >= MIN_FRIENDLY_NAME_LEN) && (x <= MAX_FRIENDLY_NAME_LEN)) ? TRUE : FALSE) - -/** Validate the URL length */ -#define IS_VALID_URL_LEN(x) (((x > 0) && (x <= MAX_URL_LEN)) ? TRUE : FALSE) - -/** Validate the model description length */ -#define IS_VALID_MODEL_DESC_LEN(x) (((x > MIN_MODEL_DESC_LEN) && (x <= MAX_MODEL_DESC_LEN)) ? TRUE : FALSE) - -/** Validate the Universal Product Code (UPC) length */ -#define IS_VALID_UPC_LEN(x) (((x > MIN_UPC_LEN) && (x <= MAX_UPC_LEN)) ? TRUE : FALSE) - -/** Validate the Tx power index */ -#define IS_VALID_TX_POWER(x) (((x >= MIN_TX_POWER ) && (x <= MAX_TX_POWER)) ? TRUE : FALSE) - -/** Validate the Data rate */ -#define IS_VALID_DATA_RATE_IDX(x) (((x >= MIN_DATA_RATE_IDX) && (x <= MAX_DATA_RATE_IDX)) ? TRUE : FALSE ) - -/** Validate WPS config */ -#define IS_VALID_WPS_CONFIG(x) (((x == WPS_CONFIG_PBC) || (x == WPS_CONFIG_PIN)) ? TRUE : FALSE) - -/** Validate the 802dot11d state */ -#define IS_VALID_802DOT11D_STATE(x) (((x == ENABLE) || (x == DISABLE)) ? TRUE: FALSE) - -/** Function declartion */ -void qsap_hostd_exec_cmd(s8 *pcmd, s8 *presp, u32 *plen); -s8 *qsap_get_config_value(s8 *pfile, s8 *pcmd, s8 *pbuf, u32 *plen); -int qsapsetSoftap(int argc, char *argv[]); - -#if __cplusplus -}; // extern "C" -#endif - -#endif - +/* + * Copyright (c) 2010, Code Aurora Forum. 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 of Code Aurora Forum, Inc. 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 "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * 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. + */ + + +#ifndef _QSAP_API_H_ +#define _QSAP_API_H_ + +#if __cplusplus +extern "C" { +#endif + +typedef unsigned char u8; +typedef char s8; +typedef unsigned short int u16; +typedef signed short int s16; +typedef unsigned long int u32; +typedef signed long int s32; + +/** Success and error messages */ +#define SUCCESS "success" +#define ERR_INVALID_ARG "failure invalid arguments" +#define ERR_INVALID_PARAM "failure invalid parameter" +#define ERR_UNKNOWN "failure unknown error" +#define ERR_INVALIDCMD "failure invalid command" +#define ERR_INVALIDREQ "failure invalid request" +#define ERR_FEATURE_NOT_ENABLED "failure feature not enabled" +#define ERR_NOT_SUPPORTED "failure not supported" +#define ERR_NOT_READY "failure not ready" +#define ERR_RES_UNAVAILABLE "failure resource unavailable" +#define ERR_SOFTAP_NOT_STARTED "failure softap not started" + +/** Error numbers used with the SDK */ +enum error_val { + eERR_UNKNOWN = -1, + eSUCCESS = 0, + eERR_STOP_BSS, + eERR_BSS_NOT_STARTED, + eERR_COMMIT, + eERR_START_SAP, + eERR_STOP_SAP, + eERR_RELOAD_SAP, + eERR_FILE_OPEN, + eERR_CONF_FILE, + eERR_INVALID_MAC_ADDR, + eERR_SEND_TO_HOSTAPD, + eERR_CONFIG_PARAM_MISSING, + eERR_CHAN_READ, + eERR_FEATURE_NOT_ENABLED, + eERR_UNLOAD_FAILED_SDIO, + eERR_UNLOAD_FAILED_SOFTAP, + eERR_LOAD_FAILED_SDIOIF, + eERR_LOAD_FAILED_SOFTAP +}; + +/** Soft AP SDK version */ +#define QSAP_SDK_VERSION "1.0" + +/** Configuration file name */ +#define CONFIG_FILE "/data/hostapd/hostapd.conf" + +/** Default configuration file path */ +#define DEFAULT_CONFIG_FILE_PATH "/persist/qcom/softap/hostapd_default.conf" + +/** Ini file */ +#define INI_FILE "/system/etc/firmware/wlan/qcom_cfg.ini" + +/** Default Ini file */ +#define DEFAULT_INI_FILE "/persist/qcom/softap/qcom_cfg_default.ini" + +/** SDK control interface path */ +#define SDK_CTRL_IF "/data/hostapd/softap_sdk_ctrl" + +/** Maximum length of the line in the configuration file */ +#define MAX_CONF_LINE_LEN (156) + +/** MAC address length in acsii string format*/ +#define MAC_ADDR_LEN (17) + +/** MAC address length, as integer */ +#define MAC_ADDR_LEN_INT (6) +/** Maximum number of MAC address in the allow / deny MAC list */ +#define MAX_ALLOWED_MAC (15) + +/** Maximum length of the file path */ +#define MAX_FILE_PATH_LEN (128) + +/** WPS key length - 8 digit key, usually*/ +#define WPS_KEY_LEN (8) + +/** Maximum length of the SSID */ +#define SSD_MAX_LEN (32) + +/** Beacon interval 50 to 65535 */ +#define BCN_INTERVAL_MIN (1) +#define BCN_INTERVAL_MAX (65535) + +/** Passphrase max length 63 bytes, Minumum lenght is 8. + * NOTE: If Passphrase length is 64, then phassphrase is treated as PSK. + */ +#define PASSPHRASE_MIN (8) +#define PASSPHRASE_MAX (63) + +/** DTIM period 1 to 255 -- Qualcomm 10 */ +#define DTIM_PERIOD_MIN (1) +#define DTIM_PERIOD_MAX (255) + +/** RTS threshold 1 to 2347 */ +#define RTS_THRESHOLD_MAX (2347) + +/** Fragmentation threshold 256 to 2346 */ +#define FRAG_THRESHOLD_MAX (2346) + +/** WEP key lengths in ASCII and hex */ +#define WEP_64_KEY_ASCII (5) +#define WEP_64_KEY_HEX (10) + +#define WEP_128_KEY_ASCII (13) +#define WEP_128_KEY_HEX (26) + +#define WEP_152_KEY_ASCII (16) +#define WEP_152_KEY_HEX (32) + +#define WPS_PIN_LEN (8) + +#define CHANNEL_MIN (0) +#define CHANNEL_MAX (14) +#define AUTO_CHANNEL (0) +#define BG_MAX_CHANNEL (11) + +#define FRAG_THRESHOLD_MIN (256) +#define FRAG_THRESHOLD_MAX (2346) + +#define RTS_THRESHOLD_MIN (0) +#define RTS_THRESHOLD_MAX (2347) + +#define MIN_UUID_LEN (1) +#define MAX_UUID_LEN (36) + +#define MIN_DEVICENAME_LEN (1) +#define MAX_DEVICENAME_LEN (32) + +#define MIN_MANUFACTURER_LEN (1) +#define MAX_MANUFACTURER_LEN (64) + +#define MIN_MODELNAME_LEN (1) +#define MAX_MODELNAME_LEN (32) + +#define MIN_MODELNUM_LEN (1) +#define MAX_MODELNUM_LEN (32) + +#define MIN_SERIALNUM_LEN (1) +#define MAX_SERIALNUM_LEN (32) + +#define MIN_DEV_TYPE_LEN (1) +#define MAX_DEV_TYPE_LEN (20) + +#define MIN_OS_VERSION_LEN (1) +#define MAX_OS_VERSION_LEN (12) + +#define MIN_FRIENDLY_NAME_LEN (1) +#define MAX_FRIENDLY_NAME_LEN (64) + +#define MAX_URL_LEN (128) + +#define MIN_MODEL_DESC_LEN (1) +#define MAX_MODEL_DESC_LEN (128) + +#define MIN_UPC_LEN (1) +#define MAX_UPC_LEN (128) + +#define GTK_MIN (600) + +#define MAX_INT_STR (8) + +/** Tx Power range 2dBm to 18 dBm */ +#define MIN_TX_POWER (2) +#define MAX_TX_POWER (30) + +/** Data rate index */ +#define MIN_DATA_RATE_IDX (0) +#define MAX_DATA_RATE_IDX (28) +#define AUTO_DATA_RATE (0) +#define B_MODE_MAX_DATA_RATE_IDX (4) +#define G_ONLY_MODE_MAX_DATA_RATE_IDX (12) + +/** parameters for read config */ +#define GET_COMMENTED_VALUE 1 +#define GET_ENABLED_ONLY 0 + +#define MAX_RESP_LEN 255 + +/** AP shutoff time */ +#define AP_SHUTOFF_MIN (0) +#define AP_SHUTOFF_MAX (120) + +/** AP shutoff time */ +#define AP_ENERGY_DETECT_TH_MIN (0) +#define AP_ENERGY_DETECT_TH_MAX (100) + +/** command request index - in the array Cmd_req[] */ +enum eCmd_req { + eCMD_GET = 0, + eCMD_SET = 1, + + eCMD_REQ_LAST +}; + +/** + * Command numbers, these numbers form the index into the array of + * command names stored in the 'cmd_list'. + * + * Warning: An addtion of an entry in 'esap_cmd', should be followed + * by an addition of a command name string in the 'cmd_list' array + */ +typedef enum esap_cmd { + eCMD_INVALID = -1, + eCMD_SSID = 0, + eCMD_BSSID = 1, + eCMD_CHAN = 2, + eCMD_BCN_INTERVAL = 3, + eCMD_DTIM_PERIOD = 4, + eCMD_HW_MODE = 5, + eCMD_AUTH_ALGS = 6, + eCMD_SEC_MODE = 7, + eCMD_WEP_KEY0 = 8, + eCMD_WEP_KEY1 = 9, + eCMD_WEP_KEY2 = 10, + eCMD_WEP_KEY3 = 11, + eCMD_DEFAULT_KEY = 12, + eCMD_PASSPHRASE = 13, + eCMD_WPA_PAIRWISE = 14, + eCMD_RSN_PAIRWISE = 15, + eCMD_MAC_ADDR = 16, + eCMD_RESET_AP = 17, + eCMD_MAC_ACL = 18, + eCMD_ADD_TO_ALLOW = 19, + eCMD_ADD_TO_DENY = 20, + eCMD_REMOVE_FROM_ALLOW = 21, + eCMD_REMOVE_FROM_DENY = 22, + eCMD_ALLOW_LIST = 23, + eCMD_DENY_LIST = 24, + eCMD_COMMIT = 25, + eCMD_ENABLE_SOFTAP = 26, + eCMD_DISASSOC_STA = 27, + eCMD_RESET_TO_DEFAULT = 28, + eCMD_PROTECTION_FLAG = 29, + eCMD_DATA_RATES = 30, + eCMD_ASSOC_STA_MACS = 31, + eCMD_TX_POWER = 32, + eCMD_SDK_VERSION = 33, + eCMD_WMM_STATE = 34, + + /** WARNING: The order of WPS commands should not be altered. + New commands SHOULD be added above or below this */ + eCMD_WPS_STATE = 35, + eCMD_WPS_CONFIG_METHOD = 36, + eCMD_UUID = 37, + eCMD_DEVICE_NAME = 38, + eCMD_MANUFACTURER = 39, + eCMD_MODEL_NAME = 40, + eCMD_MODEL_NUMBER = 41, + eCMD_SERIAL_NUMBER = 42, + eCMD_DEVICE_TYPE = 43, + eCMD_OS_VERSION = 44, + eCMD_FRIENDLY_NAME = 45, + eCMD_MANUFACTURER_URL = 46, + eCMD_MODEL_DESC = 47, + eCMD_MODEL_URL = 48, + eCMD_UPC = 49, + /******************************************************/ + + eCMD_FRAG_THRESHOLD = 50, + eCMD_RTS_THRESHOLD = 51, + eCMD_GTK_TIMEOUT = 52, + eCMD_COUNTRY_CODE = 53, + eCMD_INTRA_BSS_FORWARD = 54, + eCMD_REGULATORY_DOMAIN = 55, + eCMD_AP_STATISTICS = 56, + eCMD_AP_AUTOSHUTOFF = 57, + eCMD_AP_ENERGY_DETECT_TH = 58, + + eCMD_LAST /** New command numbers should be added above this */ +} esap_cmd_t; + +/** non-commands */ +typedef enum esap_str { + STR_WPA = 0, + STR_ACCEPT_MAC_FILE = 1, + STR_DENY_MAC_FILE = 2, + STR_MAC_IN_INI = 3, + STR_PROT_FLAG_IN_INI = 4, + STR_DATA_RATE_IN_INI = 5, + STR_TX_POWER_IN_INI = 6, + STR_FRAG_THRESHOLD_IN_INI = 7, + STR_RTS_THRESHOLD_IN_INI = 8, + STR_COUNTRY_CODE_IN_INI = 9, + STR_INTRA_BSS_FORWARD_IN_INI = 10, + STR_WMM_IN_INI = 11, + STR_802DOT11D_IN_INI = 12, + STR_HT_80211N = 13, + STR_CTRL_INTERFACE = 14, + STR_INTERFACE = 15, + STR_EAP_SERVER = 16, + STR_AP_AUTOSHUTOFF = 17, + STR_AP_ENERGY_DETECT_TH = 18, + eSTR_LAST +} esap_str_t; + +/** Supported security mode */ +typedef enum sec_mode { + SEC_MODE_NONE = 0, + SEC_MODE_WEP = 1, + SEC_MODE_WPA_PSK = 2, + SEC_MODE_WPA2_PSK = 3, + SEC_MODE_WPA_WPA2_PSK = 4, + + SEC_MODE_INVALID +} sec_mode_t; + +/** security mode in the configuration file */ +enum wpa_in_conf_file { + WPA_IN_CONF_FILE = 1, + WPA2_IN_CONF_FILE = 2, + WPA_WPA2_IN_CONF_FILE = 3 +}; + +enum { + DISABLE = 0, + ENABLE = 1 +}; + +enum { + FALSE = 0, + TRUE = 1 +}; + +/** IEEE 802.11 operating mode */ +enum oper_mode { + HW_MODE_B = 0, + HW_MODE_G = 1, + HW_MODE_N = 2, + HW_MODE_G_ONLY = 3, + HW_MODE_N_ONLY = 4, + + HW_MODE_UNKNOWN +}; + +/** Authentication algorithm */ +enum auth_alg { + AHTH_ALG_OPEN = 1, + AUTH_ALG_SHARED = 2, + AUTH_ALG_OPEN_SHARED = 3, + + AUTH_ALG_INVALID +}; + +/** Allow or Deny MAC address list selection */ +enum macaddr_acl { + ACL_DENY_LIST = 0, + ACL_ALLOW_LIST = 1 +}; + +enum ap_reset { + SAP_RESET_BSS = 0, + SAP_RESET_DRIVER_BSS = 1, + SAP_STOP_BSS = 2, + SAP_STOP_DRIVER_BSS = 3, + SAP_RESET_INVALID +}; + +enum wmm_state { + WMM_ENABLED_IN_INI = 1, + WMM_DISABLED_IN_INI = 2 +}; + +enum wps_state { + WPS_STATE_DISABLE = 0, + WPS_STATE_ENABLE = 2 +}; + + +enum wps_config { + WPS_CONFIG_PBC = 0, + WPS_CONFIG_PIN = 1, +}; + +/** Choose the configuration file */ +enum eChoose_conf_file { + HOSTAPD_CONF_FILE = 0, + INI_CONF_FILE = 1 +}; + +/** Validate enable / disable softap */ +#define IS_VALID_SOFTAP_ENABLE(x) (((value == ENABLE) || (value == DISABLE)) ? TRUE: FALSE) + +/** Validate the channel */ +#define IS_VALID_CHANNEL(x) ((value >= CHANNEL_MIN) && (value <= CHANNEL_MAX) ? TRUE : FALSE) + +/** Validate the security mode */ +#define IS_VALID_SEC_MODE(x) (((x >= SEC_MODE_NONE) && (x < SEC_MODE_INVALID)) ? TRUE : FALSE) + +/** Validate the selection of access or deny MAC address list */ +#define IS_VALID_MAC_ACL(x) (((x==ACL_DENY_LIST) || (x==ACL_ALLOW_LIST)) ? TRUE : FALSE) + +/** Validate the broadcast SSID status */ +#define IS_VALID_BSSID(x) (((value == ENABLE) || (value == DISABLE)) ? TRUE: FALSE) + +/** Validate the length of the passphrase */ +#define IS_VALID_PASSPHRASE_LEN(x) (((x >= PASSPHRASE_MIN) && (x <= PASSPHRASE_MAX)) ? TRUE: FALSE) + +/** Validate the beacon interval */ +#define IS_VALID_BEACON(x) (((x >= BCN_INTERVAL_MIN) && (x <= BCN_INTERVAL_MAX)) ? TRUE: FALSE) + +/** Validate the DTIM period */ +#define IS_VALID_DTIM_PERIOD(x) (((x >= DTIM_PERIOD_MIN) && (x <= DTIM_PERIOD_MAX)) ? TRUE: FALSE) + +/** Validate the WEP index */ +#define IS_VALID_WEP_KEY_IDX(x) ((x >= 0) && (x < 4) ? TRUE : FALSE) + +/** Validate the pairwise encryption */ +#define IS_VALID_PAIRWISE(x) (((!strcmp(x, "TKIP")) || (!strcmp(x, "CCMP")) || \ + (!strcmp(x, "TKIP CCMP")) || (!strcmp(x, "CCMP TKIP"))) ? TRUE : FALSE) + +/** Validate the WMM status */ +#define IS_VALID_WMM_STATE(x) (((x == ENABLE) || (x == DISABLE)) ? TRUE: FALSE) + +/** Validate the WPS status */ +#define IS_VALID_WPS_STATE(x) (((x == ENABLE) || (x == DISABLE)) ? TRUE: FALSE) + +/** Validate the fragmentation threshold */ +#define IS_VALID_FRAG_THRESHOLD(x) (((x >= FRAG_THRESHOLD_MIN) && (x <= FRAG_THRESHOLD_MAX)) ? TRUE: FALSE) + +/** Validate the RTS threshold value */ +#define IS_VALID_RTS_THRESHOLD(x) (((x >= RTS_THRESHOLD_MIN) && (x <= RTS_THRESHOLD_MAX)) ? TRUE: FALSE) + +/** Validate the GTK */ +#define IS_VALID_GTK(x) ((x >= GTK_MIN) ? TRUE: FALSE) + +/** Validate the intra-bss forwarding status */ +#define IS_VALID_INTRA_BSS_STATUS(x) (((x == ENABLE) || (x == DISABLE)) ? TRUE: FALSE) + +/** Validate the protection flag */ +#define IS_VALID_PROTECTION(x) (((x == ENABLE) || (x == DISABLE)) ? TRUE: FALSE) + +/** Validate the UUID length */ +#define IS_VALID_UUID_LEN(x) (((x >= MIN_UUID_LEN) && (x <= MAX_UUID_LEN)) ? TRUE : FALSE) + +/** Validate the device name length */ +#define IS_VALID_DEVICENAME_LEN(x) (((x >= MIN_DEVICENAME_LEN) && (x <= MAX_DEVICENAME_LEN)) ? TRUE : FALSE) + +/** Validate the Manufacturer length */ +#define IS_VALID_MANUFACTURER_LEN(x) (((x >= MIN_MANUFACTURER_LEN) && (x <= MAX_MANUFACTURER_LEN)) ? TRUE : FALSE) + +/** Validate the Model name length */ +#define IS_VALID_MODELNAME_LEN(x) (((x >= MIN_MODELNAME_LEN) && (x <= MAX_MODELNAME_LEN)) ? TRUE : FALSE) + +/** Validate the Model number length */ +#define IS_VALID_MODELNUM_LEN(x) (((x >= MIN_MODELNUM_LEN) && (x <= MAX_MODELNUM_LEN)) ? TRUE : FALSE) + +/** Validate the Model serial number length */ +#define IS_VALID_SERIALNUM_LEN(x) (((x >= MIN_SERIALNUM_LEN) && (x <= MAX_SERIALNUM_LEN)) ? TRUE : FALSE) + +/** Validate the Primary device type length */ +#define IS_VALID_DEV_TYPE_LEN(x) (((x >= MIN_DEV_TYPE_LEN) && (x <= MAX_DEV_TYPE_LEN)) ? TRUE : FALSE) + +/** Validate the OS version length */ +#define IS_VALID_OS_VERSION_LEN(x) (((x >= MIN_OS_VERSION_LEN) && (x <= MAX_OS_VERSION_LEN)) ? TRUE : FALSE) + +/** Validate the friendly name length */ +#define IS_VALID_FRIENDLY_NAME_LEN(x) (((x >= MIN_FRIENDLY_NAME_LEN) && (x <= MAX_FRIENDLY_NAME_LEN)) ? TRUE : FALSE) + +/** Validate the URL length */ +#define IS_VALID_URL_LEN(x) (((x > 0) && (x <= MAX_URL_LEN)) ? TRUE : FALSE) + +/** Validate the model description length */ +#define IS_VALID_MODEL_DESC_LEN(x) (((x > MIN_MODEL_DESC_LEN) && (x <= MAX_MODEL_DESC_LEN)) ? TRUE : FALSE) + +/** Validate the Universal Product Code (UPC) length */ +#define IS_VALID_UPC_LEN(x) (((x > MIN_UPC_LEN) && (x <= MAX_UPC_LEN)) ? TRUE : FALSE) + +/** Validate the Tx power index */ +#define IS_VALID_TX_POWER(x) (((x >= MIN_TX_POWER ) && (x <= MAX_TX_POWER)) ? TRUE : FALSE) + +/** Validate the Data rate */ +#define IS_VALID_DATA_RATE_IDX(x) (((x >= MIN_DATA_RATE_IDX) && (x <= MAX_DATA_RATE_IDX)) ? TRUE : FALSE ) + +/** Validate WPS config */ +#define IS_VALID_WPS_CONFIG(x) (((x == WPS_CONFIG_PBC) || (x == WPS_CONFIG_PIN)) ? TRUE : FALSE) + +/** Validate the 802dot11d state */ +#define IS_VALID_802DOT11D_STATE(x) (((x == ENABLE) || (x == DISABLE)) ? TRUE: FALSE) + +/** Validate the AP shutoff time */ +#define IS_VALID_APSHUTOFFTIME(x) (((x >= AP_SHUTOFF_MIN) && (x <= AP_SHUTOFF_MAX)) ? TRUE : FALSE) + +/** Validate the AP shutoff time */ +#define IS_VALID_ENERGY_DETECT_TH(x) (((x >= AP_ENERGY_DETECT_TH_MIN) && (x <= AP_ENERGY_DETECT_TH_MAX)) ? TRUE : FALSE) + +/** Function declartion */ +void qsap_hostd_exec_cmd(s8 *pcmd, s8 *presp, u32 *plen); +s8 *qsap_get_config_value(s8 *pfile, s8 *pcmd, s8 *pbuf, u32 *plen); +int qsapsetSoftap(int argc, char *argv[]); +void qsap_del_ctrl_iface(void); + +#if __cplusplus +}; // extern "C" +#endif + +#endif +