mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
mac80211: remove support for IFF_PROMISC
This support is essentially useless as typically networks are encrypted, frames will be filtered by hardware, and rate scaling will be done with the intended recipient in mind. For real monitoring of the network, the monitor mode support should be used instead. Removing it removes a lot of corner cases. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
ebd82b39bf
commit
df1404650c
@ -1353,12 +1353,7 @@ static void adm8211_configure_filter(struct ieee80211_hw *dev,
|
|||||||
|
|
||||||
new_flags = 0;
|
new_flags = 0;
|
||||||
|
|
||||||
if (*total_flags & FIF_PROMISC_IN_BSS) {
|
if (*total_flags & FIF_ALLMULTI || multicast == ~(0ULL)) {
|
||||||
new_flags |= FIF_PROMISC_IN_BSS;
|
|
||||||
priv->nar |= ADM8211_NAR_PR;
|
|
||||||
priv->nar &= ~ADM8211_NAR_MM;
|
|
||||||
mc_filter[1] = mc_filter[0] = ~0;
|
|
||||||
} else if (*total_flags & FIF_ALLMULTI || multicast == ~(0ULL)) {
|
|
||||||
new_flags |= FIF_ALLMULTI;
|
new_flags |= FIF_ALLMULTI;
|
||||||
priv->nar &= ~ADM8211_NAR_PR;
|
priv->nar &= ~ADM8211_NAR_PR;
|
||||||
priv->nar |= ADM8211_NAR_MM;
|
priv->nar |= ADM8211_NAR_MM;
|
||||||
|
@ -447,7 +447,7 @@ struct at76_priv {
|
|||||||
int mac80211_registered;
|
int mac80211_registered;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define AT76_SUPPORTED_FILTERS FIF_PROMISC_IN_BSS
|
#define AT76_SUPPORTED_FILTERS 0
|
||||||
|
|
||||||
#define SCAN_POLL_INTERVAL (HZ / 4)
|
#define SCAN_POLL_INTERVAL (HZ / 4)
|
||||||
|
|
||||||
|
@ -1319,8 +1319,7 @@ out_unlock:
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define AR5523_SUPPORTED_FILTERS (FIF_PROMISC_IN_BSS | \
|
#define AR5523_SUPPORTED_FILTERS (FIF_ALLMULTI | \
|
||||||
FIF_ALLMULTI | \
|
|
||||||
FIF_FCSFAIL | \
|
FIF_FCSFAIL | \
|
||||||
FIF_OTHER_BSS)
|
FIF_OTHER_BSS)
|
||||||
|
|
||||||
|
@ -773,7 +773,6 @@ static int ath10k_monitor_recalc(struct ath10k *ar)
|
|||||||
lockdep_assert_held(&ar->conf_mutex);
|
lockdep_assert_held(&ar->conf_mutex);
|
||||||
|
|
||||||
should_start = ar->monitor ||
|
should_start = ar->monitor ||
|
||||||
ar->filter_flags & FIF_PROMISC_IN_BSS ||
|
|
||||||
test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
|
test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
|
||||||
|
|
||||||
ath10k_dbg(ar, ATH10K_DBG_MAC,
|
ath10k_dbg(ar, ATH10K_DBG_MAC,
|
||||||
@ -3493,8 +3492,7 @@ static void ath10k_remove_interface(struct ieee80211_hw *hw,
|
|||||||
* FIXME: Has to be verified.
|
* FIXME: Has to be verified.
|
||||||
*/
|
*/
|
||||||
#define SUPPORTED_FILTERS \
|
#define SUPPORTED_FILTERS \
|
||||||
(FIF_PROMISC_IN_BSS | \
|
(FIF_ALLMULTI | \
|
||||||
FIF_ALLMULTI | \
|
|
||||||
FIF_CONTROL | \
|
FIF_CONTROL | \
|
||||||
FIF_PSPOLL | \
|
FIF_PSPOLL | \
|
||||||
FIF_OTHER_BSS | \
|
FIF_OTHER_BSS | \
|
||||||
|
@ -1280,7 +1280,6 @@ struct ath5k_hw {
|
|||||||
|
|
||||||
DECLARE_BITMAP(status, 4);
|
DECLARE_BITMAP(status, 4);
|
||||||
#define ATH_STAT_INVALID 0 /* disable hardware accesses */
|
#define ATH_STAT_INVALID 0 /* disable hardware accesses */
|
||||||
#define ATH_STAT_PROMISC 1
|
|
||||||
#define ATH_STAT_LEDSOFT 2 /* enable LED gpio status */
|
#define ATH_STAT_LEDSOFT 2 /* enable LED gpio status */
|
||||||
#define ATH_STAT_STARTED 3 /* opened & irqs enabled */
|
#define ATH_STAT_STARTED 3 /* opened & irqs enabled */
|
||||||
#define ATH_STAT_RESET 4 /* hw reset */
|
#define ATH_STAT_RESET 4 /* hw reset */
|
||||||
|
@ -369,7 +369,7 @@ ath5k_configure_filter(struct ieee80211_hw *hw, unsigned int changed_flags,
|
|||||||
unsigned int *new_flags, u64 multicast)
|
unsigned int *new_flags, u64 multicast)
|
||||||
{
|
{
|
||||||
#define SUPPORTED_FIF_FLAGS \
|
#define SUPPORTED_FIF_FLAGS \
|
||||||
(FIF_PROMISC_IN_BSS | FIF_ALLMULTI | FIF_FCSFAIL | \
|
(FIF_ALLMULTI | FIF_FCSFAIL | \
|
||||||
FIF_PLCPFAIL | FIF_CONTROL | FIF_OTHER_BSS | \
|
FIF_PLCPFAIL | FIF_CONTROL | FIF_OTHER_BSS | \
|
||||||
FIF_BCN_PRBRESP_PROMISC)
|
FIF_BCN_PRBRESP_PROMISC)
|
||||||
|
|
||||||
@ -393,16 +393,6 @@ ath5k_configure_filter(struct ieee80211_hw *hw, unsigned int changed_flags,
|
|||||||
(AR5K_RX_FILTER_UCAST | AR5K_RX_FILTER_BCAST |
|
(AR5K_RX_FILTER_UCAST | AR5K_RX_FILTER_BCAST |
|
||||||
AR5K_RX_FILTER_MCAST);
|
AR5K_RX_FILTER_MCAST);
|
||||||
|
|
||||||
if (changed_flags & (FIF_PROMISC_IN_BSS | FIF_OTHER_BSS)) {
|
|
||||||
if (*new_flags & FIF_PROMISC_IN_BSS)
|
|
||||||
__set_bit(ATH_STAT_PROMISC, ah->status);
|
|
||||||
else
|
|
||||||
__clear_bit(ATH_STAT_PROMISC, ah->status);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (test_bit(ATH_STAT_PROMISC, ah->status))
|
|
||||||
rfilt |= AR5K_RX_FILTER_PROM;
|
|
||||||
|
|
||||||
/* Note, AR5K_RX_FILTER_MCAST is already enabled */
|
/* Note, AR5K_RX_FILTER_MCAST is already enabled */
|
||||||
if (*new_flags & FIF_ALLMULTI) {
|
if (*new_flags & FIF_ALLMULTI) {
|
||||||
mfilt[0] = ~0;
|
mfilt[0] = ~0;
|
||||||
@ -418,8 +408,7 @@ ath5k_configure_filter(struct ieee80211_hw *hw, unsigned int changed_flags,
|
|||||||
if ((*new_flags & FIF_BCN_PRBRESP_PROMISC) || (ah->nvifs > 1))
|
if ((*new_flags & FIF_BCN_PRBRESP_PROMISC) || (ah->nvifs > 1))
|
||||||
rfilt |= AR5K_RX_FILTER_BEACON;
|
rfilt |= AR5K_RX_FILTER_BEACON;
|
||||||
|
|
||||||
/* FIF_CONTROL doc says that if FIF_PROMISC_IN_BSS is not
|
/* FIF_CONTROL doc says we should only pass on control frames for this
|
||||||
* set we should only pass on control frames for this
|
|
||||||
* station. This needs testing. I believe right now this
|
* station. This needs testing. I believe right now this
|
||||||
* enables *all* control frames, which is OK.. but
|
* enables *all* control frames, which is OK.. but
|
||||||
* but we should see if we can improve on granularity */
|
* but we should see if we can improve on granularity */
|
||||||
|
@ -1238,8 +1238,7 @@ out:
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define SUPPORTED_FILTERS \
|
#define SUPPORTED_FILTERS \
|
||||||
(FIF_PROMISC_IN_BSS | \
|
(FIF_ALLMULTI | \
|
||||||
FIF_ALLMULTI | \
|
|
||||||
FIF_CONTROL | \
|
FIF_CONTROL | \
|
||||||
FIF_PSPOLL | \
|
FIF_PSPOLL | \
|
||||||
FIF_OTHER_BSS | \
|
FIF_OTHER_BSS | \
|
||||||
|
@ -872,14 +872,7 @@ u32 ath9k_htc_calcrxfilter(struct ath9k_htc_priv *priv)
|
|||||||
if (priv->rxfilter & FIF_PROBE_REQ)
|
if (priv->rxfilter & FIF_PROBE_REQ)
|
||||||
rfilt |= ATH9K_RX_FILTER_PROBEREQ;
|
rfilt |= ATH9K_RX_FILTER_PROBEREQ;
|
||||||
|
|
||||||
/*
|
if (ah->is_monitoring)
|
||||||
* Set promiscuous mode when FIF_PROMISC_IN_BSS is enabled for station
|
|
||||||
* mode interface or when in monitor mode. AP mode does not need this
|
|
||||||
* since it receives all in-BSS frames anyway.
|
|
||||||
*/
|
|
||||||
if (((ah->opmode != NL80211_IFTYPE_AP) &&
|
|
||||||
(priv->rxfilter & FIF_PROMISC_IN_BSS)) ||
|
|
||||||
ah->is_monitoring)
|
|
||||||
rfilt |= ATH9K_RX_FILTER_PROM;
|
rfilt |= ATH9K_RX_FILTER_PROM;
|
||||||
|
|
||||||
if (priv->rxfilter & FIF_CONTROL)
|
if (priv->rxfilter & FIF_CONTROL)
|
||||||
|
@ -1442,8 +1442,7 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define SUPPORTED_FILTERS \
|
#define SUPPORTED_FILTERS \
|
||||||
(FIF_PROMISC_IN_BSS | \
|
(FIF_ALLMULTI | \
|
||||||
FIF_ALLMULTI | \
|
|
||||||
FIF_CONTROL | \
|
FIF_CONTROL | \
|
||||||
FIF_PSPOLL | \
|
FIF_PSPOLL | \
|
||||||
FIF_OTHER_BSS | \
|
FIF_OTHER_BSS | \
|
||||||
|
@ -392,11 +392,6 @@ u32 ath_calcrxfilter(struct ath_softc *sc)
|
|||||||
if (sc->cur_chan->rxfilter & FIF_PROBE_REQ)
|
if (sc->cur_chan->rxfilter & FIF_PROBE_REQ)
|
||||||
rfilt |= ATH9K_RX_FILTER_PROBEREQ;
|
rfilt |= ATH9K_RX_FILTER_PROBEREQ;
|
||||||
|
|
||||||
/*
|
|
||||||
* Set promiscuous mode when FIF_PROMISC_IN_BSS is enabled for station
|
|
||||||
* mode interface or when in monitor mode. AP mode does not need this
|
|
||||||
* since it receives all in-BSS frames anyway.
|
|
||||||
*/
|
|
||||||
if (sc->sc_ah->is_monitoring)
|
if (sc->sc_ah->is_monitoring)
|
||||||
rfilt |= ATH9K_RX_FILTER_PROM;
|
rfilt |= ATH9K_RX_FILTER_PROM;
|
||||||
|
|
||||||
|
@ -310,8 +310,7 @@ static int carl9170_fw(struct ar9170 *ar, const __u8 *data, size_t len)
|
|||||||
if (SUPP(CARL9170FW_RX_FILTER)) {
|
if (SUPP(CARL9170FW_RX_FILTER)) {
|
||||||
ar->fw.rx_filter = true;
|
ar->fw.rx_filter = true;
|
||||||
ar->rx_filter_caps = FIF_FCSFAIL | FIF_PLCPFAIL |
|
ar->rx_filter_caps = FIF_FCSFAIL | FIF_PLCPFAIL |
|
||||||
FIF_CONTROL | FIF_PSPOLL | FIF_OTHER_BSS |
|
FIF_CONTROL | FIF_PSPOLL | FIF_OTHER_BSS;
|
||||||
FIF_PROMISC_IN_BSS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SUPP(CARL9170FW_HW_COUNTERS))
|
if (SUPP(CARL9170FW_HW_COUNTERS))
|
||||||
|
@ -1011,9 +1011,8 @@ static void carl9170_op_configure_filter(struct ieee80211_hw *hw,
|
|||||||
if (multicast != ar->cur_mc_hash)
|
if (multicast != ar->cur_mc_hash)
|
||||||
WARN_ON(carl9170_update_multicast(ar, multicast));
|
WARN_ON(carl9170_update_multicast(ar, multicast));
|
||||||
|
|
||||||
if (changed_flags & (FIF_OTHER_BSS | FIF_PROMISC_IN_BSS)) {
|
if (changed_flags & FIF_OTHER_BSS) {
|
||||||
ar->sniffer_enabled = !!(*new_flags &
|
ar->sniffer_enabled = !!(*new_flags & FIF_OTHER_BSS);
|
||||||
(FIF_OTHER_BSS | FIF_PROMISC_IN_BSS));
|
|
||||||
|
|
||||||
WARN_ON(carl9170_set_operating_mode(ar));
|
WARN_ON(carl9170_set_operating_mode(ar));
|
||||||
}
|
}
|
||||||
@ -1033,7 +1032,7 @@ static void carl9170_op_configure_filter(struct ieee80211_hw *hw,
|
|||||||
if (!(*new_flags & FIF_PSPOLL))
|
if (!(*new_flags & FIF_PSPOLL))
|
||||||
rx_filter |= CARL9170_RX_FILTER_CTL_PSPOLL;
|
rx_filter |= CARL9170_RX_FILTER_CTL_PSPOLL;
|
||||||
|
|
||||||
if (!(*new_flags & (FIF_OTHER_BSS | FIF_PROMISC_IN_BSS))) {
|
if (!(*new_flags & FIF_OTHER_BSS)) {
|
||||||
rx_filter |= CARL9170_RX_FILTER_OTHER_RA;
|
rx_filter |= CARL9170_RX_FILTER_OTHER_RA;
|
||||||
rx_filter |= CARL9170_RX_FILTER_DECRY_FAIL;
|
rx_filter |= CARL9170_RX_FILTER_DECRY_FAIL;
|
||||||
}
|
}
|
||||||
|
@ -3131,8 +3131,6 @@ static void b43_adjust_opmode(struct b43_wldev *dev)
|
|||||||
ctl |= B43_MACCTL_KEEP_BAD;
|
ctl |= B43_MACCTL_KEEP_BAD;
|
||||||
if (wl->filter_flags & FIF_PLCPFAIL)
|
if (wl->filter_flags & FIF_PLCPFAIL)
|
||||||
ctl |= B43_MACCTL_KEEP_BADPLCP;
|
ctl |= B43_MACCTL_KEEP_BADPLCP;
|
||||||
if (wl->filter_flags & FIF_PROMISC_IN_BSS)
|
|
||||||
ctl |= B43_MACCTL_PROMISC;
|
|
||||||
if (wl->filter_flags & FIF_BCN_PRBRESP_PROMISC)
|
if (wl->filter_flags & FIF_BCN_PRBRESP_PROMISC)
|
||||||
ctl |= B43_MACCTL_BEACPROMISC;
|
ctl |= B43_MACCTL_BEACPROMISC;
|
||||||
|
|
||||||
@ -4310,16 +4308,14 @@ static void b43_op_configure_filter(struct ieee80211_hw *hw,
|
|||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
*fflags &= FIF_PROMISC_IN_BSS |
|
*fflags &= FIF_ALLMULTI |
|
||||||
FIF_ALLMULTI |
|
|
||||||
FIF_FCSFAIL |
|
FIF_FCSFAIL |
|
||||||
FIF_PLCPFAIL |
|
FIF_PLCPFAIL |
|
||||||
FIF_CONTROL |
|
FIF_CONTROL |
|
||||||
FIF_OTHER_BSS |
|
FIF_OTHER_BSS |
|
||||||
FIF_BCN_PRBRESP_PROMISC;
|
FIF_BCN_PRBRESP_PROMISC;
|
||||||
|
|
||||||
changed &= FIF_PROMISC_IN_BSS |
|
changed &= FIF_ALLMULTI |
|
||||||
FIF_ALLMULTI |
|
|
||||||
FIF_FCSFAIL |
|
FIF_FCSFAIL |
|
||||||
FIF_PLCPFAIL |
|
FIF_PLCPFAIL |
|
||||||
FIF_CONTROL |
|
FIF_CONTROL |
|
||||||
|
@ -2055,8 +2055,6 @@ static void b43legacy_adjust_opmode(struct b43legacy_wldev *dev)
|
|||||||
ctl |= B43legacy_MACCTL_KEEP_BAD;
|
ctl |= B43legacy_MACCTL_KEEP_BAD;
|
||||||
if (wl->filter_flags & FIF_PLCPFAIL)
|
if (wl->filter_flags & FIF_PLCPFAIL)
|
||||||
ctl |= B43legacy_MACCTL_KEEP_BADPLCP;
|
ctl |= B43legacy_MACCTL_KEEP_BADPLCP;
|
||||||
if (wl->filter_flags & FIF_PROMISC_IN_BSS)
|
|
||||||
ctl |= B43legacy_MACCTL_PROMISC;
|
|
||||||
if (wl->filter_flags & FIF_BCN_PRBRESP_PROMISC)
|
if (wl->filter_flags & FIF_BCN_PRBRESP_PROMISC)
|
||||||
ctl |= B43legacy_MACCTL_BEACPROMISC;
|
ctl |= B43legacy_MACCTL_BEACPROMISC;
|
||||||
|
|
||||||
@ -2922,16 +2920,14 @@ static void b43legacy_op_configure_filter(struct ieee80211_hw *hw,
|
|||||||
}
|
}
|
||||||
|
|
||||||
spin_lock_irqsave(&wl->irq_lock, flags);
|
spin_lock_irqsave(&wl->irq_lock, flags);
|
||||||
*fflags &= FIF_PROMISC_IN_BSS |
|
*fflags &= FIF_ALLMULTI |
|
||||||
FIF_ALLMULTI |
|
|
||||||
FIF_FCSFAIL |
|
FIF_FCSFAIL |
|
||||||
FIF_PLCPFAIL |
|
FIF_PLCPFAIL |
|
||||||
FIF_CONTROL |
|
FIF_CONTROL |
|
||||||
FIF_OTHER_BSS |
|
FIF_OTHER_BSS |
|
||||||
FIF_BCN_PRBRESP_PROMISC;
|
FIF_BCN_PRBRESP_PROMISC;
|
||||||
|
|
||||||
changed &= FIF_PROMISC_IN_BSS |
|
changed &= FIF_ALLMULTI |
|
||||||
FIF_ALLMULTI |
|
|
||||||
FIF_FCSFAIL |
|
FIF_FCSFAIL |
|
||||||
FIF_PLCPFAIL |
|
FIF_PLCPFAIL |
|
||||||
FIF_CONTROL |
|
FIF_CONTROL |
|
||||||
|
@ -41,8 +41,7 @@
|
|||||||
#define BRCMS_FLUSH_TIMEOUT 500 /* msec */
|
#define BRCMS_FLUSH_TIMEOUT 500 /* msec */
|
||||||
|
|
||||||
/* Flags we support */
|
/* Flags we support */
|
||||||
#define MAC_FILTERS (FIF_PROMISC_IN_BSS | \
|
#define MAC_FILTERS (FIF_ALLMULTI | \
|
||||||
FIF_ALLMULTI | \
|
|
||||||
FIF_FCSFAIL | \
|
FIF_FCSFAIL | \
|
||||||
FIF_CONTROL | \
|
FIF_CONTROL | \
|
||||||
FIF_OTHER_BSS | \
|
FIF_OTHER_BSS | \
|
||||||
@ -743,8 +742,6 @@ brcms_ops_configure_filter(struct ieee80211_hw *hw,
|
|||||||
changed_flags &= MAC_FILTERS;
|
changed_flags &= MAC_FILTERS;
|
||||||
*total_flags &= MAC_FILTERS;
|
*total_flags &= MAC_FILTERS;
|
||||||
|
|
||||||
if (changed_flags & FIF_PROMISC_IN_BSS)
|
|
||||||
brcms_dbg_info(core, "FIF_PROMISC_IN_BSS\n");
|
|
||||||
if (changed_flags & FIF_ALLMULTI)
|
if (changed_flags & FIF_ALLMULTI)
|
||||||
brcms_dbg_info(core, "FIF_ALLMULTI\n");
|
brcms_dbg_info(core, "FIF_ALLMULTI\n");
|
||||||
if (changed_flags & FIF_FCSFAIL)
|
if (changed_flags & FIF_FCSFAIL)
|
||||||
|
@ -3571,7 +3571,7 @@ void brcms_c_mac_promisc(struct brcms_c_info *wlc, uint filter_flags)
|
|||||||
|
|
||||||
wlc->filter_flags = filter_flags;
|
wlc->filter_flags = filter_flags;
|
||||||
|
|
||||||
if (filter_flags & (FIF_PROMISC_IN_BSS | FIF_OTHER_BSS))
|
if (filter_flags & FIF_OTHER_BSS)
|
||||||
promisc_bits |= MCTL_PROMISC;
|
promisc_bits |= MCTL_PROMISC;
|
||||||
|
|
||||||
if (filter_flags & FIF_BCN_PRBRESP_PROMISC)
|
if (filter_flags & FIF_BCN_PRBRESP_PROMISC)
|
||||||
|
@ -578,13 +578,11 @@ void cw1200_configure_filter(struct ieee80211_hw *dev,
|
|||||||
{
|
{
|
||||||
struct cw1200_common *priv = dev->priv;
|
struct cw1200_common *priv = dev->priv;
|
||||||
bool listening = !!(*total_flags &
|
bool listening = !!(*total_flags &
|
||||||
(FIF_PROMISC_IN_BSS |
|
(FIF_OTHER_BSS |
|
||||||
FIF_OTHER_BSS |
|
|
||||||
FIF_BCN_PRBRESP_PROMISC |
|
FIF_BCN_PRBRESP_PROMISC |
|
||||||
FIF_PROBE_REQ));
|
FIF_PROBE_REQ));
|
||||||
|
|
||||||
*total_flags &= FIF_PROMISC_IN_BSS |
|
*total_flags &= FIF_OTHER_BSS |
|
||||||
FIF_OTHER_BSS |
|
|
||||||
FIF_FCSFAIL |
|
FIF_FCSFAIL |
|
||||||
FIF_BCN_PRBRESP_PROMISC |
|
FIF_BCN_PRBRESP_PROMISC |
|
||||||
FIF_PROBE_REQ;
|
FIF_PROBE_REQ;
|
||||||
@ -592,14 +590,12 @@ void cw1200_configure_filter(struct ieee80211_hw *dev,
|
|||||||
down(&priv->scan.lock);
|
down(&priv->scan.lock);
|
||||||
mutex_lock(&priv->conf_mutex);
|
mutex_lock(&priv->conf_mutex);
|
||||||
|
|
||||||
priv->rx_filter.promiscuous = (*total_flags & FIF_PROMISC_IN_BSS)
|
priv->rx_filter.promiscuous = 0;
|
||||||
? 1 : 0;
|
|
||||||
priv->rx_filter.bssid = (*total_flags & (FIF_OTHER_BSS |
|
priv->rx_filter.bssid = (*total_flags & (FIF_OTHER_BSS |
|
||||||
FIF_PROBE_REQ)) ? 1 : 0;
|
FIF_PROBE_REQ)) ? 1 : 0;
|
||||||
priv->rx_filter.fcs = (*total_flags & FIF_FCSFAIL) ? 1 : 0;
|
priv->rx_filter.fcs = (*total_flags & FIF_FCSFAIL) ? 1 : 0;
|
||||||
priv->disable_beacon_filter = !(*total_flags &
|
priv->disable_beacon_filter = !(*total_flags &
|
||||||
(FIF_BCN_PRBRESP_PROMISC |
|
(FIF_BCN_PRBRESP_PROMISC |
|
||||||
FIF_PROMISC_IN_BSS |
|
|
||||||
FIF_PROBE_REQ));
|
FIF_PROBE_REQ));
|
||||||
if (priv->listening != listening) {
|
if (priv->listening != listening) {
|
||||||
priv->listening = listening;
|
priv->listening = listening;
|
||||||
|
@ -3048,7 +3048,7 @@ il3945_configure_filter(struct ieee80211_hw *hw, unsigned int changed_flags,
|
|||||||
D_MAC80211("Enter: changed: 0x%x, total: 0x%x\n", changed_flags,
|
D_MAC80211("Enter: changed: 0x%x, total: 0x%x\n", changed_flags,
|
||||||
*total_flags);
|
*total_flags);
|
||||||
|
|
||||||
CHK(FIF_OTHER_BSS | FIF_PROMISC_IN_BSS, RXON_FILTER_PROMISC_MSK);
|
CHK(FIF_OTHER_BSS, RXON_FILTER_PROMISC_MSK);
|
||||||
CHK(FIF_CONTROL, RXON_FILTER_CTL2HOST_MSK);
|
CHK(FIF_CONTROL, RXON_FILTER_CTL2HOST_MSK);
|
||||||
CHK(FIF_BCN_PRBRESP_PROMISC, RXON_FILTER_BCON_AWARE_MSK);
|
CHK(FIF_BCN_PRBRESP_PROMISC, RXON_FILTER_BCON_AWARE_MSK);
|
||||||
|
|
||||||
@ -3074,7 +3074,7 @@ il3945_configure_filter(struct ieee80211_hw *hw, unsigned int changed_flags,
|
|||||||
* filters into the device.
|
* filters into the device.
|
||||||
*/
|
*/
|
||||||
*total_flags &=
|
*total_flags &=
|
||||||
FIF_OTHER_BSS | FIF_ALLMULTI | FIF_PROMISC_IN_BSS |
|
FIF_OTHER_BSS | FIF_ALLMULTI |
|
||||||
FIF_BCN_PRBRESP_PROMISC | FIF_CONTROL;
|
FIF_BCN_PRBRESP_PROMISC | FIF_CONTROL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6166,7 +6166,7 @@ il4965_configure_filter(struct ieee80211_hw *hw, unsigned int changed_flags,
|
|||||||
D_MAC80211("Enter: changed: 0x%x, total: 0x%x\n", changed_flags,
|
D_MAC80211("Enter: changed: 0x%x, total: 0x%x\n", changed_flags,
|
||||||
*total_flags);
|
*total_flags);
|
||||||
|
|
||||||
CHK(FIF_OTHER_BSS | FIF_PROMISC_IN_BSS, RXON_FILTER_PROMISC_MSK);
|
CHK(FIF_OTHER_BSS, RXON_FILTER_PROMISC_MSK);
|
||||||
/* Setting _just_ RXON_FILTER_CTL2HOST_MSK causes FH errors */
|
/* Setting _just_ RXON_FILTER_CTL2HOST_MSK causes FH errors */
|
||||||
CHK(FIF_CONTROL, RXON_FILTER_CTL2HOST_MSK | RXON_FILTER_PROMISC_MSK);
|
CHK(FIF_CONTROL, RXON_FILTER_CTL2HOST_MSK | RXON_FILTER_PROMISC_MSK);
|
||||||
CHK(FIF_BCN_PRBRESP_PROMISC, RXON_FILTER_BCON_AWARE_MSK);
|
CHK(FIF_BCN_PRBRESP_PROMISC, RXON_FILTER_BCON_AWARE_MSK);
|
||||||
@ -6192,7 +6192,7 @@ il4965_configure_filter(struct ieee80211_hw *hw, unsigned int changed_flags,
|
|||||||
* filters into the device.
|
* filters into the device.
|
||||||
*/
|
*/
|
||||||
*total_flags &=
|
*total_flags &=
|
||||||
FIF_OTHER_BSS | FIF_ALLMULTI | FIF_PROMISC_IN_BSS |
|
FIF_OTHER_BSS | FIF_ALLMULTI |
|
||||||
FIF_BCN_PRBRESP_PROMISC | FIF_CONTROL;
|
FIF_BCN_PRBRESP_PROMISC | FIF_CONTROL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1061,7 +1061,7 @@ static void iwlagn_configure_filter(struct ieee80211_hw *hw,
|
|||||||
IWL_DEBUG_MAC80211(priv, "Enter: changed: 0x%x, total: 0x%x\n",
|
IWL_DEBUG_MAC80211(priv, "Enter: changed: 0x%x, total: 0x%x\n",
|
||||||
changed_flags, *total_flags);
|
changed_flags, *total_flags);
|
||||||
|
|
||||||
CHK(FIF_OTHER_BSS | FIF_PROMISC_IN_BSS, RXON_FILTER_PROMISC_MSK);
|
CHK(FIF_OTHER_BSS, RXON_FILTER_PROMISC_MSK);
|
||||||
/* Setting _just_ RXON_FILTER_CTL2HOST_MSK causes FH errors */
|
/* Setting _just_ RXON_FILTER_CTL2HOST_MSK causes FH errors */
|
||||||
CHK(FIF_CONTROL, RXON_FILTER_CTL2HOST_MSK | RXON_FILTER_PROMISC_MSK);
|
CHK(FIF_CONTROL, RXON_FILTER_CTL2HOST_MSK | RXON_FILTER_PROMISC_MSK);
|
||||||
CHK(FIF_BCN_PRBRESP_PROMISC, RXON_FILTER_BCON_AWARE_MSK);
|
CHK(FIF_BCN_PRBRESP_PROMISC, RXON_FILTER_BCON_AWARE_MSK);
|
||||||
@ -1088,7 +1088,7 @@ static void iwlagn_configure_filter(struct ieee80211_hw *hw,
|
|||||||
* since we currently do not support programming multicast
|
* since we currently do not support programming multicast
|
||||||
* filters into the device.
|
* filters into the device.
|
||||||
*/
|
*/
|
||||||
*total_flags &= FIF_OTHER_BSS | FIF_ALLMULTI | FIF_PROMISC_IN_BSS |
|
*total_flags &= FIF_OTHER_BSS | FIF_ALLMULTI |
|
||||||
FIF_BCN_PRBRESP_PROMISC | FIF_CONTROL;
|
FIF_BCN_PRBRESP_PROMISC | FIF_CONTROL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -439,7 +439,7 @@ static u64 lbtf_op_prepare_multicast(struct ieee80211_hw *hw,
|
|||||||
return mc_count;
|
return mc_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SUPPORTED_FIF_FLAGS (FIF_PROMISC_IN_BSS | FIF_ALLMULTI)
|
#define SUPPORTED_FIF_FLAGS FIF_ALLMULTI
|
||||||
static void lbtf_op_configure_filter(struct ieee80211_hw *hw,
|
static void lbtf_op_configure_filter(struct ieee80211_hw *hw,
|
||||||
unsigned int changed_flags,
|
unsigned int changed_flags,
|
||||||
unsigned int *new_flags,
|
unsigned int *new_flags,
|
||||||
@ -458,10 +458,7 @@ static void lbtf_op_configure_filter(struct ieee80211_hw *hw,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*new_flags & (FIF_PROMISC_IN_BSS))
|
priv->mac_control &= ~CMD_ACT_MAC_PROMISCUOUS_ENABLE;
|
||||||
priv->mac_control |= CMD_ACT_MAC_PROMISCUOUS_ENABLE;
|
|
||||||
else
|
|
||||||
priv->mac_control &= ~CMD_ACT_MAC_PROMISCUOUS_ENABLE;
|
|
||||||
if (*new_flags & (FIF_ALLMULTI) ||
|
if (*new_flags & (FIF_ALLMULTI) ||
|
||||||
multicast > MRVDRV_MAX_MULTICAST_LIST_SIZE) {
|
multicast > MRVDRV_MAX_MULTICAST_LIST_SIZE) {
|
||||||
priv->mac_control |= CMD_ACT_MAC_ALL_MULTICAST_ENABLE;
|
priv->mac_control |= CMD_ACT_MAC_ALL_MULTICAST_ENABLE;
|
||||||
|
@ -1554,8 +1554,6 @@ static void mac80211_hwsim_configure_filter(struct ieee80211_hw *hw,
|
|||||||
wiphy_debug(hw->wiphy, "%s\n", __func__);
|
wiphy_debug(hw->wiphy, "%s\n", __func__);
|
||||||
|
|
||||||
data->rx_filter = 0;
|
data->rx_filter = 0;
|
||||||
if (*total_flags & FIF_PROMISC_IN_BSS)
|
|
||||||
data->rx_filter |= FIF_PROMISC_IN_BSS;
|
|
||||||
if (*total_flags & FIF_ALLMULTI)
|
if (*total_flags & FIF_ALLMULTI)
|
||||||
data->rx_filter |= FIF_ALLMULTI;
|
data->rx_filter |= FIF_ALLMULTI;
|
||||||
|
|
||||||
|
@ -5192,7 +5192,7 @@ mwl8k_configure_filter_sniffer(struct ieee80211_hw *hw,
|
|||||||
priv->sniffer_enabled = true;
|
priv->sniffer_enabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
*total_flags &= FIF_PROMISC_IN_BSS | FIF_ALLMULTI |
|
*total_flags &= FIF_ALLMULTI |
|
||||||
FIF_BCN_PRBRESP_PROMISC | FIF_CONTROL |
|
FIF_BCN_PRBRESP_PROMISC | FIF_CONTROL |
|
||||||
FIF_OTHER_BSS;
|
FIF_OTHER_BSS;
|
||||||
|
|
||||||
|
@ -351,8 +351,7 @@ int p54_setup_mac(struct p54_common *priv)
|
|||||||
* "TRANSPARENT and PROMISCUOUS are mutually exclusive"
|
* "TRANSPARENT and PROMISCUOUS are mutually exclusive"
|
||||||
* STSW45X0C LMAC API - page 12
|
* STSW45X0C LMAC API - page 12
|
||||||
*/
|
*/
|
||||||
if (((priv->filter_flags & FIF_PROMISC_IN_BSS) ||
|
if (priv->filter_flags & FIF_OTHER_BSS &&
|
||||||
(priv->filter_flags & FIF_OTHER_BSS)) &&
|
|
||||||
(mode != P54_FILTER_TYPE_PROMISCUOUS))
|
(mode != P54_FILTER_TYPE_PROMISCUOUS))
|
||||||
mode |= P54_FILTER_TYPE_TRANSPARENT;
|
mode |= P54_FILTER_TYPE_TRANSPARENT;
|
||||||
} else {
|
} else {
|
||||||
|
@ -395,13 +395,11 @@ static void p54_configure_filter(struct ieee80211_hw *dev,
|
|||||||
{
|
{
|
||||||
struct p54_common *priv = dev->priv;
|
struct p54_common *priv = dev->priv;
|
||||||
|
|
||||||
*total_flags &= FIF_PROMISC_IN_BSS |
|
*total_flags &= FIF_ALLMULTI | FIF_OTHER_BSS;
|
||||||
FIF_ALLMULTI |
|
|
||||||
FIF_OTHER_BSS;
|
|
||||||
|
|
||||||
priv->filter_flags = *total_flags;
|
priv->filter_flags = *total_flags;
|
||||||
|
|
||||||
if (changed_flags & (FIF_PROMISC_IN_BSS | FIF_OTHER_BSS))
|
if (changed_flags & FIF_OTHER_BSS)
|
||||||
p54_setup_mac(priv);
|
p54_setup_mac(priv);
|
||||||
|
|
||||||
if (changed_flags & FIF_ALLMULTI || multicast)
|
if (changed_flags & FIF_ALLMULTI || multicast)
|
||||||
|
@ -273,10 +273,8 @@ static void rt2400pci_config_filter(struct rt2x00_dev *rt2x00dev,
|
|||||||
!(filter_flags & FIF_PLCPFAIL));
|
!(filter_flags & FIF_PLCPFAIL));
|
||||||
rt2x00_set_field32(®, RXCSR0_DROP_CONTROL,
|
rt2x00_set_field32(®, RXCSR0_DROP_CONTROL,
|
||||||
!(filter_flags & FIF_CONTROL));
|
!(filter_flags & FIF_CONTROL));
|
||||||
rt2x00_set_field32(®, RXCSR0_DROP_NOT_TO_ME,
|
rt2x00_set_field32(®, RXCSR0_DROP_NOT_TO_ME, 1);
|
||||||
!(filter_flags & FIF_PROMISC_IN_BSS));
|
|
||||||
rt2x00_set_field32(®, RXCSR0_DROP_TODS,
|
rt2x00_set_field32(®, RXCSR0_DROP_TODS,
|
||||||
!(filter_flags & FIF_PROMISC_IN_BSS) &&
|
|
||||||
!rt2x00dev->intf_ap_count);
|
!rt2x00dev->intf_ap_count);
|
||||||
rt2x00_set_field32(®, RXCSR0_DROP_VERSION_ERROR, 1);
|
rt2x00_set_field32(®, RXCSR0_DROP_VERSION_ERROR, 1);
|
||||||
rt2x00mmio_register_write(rt2x00dev, RXCSR0, reg);
|
rt2x00mmio_register_write(rt2x00dev, RXCSR0, reg);
|
||||||
|
@ -274,10 +274,8 @@ static void rt2500pci_config_filter(struct rt2x00_dev *rt2x00dev,
|
|||||||
!(filter_flags & FIF_PLCPFAIL));
|
!(filter_flags & FIF_PLCPFAIL));
|
||||||
rt2x00_set_field32(®, RXCSR0_DROP_CONTROL,
|
rt2x00_set_field32(®, RXCSR0_DROP_CONTROL,
|
||||||
!(filter_flags & FIF_CONTROL));
|
!(filter_flags & FIF_CONTROL));
|
||||||
rt2x00_set_field32(®, RXCSR0_DROP_NOT_TO_ME,
|
rt2x00_set_field32(®, RXCSR0_DROP_NOT_TO_ME, 1);
|
||||||
!(filter_flags & FIF_PROMISC_IN_BSS));
|
|
||||||
rt2x00_set_field32(®, RXCSR0_DROP_TODS,
|
rt2x00_set_field32(®, RXCSR0_DROP_TODS,
|
||||||
!(filter_flags & FIF_PROMISC_IN_BSS) &&
|
|
||||||
!rt2x00dev->intf_ap_count);
|
!rt2x00dev->intf_ap_count);
|
||||||
rt2x00_set_field32(®, RXCSR0_DROP_VERSION_ERROR, 1);
|
rt2x00_set_field32(®, RXCSR0_DROP_VERSION_ERROR, 1);
|
||||||
rt2x00_set_field32(®, RXCSR0_DROP_MCAST,
|
rt2x00_set_field32(®, RXCSR0_DROP_MCAST,
|
||||||
|
@ -434,10 +434,8 @@ static void rt2500usb_config_filter(struct rt2x00_dev *rt2x00dev,
|
|||||||
!(filter_flags & FIF_PLCPFAIL));
|
!(filter_flags & FIF_PLCPFAIL));
|
||||||
rt2x00_set_field16(®, TXRX_CSR2_DROP_CONTROL,
|
rt2x00_set_field16(®, TXRX_CSR2_DROP_CONTROL,
|
||||||
!(filter_flags & FIF_CONTROL));
|
!(filter_flags & FIF_CONTROL));
|
||||||
rt2x00_set_field16(®, TXRX_CSR2_DROP_NOT_TO_ME,
|
rt2x00_set_field16(®, TXRX_CSR2_DROP_NOT_TO_ME, 1);
|
||||||
!(filter_flags & FIF_PROMISC_IN_BSS));
|
|
||||||
rt2x00_set_field16(®, TXRX_CSR2_DROP_TODS,
|
rt2x00_set_field16(®, TXRX_CSR2_DROP_TODS,
|
||||||
!(filter_flags & FIF_PROMISC_IN_BSS) &&
|
|
||||||
!rt2x00dev->intf_ap_count);
|
!rt2x00dev->intf_ap_count);
|
||||||
rt2x00_set_field16(®, TXRX_CSR2_DROP_VERSION_ERROR, 1);
|
rt2x00_set_field16(®, TXRX_CSR2_DROP_VERSION_ERROR, 1);
|
||||||
rt2x00_set_field16(®, TXRX_CSR2_DROP_MULTICAST,
|
rt2x00_set_field16(®, TXRX_CSR2_DROP_MULTICAST,
|
||||||
|
@ -1513,8 +1513,7 @@ void rt2800_config_filter(struct rt2x00_dev *rt2x00dev,
|
|||||||
!(filter_flags & FIF_FCSFAIL));
|
!(filter_flags & FIF_FCSFAIL));
|
||||||
rt2x00_set_field32(®, RX_FILTER_CFG_DROP_PHY_ERROR,
|
rt2x00_set_field32(®, RX_FILTER_CFG_DROP_PHY_ERROR,
|
||||||
!(filter_flags & FIF_PLCPFAIL));
|
!(filter_flags & FIF_PLCPFAIL));
|
||||||
rt2x00_set_field32(®, RX_FILTER_CFG_DROP_NOT_TO_ME,
|
rt2x00_set_field32(®, RX_FILTER_CFG_DROP_NOT_TO_ME, 1);
|
||||||
!(filter_flags & FIF_PROMISC_IN_BSS));
|
|
||||||
rt2x00_set_field32(®, RX_FILTER_CFG_DROP_NOT_MY_BSSD, 0);
|
rt2x00_set_field32(®, RX_FILTER_CFG_DROP_NOT_MY_BSSD, 0);
|
||||||
rt2x00_set_field32(®, RX_FILTER_CFG_DROP_VER_ERROR, 1);
|
rt2x00_set_field32(®, RX_FILTER_CFG_DROP_VER_ERROR, 1);
|
||||||
rt2x00_set_field32(®, RX_FILTER_CFG_DROP_MULTICAST,
|
rt2x00_set_field32(®, RX_FILTER_CFG_DROP_MULTICAST,
|
||||||
|
@ -359,8 +359,7 @@ void rt2x00mac_configure_filter(struct ieee80211_hw *hw,
|
|||||||
FIF_PLCPFAIL |
|
FIF_PLCPFAIL |
|
||||||
FIF_CONTROL |
|
FIF_CONTROL |
|
||||||
FIF_PSPOLL |
|
FIF_PSPOLL |
|
||||||
FIF_OTHER_BSS |
|
FIF_OTHER_BSS;
|
||||||
FIF_PROMISC_IN_BSS;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Apply some rules to the filters:
|
* Apply some rules to the filters:
|
||||||
@ -369,9 +368,6 @@ void rt2x00mac_configure_filter(struct ieee80211_hw *hw,
|
|||||||
* - Multicast filter seems to kill broadcast traffic so never use it.
|
* - Multicast filter seems to kill broadcast traffic so never use it.
|
||||||
*/
|
*/
|
||||||
*total_flags |= FIF_ALLMULTI;
|
*total_flags |= FIF_ALLMULTI;
|
||||||
if (*total_flags & FIF_OTHER_BSS ||
|
|
||||||
*total_flags & FIF_PROMISC_IN_BSS)
|
|
||||||
*total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the device has a single filter for all control frames,
|
* If the device has a single filter for all control frames,
|
||||||
|
@ -530,10 +530,8 @@ static void rt61pci_config_filter(struct rt2x00_dev *rt2x00dev,
|
|||||||
!(filter_flags & FIF_PLCPFAIL));
|
!(filter_flags & FIF_PLCPFAIL));
|
||||||
rt2x00_set_field32(®, TXRX_CSR0_DROP_CONTROL,
|
rt2x00_set_field32(®, TXRX_CSR0_DROP_CONTROL,
|
||||||
!(filter_flags & (FIF_CONTROL | FIF_PSPOLL)));
|
!(filter_flags & (FIF_CONTROL | FIF_PSPOLL)));
|
||||||
rt2x00_set_field32(®, TXRX_CSR0_DROP_NOT_TO_ME,
|
rt2x00_set_field32(®, TXRX_CSR0_DROP_NOT_TO_ME, 1);
|
||||||
!(filter_flags & FIF_PROMISC_IN_BSS));
|
|
||||||
rt2x00_set_field32(®, TXRX_CSR0_DROP_TO_DS,
|
rt2x00_set_field32(®, TXRX_CSR0_DROP_TO_DS,
|
||||||
!(filter_flags & FIF_PROMISC_IN_BSS) &&
|
|
||||||
!rt2x00dev->intf_ap_count);
|
!rt2x00dev->intf_ap_count);
|
||||||
rt2x00_set_field32(®, TXRX_CSR0_DROP_VERSION_ERROR, 1);
|
rt2x00_set_field32(®, TXRX_CSR0_DROP_VERSION_ERROR, 1);
|
||||||
rt2x00_set_field32(®, TXRX_CSR0_DROP_MULTICAST,
|
rt2x00_set_field32(®, TXRX_CSR0_DROP_MULTICAST,
|
||||||
|
@ -480,10 +480,8 @@ static void rt73usb_config_filter(struct rt2x00_dev *rt2x00dev,
|
|||||||
!(filter_flags & FIF_PLCPFAIL));
|
!(filter_flags & FIF_PLCPFAIL));
|
||||||
rt2x00_set_field32(®, TXRX_CSR0_DROP_CONTROL,
|
rt2x00_set_field32(®, TXRX_CSR0_DROP_CONTROL,
|
||||||
!(filter_flags & (FIF_CONTROL | FIF_PSPOLL)));
|
!(filter_flags & (FIF_CONTROL | FIF_PSPOLL)));
|
||||||
rt2x00_set_field32(®, TXRX_CSR0_DROP_NOT_TO_ME,
|
rt2x00_set_field32(®, TXRX_CSR0_DROP_NOT_TO_ME, 1);
|
||||||
!(filter_flags & FIF_PROMISC_IN_BSS));
|
|
||||||
rt2x00_set_field32(®, TXRX_CSR0_DROP_TO_DS,
|
rt2x00_set_field32(®, TXRX_CSR0_DROP_TO_DS,
|
||||||
!(filter_flags & FIF_PROMISC_IN_BSS) &&
|
|
||||||
!rt2x00dev->intf_ap_count);
|
!rt2x00dev->intf_ap_count);
|
||||||
rt2x00_set_field32(®, TXRX_CSR0_DROP_VERSION_ERROR, 1);
|
rt2x00_set_field32(®, TXRX_CSR0_DROP_VERSION_ERROR, 1);
|
||||||
rt2x00_set_field32(®, TXRX_CSR0_DROP_MULTICAST,
|
rt2x00_set_field32(®, TXRX_CSR0_DROP_MULTICAST,
|
||||||
|
@ -27,8 +27,7 @@
|
|||||||
#define __RTL_CORE_H__
|
#define __RTL_CORE_H__
|
||||||
|
|
||||||
#define RTL_SUPPORTED_FILTERS \
|
#define RTL_SUPPORTED_FILTERS \
|
||||||
(FIF_PROMISC_IN_BSS | \
|
(FIF_ALLMULTI | FIF_CONTROL | \
|
||||||
FIF_ALLMULTI | FIF_CONTROL | \
|
|
||||||
FIF_OTHER_BSS | \
|
FIF_OTHER_BSS | \
|
||||||
FIF_FCSFAIL | \
|
FIF_FCSFAIL | \
|
||||||
FIF_BCN_PRBRESP_PROMISC)
|
FIF_BCN_PRBRESP_PROMISC)
|
||||||
|
@ -763,8 +763,7 @@ static u64 wl1251_op_prepare_multicast(struct ieee80211_hw *hw,
|
|||||||
return (u64)(unsigned long)fp;
|
return (u64)(unsigned long)fp;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define WL1251_SUPPORTED_FILTERS (FIF_PROMISC_IN_BSS | \
|
#define WL1251_SUPPORTED_FILTERS (FIF_ALLMULTI | \
|
||||||
FIF_ALLMULTI | \
|
|
||||||
FIF_FCSFAIL | \
|
FIF_FCSFAIL | \
|
||||||
FIF_BCN_PRBRESP_PROMISC | \
|
FIF_BCN_PRBRESP_PROMISC | \
|
||||||
FIF_CONTROL | \
|
FIF_CONTROL | \
|
||||||
@ -795,10 +794,6 @@ static void wl1251_op_configure_filter(struct ieee80211_hw *hw,
|
|||||||
wl->rx_config = WL1251_DEFAULT_RX_CONFIG;
|
wl->rx_config = WL1251_DEFAULT_RX_CONFIG;
|
||||||
wl->rx_filter = WL1251_DEFAULT_RX_FILTER;
|
wl->rx_filter = WL1251_DEFAULT_RX_FILTER;
|
||||||
|
|
||||||
if (*total & FIF_PROMISC_IN_BSS) {
|
|
||||||
wl->rx_config |= CFG_BSSID_FILTER_EN;
|
|
||||||
wl->rx_config |= CFG_RX_ALL_GOOD;
|
|
||||||
}
|
|
||||||
if (*total & FIF_ALLMULTI)
|
if (*total & FIF_ALLMULTI)
|
||||||
/*
|
/*
|
||||||
* CFG_MC_FILTER_EN in rx_config needs to be 0 to receive
|
* CFG_MC_FILTER_EN in rx_config needs to be 0 to receive
|
||||||
@ -825,7 +820,7 @@ static void wl1251_op_configure_filter(struct ieee80211_hw *hw,
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (*total & FIF_ALLMULTI || *total & FIF_PROMISC_IN_BSS)
|
if (*total & FIF_ALLMULTI)
|
||||||
ret = wl1251_acx_group_address_tbl(wl, false, NULL, 0);
|
ret = wl1251_acx_group_address_tbl(wl, false, NULL, 0);
|
||||||
else if (fp)
|
else if (fp)
|
||||||
ret = wl1251_acx_group_address_tbl(wl, fp->enabled,
|
ret = wl1251_acx_group_address_tbl(wl, fp->enabled,
|
||||||
|
@ -3175,8 +3175,7 @@ static u64 wl1271_op_prepare_multicast(struct ieee80211_hw *hw,
|
|||||||
return (u64)(unsigned long)fp;
|
return (u64)(unsigned long)fp;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define WL1271_SUPPORTED_FILTERS (FIF_PROMISC_IN_BSS | \
|
#define WL1271_SUPPORTED_FILTERS (FIF_ALLMULTI | \
|
||||||
FIF_ALLMULTI | \
|
|
||||||
FIF_FCSFAIL | \
|
FIF_FCSFAIL | \
|
||||||
FIF_BCN_PRBRESP_PROMISC | \
|
FIF_BCN_PRBRESP_PROMISC | \
|
||||||
FIF_CONTROL | \
|
FIF_CONTROL | \
|
||||||
|
@ -1230,7 +1230,7 @@ static u64 zd_op_prepare_multicast(struct ieee80211_hw *hw,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define SUPPORTED_FIF_FLAGS \
|
#define SUPPORTED_FIF_FLAGS \
|
||||||
(FIF_PROMISC_IN_BSS | FIF_ALLMULTI | FIF_FCSFAIL | FIF_CONTROL | \
|
(FIF_ALLMULTI | FIF_FCSFAIL | FIF_CONTROL | \
|
||||||
FIF_OTHER_BSS | FIF_BCN_PRBRESP_PROMISC)
|
FIF_OTHER_BSS | FIF_BCN_PRBRESP_PROMISC)
|
||||||
static void zd_op_configure_filter(struct ieee80211_hw *hw,
|
static void zd_op_configure_filter(struct ieee80211_hw *hw,
|
||||||
unsigned int changed_flags,
|
unsigned int changed_flags,
|
||||||
@ -1256,7 +1256,7 @@ static void zd_op_configure_filter(struct ieee80211_hw *hw,
|
|||||||
* we will have some issue with IPv6 which uses multicast for link
|
* we will have some issue with IPv6 which uses multicast for link
|
||||||
* layer address resolution.
|
* layer address resolution.
|
||||||
*/
|
*/
|
||||||
if (*new_flags & (FIF_PROMISC_IN_BSS | FIF_ALLMULTI))
|
if (*new_flags & FIF_ALLMULTI)
|
||||||
zd_mc_add_all(&hash);
|
zd_mc_add_all(&hash);
|
||||||
|
|
||||||
spin_lock_irqsave(&mac->lock, flags);
|
spin_lock_irqsave(&mac->lock, flags);
|
||||||
|
@ -1516,21 +1516,12 @@ static void vnt_configure(struct ieee80211_hw *hw,
|
|||||||
struct vnt_private *priv = hw->priv;
|
struct vnt_private *priv = hw->priv;
|
||||||
u8 rx_mode = 0;
|
u8 rx_mode = 0;
|
||||||
|
|
||||||
*total_flags &= FIF_ALLMULTI | FIF_OTHER_BSS | FIF_PROMISC_IN_BSS |
|
*total_flags &= FIF_ALLMULTI | FIF_OTHER_BSS | FIF_BCN_PRBRESP_PROMISC;
|
||||||
FIF_BCN_PRBRESP_PROMISC;
|
|
||||||
|
|
||||||
VNSvInPortB(priv->PortOffset + MAC_REG_RCR, &rx_mode);
|
VNSvInPortB(priv->PortOffset + MAC_REG_RCR, &rx_mode);
|
||||||
|
|
||||||
dev_dbg(&priv->pcid->dev, "rx mode in = %x\n", rx_mode);
|
dev_dbg(&priv->pcid->dev, "rx mode in = %x\n", rx_mode);
|
||||||
|
|
||||||
if (changed_flags & FIF_PROMISC_IN_BSS) {
|
|
||||||
/* unconditionally log net taps */
|
|
||||||
if (*total_flags & FIF_PROMISC_IN_BSS)
|
|
||||||
rx_mode |= RCR_UNICAST;
|
|
||||||
else
|
|
||||||
rx_mode &= ~RCR_UNICAST;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (changed_flags & FIF_ALLMULTI) {
|
if (changed_flags & FIF_ALLMULTI) {
|
||||||
if (*total_flags & FIF_ALLMULTI) {
|
if (*total_flags & FIF_ALLMULTI) {
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
@ -785,8 +785,7 @@ static void vnt_configure(struct ieee80211_hw *hw,
|
|||||||
u8 rx_mode = 0;
|
u8 rx_mode = 0;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
*total_flags &= FIF_ALLMULTI | FIF_OTHER_BSS | FIF_PROMISC_IN_BSS |
|
*total_flags &= FIF_ALLMULTI | FIF_OTHER_BSS | FIF_BCN_PRBRESP_PROMISC;
|
||||||
FIF_BCN_PRBRESP_PROMISC;
|
|
||||||
|
|
||||||
rc = vnt_control_in(priv, MESSAGE_TYPE_READ, MAC_REG_RCR,
|
rc = vnt_control_in(priv, MESSAGE_TYPE_READ, MAC_REG_RCR,
|
||||||
MESSAGE_REQUEST_MACREG, sizeof(u8), &rx_mode);
|
MESSAGE_REQUEST_MACREG, sizeof(u8), &rx_mode);
|
||||||
@ -796,14 +795,6 @@ static void vnt_configure(struct ieee80211_hw *hw,
|
|||||||
|
|
||||||
dev_dbg(&priv->usb->dev, "rx mode in = %x\n", rx_mode);
|
dev_dbg(&priv->usb->dev, "rx mode in = %x\n", rx_mode);
|
||||||
|
|
||||||
if (changed_flags & FIF_PROMISC_IN_BSS) {
|
|
||||||
/* unconditionally log net taps */
|
|
||||||
if (*total_flags & FIF_PROMISC_IN_BSS)
|
|
||||||
rx_mode |= RCR_UNICAST;
|
|
||||||
else
|
|
||||||
rx_mode &= ~RCR_UNICAST;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (changed_flags & FIF_ALLMULTI) {
|
if (changed_flags & FIF_ALLMULTI) {
|
||||||
if (*total_flags & FIF_ALLMULTI) {
|
if (*total_flags & FIF_ALLMULTI) {
|
||||||
if (priv->mc_list_count > 2)
|
if (priv->mc_list_count > 2)
|
||||||
|
@ -2507,10 +2507,6 @@ void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb);
|
|||||||
* stack. It is always safe to pass more frames than requested,
|
* stack. It is always safe to pass more frames than requested,
|
||||||
* but this has negative impact on power consumption.
|
* but this has negative impact on power consumption.
|
||||||
*
|
*
|
||||||
* @FIF_PROMISC_IN_BSS: promiscuous mode within your BSS,
|
|
||||||
* think of the BSS as your network segment and then this corresponds
|
|
||||||
* to the regular ethernet device promiscuous mode.
|
|
||||||
*
|
|
||||||
* @FIF_ALLMULTI: pass all multicast frames, this is used if requested
|
* @FIF_ALLMULTI: pass all multicast frames, this is used if requested
|
||||||
* by the user or if the hardware is not capable of filtering by
|
* by the user or if the hardware is not capable of filtering by
|
||||||
* multicast address.
|
* multicast address.
|
||||||
@ -2527,8 +2523,8 @@ void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb);
|
|||||||
* mac80211 needs to do and the amount of CPU wakeups, so you should
|
* mac80211 needs to do and the amount of CPU wakeups, so you should
|
||||||
* honour this flag if possible.
|
* honour this flag if possible.
|
||||||
*
|
*
|
||||||
* @FIF_CONTROL: pass control frames (except for PS Poll), if PROMISC_IN_BSS
|
* @FIF_CONTROL: pass control frames (except for PS Poll) addressed to this
|
||||||
* is not set then only those addressed to this station.
|
* station
|
||||||
*
|
*
|
||||||
* @FIF_OTHER_BSS: pass frames destined to other BSSes
|
* @FIF_OTHER_BSS: pass frames destined to other BSSes
|
||||||
*
|
*
|
||||||
@ -2538,7 +2534,6 @@ void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb);
|
|||||||
* @FIF_PROBE_REQ: pass probe request frames
|
* @FIF_PROBE_REQ: pass probe request frames
|
||||||
*/
|
*/
|
||||||
enum ieee80211_filter_flags {
|
enum ieee80211_filter_flags {
|
||||||
FIF_PROMISC_IN_BSS = 1<<0,
|
|
||||||
FIF_ALLMULTI = 1<<1,
|
FIF_ALLMULTI = 1<<1,
|
||||||
FIF_FCSFAIL = 1<<2,
|
FIF_FCSFAIL = 1<<2,
|
||||||
FIF_PLCPFAIL = 1<<3,
|
FIF_PLCPFAIL = 1<<3,
|
||||||
|
@ -725,7 +725,6 @@ struct ieee80211_if_mesh {
|
|||||||
* enum ieee80211_sub_if_data_flags - virtual interface flags
|
* enum ieee80211_sub_if_data_flags - virtual interface flags
|
||||||
*
|
*
|
||||||
* @IEEE80211_SDATA_ALLMULTI: interface wants all multicast packets
|
* @IEEE80211_SDATA_ALLMULTI: interface wants all multicast packets
|
||||||
* @IEEE80211_SDATA_PROMISC: interface is promisc
|
|
||||||
* @IEEE80211_SDATA_OPERATING_GMODE: operating in G-only mode
|
* @IEEE80211_SDATA_OPERATING_GMODE: operating in G-only mode
|
||||||
* @IEEE80211_SDATA_DONT_BRIDGE_PACKETS: bridge packets between
|
* @IEEE80211_SDATA_DONT_BRIDGE_PACKETS: bridge packets between
|
||||||
* associated stations and deliver multicast frames both
|
* associated stations and deliver multicast frames both
|
||||||
@ -735,7 +734,6 @@ struct ieee80211_if_mesh {
|
|||||||
*/
|
*/
|
||||||
enum ieee80211_sub_if_data_flags {
|
enum ieee80211_sub_if_data_flags {
|
||||||
IEEE80211_SDATA_ALLMULTI = BIT(0),
|
IEEE80211_SDATA_ALLMULTI = BIT(0),
|
||||||
IEEE80211_SDATA_PROMISC = BIT(1),
|
|
||||||
IEEE80211_SDATA_OPERATING_GMODE = BIT(2),
|
IEEE80211_SDATA_OPERATING_GMODE = BIT(2),
|
||||||
IEEE80211_SDATA_DONT_BRIDGE_PACKETS = BIT(3),
|
IEEE80211_SDATA_DONT_BRIDGE_PACKETS = BIT(3),
|
||||||
IEEE80211_SDATA_DISCONNECT_RESUME = BIT(4),
|
IEEE80211_SDATA_DISCONNECT_RESUME = BIT(4),
|
||||||
@ -1211,8 +1209,8 @@ struct ieee80211_local {
|
|||||||
|
|
||||||
atomic_t agg_queue_stop[IEEE80211_MAX_QUEUES];
|
atomic_t agg_queue_stop[IEEE80211_MAX_QUEUES];
|
||||||
|
|
||||||
/* number of interfaces with corresponding IFF_ flags */
|
/* number of interfaces with allmulti RX */
|
||||||
atomic_t iff_allmultis, iff_promiscs;
|
atomic_t iff_allmultis;
|
||||||
|
|
||||||
struct rate_control_ref *rate_ctrl;
|
struct rate_control_ref *rate_ctrl;
|
||||||
|
|
||||||
|
@ -697,9 +697,6 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up)
|
|||||||
if (sdata->flags & IEEE80211_SDATA_ALLMULTI)
|
if (sdata->flags & IEEE80211_SDATA_ALLMULTI)
|
||||||
atomic_inc(&local->iff_allmultis);
|
atomic_inc(&local->iff_allmultis);
|
||||||
|
|
||||||
if (sdata->flags & IEEE80211_SDATA_PROMISC)
|
|
||||||
atomic_inc(&local->iff_promiscs);
|
|
||||||
|
|
||||||
if (coming_up)
|
if (coming_up)
|
||||||
local->open_count++;
|
local->open_count++;
|
||||||
|
|
||||||
@ -827,13 +824,10 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
|
|||||||
WARN_ON_ONCE((sdata->vif.type != NL80211_IFTYPE_WDS && flushed > 0) ||
|
WARN_ON_ONCE((sdata->vif.type != NL80211_IFTYPE_WDS && flushed > 0) ||
|
||||||
(sdata->vif.type == NL80211_IFTYPE_WDS && flushed != 1));
|
(sdata->vif.type == NL80211_IFTYPE_WDS && flushed != 1));
|
||||||
|
|
||||||
/* don't count this interface for promisc/allmulti while it is down */
|
/* don't count this interface for allmulti while it is down */
|
||||||
if (sdata->flags & IEEE80211_SDATA_ALLMULTI)
|
if (sdata->flags & IEEE80211_SDATA_ALLMULTI)
|
||||||
atomic_dec(&local->iff_allmultis);
|
atomic_dec(&local->iff_allmultis);
|
||||||
|
|
||||||
if (sdata->flags & IEEE80211_SDATA_PROMISC)
|
|
||||||
atomic_dec(&local->iff_promiscs);
|
|
||||||
|
|
||||||
if (sdata->vif.type == NL80211_IFTYPE_AP) {
|
if (sdata->vif.type == NL80211_IFTYPE_AP) {
|
||||||
local->fif_pspoll--;
|
local->fif_pspoll--;
|
||||||
local->fif_probe_req--;
|
local->fif_probe_req--;
|
||||||
@ -1047,12 +1041,10 @@ static void ieee80211_set_multicast_list(struct net_device *dev)
|
|||||||
{
|
{
|
||||||
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||||
struct ieee80211_local *local = sdata->local;
|
struct ieee80211_local *local = sdata->local;
|
||||||
int allmulti, promisc, sdata_allmulti, sdata_promisc;
|
int allmulti, sdata_allmulti;
|
||||||
|
|
||||||
allmulti = !!(dev->flags & IFF_ALLMULTI);
|
allmulti = !!(dev->flags & IFF_ALLMULTI);
|
||||||
promisc = !!(dev->flags & IFF_PROMISC);
|
|
||||||
sdata_allmulti = !!(sdata->flags & IEEE80211_SDATA_ALLMULTI);
|
sdata_allmulti = !!(sdata->flags & IEEE80211_SDATA_ALLMULTI);
|
||||||
sdata_promisc = !!(sdata->flags & IEEE80211_SDATA_PROMISC);
|
|
||||||
|
|
||||||
if (allmulti != sdata_allmulti) {
|
if (allmulti != sdata_allmulti) {
|
||||||
if (dev->flags & IFF_ALLMULTI)
|
if (dev->flags & IFF_ALLMULTI)
|
||||||
@ -1062,13 +1054,6 @@ static void ieee80211_set_multicast_list(struct net_device *dev)
|
|||||||
sdata->flags ^= IEEE80211_SDATA_ALLMULTI;
|
sdata->flags ^= IEEE80211_SDATA_ALLMULTI;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (promisc != sdata_promisc) {
|
|
||||||
if (dev->flags & IFF_PROMISC)
|
|
||||||
atomic_inc(&local->iff_promiscs);
|
|
||||||
else
|
|
||||||
atomic_dec(&local->iff_promiscs);
|
|
||||||
sdata->flags ^= IEEE80211_SDATA_PROMISC;
|
|
||||||
}
|
|
||||||
spin_lock_bh(&local->filter_lock);
|
spin_lock_bh(&local->filter_lock);
|
||||||
__hw_addr_sync(&local->mc_list, &dev->mc, dev->addr_len);
|
__hw_addr_sync(&local->mc_list, &dev->mc, dev->addr_len);
|
||||||
spin_unlock_bh(&local->filter_lock);
|
spin_unlock_bh(&local->filter_lock);
|
||||||
|
@ -41,9 +41,6 @@ void ieee80211_configure_filter(struct ieee80211_local *local)
|
|||||||
unsigned int changed_flags;
|
unsigned int changed_flags;
|
||||||
unsigned int new_flags = 0;
|
unsigned int new_flags = 0;
|
||||||
|
|
||||||
if (atomic_read(&local->iff_promiscs))
|
|
||||||
new_flags |= FIF_PROMISC_IN_BSS;
|
|
||||||
|
|
||||||
if (atomic_read(&local->iff_allmultis))
|
if (atomic_read(&local->iff_allmultis))
|
||||||
new_flags |= FIF_ALLMULTI;
|
new_flags |= FIF_ALLMULTI;
|
||||||
|
|
||||||
|
@ -2331,11 +2331,9 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx)
|
|||||||
IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_frames);
|
IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, fwded_frames);
|
||||||
ieee80211_add_pending_skb(local, fwd_skb);
|
ieee80211_add_pending_skb(local, fwd_skb);
|
||||||
out:
|
out:
|
||||||
if (is_multicast_ether_addr(hdr->addr1) ||
|
if (is_multicast_ether_addr(hdr->addr1))
|
||||||
sdata->dev->flags & IFF_PROMISC)
|
|
||||||
return RX_CONTINUE;
|
return RX_CONTINUE;
|
||||||
else
|
return RX_DROP_MONITOR;
|
||||||
return RX_DROP_MONITOR;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -3266,12 +3264,8 @@ static bool prepare_for_handlers(struct ieee80211_rx_data *rx,
|
|||||||
if (!bssid && !sdata->u.mgd.use_4addr)
|
if (!bssid && !sdata->u.mgd.use_4addr)
|
||||||
return false;
|
return false;
|
||||||
if (!multicast &&
|
if (!multicast &&
|
||||||
!ether_addr_equal(sdata->vif.addr, hdr->addr1)) {
|
!ether_addr_equal(sdata->vif.addr, hdr->addr1))
|
||||||
if (!(sdata->dev->flags & IFF_PROMISC) ||
|
return false;
|
||||||
sdata->u.mgd.use_4addr)
|
|
||||||
return false;
|
|
||||||
status->rx_flags &= ~IEEE80211_RX_RA_MATCH;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case NL80211_IFTYPE_ADHOC:
|
case NL80211_IFTYPE_ADHOC:
|
||||||
if (!bssid)
|
if (!bssid)
|
||||||
@ -3285,9 +3279,7 @@ static bool prepare_for_handlers(struct ieee80211_rx_data *rx,
|
|||||||
return false;
|
return false;
|
||||||
} else if (!multicast &&
|
} else if (!multicast &&
|
||||||
!ether_addr_equal(sdata->vif.addr, hdr->addr1)) {
|
!ether_addr_equal(sdata->vif.addr, hdr->addr1)) {
|
||||||
if (!(sdata->dev->flags & IFF_PROMISC))
|
return false;
|
||||||
return false;
|
|
||||||
status->rx_flags &= ~IEEE80211_RX_RA_MATCH;
|
|
||||||
} else if (!rx->sta) {
|
} else if (!rx->sta) {
|
||||||
int rate_idx;
|
int rate_idx;
|
||||||
if (status->flag & (RX_FLAG_HT | RX_FLAG_VHT))
|
if (status->flag & (RX_FLAG_HT | RX_FLAG_VHT))
|
||||||
@ -3309,12 +3301,7 @@ static bool prepare_for_handlers(struct ieee80211_rx_data *rx,
|
|||||||
} else if (!multicast &&
|
} else if (!multicast &&
|
||||||
!ether_addr_equal(sdata->dev->dev_addr,
|
!ether_addr_equal(sdata->dev->dev_addr,
|
||||||
hdr->addr1)) {
|
hdr->addr1)) {
|
||||||
/* if we are in promisc mode we also accept
|
return false;
|
||||||
* packets not destined for us
|
|
||||||
*/
|
|
||||||
if (!(sdata->dev->flags & IFF_PROMISC))
|
|
||||||
return false;
|
|
||||||
rx->flags &= ~IEEE80211_RX_RA_MATCH;
|
|
||||||
} else if (!rx->sta) {
|
} else if (!rx->sta) {
|
||||||
int rate_idx;
|
int rate_idx;
|
||||||
if (status->flag & RX_FLAG_HT)
|
if (status->flag & RX_FLAG_HT)
|
||||||
@ -3327,12 +3314,8 @@ static bool prepare_for_handlers(struct ieee80211_rx_data *rx,
|
|||||||
break;
|
break;
|
||||||
case NL80211_IFTYPE_MESH_POINT:
|
case NL80211_IFTYPE_MESH_POINT:
|
||||||
if (!multicast &&
|
if (!multicast &&
|
||||||
!ether_addr_equal(sdata->vif.addr, hdr->addr1)) {
|
!ether_addr_equal(sdata->vif.addr, hdr->addr1))
|
||||||
if (!(sdata->dev->flags & IFF_PROMISC))
|
return false;
|
||||||
return false;
|
|
||||||
|
|
||||||
status->rx_flags &= ~IEEE80211_RX_RA_MATCH;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case NL80211_IFTYPE_AP_VLAN:
|
case NL80211_IFTYPE_AP_VLAN:
|
||||||
case NL80211_IFTYPE_AP:
|
case NL80211_IFTYPE_AP:
|
||||||
|
Loading…
Reference in New Issue
Block a user