diff options
Diffstat (limited to 'zebra/zebra_rib.c')
-rw-r--r-- | zebra/zebra_rib.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index 6a54f11b..0efa88d5 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -2866,6 +2866,7 @@ static_add_ipv6 (struct prefix *p, u_char type, struct in6_addr *gate, struct static_route *si; struct static_route *pp; struct static_route *cp; + struct static_route *update = NULL; struct zebra_vrf *zvrf = vrf_info_get (vrf_id); struct route_table *stable = zvrf->stable[AFI_IP6][SAFI_UNICAST]; @@ -2886,16 +2887,23 @@ static_add_ipv6 (struct prefix *p, u_char type, struct in6_addr *gate, /* Do nothing if there is a same static route. */ for (si = rn->info; si; si = si->next) { - if (distance == si->distance - && type == si->type + if (type == si->type && (! gate || IPV6_ADDR_SAME (gate, &si->addr.ipv6)) && (! ifname || strcmp (ifname, si->ifname) == 0)) { - route_unlock_node (rn); - return 0; + if (distance == si->distance) + { + route_unlock_node (rn); + return 0; + } + else + update = si; } } + if (update) + static_delete_ipv6(p, type, gate, ifname, si->distance, vrf_id); + /* Make new static route structure. */ si = XCALLOC (MTYPE_STATIC_ROUTE, sizeof (struct static_route)); |