summaryrefslogtreecommitdiffstats
path: root/sys/netatm/atm_socket.c
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/netatm/atm_socket.c
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/netatm/atm_socket.c')
-rw-r--r--sys/netatm/atm_socket.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/sys/netatm/atm_socket.c b/sys/netatm/atm_socket.c
index 6ff6abc..4862c47 100644
--- a/sys/netatm/atm_socket.c
+++ b/sys/netatm/atm_socket.c
@@ -181,6 +181,7 @@ atm_sock_detach(so)
* Break links and free control blocks
*/
so->so_pcb = NULL;
+ SOCK_LOCK(so);
sotryfree(so);
uma_zfree(atm_pcb_zone, atp);
@@ -493,7 +494,9 @@ atm_sock_connect(so, addr, epp)
/*
* We're finally ready to initiate the ATM connection
*/
+ SOCK_LOCK(so);
soisconnecting(so);
+ SOCK_UNLOCK(so);
atm_sock_stat.as_connreq[atp->atp_type]++;
err = atm_cm_connect(epp, atp, &atp->atp_attr, &atp->atp_conn);
if (err == 0) {
@@ -501,7 +504,9 @@ atm_sock_connect(so, addr, epp)
* Connection is setup
*/
atm_sock_stat.as_conncomp[atp->atp_type]++;
+ SOCK_LOCK(so);
soisconnected(so);
+ SOCK_UNLOCK(so);
} else if (err == EINPROGRESS) {
/*
@@ -514,7 +519,9 @@ atm_sock_connect(so, addr, epp)
* Call failed...
*/
atm_sock_stat.as_connfail[atp->atp_type]++;
+ SOCK_LOCK(so);
soisdisconnected(so);
+ SOCK_UNLOCK(so);
}
return (err);
@@ -564,7 +571,9 @@ atm_sock_disconnect(so)
atp->atp_conn = NULL;
}
+ SOCK_LOCK(so);
soisdisconnected(so);
+ SOCK_UNLOCK(so);
return (0);
}
@@ -661,7 +670,9 @@ atm_sock_peeraddr(so, addr)
satm->satm_family = AF_ATM;
satm->satm_len = sizeof(*satm);
saddr = &satm->satm_addr.t_atm_sap_addr;
+ SOCK_LOCK(so);
if (so->so_state & SS_ISCONNECTED) {
+ SOCK_UNLOCK(so);
cvp = atp->atp_conn->co_connvc;
saddr->SVE_tag_addr = T_ATM_PRESENT;
if (cvp->cvc_flags & CVCF_CALLER) {
@@ -680,6 +691,7 @@ atm_sock_peeraddr(so, addr)
else
saddr->SVE_tag_selector = T_ATM_ABSENT;
} else {
+ SOCK_UNLOCK(so);
saddr->SVE_tag_addr = T_ATM_ABSENT;
saddr->SVE_tag_selector = T_ATM_ABSENT;
saddr->address_format = T_ATM_ABSENT;
@@ -1087,10 +1099,12 @@ atm_sock_getopt(so, sopt, atp)
* If socket is connected, return attributes for the VCC in use,
* otherwise just return what the user has setup so far.
*/
+ SOCK_LOCK(so);
if (so->so_state & SS_ISCONNECTED)
ap = &atp->atp_conn->co_connvc->cvc_attr;
else
ap = &atp->atp_attr;
+ SOCK_UNLOCK(so);
switch (sopt->sopt_name) {
@@ -1268,7 +1282,9 @@ atm_sock_connected(toku)
* Connection is setup
*/
atm_sock_stat.as_conncomp[atp->atp_type]++;
+ SOCK_LOCK(atp->atp_socket);
soisconnected(atp->atp_socket);
+ SOCK_UNLOCK(atp->atp_socket);
}
@@ -1302,6 +1318,7 @@ atm_sock_cleared(toku, cause)
/*
* Set user error code
*/
+ SOCK_LOCK(so);
if (so->so_state & SS_ISCONNECTED) {
so->so_error = ECONNRESET;
atm_sock_stat.as_connclr[atp->atp_type]++;
@@ -1320,7 +1337,9 @@ atm_sock_cleared(toku, cause)
* Cleanup failed incoming connection setup
*/
if (so->so_state & SS_NOFDREF) {
+ SOCK_UNLOCK(so);
(void) atm_sock_detach(so);
- }
+ } else
+ SOCK_UNLOCK(so);
}
OpenPOWER on IntegriCloud