Commit 53438e5d authored by David S. Miller's avatar David S. Miller
parents 1f305323 92468c53
...@@ -115,8 +115,16 @@ extern u32 ieee80211_debug_level; ...@@ -115,8 +115,16 @@ extern u32 ieee80211_debug_level;
do { if (ieee80211_debug_level & (level)) \ do { if (ieee80211_debug_level & (level)) \
printk(KERN_DEBUG "ieee80211: %c %s " fmt, \ printk(KERN_DEBUG "ieee80211: %c %s " fmt, \
in_interrupt() ? 'I' : 'U', __FUNCTION__ , ## args); } while (0) in_interrupt() ? 'I' : 'U', __FUNCTION__ , ## args); } while (0)
static inline bool ieee80211_ratelimit_debug(u32 level)
{
return (ieee80211_debug_level & level) && net_ratelimit();
}
#else #else
#define IEEE80211_DEBUG(level, fmt, args...) do {} while (0) #define IEEE80211_DEBUG(level, fmt, args...) do {} while (0)
static inline bool ieee80211_ratelimit_debug(u32 level)
{
return false;
}
#endif /* CONFIG_IEEE80211_DEBUG */ #endif /* CONFIG_IEEE80211_DEBUG */
/* escape_essid() is intended to be used in debug (and possibly error) /* escape_essid() is intended to be used in debug (and possibly error)
......
...@@ -338,7 +338,7 @@ static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv) ...@@ -338,7 +338,7 @@ static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv)
pos += 8; pos += 8;
if (ccmp_replay_check(pn, key->rx_pn)) { if (ccmp_replay_check(pn, key->rx_pn)) {
if (net_ratelimit()) { if (ieee80211_ratelimit_debug(IEEE80211_DL_DROP)) {
IEEE80211_DEBUG_DROP("CCMP: replay detected: STA=%s " IEEE80211_DEBUG_DROP("CCMP: replay detected: STA=%s "
"previous PN %02x%02x%02x%02x%02x%02x " "previous PN %02x%02x%02x%02x%02x%02x "
"received PN %02x%02x%02x%02x%02x%02x\n", "received PN %02x%02x%02x%02x%02x%02x\n",
......
...@@ -464,7 +464,7 @@ static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) ...@@ -464,7 +464,7 @@ static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv)
pos += 8; pos += 8;
if (tkip_replay_check(iv32, iv16, tkey->rx_iv32, tkey->rx_iv16)) { if (tkip_replay_check(iv32, iv16, tkey->rx_iv32, tkey->rx_iv16)) {
if (net_ratelimit()) { if (ieee80211_ratelimit_debug(IEEE80211_DL_DROP)) {
IEEE80211_DEBUG_DROP("TKIP: replay detected: STA=%s" IEEE80211_DEBUG_DROP("TKIP: replay detected: STA=%s"
" previous TSC %08x%04x received TSC " " previous TSC %08x%04x received TSC "
"%08x%04x\n", print_mac(mac, hdr->addr2), "%08x%04x\n", print_mac(mac, hdr->addr2),
...@@ -504,7 +504,7 @@ static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv) ...@@ -504,7 +504,7 @@ static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv)
* it needs to be recalculated for the next packet. */ * it needs to be recalculated for the next packet. */
tkey->rx_phase1_done = 0; tkey->rx_phase1_done = 0;
} }
if (net_ratelimit()) { if (ieee80211_ratelimit_debug(IEEE80211_DL_DROP)) {
IEEE80211_DEBUG_DROP("TKIP: ICV error detected: STA=" IEEE80211_DEBUG_DROP("TKIP: ICV error detected: STA="
"%s\n", print_mac(mac, hdr->addr2)); "%s\n", print_mac(mac, hdr->addr2));
} }
......
...@@ -267,6 +267,17 @@ static int ieee80211_open(struct net_device *dev) ...@@ -267,6 +267,17 @@ static int ieee80211_open(struct net_device *dev)
tasklet_enable(&local->tasklet); tasklet_enable(&local->tasklet);
} }
/*
* set_multicast_list will be invoked by the networking core
* which will check whether any increments here were done in
* error and sync them down to the hardware as filter flags.
*/
if (sdata->flags & IEEE80211_SDATA_ALLMULTI)
atomic_inc(&local->iff_allmultis);
if (sdata->flags & IEEE80211_SDATA_PROMISC)
atomic_inc(&local->iff_promiscs);
local->open_count++; local->open_count++;
netif_start_queue(dev); netif_start_queue(dev);
...@@ -284,6 +295,18 @@ static int ieee80211_stop(struct net_device *dev) ...@@ -284,6 +295,18 @@ static int ieee80211_stop(struct net_device *dev)
netif_stop_queue(dev); netif_stop_queue(dev);
/*
* Don't count this interface for promisc/allmulti while it
* is down. dev_mc_unsync() will invoke set_multicast_list
* on the master interface which will sync these down to the
* hardware as filter flags.
*/
if (sdata->flags & IEEE80211_SDATA_ALLMULTI)
atomic_dec(&local->iff_allmultis);
if (sdata->flags & IEEE80211_SDATA_PROMISC)
atomic_dec(&local->iff_promiscs);
dev_mc_unsync(local->mdev, dev); dev_mc_unsync(local->mdev, dev);
/* down all dependent devices, that is VLANs */ /* down all dependent devices, that is VLANs */
...@@ -366,8 +389,8 @@ static void ieee80211_set_multicast_list(struct net_device *dev) ...@@ -366,8 +389,8 @@ static void ieee80211_set_multicast_list(struct net_device *dev)
allmulti = !!(dev->flags & IFF_ALLMULTI); allmulti = !!(dev->flags & IFF_ALLMULTI);
promisc = !!(dev->flags & IFF_PROMISC); 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; 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)
......
...@@ -2647,7 +2647,7 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw) ...@@ -2647,7 +2647,7 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw)
local->sta_scanning = 0; local->sta_scanning = 0;
if (ieee80211_hw_config(local)) if (ieee80211_hw_config(local))
printk(KERN_DEBUG "%s: failed to restore operational" printk(KERN_DEBUG "%s: failed to restore operational "
"channel after scan\n", dev->name); "channel after scan\n", dev->name);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment