Softap: Add support for STA+SoftAP Concurrency
1. Add functions to create and remove softap interface using NL commands. 2. Write Softap interface into hostapd.conf. Change-Id: Ic8fcabf0ad514e5a73d5a9a9ebccb6ca52dcb9b4 CRs-Fixed: 1044315
This commit is contained in:
committed by
Rajesh Chauhan
parent
421ce6f83e
commit
f4eef25c34
4
softap/sdk/Android.mk
Normal file → Executable file
4
softap/sdk/Android.mk
Normal file → Executable file
@@ -4,7 +4,7 @@ LOCAL_PATH := $(call my-dir)
|
|||||||
|
|
||||||
include $(CLEAR_VARS)
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
LOCAL_C_INCLUDES := $(TOP)/hardware/libhardware_legacy/wifi
|
LOCAL_C_INCLUDES := $(TOP)/hardware/libhardware_legacy/wifi $(TOP)/external/libnl/include $(TOP)/external/wpa_supplicant_8/wpa_supplicant/src/drivers
|
||||||
|
|
||||||
LOCAL_MODULE:= libqsap_sdk
|
LOCAL_MODULE:= libqsap_sdk
|
||||||
|
|
||||||
@@ -61,7 +61,7 @@ LOCAL_SRC_FILES := qsap_api.c \
|
|||||||
|
|
||||||
LOCAL_PRELINK_MODULE := false
|
LOCAL_PRELINK_MODULE := false
|
||||||
|
|
||||||
LOCAL_SHARED_LIBRARIES := libnetutils libutils libbinder libcutils libhardware_legacy
|
LOCAL_SHARED_LIBRARIES := libnetutils libutils libbinder libcutils libhardware_legacy libnl
|
||||||
|
|
||||||
include $(BUILD_SHARED_LIBRARY)
|
include $(BUILD_SHARED_LIBRARY)
|
||||||
|
|
||||||
|
|||||||
103
softap/sdk/qsap_api.c
Normal file → Executable file
103
softap/sdk/qsap_api.c
Normal file → Executable file
@@ -44,6 +44,12 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <private/android_filesystem_config.h>
|
#include <private/android_filesystem_config.h>
|
||||||
|
#include <net/if.h>
|
||||||
|
#include <netlink/netlink.h>
|
||||||
|
#include <netlink/genl/genl.h>
|
||||||
|
#include <netlink/genl/family.h>
|
||||||
|
#include <netlink/genl/ctrl.h>
|
||||||
|
#include "nl80211_copy.h"
|
||||||
|
|
||||||
#include "qsap_api.h"
|
#include "qsap_api.h"
|
||||||
#include "qsap.h"
|
#include "qsap.h"
|
||||||
@@ -159,8 +165,8 @@ static struct Command cmd_list[eCMD_LAST] = {
|
|||||||
{ "chanlist", NULL },
|
{ "chanlist", NULL },
|
||||||
{ "ht_capab", NULL },
|
{ "ht_capab", NULL },
|
||||||
{ "ieee80211h", NULL },
|
{ "ieee80211h", NULL },
|
||||||
|
|
||||||
{ "enable_wigig_softap", NULL },
|
{ "enable_wigig_softap", NULL },
|
||||||
|
{ "interface", NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Command qsap_str[eSTR_LAST] = {
|
struct Command qsap_str[eSTR_LAST] = {
|
||||||
@@ -3104,6 +3110,7 @@ void qsap_hostd_exec_cmd(s8 *pcmd, s8 *presp, u32 *plen)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* netd and Froyo Native UI specific API */
|
/* netd and Froyo Native UI specific API */
|
||||||
|
#define DEFAULT_INTFERACE "wlan0"
|
||||||
#define DEFAULT_SSID "SOFTAP_SSID"
|
#define DEFAULT_SSID "SOFTAP_SSID"
|
||||||
#define DEFAULT_CHANNEL 4
|
#define DEFAULT_CHANNEL 4
|
||||||
#define DEFAULT_PASSPHRASE "12345678"
|
#define DEFAULT_PASSPHRASE "12345678"
|
||||||
@@ -3133,6 +3140,16 @@ int qsapsetSoftap(int argc, char *argv[])
|
|||||||
ALOGD("ARG: %d - %s\n", i+1, argv[i]);
|
ALOGD("ARG: %d - %s\n", i+1, argv[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* set interface */
|
||||||
|
if (argc > 2) {
|
||||||
|
snprintf(cmdbuf, CMD_BUF_LEN, "set interface=%s",argv[2]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
snprintf(cmdbuf, CMD_BUF_LEN, "set interface=%s", DEFAULT_INTFERACE);
|
||||||
|
}
|
||||||
|
(void) qsap_hostd_exec_cmd(cmdbuf, respbuf, &rlen);
|
||||||
|
|
||||||
|
|
||||||
/** set SSID */
|
/** set SSID */
|
||||||
if(argc > 3) {
|
if(argc > 3) {
|
||||||
qsap_scnprintf(cmdbuf, sizeof(cmdbuf), "set ssid=%s",argv[3]);
|
qsap_scnprintf(cmdbuf, sizeof(cmdbuf), "set ssid=%s",argv[3]);
|
||||||
@@ -3340,3 +3357,87 @@ void qsap_set_ini_filename(void)
|
|||||||
ALOGE("INI FILE PROP NOT PRESENT: Use default path %s\n", fIni);
|
ALOGE("INI FILE PROP NOT PRESENT: Use default path %s\n", fIni);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int qsap_add_or_remove_interface(const char *newIface , int createIface)
|
||||||
|
{
|
||||||
|
const char *wlanIface = "wlan0";
|
||||||
|
int retVal = 0;
|
||||||
|
struct nl_msg *msg = NULL;
|
||||||
|
struct nl_cb *cb = NULL;
|
||||||
|
struct nl_cb *s_cb = NULL;
|
||||||
|
struct nl_sock *nl_sock = NULL;
|
||||||
|
int nl80211_id;
|
||||||
|
enum nl80211_iftype type = NL80211_IFTYPE_AP;
|
||||||
|
|
||||||
|
/* Allocate a netlink socket */
|
||||||
|
s_cb = nl_cb_alloc(NL_CB_DEFAULT);
|
||||||
|
if (!s_cb) {
|
||||||
|
ALOGE( "Failed to allocate Netlink Socket");
|
||||||
|
retVal = -ENOMEM;
|
||||||
|
goto nla_put_failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
nl_sock = nl_socket_alloc_cb(s_cb);
|
||||||
|
if (!nl_sock) {
|
||||||
|
ALOGE( "Netlink socket Allocation failure");
|
||||||
|
retVal = -ENOMEM;
|
||||||
|
goto nla_put_failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* connect to generic netlink socket */
|
||||||
|
if (genl_connect(nl_sock)) {
|
||||||
|
ALOGE( "Netlink socket Connection failure");
|
||||||
|
retVal = -ENOLINK;
|
||||||
|
goto nla_put_failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
nl80211_id = genl_ctrl_resolve(nl_sock, "nl80211");
|
||||||
|
if (nl80211_id < 0) {
|
||||||
|
ALOGE( "nl80211 generic netlink not found");
|
||||||
|
retVal = -ENOENT;
|
||||||
|
goto nla_put_failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
msg = nlmsg_alloc();
|
||||||
|
if(!msg) {
|
||||||
|
ALOGE( "Failed to allocate netlink message");
|
||||||
|
retVal = -ENOMEM;
|
||||||
|
goto nla_put_failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
cb = nl_cb_alloc(NL_CB_DEFAULT);
|
||||||
|
if (!cb) {
|
||||||
|
ALOGE( "Failed to allocate netlink callback");
|
||||||
|
retVal = -ENOMEM;
|
||||||
|
goto nla_put_failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (createIface == 1) {
|
||||||
|
/* Issue NL80211_CMD_NEW_INTERFACE */
|
||||||
|
genlmsg_put( msg, 0, 0, nl80211_id, 0, 0, NL80211_CMD_NEW_INTERFACE, 0);
|
||||||
|
nla_put_u32( msg, NL80211_ATTR_IFINDEX, if_nametoindex( wlanIface ));
|
||||||
|
NLA_PUT_STRING( msg, NL80211_ATTR_IFNAME, newIface);
|
||||||
|
nla_put_u32( msg, NL80211_ATTR_IFTYPE, type);
|
||||||
|
} else {
|
||||||
|
genlmsg_put( msg, 0, 0, nl80211_id, 0, 0, NL80211_CMD_DEL_INTERFACE, 0);
|
||||||
|
nla_put_u32( msg, NL80211_ATTR_IFINDEX, if_nametoindex( newIface ));
|
||||||
|
}
|
||||||
|
|
||||||
|
retVal = nl_send_auto_complete(nl_sock, msg );
|
||||||
|
if (retVal < 0 ) {
|
||||||
|
goto nla_put_failure;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ALOGD("Interface %s is %s - Ok", (createIface == 1 ? "created":"removed") ,newIface);
|
||||||
|
}
|
||||||
|
nla_put_failure:
|
||||||
|
if (nl_sock)
|
||||||
|
nl_socket_free(nl_sock);
|
||||||
|
if (s_cb)
|
||||||
|
nl_cb_put(s_cb);
|
||||||
|
if (msg)
|
||||||
|
nlmsg_free(msg);
|
||||||
|
if (cb)
|
||||||
|
nl_cb_put(cb);
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|||||||
2
softap/sdk/qsap_api.h
Normal file → Executable file
2
softap/sdk/qsap_api.h
Normal file → Executable file
@@ -332,6 +332,7 @@ typedef enum esap_cmd {
|
|||||||
eCMD_IEEE80211H = 71,
|
eCMD_IEEE80211H = 71,
|
||||||
|
|
||||||
eCMD_ENABLE_WIGIG_SOFTAP = 72,
|
eCMD_ENABLE_WIGIG_SOFTAP = 72,
|
||||||
|
eCMD_INTERFACE = 73,
|
||||||
|
|
||||||
eCMD_LAST /** New command numbers should be added above this */
|
eCMD_LAST /** New command numbers should be added above this */
|
||||||
} esap_cmd_t;
|
} esap_cmd_t;
|
||||||
@@ -591,6 +592,7 @@ int qsap_hostd_exec(int argc, char ** argv);
|
|||||||
void qsap_hostd_exec_cmd(s8 *pcmd, s8 *presp, u32 *plen);
|
void qsap_hostd_exec_cmd(s8 *pcmd, s8 *presp, u32 *plen);
|
||||||
s8 *qsap_get_config_value(s8 *pfile, struct Command *pcmd, s8 *pbuf, u32 *plen);
|
s8 *qsap_get_config_value(s8 *pfile, struct Command *pcmd, s8 *pbuf, u32 *plen);
|
||||||
int qsapsetSoftap(int argc, char *argv[]);
|
int qsapsetSoftap(int argc, char *argv[]);
|
||||||
|
int qsap_add_or_remove_interface(const char *iface_name, int create_iface);
|
||||||
void qsap_del_ctrl_iface(void);
|
void qsap_del_ctrl_iface(void);
|
||||||
s16 wifi_qsap_reset_to_default(s8 *pcfgfile, s8 *pdefault);
|
s16 wifi_qsap_reset_to_default(s8 *pcfgfile, s8 *pdefault);
|
||||||
void check_for_configuration_files(void);
|
void check_for_configuration_files(void);
|
||||||
|
|||||||
Reference in New Issue
Block a user