summaryrefslogtreecommitdiff
path: root/nest/config.Y
diff options
context:
space:
mode:
authorMartin Mares <mj@ucw.cz>1999-08-03 19:30:49 +0000
committerMartin Mares <mj@ucw.cz>1999-08-03 19:30:49 +0000
commit8edf2361f9c4bd745a1249db3f66dfc079dd2ca1 (patch)
tree5b97c4394925806715ea89a6c9fc61a0e44cdc1a /nest/config.Y
parent9273035403ace754e5b405b2c5efba7d55c28e78 (diff)
Cleaned up handling of interface patterns:
o Parsing of interface patterns moved to generic code, introduced this_ipatt which works similarly to this_iface. o Interface patterns now support selection by both interface names and primary IP addresses. o Proto `direct' updated. o RIP updated as well, it also seems the memory corruption bug there is gone.
Diffstat (limited to 'nest/config.Y')
-rw-r--r--nest/config.Y47
1 files changed, 26 insertions, 21 deletions
diff --git a/nest/config.Y b/nest/config.Y
index bb1328cc..0c653211 100644
--- a/nest/config.Y
+++ b/nest/config.Y
@@ -9,12 +9,11 @@
CF_HDR
static struct proto_config *this_proto;
+static struct iface_patt *this_ipatt;
#include "nest/rt-dev.h"
#include "nest/password.h"
-void rt_dev_add_iface(char *);
-
CF_DECLS
CF_KEYWORDS(ROUTER, ID, PROTOCOL, PREFERENCE, DISABLED, DEBUG, ALL, OFF, DIRECT)
@@ -102,18 +101,23 @@ rtable:
}
;
+/* Interface patterns */
+
+iface_patt:
+ TEXT { this_ipatt->pattern = $1; this_ipatt->prefix = IPA_NONE; this_ipatt->pxlen = 0; }
+ | IPA pxlen { this_ipatt->pattern = NULL; this_ipatt->prefix = $1; this_ipatt->pxlen = $2; }
+ | TEXT IPA pxlen { this_ipatt->pattern = $1; this_ipatt->prefix = $2; this_ipatt->pxlen = $3; }
+ ;
+
/* Direct device route protocol */
CF_ADDTO(proto, dev_proto '}')
dev_proto_start: proto_start DIRECT {
struct rt_dev_config *p = proto_config_new(&proto_device, sizeof(struct rt_dev_config));
- struct iface_patt *k = cfg_alloc(sizeof(struct iface_patt));
this_proto = &p->c;
p->c.preference = DEF_PREF_DIRECT;
init_list(&p->iface_list);
- k->pattern = "*";
- add_tail(&p->iface_list, &k->n);
}
;
@@ -123,15 +127,26 @@ dev_proto:
| dev_proto dev_iface_list ';'
;
-dev_iface_list:
- INTERFACE TEXT {
- /* FIXME: Beware of obscure semantics. */
- init_list(&((struct rt_dev_config *) this_proto)->iface_list);
- rt_dev_add_iface($2);
+dev_iface_entry_init:
+ /* EMPTY */ {
+ struct rt_dev_config *p = (void *) this_proto;
+ struct iface_patt *k = cfg_allocz(sizeof(struct iface_patt));
+ add_tail(&p->iface_list, &k->n);
+ this_ipatt = k;
}
- | dev_iface_list ',' TEXT { rt_dev_add_iface($3); }
;
+dev_iface_entry:
+ dev_iface_entry_init iface_patt
+ ;
+
+dev_iface_list:
+ INTERFACE dev_iface_entry
+ | dev_iface_list ',' dev_iface_entry
+ ;
+
+/* Password lists */
+
password_begin:
PASSWORD TEXT {
last_password_item = cfg_alloc(sizeof (struct password_item));
@@ -162,14 +177,4 @@ password_list:
CF_CODE
-void
-rt_dev_add_iface(char *n)
-{
- struct rt_dev_config *p = (void *) this_proto;
- struct iface_patt *k = cfg_alloc(sizeof(struct iface_patt));
-
- k->pattern = cfg_strdup(n);
- add_tail(&p->iface_list, &k->n);
-}
-
CF_END