if stoeplitz is enabled by a driver (eg, ix, mcx, etc), this uses it in
the tcp code to set the flowid on packets. this encourages both the tx
and rx side of a tcp connection to get processed in the same places.

ok?

Index: netinet/in_pcb.c
===================================================================
RCS file: /cvs/src/sys/netinet/in_pcb.c,v
retrieving revision 1.252
diff -u -p -r1.252 in_pcb.c
--- netinet/in_pcb.c    7 Nov 2020 09:51:40 -0000       1.252
+++ netinet/in_pcb.c    3 Jan 2021 02:12:45 -0000
@@ -95,6 +95,11 @@
 #include <netinet/ip_esp.h>
 #endif /* IPSEC */
 
+#include "stoeplitz.h"
+#if NSTOEPLITZ > 0
+#include <net/toeplitz.h>
+#endif
+
 const struct in_addr zeroin_addr;
 
 union {
@@ -516,6 +521,10 @@ in_pcbconnect(struct inpcb *inp, struct 
        inp->inp_faddr = sin->sin_addr;
        inp->inp_fport = sin->sin_port;
        in_pcbrehash(inp);
+#if NSTOEPLITZ > 0
+       inp->inp_flowid = stoeplitz_ip4port(inp->inp_laddr.s_addr,
+           inp->inp_faddr.s_addr, inp->inp_lport, inp->inp_fport);
+#endif
 #ifdef IPSEC
        {
                /* Cause an IPsec SA to be established. */
@@ -549,6 +558,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    3 Jan 2021 02:12:45 -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        3 Jan 2021 02:12:45 -0000
@@ -69,6 +69,7 @@
  */
 
 #include "pf.h"
+#include "stoeplitz.h"
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1037,6 +1038,10 @@ send:
                                ip->ip_tos |= IPTOS_ECN_ECT0;
 #endif
                }
+#if NSTOEPLITZ > 0
+               m->m_pkthdr.ph_flowid = tp->t_inpcb->inp_flowid;
+               SET(m->m_pkthdr.csum_flags, M_FLOWID);
+#endif
                error = ip_output(m, tp->t_inpcb->inp_options,
                        &tp->t_inpcb->inp_route,
                        (ip_mtudisc ? IP_MTUDISC : 0), NULL, tp->t_inpcb, 0);
Index: netinet6/in6_pcb.c
===================================================================
RCS file: /cvs/src/sys/netinet6/in6_pcb.c,v
retrieving revision 1.110
diff -u -p -r1.110 in6_pcb.c
--- netinet6/in6_pcb.c  29 Nov 2019 16:41:01 -0000      1.110
+++ netinet6/in6_pcb.c  3 Jan 2021 02:12:45 -0000
@@ -100,6 +100,7 @@
  */
 
 #include "pf.h"
+#include "stoeplitz.h"
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -119,6 +120,10 @@
 
 #include <netinet6/in6_var.h>
 
+#if NSTOEPLITZ > 0
+#include <net/toeplitz.h>
+#endif
+
 const struct in6_addr zeroin6_addr;
 
 struct inpcbhead *
@@ -297,6 +302,10 @@ in6_pcbconnect(struct inpcb *inp, struct
        if (ip6_auto_flowlabel)
                inp->inp_flowinfo |=
                    (htonl(ip6_randomflowlabel()) & IPV6_FLOWLABEL_MASK);
+#if NSTOEPLITZ > 0
+       inp->inp_flowid = stoeplitz_ip6port(&inp->inp_laddr6,
+           &inp->inp_faddr6, inp->inp_lport, inp->inp_fport);
+#endif
        in_pcbrehash(inp);
        return (0);
 }

Reply via email to