diff mbox

[OpenWrt-Devel,v2,netifd] interface-ip: Fix broadcast address when using /31 or /32 IPv4 addressing

Message ID 1442226333-32654-1-git-send-email-baptiste@bitsofnetworks.org
State Accepted
Headers show

Commit Message

Baptiste Jonglez Sept. 14, 2015, 10:25 a.m. UTC
From: Baptiste Jonglez <git@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@bitsofnetworks.org>
---
 interface-ip.c | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

Comments

Baptiste Jonglez Sept. 26, 2015, 10:17 a.m. UTC | #1
nbd, did you have time to look at this new version of the patch?

Thanks,
Baptiste

On Mon, Sep 14, 2015 at 12:25:33PM +0200, Baptiste Jonglez wrote:
> From: Baptiste Jonglez <git@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@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);
> +			}
>  		}
>  	}
>
diff mbox

Patch

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);
+			}
 		}
 	}