#include <linux/errno.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/net.h>
#include <linux/ioam6.h>
#include <linux/ioam6_genl.h>
#include <linux/rhashtable.h>
#include <linux/netdevice.h>
#include <net/addrconf.h>
#include <net/genetlink.h>
#include <net/ioam6.h>
#include <net/sch_generic.h>
static void ioam6_ns_release(struct ioam6_namespace *ns)
{ … }
static void ioam6_sc_release(struct ioam6_schema *sc)
{ … }
static void ioam6_free_ns(void *ptr, void *arg)
{ … }
static void ioam6_free_sc(void *ptr, void *arg)
{ … }
static int ioam6_ns_cmpfn(struct rhashtable_compare_arg *arg, const void *obj)
{ … }
static int ioam6_sc_cmpfn(struct rhashtable_compare_arg *arg, const void *obj)
{ … }
static const struct rhashtable_params rht_ns_params = …;
static const struct rhashtable_params rht_sc_params = …;
static struct genl_family ioam6_genl_family;
static const struct nla_policy ioam6_genl_policy_addns[] = …;
static const struct nla_policy ioam6_genl_policy_delns[] = …;
static const struct nla_policy ioam6_genl_policy_addsc[] = …;
static const struct nla_policy ioam6_genl_policy_delsc[] = …;
static const struct nla_policy ioam6_genl_policy_ns_sc[] = …;
static int ioam6_genl_addns(struct sk_buff *skb, struct genl_info *info)
{ … }
static int ioam6_genl_delns(struct sk_buff *skb, struct genl_info *info)
{ … }
static int __ioam6_genl_dumpns_element(struct ioam6_namespace *ns,
u32 portid,
u32 seq,
u32 flags,
struct sk_buff *skb,
u8 cmd)
{ … }
static int ioam6_genl_dumpns_start(struct netlink_callback *cb)
{ … }
static int ioam6_genl_dumpns_done(struct netlink_callback *cb)
{ … }
static int ioam6_genl_dumpns(struct sk_buff *skb, struct netlink_callback *cb)
{ … }
static int ioam6_genl_addsc(struct sk_buff *skb, struct genl_info *info)
{ … }
static int ioam6_genl_delsc(struct sk_buff *skb, struct genl_info *info)
{ … }
static int __ioam6_genl_dumpsc_element(struct ioam6_schema *sc,
u32 portid, u32 seq, u32 flags,
struct sk_buff *skb, u8 cmd)
{ … }
static int ioam6_genl_dumpsc_start(struct netlink_callback *cb)
{ … }
static int ioam6_genl_dumpsc_done(struct netlink_callback *cb)
{ … }
static int ioam6_genl_dumpsc(struct sk_buff *skb, struct netlink_callback *cb)
{ … }
static int ioam6_genl_ns_set_schema(struct sk_buff *skb, struct genl_info *info)
{ … }
static const struct genl_ops ioam6_genl_ops[] = …;
#define IOAM6_GENL_EV_GRP_OFFSET …
static const struct genl_multicast_group ioam6_mcgrps[] = …;
static int ioam6_event_put_trace(struct sk_buff *skb,
struct ioam6_trace_hdr *trace,
unsigned int len)
{ … }
void ioam6_event(enum ioam6_event_type type, struct net *net, gfp_t gfp,
void *opt, unsigned int opt_len)
{ … }
static struct genl_family ioam6_genl_family __ro_after_init = …;
struct ioam6_namespace *ioam6_namespace(struct net *net, __be16 id)
{ … }
static void __ioam6_fill_trace_data(struct sk_buff *skb,
struct ioam6_namespace *ns,
struct ioam6_trace_hdr *trace,
struct ioam6_schema *sc,
u8 sclen, bool is_input)
{ … }
void ioam6_fill_trace_data(struct sk_buff *skb,
struct ioam6_namespace *ns,
struct ioam6_trace_hdr *trace,
bool is_input)
{ … }
static int __net_init ioam6_net_init(struct net *net)
{ … }
static void __net_exit ioam6_net_exit(struct net *net)
{ … }
static struct pernet_operations ioam6_net_ops = …;
int __init ioam6_init(void)
{ … }
void ioam6_exit(void)
{ … }