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.
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);