|
@@ -1433,10 +1433,31 @@ int ieee80211_monitor_start_xmit(struct sk_buff *skb,
|
|
|
struct net_device *dev)
|
|
|
{
|
|
|
struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
|
|
|
+ struct ieee80211_channel *chan = local->hw.conf.channel;
|
|
|
struct ieee80211_radiotap_header *prthdr =
|
|
|
(struct ieee80211_radiotap_header *)skb->data;
|
|
|
u16 len_rthdr;
|
|
|
|
|
|
+ /*
|
|
|
+ * Frame injection is not allowed if beaconing is not allowed
|
|
|
+ * or if we need radar detection. Beaconing is usually not allowed when
|
|
|
+ * the mode or operation (Adhoc, AP, Mesh) does not support DFS.
|
|
|
+ * Passive scan is also used in world regulatory domains where
|
|
|
+ * your country is not known and as such it should be treated as
|
|
|
+ * NO TX unless the channel is explicitly allowed in which case
|
|
|
+ * your current regulatory domain would not have the passive scan
|
|
|
+ * flag.
|
|
|
+ *
|
|
|
+ * Since AP mode uses monitor interfaces to inject/TX management
|
|
|
+ * frames we can make AP mode the exception to this rule once it
|
|
|
+ * supports radar detection as its implementation can deal with
|
|
|
+ * radar detection by itself. We can do that later by adding a
|
|
|
+ * monitor flag interfaces used for AP support.
|
|
|
+ */
|
|
|
+ if ((chan->flags & (IEEE80211_CHAN_NO_IBSS | IEEE80211_CHAN_RADAR |
|
|
|
+ IEEE80211_CHAN_PASSIVE_SCAN)))
|
|
|
+ goto fail;
|
|
|
+
|
|
|
/* check for not even having the fixed radiotap header part */
|
|
|
if (unlikely(skb->len < sizeof(struct ieee80211_radiotap_header)))
|
|
|
goto fail; /* too short to be possibly valid */
|