From: Ivo van Doorn <ivdoorn@gmail.com>
To: "John W. Linville" <linville@tuxdriver.com>
Cc: linux-wireless@vger.kernel.org, rt2400-devel@lists.sourceforge.net
Subject: [PATCH 05/16] rt2x00: Don't use changed_flags inside configure_packet_filter
Date: Sat, 6 Oct 2007 14:13:38 +0200 [thread overview]
Message-ID: <200710061413.39573.IvDoorn@gmail.com> (raw)
In-Reply-To: <200710061410.31765.IvDoorn@gmail.com>
We shouldn't use changed_flags when configuring the packet filter,
we work directly with the total_flags which is safe enough since
we already check if something has changed after we applied our
packet filtering flag rules.
Also make sure that when the packet filter is scheduled, the
rt2x00dev->interface.filter is cleared to make sure the drivers
will update the packet filter instead of failing at the check:
*total_flags == rt2x00dev->interface.filter
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
---
drivers/net/wireless/rt2x00/rt2400pci.c | 4 ++--
drivers/net/wireless/rt2x00/rt2500pci.c | 4 ++--
drivers/net/wireless/rt2x00/rt2500usb.c | 4 ++--
drivers/net/wireless/rt2x00/rt2x00.h | 2 --
drivers/net/wireless/rt2x00/rt2x00dev.c | 13 ++++++++++---
drivers/net/wireless/rt2x00/rt61pci.c | 4 ++--
drivers/net/wireless/rt2x00/rt73usb.c | 4 ++--
7 files changed, 20 insertions(+), 15 deletions(-)
diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c
index 84f807d..ee62daa 100644
--- a/drivers/net/wireless/rt2x00/rt2400pci.c
+++ b/drivers/net/wireless/rt2x00/rt2400pci.c
@@ -1495,8 +1495,8 @@ static void rt2400pci_configure_filter(struct ieee80211_hw *hw,
* - Some filters are set based on interface type.
*/
*total_flags |= FIF_ALLMULTI;
- if (changed_flags & FIF_OTHER_BSS ||
- changed_flags & FIF_PROMISC_IN_BSS)
+ if (*total_flags & FIF_OTHER_BSS ||
+ *total_flags & FIF_PROMISC_IN_BSS)
*total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
if (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
*total_flags |= FIF_PROMISC_IN_BSS;
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c
index 87a0988..1137c26 100644
--- a/drivers/net/wireless/rt2x00/rt2500pci.c
+++ b/drivers/net/wireless/rt2x00/rt2500pci.c
@@ -1827,8 +1827,8 @@ static void rt2500pci_configure_filter(struct ieee80211_hw *hw,
*/
if (mc_count)
*total_flags |= FIF_ALLMULTI;
- if (changed_flags & FIF_OTHER_BSS ||
- changed_flags & FIF_PROMISC_IN_BSS)
+ if (*total_flags & FIF_OTHER_BSS ||
+ *total_flags & FIF_PROMISC_IN_BSS)
*total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
if (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
*total_flags |= FIF_PROMISC_IN_BSS;
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c
index e24ffe6..e7530ae 100644
--- a/drivers/net/wireless/rt2x00/rt2500usb.c
+++ b/drivers/net/wireless/rt2x00/rt2500usb.c
@@ -1600,8 +1600,8 @@ static void rt2500usb_configure_filter(struct ieee80211_hw *hw,
*/
if (mc_count)
*total_flags |= FIF_ALLMULTI;
- if (changed_flags & FIF_OTHER_BSS ||
- changed_flags & FIF_PROMISC_IN_BSS)
+ if (*total_flags & FIF_OTHER_BSS ||
+ *total_flags & FIF_PROMISC_IN_BSS)
*total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
if (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
*total_flags |= FIF_PROMISC_IN_BSS;
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
index 82dfcd9..9bb5fb9 100644
--- a/drivers/net/wireless/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
@@ -410,8 +410,6 @@ struct rt2x00lib_ops {
*/
void (*config_mac_addr) (struct rt2x00_dev *rt2x00dev, __le32 *mac);
void (*config_bssid) (struct rt2x00_dev *rt2x00dev, __le32 *bssid);
- void (*config_packet_filter) (struct rt2x00_dev *rt2x00dev,
- const unsigned int filter);
void (*config_type) (struct rt2x00_dev *rt2x00dev, const int type);
void (*config) (struct rt2x00_dev *rt2x00dev, const unsigned int flags,
struct ieee80211_conf *conf);
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c
index f254753..1e07c39 100644
--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
@@ -276,11 +276,18 @@ static void rt2x00lib_packetfilter_scheduled(struct work_struct *work)
{
struct rt2x00_dev *rt2x00dev =
container_of(work, struct rt2x00_dev, filter_work);
+ unsigned int filter = rt2x00dev->interface.filter;
+
+ /*
+ * Since we had stored the filter inside interface.filter,
+ * we should now clear that field. Otherwise the driver will
+ * assume nothing has changed (*total_flags will be compared
+ * to interface.filter to determine if any action is required).
+ */
+ rt2x00dev->interface.filter = 0;
rt2x00dev->ops->hw->configure_filter(rt2x00dev->hw,
- rt2x00dev->interface.filter,
- &rt2x00dev->interface.filter,
- 0, NULL);
+ filter, &filter, 0, NULL);
}
/*
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c
index 2157764..5ae09e3 100644
--- a/drivers/net/wireless/rt2x00/rt61pci.c
+++ b/drivers/net/wireless/rt2x00/rt61pci.c
@@ -2387,8 +2387,8 @@ static void rt61pci_configure_filter(struct ieee80211_hw *hw,
*/
if (mc_count)
*total_flags |= FIF_ALLMULTI;
- if (changed_flags & FIF_OTHER_BSS ||
- changed_flags & FIF_PROMISC_IN_BSS)
+ if (*total_flags & FIF_OTHER_BSS ||
+ *total_flags & FIF_PROMISC_IN_BSS)
*total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
if (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
*total_flags |= FIF_PROMISC_IN_BSS;
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c
index b81ba3d..f48e5fb 100644
--- a/drivers/net/wireless/rt2x00/rt73usb.c
+++ b/drivers/net/wireless/rt2x00/rt73usb.c
@@ -1854,8 +1854,8 @@ static void rt73usb_configure_filter(struct ieee80211_hw *hw,
*/
if (mc_count)
*total_flags |= FIF_ALLMULTI;
- if (changed_flags & FIF_OTHER_BSS ||
- changed_flags & FIF_PROMISC_IN_BSS)
+ if (*total_flags & FIF_OTHER_BSS ||
+ *total_flags & FIF_PROMISC_IN_BSS)
*total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS;
if (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
*total_flags |= FIF_PROMISC_IN_BSS;
--
1.5.3.4
next prev parent reply other threads:[~2007-10-06 12:04 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <200710061410.31765.IvDoorn@gmail.com>
2007-10-06 12:11 ` [PATCH 01/16] rt2x00: Remove duplicate code in MAC & BSSID handling Ivo van Doorn
2007-10-06 12:12 ` [PATCH 02/16] rt2x00: Remove radio check from rt2x00lib_toggle_rx Ivo van Doorn
2007-10-06 12:12 ` [PATCH 03/16] rt2x00: Store "STARTED" state during suspend Ivo van Doorn
2007-10-06 12:13 ` [PATCH 04/16] rt2x00: Move rt2x00dev flags into enumeration Ivo van Doorn
2007-10-06 12:13 ` Ivo van Doorn [this message]
2007-10-06 12:14 ` [PATCH 06/16] rt2x00: Fix rfkill handling Ivo van Doorn
2007-10-06 12:14 ` [PATCH 07/16] rt2x00: Move TSF sync values into rt2x00config Ivo van Doorn
2007-10-06 12:14 ` [PATCH 08/16] rt2x00: get_duration expects values in 100kbs Ivo van Doorn
2007-10-06 12:15 ` [PATCH 09/16] rt2x00: Cut lines down to 80 characters Ivo van Doorn
2007-10-06 12:15 ` [PATCH 10/16] rt2x00: Add get_tx_data_len callback function Ivo van Doorn
2007-10-06 12:16 ` [PATCH 11/16] rt2x00: Pass dev_state to rt2x00lib_toggle_rx Ivo van Doorn
2007-10-06 12:16 ` [PATCH 12/16] rt2x00: Small optimizations Ivo van Doorn
2007-10-06 12:17 ` [PATCH 13/16] rt2x00: Reorganize configuration handler Ivo van Doorn
2007-10-06 12:18 ` [PATCH 14/16] rt2x00: Clean disabling of rt73usb_get_tsf Ivo van Doorn
2007-10-06 12:18 ` [PATCH 15/16] rt2x00: Allways memset memory obtained from skb_push() Ivo van Doorn
2007-10-06 12:18 ` [PATCH 16/16] rt2x00: Release 2.0.10 Ivo van Doorn
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200710061413.39573.IvDoorn@gmail.com \
--to=ivdoorn@gmail.com \
--cc=linux-wireless@vger.kernel.org \
--cc=linville@tuxdriver.com \
--cc=rt2400-devel@lists.sourceforge.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).