]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
if: ensure interface flags persist when setting a flag
authorRoy Marples <roy@marples.name>
Mon, 20 Apr 2020 13:11:00 +0000 (14:11 +0100)
committerRoy Marples <roy@marples.name>
Mon, 20 Apr 2020 13:11:00 +0000 (14:11 +0100)
Otherwise we stupidly drop IFF_MULTICAST on Linux.

src/if.c

index 51e05571ba0c74d0e88b0ce4047bb4e53002dfbb..f73dfc7ed94d0946bbf64b04a71ac8b04cbc4e1c 100644 (file)
--- a/src/if.c
+++ b/src/if.c
@@ -161,19 +161,17 @@ int
 if_setflag(struct interface *ifp, short setflag, short unsetflag)
 {
        struct ifreq ifr = { .ifr_flags = 0 };
-       short f;
+       short oflags;
 
-       if (if_getflags(ifp) == -1)
+       strlcpy(ifr.ifr_name, ifp->name, sizeof(ifr.ifr_name));
+       if (ioctl(ifp->ctx->pf_inet_fd, SIOCGIFFLAGS, &ifr) == -1)
                return -1;
 
-       f = (short)ifp->flags;
-       if ((f & setflag) == setflag && (f & unsetflag) == 0)
-               return 0;
-
-       strlcpy(ifr.ifr_name, ifp->name, sizeof(ifr.ifr_name));
+       oflags = ifr.ifr_flags;
        ifr.ifr_flags |= setflag;
        ifr.ifr_flags &= (short)~unsetflag;
-       if (if_ioctl(ifp->ctx, SIOCSIFFLAGS, &ifr, sizeof(ifr)) == -1)
+       if (ifr.ifr_flags != oflags &&
+           if_ioctl(ifp->ctx, SIOCSIFFLAGS, &ifr, sizeof(ifr)) == -1)
                return -1;
 
        ifp->flags = (unsigned int)ifr.ifr_flags;