nh_p.family = AF_INET;
nh_p.prefixlen = IPV4_MAX_BITLEN;
nh_p.u.prefix4 = nh->gate.ipv4;
+ zebra_deregister_rnh_static_nh(&nh_p, rn);
}
else if (nh->type == NEXTHOP_TYPE_IPV6)
{
nh_p.family = AF_INET6;
nh_p.prefixlen = IPV6_MAX_BITLEN;
nh_p.u.prefix6 = nh->gate.ipv6;
+ zebra_deregister_rnh_static_nh(&nh_p, rn);
}
- zebra_deregister_rnh_static_nh(&nh_p, rn);
nexthop_free (nh, rn);
}
}
{
struct route_node *rn;
- if (!rnh || !(rn = rnh->node))
+ if (!rnh || (rnh->flags & ZEBRA_NHT_DELETED) || !(rn = rnh->node))
return;
if (IS_ZEBRA_DEBUG_NHT)
zlog_debug("delete rnh %s", rnh_str(rnh, buf, INET6_ADDRSTRLEN));
}
+ rnh->flags |= ZEBRA_NHT_DELETED;
list_free(rnh->client_list);
list_free(rnh->zebra_static_route_list);
free_state(rnh->state, rn);
struct rnh *rnh;
rnh = zebra_lookup_rnh(nh, 0);
- if (!rnh)
+ if (!rnh || (rnh->flags & ZEBRA_NHT_DELETED))
return;
listnode_delete(rnh->zebra_static_route_list, static_rn);
{
u_char flags;
#define ZEBRA_NHT_CONNECTED 0x1
+#define ZEBRA_NHT_DELETED 0x2
struct rib *state;
struct list *client_list;
struct list *zebra_static_route_list; /* static routes dependent on this NH */