@@ -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);
+ }
}
}
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 <git@bitsofnetworks.org> --- interface-ip.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)