#include <linux/kernel.h>
#include <linux/skbuff.h>
#include <linux/net.h>
#include <linux/in6.h>
#include <linux/ioam6.h>
#include <linux/ioam6_iptunnel.h>
#include <net/dst.h>
#include <net/sock.h>
#include <net/lwtunnel.h>
#include <net/ioam6.h>
#include <net/netlink.h>
#include <net/ipv6.h>
#include <net/dst_cache.h>
#include <net/ip6_route.h>
#include <net/addrconf.h>
#define IOAM6_MASK_SHORT_FIELDS …
#define IOAM6_MASK_WIDE_FIELDS …
struct ioam6_lwt_encap { … } __packed;
struct ioam6_lwt_freq { … };
struct ioam6_lwt { … };
static const struct netlink_range_validation freq_range = …;
static struct ioam6_lwt *ioam6_lwt_state(struct lwtunnel_state *lwt)
{ … }
static struct ioam6_lwt_encap *ioam6_lwt_info(struct lwtunnel_state *lwt)
{ … }
static struct ioam6_trace_hdr *ioam6_lwt_trace(struct lwtunnel_state *lwt)
{ … }
static const struct nla_policy ioam6_iptunnel_policy[IOAM6_IPTUNNEL_MAX + 1] = …;
static bool ioam6_validate_trace_hdr(struct ioam6_trace_hdr *trace)
{ … }
static int ioam6_build_state(struct net *net, struct nlattr *nla,
unsigned int family, const void *cfg,
struct lwtunnel_state **ts,
struct netlink_ext_ack *extack)
{ … }
static int ioam6_do_fill(struct net *net, struct sk_buff *skb)
{ … }
static int ioam6_do_inline(struct net *net, struct sk_buff *skb,
struct ioam6_lwt_encap *tuninfo)
{ … }
static int ioam6_do_encap(struct net *net, struct sk_buff *skb,
struct ioam6_lwt_encap *tuninfo,
struct in6_addr *tundst)
{ … }
static int ioam6_output(struct net *net, struct sock *sk, struct sk_buff *skb)
{ … }
static void ioam6_destroy_state(struct lwtunnel_state *lwt)
{ … }
static int ioam6_fill_encap_info(struct sk_buff *skb,
struct lwtunnel_state *lwtstate)
{ … }
static int ioam6_encap_nlsize(struct lwtunnel_state *lwtstate)
{ … }
static int ioam6_encap_cmp(struct lwtunnel_state *a, struct lwtunnel_state *b)
{ … }
static const struct lwtunnel_encap_ops ioam6_iptun_ops = …;
int __init ioam6_iptunnel_init(void)
{ … }
void ioam6_iptunnel_exit(void)
{ … }