]> git.proxmox.com Git - mirror_frr.git/blobdiff - zebra/zebra_nhg.h
bgpd: fix one wrong debug log for evpn
[mirror_frr.git] / zebra / zebra_nhg.h
index 0863d90a7ead6fe78b2ce33b42db026bc93ff515..9b925bf10fd7dc8dede4733864a3c96a3086609a 100644 (file)
@@ -79,16 +79,34 @@ struct nhg_hash_entry {
 
        uint32_t flags;
 
-       /* Dependency tree for other entries.
+       /* Dependency trees for other entries.
         * For instance a group with two
         * nexthops will have two dependencies
         * pointing to those nhg_hash_entries.
         *
         * Using a rb tree here to make lookups
         * faster with ID's.
+        *
+        * nhg_depends the RB tree of entries that this
+        * group contains.
+        *
+        * nhg_dependents the RB tree of entries that
+        * this group is being used by
+        *
+        * NHG id 3 with nexthops id 1/2
+        * nhg(3)->nhg_depends has 1 and 2 in the tree
+        * nhg(3)->nhg_dependents is empty
+        *
+        * nhg(1)->nhg_depends is empty
+        * nhg(1)->nhg_dependents is 3 in the tree
+        *
+        * nhg(2)->nhg_depends is empty
+        * nhg(3)->nhg_dependents is 3 in the tree
         */
        struct nhg_connected_tree_head nhg_depends, nhg_dependents;
 
+       struct thread *timer;
+
 /*
  * Is this nexthop group valid, ie all nexthops are fully resolved.
  * What is fully resolved?  It's a nexthop that is either self contained
@@ -129,6 +147,15 @@ struct nhg_hash_entry {
  */
 #define NEXTHOP_GROUP_PROTO_RELEASED (1 << 5)
 
+/*
+ * When deleting a NHG notice that it is still installed
+ * and if it is, slightly delay the actual removal to
+ * the future.  So that upper level protocols might
+ * be able to take advantage of some NHG's that
+ * are there
+ */
+#define NEXTHOP_GROUP_KEEP_AROUND (1 << 6)
+
 /*
  * Track FPM installation status..
  */
@@ -201,6 +228,7 @@ struct nhg_ctx {
                struct nh_grp grp[MULTIPATH_NUM];
        } u;
 
+       struct nhg_resilience resilience;
        enum nhg_ctx_op_e op;
        enum nhg_ctx_status status;
 };
@@ -229,6 +257,7 @@ struct nhg_hash_entry *zebra_nhg_alloc(void);
 void zebra_nhg_free(struct nhg_hash_entry *nhe);
 /* In order to clear a generic hash, we need a generic api, sigh. */
 void zebra_nhg_hash_free(void *p);
+void zebra_nhg_hash_free_zero_id(struct hash_bucket *b, void *arg);
 
 /* Init an nhe, for use in a hash lookup for example. There's some fuzziness
  * if the nhe represents only a single nexthop, so we try to capture that
@@ -280,7 +309,8 @@ void nhg_ctx_free(struct nhg_ctx **ctx);
 extern int zebra_nhg_kernel_find(uint32_t id, struct nexthop *nh,
                                 struct nh_grp *grp, uint8_t count,
                                 vrf_id_t vrf_id, afi_t afi, int type,
-                                int startup);
+                                int startup,
+                                struct nhg_resilience *resilience);
 /* Del via kernel */
 extern int zebra_nhg_kernel_del(uint32_t id, vrf_id_t vrf_id);