X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=interface-ip.c;h=54f56d69b291d2eb207dd596cd19039c300a7286;hp=43b63c7980793136b1ff5a1271af96c2134fe658;hb=a0f133ed22dee4eccc05961f646e14ecc0514060;hpb=75cbc687b51ea986c2d2a33e826aedd430d950be diff --git a/interface-ip.c b/interface-ip.c index 43b63c7..54f56d6 100644 --- a/interface-ip.c +++ b/interface-ip.c @@ -473,11 +473,17 @@ interface_update_proto_addr(struct vlist_tree *tree, 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 | htonl(mask); + /* /31 and /32 addressing need 255.255.255.255 + * as broadcast address. */ + if (a_new->mask >= 31) { + a_new->broadcast = (uint32_t) ~0; + } else { + uint32_t mask = ~0; + uint32_t *a = (uint32_t *) &a_new->addr; + + mask >>= a_new->mask; + a_new->broadcast = *a | htonl(mask); + } } } @@ -513,8 +519,10 @@ interface_update_proto_addr(struct vlist_tree *tree, if (table) { set_ip_source_policy(false, v6, IPRULE_PRIORITY_ADDR, &a_old->addr, (v6) ? 128 : 32, table, NULL, NULL); - set_ip_source_policy(false, v6, IPRULE_PRIORITY_NW, &a_old->addr, - a_old->mask, table, NULL, NULL); + + if (a_old->mask != ((v6) ? 128 : 32)) + set_ip_source_policy(false, v6, IPRULE_PRIORITY_NW, &a_old->addr, + a_old->mask, table, NULL, NULL); } if (!(a_old->flags & DEVADDR_EXTERNAL)) { @@ -546,8 +554,10 @@ interface_update_proto_addr(struct vlist_tree *tree, if (table) { set_ip_source_policy(true, v6, IPRULE_PRIORITY_ADDR, &a_new->addr, (v6) ? 128 : 32, table, NULL, NULL); - set_ip_source_policy(true, v6, IPRULE_PRIORITY_NW, &a_new->addr, - a_new->mask, table, NULL, NULL); + + if (a_new->mask != ((v6) ? 128 : 32)) + set_ip_source_policy(true, v6, IPRULE_PRIORITY_NW, &a_new->addr, + a_new->mask, table, NULL, NULL); } } } @@ -587,7 +597,7 @@ interface_update_proto_route(struct vlist_tree *tree, if (node_old && node_new) keep = !memcmp(&route_old->nexthop, &route_new->nexthop, sizeof(route_old->nexthop)) && (route_old->mtu == route_new->mtu) && (route_old->type == route_new->type) && - (route_old->valid_until == route_new->valid_until) && !route_old->failed; + !route_old->failed; if (node_old) { if (!(route_old->flags & DEVADDR_EXTERNAL) && route_old->enabled && !keep) @@ -1230,6 +1240,15 @@ void interface_ip_set_enabled(struct interface_ip_settings *ip, bool enabled) if (!(route->flags & DEVROUTE_METRIC)) route->metric = ip->iface->metric; + if (!(route->flags & DEVROUTE_TABLE)) { + route->flags &= ~DEVROUTE_SRCTABLE; + route->table = ((route->flags & DEVADDR_FAMILY) == DEVADDR_INET6) ? + iface->ip6table : iface->ip4table; + + if (route->table) + route->flags |= DEVROUTE_SRCTABLE; + } + if (system_add_route(dev, route)) route->failed = true; } else