]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Table debug is now a per-table setting and has categories.
authorMaria Matejka <mq@ucw.cz>
Tue, 30 Aug 2022 17:40:58 +0000 (19:40 +0200)
committerMaria Matejka <mq@ucw.cz>
Thu, 1 Sep 2022 16:46:40 +0000 (18:46 +0200)
doc/bird.sgml
nest/config.Y
nest/rt-table.c
nest/rt.h

index c29353fce9ef33edad7b2849c06098640adf90c8..b12ac544468e3365535f354396b69000a4b56375 100644 (file)
@@ -505,6 +505,11 @@ include "tablename.conf";;
        See <ref id="channel-debug" name="debug"> in the channel section.
        Default: off.
 
+       <tag><label id="opt-debug-tables">debug tables all|off|{ states|routes|filters|events [, <m/.../] }</tag>
+       Set global defaults of table debugging options.
+       See <ref id="rtable-debug" name="debug"> in the table section.
+       Default: off.
+
        <tag><label id="opt-debug-commands">debug commands <m/number/</tag>
        Control logging of client connections (0 for no logging, 1 for logging
        of connects and disconnects, 2 and higher for logging of all client
@@ -708,6 +713,16 @@ to set options.
         second one is the high threshold (when to pause). The higher is the
         threshold, the more memory can get used. In most cases, the defaults
        should work for you. Default: 128, 512.
+
+       <tag><label id="rtable-debug">debug all|off|{ states|routes|events [, <m/.../] }</tag>
+       Set table debugging options. Each table can write some trace messages
+       into log with category <cf/trace/. You can request <cf/all/ trace messages
+       or select some types: <cf/states/ for table state changes and auxiliary
+       processes, <cf/routes/ for auxiliary route notifications (next hop update,
+        flowspec revalidation) and <cf/events/ for more detailed auxiliary routine
+       debug. See also <ref id="channel-debug" name="channel debugging option">.
+       Default: off.
+
 </descrip>
 
 
index 4bf0fefebfde944a523774005cd25a977c9a55a3..3ad6530db63a0952dc9a8a8815f3adc5fd6c7fa1 100644 (file)
@@ -235,6 +235,7 @@ table_opt:
      if ($3 > $4) cf_error("Cork low threshold must be lower than the high threshold.");
      this_table->cork_threshold.low = $3;
      this_table->cork_threshold.high = $4; }
+ | DEBUG bool { this_table->debug = $2; }
  ;
 
 table_opts:
@@ -394,7 +395,7 @@ debug_default:
    DEBUG PROTOCOLS debug_mask { new_config->proto_default_debug = $3; }
  | DEBUG CHANNELS debug_mask { new_config->channel_default_debug = $3; }
  | DEBUG COMMANDS expr { new_config->cli_debug = $3; }
- | DEBUG TABLES bool { new_config->table_debug = $3; }
+ | DEBUG TABLES debug_mask { new_config->table_debug = $3; }
  ;
 
 /* MRTDUMP PROTOCOLS is in systep/unix/config.Y */
index f0552965227f9326934b325feddab59dec51cbf0..7fc0d280d0f1746fdf3a7b4d36ead46960468c22 100644 (file)
@@ -188,6 +188,12 @@ const char *rt_export_state_name(u8 state)
 static inline struct rte_storage *rt_next_hop_update_rte(rtable *tab, net *n, rte *old);
 static struct hostentry *rt_get_hostentry(rtable *tab, ip_addr a, ip_addr ll, rtable *dep);
 
+#define rt_trace(tab, level, fmt, args...)  do {\
+  rtable *t = (tab);                           \
+  if (t->config->debug & (level))              \
+    log(L_TRACE "%s: " fmt, t->name, ##args);  \
+} while (0)
+
 static void
 net_init_with_trie(struct fib *f, void *N)
 {
@@ -2315,8 +2321,7 @@ rt_export_used(struct rt_exporter *e)
 {
   rtable *tab = SKIP_BACK(rtable, exporter, e);
 
-  if (config->table_debug)
-    log(L_TRACE "%s: Export cleanup requested", tab->name);
+  rt_trace(tab, D_EVENTS, "Export cleanup requested");
 
   if (tab->export_used)
     return;
@@ -2341,8 +2346,8 @@ rt_event(void *ptr)
       (tab->hcu_scheduled || tab->nhu_state) && rt_cork_check(tab->uncork_event)
       )
   {
-    if (!tab->hcu_corked && !tab->nhu_corked && config->table_debug)
-      log(L_TRACE "%s: Auxiliary routines corked", tab->name);
+    if (!tab->hcu_corked && !tab->nhu_corked)
+      rt_trace(tab, D_STATES, "Next hop updater corked");
 
     tab->hcu_corked |= tab->hcu_scheduled;
     tab->hcu_scheduled = 0;
@@ -2374,8 +2379,7 @@ rt_uncork_event(void *ptr)
   tab->nhu_state |= tab->nhu_corked;
   tab->nhu_corked = 0;
 
-  if (config->table_debug)
-    log(L_TRACE "%s: Auxiliary routines uncorked", tab->name);
+  rt_trace(tab, D_STATES, "Next hop updater uncorked");
 
   ev_schedule(tab->rt_event);
 }
@@ -2704,7 +2708,7 @@ rt_prune_table(rtable *tab)
   struct rt_import_hook *ih;
   node *n, *x;
 
-  DBG("Pruning route table %s\n", tab->name);
+  rt_trace(tab, D_STATES, "Pruning");
 #ifdef DEBUGGING
   fib_check(&tab->fib);
 #endif
@@ -2882,9 +2886,7 @@ rt_export_cleanup(rtable *tab)
 
   tab->exporter.first = last_export_to_free ? rt_next_export_fast(last_export_to_free) : NULL;
 
-  if (config->table_debug)
-    log(L_TRACE "%s: Export cleanup, old exporter.first seq %lu, new %lu, min_seq %ld",
-      tab->name,
+  rt_trace(tab, D_STATES, "Export cleanup, old exporter.first seq %lu, new %lu, min_seq %ld",
       first ? first->seq : 0,
       tab->exporter.first ? tab->exporter.first->seq : 0,
       min_seq);
@@ -2962,8 +2964,7 @@ rt_export_cleanup(rtable *tab)
 
       if (EMPTY_LIST(tab->exporter.pending))
       {
-       if (config->table_debug)
-         log(L_TRACE "%s: Resetting export seq", tab->name);
+       rt_trace(tab, D_EVENTS, "Resetting export seq");
 
        node *n;
        WALK_LIST2(eh, n, tab->exporter.hooks, n)
@@ -3635,6 +3636,7 @@ rt_new_table(struct symbol *s, uint addr_type)
   c->max_settle_time = 20 S;
   c->cork_threshold.low = 128;
   c->cork_threshold.high = 512;
+  c->debug = new_config->table_debug;
 
   add_tail(&new_config->tables, &c->n);
 
@@ -3691,8 +3693,7 @@ rt_check_cork_low(rtable *tab)
     tab->cork_active = 0;
     rt_cork_release();
 
-    if (config->table_debug)
-      log(L_TRACE "%s: Uncorked", tab->name);
+    rt_trace(tab, D_STATES, "Uncorked");
   }
 }
 
@@ -3704,8 +3705,7 @@ rt_check_cork_high(rtable *tab)
     tab->cork_active = 1;
     rt_cork_acquire();
 
-    if (config->table_debug)
-      log(L_TRACE "%s: Corked", tab->name);
+    rt_trace(tab, D_STATES, "Corked");
   }
 }
 
index f5cf9457f4f6f47d35691377c9bf138a5260f53b..66edf227f1dbf18fd0aa0a8d167bf2789941abf0 100644 (file)
--- a/nest/rt.h
+++ b/nest/rt.h
@@ -59,6 +59,7 @@ struct rtable_config {
   uint gc_period;                      /* Approximate time between two consecutive GC runs */
   byte sorted;                         /* Routes of network are sorted according to rte_better() */
   byte trie_used;                      /* Rtable has attached trie */
+  byte debug;                          /* Whether to log */
   btime min_settle_time;               /* Minimum settle time for notifications */
   btime max_settle_time;               /* Maximum settle time for notifications */
   btime export_settle_time;            /* Delay before exports are announced */