Module Name:    src
Committed By:   roy
Date:           Mon Jan 27 20:42:57 UTC 2020

Modified Files:
        src/external/bsd/dhcpcd/dist/src: dhcp.c if-bsd.c ipv6.c ipv6.h
            ipv6nd.c

Log Message:
Sync


To generate a diff of this commit:
cvs rdiff -u -r1.31 -r1.32 src/external/bsd/dhcpcd/dist/src/dhcp.c
cvs rdiff -u -r1.15 -r1.16 src/external/bsd/dhcpcd/dist/src/if-bsd.c \
    src/external/bsd/dhcpcd/dist/src/ipv6nd.c
cvs rdiff -u -r1.7 -r1.8 src/external/bsd/dhcpcd/dist/src/ipv6.c \
    src/external/bsd/dhcpcd/dist/src/ipv6.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/bsd/dhcpcd/dist/src/dhcp.c
diff -u src/external/bsd/dhcpcd/dist/src/dhcp.c:1.31 src/external/bsd/dhcpcd/dist/src/dhcp.c:1.32
--- src/external/bsd/dhcpcd/dist/src/dhcp.c:1.31	Fri Dec 20 12:01:35 2019
+++ src/external/bsd/dhcpcd/dist/src/dhcp.c	Mon Jan 27 20:42:56 2020
@@ -2335,9 +2335,10 @@ dhcp_message_new(struct bootp **bootp,
 static void
 dhcp_arp_defend_failed(struct arp_state *astate)
 {
+	struct interface *ifp = astate->iface;
 
-	dhcp_drop(astate->iface, "EXPIRED");
-	dhcp_start1(astate->iface);
+	dhcp_drop(ifp, "EXPIRED");
+	dhcp_start1(ifp);
 }
 #endif
 

Index: src/external/bsd/dhcpcd/dist/src/if-bsd.c
diff -u src/external/bsd/dhcpcd/dist/src/if-bsd.c:1.15 src/external/bsd/dhcpcd/dist/src/if-bsd.c:1.16
--- src/external/bsd/dhcpcd/dist/src/if-bsd.c:1.15	Wed Nov 13 10:50:22 2019
+++ src/external/bsd/dhcpcd/dist/src/if-bsd.c	Mon Jan 27 20:42:56 2020
@@ -860,8 +860,6 @@ if_address(unsigned char cmd, const stru
 	return r;
 }
 
-
-
 #if !(defined(HAVE_IFADDRS_ADDRFLAGS) && defined(HAVE_IFAM_ADDRFLAGS))
 int
 if_addrflags(const struct interface *ifp, const struct in_addr *addr,
@@ -1194,7 +1192,7 @@ if_ifa(struct dhcpcd_ctx *ctx, const str
 {
 	struct interface *ifp;
 	const struct sockaddr *rti_info[RTAX_MAX];
-	int addrflags;
+	int flags;
 	pid_t pid;
 
 	if (ifam->ifam_msglen < sizeof(*ifam)) {
@@ -1216,9 +1214,6 @@ if_ifa(struct dhcpcd_ctx *ctx, const str
 	pid = 0;
 #endif
 
-#ifdef HAVE_IFAM_ADDRFLAGS
-	addrflags = ifam->ifam_addrflags;
-#endif
 	switch (rti_info[RTAX_IFA]->sa_family) {
 	case AF_LINK:
 	{
@@ -1252,78 +1247,70 @@ if_ifa(struct dhcpcd_ctx *ctx, const str
 		bcast.s_addr = sin != NULL && sin->sin_family == AF_INET ?
 		    sin->sin_addr.s_addr : INADDR_ANY;
 
-#if defined(__NetBSD_Version__) && __NetBSD_Version__ < 800000000
 		/*
 		 * NetBSD-7 and older send an invalid broadcast address.
 		 * So we need to query the actual address to get
 		 * the right one.
+		 * We can also use this to test if the address
+		 * has really been added or deleted.
 		 */
-		{
-#else
-		/*
-		 * If the address was deleted, lets check if it's
-		 * a late message and it still exists (maybe modified).
-		 * If so, ignore it as deleting an address causes
-		 * dhcpcd to drop any lease to which it belongs.
-		 */
-		if (ifam->ifam_type == RTM_DELADDR) {
-#endif
 #ifdef SIOCGIFALIAS
-			struct in_aliasreq ifra;
+		struct in_aliasreq ifra;
 
-			memset(&ifra, 0, sizeof(ifra));
-			strlcpy(ifra.ifra_name, ifp->name,
-			    sizeof(ifra.ifra_name));
-			ifra.ifra_addr.sin_family = AF_INET;
-			ifra.ifra_addr.sin_len = sizeof(ifra.ifra_addr);
-			ifra.ifra_addr.sin_addr = addr;
-			if (ioctl(ctx->pf_inet_fd, SIOCGIFALIAS, &ifra) == -1) {
-				if (errno != ENXIO && errno != EADDRNOTAVAIL)
-					logerr("%s: SIOCGIFALIAS", __func__);
-				if (ifam->ifam_type != RTM_DELADDR)
-					break;
-			}
+		memset(&ifra, 0, sizeof(ifra));
+		strlcpy(ifra.ifra_name, ifp->name, sizeof(ifra.ifra_name));
+		ifra.ifra_addr.sin_family = AF_INET;
+		ifra.ifra_addr.sin_len = sizeof(ifra.ifra_addr);
+		ifra.ifra_addr.sin_addr = addr;
+		if (ioctl(ctx->pf_inet_fd, SIOCGIFALIAS, &ifra) == -1) {
+			if (errno != ENXIO && errno != EADDRNOTAVAIL)
+				logerr("%s: SIOCGIFALIAS", __func__);
+			if (ifam->ifam_type != RTM_DELADDR)
+				break;
+		} else {
+			if (ifam->ifam_type == RTM_DELADDR)
+				break;
 #if defined(__NetBSD_Version__) && __NetBSD_Version__ < 800000000
-			else
-				bcast = ifra.ifra_broadaddr.sin_addr;
+			bcast = ifra.ifra_broadaddr.sin_addr;
 #endif
+		}
 #else
 #warning No SIOCGIFALIAS support
-			/*
-			 * No SIOCGIFALIAS? That sucks!
-			 * This makes this call very heavy weight, but we
-			 * really need to know if the message is late or not.
-			 */
-			const struct sockaddr *sa;
-			struct ifaddrs *ifaddrs = NULL, *ifa;
-
-			sa = rti_info[RTAX_IFA];
-			getifaddrs(&ifaddrs);
-			for (ifa = ifaddrs; ifa; ifa = ifa->ifa_next) {
-				if (ifa->ifa_addr == NULL)
-					continue;
-				if (sa_cmp(ifa->ifa_addr, sa) == 0 &&
-				    strcmp(ifa->ifa_name, ifp->name) == 0)
-					break;
-			}
-			freeifaddrs(ifaddrs);
+		/*
+		 * No SIOCGIFALIAS? That sucks!
+		 * This makes this call very heavy weight, but we
+		 * really need to know if the message is late or not.
+		 */
+		const struct sockaddr *sa;
+		struct ifaddrs *ifaddrs = NULL, *ifa;
+
+		sa = rti_info[RTAX_IFA];
+		getifaddrs(&ifaddrs);
+		for (ifa = ifaddrs; ifa; ifa = ifa->ifa_next) {
+			if (ifa->ifa_addr == NULL)
+				continue;
+			if (sa_cmp(ifa->ifa_addr, sa) == 0 &&
+			    strcmp(ifa->ifa_name, ifp->name) == 0)
+				break;
+		}
+		freeifaddrs(ifaddrs);
+		if (ifam->ifam_type == RTM_DELADDR) {
 			if (ifa != NULL)
-				return 0;
-#endif
+				break;
+		} else {
+			if (ifa == NULL)
+				break;
 		}
+#endif
 
-#ifndef HAVE_IFAM_ADDRFLAGS
-		if (ifam->ifam_type == RTM_DELADDR)
-			addrflags = 0 ;
-		else if ((addrflags = if_addrflags(ifp, &addr, NULL)) == -1) {
-			if (errno != EADDRNOTAVAIL)
-				logerr("%s: if_addrflags", __func__);
-			break;
-		}
+#ifdef HAVE_IFAM_ADDRFLAGS
+		flags = ifam->ifam_addrflags;
+#else
+		flags = 0;
 #endif
 
 		ipv4_handleifa(ctx, ifam->ifam_type, NULL, ifp->name,
-		    &addr, &mask, &bcast, addrflags, pid);
+		    &addr, &mask, &bcast, flags, pid);
 		break;
 	}
 #endif
@@ -1332,7 +1319,6 @@ if_ifa(struct dhcpcd_ctx *ctx, const str
 	{
 		struct in6_addr addr6, mask6;
 		const struct sockaddr_in6 *sin6;
-		int flags;
 
 		sin6 = (const void *)rti_info[RTAX_IFA];
 		addr6 = sin6->sin6_addr;
@@ -1344,20 +1330,17 @@ if_ifa(struct dhcpcd_ctx *ctx, const str
 		 * a late message and it still exists (maybe modified).
 		 * If so, ignore it as deleting an address causes
 		 * dhcpcd to drop any lease to which it belongs.
+		 * Also check an added address was really added.
 		 */
-		if (ifam->ifam_type == RTM_DELADDR) {
-			flags = if_addrflags6(ifp, &addr6, NULL);
-			if (flags != -1)
-				break;
-			addrflags = 0;
-		}
-#ifndef HAVE_IFAM_ADDRFLAGS
-		else if ((addrflags = if_addrflags6(ifp, &addr6, NULL)) == -1) {
+		flags = if_addrflags6(ifp, &addr6, NULL);
+		if (flags == -1) {
 			if (errno != EADDRNOTAVAIL)
 				logerr("%s: if_addrflags6", __func__);
+			if (ifam->ifam_type != RTM_DELADDR)
+				break;
+			flags = 0;
+		} else if (ifam->ifam_type == RTM_DELADDR)
 			break;
-		}
-#endif
 
 #ifdef __KAME__
 		if (IN6_IS_ADDR_LINKLOCAL(&addr6))
@@ -1366,7 +1349,7 @@ if_ifa(struct dhcpcd_ctx *ctx, const str
 #endif
 
 		ipv6_handleifa(ctx, ifam->ifam_type, NULL,
-		    ifp->name, &addr6, ipv6_prefixlen(&mask6), addrflags, pid);
+		    ifp->name, &addr6, ipv6_prefixlen(&mask6), flags, pid);
 		break;
 	}
 #endif
Index: src/external/bsd/dhcpcd/dist/src/ipv6nd.c
diff -u src/external/bsd/dhcpcd/dist/src/ipv6nd.c:1.15 src/external/bsd/dhcpcd/dist/src/ipv6nd.c:1.16
--- src/external/bsd/dhcpcd/dist/src/ipv6nd.c:1.15	Fri Jan  3 12:39:18 2020
+++ src/external/bsd/dhcpcd/dist/src/ipv6nd.c	Mon Jan 27 20:42:56 2020
@@ -1262,7 +1262,8 @@ ipv6nd_handlera(struct dhcpcd_ctx *ctx,
 #ifdef IPV6_MANAGETEMPADDR
 			/* RFC4941 Section 3.3.3 */
 			if (ap->flags & IPV6_AF_AUTOCONF &&
-			    ip6_use_tempaddr(ap->iface->name))
+			    ip6_use_tempaddr(ap->iface->name) &&
+			    ipv6_ifidlen(ap->iface) + ap->prefix_len == 128)
 			{
 				if (!new_ap) {
 					if (ipv6_settemptime(ap, 1) == NULL)

Index: src/external/bsd/dhcpcd/dist/src/ipv6.c
diff -u src/external/bsd/dhcpcd/dist/src/ipv6.c:1.7 src/external/bsd/dhcpcd/dist/src/ipv6.c:1.8
--- src/external/bsd/dhcpcd/dist/src/ipv6.c:1.7	Fri Dec 20 12:01:35 2019
+++ src/external/bsd/dhcpcd/dist/src/ipv6.c	Mon Jan 27 20:42:56 2020
@@ -1565,7 +1565,9 @@ ipv6_newaddr(struct interface *ifp, cons
 	tempaddr = false;
 #endif
 
-	if (ia->flags & IPV6_AF_AUTOCONF && !tempaddr) {
+	if (prefix_len == 128)
+		goto makepfx;
+	else if (ia->flags & IPV6_AF_AUTOCONF && !tempaddr) {
 		ia->prefix = *addr;
 		ia->dadcounter = ipv6_makeaddr(&ia->addr, ifp,
 		                               &ia->prefix,
@@ -1581,13 +1583,12 @@ ipv6_newaddr(struct interface *ifp, cons
 #else
 		return ia;
 #endif
-	} else if (ia->flags & (IPV6_AF_REQUEST | IPV6_AF_DELEGATEDPFX) &&
-	           prefix_len != 128)
-	{
+	} else if (ia->flags & (IPV6_AF_REQUEST | IPV6_AF_DELEGATEDPFX)) {
 		ia->prefix = *addr;
 		cbp = inet_ntop(AF_INET6, &ia->prefix, buf, sizeof(buf));
 		goto paddr;
 	} else {
+makepfx:
 		ia->addr = *addr;
 		if (ipv6_makeprefix(&ia->prefix,
 		                    &ia->addr, ia->prefix_len) == -1)
Index: src/external/bsd/dhcpcd/dist/src/ipv6.h
diff -u src/external/bsd/dhcpcd/dist/src/ipv6.h:1.7 src/external/bsd/dhcpcd/dist/src/ipv6.h:1.8
--- src/external/bsd/dhcpcd/dist/src/ipv6.h:1.7	Fri Dec 20 12:01:35 2019
+++ src/external/bsd/dhcpcd/dist/src/ipv6.h	Mon Jan 27 20:42:56 2020
@@ -67,6 +67,9 @@
 #define IDGEN_RETRIES	3
 #define IDGEN_DELAY	1 /* second */
 
+/* Interface identifier length. Prefix + this == 128 for autoconf */
+#define ipv6_ifidlen(ifp)	64
+
 #ifndef IN6_ARE_MASKED_ADDR_EQUAL
 #define IN6_ARE_MASKED_ADDR_EQUAL(d, a, m)	(	\
 	(((d)->s6_addr32[0] ^ (a)->s6_addr32[0]) & (m)->s6_addr32[0]) == 0 && \

Reply via email to