#define pr_fmt(fmt) …
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/socket.h>
#include <linux/sockios.h>
#include <linux/net.h>
#include <linux/in.h>
#include <linux/in6.h>
#include <linux/netdevice.h>
#include <linux/init.h>
#include <linux/ipsec.h>
#include <linux/slab.h>
#include <linux/ipv6.h>
#include <linux/icmpv6.h>
#include <linux/random.h>
#include <linux/seq_file.h>
#include <net/protocol.h>
#include <net/ndisc.h>
#include <net/ip.h>
#include <net/ipv6.h>
#include <net/transp_v6.h>
#include <net/addrconf.h>
#include <net/ip6_route.h>
#include <net/inet_common.h>
#include <net/inet_ecn.h>
#include <net/sctp/sctp.h>
#include <net/udp_tunnel.h>
#include <linux/uaccess.h>
static inline int sctp_v6_addr_match_len(union sctp_addr *s1,
union sctp_addr *s2);
static void sctp_v6_to_addr(union sctp_addr *addr, struct in6_addr *saddr,
__be16 port);
static int sctp_v6_cmp_addr(const union sctp_addr *addr1,
const union sctp_addr *addr2);
static int sctp_inet6addr_event(struct notifier_block *this, unsigned long ev,
void *ptr)
{ … }
static struct notifier_block sctp_inet6addr_notifier = …;
static void sctp_v6_err_handle(struct sctp_transport *t, struct sk_buff *skb,
__u8 type, __u8 code, __u32 info)
{ … }
static int sctp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
u8 type, u8 code, int offset, __be32 info)
{ … }
int sctp_udp_v6_err(struct sock *sk, struct sk_buff *skb)
{ … }
static int sctp_v6_xmit(struct sk_buff *skb, struct sctp_transport *t)
{ … }
static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr,
struct flowi *fl, struct sock *sk)
{ … }
static inline int sctp_v6_addr_match_len(union sctp_addr *s1,
union sctp_addr *s2)
{ … }
static void sctp_v6_get_saddr(struct sctp_sock *sk,
struct sctp_transport *t,
struct flowi *fl)
{ … }
static void sctp_v6_copy_addrlist(struct list_head *addrlist,
struct net_device *dev)
{ … }
static void sctp_v6_copy_ip_options(struct sock *sk, struct sock *newsk)
{ … }
static int sctp_v6_ip_options_len(struct sock *sk)
{ … }
static void sctp_v6_from_skb(union sctp_addr *addr, struct sk_buff *skb,
int is_saddr)
{ … }
static void sctp_v6_from_sk(union sctp_addr *addr, struct sock *sk)
{ … }
static void sctp_v6_to_sk_saddr(union sctp_addr *addr, struct sock *sk)
{ … }
static void sctp_v6_to_sk_daddr(union sctp_addr *addr, struct sock *sk)
{ … }
static bool sctp_v6_from_addr_param(union sctp_addr *addr,
union sctp_addr_param *param,
__be16 port, int iif)
{ … }
static int sctp_v6_to_addr_param(const union sctp_addr *addr,
union sctp_addr_param *param)
{ … }
static void sctp_v6_to_addr(union sctp_addr *addr, struct in6_addr *saddr,
__be16 port)
{ … }
static int __sctp_v6_cmp_addr(const union sctp_addr *addr1,
const union sctp_addr *addr2)
{ … }
static int sctp_v6_cmp_addr(const union sctp_addr *addr1,
const union sctp_addr *addr2)
{ … }
static void sctp_v6_inaddr_any(union sctp_addr *addr, __be16 port)
{ … }
static int sctp_v6_is_any(const union sctp_addr *addr)
{ … }
static int sctp_v6_available(union sctp_addr *addr, struct sctp_sock *sp)
{ … }
static int sctp_v6_addr_valid(union sctp_addr *addr,
struct sctp_sock *sp,
const struct sk_buff *skb)
{ … }
static enum sctp_scope sctp_v6_scope(union sctp_addr *addr)
{ … }
static struct sock *sctp_v6_create_accept_sk(struct sock *sk,
struct sctp_association *asoc,
bool kern)
{ … }
static int sctp_v6_addr_to_user(struct sctp_sock *sp, union sctp_addr *addr)
{ … }
static int sctp_v6_skb_iif(const struct sk_buff *skb)
{ … }
static int sctp_v6_skb_sdif(const struct sk_buff *skb)
{ … }
static int sctp_v6_is_ce(const struct sk_buff *skb)
{ … }
static void sctp_v6_seq_dump_addr(struct seq_file *seq, union sctp_addr *addr)
{ … }
static void sctp_v6_ecn_capable(struct sock *sk)
{ … }
static void sctp_inet6_event_msgname(struct sctp_ulpevent *event,
char *msgname, int *addrlen)
{ … }
static void sctp_inet6_skb_msgname(struct sk_buff *skb, char *msgname,
int *addr_len)
{ … }
static int sctp_inet6_af_supported(sa_family_t family, struct sctp_sock *sp)
{ … }
static int sctp_inet6_cmp_addr(const union sctp_addr *addr1,
const union sctp_addr *addr2,
struct sctp_sock *opt)
{ … }
static int sctp_inet6_bind_verify(struct sctp_sock *opt, union sctp_addr *addr)
{ … }
static int sctp_inet6_send_verify(struct sctp_sock *opt, union sctp_addr *addr)
{ … }
static int sctp_inet6_supported_addrs(const struct sctp_sock *opt,
__be16 *types)
{ … }
static int sctp_getname(struct socket *sock, struct sockaddr *uaddr,
int peer)
{ … }
static const struct proto_ops inet6_seqpacket_ops = …;
static struct inet_protosw sctpv6_seqpacket_protosw = …;
static struct inet_protosw sctpv6_stream_protosw = …;
static int sctp6_rcv(struct sk_buff *skb)
{ … }
static const struct inet6_protocol sctpv6_protocol = …;
static struct sctp_af sctp_af_inet6 = …;
static struct sctp_pf sctp_pf_inet6 = …;
void sctp_v6_pf_init(void)
{ … }
void sctp_v6_pf_exit(void)
{ … }
int sctp_v6_protosw_init(void)
{ … }
void sctp_v6_protosw_exit(void)
{ … }
int sctp_v6_add_protocol(void)
{ … }
void sctp_v6_del_protocol(void)
{ … }