inet/inet6: Merge SIOC[ADG]LIFADDR into {in,in6}_control_internal
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Sun, 4 Jan 2015 12:30:20 +0000 (20:30 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Mon, 5 Jan 2015 03:35:57 +0000 (11:35 +0800)
And remove the socket parameter from {in,in6}_control APIs.

This prepares to make ifnet glbal variable MPSAFE.

sys/dev/virtual/vkernel/net/if_vke.c
sys/net/if.c
sys/netinet/in.c
sys/netinet/in_var.h
sys/netinet/sctp_usrreq.c
sys/netinet6/in6.c
sys/netinet6/in6_var.h
sys/netinet6/sctp6_usrreq.c

index 87ff9c1..32e45ba 100644 (file)
@@ -921,7 +921,7 @@ vke_init_addr(struct ifnet *ifp, in_addr_t addr, in_addr_t mask)
         * it again before calling ifnet.if_ioctl().
         */
        ifnet_deserialize_all(ifp);
-       ret = in_control(NULL, SIOCAIFADDR, (caddr_t)&ifra, ifp, NULL);
+       ret = in_control(SIOCAIFADDR, (caddr_t)&ifra, ifp, NULL);
        ifnet_serialize_all(ifp);
 
        return ret;
index 7236829..cdd5696 100644 (file)
@@ -701,7 +701,7 @@ if_purgeaddrs_nolink(struct ifnet *ifp)
                        ifr.ifra_addr = *ifa->ifa_addr;
                        if (ifa->ifa_dstaddr)
                                ifr.ifra_broadaddr = *ifa->ifa_dstaddr;
-                       if (in_control(NULL, SIOCDIFADDR, (caddr_t)&ifr, ifp,
+                       if (in_control(SIOCDIFADDR, (caddr_t)&ifr, ifp,
                                       NULL) == 0)
                                continue;
                }
index 3464b40..00f0ee2 100644 (file)
@@ -63,8 +63,7 @@ MALLOC_DEFINE(M_IPMADDR, "in_multi", "internet multicast address");
 
 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_lifaddr_ioctl (u_long, caddr_t, struct ifnet *, struct thread *);
 
 static void    in_socktrim (struct sockaddr_in *);
 static int     in_ifinit(struct ifnet *, struct in_ifaddr *,
@@ -196,8 +195,8 @@ in_control_dispatch(netmsg_t msg)
 {
        int error;
 
-       error = in_control(msg->base.nm_so, msg->control.nm_cmd,
-           msg->control.nm_data, msg->control.nm_ifp, msg->control.nm_td);
+       error = in_control(msg->control.nm_cmd, msg->control.nm_data,
+           msg->control.nm_ifp, msg->control.nm_td);
        lwkt_replymsg(&msg->lmsg, error);
 }
 
@@ -220,24 +219,14 @@ in_control_internal_dispatch(netmsg_t msg)
  * NOTE! td might be NULL.
  */
 int
-in_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp,
-    struct thread *td)
+in_control(u_long cmd, caddr_t data, struct ifnet *ifp, struct thread *td)
 {
        struct netmsg_pru_control msg;
-       int error;
 
        switch (cmd) {
+       /* change address */
        case SIOCALIFADDR:
        case SIOCDLIFADDR:
-               if (td && (error = priv_check(td, PRIV_ROOT)) != 0)
-                       return error;
-               /* FALLTHROUGH */
-       case SIOCGLIFADDR:
-               if (!ifp)
-                       return EINVAL;
-               return in_lifaddr_ioctl(so, cmd, data, ifp, td);
-
-       /* change address */
        case SIOCSIFDSTADDR:
        case SIOCSIFBRDADDR:
        case SIOCSIFADDR:
@@ -439,6 +428,18 @@ in_control_internal(u_long cmd, caddr_t data, struct ifnet *ifp,
        int hostIsNew, iaIsNew, maskIsNew, ifpWasUp;
        int error = 0;
 
+       switch (cmd) {
+       case SIOCALIFADDR:
+       case SIOCDLIFADDR:
+               if (td && (error = priv_check(td, PRIV_ROOT)) != 0)
+                       return error;
+               /* FALLTHROUGH */
+       case SIOCGLIFADDR:
+               if (!ifp)
+                       return EINVAL;
+               return in_lifaddr_ioctl(cmd, data, ifp, td);
+       }
+
        iaIsNew = 0;
        ifpWasUp = 0;
 
@@ -785,8 +786,7 @@ in_control_internal(u_long cmd, caddr_t data, struct ifnet *ifp,
  * NOTE! td might be NULL.
  */
 static int
-in_lifaddr_ioctl(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp,
-                struct thread *td)
+in_lifaddr_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp, struct thread *td)
 {
        struct if_laddrreq *iflr = (struct if_laddrreq *)data;
 
@@ -846,7 +846,8 @@ in_lifaddr_ioctl(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp,
                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);
+               return in_control_internal(SIOCAIFADDR, (caddr_t)&ifra, ifp,
+                   td);
            }
        case SIOCGLIFADDR:
        case SIOCDLIFADDR:
@@ -936,8 +937,8 @@ in_lifaddr_ioctl(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp,
                        bcopy(&ia->ia_sockmask, &ifra.ifra_dstaddr,
                                ia->ia_sockmask.sin_len);
 
-                       return in_control(so, SIOCDIFADDR, (caddr_t)&ifra,
-                                         ifp, td);
+                       return in_control_internal(SIOCDIFADDR, (caddr_t)&ifra,
+                           ifp, td);
                }
            }
        }
index 3d523a4..e9c7b91 100644 (file)
@@ -251,8 +251,7 @@ union       netmsg;
 void   in_ifdetach(struct ifnet *ifp);
 struct in_multi *in_addmulti (struct in_addr *, struct ifnet *);
 void   in_delmulti (struct in_multi *);
-int    in_control (struct socket *, u_long, caddr_t, struct ifnet *,
-                       struct thread *);
+int    in_control (u_long, caddr_t, struct ifnet *, struct thread *);
 void   in_control_dispatch(union netmsg *);
 void   in_rtqdrain (void);
 void   ip_input (struct mbuf *);
index c0d4c94..72911b4 100644 (file)
@@ -4205,7 +4205,7 @@ sctp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam,
        if (req == PRU_CONTROL) {
                switch (family) {
                case PF_INET:
-                       error = in_control(so, (long)m, (caddr_t)nam,
+                       error = in_control((long)m, (caddr_t)nam,
                            (struct ifnet *)control
 #if defined(__NetBSD__)
                            , p
@@ -4214,7 +4214,7 @@ sctp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam,
                        break;
 #ifdef INET6
                case PF_INET6:
-                       error = in6_control(so, (long)m, (caddr_t)nam,
+                       error = in6_control((long)m, (caddr_t)nam,
                                            (struct ifnet *)control, p);
                        break;
 #endif
index 9733ee7..8f08088 100644 (file)
@@ -128,8 +128,8 @@ const struct in6_addr in6mask128 = IN6MASK128;
 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_lifaddr_ioctl (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 *);
@@ -386,8 +386,7 @@ in6_control_dispatch(netmsg_t msg)
 {
        int error;
 
-       error = in6_control(msg->control.base.nm_so,
-                           msg->control.nm_cmd,
+       error = in6_control(msg->control.nm_cmd,
                            msg->control.nm_data,
                            msg->control.nm_ifp,
                            msg->control.nm_td);
@@ -395,11 +394,9 @@ in6_control_dispatch(netmsg_t msg)
 }
 
 int
-in6_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp,
-    struct thread *td)
+in6_control(u_long cmd, caddr_t data, struct ifnet *ifp, struct thread *td)
 {
        struct netmsg_pru_control msg;
-       int error;
 
        switch (cmd) {
        case SIOCSIFPREFIX_IN6:
@@ -433,16 +430,6 @@ in6_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp,
                 */
                return (EOPNOTSUPP);
 
-       case SIOCALIFADDR:
-       case SIOCDLIFADDR:
-               if ((error = priv_check(td, PRIV_ROOT)) != 0)
-                       return (error);
-               /* FALLTHROUGH */
-       case SIOCGLIFADDR:
-               if (ifp == NULL)
-                       return (EOPNOTSUPP);
-               return in6_lifaddr_ioctl(so, cmd, data, ifp, td);
-
        /* mroute */
        case SIOCGETSGCNT_IN6:
        case SIOCGETMIFCNT_IN6:
@@ -466,6 +453,8 @@ in6_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp,
        case SIOCGSCOPE6:
        case SIOCGSCOPE6DEF:
        /* change address */
+       case SIOCALIFADDR:
+       case SIOCDLIFADDR:
        case SIOCSIFALIFETIME_IN6:
        case SIOCAIFADDR_IN6:
        case SIOCDIFADDR_IN6:
@@ -511,6 +500,18 @@ in6_control_internal(u_long cmd, caddr_t data, struct ifnet *ifp,
        if (priv_check(td, PRIV_ROOT) == 0)
                privileged = TRUE;
 
+       switch (cmd) {
+       case SIOCALIFADDR:
+       case SIOCDLIFADDR:
+               if (!privileged)
+                       return (EPERM);
+               /* FALLTHROUGH */
+       case SIOCGLIFADDR:
+               if (ifp == NULL)
+                       return (EOPNOTSUPP);
+               return in6_lifaddr_ioctl(cmd, data, ifp, td);
+       }
+
        switch (cmd) {
        case SIOCGETSGCNT_IN6:
        case SIOCGETMIFCNT_IN6:
@@ -1390,8 +1391,8 @@ in6_purgeif(struct ifnet *ifp)
  * 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)
+in6_lifaddr_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp,
+    struct thread *td)
 {
        struct if_laddrreq *iflr = (struct if_laddrreq *)data;
        struct sockaddr *sa;
@@ -1499,7 +1500,8 @@ in6_lifaddr_ioctl(struct socket *so, u_long cmd, caddr_t data,
                in6_len2mask(&ifra.ifra_prefixmask.sin6_addr, prefixlen);
 
                ifra.ifra_flags = iflr->flags & ~IFLR_PREFIX;
-               return in6_control(so, SIOCAIFADDR_IN6, (caddr_t)&ifra, ifp, td);
+               return in6_control_internal(SIOCAIFADDR_IN6, (caddr_t)&ifra,
+                   ifp, td);
            }
        case SIOCGLIFADDR:
        case SIOCDLIFADDR:
@@ -1619,8 +1621,8 @@ in6_lifaddr_ioctl(struct socket *so, u_long cmd, caddr_t data,
                              ia->ia_prefixmask.sin6_len);
 
                        ifra.ifra_flags = ia->ia6_flags;
-                       return in6_control(so, SIOCDIFADDR_IN6, (caddr_t)&ifra,
-                               ifp, td);
+                       return in6_control_internal(SIOCDIFADDR_IN6,
+                           (caddr_t)&ifra, ifp, td);
                }
            }
        }
index fd1ce0e..8257080 100644 (file)
@@ -610,8 +610,7 @@ extern int in6_ifindex2scopeid (int);
 int    in6_mask2len(const struct in6_addr *, const u_char *);
 extern void in6_len2mask (struct in6_addr *, int);
 void   in6_control_dispatch(netmsg_t msg);
-int    in6_control (struct socket *,
-                       u_long, caddr_t, struct ifnet *, struct thread *);
+int    in6_control (u_long, caddr_t, struct ifnet *, struct thread *);
 int    in6_update_ifa (struct ifnet *, struct in6_aliasreq *,
                        struct in6_ifaddr *);
 void   in6_purgeaddr (struct ifaddr *);
index e9aa5ee..6fec819 100644 (file)
@@ -1406,7 +1406,7 @@ sctp6_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam,
        if (req == PRU_CONTROL) {
                switch (family) {
                case PF_INET:
-                       error = in_control(so, (long)m, (caddr_t)nam,
+                       error = in_control((long)m, (caddr_t)nam,
                            (struct ifnet *)control
 #if defined(__NetBSD__)
                             , p
@@ -1414,7 +1414,7 @@ sctp6_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam,
                             );
 #ifdef INET6
                case PF_INET6:
-                       error = in6_control(so, (long)m, (caddr_t)nam,
+                       error = in6_control((long)m, (caddr_t)nam,
                            (struct ifnet *)control, p);
 #endif
                default: