diff options
author | Jamal Hadi Salim <jhs@mojatatu.com> | 2016-02-27 08:08:55 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-03-01 17:15:23 -0500 |
commit | 084e2f6566d2a39c007ed6473f58b551a2eeefeb (patch) | |
tree | 5149ddc6b8d35e78dd8fa18f8c22ce54c507ade2 /net | |
parent | ef6980b6becb1afd9d82a4f043749a10ae81bf14 (diff) |
Support to encoding decoding skb mark on IFE action
Example usage:
Set the skb using skbedit then allow it to be encoded
sudo tc qdisc add dev $ETH root handle 1: prio
sudo tc filter add dev $ETH parent 1: protocol ip prio 10 \
u32 match ip protocol 1 0xff flowid 1:2 \
action skbedit mark 17 \
action ife encode \
allow mark \
dst 02:15:15:15:15:15
Note: You dont need the skbedit action if you are already encoding the
skb mark earlier. A zero skb mark, when seen, will not be encoded.
Alternative hard code static mark of 0x12 every time the filter matches
sudo $TC filter add dev $ETH parent 1: protocol ip prio 10 \
u32 match ip protocol 1 0xff flowid 1:2 \
action ife encode \
type 0xDEAD \
use mark 0x12 \
dst 02:15:15:15:15:15
Signed-off-by: Jamal Hadi Salim <jhs@mojatatu.com>
Acked-by: Cong Wang <xiyou.wangcong@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/sched/Kconfig | 5 | ||||
-rw-r--r-- | net/sched/Makefile | 1 | ||||
-rw-r--r-- | net/sched/act_meta_mark.c | 79 |
3 files changed, 85 insertions, 0 deletions
diff --git a/net/sched/Kconfig b/net/sched/Kconfig index 4d48ef57e564..85854c089d11 100644 --- a/net/sched/Kconfig +++ b/net/sched/Kconfig | |||
@@ -751,6 +751,11 @@ config NET_ACT_IFE | |||
751 | To compile this code as a module, choose M here: the | 751 | To compile this code as a module, choose M here: the |
752 | module will be called act_ife. | 752 | module will be called act_ife. |
753 | 753 | ||
754 | config NET_IFE_SKBMARK | ||
755 | tristate "Support to encoding decoding skb mark on IFE action" | ||
756 | depends on NET_ACT_IFE | ||
757 | ---help--- | ||
758 | |||
754 | config NET_CLS_IND | 759 | config NET_CLS_IND |
755 | bool "Incoming device classification" | 760 | bool "Incoming device classification" |
756 | depends on NET_CLS_U32 || NET_CLS_FW | 761 | depends on NET_CLS_U32 || NET_CLS_FW |
diff --git a/net/sched/Makefile b/net/sched/Makefile index 3d176671b0e1..3f7a182955c2 100644 --- a/net/sched/Makefile +++ b/net/sched/Makefile | |||
@@ -20,6 +20,7 @@ obj-$(CONFIG_NET_ACT_VLAN) += act_vlan.o | |||
20 | obj-$(CONFIG_NET_ACT_BPF) += act_bpf.o | 20 | 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_SCH_FIFO) += sch_fifo.o | 24 | obj-$(CONFIG_NET_SCH_FIFO) += sch_fifo.o |
24 | obj-$(CONFIG_NET_SCH_CBQ) += sch_cbq.o | 25 | obj-$(CONFIG_NET_SCH_CBQ) += sch_cbq.o |
25 | obj-$(CONFIG_NET_SCH_HTB) += sch_htb.o | 26 | obj-$(CONFIG_NET_SCH_HTB) += sch_htb.o |
diff --git a/net/sched/act_meta_mark.c b/net/sched/act_meta_mark.c new file mode 100644 index 000000000000..82892170ce4f --- /dev/null +++ b/net/sched/act_meta_mark.c | |||
@@ -0,0 +1,79 @@ | |||
1 | /* | ||
2 | * net/sched/act_meta_mark.c IFE skb->mark 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 | #include <linux/rtnetlink.h> | ||
26 | |||
27 | static int skbmark_encode(struct sk_buff *skb, void *skbdata, | ||
28 | struct tcf_meta_info *e) | ||
29 | { | ||
30 | u32 ifemark = skb->mark; | ||
31 | |||
32 | return ife_encode_meta_u32(ifemark, skbdata, e); | ||
33 | } | ||
34 | |||
35 | static int skbmark_decode(struct sk_buff *skb, void *data, u16 len) | ||
36 | { | ||
37 | u32 ifemark = *(u32 *)data; | ||
38 | |||
39 | skb->mark = ntohl(ifemark); | ||
40 | return 0; | ||
41 | } | ||
42 | |||
43 | static int skbmark_check(struct sk_buff *skb, struct tcf_meta_info *e) | ||
44 | { | ||
45 | return ife_check_meta_u32(skb->mark, e); | ||
46 | } | ||
47 | |||
48 | static struct tcf_meta_ops ife_skbmark_ops = { | ||
49 | .metaid = IFE_META_SKBMARK, | ||
50 | .metatype = NLA_U32, | ||
51 | .name = "skbmark", | ||
52 | .synopsis = "skb mark 32 bit metadata", | ||
53 | .check_presence = skbmark_check, | ||
54 | .encode = skbmark_encode, | ||
55 | .decode = skbmark_decode, | ||
56 | .get = ife_get_meta_u32, | ||
57 | .alloc = ife_alloc_meta_u32, | ||
58 | .release = ife_release_meta_gen, | ||
59 | .validate = ife_validate_meta_u32, | ||
60 | .owner = THIS_MODULE, | ||
61 | }; | ||
62 | |||
63 | static int __init ifemark_init_module(void) | ||
64 | { | ||
65 | return register_ife_op(&ife_skbmark_ops); | ||
66 | } | ||
67 | |||
68 | static void __exit ifemark_cleanup_module(void) | ||
69 | { | ||
70 | unregister_ife_op(&ife_skbmark_ops); | ||
71 | } | ||
72 | |||
73 | module_init(ifemark_init_module); | ||
74 | module_exit(ifemark_cleanup_module); | ||
75 | |||
76 | MODULE_AUTHOR("Jamal Hadi Salim(2015)"); | ||
77 | MODULE_DESCRIPTION("Inter-FE skb mark metadata module"); | ||
78 | MODULE_LICENSE("GPL"); | ||
79 | MODULE_ALIAS_IFE_META(IFE_META_SKBMARK); | ||