diff options
author | tanimura <tanimura@FreeBSD.org> | 2002-05-20 05:41:09 +0000 |
---|---|---|
committer | tanimura <tanimura@FreeBSD.org> | 2002-05-20 05:41:09 +0000 |
commit | 92d8381dd544a8237b3fd68c4e7fce9bd0903fb2 (patch) | |
tree | 2465ddbcecac65f96c5c6d5cef1a4fe3f1ac03f8 /sys/netnatm/natm.c | |
parent | 969293170b27461145f69a538d5abd15fea34ba1 (diff) | |
download | FreeBSD-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/natm.c')
-rw-r--r-- | sys/netnatm/natm.c | 12 |
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++; |