summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/config.l1
-rw-r--r--src/config.y39
2 files changed, 36 insertions, 4 deletions
diff --git a/src/config.l b/src/config.l
index 1ee4b28..404384e 100644
--- a/src/config.l
+++ b/src/config.l
@@ -99,6 +99,7 @@ port { TOKEN(TOK_PORT); }
float { TOKEN(TOK_FLOAT); }
crypto { TOKEN(TOK_CRYPTO); }
use { TOKEN(TOK_USE); }
+default { TOKEN(TOK_DEFAULT); }
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} {
UPDATE_LOCATION;
diff --git a/src/config.y b/src/config.y
index 0693294..59fc296 100644
--- a/src/config.y
+++ b/src/config.y
@@ -97,6 +97,7 @@
%token TOK_FLOAT
%token TOK_CRYPTO
%token TOK_USE
+%token TOK_DEFAULT
%token <addr> TOK_ADDR
%token <addr6> TOK_ADDR6
@@ -194,21 +195,21 @@ bind_new: {
}
;
-bind: bind_new TOK_ADDR maybe_port maybe_bind_to_device {
+bind: bind_new TOK_ADDR maybe_port maybe_bind_to_device maybe_bind_default {
conf->bind_addrs->addr.in.sin_family = AF_INET;
conf->bind_addrs->addr.in.sin_addr = $2;
conf->bind_addrs->addr.in.sin_port = htons($3);
if (!conf->bind_addr_default_v4)
conf->bind_addr_default_v4 = conf->bind_addrs;
}
- | bind_new TOK_ADDR6 maybe_port maybe_bind_to_device {
+ | bind_new TOK_ADDR6 maybe_port maybe_bind_to_device maybe_bind_default {
conf->bind_addrs->addr.in6.sin6_family = AF_INET6;
conf->bind_addrs->addr.in6.sin6_addr = $2;
conf->bind_addrs->addr.in6.sin6_port = htons($3);
if (!conf->bind_addr_default_v6)
conf->bind_addr_default_v6 = conf->bind_addrs;
}
- | bind_new TOK_ANY maybe_port maybe_bind_to_device {
+ | bind_new TOK_ANY maybe_port maybe_bind_to_device maybe_bind_default {
conf->bind_addrs->addr.in.sin_port = htons($3);
if (!conf->bind_addr_default_v4)
conf->bind_addr_default_v4 = conf->bind_addrs;
@@ -221,7 +222,37 @@ maybe_bind_to_device:
TOK_INTERFACE TOK_STRING {
conf->bind_addrs->bindtodev = strdup($2->str);
}
- | {}
+ |
+ ;
+
+maybe_bind_default:
+ TOK_DEFAULT bind_default
+ |
+ ;
+
+bind_default:
+ TOK_IPV4 {
+ if (conf->bind_addrs->addr.sa.sa_family == AF_INET6) {
+ fastd_config_error(&@$, ctx, conf, filename, depth, "tried to set IPv6 bind as IPv4 default");
+ YYERROR;
+ }
+
+ conf->bind_addr_default_v4 = conf->bind_addrs;
+ }
+ | TOK_IPV6 {
+ if (conf->bind_addrs->addr.sa.sa_family == AF_INET) {
+ fastd_config_error(&@$, ctx, conf, filename, depth, "tried to set IPv4 bind as IPv6 default");
+ YYERROR;
+ }
+
+ conf->bind_addr_default_v6 = conf->bind_addrs;
+ }
+ | {
+ if (conf->bind_addrs->addr.sa.sa_family != AF_INET6)
+ conf->bind_addr_default_v4 = conf->bind_addrs;
+ if (conf->bind_addrs->addr.sa.sa_family != AF_INET)
+ conf->bind_addr_default_v6 = conf->bind_addrs;
+ }
;
mtu: TOK_INTEGER { conf->mtu = $1; }