From d261d2a4e8c8ba5d52a3f6d24a15404e5a3a49e6 Mon Sep 17 00:00:00 2001 From: Dmitry Shmidt Date: Wed, 22 Jun 2011 15:39:21 -0700 Subject: bcmdhd: wpa_supplicant_lib: Add private commands support Change-Id: If189933aaf6e629fe8ede0f4e0d0b527f3b47f2e Signed-off-by: Dmitry Shmidt --- bcmdhd/wpa_supplicant_8_lib/driver_cmd_nl80211.c | 32 +++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) (limited to 'bcmdhd/wpa_supplicant_8_lib') diff --git a/bcmdhd/wpa_supplicant_8_lib/driver_cmd_nl80211.c b/bcmdhd/wpa_supplicant_8_lib/driver_cmd_nl80211.c index 481e8df..0c2aa7f 100644 --- a/bcmdhd/wpa_supplicant_8_lib/driver_cmd_nl80211.c +++ b/bcmdhd/wpa_supplicant_8_lib/driver_cmd_nl80211.c @@ -17,6 +17,12 @@ #define WPA_PS_ENABLED 0 #define WPA_PS_DISABLED 1 +typedef struct android_wifi_priv_cmd { + char *buf; + int used_len; + int total_len; +} android_wifi_priv_cmd; + int send_and_recv_msgs(struct wpa_driver_nl80211_data *drv, struct nl_msg *msg, int (*valid_handler)(struct nl_msg *, void *), void *valid_data); @@ -123,6 +129,8 @@ 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; wpa_msg(drv->ctx, MSG_INFO, "%s: %s", __func__, cmd); @@ -157,9 +165,27 @@ int wpa_driver_nl80211_driver_cmd(void *priv, char *cmd, char *buf, char state = cmd[11]; ret = wpa_driver_set_btcoex_state(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->ioctl_sock, SIOCDEVPRIVATE + 1, &ifr)) < 0) + wpa_printf(MSG_ERROR, "%s: failed to issue private commands\n", __func__); + else { + ret = 0; + if ((os_strcasecmp(cmd, "LINKSPEED") == 0) || + (os_strcasecmp(cmd, "RSSI") == 0)) + ret = strlen(buf); + + wpa_printf(MSG_DEBUG, "%s %s len = %d, %d", __func__, buf, ret, strlen(buf)); + } } return ret; -- cgit v1.1