Module Name:    src
Committed By:   ozaki-r
Date:           Mon Jul  4 06:48:14 UTC 2016

Modified Files:
        src/sys/netinet: ip_carp.c
        src/sys/netinet6: in6.c in6_ifattach.c in6_src.c in6_var.h ip6_input.c
            mld6.c nd6.c nd6_rtr.c
        src/sys/netipsec: key.c

Log Message:
Use pslist(9) for the global in6_ifaddr list

psz and psref will be applied in another commit.

No functional change intended.


To generate a diff of this commit:
cvs rdiff -u -r1.71 -r1.72 src/sys/netinet/ip_carp.c
cvs rdiff -u -r1.203 -r1.204 src/sys/netinet6/in6.c
cvs rdiff -u -r1.99 -r1.100 src/sys/netinet6/in6_ifattach.c
cvs rdiff -u -r1.62 -r1.63 src/sys/netinet6/in6_src.c
cvs rdiff -u -r1.77 -r1.78 src/sys/netinet6/in6_var.h
cvs rdiff -u -r1.161 -r1.162 src/sys/netinet6/ip6_input.c
cvs rdiff -u -r1.69 -r1.70 src/sys/netinet6/mld6.c
cvs rdiff -u -r1.198 -r1.199 src/sys/netinet6/nd6.c
cvs rdiff -u -r1.112 -r1.113 src/sys/netinet6/nd6_rtr.c
cvs rdiff -u -r1.97 -r1.98 src/sys/netipsec/key.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/netinet/ip_carp.c
diff -u src/sys/netinet/ip_carp.c:1.71 src/sys/netinet/ip_carp.c:1.72
--- src/sys/netinet/ip_carp.c:1.71	Tue Jun 21 03:28:27 2016
+++ src/sys/netinet/ip_carp.c	Mon Jul  4 06:48:14 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip_carp.c,v 1.71 2016/06/21 03:28:27 ozaki-r Exp $	*/
+/*	$NetBSD: ip_carp.c,v 1.72 2016/07/04 06:48:14 ozaki-r Exp $	*/
 /*	$OpenBSD: ip_carp.c,v 1.113 2005/11/04 08:11:54 mcbride Exp $	*/
 
 /*
@@ -33,7 +33,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_carp.c,v 1.71 2016/06/21 03:28:27 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_carp.c,v 1.72 2016/07/04 06:48:14 ozaki-r Exp $");
 
 /*
  * TODO:
@@ -1827,7 +1827,7 @@ carp_set_addr6(struct carp_softc *sc, st
 
 	/* we have to do this by hand to ensure we don't match on ourselves */
 	ia_if = NULL;
-	for (ia = in6_ifaddr; ia; ia = ia->ia_next) {
+	IN6_ADDRLIST_READER_FOREACH(ia) {
 		int i;
 
 		for (i = 0; i < 4; i++) {

Index: src/sys/netinet6/in6.c
diff -u src/sys/netinet6/in6.c:1.203 src/sys/netinet6/in6.c:1.204
--- src/sys/netinet6/in6.c:1.203	Mon Jul  4 02:41:18 2016
+++ src/sys/netinet6/in6.c	Mon Jul  4 06:48:14 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: in6.c,v 1.203 2016/07/04 02:41:18 ozaki-r Exp $	*/
+/*	$NetBSD: in6.c,v 1.204 2016/07/04 06:48:14 ozaki-r Exp $	*/
 /*	$KAME: in6.c,v 1.198 2001/07/18 09:12:38 itojun Exp $	*/
 
 /*
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in6.c,v 1.203 2016/07/04 02:41:18 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in6.c,v 1.204 2016/07/04 06:48:14 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -209,7 +209,7 @@ in6_ifremlocal(struct ifaddr *ifa)
 	 * XXX agree, especially now that I have fixed the dangling
 	 * XXX ifp-pointers bug.
 	 */
-	for (ia = in6_ifaddr; ia; ia = ia->ia_next) {
+	IN6_ADDRLIST_READER_FOREACH(ia) {
 		if (!IN6_ARE_ADDR_EQUAL(IFA_IN6(ifa), &ia->ia_addr.sin6_addr))
 			continue;
 		if (ia->ia_ifp != ifa->ifa_ifp)
@@ -758,7 +758,6 @@ in6_update_ifa1(struct ifnet *ifp, struc
     struct in6_ifaddr *ia, int flags)
 {
 	int error = 0, hostIsNew = 0, plen = -1;
-	struct in6_ifaddr *oia;
 	struct sockaddr_in6 dst6;
 	struct in6_addrlifetime *lt;
 	struct in6_multi_mship *imm;
@@ -921,6 +920,7 @@ in6_update_ifa1(struct ifnet *ifp, struc
 		    (struct sockaddr *)&ia->ia_prefixmask;
 
 		ia->ia_ifp = ifp;
+		IN6_ADDRLIST_ENTRY_INIT(ia);
 	}
 
 	/* update timestamp */
@@ -1027,12 +1027,8 @@ in6_update_ifa1(struct ifnet *ifp, struc
 	/*
 	 * Insert ia to the global list and ifa to the interface's list.
 	 */
-	if ((oia = in6_ifaddr) != NULL) {
-		for ( ; oia->ia_next; oia = oia->ia_next)
-			continue;
-		oia->ia_next = ia;
-	} else
-		in6_ifaddr = ia;
+	IN6_ADDRLIST_WRITER_INSERT_TAIL(ia);
+
 	/* gain a refcnt for the link from in6_ifaddr */
 	ifaref(&ia->ia_ifa);
 	ifa_insert(ifp, &ia->ia_ifa);
@@ -1352,52 +1348,39 @@ in6_purgeaddr(struct ifaddr *ifa)
 static void
 in6_unlink_ifa(struct in6_ifaddr *ia, struct ifnet *ifp)
 {
-	struct in6_ifaddr *oia;
 	int	s = splnet();
 
 	ifa_remove(ifp, &ia->ia_ifa);
 
-	oia = ia;
-	if (oia == (ia = in6_ifaddr))
-		in6_ifaddr = ia->ia_next;
-	else {
-		while (ia->ia_next && (ia->ia_next != oia))
-			ia = ia->ia_next;
-		if (ia->ia_next)
-			ia->ia_next = oia->ia_next;
-		else {
-			/* search failed */
-			printf("Couldn't unlink in6_ifaddr from in6_ifaddr\n");
-		}
-	}
+	IN6_ADDRLIST_WRITER_REMOVE(ia);
 
 	/*
 	 * XXX thor...@netbsd.org -- if the interface is going
 	 * XXX away, don't save the multicast entries, delete them!
 	 */
-	if (LIST_EMPTY(&oia->ia6_multiaddrs))
+	if (LIST_EMPTY(&ia->ia6_multiaddrs))
 		;
-	else if (if_is_deactivated(oia->ia_ifa.ifa_ifp)) {
+	else if (if_is_deactivated(ia->ia_ifa.ifa_ifp)) {
 		struct in6_multi *in6m, *next;
 
-		for (in6m = LIST_FIRST(&oia->ia6_multiaddrs); in6m != NULL;
+		for (in6m = LIST_FIRST(&ia->ia6_multiaddrs); in6m != NULL;
 		     in6m = next) {
 			next = LIST_NEXT(in6m, in6m_entry);
 			in6_delmulti(in6m);
 		}
 	} else
-		in6_savemkludge(oia);
+		in6_savemkludge(ia);
 
 	/*
 	 * Release the reference to the base prefix.  There should be a
 	 * positive reference.
 	 */
-	if (oia->ia6_ndpr == NULL) {
+	if (ia->ia6_ndpr == NULL) {
 		nd6log(LOG_NOTICE, "autoconf'ed address %p has no prefix\n",
-		    oia);
+		    ia);
 	} else {
-		oia->ia6_ndpr->ndpr_refcnt--;
-		oia->ia6_ndpr = NULL;
+		ia->ia6_ndpr->ndpr_refcnt--;
+		ia->ia6_ndpr = NULL;
 	}
 
 	/*
@@ -1405,14 +1388,14 @@ in6_unlink_ifa(struct in6_ifaddr *ia, st
 	 * pfxlist_onlink_check() since the release might affect the status of
 	 * other (detached) addresses.
 	 */
-	if ((oia->ia6_flags & IN6_IFF_AUTOCONF) != 0)
+	if ((ia->ia6_flags & IN6_IFF_AUTOCONF) != 0)
 		pfxlist_onlink_check();
 
 	/*
 	 * release another refcnt for the link from in6_ifaddr.
 	 * Note that we should decrement the refcnt at least once for all *BSD.
 	 */
-	ifafree(&oia->ia_ifa);
+	ifafree(&ia->ia_ifa);
 
 	splx(s);
 }
@@ -1789,7 +1772,7 @@ in6ifa_ifwithaddr(const struct in6_addr 
 	IN6_IFADDR_RLOCK();
 	LIST_FOREACH(ia, IN6ADDR_HASH(addr), ia6_hash) {
 #else
-	for (ia = in6_ifaddr; ia; ia = ia->ia_next) {
+	IN6_ADDRLIST_READER_FOREACH(ia) {
 #endif
 		if (IN6_ARE_ADDR_EQUAL(IA6_IN6(ia), addr)) {
 			if (zoneid != 0 &&
@@ -1858,10 +1841,11 @@ in6_localaddr(const struct in6_addr *in6
 	if (IN6_IS_ADDR_LOOPBACK(in6) || IN6_IS_ADDR_LINKLOCAL(in6))
 		return 1;
 
-	for (ia = in6_ifaddr; ia; ia = ia->ia_next)
+	IN6_ADDRLIST_READER_FOREACH(ia) {
 		if (IN6_ARE_MASKED_ADDR_EQUAL(in6, &ia->ia_addr.sin6_addr,
 					      &ia->ia_prefixmask.sin6_addr))
 			return 1;
+	}
 
 	return 0;
 }
@@ -1871,7 +1855,7 @@ in6_is_addr_deprecated(struct sockaddr_i
 {
 	struct in6_ifaddr *ia;
 
-	for (ia = in6_ifaddr; ia; ia = ia->ia_next) {
+	IN6_ADDRLIST_READER_FOREACH(ia) {
 		if (IN6_ARE_ADDR_EQUAL(&ia->ia_addr.sin6_addr,
 		    &sa6->sin6_addr) &&
 #ifdef SCOPEDROUTING

Index: src/sys/netinet6/in6_ifattach.c
diff -u src/sys/netinet6/in6_ifattach.c:1.99 src/sys/netinet6/in6_ifattach.c:1.100
--- src/sys/netinet6/in6_ifattach.c:1.99	Mon Jul  4 02:41:18 2016
+++ src/sys/netinet6/in6_ifattach.c	Mon Jul  4 06:48:14 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: in6_ifattach.c,v 1.99 2016/07/04 02:41:18 ozaki-r Exp $	*/
+/*	$NetBSD: in6_ifattach.c,v 1.100 2016/07/04 06:48:14 ozaki-r Exp $	*/
 /*	$KAME: in6_ifattach.c,v 1.124 2001/07/18 08:32:51 jinmei Exp $	*/
 
 /*
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in6_ifattach.c,v 1.99 2016/07/04 02:41:18 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in6_ifattach.c,v 1.100 2016/07/04 06:48:14 ozaki-r Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -245,7 +245,7 @@ generate_tmp_ifid(u_int8_t *seed0, const
 	else {
 		struct in6_ifaddr *ia;
 
-		for (ia = in6_ifaddr; ia; ia = ia->ia_next) {
+		IN6_ADDRLIST_READER_FOREACH(ia) {
 			if (!memcmp(&ia->ia_addr.sin6_addr.s6_addr[8], 
 			    ret, 8)) {
 				badid = 1;

Index: src/sys/netinet6/in6_src.c
diff -u src/sys/netinet6/in6_src.c:1.62 src/sys/netinet6/in6_src.c:1.63
--- src/sys/netinet6/in6_src.c:1.62	Tue Jun 21 10:25:27 2016
+++ src/sys/netinet6/in6_src.c	Mon Jul  4 06:48:14 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: in6_src.c,v 1.62 2016/06/21 10:25:27 ozaki-r Exp $	*/
+/*	$NetBSD: in6_src.c,v 1.63 2016/07/04 06:48:14 ozaki-r Exp $	*/
 /*	$KAME: in6_src.c,v 1.159 2005/10/19 01:40:32 t-momose Exp $	*/
 
 /*
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in6_src.c,v 1.62 2016/06/21 10:25:27 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in6_src.c,v 1.63 2016/07/04 06:48:14 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -293,7 +293,7 @@ in6_selectsrc(struct sockaddr_in6 *dstso
 	if (*errorp != 0)
 		goto exit;
 
-	for (ia = in6_ifaddr; ia; ia = ia->ia_next) {
+	IN6_ADDRLIST_READER_FOREACH(ia) {
 		int new_scope = -1, new_matchlen = -1;
 		struct in6_addrpolicy *new_policy = NULL;
 		u_int32_t srczone, osrczone, dstzone;

Index: src/sys/netinet6/in6_var.h
diff -u src/sys/netinet6/in6_var.h:1.77 src/sys/netinet6/in6_var.h:1.78
--- src/sys/netinet6/in6_var.h:1.77	Wed Jun 22 07:48:17 2016
+++ src/sys/netinet6/in6_var.h	Mon Jul  4 06:48:14 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: in6_var.h,v 1.77 2016/06/22 07:48:17 ozaki-r Exp $	*/
+/*	$NetBSD: in6_var.h,v 1.78 2016/07/04 06:48:14 ozaki-r Exp $	*/
 /*	$KAME: in6_var.h,v 1.81 2002/06/08 11:16:51 itojun Exp $	*/
 
 /*
@@ -111,6 +111,7 @@ struct	in6_ifaddr {
 	struct	sockaddr_in6 ia_dstaddr; /* space for destination addr */
 	struct	sockaddr_in6 ia_prefixmask; /* prefix mask */
 	u_int32_t ia_plen;		/* prefix length */
+	/* DEPRECATED. Keep it to avoid breaking kvm(3) users */
 	struct	in6_ifaddr *ia_next;	/* next in6 list of IP6 addresses */
 	struct	in6_multihead ia6_multiaddrs;
 					/* list of multicast addresses */
@@ -127,6 +128,8 @@ struct	in6_ifaddr {
 
 	/* multicast addresses joined from the kernel */
 	LIST_HEAD(, in6_multi_mship) ia6_memberships;
+
+	struct pslist_entry	ia6_pslist_entry;
 };
 
 /* control structure to manage address selection policy */
@@ -490,7 +493,53 @@ extern pktqueue_t *ip6_pktq;
 
 MALLOC_DECLARE(M_IP6OPT);
 
-extern struct in6_ifaddr *in6_ifaddr;
+extern struct pslist_head in6_ifaddr_list;
+
+#define IN6_ADDRLIST_ENTRY_INIT(__ia) \
+	PSLIST_ENTRY_INIT((__ia), ia6_pslist_entry)
+#define IN6_ADDRLIST_READER_EMPTY() \
+	(PSLIST_READER_FIRST(&in6_ifaddr_list, struct in6_ifaddr, \
+	                     ia6_pslist_entry) == NULL)
+#define IN6_ADDRLIST_READER_FIRST() \
+	PSLIST_READER_FIRST(&in6_ifaddr_list, struct in6_ifaddr, \
+	                    ia6_pslist_entry)
+#define IN6_ADDRLIST_READER_NEXT(__ia) \
+	PSLIST_READER_NEXT((__ia), struct in6_ifaddr, ia6_pslist_entry)
+#define IN6_ADDRLIST_READER_FOREACH(__ia) \
+	PSLIST_READER_FOREACH((__ia), &in6_ifaddr_list, \
+	                      struct in6_ifaddr, ia6_pslist_entry)
+#define IN6_ADDRLIST_WRITER_INSERT_HEAD(__ia) \
+	PSLIST_WRITER_INSERT_HEAD(&in6_ifaddr_list, (__ia), ia6_pslist_entry)
+#define IN6_ADDRLIST_WRITER_REMOVE(__ia) \
+	PSLIST_WRITER_REMOVE((__ia), ia6_pslist_entry)
+#define IN6_ADDRLIST_WRITER_FOREACH(__ia) \
+	PSLIST_WRITER_FOREACH((__ia), &in6_ifaddr_list, struct in6_ifaddr, \
+	                      ia6_pslist_entry)
+#define IN6_ADDRLIST_WRITER_FIRST() \
+	PSLIST_WRITER_FIRST(&in6_ifaddr_list, struct in6_ifaddr, \
+	                    ia6_pslist_entry)
+#define IN6_ADDRLIST_WRITER_NEXT(__ia) \
+	PSLIST_WRITER_NEXT((__ia), struct in6_ifaddr, ia6_pslist_entry)
+#define IN6_ADDRLIST_WRITER_INSERT_AFTER(__ia, __new) \
+	PSLIST_WRITER_INSERT_AFTER((__ia), (__new), ia6_pslist_entry)
+#define IN6_ADDRLIST_WRITER_EMPTY() \
+	(PSLIST_WRITER_FIRST(&in6_ifaddr_list, struct in6_ifaddr, \
+	    ia6_pslist_entry) == NULL)
+#define IN6_ADDRLIST_WRITER_INSERT_TAIL(__new)				\
+	do {								\
+		if (IN6_ADDRLIST_WRITER_EMPTY()) {			\
+			IN6_ADDRLIST_WRITER_INSERT_HEAD((__new));	\
+		} else {						\
+			struct in6_ifaddr *__ia;			\
+			IN6_ADDRLIST_WRITER_FOREACH(__ia) {		\
+				if (IN6_ADDRLIST_WRITER_NEXT(__ia) == NULL) { \
+					IN6_ADDRLIST_WRITER_INSERT_AFTER(__ia,\
+					    (__new));			\
+					break;				\
+				}					\
+			}						\
+		}							\
+	} while (0)
 
 #define in6_ifstat_inc(ifp, tag) \
 do {								\
@@ -612,7 +661,7 @@ in6_next_multi(struct in6_multistep *ste
 	}
 	while (step->i_ia != NULL) {
 		in6m = LIST_FIRST(&step->i_ia->ia6_multiaddrs);
-		step->i_ia = step->i_ia->ia_next;
+		step->i_ia = IN6_ADDRLIST_READER_NEXT(step->i_ia);
 		if (in6m != NULL) {
 			step->i_in6m = LIST_NEXT(in6m, in6m_entry);
 			break;
@@ -624,7 +673,8 @@ in6_next_multi(struct in6_multistep *ste
 static inline struct in6_multi *
 in6_first_multi(struct in6_multistep *step)
 {						
-	step->i_ia = in6_ifaddr;		
+
+	step->i_ia = IN6_ADDRLIST_READER_FIRST();
 	step->i_in6m = NULL;			
 	return in6_next_multi(step);		
 }

Index: src/sys/netinet6/ip6_input.c
diff -u src/sys/netinet6/ip6_input.c:1.161 src/sys/netinet6/ip6_input.c:1.162
--- src/sys/netinet6/ip6_input.c:1.161	Wed Jun 22 07:48:17 2016
+++ src/sys/netinet6/ip6_input.c	Mon Jul  4 06:48:14 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip6_input.c,v 1.161 2016/06/22 07:48:17 ozaki-r Exp $	*/
+/*	$NetBSD: ip6_input.c,v 1.162 2016/07/04 06:48:14 ozaki-r Exp $	*/
 /*	$KAME: ip6_input.c,v 1.188 2001/03/29 05:34:31 itojun Exp $	*/
 
 /*
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip6_input.c,v 1.161 2016/06/22 07:48:17 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip6_input.c,v 1.162 2016/07/04 06:48:14 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_gateway.h"
@@ -133,7 +133,7 @@ __KERNEL_RCSID(0, "$NetBSD: ip6_input.c,
 extern struct domain inet6domain;
 
 u_char ip6_protox[IPPROTO_MAX];
-struct in6_ifaddr *in6_ifaddr;
+struct pslist_head		in6_ifaddr_list;
 pktqueue_t *ip6_pktq __read_mostly;
 
 int ip6_forward_srcrt;			/* XXX */
@@ -163,6 +163,8 @@ ip6_init(void)
 	const struct ip6protosw *pr;
 	int i;
 
+	PSLIST_INIT(&in6_ifaddr_list);
+
 	sysctl_net_inet6_ip6_setup(NULL);
 	pr = (const struct ip6protosw *)pffindproto(PF_INET6, IPPROTO_RAW, SOCK_RAW);
 	if (pr == 0)

Index: src/sys/netinet6/mld6.c
diff -u src/sys/netinet6/mld6.c:1.69 src/sys/netinet6/mld6.c:1.70
--- src/sys/netinet6/mld6.c:1.69	Wed Jun 22 07:48:17 2016
+++ src/sys/netinet6/mld6.c	Mon Jul  4 06:48:14 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: mld6.c,v 1.69 2016/06/22 07:48:17 ozaki-r Exp $	*/
+/*	$NetBSD: mld6.c,v 1.70 2016/07/04 06:48:14 ozaki-r Exp $	*/
 /*	$KAME: mld6.c,v 1.25 2001/01/16 14:14:18 itojun Exp $	*/
 
 /*
@@ -102,7 +102,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mld6.c,v 1.69 2016/06/22 07:48:17 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mld6.c,v 1.70 2016/07/04 06:48:14 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -742,7 +742,7 @@ in6_delmulti(struct in6_multi *in6m)
 		 * Delete all references of this multicasting group from
 		 * the membership arrays
 		 */
-		for (ia = in6_ifaddr; ia; ia = ia->ia_next) {
+		IN6_ADDRLIST_READER_FOREACH(ia) {
 			struct in6_multi_mship *imm;
 			LIST_FOREACH(imm, &ia->ia6_memberships, i6mm_chain) {
 				if (imm->i6mm_maddr == in6m)

Index: src/sys/netinet6/nd6.c
diff -u src/sys/netinet6/nd6.c:1.198 src/sys/netinet6/nd6.c:1.199
--- src/sys/netinet6/nd6.c:1.198	Thu Jun 30 01:34:53 2016
+++ src/sys/netinet6/nd6.c	Mon Jul  4 06:48:14 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: nd6.c,v 1.198 2016/06/30 01:34:53 ozaki-r Exp $	*/
+/*	$NetBSD: nd6.c,v 1.199 2016/07/04 06:48:14 ozaki-r Exp $	*/
 /*	$KAME: nd6.c,v 1.279 2002/06/08 11:16:51 itojun Exp $	*/
 
 /*
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nd6.c,v 1.198 2016/06/30 01:34:53 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nd6.c,v 1.199 2016/07/04 06:48:14 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_net_mpsafe.h"
@@ -583,8 +583,8 @@ nd6_timer(void *ignored_arg)
 	 * rather separate address lifetimes and prefix lifetimes.
 	 */
   addrloop:
-	for (ia6 = in6_ifaddr; ia6; ia6 = nia6) {
-		nia6 = ia6->ia_next;
+	for (ia6 = IN6_ADDRLIST_WRITER_FIRST(); ia6; ia6 = nia6) {
+		nia6 = IN6_ADDRLIST_WRITER_NEXT(ia6);
 		/* check address lifetime */
 		if (IFA6_IS_INVALID(ia6)) {
 			int regen = 0;
@@ -1781,9 +1781,10 @@ nd6_ioctl(u_long cmd, void *data, struct
 				continue; /* XXX */
 
 			/* do we really have to remove addresses as well? */
-			for (ia = in6_ifaddr; ia; ia = ia_next) {
+			for (ia = IN6_ADDRLIST_WRITER_FIRST(); ia;
+			     ia = ia_next) {
 				/* ia might be removed.  keep the next ptr. */
-				ia_next = ia->ia_next;
+				ia_next = IN6_ADDRLIST_WRITER_NEXT(ia);
 
 				if ((ia->ia6_flags & IN6_IFF_AUTOCONF) == 0)
 					continue;

Index: src/sys/netinet6/nd6_rtr.c
diff -u src/sys/netinet6/nd6_rtr.c:1.112 src/sys/netinet6/nd6_rtr.c:1.113
--- src/sys/netinet6/nd6_rtr.c:1.112	Wed Jun 15 06:01:21 2016
+++ src/sys/netinet6/nd6_rtr.c	Mon Jul  4 06:48:14 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: nd6_rtr.c,v 1.112 2016/06/15 06:01:21 ozaki-r Exp $	*/
+/*	$NetBSD: nd6_rtr.c,v 1.113 2016/07/04 06:48:14 ozaki-r Exp $	*/
 /*	$KAME: nd6_rtr.c,v 1.95 2001/02/07 08:09:47 itojun Exp $	*/
 
 /*
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nd6_rtr.c,v 1.112 2016/06/15 06:01:21 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nd6_rtr.c,v 1.113 2016/07/04 06:48:14 ozaki-r Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1538,7 +1538,7 @@ pfxlist_onlink_check(void)
 	 * always be attached.
 	 * The precise detection logic is same as the one for prefixes.
 	 */
-	for (ifa = in6_ifaddr; ifa; ifa = ifa->ia_next) {
+	IN6_ADDRLIST_READER_FOREACH(ifa) {
 		if (!(ifa->ia6_flags & IN6_IFF_AUTOCONF))
 			continue;
 
@@ -1555,7 +1555,7 @@ pfxlist_onlink_check(void)
 			break;
 	}
 	if (ifa) {
-		for (ifa = in6_ifaddr; ifa; ifa = ifa->ia_next) {
+		IN6_ADDRLIST_READER_FOREACH(ifa) {
 			if ((ifa->ia6_flags & IN6_IFF_AUTOCONF) == 0)
 				continue;
 
@@ -1582,7 +1582,7 @@ pfxlist_onlink_check(void)
 		}
 	}
 	else {
-		for (ifa = in6_ifaddr; ifa; ifa = ifa->ia_next) {
+		IN6_ADDRLIST_READER_FOREACH(ifa) {
 			if ((ifa->ia6_flags & IN6_IFF_AUTOCONF) == 0)
 				continue;
 
@@ -1937,7 +1937,7 @@ in6_tmpifadd(
 	 * there may be a time lag between generation of the ID and generation
 	 * of the address.  So, we'll do one more sanity check.
 	 */
-	for (ia = in6_ifaddr; ia; ia = ia->ia_next) {
+	IN6_ADDRLIST_READER_FOREACH(ia) {
 		if (IN6_ARE_ADDR_EQUAL(&ia->ia_addr.sin6_addr,
 		    &ifra.ifra_addr.sin6_addr)) {
 			if (trylimit-- == 0) {

Index: src/sys/netipsec/key.c
diff -u src/sys/netipsec/key.c:1.97 src/sys/netipsec/key.c:1.98
--- src/sys/netipsec/key.c:1.97	Mon Mar  7 13:08:48 2016
+++ src/sys/netipsec/key.c	Mon Jul  4 06:48:14 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: key.c,v 1.97 2016/03/07 13:08:48 christos Exp $	*/
+/*	$NetBSD: key.c,v 1.98 2016/07/04 06:48:14 ozaki-r Exp $	*/
 /*	$FreeBSD: src/sys/netipsec/key.c,v 1.3.2.3 2004/02/14 22:23:23 bms Exp $	*/
 /*	$KAME: key.c,v 1.191 2001/06/27 10:46:49 sakane Exp $	*/
 
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: key.c,v 1.97 2016/03/07 13:08:48 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: key.c,v 1.98 2016/07/04 06:48:14 ozaki-r Exp $");
 
 /*
  * This code is referd to RFC 2367
@@ -4160,10 +4160,10 @@ key_ismyaddr(const struct sockaddr *sa)
 static int
 key_ismyaddr6(const struct sockaddr_in6 *sin6)
 {
-	const struct in6_ifaddr *ia;
+	struct in6_ifaddr *ia;
 	const struct in6_multi *in6m;
 
-	for (ia = in6_ifaddr; ia; ia = ia->ia_next) {
+	IN6_ADDRLIST_READER_FOREACH(ia) {
 		if (key_sockaddrcmp((const struct sockaddr *)&sin6,
 		    (const struct sockaddr *)&ia->ia_addr, 0) == 0)
 			return 1;

Reply via email to