Index: netinet/in_pcb.c =================================================================== RCS file: /cvs/src/sys/netinet/in_pcb.c,v retrieving revision 1.249 diff -u -p -r1.249 in_pcb.c --- netinet/in_pcb.c 27 May 2020 20:44:07 -0000 1.249 +++ netinet/in_pcb.c 25 Jun 2020 10:17:49 -0000 @@ -85,6 +85,7 @@ #include #include #include +#include #include #include @@ -515,6 +516,8 @@ in_pcbconnect(struct inpcb *inp, struct } inp->inp_faddr = sin->sin_addr; inp->inp_fport = sin->sin_port; + inp->inp_flowid = stoeplitz_ip4port(inp->inp_laddr.s_addr, + inp->inp_faddr.s_addr, inp->inp_lport, inp->inp_fport); in_pcbrehash(inp); #ifdef IPSEC { @@ -549,6 +552,7 @@ in_pcbdisconnect(struct inpcb *inp) } inp->inp_fport = 0; + inp->inp_flowid = 0; in_pcbrehash(inp); if (inp->inp_socket->so_state & SS_NOFDREF) in_pcbdetach(inp); Index: netinet/in_pcb.h =================================================================== RCS file: /cvs/src/sys/netinet/in_pcb.h,v retrieving revision 1.120 diff -u -p -r1.120 in_pcb.h --- netinet/in_pcb.h 21 Jun 2020 05:14:04 -0000 1.120 +++ netinet/in_pcb.h 25 Jun 2020 10:17:49 -0000 @@ -148,6 +148,7 @@ struct inpcb { void *inp_upcall_arg; u_int inp_rtableid; int inp_pipex; /* pipex indication */ + uint16_t inp_flowid; }; LIST_HEAD(inpcbhead, inpcb); Index: netinet/tcp_output.c =================================================================== RCS file: /cvs/src/sys/netinet/tcp_output.c,v retrieving revision 1.128 diff -u -p -r1.128 tcp_output.c --- netinet/tcp_output.c 10 Nov 2018 18:40:34 -0000 1.128 +++ netinet/tcp_output.c 25 Jun 2020 10:17:49 -0000 @@ -1037,6 +1037,8 @@ send: ip->ip_tos |= IPTOS_ECN_ECT0; #endif } + SET(m->m_pkthdr.csum_flags, M_FLOWID); + m->m_pkthdr.ph_flowid = tp->t_inpcb->inp_flowid; error = ip_output(m, tp->t_inpcb->inp_options, &tp->t_inpcb->inp_route, (ip_mtudisc ? IP_MTUDISC : 0), NULL, tp->t_inpcb, 0);