#ifndef __net_sctp_h__
#define __net_sctp_h__
#include <linux/types.h>
#include <linux/slab.h>
#include <linux/in.h>
#include <linux/tty.h>
#include <linux/proc_fs.h>
#include <linux/spinlock.h>
#include <linux/jiffies.h>
#include <linux/idr.h>
#if IS_ENABLED(CONFIG_IPV6)
#include <net/ipv6.h>
#include <net/ip6_route.h>
#endif
#include <linux/uaccess.h>
#include <asm/page.h>
#include <net/sock.h>
#include <net/snmp.h>
#include <net/sctp/structs.h>
#include <net/sctp/constants.h>
#ifdef CONFIG_IP_SCTP_MODULE
#define SCTP_PROTOSW_FLAG …
#else
#define SCTP_PROTOSW_FLAG …
#endif
int sctp_copy_local_addr_list(struct net *net, struct sctp_bind_addr *addr,
enum sctp_scope, gfp_t gfp, int flags);
struct sctp_pf *sctp_get_pf_specific(sa_family_t family);
int sctp_register_pf(struct sctp_pf *, sa_family_t);
void sctp_addr_wq_mgmt(struct net *, struct sctp_sockaddr_entry *, int);
int sctp_udp_sock_start(struct net *net);
void sctp_udp_sock_stop(struct net *net);
int sctp_inet_connect(struct socket *sock, struct sockaddr *uaddr,
int addr_len, int flags);
int sctp_backlog_rcv(struct sock *sk, struct sk_buff *skb);
int sctp_inet_listen(struct socket *sock, int backlog);
void sctp_write_space(struct sock *sk);
void sctp_data_ready(struct sock *sk);
__poll_t sctp_poll(struct file *file, struct socket *sock,
poll_table *wait);
void sctp_sock_rfree(struct sk_buff *skb);
void sctp_copy_sock(struct sock *newsk, struct sock *sk,
struct sctp_association *asoc);
extern struct percpu_counter sctp_sockets_allocated;
int sctp_asconf_mgmt(struct sctp_sock *, struct sctp_sockaddr_entry *);
struct sk_buff *sctp_skb_recv_datagram(struct sock *, int, int *);
sctp_callback_t;
void sctp_transport_walk_start(struct rhashtable_iter *iter);
void sctp_transport_walk_stop(struct rhashtable_iter *iter);
struct sctp_transport *sctp_transport_get_next(struct net *net,
struct rhashtable_iter *iter);
struct sctp_transport *sctp_transport_get_idx(struct net *net,
struct rhashtable_iter *iter, int pos);
int sctp_transport_lookup_process(sctp_callback_t cb, struct net *net,
const union sctp_addr *laddr,
const union sctp_addr *paddr, void *p, int dif);
int sctp_transport_traverse_process(sctp_callback_t cb, sctp_callback_t cb_done,
struct net *net, int *pos, void *p);
int sctp_for_each_endpoint(int (*cb)(struct sctp_endpoint *, void *), void *p);
int sctp_get_sctp_info(struct sock *sk, struct sctp_association *asoc,
struct sctp_info *info);
int sctp_primitive_ASSOCIATE(struct net *, struct sctp_association *, void *arg);
int sctp_primitive_SHUTDOWN(struct net *, struct sctp_association *, void *arg);
int sctp_primitive_ABORT(struct net *, struct sctp_association *, void *arg);
int sctp_primitive_SEND(struct net *, struct sctp_association *, void *arg);
int sctp_primitive_REQUESTHEARTBEAT(struct net *, struct sctp_association *, void *arg);
int sctp_primitive_ASCONF(struct net *, struct sctp_association *, void *arg);
int sctp_primitive_RECONF(struct net *net, struct sctp_association *asoc,
void *arg);
int sctp_rcv(struct sk_buff *skb);
int sctp_v4_err(struct sk_buff *skb, u32 info);
int sctp_hash_endpoint(struct sctp_endpoint *ep);
void sctp_unhash_endpoint(struct sctp_endpoint *);
struct sock *sctp_err_lookup(struct net *net, int family, struct sk_buff *,
struct sctphdr *, struct sctp_association **,
struct sctp_transport **);
void sctp_err_finish(struct sock *, struct sctp_transport *);
int sctp_udp_v4_err(struct sock *sk, struct sk_buff *skb);
int sctp_udp_v6_err(struct sock *sk, struct sk_buff *skb);
void sctp_icmp_frag_needed(struct sock *, struct sctp_association *,
struct sctp_transport *t, __u32 pmtu);
void sctp_icmp_redirect(struct sock *, struct sctp_transport *,
struct sk_buff *);
void sctp_icmp_proto_unreachable(struct sock *sk,
struct sctp_association *asoc,
struct sctp_transport *t);
int sctp_transport_hashtable_init(void);
void sctp_transport_hashtable_destroy(void);
int sctp_hash_transport(struct sctp_transport *t);
void sctp_unhash_transport(struct sctp_transport *t);
struct sctp_transport *sctp_addrs_lookup_transport(
struct net *net,
const union sctp_addr *laddr,
const union sctp_addr *paddr,
int dif, int sdif);
struct sctp_transport *sctp_epaddr_lookup_transport(
const struct sctp_endpoint *ep,
const union sctp_addr *paddr);
bool sctp_sk_bound_dev_eq(struct net *net, int bound_dev_if, int dif, int sdif);
int __net_init sctp_proc_init(struct net *net);
int sctp_offload_init(void);
void sctp_sched_ops_init(void);
int sctp_send_reset_streams(struct sctp_association *asoc,
struct sctp_reset_streams *params);
int sctp_send_reset_assoc(struct sctp_association *asoc);
int sctp_send_add_streams(struct sctp_association *asoc,
struct sctp_add_streams *params);
extern struct kmem_cache *sctp_chunk_cachep __read_mostly;
extern struct kmem_cache *sctp_bucket_cachep __read_mostly;
extern long sysctl_sctp_mem[3];
extern int sysctl_sctp_rmem[3];
extern int sysctl_sctp_wmem[3];
#define SCTP_INC_STATS(net, field) …
#define __SCTP_INC_STATS(net, field) …
#define SCTP_DEC_STATS(net, field) …
enum { … };
#define SCTP_MIB_MAX …
struct sctp_mib { … };
static inline void sctp_max_rto(struct sctp_association *asoc,
struct sctp_transport *trans)
{ … }
#ifdef CONFIG_SCTP_DBG_OBJCNT
extern atomic_t sctp_dbg_objcnt_sock;
extern atomic_t sctp_dbg_objcnt_ep;
extern atomic_t sctp_dbg_objcnt_assoc;
extern atomic_t sctp_dbg_objcnt_transport;
extern atomic_t sctp_dbg_objcnt_chunk;
extern atomic_t sctp_dbg_objcnt_bind_addr;
extern atomic_t sctp_dbg_objcnt_bind_bucket;
extern atomic_t sctp_dbg_objcnt_addr;
extern atomic_t sctp_dbg_objcnt_datamsg;
extern atomic_t sctp_dbg_objcnt_keys;
#define SCTP_DBG_OBJCNT_INC(name) …
#define SCTP_DBG_OBJCNT_DEC(name) …
#define SCTP_DBG_OBJCNT(name) …
#define SCTP_DBG_OBJCNT_ENTRY(name) …
void sctp_dbg_objcnt_init(struct net *);
#else
#define SCTP_DBG_OBJCNT_INC …
#define SCTP_DBG_OBJCNT_DEC …
static inline void sctp_dbg_objcnt_init(struct net *net) { return; }
#endif
#if defined CONFIG_SYSCTL
void sctp_sysctl_register(void);
void sctp_sysctl_unregister(void);
int sctp_sysctl_net_register(struct net *net);
void sctp_sysctl_net_unregister(struct net *net);
#else
static inline void sctp_sysctl_register(void) { return; }
static inline void sctp_sysctl_unregister(void) { return; }
static inline int sctp_sysctl_net_register(struct net *net) { return 0; }
static inline void sctp_sysctl_net_unregister(struct net *net) { return; }
#endif
#define SCTP_SAT_LEN(x) …
#if IS_ENABLED(CONFIG_IPV6)
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);
#else
static inline void sctp_v6_pf_init(void) { return; }
static inline void sctp_v6_pf_exit(void) { return; }
static inline int sctp_v6_protosw_init(void) { return 0; }
static inline void sctp_v6_protosw_exit(void) { return; }
static inline int sctp_v6_add_protocol(void) { return 0; }
static inline void sctp_v6_del_protocol(void) { return; }
#endif
static inline sctp_assoc_t sctp_assoc2id(const struct sctp_association *asoc)
{ … }
static inline enum sctp_sstat_state
sctp_assoc_to_state(const struct sctp_association *asoc)
{ … }
struct sctp_association *sctp_id2assoc(struct sock *sk, sctp_assoc_t id);
int sctp_do_peeloff(struct sock *sk, sctp_assoc_t id, struct socket **sockp);
#define sctp_skb_for_each(pos, head, tmp) …
static inline struct list_head *sctp_list_dequeue(struct list_head *list)
{ … }
static inline void sctp_skb_set_owner_r(struct sk_buff *skb, struct sock *sk)
{ … }
static inline int sctp_list_single_entry(struct list_head *head)
{ … }
static inline bool sctp_chunk_pending(const struct sctp_chunk *chunk)
{ … }
#define sctp_walk_params(pos, chunk) …
#define _sctp_walk_params(pos, chunk, end) …
#define sctp_walk_errors(err, chunk_hdr) …
#define _sctp_walk_errors(err, chunk_hdr, end) …
#define sctp_walk_fwdtsn(pos, chunk) …
#define _sctp_walk_fwdtsn(pos, chunk, end) …
extern struct proto sctp_prot;
extern struct proto sctpv6_prot;
void sctp_put_port(struct sock *sk);
extern struct idr sctp_assocs_id;
extern spinlock_t sctp_assocs_id_lock;
static inline int ipver2af(__u8 ipver)
{ … }
static inline int param_type2af(__be16 type)
{ … }
static inline int sctp_phashfn(struct net *net, __u16 lport)
{ … }
static inline int sctp_ep_hashfn(struct net *net, __u16 lport)
{ … }
#define sctp_for_each_hentry(ep, head) …
#define sctp_style(sk, style) …
static inline int __sctp_style(const struct sock *sk,
enum sctp_socket_type style)
{ … }
#define sctp_state(asoc, state) …
static inline int __sctp_state(const struct sctp_association *asoc,
enum sctp_state state)
{ … }
#define sctp_sstate(sk, state) …
static inline int __sctp_sstate(const struct sock *sk,
enum sctp_sock_state state)
{ … }
static inline void sctp_v6_map_v4(union sctp_addr *addr)
{ … }
static inline void sctp_v4_map_v6(union sctp_addr *addr)
{ … }
static inline struct dst_entry *sctp_transport_dst_check(struct sctp_transport *t)
{ … }
static inline __u32 __sctp_mtu_payload(const struct sctp_sock *sp,
const struct sctp_transport *t,
__u32 mtu, __u32 extra)
{ … }
static inline __u32 sctp_mtu_payload(const struct sctp_sock *sp,
__u32 mtu, __u32 extra)
{ … }
static inline __u32 sctp_dst_mtu(const struct dst_entry *dst)
{ … }
static inline bool sctp_transport_pmtu_check(struct sctp_transport *t)
{ … }
static inline __u32 sctp_min_frag_point(struct sctp_sock *sp, __u16 datasize)
{ … }
static inline int sctp_transport_pl_hlen(struct sctp_transport *t)
{ … }
static inline void sctp_transport_pl_reset(struct sctp_transport *t)
{ … }
static inline void sctp_transport_pl_update(struct sctp_transport *t)
{ … }
static inline bool sctp_transport_pl_enabled(struct sctp_transport *t)
{ … }
static inline bool sctp_newsk_ready(const struct sock *sk)
{ … }
static inline void sctp_sock_set_nodelay(struct sock *sk)
{ … }
#endif