#define pr_fmt(fmt) …
#include <linux/icmpv6.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/mutex.h>
#include <linux/netdevice.h>
#include <linux/skbuff.h>
#include <linux/slab.h>
#include <net/ipv6.h>
#include <net/protocol.h>
#include <net/xfrm.h>
static struct xfrm6_tunnel __rcu *tunnel6_handlers __read_mostly;
static struct xfrm6_tunnel __rcu *tunnel46_handlers __read_mostly;
static struct xfrm6_tunnel __rcu *tunnelmpls6_handlers __read_mostly;
static DEFINE_MUTEX(tunnel6_mutex);
static inline int xfrm6_tunnel_mpls_supported(void)
{ … }
int xfrm6_tunnel_register(struct xfrm6_tunnel *handler, unsigned short family)
{ … }
EXPORT_SYMBOL(…);
int xfrm6_tunnel_deregister(struct xfrm6_tunnel *handler, unsigned short family)
{ … }
EXPORT_SYMBOL(…);
#define for_each_tunnel_rcu(head, handler) … \
static int tunnelmpls6_rcv(struct sk_buff *skb)
{ … }
static int tunnel6_rcv(struct sk_buff *skb)
{ … }
#if IS_ENABLED(CONFIG_INET6_XFRM_TUNNEL)
static int tunnel6_rcv_cb(struct sk_buff *skb, u8 proto, int err)
{ … }
static const struct xfrm_input_afinfo tunnel6_input_afinfo = …;
#endif
static int tunnel46_rcv(struct sk_buff *skb)
{ … }
static int tunnel6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
u8 type, u8 code, int offset, __be32 info)
{ … }
static int tunnel46_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
u8 type, u8 code, int offset, __be32 info)
{ … }
static int tunnelmpls6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
u8 type, u8 code, int offset, __be32 info)
{ … }
static const struct inet6_protocol tunnel6_protocol = …;
static const struct inet6_protocol tunnel46_protocol = …;
static const struct inet6_protocol tunnelmpls6_protocol = …;
static int __init tunnel6_init(void)
{ … }
static void __exit tunnel6_fini(void)
{ … }
module_init(…) …;
module_exit(tunnel6_fini);
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;