]> git.puffer.fish Git - mirror/frr.git/commitdiff
ospf6d: fix regression detected by topotest
authorRenato Westphal <renato@opensourcerouting.org>
Mon, 21 Aug 2017 22:43:43 +0000 (19:43 -0300)
committerRenato Westphal <renato@opensourcerouting.org>
Wed, 23 Aug 2017 23:25:45 +0000 (20:25 -0300)
With the old API, ospf6d always needed to send a nexthop address and a
nexthop interface when advertising a route to zebra. In the case where
the nexthop address didn't exist (e.g. connected route), zebra would
take care of ignore it in the zread_ipv6_add() function.

Now, if we have a nexthop interface but not a nexthop address, we not
only can but we should send a nexthop of type NEXTHOP_TYPE_IFINDEX. zebra
won't fix bad nexthops anymore because the clients have a proper API to
send correct messages.

Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
ospf6d/ospf6_route.c

index 03791ad7a07616387e1824181d2fc7c0e609886a..e58eab2b156d52d9ced1476fb532d37d6d9464a4 100644 (file)
@@ -305,14 +305,16 @@ void ospf6_route_zebra_copy_nexthops(struct ospf6_route *route,
                                zlog_debug("  nexthop: %s%%%.*s(%d)", buf,
                                           IFNAMSIZ, ifname, nh->ifindex);
                        }
-                       if (i < entries) {
+                       if (i >= entries)
+                               return;
+
+                       nexthops[i].ifindex = nh->ifindex;
+                       if (!IN6_IS_ADDR_UNSPECIFIED(&nh->address)) {
                                nexthops[i].gate.ipv6 = nh->address;
-                               nexthops[i].ifindex = nh->ifindex;
                                nexthops[i].type = NEXTHOP_TYPE_IPV6_IFINDEX;
-                               i++;
-                       } else {
-                               return;
-                       }
+                       } else
+                               nexthops[i].type = NEXTHOP_TYPE_IFINDEX;
+                       i++;
                }
        }
 }