Skip to content

Commit

Permalink
rt2x00: Move packet filter flags
Browse files Browse the repository at this point in the history
The packet filter flags don't belong in the interface structure
because they are device based instead of interface based.
So move the filter fields out of struct interface and into rt2x00_dev.

Additionally we shouldn't change the filter based on the working
mode, if such a thing is needed than mac80211 should have done that.

Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Ivo van Doorn authored and David S. Miller committed Jan 28, 2008
1 parent e37ea21 commit 3c4f208
Show file tree
Hide file tree
Showing 7 changed files with 19 additions and 37 deletions.
8 changes: 2 additions & 6 deletions drivers/net/wireless/rt2x00/rt2400pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -1422,7 +1422,6 @@ static void rt2400pci_configure_filter(struct ieee80211_hw *hw,
struct dev_addr_list *mc_list)
{
struct rt2x00_dev *rt2x00dev = hw->priv;
struct interface *intf = &rt2x00dev->interface;
u32 reg;

/*
Expand All @@ -1441,21 +1440,18 @@ static void rt2400pci_configure_filter(struct ieee80211_hw *hw,
* Apply some rules to the filters:
* - Some filters imply different filters to be set.
* - Some things we can't filter out at all.
* - Some filters are set based on interface type.
*/
*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 (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
*total_flags |= FIF_PROMISC_IN_BSS;

/*
* Check if there is any work left for us.
*/
if (intf->filter == *total_flags)
if (rt2x00dev->packet_filter == *total_flags)
return;
intf->filter = *total_flags;
rt2x00dev->packet_filter = *total_flags;

/*
* Start configuration steps.
Expand Down
8 changes: 2 additions & 6 deletions drivers/net/wireless/rt2x00/rt2500pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -1751,7 +1751,6 @@ static void rt2500pci_configure_filter(struct ieee80211_hw *hw,
struct dev_addr_list *mc_list)
{
struct rt2x00_dev *rt2x00dev = hw->priv;
struct interface *intf = &rt2x00dev->interface;
u32 reg;

/*
Expand All @@ -1770,22 +1769,19 @@ static void rt2500pci_configure_filter(struct ieee80211_hw *hw,
* Apply some rules to the filters:
* - Some filters imply different filters to be set.
* - Some things we can't filter out at all.
* - Some filters are set based on interface type.
*/
if (mc_count)
*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 (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
*total_flags |= FIF_PROMISC_IN_BSS;

/*
* Check if there is any work left for us.
*/
if (intf->filter == *total_flags)
if (rt2x00dev->packet_filter == *total_flags)
return;
intf->filter = *total_flags;
rt2x00dev->packet_filter = *total_flags;

/*
* Start configuration steps.
Expand Down
8 changes: 2 additions & 6 deletions drivers/net/wireless/rt2x00/rt2500usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -1611,7 +1611,6 @@ static void rt2500usb_configure_filter(struct ieee80211_hw *hw,
struct dev_addr_list *mc_list)
{
struct rt2x00_dev *rt2x00dev = hw->priv;
struct interface *intf = &rt2x00dev->interface;
u16 reg;

/*
Expand All @@ -1630,22 +1629,19 @@ static void rt2500usb_configure_filter(struct ieee80211_hw *hw,
* Apply some rules to the filters:
* - Some filters imply different filters to be set.
* - Some things we can't filter out at all.
* - Some filters are set based on interface type.
*/
if (mc_count)
*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 (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
*total_flags |= FIF_PROMISC_IN_BSS;

/*
* Check if there is any work left for us.
*/
if (intf->filter == *total_flags)
if (rt2x00dev->packet_filter == *total_flags)
return;
intf->filter = *total_flags;
rt2x00dev->packet_filter = *total_flags;

/*
* When in atomic context, reschedule and let rt2x00lib
Expand Down
12 changes: 7 additions & 5 deletions drivers/net/wireless/rt2x00/rt2x00.h
Original file line number Diff line number Diff line change
Expand Up @@ -388,11 +388,6 @@ struct interface {
* BBSID of the AP to associate with.
*/
u8 bssid[ETH_ALEN];

/*
* Store the packet filter mode for the current interface.
*/
unsigned int filter;
};

static inline int is_interface_present(struct interface *intf)
Expand Down Expand Up @@ -675,6 +670,13 @@ struct rt2x00_dev {
*/
struct mutex usb_cache_mutex;

/*
* Current packet filter configuration for the device.
* This contains all currently active FIF_* flags send
* to us by mac80211 during configure_filter().
*/
unsigned int packet_filter;

/*
* Interface configuration.
*/
Expand Down
4 changes: 2 additions & 2 deletions drivers/net/wireless/rt2x00/rt2x00dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -417,15 +417,15 @@ 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;
unsigned int filter = rt2x00dev->packet_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->packet_filter = 0;

rt2x00dev->ops->hw->configure_filter(rt2x00dev->hw,
filter, &filter, 0, NULL);
Expand Down
8 changes: 2 additions & 6 deletions drivers/net/wireless/rt2x00/rt61pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -2310,7 +2310,6 @@ static void rt61pci_configure_filter(struct ieee80211_hw *hw,
struct dev_addr_list *mc_list)
{
struct rt2x00_dev *rt2x00dev = hw->priv;
struct interface *intf = &rt2x00dev->interface;
u32 reg;

/*
Expand All @@ -2329,22 +2328,19 @@ static void rt61pci_configure_filter(struct ieee80211_hw *hw,
* Apply some rules to the filters:
* - Some filters imply different filters to be set.
* - Some things we can't filter out at all.
* - Some filters are set based on interface type.
*/
if (mc_count)
*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 (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
*total_flags |= FIF_PROMISC_IN_BSS;

/*
* Check if there is any work left for us.
*/
if (intf->filter == *total_flags)
if (rt2x00dev->packet_filter == *total_flags)
return;
intf->filter = *total_flags;
rt2x00dev->packet_filter = *total_flags;

/*
* Start configuration steps.
Expand Down
8 changes: 2 additions & 6 deletions drivers/net/wireless/rt2x00/rt73usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -1846,7 +1846,6 @@ static void rt73usb_configure_filter(struct ieee80211_hw *hw,
struct dev_addr_list *mc_list)
{
struct rt2x00_dev *rt2x00dev = hw->priv;
struct interface *intf = &rt2x00dev->interface;
u32 reg;

/*
Expand All @@ -1865,22 +1864,19 @@ static void rt73usb_configure_filter(struct ieee80211_hw *hw,
* Apply some rules to the filters:
* - Some filters imply different filters to be set.
* - Some things we can't filter out at all.
* - Some filters are set based on interface type.
*/
if (mc_count)
*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 (is_interface_type(intf, IEEE80211_IF_TYPE_AP))
*total_flags |= FIF_PROMISC_IN_BSS;

/*
* Check if there is any work left for us.
*/
if (intf->filter == *total_flags)
if (rt2x00dev->packet_filter == *total_flags)
return;
intf->filter = *total_flags;
rt2x00dev->packet_filter = *total_flags;

/*
* When in atomic context, reschedule and let rt2x00lib
Expand Down

0 comments on commit 3c4f208

Please sign in to comment.