-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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>
- Loading branch information
Jamal Hadi Salim
authored and
David S. Miller
committed
Mar 1, 2016
1 parent
ef6980b
commit 084e2f6
Showing
3 changed files
with
85 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
/* | ||
* net/sched/act_meta_mark.c IFE skb->mark metadata module | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License | ||
* as published by the Free Software Foundation; either version | ||
* 2 of the License, or (at your option) any later version. | ||
* | ||
* copyright Jamal Hadi Salim (2015) | ||
* | ||
*/ | ||
|
||
#include <linux/types.h> | ||
#include <linux/kernel.h> | ||
#include <linux/string.h> | ||
#include <linux/errno.h> | ||
#include <linux/skbuff.h> | ||
#include <linux/rtnetlink.h> | ||
#include <linux/module.h> | ||
#include <linux/init.h> | ||
#include <net/netlink.h> | ||
#include <net/pkt_sched.h> | ||
#include <uapi/linux/tc_act/tc_ife.h> | ||
#include <net/tc_act/tc_ife.h> | ||
#include <linux/rtnetlink.h> | ||
|
||
static int skbmark_encode(struct sk_buff *skb, void *skbdata, | ||
struct tcf_meta_info *e) | ||
{ | ||
u32 ifemark = skb->mark; | ||
|
||
return ife_encode_meta_u32(ifemark, skbdata, e); | ||
} | ||
|
||
static int skbmark_decode(struct sk_buff *skb, void *data, u16 len) | ||
{ | ||
u32 ifemark = *(u32 *)data; | ||
|
||
skb->mark = ntohl(ifemark); | ||
return 0; | ||
} | ||
|
||
static int skbmark_check(struct sk_buff *skb, struct tcf_meta_info *e) | ||
{ | ||
return ife_check_meta_u32(skb->mark, e); | ||
} | ||
|
||
static struct tcf_meta_ops ife_skbmark_ops = { | ||
.metaid = IFE_META_SKBMARK, | ||
.metatype = NLA_U32, | ||
.name = "skbmark", | ||
.synopsis = "skb mark 32 bit metadata", | ||
.check_presence = skbmark_check, | ||
.encode = skbmark_encode, | ||
.decode = skbmark_decode, | ||
.get = ife_get_meta_u32, | ||
.alloc = ife_alloc_meta_u32, | ||
.release = ife_release_meta_gen, | ||
.validate = ife_validate_meta_u32, | ||
.owner = THIS_MODULE, | ||
}; | ||
|
||
static int __init ifemark_init_module(void) | ||
{ | ||
return register_ife_op(&ife_skbmark_ops); | ||
} | ||
|
||
static void __exit ifemark_cleanup_module(void) | ||
{ | ||
unregister_ife_op(&ife_skbmark_ops); | ||
} | ||
|
||
module_init(ifemark_init_module); | ||
module_exit(ifemark_cleanup_module); | ||
|
||
MODULE_AUTHOR("Jamal Hadi Salim(2015)"); | ||
MODULE_DESCRIPTION("Inter-FE skb mark metadata module"); | ||
MODULE_LICENSE("GPL"); | ||
MODULE_ALIAS_IFE_META(IFE_META_SKBMARK); |