On Sun, Jan 12, 2020 at 03:46:15PM +0100, Remi Locherer wrote:
> On Wed, Jan 08, 2020 at 01:13:45PM +0100, Denis Fondras wrote:
> > On Wed, Jan 08, 2020 at 09:14:48AM +0100, Remi Locherer wrote:
> > > > I have a diff to allow parameters after interface or area definition.
> > > > Not sure if we want to do that though.
> > > 
> > > I would appreciate that! ;-)
> > > 
> > 
> > The ospfd diff needs some more work. Crypt authentication handling is not
> > perfect.
> 
> This works fine for me and the diff reads good. I tested ospfd and ospf6d.
> Also the crypt options for ospfd worked fine.
> 
> ok remi@

Currently all daemons behave the same way and inherit at the moment of
creation. Having this behave different between daemons is confusing.
At least ospfd and bgpd should behave the same. Not saying that the
current behaviour is great.
I think in the case of ospfd the way auth-md is handled by this diff is
not comparable with the behaviour of the other settings.

area 0.0.0.0 {
        hello-interval 10
        auth-md 1 foo

        interface em0

        hello-interval 20
        auth-md 1 bar
        auth-md 2 foofoo

        interface em1 {
                auth-md 3 barbar
        }

        hello-interval 30
        auth-md 1 bay
        auth-md 2 foobar
}

What values for hello-interval and auth-md should be set on em0 and em1?
 
> > 
> > Index: ospf6d/ospf6d.h
> > ===================================================================
> > RCS file: /cvs/src/usr.sbin/ospf6d/ospf6d.h,v
> > retrieving revision 1.44
> > diff -u -p -r1.44 ospf6d.h
> > --- ospf6d/ospf6d.h 3 Jan 2020 17:45:02 -0000       1.44
> > +++ ospf6d/ospf6d.h 8 Jan 2020 12:11:20 -0000
> > @@ -328,7 +328,7 @@ struct iface {
> >     enum iface_type          type;
> >     u_int8_t                 if_type;
> >     u_int8_t                 linkstate;
> > -   u_int8_t                 priority;
> > +   int16_t                  priority;
> >     u_int8_t                 p2p;
> >     u_int8_t                 cflags;
> >  #define F_IFACE_PASSIVE            0x01
> > Index: ospf6d/parse.y
> > ===================================================================
> > RCS file: /cvs/src/usr.sbin/ospf6d/parse.y,v
> > retrieving revision 1.48
> > diff -u -p -r1.48 parse.y
> > --- ospf6d/parse.y  26 Dec 2019 10:24:18 -0000      1.48
> > +++ ospf6d/parse.y  8 Jan 2020 12:11:20 -0000
> > @@ -101,7 +101,7 @@ struct config_defaults {
> >     u_int16_t       hello_interval;
> >     u_int16_t       rxmt_interval;
> >     u_int16_t       metric;
> > -   u_int8_t        priority;
> > +   int16_t         priority;
> >  };
> >  
> >  struct config_defaults      globaldefs;
> > @@ -111,6 +111,7 @@ struct config_defaults  *defs;
> >  
> >  struct area        *conf_get_area(struct in_addr);
> >  int                 conf_check_rdomain(u_int);
> > +void                iface_settings(struct iface *, struct config_defaults 
> > *);
> >  
> >  typedef struct {
> >     union {
> > @@ -465,9 +466,14 @@ comma          : ','
> >  area               : AREA areaid {
> >                     area = conf_get_area($2);
> >  
> > -                   memcpy(&areadefs, defs, sizeof(areadefs));
> > +                   memset(&areadefs, 0, sizeof(areadefs));
> > +                   areadefs.priority = -1;
> >                     defs = &areadefs;
> >             } '{' optnl areaopts_l '}' {
> > +                   struct iface    *i;
> > +                   LIST_FOREACH(i, &area->iface_list, entry) {
> > +                           iface_settings(i, &areadefs);
> > +                   }
> >                     area = NULL;
> >                     defs = &globaldefs;
> >             }
> > @@ -540,15 +546,12 @@ interface     : INTERFACE STRING      {
> >                     iface->area = area;
> >                     LIST_INSERT_HEAD(&area->iface_list, iface, entry);
> >  
> > -                   memcpy(&ifacedefs, defs, sizeof(ifacedefs));
> > +                   memset(&ifacedefs, 0, sizeof(ifacedefs));
> > +                   ifacedefs.priority = -1;
> >                     defs = &ifacedefs;
> >             } interface_block {
> > -                   iface->dead_interval = defs->dead_interval;
> > -                   iface->transmit_delay = defs->transmit_delay;
> > -                   iface->hello_interval = defs->hello_interval;
> > -                   iface->rxmt_interval = defs->rxmt_interval;
> > -                   iface->metric = defs->metric;
> > -                   iface->priority = defs->priority;
> > +                   iface->priority = -1;
> > +                   iface_settings(iface, defs);
> >                     iface->cflags |= F_IFACE_CONFIGURED;
> >                     iface = NULL;
> >                     /* interface is always part of an area */
> > @@ -1018,6 +1021,8 @@ popfile(void)
> >  struct ospfd_conf *
> >  parse_config(char *filename, int opts)
> >  {
> > +   struct area     *a;
> > +   struct iface    *i;
> >     struct sym      *sym, *next;
> >  
> >     if ((conf = calloc(1, sizeof(struct ospfd_conf))) == NULL)
> > @@ -1068,6 +1073,10 @@ parse_config(char *filename, int opts)
> >             }
> >     }
> >  
> > +   LIST_FOREACH(a, &conf->area_list, entry)
> > +           LIST_FOREACH(i, &a->iface_list, entry)
> > +                   iface_settings(i, defs);
> > +   
> >     /* check that all interfaces belong to the configured rdomain */
> >     errors += conf_check_rdomain(conf->rdomain);
> >  
> > @@ -1319,4 +1328,21 @@ prefix(const char *s, struct in6_addr *a
> >     }
> >     *plen = 128;
> >     return (host(s, addr));
> > +}
> > +
> > +void
> > +iface_settings(struct iface *i, struct config_defaults *cfg)
> > +{
> > +   if (i->dead_interval == 0)
> > +           i->dead_interval = cfg->dead_interval;
> > +   if (i->transmit_delay == 0)
> > +           i->transmit_delay = cfg->transmit_delay;
> > +   if (i->hello_interval == 0)
> > +           i->hello_interval = cfg->hello_interval;
> > +   if (i->rxmt_interval == 0)
> > +           i->rxmt_interval = cfg->rxmt_interval;
> > +   if (i->metric == 0)
> > +           i->metric = cfg->metric;
> > +   if (i->priority == -1)
> > +           i->priority = cfg->priority;
> >  }
> > Index: ospfd/logmsg.c
> > ===================================================================
> > RCS file: /cvs/src/usr.sbin/ospfd/logmsg.c,v
> > retrieving revision 1.1
> > diff -u -p -r1.1 logmsg.c
> > --- ospfd/logmsg.c  2 Sep 2016 14:04:25 -0000       1.1
> > +++ ospfd/logmsg.c  8 Jan 2020 12:11:20 -0000
> > @@ -101,15 +101,13 @@ const char *
> >  if_auth_name(enum auth_type type)
> >  {
> >     switch (type) {
> > -   case AUTH_NONE:
> > -           return ("none");
> >     case AUTH_SIMPLE:
> >             return ("simple");
> >     case AUTH_CRYPT:
> >             return ("crypt");
> > +   default:
> > +           return ("none");
> >     }
> > -   /* NOTREACHED */
> > -   return ("unknown");
> >  }
> >  
> >  const char *
> > Index: ospfd/ospf.h
> > ===================================================================
> > RCS file: /cvs/src/usr.sbin/ospfd/ospf.h,v
> > retrieving revision 1.23
> > diff -u -p -r1.23 ospf.h
> > --- ospfd/ospf.h    17 Jan 2013 09:14:15 -0000      1.23
> > +++ ospfd/ospf.h    8 Jan 2020 12:11:20 -0000
> > @@ -102,10 +102,6 @@
> >  #define PACKET_TYPE_LS_ACK 5
> >  
> >  /* OSPF auth types */
> > -#define    AUTH_TYPE_NONE          0
> > -#define AUTH_TYPE_SIMPLE   1
> > -#define    AUTH_TYPE_CRYPT         2
> > -
> >  #define MIN_AUTHTYPE               0
> >  #define MAX_AUTHTYPE               2
> >  
> > Index: ospfd/ospfd.h
> > ===================================================================
> > RCS file: /cvs/src/usr.sbin/ospfd/ospfd.h,v
> > retrieving revision 1.105
> > diff -u -p -r1.105 ospfd.h
> > --- ospfd/ospfd.h   19 Nov 2019 09:55:55 -0000      1.105
> > +++ ospfd/ospfd.h   8 Jan 2020 12:11:20 -0000
> > @@ -275,6 +275,7 @@ enum nbr_action {
> >  
> >  /* auth types */
> >  enum auth_type {
> > +   AUTH_UNSET = -1,
> >     AUTH_NONE,
> >     AUTH_SIMPLE,
> >     AUTH_CRYPT
> > @@ -360,9 +361,9 @@ struct iface {
> >     enum iface_type          type;
> >     enum auth_type           auth_type;
> >     u_int8_t                 if_type;
> > -   u_int8_t                 auth_keyid;
> > +   int16_t                  auth_keyid;
> >     u_int8_t                 linkstate;
> > -   u_int8_t                 priority;
> > +   int16_t                  priority;
> >     u_int8_t                 passive;
> >     u_int8_t                 p2p;
> >  };
> > Index: ospfd/parse.y
> > ===================================================================
> > RCS file: /cvs/src/usr.sbin/ospfd/parse.y,v
> > retrieving revision 1.99
> > diff -u -p -r1.99 parse.y
> > --- ospfd/parse.y   19 Nov 2019 09:55:55 -0000      1.99
> > +++ ospfd/parse.y   8 Jan 2020 12:11:20 -0000
> > @@ -101,8 +101,8 @@ struct config_defaults {
> >     u_int16_t       rxmt_interval;
> >     u_int16_t       metric;
> >     enum auth_type  auth_type;
> > -   u_int8_t        auth_keyid;
> > -   u_int8_t        priority;
> > +   int16_t         auth_keyid;
> > +   int16_t         priority;
> >  };
> >  
> >  struct config_defaults      globaldefs;
> > @@ -113,6 +113,7 @@ struct config_defaults  *defs;
> >  struct area        *conf_get_area(struct in_addr);
> >  struct iface       *conf_get_if(struct kif *, struct kif_addr *);
> >  int                 conf_check_rdomain(unsigned int);
> > +void                iface_settings(struct iface *, struct config_defaults 
> > *);
> >  
> >  typedef struct {
> >     union {
> > @@ -592,10 +593,17 @@ comma         : ','
> >  area               : AREA areaid {
> >                     area = conf_get_area($2);
> >  
> > -                   memcpy(&areadefs, defs, sizeof(areadefs));
> > -                   md_list_copy(&areadefs.md_list, &defs->md_list);
> > +                   memset(&areadefs, 0, sizeof(areadefs));
> > +                   areadefs.priority = -1;
> > +                   areadefs.auth_keyid = -1;
> > +                   areadefs.auth_type = AUTH_UNSET;
> > +                   TAILQ_INIT(&areadefs.md_list);
> >                     defs = &areadefs;
> >             } '{' optnl areaopts_l '}' {
> > +                   struct iface    *i;
> > +                   LIST_FOREACH(i, &area->iface_list, entry) {
> > +                           iface_settings(i, &areadefs);
> > +                   }
> >                     area = NULL;
> >                     md_list_clr(&defs->md_list);
> >                     defs = &globaldefs;
> > @@ -707,25 +715,17 @@ interface     : INTERFACE STRING      {
> >                     iface->area = area;
> >                     LIST_INSERT_HEAD(&area->iface_list, iface, entry);
> >  
> > -                   memcpy(&ifacedefs, defs, sizeof(ifacedefs));
> > -                   md_list_copy(&ifacedefs.md_list, &defs->md_list);
> > +                   memset(&ifacedefs, 0, sizeof(ifacedefs));
> > +                   ifacedefs.priority = -1;
> > +                   ifacedefs.auth_keyid = -1;
> > +                   ifacedefs.auth_type = AUTH_UNSET;
> > +                   TAILQ_INIT(&ifacedefs.md_list);
> >                     defs = &ifacedefs;
> >             } interface_block {
> > -                   iface->dead_interval = defs->dead_interval;
> > -                   iface->fast_hello_interval = defs->fast_hello_interval;
> > -                   iface->transmit_delay = defs->transmit_delay;
> > -                   if (iface->dead_interval == FAST_RTR_DEAD_TIME)
> > -                           iface->hello_interval = 0;
> > -                   else
> > -                           iface->hello_interval = defs->hello_interval;
> > -                   iface->rxmt_interval = defs->rxmt_interval;
> > -                   iface->metric = defs->metric;
> > -                   iface->priority = defs->priority;
> > -                   iface->auth_type = defs->auth_type;
> > -                   iface->auth_keyid = defs->auth_keyid;
> > -                   memcpy(iface->auth_key, defs->auth_key,
> > -                       sizeof(iface->auth_key));
> > -                   md_list_copy(&iface->auth_md_list, &defs->md_list);
> > +                   iface->priority = -1;
> > +                   iface->auth_keyid = -1;
> > +                   iface->auth_type = AUTH_UNSET;
> > +                   iface_settings(iface, defs);
> >                     md_list_clr(&defs->md_list);
> >                     iface = NULL;
> >                     /* interface is always part of an area */
> > @@ -1207,6 +1207,8 @@ popfile(void)
> >  struct ospfd_conf *
> >  parse_config(char *filename, int opts)
> >  {
> > +   struct area     *a;
> > +   struct iface    *i;
> >     struct sym      *sym, *next;
> >  
> >     if ((conf = calloc(1, sizeof(struct ospfd_conf))) == NULL)
> > @@ -1259,6 +1261,10 @@ parse_config(char *filename, int opts)
> >             }
> >     }
> >  
> > +   LIST_FOREACH(a, &conf->area_list, entry)
> > +           LIST_FOREACH(i, &a->iface_list, entry)
> > +                   iface_settings(i, defs);
> > +   
> >     /* free global config defaults */
> >     md_list_clr(&globaldefs.md_list);
> >  
> > @@ -1317,7 +1323,7 @@ int
> >  cmdline_symset(char *s)
> >  {
> >     char    *sym, *val;
> > -   int     ret;
> > +   int      ret;
> >  
> >     if ((val = strrchr(s, '=')) == NULL)
> >             return (-1);
> > @@ -1501,4 +1507,33 @@ host(const char *s, struct in_addr *addr
> >     mask->s_addr = prefixlen2mask(bits);
> >  
> >     return (1);
> > +}
> > +
> > +void
> > +iface_settings(struct iface *i, struct config_defaults *cfg)
> > +{
> > +   if (i->dead_interval == 0)
> > +           i->dead_interval = cfg->dead_interval;
> > +   if (i->dead_interval == FAST_RTR_DEAD_TIME)
> > +           i->hello_interval = 0;
> > +   else if (i->hello_interval == 0)
> > +                   i->hello_interval = cfg->hello_interval;
> > +   if (i->transmit_delay == 0)
> > +           i->transmit_delay = cfg->transmit_delay;
> > +   if (i->fast_hello_interval == 0)
> > +           i->fast_hello_interval = cfg->fast_hello_interval;
> > +   if (i->rxmt_interval == 0)
> > +           i->rxmt_interval = cfg->rxmt_interval;
> > +   if (i->metric == 0)
> > +           i->metric = cfg->metric;
> > +   if (i->priority == -1)
> > +           i->priority = cfg->priority;
> > +   if (i->auth_keyid == -1)
> > +           i->auth_keyid = cfg->auth_keyid;
> > +   if (i->auth_type == AUTH_UNSET)
> > +           i->auth_type = cfg->auth_type;
> > +   if (strlen(i->auth_key) == 0)
> > +           memcpy(i->auth_key, cfg->auth_key, sizeof(i->auth_key));
> > +   if (TAILQ_EMPTY(&i->auth_md_list))
> > +           md_list_copy(&i->auth_md_list, &cfg->md_list);
> >  }
> > Index: ospfd/printconf.c
> > ===================================================================
> > RCS file: /cvs/src/usr.sbin/ospfd/printconf.c,v
> > retrieving revision 1.21
> > diff -u -p -r1.21 printconf.c
> > --- ospfd/printconf.c       19 Nov 2019 09:55:55 -0000      1.21
> > +++ ospfd/printconf.c       8 Jan 2020 12:11:20 -0000
> > @@ -154,12 +154,12 @@ print_iface(struct iface *iface)
> >  
> >             printf("\t\tauth-type %s\n", if_auth_name(iface->auth_type));
> >             switch (iface->auth_type) {
> > -           case AUTH_TYPE_NONE:
> > +           case AUTH_NONE:
> >                     break;
> > -           case AUTH_TYPE_SIMPLE:
> > +           case AUTH_SIMPLE:
> >                     printf("\t\tauth-key XXXXXX\n");
> >                     break;
> > -           case AUTH_TYPE_CRYPT:
> > +           case AUTH_CRYPT:
> >                     printf("\t\tauth-md-keyid %d\n", iface->auth_keyid);
> >                     TAILQ_FOREACH(md, &iface->auth_md_list, entry)
> >                             printf("\t\tauth-md %d XXXXXX\n", md->keyid);
> > 
> 

-- 
:wq Claudio

Reply via email to