changeset 4162:fbed6260b7e1 draft

Set DHCP routes as DHCP in supported OS's.
author Roy Marples <roy@marples.name>
date Mon, 09 Oct 2017 20:11:36 +0100
parents a40c7c100a45
children 799ea031e1ec
files src/dhcp.c src/if-linux.c src/ipv6.c src/route.h
diffstat 4 files changed, 19 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/dhcp.c	Mon Oct 09 19:57:09 2017 +0100
+++ b/src/dhcp.c	Mon Oct 09 20:11:36 2017 +0100
@@ -428,7 +428,7 @@
 
 		if ((rt = rt_new(ifp)) == NULL)
 			return -1;
-		TAILQ_INSERT_TAIL(routes, rt, rt_next);
+		rt->rt_dflags |= RTDF_DHCP;
 
 		/* If we have ocets then we have a destination and netmask */
 		dest.s_addr = 0;
@@ -461,6 +461,8 @@
 		/* If CIDR is 32 then it's a host route. */
 		if (cidr == 32)
 			rt->rt_flags = RTF_HOST;
+
+		TAILQ_INSERT_TAIL(routes, rt, rt_next);
 		n++;
 	}
 	return n;
@@ -631,6 +633,7 @@
 				continue;
 			if ((rt = rt_new(ifp)) == NULL)
 				return -1;
+			rt->rt_dflags |= RTDF_DHCP;
 
 			/* A host route is normally set by having the
 			 * gateway match the destination or assigned address */
@@ -663,6 +666,7 @@
 		while (p < e) {
 			if ((rt = rt_new(ifp)) == NULL)
 				return -1;
+			rt->rt_dflags |= RTDF_DHCP;
 			memcpy(&gateway.s_addr, p, sizeof(gateway.s_addr));
 			p += 4;
 			sa_in_init(&rt->rt_dest, &dest);
--- a/src/if-linux.c	Mon Oct 09 19:57:09 2017 +0100
+++ b/src/if-linux.c	Mon Oct 09 20:11:36 2017 +0100
@@ -1226,6 +1226,11 @@
 			nlm.rt.rtm_protocol = RTPROT_RA;
 		else
 #endif
+#ifdef RTPROT_DHCP
+		if (rt->rt_dflags & RTDF_DHCP)
+			nlm.rt.rtm_protocol = RTPROT_DHCP;
+		else
+#endif
 		if (rt->rt_dflags & RTDF_IFA_ROUTE)
 			nlm.rt.rtm_protocol = RTPROT_KERNEL;
 		else
--- a/src/ipv6.c	Mon Oct 09 19:57:09 2017 +0100
+++ b/src/ipv6.c	Mon Oct 09 20:11:36 2017 +0100
@@ -2136,10 +2136,8 @@
 #ifdef HAVE_ROUTE_METRIC
 	rt->rt_metric = ifp->metric;
 #endif
-	if (rap != NULL) {
+	if (rap != NULL)
 		rt->rt_mtu = rap->mtu;
-		rt->rt_dflags |= RTDF_RA;
-	}
 	return rt;
 }
 
@@ -2256,12 +2254,15 @@
 			if (addr->prefix_vltime == 0)
 				continue;
 			rt = inet6_makeprefix(rap->iface, rap, addr);
-			if (rt)
+			if (rt) {
+				rt->rt_dflags |= RTDF_RA;
 				TAILQ_INSERT_TAIL(routes, rt, rt_next);
+			}
 		}
 		if (rap->lifetime) {
 			rt = inet6_makerouter(rap);
 			if (rt) {
+				rt->rt_dflags |= RTDF_RA;
 				TAILQ_INSERT_TAIL(routes, rt, rt_next);
 				if (have_default)
 					*have_default = true;
@@ -2285,8 +2286,10 @@
 		if (d6_state && d6_state->state == dstate) {
 			TAILQ_FOREACH(addr, &d6_state->addrs, next) {
 				rt = inet6_makeprefix(ifp, NULL, addr);
-				if (rt)
+				if (rt) {
+					rt->rt_dflags |= RTDF_DHCP;
 					TAILQ_INSERT_TAIL(routes, rt, rt_next);
+				}
 			}
 		}
 	}
--- a/src/route.h	Mon Oct 09 19:57:09 2017 +0100
+++ b/src/route.h	Mon Oct 09 20:11:36 2017 +0100
@@ -76,6 +76,7 @@
 #define	RTDF_IFA_ROUTE		0x02		/* Address generated route */
 #define	RTDF_FAKE		0x04		/* Maybe us on lease reboot  */
 #define	RTDF_RA			0x08		/* Router Advertisement */
+#define	RTDF_DHCP		0x10		/* DHCP route */
 };
 TAILQ_HEAD(rt_head, rt);