X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=interface-ip.c;h=33b5d4326d3b3ecf20026201f8382533577bf65b;hp=6f4201592068fc597c3c69779f73e3421fd6000a;hb=5dc8988377cccbdd9a520f21000d2cea1fc76f7f;hpb=235a02424c3ab1b59308895c4f00395dacf2557c diff --git a/interface-ip.c b/interface-ip.c index 6f42015..33b5d43 100644 --- a/interface-ip.c +++ b/interface-ip.c @@ -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; @@ -578,7 +581,7 @@ interface_update_proto_route(struct vlist_tree *tree, if (node_old && node_new) keep = !memcmp(&route_old->nexthop, &route_new->nexthop, sizeof(route_old->nexthop)) && - (route_old->table == route_new->table) && !route_old->failed; + (route_old->mtu == route_new->mtu) && !route_old->failed; if (node_old) { if (!(route_old->flags & DEVADDR_EXTERNAL) && route_old->enabled && !keep) @@ -619,8 +622,10 @@ interface_update_host_route(struct vlist_tree *tree, free(route_old); } - if (node_new) - system_add_route(dev, route_new); + if (node_new) { + if (system_add_route(dev, route_new)) + route_new->failed = true; + } } @@ -661,8 +666,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 +1045,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); @@ -1137,7 +1142,8 @@ void interface_ip_set_enabled(struct interface_ip_settings *ip, bool enabled) if (!(route->flags & DEVROUTE_METRIC)) route->metric = ip->iface->metric; - system_add_route(dev, route); + if (system_add_route(dev, route)) + route->failed = true; } else system_del_route(dev, route); route->enabled = _enabled;