From 92d8381dd544a8237b3fd68c4e7fce9bd0903fb2 Mon Sep 17 00:00:00 2001 From: tanimura Date: Mon, 20 May 2002 05:41:09 +0000 Subject: 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 --- sys/netgraph/ng_socket.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'sys/netgraph/ng_socket.c') diff --git a/sys/netgraph/ng_socket.c b/sys/netgraph/ng_socket.c index 09d1c46..312b36b 100644 --- a/sys/netgraph/ng_socket.c +++ b/sys/netgraph/ng_socket.c @@ -734,7 +734,9 @@ ship_msg(struct ngpcb *pcbp, struct ng_mesg *msg, struct sockaddr_ng *addr) m_freem(mdata); return (ENOBUFS); } + SOCK_LOCK(so); sorwakeup(so); + SOCK_UNLOCK(so); return (0); } @@ -770,9 +772,13 @@ ngs_connect(hook_p hook) if ((priv->datasock) && (priv->datasock->ng_socket)) { if (NG_NODE_NUMHOOKS(node) == 1) { + SOCK_LOCK(priv->datasock->ng_socket); priv->datasock->ng_socket->so_state |= SS_ISCONNECTED; + SOCK_UNLOCK(priv->datasock->ng_socket); } else { + SOCK_LOCK(priv->datasock->ng_socket); priv->datasock->ng_socket->so_state &= ~SS_ISCONNECTED; + SOCK_UNLOCK(priv->datasock->ng_socket); } } return (0); @@ -886,7 +892,9 @@ ngs_rcvdata(hook_p hook, item_p item) TRAP_ERROR; return (ENOBUFS); } + SOCK_LOCK(so); sorwakeup(so); + SOCK_UNLOCK(so); return (0); } @@ -905,9 +913,13 @@ ngs_disconnect(hook_p hook) if ((priv->datasock) && (priv->datasock->ng_socket)) { if (NG_NODE_NUMHOOKS(node) == 1) { + SOCK_LOCK(priv->datasock->ng_socket); priv->datasock->ng_socket->so_state |= SS_ISCONNECTED; + SOCK_UNLOCK(priv->datasock->ng_socket); } else { + SOCK_LOCK(priv->datasock->ng_socket); priv->datasock->ng_socket->so_state &= ~SS_ISCONNECTED; + SOCK_UNLOCK(priv->datasock->ng_socket); } } @@ -932,13 +944,17 @@ ngs_shutdown(node_p node) struct ngpcb *const pcbp = priv->ctlsock; if (dpcbp != NULL) { + SOCK_LOCK(dpcbp->ng_socket); soisdisconnected(dpcbp->ng_socket); + SOCK_UNLOCK(dpcbp->ng_socket); dpcbp->sockdata = NULL; priv->datasock = NULL; priv->refs--; } if (pcbp != NULL) { + SOCK_LOCK(pcbp->ng_socket); soisdisconnected(pcbp->ng_socket); + SOCK_UNLOCK(pcbp->ng_socket); pcbp->sockdata = NULL; priv->ctlsock = NULL; priv->refs--; -- cgit v1.1