interface-ip: fix misuse of IN6_IS_ADDR_LINKLOCAL on a netifd specific union
[project/netifd.git] / interface-ip.c
index 6f42015..018b657 100644 (file)
@@ -400,6 +400,9 @@ route_cmp(const void *k1, const void *k2, void *ptr)
        if (r1->sourcemask != r2->sourcemask)
                return r1->sourcemask - r2->sourcemask;
 
+       if (r1->table != r2->table)
+               return r1->table - r2->table;
+
        int maskcmp = memcmp(&r1->source, &r2->source, sizeof(r1->source));
        if (maskcmp)
                return maskcmp;
@@ -661,8 +664,8 @@ interface_set_prefix_address(struct device_prefix_assignment *assignment,
                }
 
                assignment->enabled = false;
-       } else if (add && (iface->state == IFS_UP || iface->state == IFS_SETUP)) {
-               system_add_address(l3_downlink, &addr);
+       } else if (add && (iface->state == IFS_UP || iface->state == IFS_SETUP) &&
+                       !system_add_address(l3_downlink, &addr)) {
                if (prefix->iface && !assignment->enabled) {
                        set_ip_source_policy(true, true, IPRULE_PRIORITY_REJECT, &addr.addr,
                                        addr.mask, 0, iface, "unreachable");
@@ -1040,7 +1043,7 @@ write_resolv_conf_entries(FILE *f, struct interface_ip_settings *ip, const char
                if (!str)
                        continue;
 
-               if (s->af == AF_INET6 && IN6_IS_ADDR_LINKLOCAL(&s->addr))
+               if (s->af == AF_INET6 && IN6_IS_ADDR_LINKLOCAL(&s->addr.in6))
                        fprintf(f, "nameserver %s%%%s\n", str, dev);
                else
                        fprintf(f, "nameserver %s\n", str);