diff options
author | Jouni Malinen <jouni.malinen@atheros.com> | 2010-02-15 05:53:10 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-02-15 16:14:15 -0500 |
commit | 026331c4d9b526561ea96f95fac4bfc52b69e316 (patch) | |
tree | a82b0a92a7f03a1d151a9db123320689c73d98c7 /net/mac80211/cfg.c | |
parent | 8404080568613d93ad7cf0a16dfb68459b42a264 (diff) |
cfg80211/mac80211: allow registering for and sending action frames
This implements a new command to register for action frames
that userspace wants to handle instead of the in-kernel
rejection. It is then responsible for rejecting ones that
it decided not to handle. There is no unregistration, but
the socket can be closed for that.
Frames that are not registered for will not be forwarded
to userspace and will be rejected by the kernel, the
cfg80211 API helps implementing that.
Additionally, this patch adds a new command that allows
doing action frame transmission from userspace. It can be
used either to exchange action frames on the current
operational channel (e.g., with the AP with which we are
currently associated) or to exchange off-channel Public
Action frames with the remain-on-channel command.
Signed-off-by: Jouni Malinen <jouni.malinen@atheros.com>
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/cfg.c')
-rw-r--r-- | net/mac80211/cfg.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index e1731b7c2523..b7116ef84a3b 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * mac80211 configuration hooks for cfg80211 | 2 | * mac80211 configuration hooks for cfg80211 |
3 | * | 3 | * |
4 | * Copyright 2006, 2007 Johannes Berg <johannes@sipsolutions.net> | 4 | * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net> |
5 | * | 5 | * |
6 | * This file is GPLv2 as found in COPYING. | 6 | * This file is GPLv2 as found in COPYING. |
7 | */ | 7 | */ |
@@ -1448,6 +1448,15 @@ static int ieee80211_cancel_remain_on_channel(struct wiphy *wiphy, | |||
1448 | return ieee80211_wk_cancel_remain_on_channel(sdata, cookie); | 1448 | return ieee80211_wk_cancel_remain_on_channel(sdata, cookie); |
1449 | } | 1449 | } |
1450 | 1450 | ||
1451 | static int ieee80211_action(struct wiphy *wiphy, struct net_device *dev, | ||
1452 | struct ieee80211_channel *chan, | ||
1453 | enum nl80211_channel_type channel_type, | ||
1454 | const u8 *buf, size_t len, u64 *cookie) | ||
1455 | { | ||
1456 | return ieee80211_mgd_action(IEEE80211_DEV_TO_SUB_IF(dev), chan, | ||
1457 | channel_type, buf, len, cookie); | ||
1458 | } | ||
1459 | |||
1451 | struct cfg80211_ops mac80211_config_ops = { | 1460 | struct cfg80211_ops mac80211_config_ops = { |
1452 | .add_virtual_intf = ieee80211_add_iface, | 1461 | .add_virtual_intf = ieee80211_add_iface, |
1453 | .del_virtual_intf = ieee80211_del_iface, | 1462 | .del_virtual_intf = ieee80211_del_iface, |
@@ -1496,4 +1505,5 @@ struct cfg80211_ops mac80211_config_ops = { | |||
1496 | .set_bitrate_mask = ieee80211_set_bitrate_mask, | 1505 | .set_bitrate_mask = ieee80211_set_bitrate_mask, |
1497 | .remain_on_channel = ieee80211_remain_on_channel, | 1506 | .remain_on_channel = ieee80211_remain_on_channel, |
1498 | .cancel_remain_on_channel = ieee80211_cancel_remain_on_channel, | 1507 | .cancel_remain_on_channel = ieee80211_cancel_remain_on_channel, |
1508 | .action = ieee80211_action, | ||
1499 | }; | 1509 | }; |