X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=interface-ip.c;h=75f2a8db8907f654f9a9d58fdd0ac56d6463c442;hp=6b25f75e5a7fc0308f54d5035c22ae366eee160e;hb=e8714a2ef87d0741ca05e2ef30158452f30fed17;hpb=3cb42f8ddc76b8254f23a28772e60da7aeeb4a23 diff --git a/interface-ip.c b/interface-ip.c index 6b25f75..75f2a8d 100644 --- a/interface-ip.c +++ b/interface-ip.c @@ -21,10 +21,10 @@ enum { ROUTE_DEVICE, ROUTE_METRIC, ROUTE_MTU, - __ROUTE_LAST + __ROUTE_MAX }; -static const struct blobmsg_policy route_attr[__ROUTE_LAST] = { +static const struct blobmsg_policy route_attr[__ROUTE_MAX] = { [ROUTE_INTERFACE] = { .name = "interface", .type = BLOBMSG_TYPE_STRING }, [ROUTE_TARGET] = { .name = "target", .type = BLOBMSG_TYPE_STRING }, [ROUTE_MASK] = { .name = "netmask", .type = BLOBMSG_TYPE_STRING }, @@ -34,16 +34,21 @@ static const struct blobmsg_policy route_attr[__ROUTE_LAST] = { [ROUTE_MTU] = { .name = "mtu", .type = BLOBMSG_TYPE_INT32 }, }; +const struct config_param_list route_attr_list = { + .n_params = __ROUTE_MAX, + .params = route_attr, +}; + void interface_ip_add_route(struct interface *iface, struct blob_attr *attr, bool v6) { struct interface_ip_settings *ip; - struct blob_attr *tb[__ROUTE_LAST], *cur; + struct blob_attr *tb[__ROUTE_MAX], *cur; struct device_route *route; int af = v6 ? AF_INET6 : AF_INET; bool config = false; - blobmsg_parse(route_attr, __ROUTE_LAST, tb, blobmsg_data(attr), blobmsg_data_len(attr)); + blobmsg_parse(route_attr, __ROUTE_MAX, tb, blobmsg_data(attr), blobmsg_data_len(attr)); if (!tb[ROUTE_GATEWAY] && !tb[ROUTE_DEVICE]) return; @@ -126,21 +131,25 @@ interface_update_proto_addr(struct vlist_tree *tree, struct interface *iface; struct device *dev; struct device_addr *addr; + bool keep = false; ip = container_of(tree, struct interface_ip_settings, addr); iface = ip->iface; dev = iface->l3_dev->dev; + if (node_old && node_new) + keep = true; + if (node_old) { addr = container_of(node_old, struct device_addr, node); - if (!(addr->flags & DEVADDR_EXTERNAL) && addr->enabled) + if (!(addr->flags & DEVADDR_EXTERNAL) && addr->enabled && !keep) system_del_address(dev, addr); free(addr); } if (node_new) { addr = container_of(node_new, struct device_addr, node); - if (!(addr->flags & DEVADDR_EXTERNAL)) + if (!(addr->flags & DEVADDR_EXTERNAL) && !keep) system_add_address(dev, addr); addr->enabled = true; } @@ -154,24 +163,29 @@ interface_update_proto_route(struct vlist_tree *tree, struct interface_ip_settings *ip; struct interface *iface; struct device *dev; - struct device_route *route; + struct device_route *route_old, *route_new; + bool keep = false; ip = container_of(tree, struct interface_ip_settings, route); iface = ip->iface; dev = iface->l3_dev->dev; + route_old = container_of(node_old, struct device_route, node); + route_new = container_of(node_new, struct device_route, node); + + if (node_old && node_new) + keep = !memcmp(&route_old->nexthop, &route_new->nexthop, sizeof(route_old->nexthop)); + if (node_old) { - route = container_of(node_old, struct device_route, node); - if (!(route->flags & DEVADDR_EXTERNAL) && route->enabled) - system_del_route(dev, route); - free(route); + if (!(route_old->flags & DEVADDR_EXTERNAL) && route_old->enabled && !keep) + system_del_route(dev, route_old); + free(route_old); } if (node_new) { - route = container_of(node_new, struct device_route, node); - if (!(route->flags & DEVADDR_EXTERNAL)) - system_add_route(dev, route); - route->enabled = true; + if (!(route_new->flags & DEVADDR_EXTERNAL) && !keep) + system_add_route(dev, route_new); + route_new->enabled = true; } }