// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * net/sched/act_meta_tc_index.c IFE skb->tc_index metadata module
 *
 * copyright Jamal Hadi Salim (2016)
*/

#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 skbtcindex_encode(struct sk_buff *skb, void *skbdata,
			     struct tcf_meta_info *e)
{
	u32 ifetc_index = skb->tc_index;

	return ife_encode_meta_u16(ifetc_index, skbdata, e);
}

static int skbtcindex_decode(struct sk_buff *skb, void *data, u16 len)
{
	u16 ifetc_index = *(u16 *)data;

	skb->tc_index = ntohs(ifetc_index);
	return 0;
}

static int skbtcindex_check(struct sk_buff *skb, struct tcf_meta_info *e)
{
	return ife_check_meta_u16(skb->tc_index, e);
}

static struct tcf_meta_ops ife_skbtcindex_ops = {
	.metaid = IFE_META_TCINDEX,
	.metatype = NLA_U16,
	.name = "tc_index",
	.synopsis = "skb tc_index 16 bit metadata",
	.check_presence = skbtcindex_check,
	.encode = skbtcindex_encode,
	.decode = skbtcindex_decode,
	.get = ife_get_meta_u16,
	.alloc = ife_alloc_meta_u16,
	.release = ife_release_meta_gen,
	.validate = ife_validate_meta_u16,
	.owner = THIS_MODULE,
};

static int __init ifetc_index_init_module(void)
{
	return register_ife_op(&ife_skbtcindex_ops);
}

static void __exit ifetc_index_cleanup_module(void)
{
	unregister_ife_op(&ife_skbtcindex_ops);
}

module_init(ifetc_index_init_module);
module_exit(ifetc_index_cleanup_module);

MODULE_AUTHOR("Jamal Hadi Salim(2016)");
MODULE_DESCRIPTION("Inter-FE skb tc_index metadata module");
MODULE_LICENSE("GPL");
MODULE_ALIAS_IFE_META("tcindex");
