summaryrefslogtreecommitdiffstats
path: root/conf
diff options
context:
space:
mode:
authorMartin Mares <mj@ucw.cz>1999-08-03 21:36:06 +0200
committerMartin Mares <mj@ucw.cz>1999-08-03 21:36:06 +0200
commitdce267832a0468ed5e596f0b0733b926af7ead3a (patch)
tree76de529a85a81b12bd04ed150db208b76b0b17b1 /conf
parent707ef833783ef731c56baae1c0dc7b7a9e7321ff (diff)
downloadbird-dce267832a0468ed5e596f0b0733b926af7ead3a.tar
bird-dce267832a0468ed5e596f0b0733b926af7ead3a.zip
Basic support for IPv6. The system-dependent part doesn't work yet,
but the core routines are there and seem to be working. o lib/ipv6.[ch] written o Lexical analyser recognizes IPv6 addresses and when in IPv6 mode, treats pure IPv4 addresses as router IDs. o Router ID must be configured manually on IPv6 systems. o Added SCOPE_ORGANIZATION for org-scoped IPv6 multicasts. o Fixed few places where ipa_(hton|ntoh) was called as a function returning converted address.
Diffstat (limited to 'conf')
-rw-r--r--conf/cf-lex.l18
-rw-r--r--conf/conf.c4
-rw-r--r--conf/confbase.Y2
3 files changed, 23 insertions, 1 deletions
diff --git a/conf/cf-lex.l b/conf/cf-lex.l
index 94c2b2a..21727a9 100644
--- a/conf/cf-lex.l
+++ b/conf/cf-lex.l
@@ -65,9 +65,25 @@ WHITE [ \t]
%%
{DIGIT}+\.{DIGIT}+\.{DIGIT}+\.{DIGIT}+ {
+#ifdef IPV6
+ if (ipv4_pton_u32(yytext, &cf_lval.i32))
+ return RTRID;
+ cf_error("Invalid IPv4 address %s", yytext);
+#else
if (ip_pton(yytext, &cf_lval.a))
return IPA;
- cf_error("Invalid IP address");
+ cf_error("Invalid IP address %s", yytext);
+#endif
+}
+
+({XIGIT}*::|({XIGIT}*:){3,})({XIGIT}*|{DIGIT}+\.{DIGIT}+\.{DIGIT}+\.{DIGIT}+) {
+#ifdef IPV6
+ if (ip_pton(yytext, &cf_lval.a))
+ return IPA;
+ cf_error("Invalid IP address %s", yytext);
+#else
+ cf_error("This is an IPv4 router, therefore IPv6 addresses are not supported");
+#endif
}
0x{DIGIT}+ {
diff --git a/conf/conf.c b/conf/conf.c
index 0ce593c..d9bf9d8 100644
--- a/conf/conf.c
+++ b/conf/conf.c
@@ -54,6 +54,10 @@ config_parse(struct config *c)
cf_parse();
filters_postconfig(); /* FIXME: Do we really need this? */
protos_postconfig(c);
+#ifdef IPV6
+ if (!c->router_id)
+ cf_error("Router ID must be configured manually on IPv6 routers");
+#endif
return 1;
}
diff --git a/conf/confbase.Y b/conf/confbase.Y
index f9293a4..a6eb876 100644
--- a/conf/confbase.Y
+++ b/conf/confbase.Y
@@ -22,6 +22,7 @@ CF_DECLS
%union {
int i;
+ u32 i32;
ip_addr a;
struct symbol *s;
char *t;
@@ -35,6 +36,7 @@ CF_DECLS
%token END
%token <i> NUM
+%token <i32> RTRID
%token <a> IPA
%token <s> SYM
%token <t> TEXT