From 502aa5d8026099d86da780e109fa91f191881e0f Mon Sep 17 00:00:00 2001 From: Roy Marples Date: Wed, 18 Dec 2019 16:30:12 +0000 Subject: [PATCH] inet: Add support for IPv4 /31 prefixes, as described in RFC 3021. To run a /31 network, participating hosts MUST drop support for directed broadcasts, and treat the first and last addresses on subnet as unicast. The broadcast address for the prefix should be the link local broadcast address, INADDR_BROADCAST. Taken from FreeBSD, r226402. --- sys/netinet/in.c | 19 +++++++++++++------ sys/netinet/in.h | 2 ++ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/sys/netinet/in.c b/sys/netinet/in.c index 457ec864cc..57b92b8de4 100644 --- a/sys/netinet/in.c +++ b/sys/netinet/in.c @@ -1037,10 +1037,15 @@ in_ifinit(struct ifnet *ifp, struct in_ifaddr *ia, */ ia->ia_ifa.ifa_metric = ifp->if_metric; if (ifp->if_flags & IFF_BROADCAST) { - ia->ia_broadaddr.sin_addr.s_addr = - htonl(ia->ia_subnet | ~ia->ia_subnetmask); - ia->ia_netbroadcast.s_addr = - htonl(ia->ia_net | ~ ia->ia_netmask); + if (ia->ia_subnetmask == IN_RFC3021_MASK) { + ia->ia_broadaddr.sin_addr.s_addr = INADDR_BROADCAST; + ia->ia_netbroadcast.s_addr = INADDR_BROADCAST; + } else { + ia->ia_broadaddr.sin_addr.s_addr = + htonl(ia->ia_subnet | ~ia->ia_subnetmask); + ia->ia_netbroadcast.s_addr = + htonl(ia->ia_net | ~ ia->ia_netmask); + } } else if (ifp->if_flags & IFF_LOOPBACK) { ia->ia_dstaddr = ia->ia_addr; flags |= RTF_HOST; @@ -1298,9 +1303,11 @@ in_broadcast(struct in_addr in, struct ifnet *ifp) (in.s_addr == ia->ia_broadaddr.sin_addr.s_addr || in.s_addr == ia->ia_netbroadcast.s_addr || /* - * Check for old-style (host 0) broadcast. + * Check for old-style (host 0) broadcast, but + * taking into account that RFC 3021 obsoletes it. */ - t == ia->ia_subnet || t == ia->ia_net) && + (ia->ia_subnetmask != IN_RFC3021_MASK && + (t == ia->ia_subnet || t == ia->ia_net))) && /* * Check for an all one subnetmask. These * only exist when an interface gets a secondary diff --git a/sys/netinet/in.h b/sys/netinet/in.h index 24c77dfc87..2f6fac974f 100644 --- a/sys/netinet/in.h +++ b/sys/netinet/in.h @@ -309,6 +309,8 @@ struct in_addr { #define IN_LOOPBACKNET 127 /* official! */ +#define IN_RFC3021_MASK (uint32_t)0xfffffffe + /* * Socket address, internet style. */ -- 2.11.4.GIT