]> git.proxmox.com Git - mirror_frr.git/blobdiff - eigrpd/eigrp_topology.c
Merge pull request #3023 from qlyoung/ultimate-warning-reference-cards-rename
[mirror_frr.git] / eigrpd / eigrp_topology.c
index bab47ea133f4caf6050679eef13ab8a9cbed89df..80814d6d367da49488a6422c20f7ae94a9dca812 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"
@@ -182,6 +183,9 @@ void eigrp_prefix_entry_delete(struct route_table *table,
        struct eigrp *eigrp = eigrp_lookup();
        struct route_node *rn;
 
+       if (!eigrp)
+               return;
+
        rn = route_node_lookup(table, pe->destination);
        if (!rn)
                return;
@@ -362,7 +366,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 +412,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 +431,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 +450,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,11 +481,15 @@ 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))