]> git.puffer.fish Git - matthieu/frr.git/commitdiff
ospf6: fix crash on shutdown
authorIgor Ryzhov <iryzhov@nfware.com>
Fri, 20 Nov 2020 03:00:31 +0000 (06:00 +0300)
committerIgor Ryzhov <iryzhov@nfware.com>
Mon, 30 Nov 2020 14:36:10 +0000 (17:36 +0300)
The crash is sometimes reproduced by all_protocol_startup topotest.

Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
ospf6d/ospf6_route.c
ospf6d/ospf6_route.h
ospf6d/ospf6_zebra.c

index 09b012e5aa6200d3077f5161432cdd887c6ef95d..60c208437bc3ba6e3f67748d0a54676477870c8f 100644 (file)
@@ -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;
index 8a219081cda9fd1fe1b1a280895a8d4438bbb3eb..e2118003d5a71f729dd76d7bc8953ec94766d66e 100644 (file)
@@ -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 */
index f21e940a775b296127ff5b7196e1abf8f1b9753b..7a8027a37fab8b8e8928ff412dd932015a0f4392 100644 (file)
@@ -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);