]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Makes krt.c much more readable.
authorOndrej Zajicek <santiago@crfreenet.org>
Sat, 29 Jun 2013 20:55:41 +0000 (22:55 +0200)
committerOndrej Zajicek <santiago@crfreenet.org>
Thu, 4 Jul 2013 16:02:22 +0000 (18:02 +0200)
sysdep/bsd/krt-sock.c
sysdep/bsd/krt-sys.h
sysdep/linux/krt-sys.h
sysdep/linux/netlink.Y
sysdep/linux/netlink.c
sysdep/unix/krt.c
sysdep/unix/krt.h

index e970d6bdff9682de80dd7cea3e8fa67d38d53294..cad0cfc94ee46149193841dec05c8ef78f5510e8 100644 (file)
@@ -681,15 +681,14 @@ static size_t kif_buflen = 4096;
 void
 krt_do_scan(struct krt_proto *p)
 {
-  krt_sysctl_scan((struct proto *)p, p->krt_pool, &krt_buffer, &krt_buflen, NET_RT_DUMP);
+  krt_sysctl_scan(&p->p, p->p.pool, &krt_buffer, &krt_buflen, NET_RT_DUMP);
 }
 
 void
 kif_do_scan(struct kif_proto *p)
 {
-  struct proto *P = (struct proto *)p;
   if_start_update();
-  krt_sysctl_scan(P, P->pool, &kif_buffer, &kif_buflen, NET_RT_IFLIST);
+  krt_sysctl_scan(&p->p, p->p.pool, &kif_buffer, &kif_buflen, NET_RT_IFLIST);
   if_end_update();
 }
 
@@ -708,7 +707,7 @@ krt_sock_hook(sock *sk, int size UNUSED)
 }
 
 void
-krt_sys_start(struct krt_proto *x, int first UNUSED)
+krt_sys_start(struct krt_proto *x)
 {
   sock *sk_rt;
   static int ks_open_tried = 0;
@@ -733,7 +732,7 @@ krt_sys_start(struct krt_proto *x, int first UNUSED)
 }
 
 void
-krt_sys_shutdown(struct krt_proto *x UNUSED, int last UNUSED)
+krt_sys_shutdown(struct krt_proto *x UNUSED)
 {
   if (!krt_buffer)
     return;
index 88915dde8b569b14702e45267d93ed5dd9662a88..5e4529c5b27b8eb5aaad859e0231527cec0fd5f1 100644 (file)
@@ -15,7 +15,7 @@
 struct kif_params {
 };
 
-struct kif_status {
+struct kif_state {
 };
 
 
@@ -33,7 +33,7 @@ static inline void kif_sys_copy_config(struct kif_config *d UNUSED, struct kif_c
 struct krt_params {
 };
 
-struct krt_status {
+struct krt_state {
 };
 
 
index cdee7fe38467a47bbb1241134c38996307cae420..7b3043a7dc4abd8f69c8c0c57d52e634e153e127 100644 (file)
@@ -15,7 +15,7 @@
 struct kif_params {
 };
 
-struct kif_status {
+struct kif_state {
 };
 
 
@@ -36,7 +36,7 @@ struct krt_params {
   int table_id;                                /* Kernel table ID we sync with */
 };
 
-struct krt_status {
+struct krt_state {
 };
 
 
index 51689ff92f1b8a3125b54302c14b8196d5978b57..b0e35151b84a123c981da2c8584a507dbe78cb1c 100644 (file)
@@ -10,13 +10,13 @@ CF_HDR
 
 CF_DECLS
 
-CF_KEYWORDS(ASYNC, KERNEL, TABLE, KRT_PREFSRC, KRT_REALM)
+CF_KEYWORDS(KERNEL, TABLE, KRT_PREFSRC, KRT_REALM)
 
 CF_GRAMMAR
 
-CF_ADDTO(kern_proto, kern_proto nl_item ';')
+CF_ADDTO(kern_proto, kern_proto kern_sys_item ';')
 
-nl_item:
+kern_sys_item:
    KERNEL TABLE expr {
        if ($3 <= 0 || $3 >= NL_NUM_TABLES)
          cf_error("Kernel routing table number out of range");
index 1d24ae0ff290be68ff636e002b700caa639eeade..f61e31a5069e67e5e890328c5d90417876a832a9 100644 (file)
@@ -1086,18 +1086,16 @@ nl_open_async(void)
 static u8 nl_cf_table[(NL_NUM_TABLES+7) / 8];
 
 void
-krt_sys_start(struct krt_proto *p, int first)
+krt_sys_start(struct krt_proto *p)
 {
   nl_table_map[KRT_CF->sys.table_id] = p;
-  if (first)
-    {
-      nl_open();
-      nl_open_async();
-    }
+
+  nl_open();
+  nl_open_async();
 }
 
 void
-krt_sys_shutdown(struct krt_proto *p UNUSED, int last UNUSED)
+krt_sys_shutdown(struct krt_proto *p UNUSED)
 {
 }
 
index 3761ace610dda321f7719155a7dcdc0d5e28bb5e..54297921c7c2dcad7d5f541014ca780a84dda962 100644 (file)
 
 pool *krt_pool;
 static linpool *krt_filter_lp;
+static list krt_proto_list;
 
 void
 krt_io_init(void)
 {
   krt_pool = rp_new(&root_pool, "Kernel Syncer");
   krt_filter_lp = lp_new(krt_pool, 4080);
+  init_list(&krt_proto_list);
 }
 
 /*
@@ -565,12 +567,6 @@ krt_dump_attrs(rte *e)
  *     Routes
  */
 
-#ifdef CONFIG_ALL_TABLES_AT_ONCE
-static timer *krt_scan_timer;
-static int krt_instance_count;
-static list krt_instance_list;
-#endif
-
 static void
 krt_flush_routes(struct krt_proto *p)
 {
@@ -812,34 +808,88 @@ krt_got_route_async(struct krt_proto *p, rte *e, int new)
  *     Periodic scanning
  */
 
+
+#ifdef CONFIG_ALL_TABLES_AT_ONCE
+
+static timer *krt_scan_timer;
+static int krt_scan_count;
+
 static void
 krt_scan(timer *t UNUSED)
 {
   struct krt_proto *p;
 
   kif_force_scan();
-#ifdef CONFIG_ALL_TABLES_AT_ONCE
+
+  /* We need some node to decide whether to print the debug messages or not */
+  p = SKIP_BACK(struct krt_proto, krt_node, HEAD(krt_proto_list));
+  KRT_TRACE(p, D_EVENTS, "Scanning routing table");
+
+  krt_do_scan(NULL);
+
+  void *q;
+  WALK_LIST(q, krt_proto_list)
   {
-    void *q;
-    /* We need some node to decide whether to print the debug messages or not */
-    p = SKIP_BACK(struct krt_proto, instance_node, HEAD(krt_instance_list));
-    if (p->instance_node.next)
-      KRT_TRACE(p, D_EVENTS, "Scanning routing table");
-    krt_do_scan(NULL);
-    WALK_LIST(q, krt_instance_list)
-      {
-       p = SKIP_BACK(struct krt_proto, instance_node, q);
-       krt_prune(p);
-      }
+    p = SKIP_BACK(struct krt_proto, krt_node, q);
+    krt_prune(p);
+  }
+}
+
+static void
+krt_scan_timer_start(struct krt_proto *p)
+{
+  if (!krt_scan_count)
+  {
+    krt_scan_timer = tm_new_set(krt_pool, krt_scan, NULL, 0, KRT_CF->scan_time);
+    tm_start(krt_scan_timer, 0);
+  }
+
+  krt_scan_count++;
+}
+
+static void
+krt_scan_timer_stop(struct krt_proto *p)
+{
+  krt_scan_count--;
+
+  if (!krt_scan_count)
+  {
+    rfree(krt_scan_timer);
+    krt_scan_timer = NULL;
   }
+}
+
 #else
-  p = t->data;
+
+static void
+krt_scan(timer *t)
+{
+  struct krt_proto *p = t->data;
+
+  kif_force_scan();
+
   KRT_TRACE(p, D_EVENTS, "Scanning routing table");
   krt_do_scan(p);
   krt_prune(p);
-#endif
 }
 
+static void
+krt_scan_timer_start(struct krt_proto *p)
+{
+  p->scan_timer = tm_new_set(p->p.pool, krt_scan, p, 0, KRT_CF->scan_time);
+  tm_start(p->scan_timer, 0);
+}
+
+static void
+krt_scan_timer_stop(struct krt_proto *p)
+{
+  tm_stop(p->scan_timer);
+}
+
+#endif
+
+
+
 
 /*
  *     Updates
@@ -942,52 +992,20 @@ krt_init(struct proto_config *c)
   return &p->p;
 }
 
-static timer *
-krt_start_timer(struct krt_proto *p)
-{
-  timer *t;
-
-  t = tm_new(p->krt_pool);
-  t->hook = krt_scan;
-  t->data = p;
-  t->recurrent = KRT_CF->scan_time;
-  tm_start(t, 0);
-  return t;
-}
-
 static int
 krt_start(struct proto *P)
 {
   struct krt_proto *p = (struct krt_proto *) P;
-  int first = 1;
 
-#ifdef CONFIG_ALL_TABLES_AT_ONCE
-  if (!krt_instance_count++)
-    init_list(&krt_instance_list);
-  else
-    first = 0;
-  p->krt_pool = krt_pool;
-  add_tail(&krt_instance_list, &p->instance_node);
-#else
-  p->krt_pool = P->pool;
-#endif
+  add_tail(&krt_proto_list, &p->krt_node);
 
 #ifdef KRT_ALLOW_LEARN
   krt_learn_init(p);
 #endif
 
-  krt_sys_start(p, first);
+  krt_sys_start(p);
 
-  /* Start periodic routing table scanning */
-#ifdef CONFIG_ALL_TABLES_AT_ONCE
-  if (first)
-    krt_scan_timer = krt_start_timer(p);
-  else
-    tm_start(krt_scan_timer, 0);
-  p->scan_timer = krt_scan_timer;
-#else
-  p->scan_timer = krt_start_timer(p);
-#endif
+  krt_scan_timer_start(p);
 
   return PS_UP;
 }
@@ -996,26 +1014,16 @@ static int
 krt_shutdown(struct proto *P)
 {
   struct krt_proto *p = (struct krt_proto *) P;
-  int last = 1;
 
-#ifdef CONFIG_ALL_TABLES_AT_ONCE
-  rem_node(&p->instance_node);
-  if (--krt_instance_count)
-    last = 0;
-  else
-#endif
-    tm_stop(p->scan_timer);
+  krt_scan_timer_stop(p);
 
   /* FIXME we should flush routes even when persist during reconfiguration */
   if (p->initialized && !KRT_CF->persist)
     krt_flush_routes(p);
 
-  krt_sys_shutdown(p, last);
+  krt_sys_shutdown(p);
 
-#ifdef CONFIG_ALL_TABLES_AT_ONCE
-  if (last)
-    rfree(krt_scan_timer);
-#endif
+  rem_node(&p->krt_node);
 
   return PS_DOWN;
 }
index d6fbf7213ac9d5163e346f7f158b5904e8611dd6..446914d2bbd13d6863b987c79daa165bb2b020c6 100644 (file)
@@ -52,15 +52,17 @@ struct krt_config {
 
 struct krt_proto {
   struct proto p;
-  struct krt_status sys;       /* Sysdep state */
+  struct krt_state sys;                /* Sysdep state */
+
 #ifdef KRT_ALLOW_LEARN
   struct rtable krt_table;     /* Internal table of inherited routes */
 #endif
-  pool *krt_pool;              /* Pool used for common krt data */
+
+#ifndef CONFIG_ALL_TABLES_AT_ONCE
   timer *scan_timer;
-#ifdef CONFIG_ALL_TABLES_AT_ONCE
-  node instance_node;          /* Node in krt instance list */
 #endif
+
+  node krt_node;               /* Node in krt_proto_list */
   int initialized;             /* First scan has already been finished */
 };
 
@@ -103,7 +105,7 @@ struct kif_config {
 
 struct kif_proto {
   struct proto p;
-  struct kif_status sys;       /* Sysdep state */
+  struct kif_state sys;                /* Sysdep state */
 };
 
 #define KIF_CF ((struct kif_config *)p->p.cf)
@@ -114,8 +116,8 @@ struct proto_config * krt_init_config(int class);
 /* krt sysdep */
 
 void krt_sys_init(struct krt_proto *);
-void krt_sys_start(struct krt_proto *, int);
-void krt_sys_shutdown(struct krt_proto *, int);
+void krt_sys_start(struct krt_proto *);
+void krt_sys_shutdown(struct krt_proto *);
 int krt_sys_reconfigure(struct krt_proto *p UNUSED, struct krt_config *n, struct krt_config *o);
 
 void krt_sys_preconfig(struct config *);