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

Commit 00f740e1 authored by Arik Nemtsov's avatar Arik Nemtsov Committed by John W. Linville
Browse files

nl80211: Pass probe response data to drivers



Pass probe-response data from usermode via beacon parameters.

Signed-off-by: default avatarGuy Eilam <guy@wizery.com>
Signed-off-by: default avatarArik Nemtsov <arik@wizery.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 87bbbe22
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -1166,6 +1166,10 @@ enum nl80211_commands {
 *	This attribute holds a bitmap of the supported protocols for
 *	offloading (see &enum nl80211_probe_resp_offload_support_attr).
 *
 * @NL80211_ATTR_PROBE_RESP: Probe Response template data. Contains the entire
 *	probe-response frame. The DA field in the 802.11 header is zero-ed out,
 *	to be filled by the FW.
 *
 * @NL80211_ATTR_MAX: highest attribute number currently defined
 * @__NL80211_ATTR_AFTER_LAST: internal use
 */
@@ -1402,6 +1406,8 @@ enum nl80211_attrs {

	NL80211_ATTR_PROBE_RESP_OFFLOAD,

	NL80211_ATTR_PROBE_RESP,

	/* add attributes here, update the policy in nl80211.c */

	__NL80211_ATTR_AFTER_LAST,
+4 −0
Original line number Diff line number Diff line
@@ -391,6 +391,8 @@ struct cfg80211_crypto_settings {
 * @assocresp_ies: extra information element(s) to add into (Re)Association
 *	Response frames or %NULL
 * @assocresp_ies_len: length of assocresp_ies in octets
 * @probe_resp_len: length of probe response template (@probe_resp)
 * @probe_resp: probe response template (AP mode only)
 */
struct beacon_parameters {
	u8 *head, *tail;
@@ -408,6 +410,8 @@ struct beacon_parameters {
	size_t proberesp_ies_len;
	const u8 *assocresp_ies;
	size_t assocresp_ies_len;
	int probe_resp_len;
	u8 *probe_resp;
};

/**
+9 −0
Original line number Diff line number Diff line
@@ -197,6 +197,8 @@ static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = {
	[NL80211_ATTR_TDLS_SUPPORT] = { .type = NLA_FLAG },
	[NL80211_ATTR_TDLS_EXTERNAL_SETUP] = { .type = NLA_FLAG },
	[NL80211_ATTR_DONT_WAIT_FOR_ACK] = { .type = NLA_FLAG },
	[NL80211_ATTR_PROBE_RESP] = { .type = NLA_BINARY,
				      .len = IEEE80211_MAX_DATA_LEN },
};

/* policy for the key attributes */
@@ -2171,6 +2173,13 @@ static int nl80211_addset_beacon(struct sk_buff *skb, struct genl_info *info)
			nla_len(info->attrs[NL80211_ATTR_IE_ASSOC_RESP]);
	}

	if (info->attrs[NL80211_ATTR_PROBE_RESP]) {
		params.probe_resp =
			nla_data(info->attrs[NL80211_ATTR_PROBE_RESP]);
		params.probe_resp_len =
			nla_len(info->attrs[NL80211_ATTR_PROBE_RESP]);
	}

	err = call(&rdev->wiphy, dev, &params);
	if (!err && params.interval)
		wdev->beacon_interval = params.interval;