changeset 5339:d1816cb6e86b draft dhcpcd-8

NetBSD: Gear up for kernel RA removal. linkmtu will vanish from nd_ifinfo along with other things. Also, there is not need to pre-fetch ifinfo because flags are no longer updated when setting ifinfo back again.
author Roy Marples <roy@marples.name>
date Wed, 29 Apr 2020 14:55:23 +0100
parents 72e061a80ba2
children 7f58d95585d1
files src/if-bsd.c
diffstat 1 files changed, 22 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/if-bsd.c	Wed Jun 10 07:13:21 2020 +0100
+++ b/src/if-bsd.c	Wed Apr 29 14:55:23 2020 +0100
@@ -1476,19 +1476,31 @@
 if_applyra(const struct ra *rap)
 {
 #ifdef SIOCSIFINFO_IN6
-	struct in6_ndireq ndi = { .ndi.chlim = 0 };
-	struct priv *priv = rap->iface->ctx->priv;
+	struct in6_ndireq nd = { .ndi.chlim = 0 };
+	struct dhcpcd_ctx *ctx = rap->iface->ctx;
+	struct priv *priv = ctx->priv;
 	int error;
 
-	strlcpy(ndi.ifname, rap->iface->name, sizeof(ndi.ifname));
-	if (ioctl(priv->pf_inet6_fd, SIOCGIFINFO_IN6, &ndi) == -1)
+	strlcpy(nd.ifname, rap->iface->name, sizeof(nd.ifname));
+
+#ifdef IPV6CTL_ACCEPT_RTADV
+	/*
+	 * NetBSD changed SIOCSIFINFO_IN6 to NOT set flags when kernel
+	 * RA was removed, however both FreeBSD and DragonFlyBSD still do.
+	 * linkmtu was also removed.
+	 * Hopefully this guard will still work if either remove kernel RA.
+	 */
+	if (ioctl(priv->pf_inet6_fd, SIOCGIFINFO_IN6, &nd, sizeof(nd)) == -1)
 		return -1;
 
-	ndi.ndi.linkmtu = rap->mtu;
-	ndi.ndi.chlim = rap->hoplimit;
-	ndi.ndi.retrans = rap->retrans;
-	ndi.ndi.basereachable = rap->reachable;
-	error = ioctl(priv->pf_inet6_fd, SIOCSIFINFO_IN6, &ndi);
+	nd.ndi.linkmtu = rap->mtu;
+#endif
+
+	nd.ndi.chlim = rap->hoplimit;
+	nd.ndi.retrans = rap->retrans;
+	nd.ndi.basereachable = rap->reachable;
+	error = ioctl(priv->pf_inet6_fd, SIOCSIFINFO_IN6, &nd, sizeof(nd));
+#ifdef IPV6CTL_ACCEPT_RTADV
 	if (error == -1 && errno == EINVAL) {
 		/*
 		 * Very likely that this is caused by a dodgy MTU
@@ -1500,6 +1512,7 @@
 		ndi.ndi.linkmtu = 0;
 		error = ioctl(priv->pf_inet6_fd, SIOCSIFINFO_IN6, &ndi);
 	}
+#endif
 	return error;
 #else
 #warning OS does not allow setting of RA bits hoplimit, retrans or reachable