]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
route: Ensure IPv4LL routes always come last in priority
authorRoy Marples <roy@marples.name>
Wed, 8 Jul 2020 11:03:15 +0000 (12:03 +0100)
committerRoy Marples <roy@marples.name>
Wed, 8 Jul 2020 11:03:15 +0000 (12:03 +0100)
src/ipv4ll.c
src/route.c
src/route.h

index 9d93ac11cacb9a909bb0eab9d90e119d5c7ffbcb..ae1355ad765cbba61f35d44e3956b85d8e1a5a34 100644 (file)
@@ -111,6 +111,7 @@ ipv4ll_subnetroute(rb_tree_t *routes, struct interface *ifp)
        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 @@ ipv4ll_defaultroute(rb_tree_t *routes, struct interface *ifp)
        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;
 }
 
index 401ce07c6ff82ebe3b0d8eca528566d7bd01474d..c7009c19c06d62b749331cd00037bd4d8660a511 100644 (file)
@@ -168,6 +168,14 @@ rt_compare_proto(void *context, const void *node1, const void *node2)
        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)
index d94fc25d5a4496b1c6c73435d2dd0953f2107600..e9ac121af3d27d232ed9c8e3f70c535aee29b6c5 100644 (file)
@@ -102,8 +102,9 @@ struct rt {
 #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 */