Module Name: src
Committed By: ozaki-r
Date: Wed Nov 18 02:51:11 UTC 2015
Modified Files:
src/sys/netinet6: nd6.c
Log Message:
Unify nd6_ns_output calls in nd6_llinfo_timer
Inspired by FreeBSD
To generate a diff of this commit:
cvs rdiff -u -r1.177 -r1.178 src/sys/netinet6/nd6.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/netinet6/nd6.c
diff -u src/sys/netinet6/nd6.c:1.177 src/sys/netinet6/nd6.c:1.178
--- src/sys/netinet6/nd6.c:1.177 Fri Sep 11 10:33:32 2015
+++ src/sys/netinet6/nd6.c Wed Nov 18 02:51:11 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: nd6.c,v 1.177 2015/09/11 10:33:32 roy Exp $ */
+/* $NetBSD: nd6.c,v 1.178 2015/11/18 02:51:11 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.177 2015/09/11 10:33:32 roy Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nd6.c,v 1.178 2015/11/18 02:51:11 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_net_mpsafe.h"
@@ -438,6 +438,8 @@ nd6_llinfo_timer(void *arg)
const struct sockaddr_in6 *dst;
struct ifnet *ifp;
struct nd_ifinfo *ndi = NULL;
+ bool send_ns = false;
+ const struct in6_addr *daddr6 = NULL;
mutex_enter(softnet_lock);
KERNEL_LOCK(1, NULL);
@@ -470,8 +472,7 @@ nd6_llinfo_timer(void *arg)
case ND6_LLINFO_INCOMPLETE:
if (ln->ln_asked < nd6_mmaxtries) {
ln->ln_asked++;
- nd6_llinfo_settimer(ln, (long)ndi->retrans * hz / 1000);
- nd6_ns_output(ifp, NULL, &dst->sin6_addr, ln, 0);
+ send_ns = true;
} else {
struct mbuf *m = ln->ln_hold;
if (m) {
@@ -514,9 +515,8 @@ nd6_llinfo_timer(void *arg)
/* We need NUD */
ln->ln_asked = 1;
ln->ln_state = ND6_LLINFO_PROBE;
- nd6_llinfo_settimer(ln, (long)ndi->retrans * hz / 1000);
- nd6_ns_output(ifp, &dst->sin6_addr,
- &dst->sin6_addr, ln, 0);
+ daddr6 = &dst->sin6_addr;
+ send_ns = true;
} else {
ln->ln_state = ND6_LLINFO_STALE; /* XXX */
nd6_llinfo_settimer(ln, (long)nd6_gctimer * hz);
@@ -525,9 +525,8 @@ nd6_llinfo_timer(void *arg)
case ND6_LLINFO_PROBE:
if (ln->ln_asked < nd6_umaxtries) {
ln->ln_asked++;
- nd6_llinfo_settimer(ln, (long)ndi->retrans * hz / 1000);
- nd6_ns_output(ifp, &dst->sin6_addr,
- &dst->sin6_addr, ln, 0);
+ daddr6 = &dst->sin6_addr;
+ send_ns = true;
} else {
(void)nd6_free(rt, 0);
ln = NULL;
@@ -535,6 +534,11 @@ nd6_llinfo_timer(void *arg)
break;
}
+ if (send_ns) {
+ nd6_llinfo_settimer(ln, (long)ndi->retrans * hz / 1000);
+ nd6_ns_output(ifp, daddr6, &dst->sin6_addr, ln, 0);
+ }
+
KERNEL_UNLOCK_ONE(NULL);
mutex_exit(softnet_lock);
}