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.
8 * This file is part of the SCTP kernel implementation
10 * The base lksctp header.
12 * Please send any bug reports or fixes you make to the
14 * lksctp developers <linux-sctp@vger.kernel.org>
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>
27 #ifndef __net_sctp_h__
28 #define __net_sctp_h__
31 * Start getting some control over the header file dependencies:
36 * macros, externs, and inlines
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.
43 #include <linux/types.h>
44 #include <linux/slab.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>
52 #if IS_ENABLED(CONFIG_IPV6)
54 #include <net/ip6_route.h>
57 #include <linux/uaccess.h>
61 #include <net/sctp/structs.h>
62 #include <net/sctp/constants.h>
64 #ifdef CONFIG_IP_SCTP_MODULE
65 #define SCTP_PROTOSW_FLAG 0
67 #define SCTP_PROTOSW_FLAG INET_PROTOSW_PERMANENT
71 * Function declarations.
77 int sctp_copy_local_addr_list(struct net
*net
, struct sctp_bind_addr
*addr
,
78 enum sctp_scope
, gfp_t gfp
, int flags
);
79 struct sctp_pf
*sctp_get_pf_specific(sa_family_t family
);
80 int sctp_register_pf(struct sctp_pf
*, sa_family_t
);
81 void sctp_addr_wq_mgmt(struct net
*, struct sctp_sockaddr_entry
*, int);
82 int sctp_udp_sock_start(struct net
*net
);
83 void sctp_udp_sock_stop(struct net
*net
);
88 int sctp_inet_connect(struct socket
*sock
, struct sockaddr
*uaddr
,
89 int addr_len
, int flags
);
90 int sctp_backlog_rcv(struct sock
*sk
, struct sk_buff
*skb
);
91 int sctp_inet_listen(struct socket
*sock
, int backlog
);
92 void sctp_write_space(struct sock
*sk
);
93 void sctp_data_ready(struct sock
*sk
);
94 __poll_t
sctp_poll(struct file
*file
, struct socket
*sock
,
96 void sctp_sock_rfree(struct sk_buff
*skb
);
97 void sctp_copy_sock(struct sock
*newsk
, struct sock
*sk
,
98 struct sctp_association
*asoc
);
99 extern struct percpu_counter sctp_sockets_allocated
;
100 int sctp_asconf_mgmt(struct sctp_sock
*, struct sctp_sockaddr_entry
*);
101 struct sk_buff
*sctp_skb_recv_datagram(struct sock
*, int, int *);
103 typedef int (*sctp_callback_t
)(struct sctp_endpoint
*, struct sctp_transport
*, void *);
104 void sctp_transport_walk_start(struct rhashtable_iter
*iter
);
105 void sctp_transport_walk_stop(struct rhashtable_iter
*iter
);
106 struct sctp_transport
*sctp_transport_get_next(struct net
*net
,
107 struct rhashtable_iter
*iter
);
108 struct sctp_transport
*sctp_transport_get_idx(struct net
*net
,
109 struct rhashtable_iter
*iter
, int pos
);
110 int sctp_transport_lookup_process(sctp_callback_t cb
, struct net
*net
,
111 const union sctp_addr
*laddr
,
112 const union sctp_addr
*paddr
, void *p
, int dif
);
113 int sctp_transport_traverse_process(sctp_callback_t cb
, sctp_callback_t cb_done
,
114 struct net
*net
, int *pos
, void *p
);
115 int sctp_for_each_endpoint(int (*cb
)(struct sctp_endpoint
*, void *), void *p
);
116 int sctp_get_sctp_info(struct sock
*sk
, struct sctp_association
*asoc
,
117 struct sctp_info
*info
);
122 int sctp_primitive_ASSOCIATE(struct net
*, struct sctp_association
*, void *arg
);
123 int sctp_primitive_SHUTDOWN(struct net
*, struct sctp_association
*, void *arg
);
124 int sctp_primitive_ABORT(struct net
*, struct sctp_association
*, void *arg
);
125 int sctp_primitive_SEND(struct net
*, struct sctp_association
*, void *arg
);
126 int sctp_primitive_REQUESTHEARTBEAT(struct net
*, struct sctp_association
*, void *arg
);
127 int sctp_primitive_ASCONF(struct net
*, struct sctp_association
*, void *arg
);
128 int sctp_primitive_RECONF(struct net
*net
, struct sctp_association
*asoc
,
134 int sctp_rcv(struct sk_buff
*skb
);
135 int sctp_v4_err(struct sk_buff
*skb
, u32 info
);
136 int sctp_hash_endpoint(struct sctp_endpoint
*ep
);
137 void sctp_unhash_endpoint(struct sctp_endpoint
*);
138 struct sock
*sctp_err_lookup(struct net
*net
, int family
, struct sk_buff
*,
139 struct sctphdr
*, struct sctp_association
**,
140 struct sctp_transport
**);
141 void sctp_err_finish(struct sock
*, struct sctp_transport
*);
142 int sctp_udp_v4_err(struct sock
*sk
, struct sk_buff
*skb
);
143 int sctp_udp_v6_err(struct sock
*sk
, struct sk_buff
*skb
);
144 void sctp_icmp_frag_needed(struct sock
*, struct sctp_association
*,
145 struct sctp_transport
*t
, __u32 pmtu
);
146 void sctp_icmp_redirect(struct sock
*, struct sctp_transport
*,
148 void sctp_icmp_proto_unreachable(struct sock
*sk
,
149 struct sctp_association
*asoc
,
150 struct sctp_transport
*t
);
151 int sctp_transport_hashtable_init(void);
152 void sctp_transport_hashtable_destroy(void);
153 int sctp_hash_transport(struct sctp_transport
*t
);
154 void sctp_unhash_transport(struct sctp_transport
*t
);
155 struct sctp_transport
*sctp_addrs_lookup_transport(
157 const union sctp_addr
*laddr
,
158 const union sctp_addr
*paddr
,
160 struct sctp_transport
*sctp_epaddr_lookup_transport(
161 const struct sctp_endpoint
*ep
,
162 const union sctp_addr
*paddr
);
163 bool sctp_sk_bound_dev_eq(struct net
*net
, int bound_dev_if
, int dif
, int sdif
);
168 int __net_init
sctp_proc_init(struct net
*net
);
173 int sctp_offload_init(void);
176 * sctp/stream_sched.c
178 void sctp_sched_ops_init(void);
183 int sctp_send_reset_streams(struct sctp_association
*asoc
,
184 struct sctp_reset_streams
*params
);
185 int sctp_send_reset_assoc(struct sctp_association
*asoc
);
186 int sctp_send_add_streams(struct sctp_association
*asoc
,
187 struct sctp_add_streams
*params
);
190 * Module global variables
196 extern struct kmem_cache
*sctp_chunk_cachep __read_mostly
;
197 extern struct kmem_cache
*sctp_bucket_cachep __read_mostly
;
198 extern long sysctl_sctp_mem
[3];
199 extern int sysctl_sctp_rmem
[3];
200 extern int sysctl_sctp_wmem
[3];
203 * Section: Macros, externs, and inlines
206 /* SCTP SNMP MIB stats handlers */
207 #define SCTP_INC_STATS(net, field) SNMP_INC_STATS((net)->sctp.sctp_statistics, field)
208 #define __SCTP_INC_STATS(net, field) __SNMP_INC_STATS((net)->sctp.sctp_statistics, field)
209 #define SCTP_DEC_STATS(net, field) SNMP_DEC_STATS((net)->sctp.sctp_statistics, field)
211 /* sctp mib definitions */
214 SCTP_MIB_CURRESTAB
, /* CurrEstab */
215 SCTP_MIB_ACTIVEESTABS
, /* ActiveEstabs */
216 SCTP_MIB_PASSIVEESTABS
, /* PassiveEstabs */
217 SCTP_MIB_ABORTEDS
, /* Aborteds */
218 SCTP_MIB_SHUTDOWNS
, /* Shutdowns */
219 SCTP_MIB_OUTOFBLUES
, /* OutOfBlues */
220 SCTP_MIB_CHECKSUMERRORS
, /* ChecksumErrors */
221 SCTP_MIB_OUTCTRLCHUNKS
, /* OutCtrlChunks */
222 SCTP_MIB_OUTORDERCHUNKS
, /* OutOrderChunks */
223 SCTP_MIB_OUTUNORDERCHUNKS
, /* OutUnorderChunks */
224 SCTP_MIB_INCTRLCHUNKS
, /* InCtrlChunks */
225 SCTP_MIB_INORDERCHUNKS
, /* InOrderChunks */
226 SCTP_MIB_INUNORDERCHUNKS
, /* InUnorderChunks */
227 SCTP_MIB_FRAGUSRMSGS
, /* FragUsrMsgs */
228 SCTP_MIB_REASMUSRMSGS
, /* ReasmUsrMsgs */
229 SCTP_MIB_OUTSCTPPACKS
, /* OutSCTPPacks */
230 SCTP_MIB_INSCTPPACKS
, /* InSCTPPacks */
231 SCTP_MIB_T1_INIT_EXPIREDS
,
232 SCTP_MIB_T1_COOKIE_EXPIREDS
,
233 SCTP_MIB_T2_SHUTDOWN_EXPIREDS
,
234 SCTP_MIB_T3_RTX_EXPIREDS
,
235 SCTP_MIB_T4_RTO_EXPIREDS
,
236 SCTP_MIB_T5_SHUTDOWN_GUARD_EXPIREDS
,
237 SCTP_MIB_DELAY_SACK_EXPIREDS
,
238 SCTP_MIB_AUTOCLOSE_EXPIREDS
,
239 SCTP_MIB_T1_RETRANSMITS
,
240 SCTP_MIB_T3_RETRANSMITS
,
241 SCTP_MIB_PMTUD_RETRANSMITS
,
242 SCTP_MIB_FAST_RETRANSMITS
,
243 SCTP_MIB_IN_PKT_SOFTIRQ
,
244 SCTP_MIB_IN_PKT_BACKLOG
,
245 SCTP_MIB_IN_PKT_DISCARDS
,
246 SCTP_MIB_IN_DATA_CHUNK_DISCARDS
,
250 #define SCTP_MIB_MAX __SCTP_MIB_MAX
252 unsigned long mibs
[SCTP_MIB_MAX
];
255 /* helper function to track stats about max rto and related transport */
256 static inline void sctp_max_rto(struct sctp_association
*asoc
,
257 struct sctp_transport
*trans
)
259 if (asoc
->stats
.max_obs_rto
< (__u64
)trans
->rto
) {
260 asoc
->stats
.max_obs_rto
= trans
->rto
;
261 memset(&asoc
->stats
.obs_rto_ipaddr
, 0,
262 sizeof(struct sockaddr_storage
));
263 memcpy(&asoc
->stats
.obs_rto_ipaddr
, &trans
->ipaddr
,
264 trans
->af_specific
->sockaddr_len
);
269 * Macros for keeping a global reference of object allocations.
271 #ifdef CONFIG_SCTP_DBG_OBJCNT
273 extern atomic_t sctp_dbg_objcnt_sock
;
274 extern atomic_t sctp_dbg_objcnt_ep
;
275 extern atomic_t sctp_dbg_objcnt_assoc
;
276 extern atomic_t sctp_dbg_objcnt_transport
;
277 extern atomic_t sctp_dbg_objcnt_chunk
;
278 extern atomic_t sctp_dbg_objcnt_bind_addr
;
279 extern atomic_t sctp_dbg_objcnt_bind_bucket
;
280 extern atomic_t sctp_dbg_objcnt_addr
;
281 extern atomic_t sctp_dbg_objcnt_datamsg
;
282 extern atomic_t sctp_dbg_objcnt_keys
;
284 /* Macros to atomically increment/decrement objcnt counters. */
285 #define SCTP_DBG_OBJCNT_INC(name) \
286 atomic_inc(&sctp_dbg_objcnt_## name)
287 #define SCTP_DBG_OBJCNT_DEC(name) \
288 atomic_dec(&sctp_dbg_objcnt_## name)
289 #define SCTP_DBG_OBJCNT(name) \
290 atomic_t sctp_dbg_objcnt_## name = ATOMIC_INIT(0)
292 /* Macro to help create new entries in the global array of
295 #define SCTP_DBG_OBJCNT_ENTRY(name) \
296 {.label= #name, .counter= &sctp_dbg_objcnt_## name}
298 void sctp_dbg_objcnt_init(struct net
*);
302 #define SCTP_DBG_OBJCNT_INC(name)
303 #define SCTP_DBG_OBJCNT_DEC(name)
305 static inline void sctp_dbg_objcnt_init(struct net
*net
) { return; }
307 #endif /* CONFIG_SCTP_DBG_OBJCOUNT */
309 #if defined CONFIG_SYSCTL
310 void sctp_sysctl_register(void);
311 void sctp_sysctl_unregister(void);
312 int sctp_sysctl_net_register(struct net
*net
);
313 void sctp_sysctl_net_unregister(struct net
*net
);
315 static inline void sctp_sysctl_register(void) { return; }
316 static inline void sctp_sysctl_unregister(void) { return; }
317 static inline int sctp_sysctl_net_register(struct net
*net
) { return 0; }
318 static inline void sctp_sysctl_net_unregister(struct net
*net
) { return; }
321 /* Size of Supported Address Parameter for 'x' address types. */
322 #define SCTP_SAT_LEN(x) (sizeof(struct sctp_paramhdr) + (x) * sizeof(__u16))
324 #if IS_ENABLED(CONFIG_IPV6)
326 void sctp_v6_pf_init(void);
327 void sctp_v6_pf_exit(void);
328 int sctp_v6_protosw_init(void);
329 void sctp_v6_protosw_exit(void);
330 int sctp_v6_add_protocol(void);
331 void sctp_v6_del_protocol(void);
333 #else /* #ifdef defined(CONFIG_IPV6) */
335 static inline void sctp_v6_pf_init(void) { return; }
336 static inline void sctp_v6_pf_exit(void) { return; }
337 static inline int sctp_v6_protosw_init(void) { return 0; }
338 static inline void sctp_v6_protosw_exit(void) { return; }
339 static inline int sctp_v6_add_protocol(void) { return 0; }
340 static inline void sctp_v6_del_protocol(void) { return; }
342 #endif /* #if defined(CONFIG_IPV6) */
345 /* Map an association to an assoc_id. */
346 static inline sctp_assoc_t
sctp_assoc2id(const struct sctp_association
*asoc
)
348 return asoc
? asoc
->assoc_id
: 0;
351 static inline enum sctp_sstat_state
352 sctp_assoc_to_state(const struct sctp_association
*asoc
)
354 /* SCTP's uapi always had SCTP_EMPTY(=0) as a dummy state, but we
355 * got rid of it in kernel space. Therefore SCTP_CLOSED et al
356 * start at =1 in user space, but actually as =0 in kernel space.
357 * Now that we can not break user space and SCTP_EMPTY is exposed
358 * there, we need to fix it up with an ugly offset not to break
361 return asoc
->state
+ 1;
364 /* Look up the association by its id. */
365 struct sctp_association
*sctp_id2assoc(struct sock
*sk
, sctp_assoc_t id
);
367 int sctp_do_peeloff(struct sock
*sk
, sctp_assoc_t id
, struct socket
**sockp
);
369 /* A macro to walk a list of skbs. */
370 #define sctp_skb_for_each(pos, head, tmp) \
371 skb_queue_walk_safe(head, pos, tmp)
374 * sctp_list_dequeue - remove from the head of the queue
375 * @list: list to dequeue from
377 * Remove the head of the list. The head item is
378 * returned or %NULL if the list is empty.
381 static inline struct list_head
*sctp_list_dequeue(struct list_head
*list
)
383 struct list_head
*result
= NULL
;
385 if (!list_empty(list
)) {
387 list_del_init(result
);
392 /* SCTP version of skb_set_owner_r. We need this one because
393 * of the way we have to do receive buffer accounting on bundled
396 static inline void sctp_skb_set_owner_r(struct sk_buff
*skb
, struct sock
*sk
)
398 struct sctp_ulpevent
*event
= sctp_skb2event(skb
);
402 skb
->destructor
= sctp_sock_rfree
;
403 atomic_add(event
->rmem_len
, &sk
->sk_rmem_alloc
);
405 * This mimics the behavior of skb_set_owner_r
407 sk_mem_charge(sk
, event
->rmem_len
);
410 /* Tests if the list has one and only one entry. */
411 static inline int sctp_list_single_entry(struct list_head
*head
)
413 return list_is_singular(head
);
416 static inline bool sctp_chunk_pending(const struct sctp_chunk
*chunk
)
418 return !list_empty(&chunk
->list
);
421 /* Walk through a list of TLV parameters. Don't trust the
422 * individual parameter lengths and instead depend on
423 * the chunk length to indicate when to stop. Make sure
424 * there is room for a param header too.
426 #define sctp_walk_params(pos, chunk)\
427 _sctp_walk_params((pos), (chunk), ntohs((chunk)->chunk_hdr.length))
429 #define _sctp_walk_params(pos, chunk, end)\
430 for (pos.v = (u8 *)(chunk + 1);\
431 (pos.v + offsetof(struct sctp_paramhdr, length) + sizeof(pos.p->length) <=\
432 (void *)chunk + end) &&\
433 pos.v <= (void *)chunk + end - ntohs(pos.p->length) &&\
434 ntohs(pos.p->length) >= sizeof(struct sctp_paramhdr);\
435 pos.v += SCTP_PAD4(ntohs(pos.p->length)))
437 #define sctp_walk_errors(err, chunk_hdr)\
438 _sctp_walk_errors((err), (chunk_hdr), ntohs((chunk_hdr)->length))
440 #define _sctp_walk_errors(err, chunk_hdr, end)\
441 for (err = (struct sctp_errhdr *)((void *)chunk_hdr + \
442 sizeof(struct sctp_chunkhdr));\
443 ((void *)err + offsetof(struct sctp_errhdr, length) + sizeof(err->length) <=\
444 (void *)chunk_hdr + end) &&\
445 (void *)err <= (void *)chunk_hdr + end - ntohs(err->length) &&\
446 ntohs(err->length) >= sizeof(struct sctp_errhdr); \
447 err = (struct sctp_errhdr *)((void *)err + SCTP_PAD4(ntohs(err->length))))
449 #define sctp_walk_fwdtsn(pos, chunk)\
450 _sctp_walk_fwdtsn((pos), (chunk), ntohs((chunk)->chunk_hdr->length) - sizeof(struct sctp_fwdtsn_chunk))
452 #define _sctp_walk_fwdtsn(pos, chunk, end)\
453 for (pos = (void *)(chunk->subh.fwdtsn_hdr + 1);\
454 (void *)pos <= (void *)(chunk->subh.fwdtsn_hdr + 1) + end - sizeof(struct sctp_fwdtsn_skip);\
457 /* External references. */
459 extern struct proto sctp_prot
;
460 extern struct proto sctpv6_prot
;
461 void sctp_put_port(struct sock
*sk
);
463 extern struct idr sctp_assocs_id
;
464 extern spinlock_t sctp_assocs_id_lock
;
466 /* Static inline functions. */
468 /* Convert from an IP version number to an Address Family symbol. */
469 static inline int ipver2af(__u8 ipver
)
481 /* Convert from an address parameter type to an address family. */
482 static inline int param_type2af(__be16 type
)
485 case SCTP_PARAM_IPV4_ADDRESS
:
487 case SCTP_PARAM_IPV6_ADDRESS
:
494 /* Warning: The following hash functions assume a power of two 'size'. */
495 /* This is the hash function for the SCTP port hash table. */
496 static inline int sctp_phashfn(struct net
*net
, __u16 lport
)
498 return (net_hash_mix(net
) + lport
) & (sctp_port_hashsize
- 1);
501 /* This is the hash function for the endpoint hash table. */
502 static inline int sctp_ep_hashfn(struct net
*net
, __u16 lport
)
504 return (net_hash_mix(net
) + lport
) & (sctp_ep_hashsize
- 1);
507 #define sctp_for_each_hentry(ep, head) \
508 hlist_for_each_entry(ep, head, node)
510 /* Is a socket of this style? */
511 #define sctp_style(sk, style) __sctp_style((sk), (SCTP_SOCKET_##style))
512 static inline int __sctp_style(const struct sock
*sk
,
513 enum sctp_socket_type style
)
515 return sctp_sk(sk
)->type
== style
;
518 /* Is the association in this state? */
519 #define sctp_state(asoc, state) __sctp_state((asoc), (SCTP_STATE_##state))
520 static inline int __sctp_state(const struct sctp_association
*asoc
,
521 enum sctp_state state
)
523 return asoc
->state
== state
;
526 /* Is the socket in this state? */
527 #define sctp_sstate(sk, state) __sctp_sstate((sk), (SCTP_SS_##state))
528 static inline int __sctp_sstate(const struct sock
*sk
,
529 enum sctp_sock_state state
)
531 return sk
->sk_state
== state
;
534 /* Map v4-mapped v6 address back to v4 address */
535 static inline void sctp_v6_map_v4(union sctp_addr
*addr
)
537 addr
->v4
.sin_family
= AF_INET
;
538 addr
->v4
.sin_port
= addr
->v6
.sin6_port
;
539 addr
->v4
.sin_addr
.s_addr
= addr
->v6
.sin6_addr
.s6_addr32
[3];
542 /* Map v4 address to v4-mapped v6 address */
543 static inline void sctp_v4_map_v6(union sctp_addr
*addr
)
547 port
= addr
->v4
.sin_port
;
548 addr
->v6
.sin6_addr
.s6_addr32
[3] = addr
->v4
.sin_addr
.s_addr
;
549 addr
->v6
.sin6_port
= port
;
550 addr
->v6
.sin6_family
= AF_INET6
;
551 addr
->v6
.sin6_flowinfo
= 0;
552 addr
->v6
.sin6_scope_id
= 0;
553 addr
->v6
.sin6_addr
.s6_addr32
[0] = 0;
554 addr
->v6
.sin6_addr
.s6_addr32
[1] = 0;
555 addr
->v6
.sin6_addr
.s6_addr32
[2] = htonl(0x0000ffff);
558 /* The cookie is always 0 since this is how it's used in the
561 static inline struct dst_entry
*sctp_transport_dst_check(struct sctp_transport
*t
)
563 if (t
->dst
&& !dst_check(t
->dst
, t
->dst_cookie
))
564 sctp_transport_dst_release(t
);
569 /* Calculate max payload size given a MTU, or the total overhead if
572 static inline __u32
__sctp_mtu_payload(const struct sctp_sock
*sp
,
573 const struct sctp_transport
*t
,
574 __u32 mtu
, __u32 extra
)
576 __u32 overhead
= sizeof(struct sctphdr
) + extra
;
579 overhead
+= sp
->pf
->af
->net_header_len
;
580 if (sp
->udp_port
&& (!t
|| t
->encap_port
))
581 overhead
+= sizeof(struct udphdr
);
583 overhead
+= sizeof(struct ipv6hdr
);
586 if (WARN_ON_ONCE(mtu
&& mtu
<= overhead
))
589 return mtu
? mtu
- overhead
: overhead
;
592 static inline __u32
sctp_mtu_payload(const struct sctp_sock
*sp
,
593 __u32 mtu
, __u32 extra
)
595 return __sctp_mtu_payload(sp
, NULL
, mtu
, extra
);
598 static inline __u32
sctp_dst_mtu(const struct dst_entry
*dst
)
600 return SCTP_TRUNC4(max_t(__u32
, dst_mtu(dst
),
601 SCTP_DEFAULT_MINSEGMENT
));
604 static inline bool sctp_transport_pmtu_check(struct sctp_transport
*t
)
606 __u32 pmtu
= sctp_dst_mtu(t
->dst
);
608 if (t
->pathmtu
== pmtu
)
616 static inline __u32
sctp_min_frag_point(struct sctp_sock
*sp
, __u16 datasize
)
618 return sctp_mtu_payload(sp
, SCTP_DEFAULT_MINSEGMENT
, datasize
);
621 static inline int sctp_transport_pl_hlen(struct sctp_transport
*t
)
623 return __sctp_mtu_payload(sctp_sk(t
->asoc
->base
.sk
), t
, 0, 0) -
624 sizeof(struct sctphdr
);
627 static inline void sctp_transport_pl_reset(struct sctp_transport
*t
)
629 if (t
->probe_interval
&& (t
->param_flags
& SPP_PMTUD_ENABLE
) &&
630 (t
->state
== SCTP_ACTIVE
|| t
->state
== SCTP_UNKNOWN
)) {
631 if (t
->pl
.state
== SCTP_PL_DISABLED
) {
632 t
->pl
.state
= SCTP_PL_BASE
;
633 t
->pl
.pmtu
= SCTP_BASE_PLPMTU
;
634 t
->pl
.probe_size
= SCTP_BASE_PLPMTU
;
635 sctp_transport_reset_probe_timer(t
);
638 if (t
->pl
.state
!= SCTP_PL_DISABLED
) {
639 if (del_timer(&t
->probe_timer
))
640 sctp_transport_put(t
);
641 t
->pl
.state
= SCTP_PL_DISABLED
;
646 static inline void sctp_transport_pl_update(struct sctp_transport
*t
)
648 if (t
->pl
.state
== SCTP_PL_DISABLED
)
651 t
->pl
.state
= SCTP_PL_BASE
;
652 t
->pl
.pmtu
= SCTP_BASE_PLPMTU
;
653 t
->pl
.probe_size
= SCTP_BASE_PLPMTU
;
654 sctp_transport_reset_probe_timer(t
);
657 static inline bool sctp_transport_pl_enabled(struct sctp_transport
*t
)
659 return t
->pl
.state
!= SCTP_PL_DISABLED
;
662 static inline bool sctp_newsk_ready(const struct sock
*sk
)
664 return sock_flag(sk
, SOCK_DEAD
) || sk
->sk_socket
;
667 static inline void sctp_sock_set_nodelay(struct sock
*sk
)
670 sctp_sk(sk
)->nodelay
= true;
674 #endif /* __net_sctp_h__ */