Lines Matching refs:tcp

59 static void	tcp_wput_iocdata(tcp_t *tcp, mblk_t *mp);
85 cc_after_idle(tcp_t *tcp) in cc_after_idle() argument
87 uint32_t old_cwnd = tcp->tcp_cwnd; in cc_after_idle()
89 if (CC_ALGO(tcp)->after_idle != NULL) in cc_after_idle()
90 CC_ALGO(tcp)->after_idle(&tcp->tcp_ccv); in cc_after_idle()
92 DTRACE_PROBE3(cwnd__cc__after__idle, tcp_t *, tcp, uint32_t, old_cwnd, in cc_after_idle()
93 uint32_t, tcp->tcp_cwnd); in cc_after_idle()
100 tcp_t *tcp; in tcp_wput() local
111 tcp = connp->conn_tcp; in tcp_wput()
112 ASSERT(tcp != NULL); in tcp_wput()
116 mutex_enter(&tcp->tcp_non_sq_lock); in tcp_wput()
117 tcp->tcp_squeue_bytes += size; in tcp_wput()
118 if (TCP_UNSENT_BYTES(tcp) > connp->conn_sndbuf) { in tcp_wput()
119 tcp_setqfull(tcp); in tcp_wput()
121 mutex_exit(&tcp->tcp_non_sq_lock); in tcp_wput()
137 tcp = connp->conn_tcp; in tcp_wput()
162 tcp_err_ack(tcp, mp, TSYSERR, EINVAL); in tcp_wput()
186 tcp = connp->conn_tcp; in tcp_wput()
219 tcp_wput_data(tcp_t *tcp, mblk_t *mp, boolean_t urgent) in tcp_wput_data() argument
234 conn_t *connp = tcp->tcp_connp; in tcp_wput_data()
237 tcpstate = tcp->tcp_state; in tcp_wput_data()
243 ASSERT(tcp->tcp_unsent > 0); in tcp_wput_data()
245 len = tcp->tcp_unsent; in tcp_wput_data()
255 (tcp->tcp_valid_bits & TCP_FSS_VALID) != 0) { in tcp_wput_data()
256 if ((tcp->tcp_valid_bits & TCP_FSS_VALID) != 0) { in tcp_wput_data()
260 tcp_display(tcp, NULL, in tcp_wput_data()
267 tcp_display(tcp, NULL, in tcp_wput_data()
272 if (tcp->tcp_snd_zcopy_aware && in tcp_wput_data()
274 tcp_zcopy_notify(tcp); in tcp_wput_data()
276 mutex_enter(&tcp->tcp_non_sq_lock); in tcp_wput_data()
277 if (tcp->tcp_flow_stopped && in tcp_wput_data()
278 TCP_UNSENT_BYTES(tcp) <= connp->conn_sndlowat) { in tcp_wput_data()
279 tcp_clrqfull(tcp); in tcp_wput_data()
281 mutex_exit(&tcp->tcp_non_sq_lock); in tcp_wput_data()
301 if (tcp->tcp_xmit_head == NULL) { in tcp_wput_data()
302 tcp->tcp_xmit_head = mp; in tcp_wput_data()
303 tcp->tcp_xmit_tail = mp; in tcp_wput_data()
304 tcp->tcp_xmit_tail_unsent = len; in tcp_wput_data()
309 mp1 = tcp->tcp_xmit_last; in tcp_wput_data()
321 if (mp1 == tcp->tcp_xmit_tail) in tcp_wput_data()
322 tcp->tcp_xmit_tail_unsent += len; in tcp_wput_data()
324 if (tcp->tcp_snd_zcopy_aware && in tcp_wput_data()
330 tcp->tcp_xmit_last->b_cont = mp; in tcp_wput_data()
332 len += tcp->tcp_unsent; in tcp_wput_data()
351 tcp->tcp_xmit_last = mp; in tcp_wput_data()
352 tcp->tcp_unsent = len; in tcp_wput_data()
358 snxt = tcp->tcp_snxt; in tcp_wput_data()
359 xmit_tail = tcp->tcp_xmit_tail; in tcp_wput_data()
360 tail_unsent = tcp->tcp_xmit_tail_unsent; in tcp_wput_data()
370 if (tcp->tcp_snd_sack_ok && tcp->tcp_num_sack_blk > 0) { in tcp_wput_data()
373 num_sack_blk = MIN(tcp->tcp_max_sack_blk, in tcp_wput_data()
374 tcp->tcp_num_sack_blk); in tcp_wput_data()
377 mss = tcp->tcp_mss - opt_len; in tcp_wput_data()
381 mss = tcp->tcp_mss; in tcp_wput_data()
386 if ((tcp->tcp_suna == snxt) && !tcp->tcp_localnet && in tcp_wput_data()
387 (TICK_TO_MSEC(now - tcp->tcp_last_recv_time) >= tcp->tcp_rto)) { in tcp_wput_data()
388 cc_after_idle(tcp); in tcp_wput_data()
407 if (tcp->tcp_cwnd == 0) { in tcp_wput_data()
412 ASSERT(tcp->tcp_ecn_ok || in tcp_wput_data()
413 tcp->tcp_state < TCPS_ESTABLISHED); in tcp_wput_data()
418 usable_r = snxt - tcp->tcp_suna; in tcp_wput_data()
419 usable_r = tcp->tcp_swnd - usable_r; in tcp_wput_data()
428 ASSERT(tcp->tcp_fin_sent == 0); in tcp_wput_data()
446 if ((-usable_r >> tcp->tcp_snd_ws) > 0) { in tcp_wput_data()
447 tcp_process_shrunk_swnd(tcp, -usable_r); in tcp_wput_data()
453 if (tcp->tcp_swnd > tcp->tcp_cwnd) in tcp_wput_data()
454 usable_r -= tcp->tcp_swnd - tcp->tcp_cwnd; in tcp_wput_data()
492 if (usable < (int)tcp->tcp_naglim && in tcp_wput_data()
493 tcp->tcp_naglim > tcp->tcp_last_sent_len && in tcp_wput_data()
494 snxt != tcp->tcp_suna && in tcp_wput_data()
495 !(tcp->tcp_valid_bits & TCP_URG_VALID) && in tcp_wput_data()
496 !(tcp->tcp_valid_bits & TCP_FSS_VALID)) { in tcp_wput_data()
508 if (tcp->tcp_cork && !tcp->tcp_zero_win_probe) { in tcp_wput_data()
515 tcp->tcp_tcpha->tha_win = htons(tcp->tcp_rwnd >> tcp->tcp_rcv_ws); in tcp_wput_data()
518 rc = tcp_send(tcp, mss, total_hdr_len, tcp_hdr_len, in tcp_wput_data()
534 tcp->tcp_xmit_tail = xmit_tail; in tcp_wput_data()
535 tcp->tcp_xmit_tail_unsent = tail_unsent; in tcp_wput_data()
536 len = tcp->tcp_snxt - snxt; in tcp_wput_data()
544 if (tcp->tcp_snd_sack_ok && tcp->tcp_notsack_list != NULL) { in tcp_wput_data()
546 tcp->tcp_pipe -= len; in tcp_wput_data()
547 tcp_notsack_update(&(tcp->tcp_notsack_list), in tcp_wput_data()
548 tcp->tcp_snxt, snxt, in tcp_wput_data()
549 &(tcp->tcp_num_notsack_blk), in tcp_wput_data()
550 &(tcp->tcp_cnt_notsack_list)); in tcp_wput_data()
552 tcp->tcp_snxt = snxt + tcp->tcp_fin_sent; in tcp_wput_data()
553 tcp->tcp_rack = tcp->tcp_rnxt; in tcp_wput_data()
554 tcp->tcp_rack_cnt = 0; in tcp_wput_data()
555 if ((snxt + len) == tcp->tcp_suna) { in tcp_wput_data()
556 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_wput_data()
558 } else if (snxt == tcp->tcp_suna && tcp->tcp_swnd == 0) { in tcp_wput_data()
563 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_wput_data()
566 tcp->tcp_unsent += len; in tcp_wput_data()
567 mutex_enter(&tcp->tcp_non_sq_lock); in tcp_wput_data()
568 if (tcp->tcp_flow_stopped) { in tcp_wput_data()
569 if (TCP_UNSENT_BYTES(tcp) <= connp->conn_sndlowat) { in tcp_wput_data()
570 tcp_clrqfull(tcp); in tcp_wput_data()
572 } else if (TCP_UNSENT_BYTES(tcp) >= connp->conn_sndbuf) { in tcp_wput_data()
573 if (!(tcp->tcp_detached)) in tcp_wput_data()
574 tcp_setqfull(tcp); in tcp_wput_data()
576 mutex_exit(&tcp->tcp_non_sq_lock); in tcp_wput_data()
592 tcp_t *tcp = connp->conn_tcp; in tcp_wput_sock() local
599 ASSERT(TCP_IS_SOCKET(tcp)); in tcp_wput_sock()
604 tcp_capability_req(tcp, mp); in tcp_wput_sock()
631 tcp_t *tcp = connp->conn_tcp; in tcp_wput_nondata() local
645 if (TCP_IS_DETACHED(tcp) || (tcp->tcp_state == TCPS_CLOSED)) { in tcp_wput_nondata()
652 tcp_wput_iocdata(tcp, mp); in tcp_wput_nondata()
655 tcp_wput_flush(tcp, mp); in tcp_wput_nondata()
665 tcp_wput_flush(tcp_t *tcp, mblk_t *mp) in tcp_wput_flush() argument
669 conn_t *connp = tcp->tcp_connp; in tcp_wput_flush()
673 if ((fval & FLUSHW) && tcp->tcp_xmit_head != NULL && in tcp_wput_flush()
674 !(tcp->tcp_valid_bits & TCP_URG_VALID)) { in tcp_wput_flush()
680 tail = tcp->tcp_xmit_tail; in tcp_wput_flush()
681 tail->b_wptr -= tcp->tcp_xmit_tail_unsent; in tcp_wput_flush()
682 tcp->tcp_xmit_tail_unsent = 0; in tcp_wput_flush()
683 tcp->tcp_unsent = 0; in tcp_wput_flush()
687 mblk_t **excess = &tcp->tcp_xmit_head; in tcp_wput_flush()
692 tcp->tcp_xmit_tail = mp1; in tcp_wput_flush()
693 tcp->tcp_xmit_last = mp1; in tcp_wput_flush()
698 if (tcp->tcp_snd_zcopy_aware) in tcp_wput_flush()
699 tcp_zcopy_notify(tcp); in tcp_wput_flush()
705 mutex_enter(&tcp->tcp_non_sq_lock); in tcp_wput_flush()
706 if (tcp->tcp_flow_stopped) { in tcp_wput_flush()
707 tcp_clrqfull(tcp); in tcp_wput_flush()
709 mutex_exit(&tcp->tcp_non_sq_lock); in tcp_wput_flush()
729 tcp_wput_iocdata(tcp_t *tcp, mblk_t *mp) in tcp_wput_iocdata() argument
735 conn_t *connp = tcp->tcp_connp; in tcp_wput_iocdata()
803 if (tcp->tcp_state < TCPS_SYN_RCVD) { in tcp_wput_iocdata()
838 tcp_t *tcp = connp->conn_tcp; in tcp_wput_ioctl() local
866 if (!tcp->tcp_issocket) { in tcp_wput_ioctl()
870 tcp_use_pure_tpi(tcp); in tcp_wput_ioctl()
907 tcp_t *tcp = connp->conn_tcp; in tcp_wput_proto() local
936 tcp_wput_data(tcp, mp->b_cont, B_TRUE); in tcp_wput_proto()
954 tcp_tpi_bind(tcp, mp); in tcp_wput_proto()
957 tcp_tpi_unbind(tcp, mp); in tcp_wput_proto()
961 tcp_tli_accept(tcp, mp); in tcp_wput_proto()
964 tcp_tpi_connect(tcp, mp); in tcp_wput_proto()
967 tcp_disconnect(tcp, mp); in tcp_wput_proto()
970 tcp_capability_req(tcp, mp); /* capability request */ in tcp_wput_proto()
973 tcp_info_req(tcp, mp); in tcp_wput_proto()
992 tcp_err_ack(tcp, mp, TSYSERR, EINVAL); in tcp_wput_proto()
1008 tcp_err_ack(tcp, mp, TNOTSUPPORT, 0); in tcp_wput_proto()
1013 if (tcp->tcp_fused) in tcp_wput_proto()
1014 tcp_unfuse(tcp); in tcp_wput_proto()
1016 if (tcp_xmit_end(tcp) != 0) { in tcp_wput_proto()
1026 tcp_display(tcp, NULL, in tcp_wput_proto()
1032 tcp_addr_req(tcp, mp); in tcp_wput_proto()
1044 tcp_err_ack(tcp, mp, TNOTSUPPORT, 0); in tcp_wput_proto()
1058 tcp_t *tcp = connp->conn_tcp; in tcp_wput_cmdblk() local
1071 if (tcp->tcp_state < TCPS_SYN_RCVD) in tcp_wput_cmdblk()
1111 tcp_t *tcp = connp->conn_tcp; in tcp_output() local
1113 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_output()
1132 mutex_enter(&tcp->tcp_non_sq_lock); in tcp_output()
1133 tcp->tcp_squeue_bytes -= msize; in tcp_output()
1134 mutex_exit(&tcp->tcp_non_sq_lock); in tcp_output()
1137 if (tcp->tcp_fused && tcp_fuse_output(tcp, mp, msize)) in tcp_output()
1140 mss = tcp->tcp_mss; in tcp_output()
1145 if (tcp->tcp_snd_zcopy_aware && !tcp->tcp_snd_zcopy_on) in tcp_output()
1146 mp = tcp_zcopy_backoff(tcp, mp, B_FALSE); in tcp_output()
1162 if ((tcp->tcp_unsent != 0) || in tcp_output()
1163 (tcp->tcp_cork) || in tcp_output()
1165 (tcp->tcp_state != TCPS_ESTABLISHED) || in tcp_output()
1168 (tcp->tcp_valid_bits != 0)) { in tcp_output()
1169 tcp_wput_data(tcp, mp, B_FALSE); in tcp_output()
1173 ASSERT(tcp->tcp_xmit_tail_unsent == 0); in tcp_output()
1174 ASSERT(tcp->tcp_fin_sent == 0); in tcp_output()
1177 if (tcp->tcp_xmit_head == NULL) { in tcp_output()
1178 tcp->tcp_xmit_head = mp; in tcp_output()
1180 tcp->tcp_xmit_last->b_cont = mp; in tcp_output()
1182 tcp->tcp_xmit_last = mp; in tcp_output()
1183 tcp->tcp_xmit_tail = mp; in tcp_output()
1195 snxt = tcp->tcp_snxt; in tcp_output()
1207 if ((tcp->tcp_suna == snxt) && !tcp->tcp_localnet && in tcp_output()
1208 (TICK_TO_MSEC(now - tcp->tcp_last_recv_time) >= tcp->tcp_rto)) { in tcp_output()
1209 cc_after_idle(tcp); in tcp_output()
1212 usable = tcp->tcp_swnd; /* tcp window size */ in tcp_output()
1213 if (usable > tcp->tcp_cwnd) in tcp_output()
1214 usable = tcp->tcp_cwnd; /* congestion window smaller */ in tcp_output()
1216 suna = tcp->tcp_suna; in tcp_output()
1224 mutex_enter(&tcp->tcp_non_sq_lock); in tcp_output()
1225 if (tcp->tcp_flow_stopped && in tcp_output()
1226 TCP_UNSENT_BYTES(tcp) <= connp->conn_sndlowat) { in tcp_output()
1227 tcp_clrqfull(tcp); in tcp_output()
1229 mutex_exit(&tcp->tcp_non_sq_lock); in tcp_output()
1240 (len < (int)tcp->tcp_naglim) && in tcp_output()
1241 (tcp->tcp_last_sent_len < tcp->tcp_naglim)) { in tcp_output()
1249 tcp->tcp_unsent = len; in tcp_output()
1250 tcp->tcp_xmit_tail_unsent = len; in tcp_output()
1261 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_output()
1265 tcp->tcp_rack_cnt = 0; in tcp_output()
1267 tcp->tcp_snxt = snxt + len; in tcp_output()
1268 tcp->tcp_rack = tcp->tcp_rnxt; in tcp_output()
1276 tcpha = tcp->tcp_tcpha; in tcp_output()
1288 tcp->tcp_cs.tcp_out_data_segs++; in tcp_output()
1289 tcp->tcp_cs.tcp_out_data_bytes += len; in tcp_output()
1292 tcpha->tha_win = htons(tcp->tcp_rwnd >> tcp->tcp_rcv_ws); in tcp_output()
1294 tcp->tcp_last_sent_len = (ushort_t)len; in tcp_output()
1302 tcp->tcp_ipha->ipha_length = htons(plen); in tcp_output()
1304 tcp->tcp_ip6h->ip6_plen = htons(plen - IPV6_HDR_LEN); in tcp_output()
1328 if (tcp->tcp_snd_ts_ok) { in tcp_output()
1331 U32_TO_BE32(tcp->tcp_ts_recent, in tcp_output()
1363 if (tcp->tcp_ecn_ok) { in tcp_output()
1364 TCP_SET_ECT(tcp, rptr); in tcp_output()
1367 if (tcp->tcp_ecn_echo_on) in tcp_output()
1369 if (tcp->tcp_cwr && !tcp->tcp_ecn_cwr_sent) { in tcp_output()
1371 tcp->tcp_ecn_cwr_sent = B_TRUE; in tcp_output()
1375 if (tcp->tcp_ip_forward_progress) { in tcp_output()
1376 tcp->tcp_ip_forward_progress = B_FALSE; in tcp_output()
1381 tcp_send_data(tcp, mp1); in tcp_output()
1393 tcp->tcp_unsent = len; in tcp_output()
1394 tcp->tcp_xmit_tail_unsent = len; in tcp_output()
1395 tcp_wput_data(tcp, NULL, B_FALSE); in tcp_output()
1405 tcp_t *tcp = connp->conn_tcp; in tcp_output_urgent() local
1420 len += tcp->tcp_unsent; in tcp_output_urgent()
1421 len += tcp->tcp_snxt; in tcp_output_urgent()
1422 tcp->tcp_urg = len; in tcp_output_urgent()
1423 tcp->tcp_valid_bits |= TCP_URG_VALID; in tcp_output_urgent()
1426 if (tcp->tcp_fused && tcp_fuse_output(tcp, mp, msize)) in tcp_output_urgent()
1436 tcp_wput_data(tcp, mp, B_TRUE); in tcp_output_urgent()
1459 tcp_t *tcp = connp->conn_tcp; in tcp_close_output() local
1461 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_close_output()
1473 mutex_enter(&tcp->tcp_eager_lock); in tcp_close_output()
1474 if (tcp->tcp_conn_req_cnt_q0 != 0 || tcp->tcp_conn_req_cnt_q != 0) { in tcp_close_output()
1480 tcp_eager_cleanup(tcp, IPCL_IS_NONSTR(connp) ? 1 : 0); in tcp_close_output()
1481 tcp->tcp_wait_for_eagers = 1; in tcp_close_output()
1483 mutex_exit(&tcp->tcp_eager_lock); in tcp_close_output()
1485 tcp->tcp_lso = B_FALSE; in tcp_close_output()
1488 switch (tcp->tcp_state) { in tcp_close_output()
1493 if (tcp->tcp_listener != NULL) { in tcp_close_output()
1500 mutex_enter(&tcp->tcp_saved_listener->tcp_eager_lock); in tcp_close_output()
1501 tcp_eager_unlink(tcp); in tcp_close_output()
1502 mutex_exit(&tcp->tcp_saved_listener->tcp_eager_lock); in tcp_close_output()
1503 CONN_DEC_REF(tcp->tcp_saved_listener->tcp_connp); in tcp_close_output()
1520 if (tcp->tcp_fused) in tcp_close_output()
1521 tcp_unfuse(tcp); in tcp_close_output()
1535 if (tcp->tcp_rcv_list || tcp->tcp_reass_head) { in tcp_close_output()
1546 if (tcp->tcp_listener != NULL) { in tcp_close_output()
1555 mutex_enter(&tcp->tcp_saved_listener->tcp_eager_lock); in tcp_close_output()
1556 tcp_eager_unlink(tcp); in tcp_close_output()
1557 mutex_exit(&tcp->tcp_saved_listener->tcp_eager_lock); in tcp_close_output()
1558 CONN_DEC_REF(tcp->tcp_saved_listener->tcp_connp); in tcp_close_output()
1567 (void) tcp_xmit_end(tcp); in tcp_close_output()
1574 !(tcp->tcp_fin_acked) && in tcp_close_output()
1575 tcp->tcp_state >= TCPS_ESTABLISHED) { in tcp_close_output()
1576 if (tcp->tcp_closeflags & (FNDELAY|FNONBLOCK)) { in tcp_close_output()
1577 tcp->tcp_client_errno = EWOULDBLOCK; in tcp_close_output()
1578 } else if (tcp->tcp_client_errno == 0) { in tcp_close_output()
1580 ASSERT(tcp->tcp_linger_tid == 0); in tcp_close_output()
1583 tcp->tcp_linger_tid = TCP_TIMER(tcp, in tcp_close_output()
1588 if (tcp->tcp_linger_tid == 0) in tcp_close_output()
1589 tcp->tcp_client_errno = ENOSR; in tcp_close_output()
1598 if (tcp->tcp_state <= TCPS_LISTEN) in tcp_close_output()
1607 tcp_acceptor_hash_remove(tcp); in tcp_close_output()
1609 mutex_enter(&tcp->tcp_non_sq_lock); in tcp_close_output()
1610 if (tcp->tcp_flow_stopped) { in tcp_close_output()
1611 tcp_clrqfull(tcp); in tcp_close_output()
1613 mutex_exit(&tcp->tcp_non_sq_lock); in tcp_close_output()
1615 if (tcp->tcp_timer_tid != 0) { in tcp_close_output()
1616 delta = TCP_TIMER_CANCEL(tcp, tcp->tcp_timer_tid); in tcp_close_output()
1617 tcp->tcp_timer_tid = 0; in tcp_close_output()
1624 tcp_timers_stop(tcp); in tcp_close_output()
1626 tcp->tcp_detached = B_TRUE; in tcp_close_output()
1627 if (tcp->tcp_state == TCPS_TIME_WAIT) { in tcp_close_output()
1628 tcp_time_wait_append(tcp); in tcp_close_output()
1641 tcp->tcp_timer_tid = TCP_TIMER(tcp, tcp_timer, in tcp_close_output()
1650 if (tcp->tcp_state == TCPS_ESTABLISHED || in tcp_close_output()
1651 tcp->tcp_state == TCPS_CLOSE_WAIT) in tcp_close_output()
1653 if (tcp->tcp_state == TCPS_SYN_SENT || in tcp_close_output()
1654 tcp->tcp_state == TCPS_SYN_RCVD) in tcp_close_output()
1656 tcp_xmit_ctl(msg, tcp, tcp->tcp_snxt, 0, TH_RST); in tcp_close_output()
1659 tcp_closei_local(tcp); in tcp_close_output()
1673 if (!tcp->tcp_wait_for_eagers) { in tcp_close_output()
1674 tcp->tcp_detached = B_TRUE; in tcp_close_output()
1701 mutex_enter(&tcp->tcp_closelock); in tcp_close_output()
1702 tcp->tcp_closed = 1; in tcp_close_output()
1703 cv_signal(&tcp->tcp_closecv); in tcp_close_output()
1704 mutex_exit(&tcp->tcp_closelock); in tcp_close_output()
1712 tcp_t *tcp = connp->conn_tcp; in tcp_shutdown_output() local
1716 if (tcp->tcp_fused) in tcp_shutdown_output()
1717 tcp_unfuse(tcp); in tcp_shutdown_output()
1719 if (tcp_xmit_end(tcp) != 0) { in tcp_shutdown_output()
1728 tcp_display(tcp, NULL, DISP_ADDR_AND_PORT)); in tcp_shutdown_output()
1736 tcp_send_data(tcp_t *tcp, mblk_t *mp) in tcp_send_data() argument
1738 conn_t *connp = tcp->tcp_connp; in tcp_send_data()
1749 if (tcp->tcp_snd_zcopy_aware && !tcp->tcp_snd_zcopy_on && in tcp_send_data()
1750 !tcp->tcp_xmit_zc_clean) { in tcp_send_data()
1757 __dtrace_tcp_void_ip_t *, mp->b_rptr, tcp_t *, tcp, in tcp_send_data()
1770 tcp_t *tcp = econnp->conn_tcp; in tcp_send_synack() local
1774 if (tcp->tcp_state == TCPS_CLOSED) { in tcp_send_synack()
1797 tcp_send(tcp_t *tcp, const int mss, const int total_hdr_len, in tcp_send() argument
1804 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_send()
1805 conn_t *connp = tcp->tcp_connp; in tcp_send()
1814 if (tcp->tcp_lso && (tcp->tcp_valid_bits & ~TCP_FSS_VALID) == 0) in tcp_send()
1835 lso_usable = MIN(tcp->tcp_lso_max, *usable); in tcp_send()
1839 tcp->tcp_last_sent_len = (ushort_t) in tcp_send()
1842 tcp->tcp_last_sent_len = (ushort_t)mss; in tcp_send()
1870 if (len < (tcp->tcp_max_swnd >> 1) && in tcp_send()
1871 (tcp->tcp_unsent - (*snxt - tcp->tcp_snxt)) > len && in tcp_send()
1872 !((tcp->tcp_valid_bits & TCP_URG_VALID) && in tcp_send()
1873 len == 1) && (! tcp->tcp_zero_win_probe)) { in tcp_send()
1880 if (*snxt == tcp->tcp_snxt && in tcp_send()
1881 *snxt == tcp->tcp_suna) { in tcp_send()
1892 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_send()
1898 tcpha = tcp->tcp_tcpha; in tcp_send()
1938 if (tcp->tcp_valid_bits != 0 && in tcp_send()
1939 (tcp->tcp_valid_bits != TCP_FSS_VALID || in tcp_send()
1940 ((*snxt + len) == tcp->tcp_fss))) { in tcp_send()
1942 uint32_t prev_snxt = tcp->tcp_snxt; in tcp_send()
1955 mp = tcp_xmit_mp(tcp, *xmit_tail, len, NULL, NULL, in tcp_send()
1958 tcp->tcp_snxt = prev_snxt; in tcp_send()
1978 tcp->tcp_last_sent_len = (ushort_t)len; in tcp_send()
1991 tcp->tcp_cs.tcp_out_data_segs++; in tcp_send()
1992 tcp->tcp_cs.tcp_out_data_bytes += len; in tcp_send()
1993 tcp_send_data(tcp, mp); in tcp_send()
2001 tcp->tcp_cs.tcp_out_data_segs++; in tcp_send()
2002 tcp->tcp_cs.tcp_out_data_bytes += len; in tcp_send()
2010 tcp->tcp_last_sent_len = (ushort_t)len; in tcp_send()
2015 tcp->tcp_ipha->ipha_length = htons(len); in tcp_send()
2017 tcp->tcp_ip6h->ip6_plen = in tcp_send()
2050 tcp->tcp_last_sent_len = (ushort_t)len; in tcp_send()
2056 tcp->tcp_ipha->ipha_length = htons(len); in tcp_send()
2058 tcp->tcp_ip6h->ip6_plen = htons(len - IPV6_HDR_LEN); in tcp_send()
2099 tcp_fill_header(tcp, rptr, num_sack_blk); in tcp_send()
2133 if (tcp->tcp_maxpsz_multiplier > 0) in tcp_send()
2142 if (tcp->tcp_localnet && in tcp_send()
2143 !tcp->tcp_cork && in tcp_send()
2176 tcp->tcp_last_sent_len += spill; in tcp_send()
2178 tcp->tcp_cs.tcp_out_data_bytes += spill; in tcp_send()
2204 if (tcp->tcp_ip_forward_progress) { in tcp_send()
2205 tcp->tcp_ip_forward_progress = B_FALSE; in tcp_send()
2220 tcp_send_data(tcp, mp); in tcp_send()
2237 tcp_send_data(tcp, mp); in tcp_send()
2250 tcp_xmit_end(tcp_t *tcp) in tcp_xmit_end() argument
2253 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_xmit_end()
2256 conn_t *connp = tcp->tcp_connp; in tcp_xmit_end()
2258 if (tcp->tcp_state < TCPS_SYN_RCVD || in tcp_xmit_end()
2259 tcp->tcp_state > TCPS_CLOSE_WAIT) { in tcp_xmit_end()
2267 tcp->tcp_fss = tcp->tcp_snxt + tcp->tcp_unsent; in tcp_xmit_end()
2268 tcp->tcp_valid_bits |= TCP_FSS_VALID; in tcp_xmit_end()
2273 if (tcp->tcp_unsent == 0) { in tcp_xmit_end()
2274 mp = tcp_xmit_mp(tcp, NULL, 0, NULL, NULL, in tcp_xmit_end()
2275 tcp->tcp_fss, B_FALSE, NULL, B_FALSE); in tcp_xmit_end()
2278 tcp_send_data(tcp, mp); in tcp_xmit_end()
2284 tcp->tcp_snxt = tcp->tcp_fss + 1; in tcp_xmit_end()
2285 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_xmit_end()
2292 if (tcp->tcp_rexmit && tcp->tcp_rexmit_nxt == tcp->tcp_fss) { in tcp_xmit_end()
2293 tcp->tcp_rexmit_nxt = tcp->tcp_snxt; in tcp_xmit_end()
2300 if (tcp->tcp_cork) in tcp_xmit_end()
2301 tcp->tcp_cork = B_FALSE; in tcp_xmit_end()
2302 tcp_wput_data(tcp, NULL, B_FALSE); in tcp_xmit_end()
2310 tcp->tcp_rtt_update < tcps->tcps_rtt_updates) in tcp_xmit_end()
2318 uinfo.iulp_rtt = NSEC2MSEC(tcp->tcp_rtt_sa); in tcp_xmit_end()
2319 uinfo.iulp_rtt_sd = NSEC2MSEC(tcp->tcp_rtt_sd); in tcp_xmit_end()
2326 if (connp->conn_faddr_v4 != tcp->tcp_ipha->ipha_dst) { in tcp_xmit_end()
2334 &tcp->tcp_ip6h->ip6_dst))) { in tcp_xmit_end()
2364 tcp_xmit_ctl(char *str, tcp_t *tcp, uint32_t seq, uint32_t ack, int ctl) in tcp_xmit_ctl() argument
2374 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_xmit_ctl()
2375 conn_t *connp = tcp->tcp_connp; in tcp_xmit_ctl()
2418 if (tcp->tcp_snd_ts_ok && in tcp_xmit_ctl()
2419 tcp->tcp_state > TCPS_SYN_SENT) { in tcp_xmit_ctl()
2437 if (tcp->tcp_snd_ts_ok) { in tcp_xmit_ctl()
2442 U32_TO_BE32(tcp->tcp_ts_recent, in tcp_xmit_ctl()
2447 tcpha->tha_win = htons(tcp->tcp_rwnd >> tcp->tcp_rcv_ws); in tcp_xmit_ctl()
2449 tcp->tcp_tcpha->tha_win = tcpha->tha_win; in tcp_xmit_ctl()
2450 tcp->tcp_rack = ack; in tcp_xmit_ctl()
2451 tcp->tcp_rack_cnt = 0; in tcp_xmit_ctl()
2462 tcp_send_data(tcp, mp); in tcp_xmit_ctl()
2810 tcp_xmit_mp_aux_iss(tcp_t *tcp, conn_t *connp, tcpha_t *tcpha, mblk_t *mp, in tcp_xmit_mp_aux_iss() argument
2815 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_xmit_mp_aux_iss()
2825 ASSERT(tcp->tcp_state == TCPS_SYN_SENT || in tcp_xmit_mp_aux_iss()
2826 tcp->tcp_state == TCPS_SYN_RCVD || in tcp_xmit_mp_aux_iss()
2827 tcp->tcp_state == TCPS_FIN_WAIT_1); in tcp_xmit_mp_aux_iss()
2851 u1 = tcp->tcp_initial_pmtu - (connp->conn_ipversion == IPV4_VERSION ? in tcp_xmit_mp_aux_iss()
2859 switch (tcp->tcp_state) { in tcp_xmit_mp_aux_iss()
2863 if (tcp->tcp_snd_sack_ok) in tcp_xmit_mp_aux_iss()
2866 if (tcp->tcp_snd_ts_ok) { in tcp_xmit_mp_aux_iss()
2882 ASSERT(tcp->tcp_ts_recent == 0); in tcp_xmit_mp_aux_iss()
2892 if (tcp->tcp_ecn_ok) in tcp_xmit_mp_aux_iss()
2913 u1 = tcp->tcp_mss; in tcp_xmit_mp_aux_iss()
2927 if (tcp->tcp_snd_sack_ok) { in tcp_xmit_mp_aux_iss()
2928 if (tcp->tcp_snd_ts_ok) { in tcp_xmit_mp_aux_iss()
2951 if (tcp->tcp_ecn_ok) in tcp_xmit_mp_aux_iss()
2974 if (tcp->tcp_snd_ws_ok) { in tcp_xmit_mp_aux_iss()
2978 wptr[3] = (uchar_t)tcp->tcp_rcv_ws; in tcp_xmit_mp_aux_iss()
3000 tcp_xmit_mp_aux_fss(tcp_t *tcp, ip_xmit_attr_t *ixa, uint_t *flags) in tcp_xmit_mp_aux_fss() argument
3002 if (!tcp->tcp_fin_acked) { in tcp_xmit_mp_aux_fss()
3004 TCPS_BUMP_MIB(tcp->tcp_tcps, tcpOutControl); in tcp_xmit_mp_aux_fss()
3006 if (!tcp->tcp_fin_sent) { in tcp_xmit_mp_aux_fss()
3007 tcp->tcp_fin_sent = B_TRUE; in tcp_xmit_mp_aux_fss()
3008 switch (tcp->tcp_state) { in tcp_xmit_mp_aux_fss()
3010 tcp->tcp_state = TCPS_FIN_WAIT_1; in tcp_xmit_mp_aux_fss()
3013 tcp_t *, tcp, void, NULL, in tcp_xmit_mp_aux_fss()
3017 tcp->tcp_state = TCPS_FIN_WAIT_1; in tcp_xmit_mp_aux_fss()
3020 tcp_t *, tcp, void, NULL, in tcp_xmit_mp_aux_fss()
3024 tcp->tcp_state = TCPS_LAST_ACK; in tcp_xmit_mp_aux_fss()
3027 tcp_t *, tcp, void, NULL, in tcp_xmit_mp_aux_fss()
3031 if (tcp->tcp_suna == tcp->tcp_snxt) in tcp_xmit_mp_aux_fss()
3032 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_xmit_mp_aux_fss()
3033 tcp->tcp_snxt = tcp->tcp_fss + 1; in tcp_xmit_mp_aux_fss()
3052 tcp_xmit_mp(tcp_t *tcp, mblk_t *mp, int32_t max_to_send, int32_t *offset, in tcp_xmit_mp() argument
3065 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_xmit_mp()
3066 conn_t *connp = tcp->tcp_connp; in tcp_xmit_mp()
3084 if (tcp->tcp_snd_sack_ok && tcp->tcp_num_sack_blk > 0) { in tcp_xmit_mp()
3085 num_sack_blk = MIN(tcp->tcp_max_sack_blk, in tcp_xmit_mp()
3086 tcp->tcp_num_sack_blk); in tcp_xmit_mp()
3089 if (max_to_send + sack_opt_len > tcp->tcp_mss) in tcp_xmit_mp()
3137 tcp->tcp_tcpha->tha_win = htons(tcp->tcp_rwnd >> tcp->tcp_rcv_ws); in tcp_xmit_mp()
3153 if (data_length != 0 && (tcp->tcp_unsent == 0 || in tcp_xmit_mp()
3154 tcp->tcp_unsent == data_length)) { in tcp_xmit_mp()
3160 if (tcp->tcp_ecn_ok) { in tcp_xmit_mp()
3161 if (tcp->tcp_ecn_echo_on) in tcp_xmit_mp()
3170 TCP_SET_ECT(tcp, rptr); in tcp_xmit_mp()
3171 if (tcp->tcp_cwr && !tcp->tcp_ecn_cwr_sent) { in tcp_xmit_mp()
3173 tcp->tcp_ecn_cwr_sent = B_TRUE; in tcp_xmit_mp()
3179 if (tcp->tcp_valid_bits) { in tcp_xmit_mp()
3183 if ((tcp->tcp_valid_bits & TCP_ISS_VALID) && in tcp_xmit_mp()
3184 seq == tcp->tcp_iss) { in tcp_xmit_mp()
3186 tcp_xmit_mp_aux_iss(tcp, connp, tcpha, mp1, &flags); in tcp_xmit_mp()
3187 } else if ((tcp->tcp_valid_bits & TCP_FSS_VALID) && in tcp_xmit_mp()
3188 (seq + data_length) == tcp->tcp_fss) { in tcp_xmit_mp()
3190 tcp_xmit_mp_aux_fss(tcp, ixa, &flags); in tcp_xmit_mp()
3201 u1 = tcp->tcp_urg - seq + TCP_OLD_URP_INTERPRETATION; in tcp_xmit_mp()
3202 if ((tcp->tcp_valid_bits & TCP_URG_VALID) && u1 != 0 && in tcp_xmit_mp()
3210 tcp->tcp_rack = tcp->tcp_rnxt; in tcp_xmit_mp()
3211 tcp->tcp_rack_cnt = 0; in tcp_xmit_mp()
3214 if (tcp->tcp_snd_ts_ok) { in tcp_xmit_mp()
3215 if (tcp->tcp_state != TCPS_SYN_SENT) { in tcp_xmit_mp()
3220 U32_TO_BE32(tcp->tcp_ts_recent, in tcp_xmit_mp()
3238 tmp = tcp->tcp_sack_list; in tcp_xmit_mp()
3268 if (tcp->tcp_ip_forward_progress) { in tcp_xmit_mp()
3269 tcp->tcp_ip_forward_progress = B_FALSE; in tcp_xmit_mp()
3324 tcp_sack_rexmit(tcp_t *tcp, uint_t *flags) in tcp_sack_rexmit() argument
3331 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_sack_rexmit()
3333 ASSERT(tcp->tcp_notsack_list != NULL); in tcp_sack_rexmit()
3334 ASSERT(tcp->tcp_rexmit == B_FALSE); in tcp_sack_rexmit()
3337 if (tcp->tcp_notsack_list == NULL) { in tcp_sack_rexmit()
3340 notsack_blk = tcp->tcp_notsack_list; in tcp_sack_rexmit()
3341 mss = tcp->tcp_mss; in tcp_sack_rexmit()
3347 usable_swnd = tcp->tcp_cwnd_ssthresh - tcp->tcp_pipe; in tcp_sack_rexmit()
3355 tcp->tcp_csuna = tcp->tcp_snxt; in tcp_sack_rexmit()
3357 notsack_blk = tcp->tcp_notsack_list; in tcp_sack_rexmit()
3360 tcp_seq begin = tcp->tcp_sack_snxt; in tcp_sack_rexmit()
3381 usable_swnd = tcp->tcp_cwnd_ssthresh - tcp->tcp_pipe; in tcp_sack_rexmit()
3382 if (usable_swnd <= 0 || tcp->tcp_unsent == 0) { in tcp_sack_rexmit()
3383 tcp->tcp_cwnd = tcp->tcp_snxt - tcp->tcp_suna; in tcp_sack_rexmit()
3384 ASSERT(tcp->tcp_cwnd > 0); in tcp_sack_rexmit()
3388 tcp->tcp_cwnd = tcp->tcp_snxt - tcp->tcp_suna + in tcp_sack_rexmit()
3402 snxt_mp = tcp_get_seg_mp(tcp, begin, &off); in tcp_sack_rexmit()
3409 xmit_mp = tcp_xmit_mp(tcp, snxt_mp, seg_len, &off, in tcp_sack_rexmit()
3415 tcp->tcp_pipe += seg_len; in tcp_sack_rexmit()
3416 tcp->tcp_sack_snxt = begin + seg_len; in tcp_sack_rexmit()
3418 tcp_send_data(tcp, xmit_mp); in tcp_sack_rexmit()
3428 tcp->tcp_cs.tcp_out_retrans_segs++; in tcp_sack_rexmit()
3429 tcp->tcp_cs.tcp_out_retrans_bytes += seg_len; in tcp_sack_rexmit()
3437 if (SEQ_GT(tcp->tcp_sack_snxt, tcp->tcp_rexmit_max)) { in tcp_sack_rexmit()
3438 tcp->tcp_rexmit_max = tcp->tcp_sack_snxt; in tcp_sack_rexmit()
3448 tcp_ss_rexmit(tcp_t *tcp) in tcp_ss_rexmit() argument
3456 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_ss_rexmit()
3462 if (SEQ_LT(tcp->tcp_rexmit_nxt, tcp->tcp_rexmit_max)) { in tcp_ss_rexmit()
3463 smax = tcp->tcp_rexmit_max; in tcp_ss_rexmit()
3464 snxt = tcp->tcp_rexmit_nxt; in tcp_ss_rexmit()
3465 if (SEQ_LT(snxt, tcp->tcp_suna)) { in tcp_ss_rexmit()
3466 snxt = tcp->tcp_suna; in tcp_ss_rexmit()
3468 win = MIN(tcp->tcp_cwnd, tcp->tcp_swnd); in tcp_ss_rexmit()
3469 win -= snxt - tcp->tcp_suna; in tcp_ss_rexmit()
3470 mss = tcp->tcp_mss; in tcp_ss_rexmit()
3471 snxt_mp = tcp_get_seg_mp(tcp, snxt, &off); in tcp_ss_rexmit()
3484 xmit_mp = tcp_xmit_mp(tcp, snxt_mp, cnt, &off, in tcp_ss_rexmit()
3489 tcp_send_data(tcp, xmit_mp); in tcp_ss_rexmit()
3500 tcp->tcp_cs.tcp_out_retrans_segs++; in tcp_ss_rexmit()
3501 tcp->tcp_cs.tcp_out_retrans_bytes += cnt; in tcp_ss_rexmit()
3503 tcp->tcp_rexmit_nxt = snxt; in tcp_ss_rexmit()
3517 if (tcp->tcp_unsent) { in tcp_ss_rexmit()
3518 tcp_wput_data(tcp, NULL, B_FALSE); in tcp_ss_rexmit()
3526 tcp_rexmit_after_error(tcp_t *tcp) in tcp_rexmit_after_error() argument
3532 if (!SEQ_LT(tcp->tcp_suna, tcp->tcp_snxt) || in tcp_rexmit_after_error()
3533 (tcp->tcp_xmit_head == NULL)) in tcp_rexmit_after_error()
3536 if ((tcp->tcp_valid_bits & TCP_FSS_VALID) && (tcp->tcp_unsent == 0)) in tcp_rexmit_after_error()
3537 tcp->tcp_rexmit_max = tcp->tcp_fss; in tcp_rexmit_after_error()
3539 tcp->tcp_rexmit_max = tcp->tcp_snxt; in tcp_rexmit_after_error()
3541 tcp->tcp_rexmit_nxt = tcp->tcp_suna; in tcp_rexmit_after_error()
3542 tcp->tcp_rexmit = B_TRUE; in tcp_rexmit_after_error()
3543 tcp->tcp_dupack_cnt = 0; in tcp_rexmit_after_error()
3544 tcp_ss_rexmit(tcp); in tcp_rexmit_after_error()
3567 tcp_get_seg_mp(tcp_t *tcp, uint32_t seq, int32_t *off) in tcp_get_seg_mp() argument
3573 if (SEQ_LT(seq, tcp->tcp_suna) || SEQ_GT(seq, tcp->tcp_snxt)) in tcp_get_seg_mp()
3576 cnt = seq - tcp->tcp_suna; in tcp_get_seg_mp()
3577 mp = tcp->tcp_xmit_head; in tcp_get_seg_mp()
3596 tcp_update_xmit_tail(tcp_t *tcp, uint32_t snxt) in tcp_update_xmit_tail() argument
3601 tcp->tcp_snxt = snxt; in tcp_update_xmit_tail()
3604 xmit_tail = tcp_get_seg_mp(tcp, snxt, &offset); in tcp_update_xmit_tail()
3606 tcp->tcp_xmit_tail = xmit_tail; in tcp_update_xmit_tail()
3607 tcp->tcp_xmit_tail_unsent = xmit_tail->b_wptr - in tcp_update_xmit_tail()
3619 tcp_process_shrunk_swnd(tcp_t *tcp, uint32_t shrunk_count) in tcp_process_shrunk_swnd() argument
3621 uint32_t snxt = tcp->tcp_snxt; in tcp_process_shrunk_swnd()
3625 if (!tcp->tcp_is_wnd_shrnk) { in tcp_process_shrunk_swnd()
3626 tcp->tcp_snxt_shrunk = snxt; in tcp_process_shrunk_swnd()
3627 tcp->tcp_is_wnd_shrnk = B_TRUE; in tcp_process_shrunk_swnd()
3628 } else if (SEQ_GT(snxt, tcp->tcp_snxt_shrunk)) { in tcp_process_shrunk_swnd()
3629 tcp->tcp_snxt_shrunk = snxt; in tcp_process_shrunk_swnd()
3636 tcp_update_xmit_tail(tcp, snxt); in tcp_process_shrunk_swnd()
3637 tcp->tcp_unsent += shrunk_count; in tcp_process_shrunk_swnd()
3643 TCP_NOTSACK_REMOVE_ALL(tcp->tcp_notsack_list, tcp); in tcp_process_shrunk_swnd()
3645 if (tcp->tcp_suna == tcp->tcp_snxt && tcp->tcp_swnd == 0) in tcp_process_shrunk_swnd()
3650 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_process_shrunk_swnd()
3659 tcp_fill_header(tcp_t *tcp, uchar_t *rptr, int num_sack_blk) in tcp_fill_header() argument
3664 conn_t *connp = tcp->tcp_connp; in tcp_fill_header()
3669 tcp_tmpl = tcp->tcp_tcpha; in tcp_fill_header()
3680 if (tcp->tcp_snd_ts_ok) { in tcp_fill_header()
3683 U32_TO_BE32(tcp->tcp_ts_recent, in tcp_fill_header()
3718 if (tcp->tcp_ecn_ok && !tcp->tcp_zero_win_probe) { in tcp_fill_header()
3719 TCP_SET_ECT(tcp, rptr); in tcp_fill_header()
3721 if (tcp->tcp_ecn_echo_on) in tcp_fill_header()
3723 if (tcp->tcp_cwr && !tcp->tcp_ecn_cwr_sent) { in tcp_fill_header()
3725 tcp->tcp_ecn_cwr_sent = B_TRUE; in tcp_fill_header()
3742 tmp = tcp->tcp_sack_list; in tcp_fill_header()