Index: netinet/tcp_input.c =================================================================== --- netinet/tcp_input.c +++ netinet/tcp_input.c @@ -514,7 +514,7 @@ (tlen <= tp->t_maxseg) && \ (V_tcp_delack_enabled || (tp->t_flags & TF_NEEDSYN))) -static void inline +void inline cc_ecnpkt_handler(struct tcpcb *tp, struct tcphdr *th, uint8_t iptos) { INP_WLOCK_ASSERT(tp->t_inpcb); Index: netinet/tcp_stacks/rack.c =================================================================== --- netinet/tcp_stacks/rack.c +++ netinet/tcp_stacks/rack.c @@ -7715,6 +7715,10 @@ TCPSTAT_INC(tcps_ecn_ect1); break; } + + /* Process a packet differently from RFC3168. */ + cc_ecnpkt_handler(tp, th, iptos); + /* Congestion experienced. */ if (thflags & TH_ECE) { rack_cong_signal(tp, th, CC_ECN); Index: netinet/tcp_var.h =================================================================== --- netinet/tcp_var.h +++ netinet/tcp_var.h @@ -891,6 +891,7 @@ uint16_t nsegs, uint16_t type); void cc_conn_init(struct tcpcb *tp); void cc_post_recovery(struct tcpcb *tp, struct tcphdr *th); +void cc_ecnpkt_handler(struct tcpcb *tp, struct tcphdr *th, uint8_t iptos); void cc_cong_signal(struct tcpcb *tp, struct tcphdr *th, uint32_t type); #ifdef TCP_HHOOK void hhook_run_tcp_est_in(struct tcpcb *tp,