#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 <net/pkt_cls.h>
#include <linux/tc_act/tc_gact.h>
#include <net/tc_act/tc_gact.h>
#include <net/tc_wrapper.h>
static struct tc_action_ops act_gact_ops;
#ifdef CONFIG_GACT_PROB
static int gact_net_rand(struct tcf_gact *gact)
{ … }
static int gact_determ(struct tcf_gact *gact)
{ … }
g_rand;
static g_rand gact_rand[MAX_RAND] = …;
#endif
static const struct nla_policy gact_policy[TCA_GACT_MAX + 1] = …;
static int tcf_gact_init(struct net *net, struct nlattr *nla,
struct nlattr *est, struct tc_action **a,
struct tcf_proto *tp, u32 flags,
struct netlink_ext_ack *extack)
{ … }
TC_INDIRECT_SCOPE int tcf_gact_act(struct sk_buff *skb,
const struct tc_action *a,
struct tcf_result *res)
{ … }
static void tcf_gact_stats_update(struct tc_action *a, u64 bytes, u64 packets,
u64 drops, u64 lastuse, bool hw)
{ … }
static int tcf_gact_dump(struct sk_buff *skb, struct tc_action *a,
int bind, int ref)
{ … }
static size_t tcf_gact_get_fill_size(const struct tc_action *act)
{ … }
static int tcf_gact_offload_act_setup(struct tc_action *act, void *entry_data,
u32 *index_inc, bool bind,
struct netlink_ext_ack *extack)
{ … }
static struct tc_action_ops act_gact_ops = …;
MODULE_ALIAS_NET_ACT(…) …;
static __net_init int gact_init_net(struct net *net)
{ … }
static void __net_exit gact_exit_net(struct list_head *net_list)
{ … }
static struct pernet_operations gact_net_ops = …;
MODULE_AUTHOR(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;
static int __init gact_init_module(void)
{ … }
static void __exit gact_cleanup_module(void)
{ … }
module_init(…) …;
module_exit(gact_cleanup_module);