提交 69f817b6 编写于 作者: H Helmut Schaa 提交者: David S. Miller

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: NHelmut Schaa <hschaa@suse.de>
Acked-by: NJohannes Berg <johannes@sipsolutions.net>
Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 6666351d
...@@ -1746,6 +1746,7 @@ void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb, ...@@ -1746,6 +1746,7 @@ void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb,
prev->dev->name); prev->dev->name);
continue; continue;
} }
rx.fc = le16_to_cpu(hdr->frame_control);
rx.skb = skb_new; rx.skb = skb_new;
rx.dev = prev->dev; rx.dev = prev->dev;
rx.sdata = prev; rx.sdata = prev;
...@@ -1754,6 +1755,7 @@ void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb, ...@@ -1754,6 +1755,7 @@ void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb,
prev = sdata; prev = sdata;
} }
if (prev) { if (prev) {
rx.fc = le16_to_cpu(hdr->frame_control);
rx.skb = skb; rx.skb = skb;
rx.dev = prev->dev; rx.dev = prev->dev;
rx.sdata = prev; rx.sdata = prev;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册