Commit 75453ccb authored by Luciano Coelho's avatar Luciano Coelho Committed by Johannes Berg

nl80211: send netdetect configuration info in NL80211_CMD_GET_WOWLAN

Send the netdetect configuration information in the response to
NL8021_CMD_GET_WOWLAN commands.  This includes the scan interval,
SSIDs to match and frequencies to scan.

Additionally, add the NL80211_WOWLAN_TRIG_NET_DETECT with
Signed-off-by: default avatarLuciano Coelho <>
Signed-off-by: default avatarJohannes Berg <>
parent ef51fb1d
......@@ -3734,7 +3734,9 @@ struct nl80211_pattern_support {
* same attributes used with @NL80211_CMD_START_SCHED_SCAN. It
* specifies how the scan is performed (e.g. the interval and the
* channels to scan) as well as the scan results that will
* trigger a wake (i.e. the matchsets).
* trigger a wake (i.e. the matchsets). This attribute is also
* sent in a response to @NL80211_CMD_GET_WIPHY, indicating the
* number of match sets supported by the driver (u32).
* @NL80211_WOWLAN_TRIG_NET_DETECT_RESULTS: nested attribute
* containing an array with information about what triggered the
* wake up. If no elements are present in the array, it means
......@@ -1088,6 +1088,11 @@ static int nl80211_send_wowlan(struct sk_buff *msg,
return -ENOBUFS;
if ((rdev->wiphy.wowlan->flags & WIPHY_WOWLAN_NET_DETECT) &&
nla_put_u32(msg, NL80211_WOWLAN_TRIG_NET_DETECT,
return -ENOBUFS;
if (large && nl80211_send_wowlan_tcp_caps(rdev, msg))
return -ENOBUFS;
......@@ -8747,6 +8752,48 @@ static int nl80211_send_wowlan_tcp(struct sk_buff *msg,
return 0;
static int nl80211_send_wowlan_nd(struct sk_buff *msg,
struct cfg80211_sched_scan_request *req)
struct nlattr *nd, *freqs, *matches, *match;
int i;
if (!req)
return 0;
nd = nla_nest_start(msg, NL80211_WOWLAN_TRIG_NET_DETECT);
if (!nd)
return -ENOBUFS;
if (nla_put_u32(msg, NL80211_ATTR_SCHED_SCAN_INTERVAL, req->interval))
return -ENOBUFS;
freqs = nla_nest_start(msg, NL80211_ATTR_SCAN_FREQUENCIES);
if (!freqs)
return -ENOBUFS;
for (i = 0; i < req->n_channels; i++)
nla_put_u32(msg, i, req->channels[i]->center_freq);
nla_nest_end(msg, freqs);
if (req->n_match_sets) {
matches = nla_nest_start(msg, NL80211_ATTR_SCHED_SCAN_MATCH);
for (i = 0; i < req->n_match_sets; i++) {
match = nla_nest_start(msg, i);
nla_put(msg, NL80211_SCHED_SCAN_MATCH_ATTR_SSID,
nla_nest_end(msg, match);
nla_nest_end(msg, matches);
nla_nest_end(msg, nd);
return 0;
static int nl80211_get_wowlan(struct sk_buff *skb, struct genl_info *info)
struct cfg80211_registered_device *rdev = info->user_ptr[0];
......@@ -8804,6 +8851,11 @@ static int nl80211_get_wowlan(struct sk_buff *skb, struct genl_info *info)
goto nla_put_failure;
if (nl80211_send_wowlan_nd(
goto nla_put_failure;
nla_nest_end(msg, nl_wowlan);
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment