summaryrefslogtreecommitdiffstats
path: root/sys/netnatm
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2006-04-23 16:25:30 +0000
committerrwatson <rwatson@FreeBSD.org>2006-04-23 16:25:30 +0000
commitab21c0f3d0afdc661b63f40ecffdf15536bc630c (patch)
tree68feaa69414e5f696996ced5b0c66cd055d87706 /sys/netnatm
parent8f33c5d4671279b7fb7558b4766a1d7d5dbdee8c (diff)
downloadFreeBSD-src-ab21c0f3d0afdc661b63f40ecffdf15536bc630c.zip
FreeBSD-src-ab21c0f3d0afdc661b63f40ecffdf15536bc630c.tar.gz
Eliminate unnecessary use of labels in error unwinding cases; result is
the same number or fewer lines of code. Don't cast using caddr_t. Remember to unlock the natm lock in some error cases where it was leaked previously. Annotate two cases where we'd like to hold the natm subsystem lock over ioctls into the device driver. Hold the natm lock longer in natm_usr_connect() so we can copy the npcb fields while holding the mutex. MFC after: 3 months
Diffstat (limited to 'sys/netnatm')
-rw-r--r--sys/netnatm/natm.c61
1 files changed, 26 insertions, 35 deletions
diff --git a/sys/netnatm/natm.c b/sys/netnatm/natm.c
index 1f43a4a..76beef4 100644
--- a/sys/netnatm/natm.c
+++ b/sys/netnatm/natm.c
@@ -102,12 +102,11 @@ natm_usr_attach(struct socket *so, int proto, d_thread_t *p)
else
error = soreserve(so, natm0_sendspace, natm0_recvspace);
if (error)
- goto out;
+ return (error);
}
- so->so_pcb = (caddr_t) (npcb = npcb_alloc(M_WAITOK));
+ so->so_pcb = npcb = npcb_alloc(M_WAITOK);
npcb->npcb_socket = so;
-out:
return (error);
}
@@ -145,12 +144,12 @@ natm_usr_connect(struct socket *so, struct sockaddr *nam, d_thread_t *p)
snatm = (struct sockaddr_natm *)nam;
if (snatm->snatm_len != sizeof(*snatm) ||
(npcb->npcb_flags & NPCB_FREE) == 0) {
- error = EINVAL;
- goto out;
+ NATM_UNLOCK();
+ return (EINVAL);
}
if (snatm->snatm_family != AF_NATM) {
- error = EAFNOSUPPORT;
- goto out;
+ NATM_UNLOCK();
+ return (EAFNOSUPPORT);
}
snatm->snatm_if[IFNAMSIZ - 1] = '\0'; /* XXX ensure null termination
@@ -161,25 +160,26 @@ natm_usr_connect(struct socket *so, struct sockaddr *nam, d_thread_t *p)
*/
ifp = ifunit(snatm->snatm_if);
if (ifp == NULL || (ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
- error = ENXIO;
- goto out;
+ NATM_UNLOCK();
+ return (ENXIO);
}
if (ifp->if_output != atm_output) {
- error = EAFNOSUPPORT;
- goto out;
+ NATM_UNLOCK();
+ return (EAFNOSUPPORT);
}
/*
* register us with the NATM PCB layer
*/
if (npcb_add(npcb, ifp, snatm->snatm_vci, snatm->snatm_vpi) != npcb) {
- error = EADDRINUSE;
- goto out;
+ NATM_UNLOCK();
+ return (EADDRINUSE);
}
- NATM_UNLOCK();
/*
- * open the channel
+ * Open the channel.
+ *
+ * XXXRW: Eventually desirable to hold mutex over ioctl?
*/
bzero(&op, sizeof(op));
op.rxhand = npcb;
@@ -189,19 +189,16 @@ natm_usr_connect(struct socket *so, struct sockaddr *nam, d_thread_t *p)
op.param.rmtu = op.param.tmtu = ifp->if_mtu;
op.param.aal = (proto == PROTO_NATMAAL5) ? ATMIO_AAL_5 : ATMIO_AAL_0;
op.param.traffic = ATMIO_TRAFFIC_UBR;
+ NATM_UNLOCK();
IFF_LOCKGIANT(ifp);
if (ifp->if_ioctl == NULL ||
ifp->if_ioctl(ifp, SIOCATMOPENVCC, (caddr_t)&op) != 0) {
IFF_UNLOCKGIANT(ifp);
- error = EIO;
- goto out;
+ return (EIO);
}
IFF_UNLOCKGIANT(ifp);
-
soisconnected(so);
-
- out:
return (error);
}
@@ -218,14 +215,16 @@ natm_usr_disconnect(struct socket *so)
NATM_LOCK();
if ((npcb->npcb_flags & NPCB_CONNECTED) == 0) {
+ NATM_UNLOCK();
printf("natm: disconnected check\n");
- error = EIO;
- goto out;
+ return (EIO);
}
ifp = npcb->npcb_ifp;
/*
- * disable rx
+ * Disable rx.
+ *
+ * XXXRW: Eventually desirable to hold mutex over ioctl?
*/
cl.vpi = npcb->npcb_vpi;
cl.vci = npcb->npcb_vci;
@@ -235,12 +234,7 @@ natm_usr_disconnect(struct socket *so)
ifp->if_ioctl(ifp, SIOCATMCLOSEVCC, (caddr_t)&cl);
IFF_UNLOCKGIANT(ifp);
}
- NATM_LOCK();
-
soisdisconnected(so);
-
- out:
- NATM_UNLOCK();
return (error);
}
@@ -265,10 +259,10 @@ natm_usr_send(struct socket *so, int flags, struct mbuf *m,
NATM_LOCK();
if (control && control->m_len) {
+ NATM_UNLOCK();
m_freem(control);
m_freem(m);
- error = EINVAL;
- goto out;
+ return (EINVAL);
}
/*
@@ -276,18 +270,15 @@ natm_usr_send(struct socket *so, int flags, struct mbuf *m,
*/
M_PREPEND(m, sizeof(*aph), M_DONTWAIT);
if (m == NULL) {
+ NATM_UNLOCK();
m_freem(control);
- error = ENOBUFS;
- goto out;
+ return (ENOBUFS);
}
aph = mtod(m, struct atm_pseudohdr *);
ATM_PH_VPI(aph) = npcb->npcb_vpi;
ATM_PH_SETVCI(aph, npcb->npcb_vci);
ATM_PH_FLAGS(aph) = (proto == PROTO_NATMAAL5) ? ATM_PH_AAL5 : 0;
-
error = atm_output(npcb->npcb_ifp, m, NULL, NULL);
-
- out:
NATM_UNLOCK();
return (error);
}
OpenPOWER on IntegriCloud