On Fri, Aug 04, 2017 at 07:51:22PM +0000, Florian Obser wrote:
> Yes, I was thinking about that, too. it's a bit more complex. I think
> it's worth it, especially if we ever have a autoconf4 flag.  The
> trouble with the SIOCIFAFDETACH that have to track if a flag changes.
> this applies the heavy hammer of just checking if if_flags or
> if_xflags changed.
> Am I overengineering this?

I think this approach fine.
Please remove the error = 0; line, here it is 0 already.
OK bluhm@

> diff --git if.c if.c
> index ed95b15b8c9..3d9af2acf6e 100644
> --- if.c
> +++ if.c
> @@ -1828,7 +1828,7 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, 
> struct proc *p)
>       struct if_afreq *ifar;
>       char ifdescrbuf[IFDESCRSIZE];
>       char ifrtlabelbuf[RTLABEL_LEN];
> -     int s, error = 0;
> +     int s, error = 0, oif_xflags;
>       size_t bytesdone;
>       short oif_flags;
>       const char *label;
> @@ -1865,23 +1865,29 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, 
> struct proc *p)
>               ifar = (struct if_afreq *)data;
>               if ((ifp = ifunit(ifar->ifar_name)) == NULL)
>                       return (ENXIO);
> +             oif_flags = ifp->if_flags;
> +             oif_xflags = ifp->if_xflags;
> +             error = 0;
>               switch (ifar->ifar_af) {
>               case AF_INET:
>                       /* attach is a noop for AF_INET */
>                       if (cmd == SIOCIFAFDETACH)
>                               in_ifdetach(ifp);
> -                     return (0);
> +                     break;
>  #ifdef INET6
>               case AF_INET6:
>                       if (cmd == SIOCIFAFATTACH)
>                               error = in6_ifattach(ifp);
>                       else
>                               in6_ifdetach(ifp);
> -                     return (error);
> +                     break;
>  #endif /* INET6 */
>               default:
>                       return (EAFNOSUPPORT);
>               }
> +             if (oif_flags != ifp->if_flags || oif_xflags != ifp->if_xflags)
> +                     rtm_ifchg(ifp);
> +             return (error);
>       }
>  
>       ifp = ifunit(ifr->ifr_name);
> 
> 
> -- 
> I'm not entirely sure you are real.

Reply via email to