From 3c0755dc9772deccff2ba6e9dc0511a9af2b9d1b Mon Sep 17 00:00:00 2001 From: Paul Jakma Date: Fri, 8 Dec 2006 00:53:14 +0000 Subject: [zebra] Changes of nexthops of static routes didnt take effect 2006-12-08 Piotr Chytla * zebra_rib.c: (static_install_ipv{4,6}) Case where existing RIB is updated must explicitely rib_addqueue the route_node, to ensure the update actually takes effect. --- zebra/ChangeLog | 6 ++++++ zebra/zebra_rib.c | 22 ++++++++++++---------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/zebra/ChangeLog b/zebra/ChangeLog index 0740e756..3ea4f57f 100644 --- a/zebra/ChangeLog +++ b/zebra/ChangeLog @@ -1,3 +1,9 @@ +2006-12-08 Piotr Chytla + + * zebra_rib.c: (static_install_ipv{4,6}) Case where existing + RIB is updated must explicitely rib_addqueue the route_node, + to ensure the update actually takes effect. + 2006-09-13 Tom Everett * kernel_socket.c (rtm_type_str): ifdef RTM_OLD{ADD,DEL} to diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index acad065a..02c73d12 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -1103,20 +1103,20 @@ rib_queue_init (struct zebra_t *zebra) * The queue length is bounded by the maximal size of the routing table, * as a route_node will not be requeued, if already queued. * - * RIBs are submitted via rib_addnode and rib_delnode, which set - * minimal state and then submit route_node to queue for best-path - * selection later. Order of add/delete state changes are preserved for - * any given RIB. + * RIBs are submitted via rib_addnode or rib_delnode which set minimal + * state, or static_install_ipv{4,6} (when an existing RIB is updated) + * and then submit route_node to queue for best-path selection later. + * Order of add/delete state changes are preserved for any given RIB. * * Deleted RIBs are reaped during best-path selection. * * rib_addnode * |-> rib_link or unset RIB_ENTRY_REMOVE |->Update kernel with - * |-> rib_addqueue | best RIB, if required - * | | - * |-> .......................... -> rib_process - * | | - * |-> rib_addqueue |-> rib_unlink + * |-------->| | best RIB, if required + * | | + * static_install->|->rib_addqueue...... -> rib_process + * | | + * |-------->| |-> rib_unlink * |-> set RIB_ENTRY_REMOVE | * rib_delnode (RIB freed) * @@ -1548,6 +1548,7 @@ static_install_ipv4 (struct prefix *p, struct static_ipv4 *si) nexthop_blackhole_add (rib); break; } + rib_queue_add (&zebrad, rn); } else { @@ -1704,7 +1705,7 @@ static_add_ipv4 (struct prefix *p, struct in_addr *gate, const char *ifname, } } - /* Distance chaged. */ + /* Distance changed. */ if (update) static_delete_ipv4 (p, gate, ifname, update->distance, vrf_id); @@ -2097,6 +2098,7 @@ static_install_ipv6 (struct prefix *p, struct static_ipv6 *si) nexthop_ipv6_ifname_add (rib, &si->ipv6, si->ifname); break; } + rib_queue_add (&zebrad, rn); } else { -- cgit v1.2.1