aboutsummaryrefslogtreecommitdiff
path: root/sys/net/rtsock.c
diff options
context:
space:
mode:
authorSam Leffler <sam@FreeBSD.org>2003-10-03 18:27:02 +0000
committerSam Leffler <sam@FreeBSD.org>2003-10-03 18:27:02 +0000
commitaea8b30f12f5005bae5723fbbcaa606f4a0ac486 (patch)
tree60d60a0089beb8c88a20957db25af8cd4f135a09 /sys/net/rtsock.c
parent91c1935fe571476b48b5796f59254bf779105504 (diff)
Notes
Diffstat (limited to 'sys/net/rtsock.c')
-rw-r--r--sys/net/rtsock.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c
index 5d7d526967fd..4af77ecf4cfe 100644
--- a/sys/net/rtsock.c
+++ b/sys/net/rtsock.c
@@ -66,6 +66,13 @@ static struct {
int any_count; /* total attached */
} route_cb;
+struct mtx rtsock_mtx;
+MTX_SYSINIT(rtsock, &rtsock_mtx, "rtsock route_cb lock", MTX_DEF);
+
+#define RTSOCK_LOCK() mtx_lock(&rtsock_mtx)
+#define RTSOCK_UNLOCK() mtx_unlock(&rtsock_mtx)
+#define RTSOCK_LOCK_ASSERT() mtx_assert(&rtsock_mtx, MA_OWNED)
+
struct walkarg {
int w_tmemsize;
int w_op, w_arg;
@@ -128,6 +135,7 @@ rts_attach(struct socket *so, int proto, struct thread *td)
free(rp, M_PCB);
return error;
}
+ RTSOCK_LOCK();
switch(rp->rcb_proto.sp_protocol) {
case AF_INET:
route_cb.ip_count++;
@@ -141,6 +149,7 @@ rts_attach(struct socket *so, int proto, struct thread *td)
}
rp->rcb_faddr = &route_src;
route_cb.any_count++;
+ RTSOCK_UNLOCK();
soisconnected(so);
so->so_options |= SO_USELOOPBACK;
splx(s);
@@ -178,6 +187,7 @@ rts_detach(struct socket *so)
s = splnet();
if (rp != 0) {
+ RTSOCK_LOCK();
switch(rp->rcb_proto.sp_protocol) {
case AF_INET:
route_cb.ip_count--;
@@ -190,6 +200,7 @@ rts_detach(struct socket *so)
break;
}
route_cb.any_count--;
+ RTSOCK_UNLOCK();
}
error = raw_usrreqs.pru_detach(so);
splx(s);