From: Sepherosa Ziehau Date: Sun, 4 Jan 2015 12:30:20 +0000 (+0800) Subject: inet/inet6: Merge SIOC[ADG]LIFADDR into {in,in6}_control_internal X-Git-Tag: v4.2.0rc~1191 X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/commitdiff_plain/2501b0eaff98bfb78285c88064076c2f5c3b814d inet/inet6: Merge SIOC[ADG]LIFADDR into {in,in6}_control_internal And remove the socket parameter from {in,in6}_control APIs. This prepares to make ifnet glbal variable MPSAFE. --- diff --git a/sys/dev/virtual/vkernel/net/if_vke.c b/sys/dev/virtual/vkernel/net/if_vke.c index 87ff9c1bc0..32e45ba7c7 100644 --- a/sys/dev/virtual/vkernel/net/if_vke.c +++ b/sys/dev/virtual/vkernel/net/if_vke.c @@ -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; diff --git a/sys/net/if.c b/sys/net/if.c index 7236829376..cdd5696e7c 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -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; } diff --git a/sys/netinet/in.c b/sys/netinet/in.c index 3464b409d3..00f0ee2a36 100644 --- a/sys/netinet/in.c +++ b/sys/netinet/in.c @@ -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); } } } diff --git a/sys/netinet/in_var.h b/sys/netinet/in_var.h index 3d523a4b54..e9c7b91639 100644 --- a/sys/netinet/in_var.h +++ b/sys/netinet/in_var.h @@ -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 *); diff --git a/sys/netinet/sctp_usrreq.c b/sys/netinet/sctp_usrreq.c index c0d4c949b5..72911b488f 100644 --- a/sys/netinet/sctp_usrreq.c +++ b/sys/netinet/sctp_usrreq.c @@ -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 diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c index 9733ee70b8..8f080882e0 100644 --- a/sys/netinet6/in6.c +++ b/sys/netinet6/in6.c @@ -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); } } } diff --git a/sys/netinet6/in6_var.h b/sys/netinet6/in6_var.h index fd1ce0e3b8..8257080fc4 100644 --- a/sys/netinet6/in6_var.h +++ b/sys/netinet6/in6_var.h @@ -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 *); diff --git a/sys/netinet6/sctp6_usrreq.c b/sys/netinet6/sctp6_usrreq.c index e9aa5ee9c9..6fec819fc5 100644 --- a/sys/netinet6/sctp6_usrreq.c +++ b/sys/netinet6/sctp6_usrreq.c @@ -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: