From 82ba4f2d1b360f88efc81c8cd6502bd4c5d1549d Mon Sep 17 00:00:00 2001 From: Matteo Croce Date: Thu, 14 Jun 2018 11:00:42 +0200 Subject: [PATCH] nl80211: Add a driver ops function to check WoWLAN status Add function that returns whether WoWLAN has been enabled for the device or not. Signed-off-by: Alfonso Sanchez-Beato --- src/drivers/driver.h | 6 ++++++ src/drivers/driver_nl80211.c | 41 ++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/src/drivers/driver.h b/src/drivers/driver.h index f0e2a6f26..ce64f341c 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -3512,6 +3512,12 @@ struct wpa_driver_ops { int (*br_set_net_param)(void *priv, enum drv_br_net_param param, unsigned int val); + /** + * get_wowlan - Get wake-on-wireless status + * @priv: Private driver interface data + */ + int (*get_wowlan)(void *priv); + /** * set_wowlan - Set wake-on-wireless triggers * @priv: Private driver interface data diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index b7efb6a3b..9b3f60471 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -9398,6 +9398,46 @@ static int nl80211_set_qos_map(void *priv, const u8 *qos_map_set, } +static int get_wowlan_handler(struct nl_msg *msg, void *arg) +{ + struct nlattr *tb[NL80211_ATTR_MAX + 1]; + struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg)); + int *wowlan_enabled = arg; + + nla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0), + genlmsg_attrlen(gnlh, 0), NULL); + + *wowlan_enabled = !!tb[NL80211_ATTR_WOWLAN_TRIGGERS]; + + return NL_SKIP; +} + + +static int nl80211_get_wowlan(void *priv) +{ + struct i802_bss *bss = priv; + struct wpa_driver_nl80211_data *drv = bss->drv; + struct nl_msg *msg; + int wowlan_enabled; + int ret; + + wpa_printf(MSG_DEBUG, "nl80211: Getting wowlan status"); + + msg = nl80211_drv_msg(drv, 0, NL80211_CMD_GET_WOWLAN); + + ret = send_and_recv_msgs(drv, msg, get_wowlan_handler, &wowlan_enabled); + if (ret) { + wpa_printf(MSG_DEBUG, "nl80211: Getting wowlan status failed"); + return 0; + } + + wpa_printf(MSG_DEBUG, "nl80211: wowlan is %s", + wowlan_enabled ? "enabled" : "disabled"); + + return wowlan_enabled; +} + + static int nl80211_set_wowlan(void *priv, const struct wowlan_triggers *triggers) { @@ -11269,6 +11309,7 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = { #endif /* ANDROID */ .vendor_cmd = nl80211_vendor_cmd, .set_qos_map = nl80211_set_qos_map, + .get_wowlan = nl80211_get_wowlan, .set_wowlan = nl80211_set_wowlan, .set_mac_addr = nl80211_set_mac_addr, #ifdef CONFIG_MESH