From f4eef25c34eb1710ff5abe5bb1f0bbe42747af03 Mon Sep 17 00:00:00 2001 From: Nalla Kartheek Date: Fri, 29 Apr 2016 18:09:35 +0530 Subject: [PATCH] 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 --- softap/sdk/Android.mk | 4 +- softap/sdk/qsap_api.c | 103 +++++++++++++++++++++++++++++++++++++++++- softap/sdk/qsap_api.h | 2 + 3 files changed, 106 insertions(+), 3 deletions(-) mode change 100644 => 100755 softap/sdk/Android.mk mode change 100644 => 100755 softap/sdk/qsap_api.c mode change 100644 => 100755 softap/sdk/qsap_api.h diff --git a/softap/sdk/Android.mk b/softap/sdk/Android.mk old mode 100644 new mode 100755 index e4aa2ac..e5f3802 --- a/softap/sdk/Android.mk +++ b/softap/sdk/Android.mk @@ -4,7 +4,7 @@ LOCAL_PATH := $(call my-dir) 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 @@ -61,7 +61,7 @@ LOCAL_SRC_FILES := qsap_api.c \ 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) diff --git a/softap/sdk/qsap_api.c b/softap/sdk/qsap_api.c old mode 100644 new mode 100755 index 5941f8d..e544a6a --- a/softap/sdk/qsap_api.c +++ b/softap/sdk/qsap_api.c @@ -44,6 +44,12 @@ #include #include #include +#include +#include +#include +#include +#include +#include "nl80211_copy.h" #include "qsap_api.h" #include "qsap.h" @@ -159,8 +165,8 @@ static struct Command cmd_list[eCMD_LAST] = { { "chanlist", NULL }, { "ht_capab", NULL }, { "ieee80211h", NULL }, - { "enable_wigig_softap", NULL }, + { "interface", NULL }, }; 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 */ +#define DEFAULT_INTFERACE "wlan0" #define DEFAULT_SSID "SOFTAP_SSID" #define DEFAULT_CHANNEL 4 #define DEFAULT_PASSPHRASE "12345678" @@ -3133,6 +3140,16 @@ int qsapsetSoftap(int argc, char *argv[]) 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 */ if(argc > 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); 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; +} diff --git a/softap/sdk/qsap_api.h b/softap/sdk/qsap_api.h old mode 100644 new mode 100755 index b36d7fd..d90fc1b --- a/softap/sdk/qsap_api.h +++ b/softap/sdk/qsap_api.h @@ -332,6 +332,7 @@ typedef enum esap_cmd { eCMD_IEEE80211H = 71, eCMD_ENABLE_WIGIG_SOFTAP = 72, + eCMD_INTERFACE = 73, eCMD_LAST /** New command numbers should be added above this */ } 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); s8 *qsap_get_config_value(s8 *pfile, struct Command *pcmd, s8 *pbuf, u32 *plen); 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); s16 wifi_qsap_reset_to_default(s8 *pcfgfile, s8 *pdefault); void check_for_configuration_files(void);