]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
mrtload: discard routes on BS_CLOSE
authorKaterina Kubecova <katerina.kubecova@nic.cz>
Thu, 3 Jul 2025 11:17:58 +0000 (13:17 +0200)
committerKaterina Kubecova <katerina.kubecova@nic.cz>
Thu, 3 Jul 2025 11:17:58 +0000 (13:17 +0200)
proto/mrt/mrt_load.c

index fbfea6f30549e7aebf9169ab392174a23b1c8ba5..7a36a611aa2645278eb68821359928e8b505a721 100644 (file)
@@ -134,6 +134,38 @@ mrt_parse_bgp_message(FILE *fp, u64 *remains, bool as4, struct mrtload_proto *p)
   return route_attrs;
 }
 
+void
+mrt_parse_bgp4mp_change_state(FILE *fp, u64 *remains, bool as4, struct proto *P)
+{
+  struct mrtload_proto *p = SKIP_BACK(struct mrtload_proto, p, P);
+  struct mrtload_route_ctx *ra = mrt_parse_bgp_message(fp, remains, as4, p);
+  int old_state = mrtload_two_octet(fp, remains);
+  int new_state = mrtload_two_octet(fp, remains);
+  log("old state %i new state %i", old_state, new_state);
+
+  log("new_state %i == BS_CLOSE && ra->addr_fam %i == p->channel->afi >> 16  %i", new_state, ra->addr_fam, p->channel->afi >> 16);
+  if (new_state == BS_CLOSE && ra->addr_fam == (int)(p->channel->afi >> 16))
+  {
+    FIB_WALK(&p->channel->c.table->fib, net, n)
+    {
+      rte *e = n->routes;
+      while(e)
+      {
+        rte *next = e->next;
+        if (e->sender == &p->channel->c && e->src == P->main_source)
+        {
+          rte_update2(&p->channel->c, e->net->n.addr, NULL, P->main_source);
+        }
+        e = next;
+      }
+    }
+    FIB_WALK_END;
+    HASH_DO_REMOVE(p->ctx_hash, MRTLOAD_CTX, &ra);
+    mb_free(ra);
+  }
+}
+
+
 static void
 mrt_rx_end_mark(struct bgp_parse_state *s UNUSED, u32 afi UNUSED)
 {
@@ -248,11 +280,14 @@ mrt_parse_general_header(FILE *fp, struct proto *P)
     switch (subtype)
     {
       case (MRT_BGP4MP_MESSAGE):
+        mrt_parse_bgp4mp_change_state(fp, &remains, false, P);
+        break;
       case (MRT_BGP4MP_MESSAGE_LOCAL):
       case (MRT_BGP4MP_MESSAGE_ADDPATH):
         mrt_parse_bgp4mp_message(fp, &remains, false, P);
         break;
       case (MRT_BGP4MP_STATE_CHANGE_AS4):
+        mrt_parse_bgp4mp_change_state(fp, &remains, true, P);
         break;
       case (MRT_BGP4MP_MESSAGE_AS4):
       case (MRT_BGP4MP_MESSAGE_AS4_LOCAL):