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:
Don Slice 2017-04-21 11:18:42 -07:00
parent 72c62cb803
commit 47301614a9

View File

@ -495,6 +495,7 @@ int
zebra_add_import_table_entry (struct route_node *rn, struct rib *rib, const char *rmap_name) zebra_add_import_table_entry (struct route_node *rn, struct rib *rib, const char *rmap_name)
{ {
struct rib *newrib; struct rib *newrib;
struct rib *same;
struct prefix p; struct prefix p;
struct nexthop *nhop; struct nexthop *nhop;
union g_addr *gate; 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.prefixlen = rn->p.prefixlen;
p.u.prefix4 = rn->p.u.prefix4; 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) if (rib->nexthop_num == 1)
{ {
nhop = rib->nexthop; nhop = rib->nexthop;