]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Introduced protocol priority (all 'normal' protocols should use the
authorMartin Mares <mj@ucw.cz>
Wed, 3 Mar 1999 19:33:54 +0000 (19:33 +0000)
committerMartin Mares <mj@ucw.cz>
Wed, 3 Mar 1999 19:33:54 +0000 (19:33 +0000)
default zero priority). No more "kernel syncer initialized before
device routes" problems.

nest/proto.c
nest/protocol.h
nest/rt-dev.c

index 21f3630785583f0b38be554d2999bd75b9afe96a..76120fa869ea8fae375cbe2b39f4acea95bf3ae4 100644 (file)
@@ -37,6 +37,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)
 {
@@ -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)
index 9463861e0d5046914462c7bd3050c21cbd59041d..cb30754fe2bb1823600742af8a987905bf506994 100644 (file)
@@ -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 */
index ebe3a1a2e13b80e1db7f5a74ff2281cf1235813c..fcaabd8b0db00e84a9b19de3d12320002b3caac0 100644 (file)
@@ -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,
 };