X-Git-Url: http://git.archive.openwrt.org/?a=blobdiff_plain;f=interface-ip.c;h=170b03b089d7b8214513bfe9362b24d333d468c6;hb=41a40733dc80946841c9241ec56a4670a5943709;hp=9bdad4fd32ca9b31015b5d1c491acd0cfb6643c9;hpb=c6b739e28f2b15789c95dd28af3f193ec8f67531;p=project%2Fnetifd.git diff --git a/interface-ip.c b/interface-ip.c index 9bdad4f..170b03b 100644 --- a/interface-ip.c +++ b/interface-ip.c @@ -18,7 +18,6 @@ enum { ROUTE_TARGET, ROUTE_MASK, ROUTE_GATEWAY, - ROUTE_DEVICE, ROUTE_METRIC, ROUTE_MTU, __ROUTE_MAX @@ -29,7 +28,6 @@ static const struct blobmsg_policy route_attr[__ROUTE_MAX] = { [ROUTE_TARGET] = { .name = "target", .type = BLOBMSG_TYPE_STRING }, [ROUTE_MASK] = { .name = "netmask", .type = BLOBMSG_TYPE_STRING }, [ROUTE_GATEWAY] = { .name = "gateway", .type = BLOBMSG_TYPE_STRING }, - [ROUTE_DEVICE] = { .name = "device", .type = BLOBMSG_TYPE_STRING }, [ROUTE_METRIC] = { .name = "metric", .type = BLOBMSG_TYPE_INT32 }, [ROUTE_MTU] = { .name = "mtu", .type = BLOBMSG_TYPE_INT32 }, }; @@ -46,13 +44,9 @@ interface_ip_add_route(struct interface *iface, struct blob_attr *attr, bool v6) 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_MAX, tb, blobmsg_data(attr), blobmsg_data_len(attr)); - if (!tb[ROUTE_GATEWAY] && !tb[ROUTE_DEVICE]) - return; - if (!iface) { if ((cur = tb[ROUTE_INTERFACE]) == NULL) return; @@ -62,7 +56,6 @@ interface_ip_add_route(struct interface *iface, struct blob_attr *attr, bool v6) return; ip = &iface->config_ip; - config = true; } else { ip = &iface->proto_ip; } @@ -71,6 +64,7 @@ interface_ip_add_route(struct interface *iface, struct blob_attr *attr, bool v6) if (!route) return; + route->flags = v6 ? DEVADDR_INET6 : DEVADDR_INET4; route->mask = v6 ? 128 : 32; if ((cur = tb[ROUTE_MASK]) != NULL) { route->mask = parse_netmask_string(blobmsg_data(cur), v6); @@ -98,10 +92,7 @@ interface_ip_add_route(struct interface *iface, struct blob_attr *attr, bool v6) if ((cur = tb[ROUTE_MTU]) != NULL) route->mtu = blobmsg_get_u32(cur); - if (!config && (cur = tb[ROUTE_DEVICE]) != NULL) - route->device = device_get(blobmsg_data(cur), true); - - vlist_add(&ip->route, &route->node); + vlist_add(&ip->route, &route->node, &route->mask); return; error: @@ -130,28 +121,51 @@ interface_update_proto_addr(struct vlist_tree *tree, struct interface_ip_settings *ip; struct interface *iface; struct device *dev; - struct device_addr *addr; + struct device_addr *a_new = NULL, *a_old = NULL; 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) + if (node_new) { + a_new = container_of(node_new, struct device_addr, node); + + if ((a_new->flags & DEVADDR_FAMILY) == DEVADDR_INET4 && + !a_new->broadcast) { + + uint32_t mask = ~0; + uint32_t *a = (uint32_t *) &a_new->addr; + + mask >>= a_new->mask; + a_new->broadcast = *a | mask; + } + } + + if (node_old) + a_old = container_of(node_old, struct device_addr, node); + + if (a_new && a_old) { keep = true; + if (a_old->flags != a_new->flags) + keep = false; + + if ((a_new->flags & DEVADDR_FAMILY) == DEVADDR_INET4 && + a_new->broadcast != a_old->broadcast) + keep = false; + } + if (node_old) { - addr = container_of(node_old, struct device_addr, node); - if (!(addr->flags & DEVADDR_EXTERNAL) && addr->enabled && !keep) - system_del_address(dev, addr); - free(addr); + if (!(a_old->flags & DEVADDR_EXTERNAL) && a_old->enabled && !keep) + system_del_address(dev, a_old); + free(a_old); } if (node_new) { - addr = container_of(node_new, struct device_addr, node); - if (!(addr->flags & DEVADDR_EXTERNAL) && !keep) - system_add_address(dev, addr); - addr->enabled = true; + if (!(a_new->flags & DEVADDR_EXTERNAL) && !keep) + system_add_address(dev, a_new); + a_new->enabled = true; } } @@ -403,8 +417,6 @@ interface_ip_init(struct interface_ip_settings *ip, struct interface *iface) ip->enabled = true; vlist_simple_init(&ip->dns_search, struct dns_search_domain, node); vlist_simple_init(&ip->dns_servers, struct dns_server, node); - vlist_init(&ip->route, route_cmp, interface_update_proto_route, - struct device_route, node, mask); - vlist_init(&ip->addr, addr_cmp, interface_update_proto_addr, - struct device_addr, node, mask); + vlist_init(&ip->route, route_cmp, interface_update_proto_route); + vlist_init(&ip->addr, addr_cmp, interface_update_proto_addr); }