Add initial version of Soft AP SDK
Change-Id: I7f2ca6dbfbb89065722a66bf04cff23362ec543a
This commit is contained in:
18
softap/jni/Android.mk
Normal file
18
softap/jni/Android.mk
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
|
||||||
|
LOCAL_PATH:= $(call my-dir)
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
|
LOCAL_PRELINK_MODULE := false
|
||||||
|
|
||||||
|
LOCAL_SRC_FILES := QWiFiSoftApCfg.c
|
||||||
|
|
||||||
|
LOCAL_MODULE := libQWiFiSoftApCfg
|
||||||
|
|
||||||
|
LOCAL_C_INCLUDES := $(KERNEL_HEADERS) \
|
||||||
|
$(JNI_H_INCLUDE)
|
||||||
|
|
||||||
|
LOCAL_SHARED_LIBRARIES := libsysutils libcutils libnetutils libcrypto
|
||||||
|
|
||||||
|
include $(BUILD_SHARED_LIBRARY)
|
||||||
|
|
||||||
393
softap/jni/QWiFiSoftApCfg.c
Normal file
393
softap/jni/QWiFiSoftApCfg.c
Normal file
@@ -0,0 +1,393 @@
|
|||||||
|
/*
|
||||||
|
* 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);
|
||||||
|
}
|
||||||
87
softap/jni/QWiFiSoftApCfg.h
Normal file
87
softap/jni/QWiFiSoftApCfg.h
Normal file
@@ -0,0 +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 <utils/Log.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <sys/select.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/un.h>
|
||||||
|
|
||||||
|
#include <linux/if.h>
|
||||||
|
#include <linux/if_arp.h>
|
||||||
|
#include <linux/if_ether.h>
|
||||||
|
#include <linux/netlink.h>
|
||||||
|
#include <linux/rtnetlink.h>
|
||||||
|
#include <linux/wireless.h>
|
||||||
|
|
||||||
|
#include <cutils/sockets.h>
|
||||||
|
#include <private/android_filesystem_config.h>
|
||||||
|
|
||||||
|
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
|
||||||
19
softap/sdk/Android.mk
Normal file
19
softap/sdk/Android.mk
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
|
||||||
|
|
||||||
|
LOCAL_PATH := $(call my-dir)
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
|
LOCAL_C_INCLUDES :=
|
||||||
|
|
||||||
|
LOCAL_MODULE:= libqsap_sdk
|
||||||
|
|
||||||
|
LOCAL_SRC_FILES := qsap_api.c \
|
||||||
|
qsap.c
|
||||||
|
|
||||||
|
LOCAL_PRELINK_MODULE := false
|
||||||
|
|
||||||
|
LOCAL_SHARED_LIBRARIES := libnetutils libutils libbinder libcutils
|
||||||
|
|
||||||
|
include $(BUILD_SHARED_LIBRARY)
|
||||||
|
|
||||||
414
softap/sdk/qsap.c
Normal file
414
softap/sdk/qsap.c
Normal file
@@ -0,0 +1,414 @@
|
|||||||
|
/*
|
||||||
|
* 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 <stdlib.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <linux/if.h>
|
||||||
|
#include <linux/wireless.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
|
#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 <sys/system_properties.h>
|
||||||
|
|
||||||
|
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...");
|
||||||
|
}
|
||||||
|
|
||||||
|
#define SDIO_IF_DRV "/system/lib/modules/librasdioif.ko"
|
||||||
|
#define SDIO_IF_DRV_ARG ""
|
||||||
|
#define SDIO_IF_DRV_TAG "librasdioif"
|
||||||
|
|
||||||
|
#define SOFTAP_DRV "/system/lib/modules/libra.ko"
|
||||||
|
#define SOFTAP_DRV_ARG "con_mode=1"
|
||||||
|
#define SOFTAP_DRV_TAG "libra"
|
||||||
|
|
||||||
|
ret = insmod(SDIO_IF_DRV, SDIO_IF_DRV_ARG, SDIO_IF_DRV_TAG " ");
|
||||||
|
|
||||||
|
if ( ret != 0 ) {
|
||||||
|
LOGE("init_module failed sdioif\n");
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
sched_yield();
|
||||||
|
|
||||||
|
ret = insmod(SOFTAP_DRV, SOFTAP_DRV_ARG, SOFTAP_DRV_TAG " ");
|
||||||
|
|
||||||
|
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(SOFTAP_DRV_TAG " ") ) {
|
||||||
|
if ( rmmod(SOFTAP_DRV_TAG) ) {
|
||||||
|
LOGE("Unable to unload the station mode wifi driver...\n");
|
||||||
|
ret = 1;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sched_yield();
|
||||||
|
|
||||||
|
if ( check_driver_loaded(SDIO_IF_DRV_TAG " ") ) {
|
||||||
|
if ( rmmod(SDIO_IF_DRV_TAG) ) {
|
||||||
|
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(SOFTAP_DRV_TAG " ") ) {
|
||||||
|
if ( rmmod(SOFTAP_DRV_TAG) ) {
|
||||||
|
LOGE("Unable to unload the libra_softap driver\n");
|
||||||
|
ret = 1;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sched_yield();
|
||||||
|
|
||||||
|
if ( check_driver_loaded(SDIO_IF_DRV_TAG " ") ) {
|
||||||
|
if ( rmmod(SDIO_IF_DRV_TAG) ) {
|
||||||
|
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);
|
||||||
|
|
||||||
|
return wifi_qsap_start_softap();
|
||||||
|
#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()) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return eSUCCESS;
|
||||||
|
}
|
||||||
54
softap/sdk/qsap.h
Normal file
54
softap/sdk/qsap.h
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* 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_H
|
||||||
|
#define _QSAP_H
|
||||||
|
|
||||||
|
#if __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "qsap_api.h"
|
||||||
|
|
||||||
|
s32 wifi_qsap_load_driver(void);
|
||||||
|
s32 wifi_qsap_unload_driver(void);
|
||||||
|
s32 wifi_qsap_stop_bss(void);
|
||||||
|
s32 commit(void);
|
||||||
|
s32 is_softap_enabled(void);
|
||||||
|
s32 wifi_qsap_start_softap(void);
|
||||||
|
s32 wifi_qsap_stop_softap(void);
|
||||||
|
s32 wifi_qsap_reload_softap(void);
|
||||||
|
s32 wifi_qsap_unload_wifi_sta_driver(void);
|
||||||
|
|
||||||
|
#if __cplusplus
|
||||||
|
}; // extern "C"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // _QSAP_H
|
||||||
2627
softap/sdk/qsap_api.c
Normal file
2627
softap/sdk/qsap_api.c
Normal file
File diff suppressed because it is too large
Load Diff
504
softap/sdk/qsap_api.h
Normal file
504
softap/sdk/qsap_api.h
Normal file
@@ -0,0 +1,504 @@
|
|||||||
|
/*
|
||||||
|
* 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 "/system/lib/modules/hostapd.conf"
|
||||||
|
|
||||||
|
/** Default configuration file path */
|
||||||
|
#define DEFAULT_CONFIG_FILE_PATH "/system/lib/modules/hostapd_default.conf"
|
||||||
|
|
||||||
|
/** Ini file */
|
||||||
|
#define INI_FILE "/system/etc/firmware/wlan/qcom_cfg.ini"
|
||||||
|
|
||||||
|
/** Temporary file name */
|
||||||
|
#define TMP_FILE "/system/lib/modules/tmp.qcsoftap.conf"
|
||||||
|
|
||||||
|
/** SDK control interface path */
|
||||||
|
#define SDK_CTRL_IF "/system/lib/modules/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)
|
||||||
|
|
||||||
|
/** 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
|
||||||
|
|
||||||
Reference in New Issue
Block a user