diff options
author | Guy Cohen <guy.cohen@intel.com> | 2008-01-09 12:12:48 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-01-28 18:10:41 -0500 |
commit | a8bdf29c6cd117644d27677962fe832b33036c77 (patch) | |
tree | 4d678ea8b9c670374cf3e1defec1f30c5661c735 /net/mac80211 | |
parent | 69a73829dbb10e7c8554e66a80cb4fde57347fff (diff) |
mac80211: Assign correct TID for local bridged packets
This patch assigns correct TID to frames transmitted between
two stations in the same BSS in AP mode.
The problem is that skb->protocol is not set to ETH_P_IP and it is wrong
to use that field at this stage.
The fix compares the LLC/Protocol headers explicitly to check if the
encapsulated frame is IP frame
Signed-off-by: Guy Cohen <guy.cohen@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211')
-rw-r--r-- | net/mac80211/wme.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/net/mac80211/wme.c b/net/mac80211/wme.c index 455fadc3d84e..024519522d37 100644 --- a/net/mac80211/wme.c +++ b/net/mac80211/wme.c | |||
@@ -28,6 +28,7 @@ struct ieee80211_sched_data | |||
28 | struct sk_buff_head requeued[TC_80211_MAX_QUEUES]; | 28 | struct sk_buff_head requeued[TC_80211_MAX_QUEUES]; |
29 | }; | 29 | }; |
30 | 30 | ||
31 | static const char llc_ip_hdr[8] = {0xAA, 0xAA, 0x3, 0, 0, 0, 0x08, 0}; | ||
31 | 32 | ||
32 | /* given a data frame determine the 802.1p/1d tag to use */ | 33 | /* given a data frame determine the 802.1p/1d tag to use */ |
33 | static inline unsigned classify_1d(struct sk_buff *skb, struct Qdisc *qd) | 34 | static inline unsigned classify_1d(struct sk_buff *skb, struct Qdisc *qd) |
@@ -54,12 +55,12 @@ static inline unsigned classify_1d(struct sk_buff *skb, struct Qdisc *qd) | |||
54 | return skb->priority - 256; | 55 | return skb->priority - 256; |
55 | 56 | ||
56 | /* check there is a valid IP header present */ | 57 | /* check there is a valid IP header present */ |
57 | offset = ieee80211_get_hdrlen_from_skb(skb) + 8 /* LLC + proto */; | 58 | offset = ieee80211_get_hdrlen_from_skb(skb); |
58 | if (skb->protocol != htons(ETH_P_IP) || | 59 | if (skb->len < offset + sizeof(llc_ip_hdr) + sizeof(*ip) || |
59 | skb->len < offset + sizeof(*ip)) | 60 | memcmp(skb->data + offset, llc_ip_hdr, sizeof(llc_ip_hdr))) |
60 | return 0; | 61 | return 0; |
61 | 62 | ||
62 | ip = (struct iphdr *) (skb->data + offset); | 63 | ip = (struct iphdr *) (skb->data + offset + sizeof(llc_ip_hdr)); |
63 | 64 | ||
64 | dscp = ip->tos & 0xfc; | 65 | dscp = ip->tos & 0xfc; |
65 | if (dscp & 0x1c) | 66 | if (dscp & 0x1c) |