1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3 * net/sched/act_meta_mark.c IFE skb->mark metadata module
4 *
5 * copyright Jamal Hadi Salim (2015)
6 */
7
8 #include <linux/types.h>
9 #include <linux/kernel.h>
10 #include <linux/string.h>
11 #include <linux/errno.h>
12 #include <linux/skbuff.h>
13 #include <linux/unaligned.h>
14 #include <linux/rtnetlink.h>
15 #include <linux/module.h>
16 #include <linux/init.h>
17 #include <net/netlink.h>
18 #include <net/pkt_sched.h>
19 #include <uapi/linux/tc_act/tc_ife.h>
20 #include <net/tc_act/tc_ife.h>
21
skbmark_encode(struct sk_buff * skb,void * skbdata,struct tcf_meta_info * e)22 static int skbmark_encode(struct sk_buff *skb, void *skbdata,
23 struct tcf_meta_info *e)
24 {
25 u32 ifemark = skb->mark;
26
27 return ife_encode_meta_u32(ifemark, skbdata, e);
28 }
29
skbmark_decode(struct sk_buff * skb,void * data,u16 len)30 static int skbmark_decode(struct sk_buff *skb, void *data, u16 len)
31 {
32 if (len != sizeof(u32))
33 return -EINVAL;
34
35 skb->mark = get_unaligned_be32(data);
36 return 0;
37 }
38
skbmark_check(struct sk_buff * skb,struct tcf_meta_info * e)39 static int skbmark_check(struct sk_buff *skb, struct tcf_meta_info *e)
40 {
41 return ife_check_meta_u32(skb->mark, e);
42 }
43
44 static struct tcf_meta_ops ife_skbmark_ops = {
45 .metaid = IFE_META_SKBMARK,
46 .metatype = NLA_U32,
47 .name = "skbmark",
48 .synopsis = "skb mark 32 bit metadata",
49 .check_presence = skbmark_check,
50 .encode = skbmark_encode,
51 .decode = skbmark_decode,
52 .get = ife_get_meta_u32,
53 .alloc = ife_alloc_meta_u32,
54 .release = ife_release_meta_gen,
55 .validate = ife_validate_meta_u32,
56 .owner = THIS_MODULE,
57 };
58
ifemark_init_module(void)59 static int __init ifemark_init_module(void)
60 {
61 return register_ife_op(&ife_skbmark_ops);
62 }
63
ifemark_cleanup_module(void)64 static void __exit ifemark_cleanup_module(void)
65 {
66 unregister_ife_op(&ife_skbmark_ops);
67 }
68
69 module_init(ifemark_init_module);
70 module_exit(ifemark_cleanup_module);
71
72 MODULE_AUTHOR("Jamal Hadi Salim(2015)");
73 MODULE_DESCRIPTION("Inter-FE skb mark metadata module");
74 MODULE_LICENSE("GPL");
75 MODULE_ALIAS_IFE_META("skbmark");
76