Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 3 Feb 2016 21:56:51 +0000 (UTC)
From:      "Bjoern A. Zeeb" <bz@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r295220 - in projects/vnet/sys: net netinet netinet6
Message-ID:  <201602032156.u13Lupe6007392@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: bz
Date: Wed Feb  3 21:56:51 2016
New Revision: 295220
URL: https://svnweb.freebsd.org/changeset/base/295220

Log:
  Code duplication but rib_head is special.  Not found an easy way to go
  back and harmize the use cases among RIB, IPFW, PF yet but it's also not
  the scope of this work.   Prevents instant panics on teardown and frees
  the FIB bits again.
  
  Sponsored by:	The FreeBSD Foundation

Modified:
  projects/vnet/sys/net/route.c
  projects/vnet/sys/netinet/in_rmx.c
  projects/vnet/sys/netinet6/in6_rmx.c

Modified: projects/vnet/sys/net/route.c
==============================================================================
--- projects/vnet/sys/net/route.c	Wed Feb  3 20:55:08 2016	(r295219)
+++ projects/vnet/sys/net/route.c	Wed Feb  3 21:56:51 2016	(r295220)
@@ -353,10 +353,24 @@ rt_table_init(int offset)
 	return (rh);
 }
 
+static int
+rt_freeentry(struct radix_node *rn, void *arg)
+{
+	struct radix_head * const rnh = arg;
+	struct radix_node *x;
+
+	x = (struct radix_node *)rn_delete(rn + 2, NULL, rnh);
+	if (x != NULL)
+		R_Free(x);
+	return (0);
+}
+
 void
 rt_table_destroy(struct rib_head *rh)
 {
 
+	rn_walktree(&rh->rmhead.head, rt_freeentry, &rh->rmhead.head);
+
 	/* Assume table is already empty */
 	rw_destroy(&rh->rib_lock);
 	free(rh, M_RTABLE);

Modified: projects/vnet/sys/netinet/in_rmx.c
==============================================================================
--- projects/vnet/sys/netinet/in_rmx.c	Wed Feb  3 20:55:08 2016	(r295219)
+++ projects/vnet/sys/netinet/in_rmx.c	Wed Feb  3 21:56:51 2016	(r295220)
@@ -133,7 +133,8 @@ int
 in_detachhead(void **head, int off)
 {
 
-	return (rn_detachhead(head));
+	rt_table_destroy((struct rib_head *)(*head));
+	return (1);
 }
 #endif
 

Modified: projects/vnet/sys/netinet6/in6_rmx.c
==============================================================================
--- projects/vnet/sys/netinet6/in6_rmx.c	Wed Feb  3 20:55:08 2016	(r295219)
+++ projects/vnet/sys/netinet6/in6_rmx.c	Wed Feb  3 21:56:51 2016	(r295220)
@@ -237,7 +237,9 @@ in6_detachhead(void **head, int off)
 {
 
 	callout_drain(&V_rtq_mtutimer);
-	return (rn_detachhead(head));
+	rt_table_destroy((struct rib_head *)(*head));
+
+	return (1);
 }
 #endif
 



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