[PATCH] don't bring the interface down if WoWLAN is enabled
Matteo Croce
matteo.croce at canonical.com
Fri Mar 17 07:27:45 PDT 2017
---
src/drivers/driver.h | 7 +++++++
src/drivers/driver_nl80211.c | 38 ++++++++++++++++++++++++++++++++++++++
wpa_supplicant/wpa_supplicant.c | 7 ++++++-
3 files changed, 51 insertions(+), 1 deletion(-)
diff --git a/src/drivers/driver.h b/src/drivers/driver.h
index fc2593e..4c54987 100644
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -3164,6 +3164,13 @@ struct wpa_driver_ops {
unsigned int val);
/**
+ * get_wowlan - Get wake-on-wireless status
+ * @priv: Private driver interface data
+ * Returns: 1 if enabled, 0 if not
+ */
+ int (*get_wowlan)(void *priv);
+
+ /**
* set_wowlan - Set wake-on-wireless triggers
* @priv: Private driver interface data
* @triggers: wowlan triggers
diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index bceeba2..fafbf2c 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -8613,6 +8613,43 @@ 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;
+
+ wpa_printf(MSG_DEBUG, "nl80211: Querying wowlan setting");
+
+ msg = nl80211_drv_msg(drv, 0, NL80211_CMD_GET_WOWLAN);
+
+ if (!send_and_recv_msgs(drv, msg, get_wowlan_handler, &wowlan_enabled)) {
+ wpa_printf(MSG_DEBUG, "WoWLAN is %s", wowlan_enabled ? "enabled" : "disabled");
+ if (wowlan_enabled)
+ return 1;
+ } else
+ wpa_printf(MSG_DEBUG, "nl80211: wowlan query failed");
+
+ return 0;
+}
+
+
static int nl80211_set_wowlan(void *priv,
const struct wowlan_triggers *triggers)
{
@@ -10075,6 +10112,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
diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
index e65441d..da06200 100644
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -5386,7 +5386,12 @@ int wpa_supplicant_remove_iface(struct wpa_global *global,
global->p2p_group_formation = NULL;
if (global->p2p_invite_group == wpa_s)
global->p2p_invite_group = NULL;
- wpa_supplicant_deinit_iface(wpa_s, 1, terminate);
+
+ /* Don't bring the interface down if WoWLAN is enabled */
+ if (wpa_s->driver->get_wowlan && !wpa_s->driver->get_wowlan(wpa_s->drv_priv))
+ wpa_supplicant_deinit_iface(wpa_s, 1, terminate);
+ else
+ wpa_dbg(wpa_s, MSG_INFO, "Leaving up as WoWLAN is enabled");
#ifdef CONFIG_MESH
if (mesh_if_created) {
--
2.9.3
More information about the Hostap
mailing list