Lines Matching refs:tcp
280 static int tcp_connect_ipv4(tcp_t *tcp, ipaddr_t *dstaddrp,
282 static int tcp_connect_ipv6(tcp_t *tcp, in6_addr_t *dstaddrp,
285 static void tcp_iss_init(tcp_t *tcp);
286 static void tcp_reinit(tcp_t *tcp);
287 static void tcp_reinit_values(tcp_t *tcp);
290 static void tcp_update_lso(tcp_t *tcp, ip_xmit_attr_t *ixa);
291 static void tcp_update_zcopy(tcp_t *tcp);
422 tcp_set_recv_threshold(tcp_t *tcp, uint32_t new_rcvthresh) in tcp_set_recv_threshold() argument
426 if (IPCL_IS_NONSTR(tcp->tcp_connp)) { in tcp_set_recv_threshold()
427 conn_t *connp = tcp->tcp_connp; in tcp_set_recv_threshold()
453 tcp_set_ws_value(tcp_t *tcp) in tcp_set_ws_value() argument
456 uint32_t rwnd = tcp->tcp_rwnd; in tcp_set_ws_value()
461 tcp->tcp_rcv_ws = i; in tcp_set_ws_value()
468 tcp_ipsec_cleanup(tcp_t *tcp) in tcp_ipsec_cleanup() argument
470 conn_t *connp = tcp->tcp_connp; in tcp_ipsec_cleanup()
498 tcp_cleanup(tcp_t *tcp) in tcp_cleanup() argument
501 conn_t *connp = tcp->tcp_connp; in tcp_cleanup()
502 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_cleanup()
506 tcp_bind_hash_remove(tcp); in tcp_cleanup()
509 tcp_ipsec_cleanup(tcp); in tcp_cleanup()
519 tcp->tcp_ipha = NULL; in tcp_cleanup()
520 tcp->tcp_ip6h = NULL; in tcp_cleanup()
521 tcp->tcp_tcpha = NULL; in tcp_cleanup()
527 tcp_free(tcp); in tcp_cleanup()
541 mp = tcp->tcp_timercache; in tcp_cleanup()
543 tcp_rsrv_mp = tcp->tcp_rsrv_mp; in tcp_cleanup()
561 tcp->tcp_tcps = NULL; in tcp_cleanup()
563 bzero(tcp, sizeof (tcp_t)); in tcp_cleanup()
566 tcp->tcp_timercache = mp; in tcp_cleanup()
568 tcp->tcp_rsrv_mp = tcp_rsrv_mp; in tcp_cleanup()
570 tcp->tcp_connp = connp; in tcp_cleanup()
572 ASSERT(connp->conn_tcp == tcp); in tcp_cleanup()
608 tcp_set_destination(tcp_t *tcp) in tcp_set_destination() argument
612 boolean_t tcp_detached = TCP_IS_DETACHED(tcp); in tcp_set_destination()
613 conn_t *connp = tcp->tcp_connp; in tcp_set_destination()
614 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_set_destination()
636 error = tcp_build_hdrs(tcp); in tcp_set_destination()
640 tcp->tcp_localnet = uinfo.iulp_localnet; in tcp_set_destination()
645 tcp->tcp_rtt_sa = uinfo.iulp_rtt; in tcp_set_destination()
646 tcp->tcp_rtt_sd = uinfo.iulp_rtt_sd; in tcp_set_destination()
647 rto = (tcp->tcp_rtt_sa >> 3) + tcp->tcp_rtt_sd + in tcp_set_destination()
649 (tcp->tcp_rtt_sa >> 5); in tcp_set_destination()
651 TCP_SET_RTO(tcp, rto); in tcp_set_destination()
654 tcp->tcp_cwnd_ssthresh = uinfo.iulp_ssthresh; in tcp_set_destination()
656 tcp->tcp_cwnd_ssthresh = TCP_MAX_LARGEWIN; in tcp_set_destination()
664 (void) tcp_maxpsz_set(tcp, B_TRUE); in tcp_set_destination()
674 tcp->tcp_rwnd = MIN(uinfo.iulp_rpipe, in tcp_set_destination()
679 tcp->tcp_second_timer_threshold = in tcp_set_destination()
706 tcp->tcp_snd_ts_ok = B_TRUE; in tcp_set_destination()
708 tcp->tcp_snd_ws_ok = B_TRUE; in tcp_set_destination()
710 tcp->tcp_snd_sack_ok = B_TRUE; in tcp_set_destination()
712 tcp->tcp_ecn_ok = B_TRUE; in tcp_set_destination()
721 tcp->tcp_snd_sack_ok = B_TRUE; in tcp_set_destination()
740 mss = tcp->tcp_initial_pmtu = uinfo.iulp_mtu; in tcp_set_destination()
748 if (tcp->tcp_ipsec_overhead == 0) in tcp_set_destination()
749 tcp->tcp_ipsec_overhead = conn_ipsec_length(connp); in tcp_set_destination()
751 mss -= tcp->tcp_ipsec_overhead; in tcp_set_destination()
759 tcp->tcp_mss = mss; in tcp_set_destination()
764 tcp_update_lso(tcp, connp->conn_ixa); in tcp_set_destination()
771 tcp_iss_init(tcp); in tcp_set_destination()
773 tcp->tcp_loopback = (uinfo.iulp_loopback | uinfo.iulp_local); in tcp_set_destination()
799 tcp_t *tcp = ((conn_t *)arg)->conn_tcp; in tcp_clean_death_wrapper() local
802 if (tcp->tcp_state > TCPS_BOUND) in tcp_clean_death_wrapper()
816 tcp_clean_death(tcp_t *tcp, int err) in tcp_clean_death() argument
820 conn_t *connp = tcp->tcp_connp; in tcp_clean_death()
821 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_clean_death()
823 if (tcp->tcp_fused) in tcp_clean_death()
824 tcp_unfuse(tcp); in tcp_clean_death()
826 if (tcp->tcp_linger_tid != 0 && in tcp_clean_death()
827 TCP_TIMER_CANCEL(tcp, tcp->tcp_linger_tid) >= 0) { in tcp_clean_death()
828 tcp_stop_lingering(tcp); in tcp_clean_death()
831 ASSERT(tcp != NULL); in tcp_clean_death()
838 if (TCP_IS_DETACHED(tcp)) { in tcp_clean_death()
839 if (tcp->tcp_hard_binding) { in tcp_clean_death()
852 tcp_closei_local(tcp); in tcp_clean_death()
853 if (!tcp->tcp_tconnind_started) { in tcp_clean_death()
856 tcp->tcp_state = TCPS_BOUND; in tcp_clean_death()
859 void, NULL, tcp_t *, tcp, void, NULL, in tcp_clean_death()
863 tcp_close_detached(tcp); in tcp_clean_death()
874 if (tcp->tcp_listen_cnt != NULL) in tcp_clean_death()
875 TCP_DECR_LISTEN_CNT(tcp); in tcp_clean_death()
882 if (tcp->tcp_state >= TCPS_ESTABLISHED && in tcp_clean_death()
883 tcp->tcp_state < TCPS_TIME_WAIT) { in tcp_clean_death()
900 if ((tcp->tcp_state >= TCPS_SYN_SENT) && err) { in tcp_clean_death()
901 if (tcp->tcp_state >= TCPS_ESTABLISHED && in tcp_clean_death()
902 !TCP_IS_SOCKET(tcp)) { in tcp_clean_death()
917 connp->conn_upper_handle, tcp->tcp_connid, err); in tcp_clean_death()
931 if (tcp->tcp_state <= TCPS_SYN_RCVD) { in tcp_clean_death()
934 } else if (tcp->tcp_state <= TCPS_CLOSE_WAIT) { in tcp_clean_death()
946 if (tcp->tcp_listener != NULL && IPCL_IS_NONSTR(connp)) { in tcp_clean_death()
947 tcp_closei_local(tcp); in tcp_clean_death()
948 tcp->tcp_state = TCPS_BOUND; in tcp_clean_death()
950 connp->conn_ixa, void, NULL, tcp_t *, tcp, void, NULL, in tcp_clean_death()
955 tcp_reinit(tcp); in tcp_clean_death()
967 tcp_stop_lingering(tcp_t *tcp) in tcp_stop_lingering() argument
970 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_stop_lingering()
971 conn_t *connp = tcp->tcp_connp; in tcp_stop_lingering()
973 tcp->tcp_linger_tid = 0; in tcp_stop_lingering()
974 if (tcp->tcp_state > TCPS_LISTEN) { in tcp_stop_lingering()
975 tcp_acceptor_hash_remove(tcp); in tcp_stop_lingering()
976 mutex_enter(&tcp->tcp_non_sq_lock); in tcp_stop_lingering()
977 if (tcp->tcp_flow_stopped) { in tcp_stop_lingering()
978 tcp_clrqfull(tcp); in tcp_stop_lingering()
980 mutex_exit(&tcp->tcp_non_sq_lock); in tcp_stop_lingering()
982 if (tcp->tcp_timer_tid != 0) { in tcp_stop_lingering()
983 delta = TCP_TIMER_CANCEL(tcp, tcp->tcp_timer_tid); in tcp_stop_lingering()
984 tcp->tcp_timer_tid = 0; in tcp_stop_lingering()
991 tcp_timers_stop(tcp); in tcp_stop_lingering()
993 tcp->tcp_detached = B_TRUE; in tcp_stop_lingering()
997 if (tcp->tcp_state == TCPS_TIME_WAIT) { in tcp_stop_lingering()
998 tcp_time_wait_append(tcp); in tcp_stop_lingering()
1009 tcp->tcp_timer_tid = TCP_TIMER(tcp, tcp_timer, in tcp_stop_lingering()
1013 tcp_closei_local(tcp); in tcp_stop_lingering()
1017 tcp->tcp_detached = B_TRUE; in tcp_stop_lingering()
1022 mutex_enter(&tcp->tcp_closelock); in tcp_stop_lingering()
1023 tcp->tcp_closed = 1; in tcp_stop_lingering()
1024 cv_signal(&tcp->tcp_closecv); in tcp_stop_lingering()
1025 mutex_exit(&tcp->tcp_closelock); in tcp_stop_lingering()
1039 tcp_t *tcp = connp->conn_tcp; in tcp_close_common() local
1040 mblk_t *mp = &tcp->tcp_closemp; in tcp_close_common()
1057 tcp->tcp_closeflags = (uint8_t)flags; in tcp_close_common()
1067 tcp->tcp_closemp_used = B_TRUE; in tcp_close_common()
1070 "connp %p tcp %p\n", (void *)connp, (void *)tcp); in tcp_close_common()
1072 TCP_DEBUG_GETPCSTACK(tcp->tcmp_stk, 15); in tcp_close_common()
1108 mutex_enter(&tcp->tcp_closelock); in tcp_close_common()
1109 while (!tcp->tcp_closed) { in tcp_close_common()
1110 if (!cv_wait_sig(&tcp->tcp_closecv, &tcp->tcp_closelock)) { in tcp_close_common()
1127 mutex_exit(&tcp->tcp_closelock); in tcp_close_common()
1134 mutex_enter(&tcp->tcp_closelock); in tcp_close_common()
1139 while (!tcp->tcp_closed) in tcp_close_common()
1140 cv_wait(&tcp->tcp_closecv, &tcp->tcp_closelock); in tcp_close_common()
1141 mutex_exit(&tcp->tcp_closelock); in tcp_close_common()
1154 if (tcp->tcp_wait_for_eagers && !IPCL_IS_NONSTR(connp)) { in tcp_close_common()
1176 tcp_t *tcp = connp->conn_tcp; in tcp_linger_interrupted() local
1179 if (tcp->tcp_linger_tid != 0 && in tcp_linger_interrupted()
1180 TCP_TIMER_CANCEL(tcp, tcp->tcp_linger_tid) >= 0) { in tcp_linger_interrupted()
1181 tcp_stop_lingering(tcp); in tcp_linger_interrupted()
1182 tcp->tcp_client_errno = EINTR; in tcp_linger_interrupted()
1209 tcp_close_detached(tcp_t *tcp) in tcp_close_detached() argument
1211 if (tcp->tcp_fused) in tcp_close_detached()
1212 tcp_unfuse(tcp); in tcp_close_detached()
1221 tcp_closei_local(tcp); in tcp_close_detached()
1222 CONN_DEC_REF(tcp->tcp_connp); in tcp_close_detached()
1233 tcp_closei_local(tcp_t *tcp) in tcp_closei_local() argument
1235 conn_t *connp = tcp->tcp_connp; in tcp_closei_local()
1236 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_closei_local()
1239 if (!TCP_IS_SOCKET(tcp)) in tcp_closei_local()
1240 tcp_acceptor_hash_remove(tcp); in tcp_closei_local()
1242 TCPS_UPDATE_MIB(tcps, tcpHCInSegs, tcp->tcp_ibsegs); in tcp_closei_local()
1243 tcp->tcp_ibsegs = 0; in tcp_closei_local()
1244 TCPS_UPDATE_MIB(tcps, tcpHCOutSegs, tcp->tcp_obsegs); in tcp_closei_local()
1245 tcp->tcp_obsegs = 0; in tcp_closei_local()
1254 if (tcp->tcp_state >= TCPS_ESTABLISHED && in tcp_closei_local()
1255 tcp->tcp_state < TCPS_TIME_WAIT) { in tcp_closei_local()
1264 if (tcp->tcp_listener != NULL) { in tcp_closei_local()
1265 tcp_t *listener = tcp->tcp_listener; in tcp_closei_local()
1277 if (!tcp->tcp_tconnind_started) { in tcp_closei_local()
1278 tcp_eager_unlink(tcp); in tcp_closei_local()
1285 ASSERT(tcp->tcp_detached); in tcp_closei_local()
1295 tcp_timers_stop(tcp); in tcp_closei_local()
1297 if (tcp->tcp_state == TCPS_LISTEN) { in tcp_closei_local()
1298 if (tcp->tcp_ip_addr_cache) { in tcp_closei_local()
1299 kmem_free((void *)tcp->tcp_ip_addr_cache, in tcp_closei_local()
1301 tcp->tcp_ip_addr_cache = NULL; in tcp_closei_local()
1306 if (tcp->tcp_listen_cnt != NULL) in tcp_closei_local()
1307 TCP_DECR_LISTEN_CNT(tcp); in tcp_closei_local()
1309 mutex_enter(&tcp->tcp_non_sq_lock); in tcp_closei_local()
1310 if (tcp->tcp_flow_stopped) in tcp_closei_local()
1311 tcp_clrqfull(tcp); in tcp_closei_local()
1312 mutex_exit(&tcp->tcp_non_sq_lock); in tcp_closei_local()
1314 tcp_bind_hash_remove(tcp); in tcp_closei_local()
1323 if (tcp->tcp_state == TCPS_TIME_WAIT) in tcp_closei_local()
1324 (void) tcp_time_wait_remove(tcp, NULL); in tcp_closei_local()
1327 oldstate = tcp->tcp_state; in tcp_closei_local()
1328 tcp->tcp_state = TCPS_CLOSED; in tcp_closei_local()
1331 connp->conn_ixa, void, NULL, tcp_t *, tcp, void, NULL, in tcp_closei_local()
1342 ASSERT(tcp->tcp_time_wait_next == NULL); in tcp_closei_local()
1343 ASSERT(tcp->tcp_time_wait_prev == NULL); in tcp_closei_local()
1344 ASSERT(tcp->tcp_time_wait_expire == 0); in tcp_closei_local()
1346 tcp_ipsec_cleanup(tcp); in tcp_closei_local()
1354 tcp_free(tcp_t *tcp) in tcp_free() argument
1357 conn_t *connp = tcp->tcp_connp; in tcp_free()
1359 ASSERT(tcp != NULL); in tcp_free()
1360 ASSERT(tcp->tcp_ptpahn == NULL && tcp->tcp_acceptor_hash == NULL); in tcp_free()
1365 tcp_close_mpp(&tcp->tcp_xmit_head); in tcp_free()
1366 tcp_close_mpp(&tcp->tcp_reass_head); in tcp_free()
1367 if (tcp->tcp_rcv_list != NULL) { in tcp_free()
1369 tcp_close_mpp(&tcp->tcp_rcv_list); in tcp_free()
1371 if ((mp = tcp->tcp_urp_mp) != NULL) { in tcp_free()
1374 if ((mp = tcp->tcp_urp_mark_mp) != NULL) { in tcp_free()
1378 if (tcp->tcp_fused_sigurg_mp != NULL) { in tcp_free()
1379 ASSERT(!IPCL_IS_NONSTR(tcp->tcp_connp)); in tcp_free()
1380 freeb(tcp->tcp_fused_sigurg_mp); in tcp_free()
1381 tcp->tcp_fused_sigurg_mp = NULL; in tcp_free()
1384 if (tcp->tcp_ordrel_mp != NULL) { in tcp_free()
1385 ASSERT(!IPCL_IS_NONSTR(tcp->tcp_connp)); in tcp_free()
1386 freeb(tcp->tcp_ordrel_mp); in tcp_free()
1387 tcp->tcp_ordrel_mp = NULL; in tcp_free()
1390 TCP_NOTSACK_REMOVE_ALL(tcp->tcp_notsack_list, tcp); in tcp_free()
1391 bzero(&tcp->tcp_sack_info, sizeof (tcp_sack_info_t)); in tcp_free()
1393 if (tcp->tcp_hopopts != NULL) { in tcp_free()
1394 mi_free(tcp->tcp_hopopts); in tcp_free()
1395 tcp->tcp_hopopts = NULL; in tcp_free()
1396 tcp->tcp_hopoptslen = 0; in tcp_free()
1398 ASSERT(tcp->tcp_hopoptslen == 0); in tcp_free()
1399 if (tcp->tcp_dstopts != NULL) { in tcp_free()
1400 mi_free(tcp->tcp_dstopts); in tcp_free()
1401 tcp->tcp_dstopts = NULL; in tcp_free()
1402 tcp->tcp_dstoptslen = 0; in tcp_free()
1404 ASSERT(tcp->tcp_dstoptslen == 0); in tcp_free()
1405 if (tcp->tcp_rthdrdstopts != NULL) { in tcp_free()
1406 mi_free(tcp->tcp_rthdrdstopts); in tcp_free()
1407 tcp->tcp_rthdrdstopts = NULL; in tcp_free()
1408 tcp->tcp_rthdrdstoptslen = 0; in tcp_free()
1410 ASSERT(tcp->tcp_rthdrdstoptslen == 0); in tcp_free()
1411 if (tcp->tcp_rthdr != NULL) { in tcp_free()
1412 mi_free(tcp->tcp_rthdr); in tcp_free()
1413 tcp->tcp_rthdr = NULL; in tcp_free()
1414 tcp->tcp_rthdrlen = 0; in tcp_free()
1416 ASSERT(tcp->tcp_rthdrlen == 0); in tcp_free()
1423 tcp_close_mpp(&tcp->tcp_conn.tcp_eager_conn_ind); in tcp_free()
1435 tcp->tcp_detached = B_TRUE; in tcp_free()
1474 tcp_t *tcp = NULL; in tcp_get_conn() local
1485 tcp = tcp_time_wait->tcp_free_list; in tcp_get_conn()
1486 ASSERT((tcp != NULL) ^ (tcp_time_wait->tcp_free_list_cnt == 0)); in tcp_get_conn()
1487 if (tcp != NULL) { in tcp_get_conn()
1488 tcp_time_wait->tcp_free_list = tcp->tcp_time_wait_next; in tcp_get_conn()
1491 tcp->tcp_time_wait_next = NULL; in tcp_get_conn()
1492 connp = tcp->tcp_connp; in tcp_get_conn()
1495 ASSERT(tcp->tcp_tcps == NULL); in tcp_get_conn()
1497 ASSERT(tcp->tcp_rsrv_mp != NULL); in tcp_get_conn()
1502 tcp->tcp_tcps = tcps; in tcp_get_conn()
1505 connp->conn_ixa->ixa_notify_cookie = tcp; in tcp_get_conn()
1527 tcp = connp->conn_tcp; in tcp_get_conn()
1528 tcp->tcp_rsrv_mp = tcp_rsrv_mp; in tcp_get_conn()
1529 mutex_init(&tcp->tcp_rsrv_mp_lock, NULL, MUTEX_DEFAULT, NULL); in tcp_get_conn()
1531 tcp->tcp_tcps = tcps; in tcp_get_conn()
1543 connp->conn_ixa->ixa_notify_cookie = tcp; in tcp_get_conn()
1554 tcp_connect_ipv4(tcp_t *tcp, ipaddr_t *dstaddrp, in_port_t dstport, in tcp_connect_ipv4() argument
1559 conn_t *connp = tcp->tcp_connp; in tcp_connect_ipv4()
1560 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_connect_ipv4()
1603 if (tcp->tcp_state == TCPS_IDLE) { in tcp_connect_ipv4()
1611 tcp, B_TRUE); in tcp_connect_ipv4()
1612 lport = tcp_bindi(tcp, lport, &connp->conn_laddr_v6, 0, B_TRUE, in tcp_connect_ipv4()
1622 error = tcp_set_destination(tcp); in tcp_connect_ipv4()
1633 tcp->tcp_state = TCPS_SYN_SENT; in tcp_connect_ipv4()
1643 tcp_connect_ipv6(tcp_t *tcp, in6_addr_t *dstaddrp, in_port_t dstport, in tcp_connect_ipv6() argument
1647 conn_t *connp = tcp->tcp_connp; in tcp_connect_ipv6()
1648 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_connect_ipv6()
1699 if (tcp->tcp_state == TCPS_IDLE) { in tcp_connect_ipv6()
1707 tcp, B_TRUE); in tcp_connect_ipv6()
1708 lport = tcp_bindi(tcp, lport, &connp->conn_laddr_v6, 0, B_TRUE, in tcp_connect_ipv6()
1718 error = tcp_set_destination(tcp); in tcp_connect_ipv6()
1729 tcp->tcp_state = TCPS_SYN_SENT; in tcp_connect_ipv6()
1740 tcp_disconnect_common(tcp_t *tcp, t_scalar_t seqnum) in tcp_disconnect_common() argument
1743 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_disconnect_common()
1744 conn_t *connp = tcp->tcp_connp; in tcp_disconnect_common()
1752 if (tcp->tcp_state <= TCPS_BOUND) { in tcp_disconnect_common()
1755 "tcp_disconnect: bad state, %d", tcp->tcp_state); in tcp_disconnect_common()
1758 } else if (tcp->tcp_state >= TCPS_ESTABLISHED) { in tcp_disconnect_common()
1762 if (seqnum == -1 || tcp->tcp_conn_req_max == 0) { in tcp_disconnect_common()
1775 int old_state = tcp->tcp_state; in tcp_disconnect_common()
1782 ASSERT(tcp->tcp_time_wait_next == NULL); in tcp_disconnect_common()
1783 ASSERT(tcp->tcp_time_wait_prev == NULL); in tcp_disconnect_common()
1784 ASSERT(tcp->tcp_time_wait_expire == 0); in tcp_disconnect_common()
1803 if (tcp->tcp_conn_req_max && lconnp == NULL) { in tcp_disconnect_common()
1804 tcp->tcp_state = TCPS_LISTEN; in tcp_disconnect_common()
1806 connp->conn_ixa, void, NULL, tcp_t *, tcp, void, in tcp_disconnect_common()
1809 tcp->tcp_conn_req_max = 0; in tcp_disconnect_common()
1810 tcp->tcp_state = TCPS_BOUND; in tcp_disconnect_common()
1812 connp->conn_ixa, void, NULL, tcp_t *, tcp, void, in tcp_disconnect_common()
1822 if (tcp->tcp_listen_cnt != NULL) in tcp_disconnect_common()
1823 TCP_DECR_LISTEN_CNT(tcp); in tcp_disconnect_common()
1838 if (tcp->tcp_fused) in tcp_disconnect_common()
1839 tcp_unfuse(tcp); in tcp_disconnect_common()
1841 mutex_enter(&tcp->tcp_eager_lock); in tcp_disconnect_common()
1842 if ((tcp->tcp_conn_req_cnt_q0 != 0) || in tcp_disconnect_common()
1843 (tcp->tcp_conn_req_cnt_q != 0)) { in tcp_disconnect_common()
1844 tcp_eager_cleanup(tcp, 0); in tcp_disconnect_common()
1846 mutex_exit(&tcp->tcp_eager_lock); in tcp_disconnect_common()
1848 tcp_xmit_ctl("tcp_disconnect", tcp, tcp->tcp_snxt, in tcp_disconnect_common()
1849 tcp->tcp_rnxt, TH_RST | TH_ACK); in tcp_disconnect_common()
1851 tcp_reinit(tcp); in tcp_disconnect_common()
1854 } else if (!tcp_eager_blowoff(tcp, seqnum)) { in tcp_disconnect_common()
1866 tcp_disconnect(tcp_t *tcp, mblk_t *mp) in tcp_disconnect() argument
1870 conn_t *connp = tcp->tcp_connp; in tcp_disconnect()
1874 tcp_err_ack(tcp, mp, TPROTO, 0); in tcp_disconnect()
1878 error = tcp_disconnect_common(tcp, seqnum); in tcp_disconnect()
1880 tcp_err_ack(tcp, mp, error, 0); in tcp_disconnect()
1882 if (tcp->tcp_state >= TCPS_ESTABLISHED) { in tcp_disconnect()
1897 tcp_reinit(tcp_t *tcp) in tcp_reinit() argument
1900 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_reinit()
1901 conn_t *connp = tcp->tcp_connp; in tcp_reinit()
1905 ASSERT(tcp->tcp_listener == NULL); in tcp_reinit()
1913 tcp_timers_stop(tcp); in tcp_reinit()
1919 TCPS_UPDATE_MIB(tcps, tcpHCInSegs, tcp->tcp_ibsegs); in tcp_reinit()
1920 tcp->tcp_ibsegs = 0; in tcp_reinit()
1921 TCPS_UPDATE_MIB(tcps, tcpHCOutSegs, tcp->tcp_obsegs); in tcp_reinit()
1922 tcp->tcp_obsegs = 0; in tcp_reinit()
1924 tcp_close_mpp(&tcp->tcp_xmit_head); in tcp_reinit()
1925 if (tcp->tcp_snd_zcopy_aware) in tcp_reinit()
1926 tcp_zcopy_notify(tcp); in tcp_reinit()
1927 tcp->tcp_xmit_last = tcp->tcp_xmit_tail = NULL; in tcp_reinit()
1928 tcp->tcp_unsent = tcp->tcp_xmit_tail_unsent = 0; in tcp_reinit()
1929 mutex_enter(&tcp->tcp_non_sq_lock); in tcp_reinit()
1930 if (tcp->tcp_flow_stopped && in tcp_reinit()
1931 TCP_UNSENT_BYTES(tcp) <= connp->conn_sndlowat) { in tcp_reinit()
1932 tcp_clrqfull(tcp); in tcp_reinit()
1934 mutex_exit(&tcp->tcp_non_sq_lock); in tcp_reinit()
1935 tcp_close_mpp(&tcp->tcp_reass_head); in tcp_reinit()
1936 tcp->tcp_reass_tail = NULL; in tcp_reinit()
1937 if (tcp->tcp_rcv_list != NULL) { in tcp_reinit()
1939 tcp_close_mpp(&tcp->tcp_rcv_list); in tcp_reinit()
1940 tcp->tcp_rcv_last_head = NULL; in tcp_reinit()
1941 tcp->tcp_rcv_last_tail = NULL; in tcp_reinit()
1942 tcp->tcp_rcv_cnt = 0; in tcp_reinit()
1944 tcp->tcp_rcv_last_tail = NULL; in tcp_reinit()
1946 if ((mp = tcp->tcp_urp_mp) != NULL) { in tcp_reinit()
1948 tcp->tcp_urp_mp = NULL; in tcp_reinit()
1950 if ((mp = tcp->tcp_urp_mark_mp) != NULL) { in tcp_reinit()
1952 tcp->tcp_urp_mark_mp = NULL; in tcp_reinit()
1954 if (tcp->tcp_fused_sigurg_mp != NULL) { in tcp_reinit()
1955 ASSERT(!IPCL_IS_NONSTR(tcp->tcp_connp)); in tcp_reinit()
1956 freeb(tcp->tcp_fused_sigurg_mp); in tcp_reinit()
1957 tcp->tcp_fused_sigurg_mp = NULL; in tcp_reinit()
1959 if (tcp->tcp_ordrel_mp != NULL) { in tcp_reinit()
1960 ASSERT(!IPCL_IS_NONSTR(tcp->tcp_connp)); in tcp_reinit()
1961 freeb(tcp->tcp_ordrel_mp); in tcp_reinit()
1962 tcp->tcp_ordrel_mp = NULL; in tcp_reinit()
1970 tcp_close_mpp(&tcp->tcp_conn.tcp_eager_conn_ind); in tcp_reinit()
1978 ASSERT(tcp->tcp_time_wait_next == NULL); in tcp_reinit()
1979 ASSERT(tcp->tcp_time_wait_prev == NULL); in tcp_reinit()
1980 ASSERT(tcp->tcp_time_wait_expire == 0); in tcp_reinit()
1985 tcp_reinit_values(tcp); in tcp_reinit()
1989 tcp_ipsec_cleanup(tcp); in tcp_reinit()
1993 oldstate = tcp->tcp_state; in tcp_reinit()
1995 if (tcp->tcp_conn_req_max != 0) { in tcp_reinit()
2013 tcp->tcp_state = TCPS_LISTEN; in tcp_reinit()
2014 tcp->tcp_eager_next_q0 = tcp->tcp_eager_prev_q0 = tcp; in tcp_reinit()
2015 tcp->tcp_eager_next_drop_q0 = tcp; in tcp_reinit()
2016 tcp->tcp_eager_prev_drop_q0 = tcp; in tcp_reinit()
2031 tcp->tcp_state = TCPS_BOUND; in tcp_reinit()
2037 tcp_init_values(tcp, NULL); in tcp_reinit()
2040 connp->conn_ixa, void, NULL, tcp_t *, tcp, void, NULL, in tcp_reinit()
2043 ASSERT(tcp->tcp_ptpbhn != NULL); in tcp_reinit()
2044 tcp->tcp_rwnd = connp->conn_rcvbuf; in tcp_reinit()
2045 tcp->tcp_mss = connp->conn_ipversion != IPV4_VERSION ? in tcp_reinit()
2057 tcp_reinit_values(tcp) in tcp_reinit_values() argument
2058 tcp_t *tcp; in tcp_reinit_values()
2060 tcp_stack_t *tcps = tcp->tcp_tcps;
2061 conn_t *connp = tcp->tcp_connp;
2071 PRESERVE(tcp->tcp_bind_hash_port);
2072 PRESERVE(tcp->tcp_bind_hash);
2073 PRESERVE(tcp->tcp_ptpbhn);
2074 PRESERVE(tcp->tcp_acceptor_hash);
2075 PRESERVE(tcp->tcp_ptpahn);
2078 ASSERT(tcp->tcp_time_wait_next == NULL);
2079 ASSERT(tcp->tcp_time_wait_prev == NULL);
2080 ASSERT(tcp->tcp_time_wait_expire == 0);
2081 PRESERVE(tcp->tcp_state);
2085 ASSERT(tcp->tcp_xmit_head == NULL);
2086 ASSERT(tcp->tcp_xmit_last == NULL);
2087 ASSERT(tcp->tcp_unsent == 0);
2088 ASSERT(tcp->tcp_xmit_tail == NULL);
2089 ASSERT(tcp->tcp_xmit_tail_unsent == 0);
2091 tcp->tcp_snxt = 0; /* Displayed in mib */
2092 tcp->tcp_suna = 0; /* Displayed in mib */
2093 tcp->tcp_swnd = 0;
2094 DONTCARE(tcp->tcp_cwnd); /* Init in tcp_process_options */
2096 ASSERT(tcp->tcp_ibsegs == 0);
2097 ASSERT(tcp->tcp_obsegs == 0);
2106 tcp->tcp_ipha = NULL;
2107 tcp->tcp_ip6h = NULL;
2108 tcp->tcp_tcpha = NULL;
2114 DONTCARE(tcp->tcp_naglim); /* Init in tcp_init_values */
2115 DONTCARE(tcp->tcp_ipha);
2116 DONTCARE(tcp->tcp_ip6h);
2117 DONTCARE(tcp->tcp_tcpha);
2118 tcp->tcp_valid_bits = 0;
2120 DONTCARE(tcp->tcp_timer_backoff); /* Init in tcp_init_values */
2121 DONTCARE(tcp->tcp_last_recv_time); /* Init in tcp_init_values */
2122 tcp->tcp_last_rcv_lbolt = 0;
2124 tcp->tcp_init_cwnd = 0;
2126 tcp->tcp_urp_last_valid = 0;
2127 tcp->tcp_hard_binding = 0;
2129 tcp->tcp_fin_acked = 0;
2130 tcp->tcp_fin_rcvd = 0;
2131 tcp->tcp_fin_sent = 0;
2132 tcp->tcp_ordrel_done = 0;
2134 tcp->tcp_detached = 0;
2136 tcp->tcp_snd_ws_ok = B_FALSE;
2137 tcp->tcp_snd_ts_ok = B_FALSE;
2138 tcp->tcp_zero_win_probe = 0;
2140 tcp->tcp_loopback = 0;
2141 tcp->tcp_localnet = 0;
2142 tcp->tcp_syn_defense = 0;
2143 tcp->tcp_set_timer = 0;
2145 tcp->tcp_active_open = 0;
2146 tcp->tcp_rexmit = B_FALSE;
2147 tcp->tcp_xmit_zc_clean = B_FALSE;
2149 tcp->tcp_snd_sack_ok = B_FALSE;
2150 tcp->tcp_hwcksum = B_FALSE;
2152 DONTCARE(tcp->tcp_maxpsz_multiplier); /* Init in tcp_init_values */
2154 tcp->tcp_conn_def_q0 = 0;
2155 tcp->tcp_ip_forward_progress = B_FALSE;
2156 tcp->tcp_ecn_ok = B_FALSE;
2158 tcp->tcp_cwr = B_FALSE;
2159 tcp->tcp_ecn_echo_on = B_FALSE;
2160 tcp->tcp_is_wnd_shrnk = B_FALSE;
2162 TCP_NOTSACK_REMOVE_ALL(tcp->tcp_notsack_list, tcp);
2163 bzero(&tcp->tcp_sack_info, sizeof (tcp_sack_info_t));
2165 tcp->tcp_rcv_ws = 0;
2166 tcp->tcp_snd_ws = 0;
2167 tcp->tcp_ts_recent = 0;
2168 tcp->tcp_rnxt = 0; /* Displayed in mib */
2169 DONTCARE(tcp->tcp_rwnd); /* Set in tcp_reinit() */
2170 tcp->tcp_initial_pmtu = 0;
2172 ASSERT(tcp->tcp_reass_head == NULL);
2173 ASSERT(tcp->tcp_reass_tail == NULL);
2175 tcp->tcp_cwnd_cnt = 0;
2177 ASSERT(tcp->tcp_rcv_list == NULL);
2178 ASSERT(tcp->tcp_rcv_last_head == NULL);
2179 ASSERT(tcp->tcp_rcv_last_tail == NULL);
2180 ASSERT(tcp->tcp_rcv_cnt == 0);
2182 DONTCARE(tcp->tcp_cwnd_ssthresh); /* Init in tcp_set_destination */
2183 DONTCARE(tcp->tcp_cwnd_max); /* Init in tcp_init_values */
2184 tcp->tcp_csuna = 0;
2186 tcp->tcp_rto = 0; /* Displayed in MIB */
2187 DONTCARE(tcp->tcp_rtt_sa); /* Init in tcp_init_values */
2188 DONTCARE(tcp->tcp_rtt_sd); /* Init in tcp_init_values */
2189 tcp->tcp_rtt_update = 0;
2191 DONTCARE(tcp->tcp_swl1); /* Init in case TCPS_LISTEN/TCPS_SYN_SENT */
2192 DONTCARE(tcp->tcp_swl2); /* Init in case TCPS_LISTEN/TCPS_SYN_SENT */
2194 tcp->tcp_rack = 0; /* Displayed in mib */
2195 tcp->tcp_rack_cnt = 0;
2196 tcp->tcp_rack_cur_max = 0;
2197 tcp->tcp_rack_abs_max = 0;
2199 tcp->tcp_max_swnd = 0;
2201 ASSERT(tcp->tcp_listener == NULL);
2203 DONTCARE(tcp->tcp_irs); /* tcp_valid_bits cleared */
2204 DONTCARE(tcp->tcp_iss); /* tcp_valid_bits cleared */
2205 DONTCARE(tcp->tcp_fss); /* tcp_valid_bits cleared */
2206 DONTCARE(tcp->tcp_urg); /* tcp_valid_bits cleared */
2208 ASSERT(tcp->tcp_conn_req_cnt_q == 0);
2209 ASSERT(tcp->tcp_conn_req_cnt_q0 == 0);
2210 PRESERVE(tcp->tcp_conn_req_max);
2211 PRESERVE(tcp->tcp_conn_req_seqnum);
2213 DONTCARE(tcp->tcp_first_timer_threshold); /* Init in tcp_init_values */
2214 DONTCARE(tcp->tcp_second_timer_threshold); /* Init in tcp_init_values */
2215 DONTCARE(tcp->tcp_first_ctimer_threshold); /* Init in tcp_init_values */
2216 DONTCARE(tcp->tcp_second_ctimer_threshold); /* in tcp_init_values */
2218 DONTCARE(tcp->tcp_urp_last); /* tcp_urp_last_valid is cleared */
2219 ASSERT(tcp->tcp_urp_mp == NULL);
2220 ASSERT(tcp->tcp_urp_mark_mp == NULL);
2221 ASSERT(tcp->tcp_fused_sigurg_mp == NULL);
2223 ASSERT(tcp->tcp_eager_next_q == NULL);
2224 ASSERT(tcp->tcp_eager_last_q == NULL);
2225 ASSERT((tcp->tcp_eager_next_q0 == NULL &&
2226 tcp->tcp_eager_prev_q0 == NULL) ||
2227 tcp->tcp_eager_next_q0 == tcp->tcp_eager_prev_q0);
2228 ASSERT(tcp->tcp_conn.tcp_eager_conn_ind == NULL);
2230 ASSERT((tcp->tcp_eager_next_drop_q0 == NULL &&
2231 tcp->tcp_eager_prev_drop_q0 == NULL) ||
2232 tcp->tcp_eager_next_drop_q0 == tcp->tcp_eager_prev_drop_q0);
2234 DONTCARE(tcp->tcp_ka_rinterval); /* Init in tcp_init_values */
2235 DONTCARE(tcp->tcp_ka_abort_thres); /* Init in tcp_init_values */
2236 DONTCARE(tcp->tcp_ka_cnt); /* Init in tcp_init_values */
2238 tcp->tcp_client_errno = 0;
2245 tcp->tcp_last_sent_len = 0;
2246 tcp->tcp_dupack_cnt = 0;
2251 PRESERVE(tcp->tcp_acceptor_lockp);
2253 ASSERT(tcp->tcp_ordrel_mp == NULL);
2254 PRESERVE(tcp->tcp_acceptor_id);
2255 DONTCARE(tcp->tcp_ipsec_overhead);
2261 tcp->tcp_mss = tcps->tcps_mss_def_ipv6;
2264 tcp->tcp_mss = tcps->tcps_mss_def_ipv4;
2269 tcp->tcp_recvifindex = 0;
2270 tcp->tcp_recvhops = 0;
2271 tcp->tcp_closed = 0;
2272 if (tcp->tcp_hopopts != NULL) {
2273 mi_free(tcp->tcp_hopopts);
2274 tcp->tcp_hopopts = NULL;
2275 tcp->tcp_hopoptslen = 0;
2277 ASSERT(tcp->tcp_hopoptslen == 0);
2278 if (tcp->tcp_dstopts != NULL) {
2279 mi_free(tcp->tcp_dstopts);
2280 tcp->tcp_dstopts = NULL;
2281 tcp->tcp_dstoptslen = 0;
2283 ASSERT(tcp->tcp_dstoptslen == 0);
2284 if (tcp->tcp_rthdrdstopts != NULL) {
2285 mi_free(tcp->tcp_rthdrdstopts);
2286 tcp->tcp_rthdrdstopts = NULL;
2287 tcp->tcp_rthdrdstoptslen = 0;
2289 ASSERT(tcp->tcp_rthdrdstoptslen == 0);
2290 if (tcp->tcp_rthdr != NULL) {
2291 mi_free(tcp->tcp_rthdr);
2292 tcp->tcp_rthdr = NULL;
2293 tcp->tcp_rthdrlen = 0;
2295 ASSERT(tcp->tcp_rthdrlen == 0);
2298 tcp->tcp_fused = B_FALSE;
2299 tcp->tcp_unfusable = B_FALSE;
2300 tcp->tcp_fused_sigurg = B_FALSE;
2301 tcp->tcp_loopback_peer = NULL;
2303 tcp->tcp_lso = B_FALSE;
2305 tcp->tcp_in_ack_unsent = 0;
2306 tcp->tcp_cork = B_FALSE;
2307 tcp->tcp_tconnind_started = B_FALSE;
2309 PRESERVE(tcp->tcp_squeue_bytes);
2311 tcp->tcp_closemp_used = B_FALSE;
2313 PRESERVE(tcp->tcp_rsrv_mp);
2314 PRESERVE(tcp->tcp_rsrv_mp_lock);
2317 DONTCARE(tcp->tcmp_stk[0]);
2320 PRESERVE(tcp->tcp_connid);
2322 ASSERT(tcp->tcp_listen_cnt == NULL);
2323 ASSERT(tcp->tcp_reass_tid == 0);
2334 tcp_init_values(tcp_t *tcp, tcp_t *parent) in tcp_init_values() argument
2336 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_init_values()
2337 conn_t *connp = tcp->tcp_connp; in tcp_init_values()
2347 tcp->tcp_naglim = tcps->tcps_naglim_def; in tcp_init_values()
2349 tcp->tcp_rto_initial = tcps->tcps_rexmit_interval_initial; in tcp_init_values()
2350 tcp->tcp_rto_min = tcps->tcps_rexmit_interval_min; in tcp_init_values()
2351 tcp->tcp_rto_max = tcps->tcps_rexmit_interval_max; in tcp_init_values()
2353 tcp->tcp_first_ctimer_threshold = in tcp_init_values()
2355 tcp->tcp_second_ctimer_threshold = in tcp_init_values()
2357 tcp->tcp_first_timer_threshold = tcps->tcps_ip_notify_interval; in tcp_init_values()
2358 tcp->tcp_second_timer_threshold = tcps->tcps_ip_abort_interval; in tcp_init_values()
2360 tcp->tcp_fin_wait_2_flush_interval = in tcp_init_values()
2363 tcp->tcp_ka_interval = tcps->tcps_keepalive_interval; in tcp_init_values()
2364 tcp->tcp_ka_abort_thres = tcps->tcps_keepalive_abort_interval; in tcp_init_values()
2365 tcp->tcp_ka_cnt = 0; in tcp_init_values()
2366 tcp->tcp_ka_rinterval = 0; in tcp_init_values()
2374 tcp->tcp_naglim = parent->tcp_naglim; in tcp_init_values()
2376 tcp->tcp_rto_initial = parent->tcp_rto_initial; in tcp_init_values()
2377 tcp->tcp_rto_min = parent->tcp_rto_min; in tcp_init_values()
2378 tcp->tcp_rto_max = parent->tcp_rto_max; in tcp_init_values()
2380 tcp->tcp_first_ctimer_threshold = in tcp_init_values()
2382 tcp->tcp_second_ctimer_threshold = in tcp_init_values()
2384 tcp->tcp_first_timer_threshold = in tcp_init_values()
2386 tcp->tcp_second_timer_threshold = in tcp_init_values()
2389 tcp->tcp_fin_wait_2_flush_interval = in tcp_init_values()
2392 tcp->tcp_ka_interval = parent->tcp_ka_interval; in tcp_init_values()
2393 tcp->tcp_ka_abort_thres = parent->tcp_ka_abort_thres; in tcp_init_values()
2394 tcp->tcp_ka_cnt = parent->tcp_ka_cnt; in tcp_init_values()
2395 tcp->tcp_ka_rinterval = parent->tcp_ka_rinterval; in tcp_init_values()
2397 tcp->tcp_init_cwnd = parent->tcp_init_cwnd; in tcp_init_values()
2407 tcp->tcp_rtt_sa = tcp->tcp_rto_initial << 2; in tcp_init_values()
2408 tcp->tcp_rtt_sd = tcp->tcp_rto_initial >> 1; in tcp_init_values()
2409 rto = (tcp->tcp_rtt_sa >> 3) + tcp->tcp_rtt_sd + in tcp_init_values()
2410 tcps->tcps_rexmit_interval_extra + (tcp->tcp_rtt_sa >> 5) + in tcp_init_values()
2412 TCP_SET_RTO(tcp, rto); in tcp_init_values()
2414 tcp->tcp_timer_backoff = 0; in tcp_init_values()
2415 tcp->tcp_ms_we_have_waited = 0; in tcp_init_values()
2416 tcp->tcp_last_recv_time = ddi_get_lbolt(); in tcp_init_values()
2417 tcp->tcp_cwnd_max = tcps->tcps_cwnd_max_; in tcp_init_values()
2418 tcp->tcp_cwnd_ssthresh = TCP_MAX_LARGEWIN; in tcp_init_values()
2420 tcp->tcp_maxpsz_multiplier = tcps->tcps_maxpsz_multiplier; in tcp_init_values()
2425 tcp->tcp_fused = B_FALSE; in tcp_init_values()
2426 tcp->tcp_unfusable = B_FALSE; in tcp_init_values()
2427 tcp->tcp_fused_sigurg = B_FALSE; in tcp_init_values()
2428 tcp->tcp_loopback_peer = NULL; in tcp_init_values()
2438 tcp->tcp_rcv_ws = TCP_MAX_WINSHIFT; in tcp_init_values()
2439 tcp->tcp_rwnd = connp->conn_rcvbuf; in tcp_init_values()
2441 tcp->tcp_cork = B_FALSE; in tcp_init_values()
2461 tcp_update_pmtu(tcp_t *tcp, boolean_t decrease_only) in tcp_update_pmtu() argument
2465 conn_t *connp = tcp->tcp_connp; in tcp_update_pmtu()
2469 if (tcp->tcp_tcps->tcps_ignore_path_mtu) in tcp_update_pmtu()
2472 if (tcp->tcp_state < TCPS_ESTABLISHED) in tcp_update_pmtu()
2492 if (mss == tcp->tcp_mss) in tcp_update_pmtu()
2498 if (mss > tcp->tcp_mss && decrease_only) in tcp_update_pmtu()
2501 DTRACE_PROBE2(tcp_update_pmtu, int32_t, tcp->tcp_mss, uint32_t, mss); in tcp_update_pmtu()
2511 tcp_mss_set(tcp, mss); in tcp_update_pmtu()
2523 if (mss < tcp->tcp_tcps->tcps_mss_min) in tcp_update_pmtu()
2531 tcp->tcp_ipha->ipha_fragment_offset_and_flags = 0; in tcp_update_pmtu()
2537 tcp_maxpsz_set(tcp_t *tcp, boolean_t set_maxblk) in tcp_maxpsz_set() argument
2539 conn_t *connp = tcp->tcp_connp; in tcp_maxpsz_set()
2541 int32_t mss = tcp->tcp_mss; in tcp_maxpsz_set()
2544 if (TCP_IS_DETACHED(tcp)) in tcp_maxpsz_set()
2546 if (tcp->tcp_fused) { in tcp_maxpsz_set()
2547 maxpsz = tcp_fuse_maxpsz(tcp); in tcp_maxpsz_set()
2549 } else if (tcp->tcp_maxpsz_multiplier == 0) { in tcp_maxpsz_set()
2566 maxpsz = tcp->tcp_maxpsz_multiplier * mss; in tcp_maxpsz_set()
2600 tcp_t *tcp = NULL; in tcp_create_common() local
2661 tcp = connp->conn_tcp; in tcp_create_common()
2681 tcp->tcp_mss = tcps->tcps_mss_def_ipv6; in tcp_create_common()
2686 tcp->tcp_mss = tcps->tcps_mss_def_ipv4; in tcp_create_common()
2706 ASSERT(tcp->tcp_tcps == tcps); in tcp_create_common()
2718 tcp->tcp_issocket = 1; in tcp_create_common()
2733 SOCK_CONNID_INIT(tcp->tcp_connid); in tcp_create_common()
2735 tcp->tcp_state = TCPS_IDLE; in tcp_create_common()
2736 tcp_init_values(tcp, NULL); in tcp_create_common()
2744 tcp_t *tcp = NULL; in tcp_open() local
2818 tcp = connp->conn_tcp; in tcp_open()
2824 tcp->tcp_acceptor_id = (t_uscalar_t)RD(q); in tcp_open()
2826 tcp->tcp_acceptor_id = conn_dev; in tcp_open()
2828 tcp_acceptor_hash_insert(tcp->tcp_acceptor_id, tcp); in tcp_open()
2856 tcp_build_hdrs(tcp_t *tcp) in tcp_build_hdrs() argument
2858 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_build_hdrs()
2859 conn_t *connp = tcp->tcp_connp; in tcp_build_hdrs()
2893 tcp->tcp_tcpha = tcpha; in tcp_build_hdrs()
2919 tcp->tcp_ipha = (ipha_t *)connp->conn_ht_iphc; in tcp_build_hdrs()
2921 tcp->tcp_ip6h = (ip6_t *)connp->conn_ht_iphc; in tcp_build_hdrs()
2953 tcp_rwnd_set(tcp_t *tcp, uint32_t rwnd) in tcp_rwnd_set() argument
2955 uint32_t mss = tcp->tcp_mss; in tcp_rwnd_set()
2958 boolean_t tcp_detached = TCP_IS_DETACHED(tcp); in tcp_rwnd_set()
2959 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_rwnd_set()
2960 conn_t *connp = tcp->tcp_connp; in tcp_rwnd_set()
2970 if (tcp->tcp_fused) { in tcp_rwnd_set()
2972 tcp_t *peer_tcp = tcp->tcp_loopback_peer; in tcp_rwnd_set()
2975 sth_hiwat = tcp_fuse_set_rcv_hiwat(tcp, rwnd); in tcp_rwnd_set()
2979 tcp_set_recv_threshold(tcp, sth_hiwat >> 3); in tcp_rwnd_set()
2983 if (tcp->tcp_tcpha != NULL) { in tcp_rwnd_set()
2984 tcp->tcp_tcpha->tha_win = in tcp_rwnd_set()
2985 htons(tcp->tcp_rwnd >> tcp->tcp_rcv_ws); in tcp_rwnd_set()
2987 if ((tcp->tcp_rcv_ws > 0) && rwnd > tcp->tcp_cwnd_max) in tcp_rwnd_set()
2988 tcp->tcp_cwnd_max = rwnd; in tcp_rwnd_set()
3001 old_max_rwnd = tcp->tcp_rwnd; in tcp_rwnd_set()
3012 if (rwnd < old_max_rwnd && tcp->tcp_state > TCPS_SYN_SENT) { in tcp_rwnd_set()
3021 max_transmittable_rwnd = TCP_MAXWIN << tcp->tcp_rcv_ws; in tcp_rwnd_set()
3032 tcp->tcp_rwnd = old_max_rwnd = rwnd; in tcp_rwnd_set()
3034 if (tcp->tcp_localnet) { in tcp_rwnd_set()
3035 tcp->tcp_rack_abs_max = in tcp_rwnd_set()
3043 tcp->tcp_rack_abs_max = in tcp_rwnd_set()
3046 if (tcp->tcp_rack_cur_max > tcp->tcp_rack_abs_max) in tcp_rwnd_set()
3047 tcp->tcp_rack_cur_max = tcp->tcp_rack_abs_max; in tcp_rwnd_set()
3049 tcp->tcp_rack_cur_max = 0; in tcp_rwnd_set()
3055 tcp->tcp_rwnd += rwnd - old_max_rwnd; in tcp_rwnd_set()
3059 if (tcp->tcp_tcpha != NULL) { in tcp_rwnd_set()
3060 tcp->tcp_tcpha->tha_win = in tcp_rwnd_set()
3061 htons(tcp->tcp_rwnd >> tcp->tcp_rcv_ws); in tcp_rwnd_set()
3064 if ((tcp->tcp_rcv_ws > 0) && rwnd > tcp->tcp_cwnd_max) in tcp_rwnd_set()
3065 tcp->tcp_cwnd_max = rwnd; in tcp_rwnd_set()
3070 tcp_set_recv_threshold(tcp, rwnd >> 3); in tcp_rwnd_set()
3079 tcp_t *tcp = connp->conn_tcp; in tcp_do_unbind() local
3082 switch (tcp->tcp_state) { in tcp_do_unbind()
3094 mutex_enter(&tcp->tcp_eager_lock); in tcp_do_unbind()
3095 if (tcp->tcp_conn_req_cnt_q0 != 0 || tcp->tcp_conn_req_cnt_q != 0) { in tcp_do_unbind()
3096 tcp_eager_cleanup(tcp, 0); in tcp_do_unbind()
3098 mutex_exit(&tcp->tcp_eager_lock); in tcp_do_unbind()
3101 if (tcp->tcp_listen_cnt != NULL) in tcp_do_unbind()
3102 TCP_DECR_LISTEN_CNT(tcp); in tcp_do_unbind()
3105 tcp_bind_hash_remove(tcp); in tcp_do_unbind()
3106 oldstate = tcp->tcp_state; in tcp_do_unbind()
3107 tcp->tcp_state = TCPS_IDLE; in tcp_do_unbind()
3109 connp->conn_ixa, void, NULL, tcp_t *, tcp, void, NULL, in tcp_do_unbind()
3122 tcp_get_proto_props(tcp_t *tcp, struct sock_proto_props *sopp) in tcp_get_proto_props() argument
3124 conn_t *connp = tcp->tcp_connp; in tcp_get_proto_props()
3127 sopp->sopp_maxblk = tcp_maxpsz_set(tcp, B_FALSE); in tcp_get_proto_props()
3129 sopp->sopp_rxhiwat = tcp->tcp_fused ? in tcp_get_proto_props()
3130 tcp_fuse_set_rcv_hiwat(tcp, connp->conn_rcvbuf) : in tcp_get_proto_props()
3136 if (tcp->tcp_fused) { in tcp_get_proto_props()
3137 ASSERT(tcp->tcp_loopback); in tcp_get_proto_props()
3138 ASSERT(tcp->tcp_loopback_peer != NULL); in tcp_get_proto_props()
3151 (void) tcp_maxpsz_set(tcp->tcp_loopback_peer, B_TRUE); in tcp_get_proto_props()
3152 } else if (tcp->tcp_snd_sack_ok) { in tcp_get_proto_props()
3154 (tcp->tcp_loopback ? 0 : tcp->tcp_tcps->tcps_wroff_xtra); in tcp_get_proto_props()
3157 (tcp->tcp_loopback ? 0 : tcp->tcp_tcps->tcps_wroff_xtra); in tcp_get_proto_props()
3160 if (tcp->tcp_loopback) { in tcp_get_proto_props()
3170 tcp_zcopy_check(tcp_t *tcp) in tcp_zcopy_check() argument
3172 conn_t *connp = tcp->tcp_connp; in tcp_zcopy_check()
3175 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_zcopy_check()
3182 tcp->tcp_snd_zcopy_on = zc_enabled; in tcp_zcopy_check()
3183 if (!TCP_IS_DETACHED(tcp)) { in tcp_zcopy_check()
3211 tcp_zcopy_backoff(tcp_t *tcp, mblk_t *bp, boolean_t fix_xmitlist) in tcp_zcopy_backoff() argument
3216 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_zcopy_backoff()
3223 tcp->tcp_xmit_zc_clean = B_FALSE; in tcp_zcopy_backoff()
3231 tcp_zcopy_notify(tcp); in tcp_zcopy_backoff()
3246 if (tcp->tcp_xmit_tail == bp) in tcp_zcopy_backoff()
3247 tcp->tcp_xmit_tail = nbp; in tcp_zcopy_backoff()
3273 tcp->tcp_xmit_last = tail; in tcp_zcopy_backoff()
3274 tcp->tcp_xmit_zc_clean = B_TRUE; in tcp_zcopy_backoff()
3281 tcp_zcopy_notify(tcp_t *tcp) in tcp_zcopy_notify() argument
3286 if (tcp->tcp_detached) in tcp_zcopy_notify()
3288 connp = tcp->tcp_connp; in tcp_zcopy_notify()
3305 tcp_update_lso(tcp_t *tcp, ip_xmit_attr_t *ixa) in tcp_update_lso() argument
3327 tcp->tcp_lso_max = MIN(TCP_MAX_LSO_LENGTH, lsoc->ill_lso_max); in tcp_update_lso()
3329 DTRACE_PROBE3(tcp_update_lso, boolean_t, tcp->tcp_lso, in tcp_update_lso()
3330 boolean_t, B_TRUE, uint32_t, tcp->tcp_lso_max); in tcp_update_lso()
3336 if (!tcp->tcp_lso) in tcp_update_lso()
3337 tcp->tcp_maxpsz_multiplier = 0; in tcp_update_lso()
3339 tcp->tcp_lso = B_TRUE; in tcp_update_lso()
3340 TCP_STAT(tcp->tcp_tcps, tcp_lso_enabled); in tcp_update_lso()
3342 DTRACE_PROBE3(tcp_update_lso, boolean_t, tcp->tcp_lso, in tcp_update_lso()
3343 boolean_t, B_FALSE, uint32_t, tcp->tcp_lso_max); in tcp_update_lso()
3349 if (tcp->tcp_lso) { in tcp_update_lso()
3350 tcp->tcp_maxpsz_multiplier = in tcp_update_lso()
3351 tcp->tcp_tcps->tcps_maxpsz_multiplier; in tcp_update_lso()
3353 tcp->tcp_lso = B_FALSE; in tcp_update_lso()
3354 TCP_STAT(tcp->tcp_tcps, tcp_lso_disabled); in tcp_update_lso()
3358 (void) tcp_maxpsz_set(tcp, B_TRUE); in tcp_update_lso()
3365 tcp_update_zcopy(tcp_t *tcp) in tcp_update_zcopy() argument
3367 conn_t *connp = tcp->tcp_connp; in tcp_update_zcopy()
3368 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_update_zcopy()
3370 if (tcp->tcp_snd_zcopy_on) { in tcp_update_zcopy()
3371 tcp->tcp_snd_zcopy_on = B_FALSE; in tcp_update_zcopy()
3372 if (!TCP_IS_DETACHED(tcp)) { in tcp_update_zcopy()
3378 tcp->tcp_snd_zcopy_on = B_TRUE; in tcp_update_zcopy()
3379 if (!TCP_IS_DETACHED(tcp)) { in tcp_update_zcopy()
3396 tcp_t *tcp = (tcp_t *)arg; in tcp_notify() local
3397 conn_t *connp = tcp->tcp_connp; in tcp_notify()
3401 tcp_update_lso(tcp, connp->conn_ixa); in tcp_notify()
3404 tcp_update_pmtu(tcp, B_FALSE); in tcp_notify()
3407 tcp_update_zcopy(tcp); in tcp_notify()
3434 tcp_t *tcp; in tcp_acceptor_hash_lookup() local
3438 for (tcp = tf->tf_tcp; tcp != NULL; in tcp_acceptor_hash_lookup()
3439 tcp = tcp->tcp_acceptor_hash) { in tcp_acceptor_hash_lookup()
3440 if (tcp->tcp_acceptor_id == id) { in tcp_acceptor_hash_lookup()
3441 CONN_INC_REF(tcp->tcp_connp); in tcp_acceptor_hash_lookup()
3443 return (tcp); in tcp_acceptor_hash_lookup()
3454 tcp_acceptor_hash_insert(t_uscalar_t id, tcp_t *tcp) in tcp_acceptor_hash_insert() argument
3459 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_acceptor_hash_insert()
3463 if (tcp->tcp_ptpahn != NULL) in tcp_acceptor_hash_insert()
3464 tcp_acceptor_hash_remove(tcp); in tcp_acceptor_hash_insert()
3469 tcpnext->tcp_ptpahn = &tcp->tcp_acceptor_hash; in tcp_acceptor_hash_insert()
3470 tcp->tcp_acceptor_hash = tcpnext; in tcp_acceptor_hash_insert()
3471 tcp->tcp_ptpahn = tcpp; in tcp_acceptor_hash_insert()
3472 tcpp[0] = tcp; in tcp_acceptor_hash_insert()
3473 tcp->tcp_acceptor_lockp = &tf->tf_lock; /* For tcp_*_hash_remove */ in tcp_acceptor_hash_insert()
3481 tcp_acceptor_hash_remove(tcp_t *tcp) in tcp_acceptor_hash_remove() argument
3490 lockp = tcp->tcp_acceptor_lockp; in tcp_acceptor_hash_remove()
3492 if (tcp->tcp_ptpahn == NULL) in tcp_acceptor_hash_remove()
3497 if (tcp->tcp_ptpahn) { in tcp_acceptor_hash_remove()
3498 tcpnext = tcp->tcp_acceptor_hash; in tcp_acceptor_hash_remove()
3500 tcpnext->tcp_ptpahn = tcp->tcp_ptpahn; in tcp_acceptor_hash_remove()
3501 tcp->tcp_acceptor_hash = NULL; in tcp_acceptor_hash_remove()
3503 *tcp->tcp_ptpahn = tcpnext; in tcp_acceptor_hash_remove()
3504 tcp->tcp_ptpahn = NULL; in tcp_acceptor_hash_remove()
3507 tcp->tcp_acceptor_lockp = NULL; in tcp_acceptor_hash_remove()
3931 tcp_iss_init(tcp_t *tcp) in tcp_iss_init() argument
3936 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_iss_init()
3937 conn_t *connp = tcp->tcp_connp; in tcp_iss_init()
3940 tcp->tcp_iss = tcps->tcps_iss_incr_extra; in tcp_iss_init()
3951 tcp->tcp_iss += answer[0] ^ answer[1] ^ answer[2] ^ answer[3]; in tcp_iss_init()
3959 tcp->tcp_iss += (gethrtime() >> ISS_NSEC_SHT) + tcp_random(); in tcp_iss_init()
3962 tcp->tcp_iss += (uint32_t)gethrestime_sec() * in tcp_iss_init()
3966 tcp->tcp_valid_bits = TCP_ISS_VALID; in tcp_iss_init()
3967 tcp->tcp_fss = tcp->tcp_iss - 1; in tcp_iss_init()
3968 tcp->tcp_suna = tcp->tcp_iss; in tcp_iss_init()
3969 tcp->tcp_snxt = tcp->tcp_iss + 1; in tcp_iss_init()
3970 tcp->tcp_rexmit_nxt = tcp->tcp_snxt; in tcp_iss_init()
3971 tcp->tcp_csuna = tcp->tcp_snxt; in tcp_iss_init()
3981 tcp_setqfull(tcp_t *tcp) in tcp_setqfull() argument
3983 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_setqfull()
3984 conn_t *connp = tcp->tcp_connp; in tcp_setqfull()
3986 if (tcp->tcp_closed) in tcp_setqfull()
3989 conn_setqfull(connp, &tcp->tcp_flow_stopped); in tcp_setqfull()
3990 if (tcp->tcp_flow_stopped) in tcp_setqfull()
3995 tcp_clrqfull(tcp_t *tcp) in tcp_clrqfull() argument
3997 conn_t *connp = tcp->tcp_connp; in tcp_clrqfull()
3999 if (tcp->tcp_closed) in tcp_clrqfull()
4001 conn_clrqfull(connp, &tcp->tcp_flow_stopped); in tcp_clrqfull()
4054 tcp_t *tcp = connp->conn_tcp; in tcp_do_bind() local
4056 if (tcp->tcp_state >= TCPS_BOUND) { in tcp_do_bind()
4059 "tcp_bind: bad state, %d", tcp->tcp_state); in tcp_do_bind()
4068 ASSERT(tcp->tcp_state == TCPS_BOUND); in tcp_do_bind()
4069 tcp->tcp_conn_req_max = 0; in tcp_do_bind()
4082 tcp_t *tcp = connp->conn_tcp; in tcp_do_connect() local
4091 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_do_connect()
4095 oldstate = tcp->tcp_state; in tcp_do_connect()
4137 switch (tcp->tcp_state) { in tcp_do_connect()
4178 error = tcp_connect_ipv6(tcp, &sin6->sin6_addr, in tcp_do_connect()
4195 error = tcp_connect_ipv4(tcp, dstaddrp, dstport, in tcp_do_connect()
4202 error = tcp_connect_ipv4(tcp, dstaddrp, dstport, srcid); in tcp_do_connect()
4214 tcp->tcp_active_open = 1; in tcp_do_connect()
4219 mss = tcp->tcp_mss - connp->conn_ht_iphc_len; in tcp_do_connect()
4228 tcp->tcp_rwnd = connp->conn_rcvbuf; in tcp_do_connect()
4229 tcp->tcp_rwnd = MAX(MSS_ROUNDUP(tcp->tcp_rwnd, mss), in tcp_do_connect()
4231 connp->conn_rcvbuf = tcp->tcp_rwnd; in tcp_do_connect()
4232 tcp_set_ws_value(tcp); in tcp_do_connect()
4233 tcp->tcp_tcpha->tha_win = htons(tcp->tcp_rwnd >> tcp->tcp_rcv_ws); in tcp_do_connect()
4234 if (tcp->tcp_rcv_ws > 0 || tcps->tcps_wscale_always) in tcp_do_connect()
4235 tcp->tcp_snd_ws_ok = B_TRUE; in tcp_do_connect()
4244 (tcp->tcp_rcv_ws && tcps->tcps_tstamp_if_wscale)) { in tcp_do_connect()
4245 tcp->tcp_snd_ts_ok = B_TRUE; in tcp_do_connect()
4254 ASSERT(tcp->tcp_num_sack_blk == 0); in tcp_do_connect()
4255 ASSERT(tcp->tcp_notsack_list == NULL); in tcp_do_connect()
4256 tcp->tcp_snd_sack_ok = B_TRUE; in tcp_do_connect()
4268 tcp->tcp_ecn_ok = B_TRUE; in tcp_do_connect()
4272 connp->conn_ixa, void, NULL, tcp_t *, tcp, void, NULL, in tcp_do_connect()
4275 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_do_connect()
4276 syn_mp = tcp_xmit_mp(tcp, NULL, 0, NULL, NULL, in tcp_do_connect()
4277 tcp->tcp_iss, B_FALSE, NULL, B_FALSE); in tcp_do_connect()
4284 SOCK_CONNID_BUMP(tcp->tcp_connid); in tcp_do_connect()
4291 void_ip_t *, syn_mp->b_rptr, tcp_t *, tcp, in tcp_do_connect()
4294 tcp_send_data(tcp, syn_mp); in tcp_do_connect()
4297 if (tcp->tcp_conn.tcp_opts_conn_req != NULL) in tcp_do_connect()
4298 tcp_close_mpp(&tcp->tcp_conn.tcp_opts_conn_req); in tcp_do_connect()
4304 tcp->tcp_state = oldstate; in tcp_do_connect()
4305 if (tcp->tcp_conn.tcp_opts_conn_req != NULL) in tcp_do_connect()
4306 tcp_close_mpp(&tcp->tcp_conn.tcp_opts_conn_req); in tcp_do_connect()
4314 tcp_t *tcp = connp->conn_tcp; in tcp_do_listen() local
4316 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_do_listen()
4322 if (tcp->tcp_state >= TCPS_BOUND) { in tcp_do_listen()
4323 if ((tcp->tcp_state == TCPS_BOUND || in tcp_do_listen()
4324 tcp->tcp_state == TCPS_LISTEN) && backlog > 0) { in tcp_do_listen()
4336 "tcp_listen: bad state, %d", tcp->tcp_state); in tcp_do_listen()
4370 ASSERT(tcp->tcp_state == TCPS_BOUND || tcp->tcp_state == TCPS_LISTEN); in tcp_do_listen()
4371 tcp->tcp_conn_req_max = backlog; in tcp_do_listen()
4372 if (tcp->tcp_conn_req_max) { in tcp_do_listen()
4373 if (tcp->tcp_conn_req_max < tcps->tcps_conn_req_min) in tcp_do_listen()
4374 tcp->tcp_conn_req_max = tcps->tcps_conn_req_min; in tcp_do_listen()
4375 if (tcp->tcp_conn_req_max > tcps->tcps_conn_req_max_q) in tcp_do_listen()
4376 tcp->tcp_conn_req_max = tcps->tcps_conn_req_max_q; in tcp_do_listen()
4383 if (tcp->tcp_state != TCPS_LISTEN) { in tcp_do_listen()
4384 tcp->tcp_state = TCPS_LISTEN; in tcp_do_listen()
4386 connp->conn_ixa, void, NULL, tcp_t *, tcp, in tcp_do_listen()
4389 tcp->tcp_eager_next_q0 = tcp->tcp_eager_prev_q0 = tcp; in tcp_do_listen()
4390 tcp->tcp_eager_next_drop_q0 = tcp; in tcp_do_listen()
4391 tcp->tcp_eager_prev_drop_q0 = tcp; in tcp_do_listen()
4392 tcp->tcp_second_ctimer_threshold = in tcp_do_listen()
4413 oldstate = tcp->tcp_state; in tcp_do_listen()
4414 tcp->tcp_state = TCPS_IDLE; in tcp_do_listen()
4416 connp->conn_ixa, void, NULL, tcp_t *, tcp, void, NULL, in tcp_do_listen()
4434 tcp_bind_hash_remove(tcp); in tcp_do_listen()
4443 tcp->tcp_listen_cnt == NULL) { in tcp_do_listen()
4478 tcp->tcp_listen_cnt = tlc; in tcp_do_listen()