From 0d153ceb18670a6d5a2438442c5846a343e3e803 Mon Sep 17 00:00:00 2001 From: Dmitry Shmidt Date: Wed, 23 Nov 2011 16:21:15 +0200 Subject: Android: Add private commands support for nl80211 Change-Id: If189933aaf6e629fe8ede0f4e0d0b527f3b47f2e Signed-off-by: Dmitry Shmidt --- src/drivers/driver_nl80211.c | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index f0f4d7e..7673c72 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -9230,6 +9230,8 @@ static int wpa_driver_nl80211_driver_cmd(void *priv, char *cmd, char *buf, { struct i802_bss *bss = priv; struct wpa_driver_nl80211_data *drv = bss->drv; + struct ifreq ifr; + android_wifi_priv_cmd priv_cmd; int ret = 0; if (os_strcasecmp(cmd, "STOP") == 0) { @@ -9262,9 +9264,33 @@ static int wpa_driver_nl80211_driver_cmd(void *priv, char *cmd, char *buf, if (!ret && (state != -1)) ret = os_snprintf(buf, buf_len, "POWERMODE = %d\n", state); - } else { - wpa_printf(MSG_ERROR, "Unsupported command: %s", cmd); - ret = -1; + } else { /* Use private command */ + memset(&ifr, 0, sizeof(ifr)); + memset(&priv_cmd, 0, sizeof(priv_cmd)); + os_memcpy(buf, cmd, strlen(cmd) + 1); + os_strncpy(ifr.ifr_name, bss->ifname, IFNAMSIZ); + + priv_cmd.buf = buf; + priv_cmd.used_len = buf_len; + priv_cmd.total_len = buf_len; + ifr.ifr_data = &priv_cmd; + + if ((ret = ioctl(drv->global->ioctl_sock, SIOCDEVPRIVATE + 1, + &ifr)) < 0) { + wpa_printf(MSG_ERROR, "%s: failed to issue private " + "commands\n", __func__); + wpa_driver_send_hang_msg(drv); + } else { + drv_errors = 0; + ret = 0; + if ((os_strcasecmp(cmd, "LINKSPEED") == 0) || + (os_strcasecmp(cmd, "RSSI") == 0) || + (os_strcasecmp(cmd, "GETBAND") == 0)) + ret = strlen(buf); + + wpa_printf(MSG_DEBUG, "%s %s len = %d, %d", __func__, + buf, ret, strlen(buf)); + } } return ret; -- cgit v1.1