diff options
author | Felix Fietkau <nbd@openwrt.org> | 2013-05-28 07:01:52 -0400 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2013-05-29 03:11:44 -0400 |
commit | e057d3c31bdf87616b415c4b2cbf7310f54b9219 (patch) | |
tree | ae87f09df131d03baf389b3179083a06bac039fe /net/wireless | |
parent | 6abb9cb99f33b20c2f32f18a3ae9cc7543e46edb (diff) |
cfg80211: support an active monitor interface flag
An active monitor interface is one that is used for communication (via
injection). It is expected to ACK incoming unicast packets. This is
useful for running various 802.11 testing utilities that associate to an
AP via injection and manage the state in user space.
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/wireless')
-rw-r--r-- | net/wireless/nl80211.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index fb6abcb359a1..31d265f36d2c 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -2227,6 +2227,7 @@ static const struct nla_policy mntr_flags_policy[NL80211_MNTR_FLAG_MAX + 1] = { | |||
2227 | [NL80211_MNTR_FLAG_CONTROL] = { .type = NLA_FLAG }, | 2227 | [NL80211_MNTR_FLAG_CONTROL] = { .type = NLA_FLAG }, |
2228 | [NL80211_MNTR_FLAG_OTHER_BSS] = { .type = NLA_FLAG }, | 2228 | [NL80211_MNTR_FLAG_OTHER_BSS] = { .type = NLA_FLAG }, |
2229 | [NL80211_MNTR_FLAG_COOK_FRAMES] = { .type = NLA_FLAG }, | 2229 | [NL80211_MNTR_FLAG_COOK_FRAMES] = { .type = NLA_FLAG }, |
2230 | [NL80211_MNTR_FLAG_ACTIVE] = { .type = NLA_FLAG }, | ||
2230 | }; | 2231 | }; |
2231 | 2232 | ||
2232 | static int parse_monitor_flags(struct nlattr *nla, u32 *mntrflags) | 2233 | static int parse_monitor_flags(struct nlattr *nla, u32 *mntrflags) |
@@ -2338,6 +2339,10 @@ static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info) | |||
2338 | change = true; | 2339 | change = true; |
2339 | } | 2340 | } |
2340 | 2341 | ||
2342 | if (flags && (*flags & NL80211_MNTR_FLAG_ACTIVE) && | ||
2343 | !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR)) | ||
2344 | return -EOPNOTSUPP; | ||
2345 | |||
2341 | if (change) | 2346 | if (change) |
2342 | err = cfg80211_change_iface(rdev, dev, ntype, flags, ¶ms); | 2347 | err = cfg80211_change_iface(rdev, dev, ntype, flags, ¶ms); |
2343 | else | 2348 | else |
@@ -2395,6 +2400,11 @@ static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info) | |||
2395 | err = parse_monitor_flags(type == NL80211_IFTYPE_MONITOR ? | 2400 | err = parse_monitor_flags(type == NL80211_IFTYPE_MONITOR ? |
2396 | info->attrs[NL80211_ATTR_MNTR_FLAGS] : NULL, | 2401 | info->attrs[NL80211_ATTR_MNTR_FLAGS] : NULL, |
2397 | &flags); | 2402 | &flags); |
2403 | |||
2404 | if (!err && (flags & NL80211_MNTR_FLAG_ACTIVE) && | ||
2405 | !(rdev->wiphy.features & NL80211_FEATURE_ACTIVE_MONITOR)) | ||
2406 | return -EOPNOTSUPP; | ||
2407 | |||
2398 | wdev = rdev_add_virtual_intf(rdev, | 2408 | wdev = rdev_add_virtual_intf(rdev, |
2399 | nla_data(info->attrs[NL80211_ATTR_IFNAME]), | 2409 | nla_data(info->attrs[NL80211_ATTR_IFNAME]), |
2400 | type, err ? NULL : &flags, ¶ms); | 2410 | type, err ? NULL : &flags, ¶ms); |