summaryrefslogtreecommitdiffstats
path: root/sys/netinet/in_pcb.c
diff options
context:
space:
mode:
authorsam <sam@FreeBSD.org>2003-11-08 23:02:36 +0000
committersam <sam@FreeBSD.org>2003-11-08 23:02:36 +0000
commit111b711b8209ee948e0b5940a2ff5b14b024e273 (patch)
treebc93f1f2056d0e97d3dd34e59f3afb78141d27ec /sys/netinet/in_pcb.c
parent0860beca462b8c42cc880da70636f16b288c3a9f (diff)
downloadFreeBSD-src-111b711b8209ee948e0b5940a2ff5b14b024e273.zip
FreeBSD-src-111b711b8209ee948e0b5940a2ff5b14b024e273.tar.gz
add locking assertions
Supported by: FreeBSD Foundation
Diffstat (limited to 'sys/netinet/in_pcb.c')
-rw-r--r--sys/netinet/in_pcb.c33
1 files changed, 29 insertions, 4 deletions
diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c
index e473f2f..6b3d96b 100644
--- a/sys/netinet/in_pcb.c
+++ b/sys/netinet/in_pcb.c
@@ -164,6 +164,7 @@ in_pcballoc(so, pcbinfo, td)
#if defined(IPSEC) || defined(FAST_IPSEC)
int error;
#endif
+ INP_INFO_WLOCK_ASSERT(pcbinfo);
inp = uma_zalloc(pcbinfo->ipi_zone, M_NOWAIT | M_ZERO);
if (inp == NULL)
return (ENOBUFS);
@@ -207,6 +208,9 @@ in_pcbbind(inp, nam, td)
{
int anonport, error;
+ INP_LOCK_ASSERT(inp);
+
+ INP_INFO_WLOCK_ASSERT(inp->inp_pcbinfo);
if (inp->inp_lport != 0 || inp->inp_laddr.s_addr != INADDR_ANY)
return (EINVAL);
anonport = inp->inp_lport == 0 && (nam == NULL ||
@@ -251,6 +255,9 @@ in_pcbbind_setup(inp, nam, laddrp, lportp, td)
int wild = 0, reuseport = (so->so_options & SO_REUSEPORT);
int error, prison = 0;
+ INP_LOCK_ASSERT(inp);
+
+ INP_INFO_WLOCK_ASSERT(pcbinfo);
if (TAILQ_EMPTY(&in_ifaddrhead)) /* XXX broken! */
return (EADDRNOTAVAIL);
laddr.s_addr = *laddrp;
@@ -656,6 +663,7 @@ void
in_pcbdisconnect(inp)
struct inpcb *inp;
{
+ INP_LOCK_ASSERT(inp);
inp->inp_faddr.s_addr = INADDR_ANY;
inp->inp_fport = 0;
@@ -674,6 +682,8 @@ in_pcbdetach(inp)
struct socket *so = inp->inp_socket;
struct inpcbinfo *ipi = inp->inp_pcbinfo;
+ INP_LOCK_ASSERT(inp);
+
#if defined(IPSEC) || defined(FAST_IPSEC)
ipsec4_delete_pcbpolicy(inp);
#endif /*IPSEC*/
@@ -872,6 +882,8 @@ in_losing(inp)
register struct rtentry *rt;
struct rt_addrinfo info;
+ INP_LOCK_ASSERT(inp);
+
if ((rt = inp->inp_route.ro_rt)) {
RT_LOCK(rt);
inp->inp_route.ro_rt = NULL;
@@ -900,6 +912,8 @@ in_rtchange(inp, errno)
register struct inpcb *inp;
int errno;
{
+ INP_LOCK_ASSERT(inp);
+
if (inp->inp_route.ro_rt) {
RTFREE(inp->inp_route.ro_rt);
inp->inp_route.ro_rt = 0;
@@ -925,6 +939,7 @@ in_pcblookup_local(pcbinfo, laddr, lport_arg, wild_okay)
int matchwild = 3, wildcard;
u_short lport = lport_arg;
+ INP_INFO_RLOCK_ASSERT(pcbinfo);
if (!wild_okay) {
struct inpcbhead *head;
/*
@@ -1029,6 +1044,7 @@ in_pcblookup_hash(pcbinfo, faddr, fport_arg, laddr, lport_arg, wildcard,
register struct inpcb *inp;
u_short fport = fport_arg, lport = lport_arg;
+ INP_INFO_RLOCK_ASSERT(pcbinfo);
/*
* First look for an exact match.
*/
@@ -1104,6 +1120,7 @@ in_pcbinshash(inp)
struct inpcbport *phd;
u_int32_t hashkey_faddr;
+ INP_INFO_WLOCK_ASSERT(pcbinfo);
#ifdef INET6
if (inp->inp_vflag & INP_IPV6)
hashkey_faddr = inp->in6p_faddr.s6_addr32[3] /* XXX */;
@@ -1152,9 +1169,12 @@ void
in_pcbrehash(inp)
struct inpcb *inp;
{
+ struct inpcbinfo *pcbinfo = inp->inp_pcbinfo;
struct inpcbhead *head;
u_int32_t hashkey_faddr;
+ INP_INFO_WLOCK_ASSERT(pcbinfo);
+ /* XXX? INP_LOCK_ASSERT(inp); */
#ifdef INET6
if (inp->inp_vflag & INP_IPV6)
hashkey_faddr = inp->in6p_faddr.s6_addr32[3] /* XXX */;
@@ -1162,8 +1182,8 @@ in_pcbrehash(inp)
#endif /* INET6 */
hashkey_faddr = inp->inp_faddr.s_addr;
- head = &inp->inp_pcbinfo->hashbase[INP_PCBHASH(hashkey_faddr,
- inp->inp_lport, inp->inp_fport, inp->inp_pcbinfo->hashmask)];
+ head = &pcbinfo->hashbase[INP_PCBHASH(hashkey_faddr,
+ inp->inp_lport, inp->inp_fport, pcbinfo->hashmask)];
LIST_REMOVE(inp, inp_hash);
LIST_INSERT_HEAD(head, inp, inp_hash);
@@ -1176,7 +1196,12 @@ void
in_pcbremlists(inp)
struct inpcb *inp;
{
- inp->inp_gencnt = ++inp->inp_pcbinfo->ipi_gencnt;
+ struct inpcbinfo *pcbinfo = inp->inp_pcbinfo;
+
+ INP_INFO_WLOCK_ASSERT(pcbinfo);
+ INP_LOCK_ASSERT(inp);
+
+ inp->inp_gencnt = ++pcbinfo->ipi_gencnt;
if (inp->inp_lport) {
struct inpcbport *phd = inp->inp_phd;
@@ -1188,7 +1213,7 @@ in_pcbremlists(inp)
}
}
LIST_REMOVE(inp, inp_list);
- inp->inp_pcbinfo->ipi_count--;
+ pcbinfo->ipi_count--;
}
int
OpenPOWER on IntegriCloud