Author: glebius
Date: Mon Nov 11 05:39:42 2013
New Revision: 257943
URL: http://svnweb.freebsd.org/changeset/base/257943

Log:
  Remove never used ioctls that originate from KAME. The proof
  of their zero usage was exp-run from misc/183538.

Modified:
  head/sys/net/if.c
  head/sys/net/if.h
  head/sys/net/if_gif.c
  head/sys/net/if_gre.c
  head/sys/netinet/in.c
  head/sys/netinet6/in6.c
  head/sys/sys/sockio.h

Modified: head/sys/net/if.c
==============================================================================
--- head/sys/net/if.c   Mon Nov 11 03:30:14 2013        (r257942)
+++ head/sys/net/if.c   Mon Nov 11 05:39:42 2013        (r257943)
@@ -2412,7 +2412,6 @@ ifhwioctl(u_long cmd, struct ifnet *ifp,
 #ifdef INET6
        case SIOCSIFPHYADDR_IN6:
 #endif
-       case SIOCSLIFPHYADDR:
        case SIOCSIFMEDIA:
        case SIOCSIFGENERIC:
                error = priv_check(td, PRIV_NET_HWIOCTL);
@@ -2431,7 +2430,6 @@ ifhwioctl(u_long cmd, struct ifnet *ifp,
 
        case SIOCGIFPSRCADDR:
        case SIOCGIFPDSTADDR:
-       case SIOCGLIFPHYADDR:
        case SIOCGIFMEDIA:
        case SIOCGIFGENERIC:
                if (ifp->if_ioctl == NULL)

Modified: head/sys/net/if.h
==============================================================================
--- head/sys/net/if.h   Mon Nov 11 03:30:14 2013        (r257942)
+++ head/sys/net/if.h   Mon Nov 11 05:39:42 2013        (r257943)
@@ -497,18 +497,6 @@ struct ifgroupreq {
 #define ifgr_groups    ifgr_ifgru.ifgru_groups
 };
 
-/*
- * Structure for SIOC[AGD]LIFADDR
- */
-struct if_laddrreq {
-       char    iflr_name[IFNAMSIZ];
-       u_int   flags;
-#define        IFLR_PREFIX     0x8000  /* in: prefix given  out: kernel fills 
id */
-       u_int   prefixlen;         /* in/out */
-       struct  sockaddr_storage addr;   /* in/out */
-       struct  sockaddr_storage dstaddr; /* out */
-};
-
 #endif /* __BSD_VISIBLE */
 
 #ifdef _KERNEL

Modified: head/sys/net/if_gif.c
==============================================================================
--- head/sys/net/if_gif.c       Mon Nov 11 03:30:14 2013        (r257942)
+++ head/sys/net/if_gif.c       Mon Nov 11 05:39:42 2013        (r257943)
@@ -710,7 +710,6 @@ gif_ioctl(ifp, cmd, data)
 #ifdef INET6
        case SIOCSIFPHYADDR_IN6:
 #endif /* INET6 */
-       case SIOCSLIFPHYADDR:
                switch (cmd) {
 #ifdef INET
                case SIOCSIFPHYADDR:
@@ -728,12 +727,6 @@ gif_ioctl(ifp, cmd, data)
                                &(((struct in6_aliasreq *)data)->ifra_dstaddr);
                        break;
 #endif
-               case SIOCSLIFPHYADDR:
-                       src = (struct sockaddr *)
-                               &(((struct if_laddrreq *)data)->addr);
-                       dst = (struct sockaddr *)
-                               &(((struct if_laddrreq *)data)->dstaddr);
-                       break;
                default:
                        return EINVAL;
                }
@@ -788,9 +781,6 @@ gif_ioctl(ifp, cmd, data)
                                break;
                        return EAFNOSUPPORT;
 #endif /* INET6 */
-               case SIOCSLIFPHYADDR:
-                       /* checks done in the above */
-                       break;
                }
 
                error = gif_set_tunnel(GIF2IFP(sc), src, dst);
@@ -886,31 +876,6 @@ gif_ioctl(ifp, cmd, data)
 #endif
                break;
 
-       case SIOCGLIFPHYADDR:
-               if (sc->gif_psrc == NULL || sc->gif_pdst == NULL) {
-                       error = EADDRNOTAVAIL;
-                       goto bad;
-               }
-
-               /* copy src */
-               src = sc->gif_psrc;
-               dst = (struct sockaddr *)
-                       &(((struct if_laddrreq *)data)->addr);
-               size = sizeof(((struct if_laddrreq *)data)->addr);
-               if (src->sa_len > size)
-                       return EINVAL;
-               bcopy((caddr_t)src, (caddr_t)dst, src->sa_len);
-
-               /* copy dst */
-               src = sc->gif_pdst;
-               dst = (struct sockaddr *)
-                       &(((struct if_laddrreq *)data)->dstaddr);
-               size = sizeof(((struct if_laddrreq *)data)->dstaddr);
-               if (src->sa_len > size)
-                       return EINVAL;
-               bcopy((caddr_t)src, (caddr_t)dst, src->sa_len);
-               break;
-
        case SIOCSIFFLAGS:
                /* if_ioctl() takes care of it */
                break;

Modified: head/sys/net/if_gre.c
==============================================================================
--- head/sys/net/if_gre.c       Mon Nov 11 03:30:14 2013        (r257942)
+++ head/sys/net/if_gre.c       Mon Nov 11 05:39:42 2013        (r257943)
@@ -519,7 +519,6 @@ static int
 gre_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
 {
        struct ifreq *ifr = (struct ifreq *)data;
-       struct if_laddrreq *lifr = (struct if_laddrreq *)data;
        struct in_aliasreq *aifr = (struct in_aliasreq *)data;
        struct gre_softc *sc = ifp->if_softc;
        struct sockaddr_in si;
@@ -734,27 +733,6 @@ gre_ioctl(struct ifnet *ifp, u_long cmd,
                sc->g_src = aifr->ifra_addr.sin_addr;
                sc->g_dst = aifr->ifra_dstaddr.sin_addr;
                goto recompute;
-       case SIOCSLIFPHYADDR:
-               /*
-                * XXXRW: Isn't this priv_check() redundant to the ifnet
-                * layer check?
-                */
-               if ((error = priv_check(curthread, PRIV_NET_SETIFPHYS)) != 0)
-                       break;
-               if (lifr->addr.ss_family != AF_INET ||
-                   lifr->dstaddr.ss_family != AF_INET) {
-                       error = EAFNOSUPPORT;
-                       break;
-               }
-               if (lifr->addr.ss_len != sizeof(si) ||
-                   lifr->dstaddr.ss_len != sizeof(si)) {
-                       error = EINVAL;
-                       break;
-               }
-               sc->g_src = (satosin(&lifr->addr))->sin_addr;
-               sc->g_dst =
-                   (satosin(&lifr->dstaddr))->sin_addr;
-               goto recompute;
        case SIOCDIFPHYADDR:
                /*
                 * XXXRW: Isn't this priv_check() redundant to the ifnet
@@ -765,26 +743,6 @@ gre_ioctl(struct ifnet *ifp, u_long cmd,
                sc->g_src.s_addr = INADDR_ANY;
                sc->g_dst.s_addr = INADDR_ANY;
                goto recompute;
-       case SIOCGLIFPHYADDR:
-               if (sc->g_src.s_addr == INADDR_ANY ||
-                   sc->g_dst.s_addr == INADDR_ANY) {
-                       error = EADDRNOTAVAIL;
-                       break;
-               }
-               memset(&si, 0, sizeof(si));
-               si.sin_family = AF_INET;
-               si.sin_len = sizeof(struct sockaddr_in);
-               si.sin_addr.s_addr = sc->g_src.s_addr;
-               error = prison_if(curthread->td_ucred, (struct sockaddr *)&si);
-               if (error != 0)
-                       break;
-               memcpy(&lifr->addr, &si, sizeof(si));
-               si.sin_addr.s_addr = sc->g_dst.s_addr;
-               error = prison_if(curthread->td_ucred, (struct sockaddr *)&si);
-               if (error != 0)
-                       break;
-               memcpy(&lifr->dstaddr, &si, sizeof(si));
-               break;
        case SIOCGIFPSRCADDR:
 #ifdef INET6
        case SIOCGIFPSRCADDR_IN6:

Modified: head/sys/netinet/in.c
==============================================================================
--- head/sys/netinet/in.c       Mon Nov 11 03:30:14 2013        (r257942)
+++ head/sys/netinet/in.c       Mon Nov 11 05:39:42 2013        (r257943)
@@ -68,10 +68,6 @@ __FBSDID("$FreeBSD$");
 #include <netinet/udp.h>
 #include <netinet/udp_var.h>
 
-static int in_mask2len(struct in_addr *);
-static void in_len2mask(struct in_addr *, int);
-static int in_lifaddr_ioctl(struct socket *, u_long, caddr_t,
-       struct ifnet *, struct thread *);
 static int in_aifaddr_ioctl(u_long, caddr_t, struct ifnet *, struct thread *);
 static int in_difaddr_ioctl(caddr_t, struct ifnet *, struct thread *);
 
@@ -192,42 +188,6 @@ in_socktrim(struct sockaddr_in *ap)
        }
 }
 
-static int
-in_mask2len(mask)
-       struct in_addr *mask;
-{
-       int x, y;
-       u_char *p;
-
-       p = (u_char *)mask;
-       for (x = 0; x < sizeof(*mask); x++) {
-               if (p[x] != 0xff)
-                       break;
-       }
-       y = 0;
-       if (x < sizeof(*mask)) {
-               for (y = 0; y < 8; y++) {
-                       if ((p[x] & (0x80 >> y)) == 0)
-                               break;
-               }
-       }
-       return (x * 8 + y);
-}
-
-static void
-in_len2mask(struct in_addr *mask, int len)
-{
-       int i;
-       u_char *p;
-
-       p = (u_char *)mask;
-       bzero(mask, sizeof(*mask));
-       for (i = 0; i < len / 8; i++)
-               p[i] = 0xff;
-       if (len % 8)
-               p[i] = (0xff00 >> (len % 8)) & 0xff;
-}
-
 /*
  * Generic internet control operations (ioctl's).
  */
@@ -265,10 +225,6 @@ in_control(struct socket *so, u_long cmd
                error = in_aifaddr_ioctl(cmd, data, ifp, td);
                sx_xunlock(&in_control_sx);
                return (error);
-       case SIOCALIFADDR:
-       case SIOCDLIFADDR:
-       case SIOCGLIFADDR:
-               return (in_lifaddr_ioctl(so, cmd, data, ifp, td));
        case SIOCSIFADDR:
        case SIOCSIFBRDADDR:
        case SIOCSIFDSTADDR:
@@ -643,194 +599,6 @@ in_difaddr_ioctl(caddr_t data, struct if
        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()
- */
-static int
-in_lifaddr_ioctl(struct socket *so, u_long cmd, caddr_t data,
-    struct ifnet *ifp, struct thread *td)
-{
-       struct if_laddrreq *iflr = (struct if_laddrreq *)data;
-       struct ifaddr *ifa;
-       int error;
-
-       switch (cmd) {
-       case SIOCALIFADDR:
-               if (td != NULL) {
-                       error = priv_check(td, PRIV_NET_ADDIFADDR);
-                       if (error)
-                               return (error);
-               }
-               break;
-       case SIOCDLIFADDR:
-               if (td != NULL) {
-                       error = priv_check(td, PRIV_NET_DELIFADDR);
-                       if (error)
-                               return (error);
-               }
-               break;
-       }
-
-       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 */
-               if (iflr->addr.ss_family != AF_INET)
-                       return (EINVAL);
-               if (iflr->addr.ss_len != sizeof(struct sockaddr_in))
-                       return (EINVAL);
-               /* XXX need improvement */
-               if (iflr->dstaddr.ss_family
-                && iflr->dstaddr.ss_family != AF_INET)
-                       return (EINVAL);
-               if (iflr->dstaddr.ss_family
-                && iflr->dstaddr.ss_len != sizeof(struct sockaddr_in))
-                       return (EINVAL);
-               break;
-       default: /*shouldn't happen*/
-               return (EOPNOTSUPP);
-       }
-       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));
-               bcopy(iflr->iflr_name, ifra.ifra_name,
-                       sizeof(ifra.ifra_name));
-
-               bcopy(&iflr->addr, &ifra.ifra_addr, iflr->addr.ss_len);
-
-               if (iflr->dstaddr.ss_family) {  /*XXX*/
-                       bcopy(&iflr->dstaddr, &ifra.ifra_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_control(so, SIOCAIFADDR, (caddr_t)&ifra, ifp, td));
-           }
-       case SIOCGLIFADDR:
-       case SIOCDLIFADDR:
-           {
-               struct in_ifaddr *ia;
-               struct in_addr mask, candidate, match;
-               struct sockaddr_in *sin;
-
-               bzero(&mask, sizeof(mask));
-               bzero(&match, sizeof(match));
-               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);
-
-               } else {
-                       /* on getting an address, take the 1st match */
-                       /* on deleting an address, do exact match */
-                       if (cmd != SIOCGLIFADDR) {
-                               in_len2mask(&mask, 32);
-                               sin = (struct sockaddr_in *)&iflr->addr;
-                               match.s_addr = sin->sin_addr.s_addr;
-                       }
-               }
-
-               IF_ADDR_RLOCK(ifp);
-               TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
-                       if (ifa->ifa_addr->sa_family != AF_INET)
-                               continue;
-                       if (match.s_addr == 0)
-                               break;
-                       sin = (struct sockaddr_in *)&ifa->ifa_addr;
-                       candidate.s_addr = sin->sin_addr.s_addr;
-                       candidate.s_addr &= mask.s_addr;
-                       if (candidate.s_addr == match.s_addr)
-                               break;
-               }
-               if (ifa != NULL)
-                       ifa_ref(ifa);
-               IF_ADDR_RUNLOCK(ifp);
-               if (ifa == NULL)
-                       return (EADDRNOTAVAIL);
-               ia = (struct in_ifaddr *)ifa;
-
-               if (cmd == SIOCGLIFADDR) {
-                       /* fill in the if_laddrreq structure */
-                       bcopy(&ia->ia_addr, &iflr->addr, ia->ia_addr.sin_len);
-
-                       if ((ifp->if_flags & IFF_POINTOPOINT) != 0) {
-                               bcopy(&ia->ia_dstaddr, &iflr->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*/
-                       ifa_free(ifa);
-
-                       return (0);
-               } else {
-                       struct in_aliasreq ifra;
-
-                       /* fill in_aliasreq and do ioctl(SIOCDIFADDR) */
-                       bzero(&ifra, sizeof(ifra));
-                       bcopy(iflr->iflr_name, ifra.ifra_name,
-                               sizeof(ifra.ifra_name));
-
-                       bcopy(&ia->ia_addr, &ifra.ifra_addr,
-                               ia->ia_addr.sin_len);
-                       if ((ifp->if_flags & IFF_POINTOPOINT) != 0) {
-                               bcopy(&ia->ia_dstaddr, &ifra.ifra_dstaddr,
-                                       ia->ia_dstaddr.sin_len);
-                       }
-                       bcopy(&ia->ia_sockmask, &ifra.ifra_dstaddr,
-                               ia->ia_sockmask.sin_len);
-                       ifa_free(ifa);
-
-                       return (in_control(so, SIOCDIFADDR, (caddr_t)&ifra,
-                           ifp, td));
-               }
-           }
-       }
-
-       return (EOPNOTSUPP);    /*just for safety*/
-}
-
 #define rtinitflags(x) \
        ((((x)->ia_ifp->if_flags & (IFF_LOOPBACK | IFF_POINTOPOINT)) != 0) \
            ? RTF_HOST : 0)

Modified: head/sys/netinet6/in6.c
==============================================================================
--- head/sys/netinet6/in6.c     Mon Nov 11 03:30:14 2013        (r257942)
+++ head/sys/netinet6/in6.c     Mon Nov 11 05:39:42 2013        (r257943)
@@ -133,8 +133,6 @@ const struct in6_addr in6mask128 = IN6MA
 const struct sockaddr_in6 sa6_any =
        { sizeof(sa6_any), AF_INET6, 0, 0, IN6ADDR_ANY_INIT, 0 };
 
-static int in6_lifaddr_ioctl(struct socket *, u_long, caddr_t,
-       struct ifnet *, struct thread *);
 static int in6_ifinit(struct ifnet *, struct in6_ifaddr *,
        struct sockaddr_in6 *, int);
 static void in6_unlink_ifa(struct in6_ifaddr *, struct ifnet *);
@@ -376,26 +374,6 @@ in6_control(struct socket *so, u_long cm
                    ifr->ifr_ifru.ifru_scope_id));
        }
 
-       switch (cmd) {
-       case SIOCALIFADDR:
-               if (td != NULL) {
-                       error = priv_check(td, PRIV_NET_ADDIFADDR);
-                       if (error)
-                               return (error);
-               }
-               return in6_lifaddr_ioctl(so, cmd, data, ifp, td);
-
-       case SIOCDLIFADDR:
-               if (td != NULL) {
-                       error = priv_check(td, PRIV_NET_DELIFADDR);
-                       if (error)
-                               return (error);
-               }
-               /* FALLTHROUGH */
-       case SIOCGLIFADDR:
-               return in6_lifaddr_ioctl(so, cmd, data, ifp, td);
-       }
-
        /*
         * Find address for this interface, if it exists.
         *
@@ -1601,277 +1579,6 @@ in6_purgeif(struct ifnet *ifp)
 }
 
 /*
- * 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 accomodate 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)
- */
-static int
-in6_lifaddr_ioctl(struct socket *so, u_long cmd, caddr_t data,
-    struct ifnet *ifp, struct thread *td)
-{
-       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 = (struct sockaddr *)&iflr->addr;
-               if (sa->sa_family != AF_INET6)
-                       return EINVAL;
-               if (sa->sa_len != sizeof(struct sockaddr_in6))
-                       return EINVAL;
-               /* XXX need improvement */
-               sa = (struct sockaddr *)&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;
-
-               ifa = NULL;
-               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 = (struct ifaddr *)in6ifa_ifpforlinklocal(ifp, 0);
-                       if (!ifa)
-                               return EADDRNOTAVAIL;
-                       hostid = IFA_IN6(ifa);
-
-                       /* prefixlen must be <= 64. */
-                       if (64 < iflr->prefixlen) {
-                               if (ifa != NULL)
-                                       ifa_free(ifa);
-                               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) {
-                               if (ifa != NULL)
-                                       ifa_free(ifa);
-                               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,
-                   ((struct sockaddr *)&iflr->addr)->sa_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 (((struct sockaddr *)&iflr->dstaddr)->sa_family) { /* XXX */
-                       bcopy(&iflr->dstaddr, &ifra.ifra_dstaddr,
-                           ((struct sockaddr *)&iflr->dstaddr)->sa_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];
-                       }
-               }
-               if (ifa != NULL)
-                       ifa_free(ifa);
-
-               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_control(so, SIOCAIFADDR_IN6, (caddr_t)&ifra, ifp, 
td);
-           }
-       case SIOCGLIFADDR:
-       case SIOCDLIFADDR:
-           {
-               struct in6_ifaddr *ia;
-               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;
-                       }
-               }
-
-               IF_ADDR_RLOCK(ifp);
-               TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
-                       if (ifa->ifa_addr->sa_family != AF_INET6)
-                               continue;
-                       if (!cmp)
-                               break;
-
-                       /*
-                        * XXX: this is adhoc, but is necessary to allow
-                        * a user to specify fe80::/64 (not /10) for a
-                        * link-local address.
-                        */
-                       bcopy(IFA_IN6(ifa), &candidate, sizeof(candidate));
-                       in6_clearscope(&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 != NULL)
-                       ifa_ref(ifa);
-               IF_ADDR_RUNLOCK(ifp);
-               if (!ifa)
-                       return EADDRNOTAVAIL;
-               ia = ifa2ia6(ifa);
-
-               if (cmd == SIOCGLIFADDR) {
-                       int error;
-
-                       /* fill in the if_laddrreq structure */
-                       bcopy(&ia->ia_addr, &iflr->addr, ia->ia_addr.sin6_len);
-                       error = sa6_recoverscope(
-                           (struct sockaddr_in6 *)&iflr->addr);
-                       if (error != 0) {
-                               ifa_free(ifa);
-                               return (error);
-                       }
-
-                       if ((ifp->if_flags & IFF_POINTOPOINT) != 0) {
-                               bcopy(&ia->ia_dstaddr, &iflr->dstaddr,
-                                   ia->ia_dstaddr.sin6_len);
-                               error = sa6_recoverscope(
-                                   (struct sockaddr_in6 *)&iflr->dstaddr);
-                               if (error != 0) {
-                                       ifa_free(ifa);
-                                       return (error);
-                               }
-                       } else
-                               bzero(&iflr->dstaddr, sizeof(iflr->dstaddr));
-
-                       iflr->prefixlen =
-                           in6_mask2len(&ia->ia_prefixmask.sin6_addr, NULL);
-
-                       iflr->flags = ia->ia6_flags;    /* XXX */
-                       ifa_free(ifa);
-
-                       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(&ia->ia_addr, &ifra.ifra_addr,
-                           ia->ia_addr.sin6_len);
-                       if ((ifp->if_flags & IFF_POINTOPOINT) != 0) {
-                               bcopy(&ia->ia_dstaddr, &ifra.ifra_dstaddr,
-                                   ia->ia_dstaddr.sin6_len);
-                       } else {
-                               bzero(&ifra.ifra_dstaddr,
-                                   sizeof(ifra.ifra_dstaddr));
-                       }
-                       bcopy(&ia->ia_prefixmask, &ifra.ifra_dstaddr,
-                           ia->ia_prefixmask.sin6_len);
-
-                       ifra.ifra_flags = ia->ia6_flags;
-                       ifa_free(ifa);
-                       return in6_control(so, SIOCDIFADDR_IN6, (caddr_t)&ifra,
-                           ifp, td);
-               }
-           }
-       }
-
-       return EOPNOTSUPP;      /* just for safety */
-}
-
-/*
  * Initialize an interface's IPv6 address and routing table entry.
  */
 static int

Modified: head/sys/sys/sockio.h
==============================================================================
--- head/sys/sys/sockio.h       Mon Nov 11 03:30:14 2013        (r257942)
+++ head/sys/sys/sockio.h       Mon Nov 11 05:39:42 2013        (r257943)
@@ -69,9 +69,9 @@
 #define        SIOCSIFMETRIC    _IOW('i', 24, struct ifreq)    /* set IF 
metric */
 #define        SIOCDIFADDR      _IOW('i', 25, struct ifreq)    /* delete IF 
addr */
 #define        OSIOCAIFADDR     _IOW('i', 26, struct oifaliasreq) /* FreeBSD 
9.x */
-#define        SIOCALIFADDR     _IOW('i', 27, struct if_laddrreq) /* add IF 
addr */
-#define        SIOCGLIFADDR    _IOWR('i', 28, struct if_laddrreq) /* get IF 
addr */
-#define        SIOCDLIFADDR     _IOW('i', 29, struct if_laddrreq) /* delete IF 
addr */
+/*     SIOCALIFADDR     _IOW('i', 27, struct if_laddrreq) KAME */
+/*     SIOCGLIFADDR    _IOWR('i', 28, struct if_laddrreq) KAME */
+/*     SIOCDLIFADDR     _IOW('i', 29, struct if_laddrreq) KAME */
 #define        SIOCSIFCAP       _IOW('i', 30, struct ifreq)    /* set IF 
features */
 #define        SIOCGIFCAP      _IOWR('i', 31, struct ifreq)    /* get IF 
features */
 #define        SIOCGIFINDEX    _IOWR('i', 32, struct ifreq)    /* get IF index 
*/
@@ -101,8 +101,8 @@
 #define        SIOCGIFPSRCADDR _IOWR('i', 71, struct ifreq)    /* get gif psrc 
addr */
 #define        SIOCGIFPDSTADDR _IOWR('i', 72, struct ifreq)    /* get gif pdst 
addr */
 #define        SIOCDIFPHYADDR   _IOW('i', 73, struct ifreq)    /* delete gif 
addrs */
-#define        SIOCSLIFPHYADDR  _IOW('i', 74, struct if_laddrreq) /* set gif 
addrs */
-#define        SIOCGLIFPHYADDR _IOWR('i', 75, struct if_laddrreq) /* get gif 
addrs */
+/*     SIOCSLIFPHYADDR  _IOW('i', 74, struct if_laddrreq) KAME */
+/*     SIOCGLIFPHYADDR _IOWR('i', 75, struct if_laddrreq) KAME */
 
 #define        SIOCGPRIVATE_0  _IOWR('i', 80, struct ifreq)    /* device 
private 0 */
 #define        SIOCGPRIVATE_1  _IOWR('i', 81, struct ifreq)    /* device 
private 1 */
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to