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?
Agreed, if it builds OK claudio. The amount of - is shocking...
> 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 */
> }
>
> /*
>
--
:wq Claudio