A /31-addressed interface requires a 255.255.255.255 broadcast, because there is no room for a proper broadcast address. Without this, any packet destinated to the other end of the link is sent as broadcast, which is incorrect.
Signed-off-by: Baptiste Jonglez <g...@bitsofnetworks.org> --- interface-ip.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/interface-ip.c b/interface-ip.c index 8eb2ff3..439b8af 100644 --- a/interface-ip.c +++ b/interface-ip.c @@ -473,11 +473,16 @@ 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 addressing needs 255.255.255.255 broadcast */ + 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); + } } } -- 2.5.1 _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel