]> git.proxmox.com Git - mirror_frr.git/blobdiff - eigrpd/eigrp_topology.c
zebra, lib: fix the ZEBRA_INTERFACE_VRF_UPDATE zapi message
[mirror_frr.git] / eigrpd / eigrp_topology.c
index bab47ea133f4caf6050679eef13ab8a9cbed89df..0cb4e0e9f45c3d2086fd399393f287ab16ebf7d1 100644 (file)
@@ -37,6 +37,7 @@
 #include "log.h"
 #include "linklist.h"
 #include "vty.h"
+#include "lib_errors.h"
 
 #include "eigrpd/eigrp_structs.h"
 #include "eigrpd/eigrpd.h"
@@ -117,16 +118,9 @@ struct eigrp_nexthop_entry *eigrp_nexthop_entry_new()
  * Freeing topology table list
  */
 void eigrp_topology_free(struct route_table *table)
-{
-       route_table_finish(table);
-}
-
-/*
- * Deleting all topology nodes in table
- */
-void eigrp_topology_cleanup(struct route_table *table)
 {
        eigrp_topology_delete_all(table);
+       route_table_finish(table);
 }
 
 /*
@@ -170,7 +164,7 @@ void eigrp_nexthop_entry_add(struct eigrp_prefix_entry *node,
                eigrp_zebra_route_add(node->destination, l);
        }
 
-       list_delete_and_null(&l);
+       list_delete(&l);
 }
 
 /*
@@ -180,8 +174,13 @@ void eigrp_prefix_entry_delete(struct route_table *table,
                               struct eigrp_prefix_entry *pe)
 {
        struct eigrp *eigrp = eigrp_lookup();
+       struct eigrp_nexthop_entry *ne;
+       struct listnode *node, *nnode;
        struct route_node *rn;
 
+       if (!eigrp)
+               return;
+
        rn = route_node_lookup(table, pe->destination);
        if (!rn)
                return;
@@ -192,9 +191,12 @@ void eigrp_prefix_entry_delete(struct route_table *table,
         */
        listnode_delete(eigrp->topology_changes_internalIPV4, pe);
 
-       list_delete_and_null(&pe->entries);
-       list_delete_and_null(&pe->rij);
+       for (ALL_LIST_ELEMENTS(pe->entries, node, nnode, ne))
+               eigrp_nexthop_entry_delete(pe, ne);
+       list_delete(&pe->entries);
+       list_delete(&pe->rij);
        eigrp_zebra_route_delete(pe->destination);
+       prefix_free(pe->destination);
 
        rn->info = NULL;
        route_unlock_node(rn); // Lookup above
@@ -233,18 +235,6 @@ void eigrp_topology_delete_all(struct route_table *topology)
        }
 }
 
-/*
- * Return 0 if topology is not empty
- * otherwise return 1
- */
-unsigned int eigrp_topology_table_isempty(struct list *topology)
-{
-       if (topology->count)
-               return 1;
-       else
-               return 0;
-}
-
 struct eigrp_prefix_entry *
 eigrp_topology_table_lookup_ipv4(struct route_table *table,
                                 struct prefix *address)
@@ -286,7 +276,7 @@ struct list *eigrp_topology_get_successor(struct eigrp_prefix_entry *table_node)
         * If we have no successors return NULL
         */
        if (!successors->count) {
-               list_delete_and_null(&successors);
+               list_delete(&successors);
                successors = NULL;
        }
 
@@ -362,7 +352,7 @@ eigrp_topology_update_distance(struct eigrp_fsm_action_message *msg)
        struct eigrp_prefix_entry *prefix = msg->prefix;
        struct eigrp_nexthop_entry *entry = msg->entry;
        enum metric_change change = METRIC_SAME;
-       u_int32_t new_reported_distance;
+       uint32_t new_reported_distance;
 
        assert(entry);
 
@@ -408,7 +398,8 @@ eigrp_topology_update_distance(struct eigrp_fsm_action_message *msg)
                }
                break;
        default:
-               zlog_err("%s: Please implement handler", __PRETTY_FUNCTION__);
+               flog_err(EC_LIB_DEVELOPMENT, "%s: Please implement handler",
+                        __PRETTY_FUNCTION__);
                break;
        }
 distance_done:
@@ -426,6 +417,9 @@ void eigrp_topology_update_all_node_flags(struct eigrp *eigrp)
        struct eigrp_prefix_entry *pe;
        struct route_node *rn;
 
+       if (!eigrp)
+               return;
+
        for (rn = route_top(eigrp->topology_table); rn; rn = route_next(rn)) {
                pe = rn->info;
 
@@ -442,18 +436,27 @@ void eigrp_topology_update_node_flags(struct eigrp_prefix_entry *dest)
        struct eigrp_nexthop_entry *entry;
        struct eigrp *eigrp = eigrp_lookup();
 
+       assert(eigrp);
+
        for (ALL_LIST_ELEMENTS_RO(dest->entries, node, entry)) {
-               if (((uint64_t)entry->distance
-                    <= (uint64_t)dest->distance * (uint64_t)eigrp->variance)
-                   && entry->distance != EIGRP_MAX_METRIC) // is successor
-               {
-                       entry->flags |= EIGRP_NEXTHOP_ENTRY_SUCCESSOR_FLAG;
-                       entry->flags &= ~EIGRP_NEXTHOP_ENTRY_FSUCCESSOR_FLAG;
-               } else if (entry->reported_distance
-                          < dest->fdistance) // is feasible successor
-               {
-                       entry->flags |= EIGRP_NEXTHOP_ENTRY_FSUCCESSOR_FLAG;
-                       entry->flags &= ~EIGRP_NEXTHOP_ENTRY_SUCCESSOR_FLAG;
+               if (entry->reported_distance < dest->fdistance) {
+                       // is feasible successor, can be successor
+                       if (((uint64_t)entry->distance
+                            <= (uint64_t)dest->distance
+                                       * (uint64_t)eigrp->variance)
+                           && entry->distance != EIGRP_MAX_METRIC) {
+                               // is successor
+                               entry->flags |=
+                                       EIGRP_NEXTHOP_ENTRY_SUCCESSOR_FLAG;
+                               entry->flags &=
+                                       ~EIGRP_NEXTHOP_ENTRY_FSUCCESSOR_FLAG;
+                       } else {
+                               // is feasible successor only
+                               entry->flags |=
+                                       EIGRP_NEXTHOP_ENTRY_FSUCCESSOR_FLAG;
+                               entry->flags &=
+                                       ~EIGRP_NEXTHOP_ENTRY_SUCCESSOR_FLAG;
+                       }
                } else {
                        entry->flags &= ~EIGRP_NEXTHOP_ENTRY_FSUCCESSOR_FLAG;
                        entry->flags &= ~EIGRP_NEXTHOP_ENTRY_SUCCESSOR_FLAG;
@@ -464,17 +467,21 @@ void eigrp_topology_update_node_flags(struct eigrp_prefix_entry *dest)
 void eigrp_update_routing_table(struct eigrp_prefix_entry *prefix)
 {
        struct eigrp *eigrp = eigrp_lookup();
-       struct list *successors =
-               eigrp_topology_get_successor_max(prefix, eigrp->max_paths);
+       struct list *successors;
        struct listnode *node;
        struct eigrp_nexthop_entry *entry;
 
+       if (!eigrp)
+               return;
+
+       successors = eigrp_topology_get_successor_max(prefix, eigrp->max_paths);
+
        if (successors) {
                eigrp_zebra_route_add(prefix->destination, successors);
                for (ALL_LIST_ELEMENTS_RO(successors, node, entry))
                        entry->flags |= EIGRP_NEXTHOP_ENTRY_INTABLE_FLAG;
 
-               list_delete_and_null(&successors);
+               list_delete(&successors);
        } else {
                eigrp_zebra_route_delete(prefix->destination);
                for (ALL_LIST_ELEMENTS_RO(prefix->entries, node, entry))