summaryrefslogtreecommitdiff
path: root/sys/netinet6/nd6.c
diff options
context:
space:
mode:
authorJun-ichiro itojun Hagino <itojun@cvs.openbsd.org>2001-02-23 08:01:16 +0000
committerJun-ichiro itojun Hagino <itojun@cvs.openbsd.org>2001-02-23 08:01:16 +0000
commitee92a78a07de28510ab421aa0f65f73975dd9542 (patch)
tree2c24df812578750baccca4717e73b044d0acea72 /sys/netinet6/nd6.c
parentc5972f77e51a502883d865719f0fe4e4f6c8685a (diff)
garbage-collect stale ND entries (default: 1 day).
RFC 2461 5.3. sync with kame.
Diffstat (limited to 'sys/netinet6/nd6.c')
-rw-r--r--sys/netinet6/nd6.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/sys/netinet6/nd6.c b/sys/netinet6/nd6.c
index 2a4df082f46..b50985c644b 100644
--- a/sys/netinet6/nd6.c
+++ b/sys/netinet6/nd6.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: nd6.c,v 1.28 2001/02/23 06:40:20 itojun Exp $ */
+/* $OpenBSD: nd6.c,v 1.29 2001/02/23 08:01:14 itojun Exp $ */
/* $KAME: nd6.c,v 1.131 2001/02/21 16:28:18 itojun Exp $ */
/*
@@ -84,6 +84,7 @@ int nd6_delay = 5; /* delay first probe time 5 second */
int nd6_umaxtries = 3; /* maximum unicast query */
int nd6_mmaxtries = 3; /* maximum multicast query */
int nd6_useloopback = 1; /* use loopback interface for local traffic */
+int nd6_gctimer = (60 * 60 * 24); /* 1 day: garbage collection timer */
/* preventing too many loops in ND option parsing */
int nd6_maxndopt = 10; /* max # of ND options allowed */
@@ -474,13 +475,18 @@ nd6_timer(ignored_arg)
}
break;
case ND6_LLINFO_REACHABLE:
- if (ln->ln_expire)
+ if (ln->ln_expire) {
ln->ln_state = ND6_LLINFO_STALE;
+ ln->ln_expire = time_second + nd6_gctimer;
+ }
break;
- /*
- * ND6_LLINFO_STALE state requires nothing for timer
- * routine.
- */
+
+ case ND6_LLINFO_STALE:
+ /* Garbage Collection(RFC 2461 5.3) */
+ if (ln->ln_expire)
+ next = nd6_free(rt);
+ break;
+
case ND6_LLINFO_DELAY:
if (ndi && (ndi->flags & ND6_IFF_PERFORMNUD) != 0) {
/* We need NUD */
@@ -491,8 +497,10 @@ nd6_timer(ignored_arg)
nd6_ns_output(ifp, &dst->sin6_addr,
&dst->sin6_addr,
ln, 0);
- } else
+ } else {
ln->ln_state = ND6_LLINFO_STALE; /* XXX */
+ ln->ln_expire = time_second + nd6_gctimer;
+ }
break;
case ND6_LLINFO_PROBE:
if (ln->ln_asked < nd6_umaxtries) {
@@ -1650,6 +1658,7 @@ fail:
#endif
ln->ln_hold = 0;
}
+ ln->ln_expire = time_second + nd6_gctimer;
} else if (ln->ln_state == ND6_LLINFO_INCOMPLETE) {
/* probe right away */
ln->ln_expire = time_second;
@@ -1878,8 +1887,10 @@ nd6_output(ifp, origifp, m0, dst, rt0)
/* We don't have to do link-layer address resolution on a p2p link. */
if ((ifp->if_flags & IFF_POINTOPOINT) != 0 &&
- ln->ln_state < ND6_LLINFO_REACHABLE)
+ ln->ln_state < ND6_LLINFO_REACHABLE) {
ln->ln_state = ND6_LLINFO_STALE;
+ ln->ln_expire = time_second + nd6_gctimer;
+ }
/*
* The first time we send a packet to a neighbor whose entry is