]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
Android: Add private commands support for nl80211
authorDmitry Shmidt <dimitrysh@google.com>
Wed, 23 Nov 2011 14:21:15 +0000 (16:21 +0200)
committerJouni Malinen <j@w1.fi>
Sun, 24 Nov 2013 20:46:38 +0000 (22:46 +0200)
Change-Id: If189933aaf6e629fe8ede0f4e0d0b527f3b47f2e
Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
src/drivers/driver_nl80211.c

index b9b5744446645142c1f3d4807620d5b44d2f806b..a8ff3a392cf1e2103f2dcacbdee5a820e03d21d7 100644 (file)
@@ -10999,6 +10999,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) {
@@ -11031,9 +11033,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_strlcpy(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;