On Wed, Oct 18, 2017 at 01:34:27PM +0200, Martin Pieuchot wrote:
> Kill ioctl(2) added with original KAME import that have never been used.
> FreeBSD also stopped supporting them in 2013.
> 
> ok?

OK bluhm@

> Index: sys/sockio.h
> ===================================================================
> RCS file: /cvs/src/sys/sys/sockio.h,v
> retrieving revision 1.70
> diff -u -p -r1.70 sockio.h
> --- sys/sockio.h      27 Jun 2017 22:18:24 -0000      1.70
> +++ sys/sockio.h      18 Oct 2017 11:28:25 -0000
> @@ -64,12 +64,6 @@
>  #define      SIOCGIFDATA     _IOWR('i', 27, struct ifreq)    /* get if_data 
> */
>  #define      SIOCSIFLLADDR   _IOW('i', 31, struct ifreq)     /* set link 
> level addr */
>  
> -/* KAME IPv6 */
> -/* SIOCAIFALIAS? */
> -#define SIOCALIFADDR  _IOW('i', 28, struct if_laddrreq) /* add IF addr */
> -#define SIOCGLIFADDR _IOWR('i', 29, struct if_laddrreq) /* get IF addr */
> -#define SIOCDLIFADDR  _IOW('i', 30, struct if_laddrreq) /* delete IF addr */
> -
>  #define      SIOCADDMULTI     _IOW('i', 49, struct ifreq)    /* add m'cast 
> addr */
>  #define      SIOCDELMULTI     _IOW('i', 50, struct ifreq)    /* del m'cast 
> addr */
>  #define      SIOCGETVIFCNT   _IOWR('u', 51, struct sioc_vif_req)/* vif pkt 
> cnt */
> Index: netinet/in.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/in.c,v
> retrieving revision 1.140
> diff -u -p -r1.140 in.c
> --- netinet/in.c      11 Aug 2017 19:53:02 -0000      1.140
> +++ netinet/in.c      18 Oct 2017 11:29:04 -0000
> @@ -83,7 +83,6 @@
>  
>  
>  void in_socktrim(struct sockaddr_in *);
> -int in_lifaddr_ioctl(u_long, caddr_t, struct ifnet *, int);
>  
>  void in_purgeaddr(struct ifaddr *);
>  int in_addhost(struct in_ifaddr *, struct sockaddr_in *);
> @@ -182,9 +181,6 @@ in_nam2sin(const struct mbuf *nam, struc
>       return 0;
>  }
>  
> -/*
> - * Generic internet control operations (ioctl's).
> - */
>  int
>  in_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp)
>  {
> @@ -194,25 +190,13 @@ in_control(struct socket *so, u_long cmd
>       if ((so->so_state & SS_PRIV) != 0)
>               privileged++;
>  
> -     switch (cmd) {
>  #ifdef MROUTING
> +     switch (cmd) {
>       case SIOCGETVIFCNT:
>       case SIOCGETSGCNT:
>               return (mrt_ioctl(so, cmd, data));
> -#endif /* MROUTING */
> -     case SIOCALIFADDR:
> -     case SIOCDLIFADDR:
> -             if (!privileged)
> -                     return (EPERM);
> -             /* FALLTHROUGH */
> -     case SIOCGLIFADDR:
> -             if (ifp == NULL)
> -                     return (EINVAL);
> -             return in_lifaddr_ioctl(cmd, data, ifp, privileged);
> -     default:
> -             if (ifp == NULL)
> -                     return (EOPNOTSUPP);
>       }
> +#endif /* MROUTING */
>  
>       return (in_ioctl(cmd, data, ifp, privileged));
>  }
> @@ -228,6 +212,9 @@ in_ioctl(u_long cmd, caddr_t data, struc
>       int error;
>       int newifaddr;
>  
> +     if (ifp == NULL)
> +             return (EOPNOTSUPP);
> +
>       NET_ASSERT_LOCKED();
>  
>       TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
> @@ -413,187 +400,6 @@ in_ioctl(u_long cmd, caddr_t data, struc
>       }
>       return (0);
>  }
> -
> -/*
> - * SIOC[GAD]LIFADDR.
> - *   SIOCGLIFADDR: get first address. (???)
> - *   SIOCGLIFADDR with IFLR_PREFIX:
> - *           get first address that matches the specified prefix.
> - *   SIOCALIFADDR: add the specified address.
> - *   SIOCALIFADDR with IFLR_PREFIX:
> - *           EINVAL since we can't deduce hostid part of the address.
> - *   SIOCDLIFADDR: delete the specified address.
> - *   SIOCDLIFADDR with IFLR_PREFIX:
> - *           delete the first address that matches the specified prefix.
> - * return values:
> - *   EINVAL on invalid parameters
> - *   EADDRNOTAVAIL on prefix match failed/specified address not found
> - *   other values may be returned from in_ioctl()
> - */
> -int
> -in_lifaddr_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp, int privileged)
> -{
> -     struct if_laddrreq *iflr = (struct if_laddrreq *)data;
> -     struct ifaddr *ifa;
> -     struct sockaddr *sa;
> -
> -     /* sanity checks */
> -     if (!data || !ifp) {
> -             panic("invalid argument to in_lifaddr_ioctl");
> -             /*NOTRECHED*/
> -     }
> -
> -     switch (cmd) {
> -     case SIOCGLIFADDR:
> -             /* address must be specified on GET with IFLR_PREFIX */
> -             if ((iflr->flags & IFLR_PREFIX) == 0)
> -                     break;
> -             /*FALLTHROUGH*/
> -     case SIOCALIFADDR:
> -     case SIOCDLIFADDR:
> -             /* address must be specified on ADD and DELETE */
> -             sa = sstosa(&iflr->addr);
> -             if (sa->sa_family != AF_INET)
> -                     return EINVAL;
> -             if (sa->sa_len != sizeof(struct sockaddr_in))
> -                     return EINVAL;
> -             /* XXX need improvement */
> -             sa = sstosa(&iflr->dstaddr);
> -             if (sa->sa_family
> -              && sa->sa_family != AF_INET)
> -                     return EINVAL;
> -             if (sa->sa_len && sa->sa_len != sizeof(struct sockaddr_in))
> -                     return EINVAL;
> -             break;
> -     default: /*shouldn't happen*/
> -#if 0
> -             panic("invalid cmd to in_lifaddr_ioctl");
> -             /*NOTREACHED*/
> -#else
> -             return EOPNOTSUPP;
> -#endif
> -     }
> -     if (sizeof(struct in_addr) * 8 < iflr->prefixlen)
> -             return EINVAL;
> -
> -     switch (cmd) {
> -     case SIOCALIFADDR:
> -         {
> -             struct in_aliasreq ifra;
> -
> -             if (iflr->flags & IFLR_PREFIX)
> -                     return EINVAL;
> -
> -             /* copy args to in_aliasreq, perform ioctl(SIOCAIFADDR). */
> -             bzero(&ifra, sizeof(ifra));
> -             memcpy(ifra.ifra_name, iflr->iflr_name,
> -                 sizeof(ifra.ifra_name));
> -
> -             memcpy(&ifra.ifra_addr, &iflr->addr, iflr->addr.ss_len);
> -
> -             if (iflr->dstaddr.ss_family) {  /*XXX*/
> -                     memcpy(&ifra.ifra_dstaddr, &iflr->dstaddr,
> -                         iflr->dstaddr.ss_len);
> -             }
> -
> -             ifra.ifra_mask.sin_family = AF_INET;
> -             ifra.ifra_mask.sin_len = sizeof(struct sockaddr_in);
> -             in_len2mask(&ifra.ifra_mask.sin_addr, iflr->prefixlen);
> -
> -             return in_ioctl(SIOCAIFADDR, (caddr_t)&ifra, ifp, privileged);
> -         }
> -     case SIOCGLIFADDR:
> -     case SIOCDLIFADDR:
> -         {
> -             struct in_ifaddr *ia;
> -             struct in_addr mask, candidate, match;
> -             struct sockaddr_in *sin;
> -             int cmp;
> -
> -             bzero(&mask, sizeof(mask));
> -             if (iflr->flags & IFLR_PREFIX) {
> -                     /* lookup a prefix rather than address. */
> -                     in_len2mask(&mask, iflr->prefixlen);
> -
> -                     sin = (struct sockaddr_in *)&iflr->addr;
> -                     match.s_addr = sin->sin_addr.s_addr;
> -                     match.s_addr &= mask.s_addr;
> -
> -                     /* if you set extra bits, that's wrong */
> -                     if (match.s_addr != sin->sin_addr.s_addr)
> -                             return EINVAL;
> -
> -                     cmp = 1;
> -             } else {
> -                     if (cmd == SIOCGLIFADDR) {
> -                             /* on getting an address, take the 1st match */
> -                             cmp = 0;        /*XXX*/
> -                     } else {
> -                             /* on deleting an address, do exact match */
> -                             in_len2mask(&mask, 32);
> -                             sin = (struct sockaddr_in *)&iflr->addr;
> -                             match.s_addr = sin->sin_addr.s_addr;
> -
> -                             cmp = 1;
> -                     }
> -             }
> -
> -             TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
> -                     if (ifa->ifa_addr->sa_family != AF_INET)
> -                             continue;
> -                     if (!cmp)
> -                             break;
> -                     candidate.s_addr = ((struct sockaddr_in 
> *)&ifa->ifa_addr)->sin_addr.s_addr;
> -                     candidate.s_addr &= mask.s_addr;
> -                     if (candidate.s_addr == match.s_addr)
> -                             break;
> -             }
> -             if (!ifa)
> -                     return EADDRNOTAVAIL;
> -             ia = ifatoia(ifa);
> -
> -             if (cmd == SIOCGLIFADDR) {
> -                     /* fill in the if_laddrreq structure */
> -                     memcpy(&iflr->addr, &ia->ia_addr, ia->ia_addr.sin_len);
> -
> -                     if ((ifp->if_flags & IFF_POINTOPOINT) != 0) {
> -                             memcpy(&iflr->dstaddr, &ia->ia_dstaddr,
> -                                 ia->ia_dstaddr.sin_len);
> -                     } else
> -                             bzero(&iflr->dstaddr, sizeof(iflr->dstaddr));
> -
> -                     iflr->prefixlen =
> -                             in_mask2len(&ia->ia_sockmask.sin_addr);
> -
> -                     iflr->flags = 0;        /*XXX*/
> -
> -                     return 0;
> -             } else {
> -                     struct in_aliasreq ifra;
> -
> -                     /* fill in_aliasreq and do ioctl(SIOCDIFADDR) */
> -                     bzero(&ifra, sizeof(ifra));
> -                     memcpy(ifra.ifra_name, iflr->iflr_name,
> -                         sizeof(ifra.ifra_name));
> -
> -                     memcpy(&ifra.ifra_addr, &ia->ia_addr,
> -                         ia->ia_addr.sin_len);
> -                     if ((ifp->if_flags & IFF_POINTOPOINT) != 0) {
> -                             memcpy(&ifra.ifra_dstaddr, &ia->ia_dstaddr,
> -                                 ia->ia_dstaddr.sin_len);
> -                     }
> -                     memcpy(&ifra.ifra_dstaddr, &ia->ia_sockmask,
> -                         ia->ia_sockmask.sin_len);
> -
> -                     return in_ioctl(SIOCDIFADDR, (caddr_t)&ifra, ifp,
> -                         privileged);
> -             }
> -         }
> -     }
> -
> -     return EOPNOTSUPP;      /*just for safety*/
> -}
> -
>  /*
>   * Delete any existing route for an interface.
>   */
> Index: netinet6/in6.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/in6.c,v
> retrieving revision 1.212
> diff -u -p -r1.212 in6.c
> --- netinet6/in6.c    16 Oct 2017 13:40:58 -0000      1.212
> +++ netinet6/in6.c    18 Oct 2017 11:27:45 -0000
> @@ -118,7 +118,6 @@ const struct in6_addr in6mask64 = IN6MAS
>  const struct in6_addr in6mask96 = IN6MASK96;
>  const struct in6_addr in6mask128 = IN6MASK128;
>  
> -int in6_lifaddr_ioctl(u_long, caddr_t, struct ifnet *, int);
>  int in6_ioctl(u_long, caddr_t, struct ifnet *, int);
>  int in6_ifinit(struct ifnet *, struct in6_ifaddr *, int);
>  void in6_unlink_ifa(struct in6_ifaddr *, struct ifnet *);
> @@ -196,7 +195,7 @@ in6_control(struct socket *so, u_long cm
>       case SIOCGETMIFCNT_IN6:
>               return (mrt6_ioctl(so, cmd, data));
>       }
> -#endif
> +#endif /* MROUTING */
>  
>       return (in6_ioctl(cmd, data, ifp, privileged));
>  }
> @@ -226,16 +225,6 @@ in6_ioctl(u_long cmd, caddr_t data, stru
>               return (nd6_ioctl(cmd, data, ifp));
>       }
>  
> -     switch (cmd) {
> -     case SIOCALIFADDR:
> -     case SIOCDLIFADDR:
> -             if (!privileged)
> -                     return (EPERM);
> -             /* FALLTHROUGH */
> -     case SIOCGLIFADDR:
> -             return in6_lifaddr_ioctl(cmd, data, ifp, privileged);
> -     }
> -
>       /*
>        * Find address for this interface, if it exists.
>        *
> @@ -931,241 +920,6 @@ in6_unlink_ifa(struct in6_ifaddr *ia6, s
>       ifatrash++;
>       ia6->ia_ifp = NULL;
>       ifafree(&ia6->ia_ifa);
> -}
> -
> -/*
> - * SIOC[GAD]LIFADDR.
> - *   SIOCGLIFADDR: get first address. (?)
> - *   SIOCGLIFADDR with IFLR_PREFIX:
> - *           get first address that matches the specified prefix.
> - *   SIOCALIFADDR: add the specified address.
> - *   SIOCALIFADDR with IFLR_PREFIX:
> - *           add the specified prefix, filling hostid part from
> - *           the first link-local address.  prefixlen must be <= 64.
> - *   SIOCDLIFADDR: delete the specified address.
> - *   SIOCDLIFADDR with IFLR_PREFIX:
> - *           delete the first address that matches the specified prefix.
> - * return values:
> - *   EINVAL on invalid parameters
> - *   EADDRNOTAVAIL on prefix match failed/specified address not found
> - *   other values may be returned from in6_ioctl()
> - *
> - * NOTE: SIOCALIFADDR(with IFLR_PREFIX set) allows prefixlen less than 64.
> - * this is to accommodate address naming scheme other than RFC2374,
> - * in the future.
> - * RFC2373 defines interface id to be 64bit, but it allows non-RFC2374
> - * address encoding scheme. (see figure on page 8)
> - */
> -int
> -in6_lifaddr_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp, int 
> privileged)
> -{
> -     struct if_laddrreq *iflr = (struct if_laddrreq *)data;
> -     struct ifaddr *ifa;
> -     struct sockaddr *sa;
> -
> -     /* sanity checks */
> -     if (!data || !ifp) {
> -             panic("invalid argument to in6_lifaddr_ioctl");
> -             /* NOTREACHED */
> -     }
> -
> -     switch (cmd) {
> -     case SIOCGLIFADDR:
> -             /* address must be specified on GET with IFLR_PREFIX */
> -             if ((iflr->flags & IFLR_PREFIX) == 0)
> -                     break;
> -             /* FALLTHROUGH */
> -     case SIOCALIFADDR:
> -     case SIOCDLIFADDR:
> -             /* address must be specified on ADD and DELETE */
> -             sa = sstosa(&iflr->addr);
> -             if (sa->sa_family != AF_INET6)
> -                     return EINVAL;
> -             if (sa->sa_len != sizeof(struct sockaddr_in6))
> -                     return EINVAL;
> -             /* XXX need improvement */
> -             sa = sstosa(&iflr->dstaddr);
> -             if (sa->sa_family && sa->sa_family != AF_INET6)
> -                     return EINVAL;
> -             if (sa->sa_len && sa->sa_len != sizeof(struct sockaddr_in6))
> -                     return EINVAL;
> -             break;
> -     default: /* shouldn't happen */
> -#if 0
> -             panic("invalid cmd to in6_lifaddr_ioctl");
> -             /* NOTREACHED */
> -#else
> -             return EOPNOTSUPP;
> -#endif
> -     }
> -     if (sizeof(struct in6_addr) * 8 < iflr->prefixlen)
> -             return EINVAL;
> -
> -     switch (cmd) {
> -     case SIOCALIFADDR:
> -         {
> -             struct in6_aliasreq ifra;
> -             struct in6_addr *hostid = NULL;
> -             int prefixlen;
> -
> -             if ((iflr->flags & IFLR_PREFIX) != 0) {
> -                     struct sockaddr_in6 *sin6;
> -
> -                     /*
> -                      * hostid is to fill in the hostid part of the
> -                      * address.  hostid points to the first link-local
> -                      * address attached to the interface.
> -                      */
> -                     ifa = &in6ifa_ifpforlinklocal(ifp, 0)->ia_ifa;
> -                     if (!ifa)
> -                             return EADDRNOTAVAIL;
> -                     hostid = IFA_IN6(ifa);
> -
> -                     /* prefixlen must be <= 64. */
> -                     if (64 < iflr->prefixlen)
> -                             return EINVAL;
> -                     prefixlen = iflr->prefixlen;
> -
> -                     /* hostid part must be zero. */
> -                     sin6 = (struct sockaddr_in6 *)&iflr->addr;
> -                     if (sin6->sin6_addr.s6_addr32[2] != 0
> -                      || sin6->sin6_addr.s6_addr32[3] != 0) {
> -                             return EINVAL;
> -                     }
> -             } else
> -                     prefixlen = iflr->prefixlen;
> -
> -             /* copy args to in6_aliasreq, perform ioctl(SIOCAIFADDR_IN6). */
> -             bzero(&ifra, sizeof(ifra));
> -             bcopy(iflr->iflr_name, ifra.ifra_name, sizeof(ifra.ifra_name));
> -
> -             bcopy(&iflr->addr, &ifra.ifra_addr, iflr->addr.ss_len);
> -             if (hostid) {
> -                     /* fill in hostid part */
> -                     ifra.ifra_addr.sin6_addr.s6_addr32[2] =
> -                         hostid->s6_addr32[2];
> -                     ifra.ifra_addr.sin6_addr.s6_addr32[3] =
> -                         hostid->s6_addr32[3];
> -             }
> -
> -             if (iflr->dstaddr.ss_family) {  /*XXX*/
> -                     bcopy(&iflr->dstaddr, &ifra.ifra_dstaddr,
> -                         iflr->dstaddr.ss_len);
> -                     if (hostid) {
> -                             ifra.ifra_dstaddr.sin6_addr.s6_addr32[2] =
> -                                 hostid->s6_addr32[2];
> -                             ifra.ifra_dstaddr.sin6_addr.s6_addr32[3] =
> -                                 hostid->s6_addr32[3];
> -                     }
> -             }
> -
> -             ifra.ifra_prefixmask.sin6_len = sizeof(struct sockaddr_in6);
> -             in6_prefixlen2mask(&ifra.ifra_prefixmask.sin6_addr, prefixlen);
> -
> -             ifra.ifra_flags = iflr->flags & ~IFLR_PREFIX;
> -             return in6_ioctl(SIOCAIFADDR_IN6, (caddr_t)&ifra, ifp,
> -                 privileged);
> -         }
> -     case SIOCGLIFADDR:
> -     case SIOCDLIFADDR:
> -         {
> -             struct in6_ifaddr *ia6;
> -             struct in6_addr mask, candidate, match;
> -             struct sockaddr_in6 *sin6;
> -             int cmp;
> -
> -             bzero(&mask, sizeof(mask));
> -             if (iflr->flags & IFLR_PREFIX) {
> -                     /* lookup a prefix rather than address. */
> -                     in6_prefixlen2mask(&mask, iflr->prefixlen);
> -
> -                     sin6 = (struct sockaddr_in6 *)&iflr->addr;
> -                     bcopy(&sin6->sin6_addr, &match, sizeof(match));
> -                     match.s6_addr32[0] &= mask.s6_addr32[0];
> -                     match.s6_addr32[1] &= mask.s6_addr32[1];
> -                     match.s6_addr32[2] &= mask.s6_addr32[2];
> -                     match.s6_addr32[3] &= mask.s6_addr32[3];
> -
> -                     /* if you set extra bits, that's wrong */
> -                     if (bcmp(&match, &sin6->sin6_addr, sizeof(match)))
> -                             return EINVAL;
> -
> -                     cmp = 1;
> -             } else {
> -                     if (cmd == SIOCGLIFADDR) {
> -                             /* on getting an address, take the 1st match */
> -                             cmp = 0;        /* XXX */
> -                     } else {
> -                             /* on deleting an address, do exact match */
> -                             in6_prefixlen2mask(&mask, 128);
> -                             sin6 = (struct sockaddr_in6 *)&iflr->addr;
> -                             bcopy(&sin6->sin6_addr, &match, sizeof(match));
> -
> -                             cmp = 1;
> -                     }
> -             }
> -
> -             TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
> -                     if (ifa->ifa_addr->sa_family != AF_INET6)
> -                             continue;
> -                     if (!cmp)
> -                             break;
> -
> -                     bcopy(IFA_IN6(ifa), &candidate, sizeof(candidate));
> -                     candidate.s6_addr32[0] &= mask.s6_addr32[0];
> -                     candidate.s6_addr32[1] &= mask.s6_addr32[1];
> -                     candidate.s6_addr32[2] &= mask.s6_addr32[2];
> -                     candidate.s6_addr32[3] &= mask.s6_addr32[3];
> -                     if (IN6_ARE_ADDR_EQUAL(&candidate, &match))
> -                             break;
> -             }
> -             if (!ifa)
> -                     return EADDRNOTAVAIL;
> -             ia6 = ifatoia6(ifa);
> -
> -             if (cmd == SIOCGLIFADDR) {
> -                     /* fill in the if_laddrreq structure */
> -                     bcopy(&ia6->ia_addr, &iflr->addr, 
> ia6->ia_addr.sin6_len);
> -                     if ((ifp->if_flags & IFF_POINTOPOINT) != 0) {
> -                             bcopy(&ia6->ia_dstaddr, &iflr->dstaddr,
> -                                 ia6->ia_dstaddr.sin6_len);
> -                     } else
> -                             bzero(&iflr->dstaddr, sizeof(iflr->dstaddr));
> -
> -                     iflr->prefixlen =
> -                         in6_mask2len(&ia6->ia_prefixmask.sin6_addr, NULL);
> -
> -                     iflr->flags = ia6->ia6_flags;   /*XXX*/
> -
> -                     return 0;
> -             } else {
> -                     struct in6_aliasreq ifra;
> -
> -                     /* fill in6_aliasreq and do ioctl(SIOCDIFADDR_IN6) */
> -                     bzero(&ifra, sizeof(ifra));
> -                     bcopy(iflr->iflr_name, ifra.ifra_name,
> -                         sizeof(ifra.ifra_name));
> -
> -                     bcopy(&ia6->ia_addr, &ifra.ifra_addr,
> -                         ia6->ia_addr.sin6_len);
> -                     if ((ifp->if_flags & IFF_POINTOPOINT) != 0) {
> -                             bcopy(&ia6->ia_dstaddr, &ifra.ifra_dstaddr,
> -                                 ia6->ia_dstaddr.sin6_len);
> -                     } else {
> -                             bzero(&ifra.ifra_dstaddr,
> -                                 sizeof(ifra.ifra_dstaddr));
> -                     }
> -                     bcopy(&ia6->ia_prefixmask, &ifra.ifra_dstaddr,
> -                         ia6->ia_prefixmask.sin6_len);
> -
> -                     ifra.ifra_flags = ia6->ia6_flags;
> -                     return in6_ioctl(SIOCDIFADDR_IN6, (caddr_t)&ifra, ifp,
> -                         privileged);
> -             }
> -         }
> -     }
> -
> -     return EOPNOTSUPP;      /* just for safety */
>  }
>  
>  /*

Reply via email to