diff options
author | Igor Ryzhov <iryzhov@nfware.com> | 2020-11-20 04:00:31 +0100 |
---|---|---|
committer | Igor Ryzhov <iryzhov@nfware.com> | 2020-11-30 15:36:10 +0100 |
commit | 1fa58587355b61793bfaeb7c295d4d1292aaa4f7 (patch) | |
tree | fad39b5095773e860a3538a8630b5d6a8b64afa7 | |
parent | ospf6: get instance from lsdb data (diff) | |
download | frr-1fa58587355b61793bfaeb7c295d4d1292aaa4f7.tar.xz frr-1fa58587355b61793bfaeb7c295d4d1292aaa4f7.zip |
ospf6: fix crash on shutdown
The crash is sometimes reproduced by all_protocol_startup topotest.
Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
-rw-r--r-- | ospf6d/ospf6_route.c | 10 | ||||
-rw-r--r-- | ospf6d/ospf6_route.h | 2 | ||||
-rw-r--r-- | ospf6d/ospf6_zebra.c | 3 |
3 files changed, 8 insertions, 7 deletions
diff --git a/ospf6d/ospf6_route.c b/ospf6d/ospf6_route.c index 09b012e5a..60c208437 100644 --- a/ospf6d/ospf6_route.c +++ b/ospf6d/ospf6_route.c @@ -292,28 +292,28 @@ void ospf6_add_nexthop(struct list *nh_list, int ifindex, struct in6_addr *addr) void ospf6_route_zebra_copy_nexthops(struct ospf6_route *route, struct zapi_nexthop nexthops[], - int entries) + int entries, vrf_id_t vrf_id) { struct ospf6_nexthop *nh; struct listnode *node; - struct interface *ifp; char buf[64]; int i; if (route) { i = 0; for (ALL_LIST_ELEMENTS_RO(route->nh_list, node, nh)) { - ifp = if_lookup_by_index_all_vrf(nh->ifindex); if (IS_OSPF6_DEBUG_ZEBRA(SEND)) { + const char *ifname; inet_ntop(AF_INET6, &nh->address, buf, sizeof(buf)); + ifname = ifindex2ifname(nh->ifindex, vrf_id); zlog_debug(" nexthop: %s%%%.*s(%d)", buf, - IFNAMSIZ, ifp->name, nh->ifindex); + IFNAMSIZ, ifname, nh->ifindex); } if (i >= entries) return; - nexthops[i].vrf_id = ifp->vrf_id; + nexthops[i].vrf_id = vrf_id; nexthops[i].ifindex = nh->ifindex; if (!IN6_IS_ADDR_UNSPECIFIED(&nh->address)) { nexthops[i].gate.ipv6 = nh->address; diff --git a/ospf6d/ospf6_route.h b/ospf6d/ospf6_route.h index 8a219081c..e2118003d 100644 --- a/ospf6d/ospf6_route.h +++ b/ospf6d/ospf6_route.h @@ -280,7 +280,7 @@ extern int ospf6_route_cmp_nexthops(struct ospf6_route *a, struct ospf6_route *b); extern void ospf6_route_zebra_copy_nexthops(struct ospf6_route *route, struct zapi_nexthop nexthops[], - int entries); + int entries, vrf_id_t vrf_id); extern int ospf6_route_get_first_nh_index(struct ospf6_route *route); /* Hide abstraction of nexthop implementation in route from outsiders */ diff --git a/ospf6d/ospf6_zebra.c b/ospf6d/ospf6_zebra.c index f21e940a7..7a8027a37 100644 --- a/ospf6d/ospf6_zebra.c +++ b/ospf6d/ospf6_zebra.c @@ -344,7 +344,8 @@ static void ospf6_zebra_route_update(int type, struct ospf6_route *request, api.prefix = *dest; SET_FLAG(api.message, ZAPI_MESSAGE_NEXTHOP); api.nexthop_num = MIN(nhcount, MULTIPATH_NUM); - ospf6_route_zebra_copy_nexthops(request, api.nexthops, api.nexthop_num); + ospf6_route_zebra_copy_nexthops(request, api.nexthops, api.nexthop_num, + api.vrf_id); SET_FLAG(api.message, ZAPI_MESSAGE_METRIC); api.metric = (request->path.metric_type == 2 ? request->path.u.cost_e2 : request->path.cost); |