diff options
Diffstat (limited to 'nest/proto.c')
-rw-r--r-- | nest/proto.c | 104 |
1 files changed, 67 insertions, 37 deletions
diff --git a/nest/proto.c b/nest/proto.c index cb3113fd..976a967b 100644 --- a/nest/proto.c +++ b/nest/proto.c @@ -1,7 +1,7 @@ /* * BIRD -- Protocols * - * (c) 1998 Martin Mares <mj@ucw.cz> + * (c) 1998--1999 Martin Mares <mj@ucw.cz> * * Can be freely distributed and used under the terms of the GNU GPL. */ @@ -23,47 +23,83 @@ list proto_list; list inactive_proto_list; void * -proto_new(struct protocol *pr, unsigned size) +proto_new(struct proto_config *c, unsigned size) { - struct proto *p = cfg_allocz(size); + struct protocol *pr = c->proto; + struct proto *p = cfg_allocz(size); /* FIXME: Allocate from global pool */ - debug("proto_new(%s)\n", pr->name); + p->cf = c; + p->debug = c->debug; + p->preference = c->preference; + p->disabled = c->disabled; p->proto = pr; - p->name = pr->name; - p->debug = pr->debug; - p->pool = rp_new(&root_pool, pr->name); - add_tail(&inactive_proto_list, &p->n); + p->pool = rp_new(&root_pool, c->name); return p; } +void * +proto_config_new(struct protocol *pr, unsigned size) +{ + struct proto_config *c = cfg_allocz(size); + + add_tail(&new_config->protos, &c->n); + c->global = new_config; + c->proto = pr; + c->debug = pr->debug; + c->name = pr->name; + return c; +} + void -protos_preconfig(void) +protos_preconfig(struct config *c) { struct protocol *p; init_list(&proto_list); init_list(&inactive_proto_list); - debug("Protocol preconfig\n"); + debug("Protocol preconfig:"); WALK_LIST(p, protocol_list) { - debug("...%s\n", p->name); + debug(" %s", p->name); if (p->preconfig) - p->preconfig(p); + p->preconfig(p, c); } + debug("\n"); } void -protos_postconfig(void) +protos_postconfig(struct config *c) { + struct proto_config *x; struct protocol *p; - debug("Protocol postconfig\n"); - WALK_LIST(p, protocol_list) + debug("Protocol postconfig:"); + WALK_LIST(x, c->protos) { - debug("...%s\n", p->name); + debug(" %s", x->name); + p = x->proto; if (p->postconfig) - p->postconfig(p); + p->postconfig(x); + } + debug("\n"); +} + +void +protos_commit(struct config *c) +{ + struct proto_config *x; + struct protocol *p; + struct proto *q; + + debug("Protocol commit:"); + WALK_LIST(x, c->protos) + { + debug(" %s", x->name); + p = x->proto; + q = p->init(x); + add_tail(&inactive_proto_list, &q->n); } + debug("\n"); } static void @@ -72,12 +108,15 @@ proto_start(struct proto *p) rem_node(&p->n); if (p->disabled) return; - p->state = PRS_STARTING; - if (p->start) - p->start(p); + p->proto_state = PS_DOWN; + p->core_state = FS_HUNGRY; + if (p->proto->start && p->proto->start(p) != PS_UP) + bug("Delayed protocol start not supported yet"); + p->proto_state = PS_UP; + p->core_state = FS_FEEDING; if_feed_baby(p); rt_feed_baby(p); - p->state = PRS_UP; + p->core_state = FS_HAPPY; add_tail(&proto_list, &p->n); } @@ -89,7 +128,7 @@ protos_start(void) debug("Protocol start\n"); WALK_LIST_DELSAFE(p, n, inactive_proto_list) { - debug("...%s\n", p->name); + debug("Starting %s\n", p->cf->name); proto_start(p); } } @@ -98,19 +137,21 @@ void protos_dump_all(void) { struct proto *p; + static char *p_states[] = { "DOWN", "START", "UP", "STOP" }; + static char *c_states[] = { "HUNGRY", "FEEDING", "HAPPY", "FLUSHING" }; debug("Protocols:\n"); WALK_LIST(p, proto_list) { - debug(" protocol %s:\n", p->name); + debug(" protocol %s: state %s/%s\n", p->cf->name, p_states[p->proto_state], c_states[p->core_state]); if (p->disabled) debug("\tDISABLED\n"); - else if (p->dump) - p->dump(p); + else if (p->proto->dump) + p->proto->dump(p); } WALK_LIST(p, inactive_proto_list) - debug(" inactive %s\n", p->name); + debug(" inactive %s\n", p->cf->name); } void @@ -125,14 +166,3 @@ protos_build(void) add_tail(&protocol_list, &proto_static.n); #endif } - -void -protos_init(void) -{ - struct protocol *p; - - debug("Initializing protocols\n"); - WALK_LIST(p, protocol_list) - if (p->init) - p->init(p); -} |