Module Name: src Committed By: ozaki-r Date: Thu Jul 31 06:35:47 UTC 2014
Modified Files: src/sys/net: if.c if.h src/sys/netinet6: nd6_rtr.c Log Message: Define IFADDR_FOREACH_SAFE for on-the-fly element removal in a loop We have to use it when we purge an address element in an ifaddr loop. This change restores the original behavior that was accidentally degraded. To generate a diff of this commit: cvs rdiff -u -r1.288 -r1.289 src/sys/net/if.c cvs rdiff -u -r1.173 -r1.174 src/sys/net/if.h cvs rdiff -u -r1.92 -r1.93 src/sys/netinet6/nd6_rtr.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/net/if.c diff -u src/sys/net/if.c:1.288 src/sys/net/if.c:1.289 --- src/sys/net/if.c:1.288 Wed Jul 30 13:32:09 2014 +++ src/sys/net/if.c Thu Jul 31 06:35:47 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: if.c,v 1.288 2014/07/30 13:32:09 ozaki-r Exp $ */ +/* $NetBSD: if.c,v 1.289 2014/07/31 06:35:47 ozaki-r Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2008 The NetBSD Foundation, Inc. @@ -90,7 +90,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.288 2014/07/30 13:32:09 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.289 2014/07/31 06:35:47 ozaki-r Exp $"); #include "opt_inet.h" @@ -697,9 +697,9 @@ if_deactivate(struct ifnet *ifp) void if_purgeaddrs(struct ifnet *ifp, int family, void (*purgeaddr)(struct ifaddr *)) { - struct ifaddr *ifa; + struct ifaddr *ifa, *nifa; - IFADDR_FOREACH(ifa, ifp) { + IFADDR_FOREACH_SAFE(ifa, ifp, nifa) { if (ifa->ifa_addr->sa_family != family) continue; (*purgeaddr)(ifa); Index: src/sys/net/if.h diff -u src/sys/net/if.h:1.173 src/sys/net/if.h:1.174 --- src/sys/net/if.h:1.173 Thu Jul 31 02:21:51 2014 +++ src/sys/net/if.h Thu Jul 31 06:35:47 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: if.h,v 1.173 2014/07/31 02:21:51 ozaki-r Exp $ */ +/* $NetBSD: if.h,v 1.174 2014/07/31 06:35:47 ozaki-r Exp $ */ /*- * Copyright (c) 1999, 2000, 2001 The NetBSD Foundation, Inc. @@ -988,6 +988,9 @@ __END_DECLS #define IFADDR_NEXT(__ifa) TAILQ_NEXT((__ifa), ifa_list) #define IFADDR_FOREACH(__ifa, __ifp) TAILQ_FOREACH(__ifa, \ &(__ifp)->if_addrlist, ifa_list) +#define IFADDR_FOREACH_SAFE(__ifa, __ifp, __nifa) \ + TAILQ_FOREACH_SAFE(__ifa, \ + &(__ifp)->if_addrlist, ifa_list, __nifa) #define IFADDR_EMPTY(__ifp) TAILQ_EMPTY(&(__ifp)->if_addrlist) extern struct ifnet_head ifnet_list; Index: src/sys/netinet6/nd6_rtr.c diff -u src/sys/netinet6/nd6_rtr.c:1.92 src/sys/netinet6/nd6_rtr.c:1.93 --- src/sys/netinet6/nd6_rtr.c:1.92 Fri Jul 25 07:12:55 2014 +++ src/sys/netinet6/nd6_rtr.c Thu Jul 31 06:35:47 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: nd6_rtr.c,v 1.92 2014/07/25 07:12:55 ozaki-r Exp $ */ +/* $NetBSD: nd6_rtr.c,v 1.93 2014/07/31 06:35:47 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.92 2014/07/25 07:12:55 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nd6_rtr.c,v 1.93 2014/07/31 06:35:47 ozaki-r Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -897,7 +897,7 @@ purge_detached(struct ifnet *ifp) { struct nd_prefix *pr, *pr_next; struct in6_ifaddr *ia; - struct ifaddr *ifa; + struct ifaddr *ifa, *ifa_next; for (pr = nd_prefix.lh_first; pr; pr = pr_next) { pr_next = pr->ndpr_next; @@ -915,7 +915,7 @@ purge_detached(struct ifnet *ifp) !LIST_EMPTY(&pr->ndpr_advrtrs))) continue; - IFADDR_FOREACH(ifa, ifp) { + IFADDR_FOREACH_SAFE(ifa, ifp, ifa_next) { if (ifa->ifa_addr->sa_family != AF_INET6) continue; ia = (struct in6_ifaddr *)ifa;