[radvd-devel-l] DeprecatePrefix option

Reuben Hawkins reubenhwk at gmail.com
Wed Mar 9 00:07:23 EST 2011


On Tue, Mar 8, 2011 at 1:16 PM, Mark Smith <
radvd at 02a76c927861ca7413a122f2a73a0d37.nosense.org> wrote:

> Hi,
>
> I've recently developed the following patch to implement
> per-prefix prefix deprecation. Here is the manual page text describing
> what this option does -
>
>
>       DeprecatePrefix on|off
>
>              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.
>
>              See RFC4861, section 5.5.3., "Router Advertisement
>              Processing", part (e).
>
>              Default: off
>
>
> Hopefully it is useful and could be added to a future radvd
> release.
>
> Currently prefix deprecation only occurs upon shutdown. Ideally it
> should also occur when the configuration is reloaded via the HUP
> signal. However, to do that well that requires doing things such as
> identifying interfaces that are dead, are new and are changed in the
> configuration, and then sending out interim deprecate prefix RAs for
> the changed inferfaces. I've started working on doing this and am
> around 40% though. However, it has turned out to be quite a bit of
> work so I thought I'd send through a more fundamental version of
> the DeprecatePrefix option first. If this version is ok, I'll whip up
> deprecate flags for the other "deprecatable" options such as the Route
> Information Option.
>
> Regards,
> Mark.
>
>
> diff --git a/defaults.h b/defaults.h
> index 6b6fb31..bc714fa 100644
> --- a/defaults.h
> +++ b/defaults.h
> @@ -56,6 +56,7 @@
>  #define DFLT_AdvOnLinkFlag             1
>  #define DFLT_AdvPreferredLifetime      14400 /* seconds */
>  #define DFLT_AdvAutonomousFlag         1
> +#define DFLT_DeprecatePrefixFlag       0
>
>  /* Each route has an associated: */
>  #define DFLT_AdvRouteLifetime(iface)   (3 * (iface)->MaxRtrAdvInterval)
> @@ -122,6 +123,9 @@
>
>  #define MAX_PrefixLen                  128
>
> +/* SLAAC (RFC4862) Constants and Derived Values */
> +#define MIN_AdvValidLifetime           7203    /* slight >2 hours in secs
> */
> +
>  /*
>  * Mobile IPv6 extensions, off by default
>  */
> diff --git a/gram.y b/gram.y
> index 17273f6..4b3d511 100644
> --- a/gram.y
> +++ b/gram.y
> @@ -95,6 +95,7 @@ static struct in6_addr get_prefix6(struct in6_addr const
> *addr, struct in6_addr
>  %token         T_AdvAutonomous
>  %token         T_AdvValidLifetime
>  %token         T_AdvPreferredLifetime
> +%token         T_DeprecatePrefix
>
>  %token         T_AdvRouterAddr
>  %token         T_AdvHomeAgentFlag
> @@ -561,6 +562,10 @@ prefixparms        : T_AdvOnLink SWITCH ';'
>                                        prefix->AdvPreferredLifetime = $2;
>                        }
>                }
> +               | T_DeprecatePrefix SWITCH ';'
> +               {
> +                       prefix->DeprecatePrefixFlag = $2;
> +               }
>                | T_Base6to4Interface name ';'
>                {
>                        if (prefix) {
> diff --git a/interface.c b/interface.c
> index 83a6104..f285a0b 100644
> --- a/interface.c
> +++ b/interface.c
> @@ -23,6 +23,8 @@ iface_init_defaults(struct Interface *iface)
>  {
>        memset(iface, 0, sizeof(struct Interface));
>
> +       iface->cease_adv          = 0;
> +
>        iface->HasFailed          = 0;
>        iface->IgnoreIfMissing    = DFLT_IgnoreIfMissing;
>        iface->AdvSendAdvert      = DFLT_AdvSendAdv;
> @@ -55,6 +57,7 @@ prefix_init_defaults(struct AdvPrefix *prefix)
>        prefix->AdvRouterAddr = DFLT_AdvRouterAddr;
>        prefix->AdvValidLifetime = DFLT_AdvValidLifetime;
>        prefix->AdvPreferredLifetime = DFLT_AdvPreferredLifetime;
> +       prefix->DeprecatePrefixFlag = DFLT_DeprecatePrefixFlag;
>        prefix->if6to4[0] = 0;
>        prefix->enabled = 1;
>  }
> diff --git a/radvd.c b/radvd.c
> index 4d762e9..7290f8a 100644
> --- a/radvd.c
> +++ b/radvd.c
> @@ -472,7 +472,7 @@ stop_adverts(void)
>                if( ! iface->UnicastOnly ) {
>                        if (iface->AdvSendAdvert) {
>                                /* send a final advertisement with zero
> Router Lifetime */
> -                               iface->AdvDefaultLifetime = 0;
> +                               iface->cease_adv = 1;
>                                send_ra_forall(iface, NULL);
>                        }
>                }
> diff --git a/radvd.conf.5.man b/radvd.conf.5.man
> index e7e8282..12ee26e 100644
> --- a/radvd.conf.5.man
> +++ b/radvd.conf.5.man
> @@ -423,6 +423,15 @@ Note: RFC4861's suggested default value is
> significantly longer: 7 days.
>  Default: 14400 seconds (4 hours)
>
>  .TP
> +.BR DeprecatePrefix " " on | off
> +
> +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.
> +
> +See RFC4861, section 5.5.3., "Router Advertisement Processing", part (e).
> +
> +Default: off
> +
> +.TP
>  .BR "Base6to4Interface " name
>
>  If this option is specified, this prefix will be combined with the
> diff --git a/radvd.h b/radvd.h
> index b08a8c6..178d259 100644
> --- a/radvd.h
> +++ b/radvd.h
> @@ -54,6 +54,8 @@ struct Interface {
>        int                     if_hwaddr_len;
>        int                     if_prefix_len;
>        int                     if_maxmtu;
> +
> +       int                     cease_adv;
>
>        int                     IgnoreIfMissing;
>        int                     AdvSendAdvert;
> @@ -109,6 +111,7 @@ struct AdvPrefix {
>        int                     AdvAutonomousFlag;
>        uint32_t                AdvValidLifetime;
>        uint32_t                AdvPreferredLifetime;
> +       int                     DeprecatePrefixFlag;
>
>        /* Mobile IPv6 extensions */
>        int                     AdvRouterAddr;
> diff --git a/scanner.l b/scanner.l
> index 3796010..69bf8f6 100644
> --- a/scanner.l
> +++ b/scanner.l
> @@ -69,6 +69,7 @@ AdvOnLink             { return T_AdvOnLink; }
>  AdvAutonomous          { return T_AdvAutonomous; }
>  AdvValidLifetime       { return T_AdvValidLifetime; }
>  AdvPreferredLifetime   { return T_AdvPreferredLifetime; }
> +DeprecatePrefix                { return T_DeprecatePrefix; }
>
>  AdvRouterAddr          { return T_AdvRouterAddr; }
>  AdvHomeAgentFlag       { return T_AdvHomeAgentFlag; }
> diff --git a/send.c b/send.c
> index 6c2aa24..e97950d 100644
> --- a/send.c
> +++ b/send.c
> @@ -160,8 +160,12 @@ send_ra(struct Interface *iface, struct in6_addr
> *dest)
>        radvert->nd_ra_flags_reserved   |=
>                (iface->AdvHomeAgentFlag)?ND_RA_FLAG_HOME_AGENT:0;
>
> -       /* if forwarding is disabled, send zero router lifetime */
> -       radvert->nd_ra_router_lifetime   =  !check_ip6_forwarding() ?
> htons(iface->AdvDefaultLifetime) : 0;
> +       if (iface->cease_adv) {
> +               radvert->nd_ra_router_lifetime = 0;
> +       } else {
> +               /* if forwarding is disabled, send zero router lifetime */
> +               radvert->nd_ra_router_lifetime   =  !check_ip6_forwarding()
> ? htons(iface->AdvDefaultLifetime) : 0;
> +       }
>        radvert->nd_ra_flags_reserved   |=
>                (iface->AdvDefaultPreference << ND_OPT_RI_PRF_SHIFT) &
> ND_OPT_RI_PRF_MASK;
>
> @@ -196,8 +200,15 @@ send_ra(struct Interface *iface, struct in6_addr
> *dest)
>                        pinfo->nd_opt_pi_flags_reserved |=
>
>  (prefix->AdvRouterAddr)?ND_OPT_PI_FLAG_RADDR:0;
>
> -                       pinfo->nd_opt_pi_valid_time     =
> htonl(prefix->AdvValidLifetime);
> -                       pinfo->nd_opt_pi_preferred_time =
> htonl(prefix->AdvPreferredLifetime);
> +                       if (iface->cease_adv &&
> prefix->DeprecatePrefixFlag) {
> +                               /* RFC4862, 5.5.3, step e) */
> +                               pinfo->nd_opt_pi_valid_time     =
> htonl(MIN_AdvValidLifetime);
> +                               pinfo->nd_opt_pi_preferred_time = 0;
> +                       } else {
> +
> +                               pinfo->nd_opt_pi_valid_time     =
> htonl(prefix->AdvValidLifetime);
> +                               pinfo->nd_opt_pi_preferred_time =
> htonl(prefix->AdvPreferredLifetime);
> +                       }
>                        pinfo->nd_opt_pi_reserved2      = 0;
>
>                        memcpy(&pinfo->nd_opt_pi_prefix, &prefix->Prefix,
>
>
> --
> radvd-devel-l mailing list  :  radvd-devel-l at litech.org
> http://lists.litech.org/listinfo/radvd-devel-l
>


Hi Mark,

Can you verify that this this is for RFC4861 Section 5.5.3?   RFC4862
section 5.5.3. has a "Router Advertisement Processing" and an 'e' section.
Is this what you meant?

I'm looking at...

http://tools.ietf.org/html/rfc4861

...and...

http://tools.ietf.org/html/rfc4862

Thanks,
Reuben
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.litech.org/pipermail/radvd-devel-l/attachments/20110308/fc4d97a1/attachment-0001.html>


More information about the radvd-devel-l mailing list