X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=eigrpd%2Feigrp_topology.c;h=0cb4e0e9f45c3d2086fd399393f287ab16ebf7d1;hb=91d227b7e3cb53ad8fdbcd9d4cff7f0a666918e3;hp=becb29a95faafb530994c6303284b98eeeaf1daf;hpb=1b6e597ccae19986679b7e2d2b4fcc8b66bd6328;p=mirror_frr.git diff --git a/eigrpd/eigrp_topology.c b/eigrpd/eigrp_topology.c index becb29a95..0cb4e0e9f 100644 --- a/eigrpd/eigrp_topology.c +++ b/eigrpd/eigrp_topology.c @@ -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; } @@ -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,6 +436,8 @@ 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 (entry->reported_distance < dest->fdistance) { // is feasible successor, can be successor @@ -471,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))