Skip to content

Commit

Permalink
mac80211: Assign correct TID for local bridged packets
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Guy Cohen authored and David S. Miller committed Jan 28, 2008
1 parent 69a7382 commit a8bdf29
Showing 1 changed file with 5 additions and 4 deletions.
9 changes: 5 additions & 4 deletions net/mac80211/wme.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ struct ieee80211_sched_data
struct sk_buff_head requeued[TC_80211_MAX_QUEUES];
};

static const char llc_ip_hdr[8] = {0xAA, 0xAA, 0x3, 0, 0, 0, 0x08, 0};

/* given a data frame determine the 802.1p/1d tag to use */
static inline unsigned classify_1d(struct sk_buff *skb, struct Qdisc *qd)
Expand All @@ -54,12 +55,12 @@ static inline unsigned classify_1d(struct sk_buff *skb, struct Qdisc *qd)
return skb->priority - 256;

/* check there is a valid IP header present */
offset = ieee80211_get_hdrlen_from_skb(skb) + 8 /* LLC + proto */;
if (skb->protocol != htons(ETH_P_IP) ||
skb->len < offset + sizeof(*ip))
offset = ieee80211_get_hdrlen_from_skb(skb);
if (skb->len < offset + sizeof(llc_ip_hdr) + sizeof(*ip) ||
memcmp(skb->data + offset, llc_ip_hdr, sizeof(llc_ip_hdr)))
return 0;

ip = (struct iphdr *) (skb->data + offset);
ip = (struct iphdr *) (skb->data + offset + sizeof(llc_ip_hdr));

dscp = ip->tos & 0xfc;
if (dscp & 0x1c)
Expand Down

0 comments on commit a8bdf29

Please sign in to comment.