#include <linux/module.h>
#include <linux/slab.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/string.h>
#include <linux/errno.h>
#include <linux/rtnetlink.h>
#include <linux/skbuff.h>
#include <linux/idr.h>
#include <linux/percpu.h>
#include <net/netlink.h>
#include <net/act_api.h>
#include <net/pkt_cls.h>
#include <net/tc_wrapper.h>
struct basic_head { … };
struct basic_filter { … };
TC_INDIRECT_SCOPE int basic_classify(struct sk_buff *skb,
const struct tcf_proto *tp,
struct tcf_result *res)
{ … }
static void *basic_get(struct tcf_proto *tp, u32 handle)
{ … }
static int basic_init(struct tcf_proto *tp)
{ … }
static void __basic_delete_filter(struct basic_filter *f)
{ … }
static void basic_delete_filter_work(struct work_struct *work)
{ … }
static void basic_destroy(struct tcf_proto *tp, bool rtnl_held,
struct netlink_ext_ack *extack)
{ … }
static int basic_delete(struct tcf_proto *tp, void *arg, bool *last,
bool rtnl_held, struct netlink_ext_ack *extack)
{ … }
static const struct nla_policy basic_policy[TCA_BASIC_MAX + 1] = …;
static int basic_set_parms(struct net *net, struct tcf_proto *tp,
struct basic_filter *f, unsigned long base,
struct nlattr **tb,
struct nlattr *est, u32 flags,
struct netlink_ext_ack *extack)
{ … }
static int basic_change(struct net *net, struct sk_buff *in_skb,
struct tcf_proto *tp, unsigned long base, u32 handle,
struct nlattr **tca, void **arg,
u32 flags, struct netlink_ext_ack *extack)
{ … }
static void basic_walk(struct tcf_proto *tp, struct tcf_walker *arg,
bool rtnl_held)
{ … }
static void basic_bind_class(void *fh, u32 classid, unsigned long cl, void *q,
unsigned long base)
{ … }
static int basic_dump(struct net *net, struct tcf_proto *tp, void *fh,
struct sk_buff *skb, struct tcmsg *t, bool rtnl_held)
{ … }
static struct tcf_proto_ops cls_basic_ops __read_mostly = …;
MODULE_ALIAS_NET_CLS(…) …;
static int __init init_basic(void)
{ … }
static void __exit exit_basic(void)
{ … }
module_init(…) …
module_exit(…)
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;