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;
}
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;
}
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)
#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 */