]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/netinet/sctp_indata.c
Upgrade LDNS to 1.7.0.
[FreeBSD/FreeBSD.git] / sys / netinet / sctp_indata.c
1 /*-
2  * SPDX-License-Identifier: BSD-3-Clause
3  *
4  * Copyright (c) 2001-2007, by Cisco Systems, Inc. All rights reserved.
5  * Copyright (c) 2008-2012, by Randall Stewart. All rights reserved.
6  * Copyright (c) 2008-2012, by Michael Tuexen. All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions are met:
10  *
11  * a) Redistributions of source code must retain the above copyright notice,
12  *    this list of conditions and the following disclaimer.
13  *
14  * b) Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in
16  *    the documentation and/or other materials provided with the distribution.
17  *
18  * c) Neither the name of Cisco Systems, Inc. nor the names of its
19  *    contributors may be used to endorse or promote products derived
20  *    from this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
24  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
32  * THE POSSIBILITY OF SUCH DAMAGE.
33  */
34
35 #include <sys/cdefs.h>
36 __FBSDID("$FreeBSD$");
37
38 #include <netinet/sctp_os.h>
39 #include <sys/proc.h>
40 #include <netinet/sctp_var.h>
41 #include <netinet/sctp_sysctl.h>
42 #include <netinet/sctp_header.h>
43 #include <netinet/sctp_pcb.h>
44 #include <netinet/sctputil.h>
45 #include <netinet/sctp_output.h>
46 #include <netinet/sctp_uio.h>
47 #include <netinet/sctp_auth.h>
48 #include <netinet/sctp_timer.h>
49 #include <netinet/sctp_asconf.h>
50 #include <netinet/sctp_indata.h>
51 #include <netinet/sctp_bsd_addr.h>
52 #include <netinet/sctp_input.h>
53 #include <netinet/sctp_crc32.h>
54 #include <netinet/sctp_lock_bsd.h>
55 /*
56  * NOTES: On the outbound side of things I need to check the sack timer to
57  * see if I should generate a sack into the chunk queue (if I have data to
58  * send that is and will be sending it .. for bundling.
59  *
60  * The callback in sctp_usrreq.c will get called when the socket is read from.
61  * This will cause sctp_service_queues() to get called on the top entry in
62  * the list.
63  */
64 static uint32_t
65 sctp_add_chk_to_control(struct sctp_queued_to_read *control,
66     struct sctp_stream_in *strm,
67     struct sctp_tcb *stcb,
68     struct sctp_association *asoc,
69     struct sctp_tmit_chunk *chk, int lock_held);
70
71
72 void
73 sctp_set_rwnd(struct sctp_tcb *stcb, struct sctp_association *asoc)
74 {
75         asoc->my_rwnd = sctp_calc_rwnd(stcb, asoc);
76 }
77
78 /* Calculate what the rwnd would be */
79 uint32_t
80 sctp_calc_rwnd(struct sctp_tcb *stcb, struct sctp_association *asoc)
81 {
82         uint32_t calc = 0;
83
84         /*
85          * This is really set wrong with respect to a 1-2-m socket. Since
86          * the sb_cc is the count that everyone as put up. When we re-write
87          * sctp_soreceive then we will fix this so that ONLY this
88          * associations data is taken into account.
89          */
90         if (stcb->sctp_socket == NULL) {
91                 return (calc);
92         }
93         KASSERT(asoc->cnt_on_reasm_queue > 0 || asoc->size_on_reasm_queue == 0,
94             ("size_on_reasm_queue is %u", asoc->size_on_reasm_queue));
95         KASSERT(asoc->cnt_on_all_streams > 0 || asoc->size_on_all_streams == 0,
96             ("size_on_all_streams is %u", asoc->size_on_all_streams));
97         if (stcb->asoc.sb_cc == 0 &&
98             asoc->cnt_on_reasm_queue == 0 &&
99             asoc->cnt_on_all_streams == 0) {
100                 /* Full rwnd granted */
101                 calc = max(SCTP_SB_LIMIT_RCV(stcb->sctp_socket), SCTP_MINIMAL_RWND);
102                 return (calc);
103         }
104         /* get actual space */
105         calc = (uint32_t)sctp_sbspace(&stcb->asoc, &stcb->sctp_socket->so_rcv);
106         /*
107          * take out what has NOT been put on socket queue and we yet hold
108          * for putting up.
109          */
110         calc = sctp_sbspace_sub(calc, (uint32_t)(asoc->size_on_reasm_queue +
111             asoc->cnt_on_reasm_queue * MSIZE));
112         calc = sctp_sbspace_sub(calc, (uint32_t)(asoc->size_on_all_streams +
113             asoc->cnt_on_all_streams * MSIZE));
114         if (calc == 0) {
115                 /* out of space */
116                 return (calc);
117         }
118         /* what is the overhead of all these rwnd's */
119         calc = sctp_sbspace_sub(calc, stcb->asoc.my_rwnd_control_len);
120         /*
121          * If the window gets too small due to ctrl-stuff, reduce it to 1,
122          * even it is 0. SWS engaged
123          */
124         if (calc < stcb->asoc.my_rwnd_control_len) {
125                 calc = 1;
126         }
127         return (calc);
128 }
129
130
131
132 /*
133  * Build out our readq entry based on the incoming packet.
134  */
135 struct sctp_queued_to_read *
136 sctp_build_readq_entry(struct sctp_tcb *stcb,
137     struct sctp_nets *net,
138     uint32_t tsn, uint32_t ppid,
139     uint32_t context, uint16_t sid,
140     uint32_t mid, uint8_t flags,
141     struct mbuf *dm)
142 {
143         struct sctp_queued_to_read *read_queue_e = NULL;
144
145         sctp_alloc_a_readq(stcb, read_queue_e);
146         if (read_queue_e == NULL) {
147                 goto failed_build;
148         }
149         memset(read_queue_e, 0, sizeof(struct sctp_queued_to_read));
150         read_queue_e->sinfo_stream = sid;
151         read_queue_e->sinfo_flags = (flags << 8);
152         read_queue_e->sinfo_ppid = ppid;
153         read_queue_e->sinfo_context = context;
154         read_queue_e->sinfo_tsn = tsn;
155         read_queue_e->sinfo_cumtsn = tsn;
156         read_queue_e->sinfo_assoc_id = sctp_get_associd(stcb);
157         read_queue_e->mid = mid;
158         read_queue_e->top_fsn = read_queue_e->fsn_included = 0xffffffff;
159         TAILQ_INIT(&read_queue_e->reasm);
160         read_queue_e->whoFrom = net;
161         atomic_add_int(&net->ref_count, 1);
162         read_queue_e->data = dm;
163         read_queue_e->stcb = stcb;
164         read_queue_e->port_from = stcb->rport;
165 failed_build:
166         return (read_queue_e);
167 }
168
169 struct mbuf *
170 sctp_build_ctl_nchunk(struct sctp_inpcb *inp, struct sctp_sndrcvinfo *sinfo)
171 {
172         struct sctp_extrcvinfo *seinfo;
173         struct sctp_sndrcvinfo *outinfo;
174         struct sctp_rcvinfo *rcvinfo;
175         struct sctp_nxtinfo *nxtinfo;
176         struct cmsghdr *cmh;
177         struct mbuf *ret;
178         int len;
179         int use_extended;
180         int provide_nxt;
181
182         if (sctp_is_feature_off(inp, SCTP_PCB_FLAGS_RECVDATAIOEVNT) &&
183             sctp_is_feature_off(inp, SCTP_PCB_FLAGS_RECVRCVINFO) &&
184             sctp_is_feature_off(inp, SCTP_PCB_FLAGS_RECVNXTINFO)) {
185                 /* user does not want any ancillary data */
186                 return (NULL);
187         }
188         len = 0;
189         if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_RECVRCVINFO)) {
190                 len += CMSG_SPACE(sizeof(struct sctp_rcvinfo));
191         }
192         seinfo = (struct sctp_extrcvinfo *)sinfo;
193         if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_RECVNXTINFO) &&
194             (seinfo->serinfo_next_flags & SCTP_NEXT_MSG_AVAIL)) {
195                 provide_nxt = 1;
196                 len += CMSG_SPACE(sizeof(struct sctp_nxtinfo));
197         } else {
198                 provide_nxt = 0;
199         }
200         if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_RECVDATAIOEVNT)) {
201                 if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_EXT_RCVINFO)) {
202                         use_extended = 1;
203                         len += CMSG_SPACE(sizeof(struct sctp_extrcvinfo));
204                 } else {
205                         use_extended = 0;
206                         len += CMSG_SPACE(sizeof(struct sctp_sndrcvinfo));
207                 }
208         } else {
209                 use_extended = 0;
210         }
211
212         ret = sctp_get_mbuf_for_msg(len, 0, M_NOWAIT, 1, MT_DATA);
213         if (ret == NULL) {
214                 /* No space */
215                 return (ret);
216         }
217         SCTP_BUF_LEN(ret) = 0;
218
219         /* We need a CMSG header followed by the struct */
220         cmh = mtod(ret, struct cmsghdr *);
221         /*
222          * Make sure that there is no un-initialized padding between the
223          * cmsg header and cmsg data and after the cmsg data.
224          */
225         memset(cmh, 0, len);
226         if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_RECVRCVINFO)) {
227                 cmh->cmsg_level = IPPROTO_SCTP;
228                 cmh->cmsg_len = CMSG_LEN(sizeof(struct sctp_rcvinfo));
229                 cmh->cmsg_type = SCTP_RCVINFO;
230                 rcvinfo = (struct sctp_rcvinfo *)CMSG_DATA(cmh);
231                 rcvinfo->rcv_sid = sinfo->sinfo_stream;
232                 rcvinfo->rcv_ssn = sinfo->sinfo_ssn;
233                 rcvinfo->rcv_flags = sinfo->sinfo_flags;
234                 rcvinfo->rcv_ppid = sinfo->sinfo_ppid;
235                 rcvinfo->rcv_tsn = sinfo->sinfo_tsn;
236                 rcvinfo->rcv_cumtsn = sinfo->sinfo_cumtsn;
237                 rcvinfo->rcv_context = sinfo->sinfo_context;
238                 rcvinfo->rcv_assoc_id = sinfo->sinfo_assoc_id;
239                 cmh = (struct cmsghdr *)((caddr_t)cmh + CMSG_SPACE(sizeof(struct sctp_rcvinfo)));
240                 SCTP_BUF_LEN(ret) += CMSG_SPACE(sizeof(struct sctp_rcvinfo));
241         }
242         if (provide_nxt) {
243                 cmh->cmsg_level = IPPROTO_SCTP;
244                 cmh->cmsg_len = CMSG_LEN(sizeof(struct sctp_nxtinfo));
245                 cmh->cmsg_type = SCTP_NXTINFO;
246                 nxtinfo = (struct sctp_nxtinfo *)CMSG_DATA(cmh);
247                 nxtinfo->nxt_sid = seinfo->serinfo_next_stream;
248                 nxtinfo->nxt_flags = 0;
249                 if (seinfo->serinfo_next_flags & SCTP_NEXT_MSG_IS_UNORDERED) {
250                         nxtinfo->nxt_flags |= SCTP_UNORDERED;
251                 }
252                 if (seinfo->serinfo_next_flags & SCTP_NEXT_MSG_IS_NOTIFICATION) {
253                         nxtinfo->nxt_flags |= SCTP_NOTIFICATION;
254                 }
255                 if (seinfo->serinfo_next_flags & SCTP_NEXT_MSG_ISCOMPLETE) {
256                         nxtinfo->nxt_flags |= SCTP_COMPLETE;
257                 }
258                 nxtinfo->nxt_ppid = seinfo->serinfo_next_ppid;
259                 nxtinfo->nxt_length = seinfo->serinfo_next_length;
260                 nxtinfo->nxt_assoc_id = seinfo->serinfo_next_aid;
261                 cmh = (struct cmsghdr *)((caddr_t)cmh + CMSG_SPACE(sizeof(struct sctp_nxtinfo)));
262                 SCTP_BUF_LEN(ret) += CMSG_SPACE(sizeof(struct sctp_nxtinfo));
263         }
264         if (sctp_is_feature_on(inp, SCTP_PCB_FLAGS_RECVDATAIOEVNT)) {
265                 cmh->cmsg_level = IPPROTO_SCTP;
266                 outinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmh);
267                 if (use_extended) {
268                         cmh->cmsg_len = CMSG_LEN(sizeof(struct sctp_extrcvinfo));
269                         cmh->cmsg_type = SCTP_EXTRCV;
270                         memcpy(outinfo, sinfo, sizeof(struct sctp_extrcvinfo));
271                         SCTP_BUF_LEN(ret) += CMSG_SPACE(sizeof(struct sctp_extrcvinfo));
272                 } else {
273                         cmh->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
274                         cmh->cmsg_type = SCTP_SNDRCV;
275                         *outinfo = *sinfo;
276                         SCTP_BUF_LEN(ret) += CMSG_SPACE(sizeof(struct sctp_sndrcvinfo));
277                 }
278         }
279         return (ret);
280 }
281
282
283 static void
284 sctp_mark_non_revokable(struct sctp_association *asoc, uint32_t tsn)
285 {
286         uint32_t gap, i, cumackp1;
287         int fnd = 0;
288         int in_r = 0, in_nr = 0;
289
290         if (SCTP_BASE_SYSCTL(sctp_do_drain) == 0) {
291                 return;
292         }
293         cumackp1 = asoc->cumulative_tsn + 1;
294         if (SCTP_TSN_GT(cumackp1, tsn)) {
295                 /*
296                  * this tsn is behind the cum ack and thus we don't need to
297                  * worry about it being moved from one to the other.
298                  */
299                 return;
300         }
301         SCTP_CALC_TSN_TO_GAP(gap, tsn, asoc->mapping_array_base_tsn);
302         in_r = SCTP_IS_TSN_PRESENT(asoc->mapping_array, gap);
303         in_nr = SCTP_IS_TSN_PRESENT(asoc->nr_mapping_array, gap);
304         if ((in_r == 0) && (in_nr == 0)) {
305 #ifdef INVARIANTS
306                 panic("Things are really messed up now");
307 #else
308                 SCTP_PRINTF("gap:%x tsn:%x\n", gap, tsn);
309                 sctp_print_mapping_array(asoc);
310 #endif
311         }
312         if (in_nr == 0)
313                 SCTP_SET_TSN_PRESENT(asoc->nr_mapping_array, gap);
314         if (in_r)
315                 SCTP_UNSET_TSN_PRESENT(asoc->mapping_array, gap);
316         if (SCTP_TSN_GT(tsn, asoc->highest_tsn_inside_nr_map)) {
317                 asoc->highest_tsn_inside_nr_map = tsn;
318         }
319         if (tsn == asoc->highest_tsn_inside_map) {
320                 /* We must back down to see what the new highest is */
321                 for (i = tsn - 1; SCTP_TSN_GE(i, asoc->mapping_array_base_tsn); i--) {
322                         SCTP_CALC_TSN_TO_GAP(gap, i, asoc->mapping_array_base_tsn);
323                         if (SCTP_IS_TSN_PRESENT(asoc->mapping_array, gap)) {
324                                 asoc->highest_tsn_inside_map = i;
325                                 fnd = 1;
326                                 break;
327                         }
328                 }
329                 if (!fnd) {
330                         asoc->highest_tsn_inside_map = asoc->mapping_array_base_tsn - 1;
331                 }
332         }
333 }
334
335 static int
336 sctp_place_control_in_stream(struct sctp_stream_in *strm,
337     struct sctp_association *asoc,
338     struct sctp_queued_to_read *control)
339 {
340         struct sctp_queued_to_read *at;
341         struct sctp_readhead *q;
342         uint8_t flags, unordered;
343
344         flags = (control->sinfo_flags >> 8);
345         unordered = flags & SCTP_DATA_UNORDERED;
346         if (unordered) {
347                 q = &strm->uno_inqueue;
348                 if (asoc->idata_supported == 0) {
349                         if (!TAILQ_EMPTY(q)) {
350                                 /*
351                                  * Only one stream can be here in old style
352                                  * -- abort
353                                  */
354                                 return (-1);
355                         }
356                         TAILQ_INSERT_TAIL(q, control, next_instrm);
357                         control->on_strm_q = SCTP_ON_UNORDERED;
358                         return (0);
359                 }
360         } else {
361                 q = &strm->inqueue;
362         }
363         if ((flags & SCTP_DATA_NOT_FRAG) == SCTP_DATA_NOT_FRAG) {
364                 control->end_added = 1;
365                 control->first_frag_seen = 1;
366                 control->last_frag_seen = 1;
367         }
368         if (TAILQ_EMPTY(q)) {
369                 /* Empty queue */
370                 TAILQ_INSERT_HEAD(q, control, next_instrm);
371                 if (unordered) {
372                         control->on_strm_q = SCTP_ON_UNORDERED;
373                 } else {
374                         control->on_strm_q = SCTP_ON_ORDERED;
375                 }
376                 return (0);
377         } else {
378                 TAILQ_FOREACH(at, q, next_instrm) {
379                         if (SCTP_MID_GT(asoc->idata_supported, at->mid, control->mid)) {
380                                 /*
381                                  * one in queue is bigger than the new one,
382                                  * insert before this one
383                                  */
384                                 TAILQ_INSERT_BEFORE(at, control, next_instrm);
385                                 if (unordered) {
386                                         control->on_strm_q = SCTP_ON_UNORDERED;
387                                 } else {
388                                         control->on_strm_q = SCTP_ON_ORDERED;
389                                 }
390                                 break;
391                         } else if (SCTP_MID_EQ(asoc->idata_supported, at->mid, control->mid)) {
392                                 /*
393                                  * Gak, He sent me a duplicate msg id
394                                  * number?? return -1 to abort.
395                                  */
396                                 return (-1);
397                         } else {
398                                 if (TAILQ_NEXT(at, next_instrm) == NULL) {
399                                         /*
400                                          * We are at the end, insert it
401                                          * after this one
402                                          */
403                                         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_STR_LOGGING_ENABLE) {
404                                                 sctp_log_strm_del(control, at,
405                                                     SCTP_STR_LOG_FROM_INSERT_TL);
406                                         }
407                                         TAILQ_INSERT_AFTER(q, at, control, next_instrm);
408                                         if (unordered) {
409                                                 control->on_strm_q = SCTP_ON_UNORDERED;
410                                         } else {
411                                                 control->on_strm_q = SCTP_ON_ORDERED;
412                                         }
413                                         break;
414                                 }
415                         }
416                 }
417         }
418         return (0);
419 }
420
421 static void
422 sctp_abort_in_reasm(struct sctp_tcb *stcb,
423     struct sctp_queued_to_read *control,
424     struct sctp_tmit_chunk *chk,
425     int *abort_flag, int opspot)
426 {
427         char msg[SCTP_DIAG_INFO_LEN];
428         struct mbuf *oper;
429
430         if (stcb->asoc.idata_supported) {
431                 snprintf(msg, sizeof(msg),
432                     "Reass %x,CF:%x,TSN=%8.8x,SID=%4.4x,FSN=%8.8x,MID:%8.8x",
433                     opspot,
434                     control->fsn_included,
435                     chk->rec.data.tsn,
436                     chk->rec.data.sid,
437                     chk->rec.data.fsn, chk->rec.data.mid);
438         } else {
439                 snprintf(msg, sizeof(msg),
440                     "Reass %x,CI:%x,TSN=%8.8x,SID=%4.4x,FSN=%4.4x,SSN:%4.4x",
441                     opspot,
442                     control->fsn_included,
443                     chk->rec.data.tsn,
444                     chk->rec.data.sid,
445                     chk->rec.data.fsn,
446                     (uint16_t)chk->rec.data.mid);
447         }
448         oper = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg);
449         sctp_m_freem(chk->data);
450         chk->data = NULL;
451         sctp_free_a_chunk(stcb, chk, SCTP_SO_NOT_LOCKED);
452         stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_1;
453         sctp_abort_an_association(stcb->sctp_ep, stcb, oper, SCTP_SO_NOT_LOCKED);
454         *abort_flag = 1;
455 }
456
457 static void
458 sctp_clean_up_control(struct sctp_tcb *stcb, struct sctp_queued_to_read *control)
459 {
460         /*
461          * The control could not be placed and must be cleaned.
462          */
463         struct sctp_tmit_chunk *chk, *nchk;
464
465         TAILQ_FOREACH_SAFE(chk, &control->reasm, sctp_next, nchk) {
466                 TAILQ_REMOVE(&control->reasm, chk, sctp_next);
467                 if (chk->data)
468                         sctp_m_freem(chk->data);
469                 chk->data = NULL;
470                 sctp_free_a_chunk(stcb, chk, SCTP_SO_NOT_LOCKED);
471         }
472         sctp_free_a_readq(stcb, control);
473 }
474
475 /*
476  * Queue the chunk either right into the socket buffer if it is the next one
477  * to go OR put it in the correct place in the delivery queue.  If we do
478  * append to the so_buf, keep doing so until we are out of order as
479  * long as the control's entered are non-fragmented.
480  */
481 static void
482 sctp_queue_data_to_stream(struct sctp_tcb *stcb,
483     struct sctp_association *asoc,
484     struct sctp_queued_to_read *control, int *abort_flag, int *need_reasm)
485 {
486         /*
487          * FIX-ME maybe? What happens when the ssn wraps? If we are getting
488          * all the data in one stream this could happen quite rapidly. One
489          * could use the TSN to keep track of things, but this scheme breaks
490          * down in the other type of stream usage that could occur. Send a
491          * single msg to stream 0, send 4Billion messages to stream 1, now
492          * send a message to stream 0. You have a situation where the TSN
493          * has wrapped but not in the stream. Is this worth worrying about
494          * or should we just change our queue sort at the bottom to be by
495          * TSN.
496          *
497          * Could it also be legal for a peer to send ssn 1 with TSN 2 and
498          * ssn 2 with TSN 1? If the peer is doing some sort of funky TSN/SSN
499          * assignment this could happen... and I don't see how this would be
500          * a violation. So for now I am undecided an will leave the sort by
501          * SSN alone. Maybe a hybred approach is the answer
502          *
503          */
504         struct sctp_queued_to_read *at;
505         int queue_needed;
506         uint32_t nxt_todel;
507         struct mbuf *op_err;
508         struct sctp_stream_in *strm;
509         char msg[SCTP_DIAG_INFO_LEN];
510
511         strm = &asoc->strmin[control->sinfo_stream];
512         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_STR_LOGGING_ENABLE) {
513                 sctp_log_strm_del(control, NULL, SCTP_STR_LOG_FROM_INTO_STRD);
514         }
515         if (SCTP_MID_GT((asoc->idata_supported), strm->last_mid_delivered, control->mid)) {
516                 /* The incoming sseq is behind where we last delivered? */
517                 SCTPDBG(SCTP_DEBUG_INDATA1, "Duplicate S-SEQ: %u delivered: %u from peer, Abort association\n",
518                     strm->last_mid_delivered, control->mid);
519                 /*
520                  * throw it in the stream so it gets cleaned up in
521                  * association destruction
522                  */
523                 TAILQ_INSERT_HEAD(&strm->inqueue, control, next_instrm);
524                 if (asoc->idata_supported) {
525                         snprintf(msg, sizeof(msg), "Delivered MID=%8.8x, got TSN=%8.8x, SID=%4.4x, MID=%8.8x",
526                             strm->last_mid_delivered, control->sinfo_tsn,
527                             control->sinfo_stream, control->mid);
528                 } else {
529                         snprintf(msg, sizeof(msg), "Delivered SSN=%4.4x, got TSN=%8.8x, SID=%4.4x, SSN=%4.4x",
530                             (uint16_t)strm->last_mid_delivered,
531                             control->sinfo_tsn,
532                             control->sinfo_stream,
533                             (uint16_t)control->mid);
534                 }
535                 op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg);
536                 stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_2;
537                 sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED);
538                 *abort_flag = 1;
539                 return;
540
541         }
542         queue_needed = 1;
543         asoc->size_on_all_streams += control->length;
544         sctp_ucount_incr(asoc->cnt_on_all_streams);
545         nxt_todel = strm->last_mid_delivered + 1;
546         if (SCTP_MID_EQ(asoc->idata_supported, nxt_todel, control->mid)) {
547 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
548                 struct socket *so;
549
550                 so = SCTP_INP_SO(stcb->sctp_ep);
551                 atomic_add_int(&stcb->asoc.refcnt, 1);
552                 SCTP_TCB_UNLOCK(stcb);
553                 SCTP_SOCKET_LOCK(so, 1);
554                 SCTP_TCB_LOCK(stcb);
555                 atomic_subtract_int(&stcb->asoc.refcnt, 1);
556                 if (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) {
557                         SCTP_SOCKET_UNLOCK(so, 1);
558                         return;
559                 }
560 #endif
561                 /* can be delivered right away? */
562                 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_STR_LOGGING_ENABLE) {
563                         sctp_log_strm_del(control, NULL, SCTP_STR_LOG_FROM_IMMED_DEL);
564                 }
565                 /* EY it wont be queued if it could be delivered directly */
566                 queue_needed = 0;
567                 if (asoc->size_on_all_streams >= control->length) {
568                         asoc->size_on_all_streams -= control->length;
569                 } else {
570 #ifdef INVARIANTS
571                         panic("size_on_all_streams = %u smaller than control length %u", asoc->size_on_all_streams, control->length);
572 #else
573                         asoc->size_on_all_streams = 0;
574 #endif
575                 }
576                 sctp_ucount_decr(asoc->cnt_on_all_streams);
577                 strm->last_mid_delivered++;
578                 sctp_mark_non_revokable(asoc, control->sinfo_tsn);
579                 sctp_add_to_readq(stcb->sctp_ep, stcb,
580                     control,
581                     &stcb->sctp_socket->so_rcv, 1,
582                     SCTP_READ_LOCK_NOT_HELD, SCTP_SO_LOCKED);
583                 TAILQ_FOREACH_SAFE(control, &strm->inqueue, next_instrm, at) {
584                         /* all delivered */
585                         nxt_todel = strm->last_mid_delivered + 1;
586                         if (SCTP_MID_EQ(asoc->idata_supported, nxt_todel, control->mid) &&
587                             (((control->sinfo_flags >> 8) & SCTP_DATA_NOT_FRAG) == SCTP_DATA_NOT_FRAG)) {
588                                 if (control->on_strm_q == SCTP_ON_ORDERED) {
589                                         TAILQ_REMOVE(&strm->inqueue, control, next_instrm);
590                                         if (asoc->size_on_all_streams >= control->length) {
591                                                 asoc->size_on_all_streams -= control->length;
592                                         } else {
593 #ifdef INVARIANTS
594                                                 panic("size_on_all_streams = %u smaller than control length %u", asoc->size_on_all_streams, control->length);
595 #else
596                                                 asoc->size_on_all_streams = 0;
597 #endif
598                                         }
599                                         sctp_ucount_decr(asoc->cnt_on_all_streams);
600 #ifdef INVARIANTS
601                                 } else {
602                                         panic("Huh control: %p is on_strm_q: %d",
603                                             control, control->on_strm_q);
604 #endif
605                                 }
606                                 control->on_strm_q = 0;
607                                 strm->last_mid_delivered++;
608                                 /*
609                                  * We ignore the return of deliver_data here
610                                  * since we always can hold the chunk on the
611                                  * d-queue. And we have a finite number that
612                                  * can be delivered from the strq.
613                                  */
614                                 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_STR_LOGGING_ENABLE) {
615                                         sctp_log_strm_del(control, NULL,
616                                             SCTP_STR_LOG_FROM_IMMED_DEL);
617                                 }
618                                 sctp_mark_non_revokable(asoc, control->sinfo_tsn);
619                                 sctp_add_to_readq(stcb->sctp_ep, stcb,
620                                     control,
621                                     &stcb->sctp_socket->so_rcv, 1,
622                                     SCTP_READ_LOCK_NOT_HELD,
623                                     SCTP_SO_LOCKED);
624                                 continue;
625                         } else if (SCTP_MID_EQ(asoc->idata_supported, nxt_todel, control->mid)) {
626                                 *need_reasm = 1;
627                         }
628                         break;
629                 }
630 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
631                 SCTP_SOCKET_UNLOCK(so, 1);
632 #endif
633         }
634         if (queue_needed) {
635                 /*
636                  * Ok, we did not deliver this guy, find the correct place
637                  * to put it on the queue.
638                  */
639                 if (sctp_place_control_in_stream(strm, asoc, control)) {
640                         snprintf(msg, sizeof(msg),
641                             "Queue to str MID: %u duplicate",
642                             control->mid);
643                         sctp_clean_up_control(stcb, control);
644                         op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg);
645                         stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_3;
646                         sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED);
647                         *abort_flag = 1;
648                 }
649         }
650 }
651
652
653 static void
654 sctp_setup_tail_pointer(struct sctp_queued_to_read *control)
655 {
656         struct mbuf *m, *prev = NULL;
657         struct sctp_tcb *stcb;
658
659         stcb = control->stcb;
660         control->held_length = 0;
661         control->length = 0;
662         m = control->data;
663         while (m) {
664                 if (SCTP_BUF_LEN(m) == 0) {
665                         /* Skip mbufs with NO length */
666                         if (prev == NULL) {
667                                 /* First one */
668                                 control->data = sctp_m_free(m);
669                                 m = control->data;
670                         } else {
671                                 SCTP_BUF_NEXT(prev) = sctp_m_free(m);
672                                 m = SCTP_BUF_NEXT(prev);
673                         }
674                         if (m == NULL) {
675                                 control->tail_mbuf = prev;
676                         }
677                         continue;
678                 }
679                 prev = m;
680                 atomic_add_int(&control->length, SCTP_BUF_LEN(m));
681                 if (control->on_read_q) {
682                         /*
683                          * On read queue so we must increment the SB stuff,
684                          * we assume caller has done any locks of SB.
685                          */
686                         sctp_sballoc(stcb, &stcb->sctp_socket->so_rcv, m);
687                 }
688                 m = SCTP_BUF_NEXT(m);
689         }
690         if (prev) {
691                 control->tail_mbuf = prev;
692         }
693 }
694
695 static void
696 sctp_add_to_tail_pointer(struct sctp_queued_to_read *control, struct mbuf *m, uint32_t *added)
697 {
698         struct mbuf *prev = NULL;
699         struct sctp_tcb *stcb;
700
701         stcb = control->stcb;
702         if (stcb == NULL) {
703 #ifdef INVARIANTS
704                 panic("Control broken");
705 #else
706                 return;
707 #endif
708         }
709         if (control->tail_mbuf == NULL) {
710                 /* TSNH */
711                 control->data = m;
712                 sctp_setup_tail_pointer(control);
713                 return;
714         }
715         control->tail_mbuf->m_next = m;
716         while (m) {
717                 if (SCTP_BUF_LEN(m) == 0) {
718                         /* Skip mbufs with NO length */
719                         if (prev == NULL) {
720                                 /* First one */
721                                 control->tail_mbuf->m_next = sctp_m_free(m);
722                                 m = control->tail_mbuf->m_next;
723                         } else {
724                                 SCTP_BUF_NEXT(prev) = sctp_m_free(m);
725                                 m = SCTP_BUF_NEXT(prev);
726                         }
727                         if (m == NULL) {
728                                 control->tail_mbuf = prev;
729                         }
730                         continue;
731                 }
732                 prev = m;
733                 if (control->on_read_q) {
734                         /*
735                          * On read queue so we must increment the SB stuff,
736                          * we assume caller has done any locks of SB.
737                          */
738                         sctp_sballoc(stcb, &stcb->sctp_socket->so_rcv, m);
739                 }
740                 *added += SCTP_BUF_LEN(m);
741                 atomic_add_int(&control->length, SCTP_BUF_LEN(m));
742                 m = SCTP_BUF_NEXT(m);
743         }
744         if (prev) {
745                 control->tail_mbuf = prev;
746         }
747 }
748
749 static void
750 sctp_build_readq_entry_from_ctl(struct sctp_queued_to_read *nc, struct sctp_queued_to_read *control)
751 {
752         memset(nc, 0, sizeof(struct sctp_queued_to_read));
753         nc->sinfo_stream = control->sinfo_stream;
754         nc->mid = control->mid;
755         TAILQ_INIT(&nc->reasm);
756         nc->top_fsn = control->top_fsn;
757         nc->mid = control->mid;
758         nc->sinfo_flags = control->sinfo_flags;
759         nc->sinfo_ppid = control->sinfo_ppid;
760         nc->sinfo_context = control->sinfo_context;
761         nc->fsn_included = 0xffffffff;
762         nc->sinfo_tsn = control->sinfo_tsn;
763         nc->sinfo_cumtsn = control->sinfo_cumtsn;
764         nc->sinfo_assoc_id = control->sinfo_assoc_id;
765         nc->whoFrom = control->whoFrom;
766         atomic_add_int(&nc->whoFrom->ref_count, 1);
767         nc->stcb = control->stcb;
768         nc->port_from = control->port_from;
769 }
770
771 static void
772 sctp_reset_a_control(struct sctp_queued_to_read *control,
773     struct sctp_inpcb *inp, uint32_t tsn)
774 {
775         control->fsn_included = tsn;
776         if (control->on_read_q) {
777                 /*
778                  * We have to purge it from there, hopefully this will work
779                  * :-)
780                  */
781                 TAILQ_REMOVE(&inp->read_queue, control, next);
782                 control->on_read_q = 0;
783         }
784 }
785
786 static int
787 sctp_handle_old_unordered_data(struct sctp_tcb *stcb,
788     struct sctp_association *asoc,
789     struct sctp_stream_in *strm,
790     struct sctp_queued_to_read *control,
791     uint32_t pd_point,
792     int inp_read_lock_held)
793 {
794         /*
795          * Special handling for the old un-ordered data chunk. All the
796          * chunks/TSN's go to mid 0. So we have to do the old style watching
797          * to see if we have it all. If you return one, no other control
798          * entries on the un-ordered queue will be looked at. In theory
799          * there should be no others entries in reality, unless the guy is
800          * sending both unordered NDATA and unordered DATA...
801          */
802         struct sctp_tmit_chunk *chk, *lchk, *tchk;
803         uint32_t fsn;
804         struct sctp_queued_to_read *nc;
805         int cnt_added;
806
807         if (control->first_frag_seen == 0) {
808                 /* Nothing we can do, we have not seen the first piece yet */
809                 return (1);
810         }
811         /* Collapse any we can */
812         cnt_added = 0;
813 restart:
814         fsn = control->fsn_included + 1;
815         /* Now what can we add? */
816         TAILQ_FOREACH_SAFE(chk, &control->reasm, sctp_next, lchk) {
817                 if (chk->rec.data.fsn == fsn) {
818                         /* Ok lets add it */
819                         sctp_alloc_a_readq(stcb, nc);
820                         if (nc == NULL) {
821                                 break;
822                         }
823                         memset(nc, 0, sizeof(struct sctp_queued_to_read));
824                         TAILQ_REMOVE(&control->reasm, chk, sctp_next);
825                         sctp_add_chk_to_control(control, strm, stcb, asoc, chk, SCTP_READ_LOCK_NOT_HELD);
826                         fsn++;
827                         cnt_added++;
828                         chk = NULL;
829                         if (control->end_added) {
830                                 /* We are done */
831                                 if (!TAILQ_EMPTY(&control->reasm)) {
832                                         /*
833                                          * Ok we have to move anything left
834                                          * on the control queue to a new
835                                          * control.
836                                          */
837                                         sctp_build_readq_entry_from_ctl(nc, control);
838                                         tchk = TAILQ_FIRST(&control->reasm);
839                                         if (tchk->rec.data.rcv_flags & SCTP_DATA_FIRST_FRAG) {
840                                                 TAILQ_REMOVE(&control->reasm, tchk, sctp_next);
841                                                 if (asoc->size_on_reasm_queue >= tchk->send_size) {
842                                                         asoc->size_on_reasm_queue -= tchk->send_size;
843                                                 } else {
844 #ifdef INVARIANTS
845                                                         panic("size_on_reasm_queue = %u smaller than chunk length %u", asoc->size_on_reasm_queue, tchk->send_size);
846 #else
847                                                         asoc->size_on_reasm_queue = 0;
848 #endif
849                                                 }
850                                                 sctp_ucount_decr(asoc->cnt_on_reasm_queue);
851                                                 nc->first_frag_seen = 1;
852                                                 nc->fsn_included = tchk->rec.data.fsn;
853                                                 nc->data = tchk->data;
854                                                 nc->sinfo_ppid = tchk->rec.data.ppid;
855                                                 nc->sinfo_tsn = tchk->rec.data.tsn;
856                                                 sctp_mark_non_revokable(asoc, tchk->rec.data.tsn);
857                                                 tchk->data = NULL;
858                                                 sctp_free_a_chunk(stcb, tchk, SCTP_SO_NOT_LOCKED);
859                                                 sctp_setup_tail_pointer(nc);
860                                                 tchk = TAILQ_FIRST(&control->reasm);
861                                         }
862                                         /* Spin the rest onto the queue */
863                                         while (tchk) {
864                                                 TAILQ_REMOVE(&control->reasm, tchk, sctp_next);
865                                                 TAILQ_INSERT_TAIL(&nc->reasm, tchk, sctp_next);
866                                                 tchk = TAILQ_FIRST(&control->reasm);
867                                         }
868                                         /*
869                                          * Now lets add it to the queue
870                                          * after removing control
871                                          */
872                                         TAILQ_INSERT_TAIL(&strm->uno_inqueue, nc, next_instrm);
873                                         nc->on_strm_q = SCTP_ON_UNORDERED;
874                                         if (control->on_strm_q) {
875                                                 TAILQ_REMOVE(&strm->uno_inqueue, control, next_instrm);
876                                                 control->on_strm_q = 0;
877                                         }
878                                 }
879                                 if (control->pdapi_started) {
880                                         strm->pd_api_started = 0;
881                                         control->pdapi_started = 0;
882                                 }
883                                 if (control->on_strm_q) {
884                                         TAILQ_REMOVE(&strm->uno_inqueue, control, next_instrm);
885                                         control->on_strm_q = 0;
886                                         SCTP_STAT_INCR_COUNTER64(sctps_reasmusrmsgs);
887                                 }
888                                 if (control->on_read_q == 0) {
889                                         sctp_add_to_readq(stcb->sctp_ep, stcb, control,
890                                             &stcb->sctp_socket->so_rcv, control->end_added,
891                                             inp_read_lock_held, SCTP_SO_NOT_LOCKED);
892                                 }
893                                 sctp_wakeup_the_read_socket(stcb->sctp_ep, stcb, SCTP_SO_NOT_LOCKED);
894                                 if ((nc->first_frag_seen) && !TAILQ_EMPTY(&nc->reasm)) {
895                                         /*
896                                          * Switch to the new guy and
897                                          * continue
898                                          */
899                                         control = nc;
900                                         goto restart;
901                                 } else {
902                                         if (nc->on_strm_q == 0) {
903                                                 sctp_free_a_readq(stcb, nc);
904                                         }
905                                 }
906                                 return (1);
907                         } else {
908                                 sctp_free_a_readq(stcb, nc);
909                         }
910                 } else {
911                         /* Can't add more */
912                         break;
913                 }
914         }
915         if ((control->length > pd_point) && (strm->pd_api_started == 0)) {
916                 strm->pd_api_started = 1;
917                 control->pdapi_started = 1;
918                 sctp_add_to_readq(stcb->sctp_ep, stcb, control,
919                     &stcb->sctp_socket->so_rcv, control->end_added,
920                     inp_read_lock_held, SCTP_SO_NOT_LOCKED);
921                 sctp_wakeup_the_read_socket(stcb->sctp_ep, stcb, SCTP_SO_NOT_LOCKED);
922                 return (0);
923         } else {
924                 return (1);
925         }
926 }
927
928 static void
929 sctp_inject_old_unordered_data(struct sctp_tcb *stcb,
930     struct sctp_association *asoc,
931     struct sctp_queued_to_read *control,
932     struct sctp_tmit_chunk *chk,
933     int *abort_flag)
934 {
935         struct sctp_tmit_chunk *at;
936         int inserted;
937
938         /*
939          * Here we need to place the chunk into the control structure sorted
940          * in the correct order.
941          */
942         if (chk->rec.data.rcv_flags & SCTP_DATA_FIRST_FRAG) {
943                 /* Its the very first one. */
944                 SCTPDBG(SCTP_DEBUG_XXX,
945                     "chunk is a first fsn: %u becomes fsn_included\n",
946                     chk->rec.data.fsn);
947                 if (control->first_frag_seen) {
948                         /*
949                          * In old un-ordered we can reassembly on one
950                          * control multiple messages. As long as the next
951                          * FIRST is greater then the old first (TSN i.e. FSN
952                          * wise)
953                          */
954                         struct mbuf *tdata;
955                         uint32_t tmp;
956
957                         if (SCTP_TSN_GT(chk->rec.data.fsn, control->fsn_included)) {
958                                 /*
959                                  * Easy way the start of a new guy beyond
960                                  * the lowest
961                                  */
962                                 goto place_chunk;
963                         }
964                         if ((chk->rec.data.fsn == control->fsn_included) ||
965                             (control->pdapi_started)) {
966                                 /*
967                                  * Ok this should not happen, if it does we
968                                  * started the pd-api on the higher TSN
969                                  * (since the equals part is a TSN failure
970                                  * it must be that).
971                                  *
972                                  * We are completly hosed in that case since
973                                  * I have no way to recover. This really
974                                  * will only happen if we can get more TSN's
975                                  * higher before the pd-api-point.
976                                  */
977                                 sctp_abort_in_reasm(stcb, control, chk,
978                                     abort_flag,
979                                     SCTP_FROM_SCTP_INDATA + SCTP_LOC_4);
980
981                                 return;
982                         }
983                         /*
984                          * Ok we have two firsts and the one we just got is
985                          * smaller than the one we previously placed.. yuck!
986                          * We must swap them out.
987                          */
988                         /* swap the mbufs */
989                         tdata = control->data;
990                         control->data = chk->data;
991                         chk->data = tdata;
992                         /* Save the lengths */
993                         chk->send_size = control->length;
994                         /* Recompute length of control and tail pointer */
995                         sctp_setup_tail_pointer(control);
996                         /* Fix the FSN included */
997                         tmp = control->fsn_included;
998                         control->fsn_included = chk->rec.data.fsn;
999                         chk->rec.data.fsn = tmp;
1000                         /* Fix the TSN included */
1001                         tmp = control->sinfo_tsn;
1002                         control->sinfo_tsn = chk->rec.data.tsn;
1003                         chk->rec.data.tsn = tmp;
1004                         /* Fix the PPID included */
1005                         tmp = control->sinfo_ppid;
1006                         control->sinfo_ppid = chk->rec.data.ppid;
1007                         chk->rec.data.ppid = tmp;
1008                         /* Fix tail pointer */
1009                         goto place_chunk;
1010                 }
1011                 control->first_frag_seen = 1;
1012                 control->fsn_included = chk->rec.data.fsn;
1013                 control->top_fsn = chk->rec.data.fsn;
1014                 control->sinfo_tsn = chk->rec.data.tsn;
1015                 control->sinfo_ppid = chk->rec.data.ppid;
1016                 control->data = chk->data;
1017                 sctp_mark_non_revokable(asoc, chk->rec.data.tsn);
1018                 chk->data = NULL;
1019                 sctp_free_a_chunk(stcb, chk, SCTP_SO_NOT_LOCKED);
1020                 sctp_setup_tail_pointer(control);
1021                 return;
1022         }
1023 place_chunk:
1024         inserted = 0;
1025         TAILQ_FOREACH(at, &control->reasm, sctp_next) {
1026                 if (SCTP_TSN_GT(at->rec.data.fsn, chk->rec.data.fsn)) {
1027                         /*
1028                          * This one in queue is bigger than the new one,
1029                          * insert the new one before at.
1030                          */
1031                         asoc->size_on_reasm_queue += chk->send_size;
1032                         sctp_ucount_incr(asoc->cnt_on_reasm_queue);
1033                         inserted = 1;
1034                         TAILQ_INSERT_BEFORE(at, chk, sctp_next);
1035                         break;
1036                 } else if (at->rec.data.fsn == chk->rec.data.fsn) {
1037                         /*
1038                          * They sent a duplicate fsn number. This really
1039                          * should not happen since the FSN is a TSN and it
1040                          * should have been dropped earlier.
1041                          */
1042                         sctp_abort_in_reasm(stcb, control, chk,
1043                             abort_flag,
1044                             SCTP_FROM_SCTP_INDATA + SCTP_LOC_5);
1045                         return;
1046                 }
1047         }
1048         if (inserted == 0) {
1049                 /* Its at the end */
1050                 asoc->size_on_reasm_queue += chk->send_size;
1051                 sctp_ucount_incr(asoc->cnt_on_reasm_queue);
1052                 control->top_fsn = chk->rec.data.fsn;
1053                 TAILQ_INSERT_TAIL(&control->reasm, chk, sctp_next);
1054         }
1055 }
1056
1057 static int
1058 sctp_deliver_reasm_check(struct sctp_tcb *stcb, struct sctp_association *asoc,
1059     struct sctp_stream_in *strm, int inp_read_lock_held)
1060 {
1061         /*
1062          * Given a stream, strm, see if any of the SSN's on it that are
1063          * fragmented are ready to deliver. If so go ahead and place them on
1064          * the read queue. In so placing if we have hit the end, then we
1065          * need to remove them from the stream's queue.
1066          */
1067         struct sctp_queued_to_read *control, *nctl = NULL;
1068         uint32_t next_to_del;
1069         uint32_t pd_point;
1070         int ret = 0;
1071
1072         if (stcb->sctp_socket) {
1073                 pd_point = min(SCTP_SB_LIMIT_RCV(stcb->sctp_socket) >> SCTP_PARTIAL_DELIVERY_SHIFT,
1074                     stcb->sctp_ep->partial_delivery_point);
1075         } else {
1076                 pd_point = stcb->sctp_ep->partial_delivery_point;
1077         }
1078         control = TAILQ_FIRST(&strm->uno_inqueue);
1079
1080         if ((control != NULL) &&
1081             (asoc->idata_supported == 0)) {
1082                 /* Special handling needed for "old" data format */
1083                 if (sctp_handle_old_unordered_data(stcb, asoc, strm, control, pd_point, inp_read_lock_held)) {
1084                         goto done_un;
1085                 }
1086         }
1087         if (strm->pd_api_started) {
1088                 /* Can't add more */
1089                 return (0);
1090         }
1091         while (control) {
1092                 SCTPDBG(SCTP_DEBUG_XXX, "Looking at control: %p e(%d) ssn: %u top_fsn: %u inc_fsn: %u -uo\n",
1093                     control, control->end_added, control->mid, control->top_fsn, control->fsn_included);
1094                 nctl = TAILQ_NEXT(control, next_instrm);
1095                 if (control->end_added) {
1096                         /* We just put the last bit on */
1097                         if (control->on_strm_q) {
1098 #ifdef INVARIANTS
1099                                 if (control->on_strm_q != SCTP_ON_UNORDERED) {
1100                                         panic("Huh control: %p on_q: %d -- not unordered?",
1101                                             control, control->on_strm_q);
1102                                 }
1103 #endif
1104                                 SCTP_STAT_INCR_COUNTER64(sctps_reasmusrmsgs);
1105                                 TAILQ_REMOVE(&strm->uno_inqueue, control, next_instrm);
1106                                 control->on_strm_q = 0;
1107                         }
1108                         if (control->on_read_q == 0) {
1109                                 sctp_add_to_readq(stcb->sctp_ep, stcb,
1110                                     control,
1111                                     &stcb->sctp_socket->so_rcv, control->end_added,
1112                                     inp_read_lock_held, SCTP_SO_NOT_LOCKED);
1113                         }
1114                 } else {
1115                         /* Can we do a PD-API for this un-ordered guy? */
1116                         if ((control->length >= pd_point) && (strm->pd_api_started == 0)) {
1117                                 strm->pd_api_started = 1;
1118                                 control->pdapi_started = 1;
1119                                 sctp_add_to_readq(stcb->sctp_ep, stcb,
1120                                     control,
1121                                     &stcb->sctp_socket->so_rcv, control->end_added,
1122                                     inp_read_lock_held, SCTP_SO_NOT_LOCKED);
1123
1124                                 break;
1125                         }
1126                 }
1127                 control = nctl;
1128         }
1129 done_un:
1130         control = TAILQ_FIRST(&strm->inqueue);
1131         if (strm->pd_api_started) {
1132                 /* Can't add more */
1133                 return (0);
1134         }
1135         if (control == NULL) {
1136                 return (ret);
1137         }
1138         if (SCTP_MID_EQ(asoc->idata_supported, strm->last_mid_delivered, control->mid)) {
1139                 /*
1140                  * Ok the guy at the top was being partially delivered
1141                  * completed, so we remove it. Note the pd_api flag was
1142                  * taken off when the chunk was merged on in
1143                  * sctp_queue_data_for_reasm below.
1144                  */
1145                 nctl = TAILQ_NEXT(control, next_instrm);
1146                 SCTPDBG(SCTP_DEBUG_XXX,
1147                     "Looking at control: %p e(%d) ssn: %u top_fsn: %u inc_fsn: %u (lastdel: %u)- o\n",
1148                     control, control->end_added, control->mid,
1149                     control->top_fsn, control->fsn_included,
1150                     strm->last_mid_delivered);
1151                 if (control->end_added) {
1152                         if (control->on_strm_q) {
1153 #ifdef INVARIANTS
1154                                 if (control->on_strm_q != SCTP_ON_ORDERED) {
1155                                         panic("Huh control: %p on_q: %d -- not ordered?",
1156                                             control, control->on_strm_q);
1157                                 }
1158 #endif
1159                                 SCTP_STAT_INCR_COUNTER64(sctps_reasmusrmsgs);
1160                                 TAILQ_REMOVE(&strm->inqueue, control, next_instrm);
1161                                 if (asoc->size_on_all_streams >= control->length) {
1162                                         asoc->size_on_all_streams -= control->length;
1163                                 } else {
1164 #ifdef INVARIANTS
1165                                         panic("size_on_all_streams = %u smaller than control length %u", asoc->size_on_all_streams, control->length);
1166 #else
1167                                         asoc->size_on_all_streams = 0;
1168 #endif
1169                                 }
1170                                 sctp_ucount_decr(asoc->cnt_on_all_streams);
1171                                 control->on_strm_q = 0;
1172                         }
1173                         if (strm->pd_api_started && control->pdapi_started) {
1174                                 control->pdapi_started = 0;
1175                                 strm->pd_api_started = 0;
1176                         }
1177                         if (control->on_read_q == 0) {
1178                                 sctp_add_to_readq(stcb->sctp_ep, stcb,
1179                                     control,
1180                                     &stcb->sctp_socket->so_rcv, control->end_added,
1181                                     inp_read_lock_held, SCTP_SO_NOT_LOCKED);
1182                         }
1183                         control = nctl;
1184                 }
1185         }
1186         if (strm->pd_api_started) {
1187                 /*
1188                  * Can't add more must have gotten an un-ordered above being
1189                  * partially delivered.
1190                  */
1191                 return (0);
1192         }
1193 deliver_more:
1194         next_to_del = strm->last_mid_delivered + 1;
1195         if (control) {
1196                 SCTPDBG(SCTP_DEBUG_XXX,
1197                     "Looking at control: %p e(%d) ssn: %u top_fsn: %u inc_fsn: %u (nxtdel: %u)- o\n",
1198                     control, control->end_added, control->mid, control->top_fsn, control->fsn_included,
1199                     next_to_del);
1200                 nctl = TAILQ_NEXT(control, next_instrm);
1201                 if (SCTP_MID_EQ(asoc->idata_supported, control->mid, next_to_del) &&
1202                     (control->first_frag_seen)) {
1203                         int done;
1204
1205                         /* Ok we can deliver it onto the stream. */
1206                         if (control->end_added) {
1207                                 /* We are done with it afterwards */
1208                                 if (control->on_strm_q) {
1209 #ifdef INVARIANTS
1210                                         if (control->on_strm_q != SCTP_ON_ORDERED) {
1211                                                 panic("Huh control: %p on_q: %d -- not ordered?",
1212                                                     control, control->on_strm_q);
1213                                         }
1214 #endif
1215                                         SCTP_STAT_INCR_COUNTER64(sctps_reasmusrmsgs);
1216                                         TAILQ_REMOVE(&strm->inqueue, control, next_instrm);
1217                                         if (asoc->size_on_all_streams >= control->length) {
1218                                                 asoc->size_on_all_streams -= control->length;
1219                                         } else {
1220 #ifdef INVARIANTS
1221                                                 panic("size_on_all_streams = %u smaller than control length %u", asoc->size_on_all_streams, control->length);
1222 #else
1223                                                 asoc->size_on_all_streams = 0;
1224 #endif
1225                                         }
1226                                         sctp_ucount_decr(asoc->cnt_on_all_streams);
1227                                         control->on_strm_q = 0;
1228                                 }
1229                                 ret++;
1230                         }
1231                         if (((control->sinfo_flags >> 8) & SCTP_DATA_NOT_FRAG) == SCTP_DATA_NOT_FRAG) {
1232                                 /*
1233                                  * A singleton now slipping through - mark
1234                                  * it non-revokable too
1235                                  */
1236                                 sctp_mark_non_revokable(asoc, control->sinfo_tsn);
1237                         } else if (control->end_added == 0) {
1238                                 /*
1239                                  * Check if we can defer adding until its
1240                                  * all there
1241                                  */
1242                                 if ((control->length < pd_point) || (strm->pd_api_started)) {
1243                                         /*
1244                                          * Don't need it or cannot add more
1245                                          * (one being delivered that way)
1246                                          */
1247                                         goto out;
1248                                 }
1249                         }
1250                         done = (control->end_added) && (control->last_frag_seen);
1251                         if (control->on_read_q == 0) {
1252                                 if (!done) {
1253                                         if (asoc->size_on_all_streams >= control->length) {
1254                                                 asoc->size_on_all_streams -= control->length;
1255                                         } else {
1256 #ifdef INVARIANTS
1257                                                 panic("size_on_all_streams = %u smaller than control length %u", asoc->size_on_all_streams, control->length);
1258 #else
1259                                                 asoc->size_on_all_streams = 0;
1260 #endif
1261                                         }
1262                                         strm->pd_api_started = 1;
1263                                         control->pdapi_started = 1;
1264                                 }
1265                                 sctp_add_to_readq(stcb->sctp_ep, stcb,
1266                                     control,
1267                                     &stcb->sctp_socket->so_rcv, control->end_added,
1268                                     inp_read_lock_held, SCTP_SO_NOT_LOCKED);
1269                         }
1270                         strm->last_mid_delivered = next_to_del;
1271                         if (done) {
1272                                 control = nctl;
1273                                 goto deliver_more;
1274                         }
1275                 }
1276         }
1277 out:
1278         return (ret);
1279 }
1280
1281
1282 uint32_t
1283 sctp_add_chk_to_control(struct sctp_queued_to_read *control,
1284     struct sctp_stream_in *strm,
1285     struct sctp_tcb *stcb, struct sctp_association *asoc,
1286     struct sctp_tmit_chunk *chk, int hold_rlock)
1287 {
1288         /*
1289          * Given a control and a chunk, merge the data from the chk onto the
1290          * control and free up the chunk resources.
1291          */
1292         uint32_t added = 0;
1293         int i_locked = 0;
1294
1295         if (control->on_read_q && (hold_rlock == 0)) {
1296                 /*
1297                  * Its being pd-api'd so we must do some locks.
1298                  */
1299                 SCTP_INP_READ_LOCK(stcb->sctp_ep);
1300                 i_locked = 1;
1301         }
1302         if (control->data == NULL) {
1303                 control->data = chk->data;
1304                 sctp_setup_tail_pointer(control);
1305         } else {
1306                 sctp_add_to_tail_pointer(control, chk->data, &added);
1307         }
1308         control->fsn_included = chk->rec.data.fsn;
1309         asoc->size_on_reasm_queue -= chk->send_size;
1310         sctp_ucount_decr(asoc->cnt_on_reasm_queue);
1311         sctp_mark_non_revokable(asoc, chk->rec.data.tsn);
1312         chk->data = NULL;
1313         if (chk->rec.data.rcv_flags & SCTP_DATA_FIRST_FRAG) {
1314                 control->first_frag_seen = 1;
1315                 control->sinfo_tsn = chk->rec.data.tsn;
1316                 control->sinfo_ppid = chk->rec.data.ppid;
1317         }
1318         if (chk->rec.data.rcv_flags & SCTP_DATA_LAST_FRAG) {
1319                 /* Its complete */
1320                 if ((control->on_strm_q) && (control->on_read_q)) {
1321                         if (control->pdapi_started) {
1322                                 control->pdapi_started = 0;
1323                                 strm->pd_api_started = 0;
1324                         }
1325                         if (control->on_strm_q == SCTP_ON_UNORDERED) {
1326                                 /* Unordered */
1327                                 TAILQ_REMOVE(&strm->uno_inqueue, control, next_instrm);
1328                                 control->on_strm_q = 0;
1329                         } else if (control->on_strm_q == SCTP_ON_ORDERED) {
1330                                 /* Ordered */
1331                                 TAILQ_REMOVE(&strm->inqueue, control, next_instrm);
1332                                 /*
1333                                  * Don't need to decrement
1334                                  * size_on_all_streams, since control is on
1335                                  * the read queue.
1336                                  */
1337                                 sctp_ucount_decr(asoc->cnt_on_all_streams);
1338                                 control->on_strm_q = 0;
1339 #ifdef INVARIANTS
1340                         } else if (control->on_strm_q) {
1341                                 panic("Unknown state on ctrl: %p on_strm_q: %d", control,
1342                                     control->on_strm_q);
1343 #endif
1344                         }
1345                 }
1346                 control->end_added = 1;
1347                 control->last_frag_seen = 1;
1348         }
1349         if (i_locked) {
1350                 SCTP_INP_READ_UNLOCK(stcb->sctp_ep);
1351         }
1352         sctp_free_a_chunk(stcb, chk, SCTP_SO_NOT_LOCKED);
1353         return (added);
1354 }
1355
1356 /*
1357  * Dump onto the re-assembly queue, in its proper place. After dumping on the
1358  * queue, see if anthing can be delivered. If so pull it off (or as much as
1359  * we can. If we run out of space then we must dump what we can and set the
1360  * appropriate flag to say we queued what we could.
1361  */
1362 static void
1363 sctp_queue_data_for_reasm(struct sctp_tcb *stcb, struct sctp_association *asoc,
1364     struct sctp_queued_to_read *control,
1365     struct sctp_tmit_chunk *chk,
1366     int created_control,
1367     int *abort_flag, uint32_t tsn)
1368 {
1369         uint32_t next_fsn;
1370         struct sctp_tmit_chunk *at, *nat;
1371         struct sctp_stream_in *strm;
1372         int do_wakeup, unordered;
1373         uint32_t lenadded;
1374
1375         strm = &asoc->strmin[control->sinfo_stream];
1376         /*
1377          * For old un-ordered data chunks.
1378          */
1379         if ((control->sinfo_flags >> 8) & SCTP_DATA_UNORDERED) {
1380                 unordered = 1;
1381         } else {
1382                 unordered = 0;
1383         }
1384         /* Must be added to the stream-in queue */
1385         if (created_control) {
1386                 if (unordered == 0) {
1387                         sctp_ucount_incr(asoc->cnt_on_all_streams);
1388                 }
1389                 if (sctp_place_control_in_stream(strm, asoc, control)) {
1390                         /* Duplicate SSN? */
1391                         sctp_abort_in_reasm(stcb, control, chk,
1392                             abort_flag,
1393                             SCTP_FROM_SCTP_INDATA + SCTP_LOC_6);
1394                         sctp_clean_up_control(stcb, control);
1395                         return;
1396                 }
1397                 if ((tsn == (asoc->cumulative_tsn + 1) && (asoc->idata_supported == 0))) {
1398                         /*
1399                          * Ok we created this control and now lets validate
1400                          * that its legal i.e. there is a B bit set, if not
1401                          * and we have up to the cum-ack then its invalid.
1402                          */
1403                         if ((chk->rec.data.rcv_flags & SCTP_DATA_FIRST_FRAG) == 0) {
1404                                 sctp_abort_in_reasm(stcb, control, chk,
1405                                     abort_flag,
1406                                     SCTP_FROM_SCTP_INDATA + SCTP_LOC_7);
1407                                 return;
1408                         }
1409                 }
1410         }
1411         if ((asoc->idata_supported == 0) && (unordered == 1)) {
1412                 sctp_inject_old_unordered_data(stcb, asoc, control, chk, abort_flag);
1413                 return;
1414         }
1415         /*
1416          * Ok we must queue the chunk into the reasembly portion: o if its
1417          * the first it goes to the control mbuf. o if its not first but the
1418          * next in sequence it goes to the control, and each succeeding one
1419          * in order also goes. o if its not in order we place it on the list
1420          * in its place.
1421          */
1422         if (chk->rec.data.rcv_flags & SCTP_DATA_FIRST_FRAG) {
1423                 /* Its the very first one. */
1424                 SCTPDBG(SCTP_DEBUG_XXX,
1425                     "chunk is a first fsn: %u becomes fsn_included\n",
1426                     chk->rec.data.fsn);
1427                 if (control->first_frag_seen) {
1428                         /*
1429                          * Error on senders part, they either sent us two
1430                          * data chunks with FIRST, or they sent two
1431                          * un-ordered chunks that were fragmented at the
1432                          * same time in the same stream.
1433                          */
1434                         sctp_abort_in_reasm(stcb, control, chk,
1435                             abort_flag,
1436                             SCTP_FROM_SCTP_INDATA + SCTP_LOC_8);
1437                         return;
1438                 }
1439                 control->first_frag_seen = 1;
1440                 control->sinfo_ppid = chk->rec.data.ppid;
1441                 control->sinfo_tsn = chk->rec.data.tsn;
1442                 control->fsn_included = chk->rec.data.fsn;
1443                 control->data = chk->data;
1444                 sctp_mark_non_revokable(asoc, chk->rec.data.tsn);
1445                 chk->data = NULL;
1446                 sctp_free_a_chunk(stcb, chk, SCTP_SO_NOT_LOCKED);
1447                 sctp_setup_tail_pointer(control);
1448                 asoc->size_on_all_streams += control->length;
1449         } else {
1450                 /* Place the chunk in our list */
1451                 int inserted = 0;
1452
1453                 if (control->last_frag_seen == 0) {
1454                         /* Still willing to raise highest FSN seen */
1455                         if (SCTP_TSN_GT(chk->rec.data.fsn, control->top_fsn)) {
1456                                 SCTPDBG(SCTP_DEBUG_XXX,
1457                                     "We have a new top_fsn: %u\n",
1458                                     chk->rec.data.fsn);
1459                                 control->top_fsn = chk->rec.data.fsn;
1460                         }
1461                         if (chk->rec.data.rcv_flags & SCTP_DATA_LAST_FRAG) {
1462                                 SCTPDBG(SCTP_DEBUG_XXX,
1463                                     "The last fsn is now in place fsn: %u\n",
1464                                     chk->rec.data.fsn);
1465                                 control->last_frag_seen = 1;
1466                         }
1467                         if (asoc->idata_supported || control->first_frag_seen) {
1468                                 /*
1469                                  * For IDATA we always check since we know
1470                                  * that the first fragment is 0. For old
1471                                  * DATA we have to receive the first before
1472                                  * we know the first FSN (which is the TSN).
1473                                  */
1474                                 if (SCTP_TSN_GE(control->fsn_included, chk->rec.data.fsn)) {
1475                                         /*
1476                                          * We have already delivered up to
1477                                          * this so its a dup
1478                                          */
1479                                         sctp_abort_in_reasm(stcb, control, chk,
1480                                             abort_flag,
1481                                             SCTP_FROM_SCTP_INDATA + SCTP_LOC_9);
1482                                         return;
1483                                 }
1484                         }
1485                 } else {
1486                         if (chk->rec.data.rcv_flags & SCTP_DATA_LAST_FRAG) {
1487                                 /* Second last? huh? */
1488                                 SCTPDBG(SCTP_DEBUG_XXX,
1489                                     "Duplicate last fsn: %u (top: %u) -- abort\n",
1490                                     chk->rec.data.fsn, control->top_fsn);
1491                                 sctp_abort_in_reasm(stcb, control,
1492                                     chk, abort_flag,
1493                                     SCTP_FROM_SCTP_INDATA + SCTP_LOC_10);
1494                                 return;
1495                         }
1496                         if (asoc->idata_supported || control->first_frag_seen) {
1497                                 /*
1498                                  * For IDATA we always check since we know
1499                                  * that the first fragment is 0. For old
1500                                  * DATA we have to receive the first before
1501                                  * we know the first FSN (which is the TSN).
1502                                  */
1503
1504                                 if (SCTP_TSN_GE(control->fsn_included, chk->rec.data.fsn)) {
1505                                         /*
1506                                          * We have already delivered up to
1507                                          * this so its a dup
1508                                          */
1509                                         SCTPDBG(SCTP_DEBUG_XXX,
1510                                             "New fsn: %u is already seen in included_fsn: %u -- abort\n",
1511                                             chk->rec.data.fsn, control->fsn_included);
1512                                         sctp_abort_in_reasm(stcb, control, chk,
1513                                             abort_flag,
1514                                             SCTP_FROM_SCTP_INDATA + SCTP_LOC_11);
1515                                         return;
1516                                 }
1517                         }
1518                         /*
1519                          * validate not beyond top FSN if we have seen last
1520                          * one
1521                          */
1522                         if (SCTP_TSN_GT(chk->rec.data.fsn, control->top_fsn)) {
1523                                 SCTPDBG(SCTP_DEBUG_XXX,
1524                                     "New fsn: %u is beyond or at top_fsn: %u -- abort\n",
1525                                     chk->rec.data.fsn,
1526                                     control->top_fsn);
1527                                 sctp_abort_in_reasm(stcb, control, chk,
1528                                     abort_flag,
1529                                     SCTP_FROM_SCTP_INDATA + SCTP_LOC_12);
1530                                 return;
1531                         }
1532                 }
1533                 /*
1534                  * If we reach here, we need to place the new chunk in the
1535                  * reassembly for this control.
1536                  */
1537                 SCTPDBG(SCTP_DEBUG_XXX,
1538                     "chunk is a not first fsn: %u needs to be inserted\n",
1539                     chk->rec.data.fsn);
1540                 TAILQ_FOREACH(at, &control->reasm, sctp_next) {
1541                         if (SCTP_TSN_GT(at->rec.data.fsn, chk->rec.data.fsn)) {
1542                                 /*
1543                                  * This one in queue is bigger than the new
1544                                  * one, insert the new one before at.
1545                                  */
1546                                 SCTPDBG(SCTP_DEBUG_XXX,
1547                                     "Insert it before fsn: %u\n",
1548                                     at->rec.data.fsn);
1549                                 asoc->size_on_reasm_queue += chk->send_size;
1550                                 sctp_ucount_incr(asoc->cnt_on_reasm_queue);
1551                                 TAILQ_INSERT_BEFORE(at, chk, sctp_next);
1552                                 inserted = 1;
1553                                 break;
1554                         } else if (at->rec.data.fsn == chk->rec.data.fsn) {
1555                                 /*
1556                                  * Gak, He sent me a duplicate str seq
1557                                  * number
1558                                  */
1559                                 /*
1560                                  * foo bar, I guess I will just free this
1561                                  * new guy, should we abort too? FIX ME
1562                                  * MAYBE? Or it COULD be that the SSN's have
1563                                  * wrapped. Maybe I should compare to TSN
1564                                  * somehow... sigh for now just blow away
1565                                  * the chunk!
1566                                  */
1567                                 SCTPDBG(SCTP_DEBUG_XXX,
1568                                     "Duplicate to fsn: %u -- abort\n",
1569                                     at->rec.data.fsn);
1570                                 sctp_abort_in_reasm(stcb, control,
1571                                     chk, abort_flag,
1572                                     SCTP_FROM_SCTP_INDATA + SCTP_LOC_13);
1573                                 return;
1574                         }
1575                 }
1576                 if (inserted == 0) {
1577                         /* Goes on the end */
1578                         SCTPDBG(SCTP_DEBUG_XXX, "Inserting at tail of list fsn: %u\n",
1579                             chk->rec.data.fsn);
1580                         asoc->size_on_reasm_queue += chk->send_size;
1581                         sctp_ucount_incr(asoc->cnt_on_reasm_queue);
1582                         TAILQ_INSERT_TAIL(&control->reasm, chk, sctp_next);
1583                 }
1584         }
1585         /*
1586          * Ok lets see if we can suck any up into the control structure that
1587          * are in seq if it makes sense.
1588          */
1589         do_wakeup = 0;
1590         /*
1591          * If the first fragment has not been seen there is no sense in
1592          * looking.
1593          */
1594         if (control->first_frag_seen) {
1595                 next_fsn = control->fsn_included + 1;
1596                 TAILQ_FOREACH_SAFE(at, &control->reasm, sctp_next, nat) {
1597                         if (at->rec.data.fsn == next_fsn) {
1598                                 /* We can add this one now to the control */
1599                                 SCTPDBG(SCTP_DEBUG_XXX,
1600                                     "Adding more to control: %p at: %p fsn: %u next_fsn: %u included: %u\n",
1601                                     control, at,
1602                                     at->rec.data.fsn,
1603                                     next_fsn, control->fsn_included);
1604                                 TAILQ_REMOVE(&control->reasm, at, sctp_next);
1605                                 lenadded = sctp_add_chk_to_control(control, strm, stcb, asoc, at, SCTP_READ_LOCK_NOT_HELD);
1606                                 if (control->on_read_q) {
1607                                         do_wakeup = 1;
1608                                 } else {
1609                                         /*
1610                                          * We only add to the
1611                                          * size-on-all-streams if its not on
1612                                          * the read q. The read q flag will
1613                                          * cause a sballoc so its accounted
1614                                          * for there.
1615                                          */
1616                                         asoc->size_on_all_streams += lenadded;
1617                                 }
1618                                 next_fsn++;
1619                                 if (control->end_added && control->pdapi_started) {
1620                                         if (strm->pd_api_started) {
1621                                                 strm->pd_api_started = 0;
1622                                                 control->pdapi_started = 0;
1623                                         }
1624                                         if (control->on_read_q == 0) {
1625                                                 sctp_add_to_readq(stcb->sctp_ep, stcb,
1626                                                     control,
1627                                                     &stcb->sctp_socket->so_rcv, control->end_added,
1628                                                     SCTP_READ_LOCK_NOT_HELD, SCTP_SO_NOT_LOCKED);
1629                                         }
1630                                         break;
1631                                 }
1632                         } else {
1633                                 break;
1634                         }
1635                 }
1636         }
1637         if (do_wakeup) {
1638                 /* Need to wakeup the reader */
1639                 sctp_wakeup_the_read_socket(stcb->sctp_ep, stcb, SCTP_SO_NOT_LOCKED);
1640         }
1641 }
1642
1643 static struct sctp_queued_to_read *
1644 sctp_find_reasm_entry(struct sctp_stream_in *strm, uint32_t mid, int ordered, int idata_supported)
1645 {
1646         struct sctp_queued_to_read *control;
1647
1648         if (ordered) {
1649                 TAILQ_FOREACH(control, &strm->inqueue, next_instrm) {
1650                         if (SCTP_MID_EQ(idata_supported, control->mid, mid)) {
1651                                 break;
1652                         }
1653                 }
1654         } else {
1655                 if (idata_supported) {
1656                         TAILQ_FOREACH(control, &strm->uno_inqueue, next_instrm) {
1657                                 if (SCTP_MID_EQ(idata_supported, control->mid, mid)) {
1658                                         break;
1659                                 }
1660                         }
1661                 } else {
1662                         control = TAILQ_FIRST(&strm->uno_inqueue);
1663                 }
1664         }
1665         return (control);
1666 }
1667
1668 static int
1669 sctp_process_a_data_chunk(struct sctp_tcb *stcb, struct sctp_association *asoc,
1670     struct mbuf **m, int offset, int chk_length,
1671     struct sctp_nets *net, uint32_t *high_tsn, int *abort_flag,
1672     int *break_flag, int last_chunk, uint8_t chk_type)
1673 {
1674         /* Process a data chunk */
1675         /* struct sctp_tmit_chunk *chk; */
1676         struct sctp_tmit_chunk *chk;
1677         uint32_t tsn, fsn, gap, mid;
1678         struct mbuf *dmbuf;
1679         int the_len;
1680         int need_reasm_check = 0;
1681         uint16_t sid;
1682         struct mbuf *op_err;
1683         char msg[SCTP_DIAG_INFO_LEN];
1684         struct sctp_queued_to_read *control, *ncontrol;
1685         uint32_t ppid;
1686         uint8_t chk_flags;
1687         struct sctp_stream_reset_list *liste;
1688         int ordered;
1689         size_t clen;
1690         int created_control = 0;
1691
1692         if (chk_type == SCTP_IDATA) {
1693                 struct sctp_idata_chunk *chunk, chunk_buf;
1694
1695                 chunk = (struct sctp_idata_chunk *)sctp_m_getptr(*m, offset,
1696                     sizeof(struct sctp_idata_chunk), (uint8_t *)&chunk_buf);
1697                 chk_flags = chunk->ch.chunk_flags;
1698                 clen = sizeof(struct sctp_idata_chunk);
1699                 tsn = ntohl(chunk->dp.tsn);
1700                 sid = ntohs(chunk->dp.sid);
1701                 mid = ntohl(chunk->dp.mid);
1702                 if (chk_flags & SCTP_DATA_FIRST_FRAG) {
1703                         fsn = 0;
1704                         ppid = chunk->dp.ppid_fsn.ppid;
1705                 } else {
1706                         fsn = ntohl(chunk->dp.ppid_fsn.fsn);
1707                         ppid = 0xffffffff;      /* Use as an invalid value. */
1708                 }
1709         } else {
1710                 struct sctp_data_chunk *chunk, chunk_buf;
1711
1712                 chunk = (struct sctp_data_chunk *)sctp_m_getptr(*m, offset,
1713                     sizeof(struct sctp_data_chunk), (uint8_t *)&chunk_buf);
1714                 chk_flags = chunk->ch.chunk_flags;
1715                 clen = sizeof(struct sctp_data_chunk);
1716                 tsn = ntohl(chunk->dp.tsn);
1717                 sid = ntohs(chunk->dp.sid);
1718                 mid = (uint32_t)(ntohs(chunk->dp.ssn));
1719                 fsn = tsn;
1720                 ppid = chunk->dp.ppid;
1721         }
1722         if ((size_t)chk_length == clen) {
1723                 /*
1724                  * Need to send an abort since we had a empty data chunk.
1725                  */
1726                 op_err = sctp_generate_no_user_data_cause(tsn);
1727                 stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_14;
1728                 sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED);
1729                 *abort_flag = 1;
1730                 return (0);
1731         }
1732         if ((chk_flags & SCTP_DATA_SACK_IMMEDIATELY) == SCTP_DATA_SACK_IMMEDIATELY) {
1733                 asoc->send_sack = 1;
1734         }
1735         ordered = ((chk_flags & SCTP_DATA_UNORDERED) == 0);
1736         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MAP_LOGGING_ENABLE) {
1737                 sctp_log_map(tsn, asoc->cumulative_tsn, asoc->highest_tsn_inside_map, SCTP_MAP_TSN_ENTERS);
1738         }
1739         if (stcb == NULL) {
1740                 return (0);
1741         }
1742         SCTP_LTRACE_CHK(stcb->sctp_ep, stcb, chk_type, tsn);
1743         if (SCTP_TSN_GE(asoc->cumulative_tsn, tsn)) {
1744                 /* It is a duplicate */
1745                 SCTP_STAT_INCR(sctps_recvdupdata);
1746                 if (asoc->numduptsns < SCTP_MAX_DUP_TSNS) {
1747                         /* Record a dup for the next outbound sack */
1748                         asoc->dup_tsns[asoc->numduptsns] = tsn;
1749                         asoc->numduptsns++;
1750                 }
1751                 asoc->send_sack = 1;
1752                 return (0);
1753         }
1754         /* Calculate the number of TSN's between the base and this TSN */
1755         SCTP_CALC_TSN_TO_GAP(gap, tsn, asoc->mapping_array_base_tsn);
1756         if (gap >= (SCTP_MAPPING_ARRAY << 3)) {
1757                 /* Can't hold the bit in the mapping at max array, toss it */
1758                 return (0);
1759         }
1760         if (gap >= (uint32_t)(asoc->mapping_array_size << 3)) {
1761                 SCTP_TCB_LOCK_ASSERT(stcb);
1762                 if (sctp_expand_mapping_array(asoc, gap)) {
1763                         /* Can't expand, drop it */
1764                         return (0);
1765                 }
1766         }
1767         if (SCTP_TSN_GT(tsn, *high_tsn)) {
1768                 *high_tsn = tsn;
1769         }
1770         /* See if we have received this one already */
1771         if (SCTP_IS_TSN_PRESENT(asoc->mapping_array, gap) ||
1772             SCTP_IS_TSN_PRESENT(asoc->nr_mapping_array, gap)) {
1773                 SCTP_STAT_INCR(sctps_recvdupdata);
1774                 if (asoc->numduptsns < SCTP_MAX_DUP_TSNS) {
1775                         /* Record a dup for the next outbound sack */
1776                         asoc->dup_tsns[asoc->numduptsns] = tsn;
1777                         asoc->numduptsns++;
1778                 }
1779                 asoc->send_sack = 1;
1780                 return (0);
1781         }
1782         /*
1783          * Check to see about the GONE flag, duplicates would cause a sack
1784          * to be sent up above
1785          */
1786         if (((stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_GONE) ||
1787             (stcb->sctp_ep->sctp_flags & SCTP_PCB_FLAGS_SOCKET_ALLGONE) ||
1788             (stcb->asoc.state & SCTP_STATE_CLOSED_SOCKET))) {
1789                 /*
1790                  * wait a minute, this guy is gone, there is no longer a
1791                  * receiver. Send peer an ABORT!
1792                  */
1793                 op_err = sctp_generate_cause(SCTP_CAUSE_OUT_OF_RESC, "");
1794                 sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED);
1795                 *abort_flag = 1;
1796                 return (0);
1797         }
1798         /*
1799          * Now before going further we see if there is room. If NOT then we
1800          * MAY let one through only IF this TSN is the one we are waiting
1801          * for on a partial delivery API.
1802          */
1803
1804         /* Is the stream valid? */
1805         if (sid >= asoc->streamincnt) {
1806                 struct sctp_error_invalid_stream *cause;
1807
1808                 op_err = sctp_get_mbuf_for_msg(sizeof(struct sctp_error_invalid_stream),
1809                     0, M_NOWAIT, 1, MT_DATA);
1810                 if (op_err != NULL) {
1811                         /* add some space up front so prepend will work well */
1812                         SCTP_BUF_RESV_UF(op_err, sizeof(struct sctp_chunkhdr));
1813                         cause = mtod(op_err, struct sctp_error_invalid_stream *);
1814                         /*
1815                          * Error causes are just param's and this one has
1816                          * two back to back phdr, one with the error type
1817                          * and size, the other with the streamid and a rsvd
1818                          */
1819                         SCTP_BUF_LEN(op_err) = sizeof(struct sctp_error_invalid_stream);
1820                         cause->cause.code = htons(SCTP_CAUSE_INVALID_STREAM);
1821                         cause->cause.length = htons(sizeof(struct sctp_error_invalid_stream));
1822                         cause->stream_id = htons(sid);
1823                         cause->reserved = htons(0);
1824                         sctp_queue_op_err(stcb, op_err);
1825                 }
1826                 SCTP_STAT_INCR(sctps_badsid);
1827                 SCTP_TCB_LOCK_ASSERT(stcb);
1828                 SCTP_SET_TSN_PRESENT(asoc->nr_mapping_array, gap);
1829                 if (SCTP_TSN_GT(tsn, asoc->highest_tsn_inside_nr_map)) {
1830                         asoc->highest_tsn_inside_nr_map = tsn;
1831                 }
1832                 if (tsn == (asoc->cumulative_tsn + 1)) {
1833                         /* Update cum-ack */
1834                         asoc->cumulative_tsn = tsn;
1835                 }
1836                 return (0);
1837         }
1838         /*
1839          * If its a fragmented message, lets see if we can find the control
1840          * on the reassembly queues.
1841          */
1842         if ((chk_type == SCTP_IDATA) &&
1843             ((chk_flags & SCTP_DATA_FIRST_FRAG) == 0) &&
1844             (fsn == 0)) {
1845                 /*
1846                  * The first *must* be fsn 0, and other (middle/end) pieces
1847                  * can *not* be fsn 0. XXX: This can happen in case of a
1848                  * wrap around. Ignore is for now.
1849                  */
1850                 snprintf(msg, sizeof(msg), "FSN zero for MID=%8.8x, but flags=%2.2x",
1851                     mid, chk_flags);
1852                 goto err_out;
1853         }
1854         control = sctp_find_reasm_entry(&asoc->strmin[sid], mid, ordered, asoc->idata_supported);
1855         SCTPDBG(SCTP_DEBUG_XXX, "chunk_flags:0x%x look for control on queues %p\n",
1856             chk_flags, control);
1857         if ((chk_flags & SCTP_DATA_NOT_FRAG) != SCTP_DATA_NOT_FRAG) {
1858                 /* See if we can find the re-assembly entity */
1859                 if (control != NULL) {
1860                         /* We found something, does it belong? */
1861                         if (ordered && (mid != control->mid)) {
1862                                 snprintf(msg, sizeof(msg), "Reassembly problem (MID=%8.8x)", mid);
1863                 err_out:
1864                                 op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg);
1865                                 stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_15;
1866                                 sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED);
1867                                 *abort_flag = 1;
1868                                 return (0);
1869                         }
1870                         if (ordered && ((control->sinfo_flags >> 8) & SCTP_DATA_UNORDERED)) {
1871                                 /*
1872                                  * We can't have a switched order with an
1873                                  * unordered chunk
1874                                  */
1875                                 snprintf(msg, sizeof(msg), "All fragments of a user message must be ordered or unordered (TSN=%8.8x)",
1876                                     tsn);
1877                                 goto err_out;
1878                         }
1879                         if (!ordered && (((control->sinfo_flags >> 8) & SCTP_DATA_UNORDERED) == 0)) {
1880                                 /*
1881                                  * We can't have a switched unordered with a
1882                                  * ordered chunk
1883                                  */
1884                                 snprintf(msg, sizeof(msg), "All fragments of a user message must be ordered or unordered (TSN=%8.8x)",
1885                                     tsn);
1886                                 goto err_out;
1887                         }
1888                 }
1889         } else {
1890                 /*
1891                  * Its a complete segment. Lets validate we don't have a
1892                  * re-assembly going on with the same Stream/Seq (for
1893                  * ordered) or in the same Stream for unordered.
1894                  */
1895                 if (control != NULL) {
1896                         if (ordered || asoc->idata_supported) {
1897                                 SCTPDBG(SCTP_DEBUG_XXX, "chunk_flags: 0x%x dup detected on MID: %u\n",
1898                                     chk_flags, mid);
1899                                 snprintf(msg, sizeof(msg), "Duplicate MID=%8.8x detected.", mid);
1900                                 goto err_out;
1901                         } else {
1902                                 if ((tsn == control->fsn_included + 1) &&
1903                                     (control->end_added == 0)) {
1904                                         snprintf(msg, sizeof(msg), "Illegal message sequence, missing end for MID: %8.8x", control->fsn_included);
1905                                         goto err_out;
1906                                 } else {
1907                                         control = NULL;
1908                                 }
1909                         }
1910                 }
1911         }
1912         /* now do the tests */
1913         if (((asoc->cnt_on_all_streams +
1914             asoc->cnt_on_reasm_queue +
1915             asoc->cnt_msg_on_sb) >= SCTP_BASE_SYSCTL(sctp_max_chunks_on_queue)) ||
1916             (((int)asoc->my_rwnd) <= 0)) {
1917                 /*
1918                  * When we have NO room in the rwnd we check to make sure
1919                  * the reader is doing its job...
1920                  */
1921                 if (stcb->sctp_socket->so_rcv.sb_cc) {
1922                         /* some to read, wake-up */
1923 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
1924                         struct socket *so;
1925
1926                         so = SCTP_INP_SO(stcb->sctp_ep);
1927                         atomic_add_int(&stcb->asoc.refcnt, 1);
1928                         SCTP_TCB_UNLOCK(stcb);
1929                         SCTP_SOCKET_LOCK(so, 1);
1930                         SCTP_TCB_LOCK(stcb);
1931                         atomic_subtract_int(&stcb->asoc.refcnt, 1);
1932                         if (stcb->asoc.state & SCTP_STATE_CLOSED_SOCKET) {
1933                                 /* assoc was freed while we were unlocked */
1934                                 SCTP_SOCKET_UNLOCK(so, 1);
1935                                 return (0);
1936                         }
1937 #endif
1938                         sctp_sorwakeup(stcb->sctp_ep, stcb->sctp_socket);
1939 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
1940                         SCTP_SOCKET_UNLOCK(so, 1);
1941 #endif
1942                 }
1943                 /* now is it in the mapping array of what we have accepted? */
1944                 if (chk_type == SCTP_DATA) {
1945                         if (SCTP_TSN_GT(tsn, asoc->highest_tsn_inside_map) &&
1946                             SCTP_TSN_GT(tsn, asoc->highest_tsn_inside_nr_map)) {
1947                                 /* Nope not in the valid range dump it */
1948                 dump_packet:
1949                                 sctp_set_rwnd(stcb, asoc);
1950                                 if ((asoc->cnt_on_all_streams +
1951                                     asoc->cnt_on_reasm_queue +
1952                                     asoc->cnt_msg_on_sb) >= SCTP_BASE_SYSCTL(sctp_max_chunks_on_queue)) {
1953                                         SCTP_STAT_INCR(sctps_datadropchklmt);
1954                                 } else {
1955                                         SCTP_STAT_INCR(sctps_datadroprwnd);
1956                                 }
1957                                 *break_flag = 1;
1958                                 return (0);
1959                         }
1960                 } else {
1961                         if (control == NULL) {
1962                                 goto dump_packet;
1963                         }
1964                         if (SCTP_TSN_GT(fsn, control->top_fsn)) {
1965                                 goto dump_packet;
1966                         }
1967                 }
1968         }
1969 #ifdef SCTP_ASOCLOG_OF_TSNS
1970         SCTP_TCB_LOCK_ASSERT(stcb);
1971         if (asoc->tsn_in_at >= SCTP_TSN_LOG_SIZE) {
1972                 asoc->tsn_in_at = 0;
1973                 asoc->tsn_in_wrapped = 1;
1974         }
1975         asoc->in_tsnlog[asoc->tsn_in_at].tsn = tsn;
1976         asoc->in_tsnlog[asoc->tsn_in_at].strm = sid;
1977         asoc->in_tsnlog[asoc->tsn_in_at].seq = mid;
1978         asoc->in_tsnlog[asoc->tsn_in_at].sz = chk_length;
1979         asoc->in_tsnlog[asoc->tsn_in_at].flgs = chunk_flags;
1980         asoc->in_tsnlog[asoc->tsn_in_at].stcb = (void *)stcb;
1981         asoc->in_tsnlog[asoc->tsn_in_at].in_pos = asoc->tsn_in_at;
1982         asoc->in_tsnlog[asoc->tsn_in_at].in_out = 1;
1983         asoc->tsn_in_at++;
1984 #endif
1985         /*
1986          * Before we continue lets validate that we are not being fooled by
1987          * an evil attacker. We can only have Nk chunks based on our TSN
1988          * spread allowed by the mapping array N * 8 bits, so there is no
1989          * way our stream sequence numbers could have wrapped. We of course
1990          * only validate the FIRST fragment so the bit must be set.
1991          */
1992         if ((chk_flags & SCTP_DATA_FIRST_FRAG) &&
1993             (TAILQ_EMPTY(&asoc->resetHead)) &&
1994             (chk_flags & SCTP_DATA_UNORDERED) == 0 &&
1995             SCTP_MID_GE(asoc->idata_supported, asoc->strmin[sid].last_mid_delivered, mid)) {
1996                 /* The incoming sseq is behind where we last delivered? */
1997                 SCTPDBG(SCTP_DEBUG_INDATA1, "EVIL/Broken-Dup S-SEQ: %u delivered: %u from peer, Abort!\n",
1998                     mid, asoc->strmin[sid].last_mid_delivered);
1999
2000                 if (asoc->idata_supported) {
2001                         snprintf(msg, sizeof(msg), "Delivered MID=%8.8x, got TSN=%8.8x, SID=%4.4x, MID=%8.8x",
2002                             asoc->strmin[sid].last_mid_delivered,
2003                             tsn,
2004                             sid,
2005                             mid);
2006                 } else {
2007                         snprintf(msg, sizeof(msg), "Delivered SSN=%4.4x, got TSN=%8.8x, SID=%4.4x, SSN=%4.4x",
2008                             (uint16_t)asoc->strmin[sid].last_mid_delivered,
2009                             tsn,
2010                             sid,
2011                             (uint16_t)mid);
2012                 }
2013                 op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg);
2014                 stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_16;
2015                 sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED);
2016                 *abort_flag = 1;
2017                 return (0);
2018         }
2019         if (chk_type == SCTP_IDATA) {
2020                 the_len = (chk_length - sizeof(struct sctp_idata_chunk));
2021         } else {
2022                 the_len = (chk_length - sizeof(struct sctp_data_chunk));
2023         }
2024         if (last_chunk == 0) {
2025                 if (chk_type == SCTP_IDATA) {
2026                         dmbuf = SCTP_M_COPYM(*m,
2027                             (offset + sizeof(struct sctp_idata_chunk)),
2028                             the_len, M_NOWAIT);
2029                 } else {
2030                         dmbuf = SCTP_M_COPYM(*m,
2031                             (offset + sizeof(struct sctp_data_chunk)),
2032                             the_len, M_NOWAIT);
2033                 }
2034 #ifdef SCTP_MBUF_LOGGING
2035                 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MBUF_LOGGING_ENABLE) {
2036                         sctp_log_mbc(dmbuf, SCTP_MBUF_ICOPY);
2037                 }
2038 #endif
2039         } else {
2040                 /* We can steal the last chunk */
2041                 int l_len;
2042
2043                 dmbuf = *m;
2044                 /* lop off the top part */
2045                 if (chk_type == SCTP_IDATA) {
2046                         m_adj(dmbuf, (offset + sizeof(struct sctp_idata_chunk)));
2047                 } else {
2048                         m_adj(dmbuf, (offset + sizeof(struct sctp_data_chunk)));
2049                 }
2050                 if (SCTP_BUF_NEXT(dmbuf) == NULL) {
2051                         l_len = SCTP_BUF_LEN(dmbuf);
2052                 } else {
2053                         /*
2054                          * need to count up the size hopefully does not hit
2055                          * this to often :-0
2056                          */
2057                         struct mbuf *lat;
2058
2059                         l_len = 0;
2060                         for (lat = dmbuf; lat; lat = SCTP_BUF_NEXT(lat)) {
2061                                 l_len += SCTP_BUF_LEN(lat);
2062                         }
2063                 }
2064                 if (l_len > the_len) {
2065                         /* Trim the end round bytes off  too */
2066                         m_adj(dmbuf, -(l_len - the_len));
2067                 }
2068         }
2069         if (dmbuf == NULL) {
2070                 SCTP_STAT_INCR(sctps_nomem);
2071                 return (0);
2072         }
2073         /*
2074          * Now no matter what, we need a control, get one if we don't have
2075          * one (we may have gotten it above when we found the message was
2076          * fragmented
2077          */
2078         if (control == NULL) {
2079                 sctp_alloc_a_readq(stcb, control);
2080                 sctp_build_readq_entry_mac(control, stcb, asoc->context, net, tsn,
2081                     ppid,
2082                     sid,
2083                     chk_flags,
2084                     NULL, fsn, mid);
2085                 if (control == NULL) {
2086                         SCTP_STAT_INCR(sctps_nomem);
2087                         return (0);
2088                 }
2089                 if ((chk_flags & SCTP_DATA_NOT_FRAG) == SCTP_DATA_NOT_FRAG) {
2090                         struct mbuf *mm;
2091
2092                         control->data = dmbuf;
2093                         for (mm = control->data; mm; mm = mm->m_next) {
2094                                 control->length += SCTP_BUF_LEN(mm);
2095                         }
2096                         control->tail_mbuf = NULL;
2097                         control->end_added = 1;
2098                         control->last_frag_seen = 1;
2099                         control->first_frag_seen = 1;
2100                         control->fsn_included = fsn;
2101                         control->top_fsn = fsn;
2102                 }
2103                 created_control = 1;
2104         }
2105         SCTPDBG(SCTP_DEBUG_XXX, "chunk_flags: 0x%x ordered: %d MID: %u control: %p\n",
2106             chk_flags, ordered, mid, control);
2107         if ((chk_flags & SCTP_DATA_NOT_FRAG) == SCTP_DATA_NOT_FRAG &&
2108             TAILQ_EMPTY(&asoc->resetHead) &&
2109             ((ordered == 0) ||
2110             (SCTP_MID_EQ(asoc->idata_supported, asoc->strmin[sid].last_mid_delivered + 1, mid) &&
2111             TAILQ_EMPTY(&asoc->strmin[sid].inqueue)))) {
2112                 /* Candidate for express delivery */
2113                 /*
2114                  * Its not fragmented, No PD-API is up, Nothing in the
2115                  * delivery queue, Its un-ordered OR ordered and the next to
2116                  * deliver AND nothing else is stuck on the stream queue,
2117                  * And there is room for it in the socket buffer. Lets just
2118                  * stuff it up the buffer....
2119                  */
2120                 SCTP_SET_TSN_PRESENT(asoc->nr_mapping_array, gap);
2121                 if (SCTP_TSN_GT(tsn, asoc->highest_tsn_inside_nr_map)) {
2122                         asoc->highest_tsn_inside_nr_map = tsn;
2123                 }
2124                 SCTPDBG(SCTP_DEBUG_XXX, "Injecting control: %p to be read (MID: %u)\n",
2125                     control, mid);
2126
2127                 sctp_add_to_readq(stcb->sctp_ep, stcb,
2128                     control, &stcb->sctp_socket->so_rcv,
2129                     1, SCTP_READ_LOCK_NOT_HELD, SCTP_SO_NOT_LOCKED);
2130
2131                 if ((chk_flags & SCTP_DATA_UNORDERED) == 0) {
2132                         /* for ordered, bump what we delivered */
2133                         asoc->strmin[sid].last_mid_delivered++;
2134                 }
2135                 SCTP_STAT_INCR(sctps_recvexpress);
2136                 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_STR_LOGGING_ENABLE) {
2137                         sctp_log_strm_del_alt(stcb, tsn, mid, sid,
2138                             SCTP_STR_LOG_FROM_EXPRS_DEL);
2139                 }
2140                 control = NULL;
2141                 goto finish_express_del;
2142         }
2143         /* Now will we need a chunk too? */
2144         if ((chk_flags & SCTP_DATA_NOT_FRAG) != SCTP_DATA_NOT_FRAG) {
2145                 sctp_alloc_a_chunk(stcb, chk);
2146                 if (chk == NULL) {
2147                         /* No memory so we drop the chunk */
2148                         SCTP_STAT_INCR(sctps_nomem);
2149                         if (last_chunk == 0) {
2150                                 /* we copied it, free the copy */
2151                                 sctp_m_freem(dmbuf);
2152                         }
2153                         return (0);
2154                 }
2155                 chk->rec.data.tsn = tsn;
2156                 chk->no_fr_allowed = 0;
2157                 chk->rec.data.fsn = fsn;
2158                 chk->rec.data.mid = mid;
2159                 chk->rec.data.sid = sid;
2160                 chk->rec.data.ppid = ppid;
2161                 chk->rec.data.context = stcb->asoc.context;
2162                 chk->rec.data.doing_fast_retransmit = 0;
2163                 chk->rec.data.rcv_flags = chk_flags;
2164                 chk->asoc = asoc;
2165                 chk->send_size = the_len;
2166                 chk->whoTo = net;
2167                 SCTPDBG(SCTP_DEBUG_XXX, "Building ck: %p for control: %p to be read (MID: %u)\n",
2168                     chk,
2169                     control, mid);
2170                 atomic_add_int(&net->ref_count, 1);
2171                 chk->data = dmbuf;
2172         }
2173         /* Set the appropriate TSN mark */
2174         if (SCTP_BASE_SYSCTL(sctp_do_drain) == 0) {
2175                 SCTP_SET_TSN_PRESENT(asoc->nr_mapping_array, gap);
2176                 if (SCTP_TSN_GT(tsn, asoc->highest_tsn_inside_nr_map)) {
2177                         asoc->highest_tsn_inside_nr_map = tsn;
2178                 }
2179         } else {
2180                 SCTP_SET_TSN_PRESENT(asoc->mapping_array, gap);
2181                 if (SCTP_TSN_GT(tsn, asoc->highest_tsn_inside_map)) {
2182                         asoc->highest_tsn_inside_map = tsn;
2183                 }
2184         }
2185         /* Now is it complete (i.e. not fragmented)? */
2186         if ((chk_flags & SCTP_DATA_NOT_FRAG) == SCTP_DATA_NOT_FRAG) {
2187                 /*
2188                  * Special check for when streams are resetting. We could be
2189                  * more smart about this and check the actual stream to see
2190                  * if it is not being reset.. that way we would not create a
2191                  * HOLB when amongst streams being reset and those not being
2192                  * reset.
2193                  *
2194                  */
2195                 if (((liste = TAILQ_FIRST(&asoc->resetHead)) != NULL) &&
2196                     SCTP_TSN_GT(tsn, liste->tsn)) {
2197                         /*
2198                          * yep its past where we need to reset... go ahead
2199                          * and queue it.
2200                          */
2201                         if (TAILQ_EMPTY(&asoc->pending_reply_queue)) {
2202                                 /* first one on */
2203                                 TAILQ_INSERT_TAIL(&asoc->pending_reply_queue, control, next);
2204                         } else {
2205                                 struct sctp_queued_to_read *lcontrol, *nlcontrol;
2206                                 unsigned char inserted = 0;
2207
2208                                 TAILQ_FOREACH_SAFE(lcontrol, &asoc->pending_reply_queue, next, nlcontrol) {
2209                                         if (SCTP_TSN_GT(control->sinfo_tsn, lcontrol->sinfo_tsn)) {
2210
2211                                                 continue;
2212                                         } else {
2213                                                 /* found it */
2214                                                 TAILQ_INSERT_BEFORE(lcontrol, control, next);
2215                                                 inserted = 1;
2216                                                 break;
2217                                         }
2218                                 }
2219                                 if (inserted == 0) {
2220                                         /*
2221                                          * must be put at end, use prevP
2222                                          * (all setup from loop) to setup
2223                                          * nextP.
2224                                          */
2225                                         TAILQ_INSERT_TAIL(&asoc->pending_reply_queue, control, next);
2226                                 }
2227                         }
2228                         goto finish_express_del;
2229                 }
2230                 if (chk_flags & SCTP_DATA_UNORDERED) {
2231                         /* queue directly into socket buffer */
2232                         SCTPDBG(SCTP_DEBUG_XXX, "Unordered data to be read control: %p MID: %u\n",
2233                             control, mid);
2234                         sctp_mark_non_revokable(asoc, control->sinfo_tsn);
2235                         sctp_add_to_readq(stcb->sctp_ep, stcb,
2236                             control,
2237                             &stcb->sctp_socket->so_rcv, 1,
2238                             SCTP_READ_LOCK_NOT_HELD, SCTP_SO_NOT_LOCKED);
2239
2240                 } else {
2241                         SCTPDBG(SCTP_DEBUG_XXX, "Queue control: %p for reordering MID: %u\n", control,
2242                             mid);
2243                         sctp_queue_data_to_stream(stcb, asoc, control, abort_flag, &need_reasm_check);
2244                         if (*abort_flag) {
2245                                 if (last_chunk) {
2246                                         *m = NULL;
2247                                 }
2248                                 return (0);
2249                         }
2250                 }
2251                 goto finish_express_del;
2252         }
2253         /* If we reach here its a reassembly */
2254         need_reasm_check = 1;
2255         SCTPDBG(SCTP_DEBUG_XXX,
2256             "Queue data to stream for reasm control: %p MID: %u\n",
2257             control, mid);
2258         sctp_queue_data_for_reasm(stcb, asoc, control, chk, created_control, abort_flag, tsn);
2259         if (*abort_flag) {
2260                 /*
2261                  * the assoc is now gone and chk was put onto the reasm
2262                  * queue, which has all been freed.
2263                  */
2264                 if (last_chunk) {
2265                         *m = NULL;
2266                 }
2267                 return (0);
2268         }
2269 finish_express_del:
2270         /* Here we tidy up things */
2271         if (tsn == (asoc->cumulative_tsn + 1)) {
2272                 /* Update cum-ack */
2273                 asoc->cumulative_tsn = tsn;
2274         }
2275         if (last_chunk) {
2276                 *m = NULL;
2277         }
2278         if (ordered) {
2279                 SCTP_STAT_INCR_COUNTER64(sctps_inorderchunks);
2280         } else {
2281                 SCTP_STAT_INCR_COUNTER64(sctps_inunorderchunks);
2282         }
2283         SCTP_STAT_INCR(sctps_recvdata);
2284         /* Set it present please */
2285         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_STR_LOGGING_ENABLE) {
2286                 sctp_log_strm_del_alt(stcb, tsn, mid, sid, SCTP_STR_LOG_FROM_MARK_TSN);
2287         }
2288         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MAP_LOGGING_ENABLE) {
2289                 sctp_log_map(asoc->mapping_array_base_tsn, asoc->cumulative_tsn,
2290                     asoc->highest_tsn_inside_map, SCTP_MAP_PREPARE_SLIDE);
2291         }
2292         if (need_reasm_check) {
2293                 (void)sctp_deliver_reasm_check(stcb, asoc, &asoc->strmin[sid], SCTP_READ_LOCK_NOT_HELD);
2294                 need_reasm_check = 0;
2295         }
2296         /* check the special flag for stream resets */
2297         if (((liste = TAILQ_FIRST(&asoc->resetHead)) != NULL) &&
2298             SCTP_TSN_GE(asoc->cumulative_tsn, liste->tsn)) {
2299                 /*
2300                  * we have finished working through the backlogged TSN's now
2301                  * time to reset streams. 1: call reset function. 2: free
2302                  * pending_reply space 3: distribute any chunks in
2303                  * pending_reply_queue.
2304                  */
2305                 sctp_reset_in_stream(stcb, liste->number_entries, liste->list_of_streams);
2306                 TAILQ_REMOVE(&asoc->resetHead, liste, next_resp);
2307                 sctp_send_deferred_reset_response(stcb, liste, SCTP_STREAM_RESET_RESULT_PERFORMED);
2308                 SCTP_FREE(liste, SCTP_M_STRESET);
2309                 /* sa_ignore FREED_MEMORY */
2310                 liste = TAILQ_FIRST(&asoc->resetHead);
2311                 if (TAILQ_EMPTY(&asoc->resetHead)) {
2312                         /* All can be removed */
2313                         TAILQ_FOREACH_SAFE(control, &asoc->pending_reply_queue, next, ncontrol) {
2314                                 TAILQ_REMOVE(&asoc->pending_reply_queue, control, next);
2315                                 sctp_queue_data_to_stream(stcb, asoc, control, abort_flag, &need_reasm_check);
2316                                 if (*abort_flag) {
2317                                         return (0);
2318                                 }
2319                                 if (need_reasm_check) {
2320                                         (void)sctp_deliver_reasm_check(stcb, asoc, &asoc->strmin[control->sinfo_stream], SCTP_READ_LOCK_NOT_HELD);
2321                                         need_reasm_check = 0;
2322                                 }
2323                         }
2324                 } else {
2325                         TAILQ_FOREACH_SAFE(control, &asoc->pending_reply_queue, next, ncontrol) {
2326                                 if (SCTP_TSN_GT(control->sinfo_tsn, liste->tsn)) {
2327                                         break;
2328                                 }
2329                                 /*
2330                                  * if control->sinfo_tsn is <= liste->tsn we
2331                                  * can process it which is the NOT of
2332                                  * control->sinfo_tsn > liste->tsn
2333                                  */
2334                                 TAILQ_REMOVE(&asoc->pending_reply_queue, control, next);
2335                                 sctp_queue_data_to_stream(stcb, asoc, control, abort_flag, &need_reasm_check);
2336                                 if (*abort_flag) {
2337                                         return (0);
2338                                 }
2339                                 if (need_reasm_check) {
2340                                         (void)sctp_deliver_reasm_check(stcb, asoc, &asoc->strmin[control->sinfo_stream], SCTP_READ_LOCK_NOT_HELD);
2341                                         need_reasm_check = 0;
2342                                 }
2343                         }
2344                 }
2345         }
2346         return (1);
2347 }
2348
2349 static const int8_t sctp_map_lookup_tab[256] = {
2350         0, 1, 0, 2, 0, 1, 0, 3,
2351         0, 1, 0, 2, 0, 1, 0, 4,
2352         0, 1, 0, 2, 0, 1, 0, 3,
2353         0, 1, 0, 2, 0, 1, 0, 5,
2354         0, 1, 0, 2, 0, 1, 0, 3,
2355         0, 1, 0, 2, 0, 1, 0, 4,
2356         0, 1, 0, 2, 0, 1, 0, 3,
2357         0, 1, 0, 2, 0, 1, 0, 6,
2358         0, 1, 0, 2, 0, 1, 0, 3,
2359         0, 1, 0, 2, 0, 1, 0, 4,
2360         0, 1, 0, 2, 0, 1, 0, 3,
2361         0, 1, 0, 2, 0, 1, 0, 5,
2362         0, 1, 0, 2, 0, 1, 0, 3,
2363         0, 1, 0, 2, 0, 1, 0, 4,
2364         0, 1, 0, 2, 0, 1, 0, 3,
2365         0, 1, 0, 2, 0, 1, 0, 7,
2366         0, 1, 0, 2, 0, 1, 0, 3,
2367         0, 1, 0, 2, 0, 1, 0, 4,
2368         0, 1, 0, 2, 0, 1, 0, 3,
2369         0, 1, 0, 2, 0, 1, 0, 5,
2370         0, 1, 0, 2, 0, 1, 0, 3,
2371         0, 1, 0, 2, 0, 1, 0, 4,
2372         0, 1, 0, 2, 0, 1, 0, 3,
2373         0, 1, 0, 2, 0, 1, 0, 6,
2374         0, 1, 0, 2, 0, 1, 0, 3,
2375         0, 1, 0, 2, 0, 1, 0, 4,
2376         0, 1, 0, 2, 0, 1, 0, 3,
2377         0, 1, 0, 2, 0, 1, 0, 5,
2378         0, 1, 0, 2, 0, 1, 0, 3,
2379         0, 1, 0, 2, 0, 1, 0, 4,
2380         0, 1, 0, 2, 0, 1, 0, 3,
2381         0, 1, 0, 2, 0, 1, 0, 8
2382 };
2383
2384
2385 void
2386 sctp_slide_mapping_arrays(struct sctp_tcb *stcb)
2387 {
2388         /*
2389          * Now we also need to check the mapping array in a couple of ways.
2390          * 1) Did we move the cum-ack point?
2391          *
2392          * When you first glance at this you might think that all entries
2393          * that make up the position of the cum-ack would be in the
2394          * nr-mapping array only.. i.e. things up to the cum-ack are always
2395          * deliverable. Thats true with one exception, when its a fragmented
2396          * message we may not deliver the data until some threshold (or all
2397          * of it) is in place. So we must OR the nr_mapping_array and
2398          * mapping_array to get a true picture of the cum-ack.
2399          */
2400         struct sctp_association *asoc;
2401         int at;
2402         uint8_t val;
2403         int slide_from, slide_end, lgap, distance;
2404         uint32_t old_cumack, old_base, old_highest, highest_tsn;
2405
2406         asoc = &stcb->asoc;
2407
2408         old_cumack = asoc->cumulative_tsn;
2409         old_base = asoc->mapping_array_base_tsn;
2410         old_highest = asoc->highest_tsn_inside_map;
2411         /*
2412          * We could probably improve this a small bit by calculating the
2413          * offset of the current cum-ack as the starting point.
2414          */
2415         at = 0;
2416         for (slide_from = 0; slide_from < stcb->asoc.mapping_array_size; slide_from++) {
2417                 val = asoc->nr_mapping_array[slide_from] | asoc->mapping_array[slide_from];
2418                 if (val == 0xff) {
2419                         at += 8;
2420                 } else {
2421                         /* there is a 0 bit */
2422                         at += sctp_map_lookup_tab[val];
2423                         break;
2424                 }
2425         }
2426         asoc->cumulative_tsn = asoc->mapping_array_base_tsn + (at - 1);
2427
2428         if (SCTP_TSN_GT(asoc->cumulative_tsn, asoc->highest_tsn_inside_map) &&
2429             SCTP_TSN_GT(asoc->cumulative_tsn, asoc->highest_tsn_inside_nr_map)) {
2430 #ifdef INVARIANTS
2431                 panic("huh, cumack 0x%x greater than high-tsn 0x%x in map",
2432                     asoc->cumulative_tsn, asoc->highest_tsn_inside_map);
2433 #else
2434                 SCTP_PRINTF("huh, cumack 0x%x greater than high-tsn 0x%x in map - should panic?\n",
2435                     asoc->cumulative_tsn, asoc->highest_tsn_inside_map);
2436                 sctp_print_mapping_array(asoc);
2437                 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MAP_LOGGING_ENABLE) {
2438                         sctp_log_map(0, 6, asoc->highest_tsn_inside_map, SCTP_MAP_SLIDE_RESULT);
2439                 }
2440                 asoc->highest_tsn_inside_map = asoc->cumulative_tsn;
2441                 asoc->highest_tsn_inside_nr_map = asoc->cumulative_tsn;
2442 #endif
2443         }
2444         if (SCTP_TSN_GT(asoc->highest_tsn_inside_nr_map, asoc->highest_tsn_inside_map)) {
2445                 highest_tsn = asoc->highest_tsn_inside_nr_map;
2446         } else {
2447                 highest_tsn = asoc->highest_tsn_inside_map;
2448         }
2449         if ((asoc->cumulative_tsn == highest_tsn) && (at >= 8)) {
2450                 /* The complete array was completed by a single FR */
2451                 /* highest becomes the cum-ack */
2452                 int clr;
2453 #ifdef INVARIANTS
2454                 unsigned int i;
2455 #endif
2456
2457                 /* clear the array */
2458                 clr = ((at + 7) >> 3);
2459                 if (clr > asoc->mapping_array_size) {
2460                         clr = asoc->mapping_array_size;
2461                 }
2462                 memset(asoc->mapping_array, 0, clr);
2463                 memset(asoc->nr_mapping_array, 0, clr);
2464 #ifdef INVARIANTS
2465                 for (i = 0; i < asoc->mapping_array_size; i++) {
2466                         if ((asoc->mapping_array[i]) || (asoc->nr_mapping_array[i])) {
2467                                 SCTP_PRINTF("Error Mapping array's not clean at clear\n");
2468                                 sctp_print_mapping_array(asoc);
2469                         }
2470                 }
2471 #endif
2472                 asoc->mapping_array_base_tsn = asoc->cumulative_tsn + 1;
2473                 asoc->highest_tsn_inside_nr_map = asoc->highest_tsn_inside_map = asoc->cumulative_tsn;
2474         } else if (at >= 8) {
2475                 /* we can slide the mapping array down */
2476                 /* slide_from holds where we hit the first NON 0xff byte */
2477
2478                 /*
2479                  * now calculate the ceiling of the move using our highest
2480                  * TSN value
2481                  */
2482                 SCTP_CALC_TSN_TO_GAP(lgap, highest_tsn, asoc->mapping_array_base_tsn);
2483                 slide_end = (lgap >> 3);
2484                 if (slide_end < slide_from) {
2485                         sctp_print_mapping_array(asoc);
2486 #ifdef INVARIANTS
2487                         panic("impossible slide");
2488 #else
2489                         SCTP_PRINTF("impossible slide lgap: %x slide_end: %x slide_from: %x? at: %d\n",
2490                             lgap, slide_end, slide_from, at);
2491                         return;
2492 #endif
2493                 }
2494                 if (slide_end > asoc->mapping_array_size) {
2495 #ifdef INVARIANTS
2496                         panic("would overrun buffer");
2497 #else
2498                         SCTP_PRINTF("Gak, would have overrun map end: %d slide_end: %d\n",
2499                             asoc->mapping_array_size, slide_end);
2500                         slide_end = asoc->mapping_array_size;
2501 #endif
2502                 }
2503                 distance = (slide_end - slide_from) + 1;
2504                 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MAP_LOGGING_ENABLE) {
2505                         sctp_log_map(old_base, old_cumack, old_highest,
2506                             SCTP_MAP_PREPARE_SLIDE);
2507                         sctp_log_map((uint32_t)slide_from, (uint32_t)slide_end,
2508                             (uint32_t)lgap, SCTP_MAP_SLIDE_FROM);
2509                 }
2510                 if (distance + slide_from > asoc->mapping_array_size ||
2511                     distance < 0) {
2512                         /*
2513                          * Here we do NOT slide forward the array so that
2514                          * hopefully when more data comes in to fill it up
2515                          * we will be able to slide it forward. Really I
2516                          * don't think this should happen :-0
2517                          */
2518
2519                         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MAP_LOGGING_ENABLE) {
2520                                 sctp_log_map((uint32_t)distance, (uint32_t)slide_from,
2521                                     (uint32_t)asoc->mapping_array_size,
2522                                     SCTP_MAP_SLIDE_NONE);
2523                         }
2524                 } else {
2525                         int ii;
2526
2527                         for (ii = 0; ii < distance; ii++) {
2528                                 asoc->mapping_array[ii] = asoc->mapping_array[slide_from + ii];
2529                                 asoc->nr_mapping_array[ii] = asoc->nr_mapping_array[slide_from + ii];
2530
2531                         }
2532                         for (ii = distance; ii < asoc->mapping_array_size; ii++) {
2533                                 asoc->mapping_array[ii] = 0;
2534                                 asoc->nr_mapping_array[ii] = 0;
2535                         }
2536                         if (asoc->highest_tsn_inside_map + 1 == asoc->mapping_array_base_tsn) {
2537                                 asoc->highest_tsn_inside_map += (slide_from << 3);
2538                         }
2539                         if (asoc->highest_tsn_inside_nr_map + 1 == asoc->mapping_array_base_tsn) {
2540                                 asoc->highest_tsn_inside_nr_map += (slide_from << 3);
2541                         }
2542                         asoc->mapping_array_base_tsn += (slide_from << 3);
2543                         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MAP_LOGGING_ENABLE) {
2544                                 sctp_log_map(asoc->mapping_array_base_tsn,
2545                                     asoc->cumulative_tsn, asoc->highest_tsn_inside_map,
2546                                     SCTP_MAP_SLIDE_RESULT);
2547                         }
2548                 }
2549         }
2550 }
2551
2552 void
2553 sctp_sack_check(struct sctp_tcb *stcb, int was_a_gap)
2554 {
2555         struct sctp_association *asoc;
2556         uint32_t highest_tsn;
2557         int is_a_gap;
2558
2559         sctp_slide_mapping_arrays(stcb);
2560         asoc = &stcb->asoc;
2561         if (SCTP_TSN_GT(asoc->highest_tsn_inside_nr_map, asoc->highest_tsn_inside_map)) {
2562                 highest_tsn = asoc->highest_tsn_inside_nr_map;
2563         } else {
2564                 highest_tsn = asoc->highest_tsn_inside_map;
2565         }
2566         /* Is there a gap now? */
2567         is_a_gap = SCTP_TSN_GT(highest_tsn, stcb->asoc.cumulative_tsn);
2568
2569         /*
2570          * Now we need to see if we need to queue a sack or just start the
2571          * timer (if allowed).
2572          */
2573         if (SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_SENT) {
2574                 /*
2575                  * Ok special case, in SHUTDOWN-SENT case. here we maker
2576                  * sure SACK timer is off and instead send a SHUTDOWN and a
2577                  * SACK
2578                  */
2579                 if (SCTP_OS_TIMER_PENDING(&stcb->asoc.dack_timer.timer)) {
2580                         sctp_timer_stop(SCTP_TIMER_TYPE_RECV,
2581                             stcb->sctp_ep, stcb, NULL,
2582                             SCTP_FROM_SCTP_INDATA + SCTP_LOC_17);
2583                 }
2584                 sctp_send_shutdown(stcb,
2585                     ((stcb->asoc.alternate) ? stcb->asoc.alternate : stcb->asoc.primary_destination));
2586                 if (is_a_gap) {
2587                         sctp_send_sack(stcb, SCTP_SO_NOT_LOCKED);
2588                 }
2589         } else {
2590                 /*
2591                  * CMT DAC algorithm: increase number of packets received
2592                  * since last ack
2593                  */
2594                 stcb->asoc.cmt_dac_pkts_rcvd++;
2595
2596                 if ((stcb->asoc.send_sack == 1) ||      /* We need to send a
2597                                                          * SACK */
2598                     ((was_a_gap) && (is_a_gap == 0)) || /* was a gap, but no
2599                                                          * longer is one */
2600                     (stcb->asoc.numduptsns) ||  /* we have dup's */
2601                     (is_a_gap) ||       /* is still a gap */
2602                     (stcb->asoc.delayed_ack == 0) ||    /* Delayed sack disabled */
2603                     (stcb->asoc.data_pkts_seen >= stcb->asoc.sack_freq) /* hit limit of pkts */
2604                     ) {
2605
2606                         if ((stcb->asoc.sctp_cmt_on_off > 0) &&
2607                             (SCTP_BASE_SYSCTL(sctp_cmt_use_dac)) &&
2608                             (stcb->asoc.send_sack == 0) &&
2609                             (stcb->asoc.numduptsns == 0) &&
2610                             (stcb->asoc.delayed_ack) &&
2611                             (!SCTP_OS_TIMER_PENDING(&stcb->asoc.dack_timer.timer))) {
2612
2613                                 /*
2614                                  * CMT DAC algorithm: With CMT, delay acks
2615                                  * even in the face of
2616                                  *
2617                                  * reordering. Therefore, if acks that do
2618                                  * not have to be sent because of the above
2619                                  * reasons, will be delayed. That is, acks
2620                                  * that would have been sent due to gap
2621                                  * reports will be delayed with DAC. Start
2622                                  * the delayed ack timer.
2623                                  */
2624                                 sctp_timer_start(SCTP_TIMER_TYPE_RECV,
2625                                     stcb->sctp_ep, stcb, NULL);
2626                         } else {
2627                                 /*
2628                                  * Ok we must build a SACK since the timer
2629                                  * is pending, we got our first packet OR
2630                                  * there are gaps or duplicates.
2631                                  */
2632                                 (void)SCTP_OS_TIMER_STOP(&stcb->asoc.dack_timer.timer);
2633                                 sctp_send_sack(stcb, SCTP_SO_NOT_LOCKED);
2634                         }
2635                 } else {
2636                         if (!SCTP_OS_TIMER_PENDING(&stcb->asoc.dack_timer.timer)) {
2637                                 sctp_timer_start(SCTP_TIMER_TYPE_RECV,
2638                                     stcb->sctp_ep, stcb, NULL);
2639                         }
2640                 }
2641         }
2642 }
2643
2644 int
2645 sctp_process_data(struct mbuf **mm, int iphlen, int *offset, int length,
2646     struct sctp_inpcb *inp, struct sctp_tcb *stcb,
2647     struct sctp_nets *net, uint32_t *high_tsn)
2648 {
2649         struct sctp_chunkhdr *ch, chunk_buf;
2650         struct sctp_association *asoc;
2651         int num_chunks = 0;     /* number of control chunks processed */
2652         int stop_proc = 0;
2653         int break_flag, last_chunk;
2654         int abort_flag = 0, was_a_gap;
2655         struct mbuf *m;
2656         uint32_t highest_tsn;
2657         uint16_t chk_length;
2658
2659         /* set the rwnd */
2660         sctp_set_rwnd(stcb, &stcb->asoc);
2661
2662         m = *mm;
2663         SCTP_TCB_LOCK_ASSERT(stcb);
2664         asoc = &stcb->asoc;
2665         if (SCTP_TSN_GT(asoc->highest_tsn_inside_nr_map, asoc->highest_tsn_inside_map)) {
2666                 highest_tsn = asoc->highest_tsn_inside_nr_map;
2667         } else {
2668                 highest_tsn = asoc->highest_tsn_inside_map;
2669         }
2670         was_a_gap = SCTP_TSN_GT(highest_tsn, stcb->asoc.cumulative_tsn);
2671         /*
2672          * setup where we got the last DATA packet from for any SACK that
2673          * may need to go out. Don't bump the net. This is done ONLY when a
2674          * chunk is assigned.
2675          */
2676         asoc->last_data_chunk_from = net;
2677
2678         /*-
2679          * Now before we proceed we must figure out if this is a wasted
2680          * cluster... i.e. it is a small packet sent in and yet the driver
2681          * underneath allocated a full cluster for it. If so we must copy it
2682          * to a smaller mbuf and free up the cluster mbuf. This will help
2683          * with cluster starvation. Note for __Panda__ we don't do this
2684          * since it has clusters all the way down to 64 bytes.
2685          */
2686         if (SCTP_BUF_LEN(m) < (long)MLEN && SCTP_BUF_NEXT(m) == NULL) {
2687                 /* we only handle mbufs that are singletons.. not chains */
2688                 m = sctp_get_mbuf_for_msg(SCTP_BUF_LEN(m), 0, M_NOWAIT, 1, MT_DATA);
2689                 if (m) {
2690                         /* ok lets see if we can copy the data up */
2691                         caddr_t *from, *to;
2692
2693                         /* get the pointers and copy */
2694                         to = mtod(m, caddr_t *);
2695                         from = mtod((*mm), caddr_t *);
2696                         memcpy(to, from, SCTP_BUF_LEN((*mm)));
2697                         /* copy the length and free up the old */
2698                         SCTP_BUF_LEN(m) = SCTP_BUF_LEN((*mm));
2699                         sctp_m_freem(*mm);
2700                         /* success, back copy */
2701                         *mm = m;
2702                 } else {
2703                         /* We are in trouble in the mbuf world .. yikes */
2704                         m = *mm;
2705                 }
2706         }
2707         /* get pointer to the first chunk header */
2708         ch = (struct sctp_chunkhdr *)sctp_m_getptr(m, *offset,
2709             sizeof(struct sctp_chunkhdr),
2710             (uint8_t *)&chunk_buf);
2711         if (ch == NULL) {
2712                 return (1);
2713         }
2714         /*
2715          * process all DATA chunks...
2716          */
2717         *high_tsn = asoc->cumulative_tsn;
2718         break_flag = 0;
2719         asoc->data_pkts_seen++;
2720         while (stop_proc == 0) {
2721                 /* validate chunk length */
2722                 chk_length = ntohs(ch->chunk_length);
2723                 if (length - *offset < chk_length) {
2724                         /* all done, mutulated chunk */
2725                         stop_proc = 1;
2726                         continue;
2727                 }
2728                 if ((asoc->idata_supported == 1) &&
2729                     (ch->chunk_type == SCTP_DATA)) {
2730                         struct mbuf *op_err;
2731                         char msg[SCTP_DIAG_INFO_LEN];
2732
2733                         snprintf(msg, sizeof(msg), "%s", "I-DATA chunk received when DATA was negotiated");
2734                         op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg);
2735                         stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_18;
2736                         sctp_abort_an_association(inp, stcb, op_err, SCTP_SO_NOT_LOCKED);
2737                         return (2);
2738                 }
2739                 if ((asoc->idata_supported == 0) &&
2740                     (ch->chunk_type == SCTP_IDATA)) {
2741                         struct mbuf *op_err;
2742                         char msg[SCTP_DIAG_INFO_LEN];
2743
2744                         snprintf(msg, sizeof(msg), "%s", "DATA chunk received when I-DATA was negotiated");
2745                         op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg);
2746                         stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_19;
2747                         sctp_abort_an_association(inp, stcb, op_err, SCTP_SO_NOT_LOCKED);
2748                         return (2);
2749                 }
2750                 if ((ch->chunk_type == SCTP_DATA) ||
2751                     (ch->chunk_type == SCTP_IDATA)) {
2752                         uint16_t clen;
2753
2754                         if (ch->chunk_type == SCTP_DATA) {
2755                                 clen = sizeof(struct sctp_data_chunk);
2756                         } else {
2757                                 clen = sizeof(struct sctp_idata_chunk);
2758                         }
2759                         if (chk_length < clen) {
2760                                 /*
2761                                  * Need to send an abort since we had a
2762                                  * invalid data chunk.
2763                                  */
2764                                 struct mbuf *op_err;
2765                                 char msg[SCTP_DIAG_INFO_LEN];
2766
2767                                 snprintf(msg, sizeof(msg), "%s chunk of length %u",
2768                                     ch->chunk_type == SCTP_DATA ? "DATA" : "I-DATA",
2769                                     chk_length);
2770                                 op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg);
2771                                 stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_20;
2772                                 sctp_abort_an_association(inp, stcb, op_err, SCTP_SO_NOT_LOCKED);
2773                                 return (2);
2774                         }
2775 #ifdef SCTP_AUDITING_ENABLED
2776                         sctp_audit_log(0xB1, 0);
2777 #endif
2778                         if (SCTP_SIZE32(chk_length) == (length - *offset)) {
2779                                 last_chunk = 1;
2780                         } else {
2781                                 last_chunk = 0;
2782                         }
2783                         if (sctp_process_a_data_chunk(stcb, asoc, mm, *offset,
2784                             chk_length, net, high_tsn, &abort_flag, &break_flag,
2785                             last_chunk, ch->chunk_type)) {
2786                                 num_chunks++;
2787                         }
2788                         if (abort_flag)
2789                                 return (2);
2790
2791                         if (break_flag) {
2792                                 /*
2793                                  * Set because of out of rwnd space and no
2794                                  * drop rep space left.
2795                                  */
2796                                 stop_proc = 1;
2797                                 continue;
2798                         }
2799                 } else {
2800                         /* not a data chunk in the data region */
2801                         switch (ch->chunk_type) {
2802                         case SCTP_INITIATION:
2803                         case SCTP_INITIATION_ACK:
2804                         case SCTP_SELECTIVE_ACK:
2805                         case SCTP_NR_SELECTIVE_ACK:
2806                         case SCTP_HEARTBEAT_REQUEST:
2807                         case SCTP_HEARTBEAT_ACK:
2808                         case SCTP_ABORT_ASSOCIATION:
2809                         case SCTP_SHUTDOWN:
2810                         case SCTP_SHUTDOWN_ACK:
2811                         case SCTP_OPERATION_ERROR:
2812                         case SCTP_COOKIE_ECHO:
2813                         case SCTP_COOKIE_ACK:
2814                         case SCTP_ECN_ECHO:
2815                         case SCTP_ECN_CWR:
2816                         case SCTP_SHUTDOWN_COMPLETE:
2817                         case SCTP_AUTHENTICATION:
2818                         case SCTP_ASCONF_ACK:
2819                         case SCTP_PACKET_DROPPED:
2820                         case SCTP_STREAM_RESET:
2821                         case SCTP_FORWARD_CUM_TSN:
2822                         case SCTP_ASCONF:
2823                                 {
2824                                         /*
2825                                          * Now, what do we do with KNOWN
2826                                          * chunks that are NOT in the right
2827                                          * place?
2828                                          *
2829                                          * For now, I do nothing but ignore
2830                                          * them. We may later want to add
2831                                          * sysctl stuff to switch out and do
2832                                          * either an ABORT() or possibly
2833                                          * process them.
2834                                          */
2835                                         struct mbuf *op_err;
2836                                         char msg[SCTP_DIAG_INFO_LEN];
2837
2838                                         snprintf(msg, sizeof(msg), "DATA chunk followed by chunk of type %2.2x",
2839                                             ch->chunk_type);
2840                                         op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg);
2841                                         sctp_abort_an_association(inp, stcb, op_err, SCTP_SO_NOT_LOCKED);
2842                                         return (2);
2843                                 }
2844                         default:
2845                                 /*
2846                                  * Unknown chunk type: use bit rules after
2847                                  * checking length
2848                                  */
2849                                 if (chk_length < sizeof(struct sctp_chunkhdr)) {
2850                                         /*
2851                                          * Need to send an abort since we
2852                                          * had a invalid chunk.
2853                                          */
2854                                         struct mbuf *op_err;
2855                                         char msg[SCTP_DIAG_INFO_LEN];
2856
2857                                         snprintf(msg, sizeof(msg), "Chunk of length %u",
2858                                             chk_length);
2859                                         op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg);
2860                                         stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_20;
2861                                         sctp_abort_an_association(inp, stcb, op_err, SCTP_SO_NOT_LOCKED);
2862                                         return (2);
2863                                 }
2864                                 if (ch->chunk_type & 0x40) {
2865                                         /* Add a error report to the queue */
2866                                         struct mbuf *op_err;
2867                                         struct sctp_gen_error_cause *cause;
2868
2869                                         op_err = sctp_get_mbuf_for_msg(sizeof(struct sctp_gen_error_cause),
2870                                             0, M_NOWAIT, 1, MT_DATA);
2871                                         if (op_err != NULL) {
2872                                                 cause = mtod(op_err, struct sctp_gen_error_cause *);
2873                                                 cause->code = htons(SCTP_CAUSE_UNRECOG_CHUNK);
2874                                                 cause->length = htons((uint16_t)(chk_length + sizeof(struct sctp_gen_error_cause)));
2875                                                 SCTP_BUF_LEN(op_err) = sizeof(struct sctp_gen_error_cause);
2876                                                 SCTP_BUF_NEXT(op_err) = SCTP_M_COPYM(m, *offset, chk_length, M_NOWAIT);
2877                                                 if (SCTP_BUF_NEXT(op_err) != NULL) {
2878                                                         sctp_queue_op_err(stcb, op_err);
2879                                                 } else {
2880                                                         sctp_m_freem(op_err);
2881                                                 }
2882                                         }
2883                                 }
2884                                 if ((ch->chunk_type & 0x80) == 0) {
2885                                         /* discard the rest of this packet */
2886                                         stop_proc = 1;
2887                                 }       /* else skip this bad chunk and
2888                                          * continue... */
2889                                 break;
2890                         }       /* switch of chunk type */
2891                 }
2892                 *offset += SCTP_SIZE32(chk_length);
2893                 if ((*offset >= length) || stop_proc) {
2894                         /* no more data left in the mbuf chain */
2895                         stop_proc = 1;
2896                         continue;
2897                 }
2898                 ch = (struct sctp_chunkhdr *)sctp_m_getptr(m, *offset,
2899                     sizeof(struct sctp_chunkhdr),
2900                     (uint8_t *)&chunk_buf);
2901                 if (ch == NULL) {
2902                         *offset = length;
2903                         stop_proc = 1;
2904                         continue;
2905                 }
2906         }
2907         if (break_flag) {
2908                 /*
2909                  * we need to report rwnd overrun drops.
2910                  */
2911                 sctp_send_packet_dropped(stcb, net, *mm, length, iphlen, 0);
2912         }
2913         if (num_chunks) {
2914                 /*
2915                  * Did we get data, if so update the time for auto-close and
2916                  * give peer credit for being alive.
2917                  */
2918                 SCTP_STAT_INCR(sctps_recvpktwithdata);
2919                 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_THRESHOLD_LOGGING) {
2920                         sctp_misc_ints(SCTP_THRESHOLD_CLEAR,
2921                             stcb->asoc.overall_error_count,
2922                             0,
2923                             SCTP_FROM_SCTP_INDATA,
2924                             __LINE__);
2925                 }
2926                 stcb->asoc.overall_error_count = 0;
2927                 (void)SCTP_GETTIME_TIMEVAL(&stcb->asoc.time_last_rcvd);
2928         }
2929         /* now service all of the reassm queue if needed */
2930         if (SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_SENT) {
2931                 /* Assure that we ack right away */
2932                 stcb->asoc.send_sack = 1;
2933         }
2934         /* Start a sack timer or QUEUE a SACK for sending */
2935         sctp_sack_check(stcb, was_a_gap);
2936         return (0);
2937 }
2938
2939 static int
2940 sctp_process_segment_range(struct sctp_tcb *stcb, struct sctp_tmit_chunk **p_tp1, uint32_t last_tsn,
2941     uint16_t frag_strt, uint16_t frag_end, int nr_sacking,
2942     int *num_frs,
2943     uint32_t *biggest_newly_acked_tsn,
2944     uint32_t *this_sack_lowest_newack,
2945     int *rto_ok)
2946 {
2947         struct sctp_tmit_chunk *tp1;
2948         unsigned int theTSN;
2949         int j, wake_him = 0, circled = 0;
2950
2951         /* Recover the tp1 we last saw */
2952         tp1 = *p_tp1;
2953         if (tp1 == NULL) {
2954                 tp1 = TAILQ_FIRST(&stcb->asoc.sent_queue);
2955         }
2956         for (j = frag_strt; j <= frag_end; j++) {
2957                 theTSN = j + last_tsn;
2958                 while (tp1) {
2959                         if (tp1->rec.data.doing_fast_retransmit)
2960                                 (*num_frs) += 1;
2961
2962                         /*-
2963                          * CMT: CUCv2 algorithm. For each TSN being
2964                          * processed from the sent queue, track the
2965                          * next expected pseudo-cumack, or
2966                          * rtx_pseudo_cumack, if required. Separate
2967                          * cumack trackers for first transmissions,
2968                          * and retransmissions.
2969                          */
2970                         if ((tp1->sent < SCTP_DATAGRAM_RESEND) &&
2971                             (tp1->whoTo->find_pseudo_cumack == 1) &&
2972                             (tp1->snd_count == 1)) {
2973                                 tp1->whoTo->pseudo_cumack = tp1->rec.data.tsn;
2974                                 tp1->whoTo->find_pseudo_cumack = 0;
2975                         }
2976                         if ((tp1->sent < SCTP_DATAGRAM_RESEND) &&
2977                             (tp1->whoTo->find_rtx_pseudo_cumack == 1) &&
2978                             (tp1->snd_count > 1)) {
2979                                 tp1->whoTo->rtx_pseudo_cumack = tp1->rec.data.tsn;
2980                                 tp1->whoTo->find_rtx_pseudo_cumack = 0;
2981                         }
2982                         if (tp1->rec.data.tsn == theTSN) {
2983                                 if (tp1->sent != SCTP_DATAGRAM_UNSENT) {
2984                                         /*-
2985                                          * must be held until
2986                                          * cum-ack passes
2987                                          */
2988                                         if (tp1->sent < SCTP_DATAGRAM_RESEND) {
2989                                                 /*-
2990                                                  * If it is less than RESEND, it is
2991                                                  * now no-longer in flight.
2992                                                  * Higher values may already be set
2993                                                  * via previous Gap Ack Blocks...
2994                                                  * i.e. ACKED or RESEND.
2995                                                  */
2996                                                 if (SCTP_TSN_GT(tp1->rec.data.tsn,
2997                                                     *biggest_newly_acked_tsn)) {
2998                                                         *biggest_newly_acked_tsn = tp1->rec.data.tsn;
2999                                                 }
3000                                                 /*-
3001                                                  * CMT: SFR algo (and HTNA) - set
3002                                                  * saw_newack to 1 for dest being
3003                                                  * newly acked. update
3004                                                  * this_sack_highest_newack if
3005                                                  * appropriate.
3006                                                  */
3007                                                 if (tp1->rec.data.chunk_was_revoked == 0)
3008                                                         tp1->whoTo->saw_newack = 1;
3009
3010                                                 if (SCTP_TSN_GT(tp1->rec.data.tsn,
3011                                                     tp1->whoTo->this_sack_highest_newack)) {
3012                                                         tp1->whoTo->this_sack_highest_newack =
3013                                                             tp1->rec.data.tsn;
3014                                                 }
3015                                                 /*-
3016                                                  * CMT DAC algo: also update
3017                                                  * this_sack_lowest_newack
3018                                                  */
3019                                                 if (*this_sack_lowest_newack == 0) {
3020                                                         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SACK_LOGGING_ENABLE) {
3021                                                                 sctp_log_sack(*this_sack_lowest_newack,
3022                                                                     last_tsn,
3023                                                                     tp1->rec.data.tsn,
3024                                                                     0,
3025                                                                     0,
3026                                                                     SCTP_LOG_TSN_ACKED);
3027                                                         }
3028                                                         *this_sack_lowest_newack = tp1->rec.data.tsn;
3029                                                 }
3030                                                 /*-
3031                                                  * CMT: CUCv2 algorithm. If (rtx-)pseudo-cumack for corresp
3032                                                  * dest is being acked, then we have a new (rtx-)pseudo-cumack. Set
3033                                                  * new_(rtx_)pseudo_cumack to TRUE so that the cwnd for this dest can be
3034                                                  * updated. Also trigger search for the next expected (rtx-)pseudo-cumack.
3035                                                  * Separate pseudo_cumack trackers for first transmissions and
3036                                                  * retransmissions.
3037                                                  */
3038                                                 if (tp1->rec.data.tsn == tp1->whoTo->pseudo_cumack) {
3039                                                         if (tp1->rec.data.chunk_was_revoked == 0) {
3040                                                                 tp1->whoTo->new_pseudo_cumack = 1;
3041                                                         }
3042                                                         tp1->whoTo->find_pseudo_cumack = 1;
3043                                                 }
3044                                                 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_LOGGING_ENABLE) {
3045                                                         sctp_log_cwnd(stcb, tp1->whoTo, tp1->rec.data.tsn, SCTP_CWND_LOG_FROM_SACK);
3046                                                 }
3047                                                 if (tp1->rec.data.tsn == tp1->whoTo->rtx_pseudo_cumack) {
3048                                                         if (tp1->rec.data.chunk_was_revoked == 0) {
3049                                                                 tp1->whoTo->new_pseudo_cumack = 1;
3050                                                         }
3051                                                         tp1->whoTo->find_rtx_pseudo_cumack = 1;
3052                                                 }
3053                                                 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SACK_LOGGING_ENABLE) {
3054                                                         sctp_log_sack(*biggest_newly_acked_tsn,
3055                                                             last_tsn,
3056                                                             tp1->rec.data.tsn,
3057                                                             frag_strt,
3058                                                             frag_end,
3059                                                             SCTP_LOG_TSN_ACKED);
3060                                                 }
3061                                                 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FLIGHT_LOGGING_ENABLE) {
3062                                                         sctp_misc_ints(SCTP_FLIGHT_LOG_DOWN_GAP,
3063                                                             tp1->whoTo->flight_size,
3064                                                             tp1->book_size,
3065                                                             (uint32_t)(uintptr_t)tp1->whoTo,
3066                                                             tp1->rec.data.tsn);
3067                                                 }
3068                                                 sctp_flight_size_decrease(tp1);
3069                                                 if (stcb->asoc.cc_functions.sctp_cwnd_update_tsn_acknowledged) {
3070                                                         (*stcb->asoc.cc_functions.sctp_cwnd_update_tsn_acknowledged) (tp1->whoTo,
3071                                                             tp1);
3072                                                 }
3073                                                 sctp_total_flight_decrease(stcb, tp1);
3074
3075                                                 tp1->whoTo->net_ack += tp1->send_size;
3076                                                 if (tp1->snd_count < 2) {
3077                                                         /*-
3078                                                          * True non-retransmited chunk
3079                                                          */
3080                                                         tp1->whoTo->net_ack2 += tp1->send_size;
3081
3082                                                         /*-
3083                                                          * update RTO too ?
3084                                                          */
3085                                                         if (tp1->do_rtt) {
3086                                                                 if (*rto_ok) {
3087                                                                         tp1->whoTo->RTO =
3088                                                                             sctp_calculate_rto(stcb,
3089                                                                             &stcb->asoc,
3090                                                                             tp1->whoTo,
3091                                                                             &tp1->sent_rcv_time,
3092                                                                             SCTP_RTT_FROM_DATA);
3093                                                                         *rto_ok = 0;
3094                                                                 }
3095                                                                 if (tp1->whoTo->rto_needed == 0) {
3096                                                                         tp1->whoTo->rto_needed = 1;
3097                                                                 }
3098                                                                 tp1->do_rtt = 0;
3099                                                         }
3100                                                 }
3101                                         }
3102                                         if (tp1->sent <= SCTP_DATAGRAM_RESEND) {
3103                                                 if (SCTP_TSN_GT(tp1->rec.data.tsn,
3104                                                     stcb->asoc.this_sack_highest_gap)) {
3105                                                         stcb->asoc.this_sack_highest_gap =
3106                                                             tp1->rec.data.tsn;
3107                                                 }
3108                                                 if (tp1->sent == SCTP_DATAGRAM_RESEND) {
3109                                                         sctp_ucount_decr(stcb->asoc.sent_queue_retran_cnt);
3110 #ifdef SCTP_AUDITING_ENABLED
3111                                                         sctp_audit_log(0xB2,
3112                                                             (stcb->asoc.sent_queue_retran_cnt & 0x000000ff));
3113 #endif
3114                                                 }
3115                                         }
3116                                         /*-
3117                                          * All chunks NOT UNSENT fall through here and are marked
3118                                          * (leave PR-SCTP ones that are to skip alone though)
3119                                          */
3120                                         if ((tp1->sent != SCTP_FORWARD_TSN_SKIP) &&
3121                                             (tp1->sent != SCTP_DATAGRAM_NR_ACKED)) {
3122                                                 tp1->sent = SCTP_DATAGRAM_MARKED;
3123                                         }
3124                                         if (tp1->rec.data.chunk_was_revoked) {
3125                                                 /* deflate the cwnd */
3126                                                 tp1->whoTo->cwnd -= tp1->book_size;
3127                                                 tp1->rec.data.chunk_was_revoked = 0;
3128                                         }
3129                                         /* NR Sack code here */
3130                                         if (nr_sacking &&
3131                                             (tp1->sent != SCTP_DATAGRAM_NR_ACKED)) {
3132                                                 if (stcb->asoc.strmout[tp1->rec.data.sid].chunks_on_queues > 0) {
3133                                                         stcb->asoc.strmout[tp1->rec.data.sid].chunks_on_queues--;
3134 #ifdef INVARIANTS
3135                                                 } else {
3136                                                         panic("No chunks on the queues for sid %u.", tp1->rec.data.sid);
3137 #endif
3138                                                 }
3139                                                 if ((stcb->asoc.strmout[tp1->rec.data.sid].chunks_on_queues == 0) &&
3140                                                     (stcb->asoc.strmout[tp1->rec.data.sid].state == SCTP_STREAM_RESET_PENDING) &&
3141                                                     TAILQ_EMPTY(&stcb->asoc.strmout[tp1->rec.data.sid].outqueue)) {
3142                                                         stcb->asoc.trigger_reset = 1;
3143                                                 }
3144                                                 tp1->sent = SCTP_DATAGRAM_NR_ACKED;
3145                                                 if (tp1->data) {
3146                                                         /*
3147                                                          * sa_ignore
3148                                                          * NO_NULL_CHK
3149                                                          */
3150                                                         sctp_free_bufspace(stcb, &stcb->asoc, tp1, 1);
3151                                                         sctp_m_freem(tp1->data);
3152                                                         tp1->data = NULL;
3153                                                 }
3154                                                 wake_him++;
3155                                         }
3156                                 }
3157                                 break;
3158                         }       /* if (tp1->tsn == theTSN) */
3159                         if (SCTP_TSN_GT(tp1->rec.data.tsn, theTSN)) {
3160                                 break;
3161                         }
3162                         tp1 = TAILQ_NEXT(tp1, sctp_next);
3163                         if ((tp1 == NULL) && (circled == 0)) {
3164                                 circled++;
3165                                 tp1 = TAILQ_FIRST(&stcb->asoc.sent_queue);
3166                         }
3167                 }               /* end while (tp1) */
3168                 if (tp1 == NULL) {
3169                         circled = 0;
3170                         tp1 = TAILQ_FIRST(&stcb->asoc.sent_queue);
3171                 }
3172                 /* In case the fragments were not in order we must reset */
3173         }                       /* end for (j = fragStart */
3174         *p_tp1 = tp1;
3175         return (wake_him);      /* Return value only used for nr-sack */
3176 }
3177
3178
3179 static int
3180 sctp_handle_segments(struct mbuf *m, int *offset, struct sctp_tcb *stcb, struct sctp_association *asoc,
3181     uint32_t last_tsn, uint32_t *biggest_tsn_acked,
3182     uint32_t *biggest_newly_acked_tsn, uint32_t *this_sack_lowest_newack,
3183     int num_seg, int num_nr_seg, int *rto_ok)
3184 {
3185         struct sctp_gap_ack_block *frag, block;
3186         struct sctp_tmit_chunk *tp1;
3187         int i;
3188         int num_frs = 0;
3189         int chunk_freed;
3190         int non_revocable;
3191         uint16_t frag_strt, frag_end, prev_frag_end;
3192
3193         tp1 = TAILQ_FIRST(&asoc->sent_queue);
3194         prev_frag_end = 0;
3195         chunk_freed = 0;
3196
3197         for (i = 0; i < (num_seg + num_nr_seg); i++) {
3198                 if (i == num_seg) {
3199                         prev_frag_end = 0;
3200                         tp1 = TAILQ_FIRST(&asoc->sent_queue);
3201                 }
3202                 frag = (struct sctp_gap_ack_block *)sctp_m_getptr(m, *offset,
3203                     sizeof(struct sctp_gap_ack_block), (uint8_t *)&block);
3204                 *offset += sizeof(block);
3205                 if (frag == NULL) {
3206                         return (chunk_freed);
3207                 }
3208                 frag_strt = ntohs(frag->start);
3209                 frag_end = ntohs(frag->end);
3210
3211                 if (frag_strt > frag_end) {
3212                         /* This gap report is malformed, skip it. */
3213                         continue;
3214                 }
3215                 if (frag_strt <= prev_frag_end) {
3216                         /* This gap report is not in order, so restart. */
3217                         tp1 = TAILQ_FIRST(&asoc->sent_queue);
3218                 }
3219                 if (SCTP_TSN_GT((last_tsn + frag_end), *biggest_tsn_acked)) {
3220                         *biggest_tsn_acked = last_tsn + frag_end;
3221                 }
3222                 if (i < num_seg) {
3223                         non_revocable = 0;
3224                 } else {
3225                         non_revocable = 1;
3226                 }
3227                 if (sctp_process_segment_range(stcb, &tp1, last_tsn, frag_strt, frag_end,
3228                     non_revocable, &num_frs, biggest_newly_acked_tsn,
3229                     this_sack_lowest_newack, rto_ok)) {
3230                         chunk_freed = 1;
3231                 }
3232                 prev_frag_end = frag_end;
3233         }
3234         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) {
3235                 if (num_frs)
3236                         sctp_log_fr(*biggest_tsn_acked,
3237                             *biggest_newly_acked_tsn,
3238                             last_tsn, SCTP_FR_LOG_BIGGEST_TSNS);
3239         }
3240         return (chunk_freed);
3241 }
3242
3243 static void
3244 sctp_check_for_revoked(struct sctp_tcb *stcb,
3245     struct sctp_association *asoc, uint32_t cumack,
3246     uint32_t biggest_tsn_acked)
3247 {
3248         struct sctp_tmit_chunk *tp1;
3249
3250         TAILQ_FOREACH(tp1, &asoc->sent_queue, sctp_next) {
3251                 if (SCTP_TSN_GT(tp1->rec.data.tsn, cumack)) {
3252                         /*
3253                          * ok this guy is either ACK or MARKED. If it is
3254                          * ACKED it has been previously acked but not this
3255                          * time i.e. revoked.  If it is MARKED it was ACK'ed
3256                          * again.
3257                          */
3258                         if (SCTP_TSN_GT(tp1->rec.data.tsn, biggest_tsn_acked)) {
3259                                 break;
3260                         }
3261                         if (tp1->sent == SCTP_DATAGRAM_ACKED) {
3262                                 /* it has been revoked */
3263                                 tp1->sent = SCTP_DATAGRAM_SENT;
3264                                 tp1->rec.data.chunk_was_revoked = 1;
3265                                 /*
3266                                  * We must add this stuff back in to assure
3267                                  * timers and such get started.
3268                                  */
3269                                 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FLIGHT_LOGGING_ENABLE) {
3270                                         sctp_misc_ints(SCTP_FLIGHT_LOG_UP_REVOKE,
3271                                             tp1->whoTo->flight_size,
3272                                             tp1->book_size,
3273                                             (uint32_t)(uintptr_t)tp1->whoTo,
3274                                             tp1->rec.data.tsn);
3275                                 }
3276                                 sctp_flight_size_increase(tp1);
3277                                 sctp_total_flight_increase(stcb, tp1);
3278                                 /*
3279                                  * We inflate the cwnd to compensate for our
3280                                  * artificial inflation of the flight_size.
3281                                  */
3282                                 tp1->whoTo->cwnd += tp1->book_size;
3283                                 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SACK_LOGGING_ENABLE) {
3284                                         sctp_log_sack(asoc->last_acked_seq,
3285                                             cumack,
3286                                             tp1->rec.data.tsn,
3287                                             0,
3288                                             0,
3289                                             SCTP_LOG_TSN_REVOKED);
3290                                 }
3291                         } else if (tp1->sent == SCTP_DATAGRAM_MARKED) {
3292                                 /* it has been re-acked in this SACK */
3293                                 tp1->sent = SCTP_DATAGRAM_ACKED;
3294                         }
3295                 }
3296                 if (tp1->sent == SCTP_DATAGRAM_UNSENT)
3297                         break;
3298         }
3299 }
3300
3301
3302 static void
3303 sctp_strike_gap_ack_chunks(struct sctp_tcb *stcb, struct sctp_association *asoc,
3304     uint32_t biggest_tsn_acked, uint32_t biggest_tsn_newly_acked, uint32_t this_sack_lowest_newack, int accum_moved)
3305 {
3306         struct sctp_tmit_chunk *tp1;
3307         int strike_flag = 0;
3308         struct timeval now;
3309         int tot_retrans = 0;
3310         uint32_t sending_seq;
3311         struct sctp_nets *net;
3312         int num_dests_sacked = 0;
3313
3314         /*
3315          * select the sending_seq, this is either the next thing ready to be
3316          * sent but not transmitted, OR, the next seq we assign.
3317          */
3318         tp1 = TAILQ_FIRST(&stcb->asoc.send_queue);
3319         if (tp1 == NULL) {
3320                 sending_seq = asoc->sending_seq;
3321         } else {
3322                 sending_seq = tp1->rec.data.tsn;
3323         }
3324
3325         /* CMT DAC algo: finding out if SACK is a mixed SACK */
3326         if ((asoc->sctp_cmt_on_off > 0) &&
3327             SCTP_BASE_SYSCTL(sctp_cmt_use_dac)) {
3328                 TAILQ_FOREACH(net, &asoc->nets, sctp_next) {
3329                         if (net->saw_newack)
3330                                 num_dests_sacked++;
3331                 }
3332         }
3333         if (stcb->asoc.prsctp_supported) {
3334                 (void)SCTP_GETTIME_TIMEVAL(&now);
3335         }
3336         TAILQ_FOREACH(tp1, &asoc->sent_queue, sctp_next) {
3337                 strike_flag = 0;
3338                 if (tp1->no_fr_allowed) {
3339                         /* this one had a timeout or something */
3340                         continue;
3341                 }
3342                 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) {
3343                         if (tp1->sent < SCTP_DATAGRAM_RESEND)
3344                                 sctp_log_fr(biggest_tsn_newly_acked,
3345                                     tp1->rec.data.tsn,
3346                                     tp1->sent,
3347                                     SCTP_FR_LOG_CHECK_STRIKE);
3348                 }
3349                 if (SCTP_TSN_GT(tp1->rec.data.tsn, biggest_tsn_acked) ||
3350                     tp1->sent == SCTP_DATAGRAM_UNSENT) {
3351                         /* done */
3352                         break;
3353                 }
3354                 if (stcb->asoc.prsctp_supported) {
3355                         if ((PR_SCTP_TTL_ENABLED(tp1->flags)) && tp1->sent < SCTP_DATAGRAM_ACKED) {
3356                                 /* Is it expired? */
3357                                 if (timevalcmp(&now, &tp1->rec.data.timetodrop, >)) {
3358                                         /* Yes so drop it */
3359                                         if (tp1->data != NULL) {
3360                                                 (void)sctp_release_pr_sctp_chunk(stcb, tp1, 1,
3361                                                     SCTP_SO_NOT_LOCKED);
3362                                         }
3363                                         continue;
3364                                 }
3365                         }
3366                 }
3367                 if (SCTP_TSN_GT(tp1->rec.data.tsn, asoc->this_sack_highest_gap) &&
3368                     !(accum_moved && asoc->fast_retran_loss_recovery)) {
3369                         /* we are beyond the tsn in the sack  */
3370                         break;
3371                 }
3372                 if (tp1->sent >= SCTP_DATAGRAM_RESEND) {
3373                         /* either a RESEND, ACKED, or MARKED */
3374                         /* skip */
3375                         if (tp1->sent == SCTP_FORWARD_TSN_SKIP) {
3376                                 /* Continue strikin FWD-TSN chunks */
3377                                 tp1->rec.data.fwd_tsn_cnt++;
3378                         }
3379                         continue;
3380                 }
3381                 /*
3382                  * CMT : SFR algo (covers part of DAC and HTNA as well)
3383                  */
3384                 if (tp1->whoTo && tp1->whoTo->saw_newack == 0) {
3385                         /*
3386                          * No new acks were receieved for data sent to this
3387                          * dest. Therefore, according to the SFR algo for
3388                          * CMT, no data sent to this dest can be marked for
3389                          * FR using this SACK.
3390                          */
3391                         continue;
3392                 } else if (tp1->whoTo &&
3393                             SCTP_TSN_GT(tp1->rec.data.tsn,
3394                             tp1->whoTo->this_sack_highest_newack) &&
3395                     !(accum_moved && asoc->fast_retran_loss_recovery)) {
3396                         /*
3397                          * CMT: New acks were receieved for data sent to
3398                          * this dest. But no new acks were seen for data
3399                          * sent after tp1. Therefore, according to the SFR
3400                          * algo for CMT, tp1 cannot be marked for FR using
3401                          * this SACK. This step covers part of the DAC algo
3402                          * and the HTNA algo as well.
3403                          */
3404                         continue;
3405                 }
3406                 /*
3407                  * Here we check to see if we were have already done a FR
3408                  * and if so we see if the biggest TSN we saw in the sack is
3409                  * smaller than the recovery point. If so we don't strike
3410                  * the tsn... otherwise we CAN strike the TSN.
3411                  */
3412                 /*
3413                  * @@@ JRI: Check for CMT if (accum_moved &&
3414                  * asoc->fast_retran_loss_recovery && (sctp_cmt_on_off ==
3415                  * 0)) {
3416                  */
3417                 if (accum_moved && asoc->fast_retran_loss_recovery) {
3418                         /*
3419                          * Strike the TSN if in fast-recovery and cum-ack
3420                          * moved.
3421                          */
3422                         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) {
3423                                 sctp_log_fr(biggest_tsn_newly_acked,
3424                                     tp1->rec.data.tsn,
3425                                     tp1->sent,
3426                                     SCTP_FR_LOG_STRIKE_CHUNK);
3427                         }
3428                         if (tp1->sent < SCTP_DATAGRAM_RESEND) {
3429                                 tp1->sent++;
3430                         }
3431                         if ((asoc->sctp_cmt_on_off > 0) &&
3432                             SCTP_BASE_SYSCTL(sctp_cmt_use_dac)) {
3433                                 /*
3434                                  * CMT DAC algorithm: If SACK flag is set to
3435                                  * 0, then lowest_newack test will not pass
3436                                  * because it would have been set to the
3437                                  * cumack earlier. If not already to be
3438                                  * rtx'd, If not a mixed sack and if tp1 is
3439                                  * not between two sacked TSNs, then mark by
3440                                  * one more. NOTE that we are marking by one
3441                                  * additional time since the SACK DAC flag
3442                                  * indicates that two packets have been
3443                                  * received after this missing TSN.
3444                                  */
3445                                 if ((tp1->sent < SCTP_DATAGRAM_RESEND) && (num_dests_sacked == 1) &&
3446                                     SCTP_TSN_GT(this_sack_lowest_newack, tp1->rec.data.tsn)) {
3447                                         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) {
3448                                                 sctp_log_fr(16 + num_dests_sacked,
3449                                                     tp1->rec.data.tsn,
3450                                                     tp1->sent,
3451                                                     SCTP_FR_LOG_STRIKE_CHUNK);
3452                                         }
3453                                         tp1->sent++;
3454                                 }
3455                         }
3456                 } else if ((tp1->rec.data.doing_fast_retransmit) &&
3457                     (asoc->sctp_cmt_on_off == 0)) {
3458                         /*
3459                          * For those that have done a FR we must take
3460                          * special consideration if we strike. I.e the
3461                          * biggest_newly_acked must be higher than the
3462                          * sending_seq at the time we did the FR.
3463                          */
3464                         if (
3465 #ifdef SCTP_FR_TO_ALTERNATE
3466                         /*
3467                          * If FR's go to new networks, then we must only do
3468                          * this for singly homed asoc's. However if the FR's
3469                          * go to the same network (Armando's work) then its
3470                          * ok to FR multiple times.
3471                          */
3472                             (asoc->numnets < 2)
3473 #else
3474                             (1)
3475 #endif
3476                             ) {
3477
3478                                 if (SCTP_TSN_GE(biggest_tsn_newly_acked,
3479                                     tp1->rec.data.fast_retran_tsn)) {
3480                                         /*
3481                                          * Strike the TSN, since this ack is
3482                                          * beyond where things were when we
3483                                          * did a FR.
3484                                          */
3485                                         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) {
3486                                                 sctp_log_fr(biggest_tsn_newly_acked,
3487                                                     tp1->rec.data.tsn,
3488                                                     tp1->sent,
3489                                                     SCTP_FR_LOG_STRIKE_CHUNK);
3490                                         }
3491                                         if (tp1->sent < SCTP_DATAGRAM_RESEND) {
3492                                                 tp1->sent++;
3493                                         }
3494                                         strike_flag = 1;
3495                                         if ((asoc->sctp_cmt_on_off > 0) &&
3496                                             SCTP_BASE_SYSCTL(sctp_cmt_use_dac)) {
3497                                                 /*
3498                                                  * CMT DAC algorithm: If
3499                                                  * SACK flag is set to 0,
3500                                                  * then lowest_newack test
3501                                                  * will not pass because it
3502                                                  * would have been set to
3503                                                  * the cumack earlier. If
3504                                                  * not already to be rtx'd,
3505                                                  * If not a mixed sack and
3506                                                  * if tp1 is not between two
3507                                                  * sacked TSNs, then mark by
3508                                                  * one more. NOTE that we
3509                                                  * are marking by one
3510                                                  * additional time since the
3511                                                  * SACK DAC flag indicates
3512                                                  * that two packets have
3513                                                  * been received after this
3514                                                  * missing TSN.
3515                                                  */
3516                                                 if ((tp1->sent < SCTP_DATAGRAM_RESEND) &&
3517                                                     (num_dests_sacked == 1) &&
3518                                                     SCTP_TSN_GT(this_sack_lowest_newack,
3519                                                     tp1->rec.data.tsn)) {
3520                                                         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) {
3521                                                                 sctp_log_fr(32 + num_dests_sacked,
3522                                                                     tp1->rec.data.tsn,
3523                                                                     tp1->sent,
3524                                                                     SCTP_FR_LOG_STRIKE_CHUNK);
3525                                                         }
3526                                                         if (tp1->sent < SCTP_DATAGRAM_RESEND) {
3527                                                                 tp1->sent++;
3528                                                         }
3529                                                 }
3530                                         }
3531                                 }
3532                         }
3533                         /*
3534                          * JRI: TODO: remove code for HTNA algo. CMT's SFR
3535                          * algo covers HTNA.
3536                          */
3537                 } else if (SCTP_TSN_GT(tp1->rec.data.tsn,
3538                     biggest_tsn_newly_acked)) {
3539                         /*
3540                          * We don't strike these: This is the  HTNA
3541                          * algorithm i.e. we don't strike If our TSN is
3542                          * larger than the Highest TSN Newly Acked.
3543                          */
3544                         ;
3545                 } else {
3546                         /* Strike the TSN */
3547                         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) {
3548                                 sctp_log_fr(biggest_tsn_newly_acked,
3549                                     tp1->rec.data.tsn,
3550                                     tp1->sent,
3551                                     SCTP_FR_LOG_STRIKE_CHUNK);
3552                         }
3553                         if (tp1->sent < SCTP_DATAGRAM_RESEND) {
3554                                 tp1->sent++;
3555                         }
3556                         if ((asoc->sctp_cmt_on_off > 0) &&
3557                             SCTP_BASE_SYSCTL(sctp_cmt_use_dac)) {
3558                                 /*
3559                                  * CMT DAC algorithm: If SACK flag is set to
3560                                  * 0, then lowest_newack test will not pass
3561                                  * because it would have been set to the
3562                                  * cumack earlier. If not already to be
3563                                  * rtx'd, If not a mixed sack and if tp1 is
3564                                  * not between two sacked TSNs, then mark by
3565                                  * one more. NOTE that we are marking by one
3566                                  * additional time since the SACK DAC flag
3567                                  * indicates that two packets have been
3568                                  * received after this missing TSN.
3569                                  */
3570                                 if ((tp1->sent < SCTP_DATAGRAM_RESEND) && (num_dests_sacked == 1) &&
3571                                     SCTP_TSN_GT(this_sack_lowest_newack, tp1->rec.data.tsn)) {
3572                                         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) {
3573                                                 sctp_log_fr(48 + num_dests_sacked,
3574                                                     tp1->rec.data.tsn,
3575                                                     tp1->sent,
3576                                                     SCTP_FR_LOG_STRIKE_CHUNK);
3577                                         }
3578                                         tp1->sent++;
3579                                 }
3580                         }
3581                 }
3582                 if (tp1->sent == SCTP_DATAGRAM_RESEND) {
3583                         struct sctp_nets *alt;
3584
3585                         /* fix counts and things */
3586                         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FLIGHT_LOGGING_ENABLE) {
3587                                 sctp_misc_ints(SCTP_FLIGHT_LOG_DOWN_RSND,
3588                                     (tp1->whoTo ? (tp1->whoTo->flight_size) : 0),
3589                                     tp1->book_size,
3590                                     (uint32_t)(uintptr_t)tp1->whoTo,
3591                                     tp1->rec.data.tsn);
3592                         }
3593                         if (tp1->whoTo) {
3594                                 tp1->whoTo->net_ack++;
3595                                 sctp_flight_size_decrease(tp1);
3596                                 if (stcb->asoc.cc_functions.sctp_cwnd_update_tsn_acknowledged) {
3597                                         (*stcb->asoc.cc_functions.sctp_cwnd_update_tsn_acknowledged) (tp1->whoTo,
3598                                             tp1);
3599                                 }
3600                         }
3601                         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_RWND_ENABLE) {
3602                                 sctp_log_rwnd(SCTP_INCREASE_PEER_RWND,
3603                                     asoc->peers_rwnd, tp1->send_size, SCTP_BASE_SYSCTL(sctp_peer_chunk_oh));
3604                         }
3605                         /* add back to the rwnd */
3606                         asoc->peers_rwnd += (tp1->send_size + SCTP_BASE_SYSCTL(sctp_peer_chunk_oh));
3607
3608                         /* remove from the total flight */
3609                         sctp_total_flight_decrease(stcb, tp1);
3610
3611                         if ((stcb->asoc.prsctp_supported) &&
3612                             (PR_SCTP_RTX_ENABLED(tp1->flags))) {
3613                                 /*
3614                                  * Has it been retransmitted tv_sec times? -
3615                                  * we store the retran count there.
3616                                  */
3617                                 if (tp1->snd_count > tp1->rec.data.timetodrop.tv_sec) {
3618                                         /* Yes, so drop it */
3619                                         if (tp1->data != NULL) {
3620                                                 (void)sctp_release_pr_sctp_chunk(stcb, tp1, 1,
3621                                                     SCTP_SO_NOT_LOCKED);
3622                                         }
3623                                         /* Make sure to flag we had a FR */
3624                                         if (tp1->whoTo != NULL) {
3625                                                 tp1->whoTo->net_ack++;
3626                                         }
3627                                         continue;
3628                                 }
3629                         }
3630                         /*
3631                          * SCTP_PRINTF("OK, we are now ready to FR this
3632                          * guy\n");
3633                          */
3634                         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE) {
3635                                 sctp_log_fr(tp1->rec.data.tsn, tp1->snd_count,
3636                                     0, SCTP_FR_MARKED);
3637                         }
3638                         if (strike_flag) {
3639                                 /* This is a subsequent FR */
3640                                 SCTP_STAT_INCR(sctps_sendmultfastretrans);
3641                         }
3642                         sctp_ucount_incr(stcb->asoc.sent_queue_retran_cnt);
3643                         if (asoc->sctp_cmt_on_off > 0) {
3644                                 /*
3645                                  * CMT: Using RTX_SSTHRESH policy for CMT.
3646                                  * If CMT is being used, then pick dest with
3647                                  * largest ssthresh for any retransmission.
3648                                  */
3649                                 tp1->no_fr_allowed = 1;
3650                                 alt = tp1->whoTo;
3651                                 /* sa_ignore NO_NULL_CHK */
3652                                 if (asoc->sctp_cmt_pf > 0) {
3653                                         /*
3654                                          * JRS 5/18/07 - If CMT PF is on,
3655                                          * use the PF version of
3656                                          * find_alt_net()
3657                                          */
3658                                         alt = sctp_find_alternate_net(stcb, alt, 2);
3659                                 } else {
3660                                         /*
3661                                          * JRS 5/18/07 - If only CMT is on,
3662                                          * use the CMT version of
3663                                          * find_alt_net()
3664                                          */
3665                                         /* sa_ignore NO_NULL_CHK */
3666                                         alt = sctp_find_alternate_net(stcb, alt, 1);
3667                                 }
3668                                 if (alt == NULL) {
3669                                         alt = tp1->whoTo;
3670                                 }
3671                                 /*
3672                                  * CUCv2: If a different dest is picked for
3673                                  * the retransmission, then new
3674                                  * (rtx-)pseudo_cumack needs to be tracked
3675                                  * for orig dest. Let CUCv2 track new (rtx-)
3676                                  * pseudo-cumack always.
3677                                  */
3678                                 if (tp1->whoTo) {
3679                                         tp1->whoTo->find_pseudo_cumack = 1;
3680                                         tp1->whoTo->find_rtx_pseudo_cumack = 1;
3681                                 }
3682                         } else {        /* CMT is OFF */
3683
3684 #ifdef SCTP_FR_TO_ALTERNATE
3685                                 /* Can we find an alternate? */
3686                                 alt = sctp_find_alternate_net(stcb, tp1->whoTo, 0);
3687 #else
3688                                 /*
3689                                  * default behavior is to NOT retransmit
3690                                  * FR's to an alternate. Armando Caro's
3691                                  * paper details why.
3692                                  */
3693                                 alt = tp1->whoTo;
3694 #endif
3695                         }
3696
3697                         tp1->rec.data.doing_fast_retransmit = 1;
3698                         tot_retrans++;
3699                         /* mark the sending seq for possible subsequent FR's */
3700                         /*
3701                          * SCTP_PRINTF("Marking TSN for FR new value %x\n",
3702                          * (uint32_t)tpi->rec.data.tsn);
3703                          */
3704                         if (TAILQ_EMPTY(&asoc->send_queue)) {
3705                                 /*
3706                                  * If the queue of send is empty then its
3707                                  * the next sequence number that will be
3708                                  * assigned so we subtract one from this to
3709                                  * get the one we last sent.
3710                                  */
3711                                 tp1->rec.data.fast_retran_tsn = sending_seq;
3712                         } else {
3713                                 /*
3714                                  * If there are chunks on the send queue
3715                                  * (unsent data that has made it from the
3716                                  * stream queues but not out the door, we
3717                                  * take the first one (which will have the
3718                                  * lowest TSN) and subtract one to get the
3719                                  * one we last sent.
3720                                  */
3721                                 struct sctp_tmit_chunk *ttt;
3722
3723                                 ttt = TAILQ_FIRST(&asoc->send_queue);
3724                                 tp1->rec.data.fast_retran_tsn =
3725                                     ttt->rec.data.tsn;
3726                         }
3727
3728                         if (tp1->do_rtt) {
3729                                 /*
3730                                  * this guy had a RTO calculation pending on
3731                                  * it, cancel it
3732                                  */
3733                                 if ((tp1->whoTo != NULL) &&
3734                                     (tp1->whoTo->rto_needed == 0)) {
3735                                         tp1->whoTo->rto_needed = 1;
3736                                 }
3737                                 tp1->do_rtt = 0;
3738                         }
3739                         if (alt != tp1->whoTo) {
3740                                 /* yes, there is an alternate. */
3741                                 sctp_free_remote_addr(tp1->whoTo);
3742                                 /* sa_ignore FREED_MEMORY */
3743                                 tp1->whoTo = alt;
3744                                 atomic_add_int(&alt->ref_count, 1);
3745                         }
3746                 }
3747         }
3748 }
3749
3750 struct sctp_tmit_chunk *
3751 sctp_try_advance_peer_ack_point(struct sctp_tcb *stcb,
3752     struct sctp_association *asoc)
3753 {
3754         struct sctp_tmit_chunk *tp1, *tp2, *a_adv = NULL;
3755         struct timeval now;
3756         int now_filled = 0;
3757
3758         if (asoc->prsctp_supported == 0) {
3759                 return (NULL);
3760         }
3761         TAILQ_FOREACH_SAFE(tp1, &asoc->sent_queue, sctp_next, tp2) {
3762                 if (tp1->sent != SCTP_FORWARD_TSN_SKIP &&
3763                     tp1->sent != SCTP_DATAGRAM_RESEND &&
3764                     tp1->sent != SCTP_DATAGRAM_NR_ACKED) {
3765                         /* no chance to advance, out of here */
3766                         break;
3767                 }
3768                 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_TRY_ADVANCE) {
3769                         if ((tp1->sent == SCTP_FORWARD_TSN_SKIP) ||
3770                             (tp1->sent == SCTP_DATAGRAM_NR_ACKED)) {
3771                                 sctp_misc_ints(SCTP_FWD_TSN_CHECK,
3772                                     asoc->advanced_peer_ack_point,
3773                                     tp1->rec.data.tsn, 0, 0);
3774                         }
3775                 }
3776                 if (!PR_SCTP_ENABLED(tp1->flags)) {
3777                         /*
3778                          * We can't fwd-tsn past any that are reliable aka
3779                          * retransmitted until the asoc fails.
3780                          */
3781                         break;
3782                 }
3783                 if (!now_filled) {
3784                         (void)SCTP_GETTIME_TIMEVAL(&now);
3785                         now_filled = 1;
3786                 }
3787                 /*
3788                  * now we got a chunk which is marked for another
3789                  * retransmission to a PR-stream but has run out its chances
3790                  * already maybe OR has been marked to skip now. Can we skip
3791                  * it if its a resend?
3792                  */
3793                 if (tp1->sent == SCTP_DATAGRAM_RESEND &&
3794                     (PR_SCTP_TTL_ENABLED(tp1->flags))) {
3795                         /*
3796                          * Now is this one marked for resend and its time is
3797                          * now up?
3798                          */
3799                         if (timevalcmp(&now, &tp1->rec.data.timetodrop, >)) {
3800                                 /* Yes so drop it */
3801                                 if (tp1->data) {
3802                                         (void)sctp_release_pr_sctp_chunk(stcb, tp1,
3803                                             1, SCTP_SO_NOT_LOCKED);
3804                                 }
3805                         } else {
3806                                 /*
3807                                  * No, we are done when hit one for resend
3808                                  * whos time as not expired.
3809                                  */
3810                                 break;
3811                         }
3812                 }
3813                 /*
3814                  * Ok now if this chunk is marked to drop it we can clean up
3815                  * the chunk, advance our peer ack point and we can check
3816                  * the next chunk.
3817                  */
3818                 if ((tp1->sent == SCTP_FORWARD_TSN_SKIP) ||
3819                     (tp1->sent == SCTP_DATAGRAM_NR_ACKED)) {
3820                         /* advance PeerAckPoint goes forward */
3821                         if (SCTP_TSN_GT(tp1->rec.data.tsn, asoc->advanced_peer_ack_point)) {
3822                                 asoc->advanced_peer_ack_point = tp1->rec.data.tsn;
3823                                 a_adv = tp1;
3824                         } else if (tp1->rec.data.tsn == asoc->advanced_peer_ack_point) {
3825                                 /* No update but we do save the chk */
3826                                 a_adv = tp1;
3827                         }
3828                 } else {
3829                         /*
3830                          * If it is still in RESEND we can advance no
3831                          * further
3832                          */
3833                         break;
3834                 }
3835         }
3836         return (a_adv);
3837 }
3838
3839 static int
3840 sctp_fs_audit(struct sctp_association *asoc)
3841 {
3842         struct sctp_tmit_chunk *chk;
3843         int inflight = 0, resend = 0, inbetween = 0, acked = 0, above = 0;
3844         int ret;
3845 #ifndef INVARIANTS
3846         int entry_flight, entry_cnt;
3847 #endif
3848
3849         ret = 0;
3850 #ifndef INVARIANTS
3851         entry_flight = asoc->total_flight;
3852         entry_cnt = asoc->total_flight_count;
3853 #endif
3854         if (asoc->pr_sctp_cnt >= asoc->sent_queue_cnt)
3855                 return (0);
3856
3857         TAILQ_FOREACH(chk, &asoc->sent_queue, sctp_next) {
3858                 if (chk->sent < SCTP_DATAGRAM_RESEND) {
3859                         SCTP_PRINTF("Chk TSN: %u size: %d inflight cnt: %d\n",
3860                             chk->rec.data.tsn,
3861                             chk->send_size,
3862                             chk->snd_count);
3863                         inflight++;
3864                 } else if (chk->sent == SCTP_DATAGRAM_RESEND) {
3865                         resend++;
3866                 } else if (chk->sent < SCTP_DATAGRAM_ACKED) {
3867                         inbetween++;
3868                 } else if (chk->sent > SCTP_DATAGRAM_ACKED) {
3869                         above++;
3870                 } else {
3871                         acked++;
3872                 }
3873         }
3874
3875         if ((inflight > 0) || (inbetween > 0)) {
3876 #ifdef INVARIANTS
3877                 panic("Flight size-express incorrect? \n");
3878 #else
3879                 SCTP_PRINTF("asoc->total_flight: %d cnt: %d\n",
3880                     entry_flight, entry_cnt);
3881
3882                 SCTP_PRINTF("Flight size-express incorrect F: %d I: %d R: %d Ab: %d ACK: %d\n",
3883                     inflight, inbetween, resend, above, acked);
3884                 ret = 1;
3885 #endif
3886         }
3887         return (ret);
3888 }
3889
3890
3891 static void
3892 sctp_window_probe_recovery(struct sctp_tcb *stcb,
3893     struct sctp_association *asoc,
3894     struct sctp_tmit_chunk *tp1)
3895 {
3896         tp1->window_probe = 0;
3897         if ((tp1->sent >= SCTP_DATAGRAM_ACKED) || (tp1->data == NULL)) {
3898                 /* TSN's skipped we do NOT move back. */
3899                 sctp_misc_ints(SCTP_FLIGHT_LOG_DWN_WP_FWD,
3900                     tp1->whoTo ? tp1->whoTo->flight_size : 0,
3901                     tp1->book_size,
3902                     (uint32_t)(uintptr_t)tp1->whoTo,
3903                     tp1->rec.data.tsn);
3904                 return;
3905         }
3906         /* First setup this by shrinking flight */
3907         if (stcb->asoc.cc_functions.sctp_cwnd_update_tsn_acknowledged) {
3908                 (*stcb->asoc.cc_functions.sctp_cwnd_update_tsn_acknowledged) (tp1->whoTo,
3909                     tp1);
3910         }
3911         sctp_flight_size_decrease(tp1);
3912         sctp_total_flight_decrease(stcb, tp1);
3913         /* Now mark for resend */
3914         tp1->sent = SCTP_DATAGRAM_RESEND;
3915         sctp_ucount_incr(asoc->sent_queue_retran_cnt);
3916
3917         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FLIGHT_LOGGING_ENABLE) {
3918                 sctp_misc_ints(SCTP_FLIGHT_LOG_DOWN_WP,
3919                     tp1->whoTo->flight_size,
3920                     tp1->book_size,
3921                     (uint32_t)(uintptr_t)tp1->whoTo,
3922                     tp1->rec.data.tsn);
3923         }
3924 }
3925
3926 void
3927 sctp_express_handle_sack(struct sctp_tcb *stcb, uint32_t cumack,
3928     uint32_t rwnd, int *abort_now, int ecne_seen)
3929 {
3930         struct sctp_nets *net;
3931         struct sctp_association *asoc;
3932         struct sctp_tmit_chunk *tp1, *tp2;
3933         uint32_t old_rwnd;
3934         int win_probe_recovery = 0;
3935         int win_probe_recovered = 0;
3936         int j, done_once = 0;
3937         int rto_ok = 1;
3938         uint32_t send_s;
3939
3940         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_SACK_ARRIVALS_ENABLE) {
3941                 sctp_misc_ints(SCTP_SACK_LOG_EXPRESS, cumack,
3942                     rwnd, stcb->asoc.last_acked_seq, stcb->asoc.peers_rwnd);
3943         }
3944         SCTP_TCB_LOCK_ASSERT(stcb);
3945 #ifdef SCTP_ASOCLOG_OF_TSNS
3946         stcb->asoc.cumack_log[stcb->asoc.cumack_log_at] = cumack;
3947         stcb->asoc.cumack_log_at++;
3948         if (stcb->asoc.cumack_log_at > SCTP_TSN_LOG_SIZE) {
3949                 stcb->asoc.cumack_log_at = 0;
3950         }
3951 #endif
3952         asoc = &stcb->asoc;
3953         old_rwnd = asoc->peers_rwnd;
3954         if (SCTP_TSN_GT(asoc->last_acked_seq, cumack)) {
3955                 /* old ack */
3956                 return;
3957         } else if (asoc->last_acked_seq == cumack) {
3958                 /* Window update sack */
3959                 asoc->peers_rwnd = sctp_sbspace_sub(rwnd,
3960                     (uint32_t)(asoc->total_flight + (asoc->total_flight_count * SCTP_BASE_SYSCTL(sctp_peer_chunk_oh))));
3961                 if (asoc->peers_rwnd < stcb->sctp_ep->sctp_ep.sctp_sws_sender) {
3962                         /* SWS sender side engages */
3963                         asoc->peers_rwnd = 0;
3964                 }
3965                 if (asoc->peers_rwnd > old_rwnd) {
3966                         goto again;
3967                 }
3968                 return;
3969         }
3970         /* First setup for CC stuff */
3971         TAILQ_FOREACH(net, &asoc->nets, sctp_next) {
3972                 if (SCTP_TSN_GT(cumack, net->cwr_window_tsn)) {
3973                         /* Drag along the window_tsn for cwr's */
3974                         net->cwr_window_tsn = cumack;
3975                 }
3976                 net->prev_cwnd = net->cwnd;
3977                 net->net_ack = 0;
3978                 net->net_ack2 = 0;
3979
3980                 /*
3981                  * CMT: Reset CUC and Fast recovery algo variables before
3982                  * SACK processing
3983                  */
3984                 net->new_pseudo_cumack = 0;
3985                 net->will_exit_fast_recovery = 0;
3986                 if (stcb->asoc.cc_functions.sctp_cwnd_prepare_net_for_sack) {
3987                         (*stcb->asoc.cc_functions.sctp_cwnd_prepare_net_for_sack) (stcb, net);
3988                 }
3989         }
3990         if (!TAILQ_EMPTY(&asoc->sent_queue)) {
3991                 tp1 = TAILQ_LAST(&asoc->sent_queue,
3992                     sctpchunk_listhead);
3993                 send_s = tp1->rec.data.tsn + 1;
3994         } else {
3995                 send_s = asoc->sending_seq;
3996         }
3997         if (SCTP_TSN_GE(cumack, send_s)) {
3998                 struct mbuf *op_err;
3999                 char msg[SCTP_DIAG_INFO_LEN];
4000
4001                 *abort_now = 1;
4002                 /* XXX */
4003                 snprintf(msg, sizeof(msg), "Cum ack %8.8x greater or equal than TSN %8.8x",
4004                     cumack, send_s);
4005                 op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg);
4006                 stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_21;
4007                 sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED);
4008                 return;
4009         }
4010         asoc->this_sack_highest_gap = cumack;
4011         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_THRESHOLD_LOGGING) {
4012                 sctp_misc_ints(SCTP_THRESHOLD_CLEAR,
4013                     stcb->asoc.overall_error_count,
4014                     0,
4015                     SCTP_FROM_SCTP_INDATA,
4016                     __LINE__);
4017         }
4018         stcb->asoc.overall_error_count = 0;
4019         if (SCTP_TSN_GT(cumack, asoc->last_acked_seq)) {
4020                 /* process the new consecutive TSN first */
4021                 TAILQ_FOREACH_SAFE(tp1, &asoc->sent_queue, sctp_next, tp2) {
4022                         if (SCTP_TSN_GE(cumack, tp1->rec.data.tsn)) {
4023                                 if (tp1->sent == SCTP_DATAGRAM_UNSENT) {
4024                                         SCTP_PRINTF("Warning, an unsent is now acked?\n");
4025                                 }
4026                                 if (tp1->sent < SCTP_DATAGRAM_ACKED) {
4027                                         /*
4028                                          * If it is less than ACKED, it is
4029                                          * now no-longer in flight. Higher
4030                                          * values may occur during marking
4031                                          */
4032                                         if (tp1->sent < SCTP_DATAGRAM_RESEND) {
4033                                                 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FLIGHT_LOGGING_ENABLE) {
4034                                                         sctp_misc_ints(SCTP_FLIGHT_LOG_DOWN_CA,
4035                                                             tp1->whoTo->flight_size,
4036                                                             tp1->book_size,
4037                                                             (uint32_t)(uintptr_t)tp1->whoTo,
4038                                                             tp1->rec.data.tsn);
4039                                                 }
4040                                                 sctp_flight_size_decrease(tp1);
4041                                                 if (stcb->asoc.cc_functions.sctp_cwnd_update_tsn_acknowledged) {
4042                                                         (*stcb->asoc.cc_functions.sctp_cwnd_update_tsn_acknowledged) (tp1->whoTo,
4043                                                             tp1);
4044                                                 }
4045                                                 /* sa_ignore NO_NULL_CHK */
4046                                                 sctp_total_flight_decrease(stcb, tp1);
4047                                         }
4048                                         tp1->whoTo->net_ack += tp1->send_size;
4049                                         if (tp1->snd_count < 2) {
4050                                                 /*
4051                                                  * True non-retransmited
4052                                                  * chunk
4053                                                  */
4054                                                 tp1->whoTo->net_ack2 +=
4055                                                     tp1->send_size;
4056
4057                                                 /* update RTO too? */
4058                                                 if (tp1->do_rtt) {
4059                                                         if (rto_ok) {
4060                                                                 tp1->whoTo->RTO =
4061                                                                 /*
4062                                                                  * sa_ignore
4063                                                                  * NO_NULL_CHK
4064                                                                  */
4065                                                                     sctp_calculate_rto(stcb,
4066                                                                     asoc, tp1->whoTo,
4067                                                                     &tp1->sent_rcv_time,
4068                                                                     SCTP_RTT_FROM_DATA);
4069                                                                 rto_ok = 0;
4070                                                         }
4071                                                         if (tp1->whoTo->rto_needed == 0) {
4072                                                                 tp1->whoTo->rto_needed = 1;
4073                                                         }
4074                                                         tp1->do_rtt = 0;
4075                                                 }
4076                                         }
4077                                         /*
4078                                          * CMT: CUCv2 algorithm. From the
4079                                          * cumack'd TSNs, for each TSN being
4080                                          * acked for the first time, set the
4081                                          * following variables for the
4082                                          * corresp destination.
4083                                          * new_pseudo_cumack will trigger a
4084                                          * cwnd update.
4085                                          * find_(rtx_)pseudo_cumack will
4086                                          * trigger search for the next
4087                                          * expected (rtx-)pseudo-cumack.
4088                                          */
4089                                         tp1->whoTo->new_pseudo_cumack = 1;
4090                                         tp1->whoTo->find_pseudo_cumack = 1;
4091                                         tp1->whoTo->find_rtx_pseudo_cumack = 1;
4092
4093                                         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_LOGGING_ENABLE) {
4094                                                 /* sa_ignore NO_NULL_CHK */
4095                                                 sctp_log_cwnd(stcb, tp1->whoTo, tp1->rec.data.tsn, SCTP_CWND_LOG_FROM_SACK);
4096                                         }
4097                                 }
4098                                 if (tp1->sent == SCTP_DATAGRAM_RESEND) {
4099                                         sctp_ucount_decr(asoc->sent_queue_retran_cnt);
4100                                 }
4101                                 if (tp1->rec.data.chunk_was_revoked) {
4102                                         /* deflate the cwnd */
4103                                         tp1->whoTo->cwnd -= tp1->book_size;
4104                                         tp1->rec.data.chunk_was_revoked = 0;
4105                                 }
4106                                 if (tp1->sent != SCTP_DATAGRAM_NR_ACKED) {
4107                                         if (asoc->strmout[tp1->rec.data.sid].chunks_on_queues > 0) {
4108                                                 asoc->strmout[tp1->rec.data.sid].chunks_on_queues--;
4109 #ifdef INVARIANTS
4110                                         } else {
4111                                                 panic("No chunks on the queues for sid %u.", tp1->rec.data.sid);
4112 #endif
4113                                         }
4114                                 }
4115                                 if ((asoc->strmout[tp1->rec.data.sid].chunks_on_queues == 0) &&
4116                                     (asoc->strmout[tp1->rec.data.sid].state == SCTP_STREAM_RESET_PENDING) &&
4117                                     TAILQ_EMPTY(&asoc->strmout[tp1->rec.data.sid].outqueue)) {
4118                                         asoc->trigger_reset = 1;
4119                                 }
4120                                 TAILQ_REMOVE(&asoc->sent_queue, tp1, sctp_next);
4121                                 if (tp1->data) {
4122                                         /* sa_ignore NO_NULL_CHK */
4123                                         sctp_free_bufspace(stcb, asoc, tp1, 1);
4124                                         sctp_m_freem(tp1->data);
4125                                         tp1->data = NULL;
4126                                 }
4127                                 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SACK_LOGGING_ENABLE) {
4128                                         sctp_log_sack(asoc->last_acked_seq,
4129                                             cumack,
4130                                             tp1->rec.data.tsn,
4131                                             0,
4132                                             0,
4133                                             SCTP_LOG_FREE_SENT);
4134                                 }
4135                                 asoc->sent_queue_cnt--;
4136                                 sctp_free_a_chunk(stcb, tp1, SCTP_SO_NOT_LOCKED);
4137                         } else {
4138                                 break;
4139                         }
4140                 }
4141
4142         }
4143         /* sa_ignore NO_NULL_CHK */
4144         if (stcb->sctp_socket) {
4145 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
4146                 struct socket *so;
4147
4148 #endif
4149                 SOCKBUF_LOCK(&stcb->sctp_socket->so_snd);
4150                 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_WAKE_LOGGING_ENABLE) {
4151                         /* sa_ignore NO_NULL_CHK */
4152                         sctp_wakeup_log(stcb, 1, SCTP_WAKESND_FROM_SACK);
4153                 }
4154 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
4155                 so = SCTP_INP_SO(stcb->sctp_ep);
4156                 atomic_add_int(&stcb->asoc.refcnt, 1);
4157                 SCTP_TCB_UNLOCK(stcb);
4158                 SCTP_SOCKET_LOCK(so, 1);
4159                 SCTP_TCB_LOCK(stcb);
4160                 atomic_subtract_int(&stcb->asoc.refcnt, 1);
4161                 if (stcb->asoc.state & SCTP_STATE_CLOSED_SOCKET) {
4162                         /* assoc was freed while we were unlocked */
4163                         SCTP_SOCKET_UNLOCK(so, 1);
4164                         return;
4165                 }
4166 #endif
4167                 sctp_sowwakeup_locked(stcb->sctp_ep, stcb->sctp_socket);
4168 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
4169                 SCTP_SOCKET_UNLOCK(so, 1);
4170 #endif
4171         } else {
4172                 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_WAKE_LOGGING_ENABLE) {
4173                         sctp_wakeup_log(stcb, 1, SCTP_NOWAKE_FROM_SACK);
4174                 }
4175         }
4176
4177         /* JRS - Use the congestion control given in the CC module */
4178         if ((asoc->last_acked_seq != cumack) && (ecne_seen == 0)) {
4179                 TAILQ_FOREACH(net, &asoc->nets, sctp_next) {
4180                         if (net->net_ack2 > 0) {
4181                                 /*
4182                                  * Karn's rule applies to clearing error
4183                                  * count, this is optional.
4184                                  */
4185                                 net->error_count = 0;
4186                                 if (!(net->dest_state & SCTP_ADDR_REACHABLE)) {
4187                                         /* addr came good */
4188                                         net->dest_state |= SCTP_ADDR_REACHABLE;
4189                                         sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb,
4190                                             0, (void *)net, SCTP_SO_NOT_LOCKED);
4191                                 }
4192                                 if (net == stcb->asoc.primary_destination) {
4193                                         if (stcb->asoc.alternate) {
4194                                                 /*
4195                                                  * release the alternate,
4196                                                  * primary is good
4197                                                  */
4198                                                 sctp_free_remote_addr(stcb->asoc.alternate);
4199                                                 stcb->asoc.alternate = NULL;
4200                                         }
4201                                 }
4202                                 if (net->dest_state & SCTP_ADDR_PF) {
4203                                         net->dest_state &= ~SCTP_ADDR_PF;
4204                                         sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT,
4205                                             stcb->sctp_ep, stcb, net,
4206                                             SCTP_FROM_SCTP_INDATA + SCTP_LOC_22);
4207                                         sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, net);
4208                                         asoc->cc_functions.sctp_cwnd_update_exit_pf(stcb, net);
4209                                         /* Done with this net */
4210                                         net->net_ack = 0;
4211                                 }
4212                                 /* restore any doubled timers */
4213                                 net->RTO = (net->lastsa >> SCTP_RTT_SHIFT) + net->lastsv;
4214                                 if (net->RTO < stcb->asoc.minrto) {
4215                                         net->RTO = stcb->asoc.minrto;
4216                                 }
4217                                 if (net->RTO > stcb->asoc.maxrto) {
4218                                         net->RTO = stcb->asoc.maxrto;
4219                                 }
4220                         }
4221                 }
4222                 asoc->cc_functions.sctp_cwnd_update_after_sack(stcb, asoc, 1, 0, 0);
4223         }
4224         asoc->last_acked_seq = cumack;
4225
4226         if (TAILQ_EMPTY(&asoc->sent_queue)) {
4227                 /* nothing left in-flight */
4228                 TAILQ_FOREACH(net, &asoc->nets, sctp_next) {
4229                         net->flight_size = 0;
4230                         net->partial_bytes_acked = 0;
4231                 }
4232                 asoc->total_flight = 0;
4233                 asoc->total_flight_count = 0;
4234         }
4235         /* RWND update */
4236         asoc->peers_rwnd = sctp_sbspace_sub(rwnd,
4237             (uint32_t)(asoc->total_flight + (asoc->total_flight_count * SCTP_BASE_SYSCTL(sctp_peer_chunk_oh))));
4238         if (asoc->peers_rwnd < stcb->sctp_ep->sctp_ep.sctp_sws_sender) {
4239                 /* SWS sender side engages */
4240                 asoc->peers_rwnd = 0;
4241         }
4242         if (asoc->peers_rwnd > old_rwnd) {
4243                 win_probe_recovery = 1;
4244         }
4245         /* Now assure a timer where data is queued at */
4246 again:
4247         j = 0;
4248         TAILQ_FOREACH(net, &asoc->nets, sctp_next) {
4249                 if (win_probe_recovery && (net->window_probe)) {
4250                         win_probe_recovered = 1;
4251                         /*
4252                          * Find first chunk that was used with window probe
4253                          * and clear the sent
4254                          */
4255                         /* sa_ignore FREED_MEMORY */
4256                         TAILQ_FOREACH(tp1, &asoc->sent_queue, sctp_next) {
4257                                 if (tp1->window_probe) {
4258                                         /* move back to data send queue */
4259                                         sctp_window_probe_recovery(stcb, asoc, tp1);
4260                                         break;
4261                                 }
4262                         }
4263                 }
4264                 if (net->flight_size) {
4265                         j++;
4266                         sctp_timer_start(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep, stcb, net);
4267                         if (net->window_probe) {
4268                                 net->window_probe = 0;
4269                         }
4270                 } else {
4271                         if (net->window_probe) {
4272                                 /*
4273                                  * In window probes we must assure a timer
4274                                  * is still running there
4275                                  */
4276                                 net->window_probe = 0;
4277                                 if (!SCTP_OS_TIMER_PENDING(&net->rxt_timer.timer)) {
4278                                         sctp_timer_start(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep, stcb, net);
4279                                 }
4280                         } else if (SCTP_OS_TIMER_PENDING(&net->rxt_timer.timer)) {
4281                                 sctp_timer_stop(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep,
4282                                     stcb, net,
4283                                     SCTP_FROM_SCTP_INDATA + SCTP_LOC_23);
4284                         }
4285                 }
4286         }
4287         if ((j == 0) &&
4288             (!TAILQ_EMPTY(&asoc->sent_queue)) &&
4289             (asoc->sent_queue_retran_cnt == 0) &&
4290             (win_probe_recovered == 0) &&
4291             (done_once == 0)) {
4292                 /*
4293                  * huh, this should not happen unless all packets are
4294                  * PR-SCTP and marked to skip of course.
4295                  */
4296                 if (sctp_fs_audit(asoc)) {
4297                         TAILQ_FOREACH(net, &asoc->nets, sctp_next) {
4298                                 net->flight_size = 0;
4299                         }
4300                         asoc->total_flight = 0;
4301                         asoc->total_flight_count = 0;
4302                         asoc->sent_queue_retran_cnt = 0;
4303                         TAILQ_FOREACH(tp1, &asoc->sent_queue, sctp_next) {
4304                                 if (tp1->sent < SCTP_DATAGRAM_RESEND) {
4305                                         sctp_flight_size_increase(tp1);
4306                                         sctp_total_flight_increase(stcb, tp1);
4307                                 } else if (tp1->sent == SCTP_DATAGRAM_RESEND) {
4308                                         sctp_ucount_incr(asoc->sent_queue_retran_cnt);
4309                                 }
4310                         }
4311                 }
4312                 done_once = 1;
4313                 goto again;
4314         }
4315         /**********************************/
4316         /* Now what about shutdown issues */
4317         /**********************************/
4318         if (TAILQ_EMPTY(&asoc->send_queue) && TAILQ_EMPTY(&asoc->sent_queue)) {
4319                 /* nothing left on sendqueue.. consider done */
4320                 /* clean up */
4321                 if ((asoc->stream_queue_cnt == 1) &&
4322                     ((asoc->state & SCTP_STATE_SHUTDOWN_PENDING) ||
4323                     (asoc->state & SCTP_STATE_SHUTDOWN_RECEIVED)) &&
4324                     ((*asoc->ss_functions.sctp_ss_is_user_msgs_incomplete) (stcb, asoc))) {
4325                         asoc->state |= SCTP_STATE_PARTIAL_MSG_LEFT;
4326                 }
4327                 if (((asoc->state & SCTP_STATE_SHUTDOWN_PENDING) ||
4328                     (SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_RECEIVED)) &&
4329                     (asoc->stream_queue_cnt == 1) &&
4330                     (asoc->state & SCTP_STATE_PARTIAL_MSG_LEFT)) {
4331                         struct mbuf *op_err;
4332
4333                         *abort_now = 1;
4334                         /* XXX */
4335                         op_err = sctp_generate_cause(SCTP_CAUSE_USER_INITIATED_ABT, "");
4336                         stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_24;
4337                         sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED);
4338                         return;
4339                 }
4340                 if ((asoc->state & SCTP_STATE_SHUTDOWN_PENDING) &&
4341                     (asoc->stream_queue_cnt == 0)) {
4342                         struct sctp_nets *netp;
4343
4344                         if ((SCTP_GET_STATE(asoc) == SCTP_STATE_OPEN) ||
4345                             (SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_RECEIVED)) {
4346                                 SCTP_STAT_DECR_GAUGE32(sctps_currestab);
4347                         }
4348                         SCTP_SET_STATE(asoc, SCTP_STATE_SHUTDOWN_SENT);
4349                         SCTP_CLEAR_SUBSTATE(asoc, SCTP_STATE_SHUTDOWN_PENDING);
4350                         sctp_stop_timers_for_shutdown(stcb);
4351                         if (asoc->alternate) {
4352                                 netp = asoc->alternate;
4353                         } else {
4354                                 netp = asoc->primary_destination;
4355                         }
4356                         sctp_send_shutdown(stcb, netp);
4357                         sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWN,
4358                             stcb->sctp_ep, stcb, netp);
4359                         sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD,
4360                             stcb->sctp_ep, stcb, netp);
4361                 } else if ((SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_RECEIVED) &&
4362                     (asoc->stream_queue_cnt == 0)) {
4363                         struct sctp_nets *netp;
4364
4365                         SCTP_STAT_DECR_GAUGE32(sctps_currestab);
4366                         SCTP_SET_STATE(asoc, SCTP_STATE_SHUTDOWN_ACK_SENT);
4367                         SCTP_CLEAR_SUBSTATE(asoc, SCTP_STATE_SHUTDOWN_PENDING);
4368                         sctp_stop_timers_for_shutdown(stcb);
4369                         if (asoc->alternate) {
4370                                 netp = asoc->alternate;
4371                         } else {
4372                                 netp = asoc->primary_destination;
4373                         }
4374                         sctp_send_shutdown_ack(stcb, netp);
4375                         sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNACK,
4376                             stcb->sctp_ep, stcb, netp);
4377                 }
4378         }
4379         /*********************************************/
4380         /* Here we perform PR-SCTP procedures        */
4381         /* (section 4.2)                             */
4382         /*********************************************/
4383         /* C1. update advancedPeerAckPoint */
4384         if (SCTP_TSN_GT(cumack, asoc->advanced_peer_ack_point)) {
4385                 asoc->advanced_peer_ack_point = cumack;
4386         }
4387         /* PR-Sctp issues need to be addressed too */
4388         if ((asoc->prsctp_supported) && (asoc->pr_sctp_cnt > 0)) {
4389                 struct sctp_tmit_chunk *lchk;
4390                 uint32_t old_adv_peer_ack_point;
4391
4392                 old_adv_peer_ack_point = asoc->advanced_peer_ack_point;
4393                 lchk = sctp_try_advance_peer_ack_point(stcb, asoc);
4394                 /* C3. See if we need to send a Fwd-TSN */
4395                 if (SCTP_TSN_GT(asoc->advanced_peer_ack_point, cumack)) {
4396                         /*
4397                          * ISSUE with ECN, see FWD-TSN processing.
4398                          */
4399                         if (SCTP_TSN_GT(asoc->advanced_peer_ack_point, old_adv_peer_ack_point)) {
4400                                 send_forward_tsn(stcb, asoc);
4401                         } else if (lchk) {
4402                                 /* try to FR fwd-tsn's that get lost too */
4403                                 if (lchk->rec.data.fwd_tsn_cnt >= 3) {
4404                                         send_forward_tsn(stcb, asoc);
4405                                 }
4406                         }
4407                 }
4408                 if (lchk) {
4409                         /* Assure a timer is up */
4410                         sctp_timer_start(SCTP_TIMER_TYPE_SEND,
4411                             stcb->sctp_ep, stcb, lchk->whoTo);
4412                 }
4413         }
4414         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SACK_RWND_LOGGING_ENABLE) {
4415                 sctp_misc_ints(SCTP_SACK_RWND_UPDATE,
4416                     rwnd,
4417                     stcb->asoc.peers_rwnd,
4418                     stcb->asoc.total_flight,
4419                     stcb->asoc.total_output_queue_size);
4420         }
4421 }
4422
4423 void
4424 sctp_handle_sack(struct mbuf *m, int offset_seg, int offset_dup,
4425     struct sctp_tcb *stcb,
4426     uint16_t num_seg, uint16_t num_nr_seg, uint16_t num_dup,
4427     int *abort_now, uint8_t flags,
4428     uint32_t cum_ack, uint32_t rwnd, int ecne_seen)
4429 {
4430         struct sctp_association *asoc;
4431         struct sctp_tmit_chunk *tp1, *tp2;
4432         uint32_t last_tsn, biggest_tsn_acked, biggest_tsn_newly_acked, this_sack_lowest_newack;
4433         uint16_t wake_him = 0;
4434         uint32_t send_s = 0;
4435         long j;
4436         int accum_moved = 0;
4437         int will_exit_fast_recovery = 0;
4438         uint32_t a_rwnd, old_rwnd;
4439         int win_probe_recovery = 0;
4440         int win_probe_recovered = 0;
4441         struct sctp_nets *net = NULL;
4442         int done_once;
4443         int rto_ok = 1;
4444         uint8_t reneged_all = 0;
4445         uint8_t cmt_dac_flag;
4446
4447         /*
4448          * we take any chance we can to service our queues since we cannot
4449          * get awoken when the socket is read from :<
4450          */
4451         /*
4452          * Now perform the actual SACK handling: 1) Verify that it is not an
4453          * old sack, if so discard. 2) If there is nothing left in the send
4454          * queue (cum-ack is equal to last acked) then you have a duplicate
4455          * too, update any rwnd change and verify no timers are running.
4456          * then return. 3) Process any new consequtive data i.e. cum-ack
4457          * moved process these first and note that it moved. 4) Process any
4458          * sack blocks. 5) Drop any acked from the queue. 6) Check for any
4459          * revoked blocks and mark. 7) Update the cwnd. 8) Nothing left,
4460          * sync up flightsizes and things, stop all timers and also check
4461          * for shutdown_pending state. If so then go ahead and send off the
4462          * shutdown. If in shutdown recv, send off the shutdown-ack and
4463          * start that timer, Ret. 9) Strike any non-acked things and do FR
4464          * procedure if needed being sure to set the FR flag. 10) Do pr-sctp
4465          * procedures. 11) Apply any FR penalties. 12) Assure we will SACK
4466          * if in shutdown_recv state.
4467          */
4468         SCTP_TCB_LOCK_ASSERT(stcb);
4469         /* CMT DAC algo */
4470         this_sack_lowest_newack = 0;
4471         SCTP_STAT_INCR(sctps_slowpath_sack);
4472         last_tsn = cum_ack;
4473         cmt_dac_flag = flags & SCTP_SACK_CMT_DAC;
4474 #ifdef SCTP_ASOCLOG_OF_TSNS
4475         stcb->asoc.cumack_log[stcb->asoc.cumack_log_at] = cum_ack;
4476         stcb->asoc.cumack_log_at++;
4477         if (stcb->asoc.cumack_log_at > SCTP_TSN_LOG_SIZE) {
4478                 stcb->asoc.cumack_log_at = 0;
4479         }
4480 #endif
4481         a_rwnd = rwnd;
4482
4483         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_SACK_ARRIVALS_ENABLE) {
4484                 sctp_misc_ints(SCTP_SACK_LOG_NORMAL, cum_ack,
4485                     rwnd, stcb->asoc.last_acked_seq, stcb->asoc.peers_rwnd);
4486         }
4487         old_rwnd = stcb->asoc.peers_rwnd;
4488         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_THRESHOLD_LOGGING) {
4489                 sctp_misc_ints(SCTP_THRESHOLD_CLEAR,
4490                     stcb->asoc.overall_error_count,
4491                     0,
4492                     SCTP_FROM_SCTP_INDATA,
4493                     __LINE__);
4494         }
4495         stcb->asoc.overall_error_count = 0;
4496         asoc = &stcb->asoc;
4497         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SACK_LOGGING_ENABLE) {
4498                 sctp_log_sack(asoc->last_acked_seq,
4499                     cum_ack,
4500                     0,
4501                     num_seg,
4502                     num_dup,
4503                     SCTP_LOG_NEW_SACK);
4504         }
4505         if ((num_dup) && (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FR_LOGGING_ENABLE)) {
4506                 uint16_t i;
4507                 uint32_t *dupdata, dblock;
4508
4509                 for (i = 0; i < num_dup; i++) {
4510                         dupdata = (uint32_t *)sctp_m_getptr(m, offset_dup + i * sizeof(uint32_t),
4511                             sizeof(uint32_t), (uint8_t *)&dblock);
4512                         if (dupdata == NULL) {
4513                                 break;
4514                         }
4515                         sctp_log_fr(*dupdata, 0, 0, SCTP_FR_DUPED);
4516                 }
4517         }
4518         /* reality check */
4519         if (!TAILQ_EMPTY(&asoc->sent_queue)) {
4520                 tp1 = TAILQ_LAST(&asoc->sent_queue,
4521                     sctpchunk_listhead);
4522                 send_s = tp1->rec.data.tsn + 1;
4523         } else {
4524                 tp1 = NULL;
4525                 send_s = asoc->sending_seq;
4526         }
4527         if (SCTP_TSN_GE(cum_ack, send_s)) {
4528                 struct mbuf *op_err;
4529                 char msg[SCTP_DIAG_INFO_LEN];
4530
4531                 /*
4532                  * no way, we have not even sent this TSN out yet. Peer is
4533                  * hopelessly messed up with us.
4534                  */
4535                 SCTP_PRINTF("NEW cum_ack:%x send_s:%x is smaller or equal\n",
4536                     cum_ack, send_s);
4537                 if (tp1) {
4538                         SCTP_PRINTF("Got send_s from tsn:%x + 1 of tp1: %p\n",
4539                             tp1->rec.data.tsn, (void *)tp1);
4540                 }
4541 hopeless_peer:
4542                 *abort_now = 1;
4543                 /* XXX */
4544                 snprintf(msg, sizeof(msg), "Cum ack %8.8x greater or equal than TSN %8.8x",
4545                     cum_ack, send_s);
4546                 op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg);
4547                 stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_25;
4548                 sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED);
4549                 return;
4550         }
4551         /**********************/
4552         /* 1) check the range */
4553         /**********************/
4554         if (SCTP_TSN_GT(asoc->last_acked_seq, last_tsn)) {
4555                 /* acking something behind */
4556                 return;
4557         }
4558         /* update the Rwnd of the peer */
4559         if (TAILQ_EMPTY(&asoc->sent_queue) &&
4560             TAILQ_EMPTY(&asoc->send_queue) &&
4561             (asoc->stream_queue_cnt == 0)) {
4562                 /* nothing left on send/sent and strmq */
4563                 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_RWND_ENABLE) {
4564                         sctp_log_rwnd_set(SCTP_SET_PEER_RWND_VIA_SACK,
4565                             asoc->peers_rwnd, 0, 0, a_rwnd);
4566                 }
4567                 asoc->peers_rwnd = a_rwnd;
4568                 if (asoc->sent_queue_retran_cnt) {
4569                         asoc->sent_queue_retran_cnt = 0;
4570                 }
4571                 if (asoc->peers_rwnd < stcb->sctp_ep->sctp_ep.sctp_sws_sender) {
4572                         /* SWS sender side engages */
4573                         asoc->peers_rwnd = 0;
4574                 }
4575                 /* stop any timers */
4576                 TAILQ_FOREACH(net, &asoc->nets, sctp_next) {
4577                         sctp_timer_stop(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep,
4578                             stcb, net, SCTP_FROM_SCTP_INDATA + SCTP_LOC_26);
4579                         net->partial_bytes_acked = 0;
4580                         net->flight_size = 0;
4581                 }
4582                 asoc->total_flight = 0;
4583                 asoc->total_flight_count = 0;
4584                 return;
4585         }
4586         /*
4587          * We init netAckSz and netAckSz2 to 0. These are used to track 2
4588          * things. The total byte count acked is tracked in netAckSz AND
4589          * netAck2 is used to track the total bytes acked that are un-
4590          * amibguious and were never retransmitted. We track these on a per
4591          * destination address basis.
4592          */
4593         TAILQ_FOREACH(net, &asoc->nets, sctp_next) {
4594                 if (SCTP_TSN_GT(cum_ack, net->cwr_window_tsn)) {
4595                         /* Drag along the window_tsn for cwr's */
4596                         net->cwr_window_tsn = cum_ack;
4597                 }
4598                 net->prev_cwnd = net->cwnd;
4599                 net->net_ack = 0;
4600                 net->net_ack2 = 0;
4601
4602                 /*
4603                  * CMT: Reset CUC and Fast recovery algo variables before
4604                  * SACK processing
4605                  */
4606                 net->new_pseudo_cumack = 0;
4607                 net->will_exit_fast_recovery = 0;
4608                 if (stcb->asoc.cc_functions.sctp_cwnd_prepare_net_for_sack) {
4609                         (*stcb->asoc.cc_functions.sctp_cwnd_prepare_net_for_sack) (stcb, net);
4610                 }
4611                 /*
4612                  * CMT: SFR algo (and HTNA) - this_sack_highest_newack has
4613                  * to be greater than the cumack. Also reset saw_newack to 0
4614                  * for all dests.
4615                  */
4616                 net->saw_newack = 0;
4617                 net->this_sack_highest_newack = last_tsn;
4618         }
4619         /* process the new consecutive TSN first */
4620         TAILQ_FOREACH(tp1, &asoc->sent_queue, sctp_next) {
4621                 if (SCTP_TSN_GE(last_tsn, tp1->rec.data.tsn)) {
4622                         if (tp1->sent != SCTP_DATAGRAM_UNSENT) {
4623                                 accum_moved = 1;
4624                                 if (tp1->sent < SCTP_DATAGRAM_ACKED) {
4625                                         /*
4626                                          * If it is less than ACKED, it is
4627                                          * now no-longer in flight. Higher
4628                                          * values may occur during marking
4629                                          */
4630                                         if ((tp1->whoTo->dest_state &
4631                                             SCTP_ADDR_UNCONFIRMED) &&
4632                                             (tp1->snd_count < 2)) {
4633                                                 /*
4634                                                  * If there was no retran
4635                                                  * and the address is
4636                                                  * un-confirmed and we sent
4637                                                  * there and are now
4638                                                  * sacked.. its confirmed,
4639                                                  * mark it so.
4640                                                  */
4641                                                 tp1->whoTo->dest_state &=
4642                                                     ~SCTP_ADDR_UNCONFIRMED;
4643                                         }
4644                                         if (tp1->sent < SCTP_DATAGRAM_RESEND) {
4645                                                 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FLIGHT_LOGGING_ENABLE) {
4646                                                         sctp_misc_ints(SCTP_FLIGHT_LOG_DOWN_CA,
4647                                                             tp1->whoTo->flight_size,
4648                                                             tp1->book_size,
4649                                                             (uint32_t)(uintptr_t)tp1->whoTo,
4650                                                             tp1->rec.data.tsn);
4651                                                 }
4652                                                 sctp_flight_size_decrease(tp1);
4653                                                 sctp_total_flight_decrease(stcb, tp1);
4654                                                 if (stcb->asoc.cc_functions.sctp_cwnd_update_tsn_acknowledged) {
4655                                                         (*stcb->asoc.cc_functions.sctp_cwnd_update_tsn_acknowledged) (tp1->whoTo,
4656                                                             tp1);
4657                                                 }
4658                                         }
4659                                         tp1->whoTo->net_ack += tp1->send_size;
4660
4661                                         /* CMT SFR and DAC algos */
4662                                         this_sack_lowest_newack = tp1->rec.data.tsn;
4663                                         tp1->whoTo->saw_newack = 1;
4664
4665                                         if (tp1->snd_count < 2) {
4666                                                 /*
4667                                                  * True non-retransmited
4668                                                  * chunk
4669                                                  */
4670                                                 tp1->whoTo->net_ack2 +=
4671                                                     tp1->send_size;
4672
4673                                                 /* update RTO too? */
4674                                                 if (tp1->do_rtt) {
4675                                                         if (rto_ok) {
4676                                                                 tp1->whoTo->RTO =
4677                                                                     sctp_calculate_rto(stcb,
4678                                                                     asoc, tp1->whoTo,
4679                                                                     &tp1->sent_rcv_time,
4680                                                                     SCTP_RTT_FROM_DATA);
4681                                                                 rto_ok = 0;
4682                                                         }
4683                                                         if (tp1->whoTo->rto_needed == 0) {
4684                                                                 tp1->whoTo->rto_needed = 1;
4685                                                         }
4686                                                         tp1->do_rtt = 0;
4687                                                 }
4688                                         }
4689                                         /*
4690                                          * CMT: CUCv2 algorithm. From the
4691                                          * cumack'd TSNs, for each TSN being
4692                                          * acked for the first time, set the
4693                                          * following variables for the
4694                                          * corresp destination.
4695                                          * new_pseudo_cumack will trigger a
4696                                          * cwnd update.
4697                                          * find_(rtx_)pseudo_cumack will
4698                                          * trigger search for the next
4699                                          * expected (rtx-)pseudo-cumack.
4700                                          */
4701                                         tp1->whoTo->new_pseudo_cumack = 1;
4702                                         tp1->whoTo->find_pseudo_cumack = 1;
4703                                         tp1->whoTo->find_rtx_pseudo_cumack = 1;
4704
4705
4706                                         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SACK_LOGGING_ENABLE) {
4707                                                 sctp_log_sack(asoc->last_acked_seq,
4708                                                     cum_ack,
4709                                                     tp1->rec.data.tsn,
4710                                                     0,
4711                                                     0,
4712                                                     SCTP_LOG_TSN_ACKED);
4713                                         }
4714                                         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_CWND_LOGGING_ENABLE) {
4715                                                 sctp_log_cwnd(stcb, tp1->whoTo, tp1->rec.data.tsn, SCTP_CWND_LOG_FROM_SACK);
4716                                         }
4717                                 }
4718                                 if (tp1->sent == SCTP_DATAGRAM_RESEND) {
4719                                         sctp_ucount_decr(asoc->sent_queue_retran_cnt);
4720 #ifdef SCTP_AUDITING_ENABLED
4721                                         sctp_audit_log(0xB3,
4722                                             (asoc->sent_queue_retran_cnt & 0x000000ff));
4723 #endif
4724                                 }
4725                                 if (tp1->rec.data.chunk_was_revoked) {
4726                                         /* deflate the cwnd */
4727                                         tp1->whoTo->cwnd -= tp1->book_size;
4728                                         tp1->rec.data.chunk_was_revoked = 0;
4729                                 }
4730                                 if (tp1->sent != SCTP_DATAGRAM_NR_ACKED) {
4731                                         tp1->sent = SCTP_DATAGRAM_ACKED;
4732                                 }
4733                         }
4734                 } else {
4735                         break;
4736                 }
4737         }
4738         biggest_tsn_newly_acked = biggest_tsn_acked = last_tsn;
4739         /* always set this up to cum-ack */
4740         asoc->this_sack_highest_gap = last_tsn;
4741
4742         if ((num_seg > 0) || (num_nr_seg > 0)) {
4743
4744                 /*
4745                  * thisSackHighestGap will increase while handling NEW
4746                  * segments this_sack_highest_newack will increase while
4747                  * handling NEWLY ACKED chunks. this_sack_lowest_newack is
4748                  * used for CMT DAC algo. saw_newack will also change.
4749                  */
4750                 if (sctp_handle_segments(m, &offset_seg, stcb, asoc, last_tsn, &biggest_tsn_acked,
4751                     &biggest_tsn_newly_acked, &this_sack_lowest_newack,
4752                     num_seg, num_nr_seg, &rto_ok)) {
4753                         wake_him++;
4754                 }
4755                 /*
4756                  * validate the biggest_tsn_acked in the gap acks if strict
4757                  * adherence is wanted.
4758                  */
4759                 if (SCTP_TSN_GE(biggest_tsn_acked, send_s)) {
4760                         /*
4761                          * peer is either confused or we are under attack.
4762                          * We must abort.
4763                          */
4764                         SCTP_PRINTF("Hopeless peer! biggest_tsn_acked:%x largest seq:%x\n",
4765                             biggest_tsn_acked, send_s);
4766                         goto hopeless_peer;
4767                 }
4768         }
4769         /*******************************************/
4770         /* cancel ALL T3-send timer if accum moved */
4771         /*******************************************/
4772         if (asoc->sctp_cmt_on_off > 0) {
4773                 TAILQ_FOREACH(net, &asoc->nets, sctp_next) {
4774                         if (net->new_pseudo_cumack)
4775                                 sctp_timer_stop(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep,
4776                                     stcb, net,
4777                                     SCTP_FROM_SCTP_INDATA + SCTP_LOC_27);
4778
4779                 }
4780         } else {
4781                 if (accum_moved) {
4782                         TAILQ_FOREACH(net, &asoc->nets, sctp_next) {
4783                                 sctp_timer_stop(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep,
4784                                     stcb, net, SCTP_FROM_SCTP_INDATA + SCTP_LOC_28);
4785                         }
4786                 }
4787         }
4788         /********************************************/
4789         /* drop the acked chunks from the sentqueue */
4790         /********************************************/
4791         asoc->last_acked_seq = cum_ack;
4792
4793         TAILQ_FOREACH_SAFE(tp1, &asoc->sent_queue, sctp_next, tp2) {
4794                 if (SCTP_TSN_GT(tp1->rec.data.tsn, cum_ack)) {
4795                         break;
4796                 }
4797                 if (tp1->sent != SCTP_DATAGRAM_NR_ACKED) {
4798                         if (asoc->strmout[tp1->rec.data.sid].chunks_on_queues > 0) {
4799                                 asoc->strmout[tp1->rec.data.sid].chunks_on_queues--;
4800 #ifdef INVARIANTS
4801                         } else {
4802                                 panic("No chunks on the queues for sid %u.", tp1->rec.data.sid);
4803 #endif
4804                         }
4805                 }
4806                 if ((asoc->strmout[tp1->rec.data.sid].chunks_on_queues == 0) &&
4807                     (asoc->strmout[tp1->rec.data.sid].state == SCTP_STREAM_RESET_PENDING) &&
4808                     TAILQ_EMPTY(&asoc->strmout[tp1->rec.data.sid].outqueue)) {
4809                         asoc->trigger_reset = 1;
4810                 }
4811                 TAILQ_REMOVE(&asoc->sent_queue, tp1, sctp_next);
4812                 if (PR_SCTP_ENABLED(tp1->flags)) {
4813                         if (asoc->pr_sctp_cnt != 0)
4814                                 asoc->pr_sctp_cnt--;
4815                 }
4816                 asoc->sent_queue_cnt--;
4817                 if (tp1->data) {
4818                         /* sa_ignore NO_NULL_CHK */
4819                         sctp_free_bufspace(stcb, asoc, tp1, 1);
4820                         sctp_m_freem(tp1->data);
4821                         tp1->data = NULL;
4822                         if (asoc->prsctp_supported && PR_SCTP_BUF_ENABLED(tp1->flags)) {
4823                                 asoc->sent_queue_cnt_removeable--;
4824                         }
4825                 }
4826                 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SACK_LOGGING_ENABLE) {
4827                         sctp_log_sack(asoc->last_acked_seq,
4828                             cum_ack,
4829                             tp1->rec.data.tsn,
4830                             0,
4831                             0,
4832                             SCTP_LOG_FREE_SENT);
4833                 }
4834                 sctp_free_a_chunk(stcb, tp1, SCTP_SO_NOT_LOCKED);
4835                 wake_him++;
4836         }
4837         if (TAILQ_EMPTY(&asoc->sent_queue) && (asoc->total_flight > 0)) {
4838 #ifdef INVARIANTS
4839                 panic("Warning flight size is positive and should be 0");
4840 #else
4841                 SCTP_PRINTF("Warning flight size incorrect should be 0 is %d\n",
4842                     asoc->total_flight);
4843 #endif
4844                 asoc->total_flight = 0;
4845         }
4846         /* sa_ignore NO_NULL_CHK */
4847         if ((wake_him) && (stcb->sctp_socket)) {
4848 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
4849                 struct socket *so;
4850
4851 #endif
4852                 SOCKBUF_LOCK(&stcb->sctp_socket->so_snd);
4853                 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_WAKE_LOGGING_ENABLE) {
4854                         sctp_wakeup_log(stcb, wake_him, SCTP_WAKESND_FROM_SACK);
4855                 }
4856 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
4857                 so = SCTP_INP_SO(stcb->sctp_ep);
4858                 atomic_add_int(&stcb->asoc.refcnt, 1);
4859                 SCTP_TCB_UNLOCK(stcb);
4860                 SCTP_SOCKET_LOCK(so, 1);
4861                 SCTP_TCB_LOCK(stcb);
4862                 atomic_subtract_int(&stcb->asoc.refcnt, 1);
4863                 if (stcb->asoc.state & SCTP_STATE_CLOSED_SOCKET) {
4864                         /* assoc was freed while we were unlocked */
4865                         SCTP_SOCKET_UNLOCK(so, 1);
4866                         return;
4867                 }
4868 #endif
4869                 sctp_sowwakeup_locked(stcb->sctp_ep, stcb->sctp_socket);
4870 #if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
4871                 SCTP_SOCKET_UNLOCK(so, 1);
4872 #endif
4873         } else {
4874                 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_WAKE_LOGGING_ENABLE) {
4875                         sctp_wakeup_log(stcb, wake_him, SCTP_NOWAKE_FROM_SACK);
4876                 }
4877         }
4878
4879         if (asoc->fast_retran_loss_recovery && accum_moved) {
4880                 if (SCTP_TSN_GE(asoc->last_acked_seq, asoc->fast_recovery_tsn)) {
4881                         /* Setup so we will exit RFC2582 fast recovery */
4882                         will_exit_fast_recovery = 1;
4883                 }
4884         }
4885         /*
4886          * Check for revoked fragments:
4887          *
4888          * if Previous sack - Had no frags then we can't have any revoked if
4889          * Previous sack - Had frag's then - If we now have frags aka
4890          * num_seg > 0 call sctp_check_for_revoked() to tell if peer revoked
4891          * some of them. else - The peer revoked all ACKED fragments, since
4892          * we had some before and now we have NONE.
4893          */
4894
4895         if (num_seg) {
4896                 sctp_check_for_revoked(stcb, asoc, cum_ack, biggest_tsn_acked);
4897                 asoc->saw_sack_with_frags = 1;
4898         } else if (asoc->saw_sack_with_frags) {
4899                 int cnt_revoked = 0;
4900
4901                 /* Peer revoked all dg's marked or acked */
4902                 TAILQ_FOREACH(tp1, &asoc->sent_queue, sctp_next) {
4903                         if (tp1->sent == SCTP_DATAGRAM_ACKED) {
4904                                 tp1->sent = SCTP_DATAGRAM_SENT;
4905                                 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_FLIGHT_LOGGING_ENABLE) {
4906                                         sctp_misc_ints(SCTP_FLIGHT_LOG_UP_REVOKE,
4907                                             tp1->whoTo->flight_size,
4908                                             tp1->book_size,
4909                                             (uint32_t)(uintptr_t)tp1->whoTo,
4910                                             tp1->rec.data.tsn);
4911                                 }
4912                                 sctp_flight_size_increase(tp1);
4913                                 sctp_total_flight_increase(stcb, tp1);
4914                                 tp1->rec.data.chunk_was_revoked = 1;
4915                                 /*
4916                                  * To ensure that this increase in
4917                                  * flightsize, which is artificial, does not
4918                                  * throttle the sender, we also increase the
4919                                  * cwnd artificially.
4920                                  */
4921                                 tp1->whoTo->cwnd += tp1->book_size;
4922                                 cnt_revoked++;
4923                         }
4924                 }
4925                 if (cnt_revoked) {
4926                         reneged_all = 1;
4927                 }
4928                 asoc->saw_sack_with_frags = 0;
4929         }
4930         if (num_nr_seg > 0)
4931                 asoc->saw_sack_with_nr_frags = 1;
4932         else
4933                 asoc->saw_sack_with_nr_frags = 0;
4934
4935         /* JRS - Use the congestion control given in the CC module */
4936         if (ecne_seen == 0) {
4937                 TAILQ_FOREACH(net, &asoc->nets, sctp_next) {
4938                         if (net->net_ack2 > 0) {
4939                                 /*
4940                                  * Karn's rule applies to clearing error
4941                                  * count, this is optional.
4942                                  */
4943                                 net->error_count = 0;
4944                                 if (!(net->dest_state & SCTP_ADDR_REACHABLE)) {
4945                                         /* addr came good */
4946                                         net->dest_state |= SCTP_ADDR_REACHABLE;
4947                                         sctp_ulp_notify(SCTP_NOTIFY_INTERFACE_UP, stcb,
4948                                             0, (void *)net, SCTP_SO_NOT_LOCKED);
4949                                 }
4950                                 if (net == stcb->asoc.primary_destination) {
4951                                         if (stcb->asoc.alternate) {
4952                                                 /*
4953                                                  * release the alternate,
4954                                                  * primary is good
4955                                                  */
4956                                                 sctp_free_remote_addr(stcb->asoc.alternate);
4957                                                 stcb->asoc.alternate = NULL;
4958                                         }
4959                                 }
4960                                 if (net->dest_state & SCTP_ADDR_PF) {
4961                                         net->dest_state &= ~SCTP_ADDR_PF;
4962                                         sctp_timer_stop(SCTP_TIMER_TYPE_HEARTBEAT,
4963                                             stcb->sctp_ep, stcb, net,
4964                                             SCTP_FROM_SCTP_INDATA + SCTP_LOC_29);
4965                                         sctp_timer_start(SCTP_TIMER_TYPE_HEARTBEAT, stcb->sctp_ep, stcb, net);
4966                                         asoc->cc_functions.sctp_cwnd_update_exit_pf(stcb, net);
4967                                         /* Done with this net */
4968                                         net->net_ack = 0;
4969                                 }
4970                                 /* restore any doubled timers */
4971                                 net->RTO = (net->lastsa >> SCTP_RTT_SHIFT) + net->lastsv;
4972                                 if (net->RTO < stcb->asoc.minrto) {
4973                                         net->RTO = stcb->asoc.minrto;
4974                                 }
4975                                 if (net->RTO > stcb->asoc.maxrto) {
4976                                         net->RTO = stcb->asoc.maxrto;
4977                                 }
4978                         }
4979                 }
4980                 asoc->cc_functions.sctp_cwnd_update_after_sack(stcb, asoc, accum_moved, reneged_all, will_exit_fast_recovery);
4981         }
4982         if (TAILQ_EMPTY(&asoc->sent_queue)) {
4983                 /* nothing left in-flight */
4984                 TAILQ_FOREACH(net, &asoc->nets, sctp_next) {
4985                         /* stop all timers */
4986                         sctp_timer_stop(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep,
4987                             stcb, net,
4988                             SCTP_FROM_SCTP_INDATA + SCTP_LOC_30);
4989                         net->flight_size = 0;
4990                         net->partial_bytes_acked = 0;
4991                 }
4992                 asoc->total_flight = 0;
4993                 asoc->total_flight_count = 0;
4994         }
4995         /**********************************/
4996         /* Now what about shutdown issues */
4997         /**********************************/
4998         if (TAILQ_EMPTY(&asoc->send_queue) && TAILQ_EMPTY(&asoc->sent_queue)) {
4999                 /* nothing left on sendqueue.. consider done */
5000                 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_RWND_ENABLE) {
5001                         sctp_log_rwnd_set(SCTP_SET_PEER_RWND_VIA_SACK,
5002                             asoc->peers_rwnd, 0, 0, a_rwnd);
5003                 }
5004                 asoc->peers_rwnd = a_rwnd;
5005                 if (asoc->peers_rwnd < stcb->sctp_ep->sctp_ep.sctp_sws_sender) {
5006                         /* SWS sender side engages */
5007                         asoc->peers_rwnd = 0;
5008                 }
5009                 /* clean up */
5010                 if ((asoc->stream_queue_cnt == 1) &&
5011                     ((asoc->state & SCTP_STATE_SHUTDOWN_PENDING) ||
5012                     (asoc->state & SCTP_STATE_SHUTDOWN_RECEIVED)) &&
5013                     ((*asoc->ss_functions.sctp_ss_is_user_msgs_incomplete) (stcb, asoc))) {
5014                         asoc->state |= SCTP_STATE_PARTIAL_MSG_LEFT;
5015                 }
5016                 if (((asoc->state & SCTP_STATE_SHUTDOWN_PENDING) ||
5017                     (SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_RECEIVED)) &&
5018                     (asoc->stream_queue_cnt == 1) &&
5019                     (asoc->state & SCTP_STATE_PARTIAL_MSG_LEFT)) {
5020                         struct mbuf *op_err;
5021
5022                         *abort_now = 1;
5023                         /* XXX */
5024                         op_err = sctp_generate_cause(SCTP_CAUSE_USER_INITIATED_ABT, "");
5025                         stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_24;
5026                         sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED);
5027                         return;
5028                 }
5029                 if ((asoc->state & SCTP_STATE_SHUTDOWN_PENDING) &&
5030                     (asoc->stream_queue_cnt == 0)) {
5031                         struct sctp_nets *netp;
5032
5033                         if ((SCTP_GET_STATE(asoc) == SCTP_STATE_OPEN) ||
5034                             (SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_RECEIVED)) {
5035                                 SCTP_STAT_DECR_GAUGE32(sctps_currestab);
5036                         }
5037                         SCTP_SET_STATE(asoc, SCTP_STATE_SHUTDOWN_SENT);
5038                         SCTP_CLEAR_SUBSTATE(asoc, SCTP_STATE_SHUTDOWN_PENDING);
5039                         sctp_stop_timers_for_shutdown(stcb);
5040                         if (asoc->alternate) {
5041                                 netp = asoc->alternate;
5042                         } else {
5043                                 netp = asoc->primary_destination;
5044                         }
5045                         sctp_send_shutdown(stcb, netp);
5046                         sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWN,
5047                             stcb->sctp_ep, stcb, netp);
5048                         sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNGUARD,
5049                             stcb->sctp_ep, stcb, netp);
5050                         return;
5051                 } else if ((SCTP_GET_STATE(asoc) == SCTP_STATE_SHUTDOWN_RECEIVED) &&
5052                     (asoc->stream_queue_cnt == 0)) {
5053                         struct sctp_nets *netp;
5054
5055                         SCTP_STAT_DECR_GAUGE32(sctps_currestab);
5056                         SCTP_SET_STATE(asoc, SCTP_STATE_SHUTDOWN_ACK_SENT);
5057                         SCTP_CLEAR_SUBSTATE(asoc, SCTP_STATE_SHUTDOWN_PENDING);
5058                         sctp_stop_timers_for_shutdown(stcb);
5059                         if (asoc->alternate) {
5060                                 netp = asoc->alternate;
5061                         } else {
5062                                 netp = asoc->primary_destination;
5063                         }
5064                         sctp_send_shutdown_ack(stcb, netp);
5065                         sctp_timer_start(SCTP_TIMER_TYPE_SHUTDOWNACK,
5066                             stcb->sctp_ep, stcb, netp);
5067                         return;
5068                 }
5069         }
5070         /*
5071          * Now here we are going to recycle net_ack for a different use...
5072          * HEADS UP.
5073          */
5074         TAILQ_FOREACH(net, &asoc->nets, sctp_next) {
5075                 net->net_ack = 0;
5076         }
5077
5078         /*
5079          * CMT DAC algorithm: If SACK DAC flag was 0, then no extra marking
5080          * to be done. Setting this_sack_lowest_newack to the cum_ack will
5081          * automatically ensure that.
5082          */
5083         if ((asoc->sctp_cmt_on_off > 0) &&
5084             SCTP_BASE_SYSCTL(sctp_cmt_use_dac) &&
5085             (cmt_dac_flag == 0)) {
5086                 this_sack_lowest_newack = cum_ack;
5087         }
5088         if ((num_seg > 0) || (num_nr_seg > 0)) {
5089                 sctp_strike_gap_ack_chunks(stcb, asoc, biggest_tsn_acked,
5090                     biggest_tsn_newly_acked, this_sack_lowest_newack, accum_moved);
5091         }
5092         /* JRS - Use the congestion control given in the CC module */
5093         asoc->cc_functions.sctp_cwnd_update_after_fr(stcb, asoc);
5094
5095         /* Now are we exiting loss recovery ? */
5096         if (will_exit_fast_recovery) {
5097                 /* Ok, we must exit fast recovery */
5098                 asoc->fast_retran_loss_recovery = 0;
5099         }
5100         if ((asoc->sat_t3_loss_recovery) &&
5101             SCTP_TSN_GE(asoc->last_acked_seq, asoc->sat_t3_recovery_tsn)) {
5102                 /* end satellite t3 loss recovery */
5103                 asoc->sat_t3_loss_recovery = 0;
5104         }
5105         /*
5106          * CMT Fast recovery
5107          */
5108         TAILQ_FOREACH(net, &asoc->nets, sctp_next) {
5109                 if (net->will_exit_fast_recovery) {
5110                         /* Ok, we must exit fast recovery */
5111                         net->fast_retran_loss_recovery = 0;
5112                 }
5113         }
5114
5115         /* Adjust and set the new rwnd value */
5116         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_RWND_ENABLE) {
5117                 sctp_log_rwnd_set(SCTP_SET_PEER_RWND_VIA_SACK,
5118                     asoc->peers_rwnd, asoc->total_flight, (asoc->total_flight_count * SCTP_BASE_SYSCTL(sctp_peer_chunk_oh)), a_rwnd);
5119         }
5120         asoc->peers_rwnd = sctp_sbspace_sub(a_rwnd,
5121             (uint32_t)(asoc->total_flight + (asoc->total_flight_count * SCTP_BASE_SYSCTL(sctp_peer_chunk_oh))));
5122         if (asoc->peers_rwnd < stcb->sctp_ep->sctp_ep.sctp_sws_sender) {
5123                 /* SWS sender side engages */
5124                 asoc->peers_rwnd = 0;
5125         }
5126         if (asoc->peers_rwnd > old_rwnd) {
5127                 win_probe_recovery = 1;
5128         }
5129         /*
5130          * Now we must setup so we have a timer up for anyone with
5131          * outstanding data.
5132          */
5133         done_once = 0;
5134 again:
5135         j = 0;
5136         TAILQ_FOREACH(net, &asoc->nets, sctp_next) {
5137                 if (win_probe_recovery && (net->window_probe)) {
5138                         win_probe_recovered = 1;
5139                         /*-
5140                          * Find first chunk that was used with
5141                          * window probe and clear the event. Put
5142                          * it back into the send queue as if has
5143                          * not been sent.
5144                          */
5145                         TAILQ_FOREACH(tp1, &asoc->sent_queue, sctp_next) {
5146                                 if (tp1->window_probe) {
5147                                         sctp_window_probe_recovery(stcb, asoc, tp1);
5148                                         break;
5149                                 }
5150                         }
5151                 }
5152                 if (net->flight_size) {
5153                         j++;
5154                         if (!SCTP_OS_TIMER_PENDING(&net->rxt_timer.timer)) {
5155                                 sctp_timer_start(SCTP_TIMER_TYPE_SEND,
5156                                     stcb->sctp_ep, stcb, net);
5157                         }
5158                         if (net->window_probe) {
5159                                 net->window_probe = 0;
5160                         }
5161                 } else {
5162                         if (net->window_probe) {
5163                                 /*
5164                                  * In window probes we must assure a timer
5165                                  * is still running there
5166                                  */
5167                                 if (!SCTP_OS_TIMER_PENDING(&net->rxt_timer.timer)) {
5168                                         sctp_timer_start(SCTP_TIMER_TYPE_SEND,
5169                                             stcb->sctp_ep, stcb, net);
5170
5171                                 }
5172                         } else if (SCTP_OS_TIMER_PENDING(&net->rxt_timer.timer)) {
5173                                 sctp_timer_stop(SCTP_TIMER_TYPE_SEND, stcb->sctp_ep,
5174                                     stcb, net,
5175                                     SCTP_FROM_SCTP_INDATA + SCTP_LOC_32);
5176                         }
5177                 }
5178         }
5179         if ((j == 0) &&
5180             (!TAILQ_EMPTY(&asoc->sent_queue)) &&
5181             (asoc->sent_queue_retran_cnt == 0) &&
5182             (win_probe_recovered == 0) &&
5183             (done_once == 0)) {
5184                 /*
5185                  * huh, this should not happen unless all packets are
5186                  * PR-SCTP and marked to skip of course.
5187                  */
5188                 if (sctp_fs_audit(asoc)) {
5189                         TAILQ_FOREACH(net, &asoc->nets, sctp_next) {
5190                                 net->flight_size = 0;
5191                         }
5192                         asoc->total_flight = 0;
5193                         asoc->total_flight_count = 0;
5194                         asoc->sent_queue_retran_cnt = 0;
5195                         TAILQ_FOREACH(tp1, &asoc->sent_queue, sctp_next) {
5196                                 if (tp1->sent < SCTP_DATAGRAM_RESEND) {
5197                                         sctp_flight_size_increase(tp1);
5198                                         sctp_total_flight_increase(stcb, tp1);
5199                                 } else if (tp1->sent == SCTP_DATAGRAM_RESEND) {
5200                                         sctp_ucount_incr(asoc->sent_queue_retran_cnt);
5201                                 }
5202                         }
5203                 }
5204                 done_once = 1;
5205                 goto again;
5206         }
5207         /*********************************************/
5208         /* Here we perform PR-SCTP procedures        */
5209         /* (section 4.2)                             */
5210         /*********************************************/
5211         /* C1. update advancedPeerAckPoint */
5212         if (SCTP_TSN_GT(cum_ack, asoc->advanced_peer_ack_point)) {
5213                 asoc->advanced_peer_ack_point = cum_ack;
5214         }
5215         /* C2. try to further move advancedPeerAckPoint ahead */
5216         if ((asoc->prsctp_supported) && (asoc->pr_sctp_cnt > 0)) {
5217                 struct sctp_tmit_chunk *lchk;
5218                 uint32_t old_adv_peer_ack_point;
5219
5220                 old_adv_peer_ack_point = asoc->advanced_peer_ack_point;
5221                 lchk = sctp_try_advance_peer_ack_point(stcb, asoc);
5222                 /* C3. See if we need to send a Fwd-TSN */
5223                 if (SCTP_TSN_GT(asoc->advanced_peer_ack_point, cum_ack)) {
5224                         /*
5225                          * ISSUE with ECN, see FWD-TSN processing.
5226                          */
5227                         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LOG_TRY_ADVANCE) {
5228                                 sctp_misc_ints(SCTP_FWD_TSN_CHECK,
5229                                     0xee, cum_ack, asoc->advanced_peer_ack_point,
5230                                     old_adv_peer_ack_point);
5231                         }
5232                         if (SCTP_TSN_GT(asoc->advanced_peer_ack_point, old_adv_peer_ack_point)) {
5233                                 send_forward_tsn(stcb, asoc);
5234                         } else if (lchk) {
5235                                 /* try to FR fwd-tsn's that get lost too */
5236                                 if (lchk->rec.data.fwd_tsn_cnt >= 3) {
5237                                         send_forward_tsn(stcb, asoc);
5238                                 }
5239                         }
5240                 }
5241                 if (lchk) {
5242                         /* Assure a timer is up */
5243                         sctp_timer_start(SCTP_TIMER_TYPE_SEND,
5244                             stcb->sctp_ep, stcb, lchk->whoTo);
5245                 }
5246         }
5247         if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_SACK_RWND_LOGGING_ENABLE) {
5248                 sctp_misc_ints(SCTP_SACK_RWND_UPDATE,
5249                     a_rwnd,
5250                     stcb->asoc.peers_rwnd,
5251                     stcb->asoc.total_flight,
5252                     stcb->asoc.total_output_queue_size);
5253         }
5254 }
5255
5256 void
5257 sctp_update_acked(struct sctp_tcb *stcb, struct sctp_shutdown_chunk *cp, int *abort_flag)
5258 {
5259         /* Copy cum-ack */
5260         uint32_t cum_ack, a_rwnd;
5261
5262         cum_ack = ntohl(cp->cumulative_tsn_ack);
5263         /* Arrange so a_rwnd does NOT change */
5264         a_rwnd = stcb->asoc.peers_rwnd + stcb->asoc.total_flight;
5265
5266         /* Now call the express sack handling */
5267         sctp_express_handle_sack(stcb, cum_ack, a_rwnd, abort_flag, 0);
5268 }
5269
5270 static void
5271 sctp_kick_prsctp_reorder_queue(struct sctp_tcb *stcb,
5272     struct sctp_stream_in *strmin)
5273 {
5274         struct sctp_queued_to_read *control, *ncontrol;
5275         struct sctp_association *asoc;
5276         uint32_t mid;
5277         int need_reasm_check = 0;
5278
5279         asoc = &stcb->asoc;
5280         mid = strmin->last_mid_delivered;
5281         /*
5282          * First deliver anything prior to and including the stream no that
5283          * came in.
5284          */
5285         TAILQ_FOREACH_SAFE(control, &strmin->inqueue, next_instrm, ncontrol) {
5286                 if (SCTP_MID_GE(asoc->idata_supported, mid, control->mid)) {
5287                         /* this is deliverable now */
5288                         if (((control->sinfo_flags >> 8) & SCTP_DATA_NOT_FRAG) == SCTP_DATA_NOT_FRAG) {
5289                                 if (control->on_strm_q) {
5290                                         if (control->on_strm_q == SCTP_ON_ORDERED) {
5291                                                 TAILQ_REMOVE(&strmin->inqueue, control, next_instrm);
5292                                         } else if (control->on_strm_q == SCTP_ON_UNORDERED) {
5293                                                 TAILQ_REMOVE(&strmin->uno_inqueue, control, next_instrm);
5294 #ifdef INVARIANTS
5295                                         } else {
5296                                                 panic("strmin: %p ctl: %p unknown %d",
5297                                                     strmin, control, control->on_strm_q);
5298 #endif
5299                                         }
5300                                         control->on_strm_q = 0;
5301                                 }
5302                                 /* subtract pending on streams */
5303                                 if (asoc->size_on_all_streams >= control->length) {
5304                                         asoc->size_on_all_streams -= control->length;
5305                                 } else {
5306 #ifdef INVARIANTS
5307                                         panic("size_on_all_streams = %u smaller than control length %u", asoc->size_on_all_streams, control->length);
5308 #else
5309                                         asoc->size_on_all_streams = 0;
5310 #endif
5311                                 }
5312                                 sctp_ucount_decr(asoc->cnt_on_all_streams);
5313                                 /* deliver it to at least the delivery-q */
5314                                 if (stcb->sctp_socket) {
5315                                         sctp_mark_non_revokable(asoc, control->sinfo_tsn);
5316                                         sctp_add_to_readq(stcb->sctp_ep, stcb,
5317                                             control,
5318                                             &stcb->sctp_socket->so_rcv,
5319                                             1, SCTP_READ_LOCK_HELD,
5320                                             SCTP_SO_NOT_LOCKED);
5321                                 }
5322                         } else {
5323                                 /* Its a fragmented message */
5324                                 if (control->first_frag_seen) {
5325                                         /*
5326                                          * Make it so this is next to
5327                                          * deliver, we restore later
5328                                          */
5329                                         strmin->last_mid_delivered = control->mid - 1;
5330                                         need_reasm_check = 1;
5331                                         break;
5332                                 }
5333                         }
5334                 } else {
5335                         /* no more delivery now. */
5336                         break;
5337                 }
5338         }
5339         if (need_reasm_check) {
5340                 int ret;
5341
5342                 ret = sctp_deliver_reasm_check(stcb, &stcb->asoc, strmin, SCTP_READ_LOCK_HELD);
5343                 if (SCTP_MID_GT(asoc->idata_supported, mid, strmin->last_mid_delivered)) {
5344                         /* Restore the next to deliver unless we are ahead */
5345                         strmin->last_mid_delivered = mid;
5346                 }
5347                 if (ret == 0) {
5348                         /* Left the front Partial one on */
5349                         return;
5350                 }
5351                 need_reasm_check = 0;
5352         }
5353         /*
5354          * now we must deliver things in queue the normal way  if any are
5355          * now ready.
5356          */
5357         mid = strmin->last_mid_delivered + 1;
5358         TAILQ_FOREACH_SAFE(control, &strmin->inqueue, next_instrm, ncontrol) {
5359                 if (SCTP_MID_EQ(asoc->idata_supported, mid, control->mid)) {
5360                         if (((control->sinfo_flags >> 8) & SCTP_DATA_NOT_FRAG) == SCTP_DATA_NOT_FRAG) {
5361                                 /* this is deliverable now */
5362                                 if (control->on_strm_q) {
5363                                         if (control->on_strm_q == SCTP_ON_ORDERED) {
5364                                                 TAILQ_REMOVE(&strmin->inqueue, control, next_instrm);
5365                                         } else if (control->on_strm_q == SCTP_ON_UNORDERED) {
5366                                                 TAILQ_REMOVE(&strmin->uno_inqueue, control, next_instrm);
5367 #ifdef INVARIANTS
5368                                         } else {
5369                                                 panic("strmin: %p ctl: %p unknown %d",
5370                                                     strmin, control, control->on_strm_q);
5371 #endif
5372                                         }
5373                                         control->on_strm_q = 0;
5374                                 }
5375                                 /* subtract pending on streams */
5376                                 if (asoc->size_on_all_streams >= control->length) {
5377                                         asoc->size_on_all_streams -= control->length;
5378                                 } else {
5379 #ifdef INVARIANTS
5380                                         panic("size_on_all_streams = %u smaller than control length %u", asoc->size_on_all_streams, control->length);
5381 #else
5382                                         asoc->size_on_all_streams = 0;
5383 #endif
5384                                 }
5385                                 sctp_ucount_decr(asoc->cnt_on_all_streams);
5386                                 /* deliver it to at least the delivery-q */
5387                                 strmin->last_mid_delivered = control->mid;
5388                                 if (stcb->sctp_socket) {
5389                                         sctp_mark_non_revokable(asoc, control->sinfo_tsn);
5390                                         sctp_add_to_readq(stcb->sctp_ep, stcb,
5391                                             control,
5392                                             &stcb->sctp_socket->so_rcv, 1,
5393                                             SCTP_READ_LOCK_HELD, SCTP_SO_NOT_LOCKED);
5394
5395                                 }
5396                                 mid = strmin->last_mid_delivered + 1;
5397                         } else {
5398                                 /* Its a fragmented message */
5399                                 if (control->first_frag_seen) {
5400                                         /*
5401                                          * Make it so this is next to
5402                                          * deliver
5403                                          */
5404                                         strmin->last_mid_delivered = control->mid - 1;
5405                                         need_reasm_check = 1;
5406                                         break;
5407                                 }
5408                         }
5409                 } else {
5410                         break;
5411                 }
5412         }
5413         if (need_reasm_check) {
5414                 (void)sctp_deliver_reasm_check(stcb, &stcb->asoc, strmin, SCTP_READ_LOCK_HELD);
5415         }
5416 }
5417
5418
5419
5420 static void
5421 sctp_flush_reassm_for_str_seq(struct sctp_tcb *stcb,
5422     struct sctp_association *asoc,
5423     uint16_t stream, uint32_t mid, int ordered, uint32_t cumtsn)
5424 {
5425         struct sctp_queued_to_read *control;
5426         struct sctp_stream_in *strm;
5427         struct sctp_tmit_chunk *chk, *nchk;
5428         int cnt_removed = 0;
5429
5430         /*
5431          * For now large messages held on the stream reasm that are complete
5432          * will be tossed too. We could in theory do more work to spin
5433          * through and stop after dumping one msg aka seeing the start of a
5434          * new msg at the head, and call the delivery function... to see if
5435          * it can be delivered... But for now we just dump everything on the
5436          * queue.
5437          */
5438         strm = &asoc->strmin[stream];
5439         control = sctp_find_reasm_entry(strm, mid, ordered, asoc->idata_supported);
5440         if (control == NULL) {
5441                 /* Not found */
5442                 return;
5443         }
5444         if (!asoc->idata_supported && !ordered && SCTP_TSN_GT(control->fsn_included, cumtsn)) {
5445                 return;
5446         }
5447         TAILQ_FOREACH_SAFE(chk, &control->reasm, sctp_next, nchk) {
5448                 /* Purge hanging chunks */
5449                 if (!asoc->idata_supported && (ordered == 0)) {
5450                         if (SCTP_TSN_GT(chk->rec.data.tsn, cumtsn)) {
5451                                 break;
5452                         }
5453                 }
5454                 cnt_removed++;
5455                 TAILQ_REMOVE(&control->reasm, chk, sctp_next);
5456                 if (asoc->size_on_reasm_queue >= chk->send_size) {
5457                         asoc->size_on_reasm_queue -= chk->send_size;
5458                 } else {
5459 #ifdef INVARIANTS
5460                         panic("size_on_reasm_queue = %u smaller than chunk length %u", asoc->size_on_reasm_queue, chk->send_size);
5461 #else
5462                         asoc->size_on_reasm_queue = 0;
5463 #endif
5464                 }
5465                 sctp_ucount_decr(asoc->cnt_on_reasm_queue);
5466                 if (chk->data) {
5467                         sctp_m_freem(chk->data);
5468                         chk->data = NULL;
5469                 }
5470                 sctp_free_a_chunk(stcb, chk, SCTP_SO_NOT_LOCKED);
5471         }
5472         if (!TAILQ_EMPTY(&control->reasm)) {
5473                 /* This has to be old data, unordered */
5474                 if (control->data) {
5475                         sctp_m_freem(control->data);
5476                         control->data = NULL;
5477                 }
5478                 sctp_reset_a_control(control, stcb->sctp_ep, cumtsn);
5479                 chk = TAILQ_FIRST(&control->reasm);
5480                 if (chk->rec.data.rcv_flags & SCTP_DATA_FIRST_FRAG) {
5481                         TAILQ_REMOVE(&control->reasm, chk, sctp_next);
5482                         sctp_add_chk_to_control(control, strm, stcb, asoc,
5483                             chk, SCTP_READ_LOCK_HELD);
5484                 }
5485                 sctp_deliver_reasm_check(stcb, asoc, strm, SCTP_READ_LOCK_HELD);
5486                 return;
5487         }
5488         if (control->on_strm_q == SCTP_ON_ORDERED) {
5489                 TAILQ_REMOVE(&strm->inqueue, control, next_instrm);
5490                 if (asoc->size_on_all_streams >= control->length) {
5491                         asoc->size_on_all_streams -= control->length;
5492                 } else {
5493 #ifdef INVARIANTS
5494                         panic("size_on_all_streams = %u smaller than control length %u", asoc->size_on_all_streams, control->length);
5495 #else
5496                         asoc->size_on_all_streams = 0;
5497 #endif
5498                 }
5499                 sctp_ucount_decr(asoc->cnt_on_all_streams);
5500                 control->on_strm_q = 0;
5501         } else if (control->on_strm_q == SCTP_ON_UNORDERED) {
5502                 TAILQ_REMOVE(&strm->uno_inqueue, control, next_instrm);
5503                 control->on_strm_q = 0;
5504 #ifdef INVARIANTS
5505         } else if (control->on_strm_q) {
5506                 panic("strm: %p ctl: %p unknown %d",
5507                     strm, control, control->on_strm_q);
5508 #endif
5509         }
5510         control->on_strm_q = 0;
5511         if (control->on_read_q == 0) {
5512                 sctp_free_remote_addr(control->whoFrom);
5513                 if (control->data) {
5514                         sctp_m_freem(control->data);
5515                         control->data = NULL;
5516                 }
5517                 sctp_free_a_readq(stcb, control);
5518         }
5519 }
5520
5521 void
5522 sctp_handle_forward_tsn(struct sctp_tcb *stcb,
5523     struct sctp_forward_tsn_chunk *fwd,
5524     int *abort_flag, struct mbuf *m, int offset)
5525 {
5526         /* The pr-sctp fwd tsn */
5527         /*
5528          * here we will perform all the data receiver side steps for
5529          * processing FwdTSN, as required in by pr-sctp draft:
5530          *
5531          * Assume we get FwdTSN(x):
5532          *
5533          * 1) update local cumTSN to x 2) try to further advance cumTSN to x
5534          * + others we have 3) examine and update re-ordering queue on
5535          * pr-in-streams 4) clean up re-assembly queue 5) Send a sack to
5536          * report where we are.
5537          */
5538         struct sctp_association *asoc;
5539         uint32_t new_cum_tsn, gap;
5540         unsigned int i, fwd_sz, m_size;
5541         uint32_t str_seq;
5542         struct sctp_stream_in *strm;
5543         struct sctp_queued_to_read *control, *sv;
5544
5545         asoc = &stcb->asoc;
5546         if ((fwd_sz = ntohs(fwd->ch.chunk_length)) < sizeof(struct sctp_forward_tsn_chunk)) {
5547                 SCTPDBG(SCTP_DEBUG_INDATA1,
5548                     "Bad size too small/big fwd-tsn\n");
5549                 return;
5550         }
5551         m_size = (stcb->asoc.mapping_array_size << 3);
5552         /*************************************************************/
5553         /* 1. Here we update local cumTSN and shift the bitmap array */
5554         /*************************************************************/
5555         new_cum_tsn = ntohl(fwd->new_cumulative_tsn);
5556
5557         if (SCTP_TSN_GE(asoc->cumulative_tsn, new_cum_tsn)) {
5558                 /* Already got there ... */
5559                 return;
5560         }
5561         /*
5562          * now we know the new TSN is more advanced, let's find the actual
5563          * gap
5564          */
5565         SCTP_CALC_TSN_TO_GAP(gap, new_cum_tsn, asoc->mapping_array_base_tsn);
5566         asoc->cumulative_tsn = new_cum_tsn;
5567         if (gap >= m_size) {
5568                 if ((long)gap > sctp_sbspace(&stcb->asoc, &stcb->sctp_socket->so_rcv)) {
5569                         struct mbuf *op_err;
5570                         char msg[SCTP_DIAG_INFO_LEN];
5571
5572                         /*
5573                          * out of range (of single byte chunks in the rwnd I
5574                          * give out). This must be an attacker.
5575                          */
5576                         *abort_flag = 1;
5577                         snprintf(msg, sizeof(msg),
5578                             "New cum ack %8.8x too high, highest TSN %8.8x",
5579                             new_cum_tsn, asoc->highest_tsn_inside_map);
5580                         op_err = sctp_generate_cause(SCTP_CAUSE_PROTOCOL_VIOLATION, msg);
5581                         stcb->sctp_ep->last_abort_code = SCTP_FROM_SCTP_INDATA + SCTP_LOC_33;
5582                         sctp_abort_an_association(stcb->sctp_ep, stcb, op_err, SCTP_SO_NOT_LOCKED);
5583                         return;
5584                 }
5585                 SCTP_STAT_INCR(sctps_fwdtsn_map_over);
5586
5587                 memset(stcb->asoc.mapping_array, 0, stcb->asoc.mapping_array_size);
5588                 asoc->mapping_array_base_tsn = new_cum_tsn + 1;
5589                 asoc->highest_tsn_inside_map = new_cum_tsn;
5590
5591                 memset(stcb->asoc.nr_mapping_array, 0, stcb->asoc.mapping_array_size);
5592                 asoc->highest_tsn_inside_nr_map = new_cum_tsn;
5593
5594                 if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_MAP_LOGGING_ENABLE) {
5595                         sctp_log_map(0, 3, asoc->highest_tsn_inside_map, SCTP_MAP_SLIDE_RESULT);
5596                 }
5597         } else {
5598                 SCTP_TCB_LOCK_ASSERT(stcb);
5599                 for (i = 0; i <= gap; i++) {
5600                         if (!SCTP_IS_TSN_PRESENT(asoc->mapping_array, i) &&
5601                             !SCTP_IS_TSN_PRESENT(asoc->nr_mapping_array, i)) {
5602                                 SCTP_SET_TSN_PRESENT(asoc->nr_mapping_array, i);
5603                                 if (SCTP_TSN_GT(asoc->mapping_array_base_tsn + i, asoc->highest_tsn_inside_nr_map)) {
5604                                         asoc->highest_tsn_inside_nr_map = asoc->mapping_array_base_tsn + i;
5605                                 }
5606                         }
5607                 }
5608         }
5609         /*************************************************************/
5610         /* 2. Clear up re-assembly queue                             */
5611         /*************************************************************/
5612
5613         /* This is now done as part of clearing up the stream/seq */
5614         if (asoc->idata_supported == 0) {
5615                 uint16_t sid;
5616
5617                 /* Flush all the un-ordered data based on cum-tsn */
5618                 SCTP_INP_READ_LOCK(stcb->sctp_ep);
5619                 for (sid = 0; sid < asoc->streamincnt; sid++) {
5620                         sctp_flush_reassm_for_str_seq(stcb, asoc, sid, 0, 0, new_cum_tsn);
5621                 }
5622                 SCTP_INP_READ_UNLOCK(stcb->sctp_ep);
5623         }
5624         /*******************************************************/
5625         /* 3. Update the PR-stream re-ordering queues and fix  */
5626         /* delivery issues as needed.                       */
5627         /*******************************************************/
5628         fwd_sz -= sizeof(*fwd);
5629         if (m && fwd_sz) {
5630                 /* New method. */
5631                 unsigned int num_str;
5632                 uint32_t mid, cur_mid;
5633                 uint16_t sid;
5634                 uint16_t ordered, flags;
5635                 struct sctp_strseq *stseq, strseqbuf;
5636                 struct sctp_strseq_mid *stseq_m, strseqbuf_m;
5637
5638                 offset += sizeof(*fwd);
5639
5640                 SCTP_INP_READ_LOCK(stcb->sctp_ep);
5641                 if (asoc->idata_supported) {
5642                         num_str = fwd_sz / sizeof(struct sctp_strseq_mid);
5643                 } else {
5644                         num_str = fwd_sz / sizeof(struct sctp_strseq);
5645                 }
5646                 for (i = 0; i < num_str; i++) {
5647                         if (asoc->idata_supported) {
5648                                 stseq_m = (struct sctp_strseq_mid *)sctp_m_getptr(m, offset,
5649                                     sizeof(struct sctp_strseq_mid),
5650                                     (uint8_t *)&strseqbuf_m);
5651                                 offset += sizeof(struct sctp_strseq_mid);
5652                                 if (stseq_m == NULL) {
5653                                         break;
5654                                 }
5655                                 sid = ntohs(stseq_m->sid);
5656                                 mid = ntohl(stseq_m->mid);
5657                                 flags = ntohs(stseq_m->flags);
5658                                 if (flags & PR_SCTP_UNORDERED_FLAG) {
5659                                         ordered = 0;
5660                                 } else {
5661                                         ordered = 1;
5662                                 }
5663                         } else {
5664                                 stseq = (struct sctp_strseq *)sctp_m_getptr(m, offset,
5665                                     sizeof(struct sctp_strseq),
5666                                     (uint8_t *)&strseqbuf);
5667                                 offset += sizeof(struct sctp_strseq);
5668                                 if (stseq == NULL) {
5669                                         break;
5670                                 }
5671                                 sid = ntohs(stseq->sid);
5672                                 mid = (uint32_t)ntohs(stseq->ssn);
5673                                 ordered = 1;
5674                         }
5675                         /* Convert */
5676
5677                         /* now process */
5678
5679                         /*
5680                          * Ok we now look for the stream/seq on the read
5681                          * queue where its not all delivered. If we find it
5682                          * we transmute the read entry into a PDI_ABORTED.
5683                          */
5684                         if (sid >= asoc->streamincnt) {
5685                                 /* screwed up streams, stop!  */
5686                                 break;
5687                         }
5688                         if ((asoc->str_of_pdapi == sid) &&
5689                             (asoc->ssn_of_pdapi == mid)) {
5690                                 /*
5691                                  * If this is the one we were partially
5692                                  * delivering now then we no longer are.
5693                                  * Note this will change with the reassembly
5694                                  * re-write.
5695                                  */
5696                                 asoc->fragmented_delivery_inprogress = 0;
5697                         }
5698                         strm = &asoc->strmin[sid];
5699                         for (cur_mid = strm->last_mid_delivered; SCTP_MID_GE(asoc->idata_supported, mid, cur_mid); cur_mid++) {
5700                                 sctp_flush_reassm_for_str_seq(stcb, asoc, sid, cur_mid, ordered, new_cum_tsn);
5701                         }
5702                         TAILQ_FOREACH(control, &stcb->sctp_ep->read_queue, next) {
5703                                 if ((control->sinfo_stream == sid) &&
5704                                     (SCTP_MID_EQ(asoc->idata_supported, control->mid, mid))) {
5705                                         str_seq = (sid << 16) | (0x0000ffff & mid);
5706                                         control->pdapi_aborted = 1;
5707                                         sv = stcb->asoc.control_pdapi;
5708                                         control->end_added = 1;
5709                                         if (control->on_strm_q == SCTP_ON_ORDERED) {
5710                                                 TAILQ_REMOVE(&strm->inqueue, control, next_instrm);
5711                                                 if (asoc->size_on_all_streams >= control->length) {
5712                                                         asoc->size_on_all_streams -= control->length;
5713                                                 } else {
5714 #ifdef INVARIANTS
5715                                                         panic("size_on_all_streams = %u smaller than control length %u", asoc->size_on_all_streams, control->length);
5716 #else
5717                                                         asoc->size_on_all_streams = 0;
5718 #endif
5719                                                 }
5720                                                 sctp_ucount_decr(asoc->cnt_on_all_streams);
5721                                         } else if (control->on_strm_q == SCTP_ON_UNORDERED) {
5722                                                 TAILQ_REMOVE(&strm->uno_inqueue, control, next_instrm);
5723 #ifdef INVARIANTS
5724                                         } else if (control->on_strm_q) {
5725                                                 panic("strm: %p ctl: %p unknown %d",
5726                                                     strm, control, control->on_strm_q);
5727 #endif
5728                                         }
5729                                         control->on_strm_q = 0;
5730                                         stcb->asoc.control_pdapi = control;
5731                                         sctp_ulp_notify(SCTP_NOTIFY_PARTIAL_DELVIERY_INDICATION,
5732                                             stcb,
5733                                             SCTP_PARTIAL_DELIVERY_ABORTED,
5734                                             (void *)&str_seq,
5735                                             SCTP_SO_NOT_LOCKED);
5736                                         stcb->asoc.control_pdapi = sv;
5737                                         break;
5738                                 } else if ((control->sinfo_stream == sid) &&
5739                                     SCTP_MID_GT(asoc->idata_supported, control->mid, mid)) {
5740                                         /* We are past our victim SSN */
5741                                         break;
5742                                 }
5743                         }
5744                         if (SCTP_MID_GT(asoc->idata_supported, mid, strm->last_mid_delivered)) {
5745                                 /* Update the sequence number */
5746                                 strm->last_mid_delivered = mid;
5747                         }
5748                         /* now kick the stream the new way */
5749                         /* sa_ignore NO_NULL_CHK */
5750                         sctp_kick_prsctp_reorder_queue(stcb, strm);
5751                 }
5752                 SCTP_INP_READ_UNLOCK(stcb->sctp_ep);
5753         }
5754         /*
5755          * Now slide thing forward.
5756          */
5757         sctp_slide_mapping_arrays(stcb);
5758 }