[OpenWrt-Devel] [PATCH v2 netifd] interface-ip: Fix broadcast address when using /31 or /32 IPv4 addressing
Baptiste Jonglez
baptiste at bitsofnetworks.org
Mon Sep 14 06:25:33 EDT 2015
From: Baptiste Jonglez <git at bitsofnetworks.org>
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 at bitsofnetworks.org>
---
interface-ip.c | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/interface-ip.c b/interface-ip.c
index 8eb2ff3..0c72e46 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);
+ }
}
}
--
2.5.1
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
More information about the openwrt-devel
mailing list