Lines Matching refs:sctp
321 sctp_input_add_ancillary(sctp_t *sctp, mblk_t **mp, sctp_data_hdr_t *dcp, in sctp_input_add_ancillary() argument
334 conn_t *connp = sctp->sctp_connp; in sctp_input_add_ancillary()
357 if (sctp->sctp_recvsndrcvinfo) in sctp_input_add_ancillary()
364 ira->ira_ruifindex != sctp->sctp_recvifindex) { in sctp_input_add_ancillary()
372 ipp->ipp_hoplimit != sctp->sctp_recvhops) { in sctp_input_add_ancillary()
380 ipp->ipp_tclass != sctp->sctp_recvtclass) { in sctp_input_add_ancillary()
388 ip_cmpbuf(sctp->sctp_hopopts, sctp->sctp_hopoptslen, in sctp_input_add_ancillary()
392 sctp->sctp_v6label_len; in sctp_input_add_ancillary()
396 if (!ip_allocbuf((void **)&sctp->sctp_hopopts, in sctp_input_add_ancillary()
397 &sctp->sctp_hopoptslen, in sctp_input_add_ancillary()
404 ip_cmpbuf(sctp->sctp_rthdrdstopts, sctp->sctp_rthdrdstoptslen, in sctp_input_add_ancillary()
411 if (!ip_allocbuf((void **)&sctp->sctp_rthdrdstopts, in sctp_input_add_ancillary()
412 &sctp->sctp_rthdrdstoptslen, in sctp_input_add_ancillary()
419 ip_cmpbuf(sctp->sctp_rthdr, sctp->sctp_rthdrlen, in sctp_input_add_ancillary()
426 if (!ip_allocbuf((void **)&sctp->sctp_rthdr, in sctp_input_add_ancillary()
427 &sctp->sctp_rthdrlen, in sctp_input_add_ancillary()
434 ip_cmpbuf(sctp->sctp_dstopts, sctp->sctp_dstoptslen, in sctp_input_add_ancillary()
441 if (!ip_allocbuf((void **)&sctp->sctp_dstopts, in sctp_input_add_ancillary()
442 &sctp->sctp_dstoptslen, in sctp_input_add_ancillary()
473 if (sctp->sctp_recvsndrcvinfo) { in sctp_input_add_ancillary()
496 sri->sinfo_cumtsn = sctp->sctp_ftsn; in sctp_input_add_ancillary()
519 pkti->ipi6_addr = sctp->sctp_ip6h->ip6_src; in sctp_input_add_ancillary()
521 IN6_IPADDR_TO_V4MAPPED(sctp->sctp_ipha->ipha_src, in sctp_input_add_ancillary()
528 sctp->sctp_recvifindex = ifindex; in sctp_input_add_ancillary()
542 sctp->sctp_recvhops = ipp->ipp_hoplimit; in sctp_input_add_ancillary()
556 sctp->sctp_recvtclass = ipp->ipp_tclass; in sctp_input_add_ancillary()
569 ip_savebuf((void **)&sctp->sctp_hopopts, in sctp_input_add_ancillary()
570 &sctp->sctp_hopoptslen, in sctp_input_add_ancillary()
585 ip_savebuf((void **)&sctp->sctp_rthdrdstopts, in sctp_input_add_ancillary()
586 &sctp->sctp_rthdrdstoptslen, in sctp_input_add_ancillary()
601 ip_savebuf((void **)&sctp->sctp_rthdr, in sctp_input_add_ancillary()
602 &sctp->sctp_rthdrlen, in sctp_input_add_ancillary()
617 ip_savebuf((void **)&sctp->sctp_dstopts, in sctp_input_add_ancillary()
618 &sctp->sctp_dstoptslen, in sctp_input_add_ancillary()
668 sctp_uodata_frag(sctp_t *sctp, mblk_t *dmp, sctp_data_hdr_t **dc) in sctp_uodata_frag() argument
681 if (sctp->sctp_uo_frags == NULL) { in sctp_uodata_frag()
682 sctp->sctp_uo_frags = dmp; in sctp_uodata_frag()
685 hmp = sctp->sctp_uo_frags; in sctp_uodata_frag()
697 sctp->sctp_uo_frags = dmp; in sctp_uodata_frag()
759 if (sctp->sctp_uo_frags == begin) { in sctp_uodata_frag()
761 sctp->sctp_uo_frags = end->b_next; in sctp_uodata_frag()
791 BUMP_LOCAL(sctp->sctp_reassmsgs); in sctp_uodata_frag()
807 sctp_try_partial_delivery(sctp_t *sctp, mblk_t *hmp, sctp_reass_t *srp, in sctp_try_partial_delivery() argument
918 BUMP_LOCAL(sctp->sctp_reassmsgs); in sctp_try_partial_delivery()
933 sctp_data_frag(sctp_t *sctp, mblk_t *dmp, sctp_data_hdr_t **dc, int *error, in sctp_data_frag() argument
1187 if (ntohl((*dc)->sdh_tsn) <= sctp->sctp_ftsn && in sctp_data_frag()
1188 srp->sr_msglen >= sctp->sctp_pd_point && in sctp_data_frag()
1190 dmp = sctp_try_partial_delivery(sctp, reassq_curr, in sctp_data_frag()
1244 BUMP_LOCAL(sctp->sctp_reassmsgs); in sctp_data_frag()
1285 sctp_data_chunk(sctp_t *sctp, sctp_chunk_hdr_t *ch, mblk_t *mp, mblk_t **dups, in sctp_data_chunk() argument
1300 sctp_stack_t *sctps = sctp->sctp_sctps; in sctp_data_chunk()
1304 #define SCTP_ACK_IT(sctp, tsn) \ in sctp_data_chunk() argument
1305 if (tsn == sctp->sctp_ftsn) { \ in sctp_data_chunk()
1307 (sctp)->sctp_ftsn++; \ in sctp_data_chunk()
1308 if ((sctp)->sctp_sack_gaps > 0) \ in sctp_data_chunk()
1309 (sctp)->sctp_force_sack = 1; \ in sctp_data_chunk()
1310 } else if (SEQ_GT(tsn, sctp->sctp_ftsn)) { \ in sctp_data_chunk()
1312 BUMP_LOCAL(sctp->sctp_outseqtsns); \ in sctp_data_chunk()
1314 sctp_ack_add(&sctp->sctp_sack_info, tsn, \ in sctp_data_chunk()
1315 &sctp->sctp_sack_gaps); \ in sctp_data_chunk()
1316 sctp->sctp_force_sack = 1; \ in sctp_data_chunk()
1327 if (SEQ_LT(tsn, sctp->sctp_ftsn)) { in sctp_data_chunk()
1329 BUMP_LOCAL(sctp->sctp_idupchunks); in sctp_data_chunk()
1330 sctp->sctp_force_sack = 1; in sctp_data_chunk()
1336 if (sctp->sctp_sack_info != NULL) { in sctp_data_chunk()
1339 for (sp = sctp->sctp_sack_info; sp; sp = sp->next) { in sctp_data_chunk()
1344 BUMP_LOCAL(sctp->sctp_idupchunks); in sctp_data_chunk()
1345 sctp->sctp_force_sack = 1; in sctp_data_chunk()
1353 if (SCTP_IS_DETACHED(sctp)) { in sctp_data_chunk()
1366 if ((sctp->sctp_rwnd - sctp->sctp_rxqueued < dlen) && in sctp_data_chunk()
1367 (tsn != sctp->sctp_ftsn || sctp->sctp_rwnd == 0)) { in sctp_data_chunk()
1369 sctp->sctp_force_sack = 1; in sctp_data_chunk()
1371 "dlen %d ssn %d tsn %x\n", sctp->sctp_rwnd, in sctp_data_chunk()
1372 sctp->sctp_rxqueued, dlen, ntohs(dc->sdh_ssn), in sctp_data_chunk()
1380 if (sid >= sctp->sctp_num_istr) { in sctp_data_chunk()
1389 sctp_add_err(sctp, SCTP_ERR_BAD_SID, (void *)&inval_parm, in sctp_data_chunk()
1391 SCTP_ACK_IT(sctp, tsn); in sctp_data_chunk()
1397 ASSERT(sctp->sctp_instr != NULL); in sctp_data_chunk()
1400 instr = &sctp->sctp_instr[sid]; in sctp_data_chunk()
1402 if (instr->sctp == NULL) in sctp_data_chunk()
1403 instr->sctp = sctp; in sctp_data_chunk()
1423 sctp->sctp_rxqueued += dlen; in sctp_data_chunk()
1425 oftsn = sctp->sctp_ftsn; in sctp_data_chunk()
1434 dmp = sctp_uodata_frag(sctp, dmp, &dc); in sctp_data_chunk()
1438 &sctp->sctp_instr[sid]); in sctp_data_chunk()
1449 dmp = sctp_data_frag(sctp, dmp, &dc, &error, instr, in sctp_data_chunk()
1454 sctp->sctp_rxqueued -= dlen; in sctp_data_chunk()
1468 SCTP_ACK_IT(sctp, tsn); in sctp_data_chunk()
1469 DTRACE_PROBE4(sctp_data_frag_queued, sctp_t *, sctp, in sctp_data_chunk()
1526 (sctp->sctp_istr_nmsgs)++; in sctp_data_chunk()
1527 SCTP_ACK_IT(sctp, tsn); in sctp_data_chunk()
1528 DTRACE_PROBE4(sctp_pqueue_completemsg, sctp_t *, sctp, in sctp_data_chunk()
1540 ASSERT(sctp->sctp_rxqueued >= dlen); in sctp_data_chunk()
1543 sctp->sctp_rxqueued -= dlen; in sctp_data_chunk()
1548 if (sctp_input_add_ancillary(sctp, &dmp, dc, fp, in sctp_data_chunk()
1558 if (sctp->sctp_flowctrld) { in sctp_data_chunk()
1559 sctp->sctp_rwnd -= dlen; in sctp_data_chunk()
1560 if (sctp->sctp_rwnd < 0) in sctp_data_chunk()
1561 sctp->sctp_rwnd = 0; in sctp_data_chunk()
1563 if (sctp->sctp_ulp_recv(sctp->sctp_ulpd, dmp, in sctp_data_chunk()
1565 sctp->sctp_flowctrld = B_TRUE; in sctp_data_chunk()
1567 SCTP_ACK_IT(sctp, tsn); in sctp_data_chunk()
1576 SCTP_ACK_IT(sctp, tsn); in sctp_data_chunk()
1586 BUMP_LOCAL(sctp->sctp_iudchunks); in sctp_data_chunk()
1589 BUMP_LOCAL(sctp->sctp_idchunks); in sctp_data_chunk()
1599 DTRACE_PROBE4(sctp_partial_delivery, sctp_t *, sctp, in sctp_data_chunk()
1607 sctp_t *, sctp, int, sid, int, tsn, in sctp_data_chunk()
1614 (void *)sctp, sid, in sctp_data_chunk()
1615 tsn, sctp->sctp_ftsn, ssn, in sctp_data_chunk()
1625 sctp_t *, sctp, int, sid, int, tsn, in sctp_data_chunk()
1629 (void *)sctp, sid, ssn, instr->nextseq); in sctp_data_chunk()
1634 DTRACE_PROBE4(sctp_deliver_completemsg, sctp_t *, sctp, int, sid, in sctp_data_chunk()
1652 DTRACE_PROBE4(sctp_deliver_pqueuedmsg, sctp_t *, sctp, in sctp_data_chunk()
1660 (sctp->sctp_istr_nmsgs)--; in sctp_data_chunk()
1680 ASSERT(sctp->sctp_rxqueued >= dlen); in sctp_data_chunk()
1682 sctp->sctp_rxqueued -= dlen; in sctp_data_chunk()
1685 if (sctp_input_add_ancillary(sctp, &dmp, dc, fp, in sctp_data_chunk()
1696 if (sctp->sctp_flowctrld) { in sctp_data_chunk()
1697 sctp->sctp_rwnd -= dlen; in sctp_data_chunk()
1698 if (sctp->sctp_rwnd < 0) in sctp_data_chunk()
1699 sctp->sctp_rwnd = 0; in sctp_data_chunk()
1701 if (sctp->sctp_ulp_recv(sctp->sctp_ulpd, dmp, in sctp_data_chunk()
1703 sctp->sctp_flowctrld = B_TRUE; in sctp_data_chunk()
1705 SCTP_ACK_IT(sctp, tsn); in sctp_data_chunk()
1714 SCTP_ACK_IT(sctp, tsn); in sctp_data_chunk()
1725 if (sctp->sctp_sack_info != NULL && in sctp_data_chunk()
1726 sctp->sctp_ftsn == sctp->sctp_sack_info->begin) { in sctp_data_chunk()
1727 sctp->sctp_ftsn = sctp->sctp_sack_info->end + 1; in sctp_data_chunk()
1733 if (oftsn != sctp->sctp_ftsn && sctp->sctp_sack_info != NULL) { in sctp_data_chunk()
1734 sctp_ack_rem(&sctp->sctp_sack_info, sctp->sctp_ftsn - 1, in sctp_data_chunk()
1735 &sctp->sctp_sack_gaps); in sctp_data_chunk()
1737 sctp->sctp_ftsn - 1, sctp->sctp_sack_gaps)); in sctp_data_chunk()
1741 if (sctp->sctp_sack_info != NULL) { in sctp_data_chunk()
1742 ASSERT(sctp->sctp_ftsn != sctp->sctp_sack_info->begin); in sctp_data_chunk()
1750 sctp_fill_sack(sctp_t *sctp, unsigned char *dst, int sacklen) in sctp_fill_sack() argument
1755 uint16_t num_gaps = sctp->sctp_sack_gaps; in sctp_fill_sack()
1765 sctp->sctp_lastacked = sctp->sctp_ftsn - 1; in sctp_fill_sack()
1768 sc->ssc_cumtsn = htonl(sctp->sctp_lastacked); in sctp_fill_sack()
1769 if (sctp->sctp_rxqueued < sctp->sctp_rwnd) { in sctp_fill_sack()
1770 sc->ssc_a_rwnd = htonl(sctp->sctp_rwnd - sctp->sctp_rxqueued); in sctp_fill_sack()
1775 sctp->sctp_arwnd = sc->ssc_a_rwnd; in sctp_fill_sack()
1781 for (sp = sctp->sctp_sack_info; sp; sp = sp->next) { in sctp_fill_sack()
1785 if (sp->begin > sctp->sctp_lastacked) { in sctp_fill_sack()
1786 offset = (uint16_t)(sp->begin - sctp->sctp_lastacked); in sctp_fill_sack()
1789 offset = (uint16_t)(UINT32_MAX - sctp->sctp_lastacked + in sctp_fill_sack()
1811 if (sctp->sctp_ack_timer_running) { in sctp_fill_sack()
1812 sctp_timer_stop(sctp->sctp_ack_mp); in sctp_fill_sack()
1813 sctp->sctp_ack_timer_running = B_FALSE; in sctp_fill_sack()
1816 BUMP_LOCAL(sctp->sctp_obchunks); in sctp_fill_sack()
1817 BUMP_LOCAL(sctp->sctp_osacks); in sctp_fill_sack()
1821 sctp_make_sack(sctp_t *sctp, sctp_faddr_t *sendto, mblk_t *dups) in sctp_make_sack() argument
1828 sctp_stack_t *sctps = sctp->sctp_sctps; in sctp_make_sack()
1834 if (sctp->sctp_force_sack) { in sctp_make_sack()
1835 sctp->sctp_force_sack = 0; in sctp_make_sack()
1840 if (sctp->sctp_state == SCTPS_ESTABLISHED) { in sctp_make_sack()
1841 if (sctp->sctp_sack_toggle < acks_max) { in sctp_make_sack()
1844 (void *)sctp)); in sctp_make_sack()
1846 } else if (sctp->sctp_sack_toggle >= acks_max) { in sctp_make_sack()
1847 sctp->sctp_sack_toggle = 0; in sctp_make_sack()
1851 if (sctp->sctp_ftsn == sctp->sctp_lastacked + 1) { in sctp_make_sack()
1853 (void *)sctp)); in sctp_make_sack()
1858 dprint(2, ("sctp_make_sack: acking %x\n", sctp->sctp_ftsn - 1)); in sctp_make_sack()
1865 (sizeof (sctp_sack_frag_t) * sctp->sctp_sack_gaps); in sctp_make_sack()
1872 if (sctp->sctp_err_chunks != NULL) { in sctp_make_sack()
1873 fp = SCTP_CHUNK_DEST(sctp->sctp_err_chunks); in sctp_make_sack()
1874 if (sctp->sctp_err_len + slen + dups_len > fp->sf_pmss) { in sctp_make_sack()
1875 if ((smp = sctp_make_mp(sctp, fp, 0)) == NULL) { in sctp_make_sack()
1878 freemsg(sctp->sctp_err_chunks); in sctp_make_sack()
1879 sctp->sctp_err_chunks = NULL; in sctp_make_sack()
1880 sctp->sctp_err_len = 0; in sctp_make_sack()
1883 smp->b_cont = sctp->sctp_err_chunks; in sctp_make_sack()
1884 sctp_set_iplen(sctp, smp, fp->sf_ixa); in sctp_make_sack()
1886 BUMP_LOCAL(sctp->sctp_opkts); in sctp_make_sack()
1887 sctp->sctp_err_chunks = NULL; in sctp_make_sack()
1888 sctp->sctp_err_len = 0; in sctp_make_sack()
1891 smp = sctp_make_mp(sctp, sendto, slen); in sctp_make_sack()
1898 sctp_fill_sack(sctp, smp->b_wptr, slen); in sctp_make_sack()
1907 if (sctp->sctp_err_chunks != NULL) { in sctp_make_sack()
1908 linkb(smp, sctp->sctp_err_chunks); in sctp_make_sack()
1909 sctp->sctp_err_chunks = NULL; in sctp_make_sack()
1910 sctp->sctp_err_len = 0; in sctp_make_sack()
1920 sctp_sack(sctp_t *sctp, mblk_t *dups) in sctp_sack() argument
1923 sctp_stack_t *sctps = sctp->sctp_sctps; in sctp_sack()
1926 if (sctp->sctp_state == SCTPS_SHUTDOWN_SENT) { in sctp_sack()
1927 sctp_send_shutdown(sctp, 0); in sctp_sack()
1930 ASSERT(sctp->sctp_lastdata != NULL); in sctp_sack()
1932 if ((smp = sctp_make_sack(sctp, sctp->sctp_lastdata, dups)) == NULL) { in sctp_sack()
1939 (void *)sctp->sctp_lastdata, in sctp_sack()
1940 SCTP_PRINTADDR(sctp->sctp_lastdata->sf_faddr))); in sctp_sack()
1942 sctp->sctp_active = LBOLT_FASTPATH64; in sctp_sack()
1946 sctp_set_iplen(sctp, smp, sctp->sctp_lastdata->sf_ixa); in sctp_sack()
1947 (void) conn_ip_output(smp, sctp->sctp_lastdata->sf_ixa); in sctp_sack()
1948 BUMP_LOCAL(sctp->sctp_opkts); in sctp_sack()
1962 sctp_check_abandoned_msg(sctp_t *sctp, mblk_t *meta) in sctp_check_abandoned_msg() argument
1969 uint32_t adv_pap = sctp->sctp_adv_pap; in sctp_check_abandoned_msg()
1970 sctp_faddr_t *fp = sctp->sctp_current; in sctp_check_abandoned_msg()
1971 sctp_stack_t *sctps = sctp->sctp_sctps; in sctp_check_abandoned_msg()
1974 if (SEQ_GEQ(sctp->sctp_lastack_rxd, ntohl(dh->sdh_tsn))) { in sctp_check_abandoned_msg()
1983 sctp->sctp_adv_pap = ntohl(dh->sdh_tsn); in sctp_check_abandoned_msg()
1986 sctp->sctp_adv_pap = adv_pap; in sctp_check_abandoned_msg()
1989 nmp = sctp_make_ftsn_chunk(sctp, fp, sets, nsets, seglen); in sctp_check_abandoned_msg()
1992 sctp->sctp_adv_pap = adv_pap; in sctp_check_abandoned_msg()
1995 head = sctp_add_proto_hdr(sctp, fp, nmp, 0, NULL); in sctp_check_abandoned_msg()
1997 sctp->sctp_adv_pap = adv_pap; in sctp_check_abandoned_msg()
2003 sctp_set_iplen(sctp, head, fp->sf_ixa); in sctp_check_abandoned_msg()
2005 BUMP_LOCAL(sctp->sctp_opkts); in sctp_check_abandoned_msg()
2007 SCTP_FADDR_TIMER_RESTART(sctp, fp, fp->sf_rto); in sctp_check_abandoned_msg()
2017 ASSERT(sctp->sctp_unsent >= unsent); in sctp_check_abandoned_msg()
2018 sctp->sctp_unsent -= unsent; in sctp_check_abandoned_msg()
2023 if (!SCTP_IS_DETACHED(sctp)) in sctp_check_abandoned_msg()
2024 SCTP_TXQ_UPDATE(sctp); in sctp_check_abandoned_msg()
2031 sctp_cumack(sctp_t *sctp, uint32_t tsn, mblk_t **first_unacked) in sctp_cumack() argument
2040 sctp_stack_t *sctps = sctp->sctp_sctps; in sctp_cumack()
2042 ump = sctp->sctp_xmit_head; in sctp_cumack()
2062 if (sctp->sctp_prsctp_aware && in sctp_cumack()
2066 sctp))) { in sctp_cumack()
2067 (void) sctp_check_abandoned_msg(sctp, in sctp_cumack()
2074 if (SEQ_GEQ(sctp->sctp_lastack_rxd, xtsn)) in sctp_cumack()
2080 if (sctp->sctp_out_time != 0 && in sctp_cumack()
2081 xtsn == sctp->sctp_rtt_tsn) { in sctp_cumack()
2083 sctp_update_rtt(sctp, fp, in sctp_cumack()
2085 sctp->sctp_out_time); in sctp_cumack()
2086 sctp->sctp_out_time = 0; in sctp_cumack()
2096 ASSERT(sctp->sctp_unacked >= in sctp_cumack()
2098 sctp->sctp_unacked -= in sctp_cumack()
2105 SCTP_FADDR_TIMER_RESTART(sctp, fp, in sctp_cumack()
2115 if (ump == sctp->sctp_xmit_tail) in sctp_cumack()
2116 sctp->sctp_xmit_tail = nump; in sctp_cumack()
2118 BUMP_LOCAL(sctp->sctp_prsctpdrop); in sctp_cumack()
2120 sctp_sendfail_event(sctp, ump, 0, B_TRUE); in sctp_cumack()
2124 sctp->sctp_xmit_head = ump = nump; in sctp_cumack()
2130 if (SEQ_GT(sctp->sctp_lastack_rxd, sctp->sctp_recovery_tsn)) { in sctp_cumack()
2131 sctp->sctp_recovery_tsn = sctp->sctp_lastack_rxd; in sctp_cumack()
2138 if (!SCTP_IS_DETACHED(sctp)) in sctp_cumack()
2139 SCTP_TXQ_UPDATE(sctp); in sctp_cumack()
2142 if (sctp->sctp_state == SCTPS_SHUTDOWN_PENDING) { in sctp_cumack()
2143 sctp_send_shutdown(sctp, 0); in sctp_cumack()
2145 sctp->sctp_xmit_unacked = mp; in sctp_cumack()
2150 sctp->sctp_lastack_rxd = tsn; in sctp_cumack()
2151 if (SEQ_LT(sctp->sctp_adv_pap, sctp->sctp_lastack_rxd)) in sctp_cumack()
2152 sctp->sctp_adv_pap = sctp->sctp_lastack_rxd; in sctp_cumack()
2153 ASSERT(sctp->sctp_xmit_head || sctp->sctp_unacked == 0); in sctp_cumack()
2159 sctp_set_frwnd(sctp_t *sctp, uint32_t frwnd) in sctp_set_frwnd() argument
2163 if (sctp->sctp_unacked > frwnd) { in sctp_set_frwnd()
2164 sctp->sctp_frwnd = 0; in sctp_set_frwnd()
2167 orwnd = sctp->sctp_frwnd; in sctp_set_frwnd()
2168 sctp->sctp_frwnd = frwnd - sctp->sctp_unacked; in sctp_set_frwnd()
2169 if (orwnd < sctp->sctp_frwnd) { in sctp_set_frwnd()
2183 sctp_ftsn_check_uo_frag(sctp_t *sctp, uint32_t ftsn) in sctp_ftsn_check_uo_frag() argument
2190 hmp = sctp->sctp_uo_frags; in sctp_ftsn_check_uo_frag()
2196 sctp->sctp_uo_frags = hmp_next; in sctp_ftsn_check_uo_frag()
2215 sctp_ftsn_check_frag(sctp_t *sctp, uint16_t ssn, sctp_instr_t *sip) in sctp_ftsn_check_frag() argument
2243 (void *)sctp, (void *)sip, in sctp_ftsn_check_frag()
2246 sctp_partial_delivery_event(sctp); in sctp_ftsn_check_frag()
2284 sctp_process_forward_tsn(sctp_t *sctp, sctp_chunk_hdr_t *ch, sctp_faddr_t *fp, in sctp_process_forward_tsn() argument
2297 sctp_stack_t *sctps = sctp->sctp_sctps; in sctp_process_forward_tsn()
2302 if (SCTP_IS_DETACHED(sctp)) { in sctp_process_forward_tsn()
2311 flen = sctp_ftsn_check_uo_frag(sctp, *ftsn); in sctp_process_forward_tsn()
2313 ASSERT(sctp->sctp_rxqueued >= flen); in sctp_process_forward_tsn()
2314 sctp->sctp_rxqueued -= flen; in sctp_process_forward_tsn()
2320 if (ftsn_entry->ftsn_sid >= sctp->sctp_num_istr) { in sctp_process_forward_tsn()
2328 sctp_add_err(sctp, SCTP_ERR_BAD_SID, in sctp_process_forward_tsn()
2334 instr = &sctp->sctp_instr[ftsn_entry->ftsn_sid]; in sctp_process_forward_tsn()
2335 flen = sctp_ftsn_check_frag(sctp, ftsn_entry->ftsn_ssn, instr); in sctp_process_forward_tsn()
2338 ASSERT(sctp->sctp_rxqueued >= flen); in sctp_process_forward_tsn()
2339 sctp->sctp_rxqueued -= flen; in sctp_process_forward_tsn()
2368 if (sctp_input_add_ancillary(sctp, in sctp_process_forward_tsn()
2370 sctp->sctp_rxqueued -= dlen; in sctp_process_forward_tsn()
2377 if (sctp->sctp_flowctrld) { in sctp_process_forward_tsn()
2378 sctp->sctp_rwnd -= dlen; in sctp_process_forward_tsn()
2379 if (sctp->sctp_rwnd < 0) in sctp_process_forward_tsn()
2380 sctp->sctp_rwnd = 0; in sctp_process_forward_tsn()
2382 if (sctp->sctp_ulp_recv( in sctp_process_forward_tsn()
2383 sctp->sctp_ulpd, dmp, msgdsize(dmp), in sctp_process_forward_tsn()
2385 sctp->sctp_flowctrld = B_TRUE; in sctp_process_forward_tsn()
2400 sctp->sctp_rxqueued -= dlen; in sctp_process_forward_tsn()
2407 sctp->sctp_istr_nmsgs--; in sctp_process_forward_tsn()
2416 if (*ftsn <= (sctp->sctp_ftsn - 1)) { in sctp_process_forward_tsn()
2417 sctp->sctp_force_sack = 1; in sctp_process_forward_tsn()
2421 sctp->sctp_ftsn = *ftsn + 1; in sctp_process_forward_tsn()
2424 if (sctp->sctp_sack_info != NULL) { in sctp_process_forward_tsn()
2425 sctp_ack_rem(&sctp->sctp_sack_info, sctp->sctp_ftsn - 1, in sctp_process_forward_tsn()
2426 &sctp->sctp_sack_gaps); in sctp_process_forward_tsn()
2434 if (sctp->sctp_sack_info != NULL && in sctp_process_forward_tsn()
2435 sctp->sctp_ftsn == sctp->sctp_sack_info->begin) { in sctp_process_forward_tsn()
2436 sctp->sctp_ftsn = sctp->sctp_sack_info->end + 1; in sctp_process_forward_tsn()
2437 sctp_ack_rem(&sctp->sctp_sack_info, sctp->sctp_ftsn - 1, in sctp_process_forward_tsn()
2438 &sctp->sctp_sack_gaps); in sctp_process_forward_tsn()
2449 sctp_check_abandoned_data(sctp_t *sctp, sctp_faddr_t *fp) in sctp_check_abandoned_data() argument
2451 mblk_t *meta = sctp->sctp_xmit_head; in sctp_check_abandoned_data()
2455 uint32_t adv_pap = sctp->sctp_adv_pap; in sctp_check_abandoned_data()
2471 sctp_check_adv_ack_pt(sctp, meta, mp); in sctp_check_abandoned_data()
2472 if (SEQ_GT(sctp->sctp_adv_pap, adv_pap)) { in sctp_check_abandoned_data()
2473 sctp_make_ftsns(sctp, meta, mp, &nmp, fp, &seglen); in sctp_check_abandoned_data()
2475 sctp->sctp_adv_pap = adv_pap; in sctp_check_abandoned_data()
2477 SCTP_FADDR_TIMER_RESTART(sctp, fp, fp->sf_rto); in sctp_check_abandoned_data()
2480 sctp_set_iplen(sctp, nmp, fp->sf_ixa); in sctp_check_abandoned_data()
2482 BUMP_LOCAL(sctp->sctp_opkts); in sctp_check_abandoned_data()
2484 SCTP_FADDR_TIMER_RESTART(sctp, fp, fp->sf_rto); in sctp_check_abandoned_data()
2497 sctp_process_uo_gaps(sctp_t *sctp, uint32_t ctsn, sctp_sack_frag_t *ssf, in sctp_process_uo_gaps() argument
2512 sctp_stack_t *sctps = sctp->sctp_sctps; in sctp_process_uo_gaps()
2547 if (SEQ_GT(gapstart, sctp->sctp_ltsn - 1) || in sctp_process_uo_gaps()
2548 SEQ_GT(gapend, sctp->sctp_ltsn - 1)) { in sctp_process_uo_gaps()
2613 sctp->sctp_unacked -= chunklen - sizeof (*sdc); in sctp_process_uo_gaps()
2614 ASSERT(sctp->sctp_unacked >= 0); in sctp_process_uo_gaps()
2671 SCTP_CHUNK_REXMIT(sctp, mp); in sctp_process_uo_gaps()
2672 sctp->sctp_chk_fast_rexmit = B_TRUE; in sctp_process_uo_gaps()
2686 sctp->sctp_recovery_tsn = in sctp_process_uo_gaps()
2687 sctp->sctp_ltsn - 1; in sctp_process_uo_gaps()
2708 sctp_got_sack(sctp_t *sctp, sctp_chunk_hdr_t *sch) in sctp_got_sack() argument
2729 sctp_stack_t *sctps = sctp->sctp_sctps; in sctp_got_sack()
2731 BUMP_LOCAL(sctp->sctp_ibchunks); in sctp_got_sack()
2732 BUMP_LOCAL(sctp->sctp_isacks); in sctp_got_sack()
2740 dprint(2, ("got sack cumtsn %x -> %x\n", sctp->sctp_lastack_rxd, in sctp_got_sack()
2744 if (SEQ_LT(cumtsn, sctp->sctp_lastack_rxd)) in sctp_got_sack()
2747 if (SEQ_GT(cumtsn, sctp->sctp_ltsn - 1)) { in sctp_got_sack()
2756 if (SEQ_LT(sctp->sctp_lastack_rxd, sctp->sctp_recovery_tsn)) in sctp_got_sack()
2762 if (SEQ_LT(sctp->sctp_lastack_rxd, sctp->sctp_adv_pap)) in sctp_got_sack()
2765 if (cumtsn == sctp->sctp_lastack_rxd && in sctp_got_sack()
2766 (sctp->sctp_xmit_unacked == NULL || in sctp_got_sack()
2767 !SCTP_CHUNK_ABANDONED(sctp->sctp_xmit_unacked))) { in sctp_got_sack()
2768 if (sctp->sctp_xmit_unacked != NULL) in sctp_got_sack()
2769 mp = sctp->sctp_xmit_unacked; in sctp_got_sack()
2770 else if (sctp->sctp_xmit_head != NULL) in sctp_got_sack()
2771 mp = sctp->sctp_xmit_head->b_cont; in sctp_got_sack()
2780 if (mp != NULL && sctp->sctp_zero_win_probe && in sctp_got_sack()
2781 ntohl(sc->ssc_a_rwnd) >= sctp->sctp_current->sf_pmss) { in sctp_got_sack()
2785 mblk_t *meta = sctp->sctp_xmit_head; in sctp_got_sack()
2791 fp = sctp->sctp_current; in sctp_got_sack()
2793 SCTP_MAX_RTO(sctp, fp); in sctp_got_sack()
2795 pkt = sctp_rexmit_packet(sctp, &meta, &mp1, fp, in sctp_got_sack()
2802 sctp->sctp_zero_win_probe = B_FALSE; in sctp_got_sack()
2803 sctp->sctp_rxt_nxttsn = sctp->sctp_ltsn; in sctp_got_sack()
2804 sctp->sctp_rxt_maxtsn = sctp->sctp_ltsn; in sctp_got_sack()
2805 sctp_set_iplen(sctp, pkt, fp->sf_ixa); in sctp_got_sack()
2807 BUMP_LOCAL(sctp->sctp_opkts); in sctp_got_sack()
2810 if (sctp->sctp_zero_win_probe) { in sctp_got_sack()
2815 fp = sctp->sctp_current; in sctp_got_sack()
2817 SCTP_MAX_RTO(sctp, fp); in sctp_got_sack()
2818 sctp->sctp_zero_win_probe = B_FALSE; in sctp_got_sack()
2820 if (!sctp->sctp_rexmitting) { in sctp_got_sack()
2821 sctp->sctp_rxt_nxttsn = sctp->sctp_ltsn; in sctp_got_sack()
2822 sctp->sctp_rxt_maxtsn = sctp->sctp_ltsn; in sctp_got_sack()
2825 acked = sctp_cumack(sctp, cumtsn, &mp); in sctp_got_sack()
2826 sctp->sctp_xmit_unacked = mp; in sctp_got_sack()
2830 if (fwd_tsn && SEQ_GEQ(sctp->sctp_lastack_rxd, in sctp_got_sack()
2831 sctp->sctp_adv_pap)) { in sctp_got_sack()
2837 UPDATE_LOCAL(sctp->sctp_gapcnt, num_gaps); in sctp_got_sack()
2851 mblk_t *mp2 = sctp->sctp_xmit_head->b_cont; in sctp_got_sack()
2861 ump = sctp->sctp_xmit_head; in sctp_got_sack()
2881 acked += sctp_process_uo_gaps(sctp, in sctp_got_sack()
2883 sctp->sctp_xmit_head, mp1, in sctp_got_sack()
2901 if (SEQ_GT(gapstart, sctp->sctp_ltsn - 1) || in sctp_got_sack()
2902 SEQ_GT(gapend, sctp->sctp_ltsn - 1)) { in sctp_got_sack()
2928 SCTP_CHUNK_REXMIT(sctp, mp); in sctp_got_sack()
2929 sctp->sctp_chk_fast_rexmit = B_TRUE; in sctp_got_sack()
2943 sctp->sctp_recovery_tsn = in sctp_got_sack()
2944 sctp->sctp_ltsn - 1; in sctp_got_sack()
2958 sctp->sctp_unacked += chunklen - sizeof (*sdc); in sctp_got_sack()
2959 SCTP_CHUNK_CLEAR_ACKED(sctp, mp); in sctp_got_sack()
2961 SCTP_FADDR_TIMER_RESTART(sctp, fp, in sctp_got_sack()
2979 (void *)sctp); in sctp_got_sack()
3015 sctp->sctp_unacked -= chunklen - sizeof (*sdc); in sctp_got_sack()
3016 ASSERT(sctp->sctp_unacked >= 0); in sctp_got_sack()
3046 (void *)sctp); in sctp_got_sack()
3048 ump = sctp->sctp_xmit_head; in sctp_got_sack()
3068 ump = sctp->sctp_xmit_head; in sctp_got_sack()
3078 if (sctp->sctp_prsctp_aware) in sctp_got_sack()
3079 sctp_check_abandoned_data(sctp, sctp->sctp_current); in sctp_got_sack()
3080 if (sctp->sctp_chk_fast_rexmit) in sctp_got_sack()
3081 sctp_fast_rexmit(sctp); in sctp_got_sack()
3083 trysend += sctp_set_frwnd(sctp, ntohl(sc->ssc_a_rwnd)); in sctp_got_sack()
3089 if (sctp->sctp_frwnd == 0 && sctp->sctp_unacked == 0 && in sctp_got_sack()
3090 sctp->sctp_unsent != 0) { in sctp_got_sack()
3091 SCTP_FADDR_TIMER_RESTART(sctp, sctp->sctp_current, in sctp_got_sack()
3092 sctp->sctp_current->sf_rto); in sctp_got_sack()
3102 if (sctp->sctp_current->sf_acked == acked) { in sctp_got_sack()
3106 fp = sctp->sctp_current; in sctp_got_sack()
3119 sctp->sctp_cwnd_max); in sctp_got_sack()
3129 sctp->sctp_cwnd_max); in sctp_got_sack()
3144 for (fp = sctp->sctp_faddrs; fp != NULL; fp = fp->sf_next) { in sctp_got_sack()
3154 sctp->sctp_cwnd_max); in sctp_got_sack()
3161 sctp->sctp_cwnd_max); in sctp_got_sack()
3172 fp = sctp->sctp_current; in sctp_got_sack()
3179 if (sctp->sctp_rexmitting) { in sctp_got_sack()
3180 if (SEQ_LT(sctp->sctp_lastack_rxd, sctp->sctp_rxt_maxtsn)) { in sctp_got_sack()
3192 sctp_ss_rexmit(sctp); in sctp_got_sack()
3195 sctp->sctp_rexmitting = B_FALSE; in sctp_got_sack()
3196 sctp->sctp_rxt_nxttsn = sctp->sctp_ltsn; in sctp_got_sack()
3197 sctp->sctp_rxt_maxtsn = sctp->sctp_ltsn; in sctp_got_sack()
3209 sctp_strange_chunk(sctp_t *sctp, sctp_chunk_hdr_t *ch, sctp_faddr_t *fp) in sctp_strange_chunk() argument
3213 BUMP_LOCAL(sctp->sctp_ibchunks); in sctp_strange_chunk()
3217 sctp_add_err(sctp, SCTP_ERR_UNREC_CHUNK, ch, len, fp); in sctp_strange_chunk()
3245 sctp_check_input(sctp_t *sctp, sctp_chunk_hdr_t *ch, ssize_t len, int first) in sctp_check_input() argument
3399 sctp_t *sctp; in sctp_ootb_input() local
3467 sctp = sctp_addrlist2sctp(mp, sctph, ch, zoneid, sctps); in sctp_ootb_input()
3468 if (sctp != NULL) { in sctp_ootb_input()
3470 mutex_enter(&sctp->sctp_lock); in sctp_ootb_input()
3471 if (sctp->sctp_running) { in sctp_ootb_input()
3472 sctp_add_recvq(sctp, mp, B_FALSE, ira); in sctp_ootb_input()
3473 mutex_exit(&sctp->sctp_lock); in sctp_ootb_input()
3481 sctp->sctp_running = B_TRUE; in sctp_ootb_input()
3482 mutex_exit(&sctp->sctp_lock); in sctp_ootb_input()
3483 sctp_input_data(sctp, mp, ira); in sctp_ootb_input()
3484 WAKE_SCTP(sctp); in sctp_ootb_input()
3486 SCTP_REFRELE(sctp); in sctp_ootb_input()
3519 sctp_t *sctp = CONN2SCTP(connp); in sctp_input() local
3532 SCTP_REFRELE(sctp); in sctp_input()
3551 SCTP_REFRELE(sctp); in sctp_input()
3558 mutex_enter(&sctp->sctp_lock); in sctp_input()
3559 if (sctp->sctp_running) { in sctp_input()
3560 sctp_add_recvq(sctp, mp, B_FALSE, ira); in sctp_input()
3561 mutex_exit(&sctp->sctp_lock); in sctp_input()
3564 sctp->sctp_running = B_TRUE; in sctp_input()
3565 mutex_exit(&sctp->sctp_lock); in sctp_input()
3567 mutex_enter(&sctp->sctp_recvq_lock); in sctp_input()
3568 if (sctp->sctp_recvq != NULL) { in sctp_input()
3569 sctp_add_recvq(sctp, mp, B_TRUE, ira); in sctp_input()
3570 mutex_exit(&sctp->sctp_recvq_lock); in sctp_input()
3571 WAKE_SCTP(sctp); in sctp_input()
3575 mutex_exit(&sctp->sctp_recvq_lock); in sctp_input()
3577 sctp_icmp_error(sctp, mp); in sctp_input()
3579 sctp_input_data(sctp, mp, ira); in sctp_input()
3580 WAKE_SCTP(sctp); in sctp_input()
3583 SCTP_REFRELE(sctp); in sctp_input()
3589 sctp_process_abort(sctp_t *sctp, sctp_chunk_hdr_t *ch, int err) in sctp_process_abort() argument
3591 sctp_stack_t *sctps = sctp->sctp_sctps; in sctp_process_abort()
3594 BUMP_LOCAL(sctp->sctp_ibchunks); in sctp_process_abort()
3600 if (sctp->sctp_state >= SCTPS_ESTABLISHED) { in sctp_process_abort()
3601 sctp_assoc_event(sctp, SCTP_COMM_LOST, in sctp_process_abort()
3605 sctp_clean_death(sctp, err); in sctp_process_abort()
3609 sctp_input_data(sctp_t *sctp, mblk_t *mp, ip_recv_attr_t *ira) in sctp_input_data() argument
3630 sctp_stack_t *sctps = sctp->sctp_sctps; in sctp_input_data()
3636 conn_t *connp = sctp->sctp_connp; in sctp_input_data()
3655 BUMP_LOCAL(sctp->sctp_ipkts); in sctp_input_data()
3712 if (!sctp_check_input(sctp, ch, mlen, 1)) { in sctp_input_data()
3732 if (sctph->sh_verf == sctp->sctp_lvtag) in sctp_input_data()
3734 if (sctph->sh_verf == sctp->sctp_fvtag && in sctp_input_data()
3745 if (sctp->sctp_state > SCTPS_BOUND && in sctp_input_data()
3746 sctp->sctp_state < SCTPS_ESTABLISHED) { in sctp_input_data()
3759 if (sctph->sh_verf != sctp->sctp_lvtag && in sctp_input_data()
3760 sctp->sctp_state != SCTPS_LISTEN) { in sctp_input_data()
3768 fp = sctp_lookup_faddr(sctp, &src); in sctp_input_data()
3770 (void *)fp, (void *)sctp)); in sctp_input_data()
3779 sctp->sctp_state, (int)(ch->sch_id))); in sctp_input_data()
3782 if (sctph->sh_verf != sctp->sctp_lvtag && in sctp_input_data()
3783 sctph->sh_verf != sctp->sctp_fvtag) { in sctp_input_data()
3789 switch (sctp->sctp_state) { in sctp_input_data()
3800 sctp_send_abort(sctp, sctp->sctp_fvtag, in sctp_input_data()
3803 sctp_assoc_event(sctp, SCTP_COMM_LOST, in sctp_input_data()
3805 sctp_clean_death(sctp, ECONNABORTED); in sctp_input_data()
3810 sctp->sctp_lastdata = fp; in sctp_input_data()
3811 sctp_data_chunk(sctp, ch, mp, &dups, fp, in sctp_input_data()
3815 if (sctp->sctp_state == SCTPS_SHUTDOWN_SENT) { in sctp_input_data()
3825 sctp->sctp_out_time) > in sctp_input_data()
3827 sctp_send_abort(sctp, in sctp_input_data()
3828 sctp->sctp_fvtag, 0, NULL, in sctp_input_data()
3830 sctp_assoc_event(sctp, in sctp_input_data()
3832 sctp_clean_death(sctp, in sctp_input_data()
3836 SCTP_FADDR_TIMER_RESTART(sctp, fp, in sctp_input_data()
3846 sctp_faddr_alive(sctp, fp); in sctp_input_data()
3847 trysend = sctp_got_sack(sctp, ch); in sctp_input_data()
3849 sctp_send_abort(sctp, sctph->sh_verf, in sctp_input_data()
3851 sctp_assoc_event(sctp, in sctp_input_data()
3853 sctp_clean_death(sctp, in sctp_input_data()
3866 sctp_return_heartbeat(sctp, ch, mp); in sctp_input_data()
3871 sctp_process_heartbeat(sctp, ch); in sctp_input_data()
3874 sctp_shutdown_event(sctp); in sctp_input_data()
3875 trysend = sctp_shutdown_received(sctp, ch, in sctp_input_data()
3877 BUMP_LOCAL(sctp->sctp_ibchunks); in sctp_input_data()
3880 BUMP_LOCAL(sctp->sctp_ibchunks); in sctp_input_data()
3881 if (sctp->sctp_state == SCTPS_SHUTDOWN_SENT) { in sctp_input_data()
3882 sctp_shutdown_complete(sctp); in sctp_input_data()
3884 sctp_assoc_event(sctp, in sctp_input_data()
3886 sctp_clean_death(sctp, 0); in sctp_input_data()
3894 sp = sctp_saddr_lookup(sctp, &dst, 0); in sctp_input_data()
3897 BUMP_LOCAL(sctp->sctp_ibchunks); in sctp_input_data()
3901 sctp_process_abort(sctp, ch, ECONNRESET); in sctp_input_data()
3905 sctp_send_initack(sctp, sctph, ch, mp, ira); in sctp_input_data()
3908 if (sctp_process_cookie(sctp, ch, mp, &iack, in sctp_input_data()
3910 sctp_send_cookie_ack(sctp); in sctp_input_data()
3911 sctp_assoc_event(sctp, SCTP_RESTART, in sctp_input_data()
3914 sctp->sctp_recv_adaptation = 1; in sctp_input_data()
3915 sctp_adaptation_event(sctp); in sctp_input_data()
3925 BUMP_LOCAL(sctp->sctp_ibchunks); in sctp_input_data()
3926 error = sctp_handle_error(sctp, sctph, ch, mp, in sctp_input_data()
3929 sctp_assoc_event(sctp, SCTP_COMM_LOST, in sctp_input_data()
3931 sctp_clean_death(sctp, error); in sctp_input_data()
3938 sctp_input_asconf(sctp, ch, fp); in sctp_input_data()
3939 BUMP_LOCAL(sctp->sctp_ibchunks); in sctp_input_data()
3943 sctp_faddr_alive(sctp, fp); in sctp_input_data()
3944 sctp_input_asconf_ack(sctp, ch, fp); in sctp_input_data()
3945 BUMP_LOCAL(sctp->sctp_ibchunks); in sctp_input_data()
3949 sctp->sctp_lastdata = fp; in sctp_input_data()
3950 sctp_process_forward_tsn(sctp, ch, fp, in sctp_input_data()
3953 BUMP_LOCAL(sctp->sctp_ibchunks); in sctp_input_data()
3956 if (sctp_strange_chunk(sctp, ch, fp) == 0) { in sctp_input_data()
3966 sctp_send_initack(sctp, sctph, ch, mp, ira); in sctp_input_data()
3971 if (sctp_process_cookie(sctp, ch, mp, &iack, in sctp_input_data()
3987 eager = sctp_conn_request(sctp, mp, ifindex, in sctp_input_data()
3990 sctp_send_abort(sctp, sctph->sh_verf, in sctp_input_data()
4030 sctp->sctp_rx_adaptation_code; in sctp_input_data()
4042 sctp = eager; in sctp_input_data()
4043 fp = sctp_lookup_faddr(sctp, &peer_src); in sctp_input_data()
4050 fp = sctp_lookup_faddr(sctp, &src); in sctp_input_data()
4052 sctp_faddr_alive(sctp, fp); in sctp_input_data()
4058 sctp_validate_peer(sctp); in sctp_input_data()
4066 BUMP_LOCAL(sctp->sctp_ibchunks); in sctp_input_data()
4069 BUMP_LOCAL(sctp->sctp_ibchunks); in sctp_input_data()
4070 sctp_send_abort(sctp, sctph->sh_verf, 0, NULL, in sctp_input_data()
4079 sctp_stop_faddr_timers(sctp); in sctp_input_data()
4080 sctp_faddr_alive(sctp, sctp->sctp_current); in sctp_input_data()
4081 sctp_send_cookie_echo(sctp, ch, mp, ira); in sctp_input_data()
4082 BUMP_LOCAL(sctp->sctp_ibchunks); in sctp_input_data()
4085 sctp_process_abort(sctp, ch, ECONNREFUSED); in sctp_input_data()
4088 sctp_send_initack(sctp, sctph, ch, mp, ira); in sctp_input_data()
4094 if (sctp_process_cookie(sctp, ch, mp, &iack, in sctp_input_data()
4100 sctp_send_cookie_ack(sctp); in sctp_input_data()
4101 sctp_stop_faddr_timers(sctp); in sctp_input_data()
4102 if (!SCTP_IS_DETACHED(sctp)) { in sctp_input_data()
4103 sctp->sctp_ulp_connected( in sctp_input_data()
4104 sctp->sctp_ulpd, 0, cr, cpid); in sctp_input_data()
4105 sctp_set_ulp_prop(sctp); in sctp_input_data()
4108 SCTP_ASSOC_EST(sctps, sctp); in sctp_input_data()
4110 if (sctp->sctp_cookie_mp) { in sctp_input_data()
4111 freemsg(sctp->sctp_cookie_mp); in sctp_input_data()
4112 sctp->sctp_cookie_mp = NULL; in sctp_input_data()
4116 sctp->sctp_active = now; in sctp_input_data()
4117 sctp_validate_peer(sctp); in sctp_input_data()
4119 sctp_assoc_event(sctp, SCTP_COMM_UP, 0, NULL); in sctp_input_data()
4121 sctp->sctp_recv_adaptation = 1; in sctp_input_data()
4122 sctp_adaptation_event(sctp); in sctp_input_data()
4128 if (sctp_strange_chunk(sctp, ch, fp) == 0) { in sctp_input_data()
4141 if (!SCTP_IS_DETACHED(sctp)) { in sctp_input_data()
4142 sctp->sctp_ulp_connected( in sctp_input_data()
4143 sctp->sctp_ulpd, 0, cr, cpid); in sctp_input_data()
4144 sctp_set_ulp_prop(sctp); in sctp_input_data()
4146 if (sctp->sctp_unacked == 0) in sctp_input_data()
4147 sctp_stop_faddr_timers(sctp); in sctp_input_data()
4148 SCTP_ASSOC_EST(sctps, sctp); in sctp_input_data()
4150 BUMP_LOCAL(sctp->sctp_ibchunks); in sctp_input_data()
4151 if (sctp->sctp_cookie_mp) { in sctp_input_data()
4152 freemsg(sctp->sctp_cookie_mp); in sctp_input_data()
4153 sctp->sctp_cookie_mp = NULL; in sctp_input_data()
4155 sctp_faddr_alive(sctp, fp); in sctp_input_data()
4157 sctp->sctp_active = now; in sctp_input_data()
4158 sctp_validate_peer(sctp); in sctp_input_data()
4162 sctp_assoc_event(sctp, SCTP_COMM_UP, 0, NULL); in sctp_input_data()
4163 sctp_adaptation_event(sctp); in sctp_input_data()
4166 sctp_process_abort(sctp, ch, ECONNREFUSED); in sctp_input_data()
4172 if (sctp_process_cookie(sctp, ch, mp, &iack, in sctp_input_data()
4178 sctp_send_cookie_ack(sctp); in sctp_input_data()
4180 if (!SCTP_IS_DETACHED(sctp)) { in sctp_input_data()
4181 sctp->sctp_ulp_connected( in sctp_input_data()
4182 sctp->sctp_ulpd, 0, cr, cpid); in sctp_input_data()
4183 sctp_set_ulp_prop(sctp); in sctp_input_data()
4186 if (sctp->sctp_unacked == 0) in sctp_input_data()
4187 sctp_stop_faddr_timers(sctp); in sctp_input_data()
4188 SCTP_ASSOC_EST(sctps, sctp); in sctp_input_data()
4190 if (sctp->sctp_cookie_mp) { in sctp_input_data()
4191 freemsg(sctp->sctp_cookie_mp); in sctp_input_data()
4192 sctp->sctp_cookie_mp = NULL; in sctp_input_data()
4195 sctp->sctp_active = now; in sctp_input_data()
4196 sctp_validate_peer(sctp); in sctp_input_data()
4198 sctp_assoc_event(sctp, SCTP_COMM_UP, 0, NULL); in sctp_input_data()
4200 sctp->sctp_recv_adaptation = 1; in sctp_input_data()
4201 sctp_adaptation_event(sctp); in sctp_input_data()
4207 sctp_send_initack(sctp, sctph, ch, mp, ira); in sctp_input_data()
4212 BUMP_LOCAL(sctp->sctp_ibchunks); in sctp_input_data()
4223 sctp_error_event(sctp, in sctp_input_data()
4225 sctp_assoc_event(sctp, in sctp_input_data()
4227 sctp_clean_death(sctp, in sctp_input_data()
4236 sctp_return_heartbeat(sctp, ch, mp); in sctp_input_data()
4241 if (sctp_strange_chunk(sctp, ch, fp) == 0) { in sctp_input_data()
4251 sctp_update_dce(sctp); in sctp_input_data()
4252 sctp_process_abort(sctp, ch, 0); in sctp_input_data()
4255 BUMP_LOCAL(sctp->sctp_ibchunks); in sctp_input_data()
4257 sctp_assoc_event(sctp, SCTP_SHUTDOWN_COMP, 0, in sctp_input_data()
4261 sctp_update_dce(sctp); in sctp_input_data()
4262 sctp_clean_death(sctp, 0); in sctp_input_data()
4265 sctp_shutdown_complete(sctp); in sctp_input_data()
4266 BUMP_LOCAL(sctp->sctp_ibchunks); in sctp_input_data()
4268 sctp_assoc_event(sctp, SCTP_SHUTDOWN_COMP, 0, in sctp_input_data()
4270 sctp_clean_death(sctp, 0); in sctp_input_data()
4273 (void) sctp_shutdown_received(sctp, NULL, in sctp_input_data()
4275 BUMP_LOCAL(sctp->sctp_ibchunks); in sctp_input_data()
4279 sctp_return_heartbeat(sctp, ch, mp); in sctp_input_data()
4284 if (sctp_strange_chunk(sctp, ch, fp) == 0) { in sctp_input_data()
4294 trysend = sctp_shutdown_received(sctp, ch, in sctp_input_data()
4305 if (shutdown_ack_needed && (sctp->sctp_state == in sctp_input_data()
4310 trysend = sctp_got_sack(sctp, ch); in sctp_input_data()
4312 sctp_send_abort(sctp, sctph->sh_verf, in sctp_input_data()
4314 sctp_assoc_event(sctp, in sctp_input_data()
4316 sctp_clean_death(sctp, in sctp_input_data()
4331 if ((sctp->sctp_xmit_head == NULL) && in sctp_input_data()
4332 (sctp->sctp_xmit_unsent == NULL)) in sctp_input_data()
4336 sctp_process_abort(sctp, ch, ECONNRESET); in sctp_input_data()
4340 sctp_return_heartbeat(sctp, ch, mp); in sctp_input_data()
4345 if (sctp_strange_chunk(sctp, ch, fp) == 0) { in sctp_input_data()
4362 if (ch != NULL && !sctp_check_input(sctp, ch, mlen, 0)) in sctp_input_data()
4371 sctp_send_shutdown_ack(sctp, fp, B_FALSE); in sctp_input_data()
4377 (sctp->sctp_sack_toggle)++; in sctp_input_data()
4378 sack_sent = sctp_sack(sctp, dups); in sctp_input_data()
4382 if (!sack_sent && !sctp->sctp_ack_timer_running) { in sctp_input_data()
4383 sctp->sctp_ack_timer_running = B_TRUE; in sctp_input_data()
4384 sctp_timer(sctp, sctp->sctp_ack_mp, in sctp_input_data()
4390 sctp_output(sctp, UINT_MAX); in sctp_input_data()
4391 if (sctp->sctp_cxmit_list != NULL) in sctp_input_data()
4392 sctp_wput_asconf(sctp, NULL); in sctp_input_data()
4398 if (sctp->sctp_unsent > 0 && !sctp->sctp_current->sf_timer_running && in sctp_input_data()
4399 sctp->sctp_current->sf_timer_mp != NULL) { in sctp_input_data()
4400 SCTP_FADDR_TIMER_RESTART(sctp, sctp->sctp_current, in sctp_input_data()
4401 sctp->sctp_current->sf_rto); in sctp_input_data()
4409 if (sctp->sctp_err_chunks != NULL) in sctp_input_data()
4410 sctp_process_err(sctp); in sctp_input_data()
4417 WAKE_SCTP(sctp); in sctp_input_data()
4428 sctp_recvd(sctp_t *sctp, int len) in sctp_recvd() argument
4430 sctp_stack_t *sctps = sctp->sctp_sctps; in sctp_recvd()
4431 conn_t *connp = sctp->sctp_connp; in sctp_recvd()
4434 ASSERT(sctp != NULL); in sctp_recvd()
4435 RUN_SCTP(sctp); in sctp_recvd()
4437 sctp->sctp_flowctrld = B_FALSE; in sctp_recvd()
4439 sctp->sctp_ulp_rxqueued = connp->conn_rcvbuf - len; in sctp_recvd()
4441 if (connp->conn_rcvbuf - sctp->sctp_arwnd >= sctp->sctp_mss) in sctp_recvd()
4443 sctp->sctp_rwnd = connp->conn_rcvbuf; in sctp_recvd()
4445 if (sctp->sctp_state >= SCTPS_ESTABLISHED && send_sack) { in sctp_recvd()
4446 sctp->sctp_force_sack = 1; in sctp_recvd()
4448 (void) sctp_sack(sctp, NULL); in sctp_recvd()
4450 WAKE_SCTP(sctp); in sctp_recvd()