Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 1 Dec 2019 18:05:02 +0000 (UTC)
From:      Michael Tuexen <tuexen@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r355266 - in head/sys: dev/cxgbe/tom netinet
Message-ID:  <201912011805.xB1I52J4027996@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: tuexen
Date: Sun Dec  1 18:05:02 2019
New Revision: 355266
URL: https://svnweb.freebsd.org/changeset/base/355266

Log:
  In order for the TCP Handshake to support ECN++, and further ECN-related
  improvements, the ECN bits need to be exposed to the TCP SYNcache.
  This change is a minimal modification to the function headers, without any
  functional change intended.
  
  Submitted by:		Richard Scheffenegger
  Reviewed by:		rgrimes@, rrs@, tuexen@
  Differential Revision:	https://reviews.freebsd.org/D22436

Modified:
  head/sys/dev/cxgbe/tom/t4_listen.c
  head/sys/netinet/tcp_input.c
  head/sys/netinet/tcp_syncache.c
  head/sys/netinet/tcp_syncache.h
  head/sys/netinet/toecore.c
  head/sys/netinet/toecore.h

Modified: head/sys/dev/cxgbe/tom/t4_listen.c
==============================================================================
--- head/sys/dev/cxgbe/tom/t4_listen.c	Sun Dec  1 17:35:36 2019	(r355265)
+++ head/sys/dev/cxgbe/tom/t4_listen.c	Sun Dec  1 18:05:02 2019	(r355266)
@@ -988,7 +988,7 @@ t4opt_to_tcpopt(const struct tcp_options *t4opt, struc
 
 static void
 pass_accept_req_to_protohdrs(struct adapter *sc, const struct mbuf *m,
-    struct in_conninfo *inc, struct tcphdr *th)
+    struct in_conninfo *inc, struct tcphdr *th, uint8_t *iptos)
 {
 	const struct cpl_pass_accept_req *cpl = mtod(m, const void *);
 	const struct ether_header *eh;
@@ -1005,6 +1005,21 @@ pass_accept_req_to_protohdrs(struct adapter *sc, const
 		tcp = (const void *)(l3hdr + G_IP_HDR_LEN(hlen));
 	}
 
+	/* extract TOS (DiffServ + ECN) byte for AccECN */
+	if (iptos) {
+		if (((struct ip *)l3hdr)->ip_v == IPVERSION) {
+			const struct ip *ip = (const void *)l3hdr;
+			*iptos = ip->ip_tos;
+		}
+#ifdef INET6
+		else
+		if (((struct ip *)l3hdr)->ip_v == (IPV6_VERSION >> 4)) {
+			const struct ip6_hdr *ip6 = (const void *)l3hdr;
+			*iptos = (ntohl(ip6->ip6_flow) >> 20) & 0xff;
+		}
+#endif /* INET */
+	}
+
 	if (inc) {
 		bzero(inc, sizeof(*inc));
 		inc->inc_fport = tcp->th_sport;
@@ -1150,6 +1165,7 @@ do_pass_accept_req(struct sge_iq *iq, const struct rss
 	unsigned int opcode = G_CPL_OPCODE(be32toh(OPCODE_TID(cpl)));
 #endif
 	struct offload_settings settings;
+	uint8_t iptos;
 
 	KASSERT(opcode == CPL_PASS_ACCEPT_REQ,
 	    ("%s: unexpected opcode 0x%x", __func__, opcode));
@@ -1208,7 +1224,7 @@ found:
 	if (lctx->vnet != ifp->if_vnet)
 		REJECT_PASS_ACCEPT_REQ(true);
 
-	pass_accept_req_to_protohdrs(sc, m, &inc, &th);
+	pass_accept_req_to_protohdrs(sc, m, &inc, &th, &iptos);
 	if (inc.inc_flags & INC_ISIPV6) {
 
 		/* Don't offload if the ifcap isn't enabled */
@@ -1284,7 +1300,7 @@ found:
 	 * syncache_add.  Note that syncache_add releases the pcb lock.
 	 */
 	t4opt_to_tcpopt(&cpl->tcpopt, &to);
-	toe_syncache_add(&inc, &to, &th, inp, tod, synqe);
+	toe_syncache_add(&inc, &to, &th, inp, tod, synqe, iptos);
 
 	if (atomic_load_int(&synqe->ok_to_respond) > 0) {
 		uint64_t opt0;
@@ -1350,9 +1366,10 @@ synqe_to_protohdrs(struct adapter *sc, struct synq_ent
     struct tcphdr *th, struct tcpopt *to)
 {
 	uint16_t tcp_opt = be16toh(cpl->tcp_opt);
+	uint8_t iptos;
 
 	/* start off with the original SYN */
-	pass_accept_req_to_protohdrs(sc, synqe->syn, inc, th);
+	pass_accept_req_to_protohdrs(sc, synqe->syn, inc, th, &iptos);
 
 	/* modify parts to make it look like the ACK to our SYN|ACK */
 	th->th_flags = TH_ACK;

Modified: head/sys/netinet/tcp_input.c
==============================================================================
--- head/sys/netinet/tcp_input.c	Sun Dec  1 17:35:36 2019	(r355265)
+++ head/sys/netinet/tcp_input.c	Sun Dec  1 18:05:02 2019	(r355266)
@@ -1282,7 +1282,7 @@ tfo_socket_result:
 #endif
 		TCP_PROBE3(debug__input, tp, th, m);
 		tcp_dooptions(&to, optp, optlen, TO_SYN);
-		if (syncache_add(&inc, &to, th, inp, &so, m, NULL, NULL))
+		if (syncache_add(&inc, &to, th, inp, &so, m, NULL, NULL, iptos))
 			goto tfo_socket_result;
 
 		/*

Modified: head/sys/netinet/tcp_syncache.c
==============================================================================
--- head/sys/netinet/tcp_syncache.c	Sun Dec  1 17:35:36 2019	(r355265)
+++ head/sys/netinet/tcp_syncache.c	Sun Dec  1 18:05:02 2019	(r355266)
@@ -1369,7 +1369,7 @@ syncache_tfo_expand(struct syncache *sc, struct socket
 int
 syncache_add(struct in_conninfo *inc, struct tcpopt *to, struct tcphdr *th,
     struct inpcb *inp, struct socket **lsop, struct mbuf *m, void *tod,
-    void *todctx)
+    void *todctx, uint8_t iptos)
 {
 	struct tcpcb *tp;
 	struct socket *so;

Modified: head/sys/netinet/tcp_syncache.h
==============================================================================
--- head/sys/netinet/tcp_syncache.h	Sun Dec  1 17:35:36 2019	(r355265)
+++ head/sys/netinet/tcp_syncache.h	Sun Dec  1 18:05:02 2019	(r355266)
@@ -45,7 +45,7 @@ int	 syncache_expand(struct in_conninfo *, struct tcpo
 	     struct tcphdr *, struct socket **, struct mbuf *);
 int	 syncache_add(struct in_conninfo *, struct tcpopt *,
 	     struct tcphdr *, struct inpcb *, struct socket **, struct mbuf *,
-	     void *, void *);
+	     void *, void *, uint8_t);
 void	 syncache_chkrst(struct in_conninfo *, struct tcphdr *, struct mbuf *);
 void	 syncache_badack(struct in_conninfo *);
 int	 syncache_pcblist(struct sysctl_req *);

Modified: head/sys/netinet/toecore.c
==============================================================================
--- head/sys/netinet/toecore.c	Sun Dec  1 17:35:36 2019	(r355265)
+++ head/sys/netinet/toecore.c	Sun Dec  1 18:05:02 2019	(r355266)
@@ -346,13 +346,13 @@ unregister_toedev(struct toedev *tod)
 
 void
 toe_syncache_add(struct in_conninfo *inc, struct tcpopt *to, struct tcphdr *th,
-    struct inpcb *inp, void *tod, void *todctx)
+    struct inpcb *inp, void *tod, void *todctx, uint8_t iptos)
 {
 	struct socket *lso = inp->inp_socket;
 
 	INP_WLOCK_ASSERT(inp);
 
-	syncache_add(inc, to, th, inp, &lso, NULL, tod, todctx);
+	syncache_add(inc, to, th, inp, &lso, NULL, tod, todctx, iptos);
 }
 
 int

Modified: head/sys/netinet/toecore.h
==============================================================================
--- head/sys/netinet/toecore.h	Sun Dec  1 17:35:36 2019	(r355265)
+++ head/sys/netinet/toecore.h	Sun Dec  1 18:05:02 2019	(r355266)
@@ -135,7 +135,7 @@ int toe_l2_resolve(struct toedev *, struct ifnet *, st
 void toe_connect_failed(struct toedev *, struct inpcb *, int);
 
 void toe_syncache_add(struct in_conninfo *, struct tcpopt *, struct tcphdr *,
-    struct inpcb *, void *, void *);
+    struct inpcb *, void *, void *, uint8_t);
 int  toe_syncache_expand(struct in_conninfo *, struct tcpopt *, struct tcphdr *,
     struct socket **);
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201912011805.xB1I52J4027996>