18c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/*- 28c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved. 3ecc6b8c25a7e8d9d2b78889e88224354a1cc3160tuexen * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved. 4ecc6b8c25a7e8d9d2b78889e88224354a1cc3160tuexen * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved. 58c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * 68c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * Redistribution and use in source and binary forms, with or without 78c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * modification, are permitted provided that the following conditions are met: 88c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * 98c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * a) Redistributions of source code must retain the above copyright notice, 100ac02f34d6041cd0018437596a5a9a94685e6919tuexen * this list of conditions and the following disclaimer. 118c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * 128c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * b) Redistributions in binary form must reproduce the above copyright 138c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * notice, this list of conditions and the following disclaimer in 140ac02f34d6041cd0018437596a5a9a94685e6919tuexen * the documentation and/or other materials provided with the distribution. 158c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * 168c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * c) Neither the name of Cisco Systems, Inc. nor the names of its 178c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * contributors may be used to endorse or promote products derived 188c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * from this software without specific prior written permission. 198c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * 208c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 218c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 228c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 238c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 248c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 258c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 268c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 278c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 288c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 298c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 308c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * THE POSSIBILITY OF SUCH DAMAGE. 318c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 328c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 338c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#ifdef __FreeBSD__ 348c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <sys/cdefs.h> 35290e3870bdc4b436f18bfe30e6c243205fc29702t__FBSDID("$FreeBSD: head/sys/netinet/sctputil.h 269376 2014-08-01 12:42:37Z tuexen $"); 368c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 378c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 38ecc6b8c25a7e8d9d2b78889e88224354a1cc3160tuexen#ifndef _NETINET_SCTP_UTIL_H_ 39ecc6b8c25a7e8d9d2b78889e88224354a1cc3160tuexen#define _NETINET_SCTP_UTIL_H_ 408c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 418c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if defined(_KERNEL) || defined(__Userspace__) 428c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 438c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_READ_LOCK_HELD 1 448c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_READ_LOCK_NOT_HELD 0 458c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 468c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#ifdef SCTP_ASOCLOG_OF_TSNS 478c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid sctp_print_out_track_log(struct sctp_tcb *stcb); 488c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 498c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 508c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#ifdef SCTP_MBUF_LOGGING 518c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct mbuf *sctp_m_free(struct mbuf *m); 528c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid sctp_m_freem(struct mbuf *m); 538c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#else 548c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define sctp_m_free m_free 558c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define sctp_m_freem m_freem 568c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 578c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 588c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if defined(SCTP_LOCAL_TRACE_BUF) || defined(__APPLE__) 598c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid 608c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexensctp_log_trace(uint32_t fr, const char *str SCTP_UNUSED, uint32_t a, uint32_t b, uint32_t c, uint32_t d, uint32_t e, uint32_t f); 618c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 628c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 638c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define sctp_get_associd(stcb) ((sctp_assoc_t)stcb->asoc.assoc_id) 648c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 658c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 668c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* 678c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * Function prototypes 688c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 698c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenuint32_t 708c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexensctp_get_ifa_hash_val(struct sockaddr *addr); 718c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 728c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_ifa * 738c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexensctp_find_ifa_in_ep(struct sctp_inpcb *inp, struct sockaddr *addr, int hold_lock); 748c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 758c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_ifa * 768c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexensctp_find_ifa_by_addr(struct sockaddr *addr, uint32_t vrf_id, int holds_lock); 778c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 788c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenuint32_t sctp_select_initial_TSN(struct sctp_pcb *); 798c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 808c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenuint32_t sctp_select_a_tag(struct sctp_inpcb *, uint16_t lport, uint16_t rport, int); 818c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 828c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenint sctp_init_asoc(struct sctp_inpcb *, struct sctp_tcb *, uint32_t, uint32_t); 838c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 848c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid sctp_fill_random_store(struct sctp_pcb *); 858c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 868c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid 87ecc6b8c25a7e8d9d2b78889e88224354a1cc3160tuexensctp_notify_stream_reset_add(struct sctp_tcb *stcb, uint16_t numberin, 88c2352ecab1d9ed208f1d33f5dc0088689b2f210etuexen uint16_t numberout, int flag); 89c2352ecab1d9ed208f1d33f5dc0088689b2f210etuexenvoid 90c2352ecab1d9ed208f1d33f5dc0088689b2f210etuexensctp_notify_stream_reset_tsn(struct sctp_tcb *stcb, uint32_t sending_tsn, uint32_t recv_tsn, int flag); 91c2352ecab1d9ed208f1d33f5dc0088689b2f210etuexen 92c2352ecab1d9ed208f1d33f5dc0088689b2f210etuexenvoid 938c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexensctp_timer_start(int, struct sctp_inpcb *, struct sctp_tcb *, 948c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_nets *); 958c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 968c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid 978c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexensctp_timer_stop(int, struct sctp_inpcb *, struct sctp_tcb *, 988c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_nets *, uint32_t); 998c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1008c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenint 1018c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexensctp_dynamic_set_primary(struct sockaddr *sa, uint32_t vrf_id); 1028c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1038c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid 1048c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexensctp_mtu_size_reset(struct sctp_inpcb *, struct sctp_association *, uint32_t); 1058c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1068c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid 1078c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexensctp_add_to_readq(struct sctp_inpcb *inp, 1088c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_tcb *stcb, 1098c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_queued_to_read *control, 1108c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sockbuf *sb, 1118c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int end, 1128c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int inpread_locked, 1138c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int so_locked 1148c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 1158c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen SCTP_UNUSED 1168c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 1178c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen ); 1188c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1198c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenint 1208c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexensctp_append_to_readq(struct sctp_inpcb *inp, 1218c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_tcb *stcb, 1228c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_queued_to_read *control, 1238c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct mbuf *m, 1248c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int end, 1258c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int new_cumack, 1268c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sockbuf *sb); 1278c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1288c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1298c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid sctp_iterator_worker(void); 1308c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1318c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenuint32_t sctp_get_prev_mtu(uint32_t); 1320ac02f34d6041cd0018437596a5a9a94685e6919tuexenuint32_t sctp_get_next_mtu(uint32_t); 1338c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1348c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid 1358c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexensctp_timeout_handler(void *); 1368c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1378c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenuint32_t 1388c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexensctp_calculate_rto(struct sctp_tcb *, struct sctp_association *, 1398c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_nets *, struct timeval *, int, int); 1408c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1418c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenuint32_t sctp_calculate_len(struct mbuf *); 1428c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1438c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexencaddr_t sctp_m_getptr(struct mbuf *, int, int, uint8_t *); 1448c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1458c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_paramhdr * 1468c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexensctp_get_next_param(struct mbuf *, int, 1478c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_paramhdr *, int); 1488c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 149290e3870bdc4b436f18bfe30e6c243205fc29702tstruct mbuf * 150290e3870bdc4b436f18bfe30e6c243205fc29702tsctp_add_pad_tombuf(struct mbuf *, int); 1518c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 152290e3870bdc4b436f18bfe30e6c243205fc29702tstruct mbuf * 153290e3870bdc4b436f18bfe30e6c243205fc29702tsctp_pad_lastmbuf(struct mbuf *, int, struct mbuf *); 1548c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1558c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid sctp_ulp_notify(uint32_t, struct sctp_tcb *, uint32_t, void *, int 1568c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 1578c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen SCTP_UNUSED 1588c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 1598c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen ); 1608c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1618c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid 1628c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexensctp_pull_off_control_to_new_inp(struct sctp_inpcb *old_inp, 1638c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_inpcb *new_inp, 1648c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_tcb *stcb, int waitflags); 1658c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1668c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1678c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid sctp_stop_timers_for_shutdown(struct sctp_tcb *); 1688c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 16947674b651417d493ff4e0318113fd7beeef119dbtuexenvoid sctp_report_all_outbound(struct sctp_tcb *, uint16_t, int, int 1708c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 1718c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen SCTP_UNUSED 1728c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 1738c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen ); 1748c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1758c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenint sctp_expand_mapping_array(struct sctp_association *, uint32_t); 1768c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 17747674b651417d493ff4e0318113fd7beeef119dbtuexenvoid sctp_abort_notification(struct sctp_tcb *, uint8_t, uint16_t, 17847674b651417d493ff4e0318113fd7beeef119dbtuexen struct sctp_abort_chunk *, int 1798c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 1808c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen SCTP_UNUSED 1818c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 1828c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen ); 1838c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1848c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* We abort responding to an IP packet for some reason */ 1858c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid 1866a646d8ad7f26691125adaa3a40cac21fbc1d81ftuexensctp_abort_association(struct sctp_inpcb *, struct sctp_tcb *, struct mbuf *, 187e056c2b95d882d42490e3cc86c7fbd6134c79b32tuexen int, struct sockaddr *, struct sockaddr *, 188e056c2b95d882d42490e3cc86c7fbd6134c79b32tuexen struct sctphdr *, struct mbuf *, 1896a646d8ad7f26691125adaa3a40cac21fbc1d81ftuexen#if defined(__FreeBSD__) 1906a646d8ad7f26691125adaa3a40cac21fbc1d81ftuexen uint8_t, uint32_t, 1916a646d8ad7f26691125adaa3a40cac21fbc1d81ftuexen#endif 1926a646d8ad7f26691125adaa3a40cac21fbc1d81ftuexen uint32_t, uint16_t); 1938c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1948c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1958c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* We choose to abort via user input */ 1968c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid 19747674b651417d493ff4e0318113fd7beeef119dbtuexensctp_abort_an_association(struct sctp_inpcb *, struct sctp_tcb *, 1988c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct mbuf *, int 1998c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 2008c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen SCTP_UNUSED 2018c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 2028c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen); 2038c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 204e056c2b95d882d42490e3cc86c7fbd6134c79b32tuexenvoid sctp_handle_ootb(struct mbuf *, int, int, 205e056c2b95d882d42490e3cc86c7fbd6134c79b32tuexen struct sockaddr *, struct sockaddr *, 206e056c2b95d882d42490e3cc86c7fbd6134c79b32tuexen struct sctphdr *, struct sctp_inpcb *, 2078f9e45fea288542b24a6bda01269c6fc184d991at struct mbuf *, 2086a646d8ad7f26691125adaa3a40cac21fbc1d81ftuexen#if defined(__FreeBSD__) 2096a646d8ad7f26691125adaa3a40cac21fbc1d81ftuexen uint8_t, uint32_t, 2106a646d8ad7f26691125adaa3a40cac21fbc1d81ftuexen#endif 2116a646d8ad7f26691125adaa3a40cac21fbc1d81ftuexen uint32_t, uint16_t); 2128c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 2138c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenint sctp_connectx_helper_add(struct sctp_tcb *stcb, struct sockaddr *addr, 2148c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int totaddr, int *error); 2158c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 2168c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_tcb * 2178c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexensctp_connectx_helper_find(struct sctp_inpcb *inp, struct sockaddr *addr, 2188c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int *totaddr, int *num_v4, int *num_v6, int *error, int limit, int *bad_addr); 2198c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 2208c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenint sctp_is_there_an_abort_here(struct mbuf *, int, uint32_t *); 2218c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#ifdef INET6 2228c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenuint32_t sctp_is_same_scope(struct sockaddr_in6 *, struct sockaddr_in6 *); 2238c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 2248c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if defined(SCTP_EMBEDDED_V6_SCOPE) 2258c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sockaddr_in6 * 2268c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexensctp_recover_scope(struct sockaddr_in6 *, struct sockaddr_in6 *); 2278c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 2288c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#ifdef SCTP_KAME 2298c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define sctp_recover_scope_mac(addr, store) do { \ 2308c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen if ((addr->sin6_family == AF_INET6) && \ 2318c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen (IN6_IS_SCOPE_LINKLOCAL(&addr->sin6_addr))) { \ 2328c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen *store = *addr; \ 2338c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen if (addr->sin6_scope_id == 0) { \ 2348c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen if (!sa6_recoverscope(store)) { \ 2358c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen addr = store; \ 2368c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen } \ 2378c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen } else { \ 2388c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen in6_clearscope(&addr->sin6_addr); \ 2398c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen addr = store; \ 2408c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen } \ 2418c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen } \ 2428c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen} while (0) 2438c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#else 2448c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define sctp_recover_scope_mac(addr, store) do { \ 245e2828360ea9cf8951730d46f5c14626c9425cb30t if ((addr->sin6_family == AF_INET6) && \ 246e2828360ea9cf8951730d46f5c14626c9425cb30t (IN6_IS_SCOPE_LINKLOCAL(&addr->sin6_addr))) { \ 2478c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen *store = *addr; \ 248e2828360ea9cf8951730d46f5c14626c9425cb30t if (addr->sin6_scope_id == 0) { \ 2498c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen if (!in6_recoverscope(store, &store->sin6_addr, \ 2508c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen NULL)) { \ 2518c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen addr = store; \ 2528c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen } \ 2538c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen } else { \ 2548c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen in6_clearscope(&addr->sin6_addr); \ 2558c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen addr = store; \ 2568c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen } \ 257e2828360ea9cf8951730d46f5c14626c9425cb30t } \ 2588c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen} while (0) 2598c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 2608c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 2618c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 2628c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 2638c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenint sctp_cmpaddr(struct sockaddr *, struct sockaddr *); 2648c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 2658c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid sctp_print_address(struct sockaddr *); 2668c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 2678c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenint 2688c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexensctp_release_pr_sctp_chunk(struct sctp_tcb *, struct sctp_tmit_chunk *, 26947674b651417d493ff4e0318113fd7beeef119dbtuexen uint8_t, int 2708c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if !defined(__APPLE__) && !defined(SCTP_SO_LOCK_TESTING) 2718c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen SCTP_UNUSED 2728c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 2738c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen); 2748c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 2758f9e45fea288542b24a6bda01269c6fc184d991atstruct mbuf *sctp_generate_cause(uint16_t, char *); 276a06ca64c1ea60031147a135d015c66e4803beb1ctstruct mbuf *sctp_generate_no_user_data_cause(uint32_t); 2778c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 2788c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid sctp_bindx_add_address(struct socket *so, struct sctp_inpcb *inp, 2798c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sockaddr *sa, sctp_assoc_t assoc_id, 2808c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t vrf_id, int *error, void *p); 2810ac02f34d6041cd0018437596a5a9a94685e6919tuexenvoid sctp_bindx_delete_address(struct sctp_inpcb *inp, 2828c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sockaddr *sa, sctp_assoc_t assoc_id, 2838c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t vrf_id, int *error); 2848c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 2858c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenint sctp_local_addr_count(struct sctp_tcb *stcb); 2868c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 2878c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#ifdef SCTP_MBCNT_LOGGING 2888c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid 2898c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexensctp_free_bufspace(struct sctp_tcb *, struct sctp_association *, 2908c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_tmit_chunk *, int); 2918c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 2928c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#else 2938c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define sctp_free_bufspace(stcb, asoc, tp1, chk_cnt) \ 2948c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexendo { \ 2958c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen if (tp1->data != NULL) { \ 296e2828360ea9cf8951730d46f5c14626c9425cb30t atomic_subtract_int(&((asoc)->chunks_on_out_queue), chk_cnt); \ 2978c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen if ((asoc)->total_output_queue_size >= tp1->book_size) { \ 2988c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen atomic_subtract_int(&((asoc)->total_output_queue_size), tp1->book_size); \ 2998c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen } else { \ 3008c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen (asoc)->total_output_queue_size = 0; \ 3018c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen } \ 302e2828360ea9cf8951730d46f5c14626c9425cb30t if (stcb->sctp_socket && ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || \ 303e2828360ea9cf8951730d46f5c14626c9425cb30t (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL))) { \ 3048c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen if (stcb->sctp_socket->so_snd.sb_cc >= tp1->book_size) { \ 3058c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen atomic_subtract_int(&((stcb)->sctp_socket->so_snd.sb_cc), tp1->book_size); \ 3068c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen } else { \ 3078c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen stcb->sctp_socket->so_snd.sb_cc = 0; \ 3088c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen } \ 3098c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen } \ 310e2828360ea9cf8951730d46f5c14626c9425cb30t } \ 3118c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen} while (0) 3128c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 3138c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 3148c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 3158c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define sctp_free_spbufspace(stcb, asoc, sp) \ 3168c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexendo { \ 317e2828360ea9cf8951730d46f5c14626c9425cb30t if (sp->data != NULL) { \ 3188c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen if ((asoc)->total_output_queue_size >= sp->length) { \ 3198c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen atomic_subtract_int(&(asoc)->total_output_queue_size, sp->length); \ 3208c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen } else { \ 3218c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen (asoc)->total_output_queue_size = 0; \ 3228c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen } \ 323e2828360ea9cf8951730d46f5c14626c9425cb30t if (stcb->sctp_socket && ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || \ 324e2828360ea9cf8951730d46f5c14626c9425cb30t (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL))) { \ 3258c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen if (stcb->sctp_socket->so_snd.sb_cc >= sp->length) { \ 3268c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen atomic_subtract_int(&stcb->sctp_socket->so_snd.sb_cc,sp->length); \ 3278c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen } else { \ 3288c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen stcb->sctp_socket->so_snd.sb_cc = 0; \ 3298c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen } \ 3308c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen } \ 331e2828360ea9cf8951730d46f5c14626c9425cb30t } \ 3328c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen} while (0) 3338c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 3348c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define sctp_snd_sb_alloc(stcb, sz) \ 3358c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexendo { \ 3368c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen atomic_add_int(&stcb->asoc.total_output_queue_size,sz); \ 3378c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen if ((stcb->sctp_socket != NULL) && \ 3388c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) || \ 3398c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL))) { \ 3408c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen atomic_add_int(&stcb->sctp_socket->so_snd.sb_cc,sz); \ 3418c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen } \ 3428c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen} while (0) 3438c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 3448c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* functions to start/stop udp tunneling */ 345b7a28211ba99e7b9116f93a0ec2e3f27acaa8f72t#if defined(__APPLE__) || defined(__FreeBSD__) 3468c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid sctp_over_udp_stop(void); 3478c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenint sctp_over_udp_start(void); 3488c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 3498c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if defined(__Windows__) 3508c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid sctp_over_udp_restart(void); 3518c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 3528c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 3538c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenint 3548c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexensctp_soreceive(struct socket *so, struct sockaddr **psa, 3558c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct uio *uio, 3568c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct mbuf **mp0, 3578c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct mbuf **controlp, 3588c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int *flagsp); 3598c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 3608c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid 3618c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexensctp_misc_ints(uint8_t from, uint32_t a, uint32_t b, uint32_t c, uint32_t d); 3628c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 3638c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid 3648c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexensctp_wakeup_log(struct sctp_tcb *stcb, 3658c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t wake_cnt, int from); 3668c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 3678c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid sctp_log_strm_del_alt(struct sctp_tcb *stcb, uint32_t, uint16_t, uint16_t, int); 3688c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 3698c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid sctp_log_nagle_event(struct sctp_tcb *stcb, int action); 3708c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 3718c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 3728c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid 3738c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexensctp_log_mb(struct mbuf *m, int from); 3748c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 3758c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid 3768c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexensctp_sblog(struct sockbuf *sb, 3778c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_tcb *stcb, int from, int incr); 3788c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 3798c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid 3808c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexensctp_log_strm_del(struct sctp_queued_to_read *control, 3818c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_queued_to_read *poschk, 3828c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int from); 3838c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid sctp_log_cwnd(struct sctp_tcb *stcb, struct sctp_nets *, int, uint8_t); 3848c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid rto_logging(struct sctp_nets *net, int from); 3858c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 3868c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid sctp_log_closing(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int16_t loc); 3878c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 3888c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid sctp_log_lock(struct sctp_inpcb *inp, struct sctp_tcb *stcb, uint8_t from); 3898c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid sctp_log_maxburst(struct sctp_tcb *stcb, struct sctp_nets *, int, int, uint8_t); 3900ac02f34d6041cd0018437596a5a9a94685e6919tuexenvoid sctp_log_block(uint8_t, struct sctp_association *, int); 3918c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid sctp_log_rwnd(uint8_t, uint32_t, uint32_t, uint32_t); 3928c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid sctp_log_mbcnt(uint8_t, uint32_t, uint32_t, uint32_t, uint32_t); 3938c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid sctp_log_rwnd_set(uint8_t, uint32_t, uint32_t, uint32_t, uint32_t); 3948c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenint sctp_fill_stat_log(void *, size_t *); 3958c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid sctp_log_fr(uint32_t, uint32_t, uint32_t, int); 3968c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid sctp_log_sack(uint32_t, uint32_t, uint32_t, uint16_t, uint16_t, int); 3978c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid sctp_log_map(uint32_t, uint32_t, uint32_t, int); 3988c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid sctp_print_mapping_array(struct sctp_association *asoc); 3998c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid sctp_clr_stat_log(void); 4008c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 4018c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 4028c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#ifdef SCTP_AUDITING_ENABLED 4038c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid 4048c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexensctp_auditing(int, struct sctp_inpcb *, struct sctp_tcb *, 4058c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_nets *); 4068c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenvoid sctp_audit_log(uint8_t, uint8_t); 4078c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 4088c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 4098c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif /* _KERNEL */ 4108c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 411