xref: /freebsd/sys/netinet/sctputil.c (revision d5be41beb7c44119730791d92782d8e77174d312)
1 /*-
2  * SPDX-License-Identifier: BSD-3-Clause
3  *
4  * Copyright (c) 2001-2008, by Cisco Systems, Inc. All rights reserved.
5  * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved.
6  * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions are met:
10  *
11  * a) Redistributions of source code must retain the above copyright notice,
12  *    this list of conditions and the following disclaimer.
13  *
14  * b) Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in
16  *    the documentation and/or other materials provided with the distribution.
17  *
18  * c) Neither the name of Cisco Systems, Inc. nor the names of its
19  *    contributors may be used to endorse or promote products derived
20  *    from this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
24  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
32  * THE POSSIBILITY OF SUCH DAMAGE.
33  */
34 
35 #include <sys/cdefs.h>
36 __FBSDID("$FreeBSD$");
37 
38 #include <netinet/sctp_os.h>
39 #include <netinet/sctp_pcb.h>
40 #include <netinet/sctputil.h>
41 #include <netinet/sctp_var.h>
42 #include <netinet/sctp_sysctl.h>
43 #ifdef INET6
44 #include <netinet6/sctp6_var.h>
45 #endif
46 #include <netinet/sctp_header.h>
47 #include <netinet/sctp_output.h>
48 #include <netinet/sctp_uio.h>
49 #include <netinet/sctp_timer.h>
50 #include <netinet/sctp_indata.h>
51 #include <netinet/sctp_auth.h>
52 #include <netinet/sctp_asconf.h>
53 #include <netinet/sctp_bsd_addr.h>
54 #include <netinet/sctp_kdtrace.h>
55 #if defined(INET6) || defined(INET)
56 #include <netinet/tcp_var.h>
57 #endif
58 #include <netinet/udp.h>
59 #include <netinet/udp_var.h>
60 #include <sys/proc.h>
61 #ifdef INET6
62 #include <netinet/icmp6.h>
63 #endif
64 
65 #ifndef KTR_SCTP
66 #define KTR_SCTP KTR_SUBSYS
67 #endif
68 
69 extern const struct sctp_cc_functions sctp_cc_functions[];
70 extern const struct sctp_ss_functions sctp_ss_functions[];
71 
72 void
73 sctp_sblog(struct sockbuf *sb, struct sctp_tcb *stcb, int from, int incr)
74 {
75 #if defined(SCTP_LOCAL_TRACE_BUF)
76 	struct sctp_cwnd_log sctp_clog;
77 
78 	sctp_clog.x.sb.stcb = stcb;
79 	sctp_clog.x.sb.so_sbcc = sb->sb_cc;
80 	if (stcb)
81 		sctp_clog.x.sb.stcb_sbcc = stcb->asoc.sb_cc;
82 	else
83 		sctp_clog.x.sb.stcb_sbcc = 0;
84 	sctp_clog.x.sb.incr = incr;
85 	SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x",
86 	    SCTP_LOG_EVENT_SB,
87 	    from,
88 	    sctp_clog.x.misc.log1,
89 	    sctp_clog.x.misc.log2,
90 	    sctp_clog.x.misc.log3,
91 	    sctp_clog.x.misc.log4);
92 #endif
93 }
94 
95 void
96 sctp_log_closing(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int16_t loc)
97 {
98 #if defined(SCTP_LOCAL_TRACE_BUF)
99 	struct sctp_cwnd_log sctp_clog;
100 
101 	sctp_clog.x.close.inp = (void *)inp;
102 	sctp_clog.x.close.sctp_flags = inp->sctp_flags;
103 	if (stcb) {
104 		sctp_clog.x.close.stcb = (void *)stcb;
105 		sctp_clog.x.close.state = (uint16_t)stcb->asoc.state;
106 	} else {
107 		sctp_clog.x.close.stcb = 0;
108 		sctp_clog.x.close.state = 0;
109 	}
110 	sctp_clog.x.close.loc = loc;
111 	SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x",
112 	    SCTP_LOG_EVENT_CLOSE,
113 	    0,
114 	    sctp_clog.x.misc.log1,
115 	    sctp_clog.x.misc.log2,
116 	    sctp_clog.x.misc.log3,
117 	    sctp_clog.x.misc.log4);
118 #endif
119 }
120 
121 void
122 rto_logging(struct sctp_nets *net, int from)
123 {
124 #if defined(SCTP_LOCAL_TRACE_BUF)
125 	struct sctp_cwnd_log sctp_clog;
126 
127 	memset(&sctp_clog, 0, sizeof(sctp_clog));
128 	sctp_clog.x.rto.net = (void *)net;
129 	sctp_clog.x.rto.rtt = net->rtt / 1000;
130 	SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x",
131 	    SCTP_LOG_EVENT_RTT,
132 	    from,
133 	    sctp_clog.x.misc.log1,
134 	    sctp_clog.x.misc.log2,
135 	    sctp_clog.x.misc.log3,
136 	    sctp_clog.x.misc.log4);
137 #endif
138 }
139 
140 void
141 sctp_log_strm_del_alt(struct sctp_tcb *stcb, uint32_t tsn, uint16_t sseq, uint16_t stream, int from)
142 {
143 #if defined(SCTP_LOCAL_TRACE_BUF)
144 	struct sctp_cwnd_log sctp_clog;
145 
146 	sctp_clog.x.strlog.stcb = stcb;
147 	sctp_clog.x.strlog.n_tsn = tsn;
148 	sctp_clog.x.strlog.n_sseq = sseq;
149 	sctp_clog.x.strlog.e_tsn = 0;
150 	sctp_clog.x.strlog.e_sseq = 0;
151 	sctp_clog.x.strlog.strm = stream;
152 	SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x",
153 	    SCTP_LOG_EVENT_STRM,
154 	    from,
155 	    sctp_clog.x.misc.log1,
156 	    sctp_clog.x.misc.log2,
157 	    sctp_clog.x.misc.log3,
158 	    sctp_clog.x.misc.log4);
159 #endif
160 }
161 
162 void
163 sctp_log_nagle_event(struct sctp_tcb *stcb, int action)
164 {
165 #if defined(SCTP_LOCAL_TRACE_BUF)
166 	struct sctp_cwnd_log sctp_clog;
167 
168 	sctp_clog.x.nagle.stcb = (void *)stcb;
169 	sctp_clog.x.nagle.total_flight = stcb->asoc.total_flight;
170 	sctp_clog.x.nagle.total_in_queue = stcb->asoc.total_output_queue_size;
171 	sctp_clog.x.nagle.count_in_queue = stcb->asoc.chunks_on_out_queue;
172 	sctp_clog.x.nagle.count_in_flight = stcb->asoc.total_flight_count;
173 	SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x",
174 	    SCTP_LOG_EVENT_NAGLE,
175 	    action,
176 	    sctp_clog.x.misc.log1,
177 	    sctp_clog.x.misc.log2,
178 	    sctp_clog.x.misc.log3,
179 	    sctp_clog.x.misc.log4);
180 #endif
181 }
182 
183 void
184 sctp_log_sack(uint32_t old_cumack, uint32_t cumack, uint32_t tsn, uint16_t gaps, uint16_t dups, int from)
185 {
186 #if defined(SCTP_LOCAL_TRACE_BUF)
187 	struct sctp_cwnd_log sctp_clog;
188 
189 	sctp_clog.x.sack.cumack = cumack;
190 	sctp_clog.x.sack.oldcumack = old_cumack;
191 	sctp_clog.x.sack.tsn = tsn;
192 	sctp_clog.x.sack.numGaps = gaps;
193 	sctp_clog.x.sack.numDups = dups;
194 	SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x",
195 	    SCTP_LOG_EVENT_SACK,
196 	    from,
197 	    sctp_clog.x.misc.log1,
198 	    sctp_clog.x.misc.log2,
199 	    sctp_clog.x.misc.log3,
200 	    sctp_clog.x.misc.log4);
201 #endif
202 }
203 
204 void
205 sctp_log_map(uint32_t map, uint32_t cum, uint32_t high, int from)
206 {
207 #if defined(SCTP_LOCAL_TRACE_BUF)
208 	struct sctp_cwnd_log sctp_clog;
209 
210 	memset(&sctp_clog, 0, sizeof(sctp_clog));
211 	sctp_clog.x.map.base = map;
212 	sctp_clog.x.map.cum = cum;
213 	sctp_clog.x.map.high = high;
214 	SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x",
215 	    SCTP_LOG_EVENT_MAP,
216 	    from,
217 	    sctp_clog.x.misc.log1,
218 	    sctp_clog.x.misc.log2,
219 	    sctp_clog.x.misc.log3,
220 	    sctp_clog.x.misc.log4);
221 #endif
222 }
223 
224 void
225 sctp_log_fr(uint32_t biggest_tsn, uint32_t biggest_new_tsn, uint32_t tsn, int from)
226 {
227 #if defined(SCTP_LOCAL_TRACE_BUF)
228 	struct sctp_cwnd_log sctp_clog;
229 
230 	memset(&sctp_clog, 0, sizeof(sctp_clog));
231 	sctp_clog.x.fr.largest_tsn = biggest_tsn;
232 	sctp_clog.x.fr.largest_new_tsn = biggest_new_tsn;
233 	sctp_clog.x.fr.tsn = tsn;
234 	SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x",
235 	    SCTP_LOG_EVENT_FR,
236 	    from,
237 	    sctp_clog.x.misc.log1,
238 	    sctp_clog.x.misc.log2,
239 	    sctp_clog.x.misc.log3,
240 	    sctp_clog.x.misc.log4);
241 #endif
242 }
243 
244 #ifdef SCTP_MBUF_LOGGING
245 void
246 sctp_log_mb(struct mbuf *m, int from)
247 {
248 #if defined(SCTP_LOCAL_TRACE_BUF)
249 	struct sctp_cwnd_log sctp_clog;
250 
251 	sctp_clog.x.mb.mp = m;
252 	sctp_clog.x.mb.mbuf_flags = (uint8_t)(SCTP_BUF_GET_FLAGS(m));
253 	sctp_clog.x.mb.size = (uint16_t)(SCTP_BUF_LEN(m));
254 	sctp_clog.x.mb.data = SCTP_BUF_AT(m, 0);
255 	if (SCTP_BUF_IS_EXTENDED(m)) {
256 		sctp_clog.x.mb.ext = SCTP_BUF_EXTEND_BASE(m);
257 		sctp_clog.x.mb.refcnt = (uint8_t)(SCTP_BUF_EXTEND_REFCNT(m));
258 	} else {
259 		sctp_clog.x.mb.ext = 0;
260 		sctp_clog.x.mb.refcnt = 0;
261 	}
262 	SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x",
263 	    SCTP_LOG_EVENT_MBUF,
264 	    from,
265 	    sctp_clog.x.misc.log1,
266 	    sctp_clog.x.misc.log2,
267 	    sctp_clog.x.misc.log3,
268 	    sctp_clog.x.misc.log4);
269 #endif
270 }
271 
272 void
273 sctp_log_mbc(struct mbuf *m, int from)
274 {
275 	struct mbuf *mat;
276 
277 	for (mat = m; mat; mat = SCTP_BUF_NEXT(mat)) {
278 		sctp_log_mb(mat, from);
279 	}
280 }
281 #endif
282 
283 void
284 sctp_log_strm_del(struct sctp_queued_to_read *control, struct sctp_queued_to_read *poschk, int from)
285 {
286 #if defined(SCTP_LOCAL_TRACE_BUF)
287 	struct sctp_cwnd_log sctp_clog;
288 
289 	if (control == NULL) {
290 		SCTP_PRINTF("Gak log of NULL?\n");
291 		return;
292 	}
293 	sctp_clog.x.strlog.stcb = control->stcb;
294 	sctp_clog.x.strlog.n_tsn = control->sinfo_tsn;
295 	sctp_clog.x.strlog.n_sseq = (uint16_t)control->mid;
296 	sctp_clog.x.strlog.strm = control->sinfo_stream;
297 	if (poschk != NULL) {
298 		sctp_clog.x.strlog.e_tsn = poschk->sinfo_tsn;
299 		sctp_clog.x.strlog.e_sseq = (uint16_t)poschk->mid;
300 	} else {
301 		sctp_clog.x.strlog.e_tsn = 0;
302 		sctp_clog.x.strlog.e_sseq = 0;
303 	}
304 	SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x",
305 	    SCTP_LOG_EVENT_STRM,
306 	    from,
307 	    sctp_clog.x.misc.log1,
308 	    sctp_clog.x.misc.log2,
309 	    sctp_clog.x.misc.log3,
310 	    sctp_clog.x.misc.log4);
311 #endif
312 }
313 
314 void
315 sctp_log_cwnd(struct sctp_tcb *stcb, struct sctp_nets *net, int augment, uint8_t from)
316 {
317 #if defined(SCTP_LOCAL_TRACE_BUF)
318 	struct sctp_cwnd_log sctp_clog;
319 
320 	sctp_clog.x.cwnd.net = net;
321 	if (stcb->asoc.send_queue_cnt > 255)
322 		sctp_clog.x.cwnd.cnt_in_send = 255;
323 	else
324 		sctp_clog.x.cwnd.cnt_in_send = stcb->asoc.send_queue_cnt;
325 	if (stcb->asoc.stream_queue_cnt > 255)
326 		sctp_clog.x.cwnd.cnt_in_str = 255;
327 	else
328 		sctp_clog.x.cwnd.cnt_in_str = stcb->asoc.stream_queue_cnt;
329 
330 	if (net) {
331 		sctp_clog.x.cwnd.cwnd_new_value = net->cwnd;
332 		sctp_clog.x.cwnd.inflight = net->flight_size;
333 		sctp_clog.x.cwnd.pseudo_cumack = net->pseudo_cumack;
334 		sctp_clog.x.cwnd.meets_pseudo_cumack = net->new_pseudo_cumack;
335 		sctp_clog.x.cwnd.need_new_pseudo_cumack = net->find_pseudo_cumack;
336 	}
337 	if (SCTP_CWNDLOG_PRESEND == from) {
338 		sctp_clog.x.cwnd.meets_pseudo_cumack = stcb->asoc.peers_rwnd;
339 	}
340 	sctp_clog.x.cwnd.cwnd_augment = augment;
341 	SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x",
342 	    SCTP_LOG_EVENT_CWND,
343 	    from,
344 	    sctp_clog.x.misc.log1,
345 	    sctp_clog.x.misc.log2,
346 	    sctp_clog.x.misc.log3,
347 	    sctp_clog.x.misc.log4);
348 #endif
349 }
350 
351 void
352 sctp_log_lock(struct sctp_inpcb *inp, struct sctp_tcb *stcb, uint8_t from)
353 {
354 #if defined(SCTP_LOCAL_TRACE_BUF)
355 	struct sctp_cwnd_log sctp_clog;
356 
357 	memset(&sctp_clog, 0, sizeof(sctp_clog));
358 	if (inp) {
359 		sctp_clog.x.lock.sock = (void *)inp->sctp_socket;
360 
361 	} else {
362 		sctp_clog.x.lock.sock = (void *)NULL;
363 	}
364 	sctp_clog.x.lock.inp = (void *)inp;
365 	if (stcb) {
366 		sctp_clog.x.lock.tcb_lock = mtx_owned(&stcb->tcb_mtx);
367 	} else {
368 		sctp_clog.x.lock.tcb_lock = SCTP_LOCK_UNKNOWN;
369 	}
370 	if (inp) {
371 		sctp_clog.x.lock.inp_lock = mtx_owned(&inp->inp_mtx);
372 		sctp_clog.x.lock.create_lock = mtx_owned(&inp->inp_create_mtx);
373 	} else {
374 		sctp_clog.x.lock.inp_lock = SCTP_LOCK_UNKNOWN;
375 		sctp_clog.x.lock.create_lock = SCTP_LOCK_UNKNOWN;
376 	}
377 	sctp_clog.x.lock.info_lock = rw_wowned(&SCTP_BASE_INFO(ipi_ep_mtx));
378 	if (inp && (inp->sctp_socket)) {
379 		sctp_clog.x.lock.sock_lock = mtx_owned(&(inp->sctp_socket->so_rcv.sb_mtx));
380 		sctp_clog.x.lock.sockrcvbuf_lock = mtx_owned(&(inp->sctp_socket->so_rcv.sb_mtx));
381 		sctp_clog.x.lock.socksndbuf_lock = mtx_owned(&(inp->sctp_socket->so_snd.sb_mtx));
382 	} else {
383 		sctp_clog.x.lock.sock_lock = SCTP_LOCK_UNKNOWN;
384 		sctp_clog.x.lock.sockrcvbuf_lock = SCTP_LOCK_UNKNOWN;
385 		sctp_clog.x.lock.socksndbuf_lock = SCTP_LOCK_UNKNOWN;
386 	}
387 	SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x",
388 	    SCTP_LOG_LOCK_EVENT,
389 	    from,
390 	    sctp_clog.x.misc.log1,
391 	    sctp_clog.x.misc.log2,
392 	    sctp_clog.x.misc.log3,
393 	    sctp_clog.x.misc.log4);
394 #endif
395 }
396 
397 void
398 sctp_log_maxburst(struct sctp_tcb *stcb, struct sctp_nets *net, int error, int burst, uint8_t from)
399 {
400 #if defined(SCTP_LOCAL_TRACE_BUF)
401 	struct sctp_cwnd_log sctp_clog;
402 
403 	memset(&sctp_clog, 0, sizeof(sctp_clog));
404 	sctp_clog.x.cwnd.net = net;
405 	sctp_clog.x.cwnd.cwnd_new_value = error;
406 	sctp_clog.x.cwnd.inflight = net->flight_size;
407 	sctp_clog.x.cwnd.cwnd_augment = burst;
408 	if (stcb->asoc.send_queue_cnt > 255)
409 		sctp_clog.x.cwnd.cnt_in_send = 255;
410 	else
411 		sctp_clog.x.cwnd.cnt_in_send = stcb->asoc.send_queue_cnt;
412 	if (stcb->asoc.stream_queue_cnt > 255)
413 		sctp_clog.x.cwnd.cnt_in_str = 255;
414 	else
415 		sctp_clog.x.cwnd.cnt_in_str = stcb->asoc.stream_queue_cnt;
416 	SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x",
417 	    SCTP_LOG_EVENT_MAXBURST,
418 	    from,
419 	    sctp_clog.x.misc.log1,
420 	    sctp_clog.x.misc.log2,
421 	    sctp_clog.x.misc.log3,
422 	    sctp_clog.x.misc.log4);
423 #endif
424 }
425 
426 void
427 sctp_log_rwnd(uint8_t from, uint32_t peers_rwnd, uint32_t snd_size, uint32_t overhead)
428 {
429 #if defined(SCTP_LOCAL_TRACE_BUF)
430 	struct sctp_cwnd_log sctp_clog;
431 
432 	sctp_clog.x.rwnd.rwnd = peers_rwnd;
433 	sctp_clog.x.rwnd.send_size = snd_size;
434 	sctp_clog.x.rwnd.overhead = overhead;
435 	sctp_clog.x.rwnd.new_rwnd = 0;
436 	SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x",
437 	    SCTP_LOG_EVENT_RWND,
438 	    from,
439 	    sctp_clog.x.misc.log1,
440 	    sctp_clog.x.misc.log2,
441 	    sctp_clog.x.misc.log3,
442 	    sctp_clog.x.misc.log4);
443 #endif
444 }
445 
446 void
447 sctp_log_rwnd_set(uint8_t from, uint32_t peers_rwnd, uint32_t flight_size, uint32_t overhead, uint32_t a_rwndval)
448 {
449 #if defined(SCTP_LOCAL_TRACE_BUF)
450 	struct sctp_cwnd_log sctp_clog;
451 
452 	sctp_clog.x.rwnd.rwnd = peers_rwnd;
453 	sctp_clog.x.rwnd.send_size = flight_size;
454 	sctp_clog.x.rwnd.overhead = overhead;
455 	sctp_clog.x.rwnd.new_rwnd = a_rwndval;
456 	SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x",
457 	    SCTP_LOG_EVENT_RWND,
458 	    from,
459 	    sctp_clog.x.misc.log1,
460 	    sctp_clog.x.misc.log2,
461 	    sctp_clog.x.misc.log3,
462 	    sctp_clog.x.misc.log4);
463 #endif
464 }
465 
466 #ifdef SCTP_MBCNT_LOGGING
467 static void
468 sctp_log_mbcnt(uint8_t from, uint32_t total_oq, uint32_t book, uint32_t total_mbcnt_q, uint32_t mbcnt)
469 {
470 #if defined(SCTP_LOCAL_TRACE_BUF)
471 	struct sctp_cwnd_log sctp_clog;
472 
473 	sctp_clog.x.mbcnt.total_queue_size = total_oq;
474 	sctp_clog.x.mbcnt.size_change = book;
475 	sctp_clog.x.mbcnt.total_queue_mb_size = total_mbcnt_q;
476 	sctp_clog.x.mbcnt.mbcnt_change = mbcnt;
477 	SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x",
478 	    SCTP_LOG_EVENT_MBCNT,
479 	    from,
480 	    sctp_clog.x.misc.log1,
481 	    sctp_clog.x.misc.log2,
482 	    sctp_clog.x.misc.log3,
483 	    sctp_clog.x.misc.log4);
484 #endif
485 }
486 #endif
487 
488 void
489 sctp_misc_ints(uint8_t from, uint32_t a, uint32_t b, uint32_t c, uint32_t d)
490 {
491 #if defined(SCTP_LOCAL_TRACE_BUF)
492 	SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x",
493 	    SCTP_LOG_MISC_EVENT,
494 	    from,
495 	    a, b, c, d);
496 #endif
497 }
498 
499 void
500 sctp_wakeup_log(struct sctp_tcb *stcb, uint32_t wake_cnt, int from)
501 {
502 #if defined(SCTP_LOCAL_TRACE_BUF)
503 	struct sctp_cwnd_log sctp_clog;
504 
505 	sctp_clog.x.wake.stcb = (void *)stcb;
506 	sctp_clog.x.wake.wake_cnt = wake_cnt;
507 	sctp_clog.x.wake.flight = stcb->asoc.total_flight_count;
508 	sctp_clog.x.wake.send_q = stcb->asoc.send_queue_cnt;
509 	sctp_clog.x.wake.sent_q = stcb->asoc.sent_queue_cnt;
510 
511 	if (stcb->asoc.stream_queue_cnt < 0xff)
512 		sctp_clog.x.wake.stream_qcnt = (uint8_t)stcb->asoc.stream_queue_cnt;
513 	else
514 		sctp_clog.x.wake.stream_qcnt = 0xff;
515 
516 	if (stcb->asoc.chunks_on_out_queue < 0xff)
517 		sctp_clog.x.wake.chunks_on_oque = (uint8_t)stcb->asoc.chunks_on_out_queue;
518 	else
519 		sctp_clog.x.wake.chunks_on_oque = 0xff;
520 
521 	sctp_clog.x.wake.sctpflags = 0;
522 	/* set in the defered mode stuff */
523 	if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_DONT_WAKE)
524 		sctp_clog.x.wake.sctpflags |= 1;
525 	if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_WAKEOUTPUT)
526 		sctp_clog.x.wake.sctpflags |= 2;
527 	if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_WAKEINPUT)
528 		sctp_clog.x.wake.sctpflags |= 4;
529 	/* what about the sb */
530 	if (stcb->sctp_socket) {
531 		struct socket *so = stcb->sctp_socket;
532 
533 		sctp_clog.x.wake.sbflags = (uint8_t)((so->so_snd.sb_flags & 0x00ff));
534 	} else {
535 		sctp_clog.x.wake.sbflags = 0xff;
536 	}
537 	SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x",
538 	    SCTP_LOG_EVENT_WAKE,
539 	    from,
540 	    sctp_clog.x.misc.log1,
541 	    sctp_clog.x.misc.log2,
542 	    sctp_clog.x.misc.log3,
543 	    sctp_clog.x.misc.log4);
544 #endif
545 }
546 
547 void
548 sctp_log_block(uint8_t from, struct sctp_association *asoc, ssize_t sendlen)
549 {
550 #if defined(SCTP_LOCAL_TRACE_BUF)
551 	struct sctp_cwnd_log sctp_clog;
552 
553 	sctp_clog.x.blk.onsb = asoc->total_output_queue_size;
554 	sctp_clog.x.blk.send_sent_qcnt = (uint16_t)(asoc->send_queue_cnt + asoc->sent_queue_cnt);
555 	sctp_clog.x.blk.peer_rwnd = asoc->peers_rwnd;
556 	sctp_clog.x.blk.stream_qcnt = (uint16_t)asoc->stream_queue_cnt;
557 	sctp_clog.x.blk.chunks_on_oque = (uint16_t)asoc->chunks_on_out_queue;
558 	sctp_clog.x.blk.flight_size = (uint16_t)(asoc->total_flight / 1024);
559 	sctp_clog.x.blk.sndlen = (uint32_t)sendlen;
560 	SCTP_CTR6(KTR_SCTP, "SCTP:%d[%d]:%x-%x-%x-%x",
561 	    SCTP_LOG_EVENT_BLOCK,
562 	    from,
563 	    sctp_clog.x.misc.log1,
564 	    sctp_clog.x.misc.log2,
565 	    sctp_clog.x.misc.log3,
566 	    sctp_clog.x.misc.log4);
567 #endif
568 }
569 
570 int
571 sctp_fill_stat_log(void *optval SCTP_UNUSED, size_t *optsize SCTP_UNUSED)
572 {
573 	/* May need to fix this if ktrdump does not work */
574 	return (0);
575 }
576 
577 #ifdef SCTP_AUDITING_ENABLED
578 uint8_t sctp_audit_data[SCTP_AUDIT_SIZE][2];
579 static int sctp_audit_indx = 0;
580 
581 static
582 void
583 sctp_print_audit_report(void)
584 {
585 	int i;
586 	int cnt;
587 
588 	cnt = 0;
589 	for (i = sctp_audit_indx; i < SCTP_AUDIT_SIZE; i++) {
590 		if ((sctp_audit_data[i][0] == 0xe0) &&
591 		    (sctp_audit_data[i][1] == 0x01)) {
592 			cnt = 0;
593 			SCTP_PRINTF("\n");
594 		} else if (sctp_audit_data[i][0] == 0xf0) {
595 			cnt = 0;
596 			SCTP_PRINTF("\n");
597 		} else if ((sctp_audit_data[i][0] == 0xc0) &&
598 		    (sctp_audit_data[i][1] == 0x01)) {
599 			SCTP_PRINTF("\n");
600 			cnt = 0;
601 		}
602 		SCTP_PRINTF("%2.2x%2.2x ", (uint32_t)sctp_audit_data[i][0],
603 		    (uint32_t)sctp_audit_data[i][1]);
604 		cnt++;
605 		if ((cnt % 14) == 0)
606 			SCTP_PRINTF("\n");
607 	}
608 	for (i = 0; i < sctp_audit_indx; i++) {
609 		if ((sctp_audit_data[i][0] == 0xe0) &&
610 		    (sctp_audit_data[i][1] == 0x01)) {
611 			cnt = 0;
612 			SCTP_PRINTF("\n");
613 		} else if (sctp_audit_data[i][0] == 0xf0) {
614 			cnt = 0;
615 			SCTP_PRINTF("\n");
616 		} else if ((sctp_audit_data[i][0] == 0xc0) &&
617 		    (sctp_audit_data[i][1] == 0x01)) {
618 			SCTP_PRINTF("\n");
619 			cnt = 0;
620 		}
621 		SCTP_PRINTF("%2.2x%2.2x ", (uint32_t)sctp_audit_data[i][0],
622 		    (uint32_t)sctp_audit_data[i][1]);
623 		cnt++;
624 		if ((cnt % 14) == 0)
625 			SCTP_PRINTF("\n");
626 	}
627 	SCTP_PRINTF("\n");
628 }
629 
630 void
631 sctp_auditing(int from, struct sctp_inpcb *inp, struct sctp_tcb *stcb,
632     struct sctp_nets *net)
633 {
634 	int resend_cnt, tot_out, rep, tot_book_cnt;
635 	struct sctp_nets *lnet;
636 	struct sctp_tmit_chunk *chk;
637 
638 	sctp_audit_data[sctp_audit_indx][0] = 0xAA;
639 	sctp_audit_data[sctp_audit_indx][1] = 0x000000ff & from;
640 	sctp_audit_indx++;
641 	if (sctp_audit_indx >= SCTP_AUDIT_SIZE) {
642 		sctp_audit_indx = 0;
643 	}
644 	if (inp == NULL) {
645 		sctp_audit_data[sctp_audit_indx][0] = 0xAF;
646 		sctp_audit_data[sctp_audit_indx][1] = 0x01;
647 		sctp_audit_indx++;
648 		if (sctp_audit_indx >= SCTP_AUDIT_SIZE) {
649 			sctp_audit_indx = 0;
650 		}
651 		return;
652 	}
653 	if (stcb == NULL) {
654 		sctp_audit_data[sctp_audit_indx][0] = 0xAF;
655 		sctp_audit_data[sctp_audit_indx][1] = 0x02;
656 		sctp_audit_indx++;
657 		if (sctp_audit_indx >= SCTP_AUDIT_SIZE) {
658 			sctp_audit_indx = 0;
659 		}
660 		return;
661 	}
662 	sctp_audit_data[sctp_audit_indx][0] = 0xA1;
663 	sctp_audit_data[sctp_audit_indx][1] =
664 	    (0x000000ff & stcb->asoc.sent_queue_retran_cnt);
665 	sctp_audit_indx++;
666 	if (sctp_audit_indx >= SCTP_AUDIT_SIZE) {
667 		sctp_audit_indx = 0;
668 	}
669 	rep = 0;
670 	tot_book_cnt = 0;
671 	resend_cnt = tot_out = 0;
672 	TAILQ_FOREACH(chk, &stcb->asoc.sent_queue, sctp_next) {
673 		if (chk->sent == SCTP_DATAGRAM_RESEND) {
674 			resend_cnt++;
675 		} else if (chk->sent < SCTP_DATAGRAM_RESEND) {
676 			tot_out += chk->book_size;
677 			tot_book_cnt++;
678 		}
679 	}
680 	if (resend_cnt != stcb->asoc.sent_queue_retran_cnt) {
681 		sctp_audit_data[sctp_audit_indx][0] = 0xAF;
682 		sctp_audit_data[sctp_audit_indx][1] = 0xA1;
683 		sctp_audit_indx++;
684 		if (sctp_audit_indx >= SCTP_AUDIT_SIZE) {
685 			sctp_audit_indx = 0;
686 		}
687 		SCTP_PRINTF("resend_cnt:%d asoc-tot:%d\n",
688 		    resend_cnt, stcb->asoc.sent_queue_retran_cnt);
689 		rep = 1;
690 		stcb->asoc.sent_queue_retran_cnt = resend_cnt;
691 		sctp_audit_data[sctp_audit_indx][0] = 0xA2;
692 		sctp_audit_data[sctp_audit_indx][1] =
693 		    (0x000000ff & stcb->asoc.sent_queue_retran_cnt);
694 		sctp_audit_indx++;
695 		if (sctp_audit_indx >= SCTP_AUDIT_SIZE) {
696 			sctp_audit_indx = 0;
697 		}
698 	}
699 	if (tot_out != stcb->asoc.total_flight) {
700 		sctp_audit_data[sctp_audit_indx][0] = 0xAF;
701 		sctp_audit_data[sctp_audit_indx][1] = 0xA2;
702 		sctp_audit_indx++;
703 		if (sctp_audit_indx >= SCTP_AUDIT_SIZE) {
704 			sctp_audit_indx = 0;
705 		}
706 		rep = 1;
707 		SCTP_PRINTF("tot_flt:%d asoc_tot:%d\n", tot_out,
708 		    (int)stcb->asoc.total_flight);
709 		stcb->asoc.total_flight = tot_out;
710 	}
711 	if (tot_book_cnt != stcb->asoc.total_flight_count) {
712 		sctp_audit_data[sctp_audit_indx][0] = 0xAF;
713 		sctp_audit_data[sctp_audit_indx][1] = 0xA5;
714 		sctp_audit_indx++;
715 		if (sctp_audit_indx >= SCTP_AUDIT_SIZE) {
716 			sctp_audit_indx = 0;
717 		}
718 		rep = 1;
719 		SCTP_PRINTF("tot_flt_book:%d\n", tot_book_cnt);
720 
721 		stcb->asoc.total_flight_count = tot_book_cnt;
722 	}
723 	tot_out = 0;
724 	TAILQ_FOREACH(lnet, &stcb->asoc.nets, sctp_next) {
725 		tot_out += lnet->flight_size;
726 	}
727 	if (tot_out != stcb->asoc.total_flight) {
728 		sctp_audit_data[sctp_audit_indx][0] = 0xAF;
729 		sctp_audit_data[sctp_audit_indx][1] = 0xA3;
730 		sctp_audit_indx++;
731 		if (sctp_audit_indx >= SCTP_AUDIT_SIZE) {
732 			sctp_audit_indx = 0;
733 		}
734 		rep = 1;
735 		SCTP_PRINTF("real flight:%d net total was %d\n",
736 		    stcb->asoc.total_flight, tot_out);
737 		/* now corrective action */
738 		TAILQ_FOREACH(lnet, &stcb->asoc.nets, sctp_next) {
739 			tot_out = 0;
740 			TAILQ_FOREACH(chk, &stcb->asoc.sent_queue, sctp_next) {
741 				if ((chk->whoTo == lnet) &&
742 				    (chk->sent < SCTP_DATAGRAM_RESEND)) {
743 					tot_out += chk->book_size;
744 				}
745 			}
746 			if (lnet->flight_size != tot_out) {
747 				SCTP_PRINTF("net:%p flight was %d corrected to %d\n",
748 				    (void *)lnet, lnet->flight_size,
749 				    tot_out);
750 				lnet->flight_size = tot_out;
751 			}
752 		}
753 	}
754 	if (rep) {
755 		sctp_print_audit_report();
756 	}
757 }
758 
759 void
760 sctp_audit_log(uint8_t ev, uint8_t fd)
761 {
762 
763 	sctp_audit_data[sctp_audit_indx][0] = ev;
764 	sctp_audit_data[sctp_audit_indx][1] = fd;
765 	sctp_audit_indx++;
766 	if (sctp_audit_indx >= SCTP_AUDIT_SIZE) {
767 		sctp_audit_indx = 0;
768 	}
769 }
770 
771 #endif
772 
773 /*
774  * The conversion from time to ticks and vice versa is done by rounding
775  * upwards. This way we can test in the code the time to be positive and
776  * know that this corresponds to a positive number of ticks.
777  */
778 
779 uint32_t
780 sctp_msecs_to_ticks(uint32_t msecs)
781 {
782 	uint64_t temp;
783 	uint32_t ticks;
784 
785 	if (hz == 1000) {
786 		ticks = msecs;
787 	} else {
788 		temp = (((uint64_t)msecs * hz) + 999) / 1000;
789 		if (temp > UINT32_MAX) {
790 			ticks = UINT32_MAX;
791 		} else {
792 			ticks = (uint32_t)temp;
793 		}
794 	}
795 	return (ticks);
796 }
797 
798 uint32_t
799 sctp_ticks_to_msecs(uint32_t ticks)
800 {
801 	uint64_t temp;
802 	uint32_t msecs;
803 
804 	if (hz == 1000) {
805 		msecs = ticks;
806 	} else {
807 		temp = (((uint64_t)ticks * 1000) + (hz - 1)) / hz;
808 		if (temp > UINT32_MAX) {
809 			msecs = UINT32_MAX;
810 		} else {
811 			msecs = (uint32_t)temp;
812 		}
813 	}
814 	return (msecs);
815 }
816 
817 uint32_t
818 sctp_secs_to_ticks(uint32_t secs)
819 {
820 	uint64_t temp;
821 	uint32_t ticks;
822 
823 	temp = (uint64_t)secs * hz;
824 	if (temp > UINT32_MAX) {
825 		ticks = UINT32_MAX;
826 	} else {
827 		ticks = (uint32_t)temp;
828 	}
829 	return (ticks);
830 }
831 
832 uint32_t
833 sctp_ticks_to_secs(uint32_t ticks)
834 {
835 	uint64_t temp;
836 	uint32_t secs;
837 
838 	temp = ((uint64_t)ticks + (hz - 1)) / hz;
839 	if (temp > UINT32_MAX) {
840 		secs = UINT32_MAX;
841 	} else {
842 		secs = (uint32_t)temp;
843 	}
844 	return (secs);
845 }
846 
847 /*
848  * sctp_stop_timers_for_shutdown() should be called
849  * when entering the SHUTDOWN_SENT or SHUTDOWN_ACK_SENT
850  * state to make sure that all timers are stopped.
851  */
852 void
853 sctp_stop_timers_for_shutdown(struct sctp_tcb *stcb)
854 {
855 	struct sctp_inpcb *inp;
856 	struct sctp_nets *net;
857 
858 	inp = stcb->sctp_ep;
859 
860 	sctp_timer_stop(SCTP_TIMER_TYPE_RECV, inp, stcb, NULL,
861 	    SCTP_FROM_SCTPUTIL + SCTP_LOC_12);
862 	sctp_timer_stop(SCTP_TIMER_TYPE_STRRESET, inp, stcb, NULL,
863 	    SCTP_FROM_SCTPUTIL + SCTP_LOC_13);
864 	sctp_timer_stop(SCTP_TIMER_TYPE_ASCONF, inp, stcb, NULL,
865 	    SCTP_FROM_SCTPUTIL + SCTP_LOC_14);
866 	sctp_timer_stop(SCTP_TIMER_TYPE_AUTOCLOSE, inp, stcb, NULL,
867 	    SCTP_FROM_SCTPUTIL + SCTP_LOC_15);
868 	TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) {
869 		sctp_timer_stop(SCTP_TIMER_TYPE_PATHMTURAISE, inp, stcb, net,
870 		    SCTP_FROM_SCTPUTIL + SCTP_LOC_16);
871 		sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT, inp, stcb, net,
872 		    SCTP_FROM_SCTPUTIL + SCTP_LOC_17);
873 	}
874 }
875 
876 void
877 sctp_stop_association_timers(struct sctp_tcb *stcb, bool stop_assoc_kill_timer)
878 {
879 	struct sctp_inpcb *inp;
880 	struct sctp_nets *net;
881 
882 	inp = stcb->sctp_ep;
883 	sctp_timer_stop(SCTP_TIMER_TYPE_RECV, inp, stcb, NULL,
884 	    SCTP_FROM_SCTPUTIL + SCTP_LOC_18);
885 	sctp_timer_stop(SCTP_TIMER_TYPE_STRRESET, inp, stcb, NULL,
886 	    SCTP_FROM_SCTPUTIL + SCTP_LOC_19);
887 	if (stop_assoc_kill_timer) {
888 		sctp_timer_stop(SCTP_TIMER_TYPE_ASOCKILL, inp, stcb, NULL,
889 		    SCTP_FROM_SCTPUTIL + SCTP_LOC_20);
890 	}
891 	sctp_timer_stop(SCTP_TIMER_TYPE_ASCONF, inp, stcb, NULL,
892 	    SCTP_FROM_SCTPUTIL + SCTP_LOC_21);
893 	sctp_timer_stop(SCTP_TIMER_TYPE_AUTOCLOSE, inp, stcb, NULL,
894 	    SCTP_FROM_SCTPUTIL + SCTP_LOC_22);
895 	sctp_timer_stop(SCTP_TIMER_TYPE_SHUTDOWNGUARD, inp, stcb, NULL,
896 	    SCTP_FROM_SCTPUTIL + SCTP_LOC_23);
897 	/* Mobility adaptation */
898 	sctp_timer_stop(SCTP_TIMER_TYPE_PRIM_DELETED, inp, stcb, NULL,
899 	    SCTP_FROM_SCTPUTIL + SCTP_LOC_24);
900 	TAILQ_FOREACH(net, &stcb->asoc.nets, sctp_next) {
901 		sctp_timer_stop(SCTP_TIMER_TYPE_SEND, inp, stcb, net,
902 		    SCTP_FROM_SCTPUTIL + SCTP_LOC_25);
903 		sctp_timer_stop(SCTP_TIMER_TYPE_INIT, inp, stcb, net,
904 		    SCTP_FROM_SCTPUTIL + SCTP_LOC_26);
905 		sctp_timer_stop(SCTP_TIMER_TYPE_SHUTDOWN, inp, stcb, net,
906 		    SCTP_FROM_SCTPUTIL + SCTP_LOC_27);
907 		sctp_timer_stop(SCTP_TIMER_TYPE_COOKIE, inp, stcb, net,
908 		    SCTP_FROM_SCTPUTIL + SCTP_LOC_28);
909 		sctp_timer_stop(SCTP_TIMER_TYPE_SHUTDOWNACK, inp, stcb, net,
910 		    SCTP_FROM_SCTPUTIL + SCTP_LOC_29);
911 		sctp_timer_stop(SCTP_TIMER_TYPE_PATHMTURAISE, inp, stcb, net,
912 		    SCTP_FROM_SCTPUTIL + SCTP_LOC_30);
913 		sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT, inp, stcb, net,
914 		    SCTP_FROM_SCTPUTIL + SCTP_LOC_31);
915 	}
916 }
917 
918 /*
919  * A list of sizes based on typical mtu's, used only if next hop size not
920  * returned. These values MUST be multiples of 4 and MUST be ordered.
921  */
922 static uint32_t sctp_mtu_sizes[] = {
923 	68,
924 	296,
925 	508,
926 	512,
927 	544,
928 	576,
929 	1004,
930 	1492,
931 	1500,
932 	1536,
933 	2000,
934 	2048,
935 	4352,
936 	4464,
937 	8168,
938 	17912,
939 	32000,
940 	65532
941 };
942 
943 /*
944  * Return the largest MTU in sctp_mtu_sizes smaller than val.
945  * If val is smaller than the minimum, just return the largest
946  * multiple of 4 smaller or equal to val.
947  * Ensure that the result is a multiple of 4.
948  */
949 uint32_t
950 sctp_get_prev_mtu(uint32_t val)
951 {
952 	uint32_t i;
953 
954 	val &= 0xfffffffc;
955 	if (val <= sctp_mtu_sizes[0]) {
956 		return (val);
957 	}
958 	for (i = 1; i < (sizeof(sctp_mtu_sizes) / sizeof(uint32_t)); i++) {
959 		if (val <= sctp_mtu_sizes[i]) {
960 			break;
961 		}
962 	}
963 	KASSERT((sctp_mtu_sizes[i - 1] & 0x00000003) == 0,
964 	    ("sctp_mtu_sizes[%u] not a multiple of 4", i - 1));
965 	return (sctp_mtu_sizes[i - 1]);
966 }
967 
968 /*
969  * Return the smallest MTU in sctp_mtu_sizes larger than val.
970  * If val is larger than the maximum, just return the largest multiple of 4 smaller
971  * or equal to val.
972  * Ensure that the result is a multiple of 4.
973  */
974 uint32_t
975 sctp_get_next_mtu(uint32_t val)
976 {
977 	/* select another MTU that is just bigger than this one */
978 	uint32_t i;
979 
980 	val &= 0xfffffffc;
981 	for (i = 0; i < (sizeof(sctp_mtu_sizes) / sizeof(uint32_t)); i++) {
982 		if (val < sctp_mtu_sizes[i]) {
983 			KASSERT((sctp_mtu_sizes[i] & 0x00000003) == 0,
984 			    ("sctp_mtu_sizes[%u] not a multiple of 4", i));
985 			return (sctp_mtu_sizes[i]);
986 		}
987 	}
988 	return (val);
989 }
990 
991 void
992 sctp_fill_random_store(struct sctp_pcb *m)
993 {
994 	/*
995 	 * Here we use the MD5/SHA-1 to hash with our good randomNumbers and
996 	 * our counter. The result becomes our good random numbers and we
997 	 * then setup to give these out. Note that we do no locking to
998 	 * protect this. This is ok, since if competing folks call this we
999 	 * will get more gobbled gook in the random store which is what we
1000 	 * want. There is a danger that two guys will use the same random
1001 	 * numbers, but thats ok too since that is random as well :->
1002 	 */
1003 	m->store_at = 0;
1004 	(void)sctp_hmac(SCTP_HMAC, (uint8_t *)m->random_numbers,
1005 	    sizeof(m->random_numbers), (uint8_t *)&m->random_counter,
1006 	    sizeof(m->random_counter), (uint8_t *)m->random_store);
1007 	m->random_counter++;
1008 }
1009 
1010 uint32_t
1011 sctp_select_initial_TSN(struct sctp_pcb *inp)
1012 {
1013 	/*
1014 	 * A true implementation should use random selection process to get
1015 	 * the initial stream sequence number, using RFC1750 as a good
1016 	 * guideline
1017 	 */
1018 	uint32_t x, *xp;
1019 	uint8_t *p;
1020 	int store_at, new_store;
1021 
1022 	if (inp->initial_sequence_debug != 0) {
1023 		uint32_t ret;
1024 
1025 		ret = inp->initial_sequence_debug;
1026 		inp->initial_sequence_debug++;
1027 		return (ret);
1028 	}
1029 retry:
1030 	store_at = inp->store_at;
1031 	new_store = store_at + sizeof(uint32_t);
1032 	if (new_store >= (SCTP_SIGNATURE_SIZE - 3)) {
1033 		new_store = 0;
1034 	}
1035 	if (!atomic_cmpset_int(&inp->store_at, store_at, new_store)) {
1036 		goto retry;
1037 	}
1038 	if (new_store == 0) {
1039 		/* Refill the random store */
1040 		sctp_fill_random_store(inp);
1041 	}
1042 	p = &inp->random_store[store_at];
1043 	xp = (uint32_t *)p;
1044 	x = *xp;
1045 	return (x);
1046 }
1047 
1048 uint32_t
1049 sctp_select_a_tag(struct sctp_inpcb *inp, uint16_t lport, uint16_t rport, int check)
1050 {
1051 	uint32_t x;
1052 	struct timeval now;
1053 
1054 	if (check) {
1055 		(void)SCTP_GETTIME_TIMEVAL(&now);
1056 	}
1057 	for (;;) {
1058 		x = sctp_select_initial_TSN(&inp->sctp_ep);
1059 		if (x == 0) {
1060 			/* we never use 0 */
1061 			continue;
1062 		}
1063 		if (!check || sctp_is_vtag_good(x, lport, rport, &now)) {
1064 			break;
1065 		}
1066 	}
1067 	return (x);
1068 }
1069 
1070 int32_t
1071 sctp_map_assoc_state(int kernel_state)
1072 {
1073 	int32_t user_state;
1074 
1075 	if (kernel_state & SCTP_STATE_WAS_ABORTED) {
1076 		user_state = SCTP_CLOSED;
1077 	} else if (kernel_state & SCTP_STATE_SHUTDOWN_PENDING) {
1078 		user_state = SCTP_SHUTDOWN_PENDING;
1079 	} else {
1080 		switch (kernel_state & SCTP_STATE_MASK) {
1081 		case SCTP_STATE_EMPTY:
1082 			user_state = SCTP_CLOSED;
1083 			break;
1084 		case SCTP_STATE_INUSE:
1085 			user_state = SCTP_CLOSED;
1086 			break;
1087 		case SCTP_STATE_COOKIE_WAIT:
1088 			user_state = SCTP_COOKIE_WAIT;
1089 			break;
1090 		case SCTP_STATE_COOKIE_ECHOED:
1091 			user_state = SCTP_COOKIE_ECHOED;
1092 			break;
1093 		case SCTP_STATE_OPEN:
1094 			user_state = SCTP_ESTABLISHED;
1095 			break;
1096 		case SCTP_STATE_SHUTDOWN_SENT:
1097 			user_state = SCTP_SHUTDOWN_SENT;
1098 			break;
1099 		case SCTP_STATE_SHUTDOWN_RECEIVED:
1100 			user_state = SCTP_SHUTDOWN_RECEIVED;
1101 			break;
1102 		case SCTP_STATE_SHUTDOWN_ACK_SENT:
1103 			user_state = SCTP_SHUTDOWN_ACK_SENT;
1104 			break;
1105 		default:
1106 			user_state = SCTP_CLOSED;
1107 			break;
1108 		}
1109 	}
1110 	return (user_state);
1111 }
1112 
1113 int
1114 sctp_init_asoc(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
1115     uint32_t override_tag, uint32_t vrf_id, uint16_t o_strms)
1116 {
1117 	struct sctp_association *asoc;
1118 
1119 	/*
1120 	 * Anything set to zero is taken care of by the allocation routine's
1121 	 * bzero
1122 	 */
1123 
1124 	/*
1125 	 * Up front select what scoping to apply on addresses I tell my peer
1126 	 * Not sure what to do with these right now, we will need to come up
1127 	 * with a way to set them. We may need to pass them through from the
1128 	 * caller in the sctp_aloc_assoc() function.
1129 	 */
1130 	int i;
1131 #if defined(SCTP_DETAILED_STR_STATS)
1132 	int j;
1133 #endif
1134 
1135 	asoc = &stcb->asoc;
1136 	/* init all variables to a known value. */
1137 	SCTP_SET_STATE(stcb, SCTP_STATE_INUSE);
1138 	asoc->max_burst = inp->sctp_ep.max_burst;
1139 	asoc->fr_max_burst = inp->sctp_ep.fr_max_burst;
1140 	asoc->heart_beat_delay = sctp_ticks_to_msecs(inp->sctp_ep.sctp_timeoutticks[SCTP_TIMER_HEARTBEAT]);
1141 	asoc->cookie_life = inp->sctp_ep.def_cookie_life;
1142 	asoc->sctp_cmt_on_off = inp->sctp_cmt_on_off;
1143 	asoc->ecn_supported = inp->ecn_supported;
1144 	asoc->prsctp_supported = inp->prsctp_supported;
1145 	asoc->auth_supported = inp->auth_supported;
1146 	asoc->asconf_supported = inp->asconf_supported;
1147 	asoc->reconfig_supported = inp->reconfig_supported;
1148 	asoc->nrsack_supported = inp->nrsack_supported;
1149 	asoc->pktdrop_supported = inp->pktdrop_supported;
1150 	asoc->idata_supported = inp->idata_supported;
1151 	asoc->sctp_cmt_pf = (uint8_t)0;
1152 	asoc->sctp_frag_point = inp->sctp_frag_point;
1153 	asoc->sctp_features = inp->sctp_features;
1154 	asoc->default_dscp = inp->sctp_ep.default_dscp;
1155 	asoc->max_cwnd = inp->max_cwnd;
1156 #ifdef INET6
1157 	if (inp->sctp_ep.default_flowlabel) {
1158 		asoc->default_flowlabel = inp->sctp_ep.default_flowlabel;
1159 	} else {
1160 		if (inp->ip_inp.inp.inp_flags & IN6P_AUTOFLOWLABEL) {
1161 			asoc->default_flowlabel = sctp_select_initial_TSN(&inp->sctp_ep);
1162 			asoc->default_flowlabel &= 0x000fffff;
1163 			asoc->default_flowlabel |= 0x80000000;
1164 		} else {
1165 			asoc->default_flowlabel = 0;
1166 		}
1167 	}
1168 #endif
1169 	asoc->sb_send_resv = 0;
1170 	if (override_tag) {
1171 		asoc->my_vtag = override_tag;
1172 	} else {
1173 		asoc->my_vtag = sctp_select_a_tag(inp, stcb->sctp_ep->sctp_lport, stcb->rport, 1);
1174 	}
1175 	/* Get the nonce tags */
1176 	asoc->my_vtag_nonce = sctp_select_a_tag(inp, stcb->sctp_ep->sctp_lport, stcb->rport, 0);
1177 	asoc->peer_vtag_nonce = sctp_select_a_tag(inp, stcb->sctp_ep->sctp_lport, stcb->rport, 0);
1178 	asoc->vrf_id = vrf_id;
1179 
1180 #ifdef SCTP_ASOCLOG_OF_TSNS
1181 	asoc->tsn_in_at = 0;
1182 	asoc->tsn_out_at = 0;
1183 	asoc->tsn_in_wrapped = 0;
1184 	asoc->tsn_out_wrapped = 0;
1185 	asoc->cumack_log_at = 0;
1186 	asoc->cumack_log_atsnt = 0;
1187 #endif
1188 #ifdef SCTP_FS_SPEC_LOG
1189 	asoc->fs_index = 0;
1190 #endif
1191 	asoc->refcnt = 0;
1192 	asoc->assoc_up_sent = 0;
1193 	asoc->asconf_seq_out = asoc->str_reset_seq_out = asoc->init_seq_number = asoc->sending_seq =
1194 	    sctp_select_initial_TSN(&inp->sctp_ep);
1195 	asoc->asconf_seq_out_acked = asoc->asconf_seq_out - 1;
1196 	/* we are optimisitic here */
1197 	asoc->peer_supports_nat = 0;
1198 	asoc->sent_queue_retran_cnt = 0;
1199 
1200 	/* for CMT */
1201 	asoc->last_net_cmt_send_started = NULL;
1202 
1203 	/* This will need to be adjusted */
1204 	asoc->last_acked_seq = asoc->init_seq_number - 1;
1205 	asoc->advanced_peer_ack_point = asoc->last_acked_seq;
1206 	asoc->asconf_seq_in = asoc->last_acked_seq;
1207 
1208 	/* here we are different, we hold the next one we expect */
1209 	asoc->str_reset_seq_in = asoc->last_acked_seq + 1;
1210 
1211 	asoc->initial_init_rto_max = inp->sctp_ep.initial_init_rto_max;
1212 	asoc->initial_rto = inp->sctp_ep.initial_rto;
1213 
1214 	asoc->default_mtu = inp->sctp_ep.default_mtu;
1215 	asoc->max_init_times = inp->sctp_ep.max_init_times;
1216 	asoc->max_send_times = inp->sctp_ep.max_send_times;
1217 	asoc->def_net_failure = inp->sctp_ep.def_net_failure;
1218 	asoc->def_net_pf_threshold = inp->sctp_ep.def_net_pf_threshold;
1219 	asoc->free_chunk_cnt = 0;
1220 
1221 	asoc->iam_blocking = 0;
1222 	asoc->context = inp->sctp_context;
1223 	asoc->local_strreset_support = inp->local_strreset_support;
1224 	asoc->def_send = inp->def_send;
1225 	asoc->delayed_ack = sctp_ticks_to_msecs(inp->sctp_ep.sctp_timeoutticks[SCTP_TIMER_RECV]);
1226 	asoc->sack_freq = inp->sctp_ep.sctp_sack_freq;
1227 	asoc->pr_sctp_cnt = 0;
1228 	asoc->total_output_queue_size = 0;
1229 
1230 	if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) {
1231 		asoc->scope.ipv6_addr_legal = 1;
1232 		if (SCTP_IPV6_V6ONLY(inp) == 0) {
1233 			asoc->scope.ipv4_addr_legal = 1;
1234 		} else {
1235 			asoc->scope.ipv4_addr_legal = 0;
1236 		}
1237 	} else {
1238 		asoc->scope.ipv6_addr_legal = 0;
1239 		asoc->scope.ipv4_addr_legal = 1;
1240 	}
1241 
1242 	asoc->my_rwnd = max(SCTP_SB_LIMIT_RCV(inp->sctp_socket), SCTP_MINIMAL_RWND);
1243 	asoc->peers_rwnd = SCTP_SB_LIMIT_RCV(inp->sctp_socket);
1244 
1245 	asoc->smallest_mtu = inp->sctp_frag_point;
1246 	asoc->minrto = inp->sctp_ep.sctp_minrto;
1247 	asoc->maxrto = inp->sctp_ep.sctp_maxrto;
1248 
1249 	asoc->stream_locked_on = 0;
1250 	asoc->ecn_echo_cnt_onq = 0;
1251 	asoc->stream_locked = 0;
1252 
1253 	asoc->send_sack = 1;
1254 
1255 	LIST_INIT(&asoc->sctp_restricted_addrs);
1256 
1257 	TAILQ_INIT(&asoc->nets);
1258 	TAILQ_INIT(&asoc->pending_reply_queue);
1259 	TAILQ_INIT(&asoc->asconf_ack_sent);
1260 	/* Setup to fill the hb random cache at first HB */
1261 	asoc->hb_random_idx = 4;
1262 
1263 	asoc->sctp_autoclose_ticks = inp->sctp_ep.auto_close_time;
1264 
1265 	stcb->asoc.congestion_control_module = inp->sctp_ep.sctp_default_cc_module;
1266 	stcb->asoc.cc_functions = sctp_cc_functions[inp->sctp_ep.sctp_default_cc_module];
1267 
1268 	stcb->asoc.stream_scheduling_module = inp->sctp_ep.sctp_default_ss_module;
1269 	stcb->asoc.ss_functions = sctp_ss_functions[inp->sctp_ep.sctp_default_ss_module];
1270 
1271 	/*
1272 	 * Now the stream parameters, here we allocate space for all streams
1273 	 * that we request by default.
1274 	 */
1275 	asoc->strm_realoutsize = asoc->streamoutcnt = asoc->pre_open_streams =
1276 	    o_strms;
1277 	SCTP_MALLOC(asoc->strmout, struct sctp_stream_out *,
1278 	    asoc->streamoutcnt * sizeof(struct sctp_stream_out),
1279 	    SCTP_M_STRMO);
1280 	if (asoc->strmout == NULL) {
1281 		/* big trouble no memory */
1282 		SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ENOMEM);
1283 		return (ENOMEM);
1284 	}
1285 	for (i = 0; i < asoc->streamoutcnt; i++) {
1286 		/*
1287 		 * inbound side must be set to 0xffff, also NOTE when we get
1288 		 * the INIT-ACK back (for INIT sender) we MUST reduce the
1289 		 * count (streamoutcnt) but first check if we sent to any of
1290 		 * the upper streams that were dropped (if some were). Those
1291 		 * that were dropped must be notified to the upper layer as
1292 		 * failed to send.
1293 		 */
1294 		TAILQ_INIT(&asoc->strmout[i].outqueue);
1295 		asoc->ss_functions.sctp_ss_init_stream(stcb, &asoc->strmout[i], NULL);
1296 		asoc->strmout[i].chunks_on_queues = 0;
1297 #if defined(SCTP_DETAILED_STR_STATS)
1298 		for (j = 0; j < SCTP_PR_SCTP_MAX + 1; j++) {
1299 			asoc->strmout[i].abandoned_sent[j] = 0;
1300 			asoc->strmout[i].abandoned_unsent[j] = 0;
1301 		}
1302 #else
1303 		asoc->strmout[i].abandoned_sent[0] = 0;
1304 		asoc->strmout[i].abandoned_unsent[0] = 0;
1305 #endif
1306 		asoc->strmout[i].next_mid_ordered = 0;
1307 		asoc->strmout[i].next_mid_unordered = 0;
1308 		asoc->strmout[i].sid = i;
1309 		asoc->strmout[i].last_msg_incomplete = 0;
1310 		asoc->strmout[i].state = SCTP_STREAM_OPENING;
1311 	}
1312 	asoc->ss_functions.sctp_ss_init(stcb, asoc, 0);
1313 
1314 	/* Now the mapping array */
1315 	asoc->mapping_array_size = SCTP_INITIAL_MAPPING_ARRAY;
1316 	SCTP_MALLOC(asoc->mapping_array, uint8_t *, asoc->mapping_array_size,
1317 	    SCTP_M_MAP);
1318 	if (asoc->mapping_array == NULL) {
1319 		SCTP_FREE(asoc->strmout, SCTP_M_STRMO);
1320 		SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ENOMEM);
1321 		return (ENOMEM);
1322 	}
1323 	memset(asoc->mapping_array, 0, asoc->mapping_array_size);
1324 	SCTP_MALLOC(asoc->nr_mapping_array, uint8_t *, asoc->mapping_array_size,
1325 	    SCTP_M_MAP);
1326 	if (asoc->nr_mapping_array == NULL) {
1327 		SCTP_FREE(asoc->strmout, SCTP_M_STRMO);
1328 		SCTP_FREE(asoc->mapping_array, SCTP_M_MAP);
1329 		SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ENOMEM);
1330 		return (ENOMEM);
1331 	}
1332 	memset(asoc->nr_mapping_array, 0, asoc->mapping_array_size);
1333 
1334 	/* Now the init of the other outqueues */
1335 	TAILQ_INIT(&asoc->free_chunks);
1336 	TAILQ_INIT(&asoc->control_send_queue);
1337 	TAILQ_INIT(&asoc->asconf_send_queue);
1338 	TAILQ_INIT(&asoc->send_queue);
1339 	TAILQ_INIT(&asoc->sent_queue);
1340 	TAILQ_INIT(&asoc->resetHead);
1341 	asoc->max_inbound_streams = inp->sctp_ep.max_open_streams_intome;
1342 	TAILQ_INIT(&asoc->asconf_queue);
1343 	/* authentication fields */
1344 	asoc->authinfo.random = NULL;
1345 	asoc->authinfo.active_keyid = 0;
1346 	asoc->authinfo.assoc_key = NULL;
1347 	asoc->authinfo.assoc_keyid = 0;
1348 	asoc->authinfo.recv_key = NULL;
1349 	asoc->authinfo.recv_keyid = 0;
1350 	LIST_INIT(&asoc->shared_keys);
1351 	asoc->marked_retrans = 0;
1352 	asoc->port = inp->sctp_ep.port;
1353 	asoc->timoinit = 0;
1354 	asoc->timodata = 0;
1355 	asoc->timosack = 0;
1356 	asoc->timoshutdown = 0;
1357 	asoc->timoheartbeat = 0;
1358 	asoc->timocookie = 0;
1359 	asoc->timoshutdownack = 0;
1360 	(void)SCTP_GETTIME_TIMEVAL(&asoc->start_time);
1361 	asoc->discontinuity_time = asoc->start_time;
1362 	for (i = 0; i < SCTP_PR_SCTP_MAX + 1; i++) {
1363 		asoc->abandoned_unsent[i] = 0;
1364 		asoc->abandoned_sent[i] = 0;
1365 	}
1366 	/*
1367 	 * sa_ignore MEMLEAK {memory is put in the assoc mapping array and
1368 	 * freed later when the association is freed.
1369 	 */
1370 	return (0);
1371 }
1372 
1373 void
1374 sctp_print_mapping_array(struct sctp_association *asoc)
1375 {
1376 	unsigned int i, limit;
1377 
1378 	SCTP_PRINTF("Mapping array size: %d, baseTSN: %8.8x, cumAck: %8.8x, highestTSN: (%8.8x, %8.8x).\n",
1379 	    asoc->mapping_array_size,
1380 	    asoc->mapping_array_base_tsn,
1381 	    asoc->cumulative_tsn,
1382 	    asoc->highest_tsn_inside_map,
1383 	    asoc->highest_tsn_inside_nr_map);
1384 	for (limit = asoc->mapping_array_size; limit > 1; limit--) {
1385 		if (asoc->mapping_array[limit - 1] != 0) {
1386 			break;
1387 		}
1388 	}
1389 	SCTP_PRINTF("Renegable mapping array (last %d entries are zero):\n", asoc->mapping_array_size - limit);
1390 	for (i = 0; i < limit; i++) {
1391 		SCTP_PRINTF("%2.2x%c", asoc->mapping_array[i], ((i + 1) % 16) ? ' ' : '\n');
1392 	}
1393 	if (limit % 16)
1394 		SCTP_PRINTF("\n");
1395 	for (limit = asoc->mapping_array_size; limit > 1; limit--) {
1396 		if (asoc->nr_mapping_array[limit - 1]) {
1397 			break;
1398 		}
1399 	}
1400 	SCTP_PRINTF("Non renegable mapping array (last %d entries are zero):\n", asoc->mapping_array_size - limit);
1401 	for (i = 0; i < limit; i++) {
1402 		SCTP_PRINTF("%2.2x%c", asoc->nr_mapping_array[i], ((i + 1) % 16) ? ' ' : '\n');
1403 	}
1404 	if (limit % 16)
1405 		SCTP_PRINTF("\n");
1406 }
1407 
1408 int
1409 sctp_expand_mapping_array(struct sctp_association *asoc, uint32_t needed)
1410 {
1411 	/* mapping array needs to grow */
1412 	uint8_t *new_array1, *new_array2;
1413 	uint32_t new_size;
1414 
1415 	new_size = asoc->mapping_array_size + ((needed + 7) / 8 + SCTP_MAPPING_ARRAY_INCR);
1416 	SCTP_MALLOC(new_array1, uint8_t *, new_size, SCTP_M_MAP);
1417 	SCTP_MALLOC(new_array2, uint8_t *, new_size, SCTP_M_MAP);
1418 	if ((new_array1 == NULL) || (new_array2 == NULL)) {
1419 		/* can't get more, forget it */
1420 		SCTP_PRINTF("No memory for expansion of SCTP mapping array %d\n", new_size);
1421 		if (new_array1) {
1422 			SCTP_FREE(new_array1, SCTP_M_MAP);
1423 		}
1424 		if (new_array2) {
1425 			SCTP_FREE(new_array2, SCTP_M_MAP);
1426 		}
1427 		return (-1);
1428 	}
1429 	memset(new_array1, 0, new_size);
1430 	memset(new_array2, 0, new_size);
1431 	memcpy(new_array1, asoc->mapping_array, asoc->mapping_array_size);
1432 	memcpy(new_array2, asoc->nr_mapping_array, asoc->mapping_array_size);
1433 	SCTP_FREE(asoc->mapping_array, SCTP_M_MAP);
1434 	SCTP_FREE(asoc->nr_mapping_array, SCTP_M_MAP);
1435 	asoc->mapping_array = new_array1;
1436 	asoc->nr_mapping_array = new_array2;
1437 	asoc->mapping_array_size = new_size;
1438 	return (0);
1439 }
1440 
1441 static void
1442 sctp_iterator_work(struct sctp_iterator *it)
1443 {
1444 	struct epoch_tracker et;
1445 	struct sctp_inpcb *tinp;
1446 	int iteration_count = 0;
1447 	int inp_skip = 0;
1448 	int first_in = 1;
1449 
1450 	NET_EPOCH_ENTER(et);
1451 	SCTP_INP_INFO_RLOCK();
1452 	SCTP_ITERATOR_LOCK();
1453 	sctp_it_ctl.cur_it = it;
1454 	if (it->inp) {
1455 		SCTP_INP_RLOCK(it->inp);
1456 		SCTP_INP_DECR_REF(it->inp);
1457 	}
1458 	if (it->inp == NULL) {
1459 		/* iterator is complete */
1460 done_with_iterator:
1461 		sctp_it_ctl.cur_it = NULL;
1462 		SCTP_ITERATOR_UNLOCK();
1463 		SCTP_INP_INFO_RUNLOCK();
1464 		if (it->function_atend != NULL) {
1465 			(*it->function_atend) (it->pointer, it->val);
1466 		}
1467 		SCTP_FREE(it, SCTP_M_ITER);
1468 		NET_EPOCH_EXIT(et);
1469 		return;
1470 	}
1471 select_a_new_ep:
1472 	if (first_in) {
1473 		first_in = 0;
1474 	} else {
1475 		SCTP_INP_RLOCK(it->inp);
1476 	}
1477 	while (((it->pcb_flags) &&
1478 	    ((it->inp->sctp_flags & it->pcb_flags) != it->pcb_flags)) ||
1479 	    ((it->pcb_features) &&
1480 	    ((it->inp->sctp_features & it->pcb_features) != it->pcb_features))) {
1481 		/* endpoint flags or features don't match, so keep looking */
1482 		if (it->iterator_flags & SCTP_ITERATOR_DO_SINGLE_INP) {
1483 			SCTP_INP_RUNLOCK(it->inp);
1484 			goto done_with_iterator;
1485 		}
1486 		tinp = it->inp;
1487 		it->inp = LIST_NEXT(it->inp, sctp_list);
1488 		it->stcb = NULL;
1489 		SCTP_INP_RUNLOCK(tinp);
1490 		if (it->inp == NULL) {
1491 			goto done_with_iterator;
1492 		}
1493 		SCTP_INP_RLOCK(it->inp);
1494 	}
1495 	/* now go through each assoc which is in the desired state */
1496 	if (it->done_current_ep == 0) {
1497 		if (it->function_inp != NULL)
1498 			inp_skip = (*it->function_inp) (it->inp, it->pointer, it->val);
1499 		it->done_current_ep = 1;
1500 	}
1501 	if (it->stcb == NULL) {
1502 		/* run the per instance function */
1503 		it->stcb = LIST_FIRST(&it->inp->sctp_asoc_list);
1504 	}
1505 	if ((inp_skip) || it->stcb == NULL) {
1506 		if (it->function_inp_end != NULL) {
1507 			inp_skip = (*it->function_inp_end) (it->inp,
1508 			    it->pointer,
1509 			    it->val);
1510 		}
1511 		SCTP_INP_RUNLOCK(it->inp);
1512 		goto no_stcb;
1513 	}
1514 	while (it->stcb) {
1515 		SCTP_TCB_LOCK(it->stcb);
1516 		if (it->asoc_state && ((it->stcb->asoc.state & it->asoc_state) != it->asoc_state)) {
1517 			/* not in the right state... keep looking */
1518 			SCTP_TCB_UNLOCK(it->stcb);
1519 			goto next_assoc;
1520 		}
1521 		/* see if we have limited out the iterator loop */
1522 		iteration_count++;
1523 		if (iteration_count > SCTP_ITERATOR_MAX_AT_ONCE) {
1524 			/* Pause to let others grab the lock */
1525 			atomic_add_int(&it->stcb->asoc.refcnt, 1);
1526 			SCTP_TCB_UNLOCK(it->stcb);
1527 			SCTP_INP_INCR_REF(it->inp);
1528 			SCTP_INP_RUNLOCK(it->inp);
1529 			SCTP_ITERATOR_UNLOCK();
1530 			SCTP_INP_INFO_RUNLOCK();
1531 			SCTP_INP_INFO_RLOCK();
1532 			SCTP_ITERATOR_LOCK();
1533 			if (sctp_it_ctl.iterator_flags) {
1534 				/* We won't be staying here */
1535 				SCTP_INP_DECR_REF(it->inp);
1536 				atomic_add_int(&it->stcb->asoc.refcnt, -1);
1537 				if (sctp_it_ctl.iterator_flags &
1538 				    SCTP_ITERATOR_STOP_CUR_IT) {
1539 					sctp_it_ctl.iterator_flags &= ~SCTP_ITERATOR_STOP_CUR_IT;
1540 					goto done_with_iterator;
1541 				}
1542 				if (sctp_it_ctl.iterator_flags &
1543 				    SCTP_ITERATOR_STOP_CUR_INP) {
1544 					sctp_it_ctl.iterator_flags &= ~SCTP_ITERATOR_STOP_CUR_INP;
1545 					goto no_stcb;
1546 				}
1547 				/* If we reach here huh? */
1548 				SCTP_PRINTF("Unknown it ctl flag %x\n",
1549 				    sctp_it_ctl.iterator_flags);
1550 				sctp_it_ctl.iterator_flags = 0;
1551 			}
1552 			SCTP_INP_RLOCK(it->inp);
1553 			SCTP_INP_DECR_REF(it->inp);
1554 			SCTP_TCB_LOCK(it->stcb);
1555 			atomic_add_int(&it->stcb->asoc.refcnt, -1);
1556 			iteration_count = 0;
1557 		}
1558 		KASSERT(it->inp == it->stcb->sctp_ep,
1559 		    ("%s: stcb %p does not belong to inp %p, but inp %p",
1560 		    __func__, it->stcb, it->inp, it->stcb->sctp_ep));
1561 
1562 		/* run function on this one */
1563 		(*it->function_assoc) (it->inp, it->stcb, it->pointer, it->val);
1564 
1565 		/*
1566 		 * we lie here, it really needs to have its own type but
1567 		 * first I must verify that this won't effect things :-0
1568 		 */
1569 		if (it->no_chunk_output == 0)
1570 			sctp_chunk_output(it->inp, it->stcb, SCTP_OUTPUT_FROM_T3, SCTP_SO_NOT_LOCKED);
1571 
1572 		SCTP_TCB_UNLOCK(it->stcb);
1573 next_assoc:
1574 		it->stcb = LIST_NEXT(it->stcb, sctp_tcblist);
1575 		if (it->stcb == NULL) {
1576 			/* Run last function */
1577 			if (it->function_inp_end != NULL) {
1578 				inp_skip = (*it->function_inp_end) (it->inp,
1579 				    it->pointer,
1580 				    it->val);
1581 			}
1582 		}
1583 	}
1584 	SCTP_INP_RUNLOCK(it->inp);
1585 no_stcb:
1586 	/* done with all assocs on this endpoint, move on to next endpoint */
1587 	it->done_current_ep = 0;
1588 	if (it->iterator_flags & SCTP_ITERATOR_DO_SINGLE_INP) {
1589 		it->inp = NULL;
1590 	} else {
1591 		it->inp = LIST_NEXT(it->inp, sctp_list);
1592 	}
1593 	it->stcb = NULL;
1594 	if (it->inp == NULL) {
1595 		goto done_with_iterator;
1596 	}
1597 	goto select_a_new_ep;
1598 }
1599 
1600 void
1601 sctp_iterator_worker(void)
1602 {
1603 	struct sctp_iterator *it;
1604 
1605 	/* This function is called with the WQ lock in place */
1606 	sctp_it_ctl.iterator_running = 1;
1607 	while ((it = TAILQ_FIRST(&sctp_it_ctl.iteratorhead)) != NULL) {
1608 		/* now lets work on this one */
1609 		TAILQ_REMOVE(&sctp_it_ctl.iteratorhead, it, sctp_nxt_itr);
1610 		SCTP_IPI_ITERATOR_WQ_UNLOCK();
1611 		CURVNET_SET(it->vn);
1612 		sctp_iterator_work(it);
1613 		CURVNET_RESTORE();
1614 		SCTP_IPI_ITERATOR_WQ_LOCK();
1615 		/* sa_ignore FREED_MEMORY */
1616 	}
1617 	sctp_it_ctl.iterator_running = 0;
1618 	return;
1619 }
1620 
1621 static void
1622 sctp_handle_addr_wq(void)
1623 {
1624 	/* deal with the ADDR wq from the rtsock calls */
1625 	struct sctp_laddr *wi, *nwi;
1626 	struct sctp_asconf_iterator *asc;
1627 
1628 	SCTP_MALLOC(asc, struct sctp_asconf_iterator *,
1629 	    sizeof(struct sctp_asconf_iterator), SCTP_M_ASC_IT);
1630 	if (asc == NULL) {
1631 		/* Try later, no memory */
1632 		sctp_timer_start(SCTP_TIMER_TYPE_ADDR_WQ,
1633 		    (struct sctp_inpcb *)NULL,
1634 		    (struct sctp_tcb *)NULL,
1635 		    (struct sctp_nets *)NULL);
1636 		return;
1637 	}
1638 	LIST_INIT(&asc->list_of_work);
1639 	asc->cnt = 0;
1640 
1641 	LIST_FOREACH_SAFE(wi, &SCTP_BASE_INFO(addr_wq), sctp_nxt_addr, nwi) {
1642 		LIST_REMOVE(wi, sctp_nxt_addr);
1643 		LIST_INSERT_HEAD(&asc->list_of_work, wi, sctp_nxt_addr);
1644 		asc->cnt++;
1645 	}
1646 
1647 	if (asc->cnt == 0) {
1648 		SCTP_FREE(asc, SCTP_M_ASC_IT);
1649 	} else {
1650 		int ret;
1651 
1652 		ret = sctp_initiate_iterator(sctp_asconf_iterator_ep,
1653 		    sctp_asconf_iterator_stcb,
1654 		    NULL,	/* No ep end for boundall */
1655 		    SCTP_PCB_FLAGS_BOUNDALL,
1656 		    SCTP_PCB_ANY_FEATURES,
1657 		    SCTP_ASOC_ANY_STATE,
1658 		    (void *)asc, 0,
1659 		    sctp_asconf_iterator_end, NULL, 0);
1660 		if (ret) {
1661 			SCTP_PRINTF("Failed to initiate iterator for handle_addr_wq\n");
1662 			/*
1663 			 * Freeing if we are stopping or put back on the
1664 			 * addr_wq.
1665 			 */
1666 			if (SCTP_BASE_VAR(sctp_pcb_initialized) == 0) {
1667 				sctp_asconf_iterator_end(asc, 0);
1668 			} else {
1669 				LIST_FOREACH(wi, &asc->list_of_work, sctp_nxt_addr) {
1670 					LIST_INSERT_HEAD(&SCTP_BASE_INFO(addr_wq), wi, sctp_nxt_addr);
1671 				}
1672 				SCTP_FREE(asc, SCTP_M_ASC_IT);
1673 			}
1674 		}
1675 	}
1676 }
1677 
1678 /*-
1679  * The following table shows which pointers for the inp, stcb, or net are
1680  * stored for each timer after it was started.
1681  *
1682  *|Name                         |Timer                        |inp |stcb|net |
1683  *|-----------------------------|-----------------------------|----|----|----|
1684  *|SCTP_TIMER_TYPE_SEND         |net->rxt_timer               |Yes |Yes |Yes |
1685  *|SCTP_TIMER_TYPE_INIT         |net->rxt_timer               |Yes |Yes |Yes |
1686  *|SCTP_TIMER_TYPE_RECV         |stcb->asoc.dack_timer        |Yes |Yes |No  |
1687  *|SCTP_TIMER_TYPE_SHUTDOWN     |net->rxt_timer               |Yes |Yes |Yes |
1688  *|SCTP_TIMER_TYPE_HEARTBEAT    |net->hb_timer                |Yes |Yes |Yes |
1689  *|SCTP_TIMER_TYPE_COOKIE       |net->rxt_timer               |Yes |Yes |Yes |
1690  *|SCTP_TIMER_TYPE_NEWCOOKIE    |inp->sctp_ep.signature_change|Yes |No  |No  |
1691  *|SCTP_TIMER_TYPE_PATHMTURAISE |net->pmtu_timer              |Yes |Yes |Yes |
1692  *|SCTP_TIMER_TYPE_SHUTDOWNACK  |net->rxt_timer               |Yes |Yes |Yes |
1693  *|SCTP_TIMER_TYPE_ASCONF       |stcb->asoc.asconf_timer      |Yes |Yes |Yes |
1694  *|SCTP_TIMER_TYPE_SHUTDOWNGUARD|stcb->asoc.shut_guard_timer  |Yes |Yes |No  |
1695  *|SCTP_TIMER_TYPE_AUTOCLOSE    |stcb->asoc.autoclose_timer   |Yes |Yes |No  |
1696  *|SCTP_TIMER_TYPE_STRRESET     |stcb->asoc.strreset_timer    |Yes |Yes |No  |
1697  *|SCTP_TIMER_TYPE_INPKILL      |inp->sctp_ep.signature_change|Yes |No  |No  |
1698  *|SCTP_TIMER_TYPE_ASOCKILL     |stcb->asoc.strreset_timer    |Yes |Yes |No  |
1699  *|SCTP_TIMER_TYPE_ADDR_WQ      |SCTP_BASE_INFO(addr_wq_timer)|No  |No  |No  |
1700  *|SCTP_TIMER_TYPE_PRIM_DELETED |stcb->asoc.delete_prim_timer |Yes |Yes |No  |
1701  */
1702 
1703 void
1704 sctp_timeout_handler(void *t)
1705 {
1706 	struct epoch_tracker et;
1707 	struct timeval tv;
1708 	struct sctp_inpcb *inp;
1709 	struct sctp_tcb *stcb;
1710 	struct sctp_nets *net;
1711 	struct sctp_timer *tmr;
1712 	struct mbuf *op_err;
1713 	int type;
1714 	int i, secret;
1715 	bool did_output, released_asoc_reference;
1716 
1717 	/*
1718 	 * If inp, stcb or net are not NULL, then references to these were
1719 	 * added when the timer was started, and must be released before
1720 	 * this function returns.
1721 	 */
1722 	tmr = (struct sctp_timer *)t;
1723 	inp = (struct sctp_inpcb *)tmr->ep;
1724 	stcb = (struct sctp_tcb *)tmr->tcb;
1725 	net = (struct sctp_nets *)tmr->net;
1726 	CURVNET_SET((struct vnet *)tmr->vnet);
1727 	NET_EPOCH_ENTER(et);
1728 	released_asoc_reference = false;
1729 
1730 #ifdef SCTP_AUDITING_ENABLED
1731 	sctp_audit_log(0xF0, (uint8_t)tmr->type);
1732 	sctp_auditing(3, inp, stcb, net);
1733 #endif
1734 
1735 	/* sanity checks... */
1736 	KASSERT(tmr->self == NULL || tmr->self == tmr,
1737 	    ("sctp_timeout_handler: tmr->self corrupted"));
1738 	KASSERT(SCTP_IS_TIMER_TYPE_VALID(tmr->type),
1739 	    ("sctp_timeout_handler: invalid timer type %d", tmr->type));
1740 	type = tmr->type;
1741 	KASSERT(stcb == NULL || stcb->sctp_ep == inp,
1742 	    ("sctp_timeout_handler of type %d: inp = %p, stcb->sctp_ep %p",
1743 	    type, stcb, stcb->sctp_ep));
1744 	tmr->stopped_from = 0xa001;
1745 	if ((stcb != NULL) && (stcb->asoc.state == SCTP_STATE_EMPTY)) {
1746 		SCTPDBG(SCTP_DEBUG_TIMER2,
1747 		    "Timer type %d handler exiting due to CLOSED association.\n",
1748 		    type);
1749 		goto out_decr;
1750 	}
1751 	tmr->stopped_from = 0xa002;
1752 	SCTPDBG(SCTP_DEBUG_TIMER2, "Timer type %d goes off.\n", type);
1753 	if (!SCTP_OS_TIMER_ACTIVE(&tmr->timer)) {
1754 		SCTPDBG(SCTP_DEBUG_TIMER2,
1755 		    "Timer type %d handler exiting due to not being active.\n",
1756 		    type);
1757 		goto out_decr;
1758 	}
1759 
1760 	tmr->stopped_from = 0xa003;
1761 	if (stcb) {
1762 		SCTP_TCB_LOCK(stcb);
1763 		/*
1764 		 * Release reference so that association can be freed if
1765 		 * necessary below. This is safe now that we have acquired
1766 		 * the lock.
1767 		 */
1768 		atomic_add_int(&stcb->asoc.refcnt, -1);
1769 		released_asoc_reference = true;
1770 		if ((type != SCTP_TIMER_TYPE_ASOCKILL) &&
1771 		    ((stcb->asoc.state == SCTP_STATE_EMPTY) ||
1772 		    (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED))) {
1773 			SCTPDBG(SCTP_DEBUG_TIMER2,
1774 			    "Timer type %d handler exiting due to CLOSED association.\n",
1775 			    type);
1776 			goto out;
1777 		}
1778 	} else if (inp != NULL) {
1779 		SCTP_INP_WLOCK(inp);
1780 	} else {
1781 		SCTP_WQ_ADDR_LOCK();
1782 	}
1783 
1784 	/* Record in stopped_from which timeout occurred. */
1785 	tmr->stopped_from = type;
1786 	/* mark as being serviced now */
1787 	if (SCTP_OS_TIMER_PENDING(&tmr->timer)) {
1788 		/*
1789 		 * Callout has been rescheduled.
1790 		 */
1791 		goto out;
1792 	}
1793 	if (!SCTP_OS_TIMER_ACTIVE(&tmr->timer)) {
1794 		/*
1795 		 * Not active, so no action.
1796 		 */
1797 		goto out;
1798 	}
1799 	SCTP_OS_TIMER_DEACTIVATE(&tmr->timer);
1800 
1801 	/* call the handler for the appropriate timer type */
1802 	switch (type) {
1803 	case SCTP_TIMER_TYPE_SEND:
1804 		KASSERT(inp != NULL && stcb != NULL && net != NULL,
1805 		    ("timeout of type %d: inp = %p, stcb = %p, net = %p",
1806 		    type, inp, stcb, net));
1807 		SCTP_STAT_INCR(sctps_timodata);
1808 		stcb->asoc.timodata++;
1809 		stcb->asoc.num_send_timers_up--;
1810 		if (stcb->asoc.num_send_timers_up < 0) {
1811 			stcb->asoc.num_send_timers_up = 0;
1812 		}
1813 		SCTP_TCB_LOCK_ASSERT(stcb);
1814 		if (sctp_t3rxt_timer(inp, stcb, net)) {
1815 			/* no need to unlock on tcb its gone */
1816 
1817 			goto out_decr;
1818 		}
1819 		SCTP_TCB_LOCK_ASSERT(stcb);
1820 #ifdef SCTP_AUDITING_ENABLED
1821 		sctp_auditing(4, inp, stcb, net);
1822 #endif
1823 		sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_T3, SCTP_SO_NOT_LOCKED);
1824 		did_output = true;
1825 		if ((stcb->asoc.num_send_timers_up == 0) &&
1826 		    (stcb->asoc.sent_queue_cnt > 0)) {
1827 			struct sctp_tmit_chunk *chk;
1828 
1829 			/*
1830 			 * Safeguard. If there on some on the sent queue
1831 			 * somewhere but no timers running something is
1832 			 * wrong... so we start a timer on the first chunk
1833 			 * on the send queue on whatever net it is sent to.
1834 			 */
1835 			TAILQ_FOREACH(chk, &stcb->asoc.sent_queue, sctp_next) {
1836 				if (chk->whoTo != NULL) {
1837 					break;
1838 				}
1839 			}
1840 			if (chk != NULL) {
1841 				sctp_timer_start(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep, stcb, chk->whoTo);
1842 			}
1843 		}
1844 		break;
1845 	case SCTP_TIMER_TYPE_INIT:
1846 		KASSERT(inp != NULL && stcb != NULL && net != NULL,
1847 		    ("timeout of type %d: inp = %p, stcb = %p, net = %p",
1848 		    type, inp, stcb, net));
1849 		SCTP_STAT_INCR(sctps_timoinit);
1850 		stcb->asoc.timoinit++;
1851 		if (sctp_t1init_timer(inp, stcb, net)) {
1852 			/* no need to unlock on tcb its gone */
1853 			goto out_decr;
1854 		}
1855 		did_output = false;
1856 		break;
1857 	case SCTP_TIMER_TYPE_RECV:
1858 		KASSERT(inp != NULL && stcb != NULL && net == NULL,
1859 		    ("timeout of type %d: inp = %p, stcb = %p, net = %p",
1860 		    type, inp, stcb, net));
1861 		SCTP_STAT_INCR(sctps_timosack);
1862 		stcb->asoc.timosack++;
1863 		sctp_send_sack(stcb, SCTP_SO_NOT_LOCKED);
1864 #ifdef SCTP_AUDITING_ENABLED
1865 		sctp_auditing(4, inp, stcb, NULL);
1866 #endif
1867 		sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_SACK_TMR, SCTP_SO_NOT_LOCKED);
1868 		did_output = true;
1869 		break;
1870 	case SCTP_TIMER_TYPE_SHUTDOWN:
1871 		KASSERT(inp != NULL && stcb != NULL && net != NULL,
1872 		    ("timeout of type %d: inp = %p, stcb = %p, net = %p",
1873 		    type, inp, stcb, net));
1874 		SCTP_STAT_INCR(sctps_timoshutdown);
1875 		stcb->asoc.timoshutdown++;
1876 		if (sctp_shutdown_timer(inp, stcb, net)) {
1877 			/* no need to unlock on tcb its gone */
1878 			goto out_decr;
1879 		}
1880 #ifdef SCTP_AUDITING_ENABLED
1881 		sctp_auditing(4, inp, stcb, net);
1882 #endif
1883 		sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_SHUT_TMR, SCTP_SO_NOT_LOCKED);
1884 		did_output = true;
1885 		break;
1886 	case SCTP_TIMER_TYPE_HEARTBEAT:
1887 		KASSERT(inp != NULL && stcb != NULL && net != NULL,
1888 		    ("timeout of type %d: inp = %p, stcb = %p, net = %p",
1889 		    type, inp, stcb, net));
1890 		SCTP_STAT_INCR(sctps_timoheartbeat);
1891 		stcb->asoc.timoheartbeat++;
1892 		if (sctp_heartbeat_timer(inp, stcb, net)) {
1893 			/* no need to unlock on tcb its gone */
1894 			goto out_decr;
1895 		}
1896 #ifdef SCTP_AUDITING_ENABLED
1897 		sctp_auditing(4, inp, stcb, net);
1898 #endif
1899 		if (!(net->dest_state & SCTP_ADDR_NOHB)) {
1900 			sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, inp, stcb, net);
1901 			sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_HB_TMR, SCTP_SO_NOT_LOCKED);
1902 			did_output = true;
1903 		} else {
1904 			did_output = false;
1905 		}
1906 		break;
1907 	case SCTP_TIMER_TYPE_COOKIE:
1908 		KASSERT(inp != NULL && stcb != NULL && net != NULL,
1909 		    ("timeout of type %d: inp = %p, stcb = %p, net = %p",
1910 		    type, inp, stcb, net));
1911 		SCTP_STAT_INCR(sctps_timocookie);
1912 		stcb->asoc.timocookie++;
1913 		if (sctp_cookie_timer(inp, stcb, net)) {
1914 			/* no need to unlock on tcb its gone */
1915 			goto out_decr;
1916 		}
1917 #ifdef SCTP_AUDITING_ENABLED
1918 		sctp_auditing(4, inp, stcb, net);
1919 #endif
1920 		/*
1921 		 * We consider T3 and Cookie timer pretty much the same with
1922 		 * respect to where from in chunk_output.
1923 		 */
1924 		sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_T3, SCTP_SO_NOT_LOCKED);
1925 		did_output = true;
1926 		break;
1927 	case SCTP_TIMER_TYPE_NEWCOOKIE:
1928 		KASSERT(inp != NULL && stcb == NULL && net == NULL,
1929 		    ("timeout of type %d: inp = %p, stcb = %p, net = %p",
1930 		    type, inp, stcb, net));
1931 		SCTP_STAT_INCR(sctps_timosecret);
1932 		(void)SCTP_GETTIME_TIMEVAL(&tv);
1933 		inp->sctp_ep.time_of_secret_change = tv.tv_sec;
1934 		inp->sctp_ep.last_secret_number =
1935 		    inp->sctp_ep.current_secret_number;
1936 		inp->sctp_ep.current_secret_number++;
1937 		if (inp->sctp_ep.current_secret_number >=
1938 		    SCTP_HOW_MANY_SECRETS) {
1939 			inp->sctp_ep.current_secret_number = 0;
1940 		}
1941 		secret = (int)inp->sctp_ep.current_secret_number;
1942 		for (i = 0; i < SCTP_NUMBER_OF_SECRETS; i++) {
1943 			inp->sctp_ep.secret_key[secret][i] =
1944 			    sctp_select_initial_TSN(&inp->sctp_ep);
1945 		}
1946 		sctp_timer_start(SCTP_TIMER_TYPE_NEWCOOKIE, inp, NULL, NULL);
1947 		did_output = false;
1948 		break;
1949 	case SCTP_TIMER_TYPE_PATHMTURAISE:
1950 		KASSERT(inp != NULL && stcb != NULL && net != NULL,
1951 		    ("timeout of type %d: inp = %p, stcb = %p, net = %p",
1952 		    type, inp, stcb, net));
1953 		SCTP_STAT_INCR(sctps_timopathmtu);
1954 		sctp_pathmtu_timer(inp, stcb, net);
1955 		did_output = false;
1956 		break;
1957 	case SCTP_TIMER_TYPE_SHUTDOWNACK:
1958 		KASSERT(inp != NULL && stcb != NULL && net != NULL,
1959 		    ("timeout of type %d: inp = %p, stcb = %p, net = %p",
1960 		    type, inp, stcb, net));
1961 		if (sctp_shutdownack_timer(inp, stcb, net)) {
1962 			/* no need to unlock on tcb its gone */
1963 			goto out_decr;
1964 		}
1965 		SCTP_STAT_INCR(sctps_timoshutdownack);
1966 		stcb->asoc.timoshutdownack++;
1967 #ifdef SCTP_AUDITING_ENABLED
1968 		sctp_auditing(4, inp, stcb, net);
1969 #endif
1970 		sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_SHUT_ACK_TMR, SCTP_SO_NOT_LOCKED);
1971 		did_output = true;
1972 		break;
1973 	case SCTP_TIMER_TYPE_ASCONF:
1974 		KASSERT(inp != NULL && stcb != NULL && net != NULL,
1975 		    ("timeout of type %d: inp = %p, stcb = %p, net = %p",
1976 		    type, inp, stcb, net));
1977 		SCTP_STAT_INCR(sctps_timoasconf);
1978 		if (sctp_asconf_timer(inp, stcb, net)) {
1979 			/* no need to unlock on tcb its gone */
1980 			goto out_decr;
1981 		}
1982 #ifdef SCTP_AUDITING_ENABLED
1983 		sctp_auditing(4, inp, stcb, net);
1984 #endif
1985 		sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_ASCONF_TMR, SCTP_SO_NOT_LOCKED);
1986 		did_output = true;
1987 		break;
1988 	case SCTP_TIMER_TYPE_SHUTDOWNGUARD:
1989 		KASSERT(inp != NULL && stcb != NULL && net == NULL,
1990 		    ("timeout of type %d: inp = %p, stcb = %p, net = %p",
1991 		    type, inp, stcb, net));
1992 		SCTP_STAT_INCR(sctps_timoshutdownguard);
1993 		op_err = sctp_generate_cause(SCTP_BASE_SYSCTL(sctp_diag_info_code),
1994 		    "Shutdown guard timer expired");
1995 		sctp_abort_an_association(inp, stcb, op_err, SCTP_SO_NOT_LOCKED);
1996 		/* no need to unlock on tcb its gone */
1997 		goto out_decr;
1998 	case SCTP_TIMER_TYPE_AUTOCLOSE:
1999 		KASSERT(inp != NULL && stcb != NULL && net == NULL,
2000 		    ("timeout of type %d: inp = %p, stcb = %p, net = %p",
2001 		    type, inp, stcb, net));
2002 		SCTP_STAT_INCR(sctps_timoautoclose);
2003 		sctp_autoclose_timer(inp, stcb);
2004 		sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_AUTOCLOSE_TMR, SCTP_SO_NOT_LOCKED);
2005 		did_output = true;
2006 		break;
2007 	case SCTP_TIMER_TYPE_STRRESET:
2008 		KASSERT(inp != NULL && stcb != NULL && net == NULL,
2009 		    ("timeout of type %d: inp = %p, stcb = %p, net = %p",
2010 		    type, inp, stcb, net));
2011 		SCTP_STAT_INCR(sctps_timostrmrst);
2012 		if (sctp_strreset_timer(inp, stcb)) {
2013 			/* no need to unlock on tcb its gone */
2014 			goto out_decr;
2015 		}
2016 		sctp_chunk_output(inp, stcb, SCTP_OUTPUT_FROM_STRRST_TMR, SCTP_SO_NOT_LOCKED);
2017 		did_output = true;
2018 		break;
2019 	case SCTP_TIMER_TYPE_INPKILL:
2020 		KASSERT(inp != NULL && stcb == NULL && net == NULL,
2021 		    ("timeout of type %d: inp = %p, stcb = %p, net = %p",
2022 		    type, inp, stcb, net));
2023 		SCTP_STAT_INCR(sctps_timoinpkill);
2024 		/*
2025 		 * special case, take away our increment since WE are the
2026 		 * killer
2027 		 */
2028 		sctp_timer_stop(SCTP_TIMER_TYPE_INPKILL, inp, NULL, NULL,
2029 		    SCTP_FROM_SCTPUTIL + SCTP_LOC_3);
2030 		SCTP_INP_DECR_REF(inp);
2031 		SCTP_INP_WUNLOCK(inp);
2032 		sctp_inpcb_free(inp, SCTP_FREE_SHOULD_USE_ABORT,
2033 		    SCTP_CALLED_FROM_INPKILL_TIMER);
2034 		inp = NULL;
2035 		goto out_decr;
2036 	case SCTP_TIMER_TYPE_ASOCKILL:
2037 		KASSERT(inp != NULL && stcb != NULL && net == NULL,
2038 		    ("timeout of type %d: inp = %p, stcb = %p, net = %p",
2039 		    type, inp, stcb, net));
2040 		SCTP_STAT_INCR(sctps_timoassockill);
2041 		/* Can we free it yet? */
2042 		sctp_timer_stop(SCTP_TIMER_TYPE_ASOCKILL, inp, stcb, NULL,
2043 		    SCTP_FROM_SCTPUTIL + SCTP_LOC_1);
2044 		(void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC,
2045 		    SCTP_FROM_SCTPUTIL + SCTP_LOC_2);
2046 		/*
2047 		 * free asoc, always unlocks (or destroy's) so prevent
2048 		 * duplicate unlock or unlock of a free mtx :-0
2049 		 */
2050 		stcb = NULL;
2051 		goto out_decr;
2052 	case SCTP_TIMER_TYPE_ADDR_WQ:
2053 		KASSERT(inp == NULL && stcb == NULL && net == NULL,
2054 		    ("timeout of type %d: inp = %p, stcb = %p, net = %p",
2055 		    type, inp, stcb, net));
2056 		sctp_handle_addr_wq();
2057 		did_output = true;
2058 		break;
2059 	case SCTP_TIMER_TYPE_PRIM_DELETED:
2060 		KASSERT(inp != NULL && stcb != NULL && net == NULL,
2061 		    ("timeout of type %d: inp = %p, stcb = %p, net = %p",
2062 		    type, inp, stcb, net));
2063 		SCTP_STAT_INCR(sctps_timodelprim);
2064 		sctp_delete_prim_timer(inp, stcb);
2065 		did_output = false;
2066 		break;
2067 	default:
2068 #ifdef INVARIANTS
2069 		panic("Unknown timer type %d", type);
2070 #else
2071 		goto out;
2072 #endif
2073 	}
2074 #ifdef SCTP_AUDITING_ENABLED
2075 	sctp_audit_log(0xF1, (uint8_t)type);
2076 	if (inp != NULL)
2077 		sctp_auditing(5, inp, stcb, net);
2078 #endif
2079 	if (did_output && (stcb != NULL)) {
2080 		/*
2081 		 * Now we need to clean up the control chunk chain if an
2082 		 * ECNE is on it. It must be marked as UNSENT again so next
2083 		 * call will continue to send it until such time that we get
2084 		 * a CWR, to remove it. It is, however, less likely that we
2085 		 * will find a ecn echo on the chain though.
2086 		 */
2087 		sctp_fix_ecn_echo(&stcb->asoc);
2088 	}
2089 out:
2090 	if (stcb != NULL) {
2091 		SCTP_TCB_UNLOCK(stcb);
2092 	} else if (inp != NULL) {
2093 		SCTP_INP_WUNLOCK(inp);
2094 	} else {
2095 		SCTP_WQ_ADDR_UNLOCK();
2096 	}
2097 
2098 out_decr:
2099 	/* These reference counts were incremented in sctp_timer_start(). */
2100 	if (inp != NULL) {
2101 		SCTP_INP_DECR_REF(inp);
2102 	}
2103 	if ((stcb != NULL) && !released_asoc_reference) {
2104 		atomic_add_int(&stcb->asoc.refcnt, -1);
2105 	}
2106 	if (net != NULL) {
2107 		sctp_free_remote_addr(net);
2108 	}
2109 	SCTPDBG(SCTP_DEBUG_TIMER2, "Timer type %d handler finished.\n", type);
2110 	CURVNET_RESTORE();
2111 	NET_EPOCH_EXIT(et);
2112 }
2113 
2114 /*-
2115  * The following table shows which parameters must be provided
2116  * when calling sctp_timer_start(). For parameters not being
2117  * provided, NULL must be used.
2118  *
2119  * |Name                         |inp |stcb|net |
2120  * |-----------------------------|----|----|----|
2121  * |SCTP_TIMER_TYPE_SEND         |Yes |Yes |Yes |
2122  * |SCTP_TIMER_TYPE_INIT         |Yes |Yes |Yes |
2123  * |SCTP_TIMER_TYPE_RECV         |Yes |Yes |No  |
2124  * |SCTP_TIMER_TYPE_SHUTDOWN     |Yes |Yes |Yes |
2125  * |SCTP_TIMER_TYPE_HEARTBEAT    |Yes |Yes |Yes |
2126  * |SCTP_TIMER_TYPE_COOKIE       |Yes |Yes |Yes |
2127  * |SCTP_TIMER_TYPE_NEWCOOKIE    |Yes |No  |No  |
2128  * |SCTP_TIMER_TYPE_PATHMTURAISE |Yes |Yes |Yes |
2129  * |SCTP_TIMER_TYPE_SHUTDOWNACK  |Yes |Yes |Yes |
2130  * |SCTP_TIMER_TYPE_ASCONF       |Yes |Yes |Yes |
2131  * |SCTP_TIMER_TYPE_SHUTDOWNGUARD|Yes |Yes |No  |
2132  * |SCTP_TIMER_TYPE_AUTOCLOSE    |Yes |Yes |No  |
2133  * |SCTP_TIMER_TYPE_STRRESET     |Yes |Yes |Yes |
2134  * |SCTP_TIMER_TYPE_INPKILL      |Yes |No  |No  |
2135  * |SCTP_TIMER_TYPE_ASOCKILL     |Yes |Yes |No  |
2136  * |SCTP_TIMER_TYPE_ADDR_WQ      |No  |No  |No  |
2137  * |SCTP_TIMER_TYPE_PRIM_DELETED |Yes |Yes |No  |
2138  *
2139  */
2140 
2141 void
2142 sctp_timer_start(int t_type, struct sctp_inpcb *inp, struct sctp_tcb *stcb,
2143     struct sctp_nets *net)
2144 {
2145 	struct sctp_timer *tmr;
2146 	uint32_t to_ticks;
2147 	uint32_t rndval, jitter;
2148 
2149 	KASSERT(stcb == NULL || stcb->sctp_ep == inp,
2150 	    ("sctp_timer_start of type %d: inp = %p, stcb->sctp_ep %p",
2151 	    t_type, stcb, stcb->sctp_ep));
2152 	tmr = NULL;
2153 	if (stcb != NULL) {
2154 		SCTP_TCB_LOCK_ASSERT(stcb);
2155 	} else if (inp != NULL) {
2156 		SCTP_INP_WLOCK_ASSERT(inp);
2157 	} else {
2158 		SCTP_WQ_ADDR_LOCK_ASSERT();
2159 	}
2160 	if (stcb != NULL) {
2161 		/*
2162 		 * Don't restart timer on association that's about to be
2163 		 * killed.
2164 		 */
2165 		if ((stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) &&
2166 		    (t_type != SCTP_TIMER_TYPE_ASOCKILL)) {
2167 			SCTPDBG(SCTP_DEBUG_TIMER2,
2168 			    "Timer type %d not started: inp=%p, stcb=%p, net=%p (stcb deleted).\n",
2169 			    t_type, inp, stcb, net);
2170 			return;
2171 		}
2172 		/* Don't restart timer on net that's been removed. */
2173 		if (net != NULL && (net->dest_state & SCTP_ADDR_BEING_DELETED)) {
2174 			SCTPDBG(SCTP_DEBUG_TIMER2,
2175 			    "Timer type %d not started: inp=%p, stcb=%p, net=%p (net deleted).\n",
2176 			    t_type, inp, stcb, net);
2177 			return;
2178 		}
2179 	}
2180 	switch (t_type) {
2181 	case SCTP_TIMER_TYPE_SEND:
2182 		/* Here we use the RTO timer. */
2183 		if ((inp == NULL) || (stcb == NULL) || (net == NULL)) {
2184 #ifdef INVARIANTS
2185 			panic("sctp_timer_start of type %d: inp = %p, stcb = %p, net = %p",
2186 			    t_type, inp, stcb, net);
2187 #else
2188 			return;
2189 #endif
2190 		}
2191 		tmr = &net->rxt_timer;
2192 		if (net->RTO == 0) {
2193 			to_ticks = sctp_msecs_to_ticks(stcb->asoc.initial_rto);
2194 		} else {
2195 			to_ticks = sctp_msecs_to_ticks(net->RTO);
2196 		}
2197 		break;
2198 	case SCTP_TIMER_TYPE_INIT:
2199 		/*
2200 		 * Here we use the INIT timer default usually about 1
2201 		 * second.
2202 		 */
2203 		if ((inp == NULL) || (stcb == NULL) || (net == NULL)) {
2204 #ifdef INVARIANTS
2205 			panic("sctp_timer_start of type %d: inp = %p, stcb = %p, net = %p",
2206 			    t_type, inp, stcb, net);
2207 #else
2208 			return;
2209 #endif
2210 		}
2211 		tmr = &net->rxt_timer;
2212 		if (net->RTO == 0) {
2213 			to_ticks = sctp_msecs_to_ticks(stcb->asoc.initial_rto);
2214 		} else {
2215 			to_ticks = sctp_msecs_to_ticks(net->RTO);
2216 		}
2217 		break;
2218 	case SCTP_TIMER_TYPE_RECV:
2219 		/*
2220 		 * Here we use the Delayed-Ack timer value from the inp,
2221 		 * ususually about 200ms.
2222 		 */
2223 		if ((inp == NULL) || (stcb == NULL) || (net != NULL)) {
2224 #ifdef INVARIANTS
2225 			panic("sctp_timer_start of type %d: inp = %p, stcb = %p, net = %p",
2226 			    t_type, inp, stcb, net);
2227 #else
2228 			return;
2229 #endif
2230 		}
2231 		tmr = &stcb->asoc.dack_timer;
2232 		to_ticks = sctp_msecs_to_ticks(stcb->asoc.delayed_ack);
2233 		break;
2234 	case SCTP_TIMER_TYPE_SHUTDOWN:
2235 		/* Here we use the RTO of the destination. */
2236 		if ((inp == NULL) || (stcb == NULL) || (net == NULL)) {
2237 #ifdef INVARIANTS
2238 			panic("sctp_timer_start of type %d: inp = %p, stcb = %p, net = %p",
2239 			    t_type, inp, stcb, net);
2240 #else
2241 			return;
2242 #endif
2243 		}
2244 		tmr = &net->rxt_timer;
2245 		if (net->RTO == 0) {
2246 			to_ticks = sctp_msecs_to_ticks(stcb->asoc.initial_rto);
2247 		} else {
2248 			to_ticks = sctp_msecs_to_ticks(net->RTO);
2249 		}
2250 		break;
2251 	case SCTP_TIMER_TYPE_HEARTBEAT:
2252 		/*
2253 		 * The net is used here so that we can add in the RTO. Even
2254 		 * though we use a different timer. We also add the HB timer
2255 		 * PLUS a random jitter.
2256 		 */
2257 		if ((inp == NULL) || (stcb == NULL) || (net == NULL)) {
2258 #ifdef INVARIANTS
2259 			panic("sctp_timer_start of type %d: inp = %p, stcb = %p, net = %p",
2260 			    t_type, inp, stcb, net);
2261 #else
2262 			return;
2263 #endif
2264 		}
2265 		if ((net->dest_state & SCTP_ADDR_NOHB) &&
2266 		    !(net->dest_state & SCTP_ADDR_UNCONFIRMED)) {
2267 			SCTPDBG(SCTP_DEBUG_TIMER2,
2268 			    "Timer type %d not started: inp=%p, stcb=%p, net=%p.\n",
2269 			    t_type, inp, stcb, net);
2270 			return;
2271 		}
2272 		tmr = &net->hb_timer;
2273 		if (net->RTO == 0) {
2274 			to_ticks = stcb->asoc.initial_rto;
2275 		} else {
2276 			to_ticks = net->RTO;
2277 		}
2278 		rndval = sctp_select_initial_TSN(&inp->sctp_ep);
2279 		jitter = rndval % to_ticks;
2280 		to_ticks >>= 1;
2281 		if (jitter < (UINT32_MAX - to_ticks)) {
2282 			to_ticks += jitter;
2283 		} else {
2284 			to_ticks = UINT32_MAX;
2285 		}
2286 		if (!(net->dest_state & SCTP_ADDR_UNCONFIRMED) &&
2287 		    !(net->dest_state & SCTP_ADDR_PF)) {
2288 			if (net->heart_beat_delay < (UINT32_MAX - to_ticks)) {
2289 				to_ticks += net->heart_beat_delay;
2290 			} else {
2291 				to_ticks = UINT32_MAX;
2292 			}
2293 		}
2294 		/*
2295 		 * Now we must convert the to_ticks that are now in ms to
2296 		 * ticks.
2297 		 */
2298 		to_ticks = sctp_msecs_to_ticks(to_ticks);
2299 		break;
2300 	case SCTP_TIMER_TYPE_COOKIE:
2301 		/*
2302 		 * Here we can use the RTO timer from the network since one
2303 		 * RTT was complete. If a retransmission happened then we
2304 		 * will be using the RTO initial value.
2305 		 */
2306 		if ((inp == NULL) || (stcb == NULL) || (net == NULL)) {
2307 #ifdef INVARIANTS
2308 			panic("sctp_timer_start of type %d: inp = %p, stcb = %p, net = %p",
2309 			    t_type, inp, stcb, net);
2310 #else
2311 			return;
2312 #endif
2313 		}
2314 		tmr = &net->rxt_timer;
2315 		if (net->RTO == 0) {
2316 			to_ticks = sctp_msecs_to_ticks(stcb->asoc.initial_rto);
2317 		} else {
2318 			to_ticks = sctp_msecs_to_ticks(net->RTO);
2319 		}
2320 		break;
2321 	case SCTP_TIMER_TYPE_NEWCOOKIE:
2322 		/*
2323 		 * Nothing needed but the endpoint here ususually about 60
2324 		 * minutes.
2325 		 */
2326 		if ((inp == NULL) || (stcb != NULL) || (net != NULL)) {
2327 #ifdef INVARIANTS
2328 			panic("sctp_timer_start of type %d: inp = %p, stcb = %p, net = %p",
2329 			    t_type, inp, stcb, net);
2330 #else
2331 			return;
2332 #endif
2333 		}
2334 		tmr = &inp->sctp_ep.signature_change;
2335 		to_ticks = inp->sctp_ep.sctp_timeoutticks[SCTP_TIMER_SIGNATURE];
2336 		break;
2337 	case SCTP_TIMER_TYPE_PATHMTURAISE:
2338 		/*
2339 		 * Here we use the value found in the EP for PMTUD,
2340 		 * ususually about 10 minutes.
2341 		 */
2342 		if ((inp == NULL) || (stcb == NULL) || (net == NULL)) {
2343 #ifdef INVARIANTS
2344 			panic("sctp_timer_start of type %d: inp = %p, stcb = %p, net = %p",
2345 			    t_type, inp, stcb, net);
2346 #else
2347 			return;
2348 #endif
2349 		}
2350 		if (net->dest_state & SCTP_ADDR_NO_PMTUD) {
2351 			SCTPDBG(SCTP_DEBUG_TIMER2,
2352 			    "Timer type %d not started: inp=%p, stcb=%p, net=%p.\n",
2353 			    t_type, inp, stcb, net);
2354 			return;
2355 		}
2356 		tmr = &net->pmtu_timer;
2357 		to_ticks = inp->sctp_ep.sctp_timeoutticks[SCTP_TIMER_PMTU];
2358 		break;
2359 	case SCTP_TIMER_TYPE_SHUTDOWNACK:
2360 		/* Here we use the RTO of the destination. */
2361 		if ((inp == NULL) || (stcb == NULL) || (net == NULL)) {
2362 #ifdef INVARIANTS
2363 			panic("sctp_timer_start of type %d: inp = %p, stcb = %p, net = %p",
2364 			    t_type, inp, stcb, net);
2365 #else
2366 			return;
2367 #endif
2368 		}
2369 		tmr = &net->rxt_timer;
2370 		if (net->RTO == 0) {
2371 			to_ticks = sctp_msecs_to_ticks(stcb->asoc.initial_rto);
2372 		} else {
2373 			to_ticks = sctp_msecs_to_ticks(net->RTO);
2374 		}
2375 		break;
2376 	case SCTP_TIMER_TYPE_ASCONF:
2377 		/*
2378 		 * Here the timer comes from the stcb but its value is from
2379 		 * the net's RTO.
2380 		 */
2381 		if ((inp == NULL) || (stcb == NULL) || (net == NULL)) {
2382 #ifdef INVARIANTS
2383 			panic("sctp_timer_start of type %d: inp = %p, stcb = %p, net = %p",
2384 			    t_type, inp, stcb, net);
2385 #else
2386 			return;
2387 #endif
2388 		}
2389 		tmr = &stcb->asoc.asconf_timer;
2390 		if (net->RTO == 0) {
2391 			to_ticks = sctp_msecs_to_ticks(stcb->asoc.initial_rto);
2392 		} else {
2393 			to_ticks = sctp_msecs_to_ticks(net->RTO);
2394 		}
2395 		break;
2396 	case SCTP_TIMER_TYPE_SHUTDOWNGUARD:
2397 		/*
2398 		 * Here we use the endpoints shutdown guard timer usually
2399 		 * about 3 minutes.
2400 		 */
2401 		if ((inp == NULL) || (stcb == NULL) || (net != NULL)) {
2402 #ifdef INVARIANTS
2403 			panic("sctp_timer_start of type %d: inp = %p, stcb = %p, net = %p",
2404 			    t_type, inp, stcb, net);
2405 #else
2406 			return;
2407 #endif
2408 		}
2409 		tmr = &stcb->asoc.shut_guard_timer;
2410 		if (inp->sctp_ep.sctp_timeoutticks[SCTP_TIMER_MAXSHUTDOWN] == 0) {
2411 			if (stcb->asoc.maxrto < UINT32_MAX / 5) {
2412 				to_ticks = sctp_msecs_to_ticks(5 * stcb->asoc.maxrto);
2413 			} else {
2414 				to_ticks = sctp_msecs_to_ticks(UINT32_MAX);
2415 			}
2416 		} else {
2417 			to_ticks = inp->sctp_ep.sctp_timeoutticks[SCTP_TIMER_MAXSHUTDOWN];
2418 		}
2419 		break;
2420 	case SCTP_TIMER_TYPE_AUTOCLOSE:
2421 		if ((inp == NULL) || (stcb == NULL) || (net != NULL)) {
2422 #ifdef INVARIANTS
2423 			panic("sctp_timer_start of type %d: inp = %p, stcb = %p, net = %p",
2424 			    t_type, inp, stcb, net);
2425 #else
2426 			return;
2427 #endif
2428 		}
2429 		tmr = &stcb->asoc.autoclose_timer;
2430 		to_ticks = stcb->asoc.sctp_autoclose_ticks;
2431 		break;
2432 	case SCTP_TIMER_TYPE_STRRESET:
2433 		/*
2434 		 * Here the timer comes from the stcb but its value is from
2435 		 * the net's RTO.
2436 		 */
2437 		if ((inp == NULL) || (stcb == NULL) || (net == NULL)) {
2438 #ifdef INVARIANTS
2439 			panic("sctp_timer_start of type %d: inp = %p, stcb = %p, net = %p",
2440 			    t_type, inp, stcb, net);
2441 #else
2442 			return;
2443 #endif
2444 		}
2445 		tmr = &stcb->asoc.strreset_timer;
2446 		if (net->RTO == 0) {
2447 			to_ticks = sctp_msecs_to_ticks(stcb->asoc.initial_rto);
2448 		} else {
2449 			to_ticks = sctp_msecs_to_ticks(net->RTO);
2450 		}
2451 		break;
2452 	case SCTP_TIMER_TYPE_INPKILL:
2453 		/*
2454 		 * The inp is setup to die. We re-use the signature_chage
2455 		 * timer since that has stopped and we are in the GONE
2456 		 * state.
2457 		 */
2458 		if ((inp == NULL) || (stcb != NULL) || (net != NULL)) {
2459 #ifdef INVARIANTS
2460 			panic("sctp_timer_start of type %d: inp = %p, stcb = %p, net = %p",
2461 			    t_type, inp, stcb, net);
2462 #else
2463 			return;
2464 #endif
2465 		}
2466 		tmr = &inp->sctp_ep.signature_change;
2467 		to_ticks = sctp_msecs_to_ticks(SCTP_INP_KILL_TIMEOUT);
2468 		break;
2469 	case SCTP_TIMER_TYPE_ASOCKILL:
2470 		if ((inp == NULL) || (stcb == NULL) || (net != NULL)) {
2471 #ifdef INVARIANTS
2472 			panic("sctp_timer_start of type %d: inp = %p, stcb = %p, net = %p",
2473 			    t_type, inp, stcb, net);
2474 #else
2475 			return;
2476 #endif
2477 		}
2478 		tmr = &stcb->asoc.strreset_timer;
2479 		to_ticks = sctp_msecs_to_ticks(SCTP_ASOC_KILL_TIMEOUT);
2480 		break;
2481 	case SCTP_TIMER_TYPE_ADDR_WQ:
2482 		if ((inp != NULL) || (stcb != NULL) || (net != NULL)) {
2483 #ifdef INVARIANTS
2484 			panic("sctp_timer_start of type %d: inp = %p, stcb = %p, net = %p",
2485 			    t_type, inp, stcb, net);
2486 #else
2487 			return;
2488 #endif
2489 		}
2490 		/* Only 1 tick away :-) */
2491 		tmr = &SCTP_BASE_INFO(addr_wq_timer);
2492 		to_ticks = SCTP_ADDRESS_TICK_DELAY;
2493 		break;
2494 	case SCTP_TIMER_TYPE_PRIM_DELETED:
2495 		if ((inp == NULL) || (stcb == NULL) || (net != NULL)) {
2496 #ifdef INVARIANTS
2497 			panic("sctp_timer_start of type %d: inp = %p, stcb = %p, net = %p",
2498 			    t_type, inp, stcb, net);
2499 #else
2500 			return;
2501 #endif
2502 		}
2503 		tmr = &stcb->asoc.delete_prim_timer;
2504 		to_ticks = sctp_msecs_to_ticks(stcb->asoc.initial_rto);
2505 		break;
2506 	default:
2507 #ifdef INVARIANTS
2508 		panic("Unknown timer type %d", t_type);
2509 #else
2510 		return;
2511 #endif
2512 	}
2513 	KASSERT(tmr != NULL, ("tmr is NULL for timer type %d", t_type));
2514 	KASSERT(to_ticks > 0, ("to_ticks == 0 for timer type %d", t_type));
2515 	if (SCTP_OS_TIMER_PENDING(&tmr->timer)) {
2516 		/*
2517 		 * We do NOT allow you to have it already running. If it is,
2518 		 * we leave the current one up unchanged.
2519 		 */
2520 		SCTPDBG(SCTP_DEBUG_TIMER2,
2521 		    "Timer type %d already running: inp=%p, stcb=%p, net=%p.\n",
2522 		    t_type, inp, stcb, net);
2523 		return;
2524 	}
2525 	/* At this point we can proceed. */
2526 	if (t_type == SCTP_TIMER_TYPE_SEND) {
2527 		stcb->asoc.num_send_timers_up++;
2528 	}
2529 	tmr->stopped_from = 0;
2530 	tmr->type = t_type;
2531 	tmr->ep = (void *)inp;
2532 	tmr->tcb = (void *)stcb;
2533 	if (t_type == SCTP_TIMER_TYPE_STRRESET) {
2534 		tmr->net = NULL;
2535 	} else {
2536 		tmr->net = (void *)net;
2537 	}
2538 	tmr->self = (void *)tmr;
2539 	tmr->vnet = (void *)curvnet;
2540 	tmr->ticks = sctp_get_tick_count();
2541 	if (SCTP_OS_TIMER_START(&tmr->timer, to_ticks, sctp_timeout_handler, tmr) == 0) {
2542 		SCTPDBG(SCTP_DEBUG_TIMER2,
2543 		    "Timer type %d started: ticks=%u, inp=%p, stcb=%p, net=%p.\n",
2544 		    t_type, to_ticks, inp, stcb, net);
2545 		/*
2546 		 * If this is a newly scheduled callout, as opposed to a
2547 		 * rescheduled one, increment relevant reference counts.
2548 		 */
2549 		if (tmr->ep != NULL) {
2550 			SCTP_INP_INCR_REF(inp);
2551 		}
2552 		if (tmr->tcb != NULL) {
2553 			atomic_add_int(&stcb->asoc.refcnt, 1);
2554 		}
2555 		if (tmr->net != NULL) {
2556 			atomic_add_int(&net->ref_count, 1);
2557 		}
2558 	} else {
2559 		/*
2560 		 * This should not happen, since we checked for pending
2561 		 * above.
2562 		 */
2563 		SCTPDBG(SCTP_DEBUG_TIMER2,
2564 		    "Timer type %d restarted: ticks=%u, inp=%p, stcb=%p, net=%p.\n",
2565 		    t_type, to_ticks, inp, stcb, net);
2566 	}
2567 	return;
2568 }
2569 
2570 /*-
2571  * The following table shows which parameters must be provided
2572  * when calling sctp_timer_stop(). For parameters not being
2573  * provided, NULL must be used.
2574  *
2575  * |Name                         |inp |stcb|net |
2576  * |-----------------------------|----|----|----|
2577  * |SCTP_TIMER_TYPE_SEND         |Yes |Yes |Yes |
2578  * |SCTP_TIMER_TYPE_INIT         |Yes |Yes |Yes |
2579  * |SCTP_TIMER_TYPE_RECV         |Yes |Yes |No  |
2580  * |SCTP_TIMER_TYPE_SHUTDOWN     |Yes |Yes |Yes |
2581  * |SCTP_TIMER_TYPE_HEARTBEAT    |Yes |Yes |Yes |
2582  * |SCTP_TIMER_TYPE_COOKIE       |Yes |Yes |Yes |
2583  * |SCTP_TIMER_TYPE_NEWCOOKIE    |Yes |No  |No  |
2584  * |SCTP_TIMER_TYPE_PATHMTURAISE |Yes |Yes |Yes |
2585  * |SCTP_TIMER_TYPE_SHUTDOWNACK  |Yes |Yes |Yes |
2586  * |SCTP_TIMER_TYPE_ASCONF       |Yes |Yes |No  |
2587  * |SCTP_TIMER_TYPE_SHUTDOWNGUARD|Yes |Yes |No  |
2588  * |SCTP_TIMER_TYPE_AUTOCLOSE    |Yes |Yes |No  |
2589  * |SCTP_TIMER_TYPE_STRRESET     |Yes |Yes |No  |
2590  * |SCTP_TIMER_TYPE_INPKILL      |Yes |No  |No  |
2591  * |SCTP_TIMER_TYPE_ASOCKILL     |Yes |Yes |No  |
2592  * |SCTP_TIMER_TYPE_ADDR_WQ      |No  |No  |No  |
2593  * |SCTP_TIMER_TYPE_PRIM_DELETED |Yes |Yes |No  |
2594  *
2595  */
2596 
2597 void
2598 sctp_timer_stop(int t_type, struct sctp_inpcb *inp, struct sctp_tcb *stcb,
2599     struct sctp_nets *net, uint32_t from)
2600 {
2601 	struct sctp_timer *tmr;
2602 
2603 	KASSERT(stcb == NULL || stcb->sctp_ep == inp,
2604 	    ("sctp_timer_stop of type %d: inp = %p, stcb->sctp_ep %p",
2605 	    t_type, stcb, stcb->sctp_ep));
2606 	if (stcb != NULL) {
2607 		SCTP_TCB_LOCK_ASSERT(stcb);
2608 	} else if (inp != NULL) {
2609 		SCTP_INP_WLOCK_ASSERT(inp);
2610 	} else {
2611 		SCTP_WQ_ADDR_LOCK_ASSERT();
2612 	}
2613 	tmr = NULL;
2614 	switch (t_type) {
2615 	case SCTP_TIMER_TYPE_SEND:
2616 		if ((inp == NULL) || (stcb == NULL) || (net == NULL)) {
2617 #ifdef INVARIANTS
2618 			panic("sctp_timer_stop of type %d: inp = %p, stcb = %p, net = %p",
2619 			    t_type, inp, stcb, net);
2620 #else
2621 			return;
2622 #endif
2623 		}
2624 		tmr = &net->rxt_timer;
2625 		break;
2626 	case SCTP_TIMER_TYPE_INIT:
2627 		if ((inp == NULL) || (stcb == NULL) || (net == NULL)) {
2628 #ifdef INVARIANTS
2629 			panic("sctp_timer_stop of type %d: inp = %p, stcb = %p, net = %p",
2630 			    t_type, inp, stcb, net);
2631 #else
2632 			return;
2633 #endif
2634 		}
2635 		tmr = &net->rxt_timer;
2636 		break;
2637 	case SCTP_TIMER_TYPE_RECV:
2638 		if ((inp == NULL) || (stcb == NULL) || (net != NULL)) {
2639 #ifdef INVARIANTS
2640 			panic("sctp_timer_stop of type %d: inp = %p, stcb = %p, net = %p",
2641 			    t_type, inp, stcb, net);
2642 #else
2643 			return;
2644 #endif
2645 		}
2646 		tmr = &stcb->asoc.dack_timer;
2647 		break;
2648 	case SCTP_TIMER_TYPE_SHUTDOWN:
2649 		if ((inp == NULL) || (stcb == NULL) || (net == NULL)) {
2650 #ifdef INVARIANTS
2651 			panic("sctp_timer_stop of type %d: inp = %p, stcb = %p, net = %p",
2652 			    t_type, inp, stcb, net);
2653 #else
2654 			return;
2655 #endif
2656 		}
2657 		tmr = &net->rxt_timer;
2658 		break;
2659 	case SCTP_TIMER_TYPE_HEARTBEAT:
2660 		if ((inp == NULL) || (stcb == NULL) || (net == NULL)) {
2661 #ifdef INVARIANTS
2662 			panic("sctp_timer_stop of type %d: inp = %p, stcb = %p, net = %p",
2663 			    t_type, inp, stcb, net);
2664 #else
2665 			return;
2666 #endif
2667 		}
2668 		tmr = &net->hb_timer;
2669 		break;
2670 	case SCTP_TIMER_TYPE_COOKIE:
2671 		if ((inp == NULL) || (stcb == NULL) || (net == NULL)) {
2672 #ifdef INVARIANTS
2673 			panic("sctp_timer_stop of type %d: inp = %p, stcb = %p, net = %p",
2674 			    t_type, inp, stcb, net);
2675 #else
2676 			return;
2677 #endif
2678 		}
2679 		tmr = &net->rxt_timer;
2680 		break;
2681 	case SCTP_TIMER_TYPE_NEWCOOKIE:
2682 		if ((inp == NULL) || (stcb != NULL) || (net != NULL)) {
2683 #ifdef INVARIANTS
2684 			panic("sctp_timer_stop of type %d: inp = %p, stcb = %p, net = %p",
2685 			    t_type, inp, stcb, net);
2686 #else
2687 			return;
2688 #endif
2689 		}
2690 		tmr = &inp->sctp_ep.signature_change;
2691 		break;
2692 	case SCTP_TIMER_TYPE_PATHMTURAISE:
2693 		if ((inp == NULL) || (stcb == NULL) || (net == NULL)) {
2694 #ifdef INVARIANTS
2695 			panic("sctp_timer_stop of type %d: inp = %p, stcb = %p, net = %p",
2696 			    t_type, inp, stcb, net);
2697 #else
2698 			return;
2699 #endif
2700 		}
2701 		tmr = &net->pmtu_timer;
2702 		break;
2703 	case SCTP_TIMER_TYPE_SHUTDOWNACK:
2704 		if ((inp == NULL) || (stcb == NULL) || (net == NULL)) {
2705 #ifdef INVARIANTS
2706 			panic("sctp_timer_stop of type %d: inp = %p, stcb = %p, net = %p",
2707 			    t_type, inp, stcb, net);
2708 #else
2709 			return;
2710 #endif
2711 		}
2712 		tmr = &net->rxt_timer;
2713 		break;
2714 	case SCTP_TIMER_TYPE_ASCONF:
2715 		if ((inp == NULL) || (stcb == NULL) || (net != NULL)) {
2716 #ifdef INVARIANTS
2717 			panic("sctp_timer_stop of type %d: inp = %p, stcb = %p, net = %p",
2718 			    t_type, inp, stcb, net);
2719 #else
2720 			return;
2721 #endif
2722 		}
2723 		tmr = &stcb->asoc.asconf_timer;
2724 		break;
2725 	case SCTP_TIMER_TYPE_SHUTDOWNGUARD:
2726 		if ((inp == NULL) || (stcb == NULL) || (net != NULL)) {
2727 #ifdef INVARIANTS
2728 			panic("sctp_timer_stop of type %d: inp = %p, stcb = %p, net = %p",
2729 			    t_type, inp, stcb, net);
2730 #else
2731 			return;
2732 #endif
2733 		}
2734 		tmr = &stcb->asoc.shut_guard_timer;
2735 		break;
2736 	case SCTP_TIMER_TYPE_AUTOCLOSE:
2737 		if ((inp == NULL) || (stcb == NULL) || (net != NULL)) {
2738 #ifdef INVARIANTS
2739 			panic("sctp_timer_stop of type %d: inp = %p, stcb = %p, net = %p",
2740 			    t_type, inp, stcb, net);
2741 #else
2742 			return;
2743 #endif
2744 		}
2745 		tmr = &stcb->asoc.autoclose_timer;
2746 		break;
2747 	case SCTP_TIMER_TYPE_STRRESET:
2748 		if ((inp == NULL) || (stcb == NULL) || (net != NULL)) {
2749 #ifdef INVARIANTS
2750 			panic("sctp_timer_stop of type %d: inp = %p, stcb = %p, net = %p",
2751 			    t_type, inp, stcb, net);
2752 #else
2753 			return;
2754 #endif
2755 		}
2756 		tmr = &stcb->asoc.strreset_timer;
2757 		break;
2758 	case SCTP_TIMER_TYPE_INPKILL:
2759 		/*
2760 		 * The inp is setup to die. We re-use the signature_chage
2761 		 * timer since that has stopped and we are in the GONE
2762 		 * state.
2763 		 */
2764 		if ((inp == NULL) || (stcb != NULL) || (net != NULL)) {
2765 #ifdef INVARIANTS
2766 			panic("sctp_timer_stop of type %d: inp = %p, stcb = %p, net = %p",
2767 			    t_type, inp, stcb, net);
2768 #else
2769 			return;
2770 #endif
2771 		}
2772 		tmr = &inp->sctp_ep.signature_change;
2773 		break;
2774 	case SCTP_TIMER_TYPE_ASOCKILL:
2775 		if ((inp == NULL) || (stcb == NULL) || (net != NULL)) {
2776 #ifdef INVARIANTS
2777 			panic("sctp_timer_stop of type %d: inp = %p, stcb = %p, net = %p",
2778 			    t_type, inp, stcb, net);
2779 #else
2780 			return;
2781 #endif
2782 		}
2783 		tmr = &stcb->asoc.strreset_timer;
2784 		break;
2785 	case SCTP_TIMER_TYPE_ADDR_WQ:
2786 		if ((inp != NULL) || (stcb != NULL) || (net != NULL)) {
2787 #ifdef INVARIANTS
2788 			panic("sctp_timer_stop of type %d: inp = %p, stcb = %p, net = %p",
2789 			    t_type, inp, stcb, net);
2790 #else
2791 			return;
2792 #endif
2793 		}
2794 		tmr = &SCTP_BASE_INFO(addr_wq_timer);
2795 		break;
2796 	case SCTP_TIMER_TYPE_PRIM_DELETED:
2797 		if ((inp == NULL) || (stcb == NULL) || (net != NULL)) {
2798 #ifdef INVARIANTS
2799 			panic("sctp_timer_stop of type %d: inp = %p, stcb = %p, net = %p",
2800 			    t_type, inp, stcb, net);
2801 #else
2802 			return;
2803 #endif
2804 		}
2805 		tmr = &stcb->asoc.delete_prim_timer;
2806 		break;
2807 	default:
2808 #ifdef INVARIANTS
2809 		panic("Unknown timer type %d", t_type);
2810 #else
2811 		return;
2812 #endif
2813 	}
2814 	KASSERT(tmr != NULL, ("tmr is NULL for timer type %d", t_type));
2815 	if ((tmr->type != SCTP_TIMER_TYPE_NONE) &&
2816 	    (tmr->type != t_type)) {
2817 		/*
2818 		 * Ok we have a timer that is under joint use. Cookie timer
2819 		 * per chance with the SEND timer. We therefore are NOT
2820 		 * running the timer that the caller wants stopped.  So just
2821 		 * return.
2822 		 */
2823 		SCTPDBG(SCTP_DEBUG_TIMER2,
2824 		    "Shared timer type %d not running: inp=%p, stcb=%p, net=%p.\n",
2825 		    t_type, inp, stcb, net);
2826 		return;
2827 	}
2828 	if ((t_type == SCTP_TIMER_TYPE_SEND) && (stcb != NULL)) {
2829 		stcb->asoc.num_send_timers_up--;
2830 		if (stcb->asoc.num_send_timers_up < 0) {
2831 			stcb->asoc.num_send_timers_up = 0;
2832 		}
2833 	}
2834 	tmr->self = NULL;
2835 	tmr->stopped_from = from;
2836 	if (SCTP_OS_TIMER_STOP(&tmr->timer) == 1) {
2837 		KASSERT(tmr->ep == inp,
2838 		    ("sctp_timer_stop of type %d: inp = %p, tmr->inp = %p",
2839 		    t_type, inp, tmr->ep));
2840 		KASSERT(tmr->tcb == stcb,
2841 		    ("sctp_timer_stop of type %d: stcb = %p, tmr->stcb = %p",
2842 		    t_type, stcb, tmr->tcb));
2843 		KASSERT(((t_type == SCTP_TIMER_TYPE_ASCONF) && (tmr->net != NULL)) ||
2844 		    ((t_type != SCTP_TIMER_TYPE_ASCONF) && (tmr->net == net)),
2845 		    ("sctp_timer_stop of type %d: net = %p, tmr->net = %p",
2846 		    t_type, net, tmr->net));
2847 		SCTPDBG(SCTP_DEBUG_TIMER2,
2848 		    "Timer type %d stopped: inp=%p, stcb=%p, net=%p.\n",
2849 		    t_type, inp, stcb, net);
2850 		/*
2851 		 * If the timer was actually stopped, decrement reference
2852 		 * counts that were incremented in sctp_timer_start().
2853 		 */
2854 		if (tmr->ep != NULL) {
2855 			SCTP_INP_DECR_REF(inp);
2856 			tmr->ep = NULL;
2857 		}
2858 		if (tmr->tcb != NULL) {
2859 			atomic_add_int(&stcb->asoc.refcnt, -1);
2860 			tmr->tcb = NULL;
2861 		}
2862 		if (tmr->net != NULL) {
2863 			/*
2864 			 * Can't use net, since it doesn't work for
2865 			 * SCTP_TIMER_TYPE_ASCONF.
2866 			 */
2867 			sctp_free_remote_addr((struct sctp_nets *)tmr->net);
2868 			tmr->net = NULL;
2869 		}
2870 	} else {
2871 		SCTPDBG(SCTP_DEBUG_TIMER2,
2872 		    "Timer type %d not stopped: inp=%p, stcb=%p, net=%p.\n",
2873 		    t_type, inp, stcb, net);
2874 	}
2875 	return;
2876 }
2877 
2878 uint32_t
2879 sctp_calculate_len(struct mbuf *m)
2880 {
2881 	uint32_t tlen = 0;
2882 	struct mbuf *at;
2883 
2884 	at = m;
2885 	while (at) {
2886 		tlen += SCTP_BUF_LEN(at);
2887 		at = SCTP_BUF_NEXT(at);
2888 	}
2889 	return (tlen);
2890 }
2891 
2892 void
2893 sctp_mtu_size_reset(struct sctp_inpcb *inp,
2894     struct sctp_association *asoc, uint32_t mtu)
2895 {
2896 	/*
2897 	 * Reset the P-MTU size on this association, this involves changing
2898 	 * the asoc MTU, going through ANY chunk+overhead larger than mtu to
2899 	 * allow the DF flag to be cleared.
2900 	 */
2901 	struct sctp_tmit_chunk *chk;
2902 	unsigned int eff_mtu, ovh;
2903 
2904 	asoc->smallest_mtu = mtu;
2905 	if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) {
2906 		ovh = SCTP_MIN_OVERHEAD;
2907 	} else {
2908 		ovh = SCTP_MIN_V4_OVERHEAD;
2909 	}
2910 	eff_mtu = mtu - ovh;
2911 	TAILQ_FOREACH(chk, &asoc->send_queue, sctp_next) {
2912 		if (chk->send_size > eff_mtu) {
2913 			chk->flags |= CHUNK_FLAGS_FRAGMENT_OK;
2914 		}
2915 	}
2916 	TAILQ_FOREACH(chk, &asoc->sent_queue, sctp_next) {
2917 		if (chk->send_size > eff_mtu) {
2918 			chk->flags |= CHUNK_FLAGS_FRAGMENT_OK;
2919 		}
2920 	}
2921 }
2922 
2923 /*
2924  * Given an association and starting time of the current RTT period, update
2925  * RTO in number of msecs. net should point to the current network.
2926  * Return 1, if an RTO update was performed, return 0 if no update was
2927  * performed due to invalid starting point.
2928  */
2929 
2930 int
2931 sctp_calculate_rto(struct sctp_tcb *stcb,
2932     struct sctp_association *asoc,
2933     struct sctp_nets *net,
2934     struct timeval *old,
2935     int rtt_from_sack)
2936 {
2937 	struct timeval now;
2938 	uint64_t rtt_us;	/* RTT in us */
2939 	int32_t rtt;		/* RTT in ms */
2940 	uint32_t new_rto;
2941 	int first_measure = 0;
2942 
2943 	/************************/
2944 	/* 1. calculate new RTT */
2945 	/************************/
2946 	/* get the current time */
2947 	if (stcb->asoc.use_precise_time) {
2948 		(void)SCTP_GETPTIME_TIMEVAL(&now);
2949 	} else {
2950 		(void)SCTP_GETTIME_TIMEVAL(&now);
2951 	}
2952 	if ((old->tv_sec > now.tv_sec) ||
2953 	    ((old->tv_sec == now.tv_sec) && (old->tv_usec > now.tv_usec))) {
2954 		/* The starting point is in the future. */
2955 		return (0);
2956 	}
2957 	timevalsub(&now, old);
2958 	rtt_us = (uint64_t)1000000 * (uint64_t)now.tv_sec + (uint64_t)now.tv_usec;
2959 	if (rtt_us > SCTP_RTO_UPPER_BOUND * 1000) {
2960 		/* The RTT is larger than a sane value. */
2961 		return (0);
2962 	}
2963 	/* store the current RTT in us */
2964 	net->rtt = rtt_us;
2965 	/* compute rtt in ms */
2966 	rtt = (int32_t)(net->rtt / 1000);
2967 	if ((asoc->cc_functions.sctp_rtt_calculated) && (rtt_from_sack == SCTP_RTT_FROM_DATA)) {
2968 		/*
2969 		 * Tell the CC module that a new update has just occurred
2970 		 * from a sack
2971 		 */
2972 		(*asoc->cc_functions.sctp_rtt_calculated) (stcb, net, &now);
2973 	}
2974 	/*
2975 	 * Do we need to determine the lan? We do this only on sacks i.e.
2976 	 * RTT being determined from data not non-data (HB/INIT->INITACK).
2977 	 */
2978 	if ((rtt_from_sack == SCTP_RTT_FROM_DATA) &&
2979 	    (net->lan_type == SCTP_LAN_UNKNOWN)) {
2980 		if (net->rtt > SCTP_LOCAL_LAN_RTT) {
2981 			net->lan_type = SCTP_LAN_INTERNET;
2982 		} else {
2983 			net->lan_type = SCTP_LAN_LOCAL;
2984 		}
2985 	}
2986 
2987 	/***************************/
2988 	/* 2. update RTTVAR & SRTT */
2989 	/***************************/
2990 	/*-
2991 	 * Compute the scaled average lastsa and the
2992 	 * scaled variance lastsv as described in van Jacobson
2993 	 * Paper "Congestion Avoidance and Control", Annex A.
2994 	 *
2995 	 * (net->lastsa >> SCTP_RTT_SHIFT) is the srtt
2996 	 * (net->lastsv >> SCTP_RTT_VAR_SHIFT) is the rttvar
2997 	 */
2998 	if (net->RTO_measured) {
2999 		rtt -= (net->lastsa >> SCTP_RTT_SHIFT);
3000 		net->lastsa += rtt;
3001 		if (rtt < 0) {
3002 			rtt = -rtt;
3003 		}
3004 		rtt -= (net->lastsv >> SCTP_RTT_VAR_SHIFT);
3005 		net->lastsv += rtt;
3006 		if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_RTTVAR_LOGGING_ENABLE) {
3007 			rto_logging(net, SCTP_LOG_RTTVAR);
3008 		}
3009 	} else {
3010 		/* First RTO measurment */
3011 		net->RTO_measured = 1;
3012 		first_measure = 1;
3013 		net->lastsa = rtt << SCTP_RTT_SHIFT;
3014 		net->lastsv = (rtt / 2) << SCTP_RTT_VAR_SHIFT;
3015 		if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_RTTVAR_LOGGING_ENABLE) {
3016 			rto_logging(net, SCTP_LOG_INITIAL_RTT);
3017 		}
3018 	}
3019 	if (net->lastsv == 0) {
3020 		net->lastsv = SCTP_CLOCK_GRANULARITY;
3021 	}
3022 	new_rto = (net->lastsa >> SCTP_RTT_SHIFT) + net->lastsv;
3023 	if ((new_rto > SCTP_SAT_NETWORK_MIN) &&
3024 	    (stcb->asoc.sat_network_lockout == 0)) {
3025 		stcb->asoc.sat_network = 1;
3026 	} else if ((!first_measure) && stcb->asoc.sat_network) {
3027 		stcb->asoc.sat_network = 0;
3028 		stcb->asoc.sat_network_lockout = 1;
3029 	}
3030 	/* bound it, per C6/C7 in Section 5.3.1 */
3031 	if (new_rto < stcb->asoc.minrto) {
3032 		new_rto = stcb->asoc.minrto;
3033 	}
3034 	if (new_rto > stcb->asoc.maxrto) {
3035 		new_rto = stcb->asoc.maxrto;
3036 	}
3037 	net->RTO = new_rto;
3038 	return (1);
3039 }
3040 
3041 /*
3042  * return a pointer to a contiguous piece of data from the given mbuf chain
3043  * starting at 'off' for 'len' bytes.  If the desired piece spans more than
3044  * one mbuf, a copy is made at 'ptr'. caller must ensure that the buffer size
3045  * is >= 'len' returns NULL if there there isn't 'len' bytes in the chain.
3046  */
3047 caddr_t
3048 sctp_m_getptr(struct mbuf *m, int off, int len, uint8_t *in_ptr)
3049 {
3050 	uint32_t count;
3051 	uint8_t *ptr;
3052 
3053 	ptr = in_ptr;
3054 	if ((off < 0) || (len <= 0))
3055 		return (NULL);
3056 
3057 	/* find the desired start location */
3058 	while ((m != NULL) && (off > 0)) {
3059 		if (off < SCTP_BUF_LEN(m))
3060 			break;
3061 		off -= SCTP_BUF_LEN(m);
3062 		m = SCTP_BUF_NEXT(m);
3063 	}
3064 	if (m == NULL)
3065 		return (NULL);
3066 
3067 	/* is the current mbuf large enough (eg. contiguous)? */
3068 	if ((SCTP_BUF_LEN(m) - off) >= len) {
3069 		return (mtod(m, caddr_t)+off);
3070 	} else {
3071 		/* else, it spans more than one mbuf, so save a temp copy... */
3072 		while ((m != NULL) && (len > 0)) {
3073 			count = min(SCTP_BUF_LEN(m) - off, len);
3074 			memcpy(ptr, mtod(m, caddr_t)+off, count);
3075 			len -= count;
3076 			ptr += count;
3077 			off = 0;
3078 			m = SCTP_BUF_NEXT(m);
3079 		}
3080 		if ((m == NULL) && (len > 0))
3081 			return (NULL);
3082 		else
3083 			return ((caddr_t)in_ptr);
3084 	}
3085 }
3086 
3087 struct sctp_paramhdr *
3088 sctp_get_next_param(struct mbuf *m,
3089     int offset,
3090     struct sctp_paramhdr *pull,
3091     int pull_limit)
3092 {
3093 	/* This just provides a typed signature to Peter's Pull routine */
3094 	return ((struct sctp_paramhdr *)sctp_m_getptr(m, offset, pull_limit,
3095 	    (uint8_t *)pull));
3096 }
3097 
3098 struct mbuf *
3099 sctp_add_pad_tombuf(struct mbuf *m, int padlen)
3100 {
3101 	struct mbuf *m_last;
3102 	caddr_t dp;
3103 
3104 	if (padlen > 3) {
3105 		return (NULL);
3106 	}
3107 	if (padlen <= M_TRAILINGSPACE(m)) {
3108 		/*
3109 		 * The easy way. We hope the majority of the time we hit
3110 		 * here :)
3111 		 */
3112 		m_last = m;
3113 	} else {
3114 		/* Hard way we must grow the mbuf chain */
3115 		m_last = sctp_get_mbuf_for_msg(padlen, 0, M_NOWAIT, 1, MT_DATA);
3116 		if (m_last == NULL) {
3117 			return (NULL);
3118 		}
3119 		SCTP_BUF_LEN(m_last) = 0;
3120 		SCTP_BUF_NEXT(m_last) = NULL;
3121 		SCTP_BUF_NEXT(m) = m_last;
3122 	}
3123 	dp = mtod(m_last, caddr_t)+SCTP_BUF_LEN(m_last);
3124 	SCTP_BUF_LEN(m_last) += padlen;
3125 	memset(dp, 0, padlen);
3126 	return (m_last);
3127 }
3128 
3129 struct mbuf *
3130 sctp_pad_lastmbuf(struct mbuf *m, int padval, struct mbuf *last_mbuf)
3131 {
3132 	/* find the last mbuf in chain and pad it */
3133 	struct mbuf *m_at;
3134 
3135 	if (last_mbuf != NULL) {
3136 		return (sctp_add_pad_tombuf(last_mbuf, padval));
3137 	} else {
3138 		for (m_at = m; m_at; m_at = SCTP_BUF_NEXT(m_at)) {
3139 			if (SCTP_BUF_NEXT(m_at) == NULL) {
3140 				return (sctp_add_pad_tombuf(m_at, padval));
3141 			}
3142 		}
3143 	}
3144 	return (NULL);
3145 }
3146 
3147 static void
3148 sctp_notify_assoc_change(uint16_t state, struct sctp_tcb *stcb,
3149     uint16_t error, struct sctp_abort_chunk *abort, uint8_t from_peer, int so_locked)
3150 {
3151 	struct mbuf *m_notify;
3152 	struct sctp_assoc_change *sac;
3153 	struct sctp_queued_to_read *control;
3154 	unsigned int notif_len;
3155 	uint16_t abort_len;
3156 	unsigned int i;
3157 
3158 	if (stcb == NULL) {
3159 		return;
3160 	}
3161 	if (sctp_stcb_is_feature_on(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVASSOCEVNT)) {
3162 		notif_len = (unsigned int)sizeof(struct sctp_assoc_change);
3163 		if (abort != NULL) {
3164 			abort_len = ntohs(abort->ch.chunk_length);
3165 			/*
3166 			 * Only SCTP_CHUNK_BUFFER_SIZE are guaranteed to be
3167 			 * contiguous.
3168 			 */
3169 			if (abort_len > SCTP_CHUNK_BUFFER_SIZE) {
3170 				abort_len = SCTP_CHUNK_BUFFER_SIZE;
3171 			}
3172 		} else {
3173 			abort_len = 0;
3174 		}
3175 		if ((state == SCTP_COMM_UP) || (state == SCTP_RESTART)) {
3176 			notif_len += SCTP_ASSOC_SUPPORTS_MAX;
3177 		} else if ((state == SCTP_COMM_LOST) || (state == SCTP_CANT_STR_ASSOC)) {
3178 			notif_len += abort_len;
3179 		}
3180 		m_notify = sctp_get_mbuf_for_msg(notif_len, 0, M_NOWAIT, 1, MT_DATA);
3181 		if (m_notify == NULL) {
3182 			/* Retry with smaller value. */
3183 			notif_len = (unsigned int)sizeof(struct sctp_assoc_change);
3184 			m_notify = sctp_get_mbuf_for_msg(notif_len, 0, M_NOWAIT, 1, MT_DATA);
3185 			if (m_notify == NULL) {
3186 				goto set_error;
3187 			}
3188 		}
3189 		SCTP_BUF_NEXT(m_notify) = NULL;
3190 		sac = mtod(m_notify, struct sctp_assoc_change *);
3191 		memset(sac, 0, notif_len);
3192 		sac->sac_type = SCTP_ASSOC_CHANGE;
3193 		sac->sac_flags = 0;
3194 		sac->sac_length = sizeof(struct sctp_assoc_change);
3195 		sac->sac_state = state;
3196 		sac->sac_error = error;
3197 		/* XXX verify these stream counts */
3198 		sac->sac_outbound_streams = stcb->asoc.streamoutcnt;
3199 		sac->sac_inbound_streams = stcb->asoc.streamincnt;
3200 		sac->sac_assoc_id = sctp_get_associd(stcb);
3201 		if (notif_len > sizeof(struct sctp_assoc_change)) {
3202 			if ((state == SCTP_COMM_UP) || (state == SCTP_RESTART)) {
3203 				i = 0;
3204 				if (stcb->asoc.prsctp_supported == 1) {
3205 					sac->sac_info[i++] = SCTP_ASSOC_SUPPORTS_PR;
3206 				}
3207 				if (stcb->asoc.auth_supported == 1) {
3208 					sac->sac_info[i++] = SCTP_ASSOC_SUPPORTS_AUTH;
3209 				}
3210 				if (stcb->asoc.asconf_supported == 1) {
3211 					sac->sac_info[i++] = SCTP_ASSOC_SUPPORTS_ASCONF;
3212 				}
3213 				if (stcb->asoc.idata_supported == 1) {
3214 					sac->sac_info[i++] = SCTP_ASSOC_SUPPORTS_INTERLEAVING;
3215 				}
3216 				sac->sac_info[i++] = SCTP_ASSOC_SUPPORTS_MULTIBUF;
3217 				if (stcb->asoc.reconfig_supported == 1) {
3218 					sac->sac_info[i++] = SCTP_ASSOC_SUPPORTS_RE_CONFIG;
3219 				}
3220 				sac->sac_length += i;
3221 			} else if ((state == SCTP_COMM_LOST) || (state == SCTP_CANT_STR_ASSOC)) {
3222 				memcpy(sac->sac_info, abort, abort_len);
3223 				sac->sac_length += abort_len;
3224 			}
3225 		}
3226 		SCTP_BUF_LEN(m_notify) = sac->sac_length;
3227 		control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination,
3228 		    0, 0, stcb->asoc.context, 0, 0, 0,
3229 		    m_notify);
3230 		if (control != NULL) {
3231 			control->length = SCTP_BUF_LEN(m_notify);
3232 			control->spec_flags = M_NOTIFICATION;
3233 			/* not that we need this */
3234 			control->tail_mbuf = m_notify;
3235 			sctp_add_to_readq(stcb->sctp_ep, stcb,
3236 			    control,
3237 			    &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD,
3238 			    so_locked);
3239 		} else {
3240 			sctp_m_freem(m_notify);
3241 		}
3242 	}
3243 	/*
3244 	 * For 1-to-1 style sockets, we send up and error when an ABORT
3245 	 * comes in.
3246 	 */
3247 set_error:
3248 	if (((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
3249 	    (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) &&
3250 	    ((state == SCTP_COMM_LOST) || (state == SCTP_CANT_STR_ASSOC))) {
3251 		SOCK_LOCK(stcb->sctp_socket);
3252 		if (from_peer) {
3253 			if (SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_WAIT) {
3254 				SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ECONNREFUSED);
3255 				stcb->sctp_socket->so_error = ECONNREFUSED;
3256 			} else {
3257 				SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ECONNRESET);
3258 				stcb->sctp_socket->so_error = ECONNRESET;
3259 			}
3260 		} else {
3261 			if ((SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_WAIT) ||
3262 			    (SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_ECHOED)) {
3263 				SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ETIMEDOUT);
3264 				stcb->sctp_socket->so_error = ETIMEDOUT;
3265 			} else {
3266 				SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ECONNABORTED);
3267 				stcb->sctp_socket->so_error = ECONNABORTED;
3268 			}
3269 		}
3270 		SOCK_UNLOCK(stcb->sctp_socket);
3271 	}
3272 	/* Wake ANY sleepers */
3273 	if (((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
3274 	    (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) &&
3275 	    ((state == SCTP_COMM_LOST) || (state == SCTP_CANT_STR_ASSOC))) {
3276 		socantrcvmore(stcb->sctp_socket);
3277 	}
3278 	sorwakeup(stcb->sctp_socket);
3279 	sowwakeup(stcb->sctp_socket);
3280 }
3281 
3282 static void
3283 sctp_notify_peer_addr_change(struct sctp_tcb *stcb, uint32_t state,
3284     struct sockaddr *sa, uint32_t error, int so_locked)
3285 {
3286 	struct mbuf *m_notify;
3287 	struct sctp_paddr_change *spc;
3288 	struct sctp_queued_to_read *control;
3289 
3290 	if ((stcb == NULL) ||
3291 	    sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVPADDREVNT)) {
3292 		/* event not enabled */
3293 		return;
3294 	}
3295 	m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_paddr_change), 0, M_NOWAIT, 1, MT_DATA);
3296 	if (m_notify == NULL)
3297 		return;
3298 	SCTP_BUF_LEN(m_notify) = 0;
3299 	spc = mtod(m_notify, struct sctp_paddr_change *);
3300 	memset(spc, 0, sizeof(struct sctp_paddr_change));
3301 	spc->spc_type = SCTP_PEER_ADDR_CHANGE;
3302 	spc->spc_flags = 0;
3303 	spc->spc_length = sizeof(struct sctp_paddr_change);
3304 	switch (sa->sa_family) {
3305 #ifdef INET
3306 	case AF_INET:
3307 #ifdef INET6
3308 		if (sctp_is_feature_on(stcb->sctp_ep, SCTP_PCB_FLAGS_NEEDS_MAPPED_V4)) {
3309 			in6_sin_2_v4mapsin6((struct sockaddr_in *)sa,
3310 			    (struct sockaddr_in6 *)&spc->spc_aaddr);
3311 		} else {
3312 			memcpy(&spc->spc_aaddr, sa, sizeof(struct sockaddr_in));
3313 		}
3314 #else
3315 		memcpy(&spc->spc_aaddr, sa, sizeof(struct sockaddr_in));
3316 #endif
3317 		break;
3318 #endif
3319 #ifdef INET6
3320 	case AF_INET6:
3321 		{
3322 			struct sockaddr_in6 *sin6;
3323 
3324 			memcpy(&spc->spc_aaddr, sa, sizeof(struct sockaddr_in6));
3325 
3326 			sin6 = (struct sockaddr_in6 *)&spc->spc_aaddr;
3327 			if (IN6_IS_SCOPE_LINKLOCAL(&sin6->sin6_addr)) {
3328 				if (sin6->sin6_scope_id == 0) {
3329 					/* recover scope_id for user */
3330 					(void)sa6_recoverscope(sin6);
3331 				} else {
3332 					/* clear embedded scope_id for user */
3333 					in6_clearscope(&sin6->sin6_addr);
3334 				}
3335 			}
3336 			break;
3337 		}
3338 #endif
3339 	default:
3340 		/* TSNH */
3341 		break;
3342 	}
3343 	spc->spc_state = state;
3344 	spc->spc_error = error;
3345 	spc->spc_assoc_id = sctp_get_associd(stcb);
3346 
3347 	SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_paddr_change);
3348 	SCTP_BUF_NEXT(m_notify) = NULL;
3349 
3350 	/* append to socket */
3351 	control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination,
3352 	    0, 0, stcb->asoc.context, 0, 0, 0,
3353 	    m_notify);
3354 	if (control == NULL) {
3355 		/* no memory */
3356 		sctp_m_freem(m_notify);
3357 		return;
3358 	}
3359 	control->length = SCTP_BUF_LEN(m_notify);
3360 	control->spec_flags = M_NOTIFICATION;
3361 	/* not that we need this */
3362 	control->tail_mbuf = m_notify;
3363 	sctp_add_to_readq(stcb->sctp_ep, stcb,
3364 	    control,
3365 	    &stcb->sctp_socket->so_rcv, 1,
3366 	    SCTP_READ_LOCK_NOT_HELD,
3367 	    so_locked);
3368 }
3369 
3370 static void
3371 sctp_notify_send_failed(struct sctp_tcb *stcb, uint8_t sent, uint32_t error,
3372     struct sctp_tmit_chunk *chk, int so_locked)
3373 {
3374 	struct mbuf *m_notify;
3375 	struct sctp_send_failed *ssf;
3376 	struct sctp_send_failed_event *ssfe;
3377 	struct sctp_queued_to_read *control;
3378 	struct sctp_chunkhdr *chkhdr;
3379 	int notifhdr_len, chk_len, chkhdr_len, padding_len, payload_len;
3380 
3381 	if ((stcb == NULL) ||
3382 	    (sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVSENDFAILEVNT) &&
3383 	    sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVNSENDFAILEVNT))) {
3384 		/* event not enabled */
3385 		return;
3386 	}
3387 
3388 	if (sctp_stcb_is_feature_on(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVNSENDFAILEVNT)) {
3389 		notifhdr_len = sizeof(struct sctp_send_failed_event);
3390 	} else {
3391 		notifhdr_len = sizeof(struct sctp_send_failed);
3392 	}
3393 	m_notify = sctp_get_mbuf_for_msg(notifhdr_len, 0, M_NOWAIT, 1, MT_DATA);
3394 	if (m_notify == NULL)
3395 		/* no space left */
3396 		return;
3397 	SCTP_BUF_LEN(m_notify) = notifhdr_len;
3398 	if (stcb->asoc.idata_supported) {
3399 		chkhdr_len = sizeof(struct sctp_idata_chunk);
3400 	} else {
3401 		chkhdr_len = sizeof(struct sctp_data_chunk);
3402 	}
3403 	/* Use some defaults in case we can't access the chunk header */
3404 	if (chk->send_size >= chkhdr_len) {
3405 		payload_len = chk->send_size - chkhdr_len;
3406 	} else {
3407 		payload_len = 0;
3408 	}
3409 	padding_len = 0;
3410 	if (chk->data != NULL) {
3411 		chkhdr = mtod(chk->data, struct sctp_chunkhdr *);
3412 		if (chkhdr != NULL) {
3413 			chk_len = ntohs(chkhdr->chunk_length);
3414 			if ((chk_len >= chkhdr_len) &&
3415 			    (chk->send_size >= chk_len) &&
3416 			    (chk->send_size - chk_len < 4)) {
3417 				padding_len = chk->send_size - chk_len;
3418 				payload_len = chk->send_size - chkhdr_len - padding_len;
3419 			}
3420 		}
3421 	}
3422 	if (sctp_stcb_is_feature_on(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVNSENDFAILEVNT)) {
3423 		ssfe = mtod(m_notify, struct sctp_send_failed_event *);
3424 		memset(ssfe, 0, notifhdr_len);
3425 		ssfe->ssfe_type = SCTP_SEND_FAILED_EVENT;
3426 		if (sent) {
3427 			ssfe->ssfe_flags = SCTP_DATA_SENT;
3428 		} else {
3429 			ssfe->ssfe_flags = SCTP_DATA_UNSENT;
3430 		}
3431 		ssfe->ssfe_length = (uint32_t)(notifhdr_len + payload_len);
3432 		ssfe->ssfe_error = error;
3433 		/* not exactly what the user sent in, but should be close :) */
3434 		ssfe->ssfe_info.snd_sid = chk->rec.data.sid;
3435 		ssfe->ssfe_info.snd_flags = chk->rec.data.rcv_flags;
3436 		ssfe->ssfe_info.snd_ppid = chk->rec.data.ppid;
3437 		ssfe->ssfe_info.snd_context = chk->rec.data.context;
3438 		ssfe->ssfe_info.snd_assoc_id = sctp_get_associd(stcb);
3439 		ssfe->ssfe_assoc_id = sctp_get_associd(stcb);
3440 	} else {
3441 		ssf = mtod(m_notify, struct sctp_send_failed *);
3442 		memset(ssf, 0, notifhdr_len);
3443 		ssf->ssf_type = SCTP_SEND_FAILED;
3444 		if (sent) {
3445 			ssf->ssf_flags = SCTP_DATA_SENT;
3446 		} else {
3447 			ssf->ssf_flags = SCTP_DATA_UNSENT;
3448 		}
3449 		ssf->ssf_length = (uint32_t)(notifhdr_len + payload_len);
3450 		ssf->ssf_error = error;
3451 		/* not exactly what the user sent in, but should be close :) */
3452 		ssf->ssf_info.sinfo_stream = chk->rec.data.sid;
3453 		ssf->ssf_info.sinfo_ssn = (uint16_t)chk->rec.data.mid;
3454 		ssf->ssf_info.sinfo_flags = chk->rec.data.rcv_flags;
3455 		ssf->ssf_info.sinfo_ppid = chk->rec.data.ppid;
3456 		ssf->ssf_info.sinfo_context = chk->rec.data.context;
3457 		ssf->ssf_info.sinfo_assoc_id = sctp_get_associd(stcb);
3458 		ssf->ssf_assoc_id = sctp_get_associd(stcb);
3459 	}
3460 	if (chk->data != NULL) {
3461 		/* Trim off the sctp chunk header (it should be there) */
3462 		if (chk->send_size == chkhdr_len + payload_len + padding_len) {
3463 			m_adj(chk->data, chkhdr_len);
3464 			m_adj(chk->data, -padding_len);
3465 			sctp_mbuf_crush(chk->data);
3466 			chk->send_size -= (chkhdr_len + padding_len);
3467 		}
3468 	}
3469 	SCTP_BUF_NEXT(m_notify) = chk->data;
3470 	/* Steal off the mbuf */
3471 	chk->data = NULL;
3472 	/*
3473 	 * For this case, we check the actual socket buffer, since the assoc
3474 	 * is going away we don't want to overfill the socket buffer for a
3475 	 * non-reader
3476 	 */
3477 	if (sctp_sbspace_failedmsgs(&stcb->sctp_socket->so_rcv) < SCTP_BUF_LEN(m_notify)) {
3478 		sctp_m_freem(m_notify);
3479 		return;
3480 	}
3481 	/* append to socket */
3482 	control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination,
3483 	    0, 0, stcb->asoc.context, 0, 0, 0,
3484 	    m_notify);
3485 	if (control == NULL) {
3486 		/* no memory */
3487 		sctp_m_freem(m_notify);
3488 		return;
3489 	}
3490 	control->length = SCTP_BUF_LEN(m_notify);
3491 	control->spec_flags = M_NOTIFICATION;
3492 	/* not that we need this */
3493 	control->tail_mbuf = m_notify;
3494 	sctp_add_to_readq(stcb->sctp_ep, stcb,
3495 	    control,
3496 	    &stcb->sctp_socket->so_rcv, 1,
3497 	    SCTP_READ_LOCK_NOT_HELD,
3498 	    so_locked);
3499 }
3500 
3501 static void
3502 sctp_notify_send_failed2(struct sctp_tcb *stcb, uint32_t error,
3503     struct sctp_stream_queue_pending *sp, int so_locked)
3504 {
3505 	struct mbuf *m_notify;
3506 	struct sctp_send_failed *ssf;
3507 	struct sctp_send_failed_event *ssfe;
3508 	struct sctp_queued_to_read *control;
3509 	int notifhdr_len;
3510 
3511 	if ((stcb == NULL) ||
3512 	    (sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVSENDFAILEVNT) &&
3513 	    sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVNSENDFAILEVNT))) {
3514 		/* event not enabled */
3515 		return;
3516 	}
3517 	if (sctp_stcb_is_feature_on(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVNSENDFAILEVNT)) {
3518 		notifhdr_len = sizeof(struct sctp_send_failed_event);
3519 	} else {
3520 		notifhdr_len = sizeof(struct sctp_send_failed);
3521 	}
3522 	m_notify = sctp_get_mbuf_for_msg(notifhdr_len, 0, M_NOWAIT, 1, MT_DATA);
3523 	if (m_notify == NULL) {
3524 		/* no space left */
3525 		return;
3526 	}
3527 	SCTP_BUF_LEN(m_notify) = notifhdr_len;
3528 	if (sctp_stcb_is_feature_on(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVNSENDFAILEVNT)) {
3529 		ssfe = mtod(m_notify, struct sctp_send_failed_event *);
3530 		memset(ssfe, 0, notifhdr_len);
3531 		ssfe->ssfe_type = SCTP_SEND_FAILED_EVENT;
3532 		ssfe->ssfe_flags = SCTP_DATA_UNSENT;
3533 		ssfe->ssfe_length = (uint32_t)(notifhdr_len + sp->length);
3534 		ssfe->ssfe_error = error;
3535 		/* not exactly what the user sent in, but should be close :) */
3536 		ssfe->ssfe_info.snd_sid = sp->sid;
3537 		if (sp->some_taken) {
3538 			ssfe->ssfe_info.snd_flags = SCTP_DATA_LAST_FRAG;
3539 		} else {
3540 			ssfe->ssfe_info.snd_flags = SCTP_DATA_NOT_FRAG;
3541 		}
3542 		ssfe->ssfe_info.snd_ppid = sp->ppid;
3543 		ssfe->ssfe_info.snd_context = sp->context;
3544 		ssfe->ssfe_info.snd_assoc_id = sctp_get_associd(stcb);
3545 		ssfe->ssfe_assoc_id = sctp_get_associd(stcb);
3546 	} else {
3547 		ssf = mtod(m_notify, struct sctp_send_failed *);
3548 		memset(ssf, 0, notifhdr_len);
3549 		ssf->ssf_type = SCTP_SEND_FAILED;
3550 		ssf->ssf_flags = SCTP_DATA_UNSENT;
3551 		ssf->ssf_length = (uint32_t)(notifhdr_len + sp->length);
3552 		ssf->ssf_error = error;
3553 		/* not exactly what the user sent in, but should be close :) */
3554 		ssf->ssf_info.sinfo_stream = sp->sid;
3555 		ssf->ssf_info.sinfo_ssn = 0;
3556 		if (sp->some_taken) {
3557 			ssf->ssf_info.sinfo_flags = SCTP_DATA_LAST_FRAG;
3558 		} else {
3559 			ssf->ssf_info.sinfo_flags = SCTP_DATA_NOT_FRAG;
3560 		}
3561 		ssf->ssf_info.sinfo_ppid = sp->ppid;
3562 		ssf->ssf_info.sinfo_context = sp->context;
3563 		ssf->ssf_info.sinfo_assoc_id = sctp_get_associd(stcb);
3564 		ssf->ssf_assoc_id = sctp_get_associd(stcb);
3565 	}
3566 	SCTP_BUF_NEXT(m_notify) = sp->data;
3567 
3568 	/* Steal off the mbuf */
3569 	sp->data = NULL;
3570 	/*
3571 	 * For this case, we check the actual socket buffer, since the assoc
3572 	 * is going away we don't want to overfill the socket buffer for a
3573 	 * non-reader
3574 	 */
3575 	if (sctp_sbspace_failedmsgs(&stcb->sctp_socket->so_rcv) < SCTP_BUF_LEN(m_notify)) {
3576 		sctp_m_freem(m_notify);
3577 		return;
3578 	}
3579 	/* append to socket */
3580 	control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination,
3581 	    0, 0, stcb->asoc.context, 0, 0, 0,
3582 	    m_notify);
3583 	if (control == NULL) {
3584 		/* no memory */
3585 		sctp_m_freem(m_notify);
3586 		return;
3587 	}
3588 	control->length = SCTP_BUF_LEN(m_notify);
3589 	control->spec_flags = M_NOTIFICATION;
3590 	/* not that we need this */
3591 	control->tail_mbuf = m_notify;
3592 	sctp_add_to_readq(stcb->sctp_ep, stcb,
3593 	    control,
3594 	    &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, so_locked);
3595 }
3596 
3597 static void
3598 sctp_notify_adaptation_layer(struct sctp_tcb *stcb)
3599 {
3600 	struct mbuf *m_notify;
3601 	struct sctp_adaptation_event *sai;
3602 	struct sctp_queued_to_read *control;
3603 
3604 	if ((stcb == NULL) ||
3605 	    sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_ADAPTATIONEVNT)) {
3606 		/* event not enabled */
3607 		return;
3608 	}
3609 
3610 	m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_adaption_event), 0, M_NOWAIT, 1, MT_DATA);
3611 	if (m_notify == NULL)
3612 		/* no space left */
3613 		return;
3614 	SCTP_BUF_LEN(m_notify) = 0;
3615 	sai = mtod(m_notify, struct sctp_adaptation_event *);
3616 	memset(sai, 0, sizeof(struct sctp_adaptation_event));
3617 	sai->sai_type = SCTP_ADAPTATION_INDICATION;
3618 	sai->sai_flags = 0;
3619 	sai->sai_length = sizeof(struct sctp_adaptation_event);
3620 	sai->sai_adaptation_ind = stcb->asoc.peers_adaptation;
3621 	sai->sai_assoc_id = sctp_get_associd(stcb);
3622 
3623 	SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_adaptation_event);
3624 	SCTP_BUF_NEXT(m_notify) = NULL;
3625 
3626 	/* append to socket */
3627 	control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination,
3628 	    0, 0, stcb->asoc.context, 0, 0, 0,
3629 	    m_notify);
3630 	if (control == NULL) {
3631 		/* no memory */
3632 		sctp_m_freem(m_notify);
3633 		return;
3634 	}
3635 	control->length = SCTP_BUF_LEN(m_notify);
3636 	control->spec_flags = M_NOTIFICATION;
3637 	/* not that we need this */
3638 	control->tail_mbuf = m_notify;
3639 	sctp_add_to_readq(stcb->sctp_ep, stcb,
3640 	    control,
3641 	    &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, SCTP_SO_NOT_LOCKED);
3642 }
3643 
3644 /* This always must be called with the read-queue LOCKED in the INP */
3645 static void
3646 sctp_notify_partial_delivery_indication(struct sctp_tcb *stcb, uint32_t error,
3647     uint32_t val, int so_locked)
3648 {
3649 	struct mbuf *m_notify;
3650 	struct sctp_pdapi_event *pdapi;
3651 	struct sctp_queued_to_read *control;
3652 	struct sockbuf *sb;
3653 
3654 	if ((stcb == NULL) ||
3655 	    sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_PDAPIEVNT)) {
3656 		/* event not enabled */
3657 		return;
3658 	}
3659 	if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_CANT_READ) {
3660 		return;
3661 	}
3662 
3663 	m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_pdapi_event), 0, M_NOWAIT, 1, MT_DATA);
3664 	if (m_notify == NULL)
3665 		/* no space left */
3666 		return;
3667 	SCTP_BUF_LEN(m_notify) = 0;
3668 	pdapi = mtod(m_notify, struct sctp_pdapi_event *);
3669 	memset(pdapi, 0, sizeof(struct sctp_pdapi_event));
3670 	pdapi->pdapi_type = SCTP_PARTIAL_DELIVERY_EVENT;
3671 	pdapi->pdapi_flags = 0;
3672 	pdapi->pdapi_length = sizeof(struct sctp_pdapi_event);
3673 	pdapi->pdapi_indication = error;
3674 	pdapi->pdapi_stream = (val >> 16);
3675 	pdapi->pdapi_seq = (val & 0x0000ffff);
3676 	pdapi->pdapi_assoc_id = sctp_get_associd(stcb);
3677 
3678 	SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_pdapi_event);
3679 	SCTP_BUF_NEXT(m_notify) = NULL;
3680 	control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination,
3681 	    0, 0, stcb->asoc.context, 0, 0, 0,
3682 	    m_notify);
3683 	if (control == NULL) {
3684 		/* no memory */
3685 		sctp_m_freem(m_notify);
3686 		return;
3687 	}
3688 	control->length = SCTP_BUF_LEN(m_notify);
3689 	control->spec_flags = M_NOTIFICATION;
3690 	/* not that we need this */
3691 	control->tail_mbuf = m_notify;
3692 	sb = &stcb->sctp_socket->so_rcv;
3693 	if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) {
3694 		sctp_sblog(sb, control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBALLOC, SCTP_BUF_LEN(m_notify));
3695 	}
3696 	sctp_sballoc(stcb, sb, m_notify);
3697 	if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) {
3698 		sctp_sblog(sb, control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBRESULT, 0);
3699 	}
3700 	control->end_added = 1;
3701 	if (stcb->asoc.control_pdapi)
3702 		TAILQ_INSERT_AFTER(&stcb->sctp_ep->read_queue, stcb->asoc.control_pdapi, control, next);
3703 	else {
3704 		/* we really should not see this case */
3705 		TAILQ_INSERT_TAIL(&stcb->sctp_ep->read_queue, control, next);
3706 	}
3707 	if (stcb->sctp_ep && stcb->sctp_socket) {
3708 		/* This should always be the case */
3709 		sctp_sorwakeup(stcb->sctp_ep, stcb->sctp_socket);
3710 	}
3711 }
3712 
3713 static void
3714 sctp_notify_shutdown_event(struct sctp_tcb *stcb)
3715 {
3716 	struct mbuf *m_notify;
3717 	struct sctp_shutdown_event *sse;
3718 	struct sctp_queued_to_read *control;
3719 
3720 	/*
3721 	 * For TCP model AND UDP connected sockets we will send an error up
3722 	 * when an SHUTDOWN completes
3723 	 */
3724 	if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
3725 	    (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) {
3726 		/* mark socket closed for read/write and wakeup! */
3727 		socantsendmore(stcb->sctp_socket);
3728 	}
3729 	if (sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVSHUTDOWNEVNT)) {
3730 		/* event not enabled */
3731 		return;
3732 	}
3733 
3734 	m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_shutdown_event), 0, M_NOWAIT, 1, MT_DATA);
3735 	if (m_notify == NULL)
3736 		/* no space left */
3737 		return;
3738 	sse = mtod(m_notify, struct sctp_shutdown_event *);
3739 	memset(sse, 0, sizeof(struct sctp_shutdown_event));
3740 	sse->sse_type = SCTP_SHUTDOWN_EVENT;
3741 	sse->sse_flags = 0;
3742 	sse->sse_length = sizeof(struct sctp_shutdown_event);
3743 	sse->sse_assoc_id = sctp_get_associd(stcb);
3744 
3745 	SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_shutdown_event);
3746 	SCTP_BUF_NEXT(m_notify) = NULL;
3747 
3748 	/* append to socket */
3749 	control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination,
3750 	    0, 0, stcb->asoc.context, 0, 0, 0,
3751 	    m_notify);
3752 	if (control == NULL) {
3753 		/* no memory */
3754 		sctp_m_freem(m_notify);
3755 		return;
3756 	}
3757 	control->length = SCTP_BUF_LEN(m_notify);
3758 	control->spec_flags = M_NOTIFICATION;
3759 	/* not that we need this */
3760 	control->tail_mbuf = m_notify;
3761 	sctp_add_to_readq(stcb->sctp_ep, stcb,
3762 	    control,
3763 	    &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, SCTP_SO_NOT_LOCKED);
3764 }
3765 
3766 static void
3767 sctp_notify_sender_dry_event(struct sctp_tcb *stcb,
3768     int so_locked)
3769 {
3770 	struct mbuf *m_notify;
3771 	struct sctp_sender_dry_event *event;
3772 	struct sctp_queued_to_read *control;
3773 
3774 	if ((stcb == NULL) ||
3775 	    sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_DRYEVNT)) {
3776 		/* event not enabled */
3777 		return;
3778 	}
3779 
3780 	m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_sender_dry_event), 0, M_NOWAIT, 1, MT_DATA);
3781 	if (m_notify == NULL) {
3782 		/* no space left */
3783 		return;
3784 	}
3785 	SCTP_BUF_LEN(m_notify) = 0;
3786 	event = mtod(m_notify, struct sctp_sender_dry_event *);
3787 	memset(event, 0, sizeof(struct sctp_sender_dry_event));
3788 	event->sender_dry_type = SCTP_SENDER_DRY_EVENT;
3789 	event->sender_dry_flags = 0;
3790 	event->sender_dry_length = sizeof(struct sctp_sender_dry_event);
3791 	event->sender_dry_assoc_id = sctp_get_associd(stcb);
3792 
3793 	SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_sender_dry_event);
3794 	SCTP_BUF_NEXT(m_notify) = NULL;
3795 
3796 	/* append to socket */
3797 	control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination,
3798 	    0, 0, stcb->asoc.context, 0, 0, 0,
3799 	    m_notify);
3800 	if (control == NULL) {
3801 		/* no memory */
3802 		sctp_m_freem(m_notify);
3803 		return;
3804 	}
3805 	control->length = SCTP_BUF_LEN(m_notify);
3806 	control->spec_flags = M_NOTIFICATION;
3807 	/* not that we need this */
3808 	control->tail_mbuf = m_notify;
3809 	sctp_add_to_readq(stcb->sctp_ep, stcb, control,
3810 	    &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, so_locked);
3811 }
3812 
3813 void
3814 sctp_notify_stream_reset_add(struct sctp_tcb *stcb, uint16_t numberin, uint16_t numberout, int flag)
3815 {
3816 	struct mbuf *m_notify;
3817 	struct sctp_queued_to_read *control;
3818 	struct sctp_stream_change_event *stradd;
3819 
3820 	if ((stcb == NULL) ||
3821 	    (sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_STREAM_CHANGEEVNT))) {
3822 		/* event not enabled */
3823 		return;
3824 	}
3825 	if ((stcb->asoc.peer_req_out) && flag) {
3826 		/* Peer made the request, don't tell the local user */
3827 		stcb->asoc.peer_req_out = 0;
3828 		return;
3829 	}
3830 	stcb->asoc.peer_req_out = 0;
3831 	m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_stream_change_event), 0, M_NOWAIT, 1, MT_DATA);
3832 	if (m_notify == NULL)
3833 		/* no space left */
3834 		return;
3835 	SCTP_BUF_LEN(m_notify) = 0;
3836 	stradd = mtod(m_notify, struct sctp_stream_change_event *);
3837 	memset(stradd, 0, sizeof(struct sctp_stream_change_event));
3838 	stradd->strchange_type = SCTP_STREAM_CHANGE_EVENT;
3839 	stradd->strchange_flags = flag;
3840 	stradd->strchange_length = sizeof(struct sctp_stream_change_event);
3841 	stradd->strchange_assoc_id = sctp_get_associd(stcb);
3842 	stradd->strchange_instrms = numberin;
3843 	stradd->strchange_outstrms = numberout;
3844 	SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_stream_change_event);
3845 	SCTP_BUF_NEXT(m_notify) = NULL;
3846 	if (sctp_sbspace(&stcb->asoc, &stcb->sctp_socket->so_rcv) < SCTP_BUF_LEN(m_notify)) {
3847 		/* no space */
3848 		sctp_m_freem(m_notify);
3849 		return;
3850 	}
3851 	/* append to socket */
3852 	control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination,
3853 	    0, 0, stcb->asoc.context, 0, 0, 0,
3854 	    m_notify);
3855 	if (control == NULL) {
3856 		/* no memory */
3857 		sctp_m_freem(m_notify);
3858 		return;
3859 	}
3860 	control->length = SCTP_BUF_LEN(m_notify);
3861 	control->spec_flags = M_NOTIFICATION;
3862 	/* not that we need this */
3863 	control->tail_mbuf = m_notify;
3864 	sctp_add_to_readq(stcb->sctp_ep, stcb,
3865 	    control,
3866 	    &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, SCTP_SO_NOT_LOCKED);
3867 }
3868 
3869 void
3870 sctp_notify_stream_reset_tsn(struct sctp_tcb *stcb, uint32_t sending_tsn, uint32_t recv_tsn, int flag)
3871 {
3872 	struct mbuf *m_notify;
3873 	struct sctp_queued_to_read *control;
3874 	struct sctp_assoc_reset_event *strasoc;
3875 
3876 	if ((stcb == NULL) ||
3877 	    (sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_ASSOC_RESETEVNT))) {
3878 		/* event not enabled */
3879 		return;
3880 	}
3881 	m_notify = sctp_get_mbuf_for_msg(sizeof(struct sctp_assoc_reset_event), 0, M_NOWAIT, 1, MT_DATA);
3882 	if (m_notify == NULL)
3883 		/* no space left */
3884 		return;
3885 	SCTP_BUF_LEN(m_notify) = 0;
3886 	strasoc = mtod(m_notify, struct sctp_assoc_reset_event *);
3887 	memset(strasoc, 0, sizeof(struct sctp_assoc_reset_event));
3888 	strasoc->assocreset_type = SCTP_ASSOC_RESET_EVENT;
3889 	strasoc->assocreset_flags = flag;
3890 	strasoc->assocreset_length = sizeof(struct sctp_assoc_reset_event);
3891 	strasoc->assocreset_assoc_id = sctp_get_associd(stcb);
3892 	strasoc->assocreset_local_tsn = sending_tsn;
3893 	strasoc->assocreset_remote_tsn = recv_tsn;
3894 	SCTP_BUF_LEN(m_notify) = sizeof(struct sctp_assoc_reset_event);
3895 	SCTP_BUF_NEXT(m_notify) = NULL;
3896 	if (sctp_sbspace(&stcb->asoc, &stcb->sctp_socket->so_rcv) < SCTP_BUF_LEN(m_notify)) {
3897 		/* no space */
3898 		sctp_m_freem(m_notify);
3899 		return;
3900 	}
3901 	/* append to socket */
3902 	control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination,
3903 	    0, 0, stcb->asoc.context, 0, 0, 0,
3904 	    m_notify);
3905 	if (control == NULL) {
3906 		/* no memory */
3907 		sctp_m_freem(m_notify);
3908 		return;
3909 	}
3910 	control->length = SCTP_BUF_LEN(m_notify);
3911 	control->spec_flags = M_NOTIFICATION;
3912 	/* not that we need this */
3913 	control->tail_mbuf = m_notify;
3914 	sctp_add_to_readq(stcb->sctp_ep, stcb,
3915 	    control,
3916 	    &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, SCTP_SO_NOT_LOCKED);
3917 }
3918 
3919 static void
3920 sctp_notify_stream_reset(struct sctp_tcb *stcb,
3921     int number_entries, uint16_t *list, int flag)
3922 {
3923 	struct mbuf *m_notify;
3924 	struct sctp_queued_to_read *control;
3925 	struct sctp_stream_reset_event *strreset;
3926 	int len;
3927 
3928 	if ((stcb == NULL) ||
3929 	    (sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_STREAM_RESETEVNT))) {
3930 		/* event not enabled */
3931 		return;
3932 	}
3933 
3934 	m_notify = sctp_get_mbuf_for_msg(MCLBYTES, 0, M_NOWAIT, 1, MT_DATA);
3935 	if (m_notify == NULL)
3936 		/* no space left */
3937 		return;
3938 	SCTP_BUF_LEN(m_notify) = 0;
3939 	len = sizeof(struct sctp_stream_reset_event) + (number_entries * sizeof(uint16_t));
3940 	if (len > M_TRAILINGSPACE(m_notify)) {
3941 		/* never enough room */
3942 		sctp_m_freem(m_notify);
3943 		return;
3944 	}
3945 	strreset = mtod(m_notify, struct sctp_stream_reset_event *);
3946 	memset(strreset, 0, len);
3947 	strreset->strreset_type = SCTP_STREAM_RESET_EVENT;
3948 	strreset->strreset_flags = flag;
3949 	strreset->strreset_length = len;
3950 	strreset->strreset_assoc_id = sctp_get_associd(stcb);
3951 	if (number_entries) {
3952 		int i;
3953 
3954 		for (i = 0; i < number_entries; i++) {
3955 			strreset->strreset_stream_list[i] = ntohs(list[i]);
3956 		}
3957 	}
3958 	SCTP_BUF_LEN(m_notify) = len;
3959 	SCTP_BUF_NEXT(m_notify) = NULL;
3960 	if (sctp_sbspace(&stcb->asoc, &stcb->sctp_socket->so_rcv) < SCTP_BUF_LEN(m_notify)) {
3961 		/* no space */
3962 		sctp_m_freem(m_notify);
3963 		return;
3964 	}
3965 	/* append to socket */
3966 	control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination,
3967 	    0, 0, stcb->asoc.context, 0, 0, 0,
3968 	    m_notify);
3969 	if (control == NULL) {
3970 		/* no memory */
3971 		sctp_m_freem(m_notify);
3972 		return;
3973 	}
3974 	control->length = SCTP_BUF_LEN(m_notify);
3975 	control->spec_flags = M_NOTIFICATION;
3976 	/* not that we need this */
3977 	control->tail_mbuf = m_notify;
3978 	sctp_add_to_readq(stcb->sctp_ep, stcb,
3979 	    control,
3980 	    &stcb->sctp_socket->so_rcv, 1, SCTP_READ_LOCK_NOT_HELD, SCTP_SO_NOT_LOCKED);
3981 }
3982 
3983 static void
3984 sctp_notify_remote_error(struct sctp_tcb *stcb, uint16_t error, struct sctp_error_chunk *chunk)
3985 {
3986 	struct mbuf *m_notify;
3987 	struct sctp_remote_error *sre;
3988 	struct sctp_queued_to_read *control;
3989 	unsigned int notif_len;
3990 	uint16_t chunk_len;
3991 
3992 	if ((stcb == NULL) ||
3993 	    sctp_stcb_is_feature_off(stcb->sctp_ep, stcb, SCTP_PCB_FLAGS_RECVPEERERR)) {
3994 		return;
3995 	}
3996 	if (chunk != NULL) {
3997 		chunk_len = ntohs(chunk->ch.chunk_length);
3998 		/*
3999 		 * Only SCTP_CHUNK_BUFFER_SIZE are guaranteed to be
4000 		 * contiguous.
4001 		 */
4002 		if (chunk_len > SCTP_CHUNK_BUFFER_SIZE) {
4003 			chunk_len = SCTP_CHUNK_BUFFER_SIZE;
4004 		}
4005 	} else {
4006 		chunk_len = 0;
4007 	}
4008 	notif_len = (unsigned int)(sizeof(struct sctp_remote_error) + chunk_len);
4009 	m_notify = sctp_get_mbuf_for_msg(notif_len, 0, M_NOWAIT, 1, MT_DATA);
4010 	if (m_notify == NULL) {
4011 		/* Retry with smaller value. */
4012 		notif_len = (unsigned int)sizeof(struct sctp_remote_error);
4013 		m_notify = sctp_get_mbuf_for_msg(notif_len, 0, M_NOWAIT, 1, MT_DATA);
4014 		if (m_notify == NULL) {
4015 			return;
4016 		}
4017 	}
4018 	SCTP_BUF_NEXT(m_notify) = NULL;
4019 	sre = mtod(m_notify, struct sctp_remote_error *);
4020 	memset(sre, 0, notif_len);
4021 	sre->sre_type = SCTP_REMOTE_ERROR;
4022 	sre->sre_flags = 0;
4023 	sre->sre_length = sizeof(struct sctp_remote_error);
4024 	sre->sre_error = error;
4025 	sre->sre_assoc_id = sctp_get_associd(stcb);
4026 	if (notif_len > sizeof(struct sctp_remote_error)) {
4027 		memcpy(sre->sre_data, chunk, chunk_len);
4028 		sre->sre_length += chunk_len;
4029 	}
4030 	SCTP_BUF_LEN(m_notify) = sre->sre_length;
4031 	control = sctp_build_readq_entry(stcb, stcb->asoc.primary_destination,
4032 	    0, 0, stcb->asoc.context, 0, 0, 0,
4033 	    m_notify);
4034 	if (control != NULL) {
4035 		control->length = SCTP_BUF_LEN(m_notify);
4036 		control->spec_flags = M_NOTIFICATION;
4037 		/* not that we need this */
4038 		control->tail_mbuf = m_notify;
4039 		sctp_add_to_readq(stcb->sctp_ep, stcb,
4040 		    control,
4041 		    &stcb->sctp_socket->so_rcv, 1,
4042 		    SCTP_READ_LOCK_NOT_HELD, SCTP_SO_NOT_LOCKED);
4043 	} else {
4044 		sctp_m_freem(m_notify);
4045 	}
4046 }
4047 
4048 void
4049 sctp_ulp_notify(uint32_t notification, struct sctp_tcb *stcb,
4050     uint32_t error, void *data, int so_locked)
4051 {
4052 	if ((stcb == NULL) ||
4053 	    (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) ||
4054 	    (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE) ||
4055 	    (stcb->asoc.state & SCTP_STATE_CLOSED_SOCKET)) {
4056 		/* If the socket is gone we are out of here */
4057 		return;
4058 	}
4059 	if (stcb->sctp_socket->so_rcv.sb_state & SBS_CANTRCVMORE) {
4060 		return;
4061 	}
4062 	if ((SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_WAIT) ||
4063 	    (SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_ECHOED)) {
4064 		if ((notification == SCTP_NOTIFY_INTERFACE_DOWN) ||
4065 		    (notification == SCTP_NOTIFY_INTERFACE_UP) ||
4066 		    (notification == SCTP_NOTIFY_INTERFACE_CONFIRMED)) {
4067 			/* Don't report these in front states */
4068 			return;
4069 		}
4070 	}
4071 	switch (notification) {
4072 	case SCTP_NOTIFY_ASSOC_UP:
4073 		if (stcb->asoc.assoc_up_sent == 0) {
4074 			sctp_notify_assoc_change(SCTP_COMM_UP, stcb, error, NULL, 0, so_locked);
4075 			stcb->asoc.assoc_up_sent = 1;
4076 		}
4077 		if (stcb->asoc.adaptation_needed && (stcb->asoc.adaptation_sent == 0)) {
4078 			sctp_notify_adaptation_layer(stcb);
4079 		}
4080 		if (stcb->asoc.auth_supported == 0) {
4081 			sctp_ulp_notify(SCTP_NOTIFY_NO_PEER_AUTH, stcb, 0,
4082 			    NULL, so_locked);
4083 		}
4084 		break;
4085 	case SCTP_NOTIFY_ASSOC_DOWN:
4086 		sctp_notify_assoc_change(SCTP_SHUTDOWN_COMP, stcb, error, NULL, 0, so_locked);
4087 		break;
4088 	case SCTP_NOTIFY_INTERFACE_DOWN:
4089 		{
4090 			struct sctp_nets *net;
4091 
4092 			net = (struct sctp_nets *)data;
4093 			sctp_notify_peer_addr_change(stcb, SCTP_ADDR_UNREACHABLE,
4094 			    (struct sockaddr *)&net->ro._l_addr, error, so_locked);
4095 			break;
4096 		}
4097 	case SCTP_NOTIFY_INTERFACE_UP:
4098 		{
4099 			struct sctp_nets *net;
4100 
4101 			net = (struct sctp_nets *)data;
4102 			sctp_notify_peer_addr_change(stcb, SCTP_ADDR_AVAILABLE,
4103 			    (struct sockaddr *)&net->ro._l_addr, error, so_locked);
4104 			break;
4105 		}
4106 	case SCTP_NOTIFY_INTERFACE_CONFIRMED:
4107 		{
4108 			struct sctp_nets *net;
4109 
4110 			net = (struct sctp_nets *)data;
4111 			sctp_notify_peer_addr_change(stcb, SCTP_ADDR_CONFIRMED,
4112 			    (struct sockaddr *)&net->ro._l_addr, error, so_locked);
4113 			break;
4114 		}
4115 	case SCTP_NOTIFY_SPECIAL_SP_FAIL:
4116 		sctp_notify_send_failed2(stcb, error,
4117 		    (struct sctp_stream_queue_pending *)data, so_locked);
4118 		break;
4119 	case SCTP_NOTIFY_SENT_DG_FAIL:
4120 		sctp_notify_send_failed(stcb, 1, error,
4121 		    (struct sctp_tmit_chunk *)data, so_locked);
4122 		break;
4123 	case SCTP_NOTIFY_UNSENT_DG_FAIL:
4124 		sctp_notify_send_failed(stcb, 0, error,
4125 		    (struct sctp_tmit_chunk *)data, so_locked);
4126 		break;
4127 	case SCTP_NOTIFY_PARTIAL_DELVIERY_INDICATION:
4128 		{
4129 			uint32_t val;
4130 
4131 			val = *((uint32_t *)data);
4132 
4133 			sctp_notify_partial_delivery_indication(stcb, error, val, so_locked);
4134 			break;
4135 		}
4136 	case SCTP_NOTIFY_ASSOC_LOC_ABORTED:
4137 		if ((SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_WAIT) ||
4138 		    (SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_ECHOED)) {
4139 			sctp_notify_assoc_change(SCTP_CANT_STR_ASSOC, stcb, error, data, 0, so_locked);
4140 		} else {
4141 			sctp_notify_assoc_change(SCTP_COMM_LOST, stcb, error, data, 0, so_locked);
4142 		}
4143 		break;
4144 	case SCTP_NOTIFY_ASSOC_REM_ABORTED:
4145 		if ((SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_WAIT) ||
4146 		    (SCTP_GET_STATE(stcb) == SCTP_STATE_COOKIE_ECHOED)) {
4147 			sctp_notify_assoc_change(SCTP_CANT_STR_ASSOC, stcb, error, data, 1, so_locked);
4148 		} else {
4149 			sctp_notify_assoc_change(SCTP_COMM_LOST, stcb, error, data, 1, so_locked);
4150 		}
4151 		break;
4152 	case SCTP_NOTIFY_ASSOC_RESTART:
4153 		sctp_notify_assoc_change(SCTP_RESTART, stcb, error, NULL, 0, so_locked);
4154 		if (stcb->asoc.auth_supported == 0) {
4155 			sctp_ulp_notify(SCTP_NOTIFY_NO_PEER_AUTH, stcb, 0,
4156 			    NULL, so_locked);
4157 		}
4158 		break;
4159 	case SCTP_NOTIFY_STR_RESET_SEND:
4160 		sctp_notify_stream_reset(stcb, error, ((uint16_t *)data), SCTP_STREAM_RESET_OUTGOING_SSN);
4161 		break;
4162 	case SCTP_NOTIFY_STR_RESET_RECV:
4163 		sctp_notify_stream_reset(stcb, error, ((uint16_t *)data), SCTP_STREAM_RESET_INCOMING);
4164 		break;
4165 	case SCTP_NOTIFY_STR_RESET_FAILED_OUT:
4166 		sctp_notify_stream_reset(stcb, error, ((uint16_t *)data),
4167 		    (SCTP_STREAM_RESET_OUTGOING_SSN | SCTP_STREAM_RESET_FAILED));
4168 		break;
4169 	case SCTP_NOTIFY_STR_RESET_DENIED_OUT:
4170 		sctp_notify_stream_reset(stcb, error, ((uint16_t *)data),
4171 		    (SCTP_STREAM_RESET_OUTGOING_SSN | SCTP_STREAM_RESET_DENIED));
4172 		break;
4173 	case SCTP_NOTIFY_STR_RESET_FAILED_IN:
4174 		sctp_notify_stream_reset(stcb, error, ((uint16_t *)data),
4175 		    (SCTP_STREAM_RESET_INCOMING | SCTP_STREAM_RESET_FAILED));
4176 		break;
4177 	case SCTP_NOTIFY_STR_RESET_DENIED_IN:
4178 		sctp_notify_stream_reset(stcb, error, ((uint16_t *)data),
4179 		    (SCTP_STREAM_RESET_INCOMING | SCTP_STREAM_RESET_DENIED));
4180 		break;
4181 	case SCTP_NOTIFY_ASCONF_ADD_IP:
4182 		sctp_notify_peer_addr_change(stcb, SCTP_ADDR_ADDED, data,
4183 		    error, so_locked);
4184 		break;
4185 	case SCTP_NOTIFY_ASCONF_DELETE_IP:
4186 		sctp_notify_peer_addr_change(stcb, SCTP_ADDR_REMOVED, data,
4187 		    error, so_locked);
4188 		break;
4189 	case SCTP_NOTIFY_ASCONF_SET_PRIMARY:
4190 		sctp_notify_peer_addr_change(stcb, SCTP_ADDR_MADE_PRIM, data,
4191 		    error, so_locked);
4192 		break;
4193 	case SCTP_NOTIFY_PEER_SHUTDOWN:
4194 		sctp_notify_shutdown_event(stcb);
4195 		break;
4196 	case SCTP_NOTIFY_AUTH_NEW_KEY:
4197 		sctp_notify_authentication(stcb, SCTP_AUTH_NEW_KEY, error,
4198 		    (uint16_t)(uintptr_t)data,
4199 		    so_locked);
4200 		break;
4201 	case SCTP_NOTIFY_AUTH_FREE_KEY:
4202 		sctp_notify_authentication(stcb, SCTP_AUTH_FREE_KEY, error,
4203 		    (uint16_t)(uintptr_t)data,
4204 		    so_locked);
4205 		break;
4206 	case SCTP_NOTIFY_NO_PEER_AUTH:
4207 		sctp_notify_authentication(stcb, SCTP_AUTH_NO_AUTH, error,
4208 		    (uint16_t)(uintptr_t)data,
4209 		    so_locked);
4210 		break;
4211 	case SCTP_NOTIFY_SENDER_DRY:
4212 		sctp_notify_sender_dry_event(stcb, so_locked);
4213 		break;
4214 	case SCTP_NOTIFY_REMOTE_ERROR:
4215 		sctp_notify_remote_error(stcb, error, data);
4216 		break;
4217 	default:
4218 		SCTPDBG(SCTP_DEBUG_UTIL1, "%s: unknown notification %xh (%u)\n",
4219 		    __func__, notification, notification);
4220 		break;
4221 	}			/* end switch */
4222 }
4223 
4224 void
4225 sctp_report_all_outbound(struct sctp_tcb *stcb, uint16_t error, int so_locked)
4226 {
4227 	struct sctp_association *asoc;
4228 	struct sctp_stream_out *outs;
4229 	struct sctp_tmit_chunk *chk, *nchk;
4230 	struct sctp_stream_queue_pending *sp, *nsp;
4231 	int i;
4232 
4233 	if (stcb == NULL) {
4234 		return;
4235 	}
4236 	asoc = &stcb->asoc;
4237 	if (asoc->state & SCTP_STATE_ABOUT_TO_BE_FREED) {
4238 		/* already being freed */
4239 		return;
4240 	}
4241 	if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) ||
4242 	    (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE) ||
4243 	    (asoc->state & SCTP_STATE_CLOSED_SOCKET)) {
4244 		return;
4245 	}
4246 	/* now through all the gunk freeing chunks */
4247 	/* sent queue SHOULD be empty */
4248 	TAILQ_FOREACH_SAFE(chk, &asoc->sent_queue, sctp_next, nchk) {
4249 		TAILQ_REMOVE(&asoc->sent_queue, chk, sctp_next);
4250 		asoc->sent_queue_cnt--;
4251 		if (chk->sent != SCTP_DATAGRAM_NR_ACKED) {
4252 			if (asoc->strmout[chk->rec.data.sid].chunks_on_queues > 0) {
4253 				asoc->strmout[chk->rec.data.sid].chunks_on_queues--;
4254 #ifdef INVARIANTS
4255 			} else {
4256 				panic("No chunks on the queues for sid %u.", chk->rec.data.sid);
4257 #endif
4258 			}
4259 		}
4260 		if (chk->data != NULL) {
4261 			sctp_free_bufspace(stcb, asoc, chk, 1);
4262 			sctp_ulp_notify(SCTP_NOTIFY_SENT_DG_FAIL, stcb,
4263 			    error, chk, so_locked);
4264 			if (chk->data) {
4265 				sctp_m_freem(chk->data);
4266 				chk->data = NULL;
4267 			}
4268 		}
4269 		sctp_free_a_chunk(stcb, chk, so_locked);
4270 		/* sa_ignore FREED_MEMORY */
4271 	}
4272 	/* pending send queue SHOULD be empty */
4273 	TAILQ_FOREACH_SAFE(chk, &asoc->send_queue, sctp_next, nchk) {
4274 		TAILQ_REMOVE(&asoc->send_queue, chk, sctp_next);
4275 		asoc->send_queue_cnt--;
4276 		if (asoc->strmout[chk->rec.data.sid].chunks_on_queues > 0) {
4277 			asoc->strmout[chk->rec.data.sid].chunks_on_queues--;
4278 #ifdef INVARIANTS
4279 		} else {
4280 			panic("No chunks on the queues for sid %u.", chk->rec.data.sid);
4281 #endif
4282 		}
4283 		if (chk->data != NULL) {
4284 			sctp_free_bufspace(stcb, asoc, chk, 1);
4285 			sctp_ulp_notify(SCTP_NOTIFY_UNSENT_DG_FAIL, stcb,
4286 			    error, chk, so_locked);
4287 			if (chk->data) {
4288 				sctp_m_freem(chk->data);
4289 				chk->data = NULL;
4290 			}
4291 		}
4292 		sctp_free_a_chunk(stcb, chk, so_locked);
4293 		/* sa_ignore FREED_MEMORY */
4294 	}
4295 	for (i = 0; i < asoc->streamoutcnt; i++) {
4296 		/* For each stream */
4297 		outs = &asoc->strmout[i];
4298 		/* clean up any sends there */
4299 		TAILQ_FOREACH_SAFE(sp, &outs->outqueue, next, nsp) {
4300 			atomic_subtract_int(&asoc->stream_queue_cnt, 1);
4301 			TAILQ_REMOVE(&outs->outqueue, sp, next);
4302 			stcb->asoc.ss_functions.sctp_ss_remove_from_stream(stcb, asoc, outs, sp, 1);
4303 			sctp_free_spbufspace(stcb, asoc, sp);
4304 			if (sp->data) {
4305 				sctp_ulp_notify(SCTP_NOTIFY_SPECIAL_SP_FAIL, stcb,
4306 				    error, (void *)sp, so_locked);
4307 				if (sp->data) {
4308 					sctp_m_freem(sp->data);
4309 					sp->data = NULL;
4310 					sp->tail_mbuf = NULL;
4311 					sp->length = 0;
4312 				}
4313 			}
4314 			if (sp->net) {
4315 				sctp_free_remote_addr(sp->net);
4316 				sp->net = NULL;
4317 			}
4318 			/* Free the chunk */
4319 			sctp_free_a_strmoq(stcb, sp, so_locked);
4320 			/* sa_ignore FREED_MEMORY */
4321 		}
4322 	}
4323 }
4324 
4325 void
4326 sctp_abort_notification(struct sctp_tcb *stcb, uint8_t from_peer, uint16_t error,
4327     struct sctp_abort_chunk *abort, int so_locked)
4328 {
4329 	if (stcb == NULL) {
4330 		return;
4331 	}
4332 	if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL) ||
4333 	    ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) &&
4334 	    (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_CONNECTED))) {
4335 		stcb->sctp_ep->sctp_flags |= SCTP_PCB_FLAGS_WAS_ABORTED;
4336 	}
4337 	if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) ||
4338 	    (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE) ||
4339 	    (stcb->asoc.state & SCTP_STATE_CLOSED_SOCKET)) {
4340 		return;
4341 	}
4342 	SCTP_TCB_SEND_LOCK(stcb);
4343 	SCTP_ADD_SUBSTATE(stcb, SCTP_STATE_WAS_ABORTED);
4344 	/* Tell them we lost the asoc */
4345 	sctp_report_all_outbound(stcb, error, so_locked);
4346 	SCTP_TCB_SEND_UNLOCK(stcb);
4347 	if (from_peer) {
4348 		sctp_ulp_notify(SCTP_NOTIFY_ASSOC_REM_ABORTED, stcb, error, abort, so_locked);
4349 	} else {
4350 		sctp_ulp_notify(SCTP_NOTIFY_ASSOC_LOC_ABORTED, stcb, error, abort, so_locked);
4351 	}
4352 }
4353 
4354 void
4355 sctp_abort_association(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
4356     struct mbuf *m, int iphlen,
4357     struct sockaddr *src, struct sockaddr *dst,
4358     struct sctphdr *sh, struct mbuf *op_err,
4359     uint8_t mflowtype, uint32_t mflowid,
4360     uint32_t vrf_id, uint16_t port)
4361 {
4362 	uint32_t vtag;
4363 
4364 	vtag = 0;
4365 	if (stcb != NULL) {
4366 		vtag = stcb->asoc.peer_vtag;
4367 		vrf_id = stcb->asoc.vrf_id;
4368 	}
4369 	sctp_send_abort(m, iphlen, src, dst, sh, vtag, op_err,
4370 	    mflowtype, mflowid, inp->fibnum,
4371 	    vrf_id, port);
4372 	if (stcb != NULL) {
4373 		/* We have a TCB to abort, send notification too */
4374 		sctp_abort_notification(stcb, 0, 0, NULL, SCTP_SO_NOT_LOCKED);
4375 		/* Ok, now lets free it */
4376 		SCTP_STAT_INCR_COUNTER32(sctps_aborted);
4377 		if ((SCTP_GET_STATE(stcb) == SCTP_STATE_OPEN) ||
4378 		    (SCTP_GET_STATE(stcb) == SCTP_STATE_SHUTDOWN_RECEIVED)) {
4379 			SCTP_STAT_DECR_GAUGE32(sctps_currestab);
4380 		}
4381 		(void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC,
4382 		    SCTP_FROM_SCTPUTIL + SCTP_LOC_4);
4383 	}
4384 }
4385 #ifdef SCTP_ASOCLOG_OF_TSNS
4386 void
4387 sctp_print_out_track_log(struct sctp_tcb *stcb)
4388 {
4389 #ifdef NOSIY_PRINTS
4390 	int i;
4391 
4392 	SCTP_PRINTF("Last ep reason:%x\n", stcb->sctp_ep->last_abort_code);
4393 	SCTP_PRINTF("IN bound TSN log-aaa\n");
4394 	if ((stcb->asoc.tsn_in_at == 0) && (stcb->asoc.tsn_in_wrapped == 0)) {
4395 		SCTP_PRINTF("None rcvd\n");
4396 		goto none_in;
4397 	}
4398 	if (stcb->asoc.tsn_in_wrapped) {
4399 		for (i = stcb->asoc.tsn_in_at; i < SCTP_TSN_LOG_SIZE; i++) {
4400 			SCTP_PRINTF("TSN:%x strm:%d seq:%d flags:%x sz:%d\n",
4401 			    stcb->asoc.in_tsnlog[i].tsn,
4402 			    stcb->asoc.in_tsnlog[i].strm,
4403 			    stcb->asoc.in_tsnlog[i].seq,
4404 			    stcb->asoc.in_tsnlog[i].flgs,
4405 			    stcb->asoc.in_tsnlog[i].sz);
4406 		}
4407 	}
4408 	if (stcb->asoc.tsn_in_at) {
4409 		for (i = 0; i < stcb->asoc.tsn_in_at; i++) {
4410 			SCTP_PRINTF("TSN:%x strm:%d seq:%d flags:%x sz:%d\n",
4411 			    stcb->asoc.in_tsnlog[i].tsn,
4412 			    stcb->asoc.in_tsnlog[i].strm,
4413 			    stcb->asoc.in_tsnlog[i].seq,
4414 			    stcb->asoc.in_tsnlog[i].flgs,
4415 			    stcb->asoc.in_tsnlog[i].sz);
4416 		}
4417 	}
4418 none_in:
4419 	SCTP_PRINTF("OUT bound TSN log-aaa\n");
4420 	if ((stcb->asoc.tsn_out_at == 0) &&
4421 	    (stcb->asoc.tsn_out_wrapped == 0)) {
4422 		SCTP_PRINTF("None sent\n");
4423 	}
4424 	if (stcb->asoc.tsn_out_wrapped) {
4425 		for (i = stcb->asoc.tsn_out_at; i < SCTP_TSN_LOG_SIZE; i++) {
4426 			SCTP_PRINTF("TSN:%x strm:%d seq:%d flags:%x sz:%d\n",
4427 			    stcb->asoc.out_tsnlog[i].tsn,
4428 			    stcb->asoc.out_tsnlog[i].strm,
4429 			    stcb->asoc.out_tsnlog[i].seq,
4430 			    stcb->asoc.out_tsnlog[i].flgs,
4431 			    stcb->asoc.out_tsnlog[i].sz);
4432 		}
4433 	}
4434 	if (stcb->asoc.tsn_out_at) {
4435 		for (i = 0; i < stcb->asoc.tsn_out_at; i++) {
4436 			SCTP_PRINTF("TSN:%x strm:%d seq:%d flags:%x sz:%d\n",
4437 			    stcb->asoc.out_tsnlog[i].tsn,
4438 			    stcb->asoc.out_tsnlog[i].strm,
4439 			    stcb->asoc.out_tsnlog[i].seq,
4440 			    stcb->asoc.out_tsnlog[i].flgs,
4441 			    stcb->asoc.out_tsnlog[i].sz);
4442 		}
4443 	}
4444 #endif
4445 }
4446 #endif
4447 
4448 void
4449 sctp_abort_an_association(struct sctp_inpcb *inp, struct sctp_tcb *stcb,
4450     struct mbuf *op_err,
4451     int so_locked)
4452 {
4453 
4454 	if (stcb == NULL) {
4455 		/* Got to have a TCB */
4456 		if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) {
4457 			if (LIST_EMPTY(&inp->sctp_asoc_list)) {
4458 				sctp_inpcb_free(inp, SCTP_FREE_SHOULD_USE_ABORT,
4459 				    SCTP_CALLED_DIRECTLY_NOCMPSET);
4460 			}
4461 		}
4462 		return;
4463 	}
4464 	/* notify the peer */
4465 	sctp_send_abort_tcb(stcb, op_err, so_locked);
4466 	SCTP_STAT_INCR_COUNTER32(sctps_aborted);
4467 	if ((SCTP_GET_STATE(stcb) == SCTP_STATE_OPEN) ||
4468 	    (SCTP_GET_STATE(stcb) == SCTP_STATE_SHUTDOWN_RECEIVED)) {
4469 		SCTP_STAT_DECR_GAUGE32(sctps_currestab);
4470 	}
4471 	/* notify the ulp */
4472 	if ((inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) == 0) {
4473 		sctp_abort_notification(stcb, 0, 0, NULL, so_locked);
4474 	}
4475 	/* now free the asoc */
4476 #ifdef SCTP_ASOCLOG_OF_TSNS
4477 	sctp_print_out_track_log(stcb);
4478 #endif
4479 	(void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC,
4480 	    SCTP_FROM_SCTPUTIL + SCTP_LOC_5);
4481 }
4482 
4483 void
4484 sctp_handle_ootb(struct mbuf *m, int iphlen, int offset,
4485     struct sockaddr *src, struct sockaddr *dst,
4486     struct sctphdr *sh, struct sctp_inpcb *inp,
4487     struct mbuf *cause,
4488     uint8_t mflowtype, uint32_t mflowid, uint16_t fibnum,
4489     uint32_t vrf_id, uint16_t port)
4490 {
4491 	struct sctp_chunkhdr *ch, chunk_buf;
4492 	unsigned int chk_length;
4493 	int contains_init_chunk;
4494 
4495 	SCTP_STAT_INCR_COUNTER32(sctps_outoftheblue);
4496 	/* Generate a TO address for future reference */
4497 	if (inp && (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE)) {
4498 		if (LIST_EMPTY(&inp->sctp_asoc_list)) {
4499 			sctp_inpcb_free(inp, SCTP_FREE_SHOULD_USE_ABORT,
4500 			    SCTP_CALLED_DIRECTLY_NOCMPSET);
4501 		}
4502 	}
4503 	contains_init_chunk = 0;
4504 	ch = (struct sctp_chunkhdr *)sctp_m_getptr(m, offset,
4505 	    sizeof(*ch), (uint8_t *)&chunk_buf);
4506 	while (ch != NULL) {
4507 		chk_length = ntohs(ch->chunk_length);
4508 		if (chk_length < sizeof(*ch)) {
4509 			/* break to abort land */
4510 			break;
4511 		}
4512 		switch (ch->chunk_type) {
4513 		case SCTP_INIT:
4514 			contains_init_chunk = 1;
4515 			break;
4516 		case SCTP_PACKET_DROPPED:
4517 			/* we don't respond to pkt-dropped */
4518 			return;
4519 		case SCTP_ABORT_ASSOCIATION:
4520 			/* we don't respond with an ABORT to an ABORT */
4521 			return;
4522 		case SCTP_SHUTDOWN_COMPLETE:
4523 			/*
4524 			 * we ignore it since we are not waiting for it and
4525 			 * peer is gone
4526 			 */
4527 			return;
4528 		case SCTP_SHUTDOWN_ACK:
4529 			sctp_send_shutdown_complete2(src, dst, sh,
4530 			    mflowtype, mflowid, fibnum,
4531 			    vrf_id, port);
4532 			return;
4533 		default:
4534 			break;
4535 		}
4536 		offset += SCTP_SIZE32(chk_length);
4537 		ch = (struct sctp_chunkhdr *)sctp_m_getptr(m, offset,
4538 		    sizeof(*ch), (uint8_t *)&chunk_buf);
4539 	}
4540 	if ((SCTP_BASE_SYSCTL(sctp_blackhole) == 0) ||
4541 	    ((SCTP_BASE_SYSCTL(sctp_blackhole) == 1) &&
4542 	    (contains_init_chunk == 0))) {
4543 		sctp_send_abort(m, iphlen, src, dst, sh, 0, cause,
4544 		    mflowtype, mflowid, fibnum,
4545 		    vrf_id, port);
4546 	}
4547 }
4548 
4549 /*
4550  * check the inbound datagram to make sure there is not an abort inside it,
4551  * if there is return 1, else return 0.
4552  */
4553 int
4554 sctp_is_there_an_abort_here(struct mbuf *m, int iphlen, uint32_t *vtagfill)
4555 {
4556 	struct sctp_chunkhdr *ch;
4557 	struct sctp_init_chunk *init_chk, chunk_buf;
4558 	int offset;
4559 	unsigned int chk_length;
4560 
4561 	offset = iphlen + sizeof(struct sctphdr);
4562 	ch = (struct sctp_chunkhdr *)sctp_m_getptr(m, offset, sizeof(*ch),
4563 	    (uint8_t *)&chunk_buf);
4564 	while (ch != NULL) {
4565 		chk_length = ntohs(ch->chunk_length);
4566 		if (chk_length < sizeof(*ch)) {
4567 			/* packet is probably corrupt */
4568 			break;
4569 		}
4570 		/* we seem to be ok, is it an abort? */
4571 		if (ch->chunk_type == SCTP_ABORT_ASSOCIATION) {
4572 			/* yep, tell them */
4573 			return (1);
4574 		}
4575 		if (ch->chunk_type == SCTP_INITIATION) {
4576 			/* need to update the Vtag */
4577 			init_chk = (struct sctp_init_chunk *)sctp_m_getptr(m,
4578 			    offset, sizeof(*init_chk), (uint8_t *)&chunk_buf);
4579 			if (init_chk != NULL) {
4580 				*vtagfill = ntohl(init_chk->init.initiate_tag);
4581 			}
4582 		}
4583 		/* Nope, move to the next chunk */
4584 		offset += SCTP_SIZE32(chk_length);
4585 		ch = (struct sctp_chunkhdr *)sctp_m_getptr(m, offset,
4586 		    sizeof(*ch), (uint8_t *)&chunk_buf);
4587 	}
4588 	return (0);
4589 }
4590 
4591 /*
4592  * currently (2/02), ifa_addr embeds scope_id's and don't have sin6_scope_id
4593  * set (i.e. it's 0) so, create this function to compare link local scopes
4594  */
4595 #ifdef INET6
4596 uint32_t
4597 sctp_is_same_scope(struct sockaddr_in6 *addr1, struct sockaddr_in6 *addr2)
4598 {
4599 	struct sockaddr_in6 a, b;
4600 
4601 	/* save copies */
4602 	a = *addr1;
4603 	b = *addr2;
4604 
4605 	if (a.sin6_scope_id == 0)
4606 		if (sa6_recoverscope(&a)) {
4607 			/* can't get scope, so can't match */
4608 			return (0);
4609 		}
4610 	if (b.sin6_scope_id == 0)
4611 		if (sa6_recoverscope(&b)) {
4612 			/* can't get scope, so can't match */
4613 			return (0);
4614 		}
4615 	if (a.sin6_scope_id != b.sin6_scope_id)
4616 		return (0);
4617 
4618 	return (1);
4619 }
4620 
4621 /*
4622  * returns a sockaddr_in6 with embedded scope recovered and removed
4623  */
4624 struct sockaddr_in6 *
4625 sctp_recover_scope(struct sockaddr_in6 *addr, struct sockaddr_in6 *store)
4626 {
4627 	/* check and strip embedded scope junk */
4628 	if (addr->sin6_family == AF_INET6) {
4629 		if (IN6_IS_SCOPE_LINKLOCAL(&addr->sin6_addr)) {
4630 			if (addr->sin6_scope_id == 0) {
4631 				*store = *addr;
4632 				if (!sa6_recoverscope(store)) {
4633 					/* use the recovered scope */
4634 					addr = store;
4635 				}
4636 			} else {
4637 				/* else, return the original "to" addr */
4638 				in6_clearscope(&addr->sin6_addr);
4639 			}
4640 		}
4641 	}
4642 	return (addr);
4643 }
4644 #endif
4645 
4646 /*
4647  * are the two addresses the same?  currently a "scopeless" check returns: 1
4648  * if same, 0 if not
4649  */
4650 int
4651 sctp_cmpaddr(struct sockaddr *sa1, struct sockaddr *sa2)
4652 {
4653 
4654 	/* must be valid */
4655 	if (sa1 == NULL || sa2 == NULL)
4656 		return (0);
4657 
4658 	/* must be the same family */
4659 	if (sa1->sa_family != sa2->sa_family)
4660 		return (0);
4661 
4662 	switch (sa1->sa_family) {
4663 #ifdef INET6
4664 	case AF_INET6:
4665 		{
4666 			/* IPv6 addresses */
4667 			struct sockaddr_in6 *sin6_1, *sin6_2;
4668 
4669 			sin6_1 = (struct sockaddr_in6 *)sa1;
4670 			sin6_2 = (struct sockaddr_in6 *)sa2;
4671 			return (SCTP6_ARE_ADDR_EQUAL(sin6_1,
4672 			    sin6_2));
4673 		}
4674 #endif
4675 #ifdef INET
4676 	case AF_INET:
4677 		{
4678 			/* IPv4 addresses */
4679 			struct sockaddr_in *sin_1, *sin_2;
4680 
4681 			sin_1 = (struct sockaddr_in *)sa1;
4682 			sin_2 = (struct sockaddr_in *)sa2;
4683 			return (sin_1->sin_addr.s_addr == sin_2->sin_addr.s_addr);
4684 		}
4685 #endif
4686 	default:
4687 		/* we don't do these... */
4688 		return (0);
4689 	}
4690 }
4691 
4692 void
4693 sctp_print_address(struct sockaddr *sa)
4694 {
4695 #ifdef INET6
4696 	char ip6buf[INET6_ADDRSTRLEN];
4697 #endif
4698 
4699 	switch (sa->sa_family) {
4700 #ifdef INET6
4701 	case AF_INET6:
4702 		{
4703 			struct sockaddr_in6 *sin6;
4704 
4705 			sin6 = (struct sockaddr_in6 *)sa;
4706 			SCTP_PRINTF("IPv6 address: %s:port:%d scope:%u\n",
4707 			    ip6_sprintf(ip6buf, &sin6->sin6_addr),
4708 			    ntohs(sin6->sin6_port),
4709 			    sin6->sin6_scope_id);
4710 			break;
4711 		}
4712 #endif
4713 #ifdef INET
4714 	case AF_INET:
4715 		{
4716 			struct sockaddr_in *sin;
4717 			unsigned char *p;
4718 
4719 			sin = (struct sockaddr_in *)sa;
4720 			p = (unsigned char *)&sin->sin_addr;
4721 			SCTP_PRINTF("IPv4 address: %u.%u.%u.%u:%d\n",
4722 			    p[0], p[1], p[2], p[3], ntohs(sin->sin_port));
4723 			break;
4724 		}
4725 #endif
4726 	default:
4727 		SCTP_PRINTF("?\n");
4728 		break;
4729 	}
4730 }
4731 
4732 void
4733 sctp_pull_off_control_to_new_inp(struct sctp_inpcb *old_inp,
4734     struct sctp_inpcb *new_inp,
4735     struct sctp_tcb *stcb,
4736     int waitflags)
4737 {
4738 	/*
4739 	 * go through our old INP and pull off any control structures that
4740 	 * belong to stcb and move then to the new inp.
4741 	 */
4742 	struct socket *old_so, *new_so;
4743 	struct sctp_queued_to_read *control, *nctl;
4744 	struct sctp_readhead tmp_queue;
4745 	struct mbuf *m;
4746 	int error = 0;
4747 
4748 	old_so = old_inp->sctp_socket;
4749 	new_so = new_inp->sctp_socket;
4750 	TAILQ_INIT(&tmp_queue);
4751 	error = sblock(&old_so->so_rcv, waitflags);
4752 	if (error) {
4753 		/*
4754 		 * Gak, can't get sblock, we have a problem. data will be
4755 		 * left stranded.. and we don't dare look at it since the
4756 		 * other thread may be reading something. Oh well, its a
4757 		 * screwed up app that does a peeloff OR a accept while
4758 		 * reading from the main socket... actually its only the
4759 		 * peeloff() case, since I think read will fail on a
4760 		 * listening socket..
4761 		 */
4762 		return;
4763 	}
4764 	/* lock the socket buffers */
4765 	SCTP_INP_READ_LOCK(old_inp);
4766 	TAILQ_FOREACH_SAFE(control, &old_inp->read_queue, next, nctl) {
4767 		/* Pull off all for out target stcb */
4768 		if (control->stcb == stcb) {
4769 			/* remove it we want it */
4770 			TAILQ_REMOVE(&old_inp->read_queue, control, next);
4771 			TAILQ_INSERT_TAIL(&tmp_queue, control, next);
4772 			m = control->data;
4773 			while (m) {
4774 				if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) {
4775 					sctp_sblog(&old_so->so_rcv, control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBFREE, SCTP_BUF_LEN(m));
4776 				}
4777 				sctp_sbfree(control, stcb, &old_so->so_rcv, m);
4778 				if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) {
4779 					sctp_sblog(&old_so->so_rcv, control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBRESULT, 0);
4780 				}
4781 				m = SCTP_BUF_NEXT(m);
4782 			}
4783 		}
4784 	}
4785 	SCTP_INP_READ_UNLOCK(old_inp);
4786 	/* Remove the sb-lock on the old socket */
4787 
4788 	sbunlock(&old_so->so_rcv);
4789 	/* Now we move them over to the new socket buffer */
4790 	SCTP_INP_READ_LOCK(new_inp);
4791 	TAILQ_FOREACH_SAFE(control, &tmp_queue, next, nctl) {
4792 		TAILQ_INSERT_TAIL(&new_inp->read_queue, control, next);
4793 		m = control->data;
4794 		while (m) {
4795 			if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) {
4796 				sctp_sblog(&new_so->so_rcv, control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBALLOC, SCTP_BUF_LEN(m));
4797 			}
4798 			sctp_sballoc(stcb, &new_so->so_rcv, m);
4799 			if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) {
4800 				sctp_sblog(&new_so->so_rcv, control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBRESULT, 0);
4801 			}
4802 			m = SCTP_BUF_NEXT(m);
4803 		}
4804 	}
4805 	SCTP_INP_READ_UNLOCK(new_inp);
4806 }
4807 
4808 void
4809 sctp_wakeup_the_read_socket(struct sctp_inpcb *inp,
4810     struct sctp_tcb *stcb,
4811     int so_locked
4812     SCTP_UNUSED
4813 )
4814 {
4815 	if ((inp != NULL) && (inp->sctp_socket != NULL)) {
4816 		sctp_sorwakeup(inp, inp->sctp_socket);
4817 	}
4818 }
4819 
4820 void
4821 sctp_add_to_readq(struct sctp_inpcb *inp,
4822     struct sctp_tcb *stcb,
4823     struct sctp_queued_to_read *control,
4824     struct sockbuf *sb,
4825     int end,
4826     int inp_read_lock_held,
4827     int so_locked)
4828 {
4829 	/*
4830 	 * Here we must place the control on the end of the socket read
4831 	 * queue AND increment sb_cc so that select will work properly on
4832 	 * read.
4833 	 */
4834 	struct mbuf *m, *prev = NULL;
4835 
4836 	if (inp == NULL) {
4837 		/* Gak, TSNH!! */
4838 #ifdef INVARIANTS
4839 		panic("Gak, inp NULL on add_to_readq");
4840 #endif
4841 		return;
4842 	}
4843 	if (inp_read_lock_held == 0)
4844 		SCTP_INP_READ_LOCK(inp);
4845 	if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_CANT_READ) {
4846 		if (!control->on_strm_q) {
4847 			sctp_free_remote_addr(control->whoFrom);
4848 			if (control->data) {
4849 				sctp_m_freem(control->data);
4850 				control->data = NULL;
4851 			}
4852 			sctp_free_a_readq(stcb, control);
4853 		}
4854 		if (inp_read_lock_held == 0)
4855 			SCTP_INP_READ_UNLOCK(inp);
4856 		return;
4857 	}
4858 	if (!(control->spec_flags & M_NOTIFICATION)) {
4859 		atomic_add_int(&inp->total_recvs, 1);
4860 		if (!control->do_not_ref_stcb) {
4861 			atomic_add_int(&stcb->total_recvs, 1);
4862 		}
4863 	}
4864 	m = control->data;
4865 	control->held_length = 0;
4866 	control->length = 0;
4867 	while (m) {
4868 		if (SCTP_BUF_LEN(m) == 0) {
4869 			/* Skip mbufs with NO length */
4870 			if (prev == NULL) {
4871 				/* First one */
4872 				control->data = sctp_m_free(m);
4873 				m = control->data;
4874 			} else {
4875 				SCTP_BUF_NEXT(prev) = sctp_m_free(m);
4876 				m = SCTP_BUF_NEXT(prev);
4877 			}
4878 			if (m == NULL) {
4879 				control->tail_mbuf = prev;
4880 			}
4881 			continue;
4882 		}
4883 		prev = m;
4884 		if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) {
4885 			sctp_sblog(sb, control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBALLOC, SCTP_BUF_LEN(m));
4886 		}
4887 		sctp_sballoc(stcb, sb, m);
4888 		if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) {
4889 			sctp_sblog(sb, control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBRESULT, 0);
4890 		}
4891 		atomic_add_int(&control->length, SCTP_BUF_LEN(m));
4892 		m = SCTP_BUF_NEXT(m);
4893 	}
4894 	if (prev != NULL) {
4895 		control->tail_mbuf = prev;
4896 	} else {
4897 		/* Everything got collapsed out?? */
4898 		if (!control->on_strm_q) {
4899 			sctp_free_remote_addr(control->whoFrom);
4900 			sctp_free_a_readq(stcb, control);
4901 		}
4902 		if (inp_read_lock_held == 0)
4903 			SCTP_INP_READ_UNLOCK(inp);
4904 		return;
4905 	}
4906 	if (end) {
4907 		control->end_added = 1;
4908 	}
4909 	TAILQ_INSERT_TAIL(&inp->read_queue, control, next);
4910 	control->on_read_q = 1;
4911 	if (inp_read_lock_held == 0)
4912 		SCTP_INP_READ_UNLOCK(inp);
4913 	if (inp && inp->sctp_socket) {
4914 		sctp_wakeup_the_read_socket(inp, stcb, so_locked);
4915 	}
4916 }
4917 
4918 /*************HOLD THIS COMMENT FOR PATCH FILE OF
4919  *************ALTERNATE ROUTING CODE
4920  */
4921 
4922 /*************HOLD THIS COMMENT FOR END OF PATCH FILE OF
4923  *************ALTERNATE ROUTING CODE
4924  */
4925 
4926 struct mbuf *
4927 sctp_generate_cause(uint16_t code, char *info)
4928 {
4929 	struct mbuf *m;
4930 	struct sctp_gen_error_cause *cause;
4931 	size_t info_len;
4932 	uint16_t len;
4933 
4934 	if ((code == 0) || (info == NULL)) {
4935 		return (NULL);
4936 	}
4937 	info_len = strlen(info);
4938 	if (info_len > (SCTP_MAX_CAUSE_LENGTH - sizeof(struct sctp_paramhdr))) {
4939 		return (NULL);
4940 	}
4941 	len = (uint16_t)(sizeof(struct sctp_paramhdr) + info_len);
4942 	m = sctp_get_mbuf_for_msg(len, 0, M_NOWAIT, 1, MT_DATA);
4943 	if (m != NULL) {
4944 		SCTP_BUF_LEN(m) = len;
4945 		cause = mtod(m, struct sctp_gen_error_cause *);
4946 		cause->code = htons(code);
4947 		cause->length = htons(len);
4948 		memcpy(cause->info, info, info_len);
4949 	}
4950 	return (m);
4951 }
4952 
4953 struct mbuf *
4954 sctp_generate_no_user_data_cause(uint32_t tsn)
4955 {
4956 	struct mbuf *m;
4957 	struct sctp_error_no_user_data *no_user_data_cause;
4958 	uint16_t len;
4959 
4960 	len = (uint16_t)sizeof(struct sctp_error_no_user_data);
4961 	m = sctp_get_mbuf_for_msg(len, 0, M_NOWAIT, 1, MT_DATA);
4962 	if (m != NULL) {
4963 		SCTP_BUF_LEN(m) = len;
4964 		no_user_data_cause = mtod(m, struct sctp_error_no_user_data *);
4965 		no_user_data_cause->cause.code = htons(SCTP_CAUSE_NO_USER_DATA);
4966 		no_user_data_cause->cause.length = htons(len);
4967 		no_user_data_cause->tsn = htonl(tsn);
4968 	}
4969 	return (m);
4970 }
4971 
4972 #ifdef SCTP_MBCNT_LOGGING
4973 void
4974 sctp_free_bufspace(struct sctp_tcb *stcb, struct sctp_association *asoc,
4975     struct sctp_tmit_chunk *tp1, int chk_cnt)
4976 {
4977 	if (tp1->data == NULL) {
4978 		return;
4979 	}
4980 	asoc->chunks_on_out_queue -= chk_cnt;
4981 	if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MBCNT_LOGGING_ENABLE) {
4982 		sctp_log_mbcnt(SCTP_LOG_MBCNT_DECREASE,
4983 		    asoc->total_output_queue_size,
4984 		    tp1->book_size,
4985 		    0,
4986 		    tp1->mbcnt);
4987 	}
4988 	if (asoc->total_output_queue_size >= tp1->book_size) {
4989 		atomic_add_int(&asoc->total_output_queue_size, -tp1->book_size);
4990 	} else {
4991 		asoc->total_output_queue_size = 0;
4992 	}
4993 
4994 	if (stcb->sctp_socket && (((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL)) ||
4995 	    ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE)))) {
4996 		if (stcb->sctp_socket->so_snd.sb_cc >= tp1->book_size) {
4997 			stcb->sctp_socket->so_snd.sb_cc -= tp1->book_size;
4998 		} else {
4999 			stcb->sctp_socket->so_snd.sb_cc = 0;
5000 		}
5001 	}
5002 }
5003 
5004 #endif
5005 
5006 int
5007 sctp_release_pr_sctp_chunk(struct sctp_tcb *stcb, struct sctp_tmit_chunk *tp1,
5008     uint8_t sent, int so_locked)
5009 {
5010 	struct sctp_stream_out *strq;
5011 	struct sctp_tmit_chunk *chk = NULL, *tp2;
5012 	struct sctp_stream_queue_pending *sp;
5013 	uint32_t mid;
5014 	uint16_t sid;
5015 	uint8_t foundeom = 0;
5016 	int ret_sz = 0;
5017 	int notdone;
5018 	int do_wakeup_routine = 0;
5019 
5020 	sid = tp1->rec.data.sid;
5021 	mid = tp1->rec.data.mid;
5022 	if (sent || !(tp1->rec.data.rcv_flags & SCTP_DATA_FIRST_FRAG)) {
5023 		stcb->asoc.abandoned_sent[0]++;
5024 		stcb->asoc.abandoned_sent[PR_SCTP_POLICY(tp1->flags)]++;
5025 		stcb->asoc.strmout[sid].abandoned_sent[0]++;
5026 #if defined(SCTP_DETAILED_STR_STATS)
5027 		stcb->asoc.strmout[sid].abandoned_sent[PR_SCTP_POLICY(tp1->flags)]++;
5028 #endif
5029 	} else {
5030 		stcb->asoc.abandoned_unsent[0]++;
5031 		stcb->asoc.abandoned_unsent[PR_SCTP_POLICY(tp1->flags)]++;
5032 		stcb->asoc.strmout[sid].abandoned_unsent[0]++;
5033 #if defined(SCTP_DETAILED_STR_STATS)
5034 		stcb->asoc.strmout[sid].abandoned_unsent[PR_SCTP_POLICY(tp1->flags)]++;
5035 #endif
5036 	}
5037 	do {
5038 		ret_sz += tp1->book_size;
5039 		if (tp1->data != NULL) {
5040 			if (tp1->sent < SCTP_DATAGRAM_RESEND) {
5041 				sctp_flight_size_decrease(tp1);
5042 				sctp_total_flight_decrease(stcb, tp1);
5043 			}
5044 			sctp_free_bufspace(stcb, &stcb->asoc, tp1, 1);
5045 			stcb->asoc.peers_rwnd += tp1->send_size;
5046 			stcb->asoc.peers_rwnd += SCTP_BASE_SYSCTL(sctp_peer_chunk_oh);
5047 			if (sent) {
5048 				sctp_ulp_notify(SCTP_NOTIFY_SENT_DG_FAIL, stcb, 0, tp1, so_locked);
5049 			} else {
5050 				sctp_ulp_notify(SCTP_NOTIFY_UNSENT_DG_FAIL, stcb, 0, tp1, so_locked);
5051 			}
5052 			if (tp1->data) {
5053 				sctp_m_freem(tp1->data);
5054 				tp1->data = NULL;
5055 			}
5056 			do_wakeup_routine = 1;
5057 			if (PR_SCTP_BUF_ENABLED(tp1->flags)) {
5058 				stcb->asoc.sent_queue_cnt_removeable--;
5059 			}
5060 		}
5061 		tp1->sent = SCTP_FORWARD_TSN_SKIP;
5062 		if ((tp1->rec.data.rcv_flags & SCTP_DATA_NOT_FRAG) ==
5063 		    SCTP_DATA_NOT_FRAG) {
5064 			/* not frag'ed we ae done   */
5065 			notdone = 0;
5066 			foundeom = 1;
5067 		} else if (tp1->rec.data.rcv_flags & SCTP_DATA_LAST_FRAG) {
5068 			/* end of frag, we are done */
5069 			notdone = 0;
5070 			foundeom = 1;
5071 		} else {
5072 			/*
5073 			 * Its a begin or middle piece, we must mark all of
5074 			 * it
5075 			 */
5076 			notdone = 1;
5077 			tp1 = TAILQ_NEXT(tp1, sctp_next);
5078 		}
5079 	} while (tp1 && notdone);
5080 	if (foundeom == 0) {
5081 		/*
5082 		 * The multi-part message was scattered across the send and
5083 		 * sent queue.
5084 		 */
5085 		TAILQ_FOREACH_SAFE(tp1, &stcb->asoc.send_queue, sctp_next, tp2) {
5086 			if ((tp1->rec.data.sid != sid) ||
5087 			    (!SCTP_MID_EQ(stcb->asoc.idata_supported, tp1->rec.data.mid, mid))) {
5088 				break;
5089 			}
5090 			/*
5091 			 * save to chk in case we have some on stream out
5092 			 * queue. If so and we have an un-transmitted one we
5093 			 * don't have to fudge the TSN.
5094 			 */
5095 			chk = tp1;
5096 			ret_sz += tp1->book_size;
5097 			sctp_free_bufspace(stcb, &stcb->asoc, tp1, 1);
5098 			if (sent) {
5099 				sctp_ulp_notify(SCTP_NOTIFY_SENT_DG_FAIL, stcb, 0, tp1, so_locked);
5100 			} else {
5101 				sctp_ulp_notify(SCTP_NOTIFY_UNSENT_DG_FAIL, stcb, 0, tp1, so_locked);
5102 			}
5103 			if (tp1->data) {
5104 				sctp_m_freem(tp1->data);
5105 				tp1->data = NULL;
5106 			}
5107 			/* No flight involved here book the size to 0 */
5108 			tp1->book_size = 0;
5109 			if (tp1->rec.data.rcv_flags & SCTP_DATA_LAST_FRAG) {
5110 				foundeom = 1;
5111 			}
5112 			do_wakeup_routine = 1;
5113 			tp1->sent = SCTP_FORWARD_TSN_SKIP;
5114 			TAILQ_REMOVE(&stcb->asoc.send_queue, tp1, sctp_next);
5115 			/*
5116 			 * on to the sent queue so we can wait for it to be
5117 			 * passed by.
5118 			 */
5119 			TAILQ_INSERT_TAIL(&stcb->asoc.sent_queue, tp1,
5120 			    sctp_next);
5121 			stcb->asoc.send_queue_cnt--;
5122 			stcb->asoc.sent_queue_cnt++;
5123 		}
5124 	}
5125 	if (foundeom == 0) {
5126 		/*
5127 		 * Still no eom found. That means there is stuff left on the
5128 		 * stream out queue.. yuck.
5129 		 */
5130 		SCTP_TCB_SEND_LOCK(stcb);
5131 		strq = &stcb->asoc.strmout[sid];
5132 		sp = TAILQ_FIRST(&strq->outqueue);
5133 		if (sp != NULL) {
5134 			sp->discard_rest = 1;
5135 			/*
5136 			 * We may need to put a chunk on the queue that
5137 			 * holds the TSN that would have been sent with the
5138 			 * LAST bit.
5139 			 */
5140 			if (chk == NULL) {
5141 				/* Yep, we have to */
5142 				sctp_alloc_a_chunk(stcb, chk);
5143 				if (chk == NULL) {
5144 					/*
5145 					 * we are hosed. All we can do is
5146 					 * nothing.. which will cause an
5147 					 * abort if the peer is paying
5148 					 * attention.
5149 					 */
5150 					goto oh_well;
5151 				}
5152 				memset(chk, 0, sizeof(*chk));
5153 				chk->rec.data.rcv_flags = 0;
5154 				chk->sent = SCTP_FORWARD_TSN_SKIP;
5155 				chk->asoc = &stcb->asoc;
5156 				if (stcb->asoc.idata_supported == 0) {
5157 					if (sp->sinfo_flags & SCTP_UNORDERED) {
5158 						chk->rec.data.mid = 0;
5159 					} else {
5160 						chk->rec.data.mid = strq->next_mid_ordered;
5161 					}
5162 				} else {
5163 					if (sp->sinfo_flags & SCTP_UNORDERED) {
5164 						chk->rec.data.mid = strq->next_mid_unordered;
5165 					} else {
5166 						chk->rec.data.mid = strq->next_mid_ordered;
5167 					}
5168 				}
5169 				chk->rec.data.sid = sp->sid;
5170 				chk->rec.data.ppid = sp->ppid;
5171 				chk->rec.data.context = sp->context;
5172 				chk->flags = sp->act_flags;
5173 				chk->whoTo = NULL;
5174 				chk->rec.data.tsn = atomic_fetchadd_int(&stcb->asoc.sending_seq, 1);
5175 				strq->chunks_on_queues++;
5176 				TAILQ_INSERT_TAIL(&stcb->asoc.sent_queue, chk, sctp_next);
5177 				stcb->asoc.sent_queue_cnt++;
5178 				stcb->asoc.pr_sctp_cnt++;
5179 			}
5180 			chk->rec.data.rcv_flags |= SCTP_DATA_LAST_FRAG;
5181 			if (sp->sinfo_flags & SCTP_UNORDERED) {
5182 				chk->rec.data.rcv_flags |= SCTP_DATA_UNORDERED;
5183 			}
5184 			if (stcb->asoc.idata_supported == 0) {
5185 				if ((sp->sinfo_flags & SCTP_UNORDERED) == 0) {
5186 					strq->next_mid_ordered++;
5187 				}
5188 			} else {
5189 				if (sp->sinfo_flags & SCTP_UNORDERED) {
5190 					strq->next_mid_unordered++;
5191 				} else {
5192 					strq->next_mid_ordered++;
5193 				}
5194 			}
5195 	oh_well:
5196 			if (sp->data) {
5197 				/*
5198 				 * Pull any data to free up the SB and allow
5199 				 * sender to "add more" while we will throw
5200 				 * away :-)
5201 				 */
5202 				sctp_free_spbufspace(stcb, &stcb->asoc, sp);
5203 				ret_sz += sp->length;
5204 				do_wakeup_routine = 1;
5205 				sp->some_taken = 1;
5206 				sctp_m_freem(sp->data);
5207 				sp->data = NULL;
5208 				sp->tail_mbuf = NULL;
5209 				sp->length = 0;
5210 			}
5211 		}
5212 		SCTP_TCB_SEND_UNLOCK(stcb);
5213 	}
5214 	if (do_wakeup_routine) {
5215 		sctp_sowwakeup(stcb->sctp_ep, stcb->sctp_socket);
5216 	}
5217 	return (ret_sz);
5218 }
5219 
5220 /*
5221  * checks to see if the given address, sa, is one that is currently known by
5222  * the kernel note: can't distinguish the same address on multiple interfaces
5223  * and doesn't handle multiple addresses with different zone/scope id's note:
5224  * ifa_ifwithaddr() compares the entire sockaddr struct
5225  */
5226 struct sctp_ifa *
5227 sctp_find_ifa_in_ep(struct sctp_inpcb *inp, struct sockaddr *addr,
5228     int holds_lock)
5229 {
5230 	struct sctp_laddr *laddr;
5231 
5232 	if (holds_lock == 0) {
5233 		SCTP_INP_RLOCK(inp);
5234 	}
5235 
5236 	LIST_FOREACH(laddr, &inp->sctp_addr_list, sctp_nxt_addr) {
5237 		if (laddr->ifa == NULL)
5238 			continue;
5239 		if (addr->sa_family != laddr->ifa->address.sa.sa_family)
5240 			continue;
5241 #ifdef INET
5242 		if (addr->sa_family == AF_INET) {
5243 			if (((struct sockaddr_in *)addr)->sin_addr.s_addr ==
5244 			    laddr->ifa->address.sin.sin_addr.s_addr) {
5245 				/* found him. */
5246 				break;
5247 			}
5248 		}
5249 #endif
5250 #ifdef INET6
5251 		if (addr->sa_family == AF_INET6) {
5252 			if (SCTP6_ARE_ADDR_EQUAL((struct sockaddr_in6 *)addr,
5253 			    &laddr->ifa->address.sin6)) {
5254 				/* found him. */
5255 				break;
5256 			}
5257 		}
5258 #endif
5259 	}
5260 	if (holds_lock == 0) {
5261 		SCTP_INP_RUNLOCK(inp);
5262 	}
5263 	if (laddr != NULL) {
5264 		return (laddr->ifa);
5265 	} else {
5266 		return (NULL);
5267 	}
5268 }
5269 
5270 uint32_t
5271 sctp_get_ifa_hash_val(struct sockaddr *addr)
5272 {
5273 	switch (addr->sa_family) {
5274 #ifdef INET
5275 	case AF_INET:
5276 		{
5277 			struct sockaddr_in *sin;
5278 
5279 			sin = (struct sockaddr_in *)addr;
5280 			return (sin->sin_addr.s_addr ^ (sin->sin_addr.s_addr >> 16));
5281 		}
5282 #endif
5283 #ifdef INET6
5284 	case AF_INET6:
5285 		{
5286 			struct sockaddr_in6 *sin6;
5287 			uint32_t hash_of_addr;
5288 
5289 			sin6 = (struct sockaddr_in6 *)addr;
5290 			hash_of_addr = (sin6->sin6_addr.s6_addr32[0] +
5291 			    sin6->sin6_addr.s6_addr32[1] +
5292 			    sin6->sin6_addr.s6_addr32[2] +
5293 			    sin6->sin6_addr.s6_addr32[3]);
5294 			hash_of_addr = (hash_of_addr ^ (hash_of_addr >> 16));
5295 			return (hash_of_addr);
5296 		}
5297 #endif
5298 	default:
5299 		break;
5300 	}
5301 	return (0);
5302 }
5303 
5304 struct sctp_ifa *
5305 sctp_find_ifa_by_addr(struct sockaddr *addr, uint32_t vrf_id, int holds_lock)
5306 {
5307 	struct sctp_ifa *sctp_ifap;
5308 	struct sctp_vrf *vrf;
5309 	struct sctp_ifalist *hash_head;
5310 	uint32_t hash_of_addr;
5311 
5312 	if (holds_lock == 0) {
5313 		SCTP_IPI_ADDR_RLOCK();
5314 	} else {
5315 		SCTP_IPI_ADDR_LOCK_ASSERT();
5316 	}
5317 
5318 	vrf = sctp_find_vrf(vrf_id);
5319 	if (vrf == NULL) {
5320 		if (holds_lock == 0)
5321 			SCTP_IPI_ADDR_RUNLOCK();
5322 		return (NULL);
5323 	}
5324 
5325 	hash_of_addr = sctp_get_ifa_hash_val(addr);
5326 
5327 	hash_head = &vrf->vrf_addr_hash[(hash_of_addr & vrf->vrf_addr_hashmark)];
5328 	if (hash_head == NULL) {
5329 		SCTP_PRINTF("hash_of_addr:%x mask:%x table:%x - ",
5330 		    hash_of_addr, (uint32_t)vrf->vrf_addr_hashmark,
5331 		    (uint32_t)(hash_of_addr & vrf->vrf_addr_hashmark));
5332 		sctp_print_address(addr);
5333 		SCTP_PRINTF("No such bucket for address\n");
5334 		if (holds_lock == 0)
5335 			SCTP_IPI_ADDR_RUNLOCK();
5336 
5337 		return (NULL);
5338 	}
5339 	LIST_FOREACH(sctp_ifap, hash_head, next_bucket) {
5340 		if (addr->sa_family != sctp_ifap->address.sa.sa_family)
5341 			continue;
5342 #ifdef INET
5343 		if (addr->sa_family == AF_INET) {
5344 			if (((struct sockaddr_in *)addr)->sin_addr.s_addr ==
5345 			    sctp_ifap->address.sin.sin_addr.s_addr) {
5346 				/* found him. */
5347 				break;
5348 			}
5349 		}
5350 #endif
5351 #ifdef INET6
5352 		if (addr->sa_family == AF_INET6) {
5353 			if (SCTP6_ARE_ADDR_EQUAL((struct sockaddr_in6 *)addr,
5354 			    &sctp_ifap->address.sin6)) {
5355 				/* found him. */
5356 				break;
5357 			}
5358 		}
5359 #endif
5360 	}
5361 	if (holds_lock == 0)
5362 		SCTP_IPI_ADDR_RUNLOCK();
5363 	return (sctp_ifap);
5364 }
5365 
5366 static void
5367 sctp_user_rcvd(struct sctp_tcb *stcb, uint32_t *freed_so_far, int hold_rlock,
5368     uint32_t rwnd_req)
5369 {
5370 	/* User pulled some data, do we need a rwnd update? */
5371 	struct epoch_tracker et;
5372 	int r_unlocked = 0;
5373 	uint32_t dif, rwnd;
5374 	struct socket *so = NULL;
5375 
5376 	if (stcb == NULL)
5377 		return;
5378 
5379 	atomic_add_int(&stcb->asoc.refcnt, 1);
5380 
5381 	if ((SCTP_GET_STATE(stcb) == SCTP_STATE_SHUTDOWN_ACK_SENT) ||
5382 	    (stcb->asoc.state & (SCTP_STATE_ABOUT_TO_BE_FREED | SCTP_STATE_SHUTDOWN_RECEIVED))) {
5383 		/* Pre-check If we are freeing no update */
5384 		goto no_lock;
5385 	}
5386 	SCTP_INP_INCR_REF(stcb->sctp_ep);
5387 	if ((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) ||
5388 	    (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE)) {
5389 		goto out;
5390 	}
5391 	so = stcb->sctp_socket;
5392 	if (so == NULL) {
5393 		goto out;
5394 	}
5395 	atomic_add_int(&stcb->freed_by_sorcv_sincelast, *freed_so_far);
5396 	/* Have you have freed enough to look */
5397 	*freed_so_far = 0;
5398 	/* Yep, its worth a look and the lock overhead */
5399 
5400 	/* Figure out what the rwnd would be */
5401 	rwnd = sctp_calc_rwnd(stcb, &stcb->asoc);
5402 	if (rwnd >= stcb->asoc.my_last_reported_rwnd) {
5403 		dif = rwnd - stcb->asoc.my_last_reported_rwnd;
5404 	} else {
5405 		dif = 0;
5406 	}
5407 	if (dif >= rwnd_req) {
5408 		if (hold_rlock) {
5409 			SCTP_INP_READ_UNLOCK(stcb->sctp_ep);
5410 			r_unlocked = 1;
5411 		}
5412 		if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) {
5413 			/*
5414 			 * One last check before we allow the guy possibly
5415 			 * to get in. There is a race, where the guy has not
5416 			 * reached the gate. In that case
5417 			 */
5418 			goto out;
5419 		}
5420 		SCTP_TCB_LOCK(stcb);
5421 		if (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) {
5422 			/* No reports here */
5423 			SCTP_TCB_UNLOCK(stcb);
5424 			goto out;
5425 		}
5426 		SCTP_STAT_INCR(sctps_wu_sacks_sent);
5427 		NET_EPOCH_ENTER(et);
5428 		sctp_send_sack(stcb, SCTP_SO_LOCKED);
5429 
5430 		sctp_chunk_output(stcb->sctp_ep, stcb,
5431 		    SCTP_OUTPUT_FROM_USR_RCVD, SCTP_SO_LOCKED);
5432 		/* make sure no timer is running */
5433 		NET_EPOCH_EXIT(et);
5434 		sctp_timer_stop(SCTP_TIMER_TYPE_RECV, stcb->sctp_ep, stcb, NULL,
5435 		    SCTP_FROM_SCTPUTIL + SCTP_LOC_6);
5436 		SCTP_TCB_UNLOCK(stcb);
5437 	} else {
5438 		/* Update how much we have pending */
5439 		stcb->freed_by_sorcv_sincelast = dif;
5440 	}
5441 out:
5442 	if (so && r_unlocked && hold_rlock) {
5443 		SCTP_INP_READ_LOCK(stcb->sctp_ep);
5444 	}
5445 
5446 	SCTP_INP_DECR_REF(stcb->sctp_ep);
5447 no_lock:
5448 	atomic_add_int(&stcb->asoc.refcnt, -1);
5449 	return;
5450 }
5451 
5452 int
5453 sctp_sorecvmsg(struct socket *so,
5454     struct uio *uio,
5455     struct mbuf **mp,
5456     struct sockaddr *from,
5457     int fromlen,
5458     int *msg_flags,
5459     struct sctp_sndrcvinfo *sinfo,
5460     int filling_sinfo)
5461 {
5462 	/*
5463 	 * MSG flags we will look at MSG_DONTWAIT - non-blocking IO.
5464 	 * MSG_PEEK - Look don't touch :-D (only valid with OUT mbuf copy
5465 	 * mp=NULL thus uio is the copy method to userland) MSG_WAITALL - ??
5466 	 * On the way out we may send out any combination of:
5467 	 * MSG_NOTIFICATION MSG_EOR
5468 	 *
5469 	 */
5470 	struct sctp_inpcb *inp = NULL;
5471 	ssize_t my_len = 0;
5472 	ssize_t cp_len = 0;
5473 	int error = 0;
5474 	struct sctp_queued_to_read *control = NULL, *ctl = NULL, *nxt = NULL;
5475 	struct mbuf *m = NULL;
5476 	struct sctp_tcb *stcb = NULL;
5477 	int wakeup_read_socket = 0;
5478 	int freecnt_applied = 0;
5479 	int out_flags = 0, in_flags = 0;
5480 	int block_allowed = 1;
5481 	uint32_t freed_so_far = 0;
5482 	ssize_t copied_so_far = 0;
5483 	int in_eeor_mode = 0;
5484 	int no_rcv_needed = 0;
5485 	uint32_t rwnd_req = 0;
5486 	int hold_sblock = 0;
5487 	int hold_rlock = 0;
5488 	ssize_t slen = 0;
5489 	uint32_t held_length = 0;
5490 	int sockbuf_lock = 0;
5491 
5492 	if (uio == NULL) {
5493 		SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL);
5494 		return (EINVAL);
5495 	}
5496 
5497 	if (msg_flags) {
5498 		in_flags = *msg_flags;
5499 		if (in_flags & MSG_PEEK)
5500 			SCTP_STAT_INCR(sctps_read_peeks);
5501 	} else {
5502 		in_flags = 0;
5503 	}
5504 	slen = uio->uio_resid;
5505 
5506 	/* Pull in and set up our int flags */
5507 	if (in_flags & MSG_OOB) {
5508 		/* Out of band's NOT supported */
5509 		return (EOPNOTSUPP);
5510 	}
5511 	if ((in_flags & MSG_PEEK) && (mp != NULL)) {
5512 		SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL);
5513 		return (EINVAL);
5514 	}
5515 	if ((in_flags & (MSG_DONTWAIT
5516 	    | MSG_NBIO
5517 	    )) ||
5518 	    SCTP_SO_IS_NBIO(so)) {
5519 		block_allowed = 0;
5520 	}
5521 	/* setup the endpoint */
5522 	inp = (struct sctp_inpcb *)so->so_pcb;
5523 	if (inp == NULL) {
5524 		SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTPUTIL, EFAULT);
5525 		return (EFAULT);
5526 	}
5527 	rwnd_req = (SCTP_SB_LIMIT_RCV(so) >> SCTP_RWND_HIWAT_SHIFT);
5528 	/* Must be at least a MTU's worth */
5529 	if (rwnd_req < SCTP_MIN_RWND)
5530 		rwnd_req = SCTP_MIN_RWND;
5531 	in_eeor_mode = sctp_is_feature_on(inp, SCTP_PCB_FLAGS_EXPLICIT_EOR);
5532 	if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_RECV_RWND_LOGGING_ENABLE) {
5533 		sctp_misc_ints(SCTP_SORECV_ENTER,
5534 		    rwnd_req, in_eeor_mode, so->so_rcv.sb_cc, (uint32_t)uio->uio_resid);
5535 	}
5536 	if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_RECV_RWND_LOGGING_ENABLE) {
5537 		sctp_misc_ints(SCTP_SORECV_ENTERPL,
5538 		    rwnd_req, block_allowed, so->so_rcv.sb_cc, (uint32_t)uio->uio_resid);
5539 	}
5540 
5541 	error = sblock(&so->so_rcv, (block_allowed ? SBL_WAIT : 0));
5542 	if (error) {
5543 		goto release_unlocked;
5544 	}
5545 	sockbuf_lock = 1;
5546 restart:
5547 
5548 restart_nosblocks:
5549 	if (hold_sblock == 0) {
5550 		SOCKBUF_LOCK(&so->so_rcv);
5551 		hold_sblock = 1;
5552 	}
5553 	if ((inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) ||
5554 	    (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE)) {
5555 		goto out;
5556 	}
5557 	if ((so->so_rcv.sb_state & SBS_CANTRCVMORE) && (so->so_rcv.sb_cc == 0)) {
5558 		if (so->so_error) {
5559 			error = so->so_error;
5560 			if ((in_flags & MSG_PEEK) == 0)
5561 				so->so_error = 0;
5562 			goto out;
5563 		} else {
5564 			if (so->so_rcv.sb_cc == 0) {
5565 				/* indicate EOF */
5566 				error = 0;
5567 				goto out;
5568 			}
5569 		}
5570 	}
5571 	if (so->so_rcv.sb_cc <= held_length) {
5572 		if (so->so_error) {
5573 			error = so->so_error;
5574 			if ((in_flags & MSG_PEEK) == 0) {
5575 				so->so_error = 0;
5576 			}
5577 			goto out;
5578 		}
5579 		if ((so->so_rcv.sb_cc == 0) &&
5580 		    ((inp->sctp_flags & SCTP_PCB_FLAGS_TCPTYPE) ||
5581 		    (inp->sctp_flags & SCTP_PCB_FLAGS_IN_TCPPOOL))) {
5582 			if ((inp->sctp_flags & SCTP_PCB_FLAGS_CONNECTED) == 0) {
5583 				/*
5584 				 * For active open side clear flags for
5585 				 * re-use passive open is blocked by
5586 				 * connect.
5587 				 */
5588 				if (inp->sctp_flags & SCTP_PCB_FLAGS_WAS_ABORTED) {
5589 					/*
5590 					 * You were aborted, passive side
5591 					 * always hits here
5592 					 */
5593 					SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, ECONNRESET);
5594 					error = ECONNRESET;
5595 				}
5596 				so->so_state &= ~(SS_ISCONNECTING |
5597 				    SS_ISDISCONNECTING |
5598 				    SS_ISCONFIRMING |
5599 				    SS_ISCONNECTED);
5600 				if (error == 0) {
5601 					if ((inp->sctp_flags & SCTP_PCB_FLAGS_WAS_CONNECTED) == 0) {
5602 						SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, ENOTCONN);
5603 						error = ENOTCONN;
5604 					}
5605 				}
5606 				goto out;
5607 			}
5608 		}
5609 		if (block_allowed) {
5610 			error = sbwait(&so->so_rcv);
5611 			if (error) {
5612 				goto out;
5613 			}
5614 			held_length = 0;
5615 			goto restart_nosblocks;
5616 		} else {
5617 			SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EWOULDBLOCK);
5618 			error = EWOULDBLOCK;
5619 			goto out;
5620 		}
5621 	}
5622 	if (hold_sblock == 1) {
5623 		SOCKBUF_UNLOCK(&so->so_rcv);
5624 		hold_sblock = 0;
5625 	}
5626 	/* we possibly have data we can read */
5627 	/* sa_ignore FREED_MEMORY */
5628 	control = TAILQ_FIRST(&inp->read_queue);
5629 	if (control == NULL) {
5630 		/*
5631 		 * This could be happening since the appender did the
5632 		 * increment but as not yet did the tailq insert onto the
5633 		 * read_queue
5634 		 */
5635 		if (hold_rlock == 0) {
5636 			SCTP_INP_READ_LOCK(inp);
5637 		}
5638 		control = TAILQ_FIRST(&inp->read_queue);
5639 		if ((control == NULL) && (so->so_rcv.sb_cc != 0)) {
5640 #ifdef INVARIANTS
5641 			panic("Huh, its non zero and nothing on control?");
5642 #endif
5643 			so->so_rcv.sb_cc = 0;
5644 		}
5645 		SCTP_INP_READ_UNLOCK(inp);
5646 		hold_rlock = 0;
5647 		goto restart;
5648 	}
5649 
5650 	if ((control->length == 0) &&
5651 	    (control->do_not_ref_stcb)) {
5652 		/*
5653 		 * Clean up code for freeing assoc that left behind a
5654 		 * pdapi.. maybe a peer in EEOR that just closed after
5655 		 * sending and never indicated a EOR.
5656 		 */
5657 		if (hold_rlock == 0) {
5658 			hold_rlock = 1;
5659 			SCTP_INP_READ_LOCK(inp);
5660 		}
5661 		control->held_length = 0;
5662 		if (control->data) {
5663 			/* Hmm there is data here .. fix */
5664 			struct mbuf *m_tmp;
5665 			int cnt = 0;
5666 
5667 			m_tmp = control->data;
5668 			while (m_tmp) {
5669 				cnt += SCTP_BUF_LEN(m_tmp);
5670 				if (SCTP_BUF_NEXT(m_tmp) == NULL) {
5671 					control->tail_mbuf = m_tmp;
5672 					control->end_added = 1;
5673 				}
5674 				m_tmp = SCTP_BUF_NEXT(m_tmp);
5675 			}
5676 			control->length = cnt;
5677 		} else {
5678 			/* remove it */
5679 			TAILQ_REMOVE(&inp->read_queue, control, next);
5680 			/* Add back any hiddend data */
5681 			sctp_free_remote_addr(control->whoFrom);
5682 			sctp_free_a_readq(stcb, control);
5683 		}
5684 		if (hold_rlock) {
5685 			hold_rlock = 0;
5686 			SCTP_INP_READ_UNLOCK(inp);
5687 		}
5688 		goto restart;
5689 	}
5690 	if ((control->length == 0) &&
5691 	    (control->end_added == 1)) {
5692 		/*
5693 		 * Do we also need to check for (control->pdapi_aborted ==
5694 		 * 1)?
5695 		 */
5696 		if (hold_rlock == 0) {
5697 			hold_rlock = 1;
5698 			SCTP_INP_READ_LOCK(inp);
5699 		}
5700 		TAILQ_REMOVE(&inp->read_queue, control, next);
5701 		if (control->data) {
5702 #ifdef INVARIANTS
5703 			panic("control->data not null but control->length == 0");
5704 #else
5705 			SCTP_PRINTF("Strange, data left in the control buffer. Cleaning up.\n");
5706 			sctp_m_freem(control->data);
5707 			control->data = NULL;
5708 #endif
5709 		}
5710 		if (control->aux_data) {
5711 			sctp_m_free(control->aux_data);
5712 			control->aux_data = NULL;
5713 		}
5714 #ifdef INVARIANTS
5715 		if (control->on_strm_q) {
5716 			panic("About to free ctl:%p so:%p and its in %d",
5717 			    control, so, control->on_strm_q);
5718 		}
5719 #endif
5720 		sctp_free_remote_addr(control->whoFrom);
5721 		sctp_free_a_readq(stcb, control);
5722 		if (hold_rlock) {
5723 			hold_rlock = 0;
5724 			SCTP_INP_READ_UNLOCK(inp);
5725 		}
5726 		goto restart;
5727 	}
5728 	if (control->length == 0) {
5729 		if ((sctp_is_feature_on(inp, SCTP_PCB_FLAGS_FRAG_INTERLEAVE)) &&
5730 		    (filling_sinfo)) {
5731 			/* find a more suitable one then this */
5732 			ctl = TAILQ_NEXT(control, next);
5733 			while (ctl) {
5734 				if ((ctl->stcb != control->stcb) && (ctl->length) &&
5735 				    (ctl->some_taken ||
5736 				    (ctl->spec_flags & M_NOTIFICATION) ||
5737 				    ((ctl->do_not_ref_stcb == 0) &&
5738 				    (ctl->stcb->asoc.strmin[ctl->sinfo_stream].delivery_started == 0)))
5739 				    ) {
5740 					/*-
5741 					 * If we have a different TCB next, and there is data
5742 					 * present. If we have already taken some (pdapi), OR we can
5743 					 * ref the tcb and no delivery as started on this stream, we
5744 					 * take it. Note we allow a notification on a different
5745 					 * assoc to be delivered..
5746 					 */
5747 					control = ctl;
5748 					goto found_one;
5749 				} else if ((sctp_is_feature_on(inp, SCTP_PCB_FLAGS_INTERLEAVE_STRMS)) &&
5750 					    (ctl->length) &&
5751 					    ((ctl->some_taken) ||
5752 					    ((ctl->do_not_ref_stcb == 0) &&
5753 					    ((ctl->spec_flags & M_NOTIFICATION) == 0) &&
5754 				    (ctl->stcb->asoc.strmin[ctl->sinfo_stream].delivery_started == 0)))) {
5755 					/*-
5756 					 * If we have the same tcb, and there is data present, and we
5757 					 * have the strm interleave feature present. Then if we have
5758 					 * taken some (pdapi) or we can refer to tht tcb AND we have
5759 					 * not started a delivery for this stream, we can take it.
5760 					 * Note we do NOT allow a notificaiton on the same assoc to
5761 					 * be delivered.
5762 					 */
5763 					control = ctl;
5764 					goto found_one;
5765 				}
5766 				ctl = TAILQ_NEXT(ctl, next);
5767 			}
5768 		}
5769 		/*
5770 		 * if we reach here, not suitable replacement is available
5771 		 * <or> fragment interleave is NOT on. So stuff the sb_cc
5772 		 * into the our held count, and its time to sleep again.
5773 		 */
5774 		held_length = so->so_rcv.sb_cc;
5775 		control->held_length = so->so_rcv.sb_cc;
5776 		goto restart;
5777 	}
5778 	/* Clear the held length since there is something to read */
5779 	control->held_length = 0;
5780 found_one:
5781 	/*
5782 	 * If we reach here, control has a some data for us to read off.
5783 	 * Note that stcb COULD be NULL.
5784 	 */
5785 	if (hold_rlock == 0) {
5786 		hold_rlock = 1;
5787 		SCTP_INP_READ_LOCK(inp);
5788 	}
5789 	control->some_taken++;
5790 	stcb = control->stcb;
5791 	if (stcb) {
5792 		if ((control->do_not_ref_stcb == 0) &&
5793 		    (stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED)) {
5794 			if (freecnt_applied == 0)
5795 				stcb = NULL;
5796 		} else if (control->do_not_ref_stcb == 0) {
5797 			/* you can't free it on me please */
5798 			/*
5799 			 * The lock on the socket buffer protects us so the
5800 			 * free code will stop. But since we used the
5801 			 * socketbuf lock and the sender uses the tcb_lock
5802 			 * to increment, we need to use the atomic add to
5803 			 * the refcnt
5804 			 */
5805 			if (freecnt_applied) {
5806 #ifdef INVARIANTS
5807 				panic("refcnt already incremented");
5808 #else
5809 				SCTP_PRINTF("refcnt already incremented?\n");
5810 #endif
5811 			} else {
5812 				atomic_add_int(&stcb->asoc.refcnt, 1);
5813 				freecnt_applied = 1;
5814 			}
5815 			/*
5816 			 * Setup to remember how much we have not yet told
5817 			 * the peer our rwnd has opened up. Note we grab the
5818 			 * value from the tcb from last time. Note too that
5819 			 * sack sending clears this when a sack is sent,
5820 			 * which is fine. Once we hit the rwnd_req, we then
5821 			 * will go to the sctp_user_rcvd() that will not
5822 			 * lock until it KNOWs it MUST send a WUP-SACK.
5823 			 */
5824 			freed_so_far = (uint32_t)stcb->freed_by_sorcv_sincelast;
5825 			stcb->freed_by_sorcv_sincelast = 0;
5826 		}
5827 	}
5828 	if (stcb &&
5829 	    ((control->spec_flags & M_NOTIFICATION) == 0) &&
5830 	    control->do_not_ref_stcb == 0) {
5831 		stcb->asoc.strmin[control->sinfo_stream].delivery_started = 1;
5832 	}
5833 
5834 	/* First lets get off the sinfo and sockaddr info */
5835 	if ((sinfo != NULL) && (filling_sinfo != 0)) {
5836 		sinfo->sinfo_stream = control->sinfo_stream;
5837 		sinfo->sinfo_ssn = (uint16_t)control->mid;
5838 		sinfo->sinfo_flags = control->sinfo_flags;
5839 		sinfo->sinfo_ppid = control->sinfo_ppid;
5840 		sinfo->sinfo_context = control->sinfo_context;
5841 		sinfo->sinfo_timetolive = control->sinfo_timetolive;
5842 		sinfo->sinfo_tsn = control->sinfo_tsn;
5843 		sinfo->sinfo_cumtsn = control->sinfo_cumtsn;
5844 		sinfo->sinfo_assoc_id = control->sinfo_assoc_id;
5845 		nxt = TAILQ_NEXT(control, next);
5846 		if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_EXT_RCVINFO) ||
5847 		    sctp_is_feature_on(inp, SCTP_PCB_FLAGS_RECVNXTINFO)) {
5848 			struct sctp_extrcvinfo *s_extra;
5849 
5850 			s_extra = (struct sctp_extrcvinfo *)sinfo;
5851 			if ((nxt) &&
5852 			    (nxt->length)) {
5853 				s_extra->serinfo_next_flags = SCTP_NEXT_MSG_AVAIL;
5854 				if (nxt->sinfo_flags & SCTP_UNORDERED) {
5855 					s_extra->serinfo_next_flags |= SCTP_NEXT_MSG_IS_UNORDERED;
5856 				}
5857 				if (nxt->spec_flags & M_NOTIFICATION) {
5858 					s_extra->serinfo_next_flags |= SCTP_NEXT_MSG_IS_NOTIFICATION;
5859 				}
5860 				s_extra->serinfo_next_aid = nxt->sinfo_assoc_id;
5861 				s_extra->serinfo_next_length = nxt->length;
5862 				s_extra->serinfo_next_ppid = nxt->sinfo_ppid;
5863 				s_extra->serinfo_next_stream = nxt->sinfo_stream;
5864 				if (nxt->tail_mbuf != NULL) {
5865 					if (nxt->end_added) {
5866 						s_extra->serinfo_next_flags |= SCTP_NEXT_MSG_ISCOMPLETE;
5867 					}
5868 				}
5869 			} else {
5870 				/*
5871 				 * we explicitly 0 this, since the memcpy
5872 				 * got some other things beyond the older
5873 				 * sinfo_ that is on the control's structure
5874 				 * :-D
5875 				 */
5876 				nxt = NULL;
5877 				s_extra->serinfo_next_flags = SCTP_NO_NEXT_MSG;
5878 				s_extra->serinfo_next_aid = 0;
5879 				s_extra->serinfo_next_length = 0;
5880 				s_extra->serinfo_next_ppid = 0;
5881 				s_extra->serinfo_next_stream = 0;
5882 			}
5883 		}
5884 		/*
5885 		 * update off the real current cum-ack, if we have an stcb.
5886 		 */
5887 		if ((control->do_not_ref_stcb == 0) && stcb)
5888 			sinfo->sinfo_cumtsn = stcb->asoc.cumulative_tsn;
5889 		/*
5890 		 * mask off the high bits, we keep the actual chunk bits in
5891 		 * there.
5892 		 */
5893 		sinfo->sinfo_flags &= 0x00ff;
5894 		if ((control->sinfo_flags >> 8) & SCTP_DATA_UNORDERED) {
5895 			sinfo->sinfo_flags |= SCTP_UNORDERED;
5896 		}
5897 	}
5898 #ifdef SCTP_ASOCLOG_OF_TSNS
5899 	{
5900 		int index, newindex;
5901 		struct sctp_pcbtsn_rlog *entry;
5902 
5903 		do {
5904 			index = inp->readlog_index;
5905 			newindex = index + 1;
5906 			if (newindex >= SCTP_READ_LOG_SIZE) {
5907 				newindex = 0;
5908 			}
5909 		} while (atomic_cmpset_int(&inp->readlog_index, index, newindex) == 0);
5910 		entry = &inp->readlog[index];
5911 		entry->vtag = control->sinfo_assoc_id;
5912 		entry->strm = control->sinfo_stream;
5913 		entry->seq = (uint16_t)control->mid;
5914 		entry->sz = control->length;
5915 		entry->flgs = control->sinfo_flags;
5916 	}
5917 #endif
5918 	if ((fromlen > 0) && (from != NULL)) {
5919 		union sctp_sockstore store;
5920 		size_t len;
5921 
5922 		switch (control->whoFrom->ro._l_addr.sa.sa_family) {
5923 #ifdef INET6
5924 		case AF_INET6:
5925 			len = sizeof(struct sockaddr_in6);
5926 			store.sin6 = control->whoFrom->ro._l_addr.sin6;
5927 			store.sin6.sin6_port = control->port_from;
5928 			break;
5929 #endif
5930 #ifdef INET
5931 		case AF_INET:
5932 #ifdef INET6
5933 			if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_NEEDS_MAPPED_V4)) {
5934 				len = sizeof(struct sockaddr_in6);
5935 				in6_sin_2_v4mapsin6(&control->whoFrom->ro._l_addr.sin,
5936 				    &store.sin6);
5937 				store.sin6.sin6_port = control->port_from;
5938 			} else {
5939 				len = sizeof(struct sockaddr_in);
5940 				store.sin = control->whoFrom->ro._l_addr.sin;
5941 				store.sin.sin_port = control->port_from;
5942 			}
5943 #else
5944 			len = sizeof(struct sockaddr_in);
5945 			store.sin = control->whoFrom->ro._l_addr.sin;
5946 			store.sin.sin_port = control->port_from;
5947 #endif
5948 			break;
5949 #endif
5950 		default:
5951 			len = 0;
5952 			break;
5953 		}
5954 		memcpy(from, &store, min((size_t)fromlen, len));
5955 #ifdef INET6
5956 		{
5957 			struct sockaddr_in6 lsa6, *from6;
5958 
5959 			from6 = (struct sockaddr_in6 *)from;
5960 			sctp_recover_scope_mac(from6, (&lsa6));
5961 		}
5962 #endif
5963 	}
5964 	if (hold_rlock) {
5965 		SCTP_INP_READ_UNLOCK(inp);
5966 		hold_rlock = 0;
5967 	}
5968 	if (hold_sblock) {
5969 		SOCKBUF_UNLOCK(&so->so_rcv);
5970 		hold_sblock = 0;
5971 	}
5972 	/* now copy out what data we can */
5973 	if (mp == NULL) {
5974 		/* copy out each mbuf in the chain up to length */
5975 get_more_data:
5976 		m = control->data;
5977 		while (m) {
5978 			/* Move out all we can */
5979 			cp_len = uio->uio_resid;
5980 			my_len = SCTP_BUF_LEN(m);
5981 			if (cp_len > my_len) {
5982 				/* not enough in this buf */
5983 				cp_len = my_len;
5984 			}
5985 			if (hold_rlock) {
5986 				SCTP_INP_READ_UNLOCK(inp);
5987 				hold_rlock = 0;
5988 			}
5989 			if (cp_len > 0)
5990 				error = uiomove(mtod(m, char *), (int)cp_len, uio);
5991 			/* re-read */
5992 			if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) {
5993 				goto release;
5994 			}
5995 
5996 			if ((control->do_not_ref_stcb == 0) && stcb &&
5997 			    stcb->asoc.state & SCTP_STATE_ABOUT_TO_BE_FREED) {
5998 				no_rcv_needed = 1;
5999 			}
6000 			if (error) {
6001 				/* error we are out of here */
6002 				goto release;
6003 			}
6004 			SCTP_INP_READ_LOCK(inp);
6005 			hold_rlock = 1;
6006 			if (cp_len == SCTP_BUF_LEN(m)) {
6007 				if ((SCTP_BUF_NEXT(m) == NULL) &&
6008 				    (control->end_added)) {
6009 					out_flags |= MSG_EOR;
6010 					if ((control->do_not_ref_stcb == 0) &&
6011 					    (control->stcb != NULL) &&
6012 					    ((control->spec_flags & M_NOTIFICATION) == 0))
6013 						control->stcb->asoc.strmin[control->sinfo_stream].delivery_started = 0;
6014 				}
6015 				if (control->spec_flags & M_NOTIFICATION) {
6016 					out_flags |= MSG_NOTIFICATION;
6017 				}
6018 				/* we ate up the mbuf */
6019 				if (in_flags & MSG_PEEK) {
6020 					/* just looking */
6021 					m = SCTP_BUF_NEXT(m);
6022 					copied_so_far += cp_len;
6023 				} else {
6024 					/* dispose of the mbuf */
6025 					if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) {
6026 						sctp_sblog(&so->so_rcv,
6027 						    control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBFREE, SCTP_BUF_LEN(m));
6028 					}
6029 					sctp_sbfree(control, stcb, &so->so_rcv, m);
6030 					if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) {
6031 						sctp_sblog(&so->so_rcv,
6032 						    control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBRESULT, 0);
6033 					}
6034 					copied_so_far += cp_len;
6035 					freed_so_far += (uint32_t)cp_len;
6036 					freed_so_far += MSIZE;
6037 					atomic_subtract_int(&control->length, cp_len);
6038 					control->data = sctp_m_free(m);
6039 					m = control->data;
6040 					/*
6041 					 * been through it all, must hold sb
6042 					 * lock ok to null tail
6043 					 */
6044 					if (control->data == NULL) {
6045 #ifdef INVARIANTS
6046 						if ((control->end_added == 0) ||
6047 						    (TAILQ_NEXT(control, next) == NULL)) {
6048 							/*
6049 							 * If the end is not
6050 							 * added, OR the
6051 							 * next is NOT null
6052 							 * we MUST have the
6053 							 * lock.
6054 							 */
6055 							if (mtx_owned(&inp->inp_rdata_mtx) == 0) {
6056 								panic("Hmm we don't own the lock?");
6057 							}
6058 						}
6059 #endif
6060 						control->tail_mbuf = NULL;
6061 #ifdef INVARIANTS
6062 						if ((control->end_added) && ((out_flags & MSG_EOR) == 0)) {
6063 							panic("end_added, nothing left and no MSG_EOR");
6064 						}
6065 #endif
6066 					}
6067 				}
6068 			} else {
6069 				/* Do we need to trim the mbuf? */
6070 				if (control->spec_flags & M_NOTIFICATION) {
6071 					out_flags |= MSG_NOTIFICATION;
6072 				}
6073 				if ((in_flags & MSG_PEEK) == 0) {
6074 					SCTP_BUF_RESV_UF(m, cp_len);
6075 					SCTP_BUF_LEN(m) -= (int)cp_len;
6076 					if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) {
6077 						sctp_sblog(&so->so_rcv, control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBFREE, (int)cp_len);
6078 					}
6079 					atomic_subtract_int(&so->so_rcv.sb_cc, cp_len);
6080 					if ((control->do_not_ref_stcb == 0) &&
6081 					    stcb) {
6082 						atomic_subtract_int(&stcb->asoc.sb_cc, cp_len);
6083 					}
6084 					copied_so_far += cp_len;
6085 					freed_so_far += (uint32_t)cp_len;
6086 					freed_so_far += MSIZE;
6087 					if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) {
6088 						sctp_sblog(&so->so_rcv, control->do_not_ref_stcb ? NULL : stcb,
6089 						    SCTP_LOG_SBRESULT, 0);
6090 					}
6091 					atomic_subtract_int(&control->length, cp_len);
6092 				} else {
6093 					copied_so_far += cp_len;
6094 				}
6095 			}
6096 			if ((out_flags & MSG_EOR) || (uio->uio_resid == 0)) {
6097 				break;
6098 			}
6099 			if (((stcb) && (in_flags & MSG_PEEK) == 0) &&
6100 			    (control->do_not_ref_stcb == 0) &&
6101 			    (freed_so_far >= rwnd_req)) {
6102 				sctp_user_rcvd(stcb, &freed_so_far, hold_rlock, rwnd_req);
6103 			}
6104 		}		/* end while(m) */
6105 		/*
6106 		 * At this point we have looked at it all and we either have
6107 		 * a MSG_EOR/or read all the user wants... <OR>
6108 		 * control->length == 0.
6109 		 */
6110 		if ((out_flags & MSG_EOR) && ((in_flags & MSG_PEEK) == 0)) {
6111 			/* we are done with this control */
6112 			if (control->length == 0) {
6113 				if (control->data) {
6114 #ifdef INVARIANTS
6115 					panic("control->data not null at read eor?");
6116 #else
6117 					SCTP_PRINTF("Strange, data left in the control buffer .. invarients would panic?\n");
6118 					sctp_m_freem(control->data);
6119 					control->data = NULL;
6120 #endif
6121 				}
6122 		done_with_control:
6123 				if (hold_rlock == 0) {
6124 					SCTP_INP_READ_LOCK(inp);
6125 					hold_rlock = 1;
6126 				}
6127 				TAILQ_REMOVE(&inp->read_queue, control, next);
6128 				/* Add back any hiddend data */
6129 				if (control->held_length) {
6130 					held_length = 0;
6131 					control->held_length = 0;
6132 					wakeup_read_socket = 1;
6133 				}
6134 				if (control->aux_data) {
6135 					sctp_m_free(control->aux_data);
6136 					control->aux_data = NULL;
6137 				}
6138 				no_rcv_needed = control->do_not_ref_stcb;
6139 				sctp_free_remote_addr(control->whoFrom);
6140 				control->data = NULL;
6141 #ifdef INVARIANTS
6142 				if (control->on_strm_q) {
6143 					panic("About to free ctl:%p so:%p and its in %d",
6144 					    control, so, control->on_strm_q);
6145 				}
6146 #endif
6147 				sctp_free_a_readq(stcb, control);
6148 				control = NULL;
6149 				if ((freed_so_far >= rwnd_req) &&
6150 				    (no_rcv_needed == 0))
6151 					sctp_user_rcvd(stcb, &freed_so_far, hold_rlock, rwnd_req);
6152 
6153 			} else {
6154 				/*
6155 				 * The user did not read all of this
6156 				 * message, turn off the returned MSG_EOR
6157 				 * since we are leaving more behind on the
6158 				 * control to read.
6159 				 */
6160 #ifdef INVARIANTS
6161 				if (control->end_added &&
6162 				    (control->data == NULL) &&
6163 				    (control->tail_mbuf == NULL)) {
6164 					panic("Gak, control->length is corrupt?");
6165 				}
6166 #endif
6167 				no_rcv_needed = control->do_not_ref_stcb;
6168 				out_flags &= ~MSG_EOR;
6169 			}
6170 		}
6171 		if (out_flags & MSG_EOR) {
6172 			goto release;
6173 		}
6174 		if ((uio->uio_resid == 0) ||
6175 		    ((in_eeor_mode) &&
6176 		    (copied_so_far >= max(so->so_rcv.sb_lowat, 1)))) {
6177 			goto release;
6178 		}
6179 		/*
6180 		 * If I hit here the receiver wants more and this message is
6181 		 * NOT done (pd-api). So two questions. Can we block? if not
6182 		 * we are done. Did the user NOT set MSG_WAITALL?
6183 		 */
6184 		if (block_allowed == 0) {
6185 			goto release;
6186 		}
6187 		/*
6188 		 * We need to wait for more data a few things: - We don't
6189 		 * sbunlock() so we don't get someone else reading. - We
6190 		 * must be sure to account for the case where what is added
6191 		 * is NOT to our control when we wakeup.
6192 		 */
6193 
6194 		/*
6195 		 * Do we need to tell the transport a rwnd update might be
6196 		 * needed before we go to sleep?
6197 		 */
6198 		if (((stcb) && (in_flags & MSG_PEEK) == 0) &&
6199 		    ((freed_so_far >= rwnd_req) &&
6200 		    (control->do_not_ref_stcb == 0) &&
6201 		    (no_rcv_needed == 0))) {
6202 			sctp_user_rcvd(stcb, &freed_so_far, hold_rlock, rwnd_req);
6203 		}
6204 wait_some_more:
6205 		if (so->so_rcv.sb_state & SBS_CANTRCVMORE) {
6206 			goto release;
6207 		}
6208 
6209 		if (inp->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE)
6210 			goto release;
6211 
6212 		if (hold_rlock == 1) {
6213 			SCTP_INP_READ_UNLOCK(inp);
6214 			hold_rlock = 0;
6215 		}
6216 		if (hold_sblock == 0) {
6217 			SOCKBUF_LOCK(&so->so_rcv);
6218 			hold_sblock = 1;
6219 		}
6220 		if ((copied_so_far) && (control->length == 0) &&
6221 		    (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_FRAG_INTERLEAVE))) {
6222 			goto release;
6223 		}
6224 		if (so->so_rcv.sb_cc <= control->held_length) {
6225 			error = sbwait(&so->so_rcv);
6226 			if (error) {
6227 				goto release;
6228 			}
6229 			control->held_length = 0;
6230 		}
6231 		if (hold_sblock) {
6232 			SOCKBUF_UNLOCK(&so->so_rcv);
6233 			hold_sblock = 0;
6234 		}
6235 		if (control->length == 0) {
6236 			/* still nothing here */
6237 			if (control->end_added == 1) {
6238 				/* he aborted, or is done i.e.did a shutdown */
6239 				out_flags |= MSG_EOR;
6240 				if (control->pdapi_aborted) {
6241 					if ((control->do_not_ref_stcb == 0) && ((control->spec_flags & M_NOTIFICATION) == 0))
6242 						control->stcb->asoc.strmin[control->sinfo_stream].delivery_started = 0;
6243 
6244 					out_flags |= MSG_TRUNC;
6245 				} else {
6246 					if ((control->do_not_ref_stcb == 0) && ((control->spec_flags & M_NOTIFICATION) == 0))
6247 						control->stcb->asoc.strmin[control->sinfo_stream].delivery_started = 0;
6248 				}
6249 				goto done_with_control;
6250 			}
6251 			if (so->so_rcv.sb_cc > held_length) {
6252 				control->held_length = so->so_rcv.sb_cc;
6253 				held_length = 0;
6254 			}
6255 			goto wait_some_more;
6256 		} else if (control->data == NULL) {
6257 			/*
6258 			 * we must re-sync since data is probably being
6259 			 * added
6260 			 */
6261 			SCTP_INP_READ_LOCK(inp);
6262 			if ((control->length > 0) && (control->data == NULL)) {
6263 				/*
6264 				 * big trouble.. we have the lock and its
6265 				 * corrupt?
6266 				 */
6267 #ifdef INVARIANTS
6268 				panic("Impossible data==NULL length !=0");
6269 #endif
6270 				out_flags |= MSG_EOR;
6271 				out_flags |= MSG_TRUNC;
6272 				control->length = 0;
6273 				SCTP_INP_READ_UNLOCK(inp);
6274 				goto done_with_control;
6275 			}
6276 			SCTP_INP_READ_UNLOCK(inp);
6277 			/* We will fall around to get more data */
6278 		}
6279 		goto get_more_data;
6280 	} else {
6281 		/*-
6282 		 * Give caller back the mbuf chain,
6283 		 * store in uio_resid the length
6284 		 */
6285 		wakeup_read_socket = 0;
6286 		if ((control->end_added == 0) ||
6287 		    (TAILQ_NEXT(control, next) == NULL)) {
6288 			/* Need to get rlock */
6289 			if (hold_rlock == 0) {
6290 				SCTP_INP_READ_LOCK(inp);
6291 				hold_rlock = 1;
6292 			}
6293 		}
6294 		if (control->end_added) {
6295 			out_flags |= MSG_EOR;
6296 			if ((control->do_not_ref_stcb == 0) &&
6297 			    (control->stcb != NULL) &&
6298 			    ((control->spec_flags & M_NOTIFICATION) == 0))
6299 				control->stcb->asoc.strmin[control->sinfo_stream].delivery_started = 0;
6300 		}
6301 		if (control->spec_flags & M_NOTIFICATION) {
6302 			out_flags |= MSG_NOTIFICATION;
6303 		}
6304 		uio->uio_resid = control->length;
6305 		*mp = control->data;
6306 		m = control->data;
6307 		while (m) {
6308 			if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) {
6309 				sctp_sblog(&so->so_rcv,
6310 				    control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBFREE, SCTP_BUF_LEN(m));
6311 			}
6312 			sctp_sbfree(control, stcb, &so->so_rcv, m);
6313 			freed_so_far += (uint32_t)SCTP_BUF_LEN(m);
6314 			freed_so_far += MSIZE;
6315 			if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SB_LOGGING_ENABLE) {
6316 				sctp_sblog(&so->so_rcv,
6317 				    control->do_not_ref_stcb ? NULL : stcb, SCTP_LOG_SBRESULT, 0);
6318 			}
6319 			m = SCTP_BUF_NEXT(m);
6320 		}
6321 		control->data = control->tail_mbuf = NULL;
6322 		control->length = 0;
6323 		if (out_flags & MSG_EOR) {
6324 			/* Done with this control */
6325 			goto done_with_control;
6326 		}
6327 	}
6328 release:
6329 	if (hold_rlock == 1) {
6330 		SCTP_INP_READ_UNLOCK(inp);
6331 		hold_rlock = 0;
6332 	}
6333 	if (hold_sblock == 1) {
6334 		SOCKBUF_UNLOCK(&so->so_rcv);
6335 		hold_sblock = 0;
6336 	}
6337 
6338 	sbunlock(&so->so_rcv);
6339 	sockbuf_lock = 0;
6340 
6341 release_unlocked:
6342 	if (hold_sblock) {
6343 		SOCKBUF_UNLOCK(&so->so_rcv);
6344 		hold_sblock = 0;
6345 	}
6346 	if ((stcb) && (in_flags & MSG_PEEK) == 0) {
6347 		if ((freed_so_far >= rwnd_req) &&
6348 		    (control && (control->do_not_ref_stcb == 0)) &&
6349 		    (no_rcv_needed == 0))
6350 			sctp_user_rcvd(stcb, &freed_so_far, hold_rlock, rwnd_req);
6351 	}
6352 out:
6353 	if (msg_flags) {
6354 		*msg_flags = out_flags;
6355 	}
6356 	if (((out_flags & MSG_EOR) == 0) &&
6357 	    ((in_flags & MSG_PEEK) == 0) &&
6358 	    (sinfo) &&
6359 	    (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_EXT_RCVINFO) ||
6360 	    sctp_is_feature_on(inp, SCTP_PCB_FLAGS_RECVNXTINFO))) {
6361 		struct sctp_extrcvinfo *s_extra;
6362 
6363 		s_extra = (struct sctp_extrcvinfo *)sinfo;
6364 		s_extra->serinfo_next_flags = SCTP_NO_NEXT_MSG;
6365 	}
6366 	if (hold_rlock == 1) {
6367 		SCTP_INP_READ_UNLOCK(inp);
6368 	}
6369 	if (hold_sblock) {
6370 		SOCKBUF_UNLOCK(&so->so_rcv);
6371 	}
6372 	if (sockbuf_lock) {
6373 		sbunlock(&so->so_rcv);
6374 	}
6375 
6376 	if (freecnt_applied) {
6377 		/*
6378 		 * The lock on the socket buffer protects us so the free
6379 		 * code will stop. But since we used the socketbuf lock and
6380 		 * the sender uses the tcb_lock to increment, we need to use
6381 		 * the atomic add to the refcnt.
6382 		 */
6383 		if (stcb == NULL) {
6384 #ifdef INVARIANTS
6385 			panic("stcb for refcnt has gone NULL?");
6386 			goto stage_left;
6387 #else
6388 			goto stage_left;
6389 #endif
6390 		}
6391 		/* Save the value back for next time */
6392 		stcb->freed_by_sorcv_sincelast = freed_so_far;
6393 		atomic_add_int(&stcb->asoc.refcnt, -1);
6394 	}
6395 	if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_RECV_RWND_LOGGING_ENABLE) {
6396 		if (stcb) {
6397 			sctp_misc_ints(SCTP_SORECV_DONE,
6398 			    freed_so_far,
6399 			    (uint32_t)((uio) ? (slen - uio->uio_resid) : slen),
6400 			    stcb->asoc.my_rwnd,
6401 			    so->so_rcv.sb_cc);
6402 		} else {
6403 			sctp_misc_ints(SCTP_SORECV_DONE,
6404 			    freed_so_far,
6405 			    (uint32_t)((uio) ? (slen - uio->uio_resid) : slen),
6406 			    0,
6407 			    so->so_rcv.sb_cc);
6408 		}
6409 	}
6410 stage_left:
6411 	if (wakeup_read_socket) {
6412 		sctp_sorwakeup(inp, so);
6413 	}
6414 	return (error);
6415 }
6416 
6417 #ifdef SCTP_MBUF_LOGGING
6418 struct mbuf *
6419 sctp_m_free(struct mbuf *m)
6420 {
6421 	if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MBUF_LOGGING_ENABLE) {
6422 		sctp_log_mb(m, SCTP_MBUF_IFREE);
6423 	}
6424 	return (m_free(m));
6425 }
6426 
6427 void
6428 sctp_m_freem(struct mbuf *mb)
6429 {
6430 	while (mb != NULL)
6431 		mb = sctp_m_free(mb);
6432 }
6433 
6434 #endif
6435 
6436 int
6437 sctp_dynamic_set_primary(struct sockaddr *sa, uint32_t vrf_id)
6438 {
6439 	/*
6440 	 * Given a local address. For all associations that holds the
6441 	 * address, request a peer-set-primary.
6442 	 */
6443 	struct sctp_ifa *ifa;
6444 	struct sctp_laddr *wi;
6445 
6446 	ifa = sctp_find_ifa_by_addr(sa, vrf_id, SCTP_ADDR_NOT_LOCKED);
6447 	if (ifa == NULL) {
6448 		SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTPUTIL, EADDRNOTAVAIL);
6449 		return (EADDRNOTAVAIL);
6450 	}
6451 	/*
6452 	 * Now that we have the ifa we must awaken the iterator with this
6453 	 * message.
6454 	 */
6455 	wi = SCTP_ZONE_GET(SCTP_BASE_INFO(ipi_zone_laddr), struct sctp_laddr);
6456 	if (wi == NULL) {
6457 		SCTP_LTRACE_ERR_RET(NULL, NULL, NULL, SCTP_FROM_SCTPUTIL, ENOMEM);
6458 		return (ENOMEM);
6459 	}
6460 	/* Now incr the count and int wi structure */
6461 	SCTP_INCR_LADDR_COUNT();
6462 	memset(wi, 0, sizeof(*wi));
6463 	(void)SCTP_GETTIME_TIMEVAL(&wi->start_time);
6464 	wi->ifa = ifa;
6465 	wi->action = SCTP_SET_PRIM_ADDR;
6466 	atomic_add_int(&ifa->refcount, 1);
6467 
6468 	/* Now add it to the work queue */
6469 	SCTP_WQ_ADDR_LOCK();
6470 	/*
6471 	 * Should this really be a tailq? As it is we will process the
6472 	 * newest first :-0
6473 	 */
6474 	LIST_INSERT_HEAD(&SCTP_BASE_INFO(addr_wq), wi, sctp_nxt_addr);
6475 	sctp_timer_start(SCTP_TIMER_TYPE_ADDR_WQ,
6476 	    (struct sctp_inpcb *)NULL,
6477 	    (struct sctp_tcb *)NULL,
6478 	    (struct sctp_nets *)NULL);
6479 	SCTP_WQ_ADDR_UNLOCK();
6480 	return (0);
6481 }
6482 
6483 int
6484 sctp_soreceive(struct socket *so,
6485     struct sockaddr **psa,
6486     struct uio *uio,
6487     struct mbuf **mp0,
6488     struct mbuf **controlp,
6489     int *flagsp)
6490 {
6491 	int error, fromlen;
6492 	uint8_t sockbuf[256];
6493 	struct sockaddr *from;
6494 	struct sctp_extrcvinfo sinfo;
6495 	int filling_sinfo = 1;
6496 	int flags;
6497 	struct sctp_inpcb *inp;
6498 
6499 	inp = (struct sctp_inpcb *)so->so_pcb;
6500 	/* pickup the assoc we are reading from */
6501 	if (inp == NULL) {
6502 		SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL);
6503 		return (EINVAL);
6504 	}
6505 	if ((sctp_is_feature_off(inp, SCTP_PCB_FLAGS_RECVDATAIOEVNT) &&
6506 	    sctp_is_feature_off(inp, SCTP_PCB_FLAGS_RECVRCVINFO) &&
6507 	    sctp_is_feature_off(inp, SCTP_PCB_FLAGS_RECVNXTINFO)) ||
6508 	    (controlp == NULL)) {
6509 		/* user does not want the sndrcv ctl */
6510 		filling_sinfo = 0;
6511 	}
6512 	if (psa) {
6513 		from = (struct sockaddr *)sockbuf;
6514 		fromlen = sizeof(sockbuf);
6515 		from->sa_len = 0;
6516 	} else {
6517 		from = NULL;
6518 		fromlen = 0;
6519 	}
6520 
6521 	if (filling_sinfo) {
6522 		memset(&sinfo, 0, sizeof(struct sctp_extrcvinfo));
6523 	}
6524 	if (flagsp != NULL) {
6525 		flags = *flagsp;
6526 	} else {
6527 		flags = 0;
6528 	}
6529 	error = sctp_sorecvmsg(so, uio, mp0, from, fromlen, &flags,
6530 	    (struct sctp_sndrcvinfo *)&sinfo, filling_sinfo);
6531 	if (flagsp != NULL) {
6532 		*flagsp = flags;
6533 	}
6534 	if (controlp != NULL) {
6535 		/* copy back the sinfo in a CMSG format */
6536 		if (filling_sinfo && ((flags & MSG_NOTIFICATION) == 0)) {
6537 			*controlp = sctp_build_ctl_nchunk(inp,
6538 			    (struct sctp_sndrcvinfo *)&sinfo);
6539 		} else {
6540 			*controlp = NULL;
6541 		}
6542 	}
6543 	if (psa) {
6544 		/* copy back the address info */
6545 		if (from && from->sa_len) {
6546 			*psa = sodupsockaddr(from, M_NOWAIT);
6547 		} else {
6548 			*psa = NULL;
6549 		}
6550 	}
6551 	return (error);
6552 }
6553 
6554 int
6555 sctp_connectx_helper_add(struct sctp_tcb *stcb, struct sockaddr *addr,
6556     int totaddr, int *error)
6557 {
6558 	int added = 0;
6559 	int i;
6560 	struct sctp_inpcb *inp;
6561 	struct sockaddr *sa;
6562 	size_t incr = 0;
6563 #ifdef INET
6564 	struct sockaddr_in *sin;
6565 #endif
6566 #ifdef INET6
6567 	struct sockaddr_in6 *sin6;
6568 #endif
6569 
6570 	sa = addr;
6571 	inp = stcb->sctp_ep;
6572 	*error = 0;
6573 	for (i = 0; i < totaddr; i++) {
6574 		switch (sa->sa_family) {
6575 #ifdef INET
6576 		case AF_INET:
6577 			incr = sizeof(struct sockaddr_in);
6578 			sin = (struct sockaddr_in *)sa;
6579 			if ((sin->sin_addr.s_addr == INADDR_ANY) ||
6580 			    (sin->sin_addr.s_addr == INADDR_BROADCAST) ||
6581 			    IN_MULTICAST(ntohl(sin->sin_addr.s_addr))) {
6582 				SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, EINVAL);
6583 				(void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC,
6584 				    SCTP_FROM_SCTPUTIL + SCTP_LOC_7);
6585 				*error = EINVAL;
6586 				goto out_now;
6587 			}
6588 			if (sctp_add_remote_addr(stcb, sa, NULL, stcb->asoc.port,
6589 			    SCTP_DONOT_SETSCOPE,
6590 			    SCTP_ADDR_IS_CONFIRMED)) {
6591 				/* assoc gone no un-lock */
6592 				SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ENOBUFS);
6593 				(void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC,
6594 				    SCTP_FROM_SCTPUTIL + SCTP_LOC_8);
6595 				*error = ENOBUFS;
6596 				goto out_now;
6597 			}
6598 			added++;
6599 			break;
6600 #endif
6601 #ifdef INET6
6602 		case AF_INET6:
6603 			incr = sizeof(struct sockaddr_in6);
6604 			sin6 = (struct sockaddr_in6 *)sa;
6605 			if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr) ||
6606 			    IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) {
6607 				SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, EINVAL);
6608 				(void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC,
6609 				    SCTP_FROM_SCTPUTIL + SCTP_LOC_9);
6610 				*error = EINVAL;
6611 				goto out_now;
6612 			}
6613 			if (sctp_add_remote_addr(stcb, sa, NULL, stcb->asoc.port,
6614 			    SCTP_DONOT_SETSCOPE,
6615 			    SCTP_ADDR_IS_CONFIRMED)) {
6616 				/* assoc gone no un-lock */
6617 				SCTP_LTRACE_ERR_RET(NULL, stcb, NULL, SCTP_FROM_SCTPUTIL, ENOBUFS);
6618 				(void)sctp_free_assoc(inp, stcb, SCTP_NORMAL_PROC,
6619 				    SCTP_FROM_SCTPUTIL + SCTP_LOC_10);
6620 				*error = ENOBUFS;
6621 				goto out_now;
6622 			}
6623 			added++;
6624 			break;
6625 #endif
6626 		default:
6627 			break;
6628 		}
6629 		sa = (struct sockaddr *)((caddr_t)sa + incr);
6630 	}
6631 out_now:
6632 	return (added);
6633 }
6634 
6635 int
6636 sctp_connectx_helper_find(struct sctp_inpcb *inp, struct sockaddr *addr,
6637     unsigned int totaddr,
6638     unsigned int *num_v4, unsigned int *num_v6,
6639     unsigned int limit)
6640 {
6641 	struct sockaddr *sa;
6642 	struct sctp_tcb *stcb;
6643 	unsigned int incr, at, i;
6644 
6645 	at = 0;
6646 	sa = addr;
6647 	*num_v6 = *num_v4 = 0;
6648 	/* account and validate addresses */
6649 	if (totaddr == 0) {
6650 		return (EINVAL);
6651 	}
6652 	for (i = 0; i < totaddr; i++) {
6653 		if (at + sizeof(struct sockaddr) > limit) {
6654 			return (EINVAL);
6655 		}
6656 		switch (sa->sa_family) {
6657 #ifdef INET
6658 		case AF_INET:
6659 			incr = (unsigned int)sizeof(struct sockaddr_in);
6660 			if (sa->sa_len != incr) {
6661 				return (EINVAL);
6662 			}
6663 			(*num_v4) += 1;
6664 			break;
6665 #endif
6666 #ifdef INET6
6667 		case AF_INET6:
6668 			{
6669 				struct sockaddr_in6 *sin6;
6670 
6671 				sin6 = (struct sockaddr_in6 *)sa;
6672 				if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
6673 					/* Must be non-mapped for connectx */
6674 					return (EINVAL);
6675 				}
6676 				incr = (unsigned int)sizeof(struct sockaddr_in6);
6677 				if (sa->sa_len != incr) {
6678 					return (EINVAL);
6679 				}
6680 				(*num_v6) += 1;
6681 				break;
6682 			}
6683 #endif
6684 		default:
6685 			return (EINVAL);
6686 		}
6687 		if ((at + incr) > limit) {
6688 			return (EINVAL);
6689 		}
6690 		SCTP_INP_INCR_REF(inp);
6691 		stcb = sctp_findassociation_ep_addr(&inp, sa, NULL, NULL, NULL);
6692 		if (stcb != NULL) {
6693 			SCTP_TCB_UNLOCK(stcb);
6694 			return (EALREADY);
6695 		} else {
6696 			SCTP_INP_DECR_REF(inp);
6697 		}
6698 		at += incr;
6699 		sa = (struct sockaddr *)((caddr_t)sa + incr);
6700 	}
6701 	return (0);
6702 }
6703 
6704 /*
6705  * sctp_bindx(ADD) for one address.
6706  * assumes all arguments are valid/checked by caller.
6707  */
6708 void
6709 sctp_bindx_add_address(struct socket *so, struct sctp_inpcb *inp,
6710     struct sockaddr *sa, uint32_t vrf_id, int *error,
6711     void *p)
6712 {
6713 #if defined(INET) && defined(INET6)
6714 	struct sockaddr_in sin;
6715 #endif
6716 #ifdef INET6
6717 	struct sockaddr_in6 *sin6;
6718 #endif
6719 #ifdef INET
6720 	struct sockaddr_in *sinp;
6721 #endif
6722 	struct sockaddr *addr_to_use;
6723 	struct sctp_inpcb *lep;
6724 	uint16_t port;
6725 
6726 	/* see if we're bound all already! */
6727 	if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUNDALL) {
6728 		SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL);
6729 		*error = EINVAL;
6730 		return;
6731 	}
6732 	switch (sa->sa_family) {
6733 #ifdef INET6
6734 	case AF_INET6:
6735 		if (sa->sa_len != sizeof(struct sockaddr_in6)) {
6736 			SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL);
6737 			*error = EINVAL;
6738 			return;
6739 		}
6740 		if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) == 0) {
6741 			/* can only bind v6 on PF_INET6 sockets */
6742 			SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL);
6743 			*error = EINVAL;
6744 			return;
6745 		}
6746 		sin6 = (struct sockaddr_in6 *)sa;
6747 		port = sin6->sin6_port;
6748 #ifdef INET
6749 		if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
6750 			if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) &&
6751 			    SCTP_IPV6_V6ONLY(inp)) {
6752 				/* can't bind v4-mapped on PF_INET sockets */
6753 				SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL);
6754 				*error = EINVAL;
6755 				return;
6756 			}
6757 			in6_sin6_2_sin(&sin, sin6);
6758 			addr_to_use = (struct sockaddr *)&sin;
6759 		} else {
6760 			addr_to_use = sa;
6761 		}
6762 #else
6763 		addr_to_use = sa;
6764 #endif
6765 		break;
6766 #endif
6767 #ifdef INET
6768 	case AF_INET:
6769 		if (sa->sa_len != sizeof(struct sockaddr_in)) {
6770 			SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL);
6771 			*error = EINVAL;
6772 			return;
6773 		}
6774 		if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) &&
6775 		    SCTP_IPV6_V6ONLY(inp)) {
6776 			/* can't bind v4 on PF_INET sockets */
6777 			SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL);
6778 			*error = EINVAL;
6779 			return;
6780 		}
6781 		sinp = (struct sockaddr_in *)sa;
6782 		port = sinp->sin_port;
6783 		addr_to_use = sa;
6784 		break;
6785 #endif
6786 	default:
6787 		SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL);
6788 		*error = EINVAL;
6789 		return;
6790 	}
6791 	if (inp->sctp_flags & SCTP_PCB_FLAGS_UNBOUND) {
6792 		if (p == NULL) {
6793 			/* Can't get proc for Net/Open BSD */
6794 			SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL);
6795 			*error = EINVAL;
6796 			return;
6797 		}
6798 		*error = sctp_inpcb_bind(so, addr_to_use, NULL, p);
6799 		return;
6800 	}
6801 	/* Validate the incoming port. */
6802 	if ((port != 0) && (port != inp->sctp_lport)) {
6803 		SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL);
6804 		*error = EINVAL;
6805 		return;
6806 	}
6807 	lep = sctp_pcb_findep(addr_to_use, 1, 0, vrf_id);
6808 	if (lep == NULL) {
6809 		/* add the address */
6810 		*error = sctp_addr_mgmt_ep_sa(inp, addr_to_use,
6811 		    SCTP_ADD_IP_ADDRESS, vrf_id);
6812 	} else {
6813 		if (lep != inp) {
6814 			*error = EADDRINUSE;
6815 		}
6816 		SCTP_INP_DECR_REF(lep);
6817 	}
6818 }
6819 
6820 /*
6821  * sctp_bindx(DELETE) for one address.
6822  * assumes all arguments are valid/checked by caller.
6823  */
6824 void
6825 sctp_bindx_delete_address(struct sctp_inpcb *inp,
6826     struct sockaddr *sa, uint32_t vrf_id, int *error)
6827 {
6828 	struct sockaddr *addr_to_use;
6829 #if defined(INET) && defined(INET6)
6830 	struct sockaddr_in6 *sin6;
6831 	struct sockaddr_in sin;
6832 #endif
6833 
6834 	/* see if we're bound all already! */
6835 	if (inp->sctp_flags & SCTP_PCB_FLAGS_BOUNDALL) {
6836 		SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL);
6837 		*error = EINVAL;
6838 		return;
6839 	}
6840 	switch (sa->sa_family) {
6841 #ifdef INET6
6842 	case AF_INET6:
6843 		if (sa->sa_len != sizeof(struct sockaddr_in6)) {
6844 			SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL);
6845 			*error = EINVAL;
6846 			return;
6847 		}
6848 		if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) == 0) {
6849 			/* can only bind v6 on PF_INET6 sockets */
6850 			SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL);
6851 			*error = EINVAL;
6852 			return;
6853 		}
6854 #ifdef INET
6855 		sin6 = (struct sockaddr_in6 *)sa;
6856 		if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
6857 			if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) &&
6858 			    SCTP_IPV6_V6ONLY(inp)) {
6859 				/* can't bind mapped-v4 on PF_INET sockets */
6860 				SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL);
6861 				*error = EINVAL;
6862 				return;
6863 			}
6864 			in6_sin6_2_sin(&sin, sin6);
6865 			addr_to_use = (struct sockaddr *)&sin;
6866 		} else {
6867 			addr_to_use = sa;
6868 		}
6869 #else
6870 		addr_to_use = sa;
6871 #endif
6872 		break;
6873 #endif
6874 #ifdef INET
6875 	case AF_INET:
6876 		if (sa->sa_len != sizeof(struct sockaddr_in)) {
6877 			SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL);
6878 			*error = EINVAL;
6879 			return;
6880 		}
6881 		if ((inp->sctp_flags & SCTP_PCB_FLAGS_BOUND_V6) &&
6882 		    SCTP_IPV6_V6ONLY(inp)) {
6883 			/* can't bind v4 on PF_INET sockets */
6884 			SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL);
6885 			*error = EINVAL;
6886 			return;
6887 		}
6888 		addr_to_use = sa;
6889 		break;
6890 #endif
6891 	default:
6892 		SCTP_LTRACE_ERR_RET(inp, NULL, NULL, SCTP_FROM_SCTPUTIL, EINVAL);
6893 		*error = EINVAL;
6894 		return;
6895 	}
6896 	/* No lock required mgmt_ep_sa does its own locking. */
6897 	*error = sctp_addr_mgmt_ep_sa(inp, addr_to_use, SCTP_DEL_IP_ADDRESS,
6898 	    vrf_id);
6899 }
6900 
6901 /*
6902  * returns the valid local address count for an assoc, taking into account
6903  * all scoping rules
6904  */
6905 int
6906 sctp_local_addr_count(struct sctp_tcb *stcb)
6907 {
6908 	int loopback_scope;
6909 #if defined(INET)
6910 	int ipv4_local_scope, ipv4_addr_legal;
6911 #endif
6912 #if defined(INET6)
6913 	int local_scope, site_scope, ipv6_addr_legal;
6914 #endif
6915 	struct sctp_vrf *vrf;
6916 	struct sctp_ifn *sctp_ifn;
6917 	struct sctp_ifa *sctp_ifa;
6918 	int count = 0;
6919 
6920 	/* Turn on all the appropriate scopes */
6921 	loopback_scope = stcb->asoc.scope.loopback_scope;
6922 #if defined(INET)
6923 	ipv4_local_scope = stcb->asoc.scope.ipv4_local_scope;
6924 	ipv4_addr_legal = stcb->asoc.scope.ipv4_addr_legal;
6925 #endif
6926 #if defined(INET6)
6927 	local_scope = stcb->asoc.scope.local_scope;
6928 	site_scope = stcb->asoc.scope.site_scope;
6929 	ipv6_addr_legal = stcb->asoc.scope.ipv6_addr_legal;
6930 #endif
6931 	SCTP_IPI_ADDR_RLOCK();
6932 	vrf = sctp_find_vrf(stcb->asoc.vrf_id);
6933 	if (vrf == NULL) {
6934 		/* no vrf, no addresses */
6935 		SCTP_IPI_ADDR_RUNLOCK();
6936 		return (0);
6937 	}
6938 
6939 	if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_BOUNDALL) {
6940 		/*
6941 		 * bound all case: go through all ifns on the vrf
6942 		 */
6943 		LIST_FOREACH(sctp_ifn, &vrf->ifnlist, next_ifn) {
6944 			if ((loopback_scope == 0) &&
6945 			    SCTP_IFN_IS_IFT_LOOP(sctp_ifn)) {
6946 				continue;
6947 			}
6948 			LIST_FOREACH(sctp_ifa, &sctp_ifn->ifalist, next_ifa) {
6949 				if (sctp_is_addr_restricted(stcb, sctp_ifa))
6950 					continue;
6951 				switch (sctp_ifa->address.sa.sa_family) {
6952 #ifdef INET
6953 				case AF_INET:
6954 					if (ipv4_addr_legal) {
6955 						struct sockaddr_in *sin;
6956 
6957 						sin = &sctp_ifa->address.sin;
6958 						if (sin->sin_addr.s_addr == 0) {
6959 							/*
6960 							 * skip unspecified
6961 							 * addrs
6962 							 */
6963 							continue;
6964 						}
6965 						if (prison_check_ip4(stcb->sctp_ep->ip_inp.inp.inp_cred,
6966 						    &sin->sin_addr) != 0) {
6967 							continue;
6968 						}
6969 						if ((ipv4_local_scope == 0) &&
6970 						    (IN4_ISPRIVATE_ADDRESS(&sin->sin_addr))) {
6971 							continue;
6972 						}
6973 						/* count this one */
6974 						count++;
6975 					} else {
6976 						continue;
6977 					}
6978 					break;
6979 #endif
6980 #ifdef INET6
6981 				case AF_INET6:
6982 					if (ipv6_addr_legal) {
6983 						struct sockaddr_in6 *sin6;
6984 
6985 						sin6 = &sctp_ifa->address.sin6;
6986 						if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) {
6987 							continue;
6988 						}
6989 						if (prison_check_ip6(stcb->sctp_ep->ip_inp.inp.inp_cred,
6990 						    &sin6->sin6_addr) != 0) {
6991 							continue;
6992 						}
6993 						if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) {
6994 							if (local_scope == 0)
6995 								continue;
6996 							if (sin6->sin6_scope_id == 0) {
6997 								if (sa6_recoverscope(sin6) != 0)
6998 									/*
6999 									 *
7000 									 * bad
7001 									 * link
7002 									 *
7003 									 * local
7004 									 *
7005 									 * address
7006 									 */
7007 									continue;
7008 							}
7009 						}
7010 						if ((site_scope == 0) &&
7011 						    (IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr))) {
7012 							continue;
7013 						}
7014 						/* count this one */
7015 						count++;
7016 					}
7017 					break;
7018 #endif
7019 				default:
7020 					/* TSNH */
7021 					break;
7022 				}
7023 			}
7024 		}
7025 	} else {
7026 		/*
7027 		 * subset bound case
7028 		 */
7029 		struct sctp_laddr *laddr;
7030 
7031 		LIST_FOREACH(laddr, &stcb->sctp_ep->sctp_addr_list,
7032 		    sctp_nxt_addr) {
7033 			if (sctp_is_addr_restricted(stcb, laddr->ifa)) {
7034 				continue;
7035 			}
7036 			/* count this one */
7037 			count++;
7038 		}
7039 	}
7040 	SCTP_IPI_ADDR_RUNLOCK();
7041 	return (count);
7042 }
7043 
7044 #if defined(SCTP_LOCAL_TRACE_BUF)
7045 
7046 void
7047 sctp_log_trace(uint32_t subsys, const char *str SCTP_UNUSED, uint32_t a, uint32_t b, uint32_t c, uint32_t d, uint32_t e, uint32_t f)
7048 {
7049 	uint32_t saveindex, newindex;
7050 
7051 	do {
7052 		saveindex = SCTP_BASE_SYSCTL(sctp_log).index;
7053 		if (saveindex >= SCTP_MAX_LOGGING_SIZE) {
7054 			newindex = 1;
7055 		} else {
7056 			newindex = saveindex + 1;
7057 		}
7058 	} while (atomic_cmpset_int(&SCTP_BASE_SYSCTL(sctp_log).index, saveindex, newindex) == 0);
7059 	if (saveindex >= SCTP_MAX_LOGGING_SIZE) {
7060 		saveindex = 0;
7061 	}
7062 	SCTP_BASE_SYSCTL(sctp_log).entry[saveindex].timestamp = SCTP_GET_CYCLECOUNT;
7063 	SCTP_BASE_SYSCTL(sctp_log).entry[saveindex].subsys = subsys;
7064 	SCTP_BASE_SYSCTL(sctp_log).entry[saveindex].params[0] = a;
7065 	SCTP_BASE_SYSCTL(sctp_log).entry[saveindex].params[1] = b;
7066 	SCTP_BASE_SYSCTL(sctp_log).entry[saveindex].params[2] = c;
7067 	SCTP_BASE_SYSCTL(sctp_log).entry[saveindex].params[3] = d;
7068 	SCTP_BASE_SYSCTL(sctp_log).entry[saveindex].params[4] = e;
7069 	SCTP_BASE_SYSCTL(sctp_log).entry[saveindex].params[5] = f;
7070 }
7071 
7072 #endif
7073 static void
7074 sctp_recv_udp_tunneled_packet(struct mbuf *m, int off, struct inpcb *inp,
7075     const struct sockaddr *sa SCTP_UNUSED, void *ctx SCTP_UNUSED)
7076 {
7077 	struct ip *iph;
7078 #ifdef INET6
7079 	struct ip6_hdr *ip6;
7080 #endif
7081 	struct mbuf *sp, *last;
7082 	struct udphdr *uhdr;
7083 	uint16_t port;
7084 
7085 	if ((m->m_flags & M_PKTHDR) == 0) {
7086 		/* Can't handle one that is not a pkt hdr */
7087 		goto out;
7088 	}
7089 	/* Pull the src port */
7090 	iph = mtod(m, struct ip *);
7091 	uhdr = (struct udphdr *)((caddr_t)iph + off);
7092 	port = uhdr->uh_sport;
7093 	/*
7094 	 * Split out the mbuf chain. Leave the IP header in m, place the
7095 	 * rest in the sp.
7096 	 */
7097 	sp = m_split(m, off, M_NOWAIT);
7098 	if (sp == NULL) {
7099 		/* Gak, drop packet, we can't do a split */
7100 		goto out;
7101 	}
7102 	if (sp->m_pkthdr.len < sizeof(struct udphdr) + sizeof(struct sctphdr)) {
7103 		/* Gak, packet can't have an SCTP header in it - too small */
7104 		m_freem(sp);
7105 		goto out;
7106 	}
7107 	/* Now pull up the UDP header and SCTP header together */
7108 	sp = m_pullup(sp, sizeof(struct udphdr) + sizeof(struct sctphdr));
7109 	if (sp == NULL) {
7110 		/* Gak pullup failed */
7111 		goto out;
7112 	}
7113 	/* Trim out the UDP header */
7114 	m_adj(sp, sizeof(struct udphdr));
7115 
7116 	/* Now reconstruct the mbuf chain */
7117 	for (last = m; last->m_next; last = last->m_next);
7118 	last->m_next = sp;
7119 	m->m_pkthdr.len += sp->m_pkthdr.len;
7120 	/*
7121 	 * The CSUM_DATA_VALID flags indicates that the HW checked the UDP
7122 	 * checksum and it was valid. Since CSUM_DATA_VALID ==
7123 	 * CSUM_SCTP_VALID this would imply that the HW also verified the
7124 	 * SCTP checksum. Therefore, clear the bit.
7125 	 */
7126 	SCTPDBG(SCTP_DEBUG_CRCOFFLOAD,
7127 	    "sctp_recv_udp_tunneled_packet(): Packet of length %d received on %s with csum_flags 0x%b.\n",
7128 	    m->m_pkthdr.len,
7129 	    if_name(m->m_pkthdr.rcvif),
7130 	    (int)m->m_pkthdr.csum_flags, CSUM_BITS);
7131 	m->m_pkthdr.csum_flags &= ~CSUM_DATA_VALID;
7132 	iph = mtod(m, struct ip *);
7133 	switch (iph->ip_v) {
7134 #ifdef INET
7135 	case IPVERSION:
7136 		iph->ip_len = htons(ntohs(iph->ip_len) - sizeof(struct udphdr));
7137 		sctp_input_with_port(m, off, port);
7138 		break;
7139 #endif
7140 #ifdef INET6
7141 	case IPV6_VERSION >> 4:
7142 		ip6 = mtod(m, struct ip6_hdr *);
7143 		ip6->ip6_plen = htons(ntohs(ip6->ip6_plen) - sizeof(struct udphdr));
7144 		sctp6_input_with_port(&m, &off, port);
7145 		break;
7146 #endif
7147 	default:
7148 		goto out;
7149 		break;
7150 	}
7151 	return;
7152 out:
7153 	m_freem(m);
7154 }
7155 
7156 #ifdef INET
7157 static void
7158 sctp_recv_icmp_tunneled_packet(int cmd, struct sockaddr *sa, void *vip, void *ctx SCTP_UNUSED)
7159 {
7160 	struct ip *outer_ip, *inner_ip;
7161 	struct sctphdr *sh;
7162 	struct icmp *icmp;
7163 	struct udphdr *udp;
7164 	struct sctp_inpcb *inp;
7165 	struct sctp_tcb *stcb;
7166 	struct sctp_nets *net;
7167 	struct sctp_init_chunk *ch;
7168 	struct sockaddr_in src, dst;
7169 	uint8_t type, code;
7170 
7171 	inner_ip = (struct ip *)vip;
7172 	icmp = (struct icmp *)((caddr_t)inner_ip -
7173 	    (sizeof(struct icmp) - sizeof(struct ip)));
7174 	outer_ip = (struct ip *)((caddr_t)icmp - sizeof(struct ip));
7175 	if (ntohs(outer_ip->ip_len) <
7176 	    sizeof(struct ip) + 8 + (inner_ip->ip_hl << 2) + sizeof(struct udphdr) + 8) {
7177 		return;
7178 	}
7179 	udp = (struct udphdr *)((caddr_t)inner_ip + (inner_ip->ip_hl << 2));
7180 	sh = (struct sctphdr *)(udp + 1);
7181 	memset(&src, 0, sizeof(struct sockaddr_in));
7182 	src.sin_family = AF_INET;
7183 	src.sin_len = sizeof(struct sockaddr_in);
7184 	src.sin_port = sh->src_port;
7185 	src.sin_addr = inner_ip->ip_src;
7186 	memset(&dst, 0, sizeof(struct sockaddr_in));
7187 	dst.sin_family = AF_INET;
7188 	dst.sin_len = sizeof(struct sockaddr_in);
7189 	dst.sin_port = sh->dest_port;
7190 	dst.sin_addr = inner_ip->ip_dst;
7191 	/*
7192 	 * 'dst' holds the dest of the packet that failed to be sent. 'src'
7193 	 * holds our local endpoint address. Thus we reverse the dst and the
7194 	 * src in the lookup.
7195 	 */
7196 	inp = NULL;
7197 	net = NULL;
7198 	stcb = sctp_findassociation_addr_sa((struct sockaddr *)&dst,
7199 	    (struct sockaddr *)&src,
7200 	    &inp, &net, 1,
7201 	    SCTP_DEFAULT_VRFID);
7202 	if ((stcb != NULL) &&
7203 	    (net != NULL) &&
7204 	    (inp != NULL)) {
7205 		/* Check the UDP port numbers */
7206 		if ((udp->uh_dport != net->port) ||
7207 		    (udp->uh_sport != htons(SCTP_BASE_SYSCTL(sctp_udp_tunneling_port)))) {
7208 			SCTP_TCB_UNLOCK(stcb);
7209 			return;
7210 		}
7211 		/* Check the verification tag */
7212 		if (ntohl(sh->v_tag) != 0) {
7213 			/*
7214 			 * This must be the verification tag used for
7215 			 * sending out packets. We don't consider packets
7216 			 * reflecting the verification tag.
7217 			 */
7218 			if (ntohl(sh->v_tag) != stcb->asoc.peer_vtag) {
7219 				SCTP_TCB_UNLOCK(stcb);
7220 				return;
7221 			}
7222 		} else {
7223 			if (ntohs(outer_ip->ip_len) >=
7224 			    sizeof(struct ip) +
7225 			    8 + (inner_ip->ip_hl << 2) + 8 + 20) {
7226 				/*
7227 				 * In this case we can check if we got an
7228 				 * INIT chunk and if the initiate tag
7229 				 * matches.
7230 				 */
7231 				ch = (struct sctp_init_chunk *)(sh + 1);
7232 				if ((ch->ch.chunk_type != SCTP_INITIATION) ||
7233 				    (ntohl(ch->init.initiate_tag) != stcb->asoc.my_vtag)) {
7234 					SCTP_TCB_UNLOCK(stcb);
7235 					return;
7236 				}
7237 			} else {
7238 				SCTP_TCB_UNLOCK(stcb);
7239 				return;
7240 			}
7241 		}
7242 		type = icmp->icmp_type;
7243 		code = icmp->icmp_code;
7244 		if ((type == ICMP_UNREACH) &&
7245 		    (code == ICMP_UNREACH_PORT)) {
7246 			code = ICMP_UNREACH_PROTOCOL;
7247 		}
7248 		sctp_notify(inp, stcb, net, type, code,
7249 		    ntohs(inner_ip->ip_len),
7250 		    (uint32_t)ntohs(icmp->icmp_nextmtu));
7251 	} else {
7252 		if ((stcb == NULL) && (inp != NULL)) {
7253 			/* reduce ref-count */
7254 			SCTP_INP_WLOCK(inp);
7255 			SCTP_INP_DECR_REF(inp);
7256 			SCTP_INP_WUNLOCK(inp);
7257 		}
7258 		if (stcb) {
7259 			SCTP_TCB_UNLOCK(stcb);
7260 		}
7261 	}
7262 	return;
7263 }
7264 #endif
7265 
7266 #ifdef INET6
7267 static void
7268 sctp_recv_icmp6_tunneled_packet(int cmd, struct sockaddr *sa, void *d, void *ctx SCTP_UNUSED)
7269 {
7270 	struct ip6ctlparam *ip6cp;
7271 	struct sctp_inpcb *inp;
7272 	struct sctp_tcb *stcb;
7273 	struct sctp_nets *net;
7274 	struct sctphdr sh;
7275 	struct udphdr udp;
7276 	struct sockaddr_in6 src, dst;
7277 	uint8_t type, code;
7278 
7279 	ip6cp = (struct ip6ctlparam *)d;
7280 	/*
7281 	 * XXX: We assume that when IPV6 is non NULL, M and OFF are valid.
7282 	 */
7283 	if (ip6cp->ip6c_m == NULL) {
7284 		return;
7285 	}
7286 	/*
7287 	 * Check if we can safely examine the ports and the verification tag
7288 	 * of the SCTP common header.
7289 	 */
7290 	if (ip6cp->ip6c_m->m_pkthdr.len <
7291 	    ip6cp->ip6c_off + sizeof(struct udphdr) + offsetof(struct sctphdr, checksum)) {
7292 		return;
7293 	}
7294 	/* Copy out the UDP header. */
7295 	memset(&udp, 0, sizeof(struct udphdr));
7296 	m_copydata(ip6cp->ip6c_m,
7297 	    ip6cp->ip6c_off,
7298 	    sizeof(struct udphdr),
7299 	    (caddr_t)&udp);
7300 	/* Copy out the port numbers and the verification tag. */
7301 	memset(&sh, 0, sizeof(struct sctphdr));
7302 	m_copydata(ip6cp->ip6c_m,
7303 	    ip6cp->ip6c_off + sizeof(struct udphdr),
7304 	    sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint32_t),
7305 	    (caddr_t)&sh);
7306 	memset(&src, 0, sizeof(struct sockaddr_in6));
7307 	src.sin6_family = AF_INET6;
7308 	src.sin6_len = sizeof(struct sockaddr_in6);
7309 	src.sin6_port = sh.src_port;
7310 	src.sin6_addr = ip6cp->ip6c_ip6->ip6_src;
7311 	if (in6_setscope(&src.sin6_addr, ip6cp->ip6c_m->m_pkthdr.rcvif, NULL) != 0) {
7312 		return;
7313 	}
7314 	memset(&dst, 0, sizeof(struct sockaddr_in6));
7315 	dst.sin6_family = AF_INET6;
7316 	dst.sin6_len = sizeof(struct sockaddr_in6);
7317 	dst.sin6_port = sh.dest_port;
7318 	dst.sin6_addr = ip6cp->ip6c_ip6->ip6_dst;
7319 	if (in6_setscope(&dst.sin6_addr, ip6cp->ip6c_m->m_pkthdr.rcvif, NULL) != 0) {
7320 		return;
7321 	}
7322 	inp = NULL;
7323 	net = NULL;
7324 	stcb = sctp_findassociation_addr_sa((struct sockaddr *)&dst,
7325 	    (struct sockaddr *)&src,
7326 	    &inp, &net, 1, SCTP_DEFAULT_VRFID);
7327 	if ((stcb != NULL) &&
7328 	    (net != NULL) &&
7329 	    (inp != NULL)) {
7330 		/* Check the UDP port numbers */
7331 		if ((udp.uh_dport != net->port) ||
7332 		    (udp.uh_sport != htons(SCTP_BASE_SYSCTL(sctp_udp_tunneling_port)))) {
7333 			SCTP_TCB_UNLOCK(stcb);
7334 			return;
7335 		}
7336 		/* Check the verification tag */
7337 		if (ntohl(sh.v_tag) != 0) {
7338 			/*
7339 			 * This must be the verification tag used for
7340 			 * sending out packets. We don't consider packets
7341 			 * reflecting the verification tag.
7342 			 */
7343 			if (ntohl(sh.v_tag) != stcb->asoc.peer_vtag) {
7344 				SCTP_TCB_UNLOCK(stcb);
7345 				return;
7346 			}
7347 		} else {
7348 			if (ip6cp->ip6c_m->m_pkthdr.len >=
7349 			    ip6cp->ip6c_off + sizeof(struct udphdr) +
7350 			    sizeof(struct sctphdr) +
7351 			    sizeof(struct sctp_chunkhdr) +
7352 			    offsetof(struct sctp_init, a_rwnd)) {
7353 				/*
7354 				 * In this case we can check if we got an
7355 				 * INIT chunk and if the initiate tag
7356 				 * matches.
7357 				 */
7358 				uint32_t initiate_tag;
7359 				uint8_t chunk_type;
7360 
7361 				m_copydata(ip6cp->ip6c_m,
7362 				    ip6cp->ip6c_off +
7363 				    sizeof(struct udphdr) +
7364 				    sizeof(struct sctphdr),
7365 				    sizeof(uint8_t),
7366 				    (caddr_t)&chunk_type);
7367 				m_copydata(ip6cp->ip6c_m,
7368 				    ip6cp->ip6c_off +
7369 				    sizeof(struct udphdr) +
7370 				    sizeof(struct sctphdr) +
7371 				    sizeof(struct sctp_chunkhdr),
7372 				    sizeof(uint32_t),
7373 				    (caddr_t)&initiate_tag);
7374 				if ((chunk_type != SCTP_INITIATION) ||
7375 				    (ntohl(initiate_tag) != stcb->asoc.my_vtag)) {
7376 					SCTP_TCB_UNLOCK(stcb);
7377 					return;
7378 				}
7379 			} else {
7380 				SCTP_TCB_UNLOCK(stcb);
7381 				return;
7382 			}
7383 		}
7384 		type = ip6cp->ip6c_icmp6->icmp6_type;
7385 		code = ip6cp->ip6c_icmp6->icmp6_code;
7386 		if ((type == ICMP6_DST_UNREACH) &&
7387 		    (code == ICMP6_DST_UNREACH_NOPORT)) {
7388 			type = ICMP6_PARAM_PROB;
7389 			code = ICMP6_PARAMPROB_NEXTHEADER;
7390 		}
7391 		sctp6_notify(inp, stcb, net, type, code,
7392 		    ntohl(ip6cp->ip6c_icmp6->icmp6_mtu));
7393 	} else {
7394 		if ((stcb == NULL) && (inp != NULL)) {
7395 			/* reduce inp's ref-count */
7396 			SCTP_INP_WLOCK(inp);
7397 			SCTP_INP_DECR_REF(inp);
7398 			SCTP_INP_WUNLOCK(inp);
7399 		}
7400 		if (stcb) {
7401 			SCTP_TCB_UNLOCK(stcb);
7402 		}
7403 	}
7404 }
7405 #endif
7406 
7407 void
7408 sctp_over_udp_stop(void)
7409 {
7410 	/*
7411 	 * This function assumes sysctl caller holds sctp_sysctl_info_lock()
7412 	 * for writting!
7413 	 */
7414 #ifdef INET
7415 	if (SCTP_BASE_INFO(udp4_tun_socket) != NULL) {
7416 		soclose(SCTP_BASE_INFO(udp4_tun_socket));
7417 		SCTP_BASE_INFO(udp4_tun_socket) = NULL;
7418 	}
7419 #endif
7420 #ifdef INET6
7421 	if (SCTP_BASE_INFO(udp6_tun_socket) != NULL) {
7422 		soclose(SCTP_BASE_INFO(udp6_tun_socket));
7423 		SCTP_BASE_INFO(udp6_tun_socket) = NULL;
7424 	}
7425 #endif
7426 }
7427 
7428 int
7429 sctp_over_udp_start(void)
7430 {
7431 	uint16_t port;
7432 	int ret;
7433 #ifdef INET
7434 	struct sockaddr_in sin;
7435 #endif
7436 #ifdef INET6
7437 	struct sockaddr_in6 sin6;
7438 #endif
7439 	/*
7440 	 * This function assumes sysctl caller holds sctp_sysctl_info_lock()
7441 	 * for writting!
7442 	 */
7443 	port = SCTP_BASE_SYSCTL(sctp_udp_tunneling_port);
7444 	if (ntohs(port) == 0) {
7445 		/* Must have a port set */
7446 		return (EINVAL);
7447 	}
7448 #ifdef INET
7449 	if (SCTP_BASE_INFO(udp4_tun_socket) != NULL) {
7450 		/* Already running -- must stop first */
7451 		return (EALREADY);
7452 	}
7453 #endif
7454 #ifdef INET6
7455 	if (SCTP_BASE_INFO(udp6_tun_socket) != NULL) {
7456 		/* Already running -- must stop first */
7457 		return (EALREADY);
7458 	}
7459 #endif
7460 #ifdef INET
7461 	if ((ret = socreate(PF_INET, &SCTP_BASE_INFO(udp4_tun_socket),
7462 	    SOCK_DGRAM, IPPROTO_UDP,
7463 	    curthread->td_ucred, curthread))) {
7464 		sctp_over_udp_stop();
7465 		return (ret);
7466 	}
7467 	/* Call the special UDP hook. */
7468 	if ((ret = udp_set_kernel_tunneling(SCTP_BASE_INFO(udp4_tun_socket),
7469 	    sctp_recv_udp_tunneled_packet,
7470 	    sctp_recv_icmp_tunneled_packet,
7471 	    NULL))) {
7472 		sctp_over_udp_stop();
7473 		return (ret);
7474 	}
7475 	/* Ok, we have a socket, bind it to the port. */
7476 	memset(&sin, 0, sizeof(struct sockaddr_in));
7477 	sin.sin_len = sizeof(struct sockaddr_in);
7478 	sin.sin_family = AF_INET;
7479 	sin.sin_port = htons(port);
7480 	if ((ret = sobind(SCTP_BASE_INFO(udp4_tun_socket),
7481 	    (struct sockaddr *)&sin, curthread))) {
7482 		sctp_over_udp_stop();
7483 		return (ret);
7484 	}
7485 #endif
7486 #ifdef INET6
7487 	if ((ret = socreate(PF_INET6, &SCTP_BASE_INFO(udp6_tun_socket),
7488 	    SOCK_DGRAM, IPPROTO_UDP,
7489 	    curthread->td_ucred, curthread))) {
7490 		sctp_over_udp_stop();
7491 		return (ret);
7492 	}
7493 	/* Call the special UDP hook. */
7494 	if ((ret = udp_set_kernel_tunneling(SCTP_BASE_INFO(udp6_tun_socket),
7495 	    sctp_recv_udp_tunneled_packet,
7496 	    sctp_recv_icmp6_tunneled_packet,
7497 	    NULL))) {
7498 		sctp_over_udp_stop();
7499 		return (ret);
7500 	}
7501 	/* Ok, we have a socket, bind it to the port. */
7502 	memset(&sin6, 0, sizeof(struct sockaddr_in6));
7503 	sin6.sin6_len = sizeof(struct sockaddr_in6);
7504 	sin6.sin6_family = AF_INET6;
7505 	sin6.sin6_port = htons(port);
7506 	if ((ret = sobind(SCTP_BASE_INFO(udp6_tun_socket),
7507 	    (struct sockaddr *)&sin6, curthread))) {
7508 		sctp_over_udp_stop();
7509 		return (ret);
7510 	}
7511 #endif
7512 	return (0);
7513 }
7514 
7515 /*
7516  * sctp_min_mtu ()returns the minimum of all non-zero arguments.
7517  * If all arguments are zero, zero is returned.
7518  */
7519 uint32_t
7520 sctp_min_mtu(uint32_t mtu1, uint32_t mtu2, uint32_t mtu3)
7521 {
7522 	if (mtu1 > 0) {
7523 		if (mtu2 > 0) {
7524 			if (mtu3 > 0) {
7525 				return (min(mtu1, min(mtu2, mtu3)));
7526 			} else {
7527 				return (min(mtu1, mtu2));
7528 			}
7529 		} else {
7530 			if (mtu3 > 0) {
7531 				return (min(mtu1, mtu3));
7532 			} else {
7533 				return (mtu1);
7534 			}
7535 		}
7536 	} else {
7537 		if (mtu2 > 0) {
7538 			if (mtu3 > 0) {
7539 				return (min(mtu2, mtu3));
7540 			} else {
7541 				return (mtu2);
7542 			}
7543 		} else {
7544 			return (mtu3);
7545 		}
7546 	}
7547 }
7548 
7549 void
7550 sctp_hc_set_mtu(union sctp_sockstore *addr, uint16_t fibnum, uint32_t mtu)
7551 {
7552 	struct in_conninfo inc;
7553 
7554 	memset(&inc, 0, sizeof(struct in_conninfo));
7555 	inc.inc_fibnum = fibnum;
7556 	switch (addr->sa.sa_family) {
7557 #ifdef INET
7558 	case AF_INET:
7559 		inc.inc_faddr = addr->sin.sin_addr;
7560 		break;
7561 #endif
7562 #ifdef INET6
7563 	case AF_INET6:
7564 		inc.inc_flags |= INC_ISIPV6;
7565 		inc.inc6_faddr = addr->sin6.sin6_addr;
7566 		break;
7567 #endif
7568 	default:
7569 		return;
7570 	}
7571 	tcp_hc_updatemtu(&inc, (u_long)mtu);
7572 }
7573 
7574 uint32_t
7575 sctp_hc_get_mtu(union sctp_sockstore *addr, uint16_t fibnum)
7576 {
7577 	struct in_conninfo inc;
7578 
7579 	memset(&inc, 0, sizeof(struct in_conninfo));
7580 	inc.inc_fibnum = fibnum;
7581 	switch (addr->sa.sa_family) {
7582 #ifdef INET
7583 	case AF_INET:
7584 		inc.inc_faddr = addr->sin.sin_addr;
7585 		break;
7586 #endif
7587 #ifdef INET6
7588 	case AF_INET6:
7589 		inc.inc_flags |= INC_ISIPV6;
7590 		inc.inc6_faddr = addr->sin6.sin6_addr;
7591 		break;
7592 #endif
7593 	default:
7594 		return (0);
7595 	}
7596 	return ((uint32_t)tcp_hc_getmtu(&inc));
7597 }
7598 
7599 void
7600 sctp_set_state(struct sctp_tcb *stcb, int new_state)
7601 {
7602 #if defined(KDTRACE_HOOKS)
7603 	int old_state = stcb->asoc.state;
7604 #endif
7605 
7606 	KASSERT((new_state & ~SCTP_STATE_MASK) == 0,
7607 	    ("sctp_set_state: Can't set substate (new_state = %x)",
7608 	    new_state));
7609 	stcb->asoc.state = (stcb->asoc.state & ~SCTP_STATE_MASK) | new_state;
7610 	if ((new_state == SCTP_STATE_SHUTDOWN_RECEIVED) ||
7611 	    (new_state == SCTP_STATE_SHUTDOWN_SENT) ||
7612 	    (new_state == SCTP_STATE_SHUTDOWN_ACK_SENT)) {
7613 		SCTP_CLEAR_SUBSTATE(stcb, SCTP_STATE_SHUTDOWN_PENDING);
7614 	}
7615 #if defined(KDTRACE_HOOKS)
7616 	if (((old_state & SCTP_STATE_MASK) != new_state) &&
7617 	    !(((old_state & SCTP_STATE_MASK) == SCTP_STATE_EMPTY) &&
7618 	    (new_state == SCTP_STATE_INUSE))) {
7619 		SCTP_PROBE6(state__change, NULL, stcb, NULL, stcb, NULL, old_state);
7620 	}
7621 #endif
7622 }
7623 
7624 void
7625 sctp_add_substate(struct sctp_tcb *stcb, int substate)
7626 {
7627 #if defined(KDTRACE_HOOKS)
7628 	int old_state = stcb->asoc.state;
7629 #endif
7630 
7631 	KASSERT((substate & SCTP_STATE_MASK) == 0,
7632 	    ("sctp_add_substate: Can't set state (substate = %x)",
7633 	    substate));
7634 	stcb->asoc.state |= substate;
7635 #if defined(KDTRACE_HOOKS)
7636 	if (((substate & SCTP_STATE_ABOUT_TO_BE_FREED) &&
7637 	    ((old_state & SCTP_STATE_ABOUT_TO_BE_FREED) == 0)) ||
7638 	    ((substate & SCTP_STATE_SHUTDOWN_PENDING) &&
7639 	    ((old_state & SCTP_STATE_SHUTDOWN_PENDING) == 0))) {
7640 		SCTP_PROBE6(state__change, NULL, stcb, NULL, stcb, NULL, old_state);
7641 	}
7642 #endif
7643 }
7644