Skip to content

Commit 408fbc2

Browse files
jhsmtdavem330
authored andcommitted
net sched ife action: Introduce skb tcindex metadata encap decap
Sample use case of how this is encoded: user space via tuntap (or a connected VM/Machine/container) encodes the tcindex TLV. Sample use case of decoding: IFE action decodes it and the skb->tc_index is then used to classify. So something like this for encoded ICMP packets: .. first decode then reclassify... skb->tcindex will be set sudo $TC filter add dev $ETH parent ffff: prio 2 protocol 0xbeef \ u32 match u32 0 0 flowid 1:1 \ action ife decode reclassify ...next match the decode icmp packet... sudo $TC filter add dev $ETH parent ffff: prio 4 protocol ip \ u32 match ip protocol 1 0xff flowid 1:1 \ action continue ... last classify it using the tcindex classifier and do someaction.. sudo $TC filter add dev $ETH parent ffff: prio 5 protocol ip \ handle 0x11 tcindex classid 1:1 \ action blah.. Signed-off-by: Jamal Hadi Salim <jhs@mojatatu.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 6a5d58b commit 408fbc2

File tree

4 files changed

+87
-1
lines changed

4 files changed

+87
-1
lines changed

include/uapi/linux/tc_act/tc_ife.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,9 @@ enum {
3232
#define IFE_META_HASHID 2
3333
#define IFE_META_PRIO 3
3434
#define IFE_META_QMAP 4
35+
#define IFE_META_TCINDEX 5
3536
/*Can be overridden at runtime by module option*/
36-
#define __IFE_META_MAX 5
37+
#define __IFE_META_MAX 6
3738
#define IFE_META_MAX (__IFE_META_MAX - 1)
3839

3940
#endif

net/sched/Kconfig

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -793,6 +793,11 @@ config NET_IFE_SKBPRIO
793793
depends on NET_ACT_IFE
794794
---help---
795795

796+
config NET_IFE_SKBTCINDEX
797+
tristate "Support to encoding decoding skb tcindex on IFE action"
798+
depends on NET_ACT_IFE
799+
---help---
800+
796801
config NET_CLS_IND
797802
bool "Incoming device classification"
798803
depends on NET_CLS_U32 || NET_CLS_FW

net/sched/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ obj-$(CONFIG_NET_ACT_SKBMOD) += act_skbmod.o
2323
obj-$(CONFIG_NET_ACT_IFE) += act_ife.o
2424
obj-$(CONFIG_NET_IFE_SKBMARK) += act_meta_mark.o
2525
obj-$(CONFIG_NET_IFE_SKBPRIO) += act_meta_skbprio.o
26+
obj-$(CONFIG_NET_IFE_SKBTCINDEX) += act_meta_skbtcindex.o
2627
obj-$(CONFIG_NET_ACT_TUNNEL_KEY)+= act_tunnel_key.o
2728
obj-$(CONFIG_NET_SCH_FIFO) += sch_fifo.o
2829
obj-$(CONFIG_NET_SCH_CBQ) += sch_cbq.o

net/sched/act_meta_skbtcindex.c

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/*
2+
* net/sched/act_meta_tc_index.c IFE skb->tc_index 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 (2016)
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 skbtcindex_encode(struct sk_buff *skb, void *skbdata,
28+
struct tcf_meta_info *e)
29+
{
30+
u32 ifetc_index = skb->tc_index;
31+
32+
return ife_encode_meta_u16(ifetc_index, skbdata, e);
33+
}
34+
35+
static int skbtcindex_decode(struct sk_buff *skb, void *data, u16 len)
36+
{
37+
u16 ifetc_index = *(u16 *)data;
38+
39+
skb->tc_index = ntohs(ifetc_index);
40+
return 0;
41+
}
42+
43+
static int skbtcindex_check(struct sk_buff *skb, struct tcf_meta_info *e)
44+
{
45+
return ife_check_meta_u16(skb->tc_index, e);
46+
}
47+
48+
static struct tcf_meta_ops ife_skbtcindex_ops = {
49+
.metaid = IFE_META_TCINDEX,
50+
.metatype = NLA_U16,
51+
.name = "tc_index",
52+
.synopsis = "skb tc_index 16 bit metadata",
53+
.check_presence = skbtcindex_check,
54+
.encode = skbtcindex_encode,
55+
.decode = skbtcindex_decode,
56+
.get = ife_get_meta_u16,
57+
.alloc = ife_alloc_meta_u16,
58+
.release = ife_release_meta_gen,
59+
.validate = ife_validate_meta_u16,
60+
.owner = THIS_MODULE,
61+
};
62+
63+
static int __init ifetc_index_init_module(void)
64+
{
65+
return register_ife_op(&ife_skbtcindex_ops);
66+
}
67+
68+
static void __exit ifetc_index_cleanup_module(void)
69+
{
70+
unregister_ife_op(&ife_skbtcindex_ops);
71+
}
72+
73+
module_init(ifetc_index_init_module);
74+
module_exit(ifetc_index_cleanup_module);
75+
76+
MODULE_AUTHOR("Jamal Hadi Salim(2016)");
77+
MODULE_DESCRIPTION("Inter-FE skb tc_index metadata module");
78+
MODULE_LICENSE("GPL");
79+
MODULE_ALIAS_IFE_META(IFE_META_SKBTCINDEX);

0 commit comments

Comments
 (0)