diff options
author | Martin Mares <mj@ucw.cz> | 1999-03-03 20:33:54 +0100 |
---|---|---|
committer | Martin Mares <mj@ucw.cz> | 1999-03-03 20:33:54 +0100 |
commit | b2280748ad5087b5dab54dd4e423053ffe1f2387 (patch) | |
tree | 90997ee7e125ed00a7bc113e68676014f23bd43c | |
parent | 84c7e1943f0dbf896b1dd8d02a21120aa00463f4 (diff) | |
download | bird-b2280748ad5087b5dab54dd4e423053ffe1f2387.tar bird-b2280748ad5087b5dab54dd4e423053ffe1f2387.zip |
Introduced protocol priority (all 'normal' protocols should use the
default zero priority). No more "kernel syncer initialized before
device routes" problems.
-rw-r--r-- | nest/proto.c | 23 | ||||
-rw-r--r-- | nest/protocol.h | 1 | ||||
-rw-r--r-- | nest/rt-dev.c | 1 |
3 files changed, 22 insertions, 3 deletions
diff --git a/nest/proto.c b/nest/proto.c index 21f3630..76120fa 100644 --- a/nest/proto.c +++ b/nest/proto.c @@ -38,6 +38,22 @@ static char *c_states[] = { "HUNGRY", "FEEDING", "HAPPY", "FLUSHING" }; static void proto_flush_all(void *); static void +proto_enqueue(list *l, struct proto *p) +{ + int pri = p->proto->priority; + + if (!pri) + add_tail(l, &p->n); + else + { + struct proto *q = HEAD(*l); + while (q->n.next && q->proto->priority >= pri) + q = (struct proto *) q->n.next; + insert_node(&p->n, q->n.prev); + } +} + +static void proto_relink(struct proto *p) { list *l; @@ -54,7 +70,7 @@ proto_relink(struct proto *p) default: l = &inactive_proto_list; } - add_tail(l, &p->n); + proto_enqueue(l, p); } void * @@ -146,7 +162,7 @@ protos_commit(struct config *c) q = p->init(x); q->proto_state = PS_DOWN; q->core_state = FS_HUNGRY; - add_tail(&initial_proto_list, &q->n); + proto_enqueue(&initial_proto_list, q); } debug("\n"); } @@ -224,7 +240,8 @@ protos_dump_all(void) WALK_LIST(p, proto_list) { - debug(" protocol %s: state %s/%s\n", p->name, p_states[p->proto_state], c_states[p->core_state]); + debug(" protocol %s (pri=%d): state %s/%s\n", p->name, p->proto->priority, + p_states[p->proto_state], c_states[p->core_state]); if (p->disabled) debug("\tDISABLED\n"); else if (p->proto->dump) diff --git a/nest/protocol.h b/nest/protocol.h index 9463861..cb30754 100644 --- a/nest/protocol.h +++ b/nest/protocol.h @@ -30,6 +30,7 @@ struct protocol { node n; char *name; unsigned debug; /* Default debugging flags */ + int priority; /* Protocol priority (usually 0) */ void (*preconfig)(struct protocol *, struct config *); /* Just before configuring */ void (*postconfig)(struct proto_config *); /* After configuring each instance */ diff --git a/nest/rt-dev.c b/nest/rt-dev.c index ebe3a1a..fcaabd8 100644 --- a/nest/rt-dev.c +++ b/nest/rt-dev.c @@ -92,6 +92,7 @@ dev_preconfig(struct protocol *x, struct config *c) struct protocol proto_device = { name: "Device", + priority: 100, preconfig: dev_preconfig, init: dev_init, }; |