#include <linux/init.h>
#include <linux/mutex.h>
#include <linux/skbuff.h>
#include <linux/icmpv6.h>
#include <net/ip6_route.h>
#include <net/ipv6.h>
#include <net/protocol.h>
#include <net/xfrm.h>
static struct xfrm6_protocol __rcu *esp6_handlers __read_mostly;
static struct xfrm6_protocol __rcu *ah6_handlers __read_mostly;
static struct xfrm6_protocol __rcu *ipcomp6_handlers __read_mostly;
static DEFINE_MUTEX(xfrm6_protocol_mutex);
static inline struct xfrm6_protocol __rcu **proto_handlers(u8 protocol)
{ … }
#define for_each_protocol_rcu(head, handler) … \
static int xfrm6_rcv_cb(struct sk_buff *skb, u8 protocol, int err)
{ … }
int xfrm6_rcv_encap(struct sk_buff *skb, int nexthdr, __be32 spi,
int encap_type)
{ … }
EXPORT_SYMBOL(…);
static int xfrm6_esp_rcv(struct sk_buff *skb)
{ … }
static int xfrm6_esp_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
u8 type, u8 code, int offset, __be32 info)
{ … }
static int xfrm6_ah_rcv(struct sk_buff *skb)
{ … }
static int xfrm6_ah_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
u8 type, u8 code, int offset, __be32 info)
{ … }
static int xfrm6_ipcomp_rcv(struct sk_buff *skb)
{ … }
static int xfrm6_ipcomp_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
u8 type, u8 code, int offset, __be32 info)
{ … }
static const struct inet6_protocol esp6_protocol = …;
static const struct inet6_protocol ah6_protocol = …;
static const struct inet6_protocol ipcomp6_protocol = …;
static const struct xfrm_input_afinfo xfrm6_input_afinfo = …;
static inline const struct inet6_protocol *netproto(unsigned char protocol)
{ … }
int xfrm6_protocol_register(struct xfrm6_protocol *handler,
unsigned char protocol)
{ … }
EXPORT_SYMBOL(…);
int xfrm6_protocol_deregister(struct xfrm6_protocol *handler,
unsigned char protocol)
{ … }
EXPORT_SYMBOL(…);
int __init xfrm6_protocol_init(void)
{ … }
void xfrm6_protocol_fini(void)
{ … }