diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/wireless/nl80211.c | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 6e57a3afb609..2aa6a2189842 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -185,6 +185,10 @@ static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = { | |||
185 | [NL80211_ATTR_REKEY_DATA] = { .type = NLA_NESTED }, | 185 | [NL80211_ATTR_REKEY_DATA] = { .type = NLA_NESTED }, |
186 | [NL80211_ATTR_SCAN_SUPP_RATES] = { .type = NLA_NESTED }, | 186 | [NL80211_ATTR_SCAN_SUPP_RATES] = { .type = NLA_NESTED }, |
187 | [NL80211_ATTR_HIDDEN_SSID] = { .type = NLA_U32 }, | 187 | [NL80211_ATTR_HIDDEN_SSID] = { .type = NLA_U32 }, |
188 | [NL80211_ATTR_IE_PROBE_RESP] = { .type = NLA_BINARY, | ||
189 | .len = IEEE80211_MAX_DATA_LEN }, | ||
190 | [NL80211_ATTR_IE_ASSOC_RESP] = { .type = NLA_BINARY, | ||
191 | .len = IEEE80211_MAX_DATA_LEN }, | ||
188 | }; | 192 | }; |
189 | 193 | ||
190 | /* policy for the key attributes */ | 194 | /* policy for the key attributes */ |
@@ -1991,7 +1995,10 @@ static int nl80211_addset_beacon(struct sk_buff *skb, struct genl_info *info) | |||
1991 | struct beacon_parameters params; | 1995 | struct beacon_parameters params; |
1992 | int haveinfo = 0, err; | 1996 | int haveinfo = 0, err; |
1993 | 1997 | ||
1994 | if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_BEACON_TAIL])) | 1998 | if (!is_valid_ie_attr(info->attrs[NL80211_ATTR_BEACON_TAIL]) || |
1999 | !is_valid_ie_attr(info->attrs[NL80211_ATTR_IE]) || | ||
2000 | !is_valid_ie_attr(info->attrs[NL80211_ATTR_IE_PROBE_RESP]) || | ||
2001 | !is_valid_ie_attr(info->attrs[NL80211_ATTR_IE_ASSOC_RESP])) | ||
1995 | return -EINVAL; | 2002 | return -EINVAL; |
1996 | 2003 | ||
1997 | if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && | 2004 | if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && |
@@ -2090,6 +2097,25 @@ static int nl80211_addset_beacon(struct sk_buff *skb, struct genl_info *info) | |||
2090 | if (!haveinfo) | 2097 | if (!haveinfo) |
2091 | return -EINVAL; | 2098 | return -EINVAL; |
2092 | 2099 | ||
2100 | if (info->attrs[NL80211_ATTR_IE]) { | ||
2101 | params.beacon_ies = nla_data(info->attrs[NL80211_ATTR_IE]); | ||
2102 | params.beacon_ies_len = nla_len(info->attrs[NL80211_ATTR_IE]); | ||
2103 | } | ||
2104 | |||
2105 | if (info->attrs[NL80211_ATTR_IE_PROBE_RESP]) { | ||
2106 | params.proberesp_ies = | ||
2107 | nla_data(info->attrs[NL80211_ATTR_IE_PROBE_RESP]); | ||
2108 | params.proberesp_ies_len = | ||
2109 | nla_len(info->attrs[NL80211_ATTR_IE_PROBE_RESP]); | ||
2110 | } | ||
2111 | |||
2112 | if (info->attrs[NL80211_ATTR_IE_ASSOC_RESP]) { | ||
2113 | params.assocresp_ies = | ||
2114 | nla_data(info->attrs[NL80211_ATTR_IE_ASSOC_RESP]); | ||
2115 | params.assocresp_ies_len = | ||
2116 | nla_len(info->attrs[NL80211_ATTR_IE_ASSOC_RESP]); | ||
2117 | } | ||
2118 | |||
2093 | err = call(&rdev->wiphy, dev, ¶ms); | 2119 | err = call(&rdev->wiphy, dev, ¶ms); |
2094 | if (!err && params.interval) | 2120 | if (!err && params.interval) |
2095 | wdev->beacon_interval = params.interval; | 2121 | wdev->beacon_interval = params.interval; |