From: Don Slice Date: Fri, 21 Apr 2017 18:18:42 +0000 (-0700) Subject: zebra: fix attempt to install a second rib from imported table entries X-Git-Tag: reindent-master-before~206^2 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=47301614a9939f7aaa4c98be6450497b2a717bbe;p=matthieu%2Ffrr.git zebra: fix attempt to install a second rib from imported table entries Problem reported by a customer with prefix imported by rdnbrd not being successfully installed in the quagga rib. Determined that this was due to VRR resolving the same arp entry, causing two entries to be installed in table 10. When these were imported into the quagga rib, they came in as two different rib entries from the same table/instance, which is not permitted and caused them to be deleted. Added logic to zebra_add_import_table_entry to do the same actions as rib_add and delete the older rib entry if a new rib entry is received which matches. Manual testing successful and automated tests for redistribute neighbor have the same passes and failures as the base. Ticket: CM-15926 Signed-off-by: Don Slice Reviewed-by: --- diff --git a/zebra/redistribute.c b/zebra/redistribute.c index 9c7ef5f12c..7c1494cc6a 100644 --- a/zebra/redistribute.c +++ b/zebra/redistribute.c @@ -495,6 +495,7 @@ int zebra_add_import_table_entry (struct route_node *rn, struct rib *rib, const char *rmap_name) { struct rib *newrib; + struct rib *same; struct prefix p; struct nexthop *nhop; union g_addr *gate; @@ -512,6 +513,21 @@ zebra_add_import_table_entry (struct route_node *rn, struct rib *rib, const char p.prefixlen = rn->p.prefixlen; p.u.prefix4 = rn->p.u.prefix4; + RNODE_FOREACH_RIB (rn, same) + { + if (CHECK_FLAG (same->status, RIB_ENTRY_REMOVED)) + continue; + + if (same->type == rib->type && same->instance == rib->instance + && same->table == rib->table + && same->type != ZEBRA_ROUTE_CONNECT) + break; + } + + if (same) + zebra_del_import_table_entry (rn, same); + + if (rib->nexthop_num == 1) { nhop = rib->nexthop;