X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=interface-ip.c;h=b1abbc60de4557edf5017f4f202077a78058b9d9;hp=3bd92cf49198c22b0d1b845e5f31b44c082f1a64;hb=3d26347d0042313be3c9347f8d82c4ccea67fe68;hpb=34192161b45520713ebaa5447553fa546e6ee932 diff --git a/interface-ip.c b/interface-ip.c index 3bd92cf..b1abbc6 100644 --- a/interface-ip.c +++ b/interface-ip.c @@ -480,7 +480,7 @@ interface_update_proto_addr(struct vlist_tree *tree, if (a_new && a_old) { keep = true; - if (a_old->flags != a_new->flags) + if (a_old->flags != a_new->flags || a_old->failed) keep = false; if (a_old->valid_until != a_new->valid_until || @@ -521,7 +521,8 @@ interface_update_proto_addr(struct vlist_tree *tree, if (node_new) { a_new->enabled = true; if (!(a_new->flags & DEVADDR_EXTERNAL) && (!keep || replace)) { - system_add_address(dev, a_new); + if (system_add_address(dev, a_new)) + a_new->failed = true; if (!keep) { if ((a_new->flags & DEVADDR_FAMILY) == DEVADDR_INET6) @@ -575,7 +576,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->table == route_new->table) && !route_old->failed; if (node_old) { if (!(route_old->flags & DEVADDR_EXTERNAL) && route_old->enabled && !keep) @@ -591,7 +592,8 @@ interface_update_proto_route(struct vlist_tree *tree, route_new->metric = iface->metric; if (!(route_new->flags & DEVADDR_EXTERNAL) && !keep && _enabled) - system_add_route(dev, route_new); + if (system_add_route(dev, route_new)) + route_new->failed = true; route_new->iface = iface; route_new->enabled = _enabled;