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 [email protected] -- 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;