]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
TMP
authorkaterina.kubecova <katerina.kubecova@nic.cz>
Wed, 27 Sep 2023 14:27:37 +0000 (16:27 +0200)
committerkaterina.kubecova <katerina.kubecova@nic.cz>
Wed, 27 Sep 2023 14:27:37 +0000 (16:27 +0200)
nest/proto.c

index b06f7b727b2d0a1402b3fd2afe82efffce8244f7..cca94123938cf4dbaa8441303cbde9c836c89fa2 100644 (file)
@@ -289,6 +289,8 @@ struct roa_subscription {
   struct settle settle;
   struct channel *c;
   struct rt_export_request req;
+  struct f_trie* trie;
+  struct linpool* linpool;
 };
 
 static void
@@ -306,18 +308,47 @@ channel_roa_out_changed(struct settle *se)
 {
   struct roa_subscription *s = SKIP_BACK(struct roa_subscription, settle, se);
   struct channel *c = s->c;
-
+  
   CD(c, "Feeding triggered by RPKI change");
 
+  struct f_trie_node4 n4  = (struct f_trie_node4) s->trie->root.v4;
+  
+  
+  
+  
+    int pos = 0, end = 0;
+    pos = 0;
+    uint pxc = 0;
+    TRIE_WALK(s->trie, net, NULL)
+    {
+    log_msg(L_DEBUG "channel changed %i", net);
+
+
+      pos++;
+      pxc++;
+    }
+    TRIE_WALK_END;
+  
+  
+  
+  log_msg(L_DEBUG "channel changed %i %i %i %i %i", s->trie->ipv4, s->trie->root, n4.mask, n4.plen, n4.accept);
   c->refeed_pending = 1;
   channel_stop_export(c);
 }
 
 static void
-channel_export_one_roa(struct rt_export_request *req, const net_addr *net UNUSED, struct rt_pending_export *first)
+channel_export_one_roa(struct rt_export_request *req, const net_addr *net, struct rt_pending_export *first)
 {
   struct roa_subscription *s = SKIP_BACK(struct roa_subscription, req, req);
-
+  net_addr* copy = lp_alloc(s->linpool, sizeof(net_addr));
+  net_copy(copy, net);
+  struct f_trie * trie = f_new_trie(s->linpool, 0);
+  log_msg(L_DEBUG "min len %i", net_pxlen(net));
+  if (net->type == NET_IP4 || net->type == NET_VPN4 || net->type == NET_ROA4){
+    trie_add_prefix(trie, net, net_pxlen(net), 2);
+  }
+  else trie_add_prefix(trie, net, net_pxlen(net), 128);
+  s->trie = trie;
   /* TODO: use the information about what roa has changed */
   settle_kick(&s->settle, s->c->proto->loop);
 
@@ -365,6 +396,7 @@ channel_roa_subscribe(struct channel *c, rtable *tab, int dir)
   *s = (struct roa_subscription) {
     .settle = SETTLE_INIT(&c->roa_settle, dir ? channel_roa_in_changed : channel_roa_out_changed, NULL),
     .c = c,
+    .linpool = lp_new(c->proto->pool),
     .req = {
       .name = mb_sprintf(c->proto->pool, "%s.%s.roa-%s.%s",
          c->proto->name, c->name, dir ? "in" : "out", tab->name),
@@ -395,6 +427,7 @@ channel_roa_unsubscribed(struct rt_export_request *req)
 static void
 channel_roa_unsubscribe(struct roa_subscription *s)
 {
+  lp_flush(s->linpool);
   rt_stop_export(&s->req, channel_roa_unsubscribed);
   settle_cancel(&s->settle);
 }