aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/rx.c
diff options
context:
space:
mode:
authorHelmut Schaa <hschaa@suse.de>2007-12-21 09:16:35 -0500
committerDavid S. Miller <davem@davemloft.net>2008-01-28 18:00:50 -0500
commit69f817b654d683265118188bbfb8bc0d8978cce6 (patch)
tree1dac1b592fa6b1b9345f9d94fbf1abe1d1e00419 /net/mac80211/rx.c
parent6666351df90656677723f8232b3fdd26a500e51e (diff)
mac80211: Restore rx.fc before every invocation of ieee80211_invoke_rx_handlers
This patch fixes a problem with rx handling on multiple interfaces. Especially when using hardware-scanning and a wireless driver (i.e. iwlwifi) which is able to receive data while scanning. The rx handlers can modify the skb and the frame control field (see ieee80211_rx_h_remove_qos_control) but since every interface gets its own copy of the skb each should get its own copy of rx.fc too. In my case the wlan0-interface did not remove the qos-control from the frame because the corresponding flag in rx.fc was already removed while processing the frame on the master interface. Therefore somehow corrupted frames were passed to the userspace. Signed-off-by: Helmut Schaa <hschaa@suse.de> Acked-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/mac80211/rx.c')
-rw-r--r--net/mac80211/rx.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 505159f8dffc..306e6fc25d8f 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -1746,6 +1746,7 @@ void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb,
1746 prev->dev->name); 1746 prev->dev->name);
1747 continue; 1747 continue;
1748 } 1748 }
1749 rx.fc = le16_to_cpu(hdr->frame_control);
1749 rx.skb = skb_new; 1750 rx.skb = skb_new;
1750 rx.dev = prev->dev; 1751 rx.dev = prev->dev;
1751 rx.sdata = prev; 1752 rx.sdata = prev;
@@ -1754,6 +1755,7 @@ void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb,
1754 prev = sdata; 1755 prev = sdata;
1755 } 1756 }
1756 if (prev) { 1757 if (prev) {
1758 rx.fc = le16_to_cpu(hdr->frame_control);
1757 rx.skb = skb; 1759 rx.skb = skb;
1758 rx.dev = prev->dev; 1760 rx.dev = prev->dev;
1759 rx.sdata = prev; 1761 rx.sdata = prev;