]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
When shutting down, remove all routes (except for RTS_INHERIT and RTS_DEVICE
authorMartin Mares <mj@ucw.cz>
Sat, 13 Feb 1999 20:46:03 +0000 (20:46 +0000)
committerMartin Mares <mj@ucw.cz>
Sat, 13 Feb 1999 20:46:03 +0000 (20:46 +0000)
routes) from kernel routing tables unless the "persist" switch is set.

sysdep/unix/Modules
sysdep/unix/krt-set.Y [new file with mode: 0644]
sysdep/unix/krt-set.c
sysdep/unix/krt-set.h
sysdep/unix/krt.h
sysdep/unix/sync-rt.c

index f6db6d35bc53848357c476b44559d4b1fbc1adc7..2969ee45c6f8a529a8294702fc1a0cce0be058ba 100644 (file)
@@ -9,5 +9,6 @@ krt.Y
 krt.h
 krt-set.c
 krt-set.h
+krt-set.Y
 krt-iface.h
 krt-iface.Y
diff --git a/sysdep/unix/krt-set.Y b/sysdep/unix/krt-set.Y
new file mode 100644 (file)
index 0000000..551ee16
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ *     BIRD -- UNIX Kernel Syncer Configuration
+ *
+ *     (c) 1998--1999 Martin Mares <mj@ucw.cz>
+ *
+ *     Can be freely distributed and used under the terms of the GNU GPL.
+ */
+
+CF_HDR
+
+#include "lib/krt-scan.h"
+
+CF_DECLS
+
+CF_KEYWORDS(PERSIST)
+
+CF_GRAMMAR
+
+CF_ADDTO(kern_proto, kern_proto krt_set_item ';')
+
+krt_set_item:
+   PERSIST bool {
+      ((struct krt_config *) this_proto)->setopt.persist = $2;
+   }
+ ;
+
+CF_CODE
+
+CF_END
index 2f0abe66f56ee26ec54a231da329b92ba5553fb9..e77015b343bd20924b8fa60e55a0f4dfa6a618ec 100644 (file)
@@ -133,3 +133,29 @@ void
 krt_set_preconfig(struct krt_config *c)
 {
 }
+
+void
+krt_set_shutdown(struct krt_proto *x)
+{
+  struct rtable *t = &master_table;
+
+  if (((struct krt_config *) x->p.cf)->setopt.persist)
+    return;
+  DBG("Flushing kernel routes...\n");
+  while (t && t->tos)
+    t = t->sibling;
+  if (!t)
+    return;
+  FIB_WALK(&t->fib, f)
+    {
+      net *n = (net *) f;
+      rte *e = n->routes;
+      if (e)
+       {
+         rta *a = e->attrs;
+         if (a->source != RTS_DEVICE && a->source != RTS_INHERIT)
+           krt_remove_route(e);
+       }
+    }
+  FIB_WALK_END;
+} 
index 53b1146430ba5d9ea4298f4352d03d512edd869c..ec96e65287aa7f69d0624fa87c5b8a09b1e87b4e 100644 (file)
@@ -10,6 +10,7 @@
 #define _BIRD_KRT_SET_H_
 
 struct krt_set_params {
+  int persist;
 };
 
 struct krt_set_status {
index 5631bc5cb03c194c417873a6ced0f25f4ccd0c03..9b630b27e7b634e1902c53696373ebd8fcc401ea 100644 (file)
@@ -52,6 +52,7 @@ void krt_scan_ifaces_done(struct krt_proto *);
 
 void krt_set_preconfig(struct krt_config *);
 void krt_set_start(struct krt_proto *);
+void krt_set_shutdown(struct krt_proto *);
 
 /* sync-if.c */
 
index 094da1c24b9aa4daeb957fdc62a6265d0d697e08..99ef92a07a1a5055fdd5c47aece01711d080f7fe 100644 (file)
@@ -43,6 +43,7 @@ krt_shutdown(struct proto *p)
 
   krt_scan_shutdown(k);
   krt_if_shutdown(k);
+  krt_set_shutdown(k);
   return PS_DOWN;
 }