diff options
-rw-r--r-- | net/sched/Kconfig | 5 | ||||
-rw-r--r-- | net/sched/Makefile | 1 | ||||
-rw-r--r-- | net/sched/act_meta_skbprio.c | 76 |
3 files changed, 82 insertions, 0 deletions
diff --git a/net/sched/Kconfig b/net/sched/Kconfig index 85854c089d11..b148302bbaf2 100644 --- a/net/sched/Kconfig +++ b/net/sched/Kconfig | |||
@@ -756,6 +756,11 @@ config NET_IFE_SKBMARK | |||
756 | depends on NET_ACT_IFE | 756 | depends on NET_ACT_IFE |
757 | ---help--- | 757 | ---help--- |
758 | 758 | ||
759 | config NET_IFE_SKBPRIO | ||
760 | tristate "Support to encoding decoding skb prio on IFE action" | ||
761 | depends on NET_ACT_IFE | ||
762 | ---help--- | ||
763 | |||
759 | config NET_CLS_IND | 764 | config NET_CLS_IND |
760 | bool "Incoming device classification" | 765 | bool "Incoming device classification" |
761 | depends on NET_CLS_U32 || NET_CLS_FW | 766 | depends on NET_CLS_U32 || NET_CLS_FW |
diff --git a/net/sched/Makefile b/net/sched/Makefile index 3f7a182955c2..84bddb373517 100644 --- a/net/sched/Makefile +++ b/net/sched/Makefile | |||
@@ -21,6 +21,7 @@ obj-$(CONFIG_NET_ACT_BPF) += act_bpf.o | |||
21 | obj-$(CONFIG_NET_ACT_CONNMARK) += act_connmark.o | 21 | obj-$(CONFIG_NET_ACT_CONNMARK) += act_connmark.o |
22 | obj-$(CONFIG_NET_ACT_IFE) += act_ife.o | 22 | obj-$(CONFIG_NET_ACT_IFE) += act_ife.o |
23 | obj-$(CONFIG_NET_IFE_SKBMARK) += act_meta_mark.o | 23 | obj-$(CONFIG_NET_IFE_SKBMARK) += act_meta_mark.o |
24 | obj-$(CONFIG_NET_IFE_SKBPRIO) += act_meta_skbprio.o | ||
24 | obj-$(CONFIG_NET_SCH_FIFO) += sch_fifo.o | 25 | obj-$(CONFIG_NET_SCH_FIFO) += sch_fifo.o |
25 | obj-$(CONFIG_NET_SCH_CBQ) += sch_cbq.o | 26 | obj-$(CONFIG_NET_SCH_CBQ) += sch_cbq.o |
26 | obj-$(CONFIG_NET_SCH_HTB) += sch_htb.o | 27 | obj-$(CONFIG_NET_SCH_HTB) += sch_htb.o |
diff --git a/net/sched/act_meta_skbprio.c b/net/sched/act_meta_skbprio.c new file mode 100644 index 000000000000..26bf4d86030b --- /dev/null +++ b/net/sched/act_meta_skbprio.c | |||
@@ -0,0 +1,76 @@ | |||
1 | /* | ||
2 | * net/sched/act_meta_prio.c IFE skb->priority metadata module | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public License | ||
6 | * as published by the Free Software Foundation; either version | ||
7 | * 2 of the License, or (at your option) any later version. | ||
8 | * | ||
9 | * copyright Jamal Hadi Salim (2015) | ||
10 | * | ||
11 | */ | ||
12 | |||
13 | #include <linux/types.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/string.h> | ||
16 | #include <linux/errno.h> | ||
17 | #include <linux/skbuff.h> | ||
18 | #include <linux/rtnetlink.h> | ||
19 | #include <linux/module.h> | ||
20 | #include <linux/init.h> | ||
21 | #include <net/netlink.h> | ||
22 | #include <net/pkt_sched.h> | ||
23 | #include <uapi/linux/tc_act/tc_ife.h> | ||
24 | #include <net/tc_act/tc_ife.h> | ||
25 | |||
26 | static int skbprio_check(struct sk_buff *skb, struct tcf_meta_info *e) | ||
27 | { | ||
28 | return ife_check_meta_u32(skb->priority, e); | ||
29 | } | ||
30 | |||
31 | static int skbprio_encode(struct sk_buff *skb, void *skbdata, | ||
32 | struct tcf_meta_info *e) | ||
33 | { | ||
34 | u32 ifeprio = skb->priority; /* avoid having to cast skb->priority*/ | ||
35 | |||
36 | return ife_encode_meta_u32(ifeprio, skbdata, e); | ||
37 | } | ||
38 | |||
39 | static int skbprio_decode(struct sk_buff *skb, void *data, u16 len) | ||
40 | { | ||
41 | u32 ifeprio = *(u32 *)data; | ||
42 | |||
43 | skb->priority = ntohl(ifeprio); | ||
44 | return 0; | ||
45 | } | ||
46 | |||
47 | static struct tcf_meta_ops ife_prio_ops = { | ||
48 | .metaid = IFE_META_PRIO, | ||
49 | .metatype = NLA_U32, | ||
50 | .name = "skbprio", | ||
51 | .synopsis = "skb prio metadata", | ||
52 | .check_presence = skbprio_check, | ||
53 | .encode = skbprio_encode, | ||
54 | .decode = skbprio_decode, | ||
55 | .get = ife_get_meta_u32, | ||
56 | .alloc = ife_alloc_meta_u32, | ||
57 | .owner = THIS_MODULE, | ||
58 | }; | ||
59 | |||
60 | static int __init ifeprio_init_module(void) | ||
61 | { | ||
62 | return register_ife_op(&ife_prio_ops); | ||
63 | } | ||
64 | |||
65 | static void __exit ifeprio_cleanup_module(void) | ||
66 | { | ||
67 | unregister_ife_op(&ife_prio_ops); | ||
68 | } | ||
69 | |||
70 | module_init(ifeprio_init_module); | ||
71 | module_exit(ifeprio_cleanup_module); | ||
72 | |||
73 | MODULE_AUTHOR("Jamal Hadi Salim(2015)"); | ||
74 | MODULE_DESCRIPTION("Inter-FE skb prio metadata action"); | ||
75 | MODULE_LICENSE("GPL"); | ||
76 | MODULE_ALIAS_IFE_META(IFE_META_PRIO); | ||