]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Add dump request to aggregator
authorIgor Putovny <igor.putovny@nic.cz>
Tue, 8 Apr 2025 15:30:05 +0000 (17:30 +0200)
committerIgor Putovny <igor.putovny@nic.cz>
Tue, 29 Apr 2025 13:01:15 +0000 (15:01 +0200)
proto/aggregator/aggregator.h
proto/aggregator/config.Y
proto/aggregator/trie.c

index d14e0a11bd907d6f8c386713700079abd3f42c32..97bf12461ff6affb36a2f638aa5119116a42e1e4 100644 (file)
@@ -100,6 +100,9 @@ struct aggregator_proto {
   struct rte_withdrawal_item *rte_withdrawal_stack;
   struct linpool *rte_withdrawal_pool;
   int rte_withdrawal_count;
+
+  /* This may be requested as a dump target */
+  struct dump_request_target dump_request_target;
 };
 
 enum aggr_item_type {
@@ -153,4 +156,6 @@ void aggregator_bucket_update(struct aggregator_proto *p, struct aggregator_buck
 
 struct trie_node *aggregator_root_init(struct aggregator_bucket *bucket, struct slab *trie_slab);
 
+void aggregator_trie_dump(struct dump_request *dreq);
+
 #endif
index 6a4abca04b70ee9bfb0e2720382bfa1d7a9f5c79..bd56a81bdd6eec9d4fa748ea6d4e82bbd16d28ca 100644 (file)
@@ -26,6 +26,18 @@ CF_KEYWORDS(AGGREGATOR, PEER, AGGREGATE, ON, MERGE, BY, RELOAD, AFTER, LOG, ALL)
 
 CF_GRAMMAR
 
+CF_CLI(DUMP AGGREGATOR TRIE, CF_SYM_KNOWN text,, [[Dump prefix aggregation trie]])
+{
+  cf_assert_symbol($4, SYM_PROTO);
+
+  struct proto_config *cfg = $4->proto;
+  struct proto *P = cfg->proto;
+  struct aggregator_proto *p = SKIP_BACK(struct aggregator_proto, p, P);
+  struct dump_request_target *dump_request_target = &p->dump_request_target;
+
+  cmd_dump_file(this_cli, $5, "Prefix aggregation trie", aggregator_trie_dump, dump_request_target);
+};
+
 proto: aggregator_proto ;
 
 aggregator_proto_start: proto_start AGGREGATOR
index 3603424701ee32964f0414821c1731fc19d83978..04ee6e3cbd8dc6c7e395ee35c60ba7af740fa64c 100644 (file)
@@ -348,7 +348,7 @@ aggregator_merge_potential_buckets(struct trie_node *target, const struct trie_n
  * Dump aggregation trie
  */
 static void
-aggregator_dump_trie_helper(const struct trie_node *node, ip_addr *prefix, u32 pxlen, u32 addr_type, struct buffer *buf)
+aggregator_trie_dump_helper(const struct trie_node *node, ip_addr *prefix, u32 pxlen, u32 addr_type, struct buffer *buf, struct dump_request *dreq)
 {
   ASSERT_DIE(node != NULL);
   ASSERT_DIE(prefix != NULL);
@@ -401,35 +401,37 @@ aggregator_dump_trie_helper(const struct trie_node *node, ip_addr *prefix, u32 p
     buffer_print(buf, " -> [[%u]]", node->selected_bucket->id);
 
   buffer_print(buf, " %p %s", node, px_origin_str[node->px_origin]);
-  log("%s", buf->start);
+  RDUMP("%s\n", buf->start);
 
   if (node->child[0])
   {
     ASSERT_DIE((u32)node->depth == pxlen);
     ip6_clrbit(prefix, node->depth + ipa_shift[addr_type]);
-    aggregator_dump_trie_helper(node->child[0], prefix, pxlen + 1, addr_type, buf);
+    aggregator_trie_dump_helper(node->child[0], prefix, pxlen + 1, addr_type, buf, dreq);
   }
 
   if (node->child[1])
   {
     ASSERT_DIE((u32)node->depth == pxlen);
     ip6_setbit(prefix, node->depth + ipa_shift[addr_type]);
-    aggregator_dump_trie_helper(node->child[1], prefix, pxlen + 1, addr_type, buf);
+    aggregator_trie_dump_helper(node->child[1], prefix, pxlen + 1, addr_type, buf, dreq);
     ip6_clrbit(prefix, node->depth + ipa_shift[addr_type]);
   }
 }
 
-static void
-aggregator_dump_trie(const struct aggregator_proto *p)
+void
+aggregator_trie_dump(struct dump_request *dreq)
 {
+  struct aggregator_proto *p = SKIP_BACK(struct aggregator_proto, dump_request_target, dreq->target);
+
   ip_addr prefix = (p->addr_type == NET_IP4) ? ipa_from_ip4(IP4_NONE) : ipa_from_ip6(IP6_NONE);
 
   struct buffer buf = { 0 };
   LOG_BUFFER_INIT(buf);
 
-  log("==== TRIE BEGIN ====");
-  aggregator_dump_trie_helper(p->root, &prefix, 0, p->addr_type, &buf);
-  log("==== TRIE   END ====");
+  RDUMP("======== TRIE BEGIN ========\n");
+  aggregator_trie_dump_helper(p->root, &prefix, 0, p->addr_type, &buf, dreq);
+  RDUMP("======== TRIE   END ========\n");
 }
 
 static inline void