Index: sys/netinet/tcp_input.c =================================================================== --- sys/netinet/tcp_input.c +++ sys/netinet/tcp_input.c @@ -1613,6 +1613,10 @@ * XXX: This should be done after segment * validation to ignore broken/spoofed segs. */ + if (tp->t_idle_reduce && + (tp->snd_max == tp->snd_una) && + ((ticks - tp->t_rcvtime) >= tp->t_rxtcur)) + cc_after_idle(tp); tp->t_rcvtime = ticks; /* Index: sys/netinet/tcp_output.c =================================================================== --- sys/netinet/tcp_output.c +++ sys/netinet/tcp_output.c @@ -155,7 +155,7 @@ tcp_timer_active((tp), TT_PERSIST), \ ("neither rexmt nor persist timer is set")) -static void inline cc_after_idle(struct tcpcb *tp); +void cc_after_idle(struct tcpcb *tp); #ifdef TCP_HHOOK /* @@ -183,7 +183,7 @@ /* * CC wrapper hook functions */ -static void inline +void cc_after_idle(struct tcpcb *tp) { INP_WLOCK_ASSERT(tp->t_inpcb); Index: sys/netinet/tcp_var.h =================================================================== --- sys/netinet/tcp_var.h +++ sys/netinet/tcp_var.h @@ -1208,6 +1208,7 @@ uint32_t tcp_hc_getmtu(struct in_conninfo *); void tcp_hc_updatemtu(struct in_conninfo *, uint32_t); void tcp_hc_update(struct in_conninfo *, struct hc_metrics_lite *); +void cc_after_idle(struct tcpcb *tp); extern struct protosw tcp_protosw; /* shared for TOE */ extern struct protosw tcp6_protosw; /* shared for TOE */