diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c --- a/sys/netinet/tcp_input.c +++ b/sys/netinet/tcp_input.c @@ -1614,6 +1614,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; if (thflags & TH_FIN) diff --git a/sys/netinet/tcp_output.c b/sys/netinet/tcp_output.c --- a/sys/netinet/tcp_output.c +++ b/sys/netinet/tcp_output.c @@ -155,8 +155,6 @@ tcp_timer_active((tp), TT_PERSIST), \ ("neither rexmt nor persist timer is set")) -static void inline cc_after_idle(struct tcpcb *tp); - #ifdef TCP_HHOOK /* * Wrapper for the TCP established output helper hook. @@ -183,7 +181,7 @@ /* * CC wrapper hook functions */ -static void inline +void cc_after_idle(struct tcpcb *tp) { INP_WLOCK_ASSERT(tp->t_inpcb); diff --git a/sys/netinet/tcp_var.h b/sys/netinet/tcp_var.h --- a/sys/netinet/tcp_var.h +++ b/sys/netinet/tcp_var.h @@ -1206,6 +1206,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 */