162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * net/sched/act_meta_mark.c IFE skb->mark metadata module
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * copyright Jamal Hadi Salim (2015)
662306a36Sopenharmony_ci*/
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/types.h>
962306a36Sopenharmony_ci#include <linux/kernel.h>
1062306a36Sopenharmony_ci#include <linux/string.h>
1162306a36Sopenharmony_ci#include <linux/errno.h>
1262306a36Sopenharmony_ci#include <linux/skbuff.h>
1362306a36Sopenharmony_ci#include <linux/rtnetlink.h>
1462306a36Sopenharmony_ci#include <linux/module.h>
1562306a36Sopenharmony_ci#include <linux/init.h>
1662306a36Sopenharmony_ci#include <net/netlink.h>
1762306a36Sopenharmony_ci#include <net/pkt_sched.h>
1862306a36Sopenharmony_ci#include <uapi/linux/tc_act/tc_ife.h>
1962306a36Sopenharmony_ci#include <net/tc_act/tc_ife.h>
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_cistatic int skbmark_encode(struct sk_buff *skb, void *skbdata,
2262306a36Sopenharmony_ci			  struct tcf_meta_info *e)
2362306a36Sopenharmony_ci{
2462306a36Sopenharmony_ci	u32 ifemark = skb->mark;
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	return ife_encode_meta_u32(ifemark, skbdata, e);
2762306a36Sopenharmony_ci}
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cistatic int skbmark_decode(struct sk_buff *skb, void *data, u16 len)
3062306a36Sopenharmony_ci{
3162306a36Sopenharmony_ci	u32 ifemark = *(u32 *)data;
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci	skb->mark = ntohl(ifemark);
3462306a36Sopenharmony_ci	return 0;
3562306a36Sopenharmony_ci}
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_cistatic int skbmark_check(struct sk_buff *skb, struct tcf_meta_info *e)
3862306a36Sopenharmony_ci{
3962306a36Sopenharmony_ci	return ife_check_meta_u32(skb->mark, e);
4062306a36Sopenharmony_ci}
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistatic struct tcf_meta_ops ife_skbmark_ops = {
4362306a36Sopenharmony_ci	.metaid = IFE_META_SKBMARK,
4462306a36Sopenharmony_ci	.metatype = NLA_U32,
4562306a36Sopenharmony_ci	.name = "skbmark",
4662306a36Sopenharmony_ci	.synopsis = "skb mark 32 bit metadata",
4762306a36Sopenharmony_ci	.check_presence = skbmark_check,
4862306a36Sopenharmony_ci	.encode = skbmark_encode,
4962306a36Sopenharmony_ci	.decode = skbmark_decode,
5062306a36Sopenharmony_ci	.get = ife_get_meta_u32,
5162306a36Sopenharmony_ci	.alloc = ife_alloc_meta_u32,
5262306a36Sopenharmony_ci	.release = ife_release_meta_gen,
5362306a36Sopenharmony_ci	.validate = ife_validate_meta_u32,
5462306a36Sopenharmony_ci	.owner = THIS_MODULE,
5562306a36Sopenharmony_ci};
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_cistatic int __init ifemark_init_module(void)
5862306a36Sopenharmony_ci{
5962306a36Sopenharmony_ci	return register_ife_op(&ife_skbmark_ops);
6062306a36Sopenharmony_ci}
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_cistatic void __exit ifemark_cleanup_module(void)
6362306a36Sopenharmony_ci{
6462306a36Sopenharmony_ci	unregister_ife_op(&ife_skbmark_ops);
6562306a36Sopenharmony_ci}
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cimodule_init(ifemark_init_module);
6862306a36Sopenharmony_cimodule_exit(ifemark_cleanup_module);
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ciMODULE_AUTHOR("Jamal Hadi Salim(2015)");
7162306a36Sopenharmony_ciMODULE_DESCRIPTION("Inter-FE skb mark metadata module");
7262306a36Sopenharmony_ciMODULE_LICENSE("GPL");
7362306a36Sopenharmony_ciMODULE_ALIAS_IFE_META("skbmark");
74