18c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/*- 28c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * Copyright (c) 2001-2008, 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> 3520d5d287bff2075897105f85287230d55bdfa420t__FBSDID("$FreeBSD: head/sys/netinet/sctp_structs.h 269945 2014-08-13 15:50:16Z tuexen $"); 368c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 378c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 38ecc6b8c25a7e8d9d2b78889e88224354a1cc3160tuexen#ifndef _NETINET_SCTP_STRUCTS_H_ 39ecc6b8c25a7e8d9d2b78889e88224354a1cc3160tuexen#define _NETINET_SCTP_STRUCTS_H_ 408c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 418c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <netinet/sctp_os.h> 428c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <netinet/sctp_header.h> 438c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#include <netinet/sctp_auth.h> 448c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 458c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_timer { 468c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen sctp_os_timer_t timer; 478c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 488c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int type; 498c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 508c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * Depending on the timer type these will be setup and cast with the 518c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * appropriate entity. 528c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 538c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen void *ep; 548c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen void *tcb; 558c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen void *net; 568c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if defined(__FreeBSD__) && __FreeBSD_version >= 800000 578c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen void *vnet; 588c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 598c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 608c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* for sanity checking */ 618c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen void *self; 628c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t ticks; 638c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t stopped_from; 648c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 658c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 668c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 678c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_foo_stuff { 688c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_inpcb *inp; 698c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t lineno; 708c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t ticks; 718c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int updown; 728c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 738c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 748c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 758c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* 768c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * This is the information we track on each interface that we know about from 778c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * the distant end. 788c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 798c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenTAILQ_HEAD(sctpnetlisthead, sctp_nets); 808c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 818c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_stream_reset_list { 828c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen TAILQ_ENTRY(sctp_stream_reset_list) next_resp; 838c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t tsn; 84c1f5477d96c0c5178c74caad234035e534c37bdct uint32_t number_entries; 85c1f5477d96c0c5178c74caad234035e534c37bdct uint16_t list_of_streams[]; 868c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 878c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 888c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenTAILQ_HEAD(sctp_resethead, sctp_stream_reset_list); 898c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 908c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* 918c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * Users of the iterator need to malloc a iterator with a call to 928c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * sctp_initiate_iterator(inp_func, assoc_func, inp_func, pcb_flags, pcb_features, 938c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * asoc_state, void-ptr-arg, uint32-arg, end_func, inp); 948c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * 958c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * Use the following two defines if you don't care what pcb flags are on the EP 968c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * and/or you don't care what state the association is in. 978c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * 988c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * Note that if you specify an INP as the last argument then ONLY each 998c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * association of that single INP will be executed upon. Note that the pcb 1008c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * flags STILL apply so if the inp you specify has different pcb_flags then 1018c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * what you put in pcb_flags nothing will happen. use SCTP_PCB_ANY_FLAGS to 1028c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * assure the inp you specify gets treated. 1038c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 1048c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_PCB_ANY_FLAGS 0x00000000 1058c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_PCB_ANY_FEATURES 0x00000000 1068c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_ASOC_ANY_STATE 0x00000000 1078c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1088c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexentypedef void (*asoc_func) (struct sctp_inpcb *, struct sctp_tcb *, void *ptr, 1098c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t val); 1108c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexentypedef int (*inp_func) (struct sctp_inpcb *, void *ptr, uint32_t val); 1118c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexentypedef void (*end_func) (void *ptr, uint32_t val); 1128c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1138c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if defined(__FreeBSD__) && defined(SCTP_MCORE_INPUT) && defined(SMP) 1148c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* whats on the mcore control struct */ 1158c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_mcore_queue { 1168c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen TAILQ_ENTRY(sctp_mcore_queue) next; 1178c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if defined(__FreeBSD__) && __FreeBSD_version >= 801000 1188c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct vnet *vn; 1198c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 1208c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct mbuf *m; 1218c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int off; 1228c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int v6; 1238c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 1248c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1258c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenTAILQ_HEAD(sctp_mcore_qhead, sctp_mcore_queue); 1268c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1278c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_mcore_ctrl { 1288c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen SCTP_PROCESS_STRUCT thread_proc; 1298c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_mcore_qhead que; 1308c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct mtx core_mtx; 1318c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct mtx que_mtx; 1328c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int running; 1338c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int cpuid; 1348c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 1358c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1368c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1378c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 1388c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1398c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1408c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_iterator { 1418c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen TAILQ_ENTRY(sctp_iterator) sctp_nxt_itr; 1428c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if defined(__FreeBSD__) && __FreeBSD_version >= 801000 1438c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct vnet *vn; 1448c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 1458c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_timer tmr; 1468c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_inpcb *inp; /* current endpoint */ 1478c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_tcb *stcb; /* current* assoc */ 1488c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_inpcb *next_inp; /* special hook to skip to */ 1498c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen asoc_func function_assoc; /* per assoc function */ 1508c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen inp_func function_inp; /* per endpoint function */ 1518c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen inp_func function_inp_end; /* end INP function */ 1528c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen end_func function_atend; /* iterator completion function */ 1538c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen void *pointer; /* pointer for apply func to use */ 1548c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t val; /* value for apply func to use */ 1558c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t pcb_flags; /* endpoint flags being checked */ 1568c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t pcb_features; /* endpoint features being checked */ 1578c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t asoc_state; /* assoc state being checked */ 1588c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t iterator_flags; 1598c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t no_chunk_output; 1608c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t done_current_ep; 1618c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 1628c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* iterator_flags values */ 1638c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_ITERATOR_DO_ALL_INP 0x00000001 1648c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_ITERATOR_DO_SINGLE_INP 0x00000002 1658c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1668c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1678c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenTAILQ_HEAD(sctpiterators, sctp_iterator); 1688c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1698c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_copy_all { 1708c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_inpcb *inp; /* ep */ 1718c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct mbuf *m; 1728c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_sndrcvinfo sndrcv; 1738c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int sndlen; 1748c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int cnt_sent; 1758c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int cnt_failed; 1768c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 1778c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1788c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_asconf_iterator { 1798c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctpladdr list_of_work; 1808c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int cnt; 1818c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 1828c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1838c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct iterator_control { 1848c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if defined(__FreeBSD__) 1858c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct mtx ipi_iterator_wq_mtx; 1868c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct mtx it_mtx; 1878c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#elif defined(__APPLE__) 1888c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen lck_mtx_t *ipi_iterator_wq_mtx; 1898c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen lck_mtx_t *it_mtx; 1908c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#elif defined(SCTP_PROCESS_LEVEL_LOCKS) 1910612043f643c9b26245564c05defca64d472060etuexen#if defined(__Userspace__) 19208b01b0fde6a8fd8455be3184b44c9c2f1e2ccb4tuexen userland_mutex_t ipi_iterator_wq_mtx; 19381616c6a3e184f46276632dd15aa489cd06d94dftuexen userland_mutex_t it_mtx; 19481616c6a3e184f46276632dd15aa489cd06d94dftuexen userland_cond_t iterator_wakeup; 19581616c6a3e184f46276632dd15aa489cd06d94dftuexen#else 19608b01b0fde6a8fd8455be3184b44c9c2f1e2ccb4tuexen pthread_mutex_t ipi_iterator_wq_mtx; 1978c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen pthread_mutex_t it_mtx; 1988c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen pthread_cond_t iterator_wakeup; 19981616c6a3e184f46276632dd15aa489cd06d94dftuexen#endif 200000a5bac556b28e74e4e98c540f66b1743e9312dtuexen#elif defined(__Windows__) 2018c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct spinlock it_lock; 202000a5bac556b28e74e4e98c540f66b1743e9312dtuexen struct spinlock ipi_iterator_wq_lock; 2038c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen KEVENT iterator_wakeup[2]; 2048c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen PFILE_OBJECT iterator_thread_obj; 2058c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#else 2068c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen void *it_mtx; 207000a5bac556b28e74e4e98c540f66b1743e9312dtuexen#endif 2088c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if !defined(__Windows__) 20908b01b0fde6a8fd8455be3184b44c9c2f1e2ccb4tuexen#if !defined(__Userspace__) 2108c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen SCTP_PROCESS_STRUCT thread_proc; 21108b01b0fde6a8fd8455be3184b44c9c2f1e2ccb4tuexen#else 21208b01b0fde6a8fd8455be3184b44c9c2f1e2ccb4tuexen userland_thread_t thread_proc; 21308b01b0fde6a8fd8455be3184b44c9c2f1e2ccb4tuexen#endif 2148c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 2158c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctpiterators iteratorhead; 2168c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_iterator *cur_it; 2178c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t iterator_running; 2188c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t iterator_flags; 2198c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 2208c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if !defined(__FreeBSD__) 2218c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_ITERATOR_MUST_EXIT 0x00000001 2228c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_ITERATOR_EXITED 0x00000002 2238c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 2248c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_ITERATOR_STOP_CUR_IT 0x00000004 2258c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_ITERATOR_STOP_CUR_INP 0x00000008 2268c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 2278c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_net_route { 2288c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen sctp_rtentry_t *ro_rt; 2298c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if defined(__FreeBSD__) 2308c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if __FreeBSD_version >= 800000 2318c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen void *ro_lle; 2328c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 2338c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if __FreeBSD_version >= 900000 2348c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen void *ro_ia; 2358c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int ro_flags; 2368c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 2378c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 2388c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if defined(__APPLE__) 2397fbcb406549bdf370031d2ad5befb44e39b95ffft#if !defined(APPLE_LEOPARD) && !defined(APPLE_SNOWLEOPARD) && !defined(APPLE_LION) && !defined(APPLE_MOUNTAINLION) 2407fbcb406549bdf370031d2ad5befb44e39b95ffft struct ifaddr *ro_srcia; 2417fbcb406549bdf370031d2ad5befb44e39b95ffft#endif 2421ebe9fa737dc60b9cb716812477d62f9b4107f53tuexen#if !defined(APPLE_LEOPARD) 2438c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t ro_flags; 2448c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 2458c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 2468c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen union sctp_sockstore _l_addr; /* remote peer addr */ 2478c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_ifa *_s_addr; /* our selected src addr */ 2488c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 2498c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 2508c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct htcp { 2518c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t alpha; /* Fixed point arith, << 7 */ 2528c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t beta; /* Fixed point arith, << 7 */ 2538c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t modeswitch; /* Delay modeswitch until we had at least one congestion event */ 2548c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t last_cong; /* Time since last congestion event end */ 2558c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t undo_last_cong; 2568c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t bytes_acked; 2578c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t bytecount; 2588c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t minRTT; 2598c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t maxRTT; 2608c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 2618c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t undo_maxRTT; 2628c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t undo_old_maxB; 2638c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 2648c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* Bandwidth estimation */ 2658c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t minB; 2668c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t maxB; 2678c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t old_maxB; 2688c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t Bi; 2698c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t lasttime; 2708c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 2718c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 2728c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct rtcc_cc { 2738c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct timeval tls; /* The time we started the sending */ 2748c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint64_t lbw; /* Our last estimated bw */ 2758c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint64_t lbw_rtt; /* RTT at bw estimate */ 2768c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint64_t bw_bytes; /* The total bytes since this sending began */ 2778c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint64_t bw_tot_time; /* The total time since sending began */ 2788c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint64_t new_tot_time; /* temp holding the new value */ 2798c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint64_t bw_bytes_at_last_rttc; /* What bw_bytes was at last rtt calc */ 2808c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t cwnd_at_bw_set; /* Cwnd at last bw saved - lbw */ 2818c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t vol_reduce; /* cnt of voluntary reductions */ 2828c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t steady_step; /* The number required to be in steady state*/ 2838c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t step_cnt; /* The current number */ 2848c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t ret_from_eq; /* When all things are equal what do I return 0/1 - 1 no cc advance */ 2858c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t use_dccc_ecn; /* Flag to enable DCCC ECN */ 2868c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t tls_needs_set; /* Flag to indicate we need to set tls 0 or 1 means set at send 2 not */ 2878c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t last_step_state; /* Last state if steady state stepdown is on */ 2888c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t rtt_set_this_sack; /* Flag saying this sack had RTT calc on it */ 2898c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t last_inst_ind; /* Last saved inst indication */ 2908c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 2918c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 2928c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 2938c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_nets { 2948c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen TAILQ_ENTRY(sctp_nets) sctp_next; /* next link */ 2958c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 2968c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 2978c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * Things on the top half may be able to be split into a common 2988c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * structure shared by all. 2998c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 3008c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_timer pmtu_timer; 3018c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_timer hb_timer; 3028c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 3038c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 3048c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * The following two in combination equate to a route entry for v6 3058c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * or v4. 3068c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 3078c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_net_route ro; 3088c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 3098c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* mtu discovered so far */ 3108c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t mtu; 3118c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t ssthresh; /* not sure about this one for split */ 3128c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t last_cwr_tsn; 3138c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t cwr_window_tsn; 3148c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t ecn_ce_pkt_cnt; 3158c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t lost_cnt; 3168c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* smoothed average things for RTT and RTO itself */ 3178c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int lastsa; 3188c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int lastsv; 3198c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint64_t rtt; /* last measured rtt value in us */ 3208c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int RTO; 3218c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 3228c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* This is used for SHUTDOWN/SHUTDOWN-ACK/SEND or INIT timers */ 3238c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_timer rxt_timer; 3248c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 3258c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* last time in seconds I sent to it */ 3268c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct timeval last_sent_time; 3278c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen union cc_control_data { 3288c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct htcp htcp_ca; /* JRS - struct used in HTCP algorithm */ 3298c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct rtcc_cc rtcc; /* rtcc module cc stuff */ 3308c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen } cc_mod; 3318c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int ref_count; 3328c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 3338c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* Congestion stats per destination */ 3348c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 3358c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * flight size variables and such, sorry Vern, I could not avoid 3368c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * this if I wanted performance :> 3378c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 3388c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t flight_size; 3398c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t cwnd; /* actual cwnd */ 3408c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t prev_cwnd; /* cwnd before any processing */ 3418c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t ecn_prev_cwnd; /* ECN prev cwnd at first ecn_echo seen in new window */ 3428c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t partial_bytes_acked; /* in CA tracks when to incr a MTU */ 3438c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* tracking variables to avoid the aloc/free in sack processing */ 3448c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int net_ack; 3458c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int net_ack2; 3468c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 3478c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 3488c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * JRS - 5/8/07 - Variable to track last time 3498c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * a destination was active for CMT PF 3508c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 3518c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t last_active; 3528c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 3538c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 3548c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * CMT variables (iyengar@cis.udel.edu) 3558c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 3568c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t this_sack_highest_newack; /* tracks highest TSN newly 3578c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * acked for a given dest in 3588c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * the current SACK. Used in 3598c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * SFR and HTNA algos */ 3608c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t pseudo_cumack; /* CMT CUC algorithm. Maintains next expected 3618c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * pseudo-cumack for this destination */ 3628c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t rtx_pseudo_cumack; /* CMT CUC algorithm. Maintains next 3638c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * expected pseudo-cumack for this 3648c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * destination */ 3658c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 3668c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* CMT fast recovery variables */ 3678c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t fast_recovery_tsn; 3688c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t heartbeat_random1; 3698c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t heartbeat_random2; 3708c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#ifdef INET6 3718c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t flowlabel; 3728c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 3738c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t dscp; 3748c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 3758c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct timeval start_time; /* time when this net was created */ 3768c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t marked_retrans; /* number or DATA chunks marked for 3778c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen timer based retransmissions */ 3788c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t marked_fastretrans; 3798c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t heart_beat_delay; /* Heart Beat delay in ms */ 3808c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 3818c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* if this guy is ok or not ... status */ 3828c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t dest_state; 3838c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* number of timeouts to consider the destination unreachable */ 3848c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t failure_threshold; 3858c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* number of timeouts to consider the destination potentially failed */ 3868c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t pf_threshold; 3878c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* error stats on the destination */ 3888c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t error_count; 3898c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* UDP port number in case of UDP tunneling */ 3908c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t port; 391000a5bac556b28e74e4e98c540f66b1743e9312dtuexen 3928c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t fast_retran_loss_recovery; 3938c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t will_exit_fast_recovery; 3948c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* Flags that probably can be combined into dest_state */ 3958c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t fast_retran_ip; /* fast retransmit in progress */ 3968c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t hb_responded; 3978c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t saw_newack; /* CMT's SFR algorithm flag */ 3988c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t src_addr_selected; /* if we split we move */ 3998c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t indx_of_eligible_next_to_use; 4008c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t addr_is_local; /* its a local address (if known) could move 4018c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * in split */ 4028c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 4038c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 4048c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * CMT variables (iyengar@cis.udel.edu) 4058c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 4068c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t find_pseudo_cumack; /* CMT CUC algorithm. Flag used to 4078c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * find a new pseudocumack. This flag 4088c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * is set after a new pseudo-cumack 4098c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * has been received and indicates 4108c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * that the sender should find the 4118c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * next pseudo-cumack expected for 4128c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * this destination */ 4138c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t find_rtx_pseudo_cumack; /* CMT CUCv2 algorithm. Flag used to 4148c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * find a new rtx-pseudocumack. This 4158c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * flag is set after a new 4168c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * rtx-pseudo-cumack has been received 4178c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * and indicates that the sender 4188c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * should find the next 4198c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * rtx-pseudo-cumack expected for this 4208c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * destination */ 4218c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t new_pseudo_cumack; /* CMT CUC algorithm. Flag used to 4228c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * indicate if a new pseudo-cumack or 4238c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * rtx-pseudo-cumack has been received */ 4248c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t window_probe; /* Doing a window probe? */ 4258c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t RTO_measured; /* Have we done the first measure */ 4268c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t last_hs_used; /* index into the last HS table entry we used */ 4278c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t lan_type; 4288c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t rto_needed; 4298c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#if defined(__FreeBSD__) 4308c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t flowid; 4318c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#ifdef INVARIANTS 4328c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t flowidset; 4338c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 4348c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 4358c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 4368c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 4378c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 4388c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_data_chunkrec { 4398c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t TSN_seq; /* the TSN of this transmit */ 4408c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t stream_seq; /* the stream sequence number of this transmit */ 4418c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t stream_number; /* the stream number of this guy */ 4428c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t payloadtype; 4438c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t context; /* from send */ 4448c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t cwnd_at_send; 4458c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 4468c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * part of the Highest sacked algorithm to be able to stroke counts 4478c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * on ones that are FR'd. 4488c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 4498c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t fast_retran_tsn; /* sending_seq at the time of FR */ 4508c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct timeval timetodrop; /* time we drop it from queue */ 4518c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t doing_fast_retransmit; 4528c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t rcv_flags; /* flags pulled from data chunk on inbound for 4538c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * outbound holds sending flags for PR-SCTP. 4548c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 4558c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t state_flags; 4568c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t chunk_was_revoked; 4578c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t fwd_tsn_cnt; 4588c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 4598c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 4608c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenTAILQ_HEAD(sctpchunk_listhead, sctp_tmit_chunk); 4618c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 4628c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* The lower byte is used to enumerate PR_SCTP policies */ 4638c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define CHUNK_FLAGS_PR_SCTP_TTL SCTP_PR_SCTP_TTL 4648c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define CHUNK_FLAGS_PR_SCTP_BUF SCTP_PR_SCTP_BUF 4658c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define CHUNK_FLAGS_PR_SCTP_RTX SCTP_PR_SCTP_RTX 4668c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 467f7c60ba722b28a2b8a3cad6d795b96603c5ff240tuexen/* The upper byte is used as a bit mask */ 4688c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define CHUNK_FLAGS_FRAGMENT_OK 0x0100 4698c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 4708c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct chk_id { 4718c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t id; 4728c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t can_take_data; 4738c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 4748c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 4758c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 4768c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_tmit_chunk { 4778c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen union { 4788c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_data_chunkrec data; 4798c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct chk_id chunk_id; 4808c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen } rec; 4818c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_association *asoc; /* bp to asoc this belongs to */ 4828c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct timeval sent_rcv_time; /* filled in if RTT being calculated */ 4838c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct mbuf *data; /* pointer to mbuf chain of data */ 4848c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct mbuf *last_mbuf; /* pointer to last mbuf in chain */ 4858c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_nets *whoTo; 4868c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen TAILQ_ENTRY(sctp_tmit_chunk) sctp_next; /* next link */ 4878c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int32_t sent; /* the send status */ 4888c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t snd_count; /* number of times I sent */ 4898c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t flags; /* flags, such as FRAGMENT_OK */ 4908c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t send_size; 4918c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t book_size; 4928c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t mbcnt; 4938c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t auth_keyid; 4948c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t holds_key_ref; /* flag if auth keyid refcount is held */ 4958c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t pad_inplace; 4968c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t do_rtt; 4978c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t book_size_scale; 4988c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t no_fr_allowed; 4998c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t copy_by_ref; 5008c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t window_probe; 5018c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 5028c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 5038c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* 5048c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * The first part of this structure MUST be the entire sinfo structure. Maybe 5058c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * I should have made it a sub structure... we can circle back later and do 5068c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * that if we want. 5078c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 5088c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_queued_to_read { /* sinfo structure Pluse more */ 5098c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t sinfo_stream; /* off the wire */ 5108c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t sinfo_ssn; /* off the wire */ 5118c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t sinfo_flags; /* SCTP_UNORDERED from wire use SCTP_EOF for 5128c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * EOR */ 5138c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t sinfo_ppid; /* off the wire */ 5148c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t sinfo_context; /* pick this up from assoc def context? */ 5158c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t sinfo_timetolive; /* not used by kernel */ 5168c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t sinfo_tsn; /* Use this in reassembly as first TSN */ 5178c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t sinfo_cumtsn; /* Use this in reassembly as last TSN */ 5188c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen sctp_assoc_t sinfo_assoc_id; /* our assoc id */ 5198c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* Non sinfo stuff */ 5208c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t length; /* length of data */ 5218c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t held_length; /* length held in sb */ 5228c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_nets *whoFrom; /* where it came from */ 5238c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct mbuf *data; /* front of the mbuf chain of data with 5248c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * PKT_HDR */ 5258c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct mbuf *tail_mbuf; /* used for multi-part data */ 5268c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct mbuf *aux_data; /* used to hold/cache control if o/s does not take it from us */ 5278c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_tcb *stcb; /* assoc, used for window update */ 5288c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen TAILQ_ENTRY(sctp_queued_to_read) next; 5298c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t port_from; 5308c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t spec_flags; /* Flags to hold the notification field */ 5318c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t do_not_ref_stcb; 5328c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t end_added; 5338c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t pdapi_aborted; 5348c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t some_taken; 5358c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 5368c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 5378c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* This data structure will be on the outbound 5388c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * stream queues. Data will be pulled off from 5398c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * the front of the mbuf data and chunk-ified 5408c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * by the output routines. We will custom 5418c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * fit every chunk we pull to the send/sent 5428c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * queue to make up the next full packet 5438c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * if we can. An entry cannot be removed 5448c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * from the stream_out queue until 5458c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * the msg_is_complete flag is set. This 5468c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * means at times data/tail_mbuf MIGHT 5478c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * be NULL.. If that occurs it happens 5488c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * for one of two reasons. Either the user 5498c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * is blocked on a send() call and has not 5508c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * awoken to copy more data down... OR 5518c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * the user is in the explict MSG_EOR mode 5528c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * and wrote some data, but has not completed 5538c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * sending. 5548c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 5558c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_stream_queue_pending { 5568c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct mbuf *data; 5578c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct mbuf *tail_mbuf; 5588c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct timeval ts; 5598c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_nets *net; 5608c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen TAILQ_ENTRY (sctp_stream_queue_pending) next; 5618c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen TAILQ_ENTRY (sctp_stream_queue_pending) ss_next; 5628c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t length; 5638c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t timetolive; 5648c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t ppid; 5658c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t context; 5668c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t sinfo_flags; 5678c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t stream; 5688c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t act_flags; 5698c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t auth_keyid; 5708c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t holds_key_ref; 5718c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t msg_is_complete; 5728c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t some_taken; 5738c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t sender_all_done; 5748c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t put_last_out; 5758c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t discard_rest; 5768c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 5778c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 5788c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* 5798c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * this struct contains info that is used to track inbound stream data and 5808c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * help with ordering. 5818c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 5828c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenTAILQ_HEAD(sctpwheelunrel_listhead, sctp_stream_in); 5838c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_stream_in { 5848c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_readhead inqueue; 5858c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t stream_no; 5868c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t last_sequence_delivered; /* used for re-order */ 5878c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t delivery_started; 5888c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 5898c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 5908c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenTAILQ_HEAD(sctpwheel_listhead, sctp_stream_out); 5918c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenTAILQ_HEAD(sctplist_listhead, sctp_stream_queue_pending); 5928c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 5938c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* Round-robin schedulers */ 5948c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct ss_rr { 5958c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* next link in wheel */ 5968c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen TAILQ_ENTRY(sctp_stream_out) next_spoke; 5978c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 5988c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 5998c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* Priority scheduler */ 6008c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct ss_prio { 6018c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* next link in wheel */ 6028c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen TAILQ_ENTRY(sctp_stream_out) next_spoke; 6038c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* priority id */ 6048c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t priority; 6058c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 6068c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 6078c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* Fair Bandwidth scheduler */ 6088c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct ss_fb { 6098c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* next link in wheel */ 6108c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen TAILQ_ENTRY(sctp_stream_out) next_spoke; 6118c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* stores message size */ 6128c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int32_t rounds; 6138c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 6148c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 6158c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* 6168c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * This union holds all data necessary for 6178c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * different stream schedulers. 6188c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 6198c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenunion scheduling_data { 6208c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctpwheel_listhead out_wheel; 6218c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctplist_listhead out_list; 6228c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 6238c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 6248c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* 6258c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * This union holds all parameters per stream 6268c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * necessary for different stream schedulers. 6278c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 6288c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenunion scheduling_parameters { 6298c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct ss_rr rr; 6308c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct ss_prio prio; 6318c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct ss_fb fb; 6328c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 6338c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 6348c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* This struct is used to track the traffic on outbound streams */ 6358c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_stream_out { 6368c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_streamhead outqueue; 6378c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen union scheduling_parameters ss_params; 638446be8e8a472f6e688885674d2430118fc4be5d7t uint32_t chunks_on_queues; 63920d5d287bff2075897105f85287230d55bdfa420t#if defined(SCTP_DETAILED_STR_STATS) 64020d5d287bff2075897105f85287230d55bdfa420t uint32_t abandoned_unsent[SCTP_PR_SCTP_MAX + 1]; 64120d5d287bff2075897105f85287230d55bdfa420t uint32_t abandoned_sent[SCTP_PR_SCTP_MAX + 1]; 64220d5d287bff2075897105f85287230d55bdfa420t#else 64320d5d287bff2075897105f85287230d55bdfa420t /* Only the aggregation */ 64420d5d287bff2075897105f85287230d55bdfa420t uint32_t abandoned_unsent[1]; 64520d5d287bff2075897105f85287230d55bdfa420t uint32_t abandoned_sent[1]; 64620d5d287bff2075897105f85287230d55bdfa420t#endif 6478c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t stream_no; 648e5a3ccc4bb0971ef33da073d15fd0fc1ccaa3c01t uint16_t next_sequence_send; /* next one I expect to send out */ 649e5a3ccc4bb0971ef33da073d15fd0fc1ccaa3c01t uint8_t last_msg_incomplete; 6508c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 6518c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 6528c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* used to keep track of the addresses yet to try to add/delete */ 6538c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenTAILQ_HEAD(sctp_asconf_addrhead, sctp_asconf_addr); 6548c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_asconf_addr { 6558c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen TAILQ_ENTRY(sctp_asconf_addr) next; 6568c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_asconf_addr_param ap; 6578c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_ifa *ifa; /* save the ifa for add/del ip */ 6588c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t sent; /* has this been sent yet? */ 6598c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t special_del; /* not to be used in lookup */ 6608c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 6618c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 6628c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_scoping { 6638c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t ipv4_addr_legal; 6648c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t ipv6_addr_legal; 6657988ea8f0c067cf3757e798b473b1ae4d34b6dfdt#if defined(__Userspace__) 6667988ea8f0c067cf3757e798b473b1ae4d34b6dfdt uint8_t conn_addr_legal; 6677988ea8f0c067cf3757e798b473b1ae4d34b6dfdt#endif 6688c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t loopback_scope; 6698c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t ipv4_local_scope; 6708c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t local_scope; 6718c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t site_scope; 6728c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 6738c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 6748c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_TSN_LOG_SIZE 40 6758c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 6768c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_tsn_log { 6778c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen void *stcb; 6788c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t tsn; 6798c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t strm; 6808c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t seq; 6818c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t sz; 6828c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t flgs; 6838c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t in_pos; 6848c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t in_out; 6858c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 6868c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 6878c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#define SCTP_FS_SPEC_LOG_SIZE 200 6888c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_fs_spec_log { 6898c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t sent; 6908c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t total_flight; 6918c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t tsn; 6928c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t book; 6938c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t incr; 6948c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t decr; 6958c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 6968c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 6978c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* This struct is here to cut out the compatiabilty 6988c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * pad that bulks up both the inp and stcb. The non 6998c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * pad portion MUST stay in complete sync with 7008c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * sctp_sndrcvinfo... i.e. if sinfo_xxxx is added 7018c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * this must be done here too. 7028c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 7038c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_nonpad_sndrcvinfo { 7048c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t sinfo_stream; 7058c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t sinfo_ssn; 7068c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t sinfo_flags; 7078c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t sinfo_ppid; 7088c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t sinfo_context; 7098c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t sinfo_timetolive; 7108c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t sinfo_tsn; 7118c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t sinfo_cumtsn; 7128c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen sctp_assoc_t sinfo_assoc_id; 7138c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t sinfo_keynumber; 7148c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t sinfo_keynumber_valid; 7158c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 7168c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7178c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* 7188c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * JRS - Structure to hold function pointers to the functions responsible 7198c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * for congestion control. 7208c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 7218c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7228c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_cc_functions { 7238c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen void (*sctp_set_initial_cc_param)(struct sctp_tcb *stcb, struct sctp_nets *net); 7248c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen void (*sctp_cwnd_update_after_sack)(struct sctp_tcb *stcb, 725e2828360ea9cf8951730d46f5c14626c9425cb30t struct sctp_association *asoc, 726e2828360ea9cf8951730d46f5c14626c9425cb30t int accum_moved ,int reneged_all, int will_exit); 7278c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen void (*sctp_cwnd_update_exit_pf)(struct sctp_tcb *stcb, struct sctp_nets *net); 7288c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen void (*sctp_cwnd_update_after_fr)(struct sctp_tcb *stcb, 7298c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_association *asoc); 7308c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen void (*sctp_cwnd_update_after_timeout)(struct sctp_tcb *stcb, 7318c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_nets *net); 7328c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen void (*sctp_cwnd_update_after_ecn_echo)(struct sctp_tcb *stcb, 7338c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_nets *net, int in_window, int num_pkt_lost); 7348c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen void (*sctp_cwnd_update_after_packet_dropped)(struct sctp_tcb *stcb, 7358c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_nets *net, struct sctp_pktdrop_chunk *cp, 7368c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t *bottle_bw, uint32_t *on_queue); 7378c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen void (*sctp_cwnd_update_after_output)(struct sctp_tcb *stcb, 7388c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_nets *net, int burst_limit); 739000a5bac556b28e74e4e98c540f66b1743e9312dtuexen void (*sctp_cwnd_update_packet_transmitted)(struct sctp_tcb *stcb, 7408c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_nets *net); 741000a5bac556b28e74e4e98c540f66b1743e9312dtuexen void (*sctp_cwnd_update_tsn_acknowledged)(struct sctp_nets *net, 7428c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_tmit_chunk *); 743000a5bac556b28e74e4e98c540f66b1743e9312dtuexen void (*sctp_cwnd_new_transmission_begins)(struct sctp_tcb *stcb, 7448c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_nets *net); 745000a5bac556b28e74e4e98c540f66b1743e9312dtuexen void (*sctp_cwnd_prepare_net_for_sack)(struct sctp_tcb *stcb, 7468c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_nets *net); 7478c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int (*sctp_cwnd_socket_option)(struct sctp_tcb *stcb, int set, struct sctp_cc_option *); 7488c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen void (*sctp_rtt_calculated)(struct sctp_tcb *, struct sctp_nets *, struct timeval *); 7498c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 7508c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7518c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* 7528c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * RS - Structure to hold function pointers to the functions responsible 7538c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * for stream scheduling. 7548c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 7558c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_ss_functions { 7568c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen void (*sctp_ss_init)(struct sctp_tcb *stcb, struct sctp_association *asoc, 7578c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int holds_lock); 7588c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen void (*sctp_ss_clear)(struct sctp_tcb *stcb, struct sctp_association *asoc, 7598c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int clear_values, int holds_lock); 7608c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen void (*sctp_ss_init_stream)(struct sctp_stream_out *strq, struct sctp_stream_out *with_strq); 7618c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen void (*sctp_ss_add_to_stream)(struct sctp_tcb *stcb, struct sctp_association *asoc, 7628c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_stream_out *strq, struct sctp_stream_queue_pending *sp, int holds_lock); 7638c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int (*sctp_ss_is_empty)(struct sctp_tcb *stcb, struct sctp_association *asoc); 7648c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen void (*sctp_ss_remove_from_stream)(struct sctp_tcb *stcb, struct sctp_association *asoc, 7658c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_stream_out *strq, struct sctp_stream_queue_pending *sp, int holds_lock); 7668c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_stream_out* (*sctp_ss_select_stream)(struct sctp_tcb *stcb, 7678c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_nets *net, struct sctp_association *asoc); 7688c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen void (*sctp_ss_scheduled)(struct sctp_tcb *stcb, struct sctp_nets *net, 7698c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_association *asoc, struct sctp_stream_out *strq, int moved_how_much); 7708c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen void (*sctp_ss_packet_done)(struct sctp_tcb *stcb, struct sctp_nets *net, 7718c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_association *asoc); 7728c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int (*sctp_ss_get_value)(struct sctp_tcb *stcb, struct sctp_association *asoc, 7738c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_stream_out *strq, uint16_t *value); 7748c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int (*sctp_ss_set_value)(struct sctp_tcb *stcb, struct sctp_association *asoc, 7758c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_stream_out *strq, uint16_t value); 7768c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 7778c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7788c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* used to save ASCONF chunks for retransmission */ 7798c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenTAILQ_HEAD(sctp_asconf_head, sctp_asconf); 7808c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_asconf { 7818c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen TAILQ_ENTRY(sctp_asconf) next; 7828c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t serial_number; 7838c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t snd_count; 7848c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct mbuf *data; 7858c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t len; 7868c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 7878c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7888c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* used to save ASCONF-ACK chunks for retransmission */ 7898c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenTAILQ_HEAD(sctp_asconf_ackhead, sctp_asconf_ack); 7908c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_asconf_ack { 7918c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen TAILQ_ENTRY(sctp_asconf_ack) next; 7928c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t serial_number; 7938c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_nets *last_sent_to; 7948c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct mbuf *data; 7958c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t len; 7968c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 7978c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 7988c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen/* 7998c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * Here we have information about each individual association that we track. 8008c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * We probably in production would be more dynamic. But for ease of 8018c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * implementation we will have a fixed array that we hunt for in a linear 8028c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * fashion. 8038c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 8048c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexenstruct sctp_association { 8058c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* association state */ 8068c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int state; 8078c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 8088c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* queue of pending addrs to add/delete */ 8098c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_asconf_addrhead asconf_queue; 8108c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 8118c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct timeval time_entered; /* time we entered state */ 8128c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct timeval time_last_rcvd; 8138c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct timeval time_last_sent; 8148c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct timeval time_last_sat_advance; 8158c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_nonpad_sndrcvinfo def_send; 8168c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 8178c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* timers and such */ 8188c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_timer dack_timer; /* Delayed ack timer */ 8198c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_timer asconf_timer; /* asconf */ 8208c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_timer strreset_timer; /* stream reset */ 8218c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_timer shut_guard_timer; /* shutdown guard */ 8228c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_timer autoclose_timer; /* automatic close timer */ 8238c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_timer delayed_event_timer; /* timer for delayed events */ 8248c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_timer delete_prim_timer; /* deleting primary dst */ 8258c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 8268c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* list of restricted local addresses */ 8278c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctpladdr sctp_restricted_addrs; 8288c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 8298c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* last local address pending deletion (waiting for an address add) */ 8308c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_ifa *asconf_addr_del_pending; 8318c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* Deleted primary destination (used to stop timer) */ 8328c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_nets *deleted_primary; 8338c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 8348c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctpnetlisthead nets; /* remote address list */ 8358c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 8368c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* Free chunk list */ 8378c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctpchunk_listhead free_chunks; 8388c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 8398c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* Control chunk queue */ 8408c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctpchunk_listhead control_send_queue; 8418c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 8428c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* ASCONF chunk queue */ 8438c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctpchunk_listhead asconf_send_queue; 8448c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 8458c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 8468c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * Once a TSN hits the wire it is moved to the sent_queue. We 8478c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * maintain two counts here (don't know if any but retran_cnt is 8488c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * needed). The idea is that the sent_queue_retran_cnt reflects how 8498c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * many chunks have been marked for retranmission by either T3-rxt 8508c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * or FR. 8518c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 8528c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctpchunk_listhead sent_queue; 8538c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctpchunk_listhead send_queue; 8548c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 8558c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* re-assembly queue for fragmented chunks on the inbound path */ 8568c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctpchunk_listhead reasmqueue; 8578c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 8588c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* Scheduling queues */ 8598c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen union scheduling_data ss_data; 8608c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 8618c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* This pointer will be set to NULL 8628c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * most of the time. But when we have 8638c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * a fragmented message, where we could 8648c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * not get out all of the message at 8658c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * the last send then this will point 8668c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * to the stream to go get data from. 8678c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 8688c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_stream_out *locked_on_sending; 8698c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 8708c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* If an iterator is looking at me, this is it */ 8718c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_iterator *stcb_starting_point_for_iterator; 8728c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 8738c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* ASCONF save the last ASCONF-ACK so we can resend it if necessary */ 8748c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_asconf_ackhead asconf_ack_sent; 8758c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 8768c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 8778c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * pointer to last stream reset queued to control queue by us with 8788c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * requests. 8798c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 8808c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_tmit_chunk *str_reset; 8818c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 8828c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * if Source Address Selection happening, this will rotate through 8838c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * the link list. 8848c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 8858c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_laddr *last_used_address; 8868c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 8878c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* stream arrays */ 8888c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_stream_in *strmin; 8898c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_stream_out *strmout; 8908c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t *mapping_array; 8918c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* primary destination to use */ 8928c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_nets *primary_destination; 8938c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_nets *alternate; /* If primary is down or PF */ 8948c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* For CMT */ 8958c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_nets *last_net_cmt_send_started; 8968c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* last place I got a data chunk from */ 8978c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_nets *last_data_chunk_from; 8988c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* last place I got a control from */ 8998c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_nets *last_control_chunk_from; 9008c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9018c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* circular looking for output selection */ 9028c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_stream_out *last_out_stream; 9038c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9048c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 9058c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * wait to the point the cum-ack passes req->send_reset_at_tsn for 9068c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * any req on the list. 9078c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 9088c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_resethead resetHead; 9098c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9108c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* queue of chunks waiting to be sent into the local stack */ 9118c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_readhead pending_reply_queue; 9128c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9138c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* JRS - the congestion control functions are in this struct */ 9148c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_cc_functions cc_functions; 9158c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* JRS - value to store the currently loaded congestion control module */ 9168c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t congestion_control_module; 9178c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* RS - the stream scheduling functions are in this struct */ 9188c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_ss_functions ss_functions; 9198c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* RS - value to store the currently loaded stream scheduling module */ 9208c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t stream_scheduling_module; 9218c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9228c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t vrf_id; 9238c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9248c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t cookie_preserve_req; 9258c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* ASCONF next seq I am sending out, inits at init-tsn */ 9268c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t asconf_seq_out; 9278c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t asconf_seq_out_acked; 9288c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* ASCONF last received ASCONF from peer, starts at peer's TSN-1 */ 9298c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t asconf_seq_in; 9308c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9318c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* next seq I am sending in str reset messages */ 9328c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t str_reset_seq_out; 9338c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* next seq I am expecting in str reset messages */ 9348c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t str_reset_seq_in; 9358c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9368c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* various verification tag information */ 9378c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t my_vtag; /* The tag to be used. if assoc is re-initited 9388c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * by remote end, and I have unlocked this 9398c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * will be regenerated to a new random value. */ 9408c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t peer_vtag; /* The peers last tag */ 9418c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9428c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t my_vtag_nonce; 9438c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t peer_vtag_nonce; 9448c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9458c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t assoc_id; 9468c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9478c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* This is the SCTP fragmentation threshold */ 9488c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t smallest_mtu; 9498c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9508c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 9518c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * Special hook for Fast retransmit, allows us to track the highest 9528c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * TSN that is NEW in this SACK if gap ack blocks are present. 9538c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 9548c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t this_sack_highest_gap; 9558c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9568c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 9578c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * The highest consecutive TSN that has been acked by peer on my 9588c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * sends 9598c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 9608c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t last_acked_seq; 9618c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9628c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* The next TSN that I will use in sending. */ 9638c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t sending_seq; 9648c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9658c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* Original seq number I used ??questionable to keep?? */ 9668c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t init_seq_number; 9678c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9688c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9698c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* The Advanced Peer Ack Point, as required by the PR-SCTP */ 9708c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* (A1 in Section 4.2) */ 9718c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t advanced_peer_ack_point; 9728c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9738c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 9748c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * The highest consequetive TSN at the bottom of the mapping array 9758c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * (for his sends). 9768c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 9778c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t cumulative_tsn; 9788c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 9798c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * Used to track the mapping array and its offset bits. This MAY be 9808c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * lower then cumulative_tsn. 9818c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 9828c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t mapping_array_base_tsn; 9838c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 9848c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * used to track highest TSN we have received and is listed in the 9858c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * mapping array. 9868c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 9878c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t highest_tsn_inside_map; 988000a5bac556b28e74e4e98c540f66b1743e9312dtuexen 9898c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* EY - new NR variables used for nr_sack based on mapping_array*/ 9908c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t *nr_mapping_array; 9918c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t highest_tsn_inside_nr_map; 9928c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 9938c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t fast_recovery_tsn; 9948c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t sat_t3_recovery_tsn; 9958c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t tsn_last_delivered; 9968c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 9978c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * For the pd-api we should re-write this a bit more efficent. We 9988c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * could have multiple sctp_queued_to_read's that we are building at 9998c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * once. Now we only do this when we get ready to deliver to the 10008c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * socket buffer. Note that we depend on the fact that the struct is 10018c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * "stuck" on the read queue until we finish all the pd-api. 10028c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 10038c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_queued_to_read *control_pdapi; 10048c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10058c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t tsn_of_pdapi_last_delivered; 10068c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t pdapi_ppid; 10078c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t context; 10088c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t last_reset_action[SCTP_MAX_RESET_PARAMS]; 10098c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t last_sending_seq[SCTP_MAX_RESET_PARAMS]; 10108c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t last_base_tsnsent[SCTP_MAX_RESET_PARAMS]; 10118c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#ifdef SCTP_ASOCLOG_OF_TSNS 10128c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 10138c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * special log - This adds considerable size 10148c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * to the asoc, but provides a log that you 10158c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * can use to detect problems via kgdb. 10168c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 10178c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_tsn_log in_tsnlog[SCTP_TSN_LOG_SIZE]; 10188c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_tsn_log out_tsnlog[SCTP_TSN_LOG_SIZE]; 10198c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t cumack_log[SCTP_TSN_LOG_SIZE]; 10208c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t cumack_logsnt[SCTP_TSN_LOG_SIZE]; 10218c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t tsn_in_at; 10228c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t tsn_out_at; 10238c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t tsn_in_wrapped; 10248c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t tsn_out_wrapped; 10258c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t cumack_log_at; 10268c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t cumack_log_atsnt; 10278c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif /* SCTP_ASOCLOG_OF_TSNS */ 10288c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#ifdef SCTP_FS_SPEC_LOG 10298c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_fs_spec_log fslog[SCTP_FS_SPEC_LOG_SIZE]; 10308c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t fs_index; 10318c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 10328c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10338c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 10348c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * window state information and smallest MTU that I use to bound 10358c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * segmentation 10368c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 10378c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t peers_rwnd; 10388c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t my_rwnd; 10398c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t my_last_reported_rwnd; 10408c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t sctp_frag_point; 10418c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10428c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t total_output_queue_size; 10438c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10448c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t sb_cc; /* shadow of sb_cc */ 10458c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t sb_send_resv; /* amount reserved on a send */ 10468c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t my_rwnd_control_len; /* shadow of sb_mbcnt used for rwnd control */ 10478c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#ifdef INET6 10488c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t default_flowlabel; 10498c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 10508c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t pr_sctp_cnt; 10518c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int ctrl_queue_cnt; /* could be removed REM - NO IT CAN'T!! RRS */ 10528c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 10538c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * All outbound datagrams queue into this list from the individual 10548c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * stream queue. Here they get assigned a TSN and then await 10558c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * sending. The stream seq comes when it is first put in the 10568c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * individual str queue 10578c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 10588c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int stream_queue_cnt; 10598c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int send_queue_cnt; 10608c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int sent_queue_cnt; 10618c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int sent_queue_cnt_removeable; 10628c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 10638c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * Number on sent queue that are marked for retran until this value 10648c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * is 0 we only send one packet of retran'ed data. 10658c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 10668c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int sent_queue_retran_cnt; 10678c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10688c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int size_on_reasm_queue; 10698c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int cnt_on_reasm_queue; 10708c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int fwd_tsn_cnt; 10718c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* amount of data (bytes) currently in flight (on all destinations) */ 10728c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int total_flight; 10738c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* Total book size in flight */ 10748c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int total_flight_count; /* count of chunks used with 10758c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * book total */ 10768c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* count of destinaton nets and list of destination nets */ 10778c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int numnets; 10788c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10798c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* Total error count on this association */ 10808c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int overall_error_count; 10818c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10828c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int cnt_msg_on_sb; 10838c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10848c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* All stream count of chunks for delivery */ 10858c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int size_on_all_streams; 10868c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int cnt_on_all_streams; 10878c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10888c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* Heart Beat delay in ms */ 10890a24f1addfab69b9c1ba88fdf9efacdc2f580a37tuexen uint32_t heart_beat_delay; 10908c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10918c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* autoclose */ 10928c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int sctp_autoclose_ticks; 10938c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10948c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* how many preopen streams we have */ 10958c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int pre_open_streams; 10968c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 10978c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* How many streams I support coming into me */ 10988c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int max_inbound_streams; 10998c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 11008c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* the cookie life I award for any cookie, in seconds */ 11018c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int cookie_life; 11028c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* time to delay acks for */ 11038c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int delayed_ack; 11048c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int old_delayed_ack; 11058c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int sack_freq; 11068c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int data_pkts_seen; 11078c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 11088c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int numduptsns; 11098c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int dup_tsns[SCTP_MAX_DUP_TSNS]; 11108c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int initial_init_rto_max; /* initial RTO for INIT's */ 11118c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int initial_rto; /* initial send RTO */ 11128c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int minrto; /* per assoc RTO-MIN */ 11138c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen unsigned int maxrto; /* per assoc RTO-MAX */ 11148c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 11158c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* authentication fields */ 11168c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen sctp_auth_chklist_t *local_auth_chunks; 11178c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen sctp_auth_chklist_t *peer_auth_chunks; 11188c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen sctp_hmaclist_t *local_hmacs; /* local HMACs supported */ 11198c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen sctp_hmaclist_t *peer_hmacs; /* peer HMACs supported */ 11208c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct sctp_keyhead shared_keys; /* assoc's shared keys */ 11218c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen sctp_authinfo_t authinfo; /* randoms, cached keys */ 11228c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 11238c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * refcnt to block freeing when a sender or receiver is off coping 11248c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * user data in. 11258c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 11268c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t refcnt; 11278c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t chunks_on_out_queue; /* total chunks floating around, 11288c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * locked by send socket buffer */ 11298c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t peers_adaptation; 11308c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t peer_hmac_id; /* peer HMAC id to send */ 11318c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 11328c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 11338c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * Being that we have no bag to collect stale cookies, and that we 11348c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * really would not want to anyway.. we will count them in this 11358c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * counter. We of course feed them to the pigeons right away (I have 11368c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * always thought of pigeons as flying rats). 11378c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 11388c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t stale_cookie_count; 11398c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 11408c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 11418c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * For the partial delivery API, if up, invoked this is what last 11428c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * TSN I delivered 11438c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 11448c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t str_of_pdapi; 11458c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t ssn_of_pdapi; 11468c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 11478c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* counts of actual built streams. Allocation may be more however */ 11488c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* could re-arrange to optimize space here. */ 11498c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t streamincnt; 11508c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t streamoutcnt; 11518c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t strm_realoutsize; 1152c2352ecab1d9ed208f1d33f5dc0088689b2f210etuexen uint16_t strm_pending_add_size; 11538c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* my maximum number of retrans of INIT and SEND */ 11548c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* copied from SCTP but should be individually setable */ 11558c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t max_init_times; 11568c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t max_send_times; 11578c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 11588c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t def_net_failure; 11598c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 11608c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t def_net_pf_threshold; 11618c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 11628c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 11638c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * lock flag: 0 is ok to send, 1+ (duals as a retran count) is 11648c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * awaiting ACK 11658c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 11668c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t mapping_array_size; 11678c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 11688c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t last_strm_seq_delivered; 11698c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t last_strm_no_delivered; 11708c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 11718c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t last_revoke_count; 11728c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen int16_t num_send_timers_up; 11738c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 11748c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t stream_locked_on; 11758c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t ecn_echo_cnt_onq; 11768c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 11778c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint16_t free_chunk_cnt; 11788c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t stream_locked; 11798c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t authenticated; /* packet authenticated ok */ 11808c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 11818c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * This flag indicates that a SACK need to be sent. 11828c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * Initially this is 1 to send the first sACK immediately. 11838c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 11848c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t send_sack; 11858c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 11868c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* max burst of new packets into the network */ 11878c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t max_burst; 11888c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* max burst of fast retransmit packets */ 11898c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t fr_max_burst; 11908c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 11918c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t sat_network; /* RTT is in range of sat net or greater */ 11928c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t sat_network_lockout; /* lockout code */ 11938c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t burst_limit_applied; /* Burst limit in effect at last send? */ 11948c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* flag goes on when we are doing a partial delivery api */ 11958c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t hb_random_values[4]; 11968c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t fragmented_delivery_inprogress; 11978c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t fragment_flags; 11988c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t last_flags_delivered; 11998c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t hb_ect_randombit; 12008c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t hb_random_idx; 12018c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t default_dscp; 12028c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t asconf_del_pending; /* asconf delete last addr pending */ 12038c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 12048c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 12058c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * This value, plus all other ack'd but above cum-ack is added 12068c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * together to cross check against the bit that we have yet to 12078c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * define (probably in the SACK). When the cum-ack is updated, this 12088c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * sum is updated as well. 12098c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 12108c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1211a8657c4fc04fb9cc82100f648810d51ec6ab155at /* Flags whether an extension is supported or not */ 1212aba62ccbe62e9d5694e5ac85d8aaca0e72d3fd67t uint8_t ecn_supported; 1213a8657c4fc04fb9cc82100f648810d51ec6ab155at uint8_t prsctp_supported; 1214fb3816eaffe5878bb1286adb120fd160da178a05t uint8_t auth_supported; 1215fb3816eaffe5878bb1286adb120fd160da178a05t uint8_t asconf_supported; 12162344bfccffeb80545fca6a86e8cda3d56a6f50bft uint8_t reconfig_supported; 121744318e900a771ba1a5bafb510c38f33fd5cd8a39t uint8_t nrsack_supported; 1218669cffca0ac8ad73a3c16bb63d1fa0f829f84c10t uint8_t pktdrop_supported; 12198c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1220c2352ecab1d9ed208f1d33f5dc0088689b2f210etuexen /* Did the peer make the stream config (add out) request */ 1221c2352ecab1d9ed208f1d33f5dc0088689b2f210etuexen uint8_t peer_req_out; 1222c2352ecab1d9ed208f1d33f5dc0088689b2f210etuexen 1223c2352ecab1d9ed208f1d33f5dc0088689b2f210etuexen uint8_t local_strreset_support; 12248c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 1225e2828360ea9cf8951730d46f5c14626c9425cb30t uint8_t peer_supports_nat; 12268c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 12277988ea8f0c067cf3757e798b473b1ae4d34b6dfdt struct sctp_scoping scope; 12288c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* flags to handle send alternate net tracking */ 12298c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t used_alt_onsack; 12308c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t used_alt_asconfack; 12318c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t fast_retran_loss_recovery; 12328c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t sat_t3_loss_recovery; 12338c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t dropped_special_cnt; 12348c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t seen_a_sack_this_pkt; 12358c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t stream_reset_outstanding; 12368c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t stream_reset_out_is_outstanding; 12378c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t delayed_connection; 12388c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t ifp_had_enobuf; 12398c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t saw_sack_with_frags; 12408c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t saw_sack_with_nr_frags; 12418c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t in_asocid_hash; 12428c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t assoc_up_sent; 12438c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t adaptation_needed; 12448c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t adaptation_sent; 12458c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* CMT variables */ 12468c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t cmt_dac_pkts_rcvd; 12478c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t sctp_cmt_on_off; 12488c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t iam_blocking; 12498c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t cookie_how[8]; 12508c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* JRS 5/21/07 - CMT PF variable */ 12518c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t sctp_cmt_pf; 12528c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint8_t use_precise_time; 1253d9c8e864fea95ec72cc4c29462302f01927bc93ft uint64_t sctp_features; 1254153408b8be3c05b43cd0703fa015f6b3d7f2404btuexen uint16_t port; /* remote UDP encapsulation port */ 12558c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen /* 12568c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * The mapping array is used to track out of order sequences above 12578c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * last_acked_seq. 0 indicates packet missing 1 indicates packet 12588c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * rec'd. We slide it up every time we raise last_acked_seq and 0 12598c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * trailing locactions out. If I get a TSN above the array 12608c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen * mappingArraySz, I discard the datagram and let retransmit happen. 12618c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen */ 12628c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t marked_retrans; 12638c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t timoinit; 12648c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t timodata; 12658c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t timosack; 12668c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t timoshutdown; 12678c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t timoheartbeat; 12688c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t timocookie; 12698c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen uint32_t timoshutdownack; 12708c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct timeval start_time; 12718c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen struct timeval discontinuity_time; 127220d5d287bff2075897105f85287230d55bdfa420t uint64_t abandoned_unsent[SCTP_PR_SCTP_MAX + 1]; 127320d5d287bff2075897105f85287230d55bdfa420t uint64_t abandoned_sent[SCTP_PR_SCTP_MAX + 1]; 12748c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen}; 12758c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen 12768c8a4cae58a2deed148551d56cb1ab315a55dbbdtuexen#endif 1277