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

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

Support to encoding decoding skb prio on IFE action



    Example usage:
    Set the skb priority 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 prio 17 \
    action ife encode \
    allow prio \
    dst 02:15:15:15:15:15

    Note: You dont need the skbedit action if you are already encoding the
    skb priority earlier. A zero skb priority will not be sent

    Alternative hard code static priority of decimal 33 (unlike skbedit)
    then 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 prio 33 \
    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 084e2f65
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -756,6 +756,11 @@ config NET_IFE_SKBMARK
        depends on NET_ACT_IFE
        ---help---

config NET_IFE_SKBPRIO
        tristate "Support to encoding decoding skb prio 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
@@ -21,6 +21,7 @@ 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_IFE_SKBPRIO)	+= act_meta_skbprio.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
+76 −0
Original line number Diff line number Diff line
/*
 * net/sched/act_meta_prio.c IFE skb->priority 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>

static int skbprio_check(struct sk_buff *skb, struct tcf_meta_info *e)
{
	return ife_check_meta_u32(skb->priority, e);
}

static int skbprio_encode(struct sk_buff *skb, void *skbdata,
			  struct tcf_meta_info *e)
{
	u32 ifeprio = skb->priority; /* avoid having to cast skb->priority*/

	return ife_encode_meta_u32(ifeprio, skbdata, e);
}

static int skbprio_decode(struct sk_buff *skb, void *data, u16 len)
{
	u32 ifeprio = *(u32 *)data;

	skb->priority = ntohl(ifeprio);
	return 0;
}

static struct tcf_meta_ops ife_prio_ops = {
	.metaid = IFE_META_PRIO,
	.metatype = NLA_U32,
	.name = "skbprio",
	.synopsis = "skb prio metadata",
	.check_presence = skbprio_check,
	.encode = skbprio_encode,
	.decode = skbprio_decode,
	.get = ife_get_meta_u32,
	.alloc = ife_alloc_meta_u32,
	.owner = THIS_MODULE,
};

static int __init ifeprio_init_module(void)
{
	return register_ife_op(&ife_prio_ops);
}

static void __exit ifeprio_cleanup_module(void)
{
	unregister_ife_op(&ife_prio_ops);
}

module_init(ifeprio_init_module);
module_exit(ifeprio_cleanup_module);

MODULE_AUTHOR("Jamal Hadi Salim(2015)");
MODULE_DESCRIPTION("Inter-FE skb prio metadata action");
MODULE_LICENSE("GPL");
MODULE_ALIAS_IFE_META(IFE_META_PRIO);