Lines Matching refs:tcp
111 tcp_t *tcp; member
229 #define SET_WS_VALUE(tcp) \ argument
232 uint32_t rwnd = (tcp)->tcp_rwnd; \
236 (tcp)->tcp_rcv_ws = i; \
246 #define SET_ECT(tcp, iph) \ argument
247 if ((tcp)->tcp_ipversion == IPV4_VERSION) { \
276 #define TCP_TIMER_RESTART(tcp, intvl) \ argument
277 (tcp)->tcp_rto_timeout = prom_gettime() + intvl; \
278 (tcp)->tcp_timer_running = B_TRUE;
468 tcp_drain_input(tcp_t *tcp, int sock_id, int timeout) in tcp_drain_input() argument
477 tcp_display(tcp, NULL, DISP_ADDR_AND_PORT)); in tcp_drain_input()
522 tcp_rput_data(tcp, mp, sock_id); in tcp_drain_input()
532 tcp = NULL; in tcp_drain_input()
535 if (tcp == NULL || sockets[sock_id].pcb == NULL) { in tcp_drain_input()
550 tcp_drain_needed(sock_id, tcp); in tcp_drain_input()
565 tcp_t *tcp; in tcp_input() local
569 if ((tcp = sockets[sock_id].pcb) == NULL) in tcp_input()
585 tcp_rput_data(tcp, mp, sock_id); in tcp_input()
592 if (tcp->tcp_rcv_list != NULL) { in tcp_input()
593 tcp_rcv_drain(sock_id, tcp); in tcp_input()
596 if (tcp->tcp_state == TCPS_CLOSE_WAIT) { in tcp_input()
610 tcp_send(int sock_id, tcp_t *tcp, const void *msg, int len) in tcp_send() argument
615 int mss = tcp->tcp_mss; in tcp_send()
636 if ((mp = allocb(mss + tcp->tcp_ip_hdr_len + in tcp_send()
640 mp->b_rptr += tcp->tcp_hdr_len + tcp_wroff_xtra; in tcp_send()
672 win_size = (tcp->tcp_swnd > tcp->tcp_cwnd) ? tcp->tcp_cwnd : in tcp_send()
673 tcp->tcp_swnd; in tcp_send()
674 win_size -= tcp->tcp_snxt; in tcp_send()
675 win_size += tcp->tcp_suna; in tcp_send()
676 if (win_size < (2 * tcp->tcp_mss)) in tcp_send()
677 if (tcp_drain_input(tcp, sock_id, 5) < 0) in tcp_send()
680 tcp_wput_data(tcp, head, sock_id); in tcp_send()
696 tcp_free(tcp_t *tcp) in tcp_free() argument
698 if (tcp->tcp_iphc != NULL) { in tcp_free()
699 bkmem_free((caddr_t)tcp->tcp_iphc, tcp->tcp_iphc_len); in tcp_free()
700 tcp->tcp_iphc = NULL; in tcp_free()
702 if (tcp->tcp_xmit_head != NULL) { in tcp_free()
703 freemsg(tcp->tcp_xmit_head); in tcp_free()
704 tcp->tcp_xmit_head = NULL; in tcp_free()
706 if (tcp->tcp_rcv_list != NULL) { in tcp_free()
707 freemsg(tcp->tcp_rcv_list); in tcp_free()
708 tcp->tcp_rcv_list = NULL; in tcp_free()
710 if (tcp->tcp_reass_head != NULL) { in tcp_free()
711 freemsg(tcp->tcp_reass_head); in tcp_free()
712 tcp->tcp_reass_head = NULL; in tcp_free()
714 if (tcp->tcp_sack_info != NULL) { in tcp_free()
715 bkmem_free((caddr_t)tcp->tcp_sack_info, in tcp_free()
717 tcp->tcp_sack_info = NULL; in tcp_free()
722 tcp_close_detached(tcp_t *tcp) in tcp_close_detached() argument
724 if (tcp->tcp_listener != NULL) in tcp_close_detached()
725 tcp_eager_unlink(tcp); in tcp_close_detached()
726 tcp_free(tcp); in tcp_close_detached()
727 bkmem_free((caddr_t)tcp, sizeof (tcp_t)); in tcp_close_detached()
736 tcp_eager_unlink(tcp_t *tcp) in tcp_eager_unlink() argument
738 tcp_t *listener = tcp->tcp_listener; in tcp_eager_unlink()
741 if (tcp->tcp_eager_next_q0 != NULL) { in tcp_eager_unlink()
742 assert(tcp->tcp_eager_prev_q0 != NULL); in tcp_eager_unlink()
745 tcp->tcp_eager_next_q0->tcp_eager_prev_q0 = in tcp_eager_unlink()
746 tcp->tcp_eager_prev_q0; in tcp_eager_unlink()
747 tcp->tcp_eager_prev_q0->tcp_eager_next_q0 = in tcp_eager_unlink()
748 tcp->tcp_eager_next_q0; in tcp_eager_unlink()
755 if (tcpp[0] == tcp) { in tcp_eager_unlink()
756 if (listener->tcp_eager_last_q == tcp) { in tcp_eager_unlink()
763 assert(tcp->tcp_eager_next_q == NULL); in tcp_eager_unlink()
779 tcpp[0] = tcp->tcp_eager_next_q; in tcp_eager_unlink()
780 tcp->tcp_eager_next_q = NULL; in tcp_eager_unlink()
781 tcp->tcp_eager_last_q = NULL; in tcp_eager_unlink()
788 tcp->tcp_listener = NULL; in tcp_eager_unlink()
825 tcp_t *tcp; in tcp_shutdown() local
829 if ((tcp = sockets[sock_id].pcb) == NULL) { in tcp_shutdown()
838 if (tcp_drain_input(tcp, sock_id, 5) < 0) { in tcp_shutdown()
844 tcp_clean_death(sock_id, tcp, 0); in tcp_shutdown()
848 DEBUG_1("tcp_shutdown: tcp_state %x\n", tcp->tcp_state); in tcp_shutdown()
849 switch (tcp->tcp_state) { in tcp_shutdown()
862 if (tcp_xmit_end(tcp, sock_id) == 0 && in tcp_shutdown()
863 tcp_state_wait(sock_id, tcp, TCPS_FIN_WAIT_2) < 0) { in tcp_shutdown()
883 tcp_t *tcp; in tcp_close() local
886 if ((tcp = sockets[sock_id].pcb) == NULL) { in tcp_close()
897 if (tcp_drain_input(tcp, sock_id, 5) < 0) { in tcp_close()
903 tcp_clean_death(sock_id, tcp, 0); in tcp_close()
907 if (tcp->tcp_conn_req_cnt_q0 != 0 || tcp->tcp_conn_req_cnt_q != 0) { in tcp_close()
909 tcp_eager_cleanup(tcp, 0, sock_id); in tcp_close()
913 switch (tcp->tcp_state) { in tcp_close()
935 if (tcp->tcp_linger && tcp->tcp_lingertime == 0) { in tcp_close()
943 if (tcp->tcp_rcv_list != NULL || in tcp_close()
944 tcp->tcp_reass_head != NULL) { in tcp_close()
948 if (tcp->tcp_state <= TCPS_LISTEN) in tcp_close()
958 (void) tcp_xmit_end(tcp, sock_id); in tcp_close()
966 if (tcp->tcp_linger && tcp->tcp_lingertime > 0 && in tcp_close()
967 !(tcp->tcp_fin_acked) && in tcp_close()
968 tcp->tcp_state >= TCPS_ESTABLISHED) { in tcp_close()
971 tcp->tcp_client_errno = 0; in tcp_close()
973 (tcp->tcp_lingertime * 1000); in tcp_close()
974 while (!(tcp->tcp_fin_acked) && in tcp_close()
975 tcp->tcp_state >= TCPS_ESTABLISHED && in tcp_close()
976 tcp->tcp_client_errno == 0 && in tcp_close()
978 if (tcp_drain_input(tcp, sock_id, 5) < 0) { in tcp_close()
981 tcp, 0); in tcp_close()
986 tcp->tcp_client_errno = 0; in tcp_close()
988 if (tcp_state_wait(sock_id, tcp, TCPS_TIME_WAIT) < 0) { in tcp_close()
1001 if (tcp->tcp_state == TCPS_ESTABLISHED || in tcp_close()
1002 tcp->tcp_state == TCPS_CLOSE_WAIT) in tcp_close()
1004 if (tcp->tcp_state == TCPS_SYN_SENT || in tcp_close()
1005 tcp->tcp_state == TCPS_SYN_RCVD) in tcp_close()
1007 tcp_xmit_ctl(msg, tcp, NULL, tcp->tcp_snxt, 0, TH_RST, 0, in tcp_close()
1011 tcp_free(tcp); in tcp_close()
1012 bkmem_free((caddr_t)tcp, sizeof (tcp_t)); in tcp_close()
1021 tcp_t *tcp; in tcp_listen() local
1023 if ((tcp = (tcp_t *)(sockets[sock_id].pcb)) == NULL) { in tcp_listen()
1028 if (tcp->tcp_state > TCPS_LISTEN || tcp->tcp_state < TCPS_BOUND) { in tcp_listen()
1033 if (tcp->tcp_state != TCPS_LISTEN) { in tcp_listen()
1034 tcp->tcp_eager_next_q0 = tcp->tcp_eager_prev_q0 = tcp; in tcp_listen()
1035 tcp->tcp_eager_next_q = NULL; in tcp_listen()
1036 tcp->tcp_state = TCPS_LISTEN; in tcp_listen()
1037 tcp->tcp_second_ctimer_threshold = tcp_ip_abort_linterval; in tcp_listen()
1039 if ((tcp->tcp_conn_req_max = backlog) > tcp_conn_req_max_q) { in tcp_listen()
1040 tcp->tcp_conn_req_max = tcp_conn_req_max_q; in tcp_listen()
1042 if (tcp->tcp_conn_req_max < tcp_conn_req_min) { in tcp_listen()
1043 tcp->tcp_conn_req_max = tcp_conn_req_min; in tcp_listen()
1141 tcp_t *tcp; in tcp_bindi() local
1147 ((tcp = (tcp_t *)sockets[i].pcb) == NULL) || in tcp_bindi()
1148 ntohs(tcp->tcp_lport) != port) { in tcp_bindi()
1156 if (reuseaddr && tcp->tcp_state > TCPS_LISTEN) { in tcp_bindi()
1159 if (tcp->tcp_bound_source != INADDR_ANY && in tcp_bindi()
1161 tcp->tcp_bound_source != *addr) { in tcp_bindi()
1181 tcp_t *tcp; in tcp_bind() local
1186 if ((tcp = (tcp_t *)sockets[sock_id].pcb) == NULL) { in tcp_bind()
1191 if (tcp->tcp_state >= TCPS_BOUND) { in tcp_bind()
1200 tcp->tcp_bound_source = sockets[sock_id].bind.sin_addr.s_addr; in tcp_bind()
1202 tcp->tcp_ipha->ip_src.s_addr = tcp->tcp_bound_source; in tcp_bind()
1214 allocated_port = tcp_bindi(requested_port, &(tcp->tcp_bound_source), in tcp_bind()
1221 tcp->tcp_lport = htons(allocated_port); in tcp_bind()
1222 *(uint16_t *)tcp->tcp_tcph->th_lport = tcp->tcp_lport; in tcp_bind()
1223 sockets[sock_id].bind.sin_port = tcp->tcp_lport; in tcp_bind()
1224 tcp->tcp_state = TCPS_BOUND; in tcp_bind()
1232 tcp_conn_check(tcp_t *tcp) in tcp_conn_check() argument
1246 if (tmp_tcp->tcp_lport != tcp->tcp_lport || in tcp_conn_check()
1247 tmp_tcp->tcp_fport != tcp->tcp_fport || in tcp_conn_check()
1248 tmp_tcp->tcp_bound_source != tcp->tcp_bound_source || in tcp_conn_check()
1249 tmp_tcp->tcp_remote != tcp->tcp_remote) { in tcp_conn_check()
1262 tcp_t *tcp; in tcp_connect() local
1269 if ((tcp = (tcp_t *)(sockets[sock_id].pcb)) == NULL) { in tcp_connect()
1307 if (tcp->tcp_bound_source == INADDR_ANY) { in tcp_connect()
1315 tcp->tcp_bound_source = sockets[sock_id].bind.sin_addr.s_addr; in tcp_connect()
1316 tcp->tcp_ipha->ip_src.s_addr = tcp->tcp_bound_source; in tcp_connect()
1322 if (dstaddr == tcp->tcp_ipha->ip_src.s_addr && in tcp_connect()
1323 dstport == tcp->tcp_lport) { in tcp_connect()
1328 tcp->tcp_ipha->ip_dst.s_addr = dstaddr; in tcp_connect()
1329 tcp->tcp_remote = dstaddr; in tcp_connect()
1330 tcph = tcp->tcp_tcph; in tcp_connect()
1332 tcp->tcp_fport = dstport; in tcp_connect()
1338 if (tcp_conn_check(tcp) < 0) { in tcp_connect()
1354 mss = tcp->tcp_mss - tcp->tcp_hdr_len; in tcp_connect()
1355 tcp->tcp_rwnd = MAX(MSS_ROUNDUP(tcp->tcp_rwnd, mss), in tcp_connect()
1357 tcp->tcp_rwnd_max = tcp->tcp_rwnd; in tcp_connect()
1358 SET_WS_VALUE(tcp); in tcp_connect()
1359 U32_TO_ABE16((tcp->tcp_rwnd >> tcp->tcp_rcv_ws), in tcp_connect()
1360 tcp->tcp_tcph->th_win); in tcp_connect()
1361 if (tcp->tcp_rcv_ws > 0 || tcp_wscale_always) in tcp_connect()
1362 tcp->tcp_snd_ws_ok = B_TRUE; in tcp_connect()
1371 (tcp->tcp_rcv_ws && tcp_tstamp_if_wscale)) { in tcp_connect()
1372 tcp->tcp_snd_ts_ok = B_TRUE; in tcp_connect()
1376 tcp->tcp_snd_sack_ok) { in tcp_connect()
1377 assert(tcp->tcp_sack_info == NULL); in tcp_connect()
1378 if ((tcp->tcp_sack_info = (tcp_sack_info_t *)bkmem_zalloc( in tcp_connect()
1380 tcp->tcp_snd_sack_ok = B_FALSE; in tcp_connect()
1382 tcp->tcp_snd_sack_ok = B_TRUE; in tcp_connect()
1394 tcp->tcp_ecn_ok = B_TRUE; in tcp_connect()
1396 tcp_iss_init(tcp); in tcp_connect()
1397 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_connect()
1398 tcp->tcp_active_open = B_TRUE; in tcp_connect()
1400 tcp->tcp_state = TCPS_SYN_SENT; in tcp_connect()
1401 syn_mp = tcp_xmit_mp(tcp, NULL, 0, NULL, NULL, tcp->tcp_iss, B_FALSE, in tcp_connect()
1421 return (tcp_state_wait(sock_id, tcp, TCPS_ESTABLISHED)); in tcp_connect()
1571 tcp_drop_q0(tcp_t *tcp) in tcp_drop_q0() argument
1575 assert(tcp->tcp_eager_next_q0 != tcp->tcp_eager_prev_q0); in tcp_drop_q0()
1582 eager = tcp->tcp_eager_prev_q0; in tcp_drop_q0()
1586 if (eager == tcp) { in tcp_drop_q0()
1587 eager = tcp->tcp_eager_prev_q0; in tcp_drop_q0()
1593 tcp->tcp_conn_req_cnt_q0, in tcp_drop_q0()
1594 tcp_display(tcp, NULL, DISP_PORT_ONLY)); in tcp_drop_q0()
1603 tcp_conn_request(tcp_t *tcp, mblk_t *mp, uint_t sock_id, uint_t ip_hdr_len) in tcp_conn_request() argument
1613 if (tcp->tcp_conn_req_cnt_q >= tcp->tcp_conn_req_max) { in tcp_conn_request()
1617 tcp->tcp_conn_req_max, tcp->tcp_conn_req_cnt_q, in tcp_conn_request()
1618 tcp_display(tcp, NULL, DISP_PORT_ONLY)); in tcp_conn_request()
1624 if (tcp->tcp_conn_req_cnt_q0 >= in tcp_conn_request()
1625 tcp->tcp_conn_req_max + tcp_conn_req_max_q0) { in tcp_conn_request()
1631 tcp->tcp_last_rcv_lbolt = prom_gettime(); in tcp_conn_request()
1632 if (!tcp_drop_q0(tcp)) { in tcp_conn_request()
1638 tcp->tcp_conn_req_cnt_q0, in tcp_conn_request()
1639 tcp_display(tcp, NULL, DISP_PORT_ONLY)); in tcp_conn_request()
1674 eager->tcp_family = tcp->tcp_family; in tcp_conn_request()
1676 err = tcp_accept_comm(tcp, eager, mp, ip_hdr_len); in tcp_conn_request()
1682 tcp->tcp_eager_next_q0->tcp_eager_prev_q0 = eager; in tcp_conn_request()
1683 eager->tcp_eager_next_q0 = tcp->tcp_eager_next_q0; in tcp_conn_request()
1684 tcp->tcp_eager_next_q0 = eager; in tcp_conn_request()
1685 eager->tcp_eager_prev_q0 = tcp; in tcp_conn_request()
1688 eager->tcp_listener = tcp; in tcp_conn_request()
1689 tcp->tcp_conn_req_cnt_q0++; in tcp_conn_request()
1700 tcp_state_wait(int sock_id, tcp_t *tcp, int state) in tcp_state_wait() argument
1715 if (timeout > tcp->tcp_rto) { in tcp_state_wait()
1716 sockets[sock_id].in_timeout = tcp->tcp_rto; in tcp_state_wait()
1736 if (tcp != NULL && tcp->tcp_state == state) in tcp_state_wait()
1752 tcp_rput_data(tcp, mp, sock_id); in tcp_state_wait()
1761 tcp = NULL; in tcp_state_wait()
1766 if (tcp == NULL || sockets[sock_id].pcb == NULL) { in tcp_state_wait()
1781 if ((state == TCPS_ALL_ACKED) && (tcp->tcp_suna == tcp->tcp_snxt)) { in tcp_state_wait()
1784 if (tcp->tcp_state != state) { in tcp_state_wait()
1785 if (prom_gettime() > tcp->tcp_rto_timeout) in tcp_state_wait()
1786 tcp_timer(tcp, sock_id); in tcp_state_wait()
1793 tcp_drain_needed(sock_id, tcp); in tcp_state_wait()
1832 tcp_t *tcp; in tcp_lookup_ipv4() local
1836 (tcp = (tcp_t *)sockets[i].pcb) != NULL) { in tcp_lookup_ipv4()
1837 if (tcph->tha_lport == tcp->tcp_fport && in tcp_lookup_ipv4()
1838 tcph->tha_fport == tcp->tcp_lport && in tcp_lookup_ipv4()
1839 iph->ip_src.s_addr == tcp->tcp_remote && in tcp_lookup_ipv4()
1840 iph->ip_dst.s_addr == tcp->tcp_bound_source && in tcp_lookup_ipv4()
1841 tcp->tcp_state >= min_state) { in tcp_lookup_ipv4()
1843 return (tcp); in tcp_lookup_ipv4()
1848 for (tcp = tcp_time_wait_head; tcp != NULL; in tcp_lookup_ipv4()
1849 tcp = tcp->tcp_time_wait_next) { in tcp_lookup_ipv4()
1850 if (tcph->tha_lport == tcp->tcp_fport && in tcp_lookup_ipv4()
1851 tcph->tha_fport == tcp->tcp_lport && in tcp_lookup_ipv4()
1852 iph->ip_src.s_addr == tcp->tcp_remote && in tcp_lookup_ipv4()
1853 iph->ip_dst.s_addr == tcp->tcp_bound_source && in tcp_lookup_ipv4()
1854 tcp->tcp_state >= min_state) { in tcp_lookup_ipv4()
1856 return (tcp); in tcp_lookup_ipv4()
1867 tcp_t *tcp; in tcp_lookup_listener_ipv4() local
1871 (tcp = (tcp_t *)sockets[i].pcb) != NULL) { in tcp_lookup_listener_ipv4()
1872 if (tcp->tcp_lport == port && in tcp_lookup_listener_ipv4()
1873 (tcp->tcp_bound_source == addr || in tcp_lookup_listener_ipv4()
1874 tcp->tcp_bound_source == INADDR_ANY)) { in tcp_lookup_listener_ipv4()
1876 return (tcp); in tcp_lookup_listener_ipv4()
1888 tcp_t *tcp; in tcp_lookup_eager_ipv4() local
1893 for (tcp = listener->tcp_eager_next_q; tcp != NULL; in tcp_lookup_eager_ipv4()
1894 tcp = tcp->tcp_eager_next_q) { in tcp_lookup_eager_ipv4()
1895 if (tcph->tha_lport == tcp->tcp_fport && in tcp_lookup_eager_ipv4()
1896 tcph->tha_fport == tcp->tcp_lport && in tcp_lookup_eager_ipv4()
1897 iph->ip_src.s_addr == tcp->tcp_remote && in tcp_lookup_eager_ipv4()
1898 iph->ip_dst.s_addr == tcp->tcp_bound_source) { in tcp_lookup_eager_ipv4()
1899 return (tcp); in tcp_lookup_eager_ipv4()
1903 for (tcp = listener->tcp_eager_next_q0; tcp != listener; in tcp_lookup_eager_ipv4()
1904 tcp = tcp->tcp_eager_next_q0) { in tcp_lookup_eager_ipv4()
1905 if (tcph->tha_lport == tcp->tcp_fport && in tcp_lookup_eager_ipv4()
1906 tcph->tha_fport == tcp->tcp_lport && in tcp_lookup_eager_ipv4()
1907 iph->ip_src.s_addr == tcp->tcp_remote && in tcp_lookup_eager_ipv4()
1908 iph->ip_dst.s_addr == tcp->tcp_bound_source) { in tcp_lookup_eager_ipv4()
1909 return (tcp); in tcp_lookup_eager_ipv4()
1920 tcp_clean_death(int sock_id, tcp_t *tcp, int err) in tcp_clean_death() argument
1922 tcp_free(tcp); in tcp_clean_death()
1923 if (tcp->tcp_state == TCPS_TIME_WAIT) in tcp_clean_death()
1924 tcp_time_wait_remove(tcp); in tcp_clean_death()
1931 bkmem_free((caddr_t)tcp, sizeof (tcp_t)); in tcp_clean_death()
1954 tcp_rwnd_set(tcp_t *tcp, uint32_t rwnd) in tcp_rwnd_set() argument
1956 uint32_t mss = tcp->tcp_mss; in tcp_rwnd_set()
1960 if (tcp->tcp_rwnd_max != 0) in tcp_rwnd_set()
1961 old_max_rwnd = tcp->tcp_rwnd_max; in tcp_rwnd_set()
1963 old_max_rwnd = tcp->tcp_rwnd; in tcp_rwnd_set()
1979 if (rwnd < old_max_rwnd && tcp->tcp_state > TCPS_SYN_SENT) { in tcp_rwnd_set()
1988 max_transmittable_rwnd = TCP_MAXWIN << tcp->tcp_rcv_ws; in tcp_rwnd_set()
1999 tcp->tcp_rwnd = old_max_rwnd = rwnd; in tcp_rwnd_set()
2007 tcp->tcp_rwnd += rwnd - old_max_rwnd; in tcp_rwnd_set()
2008 U32_TO_ABE16(tcp->tcp_rwnd >> tcp->tcp_rcv_ws, tcp->tcp_tcph->th_win); in tcp_rwnd_set()
2009 if ((tcp->tcp_rcv_ws > 0) && rwnd > tcp->tcp_cwnd_max) in tcp_rwnd_set()
2010 tcp->tcp_cwnd_max = rwnd; in tcp_rwnd_set()
2011 tcp->tcp_rwnd_max = rwnd; in tcp_rwnd_set()
2030 tcp_t *tcp; in tcp_parse_options() local
2083 if ((tcp = tcpopt->tcp) == NULL) { in tcp_parse_options()
2094 assert(tcp->tcp_sack_info != NULL); in tcp_parse_options()
2095 if (tcp->tcp_notsack_list == NULL) { in tcp_parse_options()
2096 tcp_notsack_update(&(tcp->tcp_notsack_list), in tcp_parse_options()
2097 tcp->tcp_suna, tcp->tcp_snxt, in tcp_parse_options()
2098 &(tcp->tcp_num_notsack_blk), in tcp_parse_options()
2099 &(tcp->tcp_cnt_notsack_list)); in tcp_parse_options()
2106 if (tcp->tcp_notsack_list == NULL) { in tcp_parse_options()
2110 tcp->tcp_fack = tcp->tcp_suna; in tcp_parse_options()
2131 SEQ_LT(sack_begin, tcp->tcp_suna) || in tcp_parse_options()
2132 SEQ_GT(sack_end, tcp->tcp_snxt)) { in tcp_parse_options()
2135 tcp_notsack_insert(&(tcp->tcp_notsack_list), in tcp_parse_options()
2137 &(tcp->tcp_num_notsack_blk), in tcp_parse_options()
2138 &(tcp->tcp_cnt_notsack_list)); in tcp_parse_options()
2139 if (SEQ_GT(sack_end, tcp->tcp_fack)) { in tcp_parse_options()
2140 tcp->tcp_fack = sack_end; in tcp_parse_options()
2183 tcp_mss_set(tcp_t *tcp, uint32_t mss) in tcp_mss_set() argument
2198 if (mss < tcp->tcp_naglim || tcp->tcp_mss == tcp->tcp_naglim) in tcp_mss_set()
2199 tcp->tcp_naglim = mss; in tcp_mss_set()
2204 if ((mss << 2) > tcp->tcp_xmit_hiwater) in tcp_mss_set()
2205 tcp->tcp_xmit_hiwater = mss << 2; in tcp_mss_set()
2206 tcp->tcp_mss = mss; in tcp_mss_set()
2216 tcp->tcp_cwnd = MIN(tcp_slow_start_initial * mss, in tcp_mss_set()
2218 tcp->tcp_cwnd_cnt = 0; in tcp_mss_set()
2231 tcp_process_options(tcp_t *tcp, tcph_t *tcph) in tcp_process_options() argument
2238 tcpopt.tcp = NULL; in tcp_process_options()
2250 if (tcp->tcp_ipversion == IPV4_VERSION) in tcp_process_options()
2260 tcp->tcp_snd_ws = tcpopt.tcp_opt_wscale; in tcp_process_options()
2261 tcp->tcp_snd_ws_ok = B_TRUE; in tcp_process_options()
2263 tcp->tcp_snd_ws = B_FALSE; in tcp_process_options()
2264 tcp->tcp_snd_ws_ok = B_FALSE; in tcp_process_options()
2265 tcp->tcp_rcv_ws = B_FALSE; in tcp_process_options()
2270 (tcp->tcp_snd_ts_ok || !tcp->tcp_active_open)) { in tcp_process_options()
2271 tmp_tcph = (char *)tcp->tcp_tcph; in tcp_process_options()
2273 tcp->tcp_snd_ts_ok = B_TRUE; in tcp_process_options()
2274 tcp->tcp_ts_recent = tcpopt.tcp_opt_ts_val; in tcp_process_options()
2275 tcp->tcp_last_rcv_lbolt = prom_gettime(); in tcp_process_options()
2277 assert(tcp->tcp_tcp_hdr_len == TCP_MIN_HEADER_LENGTH); in tcp_process_options()
2280 tmp_tcph += tcp->tcp_tcp_hdr_len; in tcp_process_options()
2285 tcp->tcp_hdr_len += TCPOPT_REAL_TS_LEN; in tcp_process_options()
2286 tcp->tcp_tcp_hdr_len += TCPOPT_REAL_TS_LEN; in tcp_process_options()
2287 tcp->tcp_tcph->th_offset_and_rsrvd[0] += (3 << 4); in tcp_process_options()
2289 tcp->tcp_snd_ts_ok = B_FALSE; in tcp_process_options()
2297 (tcp->tcp_snd_sack_ok || in tcp_process_options()
2298 (tcp_sack_permitted != 0 && !tcp->tcp_active_open))) { in tcp_process_options()
2300 if (tcp->tcp_sack_info == NULL) { in tcp_process_options()
2301 tcp->tcp_sack_info = (tcp_sack_info_t *)bkmem_zalloc( in tcp_process_options()
2304 if (tcp->tcp_sack_info == NULL) { in tcp_process_options()
2305 tcp->tcp_snd_sack_ok = B_FALSE; in tcp_process_options()
2307 tcp->tcp_snd_sack_ok = B_TRUE; in tcp_process_options()
2308 if (tcp->tcp_snd_ts_ok) { in tcp_process_options()
2309 tcp->tcp_max_sack_blk = 3; in tcp_process_options()
2311 tcp->tcp_max_sack_blk = 4; in tcp_process_options()
2322 if (tcp->tcp_sack_info != NULL) { in tcp_process_options()
2323 bkmem_free((caddr_t)tcp->tcp_sack_info, in tcp_process_options()
2325 tcp->tcp_sack_info = NULL; in tcp_process_options()
2327 tcp->tcp_snd_sack_ok = B_FALSE; in tcp_process_options()
2334 tcp->tcp_mss -= tcp->tcp_hdr_len; in tcp_process_options()
2342 tcpopt.tcp_opt_mss -= tcp->tcp_hdr_len - in tcp_process_options()
2356 tcp_mss_set(tcp, MIN(tcpopt.tcp_opt_mss, tcp->tcp_mss)); in tcp_process_options()
2364 tcp_paws_check(tcp_t *tcp, tcph_t *tcph, tcp_opt_t *tcpoptp) in tcp_paws_check() argument
2386 if (tcp->tcp_snd_sack_ok) { in tcp_paws_check()
2387 tcpoptp->tcp = tcp; in tcp_paws_check()
2389 tcpoptp->tcp = NULL; in tcp_paws_check()
2401 tcp->tcp_ts_recent)) { in tcp_paws_check()
2403 tcp->tcp_last_rcv_lbolt + PAWS_TIMEOUT)) { in tcp_paws_check()
2412 tcp->tcp_ts_recent = in tcp_paws_check()
2422 tcp->tcp_snd_ts_ok = B_FALSE; in tcp_paws_check()
2424 tcp->tcp_hdr_len -= TCPOPT_REAL_TS_LEN; in tcp_paws_check()
2425 tcp->tcp_tcp_hdr_len -= TCPOPT_REAL_TS_LEN; in tcp_paws_check()
2426 tcp->tcp_tcph->th_offset_and_rsrvd[0] -= (3 << 4); in tcp_paws_check()
2427 tcp_mss_set(tcp, tcp->tcp_mss + TCPOPT_REAL_TS_LEN); in tcp_paws_check()
2428 if (tcp->tcp_snd_sack_ok) { in tcp_paws_check()
2429 assert(tcp->tcp_sack_info != NULL); in tcp_paws_check()
2430 tcp->tcp_max_sack_blk = 4; in tcp_paws_check()
2450 tcp_get_seg_mp(tcp_t *tcp, uint32_t seq, int32_t *off) in tcp_get_seg_mp() argument
2456 if (SEQ_LT(seq, tcp->tcp_suna) || SEQ_GEQ(seq, tcp->tcp_snxt) || in tcp_get_seg_mp()
2460 cnt = seq - tcp->tcp_suna; in tcp_get_seg_mp()
2461 mp = tcp->tcp_xmit_head; in tcp_get_seg_mp()
2491 tcp_sack_rxmit(tcp_t *tcp, int sock_id) in tcp_sack_rxmit() argument
2499 assert(tcp->tcp_sack_info != NULL); in tcp_sack_rxmit()
2500 assert(tcp->tcp_notsack_list != NULL); in tcp_sack_rxmit()
2501 assert(tcp->tcp_rexmit == B_FALSE); in tcp_sack_rxmit()
2504 if (tcp->tcp_notsack_list == NULL) { in tcp_sack_rxmit()
2507 notsack_blk = tcp->tcp_notsack_list; in tcp_sack_rxmit()
2508 mss = tcp->tcp_mss; in tcp_sack_rxmit()
2514 usable_swnd = tcp->tcp_cwnd_ssthresh - tcp->tcp_pipe; in tcp_sack_rxmit()
2522 tcp->tcp_csuna = tcp->tcp_snxt; in tcp_sack_rxmit()
2524 notsack_blk = tcp->tcp_notsack_list; in tcp_sack_rxmit()
2527 tcp_seq begin = tcp->tcp_sack_snxt; in tcp_sack_rxmit()
2548 usable_swnd = tcp->tcp_cwnd_ssthresh - tcp->tcp_pipe; in tcp_sack_rxmit()
2550 tcp->tcp_cwnd = tcp->tcp_snxt - tcp->tcp_suna; in tcp_sack_rxmit()
2551 assert(tcp->tcp_cwnd > 0); in tcp_sack_rxmit()
2555 tcp->tcp_cwnd = tcp->tcp_snxt - tcp->tcp_suna + in tcp_sack_rxmit()
2568 snxt_mp = tcp_get_seg_mp(tcp, begin, &off); in tcp_sack_rxmit()
2575 xmit_mp = tcp_xmit_mp(tcp, snxt_mp, seg_len, &off, in tcp_sack_rxmit()
2582 tcp->tcp_pipe += seg_len; in tcp_sack_rxmit()
2583 tcp->tcp_sack_snxt = begin + seg_len; in tcp_sack_rxmit()
2604 if (SEQ_GT(tcp->tcp_sack_snxt, tcp->tcp_rexmit_max)) { in tcp_sack_rxmit()
2605 tcp->tcp_rexmit_max = tcp->tcp_sack_snxt; in tcp_sack_rxmit()
2612 tcp_rput_data(tcp_t *tcp, mblk_t *mp, int sock_id) in tcp_rput_data() argument
2680 if (tcp == NULL || in tcp_rput_data()
2681 tcph->tha_lport != tcp->tcp_fport || in tcp_rput_data()
2682 tcph->tha_fport != tcp->tcp_lport || in tcp_rput_data()
2683 iph->ip_src.s_addr != tcp->tcp_remote || in tcp_rput_data()
2684 iph->ip_dst.s_addr != tcp->tcp_bound_source) { in tcp_rput_data()
2687 tcp->tcp_state); in tcp_rput_data()
2703 if ((tcp = tcp_lookup_eager_ipv4(tcp1, in tcp_rput_data()
2711 tcp = tcp1; in tcp_rput_data()
2716 tcp_display(tcp, NULL, in tcp_rput_data()
2727 tcp = tcp1; in tcp_rput_data()
2741 if (tcp->tcp_state == TCPS_TIME_WAIT) { in tcp_rput_data()
2742 tcp_time_wait_processing(tcp, mp, seg_seq, seg_ack, in tcp_rput_data()
2751 assert(tcp != NULL && tcp->tcp_state != TCPS_TIME_WAIT); in tcp_rput_data()
2757 tcp->tcp_last_recv_time = prom_gettime(); in tcp_rput_data()
2768 switch (tcp->tcp_state) { in tcp_rput_data()
2788 if (tcp->tcp_conn_req_max > 0) { in tcp_rput_data()
2789 tcp = tcp_conn_request(tcp, mp, sock_id, ip_hdr_len); in tcp_rput_data()
2790 if (tcp == NULL) { in tcp_rput_data()
2798 tcp->tcp_irs = seg_seq; in tcp_rput_data()
2799 tcp->tcp_rack = seg_seq; in tcp_rput_data()
2800 tcp->tcp_rnxt = seg_seq + 1; in tcp_rput_data()
2801 U32_TO_ABE32(tcp->tcp_rnxt, tcp->tcp_tcph->th_ack); in tcp_rput_data()
2812 if (SEQ_LEQ(seg_ack, tcp->tcp_iss) || in tcp_rput_data()
2813 SEQ_GT(seg_ack, tcp->tcp_snxt)) { in tcp_rput_data()
2819 tcp, mp, seg_ack, 0, TH_RST, in tcp_rput_data()
2823 assert(tcp->tcp_suna + 1 == seg_ack); in tcp_rput_data()
2828 tcp_clean_death(sock_id, tcp, ECONNREFUSED); in tcp_rput_data()
2838 tcp_process_options(tcp, (tcph_t *)tcph); in tcp_rput_data()
2843 (void) tcp_rwnd_set(tcp, MSS_ROUNDUP(tcp->tcp_rwnd, in tcp_rput_data()
2844 tcp->tcp_mss)); in tcp_rput_data()
2847 if (tcp->tcp_ecn_ok) { in tcp_rput_data()
2849 tcp->tcp_ecn_ok = B_FALSE; in tcp_rput_data()
2858 tcp->tcp_irs = seg_seq; in tcp_rput_data()
2859 tcp->tcp_rack = seg_seq; in tcp_rput_data()
2860 tcp->tcp_rnxt = seg_seq + 1; in tcp_rput_data()
2861 U32_TO_ABE32(tcp->tcp_rnxt, tcp->tcp_tcph->th_ack); in tcp_rput_data()
2865 tcp->tcp_suna = tcp->tcp_iss + 1; in tcp_rput_data()
2866 tcp->tcp_valid_bits &= ~TCP_ISS_VALID; in tcp_rput_data()
2867 tcp->tcp_state = TCPS_ESTABLISHED; in tcp_rput_data()
2874 if (tcp->tcp_rexmit) { in tcp_rput_data()
2875 tcp->tcp_rexmit = B_FALSE; in tcp_rput_data()
2876 tcp->tcp_rexmit_nxt = tcp->tcp_snxt; in tcp_rput_data()
2877 tcp->tcp_rexmit_max = tcp->tcp_snxt; in tcp_rput_data()
2878 tcp->tcp_snd_burst = TCP_CWND_NORMAL; in tcp_rput_data()
2886 tcp->tcp_cwnd = tcp->tcp_mss; in tcp_rput_data()
2889 tcp->tcp_swl1 = seg_seq; in tcp_rput_data()
2890 tcp->tcp_swl2 = seg_ack; in tcp_rput_data()
2893 tcp->tcp_swnd = new_swnd; in tcp_rput_data()
2894 if (new_swnd > tcp->tcp_max_swnd) in tcp_rput_data()
2895 tcp->tcp_max_swnd = new_swnd; in tcp_rput_data()
2910 if (tcp->tcp_unsent) in tcp_rput_data()
2923 tcp->tcp_state = TCPS_SYN_RCVD; in tcp_rput_data()
2924 mp1 = tcp_xmit_mp(tcp, tcp->tcp_xmit_head, tcp->tcp_mss, in tcp_rput_data()
2925 NULL, NULL, tcp->tcp_iss, B_FALSE, NULL, B_FALSE); in tcp_rput_data()
2929 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_rput_data()
2935 if (tcp_state_wait(sock_id, tcp, TCPS_ALL_ACKED) < 0) { in tcp_rput_data()
2947 ((flags & TH_SYN) ? 0 : tcp->tcp_snd_ws); in tcp_rput_data()
2948 mss = tcp->tcp_mss; in tcp_rput_data()
2950 if (tcp->tcp_snd_ts_ok) { in tcp_rput_data()
2951 if (!tcp_paws_check(tcp, (tcph_t *)tcph, &tcpopt)) { in tcp_rput_data()
2960 } else if (tcp->tcp_snd_sack_ok) { in tcp_rput_data()
2961 assert(tcp->tcp_sack_info != NULL); in tcp_rput_data()
2962 tcpopt.tcp = tcp; in tcp_rput_data()
2970 gap = seg_seq - tcp->tcp_rnxt; in tcp_rput_data()
2971 rgap = tcp->tcp_rwnd - (gap + seg_len); in tcp_rput_data()
2979 if (seg_seq == tcp->tcp_irs && (flags & TH_SYN) && in tcp_rput_data()
3019 seg_len, tcp->tcp_rnxt, tcp->tcp_snxt, in tcp_rput_data()
3020 tcp_display(tcp, NULL, DISP_ADDR_AND_PORT)); in tcp_rput_data()
3059 seg_seq = tcp->tcp_rnxt; in tcp_rput_data()
3081 if (tcp->tcp_rwnd == 0) in tcp_rput_data()
3119 if (tcp->tcp_rwnd == 0 && seg_seq == tcp->tcp_rnxt) { in tcp_rput_data()
3123 tcp_rcv_drain(sock_id, tcp); in tcp_rput_data()
3152 if (tcp->tcp_ecn_ok) { in tcp_rput_data()
3156 tcp->tcp_ecn_echo_on = B_FALSE; in tcp_rput_data()
3164 tcp->tcp_ecn_echo_on = B_TRUE; in tcp_rput_data()
3173 if (tcp->tcp_snd_ts_ok && in tcp_rput_data()
3174 TSTMP_GEQ(tcpopt.tcp_opt_ts_val, tcp->tcp_ts_recent) && in tcp_rput_data()
3175 SEQ_LEQ(seg_seq, tcp->tcp_rack)) { in tcp_rput_data()
3176 tcp->tcp_ts_recent = tcpopt.tcp_opt_ts_val; in tcp_rput_data()
3177 tcp->tcp_last_rcv_lbolt = prom_gettime(); in tcp_rput_data()
3180 if (seg_seq != tcp->tcp_rnxt || tcp->tcp_reass_head) { in tcp_rput_data()
3189 tcp->tcp_valid_bits |= TCP_OFO_FIN_VALID; in tcp_rput_data()
3190 tcp->tcp_ofo_fin_seq = seg_seq + seg_len; in tcp_rput_data()
3196 if (tcp->tcp_snd_sack_ok) { in tcp_rput_data()
3197 assert(tcp->tcp_sack_info != NULL); in tcp_rput_data()
3198 tcp_sack_insert(tcp->tcp_sack_list, in tcp_rput_data()
3200 &(tcp->tcp_num_sack_blk)); in tcp_rput_data()
3207 mp = tcp_reass(tcp, mp, seg_seq); in tcp_rput_data()
3215 seg_seq = tcp->tcp_rnxt; in tcp_rput_data()
3221 if ((tcp->tcp_valid_bits & TCP_OFO_FIN_VALID) && in tcp_rput_data()
3222 seg_seq + seg_len == tcp->tcp_ofo_fin_seq) { in tcp_rput_data()
3224 tcp->tcp_valid_bits &= in tcp_rput_data()
3250 if ((tcp->tcp_valid_bits & TCP_OFO_FIN_VALID) && in tcp_rput_data()
3251 seg_seq + seg_len == tcp->tcp_ofo_fin_seq) { in tcp_rput_data()
3253 tcp->tcp_valid_bits &= ~TCP_OFO_FIN_VALID; in tcp_rput_data()
3259 switch (tcp->tcp_state) { in tcp_rput_data()
3261 (void) tcp_clean_death(sock_id, tcp, ECONNREFUSED); in tcp_rput_data()
3267 (void) tcp_clean_death(sock_id, tcp, ECONNRESET); in tcp_rput_data()
3271 (void) tcp_clean_death(sock_id, tcp, 0); in tcp_rput_data()
3274 assert(tcp->tcp_state != TCPS_TIME_WAIT); in tcp_rput_data()
3275 (void) tcp_clean_death(sock_id, tcp, ENXIO); in tcp_rput_data()
3289 assert(SEQ_GEQ(seg_seq, tcp->tcp_rnxt) && in tcp_rput_data()
3290 SEQ_LEQ(seg_seq, tcp->tcp_rnxt + tcp->tcp_rwnd)); in tcp_rput_data()
3297 seg_ack = tcp->tcp_snxt; in tcp_rput_data()
3299 tcp_xmit_ctl("TH_SYN", tcp, NULL, seg_ack, in tcp_rput_data()
3301 assert(tcp->tcp_state != TCPS_TIME_WAIT); in tcp_rput_data()
3302 (void) tcp_clean_death(sock_id, tcp, ECONNRESET); in tcp_rput_data()
3315 bytes_acked = (int)(seg_ack - tcp->tcp_suna); in tcp_rput_data()
3317 if (tcp->tcp_state == TCPS_SYN_RCVD) { in tcp_rput_data()
3318 tcp_t *listener = tcp->tcp_listener; in tcp_rput_data()
3326 if (bytes_acked < 1 || SEQ_GT(seg_ack, tcp->tcp_snxt)) { in tcp_rput_data()
3329 tcp, NULL, seg_ack, 0, TH_RST, 0, sock_id); in tcp_rput_data()
3346 tcp->tcp_eager_next_q0->tcp_eager_prev_q0 = in tcp_rput_data()
3347 tcp->tcp_eager_prev_q0; in tcp_rput_data()
3348 tcp->tcp_eager_prev_q0->tcp_eager_next_q0 = in tcp_rput_data()
3349 tcp->tcp_eager_next_q0; in tcp_rput_data()
3350 tcp->tcp_eager_prev_q0 = NULL; in tcp_rput_data()
3351 tcp->tcp_eager_next_q0 = NULL; in tcp_rput_data()
3362 tail->tcp_eager_next_q = tcp; in tcp_rput_data()
3364 listener->tcp_eager_next_q = tcp; in tcp_rput_data()
3366 listener->tcp_eager_last_q = tcp; in tcp_rput_data()
3367 tcp->tcp_eager_next_q = NULL; in tcp_rput_data()
3373 tcp->tcp_conn_def_q0 = B_TRUE; in tcp_rput_data()
3376 tcp->tcp_eager_prev_q0->tcp_eager_next_q0 = in tcp_rput_data()
3377 tcp->tcp_eager_next_q0; in tcp_rput_data()
3378 tcp->tcp_eager_next_q0->tcp_eager_prev_q0 = in tcp_rput_data()
3379 tcp->tcp_eager_prev_q0; in tcp_rput_data()
3382 tcp->tcp_eager_prev_q0 = listener->tcp_eager_prev_q0; in tcp_rput_data()
3383 tcp->tcp_eager_next_q0 = listener; in tcp_rput_data()
3384 listener->tcp_eager_prev_q0->tcp_eager_next_q0 = tcp; in tcp_rput_data()
3385 listener->tcp_eager_prev_q0 = tcp; in tcp_rput_data()
3388 tcp->tcp_suna = tcp->tcp_iss + 1; /* One for the SYN */ in tcp_rput_data()
3396 if (tcp->tcp_rexmit) { in tcp_rput_data()
3397 tcp->tcp_rexmit = B_FALSE; in tcp_rput_data()
3398 tcp->tcp_rexmit_nxt = tcp->tcp_snxt; in tcp_rput_data()
3399 tcp->tcp_rexmit_max = tcp->tcp_snxt; in tcp_rput_data()
3400 tcp->tcp_snd_burst = TCP_CWND_NORMAL; in tcp_rput_data()
3401 tcp->tcp_ms_we_have_waited = 0; in tcp_rput_data()
3402 tcp->tcp_cwnd = mss; in tcp_rput_data()
3416 tcp->tcp_swnd = 0; in tcp_rput_data()
3418 if (new_swnd > tcp->tcp_max_swnd) in tcp_rput_data()
3419 tcp->tcp_max_swnd = new_swnd; in tcp_rput_data()
3420 tcp->tcp_swl1 = seg_seq; in tcp_rput_data()
3421 tcp->tcp_swl2 = seg_ack; in tcp_rput_data()
3422 tcp->tcp_state = TCPS_ESTABLISHED; in tcp_rput_data()
3423 tcp->tcp_valid_bits &= ~TCP_ISS_VALID; in tcp_rput_data()
3434 if (tcp->tcp_cwr && SEQ_GT(seg_ack, tcp->tcp_cwr_snd_max)) in tcp_rput_data()
3435 tcp->tcp_cwr = B_FALSE; in tcp_rput_data()
3436 if (tcp->tcp_ecn_ok && (flags & TH_ECE)) { in tcp_rput_data()
3437 if (!tcp->tcp_cwr) { in tcp_rput_data()
3438 npkt = (MIN(tcp->tcp_cwnd, tcp->tcp_swnd) >> 1) / mss; in tcp_rput_data()
3439 tcp->tcp_cwnd_ssthresh = MAX(npkt, 2) * mss; in tcp_rput_data()
3440 tcp->tcp_cwnd = npkt * mss; in tcp_rput_data()
3446 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_rput_data()
3451 tcp->tcp_cwnd_cnt = 0; in tcp_rput_data()
3453 tcp->tcp_cwr = B_TRUE; in tcp_rput_data()
3460 tcp->tcp_cwr_snd_max = tcp->tcp_snxt; in tcp_rput_data()
3461 tcp->tcp_ecn_cwr_sent = B_FALSE; in tcp_rput_data()
3465 mp1 = tcp->tcp_xmit_head; in tcp_rput_data()
3467 if (!ofo_seg && seg_len == 0 && new_swnd == tcp->tcp_swnd) { in tcp_rput_data()
3479 if (mp1 != NULL && tcp->tcp_suna != tcp->tcp_snxt && in tcp_rput_data()
3480 ! tcp->tcp_rexmit) { in tcp_rput_data()
3482 if ((dupack_cnt = ++tcp->tcp_dupack_cnt) < in tcp_rput_data()
3505 if (tcp->tcp_unsent > 0 && in tcp_rput_data()
3506 (!tcp->tcp_snd_sack_ok || in tcp_rput_data()
3507 (tcp->tcp_snd_sack_ok && in tcp_rput_data()
3508 tcp->tcp_notsack_list != NULL))) { in tcp_rput_data()
3509 tcp->tcp_cwnd += mss << in tcp_rput_data()
3510 (tcp->tcp_dupack_cnt - 1); in tcp_rput_data()
3530 if (!tcp->tcp_cwr) { in tcp_rput_data()
3531 npkt = (MIN(tcp->tcp_cwnd, in tcp_rput_data()
3532 tcp->tcp_swnd) >> 1) / mss; in tcp_rput_data()
3535 tcp->tcp_cwnd_ssthresh = npkt * mss; in tcp_rput_data()
3536 tcp->tcp_cwnd = (npkt + in tcp_rput_data()
3537 tcp->tcp_dupack_cnt) * mss; in tcp_rput_data()
3539 if (tcp->tcp_ecn_ok) { in tcp_rput_data()
3540 tcp->tcp_cwr = B_TRUE; in tcp_rput_data()
3541 tcp->tcp_cwr_snd_max = tcp->tcp_snxt; in tcp_rput_data()
3542 tcp->tcp_ecn_cwr_sent = B_FALSE; in tcp_rput_data()
3554 if ((tcp->tcp_valid_bits & TCP_FSS_VALID) && in tcp_rput_data()
3555 (tcp->tcp_unsent == 0)) { in tcp_rput_data()
3556 tcp->tcp_rexmit_max = tcp->tcp_fss; in tcp_rput_data()
3558 tcp->tcp_rexmit_max = tcp->tcp_snxt; in tcp_rput_data()
3568 tcp->tcp_snd_burst = TCP_CWND_SS; in tcp_rput_data()
3585 if (tcp->tcp_snd_sack_ok) { in tcp_rput_data()
3586 assert(tcp->tcp_sack_info != NULL); in tcp_rput_data()
3587 if (tcp->tcp_notsack_list != NULL) { in tcp_rput_data()
3588 tcp->tcp_pipe = tcp->tcp_snxt - in tcp_rput_data()
3589 tcp->tcp_fack; in tcp_rput_data()
3590 tcp->tcp_sack_snxt = seg_ack; in tcp_rput_data()
3601 tcp->tcp_pipe = in tcp_rput_data()
3602 tcp->tcp_cwnd_ssthresh; in tcp_rput_data()
3615 if (tcp->tcp_snd_sack_ok && in tcp_rput_data()
3616 tcp->tcp_notsack_list != NULL) { in tcp_rput_data()
3618 tcp->tcp_pipe -= mss; in tcp_rput_data()
3619 if (tcp->tcp_pipe < 0) in tcp_rput_data()
3620 tcp->tcp_pipe = 0; in tcp_rput_data()
3627 cwnd = tcp->tcp_cwnd + mss; in tcp_rput_data()
3628 if (cwnd > tcp->tcp_cwnd_max) in tcp_rput_data()
3629 cwnd = tcp->tcp_cwnd_max; in tcp_rput_data()
3630 tcp->tcp_cwnd = cwnd; in tcp_rput_data()
3635 } else if (tcp->tcp_zero_win_probe) { in tcp_rput_data()
3644 tcp->tcp_zero_win_probe = 0; in tcp_rput_data()
3645 tcp->tcp_timer_backoff = 0; in tcp_rput_data()
3646 tcp->tcp_ms_we_have_waited = 0; in tcp_rput_data()
3658 if (!tcp->tcp_rexmit) { in tcp_rput_data()
3659 tcp->tcp_rexmit = B_TRUE; in tcp_rput_data()
3660 tcp->tcp_dupack_cnt = 0; in tcp_rput_data()
3661 tcp->tcp_rexmit_nxt = tcp->tcp_suna; in tcp_rput_data()
3662 tcp->tcp_rexmit_max = tcp->tcp_suna + 1; in tcp_rput_data()
3680 if (SEQ_GT(seg_ack, tcp->tcp_snxt)) { in tcp_rput_data()
3686 mp = tcp_ack_mp(tcp); in tcp_rput_data()
3701 if (tcp->tcp_snd_sack_ok && tcp->tcp_notsack_list != NULL) { in tcp_rput_data()
3702 tcp_notsack_remove(&(tcp->tcp_notsack_list), seg_ack, in tcp_rput_data()
3703 &(tcp->tcp_num_notsack_blk), &(tcp->tcp_cnt_notsack_list)); in tcp_rput_data()
3712 if (tcp->tcp_dupack_cnt >= tcp_dupack_fast_retransmit) { in tcp_rput_data()
3713 assert(tcp->tcp_rexmit == B_FALSE); in tcp_rput_data()
3714 if (SEQ_GEQ(seg_ack, tcp->tcp_rexmit_max)) { in tcp_rput_data()
3715 tcp->tcp_dupack_cnt = 0; in tcp_rput_data()
3720 if (tcp->tcp_cwnd > tcp->tcp_cwnd_ssthresh) { in tcp_rput_data()
3721 tcp->tcp_cwnd = tcp->tcp_cwnd_ssthresh; in tcp_rput_data()
3723 tcp->tcp_rexmit_max = seg_ack; in tcp_rput_data()
3724 tcp->tcp_cwnd_cnt = 0; in tcp_rput_data()
3725 tcp->tcp_snd_burst = TCP_CWND_NORMAL; in tcp_rput_data()
3731 if (tcp->tcp_snd_sack_ok && in tcp_rput_data()
3732 tcp->tcp_notsack_list != NULL) { in tcp_rput_data()
3733 TCP_NOTSACK_REMOVE_ALL(tcp->tcp_notsack_list); in tcp_rput_data()
3736 if (tcp->tcp_snd_sack_ok && in tcp_rput_data()
3737 tcp->tcp_notsack_list != NULL) { in tcp_rput_data()
3739 tcp->tcp_pipe -= mss; in tcp_rput_data()
3740 if (tcp->tcp_pipe < 0) in tcp_rput_data()
3741 tcp->tcp_pipe = 0; in tcp_rput_data()
3754 tcp->tcp_cwnd = tcp->tcp_cwnd_ssthresh + in tcp_rput_data()
3756 tcp->tcp_cwnd_cnt = tcp->tcp_cwnd; in tcp_rput_data()
3762 tcp->tcp_dupack_cnt = 0; in tcp_rput_data()
3763 if (tcp->tcp_rexmit) { in tcp_rput_data()
3777 if (SEQ_LEQ(seg_ack, tcp->tcp_rexmit_max)) { in tcp_rput_data()
3778 if (SEQ_GT(seg_ack, tcp->tcp_rexmit_nxt)) { in tcp_rput_data()
3779 tcp->tcp_rexmit_nxt = seg_ack; in tcp_rput_data()
3781 if (seg_ack != tcp->tcp_rexmit_max) { in tcp_rput_data()
3785 tcp->tcp_rexmit = B_FALSE; in tcp_rput_data()
3786 tcp->tcp_rexmit_nxt = tcp->tcp_snxt; in tcp_rput_data()
3787 tcp->tcp_snd_burst = TCP_CWND_NORMAL; in tcp_rput_data()
3789 tcp->tcp_ms_we_have_waited = 0; in tcp_rput_data()
3795 tcp->tcp_suna = seg_ack; in tcp_rput_data()
3796 if (tcp->tcp_zero_win_probe != 0) { in tcp_rput_data()
3797 tcp->tcp_zero_win_probe = 0; in tcp_rput_data()
3798 tcp->tcp_timer_backoff = 0; in tcp_rput_data()
3817 if (!tcp->tcp_ecn_ok || !(flags & TH_ECE)) { in tcp_rput_data()
3818 cwnd = tcp->tcp_cwnd; in tcp_rput_data()
3821 if (cwnd >= tcp->tcp_cwnd_ssthresh) { in tcp_rput_data()
3832 if (tcp->tcp_cwnd_cnt <= 0) { in tcp_rput_data()
3833 tcp->tcp_cwnd_cnt = cwnd + add; in tcp_rput_data()
3835 tcp->tcp_cwnd_cnt -= add; in tcp_rput_data()
3839 tcp->tcp_cwnd = MIN(cwnd + add, tcp->tcp_cwnd_max); in tcp_rput_data()
3843 if (tcp->tcp_snd_ts_ok) { in tcp_rput_data()
3846 tcp_set_rto(tcp, (int32_t)(prom_gettime() - in tcp_rput_data()
3851 if (tcp->tcp_set_timer == 1) { in tcp_rput_data()
3852 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_rput_data()
3853 tcp->tcp_set_timer = 0; in tcp_rput_data()
3859 tcp->tcp_csuna = tcp->tcp_snxt; in tcp_rput_data()
3860 } else if (SEQ_GT(seg_ack, tcp->tcp_csuna)) { in tcp_rput_data()
3866 tcp_set_rto(tcp, (int32_t)(prom_gettime() - in tcp_rput_data()
3870 tcp->tcp_csuna = seg_ack; in tcp_rput_data()
3871 if (tcp->tcp_set_timer == 1) { in tcp_rput_data()
3872 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_rput_data()
3873 tcp->tcp_set_timer = 0; in tcp_rput_data()
3898 tcp->tcp_xmit_tail = NULL; in tcp_rput_data()
3901 if (mp2 != tcp->tcp_xmit_tail) in tcp_rput_data()
3903 tcp->tcp_xmit_tail = mp1; in tcp_rput_data()
3906 tcp->tcp_xmit_tail_unsent = (int)(mp1->b_wptr - in tcp_rput_data()
3917 assert(tcp->tcp_fin_sent); in tcp_rput_data()
3918 tcp->tcp_xmit_tail = NULL; in tcp_rput_data()
3919 if (tcp->tcp_fin_sent) { in tcp_rput_data()
3920 tcp->tcp_fin_acked = B_TRUE; in tcp_rput_data()
3937 tcp_xmit_ctl(NULL, tcp, NULL, tcp->tcp_snxt, in tcp_rput_data()
3938 tcp->tcp_rnxt, TH_RST|TH_ACK, 0, sock_id); in tcp_rput_data()
3941 tcp_display(tcp, NULL, in tcp_rput_data()
3949 assert(mp2 != tcp->tcp_xmit_tail); in tcp_rput_data()
3951 if (tcp->tcp_unsent) { in tcp_rput_data()
3955 tcp->tcp_xmit_head = mp1; in tcp_rput_data()
3968 if (SEQ_LT(tcp->tcp_swl2, seg_ack) || in tcp_rput_data()
3969 SEQ_LT(tcp->tcp_swl1, seg_seq) || in tcp_rput_data()
3970 (tcp->tcp_swl1 == seg_seq && new_swnd > tcp->tcp_swnd)) { in tcp_rput_data()
3979 if (tcp->tcp_unsent && new_swnd > tcp->tcp_swnd) in tcp_rput_data()
3981 tcp->tcp_swnd = new_swnd; in tcp_rput_data()
3982 if (new_swnd > tcp->tcp_max_swnd) in tcp_rput_data()
3983 tcp->tcp_max_swnd = new_swnd; in tcp_rput_data()
3984 tcp->tcp_swl1 = seg_seq; in tcp_rput_data()
3985 tcp->tcp_swl2 = seg_ack; in tcp_rput_data()
3988 if (tcp->tcp_state > TCPS_ESTABLISHED) { in tcp_rput_data()
3989 switch (tcp->tcp_state) { in tcp_rput_data()
3991 if (tcp->tcp_fin_acked) { in tcp_rput_data()
3992 tcp->tcp_state = TCPS_FIN_WAIT_2; in tcp_rput_data()
4009 TCP_TIMER_RESTART(tcp, in tcp_rput_data()
4017 if (tcp->tcp_fin_acked) { in tcp_rput_data()
4018 (void) tcp_clean_death(sock_id, tcp, 0); in tcp_rput_data()
4023 if (tcp->tcp_fin_acked) { in tcp_rput_data()
4024 tcp->tcp_state = TCPS_TIME_WAIT; in tcp_rput_data()
4025 tcp_time_wait_append(tcp); in tcp_rput_data()
4026 TCP_TIMER_RESTART(tcp, tcp_time_wait_interval); in tcp_rput_data()
4033 assert(tcp->tcp_state != TCPS_TIME_WAIT); in tcp_rput_data()
4040 if (!tcp->tcp_fin_rcvd) { in tcp_rput_data()
4041 tcp->tcp_fin_rcvd = B_TRUE; in tcp_rput_data()
4042 tcp->tcp_rnxt++; in tcp_rput_data()
4043 U32_TO_ABE32(tcp->tcp_rnxt, tcp->tcp_tcph->th_ack); in tcp_rput_data()
4045 switch (tcp->tcp_state) { in tcp_rput_data()
4048 tcp->tcp_state = TCPS_CLOSE_WAIT; in tcp_rput_data()
4052 if (!tcp->tcp_fin_acked) { in tcp_rput_data()
4053 tcp->tcp_state = TCPS_CLOSING; in tcp_rput_data()
4058 tcp->tcp_state = TCPS_TIME_WAIT; in tcp_rput_data()
4059 tcp_time_wait_append(tcp); in tcp_rput_data()
4060 TCP_TIMER_RESTART(tcp, tcp_time_wait_interval); in tcp_rput_data()
4092 if (++tcp->tcp_rack_cnt == 2 || sockets[sock_id].inq == NULL) { in tcp_rput_data()
4094 tcp->tcp_rack_cnt = 0; in tcp_rput_data()
4096 tcp->tcp_rnxt += seg_len; in tcp_rput_data()
4097 U32_TO_ABE32(tcp->tcp_rnxt, tcp->tcp_tcph->th_ack); in tcp_rput_data()
4100 if (tcp->tcp_snd_sack_ok && tcp->tcp_num_sack_blk > 0) { in tcp_rput_data()
4101 tcp_sack_remove(tcp->tcp_sack_list, tcp->tcp_rnxt, in tcp_rput_data()
4102 &(tcp->tcp_num_sack_blk)); in tcp_rput_data()
4105 if (tcp->tcp_listener) { in tcp_rput_data()
4110 tcp_rcv_enqueue(tcp, mp, seg_len); in tcp_rput_data()
4113 tcp_rcv_enqueue(tcp, mp, seg_len); in tcp_rput_data()
4119 if (tcp->tcp_rcv_list != NULL) in tcp_rput_data()
4131 TH_LIMIT_XMIT)) && tcp->tcp_swnd != 0) { in tcp_rput_data()
4133 uint32_t snd_size = tcp->tcp_snxt - tcp->tcp_suna; in tcp_rput_data()
4137 if (snd_size > tcp->tcp_swnd) in tcp_rput_data()
4138 snd_size = tcp->tcp_swnd; in tcp_rput_data()
4139 mp1 = tcp_xmit_mp(tcp, tcp->tcp_xmit_head, snd_size, in tcp_rput_data()
4140 NULL, NULL, tcp->tcp_suna, B_TRUE, &snd_size, in tcp_rput_data()
4145 tcp->tcp_xmit_head->b_prev = in tcp_rput_data()
4147 tcp->tcp_csuna = tcp->tcp_snxt; in tcp_rput_data()
4155 if (tcp_sack_rxmit(tcp, sock_id) != 0) { in tcp_rput_data()
4165 if (!tcp->tcp_rexmit) { in tcp_rput_data()
4166 tcp_wput_data(tcp, NULL, sock_id); in tcp_rput_data()
4168 tcp_ss_rexmit(tcp, sock_id); in tcp_rput_data()
4183 tcp->tcp_cwnd -= mss << (tcp->tcp_dupack_cnt - 1); in tcp_rput_data()
4195 if ((mp1 = tcp_ack_mp(tcp)) != NULL) { in tcp_rput_data()
4212 tcp_ss_rexmit(tcp_t *tcp, int sock_id) in tcp_ss_rexmit() argument
4219 int32_t burst = tcp->tcp_snd_burst; in tcp_ss_rexmit()
4226 if (SEQ_LT(tcp->tcp_rexmit_nxt, tcp->tcp_rexmit_max)) { in tcp_ss_rexmit()
4227 smax = tcp->tcp_rexmit_max; in tcp_ss_rexmit()
4228 snxt = tcp->tcp_rexmit_nxt; in tcp_ss_rexmit()
4229 if (SEQ_LT(snxt, tcp->tcp_suna)) { in tcp_ss_rexmit()
4230 snxt = tcp->tcp_suna; in tcp_ss_rexmit()
4232 win = MIN(tcp->tcp_cwnd, tcp->tcp_swnd); in tcp_ss_rexmit()
4233 win -= snxt - tcp->tcp_suna; in tcp_ss_rexmit()
4234 mss = tcp->tcp_mss; in tcp_ss_rexmit()
4235 snxt_mp = tcp_get_seg_mp(tcp, snxt, &off); in tcp_ss_rexmit()
4249 xmit_mp = tcp_xmit_mp(tcp, snxt_mp, cnt, &off, in tcp_ss_rexmit()
4270 tcp->tcp_rexmit_nxt = snxt; in tcp_ss_rexmit()
4285 if (tcp->tcp_unsent) { in tcp_ss_rexmit()
4286 tcp_wput_data(tcp, NULL, sock_id); in tcp_ss_rexmit()
4296 tcp_timer(tcp_t *tcp, int sock_id) in tcp_timer() argument
4304 first_threshold = tcp->tcp_first_timer_threshold; in tcp_timer()
4305 second_threshold = tcp->tcp_second_timer_threshold; in tcp_timer()
4306 switch (tcp->tcp_state) { in tcp_timer()
4313 first_threshold = tcp->tcp_first_ctimer_threshold; in tcp_timer()
4314 second_threshold = tcp->tcp_second_ctimer_threshold; in tcp_timer()
4322 if (tcp->tcp_suna != tcp->tcp_snxt) { in tcp_timer()
4326 if (tcp->tcp_xmit_head == NULL) in tcp_timer()
4330 (uint32_t)(uintptr_t)tcp->tcp_xmit_head->b_prev); in tcp_timer()
4331 time_to_wait = tcp->tcp_rto - time_to_wait; in tcp_timer()
4336 TCP_TIMER_RESTART(tcp, time_to_wait); in tcp_timer()
4349 if (tcp->tcp_swnd == 0 || tcp->tcp_zero_win_probe) { in tcp_timer()
4368 if (!tcp->tcp_cwr || tcp->tcp_rexmit) { in tcp_timer()
4369 npkt = (MIN((tcp->tcp_timer_backoff ? in tcp_timer()
4370 tcp->tcp_cwnd_ssthresh : in tcp_timer()
4371 tcp->tcp_cwnd), in tcp_timer()
4372 tcp->tcp_swnd) >> 1) / in tcp_timer()
4373 tcp->tcp_mss; in tcp_timer()
4376 tcp->tcp_cwnd_ssthresh = npkt * in tcp_timer()
4377 tcp->tcp_mss; in tcp_timer()
4379 tcp->tcp_cwnd = tcp->tcp_mss; in tcp_timer()
4380 tcp->tcp_cwnd_cnt = 0; in tcp_timer()
4381 if (tcp->tcp_ecn_ok) { in tcp_timer()
4382 tcp->tcp_cwr = B_TRUE; in tcp_timer()
4383 tcp->tcp_cwr_snd_max = tcp->tcp_snxt; in tcp_timer()
4384 tcp->tcp_ecn_cwr_sent = B_FALSE; in tcp_timer()
4402 if (tcp->tcp_unsent != 0) { in tcp_timer()
4403 if (tcp->tcp_cwnd == 0) { in tcp_timer()
4410 assert(tcp->tcp_ecn_ok); in tcp_timer()
4411 tcp->tcp_cwnd = tcp->tcp_mss; in tcp_timer()
4413 if (tcp->tcp_swnd == 0) { in tcp_timer()
4415 tcp->tcp_swnd++; in tcp_timer()
4416 tcp->tcp_zero_win_probe = B_TRUE; in tcp_timer()
4435 tcp->tcp_max_swnd = MAX(tcp->tcp_swnd, 2); in tcp_timer()
4437 tcp_wput_data(tcp, NULL, sock_id); in tcp_timer()
4441 if ((tcp->tcp_valid_bits & TCP_FSS_VALID) && in tcp_timer()
4442 !tcp->tcp_fin_acked) in tcp_timer()
4455 (void) tcp_clean_death(sock_id, tcp, 0); in tcp_timer()
4459 tcp->tcp_state, tcp_display(tcp, NULL, in tcp_timer()
4463 if ((ms = tcp->tcp_ms_we_have_waited) > second_threshold) { in tcp_timer()
4469 if ((tcp->tcp_zero_win_probe == 0) || in tcp_timer()
4470 ((prom_gettime() - tcp->tcp_last_recv_time) > in tcp_timer()
4478 if (tcp->tcp_state == TCPS_SYN_RCVD) { in tcp_timer()
4481 tcp, NULL, tcp->tcp_snxt, in tcp_timer()
4482 tcp->tcp_rnxt, TH_RST | TH_ACK, 0, sock_id); in tcp_timer()
4484 (void) tcp_clean_death(sock_id, tcp, in tcp_timer()
4485 tcp->tcp_client_errno ? in tcp_timer()
4486 tcp->tcp_client_errno : ETIMEDOUT); in tcp_timer()
4504 tcp->tcp_ms_we_have_waited = second_threshold; in tcp_timer()
4506 } else if (ms > first_threshold && tcp->tcp_rtt_sa != 0) { in tcp_timer()
4515 if (tcp->tcp_zero_win_probe == 0) { in tcp_timer()
4516 tcp->tcp_rtt_sd += (tcp->tcp_rtt_sa >> 3) + in tcp_timer()
4517 (tcp->tcp_rtt_sa >> 5); in tcp_timer()
4518 tcp->tcp_rtt_sa = 0; in tcp_timer()
4519 tcp->tcp_rtt_update = 0; in tcp_timer()
4522 tcp->tcp_timer_backoff++; in tcp_timer()
4523 if ((ms = (tcp->tcp_rtt_sa >> 3) + tcp->tcp_rtt_sd + in tcp_timer()
4524 tcp_rexmit_interval_extra + (tcp->tcp_rtt_sa >> 5)) < in tcp_timer()
4531 ms = tcp_rexmit_interval_min << tcp->tcp_timer_backoff; in tcp_timer()
4533 ms <<= tcp->tcp_timer_backoff; in tcp_timer()
4541 tcp->tcp_timer_backoff--; in tcp_timer()
4543 tcp->tcp_ms_we_have_waited += ms; in tcp_timer()
4544 if (tcp->tcp_zero_win_probe == 0) { in tcp_timer()
4545 tcp->tcp_rto = ms; in tcp_timer()
4547 TCP_TIMER_RESTART(tcp, ms); in tcp_timer()
4553 tcp->tcp_set_timer = 1; in tcp_timer()
4554 mss = tcp->tcp_snxt - tcp->tcp_suna; in tcp_timer()
4555 if (mss > tcp->tcp_mss) in tcp_timer()
4556 mss = tcp->tcp_mss; in tcp_timer()
4557 if (mss > tcp->tcp_swnd && tcp->tcp_swnd != 0) in tcp_timer()
4558 mss = tcp->tcp_swnd; in tcp_timer()
4560 if ((mp = tcp->tcp_xmit_head) != NULL) { in tcp_timer()
4564 mp = tcp_xmit_mp(tcp, mp, mss, NULL, NULL, tcp->tcp_suna, B_TRUE, &mss, in tcp_timer()
4568 tcp->tcp_csuna = tcp->tcp_snxt; in tcp_timer()
4583 tcp->tcp_rexmit_nxt = tcp->tcp_suna; in tcp_timer()
4584 tcp->tcp_snd_burst = TCP_CWND_SS; in tcp_timer()
4585 if ((tcp->tcp_valid_bits & TCP_FSS_VALID) && in tcp_timer()
4586 (tcp->tcp_unsent == 0)) { in tcp_timer()
4587 tcp->tcp_rexmit_max = tcp->tcp_fss; in tcp_timer()
4589 tcp->tcp_rexmit_max = tcp->tcp_snxt; in tcp_timer()
4591 tcp->tcp_rexmit = B_TRUE; in tcp_timer()
4592 tcp->tcp_dupack_cnt = 0; in tcp_timer()
4597 if (tcp->tcp_snd_sack_ok && tcp->tcp_notsack_list != NULL) { in tcp_timer()
4598 TCP_NOTSACK_REMOVE_ALL(tcp->tcp_notsack_list); in tcp_timer()
4599 tcp->tcp_num_notsack_blk = 0; in tcp_timer()
4600 tcp->tcp_cnt_notsack_list = 0; in tcp_timer()
4609 tcp_wput_data(tcp_t *tcp, mblk_t *mp, int sock_id) in tcp_wput_data() argument
4630 tcpstate = tcp->tcp_state; in tcp_wput_data()
4633 len = tcp->tcp_unsent; in tcp_wput_data()
4644 (tcp->tcp_valid_bits & TCP_FSS_VALID) != 0) { in tcp_wput_data()
4645 if ((tcp->tcp_valid_bits & TCP_FSS_VALID) != 0) { in tcp_wput_data()
4647 tcp_display(tcp, NULL, DISP_ADDR_AND_PORT)); in tcp_wput_data()
4669 if (tcp->tcp_xmit_head == NULL) { in tcp_wput_data()
4670 tcp->tcp_xmit_head = mp; in tcp_wput_data()
4671 tcp->tcp_xmit_tail = mp; in tcp_wput_data()
4672 tcp->tcp_xmit_tail_unsent = len; in tcp_wput_data()
4674 tcp->tcp_xmit_last->b_cont = mp; in tcp_wput_data()
4675 len += tcp->tcp_unsent; in tcp_wput_data()
4694 tcp->tcp_xmit_last = mp; in tcp_wput_data()
4695 tcp->tcp_unsent = len; in tcp_wput_data()
4698 snxt = tcp->tcp_snxt; in tcp_wput_data()
4699 xmit_tail = tcp->tcp_xmit_tail; in tcp_wput_data()
4700 tail_unsent = tcp->tcp_xmit_tail_unsent; in tcp_wput_data()
4710 if (tcp->tcp_snd_sack_ok && tcp->tcp_num_sack_blk > 0) { in tcp_wput_data()
4713 num_sack_blk = MIN(tcp->tcp_max_sack_blk, in tcp_wput_data()
4714 tcp->tcp_num_sack_blk); in tcp_wput_data()
4717 mss = tcp->tcp_mss - opt_len; in tcp_wput_data()
4718 tcp_hdr_len = tcp->tcp_hdr_len + opt_len; in tcp_wput_data()
4720 mss = tcp->tcp_mss; in tcp_wput_data()
4721 tcp_hdr_len = tcp->tcp_hdr_len; in tcp_wput_data()
4724 if ((tcp->tcp_suna == snxt) && in tcp_wput_data()
4725 (prom_gettime() - tcp->tcp_last_recv_time) >= tcp->tcp_rto) { in tcp_wput_data()
4726 tcp->tcp_cwnd = MIN(tcp_slow_start_after_idle * mss, in tcp_wput_data()
4740 int usable_r = tcp->tcp_swnd; in tcp_wput_data()
4748 if (tcp->tcp_cwnd == 0) { in tcp_wput_data()
4753 assert(tcp->tcp_ecn_ok || in tcp_wput_data()
4754 tcp->tcp_state < TCPS_ESTABLISHED); in tcp_wput_data()
4759 if (usable_r > tcp->tcp_cwnd) in tcp_wput_data()
4760 usable_r = tcp->tcp_cwnd; in tcp_wput_data()
4764 usable_r += tcp->tcp_suna; in tcp_wput_data()
4799 if (usable < (int)tcp->tcp_naglim && in tcp_wput_data()
4800 tcp->tcp_naglim > tcp->tcp_last_sent_len && in tcp_wput_data()
4801 snxt != tcp->tcp_suna && in tcp_wput_data()
4802 !(tcp->tcp_valid_bits & TCP_URG_VALID)) in tcp_wput_data()
4805 num_burst_seg = tcp->tcp_snd_burst; in tcp_wput_data()
4828 if (len < (tcp->tcp_max_swnd >> 1) && in tcp_wput_data()
4829 (tcp->tcp_unsent - (snxt - tcp->tcp_snxt)) > len && in tcp_wput_data()
4830 !((tcp->tcp_valid_bits & TCP_URG_VALID) && in tcp_wput_data()
4831 len == 1) && (! tcp->tcp_zero_win_probe)) { in tcp_wput_data()
4838 if (snxt == tcp->tcp_snxt && in tcp_wput_data()
4839 snxt == tcp->tcp_suna) { in tcp_wput_data()
4850 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_wput_data()
4856 tcph = tcp->tcp_tcph; in tcp_wput_data()
4866 if (tcp->tcp_valid_bits) { in tcp_wput_data()
4868 uint32_t prev_snxt = tcp->tcp_snxt; in tcp_wput_data()
4880 mp = tcp_xmit_mp(tcp, xmit_tail, len, NULL, NULL, in tcp_wput_data()
4883 tcp->tcp_snxt = prev_snxt; in tcp_wput_data()
4895 tcp->tcp_last_sent_len = (ushort_t)len; in tcp_wput_data()
4921 tcp->tcp_ipha->ip_len = htons(len); in tcp_wput_data()
4937 tcp->tcp_last_sent_len = (ushort_t)len; in tcp_wput_data()
4940 if (tcp->tcp_ipversion == IPV4_VERSION) in tcp_wput_data()
4941 tcp->tcp_ipha->ip_len = htons(len); in tcp_wput_data()
4963 mp1 = allocb(tcp->tcp_ip_hdr_len + TCP_MAX_HDR_LENGTH + in tcp_wput_data()
4977 if (tcp->tcp_snd_ts_ok) { in tcp_wput_data()
4981 U32_TO_BE32(tcp->tcp_ts_recent, in tcp_wput_data()
4984 assert(tcp->tcp_tcp_hdr_len == TCP_MIN_HEADER_LENGTH); in tcp_wput_data()
4991 src = (ipaddr_t *)tcp->tcp_iphc; in tcp_wput_data()
5002 len = tcp->tcp_hdr_len; in tcp_wput_data()
5016 tcph = (tcph_t *)(rptr + tcp->tcp_ip_hdr_len); in tcp_wput_data()
5023 if (tcp->tcp_ecn_ok && !tcp->tcp_zero_win_probe) { in tcp_wput_data()
5024 SET_ECT(tcp, rptr); in tcp_wput_data()
5026 if (tcp->tcp_ecn_echo_on) in tcp_wput_data()
5028 if (tcp->tcp_cwr && !tcp->tcp_ecn_cwr_sent) { in tcp_wput_data()
5030 tcp->tcp_ecn_cwr_sent = B_TRUE; in tcp_wput_data()
5036 uchar_t *wptr = rptr + tcp->tcp_hdr_len; in tcp_wput_data()
5047 tmp = tcp->tcp_sack_list; in tcp_wput_data()
5095 tcp->tcp_last_sent_len += tail_unsent; in tcp_wput_data()
5149 tcp->tcp_xmit_tail = xmit_tail; in tcp_wput_data()
5150 tcp->tcp_xmit_tail_unsent = tail_unsent; in tcp_wput_data()
5151 len = tcp->tcp_snxt - snxt; in tcp_wput_data()
5159 if (tcp->tcp_snd_sack_ok && tcp->tcp_notsack_list != NULL) { in tcp_wput_data()
5161 tcp->tcp_pipe -= len; in tcp_wput_data()
5162 tcp_notsack_update(&(tcp->tcp_notsack_list), in tcp_wput_data()
5163 tcp->tcp_snxt, snxt, in tcp_wput_data()
5164 &(tcp->tcp_num_notsack_blk), in tcp_wput_data()
5165 &(tcp->tcp_cnt_notsack_list)); in tcp_wput_data()
5167 tcp->tcp_snxt = snxt + tcp->tcp_fin_sent; in tcp_wput_data()
5168 tcp->tcp_rack = tcp->tcp_rnxt; in tcp_wput_data()
5169 tcp->tcp_rack_cnt = 0; in tcp_wput_data()
5170 if ((snxt + len) == tcp->tcp_suna) { in tcp_wput_data()
5171 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_wput_data()
5178 len += tcp->tcp_unsent; in tcp_wput_data()
5179 tcp->tcp_unsent = len; in tcp_wput_data()
5185 (void) tcp_state_wait(sock_id, tcp, TCPS_ALL_ACKED); in tcp_wput_data()
5187 } else if (snxt == tcp->tcp_suna && tcp->tcp_swnd == 0) { in tcp_wput_data()
5192 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_wput_data()
5196 len += tcp->tcp_unsent; in tcp_wput_data()
5197 tcp->tcp_unsent = len; in tcp_wput_data()
5202 tcp_time_wait_processing(tcp_t *tcp, mblk_t *mp, in tcp_time_wait_processing() argument
5218 if ((sockets[sock_id].pcb == NULL) || (sockets[sock_id].pcb != tcp)) in tcp_time_wait_processing()
5223 ((tcph->th_flags[0] & TH_SYN) ? 0 : tcp->tcp_snd_ws); in tcp_time_wait_processing()
5224 if (tcp->tcp_snd_ts_ok) { in tcp_time_wait_processing()
5225 if (!tcp_paws_check(tcp, tcph, &tcpopt)) { in tcp_time_wait_processing()
5227 tcp_xmit_ctl(NULL, tcp, NULL, tcp->tcp_snxt, in tcp_time_wait_processing()
5228 tcp->tcp_rnxt, TH_ACK, 0, -1); in tcp_time_wait_processing()
5232 gap = seg_seq - tcp->tcp_rnxt; in tcp_time_wait_processing()
5233 rgap = tcp->tcp_rwnd - (gap + seg_len); in tcp_time_wait_processing()
5252 tcp_time_wait_remove(tcp); in tcp_time_wait_processing()
5253 tcp_time_wait_append(tcp); in tcp_time_wait_processing()
5254 TCP_TIMER_RESTART(tcp, tcp_time_wait_interval); in tcp_time_wait_processing()
5255 tcp_xmit_ctl(NULL, tcp, NULL, tcp->tcp_snxt, in tcp_time_wait_processing()
5256 tcp->tcp_rnxt, TH_ACK, 0, -1); in tcp_time_wait_processing()
5266 seg_seq = tcp->tcp_rnxt; in tcp_time_wait_processing()
5296 if ((adj = (int32_t)(tcp->tcp_snxt - new_iss)) > 0) { in tcp_time_wait_processing()
5304 tcp_clean_death(sock_id, tcp, 0); in tcp_time_wait_processing()
5338 if (tcp->tcp_snd_ts_ok && in tcp_time_wait_processing()
5339 TSTMP_GEQ(tcpopt.tcp_opt_ts_val, tcp->tcp_ts_recent) && in tcp_time_wait_processing()
5340 SEQ_LEQ(seg_seq, tcp->tcp_rack)) { in tcp_time_wait_processing()
5341 tcp->tcp_ts_recent = tcpopt.tcp_opt_ts_val; in tcp_time_wait_processing()
5342 tcp->tcp_last_rcv_lbolt = prom_gettime(); in tcp_time_wait_processing()
5345 if (seg_seq != tcp->tcp_rnxt && seg_len > 0) { in tcp_time_wait_processing()
5355 (void) tcp_clean_death(sock_id, tcp, 0); in tcp_time_wait_processing()
5360 tcp_xmit_ctl("TH_SYN", tcp, NULL, seg_ack, seg_seq + 1, in tcp_time_wait_processing()
5370 bytes_acked = (int)(seg_ack - tcp->tcp_suna); in tcp_time_wait_processing()
5373 new_swnd == tcp->tcp_swnd) in tcp_time_wait_processing()
5385 tcp_xmit_ctl(NULL, tcp, NULL, tcp->tcp_snxt, in tcp_time_wait_processing()
5386 tcp->tcp_rnxt, TH_ACK, 0, -1); in tcp_time_wait_processing()
5391 tcp_init_values(tcp_t *tcp, struct inetboot_socket *isp) in tcp_init_values() argument
5395 tcp->tcp_family = AF_INET; in tcp_init_values()
5396 tcp->tcp_ipversion = IPV4_VERSION; in tcp_init_values()
5405 tcp->tcp_rtt_sa = tcp_rexmit_interval_initial << 2; in tcp_init_values()
5406 tcp->tcp_rtt_sd = tcp_rexmit_interval_initial >> 1; in tcp_init_values()
5407 tcp->tcp_rto = (tcp->tcp_rtt_sa >> 3) + tcp->tcp_rtt_sd + in tcp_init_values()
5408 tcp_rexmit_interval_extra + (tcp->tcp_rtt_sa >> 5) + in tcp_init_values()
5410 if (tcp->tcp_rto < tcp_rexmit_interval_min) in tcp_init_values()
5411 tcp->tcp_rto = tcp_rexmit_interval_min; in tcp_init_values()
5412 tcp->tcp_timer_backoff = 0; in tcp_init_values()
5413 tcp->tcp_ms_we_have_waited = 0; in tcp_init_values()
5414 tcp->tcp_last_recv_time = prom_gettime(); in tcp_init_values()
5415 tcp->tcp_cwnd_max = tcp_cwnd_max_; in tcp_init_values()
5416 tcp->tcp_snd_burst = TCP_CWND_INFINITE; in tcp_init_values()
5417 tcp->tcp_cwnd_ssthresh = TCP_MAX_LARGEWIN; in tcp_init_values()
5420 tcp->tcp_if_mtu = mac_get_mtu() - 50; in tcp_init_values()
5422 tcp->tcp_if_mtu = mac_get_mtu(); in tcp_init_values()
5424 tcp->tcp_mss = tcp->tcp_if_mtu; in tcp_init_values()
5426 tcp->tcp_first_timer_threshold = tcp_ip_notify_interval; in tcp_init_values()
5427 tcp->tcp_first_ctimer_threshold = tcp_ip_notify_cinterval; in tcp_init_values()
5428 tcp->tcp_second_timer_threshold = tcp_ip_abort_interval; in tcp_init_values()
5433 tcp->tcp_second_ctimer_threshold = tcp_ip_abort_cinterval; in tcp_init_values()
5435 tcp->tcp_naglim = tcp_naglim_def; in tcp_init_values()
5440 if (tcp->tcp_ipversion == IPV4_VERSION) { in tcp_init_values()
5441 err = tcp_header_init_ipv4(tcp); in tcp_init_values()
5450 tcp->tcp_rcv_ws = TCP_MAX_WINSHIFT; in tcp_init_values()
5451 tcp->tcp_xmit_lowater = tcp_xmit_lowat; in tcp_init_values()
5453 tcp->tcp_xmit_hiwater = isp->so_sndbuf; in tcp_init_values()
5454 tcp->tcp_rwnd = isp->so_rcvbuf; in tcp_init_values()
5455 tcp->tcp_rwnd_max = isp->so_rcvbuf; in tcp_init_values()
5457 tcp->tcp_state = TCPS_IDLE; in tcp_init_values()
5465 tcp_header_init_ipv4(tcp_t *tcp) in tcp_header_init_ipv4() argument
5474 if (tcp->tcp_iphc != NULL) { in tcp_header_init_ipv4()
5475 assert(tcp->tcp_iphc_len >= TCP_MAX_COMBINED_HEADER_LENGTH); in tcp_header_init_ipv4()
5476 bzero(tcp->tcp_iphc, tcp->tcp_iphc_len); in tcp_header_init_ipv4()
5478 tcp->tcp_iphc_len = TCP_MAX_COMBINED_HEADER_LENGTH; in tcp_header_init_ipv4()
5479 tcp->tcp_iphc = bkmem_zalloc(tcp->tcp_iphc_len); in tcp_header_init_ipv4()
5480 if (tcp->tcp_iphc == NULL) { in tcp_header_init_ipv4()
5481 tcp->tcp_iphc_len = 0; in tcp_header_init_ipv4()
5485 tcp->tcp_ipha = (struct ip *)tcp->tcp_iphc; in tcp_header_init_ipv4()
5486 tcp->tcp_ipversion = IPV4_VERSION; in tcp_header_init_ipv4()
5492 tcp->tcp_hdr_len = sizeof (struct ip) + sizeof (tcph_t); in tcp_header_init_ipv4()
5493 tcp->tcp_tcp_hdr_len = sizeof (tcph_t); in tcp_header_init_ipv4()
5494 tcp->tcp_ip_hdr_len = sizeof (struct ip); in tcp_header_init_ipv4()
5495 tcp->tcp_ipha->ip_v = IP_VERSION; in tcp_header_init_ipv4()
5497 tcp->tcp_ipha->ip_hl = IP_SIMPLE_HDR_LENGTH_IN_WORDS; in tcp_header_init_ipv4()
5498 tcp->tcp_ipha->ip_p = IPPROTO_TCP; in tcp_header_init_ipv4()
5500 tcp->tcp_ipha->ip_sum = 0; in tcp_header_init_ipv4()
5502 tcph = (tcph_t *)(tcp->tcp_iphc + sizeof (struct ip)); in tcp_header_init_ipv4()
5503 tcp->tcp_tcph = tcph; in tcp_header_init_ipv4()
5515 tcp_xmit_ctl(char *str, tcp_t *tcp, mblk_t *mp, uint32_t seq, in tcp_xmit_ctl() argument
5524 tcp_hdr_len = tcp->tcp_hdr_len; in tcp_xmit_ctl()
5525 tcp_ip_hdr_len = tcp->tcp_ip_hdr_len; in tcp_xmit_ctl()
5554 bcopy(tcp->tcp_iphc, rptr, tcp_hdr_len); in tcp_xmit_ctl()
5567 if (tcp->tcp_snd_ts_ok && tcp->tcp_state > TCPS_SYN_SENT) { in tcp_xmit_ctl()
5578 if (tcp->tcp_snd_ts_ok) { in tcp_xmit_ctl()
5581 U32_TO_BE32(tcp->tcp_ts_recent, in tcp_xmit_ctl()
5584 tcp->tcp_rack = ack; in tcp_xmit_ctl()
5585 tcp->tcp_rack_cnt = 0; in tcp_xmit_ctl()
5601 tcp_ack_mp(tcp_t *tcp) in tcp_ack_mp() argument
5603 if (tcp->tcp_valid_bits) { in tcp_ack_mp()
5613 return (tcp_xmit_mp(tcp, NULL, 0, NULL, NULL, in tcp_ack_mp()
5614 (tcp->tcp_zero_win_probe) ? in tcp_ack_mp()
5615 tcp->tcp_suna : in tcp_ack_mp()
5616 tcp->tcp_snxt, B_FALSE, NULL, B_FALSE)); in tcp_ack_mp()
5630 if (tcp->tcp_snd_sack_ok && tcp->tcp_num_sack_blk > 0) { in tcp_ack_mp()
5631 num_sack_blk = MIN(tcp->tcp_max_sack_blk, in tcp_ack_mp()
5632 tcp->tcp_num_sack_blk); in tcp_ack_mp()
5635 tcp_hdr_len = tcp->tcp_hdr_len + sack_opt_len; in tcp_ack_mp()
5637 tcp_hdr_len = tcp->tcp_hdr_len; in tcp_ack_mp()
5647 bcopy(tcp->tcp_iphc, rptr, tcp->tcp_hdr_len); in tcp_ack_mp()
5649 tcph = (tcph_t *)&rptr[tcp->tcp_ip_hdr_len]; in tcp_ack_mp()
5659 U32_TO_ABE32((tcp->tcp_zero_win_probe) ? in tcp_ack_mp()
5660 tcp->tcp_suna : tcp->tcp_snxt, tcph->th_seq); in tcp_ack_mp()
5664 if (tcp->tcp_ecn_echo_on) in tcp_ack_mp()
5667 tcp->tcp_rack = tcp->tcp_rnxt; in tcp_ack_mp()
5668 tcp->tcp_rack_cnt = 0; in tcp_ack_mp()
5671 if (tcp->tcp_snd_ts_ok) { in tcp_ack_mp()
5676 U32_TO_BE32(tcp->tcp_ts_recent, in tcp_ack_mp()
5682 uchar_t *wptr = (uchar_t *)tcph + tcp->tcp_tcp_hdr_len; in tcp_ack_mp()
5693 tmp = tcp->tcp_sack_list; in tcp_ack_mp()
5726 tcp_xmit_mp(tcp_t *tcp, mblk_t *mp, int32_t max_to_send, int32_t *offset, in tcp_xmit_mp() argument
5742 mp1 = allocb(tcp->tcp_ip_hdr_len + TCP_MAX_HDR_LENGTH + in tcp_xmit_mp()
5756 if (tcp->tcp_snd_sack_ok && tcp->tcp_num_sack_blk > 0) { in tcp_xmit_mp()
5757 num_sack_blk = MIN(tcp->tcp_max_sack_blk, in tcp_xmit_mp()
5758 tcp->tcp_num_sack_blk); in tcp_xmit_mp()
5761 if (max_to_send + sack_opt_len > tcp->tcp_mss) in tcp_xmit_mp()
5810 mp1->b_wptr = rptr + tcp->tcp_hdr_len + sack_opt_len; in tcp_xmit_mp()
5811 bcopy(tcp->tcp_iphc, rptr, tcp->tcp_hdr_len); in tcp_xmit_mp()
5812 tcph = (tcph_t *)&rptr[tcp->tcp_ip_hdr_len]; in tcp_xmit_mp()
5822 if (data_length != 0 && (tcp->tcp_unsent == 0 || in tcp_xmit_mp()
5823 tcp->tcp_unsent == data_length)) { in tcp_xmit_mp()
5829 if (tcp->tcp_ecn_ok) { in tcp_xmit_mp()
5830 if (tcp->tcp_ecn_echo_on) in tcp_xmit_mp()
5839 SET_ECT(tcp, rptr); in tcp_xmit_mp()
5840 if (tcp->tcp_cwr && !tcp->tcp_ecn_cwr_sent) { in tcp_xmit_mp()
5842 tcp->tcp_ecn_cwr_sent = B_TRUE; in tcp_xmit_mp()
5847 if (tcp->tcp_valid_bits) { in tcp_xmit_mp()
5850 if ((tcp->tcp_valid_bits & TCP_ISS_VALID) && in tcp_xmit_mp()
5851 seq == tcp->tcp_iss) { in tcp_xmit_mp()
5866 u1 = tcp->tcp_if_mtu - IP_SIMPLE_HDR_LENGTH - in tcp_xmit_mp()
5880 switch (tcp->tcp_state) { in tcp_xmit_mp()
5884 if (tcp->tcp_snd_ws_ok) { in tcp_xmit_mp()
5889 wptr[3] = (uchar_t)tcp->tcp_rcv_ws; in tcp_xmit_mp()
5895 if (tcp->tcp_snd_ts_ok) { in tcp_xmit_mp()
5907 assert(tcp->tcp_ts_recent == 0); in tcp_xmit_mp()
5914 if (tcp->tcp_snd_sack_ok) { in tcp_xmit_mp()
5929 if (tcp->tcp_ecn_ok) { in tcp_xmit_mp()
5936 if (tcp->tcp_snd_ws_ok) { in tcp_xmit_mp()
5941 wptr[3] = (uchar_t)tcp->tcp_rcv_ws; in tcp_xmit_mp()
5946 if (tcp->tcp_snd_sack_ok) { in tcp_xmit_mp()
5961 if (tcp->tcp_ecn_ok) { in tcp_xmit_mp()
5974 if ((tcp->tcp_valid_bits & TCP_FSS_VALID) && in tcp_xmit_mp()
5975 (seq + data_length) == tcp->tcp_fss) { in tcp_xmit_mp()
5976 if (!tcp->tcp_fin_acked) { in tcp_xmit_mp()
5980 if (!tcp->tcp_fin_sent) { in tcp_xmit_mp()
5981 tcp->tcp_fin_sent = B_TRUE; in tcp_xmit_mp()
5982 switch (tcp->tcp_state) { in tcp_xmit_mp()
5985 tcp->tcp_state = TCPS_FIN_WAIT_1; in tcp_xmit_mp()
5988 tcp->tcp_state = TCPS_LAST_ACK; in tcp_xmit_mp()
5991 if (tcp->tcp_suna == tcp->tcp_snxt) in tcp_xmit_mp()
5992 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_xmit_mp()
5993 tcp->tcp_snxt = tcp->tcp_fss + 1; in tcp_xmit_mp()
5998 tcp->tcp_rack = tcp->tcp_rnxt; in tcp_xmit_mp()
5999 tcp->tcp_rack_cnt = 0; in tcp_xmit_mp()
6001 if (tcp->tcp_snd_ts_ok) { in tcp_xmit_mp()
6002 if (tcp->tcp_state != TCPS_SYN_SENT) { in tcp_xmit_mp()
6007 U32_TO_BE32(tcp->tcp_ts_recent, in tcp_xmit_mp()
6013 uchar_t *wptr = (uchar_t *)tcph + tcp->tcp_tcp_hdr_len; in tcp_xmit_mp()
6024 tmp = tcp->tcp_sack_list; in tcp_xmit_mp()
6035 if (tcp->tcp_ipversion == IPV4_VERSION) in tcp_xmit_mp()
6379 tcp_iss_init(tcp_t *tcp) in tcp_iss_init() argument
6382 tcp->tcp_iss = tcp_iss_incr_extra; in tcp_iss_init()
6383 tcp->tcp_iss += (prom_gettime() >> ISS_NSEC_SHT) + tcp_random(); in tcp_iss_init()
6384 tcp->tcp_valid_bits = TCP_ISS_VALID; in tcp_iss_init()
6385 tcp->tcp_fss = tcp->tcp_iss - 1; in tcp_iss_init()
6386 tcp->tcp_suna = tcp->tcp_iss; in tcp_iss_init()
6387 tcp->tcp_snxt = tcp->tcp_iss + 1; in tcp_iss_init()
6388 tcp->tcp_rexmit_nxt = tcp->tcp_snxt; in tcp_iss_init()
6389 tcp->tcp_csuna = tcp->tcp_snxt; in tcp_iss_init()
6401 tcp_display(tcp_t *tcp, char *sup_buf, char format) in tcp_display() argument
6416 if (tcp == NULL) in tcp_display()
6418 switch (tcp->tcp_state) { in tcp_display()
6459 (void) sprintf(buf1, "TCPUnkState(%d)", tcp->tcp_state); in tcp_display()
6471 addr.s_addr = tcp->tcp_bound_source; in tcp_display()
6473 addr.s_addr = tcp->tcp_remote; in tcp_display()
6476 local_addrbuf, ntohs(tcp->tcp_lport), remote_addrbuf, in tcp_display()
6477 ntohs(tcp->tcp_fport), cp); in tcp_display()
6482 ntohs(tcp->tcp_lport), ntohs(tcp->tcp_fport), cp); in tcp_display()
6496 tcp_reass(tcp_t *tcp, mblk_t *mp, uint32_t start) in tcp_reass() argument
6518 mp1 = tcp->tcp_reass_tail; in tcp_reass()
6520 tcp->tcp_reass_tail = mp; in tcp_reass()
6521 tcp->tcp_reass_head = mp; in tcp_reass()
6530 tcp->tcp_reass_tail = mp; in tcp_reass()
6535 mp1 = tcp->tcp_reass_head; in tcp_reass()
6541 tcp->tcp_reass_head = mp; in tcp_reass()
6542 tcp_reass_elim_overlap(tcp, mp); in tcp_reass()
6559 tcp_reass_elim_overlap(tcp, mp); in tcp_reass()
6562 tcp_reass_elim_overlap(tcp, mp1); in tcp_reass()
6565 mp1 = tcp->tcp_reass_head; in tcp_reass()
6567 if (TCP_REASS_SEQ(mp1) != tcp->tcp_rnxt) in tcp_reass()
6576 tcp->tcp_reass_tail = NULL; in tcp_reass()
6585 mp1 = tcp->tcp_reass_head; in tcp_reass()
6586 tcp->tcp_reass_head = mp; in tcp_reass()
6592 tcp_reass_elim_overlap(tcp_t *tcp, mblk_t *mp) in tcp_reass_elim_overlap() argument
6616 tcp->tcp_reass_tail = mp; in tcp_reass_elim_overlap()
6623 tcp_time_wait_remove(tcp_t *tcp) in tcp_time_wait_remove() argument
6625 if (tcp->tcp_time_wait_expire == 0) { in tcp_time_wait_remove()
6626 assert(tcp->tcp_time_wait_next == NULL); in tcp_time_wait_remove()
6627 assert(tcp->tcp_time_wait_prev == NULL); in tcp_time_wait_remove()
6630 assert(tcp->tcp_state == TCPS_TIME_WAIT); in tcp_time_wait_remove()
6631 if (tcp == tcp_time_wait_head) { in tcp_time_wait_remove()
6632 assert(tcp->tcp_time_wait_prev == NULL); in tcp_time_wait_remove()
6633 tcp_time_wait_head = tcp->tcp_time_wait_next; in tcp_time_wait_remove()
6639 } else if (tcp == tcp_time_wait_tail) { in tcp_time_wait_remove()
6640 assert(tcp != tcp_time_wait_head); in tcp_time_wait_remove()
6641 assert(tcp->tcp_time_wait_next == NULL); in tcp_time_wait_remove()
6642 tcp_time_wait_tail = tcp->tcp_time_wait_prev; in tcp_time_wait_remove()
6646 assert(tcp->tcp_time_wait_prev->tcp_time_wait_next == tcp); in tcp_time_wait_remove()
6647 assert(tcp->tcp_time_wait_next->tcp_time_wait_prev == tcp); in tcp_time_wait_remove()
6648 tcp->tcp_time_wait_prev->tcp_time_wait_next = in tcp_time_wait_remove()
6649 tcp->tcp_time_wait_next; in tcp_time_wait_remove()
6650 tcp->tcp_time_wait_next->tcp_time_wait_prev = in tcp_time_wait_remove()
6651 tcp->tcp_time_wait_prev; in tcp_time_wait_remove()
6653 tcp->tcp_time_wait_next = NULL; in tcp_time_wait_remove()
6654 tcp->tcp_time_wait_prev = NULL; in tcp_time_wait_remove()
6655 tcp->tcp_time_wait_expire = 0; in tcp_time_wait_remove()
6663 tcp_time_wait_append(tcp_t *tcp) in tcp_time_wait_append() argument
6665 tcp->tcp_time_wait_expire = prom_gettime() + tcp_time_wait_interval; in tcp_time_wait_append()
6666 if (tcp->tcp_time_wait_expire == 0) in tcp_time_wait_append()
6667 tcp->tcp_time_wait_expire = 1; in tcp_time_wait_append()
6671 tcp_time_wait_head = tcp; in tcp_time_wait_append()
6675 tcp_time_wait_tail->tcp_time_wait_next = tcp; in tcp_time_wait_append()
6676 tcp->tcp_time_wait_prev = tcp_time_wait_tail; in tcp_time_wait_append()
6678 tcp_time_wait_tail = tcp; in tcp_time_wait_append()
6695 tcp_t *tcp; in tcp_time_wait_collector() local
6703 while ((tcp = tcp_time_wait_head) != NULL) { in tcp_time_wait_collector()
6708 if ((int32_t)(now - tcp->tcp_time_wait_expire) < 0) { in tcp_time_wait_collector()
6715 (void) tcp_clean_death(-1, tcp, 0); in tcp_time_wait_collector()
6724 tcp_t *tcp; in tcp_time_wait_report() local
6727 for (tcp = tcp_time_wait_head; tcp != NULL; in tcp_time_wait_report()
6728 tcp = tcp->tcp_time_wait_next) { in tcp_time_wait_report()
6729 printf("%s expires at %u\n", tcp_display(tcp, NULL, in tcp_time_wait_report()
6730 DISP_ADDR_AND_PORT), tcp->tcp_time_wait_expire); in tcp_time_wait_report()
6739 tcp_rcv_drain(int sock_id, tcp_t *tcp) in tcp_rcv_drain() argument
6751 if (tcp->tcp_rcv_list == NULL) in tcp_rcv_drain()
6758 if ((in_mp = allocb(tcp->tcp_rcv_cnt, 0)) == NULL) { in tcp_rcv_drain()
6766 while ((mp = tcp->tcp_rcv_list) != NULL) { in tcp_rcv_drain()
6767 tcp->tcp_rcv_list = mp->b_cont; in tcp_rcv_drain()
6774 tcp->tcp_rcv_last_tail = NULL; in tcp_rcv_drain()
6775 tcp->tcp_rcv_cnt = 0; in tcp_rcv_drain()
6787 (tcp->tcp_rwnd_max - tcp->tcp_rwnd >= tcp->tcp_mss)) { in tcp_rcv_drain()
6788 tcp->tcp_rwnd = tcp->tcp_rwnd_max; in tcp_rcv_drain()
6789 U32_TO_ABE16(tcp->tcp_rwnd >> tcp->tcp_rcv_ws, in tcp_rcv_drain()
6790 tcp->tcp_tcph->th_win); in tcp_rcv_drain()
6800 tcp_t *tcp; in tcp_rcv_drain_sock() local
6801 if ((tcp = sockets[sock_id].pcb) == NULL) in tcp_rcv_drain_sock()
6803 tcp_rcv_drain(sock_id, tcp); in tcp_rcv_drain_sock()
6812 tcp_drain_needed(int sock_id, tcp_t *tcp) in tcp_drain_needed() argument
6817 sockets[sock_id].inq, tcp->tcp_rcv_list); in tcp_drain_needed()
6820 (tcp->tcp_rcv_list == NULL)) in tcp_drain_needed()
6842 tcp_rcv_enqueue(tcp_t *tcp, mblk_t *mp, uint_t seg_len) in tcp_rcv_enqueue() argument
6845 if (tcp->tcp_rcv_list == NULL) { in tcp_rcv_enqueue()
6846 tcp->tcp_rcv_list = mp; in tcp_rcv_enqueue()
6848 tcp->tcp_rcv_last_tail->b_cont = mp; in tcp_rcv_enqueue()
6852 tcp->tcp_rcv_last_tail = mp; in tcp_rcv_enqueue()
6853 tcp->tcp_rcv_cnt += seg_len; in tcp_rcv_enqueue()
6854 tcp->tcp_rwnd -= seg_len; in tcp_rcv_enqueue()
6856 printf("tcp_rcv_enqueue rwnd %d\n", tcp->tcp_rwnd); in tcp_rcv_enqueue()
6858 U32_TO_ABE16(tcp->tcp_rwnd >> tcp->tcp_rcv_ws, tcp->tcp_tcph->th_win); in tcp_rcv_enqueue()
6874 tcp_set_rto(tcp_t *tcp, int32_t rtt) in tcp_set_rto() argument
6877 uint32_t sa = tcp->tcp_rtt_sa; in tcp_set_rto()
6878 uint32_t sv = tcp->tcp_rtt_sd; in tcp_set_rto()
6882 tcp->tcp_rtt_update++; in tcp_set_rto()
6934 tcp->tcp_rtt_sa = sa; in tcp_set_rto()
6935 tcp->tcp_rtt_sd = sv; in tcp_set_rto()
6951 tcp->tcp_rto = tcp_rexmit_interval_max; in tcp_set_rto()
6953 tcp->tcp_rto = tcp_rexmit_interval_min; in tcp_set_rto()
6955 tcp->tcp_rto = rto; in tcp_set_rto()
6959 tcp->tcp_timer_backoff = 0; in tcp_set_rto()
6967 tcp_xmit_end(tcp_t *tcp, int sock_id) in tcp_xmit_end() argument
6971 if (tcp->tcp_state < TCPS_SYN_RCVD || in tcp_xmit_end()
6972 tcp->tcp_state > TCPS_CLOSE_WAIT) { in tcp_xmit_end()
6980 tcp->tcp_fss = tcp->tcp_snxt + tcp->tcp_unsent; in tcp_xmit_end()
6981 tcp->tcp_valid_bits |= TCP_FSS_VALID; in tcp_xmit_end()
6986 if (tcp->tcp_unsent == 0) { in tcp_xmit_end()
6987 mp = tcp_xmit_mp(tcp, NULL, 0, NULL, NULL, in tcp_xmit_end()
6988 tcp->tcp_fss, B_FALSE, NULL, B_FALSE); in tcp_xmit_end()
7000 tcp->tcp_snxt = tcp->tcp_fss + 1; in tcp_xmit_end()
7001 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_xmit_end()
7008 if (tcp->tcp_rexmit && tcp->tcp_rexmit_nxt == tcp->tcp_fss) { in tcp_xmit_end()
7009 tcp->tcp_rexmit_nxt = tcp->tcp_snxt; in tcp_xmit_end()
7012 tcp_wput_data(tcp, NULL, B_FALSE); in tcp_xmit_end()
7019 tcp_opt_set(tcp_t *tcp, int level, int option, const void *optval, in tcp_opt_set() argument
7035 val = MSS_ROUNDUP(val, tcp->tcp_mss); in tcp_opt_set()
7036 (void) tcp_rwnd_set(tcp, val); in tcp_opt_set()
7044 tcp->tcp_xmit_hiwater = *(int *)optval; in tcp_opt_set()
7045 if (tcp->tcp_xmit_hiwater > tcp_max_buf) in tcp_opt_set()
7046 tcp->tcp_xmit_hiwater = tcp_max_buf; in tcp_opt_set()
7056 tcp->tcp_linger = 1; in tcp_opt_set()
7057 tcp->tcp_lingertime = lgr->l_linger; in tcp_opt_set()
7059 tcp->tcp_linger = 0; in tcp_opt_set()
7060 tcp->tcp_lingertime = 0; in tcp_opt_set()