summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortb <tb@openbsd.org>2017-11-04 16:58:46 +0000
committertb <tb@openbsd.org>2017-11-04 16:58:46 +0000
commit0adb4bf3885521d303d01e55e59fd6b5c5a6f7c8 (patch)
treeefc07e11aa3b93b000e23768e45fac453f2839ce
parentraw_init() is dead and <net/raw_cb.h> doesn't need to be included there. (diff)
downloadwireguard-openbsd-0adb4bf3885521d303d01e55e59fd6b5c5a6f7c8.tar.xz
wireguard-openbsd-0adb4bf3885521d303d01e55e59fd6b5c5a6f7c8.zip
Move the ioctls that only need a read lock from ifioctl into a new
function ifioctl_get(). This simplifies an upcoming diff. suggested by & ok mpi, input & ok florian
-rw-r--r--sys/net/if.c186
1 files changed, 115 insertions, 71 deletions
diff --git a/sys/net/if.c b/sys/net/if.c
index 48175e23dac..a7de98a4dda 100644
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if.c,v 1.522 2017/11/04 13:11:54 mpi Exp $ */
+/* $OpenBSD: if.c,v 1.523 2017/11/04 16:58:46 tb Exp $ */
/* $NetBSD: if.c,v 1.35 1996/05/07 05:26:04 thorpej Exp $ */
/*
@@ -138,6 +138,8 @@ void if_slowtimo(void *);
void if_detached_qstart(struct ifqueue *);
int if_detached_ioctl(struct ifnet *, u_long, caddr_t);
+int ifioctl_get(u_long, caddr_t);
+
int if_getgroup(caddr_t, struct ifnet *);
int if_getgroupmembers(caddr_t);
int if_getgroupattribs(caddr_t);
@@ -1804,11 +1806,8 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct proc *p)
int s, error = 0, oif_xflags;
size_t bytesdone;
unsigned short oif_flags;
- const char *label;
switch (cmd) {
- case SIOCGIFCONF:
- return (ifconf(cmd, data));
case SIOCIFCREATE:
case SIOCIFDESTROY:
if ((error = suser(p, 0)) != 0)
@@ -1816,16 +1815,27 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct proc *p)
return ((cmd == SIOCIFCREATE) ?
if_clone_create(ifr->ifr_name, 0) :
if_clone_destroy(ifr->ifr_name));
- case SIOCIFGCLONERS:
- return (if_clone_list((struct if_clonereq *)data));
- case SIOCGIFGMEMB:
- return (if_getgroupmembers(data));
- case SIOCGIFGATTR:
- return (if_getgroupattribs(data));
case SIOCSIFGATTR:
if ((error = suser(p, 0)) != 0)
return (error);
return (if_setgroupattribs(data));
+ case SIOCGIFCONF:
+ case SIOCIFGCLONERS:
+ case SIOCGIFGMEMB:
+ case SIOCGIFGATTR:
+ case SIOCGIFFLAGS:
+ case SIOCGIFXFLAGS:
+ case SIOCGIFMETRIC:
+ case SIOCGIFMTU:
+ case SIOCGIFHARDMTU:
+ case SIOCGIFDATA:
+ case SIOCGIFDESCR:
+ case SIOCGIFRTLABEL:
+ case SIOCGIFPRIORITY:
+ case SIOCGIFRDOMAIN:
+ case SIOCGIFGROUP:
+ case SIOCGIFLLPRIO:
+ return (ifioctl_get(cmd, data));
}
ifp = ifunit(ifr->ifr_name);
@@ -1858,35 +1868,6 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct proc *p)
}
break;
- case SIOCGIFFLAGS:
- ifr->ifr_flags = ifp->if_flags;
- if (ifq_is_oactive(&ifp->if_snd))
- ifr->ifr_flags |= IFF_OACTIVE;
- break;
-
- case SIOCGIFXFLAGS:
- ifr->ifr_flags = ifp->if_xflags & ~(IFXF_MPSAFE|IFXF_CLONED);
- break;
-
- case SIOCGIFMETRIC:
- ifr->ifr_metric = ifp->if_metric;
- break;
-
- case SIOCGIFMTU:
- ifr->ifr_mtu = ifp->if_mtu;
- break;
-
- case SIOCGIFHARDMTU:
- ifr->ifr_hardmtu = ifp->if_hardmtu;
- break;
-
- case SIOCGIFDATA: {
- struct if_data ifdata;
- if_getdata(ifp, &ifdata);
- error = copyout(&ifdata, ifr->ifr_data, sizeof(ifdata));
- break;
- }
-
case SIOCSIFFLAGS:
if ((error = suser(p, 0)) != 0)
break;
@@ -1985,12 +1966,6 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct proc *p)
rtm_ifchg(ifp);
break;
- case SIOCGIFDESCR:
- strlcpy(ifdescrbuf, ifp->if_description, IFDESCRSIZE);
- error = copyoutstr(ifdescrbuf, ifr->ifr_data, IFDESCRSIZE,
- &bytesdone);
- break;
-
case SIOCSIFDESCR:
if ((error = suser(p, 0)) != 0)
break;
@@ -2002,16 +1977,6 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct proc *p)
}
break;
- case SIOCGIFRTLABEL:
- if (ifp->if_rtlabelid &&
- (label = rtlabel_id2name(ifp->if_rtlabelid)) != NULL) {
- strlcpy(ifrtlabelbuf, label, RTLABEL_LEN);
- error = copyoutstr(ifrtlabelbuf, ifr->ifr_data,
- RTLABEL_LEN, &bytesdone);
- } else
- error = ENOENT;
- break;
-
case SIOCSIFRTLABEL:
if ((error = suser(p, 0)) != 0)
break;
@@ -2023,10 +1988,6 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct proc *p)
}
break;
- case SIOCGIFPRIORITY:
- ifr->ifr_metric = ifp->if_priority;
- break;
-
case SIOCSIFPRIORITY:
if ((error = suser(p, 0)) != 0)
break;
@@ -2037,10 +1998,6 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct proc *p)
ifp->if_priority = ifr->ifr_metric;
break;
- case SIOCGIFRDOMAIN:
- ifr->ifr_rdomainid = ifp->if_rdomain;
- break;
-
case SIOCSIFRDOMAIN:
if ((error = suser(p, 0)) != 0)
break;
@@ -2057,10 +2014,6 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct proc *p)
error = 0;
break;
- case SIOCGIFGROUP:
- error = if_getgroup(data, ifp);
- break;
-
case SIOCDIFGROUP:
if ((error = suser(p, 0)))
break;
@@ -2100,10 +2053,6 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct proc *p)
ifnewlladdr(ifp);
break;
- case SIOCGIFLLPRIO:
- ifr->ifr_llprio = ifp->if_llprio;
- break;
-
case SIOCSIFLLPRIO:
if ((error = suser(p, 0)))
break;
@@ -2146,6 +2095,101 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct proc *p)
return (error);
}
+int
+ifioctl_get(u_long cmd, caddr_t data)
+{
+ struct ifnet *ifp;
+ struct ifreq *ifr = (struct ifreq *)data;
+ char ifdescrbuf[IFDESCRSIZE];
+ char ifrtlabelbuf[RTLABEL_LEN];
+ int error = 0;
+ size_t bytesdone;
+ const char *label;
+
+ switch(cmd) {
+ case SIOCGIFCONF:
+ return (ifconf(cmd, data));
+ case SIOCIFGCLONERS:
+ return (if_clone_list((struct if_clonereq *)data));
+ case SIOCGIFGMEMB:
+ return (if_getgroupmembers(data));
+ case SIOCGIFGATTR:
+ return (if_getgroupattribs(data));
+ }
+
+ ifp = ifunit(ifr->ifr_name);
+ if (ifp == NULL)
+ return (ENXIO);
+
+ switch(cmd) {
+ case SIOCGIFFLAGS:
+ ifr->ifr_flags = ifp->if_flags;
+ if (ifq_is_oactive(&ifp->if_snd))
+ ifr->ifr_flags |= IFF_OACTIVE;
+ break;
+
+ case SIOCGIFXFLAGS:
+ ifr->ifr_flags = ifp->if_xflags & ~(IFXF_MPSAFE|IFXF_CLONED);
+ break;
+
+ case SIOCGIFMETRIC:
+ ifr->ifr_metric = ifp->if_metric;
+ break;
+
+ case SIOCGIFMTU:
+ ifr->ifr_mtu = ifp->if_mtu;
+ break;
+
+ case SIOCGIFHARDMTU:
+ ifr->ifr_hardmtu = ifp->if_hardmtu;
+ break;
+
+ case SIOCGIFDATA: {
+ struct if_data ifdata;
+ if_getdata(ifp, &ifdata);
+ error = copyout(&ifdata, ifr->ifr_data, sizeof(ifdata));
+ break;
+ }
+
+ case SIOCGIFDESCR:
+ strlcpy(ifdescrbuf, ifp->if_description, IFDESCRSIZE);
+ error = copyoutstr(ifdescrbuf, ifr->ifr_data, IFDESCRSIZE,
+ &bytesdone);
+ break;
+
+ case SIOCGIFRTLABEL:
+ if (ifp->if_rtlabelid &&
+ (label = rtlabel_id2name(ifp->if_rtlabelid)) != NULL) {
+ strlcpy(ifrtlabelbuf, label, RTLABEL_LEN);
+ error = copyoutstr(ifrtlabelbuf, ifr->ifr_data,
+ RTLABEL_LEN, &bytesdone);
+ } else
+ error = ENOENT;
+ break;
+
+ case SIOCGIFPRIORITY:
+ ifr->ifr_metric = ifp->if_priority;
+ break;
+
+ case SIOCGIFRDOMAIN:
+ ifr->ifr_rdomainid = ifp->if_rdomain;
+ break;
+
+ case SIOCGIFGROUP:
+ error = if_getgroup(data, ifp);
+ break;
+
+ case SIOCGIFLLPRIO:
+ ifr->ifr_llprio = ifp->if_llprio;
+ break;
+
+ default:
+ panic("invalid ioctl %lu", cmd);
+ }
+
+ return (error);
+}
+
/*
* Return interface configuration
* of system. List may be used