]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Fixed a couple of bugs in static protocol. All static routes except device
authorMartin Mares <mj@ucw.cz>
Tue, 8 Dec 1998 18:31:31 +0000 (18:31 +0000)
committerMartin Mares <mj@ucw.cz>
Tue, 8 Dec 1998 18:31:31 +0000 (18:31 +0000)
ones seem to work well.

proto/static/static.c
proto/static/static.h

index bc060cda0172b311ba93662a9ae2c9df173e8be7..d1fe217ba6f32137756f78afe86c6f568e97fddc 100644 (file)
@@ -65,30 +65,42 @@ static_start(struct proto *P)
 
   DBG("Static: take off!\n");
   WALK_LIST(r, p->other_routes)
-    if (r->dest == RTD_ROUTER)
+    switch (r->dest)
       {
-       struct neighbor *n = neigh_find(P, &r->via, NEF_STICKY);
-       if (n)
-         {
-           n->data = r;
-           r->neigh = n;
-           static_install(p, r, n->iface);
-         }
-       else
-         log(L_ERR "Static route destination %I is invalid. Ignoring.\n", r->via);
+      case RTD_ROUTER:
+       {
+         struct neighbor *n = neigh_find(P, &r->via, NEF_STICKY);
+         if (n)
+           {
+             r->chain = n->data;
+             n->data = r;
+             r->neigh = n;
+             static_install(p, r, n->iface);
+           }
+         else
+           log(L_ERR "Static route destination %I is invalid. Ignoring.\n", r->via);
+         break;
+       }
+      case RTD_DEVICE:
+       die("Static device routes are not supported");
+       /* FIXME: Static device routes */
+      default:
+       static_install(p, r, NULL);
       }
-    else
-      static_install(p, r, NULL);
 }
 
 static void
 static_neigh_notify(struct neighbor *n)
 {
+  struct static_proto *p = (struct static_proto *) n->proto;
+  struct static_route *r;
+
   DBG("Static: neighbor notify for %I: iface %p\n", n->addr, n->iface);
-  if (n->iface)
-    static_install((struct static_proto *) n->proto, n->data, n->iface);
-  else
-    static_remove((struct static_proto *) n->proto, n->data);
+  for(r=n->data; r; r=r->chain)
+    if (n->iface)
+      static_install(p, r, n->iface);
+    else
+      static_remove(p, r);
 }
 
 static void
index b6d69457ec07c8a2cafe07b8eb3480423d0a98a2..ba66c803405545a5a2717c70a1f90449fc4c0cbb 100644 (file)
@@ -19,6 +19,7 @@ void static_init_instance(struct static_proto *);
 
 struct static_route {
   node n;
+  struct static_route *chain;          /* Next for the same neighbor */
   ip_addr net;                         /* Network we route */
   int masklen;                         /* Mask length */
   int dest;                            /* Destination type (RTD_*) */