summaryrefslogtreecommitdiff
path: root/usr.sbin
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/ospfd/ospfd.c17
-rw-r--r--usr.sbin/ospfd/ospfd.h15
-rw-r--r--usr.sbin/ospfd/parse.y56
-rw-r--r--usr.sbin/ospfd/printconf.c22
4 files changed, 66 insertions, 44 deletions
diff --git a/usr.sbin/ospfd/ospfd.c b/usr.sbin/ospfd/ospfd.c
index fd07d6bb078..472fbc79e08 100644
--- a/usr.sbin/ospfd/ospfd.c
+++ b/usr.sbin/ospfd/ospfd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ospfd.c,v 1.32 2006/05/30 22:06:14 claudio Exp $ */
+/* $OpenBSD: ospfd.c,v 1.33 2006/05/31 03:24:06 claudio Exp $ */
/*
* Copyright (c) 2005 Claudio Jeker <claudio@openbsd.org>
@@ -500,10 +500,10 @@ ospf_redistribute(struct kroute *kr)
return (0);
SIMPLEQ_FOREACH(r, &conf->redist_list, entry) {
- switch (r->type) {
+ switch (r->type & ~REDIST_NO) {
case REDIST_LABEL:
if (kr->rtlabel == r->label)
- return (1);
+ return (r->type & REDIST_NO ? 0 : 1);
break;
case REDIST_STATIC:
/*
@@ -514,14 +514,19 @@ ospf_redistribute(struct kroute *kr)
if (kr->flags & F_DYNAMIC)
continue;
if (kr->flags & F_STATIC)
- return (1);
+ return (r->type & REDIST_NO ? 0 : 1);
case REDIST_CONNECTED:
if (kr->flags & F_DYNAMIC)
continue;
if (kr->flags & F_CONNECTED)
- return (1);
+ return (r->type & REDIST_NO ? 0 : 1);
case REDIST_ADDR:
- /* ignore */
+ if (kr->flags & F_DYNAMIC)
+ continue;
+ if ((kr->prefix.s_addr & r->mask.s_addr) ==
+ (r->addr.s_addr & r->mask.s_addr) &&
+ kr->prefixlen >= mask2prefixlen(r->mask.s_addr))
+ return (r->type & REDIST_NO? 0 : 1);
break;
}
}
diff --git a/usr.sbin/ospfd/ospfd.h b/usr.sbin/ospfd/ospfd.h
index e513c0d7af9..408d842ecdd 100644
--- a/usr.sbin/ospfd/ospfd.h
+++ b/usr.sbin/ospfd/ospfd.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: ospfd.h,v 1.58 2006/05/30 22:06:14 claudio Exp $ */
+/* $OpenBSD: ospfd.h,v 1.59 2006/05/31 03:24:06 claudio Exp $ */
/*
* Copyright (c) 2004 Esben Norby <norby@openbsd.org>
@@ -361,19 +361,18 @@ enum {
PROC_RDE_ENGINE
} ospfd_process;
-enum redist_types {
- REDIST_CONNECTED,
- REDIST_STATIC,
- REDIST_LABEL,
- REDIST_ADDR
-};
+#define REDIST_CONNECTED 0x01
+#define REDIST_STATIC 0x02
+#define REDIST_LABEL 0x04
+#define REDIST_ADDR 0x08
+#define REDIST_NO 0x10
struct redistribute {
SIMPLEQ_ENTRY(redistribute) entry;
struct in_addr addr;
struct in_addr mask;
u_int16_t label;
- enum redist_types type;
+ u_int16_t type;
};
struct ospfd_conf {
diff --git a/usr.sbin/ospfd/parse.y b/usr.sbin/ospfd/parse.y
index 8297690d3de..c45a30eb9e2 100644
--- a/usr.sbin/ospfd/parse.y
+++ b/usr.sbin/ospfd/parse.y
@@ -1,4 +1,4 @@
-/* $OpenBSD: parse.y,v 1.32 2006/05/31 02:18:23 pat Exp $ */
+/* $OpenBSD: parse.y,v 1.33 2006/05/31 03:24:06 claudio Exp $ */
/*
* Copyright (c) 2004, 2005 Esben Norby <norby@openbsd.org>
@@ -112,9 +112,10 @@ typedef struct {
%token METRIC PASSIVE
%token HELLOINTERVAL TRANSMITDELAY
%token RETRANSMITINTERVAL ROUTERDEADTIME ROUTERPRIORITY
+%token YES NO
%token ERROR
%token <v.string> STRING
-%type <v.number> number yesno
+%type <v.number> number yesno no
%type <v.string> string
%%
@@ -153,19 +154,13 @@ string : string STRING {
| STRING
;
-yesno : STRING {
- if (!strcmp($1, "yes"))
- $$ = 1;
- else if (!strcmp($1, "no"))
- $$ = 0;
- else {
- free($1);
- YYERROR;
- }
- free($1);
- }
+yesno : YES { $$ = 1; }
+ | NO { $$ = 0; }
;
+no : /* empty */ { $$ = 0; }
+ | NO { $$ = 1; }
+
varset : STRING '=' string {
if (conf->opts & OSPFD_OPT_VERBOSE)
printf("%s = \"%s\"\n", $1, $3);
@@ -190,40 +185,51 @@ conf_main : ROUTERID STRING {
else
conf->flags &= ~OSPFD_FLAG_NO_FIB_UPDATE;
}
- | REDISTRIBUTE STRING {
+ | no REDISTRIBUTE STRING {
struct redistribute *r;
- if (!strcmp($2, "default"))
+ if (!strcmp($3, "default")) {
conf->redistribute |= REDISTRIBUTE_DEFAULT;
- else {
+ if ($1) {
+ yyerror("cannot use 'no' with "
+ "redistribute default");
+ free($3);
+ YYERROR;
+ }
+ } else {
if ((r = calloc(1, sizeof(*r))) == NULL)
fatal(NULL);
- if (!strcmp($2, "static"))
+ if (!strcmp($3, "static"))
r->type = REDIST_STATIC;
- else if (!strcmp($2, "connected"))
+ else if (!strcmp($3, "connected"))
r->type = REDIST_CONNECTED;
else {
yyerror("unknown redistribute type");
- free($2);
+ free($3);
free(r);
YYERROR;
}
+ if ($1)
+ r->type |= REDIST_NO;
+
SIMPLEQ_INSERT_TAIL(&conf->redist_list, r,
entry);
}
conf->redistribute |= REDISTRIBUTE_ON;
- free($2);
+ free($3);
}
- | REDISTRIBUTE RTLABEL STRING {
+ | no REDISTRIBUTE RTLABEL STRING {
struct redistribute *r;
if ((r = calloc(1, sizeof(*r))) == NULL)
fatal(NULL);
r->type = REDIST_LABEL;
- r->label = rtlabel_name2id($3);
- free($3);
+ r->label = rtlabel_name2id($4);
+ if ($1)
+ r->type |= REDIST_NO;
+ free($4);
SIMPLEQ_INSERT_TAIL(&conf->redist_list, r, entry);
conf->redistribute |= REDISTRIBUTE_ON;
@@ -496,6 +502,7 @@ lookup(char *s)
{"hello-interval", HELLOINTERVAL},
{"interface", INTERFACE},
{"metric", METRIC},
+ {"no", NO},
{"passive", PASSIVE},
{"redistribute", REDISTRIBUTE},
{"retransmit-interval", RETRANSMITINTERVAL},
@@ -506,7 +513,8 @@ lookup(char *s)
{"rtlabel", RTLABEL},
{"spf-delay", SPFDELAY},
{"spf-holdtime", SPFHOLDTIME},
- {"transmit-delay", TRANSMITDELAY}
+ {"transmit-delay", TRANSMITDELAY},
+ {"yes", YES}
};
const struct keywords *p;
diff --git a/usr.sbin/ospfd/printconf.c b/usr.sbin/ospfd/printconf.c
index 2960f9fc38c..537760f02ec 100644
--- a/usr.sbin/ospfd/printconf.c
+++ b/usr.sbin/ospfd/printconf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: printconf.c,v 1.3 2006/05/30 22:06:14 claudio Exp $ */
+/* $OpenBSD: printconf.c,v 1.4 2006/05/31 03:24:06 claudio Exp $ */
/*
* Copyright (c) 2004, 2005 Esben Norby <norby@openbsd.org>
@@ -29,6 +29,7 @@
#include "ospfe.h"
void print_mainconf(struct ospfd_conf *);
+const char *print_no(u_int16_t);
void print_redistribute(struct ospfd_conf *);
void print_iface(struct iface *);
@@ -53,6 +54,15 @@ print_mainconf(struct ospfd_conf *conf)
printf("spf-holdtime %u\n", conf->spf_hold_time);
}
+const char *
+print_no(u_int16_t type)
+{
+ if (type & REDIST_NO)
+ return ("no ");
+ else
+ return ("");
+}
+
void
print_redistribute(struct ospfd_conf *conf)
{
@@ -62,16 +72,16 @@ print_redistribute(struct ospfd_conf *conf)
printf("redistribute default\n");
SIMPLEQ_FOREACH(r, &conf->redist_list, entry) {
- switch (r->type) {
+ switch (r->type & ~REDIST_NO) {
case REDIST_STATIC:
- printf("redistribute static\n");
+ printf("%sredistribute static\n", print_no(r->type));
break;
case REDIST_CONNECTED:
- printf("redistribute connected\n");
+ printf("%sredistribute connected\n", print_no(r->type));
break;
case REDIST_LABEL:
- printf("redistribute rtlabel %s\n",
- rtlabel_id2name(r->label));
+ printf("%sredistribute rtlabel %s\n",
+ print_no(r->type), rtlabel_id2name(r->label));
break;
case REDIST_ADDR:
/* ignore for now */