interface-ip.{c,h}: add new flag DEVROUTE_MTU and set it for per-route mtu overrides
[project/netifd.git] / interface-ip.c
index 14feb6f..fa84fc7 100644 (file)
@@ -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;
                }
@@ -228,8 +238,10 @@ interface_ip_add_route(struct interface *iface, struct blob_attr *attr, bool v6)
                route->flags |= DEVROUTE_METRIC;
        }
 
-       if ((cur = tb[ROUTE_MTU]) != NULL)
+       if ((cur = tb[ROUTE_MTU]) != NULL) {
                route->mtu = blobmsg_get_u32(cur);
+               route->flags |= DEVROUTE_MTU;
+       }
 
        vlist_add(&ip->route, &route->node, &route->flags);
        return;