Print this page
11546 Track TCP round-trip time in nanoseconds
Portions contributed by: Cody Peter Mello <cody.mello@joyent.com>
Portions contributed by: Brandon Baker <bbaker@delphix.com>
Reviewed by: Jason King <jason.king@joyent.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Dan McDonald <danmcd@joyent.com>

*** 21,31 **** /* * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011 Nexenta Systems, Inc. All rights reserved. * Copyright 2011 Joyent, Inc. All rights reserved. ! * Copyright (c) 2014 by Delphix. All rights reserved. */ #include <sys/types.h> #include <sys/strlog.h> #include <sys/strsun.h> --- 21,31 ---- /* * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011 Nexenta Systems, Inc. All rights reserved. * Copyright 2011 Joyent, Inc. All rights reserved. ! * Copyright (c) 2014, 2016 by Delphix. All rights reserved. */ #include <sys/types.h> #include <sys/strlog.h> #include <sys/strsun.h>
*** 754,767 **** clock_t time_to_wait; TCPS_BUMP_MIB(tcps, tcpTimRetrans); if (!tcp->tcp_xmit_head) break; ! time_to_wait = ddi_get_lbolt() - ! (clock_t)tcp->tcp_xmit_head->b_prev; ! time_to_wait = tcp->tcp_rto - ! TICK_TO_MSEC(time_to_wait); /* * If the timer fires too early, 1 clock tick earlier, * restart the timer. */ if (time_to_wait > msec_per_tick) { --- 754,766 ---- clock_t time_to_wait; TCPS_BUMP_MIB(tcps, tcpTimRetrans); if (!tcp->tcp_xmit_head) break; ! time_to_wait = NSEC2MSEC(gethrtime() - ! (hrtime_t)(intptr_t)tcp->tcp_xmit_head->b_prev); ! time_to_wait = tcp->tcp_rto - time_to_wait; /* * If the timer fires too early, 1 clock tick earlier, * restart the timer. */ if (time_to_wait > msec_per_tick) {
*** 1010,1047 **** * tcp_rtt_update so that we won't accidentally cache a * bad value. But only do this if this is not a zero * window probe. */ if (tcp->tcp_rtt_sa != 0 && tcp->tcp_zero_win_probe == 0) { ! tcp->tcp_rtt_sd += (tcp->tcp_rtt_sa >> 3) + ! (tcp->tcp_rtt_sa >> 5); tcp->tcp_rtt_sa = 0; tcp_ip_notify(tcp); tcp->tcp_rtt_update = 0; } } timer_rexmit: tcp->tcp_timer_backoff++; - if ((ms = (tcp->tcp_rtt_sa >> 3) + tcp->tcp_rtt_sd + - tcps->tcps_rexmit_interval_extra + (tcp->tcp_rtt_sa >> 5)) < - tcp->tcp_rto_min) { /* ! * This means the original RTO is tcp_rexmit_interval_min. ! * So we will use tcp_rexmit_interval_min as the RTO value ! * and do the backoff. */ ! ms = tcp->tcp_rto_min << tcp->tcp_timer_backoff; ! } else { ! ms <<= tcp->tcp_timer_backoff; ! } if (ms > tcp->tcp_rto_max) { ms = tcp->tcp_rto_max; - /* - * ms is at max, decrement tcp_timer_backoff to avoid - * overflow. - */ tcp->tcp_timer_backoff--; } tcp->tcp_ms_we_have_waited += ms; if (tcp->tcp_zero_win_probe == 0) { tcp->tcp_rto = ms; --- 1009,1036 ---- * tcp_rtt_update so that we won't accidentally cache a * bad value. But only do this if this is not a zero * window probe. */ if (tcp->tcp_rtt_sa != 0 && tcp->tcp_zero_win_probe == 0) { ! tcp->tcp_rtt_sd += tcp->tcp_rtt_sa >> 3 + ! tcp->tcp_rtt_sa >> 5; tcp->tcp_rtt_sa = 0; tcp_ip_notify(tcp); tcp->tcp_rtt_update = 0; } } timer_rexmit: tcp->tcp_timer_backoff++; /* ! * Calculate the backed off retransmission timeout. If the shift brings ! * us back over the max, then we repin the value, and decrement the ! * backoff to avoid overflow. */ ! ms = tcp_calculate_rto(tcp, tcps, 0) << tcp->tcp_timer_backoff; if (ms > tcp->tcp_rto_max) { ms = tcp->tcp_rto_max; tcp->tcp_timer_backoff--; } tcp->tcp_ms_we_have_waited += ms; if (tcp->tcp_zero_win_probe == 0) { tcp->tcp_rto = ms;
*** 1057,1068 **** if (mss > tcp->tcp_mss) mss = tcp->tcp_mss; if (mss > tcp->tcp_swnd && tcp->tcp_swnd != 0) mss = tcp->tcp_swnd; ! if ((mp = tcp->tcp_xmit_head) != NULL) ! mp->b_prev = (mblk_t *)ddi_get_lbolt(); mp = tcp_xmit_mp(tcp, mp, mss, NULL, NULL, tcp->tcp_suna, B_TRUE, &mss, B_TRUE); /* * When slow start after retransmission begins, start with --- 1046,1058 ---- if (mss > tcp->tcp_mss) mss = tcp->tcp_mss; if (mss > tcp->tcp_swnd && tcp->tcp_swnd != 0) mss = tcp->tcp_swnd; ! if ((mp = tcp->tcp_xmit_head) != NULL) { ! mp->b_prev = (mblk_t *)(intptr_t)gethrtime(); ! } mp = tcp_xmit_mp(tcp, mp, mss, NULL, NULL, tcp->tcp_suna, B_TRUE, &mss, B_TRUE); /* * When slow start after retransmission begins, start with