Lines Matching refs:tcp

77 #define	TCP_IS_DETACHED_NONEAGER(tcp)	\  argument
78 (TCP_IS_DETACHED(tcp) && \
79 (!(tcp)->tcp_hard_binding))
108 #define SET_TIME_WAIT(tcps, tcp, connp) \ argument
110 (tcp)->tcp_state = TCPS_TIME_WAIT; \
111 if ((tcp)->tcp_listen_cnt != NULL) \
112 TCP_DECR_LISTEN_CNT(tcp); \
116 if (!TCP_IS_DETACHED(tcp)) { \
117 TCP_TIMER_RESTART(tcp, (tcps)->tcps_time_wait_interval); \
119 tcp_time_wait_append(tcp); \
178 cc_ack_received(tcp_t *tcp, uint32_t seg_ack, int32_t bytes_acked, in cc_ack_received() argument
181 uint32_t old_cwnd = tcp->tcp_cwnd; in cc_ack_received()
183 tcp->tcp_ccv.bytes_this_ack = bytes_acked; in cc_ack_received()
184 if (tcp->tcp_cwnd <= tcp->tcp_swnd) in cc_ack_received()
185 tcp->tcp_ccv.flags |= CCF_CWND_LIMITED; in cc_ack_received()
187 tcp->tcp_ccv.flags &= ~CCF_CWND_LIMITED; in cc_ack_received()
190 if (tcp->tcp_cwnd > tcp->tcp_cwnd_ssthresh) { in cc_ack_received()
191 if (tcp->tcp_ccv.flags & CCF_RTO) in cc_ack_received()
192 tcp->tcp_ccv.flags &= ~CCF_RTO; in cc_ack_received()
194 tcp->tcp_ccv.t_bytes_acked += in cc_ack_received()
195 min(tcp->tcp_ccv.bytes_this_ack, in cc_ack_received()
196 tcp->tcp_tcps->tcps_abc_l_var * tcp->tcp_mss); in cc_ack_received()
197 if (tcp->tcp_ccv.t_bytes_acked >= tcp->tcp_cwnd) { in cc_ack_received()
198 tcp->tcp_ccv.t_bytes_acked -= tcp->tcp_cwnd; in cc_ack_received()
199 tcp->tcp_ccv.flags |= CCF_ABC_SENTAWND; in cc_ack_received()
202 tcp->tcp_ccv.flags &= ~CCF_ABC_SENTAWND; in cc_ack_received()
203 tcp->tcp_ccv.t_bytes_acked = 0; in cc_ack_received()
207 if (CC_ALGO(tcp)->ack_received != NULL) { in cc_ack_received()
214 tcp->tcp_ccv.curack = seg_ack; in cc_ack_received()
215 CC_ALGO(tcp)->ack_received(&tcp->tcp_ccv, type); in cc_ack_received()
218 DTRACE_PROBE3(cwnd__cc__ack__received, tcp_t *, tcp, uint32_t, old_cwnd, in cc_ack_received()
219 uint32_t, tcp->tcp_cwnd); in cc_ack_received()
223 cc_cong_signal(tcp_t *tcp, uint32_t seg_ack, uint32_t type) in cc_cong_signal() argument
225 uint32_t old_cwnd = tcp->tcp_cwnd; in cc_cong_signal()
226 uint32_t old_cwnd_ssthresh = tcp->tcp_cwnd_ssthresh; in cc_cong_signal()
229 if (!IN_FASTRECOVERY(tcp->tcp_ccv.flags)) { in cc_cong_signal()
230 tcp->tcp_rexmit_max = tcp->tcp_snxt; in cc_cong_signal()
231 if (tcp->tcp_ecn_ok) { in cc_cong_signal()
232 tcp->tcp_cwr_snd_max = tcp->tcp_snxt; in cc_cong_signal()
233 tcp->tcp_cwr = B_TRUE; in cc_cong_signal()
234 tcp->tcp_ecn_cwr_sent = B_FALSE; in cc_cong_signal()
239 if (!IN_CONGRECOVERY(tcp->tcp_ccv.flags)) { in cc_cong_signal()
240 tcp->tcp_rexmit_max = tcp->tcp_snxt; in cc_cong_signal()
241 if (tcp->tcp_ecn_ok) { in cc_cong_signal()
242 tcp->tcp_cwr_snd_max = tcp->tcp_snxt; in cc_cong_signal()
243 tcp->tcp_cwr = B_TRUE; in cc_cong_signal()
244 tcp->tcp_ecn_cwr_sent = B_FALSE; in cc_cong_signal()
249 tcp->tcp_ccv.flags |= CCF_RTO; in cc_cong_signal()
250 tcp->tcp_dupack_cnt = 0; in cc_cong_signal()
251 tcp->tcp_ccv.t_bytes_acked = 0; in cc_cong_signal()
256 EXIT_RECOVERY(tcp->tcp_ccv.flags); in cc_cong_signal()
257 if (CC_ALGO(tcp)->cong_signal == NULL) { in cc_cong_signal()
262 tcp->tcp_cwnd_ssthresh = max( in cc_cong_signal()
263 (tcp->tcp_snxt - tcp->tcp_suna) / 2 / tcp->tcp_mss, in cc_cong_signal()
264 2) * tcp->tcp_mss; in cc_cong_signal()
265 tcp->tcp_cwnd = tcp->tcp_mss; in cc_cong_signal()
268 if (tcp->tcp_ecn_ok) { in cc_cong_signal()
269 tcp->tcp_cwr = B_TRUE; in cc_cong_signal()
270 tcp->tcp_cwr_snd_max = tcp->tcp_snxt; in cc_cong_signal()
271 tcp->tcp_ecn_cwr_sent = B_FALSE; in cc_cong_signal()
276 if (CC_ALGO(tcp)->cong_signal != NULL) { in cc_cong_signal()
277 tcp->tcp_ccv.curack = seg_ack; in cc_cong_signal()
278 CC_ALGO(tcp)->cong_signal(&tcp->tcp_ccv, type); in cc_cong_signal()
281 DTRACE_PROBE6(cwnd__cc__cong__signal, tcp_t *, tcp, uint32_t, old_cwnd, in cc_cong_signal()
282 uint32_t, tcp->tcp_cwnd, uint32_t, old_cwnd_ssthresh, in cc_cong_signal()
283 uint32_t, tcp->tcp_cwnd_ssthresh, uint32_t, type); in cc_cong_signal()
287 cc_post_recovery(tcp_t *tcp, uint32_t seg_ack) in cc_post_recovery() argument
289 uint32_t old_cwnd = tcp->tcp_cwnd; in cc_post_recovery()
291 if (CC_ALGO(tcp)->post_recovery != NULL) { in cc_post_recovery()
292 tcp->tcp_ccv.curack = seg_ack; in cc_post_recovery()
293 CC_ALGO(tcp)->post_recovery(&tcp->tcp_ccv); in cc_post_recovery()
295 tcp->tcp_ccv.t_bytes_acked = 0; in cc_post_recovery()
297 DTRACE_PROBE3(cwnd__cc__post__recovery, tcp_t *, tcp, in cc_post_recovery()
298 uint32_t, old_cwnd, uint32_t, tcp->tcp_cwnd); in cc_post_recovery()
309 tcp_mss_set(tcp_t *tcp, uint32_t mss) in tcp_mss_set() argument
312 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_mss_set()
313 conn_t *connp = tcp->tcp_connp; in tcp_mss_set()
329 if (mss < tcp->tcp_naglim || tcp->tcp_mss == tcp->tcp_naglim) in tcp_mss_set()
330 tcp->tcp_naglim = mss; in tcp_mss_set()
348 tcp->tcp_cwnd = (tcp->tcp_cwnd / tcp->tcp_mss) * mss; in tcp_mss_set()
349 tcp->tcp_cwnd_cnt = 0; in tcp_mss_set()
351 tcp->tcp_mss = mss; in tcp_mss_set()
352 (void) tcp_maxpsz_set(tcp, B_TRUE); in tcp_mss_set()
369 tcp_t *tcp; in tcp_parse_options() local
435 if ((tcp = tcpopt->tcp) == NULL) { in tcp_parse_options()
446 if (tcp->tcp_notsack_list == NULL) { in tcp_parse_options()
447 tcp_notsack_update(&(tcp->tcp_notsack_list), in tcp_parse_options()
448 tcp->tcp_suna, tcp->tcp_snxt, in tcp_parse_options()
449 &(tcp->tcp_num_notsack_blk), in tcp_parse_options()
450 &(tcp->tcp_cnt_notsack_list)); in tcp_parse_options()
457 if (tcp->tcp_notsack_list == NULL) { in tcp_parse_options()
461 tcp->tcp_fack = tcp->tcp_suna; in tcp_parse_options()
482 SEQ_LT(sack_begin, tcp->tcp_suna) || in tcp_parse_options()
483 SEQ_GT(sack_end, tcp->tcp_snxt)) { in tcp_parse_options()
486 tcp_notsack_insert(&(tcp->tcp_notsack_list), in tcp_parse_options()
488 &(tcp->tcp_num_notsack_blk), in tcp_parse_options()
489 &(tcp->tcp_cnt_notsack_list)); in tcp_parse_options()
490 if (SEQ_GT(sack_end, tcp->tcp_fack)) { in tcp_parse_options()
491 tcp->tcp_fack = sack_end; in tcp_parse_options()
533 tcp_process_options(tcp_t *tcp, tcpha_t *tcpha) in tcp_process_options() argument
539 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_process_options()
540 conn_t *connp = tcp->tcp_connp; in tcp_process_options()
542 tcpopt.tcp = NULL; in tcp_process_options()
569 tcp->tcp_snd_ws = tcpopt.tcp_opt_wscale; in tcp_process_options()
570 tcp->tcp_snd_ws_ok = B_TRUE; in tcp_process_options()
572 tcp->tcp_snd_ws = B_FALSE; in tcp_process_options()
573 tcp->tcp_snd_ws_ok = B_FALSE; in tcp_process_options()
574 tcp->tcp_rcv_ws = B_FALSE; in tcp_process_options()
579 (tcp->tcp_snd_ts_ok || TCP_IS_DETACHED(tcp))) { in tcp_process_options()
580 tmp_tcph = (char *)tcp->tcp_tcpha; in tcp_process_options()
582 tcp->tcp_snd_ts_ok = B_TRUE; in tcp_process_options()
583 tcp->tcp_ts_recent = tcpopt.tcp_opt_ts_val; in tcp_process_options()
584 tcp->tcp_last_rcv_lbolt = ddi_get_lbolt64(); in tcp_process_options()
596 tcp->tcp_tcpha->tha_offset_and_reserved += (3 << 4); in tcp_process_options()
598 tcp->tcp_snd_ts_ok = B_FALSE; in tcp_process_options()
620 (tcp->tcp_snd_sack_ok || in tcp_process_options()
621 (tcps->tcps_sack_permitted != 0 && TCP_IS_DETACHED(tcp)))) { in tcp_process_options()
622 ASSERT(tcp->tcp_num_sack_blk == 0); in tcp_process_options()
623 ASSERT(tcp->tcp_notsack_list == NULL); in tcp_process_options()
625 tcp->tcp_snd_sack_ok = B_TRUE; in tcp_process_options()
626 if (tcp->tcp_snd_ts_ok) { in tcp_process_options()
627 tcp->tcp_max_sack_blk = 3; in tcp_process_options()
629 tcp->tcp_max_sack_blk = 4; in tcp_process_options()
631 } else if (tcp->tcp_snd_sack_ok) { in tcp_process_options()
639 ASSERT(tcp->tcp_num_sack_blk == 0); in tcp_process_options()
640 ASSERT(tcp->tcp_notsack_list == NULL); in tcp_process_options()
641 tcp->tcp_snd_sack_ok = B_FALSE; in tcp_process_options()
648 tcp->tcp_mss -= connp->conn_ht_iphc_len; in tcp_process_options()
658 tcp->tcp_ipsec_overhead - in tcp_process_options()
673 tcp_mss_set(tcp, MIN(tcpopt.tcp_opt_mss, tcp->tcp_mss)); in tcp_process_options()
679 TCP_SET_INIT_CWND(tcp, tcp->tcp_mss, tcps->tcps_slow_start_initial); in tcp_process_options()
681 if (tcp->tcp_cc_algo->conn_init != NULL) in tcp_process_options()
682 tcp->tcp_cc_algo->conn_init(&tcp->tcp_ccv); in tcp_process_options()
692 tcp_reass(tcp_t *tcp, mblk_t *mp, uint32_t start) in tcp_reass() argument
699 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_reass()
717 mp1 = tcp->tcp_reass_tail; in tcp_reass()
726 tcp->tcp_reass_head = mp; in tcp_reass()
728 tcp->tcp_reass_tail = mp; in tcp_reass()
731 tcp->tcp_cs.tcp_in_data_unorder_segs++; in tcp_reass()
732 tcp->tcp_cs.tcp_in_data_unorder_bytes += bytes; in tcp_reass()
735 mp1 = tcp->tcp_reass_head; in tcp_reass()
741 tcp->tcp_reass_head = mp; in tcp_reass()
742 tcp_reass_elim_overlap(tcp, mp); in tcp_reass()
759 tcp_reass_elim_overlap(tcp, mp); in tcp_reass()
762 tcp_reass_elim_overlap(tcp, mp1); in tcp_reass()
765 mp1 = tcp->tcp_reass_head; in tcp_reass()
767 if (TCP_REASS_SEQ(mp1) != tcp->tcp_rnxt) in tcp_reass()
776 tcp->tcp_reass_tail = NULL; in tcp_reass()
785 mp1 = tcp->tcp_reass_head; in tcp_reass()
786 tcp->tcp_reass_head = mp; in tcp_reass()
792 tcp_reass_elim_overlap(tcp_t *tcp, mblk_t *mp) in tcp_reass_elim_overlap() argument
797 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_reass_elim_overlap()
820 tcp->tcp_reass_tail = mp; in tcp_reass_elim_overlap()
829 tcp_paws_check(tcp_t *tcp, const tcp_opt_t *tcpoptp) in tcp_paws_check() argument
832 tcp->tcp_ts_recent)) { in tcp_paws_check()
834 (tcp->tcp_last_rcv_lbolt + PAWS_TIMEOUT)) { in tcp_paws_check()
842 tcp->tcp_ts_recent = in tcp_paws_check()
865 tcp_drop_q0(tcp_t *tcp) in tcp_drop_q0() argument
869 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_drop_q0()
871 ASSERT(MUTEX_HELD(&tcp->tcp_eager_lock)); in tcp_drop_q0()
872 ASSERT(tcp->tcp_eager_next_q0 != tcp->tcp_eager_prev_q0); in tcp_drop_q0()
875 eager = tcp->tcp_eager_prev_drop_q0; in tcp_drop_q0()
878 if (eager == tcp) { in tcp_drop_q0()
892 if (tcp->tcp_connp->conn_debug) { in tcp_drop_q0()
896 tcp->tcp_conn_req_cnt_q0, in tcp_drop_q0()
897 tcp_display(tcp, NULL, DISP_PORT_ONLY)); in tcp_drop_q0()
920 tcp_t *tcp = connp->conn_tcp; in tcp_conn_create_v6() local
926 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_conn_create_v6()
952 (char *)&tcp, in tcp_conn_create_v6()
959 (char *)&tcp, (t_scalar_t)sizeof (intptr_t), in tcp_conn_create_v6()
996 (char *)&tcp, (t_scalar_t)sizeof (intptr_t), in tcp_conn_create_v6()
1002 (char *)&tcp, (t_scalar_t)sizeof (intptr_t), in tcp_conn_create_v6()
1007 tcp->tcp_mss = tcps->tcps_mss_def_ipv6; in tcp_conn_create_v6()
1017 tcp_t *tcp = connp->conn_tcp; in tcp_conn_create_v4() local
1020 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_conn_create_v4()
1043 (char *)&sind, sizeof (sin_t), (char *)&tcp, in tcp_conn_create_v4()
1049 (char *)&tcp, (t_scalar_t)sizeof (intptr_t), in tcp_conn_create_v4()
1053 tcp->tcp_mss = tcps->tcps_mss_def_ipv4; in tcp_conn_create_v4()
1201 tcp_eager_unlink(tcp_t *tcp) in tcp_eager_unlink() argument
1203 tcp_t *listener = tcp->tcp_listener; in tcp_eager_unlink()
1207 if (tcp->tcp_eager_next_q0 != NULL) { in tcp_eager_unlink()
1208 ASSERT(tcp->tcp_eager_prev_q0 != NULL); in tcp_eager_unlink()
1211 tcp->tcp_eager_next_q0->tcp_eager_prev_q0 = in tcp_eager_unlink()
1212 tcp->tcp_eager_prev_q0; in tcp_eager_unlink()
1213 tcp->tcp_eager_prev_q0->tcp_eager_next_q0 = in tcp_eager_unlink()
1214 tcp->tcp_eager_next_q0; in tcp_eager_unlink()
1218 tcp->tcp_eager_next_q0 = NULL; in tcp_eager_unlink()
1219 tcp->tcp_eager_prev_q0 = NULL; in tcp_eager_unlink()
1225 MAKE_UNDROPPABLE(tcp); in tcp_eager_unlink()
1227 if (tcp->tcp_syn_rcvd_timeout != 0) { in tcp_eager_unlink()
1237 if (tcpp[0] == tcp) { in tcp_eager_unlink()
1238 if (listener->tcp_eager_last_q == tcp) { in tcp_eager_unlink()
1245 ASSERT(tcp->tcp_eager_next_q == NULL); in tcp_eager_unlink()
1261 tcpp[0] = tcp->tcp_eager_next_q; in tcp_eager_unlink()
1262 tcp->tcp_eager_next_q = NULL; in tcp_eager_unlink()
1263 tcp->tcp_eager_last_q = NULL; in tcp_eager_unlink()
1271 tcp->tcp_listener = NULL; in tcp_eager_unlink()
2060 tcp_rcv_drain(tcp_t *tcp) in tcp_rcv_drain() argument
2067 queue_t *q = tcp->tcp_connp->conn_rq; in tcp_rcv_drain()
2070 if (tcp->tcp_listener != NULL) in tcp_rcv_drain()
2074 ASSERT(!IPCL_IS_NONSTR(tcp->tcp_connp)); in tcp_rcv_drain()
2077 if (tcp->tcp_push_tid != 0) { in tcp_rcv_drain()
2078 (void) TCP_TIMER_CANCEL(tcp, tcp->tcp_push_tid); in tcp_rcv_drain()
2079 tcp->tcp_push_tid = 0; in tcp_rcv_drain()
2091 if ((tcp->tcp_fused || tcp->tcp_fused_sigurg)) { in tcp_rcv_drain()
2092 if (tcp_fuse_rcv_drain(q, tcp, tcp->tcp_fused ? NULL : in tcp_rcv_drain()
2093 &tcp->tcp_fused_sigurg_mp)) in tcp_rcv_drain()
2097 while ((mp = tcp->tcp_rcv_list) != NULL) { in tcp_rcv_drain()
2098 tcp->tcp_rcv_list = mp->b_next; in tcp_rcv_drain()
2106 ASSERT(cnt == tcp->tcp_rcv_cnt); in tcp_rcv_drain()
2108 tcp->tcp_rcv_last_head = NULL; in tcp_rcv_drain()
2109 tcp->tcp_rcv_last_tail = NULL; in tcp_rcv_drain()
2110 tcp->tcp_rcv_cnt = 0; in tcp_rcv_drain()
2113 return (tcp_rwnd_reopen(tcp)); in tcp_rcv_drain()
2127 tcp_rcv_enqueue(tcp_t *tcp, mblk_t *mp, uint_t seg_len, cred_t *cr) in tcp_rcv_enqueue() argument
2130 ASSERT(tcp->tcp_rcv_list == NULL || tcp->tcp_rcv_last_head != NULL); in tcp_rcv_enqueue()
2143 if (tcp->tcp_rcv_list == NULL) { in tcp_rcv_enqueue()
2144 ASSERT(tcp->tcp_rcv_last_head == NULL); in tcp_rcv_enqueue()
2145 tcp->tcp_rcv_list = mp; in tcp_rcv_enqueue()
2146 tcp->tcp_rcv_last_head = mp; in tcp_rcv_enqueue()
2147 } else if (DB_TYPE(mp) == DB_TYPE(tcp->tcp_rcv_last_head)) { in tcp_rcv_enqueue()
2148 tcp->tcp_rcv_last_tail->b_cont = mp; in tcp_rcv_enqueue()
2150 tcp->tcp_rcv_last_head->b_next = mp; in tcp_rcv_enqueue()
2151 tcp->tcp_rcv_last_head = mp; in tcp_rcv_enqueue()
2157 tcp->tcp_rcv_last_tail = mp; in tcp_rcv_enqueue()
2158 tcp->tcp_rcv_cnt += seg_len; in tcp_rcv_enqueue()
2159 tcp->tcp_rwnd -= seg_len; in tcp_rcv_enqueue()
2164 tcp_ack_mp(tcp_t *tcp) in tcp_ack_mp() argument
2167 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_ack_mp()
2168 conn_t *connp = tcp->tcp_connp; in tcp_ack_mp()
2182 if (tcp->tcp_zero_win_probe) { in tcp_ack_mp()
2183 seq_no = tcp->tcp_suna; in tcp_ack_mp()
2184 } else if (tcp->tcp_state == TCPS_SYN_RCVD) { in tcp_ack_mp()
2185 ASSERT(tcp->tcp_swnd == 0); in tcp_ack_mp()
2186 seq_no = tcp->tcp_snxt; in tcp_ack_mp()
2188 seq_no = SEQ_GT(tcp->tcp_snxt, in tcp_ack_mp()
2189 (tcp->tcp_suna + tcp->tcp_swnd)) ? in tcp_ack_mp()
2190 (tcp->tcp_suna + tcp->tcp_swnd) : tcp->tcp_snxt; in tcp_ack_mp()
2193 if (tcp->tcp_valid_bits) { in tcp_ack_mp()
2198 return (tcp_xmit_mp(tcp, NULL, 0, NULL, NULL, seq_no, B_FALSE, in tcp_ack_mp()
2216 if (tcp->tcp_snd_sack_ok && tcp->tcp_num_sack_blk > 0) { in tcp_ack_mp()
2217 num_sack_blk = MIN(tcp->tcp_max_sack_blk, in tcp_ack_mp()
2218 tcp->tcp_num_sack_blk); in tcp_ack_mp()
2232 tcp->tcp_tcpha->tha_win = in tcp_ack_mp()
2233 htons(tcp->tcp_rwnd >> tcp->tcp_rcv_ws); in tcp_ack_mp()
2247 if (tcp->tcp_ecn_echo_on) in tcp_ack_mp()
2250 tcp->tcp_rack = tcp->tcp_rnxt; in tcp_ack_mp()
2251 tcp->tcp_rack_cnt = 0; in tcp_ack_mp()
2254 if (tcp->tcp_snd_ts_ok) { in tcp_ack_mp()
2259 U32_TO_BE32(tcp->tcp_ts_recent, in tcp_ack_mp()
2277 tmp = tcp->tcp_sack_list; in tcp_ack_mp()
2306 if (tcp->tcp_ip_forward_progress) { in tcp_ack_mp()
2307 tcp->tcp_ip_forward_progress = B_FALSE; in tcp_ack_mp()
2462 tcp_t *tcp = connp->conn_tcp; in tcp_input_data() local
2463 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_input_data()
2469 if (tcp->tcp_fused) { in tcp_input_data()
2471 tcp_unfuse(tcp); in tcp_input_data()
2526 __dtrace_tcp_void_ip_t *, iphdr, tcp_t *, tcp, in tcp_input_data()
2529 if (tcp->tcp_state == TCPS_TIME_WAIT) { in tcp_input_data()
2530 tcp_time_wait_processing(tcp, mp, seg_seq, seg_ack, in tcp_input_data()
2543 tcp->tcp_last_recv_time = LBOLT_FASTPATH; in tcp_input_data()
2549 DTRACE_PROBE2(tcp__trace__recv, mblk_t *, mp, tcp_t *, tcp); in tcp_input_data()
2571 if (tcp->tcp_detached || !pullupmsg(mp, -1)) { in tcp_input_data()
2578 if (SEQ_GT(seg_seq, tcp->tcp_rnxt)) { in tcp_input_data()
2596 switch (tcp->tcp_state) { in tcp_input_data()
2621 if (SEQ_LEQ(seg_ack, tcp->tcp_iss) || in tcp_input_data()
2622 SEQ_GT(seg_ack, tcp->tcp_snxt)) { in tcp_input_data()
2627 tcp, seg_ack, 0, TH_RST); in tcp_input_data()
2630 ASSERT(tcp->tcp_suna + 1 == seg_ack); in tcp_input_data()
2636 void_ip_t *, iphdr, tcp_t *, tcp, in tcp_input_data()
2638 (void) tcp_clean_death(tcp, ECONNREFUSED); in tcp_input_data()
2649 tcp_process_options(tcp, tcpha); in tcp_input_data()
2654 (void) tcp_rwnd_set(tcp, MSS_ROUNDUP(connp->conn_rcvbuf, in tcp_input_data()
2655 tcp->tcp_mss)); in tcp_input_data()
2658 if (tcp->tcp_ecn_ok) { in tcp_input_data()
2660 tcp->tcp_ecn_ok = B_FALSE; in tcp_input_data()
2669 tcp->tcp_irs = seg_seq; in tcp_input_data()
2670 tcp->tcp_rack = seg_seq; in tcp_input_data()
2671 tcp->tcp_rnxt = seg_seq + 1; in tcp_input_data()
2672 tcp->tcp_tcpha->tha_ack = htonl(tcp->tcp_rnxt); in tcp_input_data()
2673 if (!TCP_IS_DETACHED(tcp)) { in tcp_input_data()
2676 if (tcp->tcp_snd_sack_ok) in tcp_input_data()
2678 if (!tcp->tcp_loopback) in tcp_input_data()
2703 tcp->tcp_state = TCPS_ESTABLISHED; in tcp_input_data()
2704 if (!tcp_conn_con(tcp, iphdr, mp, in tcp_input_data()
2705 tcp->tcp_loopback ? &mp1 : NULL, ira)) { in tcp_input_data()
2706 tcp->tcp_state = TCPS_SYN_SENT; in tcp_input_data()
2712 tcp->tcp_ip_forward_progress = B_TRUE; in tcp_input_data()
2715 tcp->tcp_suna = tcp->tcp_iss + 1; in tcp_input_data()
2716 tcp->tcp_valid_bits &= ~TCP_ISS_VALID; in tcp_input_data()
2723 if (tcp->tcp_rexmit) { in tcp_input_data()
2724 tcp->tcp_rexmit = B_FALSE; in tcp_input_data()
2725 tcp->tcp_rexmit_nxt = tcp->tcp_snxt; in tcp_input_data()
2726 tcp->tcp_rexmit_max = tcp->tcp_snxt; in tcp_input_data()
2727 tcp->tcp_ms_we_have_waited = 0; in tcp_input_data()
2736 tcp_t *, tcp, uint32_t, tcp->tcp_cwnd, in tcp_input_data()
2737 uint32_t, tcp->tcp_mss); in tcp_input_data()
2738 tcp->tcp_cwnd = tcp->tcp_mss; in tcp_input_data()
2741 tcp->tcp_swl1 = seg_seq; in tcp_input_data()
2742 tcp->tcp_swl2 = seg_ack; in tcp_input_data()
2745 tcp->tcp_swnd = new_swnd; in tcp_input_data()
2746 if (new_swnd > tcp->tcp_max_swnd) in tcp_input_data()
2747 tcp->tcp_max_swnd = new_swnd; in tcp_input_data()
2760 ip_xmit_attr_t *, tcp->tcp_connp->conn_ixa, in tcp_input_data()
2761 void_ip_t *, iphdr, tcp_t *, tcp, tcph_t *, tcpha); in tcp_input_data()
2765 connp->conn_ixa, void, NULL, tcp_t *, tcp, in tcp_input_data()
2776 if (tcp->tcp_loopback) { in tcp_input_data()
2779 ASSERT(!tcp->tcp_unfusable); in tcp_input_data()
2789 if ((ack_mp = tcp_ack_mp(tcp)) != NULL) { in tcp_input_data()
2790 if (tcp->tcp_ack_tid != 0) { in tcp_input_data()
2791 (void) TCP_TIMER_CANCEL(tcp, in tcp_input_data()
2792 tcp->tcp_ack_tid); in tcp_input_data()
2793 tcp->tcp_ack_tid = 0; in tcp_input_data()
2795 tcp_send_data(tcp, ack_mp); in tcp_input_data()
2810 tcp->tcp_connid, in tcp_input_data()
2827 tcp->tcp_unfusable = B_TRUE; in tcp_input_data()
2837 tcp->tcp_connid, ira->ira_cred, in tcp_input_data()
2850 if (tcp->tcp_unsent) in tcp_input_data()
2862 tcp->tcp_state = TCPS_SYN_RCVD; in tcp_input_data()
2864 connp->conn_ixa, void_ip_t *, NULL, tcp_t *, tcp, in tcp_input_data()
2866 mp1 = tcp_xmit_mp(tcp, tcp->tcp_xmit_head, tcp->tcp_mss, in tcp_input_data()
2867 NULL, NULL, tcp->tcp_iss, B_FALSE, NULL, B_FALSE); in tcp_input_data()
2869 tcp_send_data(tcp, mp1); in tcp_input_data()
2870 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_input_data()
2885 if ((flags & TH_SYN) && !tcp->tcp_active_open) { in tcp_input_data()
2888 tcp, seg_ack, 0, TH_RST); in tcp_input_data()
2897 if (SEQ_LEQ(seg_ack, tcp->tcp_suna) || in tcp_input_data()
2898 SEQ_GT(seg_ack, tcp->tcp_snxt)) { in tcp_input_data()
2901 tcp, seg_ack, 0, TH_RST); in tcp_input_data()
2910 pinit_wnd = ntohs(tcpha->tha_win) << tcp->tcp_snd_ws; in tcp_input_data()
2911 if (pinit_wnd < tcp->tcp_mss && in tcp_input_data()
2915 tcp->tcp_second_ctimer_threshold = in tcp_input_data()
2930 ASSERT(!TCP_IS_SOCKET(tcp)); in tcp_input_data()
2981 if (TCP_IS_DETACHED_NONEAGER(tcp) && in tcp_input_data()
2982 (seg_len > 0 && SEQ_GT(seg_seq + seg_len, tcp->tcp_rnxt))) { in tcp_input_data()
2984 DTRACE_PROBE2(tcp__trace__recv, mblk_t *, mp, tcp_t *, tcp); in tcp_input_data()
2986 tcp_xmit_ctl("new data when detached", tcp, in tcp_input_data()
2987 tcp->tcp_snxt, 0, TH_RST); in tcp_input_data()
2988 (void) tcp_clean_death(tcp, EPROTO); in tcp_input_data()
2995 ((tcpha->tha_flags & TH_SYN) ? 0 : tcp->tcp_snd_ws); in tcp_input_data()
3001 if (tcp->tcp_snd_ts_ok || tcp->tcp_snd_sack_ok) { in tcp_input_data()
3003 if (tcp->tcp_snd_sack_ok) in tcp_input_data()
3004 tcpopt.tcp = tcp; in tcp_input_data()
3006 tcpopt.tcp = NULL; in tcp_input_data()
3015 (seg_seq + 1 == tcp->tcp_rnxt); in tcp_input_data()
3016 if (tcp->tcp_snd_ts_ok && !(flags & TH_RST) && !keepalive) { in tcp_input_data()
3031 DTRACE_TCP1(droppedtimestamp, tcp_t *, tcp); in tcp_input_data()
3036 if (!tcp_paws_check(tcp, &tcpopt)) { in tcp_input_data()
3048 mss = tcp->tcp_mss; in tcp_input_data()
3049 gap = seg_seq - tcp->tcp_rnxt; in tcp_input_data()
3050 rgap = tcp->tcp_rwnd - (gap + seg_len); in tcp_input_data()
3058 if (seg_seq == tcp->tcp_irs && (flags & TH_SYN) && in tcp_input_data()
3093 if (SEQ_GEQ(seg_seq + seg_len - gap, tcp->tcp_rack) && in tcp_input_data()
3094 tcp->tcp_rack_cnt >= 1 && in tcp_input_data()
3095 tcp->tcp_rack_abs_max > 2) { in tcp_input_data()
3096 tcp->tcp_rack_abs_max--; in tcp_input_data()
3098 tcp->tcp_rack_cur_max = 1; in tcp_input_data()
3113 seg_len, tcp->tcp_rnxt, tcp->tcp_snxt, in tcp_input_data()
3114 tcp_display(tcp, NULL, in tcp_input_data()
3154 seg_seq = tcp->tcp_rnxt; in tcp_input_data()
3183 if (tcp->tcp_rwnd == 0) { in tcp_input_data()
3185 tcp->tcp_cs.tcp_in_zwnd_probes++; in tcp_input_data()
3238 (!tcp->tcp_urp_last_valid || SEQ_GT(urp + seg_seq, in tcp_input_data()
3239 tcp->tcp_urp_last))) { in tcp_input_data()
3241 if (!TCP_IS_DETACHED(tcp)) { in tcp_input_data()
3252 if (!TCP_IS_DETACHED(tcp) && in tcp_input_data()
3269 freemsg(tcp->tcp_urp_mark_mp); in tcp_input_data()
3270 tcp->tcp_urp_mark_mp = mp1; in tcp_input_data()
3273 tcp->tcp_urp_last_valid = B_TRUE; in tcp_input_data()
3274 tcp->tcp_urp_last = urp + seg_seq; in tcp_input_data()
3282 if (tcp->tcp_rwnd == 0 && seg_seq == tcp->tcp_rnxt) { in tcp_input_data()
3313 if (tcp->tcp_ecn_ok) { in tcp_input_data()
3315 tcp->tcp_ecn_echo_on = B_FALSE; in tcp_input_data()
3326 tcp->tcp_ecn_echo_on = B_TRUE; in tcp_input_data()
3333 tcp->tcp_ecn_echo_on = B_TRUE; in tcp_input_data()
3342 if (tcp->tcp_snd_ts_ok && !(flags & TH_RST) && in tcp_input_data()
3343 TSTMP_GEQ(tcpopt.tcp_opt_ts_val, tcp->tcp_ts_recent) && in tcp_input_data()
3344 SEQ_LEQ(seg_seq, tcp->tcp_rack)) { in tcp_input_data()
3345 tcp->tcp_ts_recent = tcpopt.tcp_opt_ts_val; in tcp_input_data()
3346 tcp->tcp_last_rcv_lbolt = LBOLT_FASTPATH64; in tcp_input_data()
3349 if (seg_seq != tcp->tcp_rnxt || tcp->tcp_reass_head) { in tcp_input_data()
3358 tcp->tcp_valid_bits |= TCP_OFO_FIN_VALID; in tcp_input_data()
3359 tcp->tcp_ofo_fin_seq = seg_seq + seg_len; in tcp_input_data()
3365 if (tcp->tcp_snd_sack_ok) { in tcp_input_data()
3366 tcp_sack_insert(tcp->tcp_sack_list, in tcp_input_data()
3368 &(tcp->tcp_num_sack_blk)); in tcp_input_data()
3375 mp = tcp_reass(tcp, mp, seg_seq); in tcp_input_data()
3383 seg_seq = tcp->tcp_rnxt; in tcp_input_data()
3389 if ((tcp->tcp_valid_bits & TCP_OFO_FIN_VALID) && in tcp_input_data()
3390 seg_seq + seg_len == tcp->tcp_ofo_fin_seq) { in tcp_input_data()
3392 tcp->tcp_valid_bits &= in tcp_input_data()
3395 if (tcp->tcp_reass_tid != 0) { in tcp_input_data()
3396 (void) TCP_TIMER_CANCEL(tcp, in tcp_input_data()
3397 tcp->tcp_reass_tid); in tcp_input_data()
3402 if (tcp->tcp_reass_head != NULL) { in tcp_input_data()
3403 tcp->tcp_reass_tid = TCP_TIMER( in tcp_input_data()
3404 tcp, tcp_reass_timer, in tcp_input_data()
3407 tcp->tcp_reass_tid = 0; in tcp_input_data()
3425 tcp->tcp_reass_tid == 0) { in tcp_input_data()
3426 tcp->tcp_reass_tid = TCP_TIMER(tcp, in tcp_input_data()
3435 tcp->tcp_cs.tcp_in_data_inorder_segs++; in tcp_input_data()
3436 tcp->tcp_cs.tcp_in_data_inorder_bytes += seg_len; in tcp_input_data()
3443 if ((tcp->tcp_valid_bits & TCP_OFO_FIN_VALID) && in tcp_input_data()
3444 seg_seq + seg_len == tcp->tcp_ofo_fin_seq) { in tcp_input_data()
3446 tcp->tcp_valid_bits &= ~TCP_OFO_FIN_VALID; in tcp_input_data()
3452 switch (tcp->tcp_state) { in tcp_input_data()
3454 (void) tcp_clean_death(tcp, ECONNREFUSED); in tcp_input_data()
3460 (void) tcp_clean_death(tcp, ECONNRESET); in tcp_input_data()
3464 (void) tcp_clean_death(tcp, 0); in tcp_input_data()
3467 ASSERT(tcp->tcp_state != TCPS_TIME_WAIT); in tcp_input_data()
3468 (void) tcp_clean_death(tcp, ENXIO); in tcp_input_data()
3482 ASSERT(SEQ_GEQ(seg_seq, tcp->tcp_rnxt) && in tcp_input_data()
3483 SEQ_LEQ(seg_seq, tcp->tcp_rnxt + tcp->tcp_rwnd)); in tcp_input_data()
3490 seg_ack = tcp->tcp_snxt; in tcp_input_data()
3492 tcp_xmit_ctl("TH_SYN", tcp, seg_ack, seg_seq + 1, in tcp_input_data()
3494 ASSERT(tcp->tcp_state != TCPS_TIME_WAIT); in tcp_input_data()
3495 (void) tcp_clean_death(tcp, ECONNRESET); in tcp_input_data()
3504 if (!tcp->tcp_urp_last_valid || in tcp_input_data()
3505 SEQ_GT(urp + seg_seq, tcp->tcp_urp_last)) { in tcp_input_data()
3521 if (!TCP_IS_DETACHED(tcp)) { in tcp_input_data()
3544 if (!TCP_IS_DETACHED(tcp) && in tcp_input_data()
3563 freemsg(tcp->tcp_urp_mark_mp); in tcp_input_data()
3564 tcp->tcp_urp_mark_mp = mp1; in tcp_input_data()
3570 seg_seq, urp, tcp->tcp_urp_last, in tcp_input_data()
3571 tcp_display(tcp, NULL, DISP_PORT_ONLY)); in tcp_input_data()
3574 tcp->tcp_urp_last_valid = B_TRUE; in tcp_input_data()
3575 tcp->tcp_urp_last = urp + seg_seq; in tcp_input_data()
3576 } else if (tcp->tcp_urp_mark_mp != NULL) { in tcp_input_data()
3621 tmp_rnxt = tcp->tcp_rnxt; in tcp_input_data()
3631 if (tmp_rnxt == tcp->tcp_rnxt) { in tcp_input_data()
3656 tmp_rnxt = tcp->tcp_rnxt; in tcp_input_data()
3666 if (tmp_rnxt == tcp->tcp_rnxt) { in tcp_input_data()
3691 } else if (!tcp->tcp_urp_mp) { in tcp_input_data()
3705 ASSERT(tcp->tcp_urp_mark_mp); in tcp_input_data()
3706 tcp->tcp_urp_mark_mp->b_flag &= in tcp_input_data()
3708 tcp->tcp_urp_mark_mp->b_flag |= in tcp_input_data()
3718 tcp->tcp_urp_mp = mp1; in tcp_input_data()
3722 tcp_display(tcp, NULL, in tcp_input_data()
3731 freemsg(tcp->tcp_urp_mark_mp); in tcp_input_data()
3732 tcp->tcp_urp_mark_mp = NULL; in tcp_input_data()
3760 if (!IPCL_IS_NONSTR(tcp->tcp_connp)) { in tcp_input_data()
3763 freemsg(tcp->tcp_urp_mark_mp); in tcp_input_data()
3764 tcp->tcp_urp_mark_mp = NULL; in tcp_input_data()
3766 } else if (tcp->tcp_urp_mark_mp != NULL) { in tcp_input_data()
3768 tcp->tcp_urp_mark_mp->b_flag &= in tcp_input_data()
3770 tcp->tcp_urp_mark_mp->b_flag |= in tcp_input_data()
3778 tcp_display(tcp, NULL, DISP_PORT_ONLY)); in tcp_input_data()
3786 urp - seg_len, tcp_display(tcp, NULL, in tcp_input_data()
3798 bytes_acked = (int)(seg_ack - tcp->tcp_suna); in tcp_input_data()
3801 tcp->tcp_ip_forward_progress = B_TRUE; in tcp_input_data()
3802 if (tcp->tcp_state == TCPS_SYN_RCVD) { in tcp_input_data()
3809 tcp->tcp_state = TCPS_ESTABLISHED; in tcp_input_data()
3816 if (tcp->tcp_active_open) { in tcp_input_data()
3817 if (!tcp_conn_con(tcp, iphdr, mp, NULL, ira)) { in tcp_input_data()
3819 tcp->tcp_state = TCPS_SYN_RCVD; in tcp_input_data()
3826 if (tcp->tcp_loopback) { in tcp_input_data()
3828 tcp->tcp_unfusable = B_TRUE; in tcp_input_data()
3836 iphdr, tcp_t *, tcp, tcph_t *, tcpha); in tcp_input_data()
3851 if (!tcp_newconn_notify(tcp, ira)) { in tcp_input_data()
3859 tcp->tcp_state = TCPS_SYN_RCVD; in tcp_input_data()
3864 ASSERT(TCP_IS_DETACHED(tcp)); in tcp_input_data()
3865 (void) tcp_close_detached(tcp); in tcp_input_data()
3881 iphdr, tcp_t *, tcp, tcph_t *, tcpha); in tcp_input_data()
3887 tcp_t *listener = tcp->tcp_listener; in tcp_input_data()
3888 mblk_t *mp = tcp->tcp_conn.tcp_eager_conn_ind; in tcp_input_data()
3890 tcp->tcp_tconnind_started = B_TRUE; in tcp_input_data()
3891 tcp->tcp_conn.tcp_eager_conn_ind = NULL; in tcp_input_data()
3924 } else if (!tcp->tcp_loopback) { in tcp_input_data()
3941 iphdr, tcp_t *, tcp, tcph_t *, tcpha); in tcp_input_data()
3945 tcp->tcp_suna = tcp->tcp_iss + 1; /* One for the SYN */ in tcp_input_data()
3948 tcp->tcp_ip_forward_progress = B_TRUE; in tcp_input_data()
3955 if (tcp->tcp_rexmit) { in tcp_input_data()
3956 tcp->tcp_rexmit = B_FALSE; in tcp_input_data()
3957 tcp->tcp_rexmit_nxt = tcp->tcp_snxt; in tcp_input_data()
3958 tcp->tcp_rexmit_max = tcp->tcp_snxt; in tcp_input_data()
3959 tcp->tcp_ms_we_have_waited = 0; in tcp_input_data()
3961 tcp_t *, tcp, uint32_t, tcp->tcp_cwnd, in tcp_input_data()
3962 uint32_t, tcp->tcp_mss); in tcp_input_data()
3963 tcp->tcp_cwnd = mss; in tcp_input_data()
3977 tcp->tcp_swnd = 0; in tcp_input_data()
3979 if (new_swnd > tcp->tcp_max_swnd) in tcp_input_data()
3980 tcp->tcp_max_swnd = new_swnd; in tcp_input_data()
3981 tcp->tcp_swl1 = seg_seq; in tcp_input_data()
3982 tcp->tcp_swl2 = seg_ack; in tcp_input_data()
3983 tcp->tcp_valid_bits &= ~TCP_ISS_VALID; in tcp_input_data()
3987 connp->conn_ixa, void, NULL, tcp_t *, tcp, void, NULL, in tcp_input_data()
3991 if (tcp->tcp_loopback && do_tcp_fusion) in tcp_input_data()
3992 tcp_fuse(tcp, iphdr, tcpha); in tcp_input_data()
4004 if (tcp->tcp_cwr && SEQ_GT(seg_ack, tcp->tcp_cwr_snd_max)) in tcp_input_data()
4005 tcp->tcp_cwr = B_FALSE; in tcp_input_data()
4006 if (tcp->tcp_ecn_ok && (flags & TH_ECE) && !tcp->tcp_cwr) { in tcp_input_data()
4007 cc_cong_signal(tcp, seg_ack, CC_ECN); in tcp_input_data()
4012 if (tcp->tcp_cwnd == 0) in tcp_input_data()
4013 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_input_data()
4014 tcp->tcp_cwr = B_TRUE; in tcp_input_data()
4021 tcp->tcp_cwr_snd_max = tcp->tcp_snxt; in tcp_input_data()
4024 mp1 = tcp->tcp_xmit_head; in tcp_input_data()
4026 if (!ofo_seg && seg_len == 0 && new_swnd == tcp->tcp_swnd) { in tcp_input_data()
4038 if (mp1 && tcp->tcp_suna != tcp->tcp_snxt && in tcp_input_data()
4039 ! tcp->tcp_rexmit) { in tcp_input_data()
4041 if ((dupack_cnt = ++tcp->tcp_dupack_cnt) < in tcp_input_data()
4043 cc_ack_received(tcp, seg_ack, in tcp_input_data()
4066 if (tcp->tcp_unsent > 0 && in tcp_input_data()
4067 (!tcp->tcp_snd_sack_ok || in tcp_input_data()
4068 (tcp->tcp_snd_sack_ok && in tcp_input_data()
4069 tcp->tcp_notsack_list != NULL))) { in tcp_input_data()
4070 tcp->tcp_cwnd += mss << in tcp_input_data()
4071 (tcp->tcp_dupack_cnt - 1); in tcp_input_data()
4090 if (!tcp->tcp_cwr) { in tcp_input_data()
4091 cc_cong_signal(tcp, seg_ack, in tcp_input_data()
4093 cc_ack_received(tcp, seg_ack, in tcp_input_data()
4096 if (tcp->tcp_ecn_ok) { in tcp_input_data()
4097 tcp->tcp_cwr = B_TRUE; in tcp_input_data()
4098 tcp->tcp_cwr_snd_max = tcp->tcp_snxt; in tcp_input_data()
4099 tcp->tcp_ecn_cwr_sent = B_FALSE; in tcp_input_data()
4111 if ((tcp->tcp_valid_bits & TCP_FSS_VALID) && in tcp_input_data()
4112 (tcp->tcp_unsent == 0)) { in tcp_input_data()
4113 tcp->tcp_rexmit_max = tcp->tcp_fss; in tcp_input_data()
4115 tcp->tcp_rexmit_max = tcp->tcp_snxt; in tcp_input_data()
4133 if (tcp->tcp_snd_sack_ok) { in tcp_input_data()
4134 if (tcp->tcp_notsack_list != NULL) { in tcp_input_data()
4135 tcp->tcp_pipe = tcp->tcp_snxt - in tcp_input_data()
4136 tcp->tcp_fack; in tcp_input_data()
4137 tcp->tcp_sack_snxt = seg_ack; in tcp_input_data()
4148 tcp->tcp_pipe = in tcp_input_data()
4149 tcp->tcp_cwnd_ssthresh; in tcp_input_data()
4156 cc_ack_received(tcp, seg_ack, in tcp_input_data()
4164 if (tcp->tcp_snd_sack_ok && in tcp_input_data()
4165 tcp->tcp_notsack_list != NULL) { in tcp_input_data()
4167 tcp->tcp_pipe -= mss; in tcp_input_data()
4168 if (tcp->tcp_pipe < 0) in tcp_input_data()
4169 tcp->tcp_pipe = 0; in tcp_input_data()
4176 cwnd = tcp->tcp_cwnd + mss; in tcp_input_data()
4177 if (cwnd > tcp->tcp_cwnd_max) in tcp_input_data()
4178 cwnd = tcp->tcp_cwnd_max; in tcp_input_data()
4180 tcp_t *, tcp, in tcp_input_data()
4181 uint32_t, tcp->tcp_cwnd, in tcp_input_data()
4183 tcp->tcp_cwnd = cwnd; in tcp_input_data()
4184 if (tcp->tcp_unsent > 0) in tcp_input_data()
4189 } else if (tcp->tcp_zero_win_probe) { in tcp_input_data()
4198 tcp->tcp_zero_win_probe = 0; in tcp_input_data()
4199 tcp->tcp_timer_backoff = 0; in tcp_input_data()
4200 tcp->tcp_ms_we_have_waited = 0; in tcp_input_data()
4212 if (!tcp->tcp_rexmit) { in tcp_input_data()
4213 tcp->tcp_rexmit = B_TRUE; in tcp_input_data()
4214 tcp->tcp_dupack_cnt = 0; in tcp_input_data()
4215 tcp->tcp_rexmit_nxt = tcp->tcp_suna; in tcp_input_data()
4216 tcp->tcp_rexmit_max = tcp->tcp_suna + 1; in tcp_input_data()
4250 if (SEQ_GT(seg_ack, tcp->tcp_snxt)) { in tcp_input_data()
4251 if ((tcp->tcp_is_wnd_shrnk) && in tcp_input_data()
4252 (SEQ_LEQ(seg_ack, tcp->tcp_snxt_shrunk))) { in tcp_input_data()
4255 data_acked_ahead_snxt = seg_ack - tcp->tcp_snxt; in tcp_input_data()
4256 tcp_update_xmit_tail(tcp, seg_ack); in tcp_input_data()
4257 tcp->tcp_unsent -= data_acked_ahead_snxt; in tcp_input_data()
4274 ++tcp->tcp_in_ack_unsent > in tcp_input_data()
4277 if (tcp->tcp_in_ack_unsent > 2 * in tcp_input_data()
4279 (void) tcp_clean_death(tcp, EPROTO); in tcp_input_data()
4283 mp = tcp_ack_mp(tcp); in tcp_input_data()
4287 tcp_send_data(tcp, mp); in tcp_input_data()
4291 } else if (tcp->tcp_is_wnd_shrnk && SEQ_GEQ(seg_ack, in tcp_input_data()
4292 tcp->tcp_snxt_shrunk)) { in tcp_input_data()
4293 tcp->tcp_is_wnd_shrnk = B_FALSE; in tcp_input_data()
4300 if (tcp->tcp_snd_sack_ok && tcp->tcp_notsack_list != NULL) { in tcp_input_data()
4301 tcp_notsack_remove(&(tcp->tcp_notsack_list), seg_ack, in tcp_input_data()
4302 &(tcp->tcp_num_notsack_blk), &(tcp->tcp_cnt_notsack_list)); in tcp_input_data()
4311 if (tcp->tcp_dupack_cnt >= tcps->tcps_dupack_fast_retransmit) { in tcp_input_data()
4312 ASSERT(tcp->tcp_rexmit == B_FALSE); in tcp_input_data()
4313 if (SEQ_GEQ(seg_ack, tcp->tcp_rexmit_max)) { in tcp_input_data()
4314 tcp->tcp_dupack_cnt = 0; in tcp_input_data()
4316 cc_post_recovery(tcp, seg_ack); in tcp_input_data()
4318 tcp->tcp_rexmit_max = seg_ack; in tcp_input_data()
4324 if (tcp->tcp_snd_sack_ok) { in tcp_input_data()
4325 TCP_NOTSACK_REMOVE_ALL(tcp->tcp_notsack_list, in tcp_input_data()
4326 tcp); in tcp_input_data()
4329 if (tcp->tcp_snd_sack_ok && in tcp_input_data()
4330 tcp->tcp_notsack_list != NULL) { in tcp_input_data()
4332 tcp->tcp_pipe -= mss; in tcp_input_data()
4333 if (tcp->tcp_pipe < 0) in tcp_input_data()
4334 tcp->tcp_pipe = 0; in tcp_input_data()
4347 cwnd = tcp->tcp_cwnd_ssthresh + in tcp_input_data()
4350 tcp_t *, tcp, uint32_t, tcp->tcp_cwnd, in tcp_input_data()
4352 tcp->tcp_cwnd = cwnd; in tcp_input_data()
4353 tcp->tcp_cwnd_cnt = tcp->tcp_cwnd; in tcp_input_data()
4358 tcp->tcp_dupack_cnt = 0; in tcp_input_data()
4359 if (tcp->tcp_rexmit) { in tcp_input_data()
4373 if (SEQ_LEQ(seg_ack, tcp->tcp_rexmit_max)) { in tcp_input_data()
4374 if (SEQ_GT(seg_ack, tcp->tcp_rexmit_nxt)) { in tcp_input_data()
4375 tcp->tcp_rexmit_nxt = seg_ack; in tcp_input_data()
4377 if (seg_ack != tcp->tcp_rexmit_max) { in tcp_input_data()
4381 tcp->tcp_rexmit = B_FALSE; in tcp_input_data()
4382 tcp->tcp_rexmit_nxt = tcp->tcp_snxt; in tcp_input_data()
4384 tcp->tcp_ms_we_have_waited = 0; in tcp_input_data()
4390 tcp->tcp_suna = seg_ack; in tcp_input_data()
4391 if (tcp->tcp_zero_win_probe != 0) { in tcp_input_data()
4392 tcp->tcp_zero_win_probe = 0; in tcp_input_data()
4393 tcp->tcp_timer_backoff = 0; in tcp_input_data()
4412 if (!tcp->tcp_ecn_ok || !(flags & TH_ECE)) { in tcp_input_data()
4413 if (IN_RECOVERY(tcp->tcp_ccv.flags)) { in tcp_input_data()
4414 EXIT_RECOVERY(tcp->tcp_ccv.flags); in tcp_input_data()
4416 cc_ack_received(tcp, seg_ack, bytes_acked, CC_ACK); in tcp_input_data()
4420 if ((tcp->tcp_valid_bits & TCP_URG_VALID) && in tcp_input_data()
4421 SEQ_GT(seg_ack, tcp->tcp_urg)) in tcp_input_data()
4422 tcp->tcp_valid_bits &= ~TCP_URG_VALID; in tcp_input_data()
4434 if (SEQ_GT(seg_ack, tcp->tcp_csuna)) { in tcp_input_data()
4442 tcp_set_rto(tcp, gethrtime() - in tcp_input_data()
4449 tcp->tcp_csuna = seg_ack; in tcp_input_data()
4450 if (tcp->tcp_set_timer == 1) { in tcp_input_data()
4451 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_input_data()
4452 tcp->tcp_set_timer = 0; in tcp_input_data()
4490 if (tcp->tcp_snd_zcopy_aware && in tcp_input_data()
4492 tcp_zcopy_notify(tcp); in tcp_input_data()
4497 tcp->tcp_xmit_tail = NULL; in tcp_input_data()
4502 if (tcp->tcp_timer_tid != 0 && in tcp_input_data()
4503 tcp->tcp_snxt == tcp->tcp_suna) { in tcp_input_data()
4504 (void) TCP_TIMER_CANCEL(tcp, in tcp_input_data()
4505 tcp->tcp_timer_tid); in tcp_input_data()
4506 tcp->tcp_timer_tid = 0; in tcp_input_data()
4510 if (mp2 != tcp->tcp_xmit_tail) in tcp_input_data()
4512 tcp->tcp_xmit_tail = mp1; in tcp_input_data()
4515 tcp->tcp_xmit_tail_unsent = (int)(mp1->b_wptr - in tcp_input_data()
4526 ASSERT(tcp->tcp_fin_sent); in tcp_input_data()
4527 tcp->tcp_xmit_tail = NULL; in tcp_input_data()
4528 if (tcp->tcp_fin_sent) { in tcp_input_data()
4530 if (!tcp->tcp_fin_acked) in tcp_input_data()
4531 tcp->tcp_ip_forward_progress = B_TRUE; in tcp_input_data()
4532 tcp->tcp_fin_acked = B_TRUE; in tcp_input_data()
4533 if (tcp->tcp_linger_tid != 0 && in tcp_input_data()
4534 TCP_TIMER_CANCEL(tcp, in tcp_input_data()
4535 tcp->tcp_linger_tid) >= 0) { in tcp_input_data()
4536 tcp_stop_lingering(tcp); in tcp_input_data()
4556 tcp_xmit_ctl(NULL, tcp, tcp->tcp_snxt, in tcp_input_data()
4557 tcp->tcp_rnxt, TH_RST|TH_ACK); in tcp_input_data()
4560 tcp_display(tcp, NULL, in tcp_input_data()
4566 ASSERT(mp2 != tcp->tcp_xmit_tail); in tcp_input_data()
4568 if (tcp->tcp_unsent) { in tcp_input_data()
4572 tcp->tcp_xmit_head = mp1; in tcp_input_data()
4585 if (SEQ_LT(tcp->tcp_swl2, seg_ack) || in tcp_input_data()
4586 SEQ_LT(tcp->tcp_swl1, seg_seq) || in tcp_input_data()
4587 (tcp->tcp_swl1 == seg_seq && new_swnd > tcp->tcp_swnd)) { in tcp_input_data()
4596 if (tcp->tcp_unsent && new_swnd > tcp->tcp_swnd) in tcp_input_data()
4598 tcp->tcp_swnd = new_swnd; in tcp_input_data()
4599 if (new_swnd > tcp->tcp_max_swnd) in tcp_input_data()
4600 tcp->tcp_max_swnd = new_swnd; in tcp_input_data()
4601 tcp->tcp_swl1 = seg_seq; in tcp_input_data()
4602 tcp->tcp_swl2 = seg_ack; in tcp_input_data()
4605 if (tcp->tcp_state > TCPS_ESTABLISHED) { in tcp_input_data()
4607 switch (tcp->tcp_state) { in tcp_input_data()
4609 if (tcp->tcp_fin_acked) { in tcp_input_data()
4610 tcp->tcp_state = TCPS_FIN_WAIT_2; in tcp_input_data()
4613 void, NULL, tcp_t *, tcp, void, NULL, in tcp_input_data()
4631 TCP_TIMER_RESTART(tcp, in tcp_input_data()
4632 tcp->tcp_fin_wait_2_flush_interval); in tcp_input_data()
4639 if (tcp->tcp_fin_acked) { in tcp_input_data()
4640 (void) tcp_clean_death(tcp, 0); in tcp_input_data()
4645 if (tcp->tcp_fin_acked) { in tcp_input_data()
4646 SET_TIME_WAIT(tcps, tcp, connp); in tcp_input_data()
4649 NULL, tcp_t *, tcp, void, NULL, int32_t, in tcp_input_data()
4657 ASSERT(tcp->tcp_state != TCPS_TIME_WAIT); in tcp_input_data()
4664 if (!tcp->tcp_fin_rcvd) { in tcp_input_data()
4665 tcp->tcp_fin_rcvd = B_TRUE; in tcp_input_data()
4666 tcp->tcp_rnxt++; in tcp_input_data()
4667 tcpha = tcp->tcp_tcpha; in tcp_input_data()
4668 tcpha->tha_ack = htonl(tcp->tcp_rnxt); in tcp_input_data()
4676 if (!TCP_IS_DETACHED(tcp) && (IPCL_IS_NONSTR(connp) || in tcp_input_data()
4677 (tcp->tcp_listener == NULL && in tcp_input_data()
4678 !tcp->tcp_hard_binding))) in tcp_input_data()
4680 switch (tcp->tcp_state) { in tcp_input_data()
4682 tcp->tcp_state = TCPS_CLOSE_WAIT; in tcp_input_data()
4685 void, NULL, tcp_t *, tcp, void, NULL, in tcp_input_data()
4690 tcp->tcp_state = TCPS_CLOSE_WAIT; in tcp_input_data()
4693 void, NULL, tcp_t *, tcp, void, NULL, in tcp_input_data()
4698 if (!tcp->tcp_fin_acked) { in tcp_input_data()
4699 tcp->tcp_state = TCPS_CLOSING; in tcp_input_data()
4702 void, NULL, tcp_t *, tcp, void, in tcp_input_data()
4708 SET_TIME_WAIT(tcps, tcp, connp); in tcp_input_data()
4711 NULL, tcp_t *, tcp, void, NULL, int32_t, in tcp_input_data()
4741 tcpha = tcp->tcp_tcpha; in tcp_input_data()
4742 tcp->tcp_rack_cnt++; in tcp_input_data()
4746 cur_max = tcp->tcp_rack_cur_max; in tcp_input_data()
4747 if (tcp->tcp_rack_cnt >= cur_max) { in tcp_input_data()
4754 if (cur_max > tcp->tcp_rack_abs_max) in tcp_input_data()
4755 tcp->tcp_rack_cur_max = tcp->tcp_rack_abs_max; in tcp_input_data()
4757 tcp->tcp_rack_cur_max = cur_max; in tcp_input_data()
4758 } else if (tcp->tcp_quickack) { in tcp_input_data()
4761 } else if (TCP_IS_DETACHED(tcp)) { in tcp_input_data()
4774 ASSERT((uintptr_t)(tcp->tcp_rnxt - tcp->tcp_rack) <= in tcp_input_data()
4776 udif = (int)(tcp->tcp_rnxt - tcp->tcp_rack); in tcp_input_data()
4786 tcp->tcp_rnxt += seg_len; in tcp_input_data()
4787 tcpha->tha_ack = htonl(tcp->tcp_rnxt); in tcp_input_data()
4793 if (tcp->tcp_snd_sack_ok && tcp->tcp_num_sack_blk > 0) { in tcp_input_data()
4794 tcp_sack_remove(tcp->tcp_sack_list, tcp->tcp_rnxt, in tcp_input_data()
4795 &(tcp->tcp_num_sack_blk)); in tcp_input_data()
4798 if (tcp->tcp_urp_mp) { in tcp_input_data()
4799 tcp->tcp_urp_mp->b_cont = mp; in tcp_input_data()
4800 mp = tcp->tcp_urp_mp; in tcp_input_data()
4801 tcp->tcp_urp_mp = NULL; in tcp_input_data()
4803 tcp->tcp_urp_last_valid = B_FALSE; in tcp_input_data()
4807 tcp_display(tcp, NULL, DISP_PORT_ONLY)); in tcp_input_data()
4815 mp = tcp_input_add_ancillary(tcp, mp, &ipp, ira); in tcp_input_data()
4835 tcp->tcp_rwnd -= seg_len; in tcp_input_data()
4838 flags |= tcp_rwnd_reopen(tcp); in tcp_input_data()
4840 } else if (tcp->tcp_listener != NULL || tcp->tcp_hard_binding) { in tcp_input_data()
4851 tcp_rcv_enqueue(tcp, mp, seg_len, ira->ira_cred); in tcp_input_data()
4856 if (tcp->tcp_rcv_list != NULL) { in tcp_input_data()
4857 flags |= tcp_rcv_drain(tcp); in tcp_input_data()
4859 ASSERT(tcp->tcp_rcv_list == NULL || in tcp_input_data()
4860 tcp->tcp_fused_sigurg); in tcp_input_data()
4866 tcp_display(tcp, NULL, in tcp_input_data()
4878 tcp->tcp_rwnd -= seg_len; in tcp_input_data()
4880 tcp->tcp_rcv_cnt + seg_len >= connp->conn_rcvbuf >> 3) { in tcp_input_data()
4881 if (tcp->tcp_rcv_list != NULL) { in tcp_input_data()
4895 tcp_rcv_enqueue(tcp, mp, seg_len, in tcp_input_data()
4897 flags |= tcp_rcv_drain(tcp); in tcp_input_data()
4904 tcp->tcp_rwnd -= seg_len; in tcp_input_data()
4911 tcp_rcv_enqueue(tcp, mp, seg_len, ira->ira_cred); in tcp_input_data()
4918 if (tcp->tcp_rcv_list != NULL && tcp->tcp_push_tid == 0) { in tcp_input_data()
4923 if (!TCP_IS_DETACHED(tcp)) in tcp_input_data()
4924 tcp->tcp_push_tid = TCP_TIMER(tcp, in tcp_input_data()
4940 TH_LIMIT_XMIT)) && tcp->tcp_swnd != 0) { in tcp_input_data()
4942 uint32_t snd_size = tcp->tcp_snxt - tcp->tcp_suna; in tcp_input_data()
4947 if (snd_size > tcp->tcp_swnd) in tcp_input_data()
4948 snd_size = tcp->tcp_swnd; in tcp_input_data()
4949 mp1 = tcp_xmit_mp(tcp, tcp->tcp_xmit_head, snd_size, in tcp_input_data()
4950 NULL, NULL, tcp->tcp_suna, B_TRUE, &snd_size, in tcp_input_data()
4954 tcp->tcp_xmit_head->b_prev = in tcp_input_data()
4956 tcp->tcp_csuna = tcp->tcp_snxt; in tcp_input_data()
4960 tcp->tcp_cs.tcp_out_retrans_segs++; in tcp_input_data()
4961 tcp->tcp_cs.tcp_out_retrans_bytes += snd_size; in tcp_input_data()
4962 tcp_send_data(tcp, mp1); in tcp_input_data()
4966 tcp_sack_rexmit(tcp, &flags); in tcp_input_data()
4974 if (!tcp->tcp_rexmit) { in tcp_input_data()
4975 tcp_wput_data(tcp, NULL, B_FALSE); in tcp_input_data()
4977 tcp_ss_rexmit(tcp); in tcp_input_data()
4985 tcp->tcp_cwnd -= mss << (tcp->tcp_dupack_cnt - 1); in tcp_input_data()
4991 if (tcp->tcp_xmit_head != NULL) { in tcp_input_data()
4992 tcp->tcp_xmit_head->b_prev = in tcp_input_data()
5004 ASSERT(tcp->tcp_urp_mark_mp); in tcp_input_data()
5009 if (tcp->tcp_rcv_list != NULL) { in tcp_input_data()
5010 flags |= tcp_rcv_drain(tcp); in tcp_input_data()
5013 ASSERT(tcp->tcp_rcv_list == NULL || tcp->tcp_fused_sigurg); in tcp_input_data()
5014 mp1 = tcp->tcp_urp_mark_mp; in tcp_input_data()
5015 tcp->tcp_urp_mark_mp = NULL; in tcp_input_data()
5025 tcp_display(tcp, NULL, DISP_PORT_ONLY)); in tcp_input_data()
5033 mp1 = tcp_ack_mp(tcp); in tcp_input_data()
5036 tcp_send_data(tcp, mp1); in tcp_input_data()
5040 if (tcp->tcp_ack_tid != 0) { in tcp_input_data()
5041 (void) TCP_TIMER_CANCEL(tcp, tcp->tcp_ack_tid); in tcp_input_data()
5042 tcp->tcp_ack_tid = 0; in tcp_input_data()
5050 if (tcp->tcp_ack_tid == 0) { in tcp_input_data()
5051 tcp->tcp_ack_tid = TCP_TIMER(tcp, tcp_ack_timer, in tcp_input_data()
5052 tcp->tcp_localnet ? in tcp_input_data()
5066 ASSERT(IPCL_IS_NONSTR(connp) || tcp->tcp_listener == NULL); in tcp_input_data()
5067 ASSERT(!tcp->tcp_detached); in tcp_input_data()
5070 ASSERT(tcp->tcp_ordrel_mp == NULL); in tcp_input_data()
5071 tcp->tcp_ordrel_done = B_TRUE; in tcp_input_data()
5077 if (tcp->tcp_rcv_list != NULL) { in tcp_input_data()
5081 flags |= tcp_rcv_drain(tcp); in tcp_input_data()
5083 ASSERT(tcp->tcp_rcv_list == NULL || tcp->tcp_fused_sigurg); in tcp_input_data()
5085 mp1 = tcp->tcp_ordrel_mp; in tcp_input_data()
5086 tcp->tcp_ordrel_mp = NULL; in tcp_input_data()
5087 tcp->tcp_ordrel_done = B_TRUE; in tcp_input_data()
5103 tcp_input_add_ancillary(tcp_t *tcp, mblk_t *mp, ip_pkt_t *ipp, in tcp_input_add_ancillary() argument
5112 conn_t *connp = tcp->tcp_connp; in tcp_input_add_ancillary()
5119 ipp->ipp_type_of_service != tcp->tcp_recvtos && in tcp_input_add_ancillary()
5127 ira->ira_ruifindex != tcp->tcp_recvifindex) { in tcp_input_add_ancillary()
5134 ipp->ipp_hoplimit != tcp->tcp_recvhops) { in tcp_input_add_ancillary()
5140 ipp->ipp_tclass != tcp->tcp_recvtclass) { in tcp_input_add_ancillary()
5152 ip_cmpbuf(tcp->tcp_hopopts, tcp->tcp_hopoptslen, in tcp_input_add_ancillary()
5157 if (!ip_allocbuf((void **)&tcp->tcp_hopopts, in tcp_input_add_ancillary()
5158 &tcp->tcp_hopoptslen, (ipp->ipp_fields & IPPF_HOPOPTS), in tcp_input_add_ancillary()
5164 ip_cmpbuf(tcp->tcp_rthdrdstopts, tcp->tcp_rthdrdstoptslen, in tcp_input_add_ancillary()
5170 if (!ip_allocbuf((void **)&tcp->tcp_rthdrdstopts, in tcp_input_add_ancillary()
5171 &tcp->tcp_rthdrdstoptslen, in tcp_input_add_ancillary()
5178 ip_cmpbuf(tcp->tcp_rthdr, tcp->tcp_rthdrlen, in tcp_input_add_ancillary()
5183 if (!ip_allocbuf((void **)&tcp->tcp_rthdr, in tcp_input_add_ancillary()
5184 &tcp->tcp_rthdrlen, (ipp->ipp_fields & IPPF_RTHDR), in tcp_input_add_ancillary()
5191 ip_cmpbuf(tcp->tcp_dstopts, tcp->tcp_dstoptslen, in tcp_input_add_ancillary()
5196 if (!ip_allocbuf((void **)&tcp->tcp_dstopts, in tcp_input_add_ancillary()
5197 &tcp->tcp_dstoptslen, (ipp->ipp_fields & IPPF_DSTOPTS), in tcp_input_add_ancillary()
5238 tcp->tcp_recvtos = ipp->ipp_type_of_service; in tcp_input_add_ancillary()
5262 tcp->tcp_recvifindex = ifindex; in tcp_input_add_ancillary()
5276 tcp->tcp_recvhops = ipp->ipp_hoplimit; in tcp_input_add_ancillary()
5290 tcp->tcp_recvtclass = ipp->ipp_tclass; in tcp_input_add_ancillary()
5303 ip_savebuf((void **)&tcp->tcp_hopopts, &tcp->tcp_hopoptslen, in tcp_input_add_ancillary()
5318 ip_savebuf((void **)&tcp->tcp_rthdrdstopts, in tcp_input_add_ancillary()
5319 &tcp->tcp_rthdrdstoptslen, in tcp_input_add_ancillary()
5334 ip_savebuf((void **)&tcp->tcp_rthdr, &tcp->tcp_rthdrlen, in tcp_input_add_ancillary()
5349 ip_savebuf((void **)&tcp->tcp_dstopts, &tcp->tcp_dstoptslen, in tcp_input_add_ancillary()
5371 tcp_set_rto(tcp_t *tcp, hrtime_t rtt) in tcp_set_rto() argument
5374 hrtime_t sa = tcp->tcp_rtt_sa; in tcp_set_rto()
5375 hrtime_t sv = tcp->tcp_rtt_sd; in tcp_set_rto()
5376 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_set_rto()
5379 tcp->tcp_rtt_update++; in tcp_set_rto()
5380 tcp->tcp_rtt_sum += m; in tcp_set_rto()
5381 tcp->tcp_rtt_cnt++; in tcp_set_rto()
5453 tcp->tcp_rtt_sa = sa; in tcp_set_rto()
5454 tcp->tcp_rtt_sd = sv; in tcp_set_rto()
5456 tcp->tcp_rto = tcp_calculate_rto(tcp, tcps, 0); in tcp_set_rto()
5459 tcp->tcp_timer_backoff = 0; in tcp_set_rto()
5479 tcp_rwnd_reopen(tcp_t *tcp) in tcp_rwnd_reopen() argument
5483 conn_t *connp = tcp->tcp_connp; in tcp_rwnd_reopen()
5486 thwin = ((uint_t)ntohs(tcp->tcp_tcpha->tha_win)) in tcp_rwnd_reopen()
5487 << tcp->tcp_rcv_ws; in tcp_rwnd_reopen()
5489 thwin -= tcp->tcp_rnxt - tcp->tcp_rack; in tcp_rwnd_reopen()
5495 if (connp->conn_rcvbuf - thwin >= tcp->tcp_mss) { in tcp_rwnd_reopen()
5500 if (thwin < tcp->tcp_rack_cur_max * tcp->tcp_mss) { in tcp_rwnd_reopen()
5501 TCPS_BUMP_MIB(tcp->tcp_tcps, tcpOutWinUpdate); in tcp_rwnd_reopen()
5504 tcp->tcp_rwnd = connp->conn_rcvbuf; in tcp_rwnd_reopen()
5569 tcp_t *tcp = connp->conn_tcp; in tcp_rsrv_input() local
5573 mutex_enter(&tcp->tcp_rsrv_mp_lock); in tcp_rsrv_input()
5574 tcp->tcp_rsrv_mp = mp; in tcp_rsrv_input()
5575 mutex_exit(&tcp->tcp_rsrv_mp_lock); in tcp_rsrv_input()
5577 if (TCP_IS_DETACHED(tcp) || q == NULL) { in tcp_rsrv_input()
5581 if (tcp->tcp_fused) { in tcp_rsrv_input()
5582 tcp_fuse_backenable(tcp); in tcp_rsrv_input()
5588 tcp->tcp_rwnd = connp->conn_rcvbuf; in tcp_rsrv_input()
5596 if (tcp->tcp_state >= TCPS_ESTABLISHED && in tcp_rsrv_input()
5597 tcp_rwnd_reopen(tcp) == TH_ACK_NEEDED) { in tcp_rsrv_input()
5598 tcp_xmit_ctl(NULL, tcp, in tcp_rsrv_input()
5599 (tcp->tcp_swnd == 0) ? tcp->tcp_suna : in tcp_rsrv_input()
5600 tcp->tcp_snxt, tcp->tcp_rnxt, TH_ACK); in tcp_rsrv_input()
5615 tcp_t *tcp = connp->conn_tcp; in tcp_rsrv() local
5625 mutex_enter(&tcp->tcp_rsrv_mp_lock); in tcp_rsrv()
5626 if ((mp = tcp->tcp_rsrv_mp) == NULL) { in tcp_rsrv()
5627 mutex_exit(&tcp->tcp_rsrv_mp_lock); in tcp_rsrv()
5630 tcp->tcp_rsrv_mp = NULL; in tcp_rsrv()
5631 mutex_exit(&tcp->tcp_rsrv_mp_lock); in tcp_rsrv()
5657 tcp_t *tcp = connp->conn_tcp; in tcp_icmp_input() local
5668 if (tcp->tcp_state == TCPS_CLOSED) { in tcp_icmp_input()
5678 tcp_icmp_error_ipv6(tcp, mp, ira); in tcp_icmp_input()
5720 tcp_update_pmtu(tcp, B_TRUE); in tcp_icmp_input()
5721 tcp_rexmit_after_error(tcp); in tcp_icmp_input()
5725 switch (tcp->tcp_state) { in tcp_icmp_input()
5734 if (seg_seq == tcp->tcp_iss) { in tcp_icmp_input()
5735 (void) tcp_clean_death(tcp, in tcp_icmp_input()
5745 tcp->tcp_client_errno = EHOSTUNREACH; in tcp_icmp_input()
5747 tcp->tcp_client_errno = ENETUNREACH; in tcp_icmp_input()
5748 if (tcp->tcp_state == TCPS_SYN_RCVD) { in tcp_icmp_input()
5749 if (tcp->tcp_listener != NULL && in tcp_icmp_input()
5750 tcp->tcp_listener->tcp_syn_defense) { in tcp_icmp_input()
5755 (void) tcp_clean_death(tcp, in tcp_icmp_input()
5756 tcp->tcp_client_errno); in tcp_icmp_input()
5777 npkt = ((tcp->tcp_snxt - tcp->tcp_suna) >> 1) / in tcp_icmp_input()
5778 tcp->tcp_mss; in tcp_icmp_input()
5779 tcp->tcp_cwnd_ssthresh = MAX(npkt, 2) * tcp->tcp_mss; in tcp_icmp_input()
5781 DTRACE_PROBE3(cwnd__source__quench, tcp_t *, tcp, in tcp_icmp_input()
5782 uint32_t, tcp->tcp_cwnd, in tcp_icmp_input()
5783 uint32_t, tcp->tcp_mss); in tcp_icmp_input()
5784 tcp->tcp_cwnd = tcp->tcp_mss; in tcp_icmp_input()
5785 tcp->tcp_cwnd_cnt = 0; in tcp_icmp_input()
5800 tcp_icmp_error_ipv6(tcp_t *tcp, mblk_t *mp, ip_recv_attr_t *ira) in tcp_icmp_error_ipv6() argument
5844 tcp_update_pmtu(tcp, B_TRUE); in tcp_icmp_error_ipv6()
5845 tcp_rexmit_after_error(tcp); in tcp_icmp_error_ipv6()
5850 if (((tcp->tcp_state == TCPS_SYN_SENT) || in tcp_icmp_error_ipv6()
5851 (tcp->tcp_state == TCPS_SYN_RCVD)) && in tcp_icmp_error_ipv6()
5852 (seg_seq == tcp->tcp_iss)) { in tcp_icmp_error_ipv6()
5853 (void) tcp_clean_death(tcp, ECONNREFUSED); in tcp_icmp_error_ipv6()
5861 tcp->tcp_client_errno = EHOSTUNREACH; in tcp_icmp_error_ipv6()
5862 if (((tcp->tcp_state == TCPS_SYN_SENT) || in tcp_icmp_error_ipv6()
5863 (tcp->tcp_state == TCPS_SYN_RCVD)) && in tcp_icmp_error_ipv6()
5864 (seg_seq == tcp->tcp_iss)) { in tcp_icmp_error_ipv6()
5865 if (tcp->tcp_listener != NULL && in tcp_icmp_error_ipv6()
5866 tcp->tcp_listener->tcp_syn_defense) { in tcp_icmp_error_ipv6()
5871 (void) tcp_clean_death(tcp, in tcp_icmp_error_ipv6()
5872 tcp->tcp_client_errno); in tcp_icmp_error_ipv6()
5887 if (tcp->tcp_state == TCPS_SYN_SENT || in tcp_icmp_error_ipv6()
5888 tcp->tcp_state == TCPS_SYN_RCVD) { in tcp_icmp_error_ipv6()
5889 (void) tcp_clean_death(tcp, ECONNREFUSED); in tcp_icmp_error_ipv6()
5917 tcp_t *tcp = connp->conn_tcp; in tcp_verifyicmp() local
5925 if (SEQ_LT(seq, tcp->tcp_suna) || SEQ_GEQ(seq, tcp->tcp_snxt)) in tcp_verifyicmp()
5933 tcp->tcp_tcps->tcps_ignore_path_mtu) in tcp_verifyicmp()
5938 tcp->tcp_tcps->tcps_ignore_path_mtu) in tcp_verifyicmp()