Mercurial > hg > dhcpcd
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 */
