X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=interface-ip.c;h=2b876618c9d50efbadb80984bcac27973e4fe8a6;hp=ed95b2ee264f3360692ae8f408c7fef40aad07c6;hb=8dacaf753b57c703f215b0c844b412b64183ac81;hpb=48ffedb4a2b6701eec99e32e91b8a66a0a4be950 diff --git a/interface-ip.c b/interface-ip.c index ed95b2e..2b87661 100644 --- a/interface-ip.c +++ b/interface-ip.c @@ -1,6 +1,7 @@ /* * netifd - network interface daemon * Copyright (C) 2012 Felix Fietkau + * Copyright (C) 2012 Steven Barth * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 @@ -34,6 +35,7 @@ enum { ROUTE_METRIC, ROUTE_MTU, ROUTE_VALID, + ROUTE_TABLE, __ROUTE_MAX }; @@ -44,6 +46,7 @@ static const struct blobmsg_policy route_attr[__ROUTE_MAX] = { [ROUTE_GATEWAY] = { .name = "gateway", .type = BLOBMSG_TYPE_STRING }, [ROUTE_METRIC] = { .name = "metric", .type = BLOBMSG_TYPE_INT32 }, [ROUTE_MTU] = { .name = "mtu", .type = BLOBMSG_TYPE_INT32 }, + [ROUTE_TABLE] = { .name = "table", .type = BLOBMSG_TYPE_STRING }, [ROUTE_VALID] = { .name = "valid", .type = BLOBMSG_TYPE_INT32 }, }; @@ -124,6 +127,9 @@ __find_ip_route_target(struct interface_ip_settings *ip, union if_addr *a, if (!match_if_addr(&route->addr, a, route->mask)) continue; + if (route->flags & DEVROUTE_TABLE) + continue; + if (!*res || route->mask < (*res)->mask) *res = route; } @@ -188,7 +194,7 @@ done: if (defaultroute_target) free(route); else - vlist_add(&iface->host_routes, &route->node, &route->flags); + vlist_add(&iface->host_routes, &route->node, route); return iface; } @@ -251,10 +257,20 @@ interface_ip_add_route(struct interface *iface, struct blob_attr *attr, bool v6) route->flags |= DEVROUTE_MTU; } + if ((cur = tb[ROUTE_TABLE]) != NULL) { + if (!system_resolve_rt_table(blobmsg_data(cur), &route->table)) { + DPRINTF("Failed to resolve routing table: %s\n", (char *) blobmsg_data(cur)); + goto error; + } + + if (route->table) + route->flags |= DEVROUTE_TABLE; + } + if ((cur = tb[ROUTE_VALID]) != NULL) route->valid_until = system_get_rtime() + blobmsg_get_u32(cur); - vlist_add(&ip->route, &route->node, &route->flags); + vlist_add(&ip->route, &route->node, route); return; error: @@ -271,8 +287,18 @@ addr_cmp(const void *k1, const void *k2, void *ptr) static int route_cmp(const void *k1, const void *k2, void *ptr) { - return memcmp(k1, k2, sizeof(struct device_route) - - offsetof(struct device_route, flags)); + const struct device_route *r1 = k1, *r2 = k2; + + if (r1->mask != r2->mask); + return r2->mask - r1->mask; + + if (r1->metric != r2->metric); + return r1->metric - r2->metric; + + if (r1->flags != r2->flags) + return r2->flags - r1->flags; + + return memcmp(&r1->addr, &r2->addr, sizeof(r1->addr)); } static int