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