summaryrefslogtreecommitdiffstats
path: root/sys/netinet6/in6_pcb.c
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2006-04-23 15:06:16 +0000
committerrwatson <rwatson@FreeBSD.org>2006-04-23 15:06:16 +0000
commit00366b63e338baa890f4da88ce2dbd32bbafa7b8 (patch)
tree268f011dc5e5edfc9869c10cea4131a82291fadb /sys/netinet6/in6_pcb.c
parent281dc6494fa6a185632ea615b685424e90ab7df4 (diff)
downloadFreeBSD-src-00366b63e338baa890f4da88ce2dbd32bbafa7b8.zip
FreeBSD-src-00366b63e338baa890f4da88ce2dbd32bbafa7b8.tar.gz
Modify in6_pcbpurgeif0() to accept a pcbinfo structure rather than a pcb
list head structure; this improves congruence to IPv4, and also allows in6_pcbpurgeif0() to lock the pcbinfo. Modify in6_pcbpurgeif0() to lock the pcbinfo before iterating the pcb list, use queue(9)'s LIST_FOREACH() for the iteration, and to lock individual inpcb's while manipulating them. MFC after: 3 months
Diffstat (limited to 'sys/netinet6/in6_pcb.c')
-rw-r--r--sys/netinet6/in6_pcb.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/sys/netinet6/in6_pcb.c b/sys/netinet6/in6_pcb.c
index d331da3..16b4810 100644
--- a/sys/netinet6/in6_pcb.c
+++ b/sys/netinet6/in6_pcb.c
@@ -799,15 +799,17 @@ in6_pcblookup_local(pcbinfo, laddr, lport_arg, wild_okay)
}
void
-in6_pcbpurgeif0(head, ifp)
- struct in6pcb *head;
+in6_pcbpurgeif0(pcbinfo, ifp)
+ struct inpcbinfo *pcbinfo;
struct ifnet *ifp;
{
struct in6pcb *in6p;
struct ip6_moptions *im6o;
struct in6_multi_mship *imm, *nimm;
- for (in6p = head; in6p != NULL; in6p = LIST_NEXT(in6p, inp_list)) {
+ INP_INFO_RLOCK(pcbinfo);
+ LIST_FOREACH(in6p, pcbinfo->listhead, inp_list) {
+ INP_LOCK(in6p);
im6o = in6p->in6p_moptions;
if ((in6p->inp_vflag & INP_IPV6) &&
im6o) {
@@ -834,7 +836,9 @@ in6_pcbpurgeif0(head, ifp)
}
}
}
+ INP_UNLOCK(in6p);
}
+ INP_INFO_RUNLOCK(pcbinfo);
}
/*
OpenPOWER on IntegriCloud