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