changeset 4553:8289f982fb87 draft

route: Compare AF_UNSPEC family when cleaning old routes
author Roy Marples <roy@marples.name>
date Mon, 15 Jul 2019 17:13:43 +0100
parents d62e5b96b66e
children 8c493d779d03
files src/route.c
diffstat 1 files changed, 11 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/route.c	Fri Jul 12 15:04:13 2019 +0100
+++ b/src/route.c	Mon Jul 15 17:13:43 2019 +0100
@@ -685,8 +685,10 @@
 	}
 
 	RB_TREE_FOREACH_SAFE(rt, &routes, rtn) {
-		if (rt->rt_dest.sa_family != af &&
-		    rt->rt_gateway.sa_family != af)
+		if ((rt->rt_dest.sa_family != af &&
+		    rt->rt_dest.sa_family != AF_UNSPEC) ||
+		    (rt->rt_gateway.sa_family != af &&
+		    rt->rt_gateway.sa_family != AF_UNSPEC))
 			continue;
 		/* Is this route already in our table? */
 		if (rb_tree_find_node(&added, rt) != NULL)
@@ -702,12 +704,14 @@
 	}
 
 	/* Remove old routes we used to manage. */
-	while ((rt = RB_TREE_MAX(&ctx->routes)) != NULL) {
+	RB_TREE_FOREACH_REVERSE_SAFE(rt, &ctx->routes, rtn) {
+		if ((rt->rt_dest.sa_family != af &&
+		    rt->rt_dest.sa_family != AF_UNSPEC) ||
+		    (rt->rt_gateway.sa_family != af &&
+		    rt->rt_gateway.sa_family != AF_UNSPEC))
+			continue;
 		rb_tree_remove_node(&ctx->routes, rt);
-		if (rt->rt_dest.sa_family == af &&
-		    rt->rt_gateway.sa_family == af &&
-		    rb_tree_find_node(&added, rt) == NULL)
-		{
+		if (rb_tree_find_node(&added, rt) == NULL) {
 			o = rt->rt_ifp->options ?
 			    rt->rt_ifp->options->options :
 			    ctx->options;