Hello, Timo. Thank you for the patch - multipath works correct now.
Best regards, Igor > 9 апр. 2016 г., в 17:22, Timo Teräs <[email protected]> написал(а): > > The rib entries are normally added and deleted when they are > changed. However, they are modified in placae when the nexthop > reachability changes. This fixes to: > - properly detect nexthop changes from nexthop_active_update() > calls from rib_process() > - rib_update_kernel() to not reset FIB flags when a RIB entry > is being modifed (old and new RIB are same) > - improves the "show ip route <prefix>" output to display > both ACTIVE and FIB flags for each nexthop > > Fixes: 325823a5 "zebra: support FIB override routes" > Signed-off-by: Timo Teräs <[email protected]> > --- > Igor, can you verify if this fixes now the multihop problem for you? > > zebra/zebra_rib.c | 16 ++++++++++------ > zebra/zebra_vty.c | 3 ++- > 2 files changed, 12 insertions(+), 7 deletions(-) > > diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c > index 1650dab..18eece8 100644 > --- a/zebra/zebra_rib.c > +++ b/zebra/zebra_rib.c > @@ -1078,7 +1078,6 @@ nexthop_active_update (struct route_node *rn, struct > rib *rib, int set) > ifindex_t prev_index; > > rib->nexthop_active_num = 0; > - UNSET_FLAG (rib->status, RIB_ENTRY_CHANGED); > > for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next) > { > @@ -1124,12 +1123,15 @@ rib_update_kernel (struct route_node *rn, struct rib > *old, struct rib *new) > > /* This condition is never met, if we are using rt_socket.c */ > if (ret < 0 && new) > + { > for (ALL_NEXTHOPS_RO(new->nexthop, nexthop, tnexthop, recursing)) > UNSET_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB); > - > - if (old) > - for (ALL_NEXTHOPS_RO(old->nexthop, nexthop, tnexthop, recursing)) > - UNSET_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB); > + } > + else if (old && old != new) > + { > + for (ALL_NEXTHOPS_RO(old->nexthop, nexthop, tnexthop, recursing)) > + UNSET_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB); > + } > > return ret; > } > @@ -1275,6 +1277,8 @@ rib_process (struct route_node *rn) > > RNODE_FOREACH_RIB (rn, rib) > { > + UNSET_FLAG (rib->status, RIB_ENTRY_CHANGED); > + > /* Currently installed rib. */ > if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED)) > { > @@ -1323,7 +1327,7 @@ rib_process (struct route_node *rn) > if (new_fib) > nexthop_active_update (rn, new_fib, 1); > if (new_selected && new_selected != new_fib) > - nexthop_active_update (rn, new_selected, 1); > + nexthop_active_update (rn, new_selected, 1); > > /* Update kernel if FIB entry has changed */ > if (old_fib != new_fib > diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c > index 21b92ea..028b744 100644 > --- a/zebra/zebra_vty.c > +++ b/zebra/zebra_vty.c > @@ -1341,7 +1341,8 @@ vty_show_ip_route_detail (struct vty *vty, struct > route_node *rn, int mcast) > > for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing)) > { > - vty_out (vty, " %c%s", > + vty_out (vty, " %c%c%s", > + CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE) ? '>' : > ' ', > CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB) ? '*' : ' ', > recursing ? " " : ""); > > -- > 2.8.0 > _______________________________________________ Quagga-dev mailing list [email protected] https://lists.quagga.net/mailman/listinfo/quagga-dev
