X-Git-Url: http://git.archive.openwrt.org/?a=blobdiff_plain;f=interface-ip.c;h=b097c1fcdd4cdd28d0b9eccd8dd89f55791d12cd;hb=a667ba53a212dd0bd0a09467036c5db9dfe8bfbb;hp=14feb6fa6ddcdf41b353d6cd82c0c2347c1f9701;hpb=8758677c03d3c94d3fd81c8e44b3a7307b693e9c;p=project%2Fnetifd.git diff --git a/interface-ip.c b/interface-ip.c index 14feb6f..b097c1f 100644 --- a/interface-ip.c +++ b/interface-ip.c @@ -141,14 +141,19 @@ interface_ip_add_target_route(union if_addr *addr, bool v6) { struct interface *iface; struct device_route *route, *r_next = NULL; + bool defaultroute_target = false; + int addrsize = v6 ? sizeof(addr->in6) : sizeof(addr->in); route = calloc(1, sizeof(*route)); if (!route) - return false; + return NULL; route->flags = v6 ? DEVADDR_INET6 : DEVADDR_INET4; route->mask = v6 ? 128 : 32; - memcpy(&route->addr, addr, v6 ? sizeof(addr->in6) : sizeof(addr->in)); + if (memcmp(&route->addr, addr, addrsize) == 0) + defaultroute_target = true; + else + memcpy(&route->addr, addr, addrsize); vlist_for_each_element(&interfaces, iface, node) { /* look for locally addressable target first */ @@ -160,8 +165,10 @@ interface_ip_add_target_route(union if_addr *addr, bool v6) interface_ip_find_route_target(iface, addr, v6, &r_next); } - if (!r_next) + if (!r_next) { + free(route); return NULL; + } iface = r_next->iface; memcpy(&route->nexthop, &r_next->nexthop, sizeof(route->nexthop)); @@ -170,7 +177,10 @@ interface_ip_add_target_route(union if_addr *addr, bool v6) done: route->iface = iface; - vlist_add(&iface->host_routes, &route->node, &route->flags); + if (defaultroute_target) + free(route); + else + vlist_add(&iface->host_routes, &route->node, &route->flags); return iface; } @@ -210,7 +220,7 @@ interface_ip_add_route(struct interface *iface, struct blob_attr *attr, bool v6) } if ((cur = tb[ROUTE_TARGET]) != NULL) { - if (!inet_pton(af, blobmsg_data(cur), &route->addr)) { + if (!parse_ip_and_netmask(af, blobmsg_data(cur), &route->addr, &route->mask)) { DPRINTF("Failed to parse route target: %s\n", (char *) blobmsg_data(cur)); goto error; }