aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/wme.c
diff options
context:
space:
mode:
authorGuy Cohen <guy.cohen@intel.com>2008-01-09 12:12:48 -0500
committerDavid S. Miller <davem@davemloft.net>2008-01-28 18:10:41 -0500
commita8bdf29c6cd117644d27677962fe832b33036c77 (patch)
tree4d678ea8b9c670374cf3e1defec1f30c5661c735 /net/mac80211/wme.c
parent69a73829dbb10e7c8554e66a80cb4fde57347fff (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/wme.c')
-rw-r--r--net/mac80211/wme.c9
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
31static 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 */
33static inline unsigned classify_1d(struct sk_buff *skb, struct Qdisc *qd) 34static 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)