]> git.proxmox.com Git - mirror_frr.git/blobdiff - eigrpd/eigrp_topology.c
eigrpd: Prevent uninitialized value from being used
[mirror_frr.git] / eigrpd / eigrp_topology.c
index 2dbee166946f6003f238ea87de71d5ad0e6fd04f..6da7756f84bf5f23d20d430eb55275f248578ad9 100644 (file)
@@ -39,6 +39,7 @@
 #include "vty.h"
 #include "lib_errors.h"
 
+#include "eigrpd/eigrp_types.h"
 #include "eigrpd/eigrp_structs.h"
 #include "eigrpd/eigrpd.h"
 #include "eigrpd/eigrp_interface.h"
 #include "eigrpd/eigrp_topology.h"
 #include "eigrpd/eigrp_fsm.h"
 #include "eigrpd/eigrp_memory.h"
+#include "eigrpd/eigrp_metric.h"
 
-static int eigrp_nexthop_entry_cmp(struct eigrp_nexthop_entry *,
-                                  struct eigrp_nexthop_entry *);
+static int eigrp_route_descriptor_cmp(struct eigrp_route_descriptor *rd1,
+                                     struct eigrp_route_descriptor *rd2);
 
 /*
  * Returns linkedlist used as topology table
@@ -70,14 +72,14 @@ struct route_table *eigrp_topology_new(void)
  * Returns new created toplogy node
  * cmp - assigned function for comparing topology entry
  */
-struct eigrp_prefix_entry *eigrp_prefix_entry_new(void)
+struct eigrp_prefix_descriptor *eigrp_prefix_descriptor_new(void)
 {
-       struct eigrp_prefix_entry *new;
-       new = XCALLOC(MTYPE_EIGRP_PREFIX_ENTRY,
-                     sizeof(struct eigrp_prefix_entry));
+       struct eigrp_prefix_descriptor *new;
+       new = XCALLOC(MTYPE_EIGRP_PREFIX_DESCRIPTOR,
+                     sizeof(struct eigrp_prefix_descriptor));
        new->entries = list_new();
        new->rij = list_new();
-       new->entries->cmp = (int (*)(void *, void *))eigrp_nexthop_entry_cmp;
+       new->entries->cmp = (int (*)(void *, void *))eigrp_route_descriptor_cmp;
        new->distance = new->fdistance = new->rdistance = EIGRP_MAX_METRIC;
        new->destination = NULL;
 
@@ -87,8 +89,8 @@ struct eigrp_prefix_entry *eigrp_prefix_entry_new(void)
 /*
  * Topology entry comparison
  */
-static int eigrp_nexthop_entry_cmp(struct eigrp_nexthop_entry *entry1,
-                                  struct eigrp_nexthop_entry *entry2)
+static int eigrp_route_descriptor_cmp(struct eigrp_route_descriptor *entry1,
+                                     struct eigrp_route_descriptor *entry2)
 {
        if (entry1->distance < entry2->distance)
                return -1;
@@ -102,12 +104,12 @@ static int eigrp_nexthop_entry_cmp(struct eigrp_nexthop_entry *entry1,
  * Returns new topology entry
  */
 
-struct eigrp_nexthop_entry *eigrp_nexthop_entry_new(void)
+struct eigrp_route_descriptor *eigrp_route_descriptor_new(void)
 {
-       struct eigrp_nexthop_entry *new;
+       struct eigrp_route_descriptor *new;
 
-       new = XCALLOC(MTYPE_EIGRP_NEXTHOP_ENTRY,
-                     sizeof(struct eigrp_nexthop_entry));
+       new = XCALLOC(MTYPE_EIGRP_ROUTE_DESCRIPTOR,
+                     sizeof(struct eigrp_route_descriptor));
        new->reported_distance = EIGRP_MAX_METRIC;
        new->distance = EIGRP_MAX_METRIC;
 
@@ -126,8 +128,8 @@ void eigrp_topology_free(struct eigrp *eigrp, struct route_table *table)
 /*
  * Adding topology node to topology table
  */
-void eigrp_prefix_entry_add(struct route_table *topology,
-                           struct eigrp_prefix_entry *pe)
+void eigrp_prefix_descriptor_add(struct route_table *topology,
+                                struct eigrp_prefix_descriptor *pe)
 {
        struct route_node *rn;
 
@@ -146,9 +148,9 @@ void eigrp_prefix_entry_add(struct route_table *topology,
 /*
  * Adding topology entry to topology node
  */
-void eigrp_nexthop_entry_add(struct eigrp *eigrp,
-                            struct eigrp_prefix_entry *node,
-                            struct eigrp_nexthop_entry *entry)
+void eigrp_route_descriptor_add(struct eigrp *eigrp,
+                               struct eigrp_prefix_descriptor *node,
+                               struct eigrp_route_descriptor *entry)
 {
        struct list *l = list_new();
 
@@ -168,10 +170,11 @@ void eigrp_nexthop_entry_add(struct eigrp *eigrp,
 /*
  * Deleting topology node from topology table
  */
-void eigrp_prefix_entry_delete(struct eigrp *eigrp, struct route_table *table,
-                              struct eigrp_prefix_entry *pe)
+void eigrp_prefix_descriptor_delete(struct eigrp *eigrp,
+                                   struct route_table *table,
+                                   struct eigrp_prefix_descriptor *pe)
 {
-       struct eigrp_nexthop_entry *ne;
+       struct eigrp_route_descriptor *ne;
        struct listnode *node, *nnode;
        struct route_node *rn;
 
@@ -189,7 +192,7 @@ void eigrp_prefix_entry_delete(struct eigrp *eigrp, struct route_table *table,
        listnode_delete(eigrp->topology_changes_internalIPV4, pe);
 
        for (ALL_LIST_ELEMENTS(pe->entries, node, nnode, ne))
-               eigrp_nexthop_entry_delete(eigrp, pe, ne);
+               eigrp_route_descriptor_delete(eigrp, pe, ne);
        list_delete(&pe->entries);
        list_delete(&pe->rij);
        eigrp_zebra_route_delete(eigrp, pe->destination);
@@ -198,20 +201,20 @@ void eigrp_prefix_entry_delete(struct eigrp *eigrp, struct route_table *table,
        rn->info = NULL;
        route_unlock_node(rn); // Lookup above
        route_unlock_node(rn); // Initial creation
-       XFREE(MTYPE_EIGRP_PREFIX_ENTRY, pe);
+       XFREE(MTYPE_EIGRP_PREFIX_DESCRIPTOR, pe);
 }
 
 /*
  * Deleting topology entry from topology node
  */
-void eigrp_nexthop_entry_delete(struct eigrp *eigrp,
-                               struct eigrp_prefix_entry *node,
-                               struct eigrp_nexthop_entry *entry)
+void eigrp_route_descriptor_delete(struct eigrp *eigrp,
+                                  struct eigrp_prefix_descriptor *node,
+                                  struct eigrp_route_descriptor *entry)
 {
        if (listnode_lookup(node->entries, entry) != NULL) {
                listnode_delete(node->entries, entry);
                eigrp_zebra_route_delete(eigrp, node->destination);
-               XFREE(MTYPE_EIGRP_NEXTHOP_ENTRY, entry);
+               XFREE(MTYPE_EIGRP_ROUTE_DESCRIPTOR, entry);
        }
 }
 
@@ -222,7 +225,7 @@ void eigrp_topology_delete_all(struct eigrp *eigrp,
                               struct route_table *topology)
 {
        struct route_node *rn;
-       struct eigrp_prefix_entry *pe;
+       struct eigrp_prefix_descriptor *pe;
 
        for (rn = route_top(topology); rn; rn = route_next(rn)) {
                pe = rn->info;
@@ -230,15 +233,15 @@ void eigrp_topology_delete_all(struct eigrp *eigrp,
                if (!pe)
                        continue;
 
-               eigrp_prefix_entry_delete(eigrp, topology, pe);
+               eigrp_prefix_descriptor_delete(eigrp, topology, pe);
        }
 }
 
-struct eigrp_prefix_entry *
+struct eigrp_prefix_descriptor *
 eigrp_topology_table_lookup_ipv4(struct route_table *table,
                                 struct prefix *address)
 {
-       struct eigrp_prefix_entry *pe;
+       struct eigrp_prefix_descriptor *pe;
        struct route_node *rn;
 
        rn = route_node_lookup(table, address);
@@ -259,14 +262,15 @@ eigrp_topology_table_lookup_ipv4(struct route_table *table,
  * That way we can clean up all the list_new and list_delete's
  * that we are doing.  DBS
  */
-struct list *eigrp_topology_get_successor(struct eigrp_prefix_entry *table_node)
+struct list *
+eigrp_topology_get_successor(struct eigrp_prefix_descriptor *table_node)
 {
        struct list *successors = list_new();
-       struct eigrp_nexthop_entry *data;
+       struct eigrp_route_descriptor *data;
        struct listnode *node1, *node2;
 
        for (ALL_LIST_ELEMENTS(table_node->entries, node1, node2, data)) {
-               if (data->flags & EIGRP_NEXTHOP_ENTRY_SUCCESSOR_FLAG) {
+               if (data->flags & EIGRP_ROUTE_DESCRIPTOR_SUCCESSOR_FLAG) {
                        listnode_add(successors, data);
                }
        }
@@ -283,7 +287,7 @@ struct list *eigrp_topology_get_successor(struct eigrp_prefix_entry *table_node)
 }
 
 struct list *
-eigrp_topology_get_successor_max(struct eigrp_prefix_entry *table_node,
+eigrp_topology_get_successor_max(struct eigrp_prefix_descriptor *table_node,
                                 unsigned int maxpaths)
 {
        struct list *successors = eigrp_topology_get_successor(table_node);
@@ -300,10 +304,10 @@ eigrp_topology_get_successor_max(struct eigrp_prefix_entry *table_node,
        return successors;
 }
 
-struct eigrp_nexthop_entry *
-eigrp_prefix_entry_lookup(struct list *entries, struct eigrp_neighbor *nbr)
+struct eigrp_route_descriptor *
+eigrp_route_descriptor_lookup(struct list *entries, struct eigrp_neighbor *nbr)
 {
-       struct eigrp_nexthop_entry *data;
+       struct eigrp_route_descriptor *data;
        struct listnode *node, *nnode;
        for (ALL_LIST_ELEMENTS(entries, node, nnode, data)) {
                if (data->adv_router == nbr) {
@@ -319,8 +323,8 @@ struct list *eigrp_neighbor_prefixes_lookup(struct eigrp *eigrp,
                                            struct eigrp_neighbor *nbr)
 {
        struct listnode *node2, *node22;
-       struct eigrp_nexthop_entry *entry;
-       struct eigrp_prefix_entry *pe;
+       struct eigrp_route_descriptor *entry;
+       struct eigrp_prefix_descriptor *pe;
        struct route_node *rn;
 
        /* create new empty list for prefixes storage */
@@ -348,8 +352,8 @@ enum metric_change
 eigrp_topology_update_distance(struct eigrp_fsm_action_message *msg)
 {
        struct eigrp *eigrp = msg->eigrp;
-       struct eigrp_prefix_entry *prefix = msg->prefix;
-       struct eigrp_nexthop_entry *entry = msg->entry;
+       struct eigrp_prefix_descriptor *prefix = msg->prefix;
+       struct eigrp_route_descriptor *entry = msg->entry;
        enum metric_change change = METRIC_SAME;
        uint32_t new_reported_distance;
 
@@ -413,7 +417,7 @@ distance_done:
 
 void eigrp_topology_update_all_node_flags(struct eigrp *eigrp)
 {
-       struct eigrp_prefix_entry *pe;
+       struct eigrp_prefix_descriptor *pe;
        struct route_node *rn;
 
        if (!eigrp)
@@ -430,10 +434,10 @@ void eigrp_topology_update_all_node_flags(struct eigrp *eigrp)
 }
 
 void eigrp_topology_update_node_flags(struct eigrp *eigrp,
-                                     struct eigrp_prefix_entry *dest)
+                                     struct eigrp_prefix_descriptor *dest)
 {
        struct listnode *node;
-       struct eigrp_nexthop_entry *entry;
+       struct eigrp_route_descriptor *entry;
 
        for (ALL_LIST_ELEMENTS_RO(dest->entries, node, entry)) {
                if (entry->reported_distance < dest->fdistance) {
@@ -444,29 +448,29 @@ void eigrp_topology_update_node_flags(struct eigrp *eigrp,
                            && entry->distance != EIGRP_MAX_METRIC) {
                                // is successor
                                entry->flags |=
-                                       EIGRP_NEXTHOP_ENTRY_SUCCESSOR_FLAG;
+                                       EIGRP_ROUTE_DESCRIPTOR_SUCCESSOR_FLAG;
                                entry->flags &=
-                                       ~EIGRP_NEXTHOP_ENTRY_FSUCCESSOR_FLAG;
+                                       ~EIGRP_ROUTE_DESCRIPTOR_FSUCCESSOR_FLAG;
                        } else {
                                // is feasible successor only
                                entry->flags |=
-                                       EIGRP_NEXTHOP_ENTRY_FSUCCESSOR_FLAG;
+                                       EIGRP_ROUTE_DESCRIPTOR_FSUCCESSOR_FLAG;
                                entry->flags &=
-                                       ~EIGRP_NEXTHOP_ENTRY_SUCCESSOR_FLAG;
+                                       ~EIGRP_ROUTE_DESCRIPTOR_SUCCESSOR_FLAG;
                        }
                } else {
-                       entry->flags &= ~EIGRP_NEXTHOP_ENTRY_FSUCCESSOR_FLAG;
-                       entry->flags &= ~EIGRP_NEXTHOP_ENTRY_SUCCESSOR_FLAG;
+                       entry->flags &= ~EIGRP_ROUTE_DESCRIPTOR_FSUCCESSOR_FLAG;
+                       entry->flags &= ~EIGRP_ROUTE_DESCRIPTOR_SUCCESSOR_FLAG;
                }
        }
 }
 
 void eigrp_update_routing_table(struct eigrp *eigrp,
-                               struct eigrp_prefix_entry *prefix)
+                               struct eigrp_prefix_descriptor *prefix)
 {
        struct list *successors;
        struct listnode *node;
-       struct eigrp_nexthop_entry *entry;
+       struct eigrp_route_descriptor *entry;
 
        successors = eigrp_topology_get_successor_max(prefix, eigrp->max_paths);
 
@@ -474,13 +478,13 @@ void eigrp_update_routing_table(struct eigrp *eigrp,
                eigrp_zebra_route_add(eigrp, prefix->destination, successors,
                                      prefix->fdistance);
                for (ALL_LIST_ELEMENTS_RO(successors, node, entry))
-                       entry->flags |= EIGRP_NEXTHOP_ENTRY_INTABLE_FLAG;
+                       entry->flags |= EIGRP_ROUTE_DESCRIPTOR_INTABLE_FLAG;
 
                list_delete(&successors);
        } else {
                eigrp_zebra_route_delete(eigrp, prefix->destination);
                for (ALL_LIST_ELEMENTS_RO(prefix->entries, node, entry))
-                       entry->flags &= ~EIGRP_NEXTHOP_ENTRY_INTABLE_FLAG;
+                       entry->flags &= ~EIGRP_ROUTE_DESCRIPTOR_INTABLE_FLAG;
        }
 }
 
@@ -488,8 +492,8 @@ void eigrp_topology_neighbor_down(struct eigrp *eigrp,
                                  struct eigrp_neighbor *nbr)
 {
        struct listnode *node2, *node22;
-       struct eigrp_prefix_entry *pe;
-       struct eigrp_nexthop_entry *entry;
+       struct eigrp_prefix_descriptor *pe;
+       struct eigrp_route_descriptor *entry;
        struct route_node *rn;
 
        for (rn = route_top(eigrp->topology_table); rn; rn = route_next(rn)) {
@@ -504,6 +508,7 @@ void eigrp_topology_neighbor_down(struct eigrp *eigrp,
                        if (entry->adv_router != nbr)
                                continue;
 
+                       memset(&msg, 0, sizeof(msg));
                        msg.metrics.delay = EIGRP_MAX_METRIC;
                        msg.packet_type = EIGRP_OPC_UPDATE;
                        msg.eigrp = eigrp;
@@ -521,18 +526,18 @@ void eigrp_topology_neighbor_down(struct eigrp *eigrp,
 
 void eigrp_update_topology_table_prefix(struct eigrp *eigrp,
                                        struct route_table *table,
-                                       struct eigrp_prefix_entry *prefix)
+                                       struct eigrp_prefix_descriptor *prefix)
 {
        struct listnode *node1, *node2;
 
-       struct eigrp_nexthop_entry *entry;
+       struct eigrp_route_descriptor *entry;
        for (ALL_LIST_ELEMENTS(prefix->entries, node1, node2, entry)) {
                if (entry->distance == EIGRP_MAX_METRIC) {
-                       eigrp_nexthop_entry_delete(eigrp, prefix, entry);
+                       eigrp_route_descriptor_delete(eigrp, prefix, entry);
                }
        }
        if (prefix->distance == EIGRP_MAX_METRIC
            && prefix->nt != EIGRP_TOPOLOGY_TYPE_CONNECTED) {
-               eigrp_prefix_entry_delete(eigrp, table, prefix);
+               eigrp_prefix_descriptor_delete(eigrp, table, prefix);
        }
 }