Lines Matching defs:sctp

53 #include <netinet/sctp.h>
77 static void sctp_closei_local(sctp_t *sctp);
79 static void sctp_icmp_error_ipv6(sctp_t *sctp, mblk_t *mp);
129 #define SCTP_CONDEMNED(sctp) \
130 mutex_enter(&(sctp)->sctp_reflock); \
131 ((sctp)->sctp_condemned = B_TRUE); \
132 mutex_exit(&(sctp)->sctp_reflock);
135 #define SCTP_LINK(sctp, sctps) \
137 list_insert_tail(&sctps->sctps_g_list, (sctp)); \
140 #define SCTP_UNLINK(sctp, sctps) \
142 ASSERT((sctp)->sctp_condemned); \
143 list_remove(&(sctps)->sctps_g_list, (sctp)); \
171 * Called when we need a new sctp instantiation but don't really have a
177 sctp_t *sctp;
188 sctp = CONN2SCTP(connp);
189 sctp->sctp_sctps = sctps;
191 if ((ack_mp = sctp_timer_alloc(sctp, sctp_ack_timer,
193 (hb_mp = sctp_timer_alloc(sctp, sctp_heartbeat_timer,
198 sctp->sctp_sctps = NULL;
203 sctp->sctp_ack_mp = ack_mp;
204 sctp->sctp_heartbeat_mp = hb_mp;
206 if (sctp_init_values(sctp, psctp, KM_NOSLEEP) != 0) {
210 sctp->sctp_sctps = NULL;
220 sctp->sctp_mss = psctp->sctp_mss;
221 sctp->sctp_detached = B_TRUE;
226 SCTP_LINK(sctp, sctps);
229 sctp->sctp_listen_cnt = psctp->sctp_listen_cnt;
231 return (sctp);
238 sctp_clean_death(sctp_t *sctp, int err)
240 ASSERT(sctp != NULL);
242 dprint(3, ("sctp_clean_death %p, state %d\n", (void *)sctp,
243 sctp->sctp_state));
245 sctp->sctp_client_errno = err;
249 if ((sctp->sctp_state >= SCTPS_COOKIE_WAIT) &&
250 !SCTP_IS_DETACHED(sctp)) {
251 if (sctp->sctp_xmit_head || sctp->sctp_xmit_unsent) {
252 sctp_regift_xmitlist(sctp);
254 if (sctp->sctp_ulp_disconnected(sctp->sctp_ulpd, 0, err)) {
258 sctp->sctp_detached = B_TRUE;
259 sctp->sctp_ulpd = NULL;
260 sctp->sctp_upcalls = NULL;
264 /* Remove this sctp from all hashes. */
265 sctp_closei_local(sctp);
276 if (SCTP_IS_DETACHED(sctp)) {
277 SCTP_CONDEMNED(sctp);
278 SCTP_REFRELE(sctp);
288 * no sent data, just remove this sctp from all the hashes. This
290 * sctp handling. The upper layer will then do a sctp_close() to clean
299 sctp_disconnect(sctp_t *sctp)
302 conn_t *connp = sctp->sctp_connp;
304 dprint(3, ("sctp_disconnect %p, state %d\n", (void *)sctp,
305 sctp->sctp_state));
307 RUN_SCTP(sctp);
309 switch (sctp->sctp_state) {
322 if (sctp->sctp_xmit_head == NULL &&
323 sctp->sctp_xmit_unsent == NULL) {
333 sctp_user_abort(sctp, NULL);
334 WAKE_SCTP(sctp);
342 if (sctp->sctp_rxqueued > 0 || sctp->sctp_ulp_rxqueued > 0) {
343 sctp_user_abort(sctp, NULL);
344 WAKE_SCTP(sctp);
352 sctp_send_shutdown(sctp, 0);
355 sctp_update_dce(sctp);
365 sctp->sctp_state >= SCTPS_ESTABLISHED &&
366 !sctp->sctp_lingering) {
370 sctp->sctp_lingering = 1;
371 sctp->sctp_client_errno = 0;
375 mutex_enter(&sctp->sctp_lock);
376 sctp->sctp_running = B_FALSE;
377 while (sctp->sctp_state >= SCTPS_ESTABLISHED &&
378 sctp->sctp_client_errno == 0) {
379 cv_signal(&sctp->sctp_cv);
380 ret = cv_timedwait_sig(&sctp->sctp_cv,
381 &sctp->sctp_lock, stoptime);
384 sctp->sctp_client_errno = EWOULDBLOCK;
391 error = sctp->sctp_client_errno;
392 sctp->sctp_client_errno = 0;
393 mutex_exit(&sctp->sctp_lock);
396 WAKE_SCTP(sctp);
401 /* Remove this sctp from all hashes so nobody can find it. */
402 sctp_closei_local(sctp);
403 WAKE_SCTP(sctp);
408 sctp_close(sctp_t *sctp)
410 dprint(3, ("sctp_close %p, state %d\n", (void *)sctp,
411 sctp->sctp_state));
413 RUN_SCTP(sctp);
414 sctp->sctp_detached = 1;
415 sctp->sctp_ulpd = NULL;
416 sctp->sctp_upcalls = NULL;
417 bzero(&sctp->sctp_events, sizeof (sctp->sctp_events));
420 if (sctp->sctp_state != SCTPS_IDLE) {
421 WAKE_SCTP(sctp);
431 SCTP_CONDEMNED(sctp);
432 WAKE_SCTP(sctp);
433 SCTP_REFRELE(sctp);
441 sctp_close_eager(sctp_t *sctp)
443 SCTP_CONDEMNED(sctp);
444 sctp_closei_local(sctp);
445 SCTP_REFRELE(sctp);
457 sctp_closei_local(sctp_t *sctp)
460 conn_t *connp = sctp->sctp_connp;
463 if (sctp->sctp_state >= SCTPS_ESTABLISHED)
464 SCTPS_ASSOC_DEC(sctp->sctp_sctps);
466 if (sctp->sctp_listen_cnt != NULL)
467 SCTP_DECR_LISTEN_CNT(sctp);
471 ASSERT(sctp->sctp_state == SCTPS_IDLE);
476 sctp_free_faddr_timers(sctp);
477 if ((mp = sctp->sctp_heartbeat_mp) != NULL) {
479 sctp->sctp_heartbeat_mp = NULL;
481 if ((mp = sctp->sctp_ack_mp) != NULL) {
483 sctp->sctp_ack_mp = NULL;
492 sctp_bind_hash_remove(sctp);
493 sctp_conn_hash_remove(sctp);
494 sctp_listen_hash_remove(sctp);
495 sctp->sctp_state = SCTPS_IDLE;
501 mutex_enter(&sctp->sctp_recvq_lock);
502 while ((mp = sctp->sctp_recvq) != NULL) {
503 sctp->sctp_recvq = mp->b_next;
511 mutex_exit(&sctp->sctp_recvq_lock);
515 * Free memory associated with the sctp/ip header template.
518 sctp_headers_free(sctp_t *sctp)
520 if (sctp->sctp_iphc != NULL) {
521 kmem_free(sctp->sctp_iphc, sctp->sctp_iphc_len);
522 sctp->sctp_iphc = NULL;
523 sctp->sctp_ipha = NULL;
524 sctp->sctp_hdr_len = 0;
525 sctp->sctp_ip_hdr_len = 0;
526 sctp->sctp_iphc_len = 0;
527 sctp->sctp_sctph = NULL;
528 sctp->sctp_hdr_len = 0;
530 if (sctp->sctp_iphc6 != NULL) {
531 kmem_free(sctp->sctp_iphc6, sctp->sctp_iphc6_len);
532 sctp->sctp_iphc6 = NULL;
533 sctp->sctp_ip6h = NULL;
534 sctp->sctp_hdr6_len = 0;
535 sctp->sctp_ip_hdr6_len = 0;
536 sctp->sctp_iphc6_len = 0;
537 sctp->sctp_sctph6 = NULL;
538 sctp->sctp_hdr6_len = 0;
543 sctp_free_xmit_data(sctp_t *sctp)
550 sctp->sctp_xmit_unacked = NULL;
551 ump = sctp->sctp_xmit_head;
552 sctp->sctp_xmit_tail = sctp->sctp_xmit_head = NULL;
568 if ((ump = sctp->sctp_xmit_unsent) == NULL) {
569 ASSERT(sctp->sctp_xmit_unsent_tail == NULL);
572 sctp->sctp_xmit_unsent = sctp->sctp_xmit_unsent_tail = NULL;
581 sctp_instream_cleanup(sctp_t *sctp, boolean_t free)
587 if (sctp->sctp_instr != NULL) {
589 for (i = 0; i < sctp->sctp_num_istr; i++) {
590 mp = sctp->sctp_instr[i].istr_msgs;
597 sctp->sctp_instr[i].istr_msgs = NULL;
598 sctp->sctp_instr[i].istr_nmsgs = 0;
599 sctp_free_reass((sctp->sctp_instr) + i);
600 sctp->sctp_instr[i].nextseq = 0;
603 kmem_free(sctp->sctp_instr,
604 sizeof (*sctp->sctp_instr) * sctp->sctp_num_istr);
605 sctp->sctp_instr = NULL;
606 sctp->sctp_num_istr = 0;
610 if (sctp->sctp_uo_frags != NULL) {
611 for (mp = sctp->sctp_uo_frags; mp != NULL; mp = mp1) {
616 sctp->sctp_uo_frags = NULL;
627 sctp_t *sctp = CONN2SCTP(connp);
629 sctp_stack_t *sctps = sctp->sctp_sctps;
633 SCTP_UNLINK(sctp, sctps);
637 ASSERT(!MUTEX_HELD(&sctp->sctp_reflock));
638 ASSERT(sctp->sctp_refcnt == 0);
640 ASSERT(sctp->sctp_ptpbhn == NULL && sctp->sctp_bind_hash == NULL);
641 ASSERT(sctp->sctp_conn_hash_next == NULL &&
642 sctp->sctp_conn_hash_prev == NULL);
647 /* blow away sctp stream management */
648 if (sctp->sctp_ostrcntrs != NULL) {
649 kmem_free(sctp->sctp_ostrcntrs,
650 sizeof (uint16_t) * sctp->sctp_num_ostr);
651 sctp->sctp_ostrcntrs = NULL;
653 sctp_instream_cleanup(sctp, B_TRUE);
656 sctp->sctp_istr_nmsgs = 0;
657 sctp->sctp_rxqueued = 0;
658 sctp_free_xmit_data(sctp);
659 sctp->sctp_unacked = 0;
660 sctp->sctp_unsent = 0;
661 if (sctp->sctp_cxmit_list != NULL)
662 sctp_asconf_free_cxmit(sctp, NULL);
664 sctp->sctp_lastdata = NULL;
667 sctp->sctp_def_stream = 0;
668 sctp->sctp_def_flags = 0;
669 sctp->sctp_def_ppid = 0;
670 sctp->sctp_def_context = 0;
671 sctp->sctp_def_timetolive = 0;
673 if (sctp->sctp_sack_info != NULL) {
674 sctp_free_set(sctp->sctp_sack_info);
675 sctp->sctp_sack_info = NULL;
677 sctp->sctp_sack_gaps = 0;
679 if (sctp->sctp_cookie_mp != NULL) {
680 freemsg(sctp->sctp_cookie_mp);
681 sctp->sctp_cookie_mp = NULL;
685 sctp_zap_addrs(sctp);
687 ASSERT(sctp->sctp_saddrs[cnt].ipif_count == 0);
688 list_destroy(&sctp->sctp_saddrs[cnt].sctp_ipif_list);
691 if (sctp->sctp_hopopts != NULL) {
692 mi_free(sctp->sctp_hopopts);
693 sctp->sctp_hopopts = NULL;
694 sctp->sctp_hopoptslen = 0;
696 ASSERT(sctp->sctp_hopoptslen == 0);
697 if (sctp->sctp_dstopts != NULL) {
698 mi_free(sctp->sctp_dstopts);
699 sctp->sctp_dstopts = NULL;
700 sctp->sctp_dstoptslen = 0;
702 ASSERT(sctp->sctp_dstoptslen == 0);
703 if (sctp->sctp_rthdrdstopts != NULL) {
704 mi_free(sctp->sctp_rthdrdstopts);
705 sctp->sctp_rthdrdstopts = NULL;
706 sctp->sctp_rthdrdstoptslen = 0;
708 ASSERT(sctp->sctp_rthdrdstoptslen == 0);
709 if (sctp->sctp_rthdr != NULL) {
710 mi_free(sctp->sctp_rthdr);
711 sctp->sctp_rthdr = NULL;
712 sctp->sctp_rthdrlen = 0;
714 ASSERT(sctp->sctp_rthdrlen == 0);
715 sctp_headers_free(sctp);
717 sctp->sctp_shutdown_faddr = NULL;
719 if (sctp->sctp_err_chunks != NULL) {
720 freemsg(sctp->sctp_err_chunks);
721 sctp->sctp_err_chunks = NULL;
722 sctp->sctp_err_len = 0;
726 bzero(&sctp->sctp_bits, sizeof (sctp->sctp_bits));
729 SCTPS_UPDATE_MIB(sctps, sctpOutSCTPPkts, sctp->sctp_opkts);
730 SCTPS_UPDATE_MIB(sctps, sctpOutCtrlChunks, sctp->sctp_obchunks);
731 SCTPS_UPDATE_MIB(sctps, sctpOutOrderChunks, sctp->sctp_odchunks);
732 SCTPS_UPDATE_MIB(sctps, sctpOutUnorderChunks, sctp->sctp_oudchunks);
733 SCTPS_UPDATE_MIB(sctps, sctpRetransChunks, sctp->sctp_rxtchunks);
734 SCTPS_UPDATE_MIB(sctps, sctpInSCTPPkts, sctp->sctp_ipkts);
735 SCTPS_UPDATE_MIB(sctps, sctpInCtrlChunks, sctp->sctp_ibchunks);
736 SCTPS_UPDATE_MIB(sctps, sctpInOrderChunks, sctp->sctp_idchunks);
737 SCTPS_UPDATE_MIB(sctps, sctpInUnorderChunks, sctp->sctp_iudchunks);
738 SCTPS_UPDATE_MIB(sctps, sctpFragUsrMsgs, sctp->sctp_fragdmsgs);
739 SCTPS_UPDATE_MIB(sctps, sctpReasmUsrMsgs, sctp->sctp_reassmsgs);
740 sctp->sctp_opkts = 0;
741 sctp->sctp_obchunks = 0;
742 sctp->sctp_odchunks = 0;
743 sctp->sctp_oudchunks = 0;
744 sctp->sctp_rxtchunks = 0;
745 sctp->sctp_ipkts = 0;
746 sctp->sctp_ibchunks = 0;
747 sctp->sctp_idchunks = 0;
748 sctp->sctp_iudchunks = 0;
749 sctp->sctp_fragdmsgs = 0;
750 sctp->sctp_reassmsgs = 0;
751 sctp->sctp_outseqtsns = 0;
752 sctp->sctp_osacks = 0;
753 sctp->sctp_isacks = 0;
754 sctp->sctp_idupchunks = 0;
755 sctp->sctp_gapcnt = 0;
756 sctp->sctp_cum_obchunks = 0;
757 sctp->sctp_cum_odchunks = 0;
758 sctp->sctp_cum_oudchunks = 0;
759 sctp->sctp_cum_rxtchunks = 0;
760 sctp->sctp_cum_ibchunks = 0;
761 sctp->sctp_cum_idchunks = 0;
762 sctp->sctp_cum_iudchunks = 0;
764 sctp->sctp_autoclose = 0;
765 sctp->sctp_tx_adaptation_code = 0;
767 sctp->sctp_v6label_len = 0;
768 sctp->sctp_v4label_len = 0;
770 sctp->sctp_sctps = NULL;
781 sctp_init_values(sctp_t *sctp, sctp_t *psctp, int sleep)
785 sctp_stack_t *sctps = sctp->sctp_sctps;
788 connp = sctp->sctp_connp;
790 sctp->sctp_nsaddrs = 0;
792 sctp->sctp_saddrs[cnt].ipif_count = 0;
793 list_create(&sctp->sctp_saddrs[cnt].sctp_ipif_list,
798 sctp->sctp_running = B_FALSE;
799 sctp->sctp_state = SCTPS_IDLE;
801 sctp->sctp_refcnt = 1;
803 sctp->sctp_strikes = 0;
805 sctp->sctp_last_mtu_probe = ddi_get_lbolt64();
806 sctp->sctp_mtu_probe_intvl = sctps->sctps_mtu_probe_interval;
808 sctp->sctp_sack_gaps = 0;
810 sctp->sctp_sack_toggle = sctps->sctps_deferred_acks_max;
813 if (sctp->sctp_pad_mp == NULL) {
815 sctp->sctp_pad_mp = allocb_wait(SCTP_ALIGN, BPRI_MED,
818 sctp->sctp_pad_mp = allocb(SCTP_ALIGN, BPRI_MED);
819 if (sctp->sctp_pad_mp == NULL)
822 bzero(sctp->sctp_pad_mp->b_rptr, SCTP_ALIGN);
836 sctp->sctp_upcalls = psctp->sctp_upcalls;
838 sctp->sctp_cookie_lifetime = psctp->sctp_cookie_lifetime;
840 sctp->sctp_cwnd_max = psctp->sctp_cwnd_max;
841 sctp->sctp_rwnd = psctp->sctp_rwnd;
842 sctp->sctp_arwnd = psctp->sctp_arwnd;
843 sctp->sctp_pd_point = psctp->sctp_pd_point;
844 sctp->sctp_rto_max = psctp->sctp_rto_max;
845 sctp->sctp_rto_max_init = psctp->sctp_rto_max_init;
846 sctp->sctp_rto_min = psctp->sctp_rto_min;
847 sctp->sctp_rto_initial = psctp->sctp_rto_initial;
848 sctp->sctp_pa_max_rxt = psctp->sctp_pa_max_rxt;
849 sctp->sctp_pp_max_rxt = psctp->sctp_pp_max_rxt;
850 sctp->sctp_max_init_rxt = psctp->sctp_max_init_rxt;
852 sctp->sctp_def_stream = psctp->sctp_def_stream;
853 sctp->sctp_def_flags = psctp->sctp_def_flags;
854 sctp->sctp_def_ppid = psctp->sctp_def_ppid;
855 sctp->sctp_def_context = psctp->sctp_def_context;
856 sctp->sctp_def_timetolive = psctp->sctp_def_timetolive;
858 sctp->sctp_num_istr = psctp->sctp_num_istr;
859 sctp->sctp_num_ostr = psctp->sctp_num_ostr;
861 sctp->sctp_hb_interval = psctp->sctp_hb_interval;
862 sctp->sctp_autoclose = psctp->sctp_autoclose;
863 sctp->sctp_tx_adaptation_code = psctp->sctp_tx_adaptation_code;
866 sctp->sctp_bound_to_all = psctp->sctp_bound_to_all;
867 sctp->sctp_cansleep = psctp->sctp_cansleep;
868 sctp->sctp_send_adaptation = psctp->sctp_send_adaptation;
869 sctp->sctp_ndelay = psctp->sctp_ndelay;
870 sctp->sctp_events = psctp->sctp_events;
875 sctp->sctp_cookie_lifetime =
881 sctp->sctp_cwnd_max = sctps->sctps_cwnd_max_;
882 sctp->sctp_rwnd = connp->conn_rcvbuf;
883 sctp->sctp_arwnd = connp->conn_rcvbuf;
884 sctp->sctp_pd_point = sctp->sctp_rwnd;
885 sctp->sctp_rto_max = MSEC_TO_TICK(sctps->sctps_rto_maxg);
886 sctp->sctp_rto_max_init = sctp->sctp_rto_max;
887 sctp->sctp_rto_min = MSEC_TO_TICK(sctps->sctps_rto_ming);
888 sctp->sctp_rto_initial = MSEC_TO_TICK(
890 sctp->sctp_pa_max_rxt = sctps->sctps_pa_max_retr;
891 sctp->sctp_pp_max_rxt = sctps->sctps_pp_max_retr;
892 sctp->sctp_max_init_rxt = sctps->sctps_max_init_retr;
894 sctp->sctp_num_istr = sctps->sctps_max_in_streams;
895 sctp->sctp_num_ostr = sctps->sctps_initial_out_streams;
897 sctp->sctp_hb_interval =
911 if ((err = sctp_build_hdrs(sctp, sleep)) != 0) {
916 sctp->sctp_understands_asconf = B_TRUE;
917 sctp->sctp_understands_addip = B_TRUE;
918 sctp->sctp_prsctp_aware = B_FALSE;
920 sctp->sctp_connp->conn_ref = 1;
922 sctp->sctp_prsctpdrop = 0;
923 sctp->sctp_msgcount = 0;
928 sctp_headers_free(sctp);
934 * the sctp's verification tag. Returns 0 if it doesn't match, 1 if
938 sctp_icmp_verf(sctp_t *sctp, sctp_hdr_t *sh, mblk_t *mp)
953 if (verf == sctp->sctp_lvtag) {
966 sctp_update_pmtu(sctp_t *sctp, sctp_faddr_t *fp, boolean_t decrease_only)
972 if (sctp->sctp_state < SCTPS_ESTABLISHED)
986 mss = pmtu - conn_ipsec_length(sctp->sctp_connp);
988 mss -= sctp->sctp_hdr_len;
990 mss -= sctp->sctp_hdr6_len;
1023 if (mss < sctp->sctp_sctps->sctps_mss_min)
1037 if (fp == sctp->sctp_current) {
1038 sctp->sctp_ipha->
1055 sctp_t *sctp = (sctp_t *)arg;
1061 for (fp = sctp->sctp_faddrs; fp != NULL; fp = fp->sf_next) {
1066 sctp_update_pmtu(sctp, fp, B_FALSE);
1082 sctp_icmp_error(sctp_t *sctp, mblk_t *mp)
1090 sctp_stack_t *sctps = sctp->sctp_sctps;
1092 dprint(1, ("sctp_icmp_error: sctp=%p, mp=%p\n", (void *)sctp,
1098 sctp_icmp_error_ipv6(sctp, mp);
1109 /* first_mp must expose the full sctp header. */
1139 fp = sctp_lookup_faddr(sctp, &dst);
1143 sctp_update_pmtu(sctp, fp, B_TRUE);
1152 sctp_rexmit(sctp, fp);
1156 switch (sctp->sctp_state) {
1160 if (!sctp_icmp_verf(sctp, sctph, mp)) {
1164 sctp_assoc_event(sctp, SCTP_CANT_STR_ASSOC, 0,
1166 sctp_clean_death(sctp, ECONNREFUSED);
1173 sctp->sctp_client_errno = (icmph->icmph_code ==
1195 sctp_icmp_error_ipv6(sctp_t *sctp, mblk_t *mp)
1203 sctp_stack_t *sctps = sctp->sctp_sctps;
1244 fp = sctp_lookup_faddr(sctp, &ip6h->ip6_dst);
1249 sctp_update_pmtu(sctp, fp, B_TRUE);
1258 sctp_rexmit(sctp, fp);
1265 if (!sctp_icmp_verf(sctp, sctpha, mp)) {
1268 if (sctp->sctp_state == SCTPS_COOKIE_WAIT ||
1269 sctp->sctp_state == SCTPS_COOKIE_ECHOED) {
1271 sctp_assoc_event(sctp, SCTP_CANT_STR_ASSOC, 0,
1273 sctp_clean_death(sctp, ECONNREFUSED);
1282 sctp->sctp_client_errno = EHOSTUNREACH;
1295 if (!sctp_icmp_verf(sctp, sctpha, mp)) {
1298 if (sctp->sctp_state == SCTPS_COOKIE_WAIT) {
1300 sctp_assoc_event(sctp, SCTP_CANT_STR_ASSOC, 0,
1302 sctp_clean_death(sctp, ECONNREFUSED);
1316 * Called by sockfs to create a new sctp instance.
1325 sctp_t *sctp, *psctp;
1375 sctp = CONN2SCTP(connp);
1376 sctp->sctp_sctps = sctps;
1378 if ((ack_mp = sctp_timer_alloc(sctp, sctp_ack_timer, sleep)) == NULL ||
1379 (hb_mp = sctp_timer_alloc(sctp, sctp_heartbeat_timer,
1384 sctp->sctp_sctps = NULL;
1389 sctp->sctp_ack_mp = ack_mp;
1390 sctp->sctp_heartbeat_mp = hb_mp;
1401 if (sctp_init_values(sctp, psctp, sleep) != 0) {
1405 sctp->sctp_sctps = NULL;
1409 sctp->sctp_cansleep = ((flags & SCTP_CAN_BLOCK) == SCTP_CAN_BLOCK);
1411 sctp->sctp_mss = sctps->sctps_initial_mtu - ((family == AF_INET6) ?
1412 sctp->sctp_hdr6_len : sctp->sctp_hdr_len);
1424 if (sctp_dup_saddrs(psctp, sctp, sleep)) {
1428 sctp_headers_free(sctp);
1430 sctp->sctp_sctps = NULL;
1441 sctp->sctp_state = SCTPS_BOUND;
1468 (void) random_get_pseudo_bytes((uint8_t *)&sctp->sctp_lvtag,
1469 sizeof (sctp->sctp_lvtag));
1470 if (sctp->sctp_lvtag == 0)
1471 sctp->sctp_lvtag = (uint32_t)gethrtime();
1472 ASSERT(sctp->sctp_lvtag != 0);
1474 sctp->sctp_ltsn = sctp->sctp_lvtag + 1;
1475 sctp->sctp_lcsn = sctp->sctp_ltsn;
1476 sctp->sctp_recovery_tsn = sctp->sctp_lastack_rxd = sctp->sctp_ltsn - 1;
1477 sctp->sctp_adv_pap = sctp->sctp_lastack_rxd;
1481 sctp->sctp_ulpd = ulpd;
1484 sctp->sctp_upcalls = upcalls;
1489 sbl->sbl_rxbuf = sctp->sctp_rwnd;
1493 SCTP_LINK(sctp, sctps);
1495 return (sctp);
1770 * taskqs until it can dispatch a job for the sctp. If this fails,
1774 sctp_find_next_tq(sctp_t *sctp)
1778 sctp_stack_t *sctps = sctp->sctp_sctps;
1790 if (taskq_dispatch(tq, sctp_process_recvq, sctp,
1792 sctp->sctp_recvq_tq = tq;
1806 if (taskq_dispatch(tq, sctp_process_recvq, sctp, TQ_NOSLEEP) != NULL) {
1807 sctp->sctp_recvq_tq = tq;
1829 sctp_add_recvq(sctp_t *sctp, mblk_t *mp, boolean_t caller_hold_lock,
1833 ip_stack_t *ipst = sctp->sctp_sctps->sctps_netstack->netstack_ip;
1838 mutex_enter(&sctp->sctp_recvq_lock);
1841 if (sctp->sctp_recvq_tq == NULL) {
1842 ASSERT(sctp->sctp_recvq == NULL);
1843 if (!sctp_find_next_tq(sctp)) {
1845 mutex_exit(&sctp->sctp_recvq_lock);
1852 SCTP_REFHOLD(sctp);
1858 mutex_exit(&sctp->sctp_recvq_lock);
1868 if (sctp->sctp_recvq == NULL) {
1869 sctp->sctp_recvq = mp;
1870 sctp->sctp_recvq_tail = mp;
1872 sctp->sctp_recvq_tail->b_next = mp;
1873 sctp->sctp_recvq_tail = mp;
1877 mutex_exit(&sctp->sctp_recvq_lock);
1883 sctp_t *sctp = (sctp_t *)arg;
1896 RUN_SCTP(sctp);
1897 mutex_enter(&sctp->sctp_recvq_lock);
1907 while ((mp = sctp->sctp_recvq) != NULL) {
1910 sctp->sctp_recvq = mp->b_next;
1911 mutex_exit(&sctp->sctp_recvq_lock);
1928 sctp_icmp_error(sctp, data_mp);
1930 sctp_input_data(sctp, data_mp, &iras);
1933 mutex_enter(&sctp->sctp_recvq_lock);
1936 sctp->sctp_recvq_tail = NULL;
1937 sctp->sctp_recvq_tq = NULL;
1939 mutex_exit(&sctp->sctp_recvq_lock);
1941 WAKE_SCTP(sctp);
1948 SCTP_REFRELE(sctp);
1956 sctp_t *sctp = (sctp_t *)&connp[1];
1960 bzero(buf, (char *)&sctp[1] - (char *)buf);
1962 mutex_init(&sctp->sctp_reflock, NULL, MUTEX_DEFAULT, NULL);
1963 mutex_init(&sctp->sctp_lock, NULL, MUTEX_DEFAULT, NULL);
1964 mutex_init(&sctp->sctp_recvq_lock, NULL, MUTEX_DEFAULT, NULL);
1965 cv_init(&sctp->sctp_cv, NULL, CV_DEFAULT, NULL);
1967 rw_init(&sctp->sctp_saddrs[cnt].ipif_hash_lock, NULL,
1975 connp->conn_sctp = sctp;
1976 sctp->sctp_connp = connp;
1994 sctp_t *sctp = (sctp_t *)&connp[1];
1997 ASSERT(sctp->sctp_connp == connp);
1998 ASSERT(!MUTEX_HELD(&sctp->sctp_lock));
1999 ASSERT(!MUTEX_HELD(&sctp->sctp_reflock));
2000 ASSERT(!MUTEX_HELD(&sctp->sctp_recvq_lock));
2002 ASSERT(sctp->sctp_conn_hash_next == NULL);
2003 ASSERT(sctp->sctp_conn_hash_prev == NULL);
2004 ASSERT(sctp->sctp_listen_hash_next == NULL);
2005 ASSERT(sctp->sctp_listen_hash_prev == NULL);
2006 ASSERT(sctp->sctp_listen_tfp == NULL);
2007 ASSERT(sctp->sctp_conn_tfp == NULL);
2009 ASSERT(sctp->sctp_faddrs == NULL);
2010 ASSERT(sctp->sctp_nsaddrs == 0);
2012 ASSERT(sctp->sctp_ulpd == NULL);
2014 ASSERT(sctp->sctp_lastfaddr == NULL);
2015 ASSERT(sctp->sctp_primary == NULL);
2016 ASSERT(sctp->sctp_current == NULL);
2017 ASSERT(sctp->sctp_lastdata == NULL);
2019 ASSERT(sctp->sctp_xmit_head == NULL);
2020 ASSERT(sctp->sctp_xmit_tail == NULL);
2021 ASSERT(sctp->sctp_xmit_unsent == NULL);
2022 ASSERT(sctp->sctp_xmit_unsent_tail == NULL);
2024 ASSERT(sctp->sctp_ostrcntrs == NULL);
2026 ASSERT(sctp->sctp_sack_info == NULL);
2027 ASSERT(sctp->sctp_ack_mp == NULL);
2028 ASSERT(sctp->sctp_instr == NULL);
2030 ASSERT(sctp->sctp_iphc == NULL);
2031 ASSERT(sctp->sctp_iphc6 == NULL);
2032 ASSERT(sctp->sctp_ipha == NULL);
2033 ASSERT(sctp->sctp_ip6h == NULL);
2034 ASSERT(sctp->sctp_sctph == NULL);
2035 ASSERT(sctp->sctp_sctph6 == NULL);
2037 ASSERT(sctp->sctp_cookie_mp == NULL);
2039 ASSERT(sctp->sctp_refcnt == 0);
2040 ASSERT(sctp->sctp_timer_mp == NULL);
2041 ASSERT(sctp->sctp_connp->conn_ref == 0);
2042 ASSERT(sctp->sctp_heartbeat_mp == NULL);
2043 ASSERT(sctp->sctp_ptpbhn == NULL && sctp->sctp_bind_hash == NULL);
2045 ASSERT(sctp->sctp_shutdown_faddr == NULL);
2047 ASSERT(sctp->sctp_cxmit_list == NULL);
2049 ASSERT(sctp->sctp_recvq == NULL);
2050 ASSERT(sctp->sctp_recvq_tail == NULL);
2051 ASSERT(sctp->sctp_recvq_tq == NULL);
2057 if (sctp->sctp_pad_mp != NULL) {
2058 freeb(sctp->sctp_pad_mp);
2059 sctp->sctp_pad_mp = NULL;
2062 mutex_destroy(&sctp->sctp_reflock);
2063 mutex_destroy(&sctp->sctp_lock);
2064 mutex_destroy(&sctp->sctp_recvq_lock);
2065 cv_destroy(&sctp->sctp_cv);
2067 rw_destroy(&sctp->sctp_saddrs[cnt].ipif_hash_lock);
2114 * thus it holds whatever locks sctp holds across conn_ip_output.