diff options
author | Dmitry Shmidt <dimitrysh@google.com> | 2011-11-25 20:19:26 +0200 |
---|---|---|
committer | Arik Nemtsov <arik@wizery.com> | 2012-08-02 13:03:59 +0300 |
commit | fde8b738b597e370806decff21e665f47dfe6f14 (patch) | |
tree | 65990d9735038f2aef3ea47199fa48a43b15a93f /src/drivers | |
parent | eb0483b44624171df9aa1c25c0bce5636af7fbd1 (diff) | |
download | external_wpa_supplicant_8_ti-fde8b738b597e370806decff21e665f47dfe6f14.zip external_wpa_supplicant_8_ti-fde8b738b597e370806decff21e665f47dfe6f14.tar.gz external_wpa_supplicant_8_ti-fde8b738b597e370806decff21e665f47dfe6f14.tar.bz2 |
Android: nl80211: Add driver_cmd POWERMODE and GETPOWER
Diffstat (limited to 'src/drivers')
-rw-r--r-- | src/drivers/driver_nl80211.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index b9def3a..f0f4d7e 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -9056,6 +9056,64 @@ static void wpa_driver_send_hang_msg(struct wpa_driver_nl80211_data *drv) } +#define WPA_PS_ENABLED 0 +#define WPA_PS_DISABLED 1 + +static int wpa_driver_set_power_save(void *priv, int state) +{ + return nl80211_set_power_save(priv, state == WPA_PS_ENABLED); +} + + +static int get_power_mode_handler(struct nl_msg *msg, void *arg) +{ + struct nlattr *tb[NL80211_ATTR_MAX + 1]; + struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); + int *state = arg; + + nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), + genlmsg_attrlen(gnlh, 0), NULL); + + if (!tb[NL80211_ATTR_PS_STATE]) + return NL_SKIP; + + if (state) { + int s = (int) nla_get_u32(tb[NL80211_ATTR_PS_STATE]); + wpa_printf(MSG_DEBUG, "nl80211: Get power mode = %d", s); + *state = (s == NL80211_PS_ENABLED) ? + WPA_PS_ENABLED : WPA_PS_DISABLED; + } + + return NL_SKIP; +} + + +static int wpa_driver_get_power_save(void *priv, int *state) +{ + struct i802_bss *bss = priv; + struct wpa_driver_nl80211_data *drv = bss->drv; + struct nl_msg *msg; + int ret = -1; + enum nl80211_ps_state ps_state; + + msg = nlmsg_alloc(); + if (!msg) + return -1; + + nl80211_cmd(drv, msg, 0, NL80211_CMD_GET_POWER_SAVE); + + NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, bss->ifindex); + + ret = send_and_recv_msgs(drv, msg, get_power_mode_handler, state); + msg = NULL; + if (ret < 0) + wpa_printf(MSG_ERROR, "nl80211: Get power mode fail: %d", ret); +nla_put_failure: + nlmsg_free(msg); + return ret; +} + + static int android_priv_cmd(struct i802_bss *bss, const char *cmd) { struct wpa_driver_nl80211_data *drv = bss->drv; @@ -9191,6 +9249,19 @@ static int wpa_driver_nl80211_driver_cmd(void *priv, char *cmd, char *buf, MAC2STR(macaddr)); } else if (os_strcasecmp(cmd, "RELOAD") == 0) { wpa_msg(drv->ctx, MSG_INFO, WPA_EVENT_DRIVER_STATE "HANGED"); + } else if (os_strncasecmp(cmd, "POWERMODE ", 10) == 0) { + int state = atoi(cmd + 10); + ret = wpa_driver_set_power_save(priv, state); + if (ret < 0) + wpa_driver_send_hang_msg(drv); + else + drv_errors = 0; + } else if (os_strncasecmp(cmd, "GETPOWER", 8) == 0) { + int state = -1; + ret = wpa_driver_get_power_save(priv, &state); + 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; |