|
|
@@ -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,
|
|
|
+ rdev->wiphy.wowlan->max_nd_match_sets))
|
|
|
+ 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,
|
|
|
+ req->match_sets[i].ssid.ssid_len,
|
|
|
+ req->match_sets[i].ssid.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)
|
|
|
rdev->wiphy.wowlan_config->tcp))
|
|
|
goto nla_put_failure;
|
|
|
|
|
|
+ if (nl80211_send_wowlan_nd(
|
|
|
+ msg,
|
|
|
+ rdev->wiphy.wowlan_config->nd_config))
|
|
|
+ goto nla_put_failure;
|
|
|
+
|
|
|
nla_nest_end(msg, nl_wowlan);
|
|
|
}
|
|
|
|