diff --git a/bgpd/bgp_main.c b/bgpd/bgp_main.c index 851c4880c3..44d5ee68cc 100644 --- a/bgpd/bgp_main.c +++ b/bgpd/bgp_main.c @@ -207,6 +207,8 @@ static __attribute__((__noreturn__)) void bgp_exit(int status) bgp_evpn_mh_finish(); bgp_nhg_finish(); + zebra_announce_fini(&bm->zebra_announce_head); + /* reverse bgp_dump_init */ bgp_dump_finish(); diff --git a/bgpd/bgp_table.h b/bgpd/bgp_table.h index 5b4c3be212..94bd816f55 100644 --- a/bgpd/bgp_table.h +++ b/bgpd/bgp_table.h @@ -76,6 +76,8 @@ struct bgp_dest { STAILQ_ENTRY(bgp_dest) pq; + struct zebra_announce_item zai; + uint64_t version; mpls_label_t local_label; @@ -97,6 +99,8 @@ struct bgp_dest { enum bgp_path_selection_reason reason; }; +DECLARE_LIST(zebra_announce, struct bgp_dest, zai); + extern void bgp_delete_listnode(struct bgp_dest *dest); /* * bgp_table_iter_t diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index e7712f0f3e..650148859e 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -8289,6 +8289,8 @@ void bgp_master_init(struct event_loop *master, const int buffer_size, memset(&bgp_master, 0, sizeof(bgp_master)); bm = &bgp_master; + + zebra_announce_init(&bm->zebra_announce_head); bm->bgp = list_new(); bm->listen_sockets = list_new(); bm->port = BGP_PORT_DEFAULT; diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h index 94bb107253..a1c7791c35 100644 --- a/bgpd/bgpd.h +++ b/bgpd/bgpd.h @@ -18,6 +18,8 @@ #include "iana_afi.h" #include "asn.h" +PREDECL_LIST(zebra_announce); + /* For union sockunion. */ #include "queue.h" #include "sockunion.h" @@ -175,6 +177,9 @@ struct bgp_master { bool v6_with_v4_nexthops; + /* To preserve ordering of installations into zebra across all Vrfs */ + struct zebra_announce_head zebra_announce_head; + QOBJ_FIELDS; }; DECLARE_QOBJ_TYPE(bgp_master);