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