Blame view
net/sched/em_cmp.c
1.87 KB
2874c5fd2
|
1 |
// SPDX-License-Identifier: GPL-2.0-or-later |
1da177e4c
|
2 3 4 |
/* * net/sched/em_cmp.c Simple packet data comparison ematch * |
1da177e4c
|
5 6 |
* Authors: Thomas Graf <tgraf@suug.ch> */ |
1da177e4c
|
7 8 9 10 11 |
#include <linux/module.h> #include <linux/types.h> #include <linux/kernel.h> #include <linux/skbuff.h> #include <linux/tc_ematch/tc_em_cmp.h> |
d48abfece
|
12 |
#include <asm/unaligned.h> |
1da177e4c
|
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#include <net/pkt_cls.h> static inline int cmp_needs_transformation(struct tcf_em_cmp *cmp) { return unlikely(cmp->flags & TCF_EM_CMP_TRANS); } static int em_cmp_match(struct sk_buff *skb, struct tcf_ematch *em, struct tcf_pkt_info *info) { struct tcf_em_cmp *cmp = (struct tcf_em_cmp *) em->data; unsigned char *ptr = tcf_get_base_ptr(skb, cmp->layer) + cmp->off; u32 val = 0; if (!tcf_valid_offset(skb, ptr, cmp->align)) return 0; switch (cmp->align) { |
cc7ec456f
|
31 32 33 |
case TCF_EM_ALIGN_U8: val = *ptr; break; |
1da177e4c
|
34 |
|
cc7ec456f
|
35 36 |
case TCF_EM_ALIGN_U16: val = get_unaligned_be16(ptr); |
1da177e4c
|
37 |
|
cc7ec456f
|
38 39 40 |
if (cmp_needs_transformation(cmp)) val = be16_to_cpu(val); break; |
1da177e4c
|
41 |
|
cc7ec456f
|
42 43 44 45 46 |
case TCF_EM_ALIGN_U32: /* Worth checking boundries? The branching seems * to get worse. Visit again. */ val = get_unaligned_be32(ptr); |
1da177e4c
|
47 |
|
cc7ec456f
|
48 49 50 |
if (cmp_needs_transformation(cmp)) val = be32_to_cpu(val); break; |
1da177e4c
|
51 |
|
cc7ec456f
|
52 53 |
default: return 0; |
1da177e4c
|
54 55 56 57 58 59 |
} if (cmp->mask) val &= cmp->mask; switch (cmp->opnd) { |
cc7ec456f
|
60 61 62 63 64 65 |
case TCF_EM_OPND_EQ: return val == cmp->val; case TCF_EM_OPND_LT: return val < cmp->val; case TCF_EM_OPND_GT: return val > cmp->val; |
1da177e4c
|
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
} return 0; } static struct tcf_ematch_ops em_cmp_ops = { .kind = TCF_EM_CMP, .datalen = sizeof(struct tcf_em_cmp), .match = em_cmp_match, .owner = THIS_MODULE, .link = LIST_HEAD_INIT(em_cmp_ops.link) }; static int __init init_em_cmp(void) { return tcf_em_register(&em_cmp_ops); } |
10297b993
|
83 |
static void __exit exit_em_cmp(void) |
1da177e4c
|
84 85 86 87 88 89 90 91 |
{ tcf_em_unregister(&em_cmp_ops); } MODULE_LICENSE("GPL"); module_init(init_em_cmp); module_exit(exit_em_cmp); |
db3d99c09
|
92 |
MODULE_ALIAS_TCF_EMATCH(TCF_EM_CMP); |