mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-14 16:04:49 +00:00
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 <dslice@cumulusnetworks.com> Reviewed-by:
This commit is contained in:
parent
72c62cb803
commit
47301614a9
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user