A /31-addressed interface requires a broadcast address of 255.255.255.255,
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.
For consistency with the Linux kernel, /32-addressed interfaces are
treated in the same way.
Signed-off-by: Baptiste Jonglez <git@bitsofnetworks.org>
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);
+ }
}
}