diff options
| author | Donald Sharp <sharpd@cumulusnetworks.com> | 2015-10-22 19:10:54 -0700 |
|---|---|---|
| committer | Donald Sharp <sharpd@cumulusnetworks.com> | 2015-10-23 17:48:27 -0700 |
| commit | 526e17284570266dcdd606ff163a614e6b3655a5 (patch) | |
| tree | be1d433f47ae8a300d36f046be3dde81aaa5e89e /zebra/zebra_rib.c | |
| parent | 71fcc45bb220a09f35c5b951aaefc98bd8412006 (diff) | |
zebra: Fix change of distance on ipv6 route creating duplicate routes
If you enter:
ipv6 route 2002:44:44:44::44/128 swp1 4
ipv6 route 2002:44:44:44::44/128 swp1 99
You get:
host-111# show ipv6 route
Codes: K - kernel route, C - connected, S - static, R - RIPng,
O - OSPFv6, I - IS-IS, B - BGP, A - Babel, T - Table,
> - selected route, * - FIB route
S 2002:44:44:44::44/128 [99/0] is directly connected, swp1
S>* 2002:44:44:44::44/128 [4/0] is directly connected, swp1
This problem is fixed in the ipv4 code path. Copying the same
code from the ipv4 into the ipv6 code path fixes the issue.
With the fix:
host-111(config)# ipv6 route 2002:44:44:44::44/128 swp1 4
host-111(config)# do show ipv6 route
Codes: K - kernel route, C - connected, S - static, R - RIPng,
O - OSPFv6, I - IS-IS, B - BGP, A - Babel, T - Table,
> - selected route, * - FIB route
S>* 2002:44:44:44::44/128 [4/0] is directly connected, swp1
C * fe80::/64 is directly connected, swp1
C>* fe80::/64 is directly connected, eth0
host-111(config)# ipv6 route 2002:44:44:44::44/128 swp1 99
host-111(config)# do show ipv6 route
Codes: K - kernel route, C - connected, S - static, R - RIPng,
O - OSPFv6, I - IS-IS, B - BGP, A - Babel, T - Table,
> - selected route, * - FIB route
S>* 2002:44:44:44::44/128 [99/0] is directly connected, swp1
C * fe80::/64 is directly connected, swp1
C>* fe80::/64 is directly connected, eth0
host-111(config)#
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Diffstat (limited to 'zebra/zebra_rib.c')
| -rw-r--r-- | zebra/zebra_rib.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index fcccbc58c1..94a6315292 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -3606,9 +3606,9 @@ 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 route_table *stable; - /* Lookup table. */ stable = vrf_static_table (AFI_IP6, SAFI_UNICAST, vrf_id); if (! stable) @@ -3628,17 +3628,24 @@ 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 - && tag == si->tag + 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) && (tag == si->tag)) + { + route_unlock_node (rn); + return 0; + } + else + update = si; } } + /* Distance or tag changed. */ + if (update) + static_delete_ipv6 (p, type, gate, ifname, update->tag, update->distance, vrf_id); + /* Make new static route structure. */ si = XCALLOC (MTYPE_STATIC_ROUTE, sizeof (struct static_route)); |
