aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorLuis R. Rodriguez <lrodriguez@atheros.com>2009-01-30 12:08:29 -0500
committerJohn W. Linville <linville@tuxdriver.com>2009-02-09 15:03:45 -0500
commit47f4d8872ffc57ad92d0fb344e677d12acc34acd (patch)
tree79213744d1d4ff3a97de1bfa475300db29822024 /net
parent7230645e329b4a9c566fefa9327eb8734c7d392c (diff)
mac80211: do not TX injected frames when not allowed
Monitor mode is able to TX by using injected frames. We should not allow injected frames to be sent unless allowed by regulatory rules. Since AP mode uses a monitor interfaces to transmit management frames we have to take care to not break AP mode as well while resolving this. We can deal with this by allowing compliant APs solutions to inform mac80211 if their monitor interface is intended to be used for an AP by setting a cfg80211 flag for the monitor interface. hostapd, for example, currently does its own checks to ensure AP mode is not used on channels which require radar detection. Once such solutions are available it can can add this flag for monitor interfaces. Acked-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net')
-rw-r--r--net/mac80211/tx.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index 7b013fb0d27f..f1c726d94f47 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -1433,10 +1433,31 @@ int ieee80211_monitor_start_xmit(struct sk_buff *skb,
1433 struct net_device *dev) 1433 struct net_device *dev)
1434{ 1434{
1435 struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); 1435 struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
1436 struct ieee80211_channel *chan = local->hw.conf.channel;
1436 struct ieee80211_radiotap_header *prthdr = 1437 struct ieee80211_radiotap_header *prthdr =
1437 (struct ieee80211_radiotap_header *)skb->data; 1438 (struct ieee80211_radiotap_header *)skb->data;
1438 u16 len_rthdr; 1439 u16 len_rthdr;
1439 1440
1441 /*
1442 * Frame injection is not allowed if beaconing is not allowed
1443 * or if we need radar detection. Beaconing is usually not allowed when
1444 * the mode or operation (Adhoc, AP, Mesh) does not support DFS.
1445 * Passive scan is also used in world regulatory domains where
1446 * your country is not known and as such it should be treated as
1447 * NO TX unless the channel is explicitly allowed in which case
1448 * your current regulatory domain would not have the passive scan
1449 * flag.
1450 *
1451 * Since AP mode uses monitor interfaces to inject/TX management
1452 * frames we can make AP mode the exception to this rule once it
1453 * supports radar detection as its implementation can deal with
1454 * radar detection by itself. We can do that later by adding a
1455 * monitor flag interfaces used for AP support.
1456 */
1457 if ((chan->flags & (IEEE80211_CHAN_NO_IBSS | IEEE80211_CHAN_RADAR |
1458 IEEE80211_CHAN_PASSIVE_SCAN)))
1459 goto fail;
1460
1440 /* check for not even having the fixed radiotap header part */ 1461 /* check for not even having the fixed radiotap header part */
1441 if (unlikely(skb->len < sizeof(struct ieee80211_radiotap_header))) 1462 if (unlikely(skb->len < sizeof(struct ieee80211_radiotap_header)))
1442 goto fail; /* too short to be possibly valid */ 1463 goto fail; /* too short to be possibly valid */