Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 084e2f65 authored by Jamal Hadi Salim's avatar Jamal Hadi Salim Committed by David S. Miller
Browse files

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: default avatarJamal Hadi Salim <jhs@mojatatu.com>
Acked-by: default avatarCong Wang <xiyou.wangcong@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ef6980b6
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -751,6 +751,11 @@ config NET_ACT_IFE
	  To compile this code as a module, choose M here: the
	  module will be called act_ife.

config NET_IFE_SKBMARK
        tristate "Support to encoding decoding skb mark on IFE action"
        depends on NET_ACT_IFE
        ---help---

config NET_CLS_IND
	bool "Incoming device classification"
	depends on NET_CLS_U32 || NET_CLS_FW
+1 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ obj-$(CONFIG_NET_ACT_VLAN) += act_vlan.o
obj-$(CONFIG_NET_ACT_BPF)	+= act_bpf.o
obj-$(CONFIG_NET_ACT_CONNMARK)	+= act_connmark.o
obj-$(CONFIG_NET_ACT_IFE)	+= act_ife.o
obj-$(CONFIG_NET_IFE_SKBMARK)	+= act_meta_mark.o
obj-$(CONFIG_NET_SCH_FIFO)	+= sch_fifo.o
obj-$(CONFIG_NET_SCH_CBQ)	+= sch_cbq.o
obj-$(CONFIG_NET_SCH_HTB)	+= sch_htb.o
+79 −0
Original line number Diff line number Diff line
/*
 * 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);