Lines Matching refs:tcp
61 static void tcp_wput_iocdata(tcp_t *tcp, mblk_t *mp);
87 cc_after_idle(tcp_t *tcp) in cc_after_idle() argument
89 uint32_t old_cwnd = tcp->tcp_cwnd; in cc_after_idle()
91 if (CC_ALGO(tcp)->after_idle != NULL) in cc_after_idle()
92 CC_ALGO(tcp)->after_idle(&tcp->tcp_ccv); in cc_after_idle()
94 DTRACE_PROBE3(cwnd__cc__after__idle, tcp_t *, tcp, uint32_t, old_cwnd, in cc_after_idle()
95 uint32_t, tcp->tcp_cwnd); in cc_after_idle()
102 tcp_t *tcp; in tcp_wput() local
113 tcp = connp->conn_tcp; in tcp_wput()
114 ASSERT(tcp != NULL); in tcp_wput()
118 mutex_enter(&tcp->tcp_non_sq_lock); in tcp_wput()
119 tcp->tcp_squeue_bytes += size; in tcp_wput()
120 if (TCP_UNSENT_BYTES(tcp) > connp->conn_sndbuf) { in tcp_wput()
121 tcp_setqfull(tcp); in tcp_wput()
123 mutex_exit(&tcp->tcp_non_sq_lock); in tcp_wput()
139 tcp = connp->conn_tcp; in tcp_wput()
164 tcp_err_ack(tcp, mp, TSYSERR, EINVAL); in tcp_wput()
188 tcp = connp->conn_tcp; in tcp_wput()
221 tcp_wput_data(tcp_t *tcp, mblk_t *mp, boolean_t urgent) in tcp_wput_data() argument
236 conn_t *connp = tcp->tcp_connp; in tcp_wput_data()
239 tcpstate = tcp->tcp_state; in tcp_wput_data()
245 ASSERT(tcp->tcp_unsent > 0); in tcp_wput_data()
247 len = tcp->tcp_unsent; in tcp_wput_data()
257 (tcp->tcp_valid_bits & TCP_FSS_VALID) != 0) { in tcp_wput_data()
258 if ((tcp->tcp_valid_bits & TCP_FSS_VALID) != 0) { in tcp_wput_data()
262 tcp_display(tcp, NULL, in tcp_wput_data()
269 tcp_display(tcp, NULL, in tcp_wput_data()
274 if (tcp->tcp_snd_zcopy_aware && in tcp_wput_data()
276 tcp_zcopy_notify(tcp); in tcp_wput_data()
278 mutex_enter(&tcp->tcp_non_sq_lock); in tcp_wput_data()
279 if (tcp->tcp_flow_stopped && in tcp_wput_data()
280 TCP_UNSENT_BYTES(tcp) <= connp->conn_sndlowat) { in tcp_wput_data()
281 tcp_clrqfull(tcp); in tcp_wput_data()
283 mutex_exit(&tcp->tcp_non_sq_lock); in tcp_wput_data()
303 if (tcp->tcp_xmit_head == NULL) { in tcp_wput_data()
304 tcp->tcp_xmit_head = mp; in tcp_wput_data()
305 tcp->tcp_xmit_tail = mp; in tcp_wput_data()
306 tcp->tcp_xmit_tail_unsent = len; in tcp_wput_data()
311 mp1 = tcp->tcp_xmit_last; in tcp_wput_data()
323 if (mp1 == tcp->tcp_xmit_tail) in tcp_wput_data()
324 tcp->tcp_xmit_tail_unsent += len; in tcp_wput_data()
326 if (tcp->tcp_snd_zcopy_aware && in tcp_wput_data()
332 tcp->tcp_xmit_last->b_cont = mp; in tcp_wput_data()
334 len += tcp->tcp_unsent; in tcp_wput_data()
353 tcp->tcp_xmit_last = mp; in tcp_wput_data()
354 tcp->tcp_unsent = len; in tcp_wput_data()
360 snxt = tcp->tcp_snxt; in tcp_wput_data()
361 xmit_tail = tcp->tcp_xmit_tail; in tcp_wput_data()
362 tail_unsent = tcp->tcp_xmit_tail_unsent; in tcp_wput_data()
372 if (tcp->tcp_snd_sack_ok && tcp->tcp_num_sack_blk > 0) { in tcp_wput_data()
375 num_sack_blk = MIN(tcp->tcp_max_sack_blk, in tcp_wput_data()
376 tcp->tcp_num_sack_blk); in tcp_wput_data()
379 mss = tcp->tcp_mss - opt_len; in tcp_wput_data()
383 mss = tcp->tcp_mss; in tcp_wput_data()
388 if ((tcp->tcp_suna == snxt) && !tcp->tcp_localnet && in tcp_wput_data()
389 (TICK_TO_MSEC(now - tcp->tcp_last_recv_time) >= tcp->tcp_rto)) { in tcp_wput_data()
390 cc_after_idle(tcp); in tcp_wput_data()
409 if (tcp->tcp_cwnd == 0) { in tcp_wput_data()
414 ASSERT(tcp->tcp_ecn_ok || in tcp_wput_data()
415 tcp->tcp_state < TCPS_ESTABLISHED); in tcp_wput_data()
420 usable_r = snxt - tcp->tcp_suna; in tcp_wput_data()
421 usable_r = tcp->tcp_swnd - usable_r; in tcp_wput_data()
430 ASSERT(tcp->tcp_fin_sent == 0); in tcp_wput_data()
448 if ((-usable_r >> tcp->tcp_snd_ws) > 0) { in tcp_wput_data()
449 tcp_process_shrunk_swnd(tcp, -usable_r); in tcp_wput_data()
455 if (tcp->tcp_swnd > tcp->tcp_cwnd) in tcp_wput_data()
456 usable_r -= tcp->tcp_swnd - tcp->tcp_cwnd; in tcp_wput_data()
494 if (usable < (int)tcp->tcp_naglim && in tcp_wput_data()
495 tcp->tcp_naglim > tcp->tcp_last_sent_len && in tcp_wput_data()
496 snxt != tcp->tcp_suna && in tcp_wput_data()
497 !(tcp->tcp_valid_bits & TCP_URG_VALID) && in tcp_wput_data()
498 !(tcp->tcp_valid_bits & TCP_FSS_VALID)) { in tcp_wput_data()
510 if (tcp->tcp_cork && !tcp->tcp_zero_win_probe) { in tcp_wput_data()
517 tcp->tcp_tcpha->tha_win = htons(tcp->tcp_rwnd >> tcp->tcp_rcv_ws); in tcp_wput_data()
520 rc = tcp_send(tcp, mss, total_hdr_len, tcp_hdr_len, in tcp_wput_data()
536 tcp->tcp_xmit_tail = xmit_tail; in tcp_wput_data()
537 tcp->tcp_xmit_tail_unsent = tail_unsent; in tcp_wput_data()
538 len = tcp->tcp_snxt - snxt; in tcp_wput_data()
546 if (tcp->tcp_snd_sack_ok && tcp->tcp_notsack_list != NULL) { in tcp_wput_data()
548 tcp->tcp_pipe -= len; in tcp_wput_data()
549 tcp_notsack_update(&(tcp->tcp_notsack_list), in tcp_wput_data()
550 tcp->tcp_snxt, snxt, in tcp_wput_data()
551 &(tcp->tcp_num_notsack_blk), in tcp_wput_data()
552 &(tcp->tcp_cnt_notsack_list)); in tcp_wput_data()
554 tcp->tcp_snxt = snxt + tcp->tcp_fin_sent; in tcp_wput_data()
555 tcp->tcp_rack = tcp->tcp_rnxt; in tcp_wput_data()
556 tcp->tcp_rack_cnt = 0; in tcp_wput_data()
557 if ((snxt + len) == tcp->tcp_suna) { in tcp_wput_data()
558 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_wput_data()
560 } else if (snxt == tcp->tcp_suna && tcp->tcp_swnd == 0) { in tcp_wput_data()
565 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_wput_data()
568 tcp->tcp_unsent += len; in tcp_wput_data()
569 mutex_enter(&tcp->tcp_non_sq_lock); in tcp_wput_data()
570 if (tcp->tcp_flow_stopped) { in tcp_wput_data()
571 if (TCP_UNSENT_BYTES(tcp) <= connp->conn_sndlowat) { in tcp_wput_data()
572 tcp_clrqfull(tcp); in tcp_wput_data()
574 } else if (TCP_UNSENT_BYTES(tcp) >= connp->conn_sndbuf) { in tcp_wput_data()
575 if (!(tcp->tcp_detached)) in tcp_wput_data()
576 tcp_setqfull(tcp); in tcp_wput_data()
578 mutex_exit(&tcp->tcp_non_sq_lock); in tcp_wput_data()
594 tcp_t *tcp = connp->conn_tcp; in tcp_wput_sock() local
601 ASSERT(TCP_IS_SOCKET(tcp)); in tcp_wput_sock()
606 tcp_capability_req(tcp, mp); in tcp_wput_sock()
633 tcp_t *tcp = connp->conn_tcp; in tcp_wput_nondata() local
647 if (TCP_IS_DETACHED(tcp) || (tcp->tcp_state == TCPS_CLOSED)) { in tcp_wput_nondata()
654 tcp_wput_iocdata(tcp, mp); in tcp_wput_nondata()
657 tcp_wput_flush(tcp, mp); in tcp_wput_nondata()
667 tcp_wput_flush(tcp_t *tcp, mblk_t *mp) in tcp_wput_flush() argument
671 conn_t *connp = tcp->tcp_connp; in tcp_wput_flush()
675 if ((fval & FLUSHW) && tcp->tcp_xmit_head != NULL && in tcp_wput_flush()
676 !(tcp->tcp_valid_bits & TCP_URG_VALID)) { in tcp_wput_flush()
682 tail = tcp->tcp_xmit_tail; in tcp_wput_flush()
683 tail->b_wptr -= tcp->tcp_xmit_tail_unsent; in tcp_wput_flush()
684 tcp->tcp_xmit_tail_unsent = 0; in tcp_wput_flush()
685 tcp->tcp_unsent = 0; in tcp_wput_flush()
689 mblk_t **excess = &tcp->tcp_xmit_head; in tcp_wput_flush()
694 tcp->tcp_xmit_tail = mp1; in tcp_wput_flush()
695 tcp->tcp_xmit_last = mp1; in tcp_wput_flush()
700 if (tcp->tcp_snd_zcopy_aware) in tcp_wput_flush()
701 tcp_zcopy_notify(tcp); in tcp_wput_flush()
707 mutex_enter(&tcp->tcp_non_sq_lock); in tcp_wput_flush()
708 if (tcp->tcp_flow_stopped) { in tcp_wput_flush()
709 tcp_clrqfull(tcp); in tcp_wput_flush()
711 mutex_exit(&tcp->tcp_non_sq_lock); in tcp_wput_flush()
731 tcp_wput_iocdata(tcp_t *tcp, mblk_t *mp) in tcp_wput_iocdata() argument
737 conn_t *connp = tcp->tcp_connp; in tcp_wput_iocdata()
805 if (tcp->tcp_state < TCPS_SYN_RCVD) { in tcp_wput_iocdata()
840 tcp_t *tcp = connp->conn_tcp; in tcp_wput_ioctl() local
868 if (!tcp->tcp_issocket) { in tcp_wput_ioctl()
872 tcp_use_pure_tpi(tcp); in tcp_wput_ioctl()
909 tcp_t *tcp = connp->conn_tcp; in tcp_wput_proto() local
938 tcp_wput_data(tcp, mp->b_cont, B_TRUE); in tcp_wput_proto()
956 tcp_tpi_bind(tcp, mp); in tcp_wput_proto()
959 tcp_tpi_unbind(tcp, mp); in tcp_wput_proto()
963 tcp_tli_accept(tcp, mp); in tcp_wput_proto()
966 tcp_tpi_connect(tcp, mp); in tcp_wput_proto()
969 tcp_disconnect(tcp, mp); in tcp_wput_proto()
972 tcp_capability_req(tcp, mp); /* capability request */ in tcp_wput_proto()
975 tcp_info_req(tcp, mp); in tcp_wput_proto()
994 tcp_err_ack(tcp, mp, TSYSERR, EINVAL); in tcp_wput_proto()
1010 tcp_err_ack(tcp, mp, TNOTSUPPORT, 0); in tcp_wput_proto()
1015 if (tcp->tcp_fused) in tcp_wput_proto()
1016 tcp_unfuse(tcp); in tcp_wput_proto()
1018 if (tcp_xmit_end(tcp) != 0) { in tcp_wput_proto()
1028 tcp_display(tcp, NULL, in tcp_wput_proto()
1034 tcp_addr_req(tcp, mp); in tcp_wput_proto()
1046 tcp_err_ack(tcp, mp, TNOTSUPPORT, 0); in tcp_wput_proto()
1060 tcp_t *tcp = connp->conn_tcp; in tcp_wput_cmdblk() local
1073 if (tcp->tcp_state < TCPS_SYN_RCVD) in tcp_wput_cmdblk()
1113 tcp_t *tcp = connp->conn_tcp; in tcp_output() local
1115 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_output()
1134 mutex_enter(&tcp->tcp_non_sq_lock); in tcp_output()
1135 tcp->tcp_squeue_bytes -= msize; in tcp_output()
1136 mutex_exit(&tcp->tcp_non_sq_lock); in tcp_output()
1139 if (tcp->tcp_fused && tcp_fuse_output(tcp, mp, msize)) in tcp_output()
1142 mss = tcp->tcp_mss; in tcp_output()
1147 if (tcp->tcp_snd_zcopy_aware && !tcp->tcp_snd_zcopy_on) in tcp_output()
1148 mp = tcp_zcopy_backoff(tcp, mp, B_FALSE); in tcp_output()
1165 if (tcp->tcp_unsent != 0 || in tcp_output()
1166 tcp->tcp_cork || in tcp_output()
1167 tcp->tcp_md5sig || in tcp_output()
1169 tcp->tcp_state != TCPS_ESTABLISHED || in tcp_output()
1172 tcp->tcp_valid_bits != 0) { in tcp_output()
1173 tcp_wput_data(tcp, mp, B_FALSE); in tcp_output()
1177 ASSERT(tcp->tcp_xmit_tail_unsent == 0); in tcp_output()
1178 ASSERT(tcp->tcp_fin_sent == 0); in tcp_output()
1181 if (tcp->tcp_xmit_head == NULL) { in tcp_output()
1182 tcp->tcp_xmit_head = mp; in tcp_output()
1184 tcp->tcp_xmit_last->b_cont = mp; in tcp_output()
1186 tcp->tcp_xmit_last = mp; in tcp_output()
1187 tcp->tcp_xmit_tail = mp; in tcp_output()
1199 snxt = tcp->tcp_snxt; in tcp_output()
1211 if ((tcp->tcp_suna == snxt) && !tcp->tcp_localnet && in tcp_output()
1212 (TICK_TO_MSEC(now - tcp->tcp_last_recv_time) >= tcp->tcp_rto)) { in tcp_output()
1213 cc_after_idle(tcp); in tcp_output()
1216 usable = tcp->tcp_swnd; /* tcp window size */ in tcp_output()
1217 if (usable > tcp->tcp_cwnd) in tcp_output()
1218 usable = tcp->tcp_cwnd; /* congestion window smaller */ in tcp_output()
1220 suna = tcp->tcp_suna; in tcp_output()
1228 mutex_enter(&tcp->tcp_non_sq_lock); in tcp_output()
1229 if (tcp->tcp_flow_stopped && in tcp_output()
1230 TCP_UNSENT_BYTES(tcp) <= connp->conn_sndlowat) { in tcp_output()
1231 tcp_clrqfull(tcp); in tcp_output()
1233 mutex_exit(&tcp->tcp_non_sq_lock); in tcp_output()
1244 (len < (int)tcp->tcp_naglim) && in tcp_output()
1245 (tcp->tcp_last_sent_len < tcp->tcp_naglim)) { in tcp_output()
1253 tcp->tcp_unsent = len; in tcp_output()
1254 tcp->tcp_xmit_tail_unsent = len; in tcp_output()
1265 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_output()
1269 tcp->tcp_rack_cnt = 0; in tcp_output()
1271 tcp->tcp_snxt = snxt + len; in tcp_output()
1272 tcp->tcp_rack = tcp->tcp_rnxt; in tcp_output()
1280 tcpha = tcp->tcp_tcpha; in tcp_output()
1292 tcp->tcp_cs.tcp_out_data_segs++; in tcp_output()
1293 tcp->tcp_cs.tcp_out_data_bytes += len; in tcp_output()
1296 tcpha->tha_win = htons(tcp->tcp_rwnd >> tcp->tcp_rcv_ws); in tcp_output()
1298 tcp->tcp_last_sent_len = (ushort_t)len; in tcp_output()
1306 tcp->tcp_ipha->ipha_length = htons(plen); in tcp_output()
1308 tcp->tcp_ip6h->ip6_plen = htons(plen - IPV6_HDR_LEN); in tcp_output()
1332 if (tcp->tcp_snd_ts_ok) { in tcp_output()
1335 U32_TO_BE32(tcp->tcp_ts_recent, in tcp_output()
1367 if (tcp->tcp_ecn_ok) { in tcp_output()
1368 TCP_SET_ECT(tcp, rptr); in tcp_output()
1371 if (tcp->tcp_ecn_echo_on) in tcp_output()
1373 if (tcp->tcp_cwr && !tcp->tcp_ecn_cwr_sent) { in tcp_output()
1375 tcp->tcp_ecn_cwr_sent = B_TRUE; in tcp_output()
1379 if (tcp->tcp_ip_forward_progress) { in tcp_output()
1380 tcp->tcp_ip_forward_progress = B_FALSE; in tcp_output()
1385 tcp_send_data(tcp, mp1); in tcp_output()
1397 tcp->tcp_unsent = len; in tcp_output()
1398 tcp->tcp_xmit_tail_unsent = len; in tcp_output()
1399 tcp_wput_data(tcp, NULL, B_FALSE); in tcp_output()
1409 tcp_t *tcp = connp->conn_tcp; in tcp_output_urgent() local
1424 len += tcp->tcp_unsent; in tcp_output_urgent()
1425 len += tcp->tcp_snxt; in tcp_output_urgent()
1426 tcp->tcp_urg = len; in tcp_output_urgent()
1427 tcp->tcp_valid_bits |= TCP_URG_VALID; in tcp_output_urgent()
1430 if (tcp->tcp_fused && tcp_fuse_output(tcp, mp, msize)) in tcp_output_urgent()
1440 tcp_wput_data(tcp, mp, B_TRUE); in tcp_output_urgent()
1463 tcp_t *tcp = connp->conn_tcp; in tcp_close_output() local
1465 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_close_output()
1477 mutex_enter(&tcp->tcp_eager_lock); in tcp_close_output()
1478 if (tcp->tcp_conn_req_cnt_q0 != 0 || tcp->tcp_conn_req_cnt_q != 0) { in tcp_close_output()
1484 tcp_eager_cleanup(tcp, IPCL_IS_NONSTR(connp) ? 1 : 0); in tcp_close_output()
1485 tcp->tcp_wait_for_eagers = 1; in tcp_close_output()
1487 mutex_exit(&tcp->tcp_eager_lock); in tcp_close_output()
1489 tcp->tcp_lso = B_FALSE; in tcp_close_output()
1492 switch (tcp->tcp_state) { in tcp_close_output()
1497 if (tcp->tcp_listener != NULL) { in tcp_close_output()
1504 mutex_enter(&tcp->tcp_saved_listener->tcp_eager_lock); in tcp_close_output()
1505 tcp_eager_unlink(tcp); in tcp_close_output()
1506 mutex_exit(&tcp->tcp_saved_listener->tcp_eager_lock); in tcp_close_output()
1507 CONN_DEC_REF(tcp->tcp_saved_listener->tcp_connp); in tcp_close_output()
1524 if (tcp->tcp_fused) in tcp_close_output()
1525 tcp_unfuse(tcp); in tcp_close_output()
1539 if (tcp->tcp_rcv_list || tcp->tcp_reass_head) { in tcp_close_output()
1550 if (tcp->tcp_listener != NULL) { in tcp_close_output()
1559 mutex_enter(&tcp->tcp_saved_listener->tcp_eager_lock); in tcp_close_output()
1560 tcp_eager_unlink(tcp); in tcp_close_output()
1561 mutex_exit(&tcp->tcp_saved_listener->tcp_eager_lock); in tcp_close_output()
1562 CONN_DEC_REF(tcp->tcp_saved_listener->tcp_connp); in tcp_close_output()
1571 (void) tcp_xmit_end(tcp); in tcp_close_output()
1578 !(tcp->tcp_fin_acked) && in tcp_close_output()
1579 tcp->tcp_state >= TCPS_ESTABLISHED) { in tcp_close_output()
1580 if (tcp->tcp_closeflags & (FNDELAY|FNONBLOCK)) { in tcp_close_output()
1581 tcp->tcp_client_errno = EWOULDBLOCK; in tcp_close_output()
1582 } else if (tcp->tcp_client_errno == 0) { in tcp_close_output()
1584 ASSERT(tcp->tcp_linger_tid == 0); in tcp_close_output()
1587 tcp->tcp_linger_tid = TCP_TIMER(tcp, in tcp_close_output()
1592 if (tcp->tcp_linger_tid == 0) in tcp_close_output()
1593 tcp->tcp_client_errno = ENOSR; in tcp_close_output()
1602 if (tcp->tcp_state <= TCPS_LISTEN) in tcp_close_output()
1611 tcp_acceptor_hash_remove(tcp); in tcp_close_output()
1613 mutex_enter(&tcp->tcp_non_sq_lock); in tcp_close_output()
1614 if (tcp->tcp_flow_stopped) { in tcp_close_output()
1615 tcp_clrqfull(tcp); in tcp_close_output()
1617 mutex_exit(&tcp->tcp_non_sq_lock); in tcp_close_output()
1619 if (tcp->tcp_timer_tid != 0) { in tcp_close_output()
1620 delta = TCP_TIMER_CANCEL(tcp, tcp->tcp_timer_tid); in tcp_close_output()
1621 tcp->tcp_timer_tid = 0; in tcp_close_output()
1628 tcp_timers_stop(tcp); in tcp_close_output()
1630 tcp->tcp_detached = B_TRUE; in tcp_close_output()
1631 if (tcp->tcp_state == TCPS_TIME_WAIT) { in tcp_close_output()
1632 tcp_time_wait_append(tcp); in tcp_close_output()
1645 tcp->tcp_timer_tid = TCP_TIMER(tcp, tcp_timer, in tcp_close_output()
1654 if (tcp->tcp_state == TCPS_ESTABLISHED || in tcp_close_output()
1655 tcp->tcp_state == TCPS_CLOSE_WAIT) in tcp_close_output()
1657 if (tcp->tcp_state == TCPS_SYN_SENT || in tcp_close_output()
1658 tcp->tcp_state == TCPS_SYN_RCVD) in tcp_close_output()
1660 tcp_xmit_ctl(msg, tcp, tcp->tcp_snxt, 0, TH_RST); in tcp_close_output()
1663 tcp_closei_local(tcp); in tcp_close_output()
1677 if (!tcp->tcp_wait_for_eagers) { in tcp_close_output()
1678 tcp->tcp_detached = B_TRUE; in tcp_close_output()
1705 mutex_enter(&tcp->tcp_closelock); in tcp_close_output()
1706 tcp->tcp_closed = 1; in tcp_close_output()
1707 cv_signal(&tcp->tcp_closecv); in tcp_close_output()
1708 mutex_exit(&tcp->tcp_closelock); in tcp_close_output()
1716 tcp_t *tcp = connp->conn_tcp; in tcp_shutdown_output() local
1720 if (tcp->tcp_fused) in tcp_shutdown_output()
1721 tcp_unfuse(tcp); in tcp_shutdown_output()
1723 if (tcp_xmit_end(tcp) != 0) { in tcp_shutdown_output()
1732 tcp_display(tcp, NULL, DISP_ADDR_AND_PORT)); in tcp_shutdown_output()
1740 tcp_send_data(tcp_t *tcp, mblk_t *mp) in tcp_send_data() argument
1742 conn_t *connp = tcp->tcp_connp; in tcp_send_data()
1753 if (tcp->tcp_snd_zcopy_aware && !tcp->tcp_snd_zcopy_on && in tcp_send_data()
1754 !tcp->tcp_xmit_zc_clean) { in tcp_send_data()
1761 __dtrace_tcp_void_ip_t *, mp->b_rptr, tcp_t *, tcp, in tcp_send_data()
1774 tcp_t *tcp = econnp->conn_tcp; in tcp_send_synack() local
1778 if (tcp->tcp_state == TCPS_CLOSED) { in tcp_send_synack()
1801 tcp_send(tcp_t *tcp, const int mss, const int total_hdr_len, in tcp_send() argument
1808 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_send()
1809 conn_t *connp = tcp->tcp_connp; in tcp_send()
1818 if (tcp->tcp_lso && (tcp->tcp_valid_bits & ~TCP_FSS_VALID) == 0) in tcp_send()
1839 lso_usable = MIN(tcp->tcp_lso_max, *usable); in tcp_send()
1843 tcp->tcp_last_sent_len = (ushort_t) in tcp_send()
1846 tcp->tcp_last_sent_len = (ushort_t)mss; in tcp_send()
1874 if (len < (tcp->tcp_max_swnd >> 1) && in tcp_send()
1875 (tcp->tcp_unsent - (*snxt - tcp->tcp_snxt)) > len && in tcp_send()
1876 !((tcp->tcp_valid_bits & TCP_URG_VALID) && in tcp_send()
1877 len == 1) && (! tcp->tcp_zero_win_probe)) { in tcp_send()
1884 if (*snxt == tcp->tcp_snxt && in tcp_send()
1885 *snxt == tcp->tcp_suna) { in tcp_send()
1896 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_send()
1902 tcpha = tcp->tcp_tcpha; in tcp_send()
1943 if (tcp->tcp_md5sig || (tcp->tcp_valid_bits != 0 && in tcp_send()
1944 (tcp->tcp_valid_bits != TCP_FSS_VALID || in tcp_send()
1945 *snxt + len == tcp->tcp_fss))) { in tcp_send()
1947 uint32_t prev_snxt = tcp->tcp_snxt; in tcp_send()
1960 mp = tcp_xmit_mp(tcp, *xmit_tail, len, NULL, NULL, in tcp_send()
1963 tcp->tcp_snxt = prev_snxt; in tcp_send()
1983 tcp->tcp_last_sent_len = (ushort_t)len; in tcp_send()
1996 tcp->tcp_cs.tcp_out_data_segs++; in tcp_send()
1997 tcp->tcp_cs.tcp_out_data_bytes += len; in tcp_send()
1998 tcp_send_data(tcp, mp); in tcp_send()
2006 tcp->tcp_cs.tcp_out_data_segs++; in tcp_send()
2007 tcp->tcp_cs.tcp_out_data_bytes += len; in tcp_send()
2015 tcp->tcp_last_sent_len = (ushort_t)len; in tcp_send()
2020 tcp->tcp_ipha->ipha_length = htons(len); in tcp_send()
2022 tcp->tcp_ip6h->ip6_plen = in tcp_send()
2055 tcp->tcp_last_sent_len = (ushort_t)len; in tcp_send()
2061 tcp->tcp_ipha->ipha_length = htons(len); in tcp_send()
2063 tcp->tcp_ip6h->ip6_plen = htons(len - IPV6_HDR_LEN); in tcp_send()
2104 tcp_fill_header(tcp, rptr, num_sack_blk); in tcp_send()
2138 if (tcp->tcp_maxpsz_multiplier > 0) in tcp_send()
2147 if (tcp->tcp_localnet && in tcp_send()
2148 !tcp->tcp_cork && in tcp_send()
2181 tcp->tcp_last_sent_len += spill; in tcp_send()
2183 tcp->tcp_cs.tcp_out_data_bytes += spill; in tcp_send()
2209 if (tcp->tcp_ip_forward_progress) { in tcp_send()
2210 tcp->tcp_ip_forward_progress = B_FALSE; in tcp_send()
2225 tcp_send_data(tcp, mp); in tcp_send()
2242 tcp_send_data(tcp, mp); in tcp_send()
2255 tcp_xmit_end(tcp_t *tcp) in tcp_xmit_end() argument
2258 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_xmit_end()
2261 conn_t *connp = tcp->tcp_connp; in tcp_xmit_end()
2263 if (tcp->tcp_state < TCPS_SYN_RCVD || in tcp_xmit_end()
2264 tcp->tcp_state > TCPS_CLOSE_WAIT) { in tcp_xmit_end()
2272 tcp->tcp_fss = tcp->tcp_snxt + tcp->tcp_unsent; in tcp_xmit_end()
2273 tcp->tcp_valid_bits |= TCP_FSS_VALID; in tcp_xmit_end()
2278 if (tcp->tcp_unsent == 0) { in tcp_xmit_end()
2279 mp = tcp_xmit_mp(tcp, NULL, 0, NULL, NULL, in tcp_xmit_end()
2280 tcp->tcp_fss, B_FALSE, NULL, B_FALSE); in tcp_xmit_end()
2283 tcp_send_data(tcp, mp); in tcp_xmit_end()
2289 tcp->tcp_snxt = tcp->tcp_fss + 1; in tcp_xmit_end()
2290 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_xmit_end()
2297 if (tcp->tcp_rexmit && tcp->tcp_rexmit_nxt == tcp->tcp_fss) { in tcp_xmit_end()
2298 tcp->tcp_rexmit_nxt = tcp->tcp_snxt; in tcp_xmit_end()
2305 if (tcp->tcp_cork) in tcp_xmit_end()
2306 tcp->tcp_cork = B_FALSE; in tcp_xmit_end()
2307 tcp_wput_data(tcp, NULL, B_FALSE); in tcp_xmit_end()
2315 tcp->tcp_rtt_update < tcps->tcps_rtt_updates) in tcp_xmit_end()
2323 uinfo.iulp_rtt = NSEC2MSEC(tcp->tcp_rtt_sa); in tcp_xmit_end()
2324 uinfo.iulp_rtt_sd = NSEC2MSEC(tcp->tcp_rtt_sd); in tcp_xmit_end()
2331 if (connp->conn_faddr_v4 != tcp->tcp_ipha->ipha_dst) { in tcp_xmit_end()
2339 &tcp->tcp_ip6h->ip6_dst))) { in tcp_xmit_end()
2369 tcp_xmit_ctl(char *str, tcp_t *tcp, uint32_t seq, uint32_t ack, int ctl) in tcp_xmit_ctl() argument
2379 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_xmit_ctl()
2380 conn_t *connp = tcp->tcp_connp; in tcp_xmit_ctl()
2423 if (tcp->tcp_snd_ts_ok && in tcp_xmit_ctl()
2424 tcp->tcp_state > TCPS_SYN_SENT) { in tcp_xmit_ctl()
2442 if (tcp->tcp_snd_ts_ok) { in tcp_xmit_ctl()
2447 U32_TO_BE32(tcp->tcp_ts_recent, in tcp_xmit_ctl()
2452 tcpha->tha_win = htons(tcp->tcp_rwnd >> tcp->tcp_rcv_ws); in tcp_xmit_ctl()
2454 tcp->tcp_tcpha->tha_win = tcpha->tha_win; in tcp_xmit_ctl()
2455 tcp->tcp_rack = ack; in tcp_xmit_ctl()
2456 tcp->tcp_rack_cnt = 0; in tcp_xmit_ctl()
2463 if (tcp->tcp_md5sig) { in tcp_xmit_ctl()
2468 if (tcpsig_signature(mp->b_cont, tcp, tcpha, tcplen, digest, in tcp_xmit_ctl()
2501 tcp_send_data(tcp, mp); in tcp_xmit_ctl()
2849 tcp_xmit_mp_aux_iss(tcp_t *tcp, conn_t *connp, tcpha_t *tcpha, mblk_t *mp, in tcp_xmit_mp_aux_iss() argument
2854 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_xmit_mp_aux_iss()
2864 ASSERT(tcp->tcp_state == TCPS_SYN_SENT || in tcp_xmit_mp_aux_iss()
2865 tcp->tcp_state == TCPS_SYN_RCVD || in tcp_xmit_mp_aux_iss()
2866 tcp->tcp_state == TCPS_FIN_WAIT_1); in tcp_xmit_mp_aux_iss()
2890 u1 = tcp->tcp_initial_pmtu - (connp->conn_ipversion == IPV4_VERSION ? in tcp_xmit_mp_aux_iss()
2898 switch (tcp->tcp_state) { in tcp_xmit_mp_aux_iss()
2902 if (tcp->tcp_snd_sack_ok) in tcp_xmit_mp_aux_iss()
2905 if (tcp->tcp_snd_ts_ok) { in tcp_xmit_mp_aux_iss()
2921 ASSERT(tcp->tcp_ts_recent == 0); in tcp_xmit_mp_aux_iss()
2931 if (tcp->tcp_ecn_ok) in tcp_xmit_mp_aux_iss()
2952 u1 = tcp->tcp_mss; in tcp_xmit_mp_aux_iss()
2966 if (tcp->tcp_snd_sack_ok) { in tcp_xmit_mp_aux_iss()
2967 if (tcp->tcp_snd_ts_ok) { in tcp_xmit_mp_aux_iss()
2990 if (tcp->tcp_ecn_ok) in tcp_xmit_mp_aux_iss()
3013 if (tcp->tcp_snd_ws_ok) { in tcp_xmit_mp_aux_iss()
3017 wptr[3] = (uchar_t)tcp->tcp_rcv_ws; in tcp_xmit_mp_aux_iss()
3039 tcp_xmit_mp_aux_fss(tcp_t *tcp, ip_xmit_attr_t *ixa, uint_t *flags) in tcp_xmit_mp_aux_fss() argument
3041 if (!tcp->tcp_fin_acked) { in tcp_xmit_mp_aux_fss()
3043 TCPS_BUMP_MIB(tcp->tcp_tcps, tcpOutControl); in tcp_xmit_mp_aux_fss()
3045 if (!tcp->tcp_fin_sent) { in tcp_xmit_mp_aux_fss()
3046 tcp->tcp_fin_sent = B_TRUE; in tcp_xmit_mp_aux_fss()
3047 switch (tcp->tcp_state) { in tcp_xmit_mp_aux_fss()
3049 tcp->tcp_state = TCPS_FIN_WAIT_1; in tcp_xmit_mp_aux_fss()
3052 tcp_t *, tcp, void, NULL, in tcp_xmit_mp_aux_fss()
3056 tcp->tcp_state = TCPS_FIN_WAIT_1; in tcp_xmit_mp_aux_fss()
3059 tcp_t *, tcp, void, NULL, in tcp_xmit_mp_aux_fss()
3063 tcp->tcp_state = TCPS_LAST_ACK; in tcp_xmit_mp_aux_fss()
3066 tcp_t *, tcp, void, NULL, in tcp_xmit_mp_aux_fss()
3070 if (tcp->tcp_suna == tcp->tcp_snxt) in tcp_xmit_mp_aux_fss()
3071 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_xmit_mp_aux_fss()
3072 tcp->tcp_snxt = tcp->tcp_fss + 1; in tcp_xmit_mp_aux_fss()
3091 tcp_xmit_mp(tcp_t *tcp, mblk_t *mp, int32_t max_to_send, int32_t *offset, in tcp_xmit_mp() argument
3104 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_xmit_mp()
3105 conn_t *connp = tcp->tcp_connp; in tcp_xmit_mp()
3123 if (tcp->tcp_snd_sack_ok && tcp->tcp_num_sack_blk > 0) { in tcp_xmit_mp()
3124 num_sack_blk = MIN(tcp->tcp_max_sack_blk, in tcp_xmit_mp()
3125 tcp->tcp_num_sack_blk); in tcp_xmit_mp()
3130 if (tcp->tcp_md5sig) in tcp_xmit_mp()
3133 if (max_to_send + opt_len > tcp->tcp_mss) in tcp_xmit_mp()
3180 tcp->tcp_tcpha->tha_win = htons(tcp->tcp_rwnd >> tcp->tcp_rcv_ws); in tcp_xmit_mp()
3196 if (data_length != 0 && (tcp->tcp_unsent == 0 || in tcp_xmit_mp()
3197 tcp->tcp_unsent == data_length)) { in tcp_xmit_mp()
3203 if (tcp->tcp_ecn_ok) { in tcp_xmit_mp()
3204 if (tcp->tcp_ecn_echo_on) in tcp_xmit_mp()
3213 TCP_SET_ECT(tcp, rptr); in tcp_xmit_mp()
3214 if (tcp->tcp_cwr && !tcp->tcp_ecn_cwr_sent) { in tcp_xmit_mp()
3216 tcp->tcp_ecn_cwr_sent = B_TRUE; in tcp_xmit_mp()
3222 if (tcp->tcp_valid_bits) { in tcp_xmit_mp()
3226 if ((tcp->tcp_valid_bits & TCP_ISS_VALID) && in tcp_xmit_mp()
3227 seq == tcp->tcp_iss) { in tcp_xmit_mp()
3229 tcp_xmit_mp_aux_iss(tcp, connp, tcpha, mp1, &flags); in tcp_xmit_mp()
3230 } else if ((tcp->tcp_valid_bits & TCP_FSS_VALID) && in tcp_xmit_mp()
3231 (seq + data_length) == tcp->tcp_fss) { in tcp_xmit_mp()
3233 tcp_xmit_mp_aux_fss(tcp, ixa, &flags); in tcp_xmit_mp()
3244 u1 = tcp->tcp_urg - seq + TCP_OLD_URP_INTERPRETATION; in tcp_xmit_mp()
3245 if ((tcp->tcp_valid_bits & TCP_URG_VALID) && u1 != 0 && in tcp_xmit_mp()
3253 tcp->tcp_rack = tcp->tcp_rnxt; in tcp_xmit_mp()
3254 tcp->tcp_rack_cnt = 0; in tcp_xmit_mp()
3257 if (tcp->tcp_snd_ts_ok) { in tcp_xmit_mp()
3258 if (tcp->tcp_state != TCPS_SYN_SENT) { in tcp_xmit_mp()
3263 U32_TO_BE32(tcp->tcp_ts_recent, in tcp_xmit_mp()
3281 tmp = tcp->tcp_sack_list; in tcp_xmit_mp()
3292 if (tcp->tcp_md5sig) { in tcp_xmit_mp()
3297 if (tcpsig_signature(mp1->b_cont, tcp, tcpha, tcplen, digest, in tcp_xmit_mp()
3337 if (tcp->tcp_ip_forward_progress) { in tcp_xmit_mp()
3338 tcp->tcp_ip_forward_progress = B_FALSE; in tcp_xmit_mp()
3393 tcp_sack_rexmit(tcp_t *tcp, uint_t *flags) in tcp_sack_rexmit() argument
3400 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_sack_rexmit()
3402 ASSERT(tcp->tcp_notsack_list != NULL); in tcp_sack_rexmit()
3403 ASSERT(tcp->tcp_rexmit == B_FALSE); in tcp_sack_rexmit()
3406 if (tcp->tcp_notsack_list == NULL) { in tcp_sack_rexmit()
3409 notsack_blk = tcp->tcp_notsack_list; in tcp_sack_rexmit()
3410 mss = tcp->tcp_mss; in tcp_sack_rexmit()
3416 usable_swnd = tcp->tcp_cwnd_ssthresh - tcp->tcp_pipe; in tcp_sack_rexmit()
3424 tcp->tcp_csuna = tcp->tcp_snxt; in tcp_sack_rexmit()
3426 notsack_blk = tcp->tcp_notsack_list; in tcp_sack_rexmit()
3429 tcp_seq begin = tcp->tcp_sack_snxt; in tcp_sack_rexmit()
3450 usable_swnd = tcp->tcp_cwnd_ssthresh - tcp->tcp_pipe; in tcp_sack_rexmit()
3451 if (usable_swnd <= 0 || tcp->tcp_unsent == 0) { in tcp_sack_rexmit()
3452 tcp->tcp_cwnd = tcp->tcp_snxt - tcp->tcp_suna; in tcp_sack_rexmit()
3453 ASSERT(tcp->tcp_cwnd > 0); in tcp_sack_rexmit()
3457 tcp->tcp_cwnd = tcp->tcp_snxt - tcp->tcp_suna + in tcp_sack_rexmit()
3471 snxt_mp = tcp_get_seg_mp(tcp, begin, &off); in tcp_sack_rexmit()
3478 xmit_mp = tcp_xmit_mp(tcp, snxt_mp, seg_len, &off, in tcp_sack_rexmit()
3484 tcp->tcp_pipe += seg_len; in tcp_sack_rexmit()
3485 tcp->tcp_sack_snxt = begin + seg_len; in tcp_sack_rexmit()
3487 tcp_send_data(tcp, xmit_mp); in tcp_sack_rexmit()
3497 tcp->tcp_cs.tcp_out_retrans_segs++; in tcp_sack_rexmit()
3498 tcp->tcp_cs.tcp_out_retrans_bytes += seg_len; in tcp_sack_rexmit()
3506 if (SEQ_GT(tcp->tcp_sack_snxt, tcp->tcp_rexmit_max)) { in tcp_sack_rexmit()
3507 tcp->tcp_rexmit_max = tcp->tcp_sack_snxt; in tcp_sack_rexmit()
3517 tcp_ss_rexmit(tcp_t *tcp) in tcp_ss_rexmit() argument
3525 tcp_stack_t *tcps = tcp->tcp_tcps; in tcp_ss_rexmit()
3531 if (SEQ_LT(tcp->tcp_rexmit_nxt, tcp->tcp_rexmit_max)) { in tcp_ss_rexmit()
3532 smax = tcp->tcp_rexmit_max; in tcp_ss_rexmit()
3533 snxt = tcp->tcp_rexmit_nxt; in tcp_ss_rexmit()
3534 if (SEQ_LT(snxt, tcp->tcp_suna)) { in tcp_ss_rexmit()
3535 snxt = tcp->tcp_suna; in tcp_ss_rexmit()
3537 win = MIN(tcp->tcp_cwnd, tcp->tcp_swnd); in tcp_ss_rexmit()
3538 win -= snxt - tcp->tcp_suna; in tcp_ss_rexmit()
3539 mss = tcp->tcp_mss; in tcp_ss_rexmit()
3540 snxt_mp = tcp_get_seg_mp(tcp, snxt, &off); in tcp_ss_rexmit()
3553 xmit_mp = tcp_xmit_mp(tcp, snxt_mp, cnt, &off, in tcp_ss_rexmit()
3558 tcp_send_data(tcp, xmit_mp); in tcp_ss_rexmit()
3569 tcp->tcp_cs.tcp_out_retrans_segs++; in tcp_ss_rexmit()
3570 tcp->tcp_cs.tcp_out_retrans_bytes += cnt; in tcp_ss_rexmit()
3572 tcp->tcp_rexmit_nxt = snxt; in tcp_ss_rexmit()
3586 if (tcp->tcp_unsent) { in tcp_ss_rexmit()
3587 tcp_wput_data(tcp, NULL, B_FALSE); in tcp_ss_rexmit()
3595 tcp_rexmit_after_error(tcp_t *tcp) in tcp_rexmit_after_error() argument
3601 if (!SEQ_LT(tcp->tcp_suna, tcp->tcp_snxt) || in tcp_rexmit_after_error()
3602 (tcp->tcp_xmit_head == NULL)) in tcp_rexmit_after_error()
3605 if ((tcp->tcp_valid_bits & TCP_FSS_VALID) && (tcp->tcp_unsent == 0)) in tcp_rexmit_after_error()
3606 tcp->tcp_rexmit_max = tcp->tcp_fss; in tcp_rexmit_after_error()
3608 tcp->tcp_rexmit_max = tcp->tcp_snxt; in tcp_rexmit_after_error()
3610 tcp->tcp_rexmit_nxt = tcp->tcp_suna; in tcp_rexmit_after_error()
3611 tcp->tcp_rexmit = B_TRUE; in tcp_rexmit_after_error()
3612 tcp->tcp_dupack_cnt = 0; in tcp_rexmit_after_error()
3613 tcp_ss_rexmit(tcp); in tcp_rexmit_after_error()
3636 tcp_get_seg_mp(tcp_t *tcp, uint32_t seq, int32_t *off) in tcp_get_seg_mp() argument
3642 if (SEQ_LT(seq, tcp->tcp_suna) || SEQ_GT(seq, tcp->tcp_snxt)) in tcp_get_seg_mp()
3645 cnt = seq - tcp->tcp_suna; in tcp_get_seg_mp()
3646 mp = tcp->tcp_xmit_head; in tcp_get_seg_mp()
3665 tcp_update_xmit_tail(tcp_t *tcp, uint32_t snxt) in tcp_update_xmit_tail() argument
3670 tcp->tcp_snxt = snxt; in tcp_update_xmit_tail()
3673 xmit_tail = tcp_get_seg_mp(tcp, snxt, &offset); in tcp_update_xmit_tail()
3675 tcp->tcp_xmit_tail = xmit_tail; in tcp_update_xmit_tail()
3676 tcp->tcp_xmit_tail_unsent = xmit_tail->b_wptr - in tcp_update_xmit_tail()
3688 tcp_process_shrunk_swnd(tcp_t *tcp, uint32_t shrunk_count) in tcp_process_shrunk_swnd() argument
3690 uint32_t snxt = tcp->tcp_snxt; in tcp_process_shrunk_swnd()
3694 if (!tcp->tcp_is_wnd_shrnk) { in tcp_process_shrunk_swnd()
3695 tcp->tcp_snxt_shrunk = snxt; in tcp_process_shrunk_swnd()
3696 tcp->tcp_is_wnd_shrnk = B_TRUE; in tcp_process_shrunk_swnd()
3697 } else if (SEQ_GT(snxt, tcp->tcp_snxt_shrunk)) { in tcp_process_shrunk_swnd()
3698 tcp->tcp_snxt_shrunk = snxt; in tcp_process_shrunk_swnd()
3705 tcp_update_xmit_tail(tcp, snxt); in tcp_process_shrunk_swnd()
3706 tcp->tcp_unsent += shrunk_count; in tcp_process_shrunk_swnd()
3712 TCP_NOTSACK_REMOVE_ALL(tcp->tcp_notsack_list, tcp); in tcp_process_shrunk_swnd()
3714 if (tcp->tcp_suna == tcp->tcp_snxt && tcp->tcp_swnd == 0) in tcp_process_shrunk_swnd()
3719 TCP_TIMER_RESTART(tcp, tcp->tcp_rto); in tcp_process_shrunk_swnd()
3728 tcp_fill_header(tcp_t *tcp, uchar_t *rptr, int num_sack_blk) in tcp_fill_header() argument
3733 conn_t *connp = tcp->tcp_connp; in tcp_fill_header()
3738 tcp_tmpl = tcp->tcp_tcpha; in tcp_fill_header()
3749 if (tcp->tcp_snd_ts_ok) { in tcp_fill_header()
3752 U32_TO_BE32(tcp->tcp_ts_recent, in tcp_fill_header()
3787 if (tcp->tcp_ecn_ok && !tcp->tcp_zero_win_probe) { in tcp_fill_header()
3788 TCP_SET_ECT(tcp, rptr); in tcp_fill_header()
3790 if (tcp->tcp_ecn_echo_on) in tcp_fill_header()
3792 if (tcp->tcp_cwr && !tcp->tcp_ecn_cwr_sent) { in tcp_fill_header()
3794 tcp->tcp_ecn_cwr_sent = B_TRUE; in tcp_fill_header()
3811 tmp = tcp->tcp_sack_list; in tcp_fill_header()