projects
/
project
/
netifd.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
memset the on-stack device route when clearing local subnet routes
[project/netifd.git]
/
interface-ip.c
diff --git
a/interface-ip.c
b/interface-ip.c
index
3957b48
..
0610ffd
100644
(file)
--- 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;
{
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)
route = calloc(1, sizeof(*route));
if (!route)
- return
false
;
+ return
NULL
;
route->flags = v6 ? DEVADDR_INET6 : DEVADDR_INET4;
route->mask = v6 ? 128 : 32;
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 */
vlist_for_each_element(&interfaces, iface, node) {
/* look for locally addressable target first */
@@
-172,7
+177,10
@@
interface_ip_add_target_route(union if_addr *addr, bool v6)
done:
route->iface = iface;
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;
}
return iface;
}
@@
-212,7
+220,7
@@
interface_ip_add_route(struct interface *iface, struct blob_attr *attr, bool v6)
}
if ((cur = tb[ROUTE_TARGET]) != NULL) {
}
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;
}
DPRINTF("Failed to parse route target: %s\n", (char *) blobmsg_data(cur));
goto error;
}
@@
-230,8
+238,10
@@
interface_ip_add_route(struct interface *iface, struct blob_attr *attr, bool v6)
route->flags |= DEVROUTE_METRIC;
}
route->flags |= DEVROUTE_METRIC;
}
- if ((cur = tb[ROUTE_MTU]) != NULL)
+ if ((cur = tb[ROUTE_MTU]) != NULL)
{
route->mtu = blobmsg_get_u32(cur);
route->mtu = blobmsg_get_u32(cur);
+ route->flags |= DEVROUTE_MTU;
+ }
vlist_add(&ip->route, &route->node, &route->flags);
return;
vlist_add(&ip->route, &route->node, &route->flags);
return;
@@
-260,6
+270,7
@@
interface_handle_subnet_route(struct interface *iface, struct device_addr *addr,
struct device *dev = iface->l3_dev.dev;
struct device_route route;
struct device *dev = iface->l3_dev.dev;
struct device_route route;
+ memset(&route, 0, sizeof(route));
route.iface = iface;
route.flags = addr->flags;
route.mask = addr->mask;
route.iface = iface;
route.flags = addr->flags;
route.mask = addr->mask;