Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 10 Apr 2017 01:26:12 +0000 (UTC)
From:      Mike Karels <karels@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r316668 - in stable/11/sys: netinet netinet6
Message-ID:  <201704100126.v3A1QCVu045548@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: karels
Date: Mon Apr 10 01:26:12 2017
New Revision: 316668
URL: https://svnweb.freebsd.org/changeset/base/316668

Log:
  Fix reference count leak with L2 caching.
  
  MFC r315956
  
  ip_forward, TCP/IPv6, and probably SCTP leaked references to L2 cache
  entry because they used their own routes on the stack, not in_pcb routes.
  The original model for route caching was callers that provided a route
  structure to ip{,6}input() would keep the route, and this model was used
  for L2 caching as well. Instead, change L2 caching to be done by default
  only when using a route structure in the in_pcb; the pcb deallocation
  code frees L2 as well as L3 cacches. A separate change will add route
  caching to TCP/IPv6.
  
  Another suggestion was to have the transport protocols indicate willingness
  to use L2 caching, but this approach keeps the changes in the network
  level
  
  Reviewed by:    ae gnn
  MFC after:      2 weeks
  Differential Revision:  https://reviews.freebsd.org/D10059

Modified:
  stable/11/sys/netinet/in_pcb.c
  stable/11/sys/netinet/ip_output.c
  stable/11/sys/netinet6/ip6_output.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/netinet/in_pcb.c
==============================================================================
--- stable/11/sys/netinet/in_pcb.c	Sun Apr  9 21:50:21 2017	(r316667)
+++ stable/11/sys/netinet/in_pcb.c	Mon Apr 10 01:26:12 2017	(r316668)
@@ -326,6 +326,12 @@ in_pcballoc(struct socket *so, struct in
 #endif
 	inp->inp_gencnt = ++pcbinfo->ipi_gencnt;
 	refcount_init(&inp->inp_refcount, 1);	/* Reference from inpcbinfo */
+
+	/*
+	 * Routes in inpcb's can cache L2 as well; they are guaranteed
+	 * to be cleaned up.
+	 */
+	inp->inp_route.ro_flags = RT_LLE_CACHE;
 	INP_LIST_WUNLOCK(pcbinfo);
 #if defined(IPSEC) || defined(IPSEC_SUPPORT) || defined(MAC)
 out:

Modified: stable/11/sys/netinet/ip_output.c
==============================================================================
--- stable/11/sys/netinet/ip_output.c	Sun Apr  9 21:50:21 2017	(r316667)
+++ stable/11/sys/netinet/ip_output.c	Mon Apr 10 01:26:12 2017	(r316668)
@@ -241,8 +241,7 @@ ip_output(struct mbuf *m, struct mbuf *o
 	if (ro == NULL) {
 		ro = &iproute;
 		bzero(ro, sizeof (*ro));
-	} else
-		ro->ro_flags |= RT_LLE_CACHE;
+	}
 
 #ifdef FLOWTABLE
 	if (ro->ro_rt == NULL)

Modified: stable/11/sys/netinet6/ip6_output.c
==============================================================================
--- stable/11/sys/netinet6/ip6_output.c	Sun Apr  9 21:50:21 2017	(r316667)
+++ stable/11/sys/netinet6/ip6_output.c	Mon Apr 10 01:26:12 2017	(r316668)
@@ -493,8 +493,7 @@ ip6_output(struct mbuf *m0, struct ip6_p
 	if (ro == NULL) {
 		ro = &ip6route;
 		bzero((caddr_t)ro, sizeof(*ro));
-	} else
-		ro->ro_flags |= RT_LLE_CACHE;
+	}
 	ro_pmtu = ro;
 	if (opt && opt->ip6po_rthdr)
 		ro = &opt->ip6po_route;



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