diff options
Diffstat (limited to 'net/sched')
-rw-r--r-- | net/sched/em_cmp.c | 9 |
1 files changed, 3 insertions, 6 deletions
diff --git a/net/sched/em_cmp.c b/net/sched/em_cmp.c index cc49c932641d..bc450397487a 100644 --- a/net/sched/em_cmp.c +++ b/net/sched/em_cmp.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
15 | #include <linux/skbuff.h> | 15 | #include <linux/skbuff.h> |
16 | #include <linux/tc_ematch/tc_em_cmp.h> | 16 | #include <linux/tc_ematch/tc_em_cmp.h> |
17 | #include <asm/unaligned.h> | ||
17 | #include <net/pkt_cls.h> | 18 | #include <net/pkt_cls.h> |
18 | 19 | ||
19 | static inline int cmp_needs_transformation(struct tcf_em_cmp *cmp) | 20 | static inline int cmp_needs_transformation(struct tcf_em_cmp *cmp) |
@@ -37,8 +38,7 @@ static int em_cmp_match(struct sk_buff *skb, struct tcf_ematch *em, | |||
37 | break; | 38 | break; |
38 | 39 | ||
39 | case TCF_EM_ALIGN_U16: | 40 | case TCF_EM_ALIGN_U16: |
40 | val = *ptr << 8; | 41 | val = get_unaligned_be16(ptr); |
41 | val |= *(ptr+1); | ||
42 | 42 | ||
43 | if (cmp_needs_transformation(cmp)) | 43 | if (cmp_needs_transformation(cmp)) |
44 | val = be16_to_cpu(val); | 44 | val = be16_to_cpu(val); |
@@ -47,10 +47,7 @@ static int em_cmp_match(struct sk_buff *skb, struct tcf_ematch *em, | |||
47 | case TCF_EM_ALIGN_U32: | 47 | case TCF_EM_ALIGN_U32: |
48 | /* Worth checking boundries? The branching seems | 48 | /* Worth checking boundries? The branching seems |
49 | * to get worse. Visit again. */ | 49 | * to get worse. Visit again. */ |
50 | val = *ptr << 24; | 50 | val = get_unaligned_be32(ptr); |
51 | val |= *(ptr+1) << 16; | ||
52 | val |= *(ptr+2) << 8; | ||
53 | val |= *(ptr+3); | ||
54 | 51 | ||
55 | if (cmp_needs_transformation(cmp)) | 52 | if (cmp_needs_transformation(cmp)) |
56 | val = be32_to_cpu(val); | 53 | val = be32_to_cpu(val); |