<br><br><div class="gmail_quote">On Tue, Mar 8, 2011 at 1:16 PM, Mark Smith <span dir="ltr">&lt;<a href="mailto:radvd@02a76c927861ca7413a122f2a73a0d37.nosense.org">radvd@02a76c927861ca7413a122f2a73a0d37.nosense.org</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">Hi,<br>
<br>
I&#39;ve recently developed the following patch to implement<br>
per-prefix prefix deprecation. Here is the manual page text describing<br>
what this option does -<br>
<br>
<br>
       DeprecatePrefix on|off<br>
<br>
              Upon shutdown, this option will cause radvd to deprecate<br>
              the prefix by announcing it in the radvd  shutdown  RA<br>
              with  a  zero preferred lifetime and a valid lifetime<br>
              slightly greater than 2 hours. This will encourage<br>
              end-nodes using this prefix to deprecate any associated<br>
              addresses immediately. Note that  this option  should<br>
              only be used when only one router is announcing the<br>
              prefix onto the link, otherwise end- nodes will deprecate<br>
              associated addresses despite the prefix still being valid<br>
              for preferred use.<br>
<br>
              See RFC4861, section 5.5.3., &quot;Router Advertisement<br>
              Processing&quot;, part (e).<br>
<br>
              Default: off<br>
<br>
<br>
Hopefully it is useful and could be added to a future radvd<br>
release.<br>
<br>
Currently prefix deprecation only occurs upon shutdown. Ideally it<br>
should also occur when the configuration is reloaded via the HUP<br>
signal. However, to do that well that requires doing things such as<br>
identifying interfaces that are dead, are new and are changed in the<br>
configuration, and then sending out interim deprecate prefix RAs for<br>
the changed inferfaces. I&#39;ve started working on doing this and am<br>
around 40% though. However, it has turned out to be quite a bit of<br>
work so I thought I&#39;d send through a more fundamental version of<br>
the DeprecatePrefix option first. If this version is ok, I&#39;ll whip up<br>
deprecate flags for the other &quot;deprecatable&quot; options such as the Route<br>
Information Option.<br>
<br>
Regards,<br>
Mark.<br>
<br>
<br>
diff --git a/defaults.h b/defaults.h<br>
index 6b6fb31..bc714fa 100644<br>
--- a/defaults.h<br>
+++ b/defaults.h<br>
@@ -56,6 +56,7 @@<br>
 #define DFLT_AdvOnLinkFlag             1<br>
 #define DFLT_AdvPreferredLifetime      14400 /* seconds */<br>
 #define DFLT_AdvAutonomousFlag         1<br>
+#define DFLT_DeprecatePrefixFlag       0<br>
<br>
 /* Each route has an associated: */<br>
 #define DFLT_AdvRouteLifetime(iface)   (3 * (iface)-&gt;MaxRtrAdvInterval)<br>
@@ -122,6 +123,9 @@<br>
<br>
 #define MAX_PrefixLen                  128<br>
<br>
+/* SLAAC (RFC4862) Constants and Derived Values */<br>
+#define MIN_AdvValidLifetime           7203    /* slight &gt;2 hours in secs */<br>
+<br>
 /*<br>
  * Mobile IPv6 extensions, off by default<br>
  */<br>
diff --git a/gram.y b/gram.y<br>
index 17273f6..4b3d511 100644<br>
--- a/gram.y<br>
+++ b/gram.y<br>
@@ -95,6 +95,7 @@ static struct in6_addr get_prefix6(struct in6_addr const *addr, struct in6_addr<br>
 %token         T_AdvAutonomous<br>
 %token         T_AdvValidLifetime<br>
 %token         T_AdvPreferredLifetime<br>
+%token         T_DeprecatePrefix<br>
<br>
 %token         T_AdvRouterAddr<br>
 %token         T_AdvHomeAgentFlag<br>
@@ -561,6 +562,10 @@ prefixparms        : T_AdvOnLink SWITCH &#39;;&#39;<br>
                                        prefix-&gt;AdvPreferredLifetime = $2;<br>
                        }<br>
                }<br>
+               | T_DeprecatePrefix SWITCH &#39;;&#39;<br>
+               {<br>
+                       prefix-&gt;DeprecatePrefixFlag = $2;<br>
+               }<br>
                | T_Base6to4Interface name &#39;;&#39;<br>
                {<br>
                        if (prefix) {<br>
diff --git a/interface.c b/interface.c<br>
index 83a6104..f285a0b 100644<br>
--- a/interface.c<br>
+++ b/interface.c<br>
@@ -23,6 +23,8 @@ iface_init_defaults(struct Interface *iface)<br>
 {<br>
        memset(iface, 0, sizeof(struct Interface));<br>
<br>
+       iface-&gt;cease_adv          = 0;<br>
+<br>
        iface-&gt;HasFailed          = 0;<br>
        iface-&gt;IgnoreIfMissing    = DFLT_IgnoreIfMissing;<br>
        iface-&gt;AdvSendAdvert      = DFLT_AdvSendAdv;<br>
@@ -55,6 +57,7 @@ prefix_init_defaults(struct AdvPrefix *prefix)<br>
        prefix-&gt;AdvRouterAddr = DFLT_AdvRouterAddr;<br>
        prefix-&gt;AdvValidLifetime = DFLT_AdvValidLifetime;<br>
        prefix-&gt;AdvPreferredLifetime = DFLT_AdvPreferredLifetime;<br>
+       prefix-&gt;DeprecatePrefixFlag = DFLT_DeprecatePrefixFlag;<br>
        prefix-&gt;if6to4[0] = 0;<br>
        prefix-&gt;enabled = 1;<br>
 }<br>
diff --git a/radvd.c b/radvd.c<br>
index 4d762e9..7290f8a 100644<br>
--- a/radvd.c<br>
+++ b/radvd.c<br>
@@ -472,7 +472,7 @@ stop_adverts(void)<br>
                if( ! iface-&gt;UnicastOnly ) {<br>
                        if (iface-&gt;AdvSendAdvert) {<br>
                                /* send a final advertisement with zero Router Lifetime */<br>
-                               iface-&gt;AdvDefaultLifetime = 0;<br>
+                               iface-&gt;cease_adv = 1;<br>
                                send_ra_forall(iface, NULL);<br>
                        }<br>
                }<br>
diff --git a/radvd.conf.5.man b/radvd.conf.5.man<br>
index e7e8282..12ee26e 100644<br>
--- a/radvd.conf.5.man<br>
+++ b/radvd.conf.5.man<br>
@@ -423,6 +423,15 @@ Note: RFC4861&#39;s suggested default value is significantly longer: 7 days.<br>
 Default: 14400 seconds (4 hours)<br>
<br>
 .TP<br>
+.BR DeprecatePrefix &quot; &quot; on | off<br>
+<br>
+Upon shutdown, this option will cause radvd to deprecate the prefix by announcing it in the radvd shutdown RA with a zero preferred lifetime and a valid lifetime slightly greater than 2 hours. This will encourage end-nodes using this prefix to deprecate any associated addresses immediately. Note that this option should only be used when only one router is announcing the prefix onto the link, otherwise end-nodes will deprecate associated addresses despite the prefix still being valid for preferred use.<br>

+<br>
+See RFC4861, section 5.5.3., &quot;Router Advertisement Processing&quot;, part (e).<br>
+<br>
+Default: off<br>
+<br>
+.TP<br>
 .BR &quot;Base6to4Interface &quot; name<br>
<br>
 If this option is specified, this prefix will be combined with the<br>
diff --git a/radvd.h b/radvd.h<br>
index b08a8c6..178d259 100644<br>
--- a/radvd.h<br>
+++ b/radvd.h<br>
@@ -54,6 +54,8 @@ struct Interface {<br>
        int                     if_hwaddr_len;<br>
        int                     if_prefix_len;<br>
        int                     if_maxmtu;<br>
+<br>
+       int                     cease_adv;<br>
<br>
        int                     IgnoreIfMissing;<br>
        int                     AdvSendAdvert;<br>
@@ -109,6 +111,7 @@ struct AdvPrefix {<br>
        int                     AdvAutonomousFlag;<br>
        uint32_t                AdvValidLifetime;<br>
        uint32_t                AdvPreferredLifetime;<br>
+       int                     DeprecatePrefixFlag;<br>
<br>
        /* Mobile IPv6 extensions */<br>
        int                     AdvRouterAddr;<br>
diff --git a/scanner.l b/scanner.l<br>
index 3796010..69bf8f6 100644<br>
--- a/scanner.l<br>
+++ b/scanner.l<br>
@@ -69,6 +69,7 @@ AdvOnLink             { return T_AdvOnLink; }<br>
 AdvAutonomous          { return T_AdvAutonomous; }<br>
 AdvValidLifetime       { return T_AdvValidLifetime; }<br>
 AdvPreferredLifetime   { return T_AdvPreferredLifetime; }<br>
+DeprecatePrefix                { return T_DeprecatePrefix; }<br>
<br>
 AdvRouterAddr          { return T_AdvRouterAddr; }<br>
 AdvHomeAgentFlag       { return T_AdvHomeAgentFlag; }<br>
diff --git a/send.c b/send.c<br>
index 6c2aa24..e97950d 100644<br>
--- a/send.c<br>
+++ b/send.c<br>
@@ -160,8 +160,12 @@ send_ra(struct Interface *iface, struct in6_addr *dest)<br>
        radvert-&gt;nd_ra_flags_reserved   |=<br>
                (iface-&gt;AdvHomeAgentFlag)?ND_RA_FLAG_HOME_AGENT:0;<br>
<br>
-       /* if forwarding is disabled, send zero router lifetime */<br>
-       radvert-&gt;nd_ra_router_lifetime   =  !check_ip6_forwarding() ? htons(iface-&gt;AdvDefaultLifetime) : 0;<br>
+       if (iface-&gt;cease_adv) {<br>
+               radvert-&gt;nd_ra_router_lifetime = 0;<br>
+       } else {<br>
+               /* if forwarding is disabled, send zero router lifetime */<br>
+               radvert-&gt;nd_ra_router_lifetime   =  !check_ip6_forwarding() ? htons(iface-&gt;AdvDefaultLifetime) : 0;<br>
+       }<br>
        radvert-&gt;nd_ra_flags_reserved   |=<br>
                (iface-&gt;AdvDefaultPreference &lt;&lt; ND_OPT_RI_PRF_SHIFT) &amp; ND_OPT_RI_PRF_MASK;<br>
<br>
@@ -196,8 +200,15 @@ send_ra(struct Interface *iface, struct in6_addr *dest)<br>
                        pinfo-&gt;nd_opt_pi_flags_reserved |=<br>
                                (prefix-&gt;AdvRouterAddr)?ND_OPT_PI_FLAG_RADDR:0;<br>
<br>
-                       pinfo-&gt;nd_opt_pi_valid_time     = htonl(prefix-&gt;AdvValidLifetime);<br>
-                       pinfo-&gt;nd_opt_pi_preferred_time = htonl(prefix-&gt;AdvPreferredLifetime);<br>
+                       if (iface-&gt;cease_adv &amp;&amp; prefix-&gt;DeprecatePrefixFlag) {<br>
+                               /* RFC4862, 5.5.3, step e) */<br>
+                               pinfo-&gt;nd_opt_pi_valid_time     = htonl(MIN_AdvValidLifetime);<br>
+                               pinfo-&gt;nd_opt_pi_preferred_time = 0;<br>
+                       } else {<br>
+<br>
+                               pinfo-&gt;nd_opt_pi_valid_time     = htonl(prefix-&gt;AdvValidLifetime);<br>
+                               pinfo-&gt;nd_opt_pi_preferred_time = htonl(prefix-&gt;AdvPreferredLifetime);<br>
+                       }<br>
                        pinfo-&gt;nd_opt_pi_reserved2      = 0;<br>
<br>
                        memcpy(&amp;pinfo-&gt;nd_opt_pi_prefix, &amp;prefix-&gt;Prefix,<br>
<font color="#888888"><br>
<br>
--<br>
radvd-devel-l mailing list  :  <a href="mailto:radvd-devel-l@litech.org">radvd-devel-l@litech.org</a><br>
<a href="http://lists.litech.org/listinfo/radvd-devel-l" target="_blank">http://lists.litech.org/listinfo/radvd-devel-l</a><br>
</font></blockquote></div><br><br>Hi Mark,<br><br>Can you verify that this this is for RFC4861 Section 5.5.3?   RFC4862 section 5.5.3. has a &quot;Router Advertisement Processing&quot; and an &#39;e&#39; section.  Is this what you meant?<br>
<br>I&#39;m looking at...<br><br><a href="http://tools.ietf.org/html/rfc4861">http://tools.ietf.org/html/rfc4861</a><br><br>...and...<br><br><a href="http://tools.ietf.org/html/rfc4862">http://tools.ietf.org/html/rfc4862</a><br>
<br>Thanks,<br>Reuben<br>