145 if (read_queue_e == NULL) {
158 TAILQ_INIT(&read_queue_e->
reasm);
161 read_queue_e->
data = dm;
168 return (read_queue_e);
223 cmh = mtod(ret,
struct cmsghdr *);
242 cmh = (
struct cmsghdr *)((caddr_t)cmh + CMSG_SPACE(
sizeof(
struct sctp_rcvinfo)));
264 cmh = (
struct cmsghdr *)((caddr_t)cmh + CMSG_SPACE(
sizeof(
struct sctp_nxtinfo)));
304 KASSERT(in_r || in_nr, (
"%s: Things are really messed up now", __func__));
335 struct sctp_readhead *q;
343 if (!TAILQ_EMPTY(q)) {
350 TAILQ_INSERT_TAIL(q, control, next_instrm);
362 if (TAILQ_EMPTY(q)) {
364 TAILQ_INSERT_HEAD(q, control, next_instrm);
372 TAILQ_FOREACH(at, q, next_instrm) {
378 TAILQ_INSERT_BEFORE(at, control, next_instrm);
392 if (TAILQ_NEXT(at, next_instrm) == NULL) {
401 TAILQ_INSERT_AFTER(q, at, control, next_instrm);
419 int *abort_flag,
int opspot)
426 "Reass %x,CF:%x,TSN=%8.8x,SID=%4.4x,FSN=%8.8x,MID:%8.8x",
434 "Reass %x,CI:%x,TSN=%8.8x,SID=%4.4x,FSN=%4.4x,SSN:%4.4x",
459 TAILQ_FOREACH_SAFE(chk, &control->
reasm, sctp_next, nchk) {
460 TAILQ_REMOVE(&control->
reasm, chk, sctp_next);
469 control->
data = NULL;
522 TAILQ_INSERT_HEAD(&strm->
inqueue, control, next_instrm);
524 SCTP_SNPRINTF(msg,
sizeof(msg),
"Delivered MID=%8.8x, got TSN=%8.8x, SID=%4.4x, MID=%8.8x",
528 SCTP_SNPRINTF(msg,
sizeof(msg),
"Delivered SSN=%4.4x, got TSN=%8.8x, SID=%4.4x, SSN=%4.4x",
567 TAILQ_FOREACH_SAFE(control, &strm->
inqueue, next_instrm, at) {
573 TAILQ_REMOVE(&strm->
inqueue, control, next_instrm);
586 panic(
"Huh control: %p is on_strm_q: %d",
622 "Queue to str MID: %u duplicate", control->
mid);
635 struct mbuf *m, *prev = NULL;
638 stcb = control->
stcb;
677 struct mbuf *prev = NULL;
680 stcb = control->
stcb;
683 panic(
"Control broken");
735 TAILQ_INIT(&nc->
reasm);
773 int inp_read_lock_held)
797 TAILQ_FOREACH_SAFE(chk, &control->
reasm, sctp_next, lchk) {
805 TAILQ_REMOVE(&control->
reasm, chk, sctp_next);
812 if (!TAILQ_EMPTY(&control->
reasm)) {
819 tchk = TAILQ_FIRST(&control->
reasm);
821 TAILQ_REMOVE(&control->
reasm, tchk, sctp_next);
841 tchk = TAILQ_FIRST(&control->
reasm);
845 TAILQ_REMOVE(&control->
reasm, tchk, sctp_next);
846 TAILQ_INSERT_TAIL(&nc->
reasm, tchk, sctp_next);
847 tchk = TAILQ_FIRST(&control->
reasm);
853 TAILQ_INSERT_TAIL(&strm->
uno_inqueue, nc, next_instrm);
856 TAILQ_REMOVE(&strm->
uno_inqueue, control, next_instrm);
865 TAILQ_REMOVE(&strm->
uno_inqueue, control, next_instrm);
929 "chunk is a first fsn: %u becomes fsn_included\n",
931 at = TAILQ_FIRST(&control->
reasm);
982 tdata = control->
data;
1018 TAILQ_FOREACH(at, &control->
reasm, sctp_next) {
1027 TAILQ_INSERT_BEFORE(at, chk, sctp_next);
1041 if (inserted == 0) {
1046 TAILQ_INSERT_TAIL(&control->
reasm, chk, sctp_next);
1073 if ((control != NULL) &&
1087 nctl = TAILQ_NEXT(control, next_instrm);
1093 panic(
"Huh control: %p on_q: %d -- not unordered?",
1098 TAILQ_REMOVE(&strm->
uno_inqueue, control, next_instrm);
1133 control = TAILQ_FIRST(&strm->
inqueue);
1138 if (control == NULL) {
1148 nctl = TAILQ_NEXT(control, next_instrm);
1150 "Looking at control: %p e(%d) ssn: %u top_fsn: %u inc_fsn: %u (lastdel: %u)- o\n",
1158 panic(
"Huh control: %p on_q: %d -- not ordered?",
1163 TAILQ_REMOVE(&strm->
inqueue, control, next_instrm);
1200 "Looking at control: %p e(%d) ssn: %u top_fsn: %u inc_fsn: %u (nxtdel: %u)- o\n",
1203 nctl = TAILQ_NEXT(control, next_instrm);
1214 panic(
"Huh control: %p on_q: %d -- not ordered?",
1219 TAILQ_REMOVE(&strm->
inqueue, control, next_instrm);
1297 if (control->
on_read_q && (hold_rlock == 0)) {
1304 if (control->
data == NULL) {
1329 TAILQ_REMOVE(&strm->
uno_inqueue, control, next_instrm);
1333 TAILQ_REMOVE(&strm->
inqueue, control, next_instrm);
1343 panic(
"Unknown state on ctrl: %p on_strm_q: %d", control,
1368 int created_control,
1374 int do_wakeup, unordered;
1387 if (created_control) {
1427 "chunk is a first fsn: %u becomes fsn_included\n",
1459 "We have a new top_fsn: %u\n",
1465 "The last fsn is now in place fsn: %u\n",
1470 "New fsn: %u is not at top_fsn: %u -- abort\n",
1501 "Duplicate last fsn: %u (top: %u) -- abort\n",
1522 "New fsn: %u is already seen in included_fsn: %u -- abort\n",
1536 "New fsn: %u is beyond or at top_fsn: %u -- abort\n",
1550 "chunk is a not first fsn: %u needs to be inserted\n",
1552 TAILQ_FOREACH(at, &control->
reasm, sctp_next) {
1557 "Last fragment not last in list: -- abort\n");
1568 "Insert it before fsn: %u\n",
1572 TAILQ_INSERT_BEFORE(at, chk, sctp_next);
1589 "Duplicate to fsn: %u -- abort\n",
1597 if (inserted == 0) {
1603 TAILQ_INSERT_TAIL(&control->
reasm, chk, sctp_next);
1617 TAILQ_FOREACH_SAFE(at, &control->
reasm, sctp_next, nat) {
1621 "Adding more to control: %p at: %p fsn: %u next_fsn: %u included: %u\n",
1625 TAILQ_REMOVE(&control->
reasm, at, sctp_next);
1670 TAILQ_FOREACH(control, &strm->
inqueue, next_instrm) {
1676 if (idata_supported) {
1677 TAILQ_FOREACH(control, &strm->
uno_inqueue, next_instrm) {
1691 struct mbuf **m,
int offset,
int chk_length,
1693 int *break_flag,
int last_chunk,
uint8_t chk_type)
1700 int need_reasm_check = 0;
1702 struct mbuf *op_err;
1710 int created_control = 0;
1719 tsn = ntohl(chunk->
dp.
tsn);
1720 sid = ntohs(chunk->
dp.
sid);
1721 mid = ntohl(chunk->
dp.
mid);
1736 tsn = ntohl(chunk->
dp.
tsn);
1737 sid = ntohs(chunk->
dp.
sid);
1742 if ((
size_t)chk_length == clen) {
1829 0, M_NOWAIT, 1, MT_DATA);
1830 if (op_err != NULL) {
1842 cause->stream_id = htons(sid);
1843 cause->reserved = htons(0);
1870 SCTP_SNPRINTF(msg,
sizeof(msg),
"FSN zero for MID=%8.8x, but flags=%2.2x", mid, chk_flags);
1875 chk_flags, control);
1878 if (control != NULL) {
1880 if (ordered && (mid != control->
mid)) {
1881 SCTP_SNPRINTF(msg,
sizeof(msg),
"Reassembly problem (MID=%8.8x)", mid);
1895 "All fragments of a user message must be ordered or unordered (TSN=%8.8x)",
1905 "All fragments of a user message must be ordered or unordered (TSN=%8.8x)",
1916 if (control != NULL) {
1920 SCTP_SNPRINTF(msg,
sizeof(msg),
"Duplicate MID=%8.8x detected.", mid);
1926 "Illegal message sequence, missing end for MID: %8.8x",
1939 (((
int)asoc->
my_rwnd) <= 0)) {
1966 if (control == NULL) {
1974#ifdef SCTP_ASOCLOG_OF_TSNS
1977 asoc->tsn_in_at = 0;
1978 asoc->tsn_in_wrapped = 1;
1980 asoc->in_tsnlog[asoc->tsn_in_at].tsn = tsn;
1981 asoc->in_tsnlog[asoc->tsn_in_at].strm = sid;
1982 asoc->in_tsnlog[asoc->tsn_in_at].seq = mid;
1983 asoc->in_tsnlog[asoc->tsn_in_at].sz = chk_length;
1984 asoc->in_tsnlog[asoc->tsn_in_at].flgs = chunk_flags;
1985 asoc->in_tsnlog[asoc->tsn_in_at].stcb = (
void *)stcb;
1986 asoc->in_tsnlog[asoc->tsn_in_at].in_pos = asoc->tsn_in_at;
1987 asoc->in_tsnlog[asoc->tsn_in_at].in_out = 1;
2006 SCTP_SNPRINTF(msg,
sizeof(msg),
"Delivered MID=%8.8x, got TSN=%8.8x, SID=%4.4x, MID=%8.8x",
2012 SCTP_SNPRINTF(msg,
sizeof(msg),
"Delivered SSN=%4.4x, got TSN=%8.8x, SID=%4.4x, SSN=%4.4x",
2029 if (last_chunk == 0) {
2039#ifdef SCTP_MBUF_LOGGING
2069 if (l_len > the_len) {
2071 m_adj(dmbuf, -(l_len - the_len));
2074 if (dmbuf == NULL) {
2083 if (control == NULL) {
2090 if (control == NULL) {
2097 control->
data = dmbuf;
2099 for (mm = control->
data; mm; mm = mm->m_next) {
2111 created_control = 1;
2114 chk_flags, ordered, mid, control);
2149 goto finish_express_del;
2158 if (last_chunk == 0) {
2204 if (((liste = TAILQ_FIRST(&asoc->
resetHead)) != NULL) &&
2215 unsigned char inserted = 0;
2222 TAILQ_INSERT_BEFORE(lcontrol, control,
next);
2227 if (inserted == 0) {
2236 goto finish_express_del;
2259 goto finish_express_del;
2262 need_reasm_check = 1;
2264 "Queue data to stream for reasm control: %p MID: %u\n",
2300 if (need_reasm_check) {
2302 need_reasm_check = 0;
2305 if (((liste = TAILQ_FIRST(&asoc->
resetHead)) != NULL) &&
2314 TAILQ_REMOVE(&asoc->
resetHead, liste, next_resp);
2328 if (need_reasm_check) {
2330 need_reasm_check = 0;
2349 if (need_reasm_check) {
2351 need_reasm_check = 0;
2360 0, 1, 0, 2, 0, 1, 0, 3,
2361 0, 1, 0, 2, 0, 1, 0, 4,
2362 0, 1, 0, 2, 0, 1, 0, 3,
2363 0, 1, 0, 2, 0, 1, 0, 5,
2364 0, 1, 0, 2, 0, 1, 0, 3,
2365 0, 1, 0, 2, 0, 1, 0, 4,
2366 0, 1, 0, 2, 0, 1, 0, 3,
2367 0, 1, 0, 2, 0, 1, 0, 6,
2368 0, 1, 0, 2, 0, 1, 0, 3,
2369 0, 1, 0, 2, 0, 1, 0, 4,
2370 0, 1, 0, 2, 0, 1, 0, 3,
2371 0, 1, 0, 2, 0, 1, 0, 5,
2372 0, 1, 0, 2, 0, 1, 0, 3,
2373 0, 1, 0, 2, 0, 1, 0, 4,
2374 0, 1, 0, 2, 0, 1, 0, 3,
2375 0, 1, 0, 2, 0, 1, 0, 7,
2376 0, 1, 0, 2, 0, 1, 0, 3,
2377 0, 1, 0, 2, 0, 1, 0, 4,
2378 0, 1, 0, 2, 0, 1, 0, 3,
2379 0, 1, 0, 2, 0, 1, 0, 5,
2380 0, 1, 0, 2, 0, 1, 0, 3,
2381 0, 1, 0, 2, 0, 1, 0, 4,
2382 0, 1, 0, 2, 0, 1, 0, 3,
2383 0, 1, 0, 2, 0, 1, 0, 6,
2384 0, 1, 0, 2, 0, 1, 0, 3,
2385 0, 1, 0, 2, 0, 1, 0, 4,
2386 0, 1, 0, 2, 0, 1, 0, 3,
2387 0, 1, 0, 2, 0, 1, 0, 5,
2388 0, 1, 0, 2, 0, 1, 0, 3,
2389 0, 1, 0, 2, 0, 1, 0, 4,
2390 0, 1, 0, 2, 0, 1, 0, 3,
2391 0, 1, 0, 2, 0, 1, 0, 8
2412 int slide_from, slide_end, lgap, distance;
2413 uint32_t old_cumack, old_base, old_highest, highest_tsn;
2440 panic(
"huh, cumack 0x%x greater than high-tsn 0x%x in map",
2443 SCTP_PRINTF(
"huh, cumack 0x%x greater than high-tsn 0x%x in map - should panic?\n",
2467 clr = ((at + 7) >> 3);
2476 SCTP_PRINTF(
"Error Mapping array's not clean at clear\n");
2483 }
else if (at >= 8) {
2492 slide_end = (lgap >> 3);
2493 if (slide_end < slide_from) {
2496 panic(
"impossible slide");
2498 SCTP_PRINTF(
"impossible slide lgap: %x slide_end: %x slide_from: %x? at: %d\n",
2499 lgap, slide_end, slide_from, at);
2505 panic(
"would overrun buffer");
2507 SCTP_PRINTF(
"Gak, would have overrun map end: %d slide_end: %d\n",
2512 distance = (slide_end - slide_from) + 1;
2535 for (ii = 0; ii < distance; ii++) {
2605 ((was_a_gap) && (is_a_gap == 0)) ||
2657 int break_flag, last_chunk;
2658 int abort_flag = 0, was_a_gap;
2697 to = mtod(m, caddr_t *);
2698 from = mtod((*mm), caddr_t *);
2723 while (stop_proc == 0) {
2726 if (length - *offset < chk_length) {
2733 struct mbuf *op_err;
2736 SCTP_SNPRINTF(msg,
sizeof(msg),
"%s",
"DATA chunk received when I-DATA was negotiated");
2744 struct mbuf *op_err;
2747 SCTP_SNPRINTF(msg,
sizeof(msg),
"%s",
"I-DATA chunk received when DATA was negotiated");
2762 if (chk_length < clen) {
2767 struct mbuf *op_err;
2778#ifdef SCTP_AUDITING_ENABLED
2779 sctp_audit_log(0xB1, 0);
2781 if (
SCTP_SIZE32(chk_length) == (length - *offset)) {
2787 chk_length, net, high_tsn, &abort_flag, &break_flag,
2838 struct mbuf *op_err;
2841 SCTP_SNPRINTF(msg,
sizeof(msg),
"DATA chunk followed by chunk of type %2.2x",
2857 struct mbuf *op_err;
2860 SCTP_SNPRINTF(msg,
sizeof(msg),
"Chunk of length %u", chk_length);
2868 struct mbuf *op_err;
2872 0, M_NOWAIT, 1, MT_DATA);
2873 if (op_err != NULL) {
2895 if ((*offset >=
length) || stop_proc) {
2950 unsigned int theTSN;
2951 int j, wake_him = 0, circled = 0;
2958 for (j = frag_strt; j <= frag_end; j++) {
2959 theTSN = j + last_tsn;
2999 *biggest_newly_acked_tsn)) {
3000 *biggest_newly_acked_tsn = tp1->
rec.
data.
tsn;
3021 if (*this_sack_lowest_newack == 0) {
3030 *this_sack_lowest_newack = tp1->
rec.
data.
tsn;
3111#ifdef SCTP_AUDITING_ENABLED
3112 sctp_audit_log(0xB2,
3137 panic(
"No chunks on the queues for sid %u.", tp1->
rec.
data.
sid);
3163 tp1 = TAILQ_NEXT(tp1, sctp_next);
3164 if ((tp1 == NULL) && (circled == 0)) {
3183 int num_seg,
int num_nr_seg,
int *rto_ok)
3191 uint16_t frag_strt, frag_end, prev_frag_end;
3197 for (i = 0; i < (num_seg + num_nr_seg); i++) {
3204 *offset +=
sizeof(block);
3206 return (chunk_freed);
3208 frag_strt = ntohs(frag->
start);
3209 frag_end = ntohs(frag->
end);
3211 if (frag_strt > frag_end) {
3215 if (frag_strt <= prev_frag_end) {
3219 if (
SCTP_TSN_GT((last_tsn + frag_end), *biggest_tsn_acked)) {
3220 *biggest_tsn_acked = last_tsn + frag_end;
3228 non_revocable, &num_frs, biggest_newly_acked_tsn,
3229 this_sack_lowest_newack, rto_ok)) {
3232 prev_frag_end = frag_end;
3237 *biggest_newly_acked_tsn,
3240 return (chunk_freed);
3306 int strike_flag = 0;
3308 int tot_retrans = 0;
3311 int num_dests_sacked = 0;
3327 TAILQ_FOREACH(net, &asoc->
nets, sctp_next) {
3335 TAILQ_FOREACH(tp1, &asoc->
sent_queue, sctp_next) {
3358 if (tp1->
data != NULL) {
3391 }
else if (tp1->
whoTo &&
3464#ifdef SCTP_FR_TO_ALTERNATE
3515 (num_dests_sacked == 1) &&
3536 biggest_tsn_newly_acked)) {
3618 if (tp1->
data != NULL) {
3623 if (tp1->
whoTo != NULL) {
3682#ifdef SCTP_FR_TO_ALTERNATE
3731 if ((tp1->
whoTo != NULL) &&
3737 if (alt != tp1->
whoTo) {
3759 TAILQ_FOREACH_SAFE(tp1, &asoc->
sent_queue, sctp_next, tp2) {
3841 int inflight = 0, resend = 0, inbetween = 0, acked = 0, above = 0;
3844 int entry_flight, entry_cnt;
3857 SCTP_PRINTF(
"Chk TSN: %u size: %d inflight cnt: %d\n",
3873 if ((inflight > 0) || (inbetween > 0)) {
3875 panic(
"Flight size-express incorrect? \n");
3878 entry_flight, entry_cnt);
3880 SCTP_PRINTF(
"Flight size-express incorrect F: %d I: %d R: %d Ab: %d ACK: %d\n",
3881 inflight, inbetween, resend, above, acked);
3925 uint32_t rwnd,
int *abort_now,
int ecne_seen)
3931 int win_probe_recovery = 0;
3932 int win_probe_recovered = 0;
3933 int j, done_once = 0;
3942#ifdef SCTP_ASOCLOG_OF_TSNS
3943 stcb->
asoc.cumack_log[stcb->
asoc.cumack_log_at] = cumack;
3944 stcb->
asoc.cumack_log_at++;
3946 stcb->
asoc.cumack_log_at = 0;
3969 TAILQ_FOREACH(net, &
asoc->
nets, sctp_next) {
3990 sctpchunk_listhead);
3996 struct mbuf *op_err;
4002 "Cum ack %8.8x greater or equal than TSN %8.8x",
4020 TAILQ_FOREACH_SAFE(tp1, &asoc->
sent_queue, sctp_next, tp2) {
4023 SCTP_PRINTF(
"Warning, an unsent is now acked?\n");
4105 panic(
"No chunks on the queues for sid %u.", tp1->
rec.
data.
sid);
4114 TAILQ_REMOVE(&asoc->
sent_queue, tp1, sctp_next);
4152 TAILQ_FOREACH(net, &asoc->
nets, sctp_next) {
4201 TAILQ_FOREACH(net, &asoc->
nets, sctp_next) {
4217 win_probe_recovery = 1;
4222 TAILQ_FOREACH(net, &asoc->
nets, sctp_next) {
4224 win_probe_recovered = 1;
4230 TAILQ_FOREACH(tp1, &asoc->
sent_queue, sctp_next) {
4264 (win_probe_recovered == 0) &&
4271 TAILQ_FOREACH(net, &asoc->
nets, sctp_next) {
4277 TAILQ_FOREACH(tp1, &asoc->
sent_queue, sctp_next) {
4305 struct mbuf *op_err;
4380 for (; lchk != NULL; lchk = TAILQ_NEXT(lchk, sctp_next)) {
4381 if (lchk->
whoTo != NULL) {
4409 uint32_t last_tsn, biggest_tsn_acked, biggest_tsn_newly_acked, this_sack_lowest_newack;
4413 int accum_moved = 0;
4414 int will_exit_fast_recovery = 0;
4416 int win_probe_recovery = 0;
4417 int win_probe_recovered = 0;
4447 this_sack_lowest_newack = 0;
4451#ifdef SCTP_ASOCLOG_OF_TSNS
4452 stcb->
asoc.cumack_log[stcb->
asoc.cumack_log_at] = cum_ack;
4453 stcb->
asoc.cumack_log_at++;
4455 stcb->
asoc.cumack_log_at = 0;
4487 for (i = 0; i < num_dup; i++) {
4490 if (dupdata == NULL) {
4499 sctpchunk_listhead);
4506 struct mbuf *op_err;
4513 SCTP_PRINTF(
"NEW cum_ack:%x send_s:%x is smaller or equal\n",
4516 SCTP_PRINTF(
"Got send_s from tsn:%x + 1 of tp1: %p\n",
4523 "Cum ack %8.8x greater or equal than TSN %8.8x",
4556 TAILQ_FOREACH(net, &asoc->
nets, sctp_next) {
4573 TAILQ_FOREACH(net, &asoc->
nets, sctp_next) {
4601 TAILQ_FOREACH(tp1, &asoc->
sent_queue, sctp_next) {
4623 ~SCTP_ADDR_UNCONFIRMED;
4699#ifdef SCTP_AUDITING_ENABLED
4700 sctp_audit_log(0xB3,
4717 biggest_tsn_newly_acked = biggest_tsn_acked = last_tsn;
4721 if ((num_seg > 0) || (num_nr_seg > 0)) {
4729 &biggest_tsn_newly_acked, &this_sack_lowest_newack,
4730 num_seg, num_nr_seg, &rto_ok)) {
4742 SCTP_PRINTF(
"Hopeless peer! biggest_tsn_acked:%x largest seq:%x\n",
4743 biggest_tsn_acked, send_s);
4751 TAILQ_FOREACH(net, &asoc->
nets, sctp_next) {
4759 TAILQ_FOREACH(net, &asoc->
nets, sctp_next) {
4770 TAILQ_FOREACH_SAFE(tp1, &asoc->
sent_queue, sctp_next, tp2) {
4779 panic(
"No chunks on the queues for sid %u.", tp1->
rec.
data.
sid);
4788 TAILQ_REMOVE(&asoc->
sent_queue, tp1, sctp_next);
4816 panic(
"Warning flight size is positive and should be 0");
4818 SCTP_PRINTF(
"Warning flight size incorrect should be 0 is %d\n",
4840 will_exit_fast_recovery = 1;
4857 int cnt_revoked = 0;
4860 TAILQ_FOREACH(tp1, &asoc->
sent_queue, sctp_next) {
4894 if (ecne_seen == 0) {
4895 TAILQ_FOREACH(net, &asoc->
nets, sctp_next) {
4945 TAILQ_FOREACH(net, &asoc->
nets, sctp_next) {
4982 struct mbuf *op_err;
5034 TAILQ_FOREACH(net, &asoc->
nets, sctp_next) {
5045 (cmt_dac_flag == 0)) {
5046 this_sack_lowest_newack = cum_ack;
5048 if ((num_seg > 0) || (num_nr_seg > 0)) {
5050 biggest_tsn_newly_acked, this_sack_lowest_newack, accum_moved);
5068 TAILQ_FOREACH(net, &asoc->
nets, sctp_next) {
5087 win_probe_recovery = 1;
5097 TAILQ_FOREACH(net, &asoc->
nets, sctp_next) {
5099 win_probe_recovered = 1;
5106 TAILQ_FOREACH(tp1, &asoc->
sent_queue, sctp_next) {
5142 (win_probe_recovered == 0) &&
5149 TAILQ_FOREACH(net, &asoc->
nets, sctp_next) {
5155 TAILQ_FOREACH(tp1, &asoc->
sent_queue, sctp_next) {
5190 old_adv_peer_ack_point);
5201 for (; lchk != NULL; lchk = TAILQ_NEXT(lchk, sctp_next)) {
5202 if (lchk->
whoTo != NULL) {
5242 int need_reasm_check = 0;
5250 TAILQ_FOREACH_SAFE(control, &
strmin->
inqueue, next_instrm, ncontrol) {
5261 panic(
"strmin: %p ctl: %p unknown %d",
5295 need_reasm_check = 1;
5304 if (need_reasm_check) {
5316 need_reasm_check = 0;
5323 TAILQ_FOREACH_SAFE(control, &
strmin->
inqueue, next_instrm, ncontrol) {
5334 panic(
"strmin: %p ctl: %p unknown %d",
5369 need_reasm_check = 1;
5377 if (need_reasm_check) {
5402 TAILQ_FOREACH_SAFE(chk, &control->
reasm, sctp_next, nchk) {
5409 TAILQ_REMOVE(&control->
reasm, chk, sctp_next);
5426 if (!TAILQ_EMPTY(&control->
reasm)) {
5428 if (control->
data) {
5430 control->
data = NULL;
5433 chk = TAILQ_FIRST(&control->
reasm);
5435 TAILQ_REMOVE(&control->
reasm, chk, sctp_next);
5443 TAILQ_REMOVE(&strm->
inqueue, control, next_instrm);
5456 TAILQ_REMOVE(&strm->
uno_inqueue, control, next_instrm);
5460 panic(
"strm: %p ctl: %p unknown %d",
5467 if (control->
data) {
5469 control->
data = NULL;
5478 int *abort_flag,
struct mbuf *m,
int offset)
5494 unsigned int i, fwd_sz, m_size;
5502 "Bad size too small/big fwd-tsn\n");
5521 if (gap >= m_size) {
5523 struct mbuf *op_err;
5532 "New cum ack %8.8x too high, highest TSN %8.8x",
5553 for (i = 0; i <= gap; i++) {
5574 strm = &asoc->
strmin[sid];
5585 fwd_sz -=
sizeof(*fwd);
5588 unsigned int num_str;
5595 offset +=
sizeof(*fwd);
5603 for (i = 0; i < num_str; i++) {
5609 if (stseq_m == NULL) {
5612 sid = ntohs(stseq_m->
sid);
5613 mid = ntohl(stseq_m->
mid);
5625 if (stseq == NULL) {
5657 TAILQ_FOREACH_SAFE(control, &strm->
inqueue, next_instrm, ncontrol) {
5664 TAILQ_FOREACH_SAFE(control, &strm->
uno_inqueue, next_instrm, ncontrol) {
5678 str_seq = (
sid << 16) | (0x0000ffff & mid);
5683 TAILQ_REMOVE(&strm->
inqueue, control, next_instrm);
5695 TAILQ_REMOVE(&strm->
uno_inqueue, control, next_instrm);
5698 panic(
"strm: %p ctl: %p unknown %d",
#define SCTP_DATA_FIRST_FRAG
#define SCTP_INITIATION_ACK
#define SCTP_FLIGHT_LOGGING_ENABLE
#define SCTP_HEARTBEAT_ACK
#define SCTP_SACK_CMT_DAC
#define SCTP_CAUSE_UNRECOG_CHUNK
#define SCTP_PCB_FLAGS_SOCKET_ALLGONE
#define SCTP_FORWARD_CUM_TSN
#define SCTP_LOG_SACK_ARRIVALS_ENABLE
#define SCTP_OPERATION_ERROR
#define SCTP_DATA_UNORDERED
#define SCTP_PCB_FLAGS_EXT_RCVINFO
#define SCTP_CAUSE_INVALID_STREAM
#define SCTP_PACKET_DROPPED
#define SCTP_LOG_TRY_ADVANCE
#define SCTP_PCB_FLAGS_RECVNXTINFO
#define SCTP_SELECTIVE_ACK
#define SCTP_THRESHOLD_LOGGING
#define SCTP_MAP_LOGGING_ENABLE
#define SCTP_PCB_FLAGS_SOCKET_GONE
#define SCTP_STR_LOGGING_ENABLE
#define SCTP_DATA_NOT_FRAG
#define SCTP_CAUSE_PROTOCOL_VIOLATION
#define SCTP_PCB_FLAGS_RECVDATAIOEVNT
#define SCTP_STREAM_RESET
#define SCTP_DATA_LAST_FRAG
#define SCTP_LOG_RWND_ENABLE
#define SCTP_AUTHENTICATION
#define SCTP_DATA_SACK_IMMEDIATELY
#define SCTP_SHUTDOWN_ACK
#define SCTP_SACK_LOGGING_ENABLE
#define SCTP_CAUSE_OUT_OF_RESC
#define SCTP_SHUTDOWN_COMPLETE
#define SCTP_FR_LOGGING_ENABLE
#define SCTP_CAUSE_USER_INITIATED_ABT
#define SCTP_MBUF_LOGGING_ENABLE
#define SCTP_CWND_LOGGING_ENABLE
#define SCTP_SACK_RWND_LOGGING_ENABLE
#define SCTP_ABORT_ASSOCIATION
#define SCTP_PCB_FLAGS_RECVRCVINFO
#define SCTP_HEARTBEAT_REQUEST
#define SCTP_NR_SELECTIVE_ACK
#define SCTP_WAKE_LOGGING_ENABLE
struct mbuf * sctp_get_mbuf_for_msg(unsigned int space_needed, int want_header, int how, int allonebuf, int type)
#define SCTP_DIAG_INFO_LEN
#define SCTP_TIMER_TYPE_SHUTDOWNACK
#define SCTP_DATAGRAM_NR_ACKED
#define SCTP_STR_LOG_FROM_INTO_STRD
#define SCTP_FLIGHT_LOG_UP_REVOKE
#define SCTP_INCREASE_PEER_RWND
#define SCTP_ADD_SUBSTATE(_stcb, _substate)
#define SCTP_FLIGHT_LOG_DWN_WP_FWD
#define SCTP_TSN_GT(a, b)
#define SCTP_MAP_TSN_ENTERS
#define SCTP_STR_LOG_FROM_INSERT_TL
#define SCTP_DATAGRAM_RESEND
#define SCTP_FWD_TSN_CHECK
#define SCTP_SO_NOT_LOCKED
#define SCTP_MAP_PREPARE_SLIDE
#define SCTP_TIMER_TYPE_HEARTBEAT
#define SCTP_MID_GT(i, a, b)
#define SCTP_SACK_LOG_NORMAL
#define SCTP_MAP_SLIDE_RESULT
#define SCTP_SET_PEER_RWND_VIA_SACK
#define SCTP_NOTIFY_INTERFACE_UP
#define SCTP_CWND_LOG_FROM_SACK
#define sctp_sorwakeup(inp, so)
#define SCTP_CALC_TSN_TO_GAP(gap, tsn, mapping_tsn)
#define SCTP_WAKESND_FROM_SACK
#define SCTP_MAX_DUP_TSNS
#define SCTP_FR_LOG_CHECK_STRIKE
#define SCTP_STATE_SHUTDOWN_PENDING
#define SCTP_ADDR_UNCONFIRMED
#define SCTP_TIMER_TYPE_RECV
#define SCTP_LOG_FREE_SENT
#define SCTP_LOG_TSN_ACKED
#define SCTP_TSN_GE(a, b)
#define SCTP_MID_GE(i, a, b)
#define SCTP_STATE_SHUTDOWN_ACK_SENT
#define SCTP_FROM_SCTP_INDATA
#define PR_SCTP_UNORDERED_FLAG
#define SCTP_TIMER_TYPE_SHUTDOWNGUARD
#define SCTP_GET_STATE(_stcb)
#define SCTP_THRESHOLD_CLEAR
#define SCTP_GETTIME_TIMEVAL(x)
#define SCTP_STR_LOG_FROM_IMMED_DEL
#define SCTP_DATAGRAM_UNSENT
#define SCTP_STATE_CLOSED_SOCKET
#define SCTP_RTT_FROM_DATA
#define SCTP_SACK_LOG_EXPRESS
#define SCTP_LOG_TSN_REVOKED
#define SCTP_FLIGHT_LOG_DOWN_RSND
#define SCTP_NOTIFY_PARTIAL_DELVIERY_INDICATION
#define SCTP_FLIGHT_LOG_DOWN_GAP
#define SCTP_DATAGRAM_MARKED
#define SCTP_DATAGRAM_SENT
#define SCTP_FR_LOG_BIGGEST_TSNS
#define SCTP_PARTIAL_DELIVERY_SHIFT
#define SCTP_TIMER_TYPE_SHUTDOWN
#define SCTP_STATE_SHUTDOWN_SENT
#define SCTP_STATE_SHUTDOWN_RECEIVED
#define SCTP_SET_TSN_PRESENT(arry, gap)
#define SCTP_STATE_ABOUT_TO_BE_FREED
#define SCTP_ADDR_REACHABLE
#define SCTP_UNSET_TSN_PRESENT(arry, gap)
#define SCTP_FLIGHT_LOG_DOWN_CA
#define SCTP_NOWAKE_FROM_SACK
#define SCTP_SET_STATE(_stcb, _state)
#define SCTP_FR_LOG_STRIKE_CHUNK
#define SCTP_STR_LOG_FROM_EXPRS_DEL
#define SCTP_LOG_NEW_SACK
#define SCTP_MAP_SLIDE_NONE
#define SCTP_FORWARD_TSN_SKIP
#define SCTP_MAP_SLIDE_FROM
#define SCTP_MID_EQ(i, a, b)
#define SCTP_DATAGRAM_ACKED
#define SCTP_FLIGHT_LOG_DOWN_WP
#define SCTP_TIMER_TYPE_SEND
#define SCTP_SACK_RWND_UPDATE
#define sctp_sowwakeup_locked(inp, so)
#define SCTP_DEBUG_INDATA1
#define SCTP_STR_LOG_FROM_MARK_TSN
#define SCTP_MAPPING_ARRAY
#define SCTP_MINIMAL_RWND
#define SCTP_IS_TSN_PRESENT(arry, gap)
#define SCTP_STATE_PARTIAL_MSG_LEFT
void sctp_update_acked(struct sctp_tcb *stcb, struct sctp_shutdown_chunk *cp, int *abort_flag)
static struct sctp_queued_to_read * sctp_find_reasm_entry(struct sctp_stream_in *strm, uint32_t mid, int ordered, int idata_supported)
static int sctp_process_segment_range(struct sctp_tcb *stcb, struct sctp_tmit_chunk **p_tp1, uint32_t last_tsn, uint16_t frag_strt, uint16_t frag_end, int nr_sacking, int *num_frs, uint32_t *biggest_newly_acked_tsn, uint32_t *this_sack_lowest_newack, int *rto_ok)
static void sctp_setup_tail_pointer(struct sctp_queued_to_read *control)
static int sctp_deliver_reasm_check(struct sctp_tcb *stcb, struct sctp_association *asoc, struct sctp_stream_in *strm, int inp_read_lock_held)
void sctp_handle_forward_tsn(struct sctp_tcb *stcb, struct sctp_forward_tsn_chunk *fwd, int *abort_flag, struct mbuf *m, int offset)
static int sctp_handle_old_unordered_data(struct sctp_tcb *stcb, struct sctp_association *asoc, struct sctp_stream_in *strm, struct sctp_queued_to_read *control, uint32_t pd_point, int inp_read_lock_held)
struct sctp_tmit_chunk * sctp_try_advance_peer_ack_point(struct sctp_tcb *stcb, struct sctp_association *asoc)
uint32_t sctp_calc_rwnd(struct sctp_tcb *stcb, struct sctp_association *asoc)
static void sctp_queue_data_for_reasm(struct sctp_tcb *stcb, struct sctp_association *asoc, struct sctp_queued_to_read *control, struct sctp_tmit_chunk *chk, int created_control, int *abort_flag, uint32_t tsn)
static void sctp_window_probe_recovery(struct sctp_tcb *stcb, struct sctp_association *asoc, struct sctp_tmit_chunk *tp1)
static void sctp_flush_reassm_for_str_seq(struct sctp_tcb *stcb, struct sctp_association *asoc, struct sctp_stream_in *strm, struct sctp_queued_to_read *control, int ordered, uint32_t cumtsn)
static void sctp_build_readq_entry_from_ctl(struct sctp_queued_to_read *nc, struct sctp_queued_to_read *control)
void sctp_set_rwnd(struct sctp_tcb *stcb, struct sctp_association *asoc)
static const int8_t sctp_map_lookup_tab[256]
static void sctp_queue_data_to_stream(struct sctp_tcb *stcb, struct sctp_association *asoc, struct sctp_queued_to_read *control, int *abort_flag, int *need_reasm)
static void sctp_kick_prsctp_reorder_queue(struct sctp_tcb *stcb, struct sctp_stream_in *strmin)
int sctp_process_data(struct mbuf **mm, int iphlen, int *offset, int length, struct sctp_inpcb *inp, struct sctp_tcb *stcb, struct sctp_nets *net, uint32_t *high_tsn)
static void sctp_clean_up_control(struct sctp_tcb *stcb, struct sctp_queued_to_read *control)
static void sctp_mark_non_revokable(struct sctp_association *asoc, uint32_t tsn)
static int sctp_fs_audit(struct sctp_association *asoc)
struct mbuf * sctp_build_ctl_nchunk(struct sctp_inpcb *inp, struct sctp_sndrcvinfo *sinfo)
static void sctp_inject_old_unordered_data(struct sctp_tcb *stcb, struct sctp_association *asoc, struct sctp_queued_to_read *control, struct sctp_tmit_chunk *chk, int *abort_flag)
void sctp_sack_check(struct sctp_tcb *stcb, int was_a_gap)
void sctp_handle_sack(struct mbuf *m, int offset_seg, int offset_dup, struct sctp_tcb *stcb, uint16_t num_seg, uint16_t num_nr_seg, uint16_t num_dup, int *abort_now, uint8_t flags, uint32_t cum_ack, uint32_t rwnd, int ecne_seen)
void sctp_express_handle_sack(struct sctp_tcb *stcb, uint32_t cumack, uint32_t rwnd, int *abort_now, int ecne_seen)
static void sctp_strike_gap_ack_chunks(struct sctp_tcb *stcb, struct sctp_association *asoc, uint32_t biggest_tsn_acked, uint32_t biggest_tsn_newly_acked, uint32_t this_sack_lowest_newack, int accum_moved)
static void sctp_abort_in_reasm(struct sctp_tcb *stcb, struct sctp_queued_to_read *control, struct sctp_tmit_chunk *chk, int *abort_flag, int opspot)
static uint32_t sctp_add_chk_to_control(struct sctp_queued_to_read *control, struct sctp_stream_in *strm, struct sctp_tcb *stcb, struct sctp_association *asoc, struct sctp_tmit_chunk *chk, int hold_rlock)
static int sctp_process_a_data_chunk(struct sctp_tcb *stcb, struct sctp_association *asoc, struct mbuf **m, int offset, int chk_length, struct sctp_nets *net, uint32_t *high_tsn, int *abort_flag, int *break_flag, int last_chunk, uint8_t chk_type)
static int sctp_place_control_in_stream(struct sctp_stream_in *strm, struct sctp_association *asoc, struct sctp_queued_to_read *control)
static int sctp_handle_segments(struct mbuf *m, int *offset, struct sctp_tcb *stcb, struct sctp_association *asoc, uint32_t last_tsn, uint32_t *biggest_tsn_acked, uint32_t *biggest_newly_acked_tsn, uint32_t *this_sack_lowest_newack, int num_seg, int num_nr_seg, int *rto_ok)
static void sctp_add_to_tail_pointer(struct sctp_queued_to_read *control, struct mbuf *m, uint32_t *added)
void sctp_slide_mapping_arrays(struct sctp_tcb *stcb)
struct sctp_queued_to_read * sctp_build_readq_entry(struct sctp_tcb *stcb, struct sctp_nets *net, uint32_t tsn, uint32_t ppid, uint32_t context, uint16_t sid, uint32_t mid, uint8_t flags, struct mbuf *dm)
static void sctp_reset_a_control(struct sctp_queued_to_read *control, struct sctp_inpcb *inp, uint32_t tsn)
static void sctp_check_for_revoked(struct sctp_tcb *stcb, struct sctp_association *asoc, uint32_t cumack, uint32_t biggest_tsn_acked)
#define sctp_build_readq_entry_mac(_ctl, in_it, context, net, tsn, ppid, sid, flags, dm, tfsn, mid)
#define SCTP_INP_READ_UNLOCK(_inp)
#define SCTP_TCB_LOCK_ASSERT(_tcb)
#define SCTP_INP_READ_LOCK(_inp)
#define SCTP_LTRACE_CHK(a, b, c, d)
#define SCTP_SNPRINTF(...)
#define SCTP_OS_TIMER_PENDING
#define SCTP_BUF_RESV_UF(m, size)
#define SCTP_PRINTF(params...)
#define SCTP_FREE(var, type)
#define SCTPDBG(level, params...)
#define SCTP_BASE_SYSCTL(__m)
#define SCTP_SB_LIMIT_RCV(so)
void sctp_send_shutdown_ack(struct sctp_tcb *stcb, struct sctp_nets *net)
void send_forward_tsn(struct sctp_tcb *stcb, struct sctp_association *asoc)
void sctp_queue_op_err(struct sctp_tcb *stcb, struct mbuf *op_err)
void sctp_send_packet_dropped(struct sctp_tcb *stcb, struct sctp_nets *net, struct mbuf *m, int len, int iphlen, int bad_crc)
void sctp_send_deferred_reset_response(struct sctp_tcb *stcb, struct sctp_stream_reset_list *ent, int response)
void sctp_send_sack(struct sctp_tcb *stcb, int so_locked)
void sctp_send_shutdown(struct sctp_tcb *stcb, struct sctp_nets *net)
#define SCTP_ON_UNORDERED
#define SCTP_STREAM_RESET_PENDING
#define SCTP_TSN_LOG_SIZE
struct sctp_nets * sctp_find_alternate_net(struct sctp_tcb *stcb, struct sctp_nets *net, int mode)
#define PR_SCTP_ENABLED(x)
#define SCTP_NEXT_MSG_IS_NOTIFICATION
#define PR_SCTP_RTX_ENABLED(x)
#define SCTP_NEXT_MSG_AVAIL
#define SCTP_NOTIFICATION
#define SCTP_NEXT_MSG_ISCOMPLETE
#define SCTP_PARTIAL_DELIVERY_ABORTED
#define PR_SCTP_BUF_ENABLED(x)
#define SCTP_STAT_INCR_COUNTER64(_x)
#define PR_SCTP_TTL_ENABLED(x)
#define SCTP_STAT_INCR(_x)
#define SCTP_STAT_DECR_GAUGE32(_x)
#define SCTP_NEXT_MSG_IS_UNORDERED
#define sctp_free_a_chunk(_stcb, _chk, _so_locked)
#define sctp_flight_size_decrease(tp1)
#define sctp_total_flight_decrease(stcb, tp1)
#define sctp_is_feature_on(inp, feature)
#define sctp_alloc_a_readq(_stcb, _readq)
#define sctp_is_feature_off(inp, feature)
#define sctp_total_flight_increase(stcb, tp1)
#define sctp_free_a_readq(_stcb, _readq)
#define sctp_free_remote_addr(__net)
#define sctp_sbspace(asoc, sb)
#define sctp_ucount_incr(val)
#define sctp_ucount_decr(val)
#define sctp_alloc_a_chunk(_stcb, _chk)
#define sctp_sballoc(stcb, sb, m)
#define sctp_sbspace_sub(a, b)
#define sctp_flight_size_increase(tp1)
void sctp_misc_ints(uint8_t from, uint32_t a, uint32_t b, uint32_t c, uint32_t d)
struct mbuf * sctp_generate_no_user_data_cause(uint32_t tsn)
void sctp_timer_stop(int t_type, struct sctp_inpcb *inp, struct sctp_tcb *stcb, struct sctp_nets *net, uint32_t from)
void sctp_timer_start(int t_type, struct sctp_inpcb *inp, struct sctp_tcb *stcb, struct sctp_nets *net)
int sctp_expand_mapping_array(struct sctp_association *asoc, uint32_t needed)
void sctp_log_rwnd(uint8_t from, uint32_t peers_rwnd, uint32_t snd_size, uint32_t overhead)
struct mbuf * sctp_generate_cause(uint16_t code, char *info)
int sctp_calculate_rto(struct sctp_tcb *stcb, struct sctp_association *asoc, struct sctp_nets *net, struct timeval *old, int rtt_from_sack)
void sctp_wakeup_log(struct sctp_tcb *stcb, uint32_t wake_cnt, int from)
void sctp_log_sack(uint32_t old_cumack, uint32_t cumack, uint32_t tsn, uint16_t gaps, uint16_t dups, int from)
void sctp_ulp_notify(uint32_t notification, struct sctp_tcb *stcb, uint32_t error, void *data, int so_locked)
void sctp_abort_an_association(struct sctp_inpcb *inp, struct sctp_tcb *stcb, struct mbuf *op_err, bool timedout, int so_locked)
void sctp_log_map(uint32_t map, uint32_t cum, uint32_t high, int from)
void sctp_log_strm_del(struct sctp_queued_to_read *control, struct sctp_queued_to_read *poschk, int from)
void sctp_print_mapping_array(struct sctp_association *asoc)
void sctp_log_rwnd_set(uint8_t from, uint32_t peers_rwnd, uint32_t flight_size, uint32_t overhead, uint32_t a_rwndval)
void sctp_add_to_readq(struct sctp_inpcb *inp, struct sctp_tcb *stcb, struct sctp_queued_to_read *control, struct sockbuf *sb, int end, int inp_read_lock_held, int so_locked)
void sctp_log_cwnd(struct sctp_tcb *stcb, struct sctp_nets *net, int augment, uint8_t from)
void sctp_log_fr(uint32_t biggest_tsn, uint32_t biggest_new_tsn, uint32_t tsn, int from)
void sctp_log_strm_del_alt(struct sctp_tcb *stcb, uint32_t tsn, uint16_t sseq, uint16_t stream, int from)
void sctp_wakeup_the_read_socket(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int so_locked SCTP_UNUSED)
caddr_t sctp_m_getptr(struct mbuf *m, int off, int len, uint8_t *in_ptr)
int sctp_release_pr_sctp_chunk(struct sctp_tcb *stcb, struct sctp_tmit_chunk *tp1, uint8_t sent, int so_locked)
void sctp_stop_timers_for_shutdown(struct sctp_tcb *stcb)
#define sctp_get_associd(stcb)
#define sctp_free_bufspace(stcb, asoc, tp1, chk_cnt)
#define SCTP_READ_LOCK_NOT_HELD
#define SCTP_READ_LOCK_HELD
uint16_t mapping_array_size
uint32_t total_output_queue_size
unsigned int sent_queue_retran_cnt
unsigned int cnt_msg_on_sb
unsigned int sent_queue_cnt_removeable
uint8_t fragmented_delivery_inprogress
uint32_t highest_tsn_inside_map
struct sctp_nets * alternate
struct sctpchunk_listhead send_queue
struct sctp_stream_out * strmout
unsigned int total_flight_count
uint32_t sat_t3_recovery_tsn
struct sctpnetlisthead nets
struct sctp_readhead pending_reply_queue
uint8_t fast_retran_loss_recovery
struct timeval time_last_rcvd
struct sctp_timer dack_timer
unsigned int cnt_on_all_streams
uint32_t mapping_array_base_tsn
uint8_t cmt_dac_pkts_rcvd
unsigned int total_flight
unsigned int stream_queue_cnt
uint8_t sat_t3_loss_recovery
struct sctp_queued_to_read * control_pdapi
uint8_t saw_sack_with_nr_frags
uint8_t saw_sack_with_frags
uint32_t fast_recovery_tsn
struct sctp_resethead resetHead
struct sctp_ss_functions ss_functions
uint8_t * nr_mapping_array
uint32_t my_rwnd_control_len
unsigned int size_on_all_streams
uint32_t highest_tsn_inside_nr_map
uint32_t this_sack_highest_gap
unsigned int data_pkts_seen
unsigned int cnt_on_reasm_queue
int dup_tsns[SCTP_MAX_DUP_TSNS]
struct sctp_nets * primary_destination
struct sctp_cc_functions cc_functions
unsigned int overall_error_count
struct sctp_nets * last_data_chunk_from
struct sctpchunk_listhead sent_queue
unsigned int size_on_reasm_queue
uint32_t advanced_peer_ack_point
struct sctp_stream_in * strmin
unsigned int sent_queue_cnt
void(* sctp_cwnd_update_tsn_acknowledged)(struct sctp_nets *net, struct sctp_tmit_chunk *)
void(* sctp_cwnd_update_after_sack)(struct sctp_tcb *stcb, struct sctp_association *asoc, int accum_moved, int reneged_all, int will_exit)
void(* sctp_cwnd_update_exit_pf)(struct sctp_tcb *stcb, struct sctp_nets *net)
void(* sctp_cwnd_prepare_net_for_sack)(struct sctp_tcb *stcb, struct sctp_nets *net)
void(* sctp_cwnd_update_after_fr)(struct sctp_tcb *stcb, struct sctp_association *asoc)
struct timeval timetodrop
uint8_t doing_fast_retransmit
uint8_t chunk_was_revoked
struct sctp_error_cause cause
uint16_t serinfo_next_stream
uint16_t serinfo_next_flags
uint32_t serinfo_next_length
uint32_t serinfo_next_aid
uint32_t serinfo_next_ppid
uint32_t new_cumulative_tsn
union sctp_idata::@32 ppid_fsn
uint32_t partial_delivery_point
struct sctp_readhead read_queue
uint8_t new_pseudo_cumack
uint32_t partial_bytes_acked
uint32_t rtx_pseudo_cumack
uint32_t this_sack_highest_newack
uint8_t find_pseudo_cumack
uint8_t find_rtx_pseudo_cumack
uint8_t fast_retran_loss_recovery
struct sctp_timer rxt_timer
uint8_t will_exit_fast_recovery
sctp_assoc_t nxt_assoc_id
struct sctpchunk_listhead reasm
sctp_assoc_t sinfo_assoc_id
struct sctp_nets * whoFrom
sctp_assoc_t rcv_assoc_id
uint32_t cumulative_tsn_ack
sctp_assoc_t sinfo_assoc_id
bool(* sctp_ss_is_user_msgs_incomplete)(struct sctp_tcb *stcb, struct sctp_association *asoc)
uint32_t last_mid_delivered
struct sctp_readhead inqueue
struct sctp_readhead uno_inqueue
uint32_t chunks_on_queues
struct sctp_streamhead outqueue
uint16_t list_of_streams[]
struct socket * sctp_socket
struct sctp_association asoc
struct sctp_inpcb * sctp_ep
union sctp_tmit_chunk::@34 rec
struct sctp_data_chunkrec data
struct timeval sent_rcv_time
struct sctp_association * asoc