diff options
author | Martin Mares <mj@ucw.cz> | 1999-03-26 22:44:38 +0100 |
---|---|---|
committer | Martin Mares <mj@ucw.cz> | 1999-03-26 22:44:38 +0100 |
commit | 7e5f5ffdda7232048c4baf3fdec358afb494a29d (patch) | |
tree | 0cbc52ac45785f16175d04039a27aa133b4b2cf2 /nest | |
parent | 739ebd8e82b090ed91b3ebe77509ecd6784eca9a (diff) | |
download | bird-7e5f5ffdda7232048c4baf3fdec358afb494a29d.tar bird-7e5f5ffdda7232048c4baf3fdec358afb494a29d.zip |
Moved to a much more systematic way of configuring kernel protocols.
o Nothing is configured automatically. You _need_ to specify
the kernel syncer in config file in order to get it started.
o Syncing has been split to route syncer (protocol "Kernel") and
interface syncer (protocol "Device"), device routes are generated
by protocol "Direct" (now can exist in multiple instances, so that
it will be possible to feed different device routes to different
routing tables once multiple tables get supported).
See doc/bird.conf.example for a living example of these shiny features.
Diffstat (limited to 'nest')
-rw-r--r-- | nest/config.Y | 20 | ||||
-rw-r--r-- | nest/rt-dev.c | 20 |
2 files changed, 15 insertions, 25 deletions
diff --git a/nest/config.Y b/nest/config.Y index 8300132..61a12ca 100644 --- a/nest/config.Y +++ b/nest/config.Y @@ -16,7 +16,7 @@ void rt_dev_add_iface(char *); CF_DECLS -CF_KEYWORDS(ROUTER, ID, PROTOCOL, PREFERENCE, DISABLED, DEBUG, ALL, OFF, DEVICE) +CF_KEYWORDS(ROUTER, ID, PROTOCOL, PREFERENCE, DISABLED, DEBUG, ALL, OFF, DIRECT) CF_KEYWORDS(INTERFACE, INPUT, OUTPUT, FILTER) %type <i> idval @@ -44,7 +44,7 @@ proto_start: PROTOCOL proto_name: /* EMPTY */ { - struct symbol *s = cf_default_name(this_proto->proto->name); + struct symbol *s = cf_default_name(this_proto->proto->name, &this_proto->proto->name_counter); s->class = SYM_PROTO; s->def = this_proto; this_proto->name = s->name; @@ -71,24 +71,30 @@ proto_item: | OUTPUT FILTER filter { this_proto->out_filter = $3; } ; -/* Device protocol */ +/* Direct device route protocol */ CF_ADDTO(proto, dev_proto '}') -dev_proto_start: proto_start DEVICE { - if (!(this_proto = cf_dev_proto)) cf_error("Device protocol already defined"); - cf_dev_proto = NULL; +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); } ; dev_proto: - dev_proto_start '{' + dev_proto_start proto_name '{' | dev_proto proto_item ';' | 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); } diff --git a/nest/rt-dev.c b/nest/rt-dev.c index fcaabd8..c122b96 100644 --- a/nest/rt-dev.c +++ b/nest/rt-dev.c @@ -18,8 +18,6 @@ #include "conf/conf.h" #include "lib/resource.h" -struct proto_config *cf_dev_proto; - static void dev_if_notify(struct proto *p, unsigned c, struct iface *new, struct iface *old) { @@ -77,22 +75,8 @@ dev_init(struct proto_config *c) return p; } -static void -dev_preconfig(struct protocol *x, struct config *c) -{ - 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)); - - cf_dev_proto = &p->c; - p->c.preference = DEF_PREF_DIRECT; - init_list(&p->iface_list); - k->pattern = "*"; - add_tail(&p->iface_list, &k->n); -} - struct protocol proto_device = { - name: "Device", - priority: 100, - preconfig: dev_preconfig, + name: "Direct", + priority: 90, init: dev_init, }; |