summaryrefslogtreecommitdiffstats
path: root/sys/netnatm
diff options
context:
space:
mode:
authortanimura <tanimura@FreeBSD.org>2002-05-20 05:41:09 +0000
committertanimura <tanimura@FreeBSD.org>2002-05-20 05:41:09 +0000
commit92d8381dd544a8237b3fd68c4e7fce9bd0903fb2 (patch)
tree2465ddbcecac65f96c5c6d5cef1a4fe3f1ac03f8 /sys/netnatm
parent969293170b27461145f69a538d5abd15fea34ba1 (diff)
downloadFreeBSD-src-92d8381dd544a8237b3fd68c4e7fce9bd0903fb2.zip
FreeBSD-src-92d8381dd544a8237b3fd68c4e7fce9bd0903fb2.tar.gz
Lock down a socket, milestone 1.
o Add a mutex (sb_mtx) to struct sockbuf. This protects the data in a socket buffer. The mutex in the receive buffer also protects the data in struct socket. o Determine the lock strategy for each members in struct socket. o Lock down the following members: - so_count - so_options - so_linger - so_state o Remove *_locked() socket APIs. Make the following socket APIs touching the members above now require a locked socket: - sodisconnect() - soisconnected() - soisconnecting() - soisdisconnected() - soisdisconnecting() - sofree() - soref() - sorele() - sorwakeup() - sotryfree() - sowakeup() - sowwakeup() Reviewed by: alfred
Diffstat (limited to 'sys/netnatm')
-rw-r--r--sys/netnatm/natm.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/sys/netnatm/natm.c b/sys/netnatm/natm.c
index e0535b6..27a9bd4 100644
--- a/sys/netnatm/natm.c
+++ b/sys/netnatm/natm.c
@@ -134,6 +134,7 @@ natm_usr_detach(struct socket *so)
*/
npcb_free(npcb, NPCB_DESTROY); /* drain */
so->so_pcb = NULL;
+ SOCK_LOCK(so);
sotryfree(so);
out:
splx(s);
@@ -216,7 +217,9 @@ natm_usr_connect(struct socket *so, struct sockaddr *nam, d_thread_t *p)
}
splx(s2);
+ SOCK_LOCK(so);
soisconnected(so);
+ SOCK_UNLOCK(so);
out:
splx(s);
@@ -259,7 +262,9 @@ natm_usr_disconnect(struct socket *so)
splx(s2);
npcb_free(npcb, NPCB_REMOVE);
+ SOCK_LOCK(so);
soisdisconnected(so);
+ SOCK_UNLOCK(so);
out:
splx(s);
@@ -482,6 +487,7 @@ struct proc *p;
npcb_free(npcb, NPCB_DESTROY); /* drain */
so->so_pcb = NULL;
+ SOCK_LOCK(so);
sotryfree(so);
break;
@@ -552,7 +558,9 @@ struct proc *p;
}
splx(s2);
+ SOCK_LOCK(so);
soisconnected(so);
+ SOCK_UNLOCK(so);
break;
@@ -579,7 +587,9 @@ struct proc *p;
splx(s2);
npcb_free(npcb, NPCB_REMOVE);
+ SOCK_LOCK(so);
soisdisconnected(so);
+ SOCK_UNLOCK(so);
break;
@@ -752,7 +762,9 @@ m->m_pkthdr.rcvif = NULL; /* null it out to be safe */
natm_sookbytes += m->m_pkthdr.len;
#endif
sbappendrecord(&so->so_rcv, m);
+ SOCK_LOCK(so);
sorwakeup(so);
+ SOCK_UNLOCK(so);
} else {
#ifdef NATM_STAT
natm_sodropcnt++;
OpenPOWER on IntegriCloud