Skip to content

Commit

Permalink
mac80211: fix vlan and optimise RX
Browse files Browse the repository at this point in the history
commit fbc44bf upstream.

When receiving data frames, we can send them only to
the interface they belong to based on transmitting
station (this doesn't work for probe requests). Also,
don't try to handle other frames for AP_VLAN at all
since those interface should only receive data.

Additionally, the transmit side must check that the
station we're sending a frame to is actually on the
interface we're transmitting on, and not transmit
packets to functions that live on other interfaces,
so validate that as well.

Another bug fix is needed in sta_info.c where in the
VLAN case when adding/removing stations we overwrite
the sdata variable we still need.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Johannes Berg authored and Greg Kroah-Hartman committed Oct 22, 2009
1 parent eef5edb commit c90aa19
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 3 deletions.
10 changes: 8 additions & 2 deletions net/mac80211/rx.c
Original file line number Diff line number Diff line change
Expand Up @@ -2155,11 +2155,17 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,

skb = rx.skb;

list_for_each_entry_rcu(sdata, &local->interfaces, list) {
if (rx.sdata && ieee80211_is_data(hdr->frame_control)) {
rx.flags |= IEEE80211_RX_RA_MATCH;
prepares = prepare_for_handlers(rx.sdata, &rx, hdr);
if (prepares)
prev = rx.sdata;
} else list_for_each_entry_rcu(sdata, &local->interfaces, list) {
if (!netif_running(sdata->dev))
continue;

if (sdata->vif.type == NL80211_IFTYPE_MONITOR)
if (sdata->vif.type == NL80211_IFTYPE_MONITOR ||
sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
continue;

rx.flags |= IEEE80211_RX_RA_MATCH;
Expand Down
2 changes: 2 additions & 0 deletions net/mac80211/sta_info.c
Original file line number Diff line number Diff line change
Expand Up @@ -360,6 +360,7 @@ int sta_info_insert(struct sta_info *sta)
u.ap);

drv_sta_notify(local, &sdata->vif, STA_NOTIFY_ADD, &sta->sta);
sdata = sta->sdata;
}

#ifdef CONFIG_MAC80211_VERBOSE_DEBUG
Expand Down Expand Up @@ -494,6 +495,7 @@ static void __sta_info_unlink(struct sta_info **sta)

drv_sta_notify(local, &sdata->vif, STA_NOTIFY_REMOVE,
&(*sta)->sta);
sdata = (*sta)->sdata;
}

if (ieee80211_vif_is_mesh(&sdata->vif)) {
Expand Down
3 changes: 2 additions & 1 deletion net/mac80211/tx.c
Original file line number Diff line number Diff line change
Expand Up @@ -1736,7 +1736,8 @@ int ieee80211_subif_start_xmit(struct sk_buff *skb,
if (!is_multicast_ether_addr(hdr.addr1)) {
rcu_read_lock();
sta = sta_info_get(local, hdr.addr1);
if (sta)
/* XXX: in the future, use sdata to look up the sta */
if (sta && sta->sdata == sdata)
sta_flags = get_sta_flags(sta);
rcu_read_unlock();
}
Expand Down

0 comments on commit c90aa19

Please sign in to comment.