Lines Matching defs:sctp

40 #include <netinet/sctp.h>
320 sctp_input_add_ancillary(sctp_t *sctp, mblk_t **mp, sctp_data_hdr_t *dcp,
333 conn_t *connp = sctp->sctp_connp;
356 if (sctp->sctp_recvsndrcvinfo)
363 ira->ira_ruifindex != sctp->sctp_recvifindex) {
371 ipp->ipp_hoplimit != sctp->sctp_recvhops) {
379 ipp->ipp_tclass != sctp->sctp_recvtclass) {
387 ip_cmpbuf(sctp->sctp_hopopts, sctp->sctp_hopoptslen,
391 sctp->sctp_v6label_len;
395 if (!ip_allocbuf((void **)&sctp->sctp_hopopts,
396 &sctp->sctp_hopoptslen,
403 ip_cmpbuf(sctp->sctp_rthdrdstopts, sctp->sctp_rthdrdstoptslen,
410 if (!ip_allocbuf((void **)&sctp->sctp_rthdrdstopts,
411 &sctp->sctp_rthdrdstoptslen,
418 ip_cmpbuf(sctp->sctp_rthdr, sctp->sctp_rthdrlen,
425 if (!ip_allocbuf((void **)&sctp->sctp_rthdr,
426 &sctp->sctp_rthdrlen,
433 ip_cmpbuf(sctp->sctp_dstopts, sctp->sctp_dstoptslen,
440 if (!ip_allocbuf((void **)&sctp->sctp_dstopts,
441 &sctp->sctp_dstoptslen,
472 if (sctp->sctp_recvsndrcvinfo) {
495 sri->sinfo_cumtsn = sctp->sctp_ftsn;
518 pkti->ipi6_addr = sctp->sctp_ip6h->ip6_src;
520 IN6_IPADDR_TO_V4MAPPED(sctp->sctp_ipha->ipha_src,
527 sctp->sctp_recvifindex = ifindex;
541 sctp->sctp_recvhops = ipp->ipp_hoplimit;
555 sctp->sctp_recvtclass = ipp->ipp_tclass;
568 ip_savebuf((void **)&sctp->sctp_hopopts,
569 &sctp->sctp_hopoptslen,
584 ip_savebuf((void **)&sctp->sctp_rthdrdstopts,
585 &sctp->sctp_rthdrdstoptslen,
600 ip_savebuf((void **)&sctp->sctp_rthdr,
601 &sctp->sctp_rthdrlen,
616 ip_savebuf((void **)&sctp->sctp_dstopts,
617 &sctp->sctp_dstoptslen,
667 sctp_uodata_frag(sctp_t *sctp, mblk_t *dmp, sctp_data_hdr_t **dc)
680 if (sctp->sctp_uo_frags == NULL) {
681 sctp->sctp_uo_frags = dmp;
684 hmp = sctp->sctp_uo_frags;
696 sctp->sctp_uo_frags = dmp;
758 if (sctp->sctp_uo_frags == begin) {
760 sctp->sctp_uo_frags = end->b_next;
790 BUMP_LOCAL(sctp->sctp_reassmsgs);
806 sctp_try_partial_delivery(sctp_t *sctp, mblk_t *hmp, sctp_reass_t *srp,
917 BUMP_LOCAL(sctp->sctp_reassmsgs);
932 sctp_data_frag(sctp_t *sctp, mblk_t *dmp, sctp_data_hdr_t **dc, int *error,
987 * stream id, (sip is initialized as sctp->sctp_instr[sid]).
1185 if (ntohl((*dc)->sdh_tsn) <= sctp->sctp_ftsn &&
1186 srp->sr_msglen >= sctp->sctp_pd_point &&
1188 dmp = sctp_try_partial_delivery(sctp, reassq_curr,
1242 BUMP_LOCAL(sctp->sctp_reassmsgs);
1278 * All incoming sctp data, complete messages and fragments are handled by
1283 sctp_data_chunk(sctp_t *sctp, sctp_chunk_hdr_t *ch, mblk_t *mp, mblk_t **dups,
1298 sctp_stack_t *sctps = sctp->sctp_sctps;
1302 #define SCTP_ACK_IT(sctp, tsn) \
1303 if (tsn == sctp->sctp_ftsn) { \
1305 (sctp)->sctp_ftsn++; \
1306 if ((sctp)->sctp_sack_gaps > 0) \
1307 (sctp)->sctp_force_sack = 1; \
1308 } else if (SEQ_GT(tsn, sctp->sctp_ftsn)) { \
1310 BUMP_LOCAL(sctp->sctp_outseqtsns); \
1312 sctp_ack_add(&sctp->sctp_sack_info, tsn, \
1313 &sctp->sctp_sack_gaps); \
1314 sctp->sctp_force_sack = 1; \
1325 if (SEQ_LT(tsn, sctp->sctp_ftsn)) {
1327 BUMP_LOCAL(sctp->sctp_idupchunks);
1328 sctp->sctp_force_sack = 1;
1334 if (sctp->sctp_sack_info != NULL) {
1337 for (sp = sctp->sctp_sack_info; sp; sp = sp->next) {
1342 BUMP_LOCAL(sctp->sctp_idupchunks);
1343 sctp->sctp_force_sack = 1;
1351 if (SCTP_IS_DETACHED(sctp)) {
1364 if ((sctp->sctp_rwnd - sctp->sctp_rxqueued < dlen) &&
1365 (tsn != sctp->sctp_ftsn || sctp->sctp_rwnd == 0)) {
1367 sctp->sctp_force_sack = 1;
1369 "dlen %d ssn %d tsn %x\n", sctp->sctp_rwnd,
1370 sctp->sctp_rxqueued, dlen, ntohs(dc->sdh_ssn),
1378 if (sid >= sctp->sctp_num_istr) {
1387 sctp_add_err(sctp, SCTP_ERR_BAD_SID, (void *)&inval_parm,
1389 SCTP_ACK_IT(sctp, tsn);
1395 ASSERT(sctp->sctp_instr != NULL);
1398 instr = &sctp->sctp_instr[sid];
1400 if (instr->sctp == NULL)
1401 instr->sctp = sctp;
1406 /* The ssn of this sctp message and of any fragments in it */
1421 sctp->sctp_rxqueued += dlen;
1423 oftsn = sctp->sctp_ftsn;
1432 dmp = sctp_uodata_frag(sctp, dmp, &dc);
1436 &sctp->sctp_instr[sid]);
1447 dmp = sctp_data_frag(sctp, dmp, &dc, &error, instr,
1452 sctp->sctp_rxqueued -= dlen;
1466 SCTP_ACK_IT(sctp, tsn);
1467 DTRACE_PROBE4(sctp_data_frag_queued, sctp_t *, sctp,
1524 (sctp->sctp_istr_nmsgs)++;
1525 SCTP_ACK_IT(sctp, tsn);
1526 DTRACE_PROBE4(sctp_pqueue_completemsg, sctp_t *, sctp,
1538 ASSERT(sctp->sctp_rxqueued >= dlen);
1541 sctp->sctp_rxqueued -= dlen;
1546 if (sctp_input_add_ancillary(sctp, &dmp, dc, fp,
1556 if (sctp->sctp_flowctrld) {
1557 sctp->sctp_rwnd -= dlen;
1558 if (sctp->sctp_rwnd < 0)
1559 sctp->sctp_rwnd = 0;
1561 if (sctp->sctp_ulp_recv(sctp->sctp_ulpd, dmp,
1563 sctp->sctp_flowctrld = B_TRUE;
1565 SCTP_ACK_IT(sctp, tsn);
1574 SCTP_ACK_IT(sctp, tsn);
1584 BUMP_LOCAL(sctp->sctp_iudchunks);
1587 BUMP_LOCAL(sctp->sctp_idchunks);
1597 DTRACE_PROBE4(sctp_partial_delivery, sctp_t *, sctp,
1605 sctp_t *, sctp, int, sid, int, tsn,
1607 cmn_err(CE_WARN, "sctp partial"
1608 " delivery error, sctp 0x%p"
1612 (void *)sctp, sid,
1613 tsn, sctp->sctp_ftsn, ssn,
1623 sctp_t *, sctp, int, sid, int, tsn,
1625 cmn_err(CE_WARN, "sctp in-order delivery error, sctp 0x%p "
1627 (void *)sctp, sid, ssn, instr->nextseq);
1632 DTRACE_PROBE4(sctp_deliver_completemsg, sctp_t *, sctp, int, sid,
1650 DTRACE_PROBE4(sctp_deliver_pqueuedmsg, sctp_t *, sctp,
1658 (sctp->sctp_istr_nmsgs)--;
1678 ASSERT(sctp->sctp_rxqueued >= dlen);
1680 sctp->sctp_rxqueued -= dlen;
1683 if (sctp_input_add_ancillary(sctp, &dmp, dc, fp,
1694 if (sctp->sctp_flowctrld) {
1695 sctp->sctp_rwnd -= dlen;
1696 if (sctp->sctp_rwnd < 0)
1697 sctp->sctp_rwnd = 0;
1699 if (sctp->sctp_ulp_recv(sctp->sctp_ulpd, dmp,
1701 sctp->sctp_flowctrld = B_TRUE;
1703 SCTP_ACK_IT(sctp, tsn);
1712 SCTP_ACK_IT(sctp, tsn);
1723 if (sctp->sctp_sack_info != NULL &&
1724 sctp->sctp_ftsn == sctp->sctp_sack_info->begin) {
1725 sctp->sctp_ftsn = sctp->sctp_sack_info->end + 1;
1731 if (oftsn != sctp->sctp_ftsn && sctp->sctp_sack_info != NULL) {
1732 sctp_ack_rem(&sctp->sctp_sack_info, sctp->sctp_ftsn - 1,
1733 &sctp->sctp_sack_gaps);
1735 sctp->sctp_ftsn - 1, sctp->sctp_sack_gaps));
1739 if (sctp->sctp_sack_info != NULL) {
1740 ASSERT(sctp->sctp_ftsn != sctp->sctp_sack_info->begin);
1748 sctp_fill_sack(sctp_t *sctp, unsigned char *dst, int sacklen)
1753 uint16_t num_gaps = sctp->sctp_sack_gaps;
1763 sctp->sctp_lastacked = sctp->sctp_ftsn - 1;
1766 sc->ssc_cumtsn = htonl(sctp->sctp_lastacked);
1767 if (sctp->sctp_rxqueued < sctp->sctp_rwnd) {
1768 sc->ssc_a_rwnd = htonl(sctp->sctp_rwnd - sctp->sctp_rxqueued);
1773 sctp->sctp_arwnd = sc->ssc_a_rwnd;
1779 for (sp = sctp->sctp_sack_info; sp; sp = sp->next) {
1783 if (sp->begin > sctp->sctp_lastacked) {
1784 offset = (uint16_t)(sp->begin - sctp->sctp_lastacked);
1787 offset = (uint16_t)(UINT32_MAX - sctp->sctp_lastacked +
1809 if (sctp->sctp_ack_timer_running) {
1810 sctp_timer_stop(sctp->sctp_ack_mp);
1811 sctp->sctp_ack_timer_running = B_FALSE;
1814 BUMP_LOCAL(sctp->sctp_obchunks);
1815 BUMP_LOCAL(sctp->sctp_osacks);
1819 sctp_make_sack(sctp_t *sctp, sctp_faddr_t *sendto, mblk_t *dups)
1826 sctp_stack_t *sctps = sctp->sctp_sctps;
1832 if (sctp->sctp_force_sack) {
1833 sctp->sctp_force_sack = 0;
1838 if (sctp->sctp_state == SCTPS_ESTABLISHED) {
1839 if (sctp->sctp_sack_toggle < acks_max) {
1842 (void *)sctp));
1844 } else if (sctp->sctp_sack_toggle >= acks_max) {
1845 sctp->sctp_sack_toggle = 0;
1849 if (sctp->sctp_ftsn == sctp->sctp_lastacked + 1) {
1851 (void *)sctp));
1856 dprint(2, ("sctp_make_sack: acking %x\n", sctp->sctp_ftsn - 1));
1863 (sizeof (sctp_sack_frag_t) * sctp->sctp_sack_gaps);
1870 if (sctp->sctp_err_chunks != NULL) {
1871 fp = SCTP_CHUNK_DEST(sctp->sctp_err_chunks);
1872 if (sctp->sctp_err_len + slen + dups_len > fp->sf_pmss) {
1873 if ((smp = sctp_make_mp(sctp, fp, 0)) == NULL) {
1876 freemsg(sctp->sctp_err_chunks);
1877 sctp->sctp_err_chunks = NULL;
1878 sctp->sctp_err_len = 0;
1881 smp->b_cont = sctp->sctp_err_chunks;
1882 sctp_set_iplen(sctp, smp, fp->sf_ixa);
1884 BUMP_LOCAL(sctp->sctp_opkts);
1885 sctp->sctp_err_chunks = NULL;
1886 sctp->sctp_err_len = 0;
1889 smp = sctp_make_mp(sctp, sendto, slen);
1896 sctp_fill_sack(sctp, smp->b_wptr, slen);
1905 if (sctp->sctp_err_chunks != NULL) {
1906 linkb(smp, sctp->sctp_err_chunks);
1907 sctp->sctp_err_chunks = NULL;
1908 sctp->sctp_err_len = 0;
1918 sctp_sack(sctp_t *sctp, mblk_t *dups)
1921 sctp_stack_t *sctps = sctp->sctp_sctps;
1924 if (sctp->sctp_state == SCTPS_SHUTDOWN_SENT) {
1925 sctp_send_shutdown(sctp, 0);
1928 ASSERT(sctp->sctp_lastdata != NULL);
1930 if ((smp = sctp_make_sack(sctp, sctp->sctp_lastdata, dups)) == NULL) {
1937 (void *)sctp->sctp_lastdata,
1938 SCTP_PRINTADDR(sctp->sctp_lastdata->sf_faddr)));
1940 sctp->sctp_active = LBOLT_FASTPATH64;
1944 sctp_set_iplen(sctp, smp, sctp->sctp_lastdata->sf_ixa);
1945 (void) conn_ip_output(smp, sctp->sctp_lastdata->sf_ixa);
1946 BUMP_LOCAL(sctp->sctp_opkts);
1960 sctp_check_abandoned_msg(sctp_t *sctp, mblk_t *meta)
1967 uint32_t adv_pap = sctp->sctp_adv_pap;
1968 sctp_faddr_t *fp = sctp->sctp_current;
1969 sctp_stack_t *sctps = sctp->sctp_sctps;
1972 if (SEQ_GEQ(sctp->sctp_lastack_rxd, ntohl(dh->sdh_tsn))) {
1981 sctp->sctp_adv_pap = ntohl(dh->sdh_tsn);
1984 sctp->sctp_adv_pap = adv_pap;
1987 nmp = sctp_make_ftsn_chunk(sctp, fp, sets, nsets, seglen);
1990 sctp->sctp_adv_pap = adv_pap;
1993 head = sctp_add_proto_hdr(sctp, fp, nmp, 0, NULL);
1995 sctp->sctp_adv_pap = adv_pap;
2001 sctp_set_iplen(sctp, head, fp->sf_ixa);
2003 BUMP_LOCAL(sctp->sctp_opkts);
2005 SCTP_FADDR_TIMER_RESTART(sctp, fp, fp->sf_rto);
2015 ASSERT(sctp->sctp_unsent >= unsent);
2016 sctp->sctp_unsent -= unsent;
2021 if (!SCTP_IS_DETACHED(sctp))
2022 SCTP_TXQ_UPDATE(sctp);
2029 sctp_cumack(sctp_t *sctp, uint32_t tsn, mblk_t **first_unacked)
2038 sctp_stack_t *sctps = sctp->sctp_sctps;
2040 ump = sctp->sctp_xmit_head;
2060 if (sctp->sctp_prsctp_aware &&
2064 sctp))) {
2065 (void) sctp_check_abandoned_msg(sctp,
2072 if (SEQ_GEQ(sctp->sctp_lastack_rxd, xtsn))
2078 if (sctp->sctp_out_time != 0 &&
2079 xtsn == sctp->sctp_rtt_tsn) {
2081 sctp_update_rtt(sctp, fp,
2083 sctp->sctp_out_time);
2084 sctp->sctp_out_time = 0;
2094 ASSERT(sctp->sctp_unacked >=
2096 sctp->sctp_unacked -=
2103 SCTP_FADDR_TIMER_RESTART(sctp, fp,
2113 if (ump == sctp->sctp_xmit_tail)
2114 sctp->sctp_xmit_tail = nump;
2116 BUMP_LOCAL(sctp->sctp_prsctpdrop);
2118 sctp_sendfail_event(sctp, ump, 0, B_TRUE);
2122 sctp->sctp_xmit_head = ump = nump;
2128 if (SEQ_GT(sctp->sctp_lastack_rxd, sctp->sctp_recovery_tsn)) {
2129 sctp->sctp_recovery_tsn = sctp->sctp_lastack_rxd;
2136 if (!SCTP_IS_DETACHED(sctp))
2137 SCTP_TXQ_UPDATE(sctp);
2140 if (sctp->sctp_state == SCTPS_SHUTDOWN_PENDING) {
2141 sctp_send_shutdown(sctp, 0);
2143 sctp->sctp_xmit_unacked = mp;
2148 sctp->sctp_lastack_rxd = tsn;
2149 if (SEQ_LT(sctp->sctp_adv_pap, sctp->sctp_lastack_rxd))
2150 sctp->sctp_adv_pap = sctp->sctp_lastack_rxd;
2151 ASSERT(sctp->sctp_xmit_head || sctp->sctp_unacked == 0);
2157 sctp_set_frwnd(sctp_t *sctp, uint32_t frwnd)
2161 if (sctp->sctp_unacked > frwnd) {
2162 sctp->sctp_frwnd = 0;
2165 orwnd = sctp->sctp_frwnd;
2166 sctp->sctp_frwnd = frwnd - sctp->sctp_unacked;
2167 if (orwnd < sctp->sctp_frwnd) {
2176 * Walk the sctp->sctp_uo_frag list and remove any fragments with TSN
2181 sctp_ftsn_check_uo_frag(sctp_t *sctp, uint32_t ftsn)
2188 hmp = sctp->sctp_uo_frags;
2194 sctp->sctp_uo_frags = hmp_next;
2213 sctp_ftsn_check_frag(sctp_t *sctp, uint16_t ssn, sctp_instr_t *sip)
2237 cmn_err(CE_WARN, "sctp partial"
2238 " delivery notify, sctp 0x%p"
2241 (void *)sctp, (void *)sip,
2244 sctp_partial_delivery_event(sctp);
2282 sctp_process_forward_tsn(sctp_t *sctp, sctp_chunk_hdr_t *ch, sctp_faddr_t *fp,
2295 sctp_stack_t *sctps = sctp->sctp_sctps;
2300 if (SCTP_IS_DETACHED(sctp)) {
2309 flen = sctp_ftsn_check_uo_frag(sctp, *ftsn);
2311 ASSERT(sctp->sctp_rxqueued >= flen);
2312 sctp->sctp_rxqueued -= flen;
2318 if (ftsn_entry->ftsn_sid >= sctp->sctp_num_istr) {
2326 sctp_add_err(sctp, SCTP_ERR_BAD_SID,
2332 instr = &sctp->sctp_instr[ftsn_entry->ftsn_sid];
2333 flen = sctp_ftsn_check_frag(sctp, ftsn_entry->ftsn_ssn, instr);
2336 ASSERT(sctp->sctp_rxqueued >= flen);
2337 sctp->sctp_rxqueued -= flen;
2366 if (sctp_input_add_ancillary(sctp,
2368 sctp->sctp_rxqueued -= dlen;
2375 if (sctp->sctp_flowctrld) {
2376 sctp->sctp_rwnd -= dlen;
2377 if (sctp->sctp_rwnd < 0)
2378 sctp->sctp_rwnd = 0;
2380 if (sctp->sctp_ulp_recv(
2381 sctp->sctp_ulpd, dmp, msgdsize(dmp),
2383 sctp->sctp_flowctrld = B_TRUE;
2398 sctp->sctp_rxqueued -= dlen;
2405 sctp->sctp_istr_nmsgs--;
2414 if (*ftsn <= (sctp->sctp_ftsn - 1)) {
2415 sctp->sctp_force_sack = 1;
2419 sctp->sctp_ftsn = *ftsn + 1;
2422 if (sctp->sctp_sack_info != NULL) {
2423 sctp_ack_rem(&sctp->sctp_sack_info, sctp->sctp_ftsn - 1,
2424 &sctp->sctp_sack_gaps);
2432 if (sctp->sctp_sack_info != NULL &&
2433 sctp->sctp_ftsn == sctp->sctp_sack_info->begin) {
2434 sctp->sctp_ftsn = sctp->sctp_sack_info->end + 1;
2435 sctp_ack_rem(&sctp->sctp_sack_info, sctp->sctp_ftsn - 1,
2436 &sctp->sctp_sack_gaps);
2447 sctp_check_abandoned_data(sctp_t *sctp, sctp_faddr_t *fp)
2449 mblk_t *meta = sctp->sctp_xmit_head;
2453 uint32_t adv_pap = sctp->sctp_adv_pap;
2469 sctp_check_adv_ack_pt(sctp, meta, mp);
2470 if (SEQ_GT(sctp->sctp_adv_pap, adv_pap)) {
2471 sctp_make_ftsns(sctp, meta, mp, &nmp, fp, &seglen);
2473 sctp->sctp_adv_pap = adv_pap;
2475 SCTP_FADDR_TIMER_RESTART(sctp, fp, fp->sf_rto);
2478 sctp_set_iplen(sctp, nmp, fp->sf_ixa);
2480 BUMP_LOCAL(sctp->sctp_opkts);
2482 SCTP_FADDR_TIMER_RESTART(sctp, fp, fp->sf_rto);
2495 sctp_process_uo_gaps(sctp_t *sctp, uint32_t ctsn, sctp_sack_frag_t *ssf,
2510 sctp_stack_t *sctps = sctp->sctp_sctps;
2545 if (SEQ_GT(gapstart, sctp->sctp_ltsn - 1) ||
2546 SEQ_GT(gapend, sctp->sctp_ltsn - 1)) {
2611 sctp->sctp_unacked -= chunklen - sizeof (*sdc);
2612 ASSERT(sctp->sctp_unacked >= 0);
2669 SCTP_CHUNK_REXMIT(sctp, mp);
2670 sctp->sctp_chk_fast_rexmit = B_TRUE;
2684 sctp->sctp_recovery_tsn =
2685 sctp->sctp_ltsn - 1;
2706 sctp_got_sack(sctp_t *sctp, sctp_chunk_hdr_t *sch)
2727 sctp_stack_t *sctps = sctp->sctp_sctps;
2729 BUMP_LOCAL(sctp->sctp_ibchunks);
2730 BUMP_LOCAL(sctp->sctp_isacks);
2738 dprint(2, ("got sack cumtsn %x -> %x\n", sctp->sctp_lastack_rxd,
2742 if (SEQ_LT(cumtsn, sctp->sctp_lastack_rxd))
2745 if (SEQ_GT(cumtsn, sctp->sctp_ltsn - 1)) {
2754 if (SEQ_LT(sctp->sctp_lastack_rxd, sctp->sctp_recovery_tsn))
2760 if (SEQ_LT(sctp->sctp_lastack_rxd, sctp->sctp_adv_pap))
2763 if (cumtsn == sctp->sctp_lastack_rxd &&
2764 (sctp->sctp_xmit_unacked == NULL ||
2765 !SCTP_CHUNK_ABANDONED(sctp->sctp_xmit_unacked))) {
2766 if (sctp->sctp_xmit_unacked != NULL)
2767 mp = sctp->sctp_xmit_unacked;
2768 else if (sctp->sctp_xmit_head != NULL)
2769 mp = sctp->sctp_xmit_head->b_cont;
2778 if (mp != NULL && sctp->sctp_zero_win_probe &&
2779 ntohl(sc->ssc_a_rwnd) >= sctp->sctp_current->sf_pmss) {
2783 mblk_t *meta = sctp->sctp_xmit_head;
2789 fp = sctp->sctp_current;
2791 SCTP_MAX_RTO(sctp, fp);
2793 pkt = sctp_rexmit_packet(sctp, &meta, &mp1, fp,
2800 sctp->sctp_zero_win_probe = B_FALSE;
2801 sctp->sctp_rxt_nxttsn = sctp->sctp_ltsn;
2802 sctp->sctp_rxt_maxtsn = sctp->sctp_ltsn;
2803 sctp_set_iplen(sctp, pkt, fp->sf_ixa);
2805 BUMP_LOCAL(sctp->sctp_opkts);
2808 if (sctp->sctp_zero_win_probe) {
2813 fp = sctp->sctp_current;
2815 SCTP_MAX_RTO(sctp, fp);
2816 sctp->sctp_zero_win_probe = B_FALSE;
2818 if (!sctp->sctp_rexmitting) {
2819 sctp->sctp_rxt_nxttsn = sctp->sctp_ltsn;
2820 sctp->sctp_rxt_maxtsn = sctp->sctp_ltsn;
2823 acked = sctp_cumack(sctp, cumtsn, &mp);
2824 sctp->sctp_xmit_unacked = mp;
2828 if (fwd_tsn && SEQ_GEQ(sctp->sctp_lastack_rxd,
2829 sctp->sctp_adv_pap)) {
2835 UPDATE_LOCAL(sctp->sctp_gapcnt, num_gaps);
2849 mblk_t *mp2 = sctp->sctp_xmit_head->b_cont;
2859 ump = sctp->sctp_xmit_head;
2879 acked += sctp_process_uo_gaps(sctp,
2881 sctp->sctp_xmit_head, mp1,
2899 if (SEQ_GT(gapstart, sctp->sctp_ltsn - 1) ||
2900 SEQ_GT(gapend, sctp->sctp_ltsn - 1)) {
2926 SCTP_CHUNK_REXMIT(sctp, mp);
2927 sctp->sctp_chk_fast_rexmit = B_TRUE;
2941 sctp->sctp_recovery_tsn =
2942 sctp->sctp_ltsn - 1;
2956 sctp->sctp_unacked += chunklen - sizeof (*sdc);
2957 SCTP_CHUNK_CLEAR_ACKED(sctp, mp);
2959 SCTP_FADDR_TIMER_RESTART(sctp, fp,
2977 (void *)sctp);
3013 sctp->sctp_unacked -= chunklen - sizeof (*sdc);
3014 ASSERT(sctp->sctp_unacked >= 0);
3044 (void *)sctp);
3046 ump = sctp->sctp_xmit_head;
3066 ump = sctp->sctp_xmit_head;
3076 if (sctp->sctp_prsctp_aware)
3077 sctp_check_abandoned_data(sctp, sctp->sctp_current);
3078 if (sctp->sctp_chk_fast_rexmit)
3079 sctp_fast_rexmit(sctp);
3081 trysend += sctp_set_frwnd(sctp, ntohl(sc->ssc_a_rwnd));
3087 if (sctp->sctp_frwnd == 0 && sctp->sctp_unacked == 0 &&
3088 sctp->sctp_unsent != 0) {
3089 SCTP_FADDR_TIMER_RESTART(sctp, sctp->sctp_current,
3090 sctp->sctp_current->sf_rto);
3100 if (sctp->sctp_current->sf_acked == acked) {
3104 fp = sctp->sctp_current;
3117 sctp->sctp_cwnd_max);
3127 sctp->sctp_cwnd_max);
3142 for (fp = sctp->sctp_faddrs; fp != NULL; fp = fp->sf_next) {
3152 sctp->sctp_cwnd_max);
3159 sctp->sctp_cwnd_max);
3170 fp = sctp->sctp_current;
3177 if (sctp->sctp_rexmitting) {
3178 if (SEQ_LT(sctp->sctp_lastack_rxd, sctp->sctp_rxt_maxtsn)) {
3190 sctp_ss_rexmit(sctp);
3193 sctp->sctp_rexmitting = B_FALSE;
3194 sctp->sctp_rxt_nxttsn = sctp->sctp_ltsn;
3195 sctp->sctp_rxt_maxtsn = sctp->sctp_ltsn;
3207 sctp_strange_chunk(sctp_t *sctp, sctp_chunk_hdr_t *ch, sctp_faddr_t *fp)
3211 BUMP_LOCAL(sctp->sctp_ibchunks);
3215 sctp_add_err(sctp, SCTP_ERR_UNREC_CHUNK, ch, len, fp);
3243 sctp_check_input(sctp_t *sctp, sctp_chunk_hdr_t *ch, ssize_t len, int first)
3397 sctp_t *sctp;
3465 sctp = sctp_addrlist2sctp(mp, sctph, ch, zoneid, sctps);
3466 if (sctp != NULL) {
3468 mutex_enter(&sctp->sctp_lock);
3469 if (sctp->sctp_running) {
3470 sctp_add_recvq(sctp, mp, B_FALSE, ira);
3471 mutex_exit(&sctp->sctp_lock);
3479 sctp->sctp_running = B_TRUE;
3480 mutex_exit(&sctp->sctp_lock);
3481 sctp_input_data(sctp, mp, ira);
3482 WAKE_SCTP(sctp);
3484 SCTP_REFRELE(sctp);
3510 * Handle sctp packets.
3517 sctp_t *sctp = CONN2SCTP(connp);
3541 SCTP_REFRELE(sctp);
3548 mutex_enter(&sctp->sctp_lock);
3549 if (sctp->sctp_running) {
3550 sctp_add_recvq(sctp, mp, B_FALSE, ira);
3551 mutex_exit(&sctp->sctp_lock);
3554 sctp->sctp_running = B_TRUE;
3555 mutex_exit(&sctp->sctp_lock);
3557 mutex_enter(&sctp->sctp_recvq_lock);
3558 if (sctp->sctp_recvq != NULL) {
3559 sctp_add_recvq(sctp, mp, B_TRUE, ira);
3560 mutex_exit(&sctp->sctp_recvq_lock);
3561 WAKE_SCTP(sctp);
3565 mutex_exit(&sctp->sctp_recvq_lock);
3567 sctp_icmp_error(sctp, mp);
3569 sctp_input_data(sctp, mp, ira);
3570 WAKE_SCTP(sctp);
3573 SCTP_REFRELE(sctp);
3579 sctp_process_abort(sctp_t *sctp, sctp_chunk_hdr_t *ch, int err)
3581 sctp_stack_t *sctps = sctp->sctp_sctps;
3584 BUMP_LOCAL(sctp->sctp_ibchunks);
3590 if (sctp->sctp_state >= SCTPS_ESTABLISHED) {
3591 sctp_assoc_event(sctp, SCTP_COMM_LOST,
3595 sctp_clean_death(sctp, err);
3599 sctp_input_data(sctp_t *sctp, mblk_t *mp, ip_recv_attr_t *ira)
3620 sctp_stack_t *sctps = sctp->sctp_sctps;
3626 conn_t *connp = sctp->sctp_connp;
3645 BUMP_LOCAL(sctp->sctp_ipkts);
3702 if (!sctp_check_input(sctp, ch, mlen, 1)) {
3722 if (sctph->sh_verf == sctp->sctp_lvtag)
3724 if (sctph->sh_verf == sctp->sctp_fvtag &&
3735 if (sctp->sctp_state > SCTPS_BOUND &&
3736 sctp->sctp_state < SCTPS_ESTABLISHED) {
3749 if (sctph->sh_verf != sctp->sctp_lvtag &&
3750 sctp->sctp_state != SCTPS_LISTEN) {
3757 /* Have a valid sctp for this packet */
3758 fp = sctp_lookup_faddr(sctp, &src);
3759 dprint(2, ("sctp_dispatch_rput: mp=%p fp=%p sctp=%p\n", (void *)mp,
3760 (void *)fp, (void *)sctp));
3769 sctp->sctp_state, (int)(ch->sch_id)));
3772 if (sctph->sh_verf != sctp->sctp_lvtag &&
3773 sctph->sh_verf != sctp->sctp_fvtag) {
3779 switch (sctp->sctp_state) {
3790 sctp_send_abort(sctp, sctp->sctp_fvtag,
3793 sctp_assoc_event(sctp, SCTP_COMM_LOST,
3795 sctp_clean_death(sctp, ECONNABORTED);
3800 sctp->sctp_lastdata = fp;
3801 sctp_data_chunk(sctp, ch, mp, &dups, fp,
3805 if (sctp->sctp_state == SCTPS_SHUTDOWN_SENT) {
3815 sctp->sctp_out_time) >
3817 sctp_send_abort(sctp,
3818 sctp->sctp_fvtag, 0, NULL,
3820 sctp_assoc_event(sctp,
3822 sctp_clean_death(sctp,
3826 SCTP_FADDR_TIMER_RESTART(sctp, fp,
3836 sctp_faddr_alive(sctp, fp);
3837 trysend = sctp_got_sack(sctp, ch);
3839 sctp_send_abort(sctp, sctph->sh_verf,
3841 sctp_assoc_event(sctp,
3843 sctp_clean_death(sctp,
3856 sctp_return_heartbeat(sctp, ch, mp);
3861 sctp_process_heartbeat(sctp, ch);
3864 sctp_shutdown_event(sctp);
3865 trysend = sctp_shutdown_received(sctp, ch,
3867 BUMP_LOCAL(sctp->sctp_ibchunks);
3870 BUMP_LOCAL(sctp->sctp_ibchunks);
3871 if (sctp->sctp_state == SCTPS_SHUTDOWN_SENT) {
3872 sctp_shutdown_complete(sctp);
3874 sctp_assoc_event(sctp,
3876 sctp_clean_death(sctp, 0);
3884 sp = sctp_saddr_lookup(sctp, &dst, 0);
3887 BUMP_LOCAL(sctp->sctp_ibchunks);
3891 sctp_process_abort(sctp, ch, ECONNRESET);
3895 sctp_send_initack(sctp, sctph, ch, mp, ira);
3898 if (sctp_process_cookie(sctp, ch, mp, &iack,
3900 sctp_send_cookie_ack(sctp);
3901 sctp_assoc_event(sctp, SCTP_RESTART,
3904 sctp->sctp_recv_adaptation = 1;
3905 sctp_adaptation_event(sctp);
3915 BUMP_LOCAL(sctp->sctp_ibchunks);
3916 error = sctp_handle_error(sctp, sctph, ch, mp,
3919 sctp_assoc_event(sctp, SCTP_COMM_LOST,
3921 sctp_clean_death(sctp, error);
3928 sctp_input_asconf(sctp, ch, fp);
3929 BUMP_LOCAL(sctp->sctp_ibchunks);
3933 sctp_faddr_alive(sctp, fp);
3934 sctp_input_asconf_ack(sctp, ch, fp);
3935 BUMP_LOCAL(sctp->sctp_ibchunks);
3939 sctp->sctp_lastdata = fp;
3940 sctp_process_forward_tsn(sctp, ch, fp,
3943 BUMP_LOCAL(sctp->sctp_ibchunks);
3946 if (sctp_strange_chunk(sctp, ch, fp) == 0) {
3956 sctp_send_initack(sctp, sctph, ch, mp, ira);
3961 if (sctp_process_cookie(sctp, ch, mp, &iack,
3977 eager = sctp_conn_request(sctp, mp, ifindex,
3980 sctp_send_abort(sctp, sctph->sh_verf,
4020 sctp->sctp_rx_adaptation_code;
4032 sctp = eager;
4033 fp = sctp_lookup_faddr(sctp, &peer_src);
4040 fp = sctp_lookup_faddr(sctp, &src);
4042 sctp_faddr_alive(sctp, fp);
4048 sctp_validate_peer(sctp);
4056 BUMP_LOCAL(sctp->sctp_ibchunks);
4059 BUMP_LOCAL(sctp->sctp_ibchunks);
4060 sctp_send_abort(sctp, sctph->sh_verf, 0, NULL,
4069 sctp_stop_faddr_timers(sctp);
4070 sctp_faddr_alive(sctp, sctp->sctp_current);
4071 sctp_send_cookie_echo(sctp, ch, mp, ira);
4072 BUMP_LOCAL(sctp->sctp_ibchunks);
4075 sctp_process_abort(sctp, ch, ECONNREFUSED);
4078 sctp_send_initack(sctp, sctph, ch, mp, ira);
4084 if (sctp_process_cookie(sctp, ch, mp, &iack,
4090 sctp_send_cookie_ack(sctp);
4091 sctp_stop_faddr_timers(sctp);
4092 if (!SCTP_IS_DETACHED(sctp)) {
4093 sctp->sctp_ulp_connected(
4094 sctp->sctp_ulpd, 0, cr, cpid);
4095 sctp_set_ulp_prop(sctp);
4098 SCTP_ASSOC_EST(sctps, sctp);
4100 if (sctp->sctp_cookie_mp) {
4101 freemsg(sctp->sctp_cookie_mp);
4102 sctp->sctp_cookie_mp = NULL;
4106 sctp->sctp_active = now;
4107 sctp_validate_peer(sctp);
4109 sctp_assoc_event(sctp, SCTP_COMM_UP, 0, NULL);
4111 sctp->sctp_recv_adaptation = 1;
4112 sctp_adaptation_event(sctp);
4118 if (sctp_strange_chunk(sctp, ch, fp) == 0) {
4131 if (!SCTP_IS_DETACHED(sctp)) {
4132 sctp->sctp_ulp_connected(
4133 sctp->sctp_ulpd, 0, cr, cpid);
4134 sctp_set_ulp_prop(sctp);
4136 if (sctp->sctp_unacked == 0)
4137 sctp_stop_faddr_timers(sctp);
4138 SCTP_ASSOC_EST(sctps, sctp);
4140 BUMP_LOCAL(sctp->sctp_ibchunks);
4141 if (sctp->sctp_cookie_mp) {
4142 freemsg(sctp->sctp_cookie_mp);
4143 sctp->sctp_cookie_mp = NULL;
4145 sctp_faddr_alive(sctp, fp);
4147 sctp->sctp_active = now;
4148 sctp_validate_peer(sctp);
4152 sctp_assoc_event(sctp, SCTP_COMM_UP, 0, NULL);
4153 sctp_adaptation_event(sctp);
4156 sctp_process_abort(sctp, ch, ECONNREFUSED);
4162 if (sctp_process_cookie(sctp, ch, mp, &iack,
4168 sctp_send_cookie_ack(sctp);
4170 if (!SCTP_IS_DETACHED(sctp)) {
4171 sctp->sctp_ulp_connected(
4172 sctp->sctp_ulpd, 0, cr, cpid);
4173 sctp_set_ulp_prop(sctp);
4176 if (sctp->sctp_unacked == 0)
4177 sctp_stop_faddr_timers(sctp);
4178 SCTP_ASSOC_EST(sctps, sctp);
4180 if (sctp->sctp_cookie_mp) {
4181 freemsg(sctp->sctp_cookie_mp);
4182 sctp->sctp_cookie_mp = NULL;
4185 sctp->sctp_active = now;
4186 sctp_validate_peer(sctp);
4188 sctp_assoc_event(sctp, SCTP_COMM_UP, 0, NULL);
4190 sctp->sctp_recv_adaptation = 1;
4191 sctp_adaptation_event(sctp);
4197 sctp_send_initack(sctp, sctph, ch, mp, ira);
4202 BUMP_LOCAL(sctp->sctp_ibchunks);
4213 sctp_error_event(sctp,
4215 sctp_assoc_event(sctp,
4217 sctp_clean_death(sctp,
4226 sctp_return_heartbeat(sctp, ch, mp);
4231 if (sctp_strange_chunk(sctp, ch, fp) == 0) {
4241 sctp_update_dce(sctp);
4242 sctp_process_abort(sctp, ch, 0);
4245 BUMP_LOCAL(sctp->sctp_ibchunks);
4247 sctp_assoc_event(sctp, SCTP_SHUTDOWN_COMP, 0,
4251 sctp_update_dce(sctp);
4252 sctp_clean_death(sctp, 0);
4255 sctp_shutdown_complete(sctp);
4256 BUMP_LOCAL(sctp->sctp_ibchunks);
4258 sctp_assoc_event(sctp, SCTP_SHUTDOWN_COMP, 0,
4260 sctp_clean_death(sctp, 0);
4263 (void) sctp_shutdown_received(sctp, NULL,
4265 BUMP_LOCAL(sctp->sctp_ibchunks);
4269 sctp_return_heartbeat(sctp, ch, mp);
4274 if (sctp_strange_chunk(sctp, ch, fp) == 0) {
4284 trysend = sctp_shutdown_received(sctp, ch,
4295 if (shutdown_ack_needed && (sctp->sctp_state ==
4300 trysend = sctp_got_sack(sctp, ch);
4302 sctp_send_abort(sctp, sctph->sh_verf,
4304 sctp_assoc_event(sctp,
4306 sctp_clean_death(sctp,
4321 if ((sctp->sctp_xmit_head == NULL) &&
4322 (sctp->sctp_xmit_unsent == NULL))
4326 sctp_process_abort(sctp, ch, ECONNRESET);
4330 sctp_return_heartbeat(sctp, ch, mp);
4335 if (sctp_strange_chunk(sctp, ch, fp) == 0) {
4349 } /* switch (sctp->sctp_state) */
4352 if (ch != NULL && !sctp_check_input(sctp, ch, mlen, 0))
4361 sctp_send_shutdown_ack(sctp, fp, B_FALSE);
4367 (sctp->sctp_sack_toggle)++;
4368 sack_sent = sctp_sack(sctp, dups);
4372 if (!sack_sent && !sctp->sctp_ack_timer_running) {
4373 sctp->sctp_ack_timer_running = B_TRUE;
4374 sctp_timer(sctp, sctp->sctp_ack_mp,
4380 sctp_output(sctp, UINT_MAX);
4381 if (sctp->sctp_cxmit_list != NULL)
4382 sctp_wput_asconf(sctp, NULL);
4388 if (sctp->sctp_unsent > 0 && !sctp->sctp_current->sf_timer_running &&
4389 sctp->sctp_current->sf_timer_mp != NULL) {
4390 SCTP_FADDR_TIMER_RESTART(sctp, sctp->sctp_current,
4391 sctp->sctp_current->sf_rto);
4399 if (sctp->sctp_err_chunks != NULL)
4400 sctp_process_err(sctp);
4404 * sctp points to newly created control block, need to
4407 WAKE_SCTP(sctp);
4418 sctp_recvd(sctp_t *sctp, int len)
4420 sctp_stack_t *sctps = sctp->sctp_sctps;
4421 conn_t *connp = sctp->sctp_connp;
4424 ASSERT(sctp != NULL);
4425 RUN_SCTP(sctp);
4427 sctp->sctp_flowctrld = B_FALSE;
4429 sctp->sctp_ulp_rxqueued = connp->conn_rcvbuf - len;
4431 if (connp->conn_rcvbuf - sctp->sctp_arwnd >= sctp->sctp_mss)
4433 sctp->sctp_rwnd = connp->conn_rcvbuf;
4435 if (sctp->sctp_state >= SCTPS_ESTABLISHED && send_sack) {
4436 sctp->sctp_force_sack = 1;
4438 (void) sctp_sack(sctp, NULL);
4440 WAKE_SCTP(sctp);