cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

sctp.h (20800B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/* SCTP kernel implementation
      3 * (C) Copyright IBM Corp. 2001, 2004
      4 * Copyright (c) 1999-2000 Cisco, Inc.
      5 * Copyright (c) 1999-2001 Motorola, Inc.
      6 * Copyright (c) 2001-2003 Intel Corp.
      7 *
      8 * This file is part of the SCTP kernel implementation
      9 *
     10 * The base lksctp header.
     11 *
     12 * Please send any bug reports or fixes you make to the
     13 * email address(es):
     14 *    lksctp developers <linux-sctp@vger.kernel.org>
     15 *
     16 * Written or modified by:
     17 *    La Monte H.P. Yarroll <piggy@acm.org>
     18 *    Xingang Guo           <xingang.guo@intel.com>
     19 *    Jon Grimm             <jgrimm@us.ibm.com>
     20 *    Daisy Chang           <daisyc@us.ibm.com>
     21 *    Sridhar Samudrala     <sri@us.ibm.com>
     22 *    Ardelle Fan           <ardelle.fan@intel.com>
     23 *    Ryan Layer            <rmlayer@us.ibm.com>
     24 *    Kevin Gao             <kevin.gao@intel.com> 
     25 */
     26
     27#ifndef __net_sctp_h__
     28#define __net_sctp_h__
     29
     30/* Header Strategy.
     31 *    Start getting some control over the header file depencies:
     32 *       includes
     33 *       constants
     34 *       structs
     35 *       prototypes
     36 *       macros, externs, and inlines
     37 *
     38 *   Move test_frame specific items out of the kernel headers
     39 *   and into the test frame headers.   This is not perfect in any sense
     40 *   and will continue to evolve.
     41 */
     42
     43#include <linux/types.h>
     44#include <linux/slab.h>
     45#include <linux/in.h>
     46#include <linux/tty.h>
     47#include <linux/proc_fs.h>
     48#include <linux/spinlock.h>
     49#include <linux/jiffies.h>
     50#include <linux/idr.h>
     51
     52#if IS_ENABLED(CONFIG_IPV6)
     53#include <net/ipv6.h>
     54#include <net/ip6_route.h>
     55#endif
     56
     57#include <linux/uaccess.h>
     58#include <asm/page.h>
     59#include <net/sock.h>
     60#include <net/snmp.h>
     61#include <net/sctp/structs.h>
     62#include <net/sctp/constants.h>
     63
     64#ifdef CONFIG_IP_SCTP_MODULE
     65#define SCTP_PROTOSW_FLAG 0
     66#else /* static! */
     67#define SCTP_PROTOSW_FLAG INET_PROTOSW_PERMANENT
     68#endif
     69
     70/* Round an int up to the next multiple of 4.  */
     71#define SCTP_PAD4(s) (((s)+3)&~3)
     72/* Truncate to the previous multiple of 4.  */
     73#define SCTP_TRUNC4(s) ((s)&~3)
     74
     75/*
     76 * Function declarations.
     77 */
     78
     79/*
     80 * sctp/protocol.c
     81 */
     82int sctp_copy_local_addr_list(struct net *net, struct sctp_bind_addr *addr,
     83			      enum sctp_scope, gfp_t gfp, int flags);
     84struct sctp_pf *sctp_get_pf_specific(sa_family_t family);
     85int sctp_register_pf(struct sctp_pf *, sa_family_t);
     86void sctp_addr_wq_mgmt(struct net *, struct sctp_sockaddr_entry *, int);
     87int sctp_udp_sock_start(struct net *net);
     88void sctp_udp_sock_stop(struct net *net);
     89
     90/*
     91 * sctp/socket.c
     92 */
     93int sctp_inet_connect(struct socket *sock, struct sockaddr *uaddr,
     94		      int addr_len, int flags);
     95int sctp_backlog_rcv(struct sock *sk, struct sk_buff *skb);
     96int sctp_inet_listen(struct socket *sock, int backlog);
     97void sctp_write_space(struct sock *sk);
     98void sctp_data_ready(struct sock *sk);
     99__poll_t sctp_poll(struct file *file, struct socket *sock,
    100		poll_table *wait);
    101void sctp_sock_rfree(struct sk_buff *skb);
    102void sctp_copy_sock(struct sock *newsk, struct sock *sk,
    103		    struct sctp_association *asoc);
    104extern struct percpu_counter sctp_sockets_allocated;
    105int sctp_asconf_mgmt(struct sctp_sock *, struct sctp_sockaddr_entry *);
    106struct sk_buff *sctp_skb_recv_datagram(struct sock *, int, int *);
    107
    108typedef int (*sctp_callback_t)(struct sctp_endpoint *, struct sctp_transport *, void *);
    109void sctp_transport_walk_start(struct rhashtable_iter *iter);
    110void sctp_transport_walk_stop(struct rhashtable_iter *iter);
    111struct sctp_transport *sctp_transport_get_next(struct net *net,
    112			struct rhashtable_iter *iter);
    113struct sctp_transport *sctp_transport_get_idx(struct net *net,
    114			struct rhashtable_iter *iter, int pos);
    115int sctp_transport_lookup_process(sctp_callback_t cb, struct net *net,
    116				  const union sctp_addr *laddr,
    117				  const union sctp_addr *paddr, void *p);
    118int sctp_transport_traverse_process(sctp_callback_t cb, sctp_callback_t cb_done,
    119				    struct net *net, int *pos, void *p);
    120int sctp_for_each_endpoint(int (*cb)(struct sctp_endpoint *, void *), void *p);
    121int sctp_get_sctp_info(struct sock *sk, struct sctp_association *asoc,
    122		       struct sctp_info *info);
    123
    124/*
    125 * sctp/primitive.c
    126 */
    127int sctp_primitive_ASSOCIATE(struct net *, struct sctp_association *, void *arg);
    128int sctp_primitive_SHUTDOWN(struct net *, struct sctp_association *, void *arg);
    129int sctp_primitive_ABORT(struct net *, struct sctp_association *, void *arg);
    130int sctp_primitive_SEND(struct net *, struct sctp_association *, void *arg);
    131int sctp_primitive_REQUESTHEARTBEAT(struct net *, struct sctp_association *, void *arg);
    132int sctp_primitive_ASCONF(struct net *, struct sctp_association *, void *arg);
    133int sctp_primitive_RECONF(struct net *net, struct sctp_association *asoc,
    134			  void *arg);
    135
    136/*
    137 * sctp/input.c
    138 */
    139int sctp_rcv(struct sk_buff *skb);
    140int sctp_v4_err(struct sk_buff *skb, u32 info);
    141int sctp_hash_endpoint(struct sctp_endpoint *ep);
    142void sctp_unhash_endpoint(struct sctp_endpoint *);
    143struct sock *sctp_err_lookup(struct net *net, int family, struct sk_buff *,
    144			     struct sctphdr *, struct sctp_association **,
    145			     struct sctp_transport **);
    146void sctp_err_finish(struct sock *, struct sctp_transport *);
    147int sctp_udp_v4_err(struct sock *sk, struct sk_buff *skb);
    148int sctp_udp_v6_err(struct sock *sk, struct sk_buff *skb);
    149void sctp_icmp_frag_needed(struct sock *, struct sctp_association *,
    150			   struct sctp_transport *t, __u32 pmtu);
    151void sctp_icmp_redirect(struct sock *, struct sctp_transport *,
    152			struct sk_buff *);
    153void sctp_icmp_proto_unreachable(struct sock *sk,
    154				 struct sctp_association *asoc,
    155				 struct sctp_transport *t);
    156void sctp_backlog_migrate(struct sctp_association *assoc,
    157			  struct sock *oldsk, struct sock *newsk);
    158int sctp_transport_hashtable_init(void);
    159void sctp_transport_hashtable_destroy(void);
    160int sctp_hash_transport(struct sctp_transport *t);
    161void sctp_unhash_transport(struct sctp_transport *t);
    162struct sctp_transport *sctp_addrs_lookup_transport(
    163				struct net *net,
    164				const union sctp_addr *laddr,
    165				const union sctp_addr *paddr);
    166struct sctp_transport *sctp_epaddr_lookup_transport(
    167				const struct sctp_endpoint *ep,
    168				const union sctp_addr *paddr);
    169
    170/*
    171 * sctp/proc.c
    172 */
    173int __net_init sctp_proc_init(struct net *net);
    174
    175/*
    176 * sctp/offload.c
    177 */
    178int sctp_offload_init(void);
    179
    180/*
    181 * sctp/stream_sched.c
    182 */
    183void sctp_sched_ops_init(void);
    184
    185/*
    186 * sctp/stream.c
    187 */
    188int sctp_send_reset_streams(struct sctp_association *asoc,
    189			    struct sctp_reset_streams *params);
    190int sctp_send_reset_assoc(struct sctp_association *asoc);
    191int sctp_send_add_streams(struct sctp_association *asoc,
    192			  struct sctp_add_streams *params);
    193
    194/*
    195 * Module global variables
    196 */
    197
    198 /*
    199  * sctp/protocol.c
    200  */
    201extern struct kmem_cache *sctp_chunk_cachep __read_mostly;
    202extern struct kmem_cache *sctp_bucket_cachep __read_mostly;
    203extern long sysctl_sctp_mem[3];
    204extern int sysctl_sctp_rmem[3];
    205extern int sysctl_sctp_wmem[3];
    206
    207/*
    208 *  Section:  Macros, externs, and inlines
    209 */
    210
    211/* SCTP SNMP MIB stats handlers */
    212#define SCTP_INC_STATS(net, field)	SNMP_INC_STATS((net)->sctp.sctp_statistics, field)
    213#define __SCTP_INC_STATS(net, field)	__SNMP_INC_STATS((net)->sctp.sctp_statistics, field)
    214#define SCTP_DEC_STATS(net, field)	SNMP_DEC_STATS((net)->sctp.sctp_statistics, field)
    215
    216/* sctp mib definitions */
    217enum {
    218	SCTP_MIB_NUM = 0,
    219	SCTP_MIB_CURRESTAB,			/* CurrEstab */
    220	SCTP_MIB_ACTIVEESTABS,			/* ActiveEstabs */
    221	SCTP_MIB_PASSIVEESTABS,			/* PassiveEstabs */
    222	SCTP_MIB_ABORTEDS,			/* Aborteds */
    223	SCTP_MIB_SHUTDOWNS,			/* Shutdowns */
    224	SCTP_MIB_OUTOFBLUES,			/* OutOfBlues */
    225	SCTP_MIB_CHECKSUMERRORS,		/* ChecksumErrors */
    226	SCTP_MIB_OUTCTRLCHUNKS,			/* OutCtrlChunks */
    227	SCTP_MIB_OUTORDERCHUNKS,		/* OutOrderChunks */
    228	SCTP_MIB_OUTUNORDERCHUNKS,		/* OutUnorderChunks */
    229	SCTP_MIB_INCTRLCHUNKS,			/* InCtrlChunks */
    230	SCTP_MIB_INORDERCHUNKS,			/* InOrderChunks */
    231	SCTP_MIB_INUNORDERCHUNKS,		/* InUnorderChunks */
    232	SCTP_MIB_FRAGUSRMSGS,			/* FragUsrMsgs */
    233	SCTP_MIB_REASMUSRMSGS,			/* ReasmUsrMsgs */
    234	SCTP_MIB_OUTSCTPPACKS,			/* OutSCTPPacks */
    235	SCTP_MIB_INSCTPPACKS,			/* InSCTPPacks */
    236	SCTP_MIB_T1_INIT_EXPIREDS,
    237	SCTP_MIB_T1_COOKIE_EXPIREDS,
    238	SCTP_MIB_T2_SHUTDOWN_EXPIREDS,
    239	SCTP_MIB_T3_RTX_EXPIREDS,
    240	SCTP_MIB_T4_RTO_EXPIREDS,
    241	SCTP_MIB_T5_SHUTDOWN_GUARD_EXPIREDS,
    242	SCTP_MIB_DELAY_SACK_EXPIREDS,
    243	SCTP_MIB_AUTOCLOSE_EXPIREDS,
    244	SCTP_MIB_T1_RETRANSMITS,
    245	SCTP_MIB_T3_RETRANSMITS,
    246	SCTP_MIB_PMTUD_RETRANSMITS,
    247	SCTP_MIB_FAST_RETRANSMITS,
    248	SCTP_MIB_IN_PKT_SOFTIRQ,
    249	SCTP_MIB_IN_PKT_BACKLOG,
    250	SCTP_MIB_IN_PKT_DISCARDS,
    251	SCTP_MIB_IN_DATA_CHUNK_DISCARDS,
    252	__SCTP_MIB_MAX
    253};
    254
    255#define SCTP_MIB_MAX    __SCTP_MIB_MAX
    256struct sctp_mib {
    257        unsigned long   mibs[SCTP_MIB_MAX];
    258};
    259
    260/* helper function to track stats about max rto and related transport */
    261static inline void sctp_max_rto(struct sctp_association *asoc,
    262				struct sctp_transport *trans)
    263{
    264	if (asoc->stats.max_obs_rto < (__u64)trans->rto) {
    265		asoc->stats.max_obs_rto = trans->rto;
    266		memset(&asoc->stats.obs_rto_ipaddr, 0,
    267			sizeof(struct sockaddr_storage));
    268		memcpy(&asoc->stats.obs_rto_ipaddr, &trans->ipaddr,
    269			trans->af_specific->sockaddr_len);
    270	}
    271}
    272
    273/*
    274 * Macros for keeping a global reference of object allocations.
    275 */
    276#ifdef CONFIG_SCTP_DBG_OBJCNT
    277
    278extern atomic_t sctp_dbg_objcnt_sock;
    279extern atomic_t sctp_dbg_objcnt_ep;
    280extern atomic_t sctp_dbg_objcnt_assoc;
    281extern atomic_t sctp_dbg_objcnt_transport;
    282extern atomic_t sctp_dbg_objcnt_chunk;
    283extern atomic_t sctp_dbg_objcnt_bind_addr;
    284extern atomic_t sctp_dbg_objcnt_bind_bucket;
    285extern atomic_t sctp_dbg_objcnt_addr;
    286extern atomic_t sctp_dbg_objcnt_datamsg;
    287extern atomic_t sctp_dbg_objcnt_keys;
    288
    289/* Macros to atomically increment/decrement objcnt counters.  */
    290#define SCTP_DBG_OBJCNT_INC(name) \
    291atomic_inc(&sctp_dbg_objcnt_## name)
    292#define SCTP_DBG_OBJCNT_DEC(name) \
    293atomic_dec(&sctp_dbg_objcnt_## name)
    294#define SCTP_DBG_OBJCNT(name) \
    295atomic_t sctp_dbg_objcnt_## name = ATOMIC_INIT(0)
    296
    297/* Macro to help create new entries in the global array of
    298 * objcnt counters.
    299 */
    300#define SCTP_DBG_OBJCNT_ENTRY(name) \
    301{.label= #name, .counter= &sctp_dbg_objcnt_## name}
    302
    303void sctp_dbg_objcnt_init(struct net *);
    304
    305#else
    306
    307#define SCTP_DBG_OBJCNT_INC(name)
    308#define SCTP_DBG_OBJCNT_DEC(name)
    309
    310static inline void sctp_dbg_objcnt_init(struct net *net) { return; }
    311
    312#endif /* CONFIG_SCTP_DBG_OBJCOUNT */
    313
    314#if defined CONFIG_SYSCTL
    315void sctp_sysctl_register(void);
    316void sctp_sysctl_unregister(void);
    317int sctp_sysctl_net_register(struct net *net);
    318void sctp_sysctl_net_unregister(struct net *net);
    319#else
    320static inline void sctp_sysctl_register(void) { return; }
    321static inline void sctp_sysctl_unregister(void) { return; }
    322static inline int sctp_sysctl_net_register(struct net *net) { return 0; }
    323static inline void sctp_sysctl_net_unregister(struct net *net) { return; }
    324#endif
    325
    326/* Size of Supported Address Parameter for 'x' address types. */
    327#define SCTP_SAT_LEN(x) (sizeof(struct sctp_paramhdr) + (x) * sizeof(__u16))
    328
    329#if IS_ENABLED(CONFIG_IPV6)
    330
    331void sctp_v6_pf_init(void);
    332void sctp_v6_pf_exit(void);
    333int sctp_v6_protosw_init(void);
    334void sctp_v6_protosw_exit(void);
    335int sctp_v6_add_protocol(void);
    336void sctp_v6_del_protocol(void);
    337
    338#else /* #ifdef defined(CONFIG_IPV6) */
    339
    340static inline void sctp_v6_pf_init(void) { return; }
    341static inline void sctp_v6_pf_exit(void) { return; }
    342static inline int sctp_v6_protosw_init(void) { return 0; }
    343static inline void sctp_v6_protosw_exit(void) { return; }
    344static inline int sctp_v6_add_protocol(void) { return 0; }
    345static inline void sctp_v6_del_protocol(void) { return; }
    346
    347#endif /* #if defined(CONFIG_IPV6) */
    348
    349
    350/* Map an association to an assoc_id. */
    351static inline sctp_assoc_t sctp_assoc2id(const struct sctp_association *asoc)
    352{
    353	return asoc ? asoc->assoc_id : 0;
    354}
    355
    356static inline enum sctp_sstat_state
    357sctp_assoc_to_state(const struct sctp_association *asoc)
    358{
    359	/* SCTP's uapi always had SCTP_EMPTY(=0) as a dummy state, but we
    360	 * got rid of it in kernel space. Therefore SCTP_CLOSED et al
    361	 * start at =1 in user space, but actually as =0 in kernel space.
    362	 * Now that we can not break user space and SCTP_EMPTY is exposed
    363	 * there, we need to fix it up with an ugly offset not to break
    364	 * applications. :(
    365	 */
    366	return asoc->state + 1;
    367}
    368
    369/* Look up the association by its id.  */
    370struct sctp_association *sctp_id2assoc(struct sock *sk, sctp_assoc_t id);
    371
    372int sctp_do_peeloff(struct sock *sk, sctp_assoc_t id, struct socket **sockp);
    373
    374/* A macro to walk a list of skbs.  */
    375#define sctp_skb_for_each(pos, head, tmp) \
    376	skb_queue_walk_safe(head, pos, tmp)
    377
    378/**
    379 *	sctp_list_dequeue - remove from the head of the queue
    380 *	@list: list to dequeue from
    381 *
    382 *	Remove the head of the list. The head item is
    383 *	returned or %NULL if the list is empty.
    384 */
    385
    386static inline struct list_head *sctp_list_dequeue(struct list_head *list)
    387{
    388	struct list_head *result = NULL;
    389
    390	if (!list_empty(list)) {
    391		result = list->next;
    392		list_del_init(result);
    393	}
    394	return result;
    395}
    396
    397/* SCTP version of skb_set_owner_r.  We need this one because
    398 * of the way we have to do receive buffer accounting on bundled
    399 * chunks.
    400 */
    401static inline void sctp_skb_set_owner_r(struct sk_buff *skb, struct sock *sk)
    402{
    403	struct sctp_ulpevent *event = sctp_skb2event(skb);
    404
    405	skb_orphan(skb);
    406	skb->sk = sk;
    407	skb->destructor = sctp_sock_rfree;
    408	atomic_add(event->rmem_len, &sk->sk_rmem_alloc);
    409	/*
    410	 * This mimics the behavior of skb_set_owner_r
    411	 */
    412	sk_mem_charge(sk, event->rmem_len);
    413}
    414
    415/* Tests if the list has one and only one entry. */
    416static inline int sctp_list_single_entry(struct list_head *head)
    417{
    418	return list_is_singular(head);
    419}
    420
    421static inline bool sctp_chunk_pending(const struct sctp_chunk *chunk)
    422{
    423	return !list_empty(&chunk->list);
    424}
    425
    426/* Walk through a list of TLV parameters.  Don't trust the
    427 * individual parameter lengths and instead depend on
    428 * the chunk length to indicate when to stop.  Make sure
    429 * there is room for a param header too.
    430 */
    431#define sctp_walk_params(pos, chunk, member)\
    432_sctp_walk_params((pos), (chunk), ntohs((chunk)->chunk_hdr.length), member)
    433
    434#define _sctp_walk_params(pos, chunk, end, member)\
    435for (pos.v = chunk->member;\
    436     (pos.v + offsetof(struct sctp_paramhdr, length) + sizeof(pos.p->length) <=\
    437      (void *)chunk + end) &&\
    438     pos.v <= (void *)chunk + end - ntohs(pos.p->length) &&\
    439     ntohs(pos.p->length) >= sizeof(struct sctp_paramhdr);\
    440     pos.v += SCTP_PAD4(ntohs(pos.p->length)))
    441
    442#define sctp_walk_errors(err, chunk_hdr)\
    443_sctp_walk_errors((err), (chunk_hdr), ntohs((chunk_hdr)->length))
    444
    445#define _sctp_walk_errors(err, chunk_hdr, end)\
    446for (err = (struct sctp_errhdr *)((void *)chunk_hdr + \
    447	    sizeof(struct sctp_chunkhdr));\
    448     ((void *)err + offsetof(struct sctp_errhdr, length) + sizeof(err->length) <=\
    449      (void *)chunk_hdr + end) &&\
    450     (void *)err <= (void *)chunk_hdr + end - ntohs(err->length) &&\
    451     ntohs(err->length) >= sizeof(struct sctp_errhdr); \
    452     err = (struct sctp_errhdr *)((void *)err + SCTP_PAD4(ntohs(err->length))))
    453
    454#define sctp_walk_fwdtsn(pos, chunk)\
    455_sctp_walk_fwdtsn((pos), (chunk), ntohs((chunk)->chunk_hdr->length) - sizeof(struct sctp_fwdtsn_chunk))
    456
    457#define _sctp_walk_fwdtsn(pos, chunk, end)\
    458for (pos = chunk->subh.fwdtsn_hdr->skip;\
    459     (void *)pos <= (void *)chunk->subh.fwdtsn_hdr->skip + end - sizeof(struct sctp_fwdtsn_skip);\
    460     pos++)
    461
    462/* External references. */
    463
    464extern struct proto sctp_prot;
    465extern struct proto sctpv6_prot;
    466void sctp_put_port(struct sock *sk);
    467
    468extern struct idr sctp_assocs_id;
    469extern spinlock_t sctp_assocs_id_lock;
    470
    471/* Static inline functions. */
    472
    473/* Convert from an IP version number to an Address Family symbol.  */
    474static inline int ipver2af(__u8 ipver)
    475{
    476	switch (ipver) {
    477	case 4:
    478	        return  AF_INET;
    479	case 6:
    480		return AF_INET6;
    481	default:
    482		return 0;
    483	}
    484}
    485
    486/* Convert from an address parameter type to an address family.  */
    487static inline int param_type2af(__be16 type)
    488{
    489	switch (type) {
    490	case SCTP_PARAM_IPV4_ADDRESS:
    491	        return  AF_INET;
    492	case SCTP_PARAM_IPV6_ADDRESS:
    493		return AF_INET6;
    494	default:
    495		return 0;
    496	}
    497}
    498
    499/* Warning: The following hash functions assume a power of two 'size'. */
    500/* This is the hash function for the SCTP port hash table. */
    501static inline int sctp_phashfn(struct net *net, __u16 lport)
    502{
    503	return (net_hash_mix(net) + lport) & (sctp_port_hashsize - 1);
    504}
    505
    506/* This is the hash function for the endpoint hash table. */
    507static inline int sctp_ep_hashfn(struct net *net, __u16 lport)
    508{
    509	return (net_hash_mix(net) + lport) & (sctp_ep_hashsize - 1);
    510}
    511
    512#define sctp_for_each_hentry(ep, head) \
    513	hlist_for_each_entry(ep, head, node)
    514
    515/* Is a socket of this style? */
    516#define sctp_style(sk, style) __sctp_style((sk), (SCTP_SOCKET_##style))
    517static inline int __sctp_style(const struct sock *sk,
    518			       enum sctp_socket_type style)
    519{
    520	return sctp_sk(sk)->type == style;
    521}
    522
    523/* Is the association in this state? */
    524#define sctp_state(asoc, state) __sctp_state((asoc), (SCTP_STATE_##state))
    525static inline int __sctp_state(const struct sctp_association *asoc,
    526			       enum sctp_state state)
    527{
    528	return asoc->state == state;
    529}
    530
    531/* Is the socket in this state? */
    532#define sctp_sstate(sk, state) __sctp_sstate((sk), (SCTP_SS_##state))
    533static inline int __sctp_sstate(const struct sock *sk,
    534				enum sctp_sock_state state)
    535{
    536	return sk->sk_state == state;
    537}
    538
    539/* Map v4-mapped v6 address back to v4 address */
    540static inline void sctp_v6_map_v4(union sctp_addr *addr)
    541{
    542	addr->v4.sin_family = AF_INET;
    543	addr->v4.sin_port = addr->v6.sin6_port;
    544	addr->v4.sin_addr.s_addr = addr->v6.sin6_addr.s6_addr32[3];
    545}
    546
    547/* Map v4 address to v4-mapped v6 address */
    548static inline void sctp_v4_map_v6(union sctp_addr *addr)
    549{
    550	__be16 port;
    551
    552	port = addr->v4.sin_port;
    553	addr->v6.sin6_addr.s6_addr32[3] = addr->v4.sin_addr.s_addr;
    554	addr->v6.sin6_port = port;
    555	addr->v6.sin6_family = AF_INET6;
    556	addr->v6.sin6_flowinfo = 0;
    557	addr->v6.sin6_scope_id = 0;
    558	addr->v6.sin6_addr.s6_addr32[0] = 0;
    559	addr->v6.sin6_addr.s6_addr32[1] = 0;
    560	addr->v6.sin6_addr.s6_addr32[2] = htonl(0x0000ffff);
    561}
    562
    563/* The cookie is always 0 since this is how it's used in the
    564 * pmtu code.
    565 */
    566static inline struct dst_entry *sctp_transport_dst_check(struct sctp_transport *t)
    567{
    568	if (t->dst && !dst_check(t->dst, t->dst_cookie))
    569		sctp_transport_dst_release(t);
    570
    571	return t->dst;
    572}
    573
    574/* Calculate max payload size given a MTU, or the total overhead if
    575 * given MTU is zero
    576 */
    577static inline __u32 __sctp_mtu_payload(const struct sctp_sock *sp,
    578				       const struct sctp_transport *t,
    579				       __u32 mtu, __u32 extra)
    580{
    581	__u32 overhead = sizeof(struct sctphdr) + extra;
    582
    583	if (sp) {
    584		overhead += sp->pf->af->net_header_len;
    585		if (sp->udp_port && (!t || t->encap_port))
    586			overhead += sizeof(struct udphdr);
    587	} else {
    588		overhead += sizeof(struct ipv6hdr);
    589	}
    590
    591	if (WARN_ON_ONCE(mtu && mtu <= overhead))
    592		mtu = overhead;
    593
    594	return mtu ? mtu - overhead : overhead;
    595}
    596
    597static inline __u32 sctp_mtu_payload(const struct sctp_sock *sp,
    598				     __u32 mtu, __u32 extra)
    599{
    600	return __sctp_mtu_payload(sp, NULL, mtu, extra);
    601}
    602
    603static inline __u32 sctp_dst_mtu(const struct dst_entry *dst)
    604{
    605	return SCTP_TRUNC4(max_t(__u32, dst_mtu(dst),
    606				 SCTP_DEFAULT_MINSEGMENT));
    607}
    608
    609static inline bool sctp_transport_pmtu_check(struct sctp_transport *t)
    610{
    611	__u32 pmtu = sctp_dst_mtu(t->dst);
    612
    613	if (t->pathmtu == pmtu)
    614		return true;
    615
    616	t->pathmtu = pmtu;
    617
    618	return false;
    619}
    620
    621static inline __u32 sctp_min_frag_point(struct sctp_sock *sp, __u16 datasize)
    622{
    623	return sctp_mtu_payload(sp, SCTP_DEFAULT_MINSEGMENT, datasize);
    624}
    625
    626static inline int sctp_transport_pl_hlen(struct sctp_transport *t)
    627{
    628	return __sctp_mtu_payload(sctp_sk(t->asoc->base.sk), t, 0, 0) -
    629	       sizeof(struct sctphdr);
    630}
    631
    632static inline void sctp_transport_pl_reset(struct sctp_transport *t)
    633{
    634	if (t->probe_interval && (t->param_flags & SPP_PMTUD_ENABLE) &&
    635	    (t->state == SCTP_ACTIVE || t->state == SCTP_UNKNOWN)) {
    636		if (t->pl.state == SCTP_PL_DISABLED) {
    637			t->pl.state = SCTP_PL_BASE;
    638			t->pl.pmtu = SCTP_BASE_PLPMTU;
    639			t->pl.probe_size = SCTP_BASE_PLPMTU;
    640			sctp_transport_reset_probe_timer(t);
    641		}
    642	} else {
    643		if (t->pl.state != SCTP_PL_DISABLED) {
    644			if (del_timer(&t->probe_timer))
    645				sctp_transport_put(t);
    646			t->pl.state = SCTP_PL_DISABLED;
    647		}
    648	}
    649}
    650
    651static inline void sctp_transport_pl_update(struct sctp_transport *t)
    652{
    653	if (t->pl.state == SCTP_PL_DISABLED)
    654		return;
    655
    656	t->pl.state = SCTP_PL_BASE;
    657	t->pl.pmtu = SCTP_BASE_PLPMTU;
    658	t->pl.probe_size = SCTP_BASE_PLPMTU;
    659	sctp_transport_reset_probe_timer(t);
    660}
    661
    662static inline bool sctp_transport_pl_enabled(struct sctp_transport *t)
    663{
    664	return t->pl.state != SCTP_PL_DISABLED;
    665}
    666
    667static inline bool sctp_newsk_ready(const struct sock *sk)
    668{
    669	return sock_flag(sk, SOCK_DEAD) || sk->sk_socket;
    670}
    671
    672static inline void sctp_sock_set_nodelay(struct sock *sk)
    673{
    674	lock_sock(sk);
    675	sctp_sk(sk)->nodelay = true;
    676	release_sock(sk);
    677}
    678
    679#endif /* __net_sctp_h__ */