]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
NetBSD: Gear up for kernel RA removal.
authorRoy Marples <roy@marples.name>
Wed, 29 Apr 2020 13:55:23 +0000 (14:55 +0100)
committerRoy Marples <roy@marples.name>
Wed, 29 Apr 2020 13:55:23 +0000 (14:55 +0100)
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.

src/if-bsd.c

index 42bf74804a69c053cb9f5ae4e7790672078505a6..9a491b3123923fc7631f3aa78e97971648f8df69 100644 (file)
@@ -1649,18 +1649,30 @@ if_applyra(const struct ra *rap)
 #ifdef SIOCSIFINFO_IN6
        struct in6_ndireq nd = { .ndi.chlim = 0 };
        struct dhcpcd_ctx *ctx = rap->iface->ctx;
-       struct priv *priv = ctx->priv;
        int error;
 
        strlcpy(nd.ifname, rap->iface->name, sizeof(nd.ifname));
+
+#ifdef IPV6CTL_ACCEPT_RTADV
+       struct priv *priv = ctx->priv;
+
+       /*
+        * 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;
 
        nd.ndi.linkmtu = rap->mtu;
+#endif
+
        nd.ndi.chlim = rap->hoplimit;
        nd.ndi.retrans = rap->retrans;
        nd.ndi.basereachable = rap->reachable;
        error = if_ioctl6(ctx, SIOCSIFINFO_IN6, &nd, sizeof(nd));
+#ifdef IPV6CTL_ACCEPT_RTADV
        if (error == -1 && errno == EINVAL) {
                /*
                 * Very likely that this is caused by a dodgy MTU
@@ -1672,6 +1684,7 @@ if_applyra(const struct ra *rap)
                nd.ndi.linkmtu = 0;
                error = if_ioctl6(ctx, SIOCSIFINFO_IN6, &nd, sizeof(nd));
        }
+#endif
        return error;
 #else
 #warning OS does not allow setting of RA bits hoplimit, retrans or reachable