Lines Matching defs:sctp

40 #include <netinet/sctp.h>
63 sctp_set_saddr(sctp_t *sctp, sctp_faddr_t *fp)
68 fp->sf_saddr = sctp_get_valid_addr(sctp, v6, &addr_set);
86 sctp_get_dest(sctp_t *sctp, sctp_faddr_t *fp)
92 sctp_stack_t *sctps = sctp->sctp_sctps;
93 conn_t *connp = sctp->sctp_connp;
136 * this sctp has bound to all addrs. So if the dest
138 * list, unless the sctp has bound to all addrs, in
148 sctp_set_saddr(sctp, fp);
156 if (!sctp->sctp_loopback)
157 sctp->sctp_loopback = uinfo.iulp_loopback;
160 if ((sp = sctp_saddr_lookup(sctp, &laddr, 0)) != NULL &&
177 sctp_set_saddr(sctp, fp);
194 if (fp->sf_rto < sctp->sctp_rto_min) {
195 fp->sf_rto = sctp->sctp_rto_min;
197 if (fp->sf_rto > sctp->sctp_rto_max) {
198 fp->sf_rto = sctp->sctp_rto_max;
200 SCTP_MAX_RTO(sctp, fp);
209 hdrlen = sctp->sctp_hdr_len;
211 hdrlen = sctp->sctp_hdr6_len;
223 if (fp == sctp->sctp_current)
224 sctp_set_faddr_current(sctp, fp);
228 sctp_update_dce(sctp_t *sctp)
231 sctp_stack_t *sctps = sctp->sctp_sctps;
236 for (fp = sctp->sctp_faddrs; fp != NULL; fp = fp->sf_next) {
246 sctp->sctp_hdr_len;
249 sctp->sctp_hdr6_len;
284 sctp_make_mp(sctp_t *sctp, sctp_faddr_t *fp, int trailer)
289 sctp_stack_t *sctps = sctp->sctp_sctps;
298 sctp_get_dest(sctp, fp);
315 ipsctplen = sctp->sctp_hdr_len;
317 ipsctplen = sctp->sctp_hdr6_len;
333 bcopy(sctp->sctp_iphc, mp->b_rptr, ipsctplen);
334 if (fp != sctp->sctp_current || src_changed) {
346 bcopy(sctp->sctp_iphc6, mp->b_rptr, ipsctplen);
347 if (fp != sctp->sctp_current || src_changed) {
353 ASSERT(sctp->sctp_connp != NULL);
361 sctp_set_ulp_prop(sctp_t *sctp)
366 sctp_stack_t *sctps = sctp->sctp_sctps;
368 if (sctp->sctp_current->sf_isv4) {
369 hdrlen = sctp->sctp_hdr_len;
371 hdrlen = sctp->sctp_hdr6_len;
373 ASSERT(sctp->sctp_ulpd);
375 sctp->sctp_connp->conn_wroff = sctps->sctps_wroff_xtra + hdrlen +
378 ASSERT(sctp->sctp_current->sf_pmss == sctp->sctp_mss);
381 sopp.sopp_wroff = sctp->sctp_connp->conn_wroff;
382 sopp.sopp_maxblk = sctp->sctp_mss - sizeof (sctp_data_hdr_t);
383 sctp->sctp_ulp_prop(sctp->sctp_ulpd, &sopp);
390 sctp_set_iplen(sctp_t *sctp, mblk_t *mp, ip_xmit_attr_t *ixa)
406 ixa->ixa_ip_hdr_length = sctp->sctp_ip_hdr_len;
410 ixa->ixa_ip_hdr_length = sctp->sctp_ip_hdr6_len;
463 sctp_add_faddr(sctp_t *sctp, in6_addr_t *addr, int sleep, boolean_t first)
468 conn_t *connp = sctp->sctp_connp;
503 if (sctp->sctp_faddrs == NULL && effective_tsl != NULL) {
514 timer_mp = sctp_timer_alloc((sctp), sctp_rexmit_timer, sleep);
530 sctp_init_faddr(sctp, faddr, addr, timer_mp);
536 if (sctp->sctp_faddrs == NULL) {
537 ASSERT(sctp->sctp_lastfaddr == NULL);
539 sctp->sctp_faddrs = sctp->sctp_lastfaddr = faddr;
541 ASSERT(sctp->sctp_lastfaddr != NULL);
542 faddr->sf_next = sctp->sctp_faddrs;
543 sctp->sctp_faddrs = faddr;
545 sctp->sctp_lastfaddr->sf_next = faddr;
546 sctp->sctp_lastfaddr = faddr;
548 sctp->sctp_nfaddrs++;
554 sctp_lookup_faddr(sctp_t *sctp, in6_addr_t *addr)
558 for (fp = sctp->sctp_faddrs; fp != NULL; fp = fp->sf_next) {
582 sctp_set_faddr_current(sctp_t *sctp, sctp_faddr_t *fp)
587 sctp->sctp_ipha->ipha_dst);
589 sctp->sctp_ipha->ipha_src);
592 sctp->sctp_ipha->ipha_fragment_offset_and_flags =
595 sctp->sctp_ipha->ipha_fragment_offset_and_flags = 0;
598 sctp->sctp_ip6h->ip6_dst = fp->sf_faddr;
599 sctp->sctp_ip6h->ip6_src = fp->sf_saddr;
602 sctp->sctp_current = fp;
603 sctp->sctp_mss = fp->sf_pmss;
606 if (!SCTP_IS_DETACHED(sctp))
607 sctp_set_ulp_prop(sctp);
611 sctp_redo_faddr_srcs(sctp_t *sctp)
615 for (fp = sctp->sctp_faddrs; fp != NULL; fp = fp->sf_next) {
616 sctp_get_dest(sctp, fp);
621 sctp_faddr_alive(sctp_t *sctp, sctp_faddr_t *fp)
632 if (!sctp->sctp_zero_win_probe || !sctp->sctp_sctps->sctps_reclaim) {
633 sctp->sctp_strikes = 0;
641 sctp_intf_event(sctp, fp->sf_faddr, SCTP_ADDR_AVAILABLE, 0);
643 sctp_get_dest(sctp, fp);
652 if (fp == sctp->sctp_primary &&
654 sctp_set_faddr_current(sctp, fp);
665 sctp_is_a_faddr_clean(sctp_t *sctp)
669 for (fp = sctp->sctp_faddrs; fp; fp = fp->sf_next) {
686 sctp_faddr_dead(sctp_t *sctp, sctp_faddr_t *fp, int newstate)
689 sctp_stack_t *sctps = sctp->sctp_sctps;
692 sctp_intf_event(sctp, fp->sf_faddr, SCTP_ADDR_UNREACHABLE, 0);
699 if (fp == sctp->sctp_current) {
701 sctp->sctp_current = NULL;
714 for (fp = sctp->sctp_faddrs; fp != ofp; fp = fp->sf_next) {
726 if (sctp->sctp_current == NULL) {
733 sctp_set_faddr_current(sctp, fp);
742 sctp_assoc_event(sctp, sctp->sctp_state < SCTPS_ESTABLISHED ?
744 sctp_clean_death(sctp, sctp->sctp_client_errno ?
745 sctp->sctp_client_errno : ETIMEDOUT);
751 sctp_rotate_faddr(sctp_t *sctp, sctp_faddr_t *ofp)
758 ofp = sctp->sctp_current;
761 if (sctp->sctp_nfaddrs < 2)
773 nfp = sctp->sctp_faddrs;
803 sctp_unlink_faddr(sctp_t *sctp, sctp_faddr_t *fp)
807 if (!sctp->sctp_faddrs) {
826 if (fp == sctp->sctp_faddrs) {
830 for (fpp = sctp->sctp_faddrs; fpp->sf_next != fp; fpp = fpp->sf_next)
834 ASSERT(sctp->sctp_conn_tfp != NULL);
835 mutex_enter(&sctp->sctp_conn_tfp->tf_lock);
836 if (fp == sctp->sctp_faddrs) {
837 sctp->sctp_faddrs = fp->sf_next;
841 mutex_exit(&sctp->sctp_conn_tfp->tf_lock);
843 sctp->sctp_nfaddrs--;
847 sctp_zap_faddrs(sctp_t *sctp, int caller_holds_lock)
851 if (sctp->sctp_faddrs == NULL) {
852 ASSERT(sctp->sctp_lastfaddr == NULL);
856 ASSERT(sctp->sctp_lastfaddr != NULL);
857 sctp->sctp_lastfaddr = NULL;
858 sctp->sctp_current = NULL;
859 sctp->sctp_primary = NULL;
861 sctp_free_faddr_timers(sctp);
863 if (sctp->sctp_conn_tfp != NULL && !caller_holds_lock) {
865 mutex_enter(&sctp->sctp_conn_tfp->tf_lock);
868 for (fp = sctp->sctp_faddrs; fp; fp = fpn) {
875 sctp->sctp_nfaddrs--;
878 sctp->sctp_faddrs = NULL;
879 ASSERT(sctp->sctp_nfaddrs == 0);
880 if (sctp->sctp_conn_tfp != NULL && !caller_holds_lock) {
881 mutex_exit(&sctp->sctp_conn_tfp->tf_lock);
887 sctp_zap_addrs(sctp_t *sctp)
889 sctp_zap_faddrs(sctp, 0);
890 sctp_free_saddrs(sctp);
902 * We allocate space for the minimum sctp header (sctp_hdr_t).
905 * for a routing header for sctp.
914 sctp_build_hdrs(sctp_t *sctp, int sleep)
916 conn_t *connp = sctp->sctp_connp;
944 if (hdrs_len != sctp->sctp_iphc_len) {
950 if (sctp->sctp_iphc != NULL)
951 kmem_free(sctp->sctp_iphc, sctp->sctp_iphc_len);
952 sctp->sctp_iphc = hdrs;
953 sctp->sctp_iphc_len = hdrs_len;
955 hdrs = sctp->sctp_iphc;
957 sctp->sctp_hdr_len = sctp->sctp_iphc_len;
958 sctp->sctp_ip_hdr_len = ip_hdr_length;
961 sctp->sctp_sctph = sctph;
964 sctph->sh_verf = sctp->sctp_fvtag;
968 sctp->sctp_ipha = ipha;
984 if (hdrs_len != sctp->sctp_iphc6_len) {
990 if (sctp->sctp_iphc6 != NULL)
991 kmem_free(sctp->sctp_iphc6, sctp->sctp_iphc6_len);
992 sctp->sctp_iphc6 = hdrs;
993 sctp->sctp_iphc6_len = hdrs_len;
995 hdrs = sctp->sctp_iphc6;
997 sctp->sctp_hdr6_len = sctp->sctp_iphc6_len;
998 sctp->sctp_ip_hdr6_len = ip_hdr_length;
1001 sctp->sctp_sctph6 = sctph;
1004 sctph->sh_verf = sctp->sctp_fvtag;
1008 sctp->sctp_ip6h = ip6h;
1039 sctp_v4_label(sctp_t *sctp, sctp_faddr_t *fp)
1041 conn_t *connp = sctp->sctp_connp;
1049 sctp_v6_label(sctp_t *sctp, sctp_faddr_t *fp)
1051 conn_t *connp = sctp->sctp_connp;
1067 sctp_set_hdraddrs(sctp_t *sctp)
1072 conn_t *connp = sctp->sctp_connp;
1074 ASSERT(sctp->sctp_faddrs != NULL);
1075 ASSERT(sctp->sctp_nsaddrs > 0);
1078 connp->conn_faddr_v6 = sctp->sctp_primary->sf_faddr;
1080 connp->conn_saddr_v6 = sctp->sctp_primary->sf_saddr;
1082 if (IN6_IS_ADDR_V4MAPPED(&sctp->sctp_primary->sf_faddr)) {
1084 sctp_v4_label(sctp, sctp->sctp_primary) == 0) {
1092 sctp_v6_label(sctp, sctp->sctp_primary) == 0) {
1097 for (fp = sctp->sctp_faddrs; fp; fp = fp->sf_next) {
1100 sctp_v4_label(sctp, fp) == 0) {
1108 sctp_v6_label(sctp, fp) == 0) {
1211 * Sets the address parameters given in the INIT chunk into sctp's
1215 * If there already are existing addresses hanging from sctp, merge
1254 sctp_get_addrparams(sctp_t *sctp, sctp_t *psctp, mblk_t *pkt,
1270 sctp_stack_t *sctps = sctp->sctp_sctps;
1271 conn_t *connp = sctp->sctp_connp;
1299 ASSERT(sctp->sctp_nsaddrs == 0);
1301 err = sctp_dup_saddrs(psctp, sctp, KM_NOSLEEP);
1312 fp = sctp_lookup_faddr(sctp, hdrsaddr);
1315 err = sctp_add_faddr(sctp, hdrsaddr, KM_NOSLEEP, B_TRUE);
1320 fp = sctp->sctp_faddrs;
1325 curaddr = sctp->sctp_current->sf_faddr;
1327 sctp->sctp_primary = fp;
1328 sctp->sctp_current = fp;
1329 sctp->sctp_mss = fp->sf_pmss;
1332 if (sctp->sctp_loopback || sctp->sctp_linklocal) {
1333 if (sctp->sctp_nsaddrs != 0)
1334 sctp_free_saddrs(sctp);
1335 if ((err = sctp_saddr_add_addr(sctp, hdrdaddr, 0)) != 0)
1338 if (sctp->sctp_loopback)
1348 sctp_check_saddr(sctp, supp_af, psctp == NULL ?
1351 ASSERT(sctp_saddr_lookup(sctp, hdrdaddr, 0) != NULL);
1409 if (sctp_lookup_faddr(sctp, &addr) != NULL)
1413 err = sctp_add_faddr(sctp, &addr, KM_NOSLEEP,
1438 if (sctp_lookup_faddr(sctp, addr6) != NULL)
1441 err = sctp_add_faddr(sctp,
1457 sctp_check_saddr(sctp, supp_af, psctp == NULL ? B_FALSE :
1460 ASSERT(sctp_saddr_lookup(sctp, hdrdaddr, 0) != NULL);
1472 asize = sizeof (in6_addr_t) * sctp->sctp_nfaddrs;
1494 sctp_get_faddr_list(sctp, alist, asize);
1496 sctp->sctp_nfaddrs, dlist, dsize, 1, SCTP_CL_PADDR,
1497 (cl_sctp_handle_t)sctp);
1520 sctp_t *sctp;
1612 * Now, we can finally do the check: For each sctp instance
1615 * existing sctp's faddrs, the restart is OK. However, if there
1617 * If all sctp's faddrs are disjoint, this is a legitimate new
1623 for (sctp = tf->tf_sctp; sctp; sctp = sctp->sctp_conn_hash_next) {
1624 if (ports != sctp->sctp_connp->conn_ports) {
1627 compres = sctp_compare_faddrsets(fphead, sctp->sctp_faddrs);
1636 SCTP_PRINTADDR(*hdraddr), (void *)sctp));
1647 if (sctp_lookup_faddr(sctp, &fp->sf_faddr)) {
1703 sctp_send_abort(sctp, sctp_init2vtag(ich),
1731 sctp_congest_reset(sctp_t *sctp)
1734 sctp_stack_t *sctps = sctp->sctp_sctps;
1737 for (fp = sctp->sctp_faddrs; fp != NULL; fp = fp->sf_next) {
1747 while ((mp = sctp->sctp_xmit_head) != NULL) {
1748 sctp->sctp_xmit_head = mp->b_next;
1750 if (sctp->sctp_xmit_head != NULL)
1751 sctp->sctp_xmit_head->b_prev = NULL;
1752 sctp_sendfail_event(sctp, mp, 0, B_TRUE);
1754 sctp->sctp_xmit_head = NULL;
1755 sctp->sctp_xmit_tail = NULL;
1756 sctp->sctp_xmit_unacked = NULL;
1758 sctp->sctp_unacked = 0;
1765 if (sctp->sctp_cxmit_list != NULL)
1766 sctp_asconf_free_cxmit(sctp, NULL);
1767 sctp->sctp_cxmit_list = NULL;
1768 sctp->sctp_cchunk_pend = 0;
1770 sctp->sctp_rexmitting = B_FALSE;
1771 sctp->sctp_rxt_nxttsn = 0;
1772 sctp->sctp_rxt_maxtsn = 0;
1774 sctp->sctp_zero_win_probe = B_FALSE;
1778 sctp_init_faddr(sctp_t *sctp, sctp_faddr_t *fp, in6_addr_t *addr,
1781 sctp_stack_t *sctps = sctp->sctp_sctps;
1790 (sctps->sctps_initial_mtu - sctp->sctp_hdr_len) &
1796 (sctps->sctps_initial_mtu - sctp->sctp_hdr6_len) &
1801 fp->sf_rto = MIN(sctp->sctp_rto_initial, sctp->sctp_rto_max_init);
1802 SCTP_MAX_RTO(sctp, fp);
1806 fp->sf_max_retr = sctp->sctp_pp_max_rxt;
1809 fp->sf_hb_interval = sctp->sctp_hb_interval;
1826 sctp_get_dest(sctp, fp);