Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b56cf720 authored by Johannes Berg's avatar Johannes Berg
Browse files

nl80211: conditionally add back TCP WoWLAN information



Add back the previously removed TCP WoWLAN information,
but only if userspace is prepared to deal with large
wiphy capability data dumps.

Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent cdc89b97
Loading
Loading
Loading
Loading
+46 −2
Original line number Diff line number Diff line
@@ -913,8 +913,49 @@ static int nl80211_put_iface_combinations(struct wiphy *wiphy,
}

#ifdef CONFIG_PM
static int nl80211_send_wowlan_tcp_caps(struct cfg80211_registered_device *rdev,
					struct sk_buff *msg)
{
	const struct wiphy_wowlan_tcp_support *tcp = rdev->wiphy.wowlan.tcp;
	struct nlattr *nl_tcp;

	if (!tcp)
		return 0;

	nl_tcp = nla_nest_start(msg, NL80211_WOWLAN_TRIG_TCP_CONNECTION);
	if (!nl_tcp)
		return -ENOBUFS;

	if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
			tcp->data_payload_max))
		return -ENOBUFS;

	if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD,
			tcp->data_payload_max))
		return -ENOBUFS;

	if (tcp->seq && nla_put_flag(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_SEQ))
		return -ENOBUFS;

	if (tcp->tok && nla_put(msg, NL80211_WOWLAN_TCP_DATA_PAYLOAD_TOKEN,
				sizeof(*tcp->tok), tcp->tok))
		return -ENOBUFS;

	if (nla_put_u32(msg, NL80211_WOWLAN_TCP_DATA_INTERVAL,
			tcp->data_interval_max))
		return -ENOBUFS;

	if (nla_put_u32(msg, NL80211_WOWLAN_TCP_WAKE_PAYLOAD,
			tcp->wake_payload_max))
		return -ENOBUFS;

	nla_nest_end(msg, nl_tcp);
	return 0;
}

static int nl80211_send_wowlan(struct sk_buff *msg,
			       struct cfg80211_registered_device *dev)
			       struct cfg80211_registered_device *dev,
			       bool large)
{
	struct nlattr *nl_wowlan;

@@ -956,6 +997,9 @@ static int nl80211_send_wowlan(struct sk_buff *msg,
			return -ENOBUFS;
	}

	if (large && nl80211_send_wowlan_tcp_caps(dev, msg))
		return -ENOBUFS;

	nla_nest_end(msg, nl_wowlan);

	return 0;
@@ -1392,7 +1436,7 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *dev,
			break;
	case 6:
#ifdef CONFIG_PM
		if (nl80211_send_wowlan(msg, dev))
		if (nl80211_send_wowlan(msg, dev, split))
			goto nla_put_failure;
		(*split_start)++;
		if (split)