Module Name: src
Committed By: roy
Date: Wed Dec 18 00:49:16 UTC 2019
Modified Files:
src/sys/netinet: in.c in.h
Log Message:
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.
Fixes PR kern/51388.
To generate a diff of this commit:
cvs rdiff -u -r1.235 -r1.236 src/sys/netinet/in.c
cvs rdiff -u -r1.108 -r1.109 src/sys/netinet/in.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/netinet/in.c
diff -u src/sys/netinet/in.c:1.235 src/sys/netinet/in.c:1.236
--- src/sys/netinet/in.c:1.235 Wed Sep 25 09:53:38 2019
+++ src/sys/netinet/in.c Wed Dec 18 00:49:15 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: in.c,v 1.235 2019/09/25 09:53:38 ozaki-r Exp $ */
+/* $NetBSD: in.c,v 1.236 2019/12/18 00:49:15 roy Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -91,7 +91,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in.c,v 1.235 2019/09/25 09:53:38 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in.c,v 1.236 2019/12/18 00:49:15 roy Exp $");
#include "arp.h"
@@ -1219,10 +1219,15 @@ in_ifinit(struct ifnet *ifp, struct in_i
ia->ia_ifa.ifa_metric = ifp->if_metric;
if (ifp->if_flags & IFF_BROADCAST) {
- ia->ia_broadaddr.sin_addr.s_addr =
- ia->ia_subnet | ~ia->ia_subnetmask;
- ia->ia_netbroadcast.s_addr =
- 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 =
+ ia->ia_subnet | ~ia->ia_subnetmask;
+ ia->ia_netbroadcast.s_addr =
+ ia->ia_net | ~ia->ia_netmask;
+ }
} else if (ifp->if_flags & IFF_LOOPBACK) {
ia->ia_dstaddr = ia->ia_addr;
flags |= RTF_HOST;
@@ -1426,8 +1431,10 @@ in_broadcast(struct in_addr in, struct i
in_hosteq(in, ia->ia_netbroadcast) ||
(hostzeroisbroadcast &&
/*
- * Check for old-style (host 0) broadcast.
+ * Check for old-style (host 0) broadcast, but
+ * taking into account that RFC 3021 obsoletes it.
*/
+ ia->ia_subnetmask != IN_RFC3021_MASK &&
(in.s_addr == ia->ia_subnet ||
in.s_addr == ia->ia_net)))) {
pserialize_read_exit(s);
Index: src/sys/netinet/in.h
diff -u src/sys/netinet/in.h:1.108 src/sys/netinet/in.h:1.109
--- src/sys/netinet/in.h:1.108 Fri Nov 9 11:46:28 2018
+++ src/sys/netinet/in.h Wed Dec 18 00:49:16 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: in.h,v 1.108 2018/11/09 11:46:28 maya Exp $ */
+/* $NetBSD: in.h,v 1.109 2019/12/18 00:49:16 roy Exp $ */
/*
* Copyright (c) 1982, 1986, 1990, 1993
@@ -235,6 +235,8 @@ struct in_addr {
#define IN_LOOPBACKNET 127 /* official! */
+#define IN_RFC3021_MASK __IPADDR(0xfffffffe)
+
/*
* Socket address, internet style.
*/