Hi David

On Mon, Apr 29, 2019 at 11:53:27AM +1000, David Gwynne wrote:
> it's always bothered me that i config areas on a crisco using a number,
> but then have to think hard to convert that number to an address for use
> in openbsd. eg, i was given area 700 in one place, which is 0.0.2.188
> as an address. super annoying.
> 
> so this changes the ospfd parser so it accepts both a number or address.
> i also changed it so it prints the number by default, which may be
> contentious. the manpage is slightly tweaked too.
> 
> thoughts?

I like it to be able to use a number instead of an address!

It worked fine in my short test I performed.

The output with the comment looks a bit strange to me.

typhoon ..sbin/ospfd$ doas obj/ospfd -nv 

router-id 0.0.0.7
fib-update yes
fib-priority 32
rfc1583compat no
spf-delay msec 1000
spf-holdtime msec 5000

area 7 { # 0.0.0.7
         ^^^^^^^^^
        interface pair7:10.77.77.1 {
                metric 10
                retransmit-interval 5
                router-dead-time 40


I'd prefer if we settle for one output format and then use only that. The
number format is more common but that would be a change for the users. I'm
fine with either format for outputs.

There is also "ospfctl show database area 0.0.0.0" and ospf6d. ;-)

Regards,
Remi


> 
> with this diff, i can do the following and things keep
> working:
> 
> --- /etc/ospfd.conf   Mon Apr 29 11:29:56 2019
> +++ /etc/ospfd.conf.new       Mon Apr 29 11:39:45 2019
> @@ -7,5 +7,5 @@
>  redistribute rtlabel "backup" set metric 65535
>  
> -area 0.0.2.188 {
> +area 700 {
>       router-dead-time minimal
>       fast-hello-interval msec 300
> 
> Index: ospfd.conf.5
> ===================================================================
> RCS file: /cvs/src/usr.sbin/ospfd/ospfd.conf.5,v
> retrieving revision 1.55
> diff -u -p -r1.55 ospfd.conf.5
> --- ospfd.conf.5      28 Dec 2018 19:25:10 -0000      1.55
> +++ ospfd.conf.5      29 Apr 2019 01:45:40 -0000
> @@ -68,7 +68,7 @@ Macros are not expanded inside quotes.
>  For example:
>  .Bd -literal -offset indent
>  hi="5"
> -area 0.0.0.0 {
> +area 0 {
>       interface em0 {
>               hello-interval $hi
>       }
> @@ -257,10 +257,10 @@ Areas are used for grouping interfaces.
>  All interface-specific parameters can
>  be configured per area, overruling the global settings.
>  .Bl -tag -width Ds
> -.It Ic area Ar address
> +.It Ic area Ar id Ns | Ns Ar address
>  Specify an area section, grouping one or more interfaces.
>  .Bd -literal -offset indent
> -area 0.0.0.0 {
> +area 0 {
>       interface em0
>       interface em1 {
>               metric 10
> Index: parse.y
> ===================================================================
> RCS file: /cvs/src/usr.sbin/ospfd/parse.y,v
> retrieving revision 1.95
> diff -u -p -r1.95 parse.y
> --- parse.y   13 Feb 2019 22:57:08 -0000      1.95
> +++ parse.y   29 Apr 2019 01:45:40 -0000
> @@ -120,6 +120,7 @@ typedef struct {
>               int64_t          number;
>               char            *string;
>               struct redistribute *redist;
> +             struct in_addr   id;
>       } v;
>       int lineno;
>  } YYSTYPE;
> @@ -145,6 +146,7 @@ typedef struct {
>  %type        <v.number>      deadtime
>  %type        <v.string>      string dependon
>  %type        <v.redist>      redistribute
> +%type        <v.id>          areaid
>  
>  %%
>  
> @@ -588,15 +590,8 @@ comma            : ','
>               | /*empty*/
>               ;
>  
> -area         : AREA STRING {
> -                     struct in_addr  id;
> -                     if (inet_aton($2, &id) == 0) {
> -                             yyerror("error parsing area");
> -                             free($2);
> -                             YYERROR;
> -                     }
> -                     free($2);
> -                     area = conf_get_area(id);
> +area         : AREA areaid {
> +                     area = conf_get_area($2);
>  
>                       memcpy(&areadefs, defs, sizeof(areadefs));
>                       md_list_copy(&areadefs.md_list, &defs->md_list);
> @@ -610,6 +605,23 @@ area             : AREA STRING {
>  
>  demotecount  : NUMBER        { $$ = $1; }
>               | /*empty*/     { $$ = 1; }
> +             ;
> +
> +areaid               : NUMBER {
> +                     if ($1 < 0 || $1 > 0xffffffff) {
> +                             yyerror("invalid area id");
> +                             YYERROR;
> +                     }
> +                     $$.s_addr = htonl($1);
> +             }
> +             | STRING {
> +                     if (inet_aton($1, &$$) == 0) {
> +                             yyerror("error parsing area");
> +                             free($1);
> +                             YYERROR;
> +                     }
> +                     free($1);
> +             }
>               ;
>  
>  areaopts_l   : areaopts_l areaoptsl nl
> Index: printconf.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/ospfd/printconf.c,v
> retrieving revision 1.20
> diff -u -p -r1.20 printconf.c
> --- printconf.c       28 Dec 2018 19:25:10 -0000      1.20
> +++ printconf.c       29 Apr 2019 01:45:40 -0000
> @@ -181,7 +181,8 @@ print_config(struct ospfd_conf *conf)
>       printf("\n");
>  
>       LIST_FOREACH(area, &conf->area_list, entry) {
> -             printf("area %s {\n", inet_ntoa(area->id));
> +             printf("area %u { # %s\n", ntohl(area->id.s_addr),
> +                 inet_ntoa(area->id));
>               if (area->stub) {
>                       printf("\tstub");
>                       if (SIMPLEQ_EMPTY(&area->redist_list))
> 

Reply via email to