summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStanislaw Gruszka <sgruszka@redhat.com>2014-04-03 09:35:10 -0400
committerDan Winship <danw@gnome.org>2014-04-17 12:48:20 -0400
commit79675fc1c980f3877d87dfd9559b356808d4f5fe (patch)
tree962a605c5b3b1b38bb887514350937ed6e7a3cb8
parent2b9b26d19b27a1835766b13b1f9c6ff1c6b9c0ca (diff)
wifi: add wifi_utils_get_wowlan()
-rw-r--r--src/platform/wifi/wifi-utils-nl80211.c44
-rw-r--r--src/platform/wifi/wifi-utils-private.h2
-rw-r--r--src/platform/wifi/wifi-utils.c9
-rw-r--r--src/platform/wifi/wifi-utils.h3
4 files changed, 58 insertions, 0 deletions
diff --git a/src/platform/wifi/wifi-utils-nl80211.c b/src/platform/wifi/wifi-utils-nl80211.c
index 6da4a5737a..cc4e9bcc4a 100644
--- a/src/platform/wifi/wifi-utils-nl80211.c
+++ b/src/platform/wifi/wifi-utils-nl80211.c
@@ -604,6 +604,43 @@ nla_put_failure:
}
#endif
+struct nl80211_wowlan_info {
+ gboolean enabled;
+};
+
+static int
+nl80211_wowlan_handler (struct nl_msg *msg, void *arg)
+{
+ struct nlattr *tb[NL80211_ATTR_MAX + 1];
+ struct genlmsghdr *gnlh = nlmsg_data (nlmsg_hdr (msg));
+ struct nl80211_wowlan_info *info = arg;
+
+ info->enabled = FALSE;
+
+ if (nla_parse (tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
+ genlmsg_attrlen (gnlh, 0), NULL) < 0)
+ return NL_SKIP;
+
+ if (tb[NL80211_ATTR_WOWLAN_TRIGGERS])
+ info->enabled = TRUE;
+
+ return NL_SKIP;
+}
+
+static gboolean
+wifi_nl80211_get_wowlan (WifiData *data)
+{
+ WifiDataNl80211 *nl80211 = (WifiDataNl80211 *) data;
+ struct nl_msg *msg;
+ struct nl80211_wowlan_info info;
+
+ msg = nl80211_alloc_msg (nl80211, NL80211_CMD_GET_WOWLAN, 0);
+
+ nl80211_send_and_recv (nl80211, msg, nl80211_wowlan_handler, &info);
+
+ return info.enabled;
+}
+
struct nl80211_device_info {
guint32 *freqs;
int num_freqs;
@@ -612,6 +649,7 @@ struct nl80211_device_info {
gboolean can_scan_ssid;
gboolean supported;
gboolean success;
+ gboolean can_wowlan;
};
#define WLAN_CIPHER_SUITE_USE_GROUP 0x000FAC00
@@ -770,6 +808,9 @@ static int nl80211_wiphy_info_handler (struct nl_msg *msg, void *arg)
}
}
+ if (tb[NL80211_ATTR_WOWLAN_TRIGGERS_SUPPORTED])
+ info->can_wowlan = TRUE;
+
info->success = TRUE;
return NL_SKIP;
@@ -860,6 +901,9 @@ wifi_nl80211_init (const char *iface, int ifindex)
nl80211->num_freqs = device_info.num_freqs;
nl80211->parent.caps = device_info.caps;
+ if (device_info.can_wowlan)
+ nl80211->parent.get_wowlan = wifi_nl80211_get_wowlan;
+
nm_log_info (LOGD_HW | LOGD_WIFI,
"(%s): using nl80211 for WiFi device control",
nl80211->parent.iface);
diff --git a/src/platform/wifi/wifi-utils-private.h b/src/platform/wifi/wifi-utils-private.h
index 769e25298e..e7601752d0 100644
--- a/src/platform/wifi/wifi-utils-private.h
+++ b/src/platform/wifi/wifi-utils-private.h
@@ -56,6 +56,8 @@ struct WifiData {
void (*deinit) (WifiData *data);
+ gboolean (*get_wowlan) (WifiData *data);
+
/* OLPC Mesh-only functions */
guint32 (*get_mesh_channel) (WifiData *data);
diff --git a/src/platform/wifi/wifi-utils.c b/src/platform/wifi/wifi-utils.c
index 2902d0c8b0..ff48027528 100644
--- a/src/platform/wifi/wifi-utils.c
+++ b/src/platform/wifi/wifi-utils.c
@@ -143,6 +143,15 @@ wifi_utils_get_qual (WifiData *data)
return data->get_qual (data);
}
+gboolean
+wifi_utils_get_wowlan (WifiData *data)
+{
+ g_return_val_if_fail (data != NULL, 0);
+ if (!data->get_wowlan)
+ return FALSE;
+ return data->get_wowlan (data);
+}
+
void
wifi_utils_deinit (WifiData *data)
{
diff --git a/src/platform/wifi/wifi-utils.h b/src/platform/wifi/wifi-utils.h
index fa9dc14c61..455e075f5a 100644
--- a/src/platform/wifi/wifi-utils.h
+++ b/src/platform/wifi/wifi-utils.h
@@ -62,6 +62,9 @@ int wifi_utils_get_qual (WifiData *data);
/* Tells the driver DHCP or SLAAC is running */
gboolean wifi_utils_indicate_addressing_running (WifiData *data, gboolean running);
+/* Returns true if WoWLAN is enabled on device */
+gboolean wifi_utils_get_wowlan (WifiData *data);
+
/* OLPC Mesh-only functions */
guint32 wifi_utils_get_mesh_channel (WifiData *data);