From 5e44dd8ec1c606d9547a7f33b4f4b5196091dc02 Mon Sep 17 00:00:00 2001 From: Yotam Rubin Date: Sun, 25 Dec 2011 15:39:38 +0200 Subject: hostapd: add support for android created sockets (/dev/socket/) Add the same support that wpa_supplicant has with sockets created by the Android system using the init.rc services options Just as the supplicant, if the ctrl_iface is a name and not a path (i.e. doesn't start with '/') the hostapd will assume that this is an Android created socket named wpa_$(ctrl_iface) which is opened in /dev/socket/ hostapd_cli sockets will be created in /data/misc/wifi/sockets The hardcoded configuration is set in the Android.mk of hostapd just like it is with the supplicant. In addition, the hostapd_cli needs an Android property by the name ap.interface to hold the ctrl_iface name to connect to the hostapd's socket. --- hostapd/Android.mk | 3 +++ hostapd/ctrl_iface.c | 14 ++++++++++++++ hostapd/hostapd_cli.c | 37 +++++++++++++++++++++++++++++++------ 3 files changed, 48 insertions(+), 6 deletions(-) (limited to 'hostapd') diff --git a/hostapd/Android.mk b/hostapd/Android.mk index 8858b7c..e6f431c 100644 --- a/hostapd/Android.mk +++ b/hostapd/Android.mk @@ -28,6 +28,9 @@ ifeq ($(BOARD_WLAN_DEVICE), bcmdhd) L_CFLAGS += -DANDROID_BRCM_P2P_PATCH endif +# Use Android specific directory for control interface sockets +L_CFLAGS += -DCONFIG_CTRL_IFACE_CLIENT_DIR=\"/data/misc/wifi/sockets\" + # To force sizeof(enum) = 4 ifeq ($(TARGET_ARCH),arm) L_CFLAGS += -mabi=aapcs-linux diff --git a/hostapd/ctrl_iface.c b/hostapd/ctrl_iface.c index 7587e03..8f42f90 100644 --- a/hostapd/ctrl_iface.c +++ b/hostapd/ctrl_iface.c @@ -13,6 +13,9 @@ #include #include #include +#ifdef ANDROID +#include +#endif /* ANDROID */ #include "utils/common.h" #include "utils/eloop.h" @@ -957,6 +960,14 @@ int hostapd_ctrl_iface_init(struct hostapd_data *hapd) if (hapd->conf->ctrl_interface == NULL) return 0; +#ifdef ANDROID + os_snprintf(addr.sun_path, sizeof(addr.sun_path), "wpa_%s", + hapd->conf->ctrl_interface); + s = android_get_control_socket(addr.sun_path); + if (s >= 0) + goto havesock; +#endif /* ANDROID */ + if (mkdir(hapd->conf->ctrl_interface, S_IRWXU | S_IRWXG) < 0) { if (errno == EEXIST) { wpa_printf(MSG_DEBUG, "Using existing control " @@ -1037,6 +1048,9 @@ int hostapd_ctrl_iface_init(struct hostapd_data *hapd) } os_free(fname); +#ifdef ANDROID +havesock: +#endif /* ANDROID */ hapd->ctrl_sock = s; eloop_register_read_sock(s, hostapd_ctrl_iface_receive, hapd, NULL); diff --git a/hostapd/hostapd_cli.c b/hostapd/hostapd_cli.c index 0c33d5b..f3fba3e 100644 --- a/hostapd/hostapd_cli.c +++ b/hostapd/hostapd_cli.c @@ -14,6 +14,9 @@ #include "utils/eloop.h" #include "utils/edit.h" #include "common/version.h" +#ifdef ANDROID +#include +#endif /* ANDROID */ static const char *hostapd_cli_version = @@ -128,17 +131,27 @@ static void usage(void) static struct wpa_ctrl * hostapd_cli_open_connection(const char *ifname) { - char *cfile; + char *cfile = NULL; int flen; if (ifname == NULL) return NULL; - flen = strlen(ctrl_iface_dir) + strlen(ifname) + 2; - cfile = malloc(flen); - if (cfile == NULL) - return NULL; - snprintf(cfile, flen, "%s/%s", ctrl_iface_dir, ifname); +#ifdef ANDROID + if (access(ctrl_iface_dir, F_OK) < 0) { + cfile = os_strdup(ifname); + if (cfile == NULL) + return NULL; + } +#endif /* ANDROID */ + + if (cfile == NULL) { + flen = strlen(ctrl_iface_dir) + strlen(ifname) + 2; + cfile = malloc(flen); + if (cfile == NULL) + return NULL; + snprintf(cfile, flen, "%s/%s", ctrl_iface_dir, ifname); + } ctrl_conn = wpa_ctrl_open(cfile); free(cfile); @@ -1103,6 +1116,18 @@ int main(int argc, char *argv[]) } closedir(dir); } +#ifdef ANDROID + else { + char ifprop[PROPERTY_VALUE_MAX]; + int res = property_get("ap.interface", ifprop, + NULL); + if (!res) { + ctrl_ifname = os_strdup(ifprop); + printf("Using interface '%s'\n", + ctrl_ifname); + } + } +#endif /* ANDROID */ } ctrl_conn = hostapd_cli_open_connection(ctrl_ifname); if (ctrl_conn) { -- cgit v1.1