On Fri, Jul 20, 2018 at 03:40:07PM +0200, Björn Ketelaars wrote:
> New diff, which addresses all your comments except the "no mtu" bit in
> the parser as I do not understand what you mean.

Never mind then :)

I was thinking about something like this:

----8<----
mtu 1480
interface ix0 # gets mtu 1480 option from global default
interface em0 {
        no mtu # do not send mtu option
}
----8<----

but that seems rather obscure. And can be achieved like this:

interface em0 { mtu 0 }

one tweak inline:

> 
> 
> diff --git frontend.c frontend.c
> index b06fa43038c..0509d2b3efe 100644
> --- frontend.c
> +++ frontend.c
> @@ -887,6 +887,7 @@ void
>  build_packet(struct ra_iface *ra_iface)
>  {
>       struct nd_router_advert         *ra;
> +     struct nd_opt_mtu               *ndopt_mtu;
>       struct nd_opt_prefix_info       *ndopt_pi;
>       struct ra_iface_conf            *ra_iface_conf;
>       struct ra_options_conf          *ra_options_conf;
> @@ -904,6 +905,8 @@ build_packet(struct ra_iface *ra_iface)
>       ra_options_conf = &ra_iface_conf->ra_options;
>  
>       len = sizeof(*ra);
> +     if (ra_options_conf->mtu > 0)
> +             len += sizeof(*ndopt_mtu);
>       len += sizeof(*ndopt_pi) * ra_iface->prefix_count;
>       if (ra_iface_conf->rdnss_count > 0)
>               len += sizeof(*ndopt_rdnss) + ra_iface_conf->rdnss_count *
> @@ -940,6 +943,15 @@ build_packet(struct ra_iface *ra_iface)
>       ra->nd_ra_retransmit = htonl(ra_options_conf->retrans_timer);
>       p += sizeof(*ra);
>  
> +     if (ra_options_conf->mtu > 0) {
> +             ndopt_mtu = (struct nd_opt_mtu *)p;
> +             ndopt_mtu->nd_opt_mtu_type = ND_OPT_MTU;
> +             ndopt_mtu->nd_opt_mtu_len = 1;
> +             ndopt_mtu->nd_opt_mtu_reserved = 0;
> +             ndopt_mtu->nd_opt_mtu_mtu = htonl(ra_options_conf->mtu);
> +             p += sizeof(*ndopt_mtu);
> +     }
> +
>       SIMPLEQ_FOREACH(ra_prefix_conf, &ra_iface->prefixes, entry) {
>               ndopt_pi = (struct nd_opt_prefix_info *)p;
>               memset(ndopt_pi, 0, sizeof(*ndopt_pi));
> diff --git parse.y parse.y
> index 582d165c7d6..6eb6990f97b 100644
> --- parse.y
> +++ parse.y
> @@ -115,7 +115,7 @@ typedef struct {
>  %token       DEFAULT ROUTER HOP LIMIT MANAGED ADDRESS
>  %token       CONFIGURATION OTHER LIFETIME REACHABLE TIME RETRANS TIMER
>  %token       AUTO PREFIX VALID PREFERRED LIFETIME ONLINK AUTONOMOUS
> -%token       ADDRESS_CONFIGURATION DNS RESOLVER SEARCH
> +%token       ADDRESS_CONFIGURATION DNS RESOLVER SEARCH MTU
>  
>  %token       <v.string>      STRING
>  %token       <v.number>      NUMBER
> @@ -209,6 +209,9 @@ ra_opt_block      : DEFAULT ROUTER yesno {
>               | RETRANS TIMER NUMBER {
>                       ra_options->retrans_timer = $3;
>               }
> +             | MTU NUMBER {
> +                     ra_options->mtu = $2;
> +             }
>               ;
>  
>  optnl                : '\n' optnl            /* zero or more newlines */
> @@ -423,6 +426,7 @@ lookup(char *s)
>               {"lifetime",            LIFETIME},
>               {"limit",               LIMIT},
>               {"managed",             MANAGED},
> +             {"mtu",                 MTU},
>               {"no",                  NO},
>               {"on-link",             ONLINK},
>               {"other",               OTHER},
> diff --git printconf.c printconf.c
> index 1fc8cd4ca3f..b7864dbae6b 100644
> --- printconf.c
> +++ printconf.c
> @@ -54,6 +54,7 @@ print_ra_options(const char *indent, const struct 
> ra_options_conf *ra_options)
>       printf("%srouter lifetime %d\n", indent, ra_options->router_lifetime);
>       printf("%sreachable time %u\n", indent, ra_options->reachable_time);
>       printf("%sretrans timer %u\n", indent, ra_options->retrans_timer);

please add
        if (ra_options->mtu)
to print mtu only when it's set. Since mtu 0 means to not send the option at 
all.

With that OK florian@
(note that I just caused a conflict for you in parse.y, sorry about that)

> +     printf("%smtu %u\n", indent, ra_options->mtu);
>  }
>  
>  void
> diff --git rad.c rad.c
> index 4652e1e0fb7..9f4be1b2190 100644
> --- rad.c
> +++ rad.c
> @@ -716,6 +716,7 @@ config_new_empty(void)
>       xconf->ra_options.router_lifetime = 1800;
>       xconf->ra_options.reachable_time = 0;
>       xconf->ra_options.retrans_timer = 0;
> +     xconf->ra_options.mtu = 0;
>  
>       return (xconf);
>  }
> diff --git rad.conf.5 rad.conf.5
> index 6ca6b3ef956..486bec24769 100644
> --- rad.conf.5
> +++ rad.conf.5
> @@ -87,6 +87,11 @@ The default is 1800 seconds.
>  .\" XXX
>  .\" .It Ic retrans timer Ar number
>  .\" XXX
> +.It Ic mtu Ar bytes
> +The MTU option is used in Router Advertisement messages to ensure that all
> +nodes on a link use the same MTU value in those cases where the link MTU
> +is not well known.
> +The default is 0, meaning unspecified by this router.
>  .El
>  .Sh INTERFACES
>  A list of interfaces to send advertisments on:
> diff --git rad.h rad.h
> index db80d7c772d..f9d26d66c9c 100644
> --- rad.h
> +++ rad.h
> @@ -76,7 +76,7 @@ enum imsg_type {
>       IMSG_SOCKET_IPC
>  };
>  
> -/* RFC 4861 Section 4.2 */
> +/* RFC 4861 Sections 4.2 and 4.6.4 */
>  struct ra_options_conf {
>       int             dfr;                    /* is default router? */
>       int             cur_hl;                 /* current hop limit */
> @@ -85,6 +85,7 @@ struct ra_options_conf {
>       int             router_lifetime;        /* default router lifetime */
>       uint32_t        reachable_time;
>       uint32_t        retrans_timer;
> +     uint32_t        mtu;
>  };
>  
>  /* RFC 4861 Section 4.6.2 */


-- 
I'm not entirely sure you are real.

Reply via email to