changeset 5406:c03103d18249 draft

route: Ensure IPv4LL routes always come last in priority
author Roy Marples <roy@marples.name>
date Wed, 08 Jul 2020 12:03:15 +0100
parents 73670865498e
children 30603cb789ea
files src/ipv4ll.c src/route.c src/route.h
diffstat 3 files changed, 16 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/ipv4ll.c	Sat Jul 04 13:21:09 2020 +0100
+++ b/src/ipv4ll.c	Wed Jul 08 12:03:15 2020 +0100
@@ -111,6 +111,7 @@
 	in.s_addr = INADDR_ANY;
 	sa_in_init(&rt->rt_gateway, &in);
 	sa_in_init(&rt->rt_ifa, &state->addr->addr);
+	rt->rt_flags |= RTDF_IPV4LL;
 	return rt_proto_add(routes, rt) ? 1 : 0;
 }
 
@@ -134,6 +135,10 @@
 	sa_in_init(&rt->rt_netmask, &in);
 	sa_in_init(&rt->rt_gateway, &in);
 	sa_in_init(&rt->rt_ifa, &state->addr->addr);
+	rt->rt_flags |= RTDF_IPV4LL;
+#ifdef HAVE_ROUTE_METRIC
+	rt->rt_metric += 10000;
+#endif
 	return rt_proto_add(routes, rt) ? 1 : 0;
 }
 
--- a/src/route.c	Sat Jul 04 13:21:09 2020 +0100
+++ b/src/route.c	Wed Jul 08 12:03:15 2020 +0100
@@ -168,6 +168,14 @@
 	if (c != 0)
 		return -c;
 
+#ifdef INET
+	/* IPv4LL routes always come last */
+	if (rt1->rt_flags & RTDF_IPV4LL && !(rt2->rt_flags & RTDF_IPV4LL))
+		return -1;
+	else if (!(rt1->rt_flags & RTDF_IPV4LL) && rt2->rt_flags & RTDF_IPV4LL)
+		return 1;
+#endif
+
 	/* Lower metric interfaces come first. */
 	c = (int)(ifp1->metric - ifp2->metric);
 	if (c != 0)
--- a/src/route.h	Sat Jul 04 13:21:09 2020 +0100
+++ b/src/route.h	Wed Jul 08 12:03:15 2020 +0100
@@ -102,8 +102,9 @@
 #define RTPREF_RESERVED	(-2)
 #define RTPREF_INVALID	(-3)	/* internal */
 	unsigned int		rt_dflags;
-#define	RTDF_IFA_ROUTE		0x02		/* Address generated route */
-#define	RTDF_FAKE		0x04		/* Maybe us on lease reboot  */
+#define	RTDF_IFA_ROUTE		0x01		/* Address generated route */
+#define	RTDF_FAKE		0x02		/* Maybe us on lease reboot */
+#define	RTDF_IPV4LL		0x04		/* IPv4LL route */
 #define	RTDF_RA			0x08		/* Router Advertisement */
 #define	RTDF_DHCP		0x10		/* DHCP route */
 #define	RTDF_STATIC		0x20		/* Configured in dhcpcd */