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