Lines Matching refs:tcp

110 	tcp_t		*tcp;  member
228 #define SET_WS_VALUE(tcp) \ argument
231 uint32_t rwnd = (tcp)->tcp_rwnd; \
235 (tcp)->tcp_rcv_ws = i; \
245 #define SET_ECT(tcp, iph) \ argument
246 if ((tcp)->tcp_ipversion == IPV4_VERSION) { \
275 #define TCP_TIMER_RESTART(tcp, intvl) \ argument
276 (tcp)->tcp_rto_timeout = prom_gettime() + intvl; \
277 (tcp)->tcp_timer_running = B_TRUE;
467 tcp_drain_input(tcp_t *tcp, int sock_id, int timeout) in tcp_drain_input() argument
476 tcp_display(tcp, NULL, DISP_ADDR_AND_PORT)); in tcp_drain_input()
521 tcp_rput_data(tcp, mp, sock_id); in tcp_drain_input()
531 tcp = NULL; in tcp_drain_input()
534 if (tcp == NULL || sockets[sock_id].pcb == NULL) { in tcp_drain_input()
549 tcp_drain_needed(sock_id, tcp); in tcp_drain_input()
564 tcp_t *tcp; in tcp_input() local
568 if ((tcp = sockets[sock_id].pcb) == NULL) in tcp_input()
584 tcp_rput_data(tcp, mp, sock_id); in tcp_input()
591 if (tcp->tcp_rcv_list != NULL) { in tcp_input()
592 tcp_rcv_drain(sock_id, tcp); in tcp_input()
595 if (tcp->tcp_state == TCPS_CLOSE_WAIT) { in tcp_input()
609 tcp_send(int sock_id, tcp_t *tcp, const void *msg, int len) in tcp_send() argument
614 int mss = tcp->tcp_mss; in tcp_send()
635 if ((mp = allocb(mss + tcp->tcp_ip_hdr_len + in tcp_send()
639 mp->b_rptr += tcp->tcp_hdr_len + tcp_wroff_xtra; in tcp_send()
671 win_size = (tcp->tcp_swnd > tcp->tcp_cwnd) ? tcp->tcp_cwnd : in tcp_send()
672 tcp->tcp_swnd; in tcp_send()
673 win_size -= tcp->tcp_snxt; in tcp_send()
674 win_size += tcp->tcp_suna; in tcp_send()
675 if (win_size < (2 * tcp->tcp_mss)) in tcp_send()
676 if (tcp_drain_input(tcp, sock_id, 5) < 0) in tcp_send()
679 tcp_wput_data(tcp, head, sock_id); in tcp_send()
695 tcp_free(tcp_t *tcp) in tcp_free() argument
697 if (tcp->tcp_iphc != NULL) { in tcp_free()
698 bkmem_free((caddr_t)tcp->tcp_iphc, tcp->tcp_iphc_len); in tcp_free()
699 tcp->tcp_iphc = NULL; in tcp_free()
701 if (tcp->tcp_xmit_head != NULL) { in tcp_free()
702 freemsg(tcp->tcp_xmit_head); in tcp_free()
703 tcp->tcp_xmit_head = NULL; in tcp_free()
705 if (tcp->tcp_rcv_list != NULL) { in tcp_free()
706 freemsg(tcp->tcp_rcv_list); in tcp_free()
707 tcp->tcp_rcv_list = NULL; in tcp_free()
709 if (tcp->tcp_reass_head != NULL) { in tcp_free()
710 freemsg(tcp->tcp_reass_head); in tcp_free()
711 tcp->tcp_reass_head = NULL; in tcp_free()
713 if (tcp->tcp_sack_info != NULL) { in tcp_free()
714 bkmem_free((caddr_t)tcp->tcp_sack_info, in tcp_free()
716 tcp->tcp_sack_info = NULL; in tcp_free()
721 tcp_close_detached(tcp_t *tcp) in tcp_close_detached() argument
723 if (tcp->tcp_listener != NULL) in tcp_close_detached()
724 tcp_eager_unlink(tcp); in tcp_close_detached()
725 tcp_free(tcp); in tcp_close_detached()
726 bkmem_free((caddr_t)tcp, sizeof (tcp_t)); in tcp_close_detached()
735 tcp_eager_unlink(tcp_t *tcp) in tcp_eager_unlink() argument
737 tcp_t *listener = tcp->tcp_listener; in tcp_eager_unlink()
740 if (tcp->tcp_eager_next_q0 != NULL) { in tcp_eager_unlink()
741 assert(tcp->tcp_eager_prev_q0 != NULL); in tcp_eager_unlink()
744 tcp->tcp_eager_next_q0->tcp_eager_prev_q0 = in tcp_eager_unlink()
745 tcp->tcp_eager_prev_q0; in tcp_eager_unlink()
746 tcp->tcp_eager_prev_q0->tcp_eager_next_q0 = in tcp_eager_unlink()
747 tcp->tcp_eager_next_q0; in tcp_eager_unlink()
754 if (tcpp[0] == tcp) { in tcp_eager_unlink()
755 if (listener->tcp_eager_last_q == tcp) { in tcp_eager_unlink()
762 assert(tcp->tcp_eager_next_q == NULL); in tcp_eager_unlink()
778 tcpp[0] = tcp->tcp_eager_next_q; in tcp_eager_unlink()
779 tcp->tcp_eager_next_q = NULL; in tcp_eager_unlink()
780 tcp->tcp_eager_last_q = NULL; in tcp_eager_unlink()
787 tcp->tcp_listener = NULL; in tcp_eager_unlink()
824 tcp_t *tcp; in tcp_shutdown() local
828 if ((tcp = sockets[sock_id].pcb) == NULL) { in tcp_shutdown()
837 if (tcp_drain_input(tcp, sock_id, 5) < 0) { in tcp_shutdown()
843 tcp_clean_death(sock_id, tcp, 0); in tcp_shutdown()
847 DEBUG_1("tcp_shutdown: tcp_state %x\n", tcp->tcp_state); in tcp_shutdown()
848 switch (tcp->tcp_state) { in tcp_shutdown()
861 if (tcp_xmit_end(tcp, sock_id) == 0 && in tcp_shutdown()
862 tcp_state_wait(sock_id, tcp, TCPS_FIN_WAIT_2) < 0) { in tcp_shutdown()
882 tcp_t *tcp; in tcp_close() local
885 if ((tcp = sockets[sock_id].pcb) == NULL) { in tcp_close()
896 if (tcp_drain_input(tcp, sock_id, 5) < 0) { in tcp_close()
902 tcp_clean_death(sock_id, tcp, 0); in tcp_close()
906 if (tcp->tcp_conn_req_cnt_q0 != 0 || tcp->tcp_conn_req_cnt_q != 0) { in tcp_close()
908 tcp_eager_cleanup(tcp, 0, sock_id); in tcp_close()
912 switch (tcp->tcp_state) { in tcp_close()
934 if (tcp->tcp_linger && tcp->tcp_lingertime == 0) { in tcp_close()
942 if (tcp->tcp_rcv_list != NULL || in tcp_close()
943 tcp->tcp_reass_head != NULL) { in tcp_close()
947 if (tcp->tcp_state <= TCPS_LISTEN) in tcp_close()
957 (void) tcp_xmit_end(tcp, sock_id); in tcp_close()
965 if (tcp->tcp_linger && tcp->tcp_lingertime > 0 && in tcp_close()
966 !(tcp->tcp_fin_acked) && in tcp_close()
967 tcp->tcp_state >= TCPS_ESTABLISHED) { in tcp_close()
970 tcp->tcp_client_errno = 0; in tcp_close()
972 (tcp->tcp_lingertime * 1000); in tcp_close()
973 while (!(tcp->tcp_fin_acked) && in tcp_close()
974 tcp->tcp_state >= TCPS_ESTABLISHED && in tcp_close()
975 tcp->tcp_client_errno == 0 && in tcp_close()
977 if (tcp_drain_input(tcp, sock_id, 5) < 0) { in tcp_close()
980 tcp, 0); in tcp_close()
985 tcp->tcp_client_errno = 0; in tcp_close()
987 if (tcp_state_wait(sock_id, tcp, TCPS_TIME_WAIT) < 0) { in tcp_close()
1000 if (tcp->tcp_state == TCPS_ESTABLISHED || in tcp_close()
1001 tcp->tcp_state == TCPS_CLOSE_WAIT) in tcp_close()
1003 if (tcp->tcp_state == TCPS_SYN_SENT || in tcp_close()
1004 tcp->tcp_state == TCPS_SYN_RCVD) in tcp_close()
1006 tcp_xmit_ctl(msg, tcp, NULL, tcp->tcp_snxt, 0, TH_RST, 0, in tcp_close()
1010 tcp_free(tcp); in tcp_close()
1011 bkmem_free((caddr_t)tcp, sizeof (tcp_t)); in tcp_close()
1020 tcp_t *tcp; in tcp_listen() local
1022 if ((tcp = (tcp_t *)(sockets[sock_id].pcb)) == NULL) { in tcp_listen()
1027 if (tcp->tcp_state > TCPS_LISTEN || tcp->tcp_state < TCPS_BOUND) { in tcp_listen()
1032 if (tcp->tcp_state != TCPS_LISTEN) { in tcp_listen()
1033 tcp->tcp_eager_next_q0 = tcp->tcp_eager_prev_q0 = tcp; in tcp_listen()
1034 tcp->tcp_eager_next_q = NULL; in tcp_listen()
1035 tcp->tcp_state = TCPS_LISTEN; in tcp_listen()
1036 tcp->tcp_second_ctimer_threshold = tcp_ip_abort_linterval; in tcp_listen()
1038 if ((tcp->tcp_conn_req_max = backlog) > tcp_conn_req_max_q) { in tcp_listen()
1039 tcp->tcp_conn_req_max = tcp_conn_req_max_q; in tcp_listen()
1041 if (tcp->tcp_conn_req_max < tcp_conn_req_min) { in tcp_listen()
1042 tcp->tcp_conn_req_max = tcp_conn_req_min; in tcp_listen()
1140 tcp_t *tcp; in tcp_bindi() local
1146 ((tcp = (tcp_t *)sockets[i].pcb) == NULL) || in tcp_bindi()
1147 ntohs(tcp->tcp_lport) != port) { in tcp_bindi()
1155 if (reuseaddr && tcp->tcp_state > TCPS_LISTEN) { in tcp_bindi()
1158 if (tcp->tcp_bound_source != INADDR_ANY && in tcp_bindi()
1160 tcp->tcp_bound_source != *addr) { in tcp_bindi()
1180 tcp_t *tcp; in tcp_bind() local
1185 if ((tcp = (tcp_t *)sockets[sock_id].pcb) == NULL) { in tcp_bind()
1190 if (tcp->tcp_state >= TCPS_BOUND) { in tcp_bind()
1199 tcp->tcp_bound_source = sockets[sock_id].bind.sin_addr.s_addr; in tcp_bind()
1201 tcp->tcp_ipha->ip_src.s_addr = tcp->tcp_bound_source; in tcp_bind()
1213 allocated_port = tcp_bindi(requested_port, &(tcp->tcp_bound_source), in tcp_bind()
1220 tcp->tcp_lport = htons(allocated_port); in tcp_bind()
1221 *(uint16_t *)tcp->tcp_tcph->th_lport = tcp->tcp_lport; in tcp_bind()
1222 sockets[sock_id].bind.sin_port = tcp->tcp_lport; in tcp_bind()
1223 tcp->tcp_state = TCPS_BOUND; in tcp_bind()
1231 tcp_conn_check(tcp_t *tcp) in tcp_conn_check() argument
1245 if (tmp_tcp->tcp_lport != tcp->tcp_lport || in tcp_conn_check()
1246 tmp_tcp->tcp_fport != tcp->tcp_fport || in tcp_conn_check()
1247 tmp_tcp->tcp_bound_source != tcp->tcp_bound_source || in tcp_conn_check()
1248 tmp_tcp->tcp_remote != tcp->tcp_remote) { in tcp_conn_check()
1261 tcp_t *tcp; in tcp_connect() local
1268 if ((tcp = (tcp_t *)(sockets[sock_id].pcb)) == NULL) { in tcp_connect()
1306 if (tcp->tcp_bound_source == INADDR_ANY) { in tcp_connect()
1314 tcp->tcp_bound_source = sockets[sock_id].bind.sin_addr.s_addr; in tcp_connect()
1315 tcp->tcp_ipha->ip_src.s_addr = tcp->tcp_bound_source; in tcp_connect()
1321 if (dstaddr == tcp->tcp_ipha->ip_src.s_addr && in tcp_connect()
1322 dstport == tcp->tcp_lport) { in tcp_connect()
1327 tcp->tcp_ipha->ip_dst.s_addr = dstaddr; in tcp_connect()
1328 tcp->tcp_remote = dstaddr; in tcp_connect()
1329 tcph = tcp->tcp_tcph; in tcp_connect()
1331 tcp->tcp_fport = dstport; in tcp_connect()
1337 if (tcp_conn_check(tcp) < 0) { in tcp_connect()
1353 mss = tcp->tcp_mss - tcp->tcp_hdr_len; in tcp_connect()
1354 tcp->tcp_rwnd = MAX(MSS_ROUNDUP(tcp->tcp_rwnd, mss), in tcp_connect()
1356 tcp->tcp_rwnd_max = tcp->tcp_rwnd; in tcp_connect()
1357 SET_WS_VALUE(tcp); in tcp_connect()
1358 U32_TO_ABE16((tcp->tcp_rwnd >> tcp->tcp_rcv_ws), in tcp_connect()
1359 tcp->tcp_tcph->th_win); in tcp_connect()
1360 if (tcp->tcp_rcv_ws > 0 || tcp_wscale_always) in tcp_connect()
1361 tcp->tcp_snd_ws_ok = B_TRUE; in tcp_connect()
1370 (tcp->tcp_rcv_ws && tcp_tstamp_if_wscale)) { in tcp_connect()
1371 tcp->tcp_snd_ts_ok = B_TRUE; in tcp_connect()
1375 tcp->tcp_snd_sack_ok) { in tcp_connect()
1376 assert(tcp->tcp_sack_info == NULL); in tcp_connect()
1377 if ((tcp->tcp_sack_info = (tcp_sack_info_t *)bkmem_zalloc( in tcp_connect()
1379 tcp->tcp_snd_sack_ok = B_FALSE; in tcp_connect()
1381 tcp->tcp_snd_sack_ok = B_TRUE; in tcp_connect()
1393 tcp->tcp_ecn_ok = B_TRUE; in tcp_connect()
1395 tcp_iss_init(tcp); in tcp_connect()
1396 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_connect()
1397 tcp->tcp_active_open = B_TRUE; in tcp_connect()
1399 tcp->tcp_state = TCPS_SYN_SENT; in tcp_connect()
1400 syn_mp = tcp_xmit_mp(tcp, NULL, 0, NULL, NULL, tcp->tcp_iss, B_FALSE, in tcp_connect()
1420 return (tcp_state_wait(sock_id, tcp, TCPS_ESTABLISHED)); in tcp_connect()
1570 tcp_drop_q0(tcp_t *tcp) in tcp_drop_q0() argument
1574 assert(tcp->tcp_eager_next_q0 != tcp->tcp_eager_prev_q0); in tcp_drop_q0()
1581 eager = tcp->tcp_eager_prev_q0; in tcp_drop_q0()
1585 if (eager == tcp) { in tcp_drop_q0()
1586 eager = tcp->tcp_eager_prev_q0; in tcp_drop_q0()
1592 tcp->tcp_conn_req_cnt_q0, in tcp_drop_q0()
1593 tcp_display(tcp, NULL, DISP_PORT_ONLY)); in tcp_drop_q0()
1602 tcp_conn_request(tcp_t *tcp, mblk_t *mp, uint_t sock_id, uint_t ip_hdr_len) in tcp_conn_request() argument
1612 if (tcp->tcp_conn_req_cnt_q >= tcp->tcp_conn_req_max) { in tcp_conn_request()
1616 tcp->tcp_conn_req_max, tcp->tcp_conn_req_cnt_q, in tcp_conn_request()
1617 tcp_display(tcp, NULL, DISP_PORT_ONLY)); in tcp_conn_request()
1623 if (tcp->tcp_conn_req_cnt_q0 >= in tcp_conn_request()
1624 tcp->tcp_conn_req_max + tcp_conn_req_max_q0) { in tcp_conn_request()
1630 tcp->tcp_last_rcv_lbolt = prom_gettime(); in tcp_conn_request()
1631 if (!tcp_drop_q0(tcp)) { in tcp_conn_request()
1637 tcp->tcp_conn_req_cnt_q0, in tcp_conn_request()
1638 tcp_display(tcp, NULL, DISP_PORT_ONLY)); in tcp_conn_request()
1673 eager->tcp_family = tcp->tcp_family; in tcp_conn_request()
1675 err = tcp_accept_comm(tcp, eager, mp, ip_hdr_len); in tcp_conn_request()
1681 tcp->tcp_eager_next_q0->tcp_eager_prev_q0 = eager; in tcp_conn_request()
1682 eager->tcp_eager_next_q0 = tcp->tcp_eager_next_q0; in tcp_conn_request()
1683 tcp->tcp_eager_next_q0 = eager; in tcp_conn_request()
1684 eager->tcp_eager_prev_q0 = tcp; in tcp_conn_request()
1687 eager->tcp_listener = tcp; in tcp_conn_request()
1688 tcp->tcp_conn_req_cnt_q0++; in tcp_conn_request()
1699 tcp_state_wait(int sock_id, tcp_t *tcp, int state) in tcp_state_wait() argument
1714 if (timeout > tcp->tcp_rto) { in tcp_state_wait()
1715 sockets[sock_id].in_timeout = tcp->tcp_rto; in tcp_state_wait()
1735 if (tcp->tcp_state == state) in tcp_state_wait()
1751 tcp_rput_data(tcp, mp, sock_id); in tcp_state_wait()
1760 tcp = NULL; in tcp_state_wait()
1765 if (tcp == NULL || sockets[sock_id].pcb == NULL) { in tcp_state_wait()
1780 if ((state == TCPS_ALL_ACKED) && (tcp->tcp_suna == tcp->tcp_snxt)) { in tcp_state_wait()
1783 if (tcp->tcp_state != state) { in tcp_state_wait()
1784 if (prom_gettime() > tcp->tcp_rto_timeout) in tcp_state_wait()
1785 tcp_timer(tcp, sock_id); in tcp_state_wait()
1792 tcp_drain_needed(sock_id, tcp); in tcp_state_wait()
1831 tcp_t *tcp; in tcp_lookup_ipv4() local
1835 (tcp = (tcp_t *)sockets[i].pcb) != NULL) { in tcp_lookup_ipv4()
1836 if (tcph->tha_lport == tcp->tcp_fport && in tcp_lookup_ipv4()
1837 tcph->tha_fport == tcp->tcp_lport && in tcp_lookup_ipv4()
1838 iph->ip_src.s_addr == tcp->tcp_remote && in tcp_lookup_ipv4()
1839 iph->ip_dst.s_addr == tcp->tcp_bound_source && in tcp_lookup_ipv4()
1840 tcp->tcp_state >= min_state) { in tcp_lookup_ipv4()
1842 return (tcp); in tcp_lookup_ipv4()
1847 for (tcp = tcp_time_wait_head; tcp != NULL; in tcp_lookup_ipv4()
1848 tcp = tcp->tcp_time_wait_next) { in tcp_lookup_ipv4()
1849 if (tcph->tha_lport == tcp->tcp_fport && in tcp_lookup_ipv4()
1850 tcph->tha_fport == tcp->tcp_lport && in tcp_lookup_ipv4()
1851 iph->ip_src.s_addr == tcp->tcp_remote && in tcp_lookup_ipv4()
1852 iph->ip_dst.s_addr == tcp->tcp_bound_source && in tcp_lookup_ipv4()
1853 tcp->tcp_state >= min_state) { in tcp_lookup_ipv4()
1855 return (tcp); in tcp_lookup_ipv4()
1866 tcp_t *tcp; in tcp_lookup_listener_ipv4() local
1870 (tcp = (tcp_t *)sockets[i].pcb) != NULL) { in tcp_lookup_listener_ipv4()
1871 if (tcp->tcp_lport == port && in tcp_lookup_listener_ipv4()
1872 (tcp->tcp_bound_source == addr || in tcp_lookup_listener_ipv4()
1873 tcp->tcp_bound_source == INADDR_ANY)) { in tcp_lookup_listener_ipv4()
1875 return (tcp); in tcp_lookup_listener_ipv4()
1887 tcp_t *tcp; in tcp_lookup_eager_ipv4() local
1892 for (tcp = listener->tcp_eager_next_q; tcp != NULL; in tcp_lookup_eager_ipv4()
1893 tcp = tcp->tcp_eager_next_q) { in tcp_lookup_eager_ipv4()
1894 if (tcph->tha_lport == tcp->tcp_fport && in tcp_lookup_eager_ipv4()
1895 tcph->tha_fport == tcp->tcp_lport && in tcp_lookup_eager_ipv4()
1896 iph->ip_src.s_addr == tcp->tcp_remote && in tcp_lookup_eager_ipv4()
1897 iph->ip_dst.s_addr == tcp->tcp_bound_source) { in tcp_lookup_eager_ipv4()
1898 return (tcp); in tcp_lookup_eager_ipv4()
1902 for (tcp = listener->tcp_eager_next_q0; tcp != listener; in tcp_lookup_eager_ipv4()
1903 tcp = tcp->tcp_eager_next_q0) { in tcp_lookup_eager_ipv4()
1904 if (tcph->tha_lport == tcp->tcp_fport && in tcp_lookup_eager_ipv4()
1905 tcph->tha_fport == tcp->tcp_lport && in tcp_lookup_eager_ipv4()
1906 iph->ip_src.s_addr == tcp->tcp_remote && in tcp_lookup_eager_ipv4()
1907 iph->ip_dst.s_addr == tcp->tcp_bound_source) { in tcp_lookup_eager_ipv4()
1908 return (tcp); in tcp_lookup_eager_ipv4()
1919 tcp_clean_death(int sock_id, tcp_t *tcp, int err) in tcp_clean_death() argument
1921 tcp_free(tcp); in tcp_clean_death()
1922 if (tcp->tcp_state == TCPS_TIME_WAIT) in tcp_clean_death()
1923 tcp_time_wait_remove(tcp); in tcp_clean_death()
1930 bkmem_free((caddr_t)tcp, sizeof (tcp_t)); in tcp_clean_death()
1953 tcp_rwnd_set(tcp_t *tcp, uint32_t rwnd) in tcp_rwnd_set() argument
1955 uint32_t mss = tcp->tcp_mss; in tcp_rwnd_set()
1959 if (tcp->tcp_rwnd_max != 0) in tcp_rwnd_set()
1960 old_max_rwnd = tcp->tcp_rwnd_max; in tcp_rwnd_set()
1962 old_max_rwnd = tcp->tcp_rwnd; in tcp_rwnd_set()
1978 if (rwnd < old_max_rwnd && tcp->tcp_state > TCPS_SYN_SENT) { in tcp_rwnd_set()
1987 max_transmittable_rwnd = TCP_MAXWIN << tcp->tcp_rcv_ws; in tcp_rwnd_set()
1998 tcp->tcp_rwnd = old_max_rwnd = rwnd; in tcp_rwnd_set()
2006 tcp->tcp_rwnd += rwnd - old_max_rwnd; in tcp_rwnd_set()
2007 U32_TO_ABE16(tcp->tcp_rwnd >> tcp->tcp_rcv_ws, tcp->tcp_tcph->th_win); in tcp_rwnd_set()
2008 if ((tcp->tcp_rcv_ws > 0) && rwnd > tcp->tcp_cwnd_max) in tcp_rwnd_set()
2009 tcp->tcp_cwnd_max = rwnd; in tcp_rwnd_set()
2010 tcp->tcp_rwnd_max = rwnd; in tcp_rwnd_set()
2029 tcp_t *tcp; in tcp_parse_options() local
2082 if ((tcp = tcpopt->tcp) == NULL) { in tcp_parse_options()
2093 assert(tcp->tcp_sack_info != NULL); in tcp_parse_options()
2094 if (tcp->tcp_notsack_list == NULL) { in tcp_parse_options()
2095 tcp_notsack_update(&(tcp->tcp_notsack_list), in tcp_parse_options()
2096 tcp->tcp_suna, tcp->tcp_snxt, in tcp_parse_options()
2097 &(tcp->tcp_num_notsack_blk), in tcp_parse_options()
2098 &(tcp->tcp_cnt_notsack_list)); in tcp_parse_options()
2105 if (tcp->tcp_notsack_list == NULL) { in tcp_parse_options()
2109 tcp->tcp_fack = tcp->tcp_suna; in tcp_parse_options()
2130 SEQ_LT(sack_begin, tcp->tcp_suna) || in tcp_parse_options()
2131 SEQ_GT(sack_end, tcp->tcp_snxt)) { in tcp_parse_options()
2134 tcp_notsack_insert(&(tcp->tcp_notsack_list), in tcp_parse_options()
2136 &(tcp->tcp_num_notsack_blk), in tcp_parse_options()
2137 &(tcp->tcp_cnt_notsack_list)); in tcp_parse_options()
2138 if (SEQ_GT(sack_end, tcp->tcp_fack)) { in tcp_parse_options()
2139 tcp->tcp_fack = sack_end; in tcp_parse_options()
2182 tcp_mss_set(tcp_t *tcp, uint32_t mss) in tcp_mss_set() argument
2197 if (mss < tcp->tcp_naglim || tcp->tcp_mss == tcp->tcp_naglim) in tcp_mss_set()
2198 tcp->tcp_naglim = mss; in tcp_mss_set()
2203 if ((mss << 2) > tcp->tcp_xmit_hiwater) in tcp_mss_set()
2204 tcp->tcp_xmit_hiwater = mss << 2; in tcp_mss_set()
2205 tcp->tcp_mss = mss; in tcp_mss_set()
2215 tcp->tcp_cwnd = MIN(tcp_slow_start_initial * mss, in tcp_mss_set()
2217 tcp->tcp_cwnd_cnt = 0; in tcp_mss_set()
2230 tcp_process_options(tcp_t *tcp, tcph_t *tcph) in tcp_process_options() argument
2237 tcpopt.tcp = NULL; in tcp_process_options()
2249 if (tcp->tcp_ipversion == IPV4_VERSION) in tcp_process_options()
2259 tcp->tcp_snd_ws = tcpopt.tcp_opt_wscale; in tcp_process_options()
2260 tcp->tcp_snd_ws_ok = B_TRUE; in tcp_process_options()
2262 tcp->tcp_snd_ws = B_FALSE; in tcp_process_options()
2263 tcp->tcp_snd_ws_ok = B_FALSE; in tcp_process_options()
2264 tcp->tcp_rcv_ws = B_FALSE; in tcp_process_options()
2269 (tcp->tcp_snd_ts_ok || !tcp->tcp_active_open)) { in tcp_process_options()
2270 tmp_tcph = (char *)tcp->tcp_tcph; in tcp_process_options()
2272 tcp->tcp_snd_ts_ok = B_TRUE; in tcp_process_options()
2273 tcp->tcp_ts_recent = tcpopt.tcp_opt_ts_val; in tcp_process_options()
2274 tcp->tcp_last_rcv_lbolt = prom_gettime(); in tcp_process_options()
2276 assert(tcp->tcp_tcp_hdr_len == TCP_MIN_HEADER_LENGTH); in tcp_process_options()
2279 tmp_tcph += tcp->tcp_tcp_hdr_len; in tcp_process_options()
2284 tcp->tcp_hdr_len += TCPOPT_REAL_TS_LEN; in tcp_process_options()
2285 tcp->tcp_tcp_hdr_len += TCPOPT_REAL_TS_LEN; in tcp_process_options()
2286 tcp->tcp_tcph->th_offset_and_rsrvd[0] += (3 << 4); in tcp_process_options()
2288 tcp->tcp_snd_ts_ok = B_FALSE; in tcp_process_options()
2296 (tcp->tcp_snd_sack_ok || in tcp_process_options()
2297 (tcp_sack_permitted != 0 && !tcp->tcp_active_open))) { in tcp_process_options()
2299 if (tcp->tcp_sack_info == NULL) { in tcp_process_options()
2300 tcp->tcp_sack_info = (tcp_sack_info_t *)bkmem_zalloc( in tcp_process_options()
2303 if (tcp->tcp_sack_info == NULL) { in tcp_process_options()
2304 tcp->tcp_snd_sack_ok = B_FALSE; in tcp_process_options()
2306 tcp->tcp_snd_sack_ok = B_TRUE; in tcp_process_options()
2307 if (tcp->tcp_snd_ts_ok) { in tcp_process_options()
2308 tcp->tcp_max_sack_blk = 3; in tcp_process_options()
2310 tcp->tcp_max_sack_blk = 4; in tcp_process_options()
2321 if (tcp->tcp_sack_info != NULL) { in tcp_process_options()
2322 bkmem_free((caddr_t)tcp->tcp_sack_info, in tcp_process_options()
2324 tcp->tcp_sack_info = NULL; in tcp_process_options()
2326 tcp->tcp_snd_sack_ok = B_FALSE; in tcp_process_options()
2333 tcp->tcp_mss -= tcp->tcp_hdr_len; in tcp_process_options()
2341 tcpopt.tcp_opt_mss -= tcp->tcp_hdr_len - in tcp_process_options()
2355 tcp_mss_set(tcp, MIN(tcpopt.tcp_opt_mss, tcp->tcp_mss)); in tcp_process_options()
2363 tcp_paws_check(tcp_t *tcp, tcph_t *tcph, tcp_opt_t *tcpoptp) in tcp_paws_check() argument
2385 if (tcp->tcp_snd_sack_ok) { in tcp_paws_check()
2386 tcpoptp->tcp = tcp; in tcp_paws_check()
2388 tcpoptp->tcp = NULL; in tcp_paws_check()
2400 tcp->tcp_ts_recent)) { in tcp_paws_check()
2402 tcp->tcp_last_rcv_lbolt + PAWS_TIMEOUT)) { in tcp_paws_check()
2411 tcp->tcp_ts_recent = in tcp_paws_check()
2421 tcp->tcp_snd_ts_ok = B_FALSE; in tcp_paws_check()
2423 tcp->tcp_hdr_len -= TCPOPT_REAL_TS_LEN; in tcp_paws_check()
2424 tcp->tcp_tcp_hdr_len -= TCPOPT_REAL_TS_LEN; in tcp_paws_check()
2425 tcp->tcp_tcph->th_offset_and_rsrvd[0] -= (3 << 4); in tcp_paws_check()
2426 tcp_mss_set(tcp, tcp->tcp_mss + TCPOPT_REAL_TS_LEN); in tcp_paws_check()
2427 if (tcp->tcp_snd_sack_ok) { in tcp_paws_check()
2428 assert(tcp->tcp_sack_info != NULL); in tcp_paws_check()
2429 tcp->tcp_max_sack_blk = 4; in tcp_paws_check()
2449 tcp_get_seg_mp(tcp_t *tcp, uint32_t seq, int32_t *off) in tcp_get_seg_mp() argument
2455 if (SEQ_LT(seq, tcp->tcp_suna) || SEQ_GEQ(seq, tcp->tcp_snxt) || in tcp_get_seg_mp()
2459 cnt = seq - tcp->tcp_suna; in tcp_get_seg_mp()
2460 mp = tcp->tcp_xmit_head; in tcp_get_seg_mp()
2490 tcp_sack_rxmit(tcp_t *tcp, int sock_id) in tcp_sack_rxmit() argument
2498 assert(tcp->tcp_sack_info != NULL); in tcp_sack_rxmit()
2499 assert(tcp->tcp_notsack_list != NULL); in tcp_sack_rxmit()
2500 assert(tcp->tcp_rexmit == B_FALSE); in tcp_sack_rxmit()
2503 if (tcp->tcp_notsack_list == NULL) { in tcp_sack_rxmit()
2506 notsack_blk = tcp->tcp_notsack_list; in tcp_sack_rxmit()
2507 mss = tcp->tcp_mss; in tcp_sack_rxmit()
2513 usable_swnd = tcp->tcp_cwnd_ssthresh - tcp->tcp_pipe; in tcp_sack_rxmit()
2521 tcp->tcp_csuna = tcp->tcp_snxt; in tcp_sack_rxmit()
2523 notsack_blk = tcp->tcp_notsack_list; in tcp_sack_rxmit()
2526 tcp_seq begin = tcp->tcp_sack_snxt; in tcp_sack_rxmit()
2547 usable_swnd = tcp->tcp_cwnd_ssthresh - tcp->tcp_pipe; in tcp_sack_rxmit()
2549 tcp->tcp_cwnd = tcp->tcp_snxt - tcp->tcp_suna; in tcp_sack_rxmit()
2550 assert(tcp->tcp_cwnd > 0); in tcp_sack_rxmit()
2554 tcp->tcp_cwnd = tcp->tcp_snxt - tcp->tcp_suna + in tcp_sack_rxmit()
2567 snxt_mp = tcp_get_seg_mp(tcp, begin, &off); in tcp_sack_rxmit()
2574 xmit_mp = tcp_xmit_mp(tcp, snxt_mp, seg_len, &off, in tcp_sack_rxmit()
2581 tcp->tcp_pipe += seg_len; in tcp_sack_rxmit()
2582 tcp->tcp_sack_snxt = begin + seg_len; in tcp_sack_rxmit()
2603 if (SEQ_GT(tcp->tcp_sack_snxt, tcp->tcp_rexmit_max)) { in tcp_sack_rxmit()
2604 tcp->tcp_rexmit_max = tcp->tcp_sack_snxt; in tcp_sack_rxmit()
2611 tcp_rput_data(tcp_t *tcp, mblk_t *mp, int sock_id) in tcp_rput_data() argument
2679 if (tcp == NULL || in tcp_rput_data()
2680 tcph->tha_lport != tcp->tcp_fport || in tcp_rput_data()
2681 tcph->tha_fport != tcp->tcp_lport || in tcp_rput_data()
2682 iph->ip_src.s_addr != tcp->tcp_remote || in tcp_rput_data()
2683 iph->ip_dst.s_addr != tcp->tcp_bound_source) { in tcp_rput_data()
2686 tcp->tcp_state); in tcp_rput_data()
2702 if ((tcp = tcp_lookup_eager_ipv4(tcp1, in tcp_rput_data()
2710 tcp = tcp1; in tcp_rput_data()
2715 tcp_display(tcp, NULL, in tcp_rput_data()
2726 tcp = tcp1; in tcp_rput_data()
2740 if (tcp->tcp_state == TCPS_TIME_WAIT) { in tcp_rput_data()
2741 tcp_time_wait_processing(tcp, mp, seg_seq, seg_ack, in tcp_rput_data()
2750 assert(tcp != NULL && tcp->tcp_state != TCPS_TIME_WAIT); in tcp_rput_data()
2756 tcp->tcp_last_recv_time = prom_gettime(); in tcp_rput_data()
2767 switch (tcp->tcp_state) { in tcp_rput_data()
2787 if (tcp->tcp_conn_req_max > 0) { in tcp_rput_data()
2788 tcp = tcp_conn_request(tcp, mp, sock_id, ip_hdr_len); in tcp_rput_data()
2789 if (tcp == NULL) { in tcp_rput_data()
2797 tcp->tcp_irs = seg_seq; in tcp_rput_data()
2798 tcp->tcp_rack = seg_seq; in tcp_rput_data()
2799 tcp->tcp_rnxt = seg_seq + 1; in tcp_rput_data()
2800 U32_TO_ABE32(tcp->tcp_rnxt, tcp->tcp_tcph->th_ack); in tcp_rput_data()
2811 if (SEQ_LEQ(seg_ack, tcp->tcp_iss) || in tcp_rput_data()
2812 SEQ_GT(seg_ack, tcp->tcp_snxt)) { in tcp_rput_data()
2818 tcp, mp, seg_ack, 0, TH_RST, in tcp_rput_data()
2822 assert(tcp->tcp_suna + 1 == seg_ack); in tcp_rput_data()
2827 tcp_clean_death(sock_id, tcp, ECONNREFUSED); in tcp_rput_data()
2837 tcp_process_options(tcp, (tcph_t *)tcph); in tcp_rput_data()
2842 (void) tcp_rwnd_set(tcp, MSS_ROUNDUP(tcp->tcp_rwnd, in tcp_rput_data()
2843 tcp->tcp_mss)); in tcp_rput_data()
2846 if (tcp->tcp_ecn_ok) { in tcp_rput_data()
2848 tcp->tcp_ecn_ok = B_FALSE; in tcp_rput_data()
2857 tcp->tcp_irs = seg_seq; in tcp_rput_data()
2858 tcp->tcp_rack = seg_seq; in tcp_rput_data()
2859 tcp->tcp_rnxt = seg_seq + 1; in tcp_rput_data()
2860 U32_TO_ABE32(tcp->tcp_rnxt, tcp->tcp_tcph->th_ack); in tcp_rput_data()
2864 tcp->tcp_suna = tcp->tcp_iss + 1; in tcp_rput_data()
2865 tcp->tcp_valid_bits &= ~TCP_ISS_VALID; in tcp_rput_data()
2866 tcp->tcp_state = TCPS_ESTABLISHED; in tcp_rput_data()
2873 if (tcp->tcp_rexmit) { in tcp_rput_data()
2874 tcp->tcp_rexmit = B_FALSE; in tcp_rput_data()
2875 tcp->tcp_rexmit_nxt = tcp->tcp_snxt; in tcp_rput_data()
2876 tcp->tcp_rexmit_max = tcp->tcp_snxt; in tcp_rput_data()
2877 tcp->tcp_snd_burst = TCP_CWND_NORMAL; in tcp_rput_data()
2885 tcp->tcp_cwnd = tcp->tcp_mss; in tcp_rput_data()
2888 tcp->tcp_swl1 = seg_seq; in tcp_rput_data()
2889 tcp->tcp_swl2 = seg_ack; in tcp_rput_data()
2892 tcp->tcp_swnd = new_swnd; in tcp_rput_data()
2893 if (new_swnd > tcp->tcp_max_swnd) in tcp_rput_data()
2894 tcp->tcp_max_swnd = new_swnd; in tcp_rput_data()
2909 if (tcp->tcp_unsent) in tcp_rput_data()
2922 tcp->tcp_state = TCPS_SYN_RCVD; in tcp_rput_data()
2923 mp1 = tcp_xmit_mp(tcp, tcp->tcp_xmit_head, tcp->tcp_mss, in tcp_rput_data()
2924 NULL, NULL, tcp->tcp_iss, B_FALSE, NULL, B_FALSE); in tcp_rput_data()
2928 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_rput_data()
2934 if (tcp_state_wait(sock_id, tcp, TCPS_ALL_ACKED) < 0) { in tcp_rput_data()
2946 ((flags & TH_SYN) ? 0 : tcp->tcp_snd_ws); in tcp_rput_data()
2947 mss = tcp->tcp_mss; in tcp_rput_data()
2949 if (tcp->tcp_snd_ts_ok) { in tcp_rput_data()
2950 if (!tcp_paws_check(tcp, (tcph_t *)tcph, &tcpopt)) { in tcp_rput_data()
2959 } else if (tcp->tcp_snd_sack_ok) { in tcp_rput_data()
2960 assert(tcp->tcp_sack_info != NULL); in tcp_rput_data()
2961 tcpopt.tcp = tcp; in tcp_rput_data()
2969 gap = seg_seq - tcp->tcp_rnxt; in tcp_rput_data()
2970 rgap = tcp->tcp_rwnd - (gap + seg_len); in tcp_rput_data()
2978 if (seg_seq == tcp->tcp_irs && (flags & TH_SYN) && in tcp_rput_data()
3018 seg_len, tcp->tcp_rnxt, tcp->tcp_snxt, in tcp_rput_data()
3019 tcp_display(tcp, NULL, DISP_ADDR_AND_PORT)); in tcp_rput_data()
3058 seg_seq = tcp->tcp_rnxt; in tcp_rput_data()
3080 if (tcp->tcp_rwnd == 0) in tcp_rput_data()
3118 if (tcp->tcp_rwnd == 0 && seg_seq == tcp->tcp_rnxt) { in tcp_rput_data()
3122 tcp_rcv_drain(sock_id, tcp); in tcp_rput_data()
3151 if (tcp->tcp_ecn_ok) { in tcp_rput_data()
3155 tcp->tcp_ecn_echo_on = B_FALSE; in tcp_rput_data()
3163 tcp->tcp_ecn_echo_on = B_TRUE; in tcp_rput_data()
3172 if (tcp->tcp_snd_ts_ok && in tcp_rput_data()
3173 TSTMP_GEQ(tcpopt.tcp_opt_ts_val, tcp->tcp_ts_recent) && in tcp_rput_data()
3174 SEQ_LEQ(seg_seq, tcp->tcp_rack)) { in tcp_rput_data()
3175 tcp->tcp_ts_recent = tcpopt.tcp_opt_ts_val; in tcp_rput_data()
3176 tcp->tcp_last_rcv_lbolt = prom_gettime(); in tcp_rput_data()
3179 if (seg_seq != tcp->tcp_rnxt || tcp->tcp_reass_head) { in tcp_rput_data()
3188 tcp->tcp_valid_bits |= TCP_OFO_FIN_VALID; in tcp_rput_data()
3189 tcp->tcp_ofo_fin_seq = seg_seq + seg_len; in tcp_rput_data()
3195 if (tcp->tcp_snd_sack_ok) { in tcp_rput_data()
3196 assert(tcp->tcp_sack_info != NULL); in tcp_rput_data()
3197 tcp_sack_insert(tcp->tcp_sack_list, in tcp_rput_data()
3199 &(tcp->tcp_num_sack_blk)); in tcp_rput_data()
3206 mp = tcp_reass(tcp, mp, seg_seq); in tcp_rput_data()
3214 seg_seq = tcp->tcp_rnxt; in tcp_rput_data()
3220 if ((tcp->tcp_valid_bits & TCP_OFO_FIN_VALID) && in tcp_rput_data()
3221 seg_seq + seg_len == tcp->tcp_ofo_fin_seq) { in tcp_rput_data()
3223 tcp->tcp_valid_bits &= in tcp_rput_data()
3249 if ((tcp->tcp_valid_bits & TCP_OFO_FIN_VALID) && in tcp_rput_data()
3250 seg_seq + seg_len == tcp->tcp_ofo_fin_seq) { in tcp_rput_data()
3252 tcp->tcp_valid_bits &= ~TCP_OFO_FIN_VALID; in tcp_rput_data()
3258 switch (tcp->tcp_state) { in tcp_rput_data()
3260 (void) tcp_clean_death(sock_id, tcp, ECONNREFUSED); in tcp_rput_data()
3266 (void) tcp_clean_death(sock_id, tcp, ECONNRESET); in tcp_rput_data()
3270 (void) tcp_clean_death(sock_id, tcp, 0); in tcp_rput_data()
3273 assert(tcp->tcp_state != TCPS_TIME_WAIT); in tcp_rput_data()
3274 (void) tcp_clean_death(sock_id, tcp, ENXIO); in tcp_rput_data()
3288 assert(SEQ_GEQ(seg_seq, tcp->tcp_rnxt) && in tcp_rput_data()
3289 SEQ_LEQ(seg_seq, tcp->tcp_rnxt + tcp->tcp_rwnd)); in tcp_rput_data()
3296 seg_ack = tcp->tcp_snxt; in tcp_rput_data()
3298 tcp_xmit_ctl("TH_SYN", tcp, NULL, seg_ack, in tcp_rput_data()
3300 assert(tcp->tcp_state != TCPS_TIME_WAIT); in tcp_rput_data()
3301 (void) tcp_clean_death(sock_id, tcp, ECONNRESET); in tcp_rput_data()
3314 bytes_acked = (int)(seg_ack - tcp->tcp_suna); in tcp_rput_data()
3316 if (tcp->tcp_state == TCPS_SYN_RCVD) { in tcp_rput_data()
3317 tcp_t *listener = tcp->tcp_listener; in tcp_rput_data()
3325 if (bytes_acked < 1 || SEQ_GT(seg_ack, tcp->tcp_snxt)) { in tcp_rput_data()
3328 tcp, NULL, seg_ack, 0, TH_RST, 0, sock_id); in tcp_rput_data()
3345 tcp->tcp_eager_next_q0->tcp_eager_prev_q0 = in tcp_rput_data()
3346 tcp->tcp_eager_prev_q0; in tcp_rput_data()
3347 tcp->tcp_eager_prev_q0->tcp_eager_next_q0 = in tcp_rput_data()
3348 tcp->tcp_eager_next_q0; in tcp_rput_data()
3349 tcp->tcp_eager_prev_q0 = NULL; in tcp_rput_data()
3350 tcp->tcp_eager_next_q0 = NULL; in tcp_rput_data()
3361 tail->tcp_eager_next_q = tcp; in tcp_rput_data()
3363 listener->tcp_eager_next_q = tcp; in tcp_rput_data()
3365 listener->tcp_eager_last_q = tcp; in tcp_rput_data()
3366 tcp->tcp_eager_next_q = NULL; in tcp_rput_data()
3372 tcp->tcp_conn_def_q0 = B_TRUE; in tcp_rput_data()
3375 tcp->tcp_eager_prev_q0->tcp_eager_next_q0 = in tcp_rput_data()
3376 tcp->tcp_eager_next_q0; in tcp_rput_data()
3377 tcp->tcp_eager_next_q0->tcp_eager_prev_q0 = in tcp_rput_data()
3378 tcp->tcp_eager_prev_q0; in tcp_rput_data()
3381 tcp->tcp_eager_prev_q0 = listener->tcp_eager_prev_q0; in tcp_rput_data()
3382 tcp->tcp_eager_next_q0 = listener; in tcp_rput_data()
3383 listener->tcp_eager_prev_q0->tcp_eager_next_q0 = tcp; in tcp_rput_data()
3384 listener->tcp_eager_prev_q0 = tcp; in tcp_rput_data()
3387 tcp->tcp_suna = tcp->tcp_iss + 1; /* One for the SYN */ in tcp_rput_data()
3395 if (tcp->tcp_rexmit) { in tcp_rput_data()
3396 tcp->tcp_rexmit = B_FALSE; in tcp_rput_data()
3397 tcp->tcp_rexmit_nxt = tcp->tcp_snxt; in tcp_rput_data()
3398 tcp->tcp_rexmit_max = tcp->tcp_snxt; in tcp_rput_data()
3399 tcp->tcp_snd_burst = TCP_CWND_NORMAL; in tcp_rput_data()
3400 tcp->tcp_ms_we_have_waited = 0; in tcp_rput_data()
3401 tcp->tcp_cwnd = mss; in tcp_rput_data()
3415 tcp->tcp_swnd = 0; in tcp_rput_data()
3417 if (new_swnd > tcp->tcp_max_swnd) in tcp_rput_data()
3418 tcp->tcp_max_swnd = new_swnd; in tcp_rput_data()
3419 tcp->tcp_swl1 = seg_seq; in tcp_rput_data()
3420 tcp->tcp_swl2 = seg_ack; in tcp_rput_data()
3421 tcp->tcp_state = TCPS_ESTABLISHED; in tcp_rput_data()
3422 tcp->tcp_valid_bits &= ~TCP_ISS_VALID; in tcp_rput_data()
3433 if (tcp->tcp_cwr && SEQ_GT(seg_ack, tcp->tcp_cwr_snd_max)) in tcp_rput_data()
3434 tcp->tcp_cwr = B_FALSE; in tcp_rput_data()
3435 if (tcp->tcp_ecn_ok && (flags & TH_ECE)) { in tcp_rput_data()
3436 if (!tcp->tcp_cwr) { in tcp_rput_data()
3437 npkt = (MIN(tcp->tcp_cwnd, tcp->tcp_swnd) >> 1) / mss; in tcp_rput_data()
3438 tcp->tcp_cwnd_ssthresh = MAX(npkt, 2) * mss; in tcp_rput_data()
3439 tcp->tcp_cwnd = npkt * mss; in tcp_rput_data()
3445 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_rput_data()
3450 tcp->tcp_cwnd_cnt = 0; in tcp_rput_data()
3452 tcp->tcp_cwr = B_TRUE; in tcp_rput_data()
3459 tcp->tcp_cwr_snd_max = tcp->tcp_snxt; in tcp_rput_data()
3460 tcp->tcp_ecn_cwr_sent = B_FALSE; in tcp_rput_data()
3464 mp1 = tcp->tcp_xmit_head; in tcp_rput_data()
3466 if (!ofo_seg && seg_len == 0 && new_swnd == tcp->tcp_swnd) { in tcp_rput_data()
3478 if (mp1 != NULL && tcp->tcp_suna != tcp->tcp_snxt && in tcp_rput_data()
3479 ! tcp->tcp_rexmit) { in tcp_rput_data()
3481 if ((dupack_cnt = ++tcp->tcp_dupack_cnt) < in tcp_rput_data()
3504 if (tcp->tcp_unsent > 0 && in tcp_rput_data()
3505 (!tcp->tcp_snd_sack_ok || in tcp_rput_data()
3506 (tcp->tcp_snd_sack_ok && in tcp_rput_data()
3507 tcp->tcp_notsack_list != NULL))) { in tcp_rput_data()
3508 tcp->tcp_cwnd += mss << in tcp_rput_data()
3509 (tcp->tcp_dupack_cnt - 1); in tcp_rput_data()
3529 if (!tcp->tcp_cwr) { in tcp_rput_data()
3530 npkt = (MIN(tcp->tcp_cwnd, in tcp_rput_data()
3531 tcp->tcp_swnd) >> 1) / mss; in tcp_rput_data()
3534 tcp->tcp_cwnd_ssthresh = npkt * mss; in tcp_rput_data()
3535 tcp->tcp_cwnd = (npkt + in tcp_rput_data()
3536 tcp->tcp_dupack_cnt) * mss; in tcp_rput_data()
3538 if (tcp->tcp_ecn_ok) { in tcp_rput_data()
3539 tcp->tcp_cwr = B_TRUE; in tcp_rput_data()
3540 tcp->tcp_cwr_snd_max = tcp->tcp_snxt; in tcp_rput_data()
3541 tcp->tcp_ecn_cwr_sent = B_FALSE; in tcp_rput_data()
3553 if ((tcp->tcp_valid_bits & TCP_FSS_VALID) && in tcp_rput_data()
3554 (tcp->tcp_unsent == 0)) { in tcp_rput_data()
3555 tcp->tcp_rexmit_max = tcp->tcp_fss; in tcp_rput_data()
3557 tcp->tcp_rexmit_max = tcp->tcp_snxt; in tcp_rput_data()
3567 tcp->tcp_snd_burst = TCP_CWND_SS; in tcp_rput_data()
3584 if (tcp->tcp_snd_sack_ok) { in tcp_rput_data()
3585 assert(tcp->tcp_sack_info != NULL); in tcp_rput_data()
3586 if (tcp->tcp_notsack_list != NULL) { in tcp_rput_data()
3587 tcp->tcp_pipe = tcp->tcp_snxt - in tcp_rput_data()
3588 tcp->tcp_fack; in tcp_rput_data()
3589 tcp->tcp_sack_snxt = seg_ack; in tcp_rput_data()
3600 tcp->tcp_pipe = in tcp_rput_data()
3601 tcp->tcp_cwnd_ssthresh; in tcp_rput_data()
3614 if (tcp->tcp_snd_sack_ok && in tcp_rput_data()
3615 tcp->tcp_notsack_list != NULL) { in tcp_rput_data()
3617 tcp->tcp_pipe -= mss; in tcp_rput_data()
3618 if (tcp->tcp_pipe < 0) in tcp_rput_data()
3619 tcp->tcp_pipe = 0; in tcp_rput_data()
3626 cwnd = tcp->tcp_cwnd + mss; in tcp_rput_data()
3627 if (cwnd > tcp->tcp_cwnd_max) in tcp_rput_data()
3628 cwnd = tcp->tcp_cwnd_max; in tcp_rput_data()
3629 tcp->tcp_cwnd = cwnd; in tcp_rput_data()
3634 } else if (tcp->tcp_zero_win_probe) { in tcp_rput_data()
3643 tcp->tcp_zero_win_probe = 0; in tcp_rput_data()
3644 tcp->tcp_timer_backoff = 0; in tcp_rput_data()
3645 tcp->tcp_ms_we_have_waited = 0; in tcp_rput_data()
3657 if (!tcp->tcp_rexmit) { in tcp_rput_data()
3658 tcp->tcp_rexmit = B_TRUE; in tcp_rput_data()
3659 tcp->tcp_dupack_cnt = 0; in tcp_rput_data()
3660 tcp->tcp_rexmit_nxt = tcp->tcp_suna; in tcp_rput_data()
3661 tcp->tcp_rexmit_max = tcp->tcp_suna + 1; in tcp_rput_data()
3679 if (SEQ_GT(seg_ack, tcp->tcp_snxt)) { in tcp_rput_data()
3685 mp = tcp_ack_mp(tcp); in tcp_rput_data()
3700 if (tcp->tcp_snd_sack_ok && tcp->tcp_notsack_list != NULL) { in tcp_rput_data()
3701 tcp_notsack_remove(&(tcp->tcp_notsack_list), seg_ack, in tcp_rput_data()
3702 &(tcp->tcp_num_notsack_blk), &(tcp->tcp_cnt_notsack_list)); in tcp_rput_data()
3711 if (tcp->tcp_dupack_cnt >= tcp_dupack_fast_retransmit) { in tcp_rput_data()
3712 assert(tcp->tcp_rexmit == B_FALSE); in tcp_rput_data()
3713 if (SEQ_GEQ(seg_ack, tcp->tcp_rexmit_max)) { in tcp_rput_data()
3714 tcp->tcp_dupack_cnt = 0; in tcp_rput_data()
3719 if (tcp->tcp_cwnd > tcp->tcp_cwnd_ssthresh) { in tcp_rput_data()
3720 tcp->tcp_cwnd = tcp->tcp_cwnd_ssthresh; in tcp_rput_data()
3722 tcp->tcp_rexmit_max = seg_ack; in tcp_rput_data()
3723 tcp->tcp_cwnd_cnt = 0; in tcp_rput_data()
3724 tcp->tcp_snd_burst = TCP_CWND_NORMAL; in tcp_rput_data()
3730 if (tcp->tcp_snd_sack_ok && in tcp_rput_data()
3731 tcp->tcp_notsack_list != NULL) { in tcp_rput_data()
3732 TCP_NOTSACK_REMOVE_ALL(tcp->tcp_notsack_list); in tcp_rput_data()
3735 if (tcp->tcp_snd_sack_ok && in tcp_rput_data()
3736 tcp->tcp_notsack_list != NULL) { in tcp_rput_data()
3738 tcp->tcp_pipe -= mss; in tcp_rput_data()
3739 if (tcp->tcp_pipe < 0) in tcp_rput_data()
3740 tcp->tcp_pipe = 0; in tcp_rput_data()
3753 tcp->tcp_cwnd = tcp->tcp_cwnd_ssthresh + in tcp_rput_data()
3755 tcp->tcp_cwnd_cnt = tcp->tcp_cwnd; in tcp_rput_data()
3761 tcp->tcp_dupack_cnt = 0; in tcp_rput_data()
3762 if (tcp->tcp_rexmit) { in tcp_rput_data()
3776 if (SEQ_LEQ(seg_ack, tcp->tcp_rexmit_max)) { in tcp_rput_data()
3777 if (SEQ_GT(seg_ack, tcp->tcp_rexmit_nxt)) { in tcp_rput_data()
3778 tcp->tcp_rexmit_nxt = seg_ack; in tcp_rput_data()
3780 if (seg_ack != tcp->tcp_rexmit_max) { in tcp_rput_data()
3784 tcp->tcp_rexmit = B_FALSE; in tcp_rput_data()
3785 tcp->tcp_rexmit_nxt = tcp->tcp_snxt; in tcp_rput_data()
3786 tcp->tcp_snd_burst = TCP_CWND_NORMAL; in tcp_rput_data()
3788 tcp->tcp_ms_we_have_waited = 0; in tcp_rput_data()
3794 tcp->tcp_suna = seg_ack; in tcp_rput_data()
3795 if (tcp->tcp_zero_win_probe != 0) { in tcp_rput_data()
3796 tcp->tcp_zero_win_probe = 0; in tcp_rput_data()
3797 tcp->tcp_timer_backoff = 0; in tcp_rput_data()
3816 if (!tcp->tcp_ecn_ok || !(flags & TH_ECE)) { in tcp_rput_data()
3817 cwnd = tcp->tcp_cwnd; in tcp_rput_data()
3820 if (cwnd >= tcp->tcp_cwnd_ssthresh) { in tcp_rput_data()
3831 if (tcp->tcp_cwnd_cnt <= 0) { in tcp_rput_data()
3832 tcp->tcp_cwnd_cnt = cwnd + add; in tcp_rput_data()
3834 tcp->tcp_cwnd_cnt -= add; in tcp_rput_data()
3838 tcp->tcp_cwnd = MIN(cwnd + add, tcp->tcp_cwnd_max); in tcp_rput_data()
3842 if (tcp->tcp_snd_ts_ok) { in tcp_rput_data()
3845 tcp_set_rto(tcp, (int32_t)(prom_gettime() - in tcp_rput_data()
3850 if (tcp->tcp_set_timer == 1) { in tcp_rput_data()
3851 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_rput_data()
3852 tcp->tcp_set_timer = 0; in tcp_rput_data()
3858 tcp->tcp_csuna = tcp->tcp_snxt; in tcp_rput_data()
3859 } else if (SEQ_GT(seg_ack, tcp->tcp_csuna)) { in tcp_rput_data()
3865 tcp_set_rto(tcp, (int32_t)(prom_gettime() - in tcp_rput_data()
3869 tcp->tcp_csuna = seg_ack; in tcp_rput_data()
3870 if (tcp->tcp_set_timer == 1) { in tcp_rput_data()
3871 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_rput_data()
3872 tcp->tcp_set_timer = 0; in tcp_rput_data()
3897 tcp->tcp_xmit_tail = NULL; in tcp_rput_data()
3900 if (mp2 != tcp->tcp_xmit_tail) in tcp_rput_data()
3902 tcp->tcp_xmit_tail = mp1; in tcp_rput_data()
3905 tcp->tcp_xmit_tail_unsent = (int)(mp1->b_wptr - in tcp_rput_data()
3916 assert(tcp->tcp_fin_sent); in tcp_rput_data()
3917 tcp->tcp_xmit_tail = NULL; in tcp_rput_data()
3918 if (tcp->tcp_fin_sent) { in tcp_rput_data()
3919 tcp->tcp_fin_acked = B_TRUE; in tcp_rput_data()
3936 tcp_xmit_ctl(NULL, tcp, NULL, tcp->tcp_snxt, in tcp_rput_data()
3937 tcp->tcp_rnxt, TH_RST|TH_ACK, 0, sock_id); in tcp_rput_data()
3940 tcp_display(tcp, NULL, in tcp_rput_data()
3947 assert(mp2 != tcp->tcp_xmit_tail); in tcp_rput_data()
3949 if (tcp->tcp_unsent) { in tcp_rput_data()
3953 tcp->tcp_xmit_head = mp1; in tcp_rput_data()
3966 if (SEQ_LT(tcp->tcp_swl2, seg_ack) || in tcp_rput_data()
3967 SEQ_LT(tcp->tcp_swl1, seg_seq) || in tcp_rput_data()
3968 (tcp->tcp_swl1 == seg_seq && new_swnd > tcp->tcp_swnd)) { in tcp_rput_data()
3977 if (tcp->tcp_unsent && new_swnd > tcp->tcp_swnd) in tcp_rput_data()
3979 tcp->tcp_swnd = new_swnd; in tcp_rput_data()
3980 if (new_swnd > tcp->tcp_max_swnd) in tcp_rput_data()
3981 tcp->tcp_max_swnd = new_swnd; in tcp_rput_data()
3982 tcp->tcp_swl1 = seg_seq; in tcp_rput_data()
3983 tcp->tcp_swl2 = seg_ack; in tcp_rput_data()
3986 if (tcp->tcp_state > TCPS_ESTABLISHED) { in tcp_rput_data()
3987 switch (tcp->tcp_state) { in tcp_rput_data()
3989 if (tcp->tcp_fin_acked) { in tcp_rput_data()
3990 tcp->tcp_state = TCPS_FIN_WAIT_2; in tcp_rput_data()
4007 TCP_TIMER_RESTART(tcp, in tcp_rput_data()
4015 if (tcp->tcp_fin_acked) { in tcp_rput_data()
4016 (void) tcp_clean_death(sock_id, tcp, 0); in tcp_rput_data()
4021 if (tcp->tcp_fin_acked) { in tcp_rput_data()
4022 tcp->tcp_state = TCPS_TIME_WAIT; in tcp_rput_data()
4023 tcp_time_wait_append(tcp); in tcp_rput_data()
4024 TCP_TIMER_RESTART(tcp, tcp_time_wait_interval); in tcp_rput_data()
4031 assert(tcp->tcp_state != TCPS_TIME_WAIT); in tcp_rput_data()
4038 if (!tcp->tcp_fin_rcvd) { in tcp_rput_data()
4039 tcp->tcp_fin_rcvd = B_TRUE; in tcp_rput_data()
4040 tcp->tcp_rnxt++; in tcp_rput_data()
4041 U32_TO_ABE32(tcp->tcp_rnxt, tcp->tcp_tcph->th_ack); in tcp_rput_data()
4043 switch (tcp->tcp_state) { in tcp_rput_data()
4046 tcp->tcp_state = TCPS_CLOSE_WAIT; in tcp_rput_data()
4050 if (!tcp->tcp_fin_acked) { in tcp_rput_data()
4051 tcp->tcp_state = TCPS_CLOSING; in tcp_rput_data()
4056 tcp->tcp_state = TCPS_TIME_WAIT; in tcp_rput_data()
4057 tcp_time_wait_append(tcp); in tcp_rput_data()
4058 TCP_TIMER_RESTART(tcp, tcp_time_wait_interval); in tcp_rput_data()
4090 if (++tcp->tcp_rack_cnt == 2 || sockets[sock_id].inq == NULL) { in tcp_rput_data()
4092 tcp->tcp_rack_cnt = 0; in tcp_rput_data()
4094 tcp->tcp_rnxt += seg_len; in tcp_rput_data()
4095 U32_TO_ABE32(tcp->tcp_rnxt, tcp->tcp_tcph->th_ack); in tcp_rput_data()
4098 if (tcp->tcp_snd_sack_ok && tcp->tcp_num_sack_blk > 0) { in tcp_rput_data()
4099 tcp_sack_remove(tcp->tcp_sack_list, tcp->tcp_rnxt, in tcp_rput_data()
4100 &(tcp->tcp_num_sack_blk)); in tcp_rput_data()
4103 if (tcp->tcp_listener) { in tcp_rput_data()
4108 tcp_rcv_enqueue(tcp, mp, seg_len); in tcp_rput_data()
4111 tcp_rcv_enqueue(tcp, mp, seg_len); in tcp_rput_data()
4117 if (tcp->tcp_rcv_list != NULL) in tcp_rput_data()
4129 TH_LIMIT_XMIT)) && tcp->tcp_swnd != 0) { in tcp_rput_data()
4131 uint32_t snd_size = tcp->tcp_snxt - tcp->tcp_suna; in tcp_rput_data()
4135 if (snd_size > tcp->tcp_swnd) in tcp_rput_data()
4136 snd_size = tcp->tcp_swnd; in tcp_rput_data()
4137 mp1 = tcp_xmit_mp(tcp, tcp->tcp_xmit_head, snd_size, in tcp_rput_data()
4138 NULL, NULL, tcp->tcp_suna, B_TRUE, &snd_size, in tcp_rput_data()
4143 tcp->tcp_xmit_head->b_prev = in tcp_rput_data()
4145 tcp->tcp_csuna = tcp->tcp_snxt; in tcp_rput_data()
4153 if (tcp_sack_rxmit(tcp, sock_id) != 0) { in tcp_rput_data()
4163 if (!tcp->tcp_rexmit) { in tcp_rput_data()
4164 tcp_wput_data(tcp, NULL, sock_id); in tcp_rput_data()
4166 tcp_ss_rexmit(tcp, sock_id); in tcp_rput_data()
4181 tcp->tcp_cwnd -= mss << (tcp->tcp_dupack_cnt - 1); in tcp_rput_data()
4193 if ((mp1 = tcp_ack_mp(tcp)) != NULL) { in tcp_rput_data()
4210 tcp_ss_rexmit(tcp_t *tcp, int sock_id) in tcp_ss_rexmit() argument
4217 int32_t burst = tcp->tcp_snd_burst; in tcp_ss_rexmit()
4224 if (SEQ_LT(tcp->tcp_rexmit_nxt, tcp->tcp_rexmit_max)) { in tcp_ss_rexmit()
4225 smax = tcp->tcp_rexmit_max; in tcp_ss_rexmit()
4226 snxt = tcp->tcp_rexmit_nxt; in tcp_ss_rexmit()
4227 if (SEQ_LT(snxt, tcp->tcp_suna)) { in tcp_ss_rexmit()
4228 snxt = tcp->tcp_suna; in tcp_ss_rexmit()
4230 win = MIN(tcp->tcp_cwnd, tcp->tcp_swnd); in tcp_ss_rexmit()
4231 win -= snxt - tcp->tcp_suna; in tcp_ss_rexmit()
4232 mss = tcp->tcp_mss; in tcp_ss_rexmit()
4233 snxt_mp = tcp_get_seg_mp(tcp, snxt, &off); in tcp_ss_rexmit()
4247 xmit_mp = tcp_xmit_mp(tcp, snxt_mp, cnt, &off, in tcp_ss_rexmit()
4268 tcp->tcp_rexmit_nxt = snxt; in tcp_ss_rexmit()
4283 if (tcp->tcp_unsent) { in tcp_ss_rexmit()
4284 tcp_wput_data(tcp, NULL, sock_id); in tcp_ss_rexmit()
4294 tcp_timer(tcp_t *tcp, int sock_id) in tcp_timer() argument
4302 first_threshold = tcp->tcp_first_timer_threshold; in tcp_timer()
4303 second_threshold = tcp->tcp_second_timer_threshold; in tcp_timer()
4304 switch (tcp->tcp_state) { in tcp_timer()
4311 first_threshold = tcp->tcp_first_ctimer_threshold; in tcp_timer()
4312 second_threshold = tcp->tcp_second_ctimer_threshold; in tcp_timer()
4320 if (tcp->tcp_suna != tcp->tcp_snxt) { in tcp_timer()
4324 if (tcp->tcp_xmit_head == NULL) in tcp_timer()
4328 (uint32_t)(uintptr_t)tcp->tcp_xmit_head->b_prev); in tcp_timer()
4329 time_to_wait = tcp->tcp_rto - time_to_wait; in tcp_timer()
4334 TCP_TIMER_RESTART(tcp, time_to_wait); in tcp_timer()
4347 if (tcp->tcp_swnd == 0 || tcp->tcp_zero_win_probe) { in tcp_timer()
4366 if (!tcp->tcp_cwr || tcp->tcp_rexmit) { in tcp_timer()
4367 npkt = (MIN((tcp->tcp_timer_backoff ? in tcp_timer()
4368 tcp->tcp_cwnd_ssthresh : in tcp_timer()
4369 tcp->tcp_cwnd), in tcp_timer()
4370 tcp->tcp_swnd) >> 1) / in tcp_timer()
4371 tcp->tcp_mss; in tcp_timer()
4374 tcp->tcp_cwnd_ssthresh = npkt * in tcp_timer()
4375 tcp->tcp_mss; in tcp_timer()
4377 tcp->tcp_cwnd = tcp->tcp_mss; in tcp_timer()
4378 tcp->tcp_cwnd_cnt = 0; in tcp_timer()
4379 if (tcp->tcp_ecn_ok) { in tcp_timer()
4380 tcp->tcp_cwr = B_TRUE; in tcp_timer()
4381 tcp->tcp_cwr_snd_max = tcp->tcp_snxt; in tcp_timer()
4382 tcp->tcp_ecn_cwr_sent = B_FALSE; in tcp_timer()
4400 if (tcp->tcp_unsent != 0) { in tcp_timer()
4401 if (tcp->tcp_cwnd == 0) { in tcp_timer()
4408 assert(tcp->tcp_ecn_ok); in tcp_timer()
4409 tcp->tcp_cwnd = tcp->tcp_mss; in tcp_timer()
4411 if (tcp->tcp_swnd == 0) { in tcp_timer()
4413 tcp->tcp_swnd++; in tcp_timer()
4414 tcp->tcp_zero_win_probe = B_TRUE; in tcp_timer()
4433 tcp->tcp_max_swnd = MAX(tcp->tcp_swnd, 2); in tcp_timer()
4435 tcp_wput_data(tcp, NULL, sock_id); in tcp_timer()
4439 if ((tcp->tcp_valid_bits & TCP_FSS_VALID) && in tcp_timer()
4440 !tcp->tcp_fin_acked) in tcp_timer()
4453 (void) tcp_clean_death(sock_id, tcp, 0); in tcp_timer()
4457 tcp->tcp_state, tcp_display(tcp, NULL, in tcp_timer()
4461 if ((ms = tcp->tcp_ms_we_have_waited) > second_threshold) { in tcp_timer()
4467 if ((tcp->tcp_zero_win_probe == 0) || in tcp_timer()
4468 ((prom_gettime() - tcp->tcp_last_recv_time) > in tcp_timer()
4476 if (tcp->tcp_state == TCPS_SYN_RCVD) { in tcp_timer()
4479 tcp, NULL, tcp->tcp_snxt, in tcp_timer()
4480 tcp->tcp_rnxt, TH_RST | TH_ACK, 0, sock_id); in tcp_timer()
4482 (void) tcp_clean_death(sock_id, tcp, in tcp_timer()
4483 tcp->tcp_client_errno ? in tcp_timer()
4484 tcp->tcp_client_errno : ETIMEDOUT); in tcp_timer()
4502 tcp->tcp_ms_we_have_waited = second_threshold; in tcp_timer()
4504 } else if (ms > first_threshold && tcp->tcp_rtt_sa != 0) { in tcp_timer()
4513 if (tcp->tcp_zero_win_probe == 0) { in tcp_timer()
4514 tcp->tcp_rtt_sd += (tcp->tcp_rtt_sa >> 3) + in tcp_timer()
4515 (tcp->tcp_rtt_sa >> 5); in tcp_timer()
4516 tcp->tcp_rtt_sa = 0; in tcp_timer()
4517 tcp->tcp_rtt_update = 0; in tcp_timer()
4520 tcp->tcp_timer_backoff++; in tcp_timer()
4521 if ((ms = (tcp->tcp_rtt_sa >> 3) + tcp->tcp_rtt_sd + in tcp_timer()
4522 tcp_rexmit_interval_extra + (tcp->tcp_rtt_sa >> 5)) < in tcp_timer()
4529 ms = tcp_rexmit_interval_min << tcp->tcp_timer_backoff; in tcp_timer()
4531 ms <<= tcp->tcp_timer_backoff; in tcp_timer()
4539 tcp->tcp_timer_backoff--; in tcp_timer()
4541 tcp->tcp_ms_we_have_waited += ms; in tcp_timer()
4542 if (tcp->tcp_zero_win_probe == 0) { in tcp_timer()
4543 tcp->tcp_rto = ms; in tcp_timer()
4545 TCP_TIMER_RESTART(tcp, ms); in tcp_timer()
4551 tcp->tcp_set_timer = 1; in tcp_timer()
4552 mss = tcp->tcp_snxt - tcp->tcp_suna; in tcp_timer()
4553 if (mss > tcp->tcp_mss) in tcp_timer()
4554 mss = tcp->tcp_mss; in tcp_timer()
4555 if (mss > tcp->tcp_swnd && tcp->tcp_swnd != 0) in tcp_timer()
4556 mss = tcp->tcp_swnd; in tcp_timer()
4558 if ((mp = tcp->tcp_xmit_head) != NULL) { in tcp_timer()
4562 mp = tcp_xmit_mp(tcp, mp, mss, NULL, NULL, tcp->tcp_suna, B_TRUE, &mss, in tcp_timer()
4566 tcp->tcp_csuna = tcp->tcp_snxt; in tcp_timer()
4581 tcp->tcp_rexmit_nxt = tcp->tcp_suna; in tcp_timer()
4582 tcp->tcp_snd_burst = TCP_CWND_SS; in tcp_timer()
4583 if ((tcp->tcp_valid_bits & TCP_FSS_VALID) && in tcp_timer()
4584 (tcp->tcp_unsent == 0)) { in tcp_timer()
4585 tcp->tcp_rexmit_max = tcp->tcp_fss; in tcp_timer()
4587 tcp->tcp_rexmit_max = tcp->tcp_snxt; in tcp_timer()
4589 tcp->tcp_rexmit = B_TRUE; in tcp_timer()
4590 tcp->tcp_dupack_cnt = 0; in tcp_timer()
4595 if (tcp->tcp_snd_sack_ok && tcp->tcp_notsack_list != NULL) { in tcp_timer()
4596 TCP_NOTSACK_REMOVE_ALL(tcp->tcp_notsack_list); in tcp_timer()
4597 tcp->tcp_num_notsack_blk = 0; in tcp_timer()
4598 tcp->tcp_cnt_notsack_list = 0; in tcp_timer()
4607 tcp_wput_data(tcp_t *tcp, mblk_t *mp, int sock_id) in tcp_wput_data() argument
4628 tcpstate = tcp->tcp_state; in tcp_wput_data()
4631 len = tcp->tcp_unsent; in tcp_wput_data()
4642 (tcp->tcp_valid_bits & TCP_FSS_VALID) != 0) { in tcp_wput_data()
4643 if ((tcp->tcp_valid_bits & TCP_FSS_VALID) != 0) { in tcp_wput_data()
4645 tcp_display(tcp, NULL, DISP_ADDR_AND_PORT)); in tcp_wput_data()
4667 if (tcp->tcp_xmit_head == NULL) { in tcp_wput_data()
4668 tcp->tcp_xmit_head = mp; in tcp_wput_data()
4669 tcp->tcp_xmit_tail = mp; in tcp_wput_data()
4670 tcp->tcp_xmit_tail_unsent = len; in tcp_wput_data()
4672 tcp->tcp_xmit_last->b_cont = mp; in tcp_wput_data()
4673 len += tcp->tcp_unsent; in tcp_wput_data()
4692 tcp->tcp_xmit_last = mp; in tcp_wput_data()
4693 tcp->tcp_unsent = len; in tcp_wput_data()
4696 snxt = tcp->tcp_snxt; in tcp_wput_data()
4697 xmit_tail = tcp->tcp_xmit_tail; in tcp_wput_data()
4698 tail_unsent = tcp->tcp_xmit_tail_unsent; in tcp_wput_data()
4708 if (tcp->tcp_snd_sack_ok && tcp->tcp_num_sack_blk > 0) { in tcp_wput_data()
4711 num_sack_blk = MIN(tcp->tcp_max_sack_blk, in tcp_wput_data()
4712 tcp->tcp_num_sack_blk); in tcp_wput_data()
4715 mss = tcp->tcp_mss - opt_len; in tcp_wput_data()
4716 tcp_hdr_len = tcp->tcp_hdr_len + opt_len; in tcp_wput_data()
4718 mss = tcp->tcp_mss; in tcp_wput_data()
4719 tcp_hdr_len = tcp->tcp_hdr_len; in tcp_wput_data()
4722 if ((tcp->tcp_suna == snxt) && in tcp_wput_data()
4723 (prom_gettime() - tcp->tcp_last_recv_time) >= tcp->tcp_rto) { in tcp_wput_data()
4724 tcp->tcp_cwnd = MIN(tcp_slow_start_after_idle * mss, in tcp_wput_data()
4738 int usable_r = tcp->tcp_swnd; in tcp_wput_data()
4746 if (tcp->tcp_cwnd == 0) { in tcp_wput_data()
4751 assert(tcp->tcp_ecn_ok || in tcp_wput_data()
4752 tcp->tcp_state < TCPS_ESTABLISHED); in tcp_wput_data()
4757 if (usable_r > tcp->tcp_cwnd) in tcp_wput_data()
4758 usable_r = tcp->tcp_cwnd; in tcp_wput_data()
4762 usable_r += tcp->tcp_suna; in tcp_wput_data()
4797 if (usable < (int)tcp->tcp_naglim && in tcp_wput_data()
4798 tcp->tcp_naglim > tcp->tcp_last_sent_len && in tcp_wput_data()
4799 snxt != tcp->tcp_suna && in tcp_wput_data()
4800 !(tcp->tcp_valid_bits & TCP_URG_VALID)) in tcp_wput_data()
4803 num_burst_seg = tcp->tcp_snd_burst; in tcp_wput_data()
4826 if (len < (tcp->tcp_max_swnd >> 1) && in tcp_wput_data()
4827 (tcp->tcp_unsent - (snxt - tcp->tcp_snxt)) > len && in tcp_wput_data()
4828 !((tcp->tcp_valid_bits & TCP_URG_VALID) && in tcp_wput_data()
4829 len == 1) && (! tcp->tcp_zero_win_probe)) { in tcp_wput_data()
4836 if (snxt == tcp->tcp_snxt && in tcp_wput_data()
4837 snxt == tcp->tcp_suna) { in tcp_wput_data()
4848 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_wput_data()
4854 tcph = tcp->tcp_tcph; in tcp_wput_data()
4864 if (tcp->tcp_valid_bits) { in tcp_wput_data()
4866 uint32_t prev_snxt = tcp->tcp_snxt; in tcp_wput_data()
4878 mp = tcp_xmit_mp(tcp, xmit_tail, len, NULL, NULL, in tcp_wput_data()
4881 tcp->tcp_snxt = prev_snxt; in tcp_wput_data()
4893 tcp->tcp_last_sent_len = (ushort_t)len; in tcp_wput_data()
4919 tcp->tcp_ipha->ip_len = htons(len); in tcp_wput_data()
4935 tcp->tcp_last_sent_len = (ushort_t)len; in tcp_wput_data()
4938 if (tcp->tcp_ipversion == IPV4_VERSION) in tcp_wput_data()
4939 tcp->tcp_ipha->ip_len = htons(len); in tcp_wput_data()
4961 mp1 = allocb(tcp->tcp_ip_hdr_len + TCP_MAX_HDR_LENGTH + in tcp_wput_data()
4975 if (tcp->tcp_snd_ts_ok) { in tcp_wput_data()
4979 U32_TO_BE32(tcp->tcp_ts_recent, in tcp_wput_data()
4982 assert(tcp->tcp_tcp_hdr_len == TCP_MIN_HEADER_LENGTH); in tcp_wput_data()
4989 src = (ipaddr_t *)tcp->tcp_iphc; in tcp_wput_data()
5000 len = tcp->tcp_hdr_len; in tcp_wput_data()
5014 tcph = (tcph_t *)(rptr + tcp->tcp_ip_hdr_len); in tcp_wput_data()
5021 if (tcp->tcp_ecn_ok && !tcp->tcp_zero_win_probe) { in tcp_wput_data()
5022 SET_ECT(tcp, rptr); in tcp_wput_data()
5024 if (tcp->tcp_ecn_echo_on) in tcp_wput_data()
5026 if (tcp->tcp_cwr && !tcp->tcp_ecn_cwr_sent) { in tcp_wput_data()
5028 tcp->tcp_ecn_cwr_sent = B_TRUE; in tcp_wput_data()
5034 uchar_t *wptr = rptr + tcp->tcp_hdr_len; in tcp_wput_data()
5045 tmp = tcp->tcp_sack_list; in tcp_wput_data()
5093 tcp->tcp_last_sent_len += tail_unsent; in tcp_wput_data()
5147 tcp->tcp_xmit_tail = xmit_tail; in tcp_wput_data()
5148 tcp->tcp_xmit_tail_unsent = tail_unsent; in tcp_wput_data()
5149 len = tcp->tcp_snxt - snxt; in tcp_wput_data()
5157 if (tcp->tcp_snd_sack_ok && tcp->tcp_notsack_list != NULL) { in tcp_wput_data()
5159 tcp->tcp_pipe -= len; in tcp_wput_data()
5160 tcp_notsack_update(&(tcp->tcp_notsack_list), in tcp_wput_data()
5161 tcp->tcp_snxt, snxt, in tcp_wput_data()
5162 &(tcp->tcp_num_notsack_blk), in tcp_wput_data()
5163 &(tcp->tcp_cnt_notsack_list)); in tcp_wput_data()
5165 tcp->tcp_snxt = snxt + tcp->tcp_fin_sent; in tcp_wput_data()
5166 tcp->tcp_rack = tcp->tcp_rnxt; in tcp_wput_data()
5167 tcp->tcp_rack_cnt = 0; in tcp_wput_data()
5168 if ((snxt + len) == tcp->tcp_suna) { in tcp_wput_data()
5169 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_wput_data()
5176 len += tcp->tcp_unsent; in tcp_wput_data()
5177 tcp->tcp_unsent = len; in tcp_wput_data()
5183 (void) tcp_state_wait(sock_id, tcp, TCPS_ALL_ACKED); in tcp_wput_data()
5185 } else if (snxt == tcp->tcp_suna && tcp->tcp_swnd == 0) { in tcp_wput_data()
5190 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_wput_data()
5194 len += tcp->tcp_unsent; in tcp_wput_data()
5195 tcp->tcp_unsent = len; in tcp_wput_data()
5200 tcp_time_wait_processing(tcp_t *tcp, mblk_t *mp, in tcp_time_wait_processing() argument
5216 if ((sockets[sock_id].pcb == NULL) || (sockets[sock_id].pcb != tcp)) in tcp_time_wait_processing()
5221 ((tcph->th_flags[0] & TH_SYN) ? 0 : tcp->tcp_snd_ws); in tcp_time_wait_processing()
5222 if (tcp->tcp_snd_ts_ok) { in tcp_time_wait_processing()
5223 if (!tcp_paws_check(tcp, tcph, &tcpopt)) { in tcp_time_wait_processing()
5225 tcp_xmit_ctl(NULL, tcp, NULL, tcp->tcp_snxt, in tcp_time_wait_processing()
5226 tcp->tcp_rnxt, TH_ACK, 0, -1); in tcp_time_wait_processing()
5230 gap = seg_seq - tcp->tcp_rnxt; in tcp_time_wait_processing()
5231 rgap = tcp->tcp_rwnd - (gap + seg_len); in tcp_time_wait_processing()
5250 tcp_time_wait_remove(tcp); in tcp_time_wait_processing()
5251 tcp_time_wait_append(tcp); in tcp_time_wait_processing()
5252 TCP_TIMER_RESTART(tcp, tcp_time_wait_interval); in tcp_time_wait_processing()
5253 tcp_xmit_ctl(NULL, tcp, NULL, tcp->tcp_snxt, in tcp_time_wait_processing()
5254 tcp->tcp_rnxt, TH_ACK, 0, -1); in tcp_time_wait_processing()
5264 seg_seq = tcp->tcp_rnxt; in tcp_time_wait_processing()
5294 if ((adj = (int32_t)(tcp->tcp_snxt - new_iss)) > 0) { in tcp_time_wait_processing()
5302 tcp_clean_death(sock_id, tcp, 0); in tcp_time_wait_processing()
5336 if (tcp->tcp_snd_ts_ok && in tcp_time_wait_processing()
5337 TSTMP_GEQ(tcpopt.tcp_opt_ts_val, tcp->tcp_ts_recent) && in tcp_time_wait_processing()
5338 SEQ_LEQ(seg_seq, tcp->tcp_rack)) { in tcp_time_wait_processing()
5339 tcp->tcp_ts_recent = tcpopt.tcp_opt_ts_val; in tcp_time_wait_processing()
5340 tcp->tcp_last_rcv_lbolt = prom_gettime(); in tcp_time_wait_processing()
5343 if (seg_seq != tcp->tcp_rnxt && seg_len > 0) { in tcp_time_wait_processing()
5353 (void) tcp_clean_death(sock_id, tcp, 0); in tcp_time_wait_processing()
5358 tcp_xmit_ctl("TH_SYN", tcp, NULL, seg_ack, seg_seq + 1, in tcp_time_wait_processing()
5368 bytes_acked = (int)(seg_ack - tcp->tcp_suna); in tcp_time_wait_processing()
5371 new_swnd == tcp->tcp_swnd) in tcp_time_wait_processing()
5383 tcp_xmit_ctl(NULL, tcp, NULL, tcp->tcp_snxt, in tcp_time_wait_processing()
5384 tcp->tcp_rnxt, TH_ACK, 0, -1); in tcp_time_wait_processing()
5389 tcp_init_values(tcp_t *tcp, struct inetboot_socket *isp) in tcp_init_values() argument
5393 tcp->tcp_family = AF_INET; in tcp_init_values()
5394 tcp->tcp_ipversion = IPV4_VERSION; in tcp_init_values()
5403 tcp->tcp_rtt_sa = tcp_rexmit_interval_initial << 2; in tcp_init_values()
5404 tcp->tcp_rtt_sd = tcp_rexmit_interval_initial >> 1; in tcp_init_values()
5405 tcp->tcp_rto = (tcp->tcp_rtt_sa >> 3) + tcp->tcp_rtt_sd + in tcp_init_values()
5406 tcp_rexmit_interval_extra + (tcp->tcp_rtt_sa >> 5) + in tcp_init_values()
5408 if (tcp->tcp_rto < tcp_rexmit_interval_min) in tcp_init_values()
5409 tcp->tcp_rto = tcp_rexmit_interval_min; in tcp_init_values()
5410 tcp->tcp_timer_backoff = 0; in tcp_init_values()
5411 tcp->tcp_ms_we_have_waited = 0; in tcp_init_values()
5412 tcp->tcp_last_recv_time = prom_gettime(); in tcp_init_values()
5413 tcp->tcp_cwnd_max = tcp_cwnd_max_; in tcp_init_values()
5414 tcp->tcp_snd_burst = TCP_CWND_INFINITE; in tcp_init_values()
5415 tcp->tcp_cwnd_ssthresh = TCP_MAX_LARGEWIN; in tcp_init_values()
5418 tcp->tcp_if_mtu = mac_get_mtu() - 50; in tcp_init_values()
5420 tcp->tcp_if_mtu = mac_get_mtu(); in tcp_init_values()
5422 tcp->tcp_mss = tcp->tcp_if_mtu; in tcp_init_values()
5424 tcp->tcp_first_timer_threshold = tcp_ip_notify_interval; in tcp_init_values()
5425 tcp->tcp_first_ctimer_threshold = tcp_ip_notify_cinterval; in tcp_init_values()
5426 tcp->tcp_second_timer_threshold = tcp_ip_abort_interval; in tcp_init_values()
5431 tcp->tcp_second_ctimer_threshold = tcp_ip_abort_cinterval; in tcp_init_values()
5433 tcp->tcp_naglim = tcp_naglim_def; in tcp_init_values()
5438 if (tcp->tcp_ipversion == IPV4_VERSION) { in tcp_init_values()
5439 err = tcp_header_init_ipv4(tcp); in tcp_init_values()
5448 tcp->tcp_rcv_ws = TCP_MAX_WINSHIFT; in tcp_init_values()
5449 tcp->tcp_xmit_lowater = tcp_xmit_lowat; in tcp_init_values()
5451 tcp->tcp_xmit_hiwater = isp->so_sndbuf; in tcp_init_values()
5452 tcp->tcp_rwnd = isp->so_rcvbuf; in tcp_init_values()
5453 tcp->tcp_rwnd_max = isp->so_rcvbuf; in tcp_init_values()
5455 tcp->tcp_state = TCPS_IDLE; in tcp_init_values()
5463 tcp_header_init_ipv4(tcp_t *tcp) in tcp_header_init_ipv4() argument
5472 if (tcp->tcp_iphc != NULL) { in tcp_header_init_ipv4()
5473 assert(tcp->tcp_iphc_len >= TCP_MAX_COMBINED_HEADER_LENGTH); in tcp_header_init_ipv4()
5474 bzero(tcp->tcp_iphc, tcp->tcp_iphc_len); in tcp_header_init_ipv4()
5476 tcp->tcp_iphc_len = TCP_MAX_COMBINED_HEADER_LENGTH; in tcp_header_init_ipv4()
5477 tcp->tcp_iphc = bkmem_zalloc(tcp->tcp_iphc_len); in tcp_header_init_ipv4()
5478 if (tcp->tcp_iphc == NULL) { in tcp_header_init_ipv4()
5479 tcp->tcp_iphc_len = 0; in tcp_header_init_ipv4()
5483 tcp->tcp_ipha = (struct ip *)tcp->tcp_iphc; in tcp_header_init_ipv4()
5484 tcp->tcp_ipversion = IPV4_VERSION; in tcp_header_init_ipv4()
5490 tcp->tcp_hdr_len = sizeof (struct ip) + sizeof (tcph_t); in tcp_header_init_ipv4()
5491 tcp->tcp_tcp_hdr_len = sizeof (tcph_t); in tcp_header_init_ipv4()
5492 tcp->tcp_ip_hdr_len = sizeof (struct ip); in tcp_header_init_ipv4()
5493 tcp->tcp_ipha->ip_v = IP_VERSION; in tcp_header_init_ipv4()
5495 tcp->tcp_ipha->ip_hl = IP_SIMPLE_HDR_LENGTH_IN_WORDS; in tcp_header_init_ipv4()
5496 tcp->tcp_ipha->ip_p = IPPROTO_TCP; in tcp_header_init_ipv4()
5498 tcp->tcp_ipha->ip_sum = 0; in tcp_header_init_ipv4()
5500 tcph = (tcph_t *)(tcp->tcp_iphc + sizeof (struct ip)); in tcp_header_init_ipv4()
5501 tcp->tcp_tcph = tcph; in tcp_header_init_ipv4()
5513 tcp_xmit_ctl(char *str, tcp_t *tcp, mblk_t *mp, uint32_t seq, in tcp_xmit_ctl() argument
5522 tcp_hdr_len = tcp->tcp_hdr_len; in tcp_xmit_ctl()
5523 tcp_ip_hdr_len = tcp->tcp_ip_hdr_len; in tcp_xmit_ctl()
5552 bcopy(tcp->tcp_iphc, rptr, tcp_hdr_len); in tcp_xmit_ctl()
5565 if (tcp->tcp_snd_ts_ok && tcp->tcp_state > TCPS_SYN_SENT) { in tcp_xmit_ctl()
5576 if (tcp->tcp_snd_ts_ok) { in tcp_xmit_ctl()
5579 U32_TO_BE32(tcp->tcp_ts_recent, in tcp_xmit_ctl()
5582 tcp->tcp_rack = ack; in tcp_xmit_ctl()
5583 tcp->tcp_rack_cnt = 0; in tcp_xmit_ctl()
5599 tcp_ack_mp(tcp_t *tcp) in tcp_ack_mp() argument
5601 if (tcp->tcp_valid_bits) { in tcp_ack_mp()
5611 return (tcp_xmit_mp(tcp, NULL, 0, NULL, NULL, in tcp_ack_mp()
5612 (tcp->tcp_zero_win_probe) ? in tcp_ack_mp()
5613 tcp->tcp_suna : in tcp_ack_mp()
5614 tcp->tcp_snxt, B_FALSE, NULL, B_FALSE)); in tcp_ack_mp()
5628 if (tcp->tcp_snd_sack_ok && tcp->tcp_num_sack_blk > 0) { in tcp_ack_mp()
5629 num_sack_blk = MIN(tcp->tcp_max_sack_blk, in tcp_ack_mp()
5630 tcp->tcp_num_sack_blk); in tcp_ack_mp()
5633 tcp_hdr_len = tcp->tcp_hdr_len + sack_opt_len; in tcp_ack_mp()
5635 tcp_hdr_len = tcp->tcp_hdr_len; in tcp_ack_mp()
5645 bcopy(tcp->tcp_iphc, rptr, tcp->tcp_hdr_len); in tcp_ack_mp()
5647 tcph = (tcph_t *)&rptr[tcp->tcp_ip_hdr_len]; in tcp_ack_mp()
5657 U32_TO_ABE32((tcp->tcp_zero_win_probe) ? in tcp_ack_mp()
5658 tcp->tcp_suna : tcp->tcp_snxt, tcph->th_seq); in tcp_ack_mp()
5662 if (tcp->tcp_ecn_echo_on) in tcp_ack_mp()
5665 tcp->tcp_rack = tcp->tcp_rnxt; in tcp_ack_mp()
5666 tcp->tcp_rack_cnt = 0; in tcp_ack_mp()
5669 if (tcp->tcp_snd_ts_ok) { in tcp_ack_mp()
5674 U32_TO_BE32(tcp->tcp_ts_recent, in tcp_ack_mp()
5680 uchar_t *wptr = (uchar_t *)tcph + tcp->tcp_tcp_hdr_len; in tcp_ack_mp()
5691 tmp = tcp->tcp_sack_list; in tcp_ack_mp()
5724 tcp_xmit_mp(tcp_t *tcp, mblk_t *mp, int32_t max_to_send, int32_t *offset, in tcp_xmit_mp() argument
5740 mp1 = allocb(tcp->tcp_ip_hdr_len + TCP_MAX_HDR_LENGTH + in tcp_xmit_mp()
5754 if (tcp->tcp_snd_sack_ok && tcp->tcp_num_sack_blk > 0) { in tcp_xmit_mp()
5755 num_sack_blk = MIN(tcp->tcp_max_sack_blk, in tcp_xmit_mp()
5756 tcp->tcp_num_sack_blk); in tcp_xmit_mp()
5759 if (max_to_send + sack_opt_len > tcp->tcp_mss) in tcp_xmit_mp()
5808 mp1->b_wptr = rptr + tcp->tcp_hdr_len + sack_opt_len; in tcp_xmit_mp()
5809 bcopy(tcp->tcp_iphc, rptr, tcp->tcp_hdr_len); in tcp_xmit_mp()
5810 tcph = (tcph_t *)&rptr[tcp->tcp_ip_hdr_len]; in tcp_xmit_mp()
5820 if (data_length != 0 && (tcp->tcp_unsent == 0 || in tcp_xmit_mp()
5821 tcp->tcp_unsent == data_length)) { in tcp_xmit_mp()
5827 if (tcp->tcp_ecn_ok) { in tcp_xmit_mp()
5828 if (tcp->tcp_ecn_echo_on) in tcp_xmit_mp()
5837 SET_ECT(tcp, rptr); in tcp_xmit_mp()
5838 if (tcp->tcp_cwr && !tcp->tcp_ecn_cwr_sent) { in tcp_xmit_mp()
5840 tcp->tcp_ecn_cwr_sent = B_TRUE; in tcp_xmit_mp()
5845 if (tcp->tcp_valid_bits) { in tcp_xmit_mp()
5848 if ((tcp->tcp_valid_bits & TCP_ISS_VALID) && in tcp_xmit_mp()
5849 seq == tcp->tcp_iss) { in tcp_xmit_mp()
5864 u1 = tcp->tcp_if_mtu - IP_SIMPLE_HDR_LENGTH - in tcp_xmit_mp()
5878 switch (tcp->tcp_state) { in tcp_xmit_mp()
5882 if (tcp->tcp_snd_ws_ok) { in tcp_xmit_mp()
5887 wptr[3] = (uchar_t)tcp->tcp_rcv_ws; in tcp_xmit_mp()
5893 if (tcp->tcp_snd_ts_ok) { in tcp_xmit_mp()
5905 assert(tcp->tcp_ts_recent == 0); in tcp_xmit_mp()
5912 if (tcp->tcp_snd_sack_ok) { in tcp_xmit_mp()
5927 if (tcp->tcp_ecn_ok) { in tcp_xmit_mp()
5934 if (tcp->tcp_snd_ws_ok) { in tcp_xmit_mp()
5939 wptr[3] = (uchar_t)tcp->tcp_rcv_ws; in tcp_xmit_mp()
5944 if (tcp->tcp_snd_sack_ok) { in tcp_xmit_mp()
5959 if (tcp->tcp_ecn_ok) { in tcp_xmit_mp()
5972 if ((tcp->tcp_valid_bits & TCP_FSS_VALID) && in tcp_xmit_mp()
5973 (seq + data_length) == tcp->tcp_fss) { in tcp_xmit_mp()
5974 if (!tcp->tcp_fin_acked) { in tcp_xmit_mp()
5978 if (!tcp->tcp_fin_sent) { in tcp_xmit_mp()
5979 tcp->tcp_fin_sent = B_TRUE; in tcp_xmit_mp()
5980 switch (tcp->tcp_state) { in tcp_xmit_mp()
5983 tcp->tcp_state = TCPS_FIN_WAIT_1; in tcp_xmit_mp()
5986 tcp->tcp_state = TCPS_LAST_ACK; in tcp_xmit_mp()
5989 if (tcp->tcp_suna == tcp->tcp_snxt) { in tcp_xmit_mp()
5990 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_xmit_mp()
5992 tcp->tcp_snxt = tcp->tcp_fss + 1; in tcp_xmit_mp()
5997 tcp->tcp_rack = tcp->tcp_rnxt; in tcp_xmit_mp()
5998 tcp->tcp_rack_cnt = 0; in tcp_xmit_mp()
6000 if (tcp->tcp_snd_ts_ok) { in tcp_xmit_mp()
6001 if (tcp->tcp_state != TCPS_SYN_SENT) { in tcp_xmit_mp()
6006 U32_TO_BE32(tcp->tcp_ts_recent, in tcp_xmit_mp()
6012 uchar_t *wptr = (uchar_t *)tcph + tcp->tcp_tcp_hdr_len; in tcp_xmit_mp()
6023 tmp = tcp->tcp_sack_list; in tcp_xmit_mp()
6034 if (tcp->tcp_ipversion == IPV4_VERSION) in tcp_xmit_mp()
6378 tcp_iss_init(tcp_t *tcp) in tcp_iss_init() argument
6381 tcp->tcp_iss = tcp_iss_incr_extra; in tcp_iss_init()
6382 tcp->tcp_iss += (prom_gettime() >> ISS_NSEC_SHT) + tcp_random(); in tcp_iss_init()
6383 tcp->tcp_valid_bits = TCP_ISS_VALID; in tcp_iss_init()
6384 tcp->tcp_fss = tcp->tcp_iss - 1; in tcp_iss_init()
6385 tcp->tcp_suna = tcp->tcp_iss; in tcp_iss_init()
6386 tcp->tcp_snxt = tcp->tcp_iss + 1; in tcp_iss_init()
6387 tcp->tcp_rexmit_nxt = tcp->tcp_snxt; in tcp_iss_init()
6388 tcp->tcp_csuna = tcp->tcp_snxt; in tcp_iss_init()
6400 tcp_display(tcp_t *tcp, char *sup_buf, char format) in tcp_display() argument
6415 if (tcp == NULL) in tcp_display()
6417 switch (tcp->tcp_state) { in tcp_display()
6458 (void) sprintf(buf1, "TCPUnkState(%d)", tcp->tcp_state); in tcp_display()
6470 addr.s_addr = tcp->tcp_bound_source; in tcp_display()
6472 addr.s_addr = tcp->tcp_remote; in tcp_display()
6475 local_addrbuf, ntohs(tcp->tcp_lport), remote_addrbuf, in tcp_display()
6476 ntohs(tcp->tcp_fport), cp); in tcp_display()
6481 ntohs(tcp->tcp_lport), ntohs(tcp->tcp_fport), cp); in tcp_display()
6495 tcp_reass(tcp_t *tcp, mblk_t *mp, uint32_t start) in tcp_reass() argument
6517 mp1 = tcp->tcp_reass_tail; in tcp_reass()
6519 tcp->tcp_reass_tail = mp; in tcp_reass()
6520 tcp->tcp_reass_head = mp; in tcp_reass()
6529 tcp->tcp_reass_tail = mp; in tcp_reass()
6534 mp1 = tcp->tcp_reass_head; in tcp_reass()
6540 tcp->tcp_reass_head = mp; in tcp_reass()
6541 tcp_reass_elim_overlap(tcp, mp); in tcp_reass()
6558 tcp_reass_elim_overlap(tcp, mp); in tcp_reass()
6561 tcp_reass_elim_overlap(tcp, mp1); in tcp_reass()
6564 mp1 = tcp->tcp_reass_head; in tcp_reass()
6566 if (TCP_REASS_SEQ(mp1) != tcp->tcp_rnxt) in tcp_reass()
6575 tcp->tcp_reass_tail = NULL; in tcp_reass()
6584 mp1 = tcp->tcp_reass_head; in tcp_reass()
6585 tcp->tcp_reass_head = mp; in tcp_reass()
6591 tcp_reass_elim_overlap(tcp_t *tcp, mblk_t *mp) in tcp_reass_elim_overlap() argument
6615 tcp->tcp_reass_tail = mp; in tcp_reass_elim_overlap()
6622 tcp_time_wait_remove(tcp_t *tcp) in tcp_time_wait_remove() argument
6624 if (tcp->tcp_time_wait_expire == 0) { in tcp_time_wait_remove()
6625 assert(tcp->tcp_time_wait_next == NULL); in tcp_time_wait_remove()
6626 assert(tcp->tcp_time_wait_prev == NULL); in tcp_time_wait_remove()
6629 assert(tcp->tcp_state == TCPS_TIME_WAIT); in tcp_time_wait_remove()
6630 if (tcp == tcp_time_wait_head) { in tcp_time_wait_remove()
6631 assert(tcp->tcp_time_wait_prev == NULL); in tcp_time_wait_remove()
6632 tcp_time_wait_head = tcp->tcp_time_wait_next; in tcp_time_wait_remove()
6638 } else if (tcp == tcp_time_wait_tail) { in tcp_time_wait_remove()
6639 assert(tcp != tcp_time_wait_head); in tcp_time_wait_remove()
6640 assert(tcp->tcp_time_wait_next == NULL); in tcp_time_wait_remove()
6641 tcp_time_wait_tail = tcp->tcp_time_wait_prev; in tcp_time_wait_remove()
6645 assert(tcp->tcp_time_wait_prev->tcp_time_wait_next == tcp); in tcp_time_wait_remove()
6646 assert(tcp->tcp_time_wait_next->tcp_time_wait_prev == tcp); in tcp_time_wait_remove()
6647 tcp->tcp_time_wait_prev->tcp_time_wait_next = in tcp_time_wait_remove()
6648 tcp->tcp_time_wait_next; in tcp_time_wait_remove()
6649 tcp->tcp_time_wait_next->tcp_time_wait_prev = in tcp_time_wait_remove()
6650 tcp->tcp_time_wait_prev; in tcp_time_wait_remove()
6652 tcp->tcp_time_wait_next = NULL; in tcp_time_wait_remove()
6653 tcp->tcp_time_wait_prev = NULL; in tcp_time_wait_remove()
6654 tcp->tcp_time_wait_expire = 0; in tcp_time_wait_remove()
6662 tcp_time_wait_append(tcp_t *tcp) in tcp_time_wait_append() argument
6664 tcp->tcp_time_wait_expire = prom_gettime() + tcp_time_wait_interval; in tcp_time_wait_append()
6665 if (tcp->tcp_time_wait_expire == 0) in tcp_time_wait_append()
6666 tcp->tcp_time_wait_expire = 1; in tcp_time_wait_append()
6670 tcp_time_wait_head = tcp; in tcp_time_wait_append()
6674 tcp_time_wait_tail->tcp_time_wait_next = tcp; in tcp_time_wait_append()
6675 tcp->tcp_time_wait_prev = tcp_time_wait_tail; in tcp_time_wait_append()
6677 tcp_time_wait_tail = tcp; in tcp_time_wait_append()
6694 tcp_t *tcp; in tcp_time_wait_collector() local
6702 while ((tcp = tcp_time_wait_head) != NULL) { in tcp_time_wait_collector()
6707 if ((int32_t)(now - tcp->tcp_time_wait_expire) < 0) { in tcp_time_wait_collector()
6714 (void) tcp_clean_death(-1, tcp, 0); in tcp_time_wait_collector()
6723 tcp_t *tcp; in tcp_time_wait_report() local
6726 for (tcp = tcp_time_wait_head; tcp != NULL; in tcp_time_wait_report()
6727 tcp = tcp->tcp_time_wait_next) { in tcp_time_wait_report()
6728 printf("%s expires at %u\n", tcp_display(tcp, NULL, in tcp_time_wait_report()
6729 DISP_ADDR_AND_PORT), tcp->tcp_time_wait_expire); in tcp_time_wait_report()
6738 tcp_rcv_drain(int sock_id, tcp_t *tcp) in tcp_rcv_drain() argument
6750 if (tcp->tcp_rcv_list == NULL) in tcp_rcv_drain()
6757 if ((in_mp = allocb(tcp->tcp_rcv_cnt, 0)) == NULL) { in tcp_rcv_drain()
6765 while ((mp = tcp->tcp_rcv_list) != NULL) { in tcp_rcv_drain()
6766 tcp->tcp_rcv_list = mp->b_cont; in tcp_rcv_drain()
6773 tcp->tcp_rcv_last_tail = NULL; in tcp_rcv_drain()
6774 tcp->tcp_rcv_cnt = 0; in tcp_rcv_drain()
6786 (tcp->tcp_rwnd_max - tcp->tcp_rwnd >= tcp->tcp_mss)) { in tcp_rcv_drain()
6787 tcp->tcp_rwnd = tcp->tcp_rwnd_max; in tcp_rcv_drain()
6788 U32_TO_ABE16(tcp->tcp_rwnd >> tcp->tcp_rcv_ws, in tcp_rcv_drain()
6789 tcp->tcp_tcph->th_win); in tcp_rcv_drain()
6799 tcp_t *tcp; in tcp_rcv_drain_sock() local
6800 if ((tcp = sockets[sock_id].pcb) == NULL) in tcp_rcv_drain_sock()
6802 tcp_rcv_drain(sock_id, tcp); in tcp_rcv_drain_sock()
6811 tcp_drain_needed(int sock_id, tcp_t *tcp) in tcp_drain_needed() argument
6816 sockets[sock_id].inq, tcp->tcp_rcv_list); in tcp_drain_needed()
6819 (tcp->tcp_rcv_list == NULL)) in tcp_drain_needed()
6841 tcp_rcv_enqueue(tcp_t *tcp, mblk_t *mp, uint_t seg_len) in tcp_rcv_enqueue() argument
6844 if (tcp->tcp_rcv_list == NULL) { in tcp_rcv_enqueue()
6845 tcp->tcp_rcv_list = mp; in tcp_rcv_enqueue()
6847 tcp->tcp_rcv_last_tail->b_cont = mp; in tcp_rcv_enqueue()
6851 tcp->tcp_rcv_last_tail = mp; in tcp_rcv_enqueue()
6852 tcp->tcp_rcv_cnt += seg_len; in tcp_rcv_enqueue()
6853 tcp->tcp_rwnd -= seg_len; in tcp_rcv_enqueue()
6855 printf("tcp_rcv_enqueue rwnd %d\n", tcp->tcp_rwnd); in tcp_rcv_enqueue()
6857 U32_TO_ABE16(tcp->tcp_rwnd >> tcp->tcp_rcv_ws, tcp->tcp_tcph->th_win); in tcp_rcv_enqueue()
6873 tcp_set_rto(tcp_t *tcp, int32_t rtt) in tcp_set_rto() argument
6876 uint32_t sa = tcp->tcp_rtt_sa; in tcp_set_rto()
6877 uint32_t sv = tcp->tcp_rtt_sd; in tcp_set_rto()
6881 tcp->tcp_rtt_update++; in tcp_set_rto()
6933 tcp->tcp_rtt_sa = sa; in tcp_set_rto()
6934 tcp->tcp_rtt_sd = sv; in tcp_set_rto()
6950 tcp->tcp_rto = tcp_rexmit_interval_max; in tcp_set_rto()
6952 tcp->tcp_rto = tcp_rexmit_interval_min; in tcp_set_rto()
6954 tcp->tcp_rto = rto; in tcp_set_rto()
6958 tcp->tcp_timer_backoff = 0; in tcp_set_rto()
6966 tcp_xmit_end(tcp_t *tcp, int sock_id) in tcp_xmit_end() argument
6970 if (tcp->tcp_state < TCPS_SYN_RCVD || in tcp_xmit_end()
6971 tcp->tcp_state > TCPS_CLOSE_WAIT) { in tcp_xmit_end()
6979 tcp->tcp_fss = tcp->tcp_snxt + tcp->tcp_unsent; in tcp_xmit_end()
6980 tcp->tcp_valid_bits |= TCP_FSS_VALID; in tcp_xmit_end()
6985 if (tcp->tcp_unsent == 0) { in tcp_xmit_end()
6986 mp = tcp_xmit_mp(tcp, NULL, 0, NULL, NULL, in tcp_xmit_end()
6987 tcp->tcp_fss, B_FALSE, NULL, B_FALSE); in tcp_xmit_end()
6999 tcp->tcp_snxt = tcp->tcp_fss + 1; in tcp_xmit_end()
7000 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_xmit_end()
7007 if (tcp->tcp_rexmit && tcp->tcp_rexmit_nxt == tcp->tcp_fss) { in tcp_xmit_end()
7008 tcp->tcp_rexmit_nxt = tcp->tcp_snxt; in tcp_xmit_end()
7011 tcp_wput_data(tcp, NULL, B_FALSE); in tcp_xmit_end()
7018 tcp_opt_set(tcp_t *tcp, int level, int option, const void *optval, in tcp_opt_set() argument
7034 val = MSS_ROUNDUP(val, tcp->tcp_mss); in tcp_opt_set()
7035 (void) tcp_rwnd_set(tcp, val); in tcp_opt_set()
7043 tcp->tcp_xmit_hiwater = *(int *)optval; in tcp_opt_set()
7044 if (tcp->tcp_xmit_hiwater > tcp_max_buf) in tcp_opt_set()
7045 tcp->tcp_xmit_hiwater = tcp_max_buf; in tcp_opt_set()
7055 tcp->tcp_linger = 1; in tcp_opt_set()
7056 tcp->tcp_lingertime = lgr->l_linger; in tcp_opt_set()
7058 tcp->tcp_linger = 0; in tcp_opt_set()
7059 tcp->tcp_lingertime = 0; in tcp_opt_set()