mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-15 13:27:53 +00:00
Merge pull request #7015 from donaldsharp/zebra_nht_no_heros_tonight
zebra: When shutting down an interface immediately notify about rnh
This commit is contained in:
commit
3fb5678572
@ -393,10 +393,10 @@ void connected_down(struct interface *ifp, struct connected *ifc)
|
|||||||
* head.
|
* head.
|
||||||
*/
|
*/
|
||||||
rib_delete(afi, SAFI_UNICAST, zvrf->vrf->vrf_id, ZEBRA_ROUTE_CONNECT, 0,
|
rib_delete(afi, SAFI_UNICAST, zvrf->vrf->vrf_id, ZEBRA_ROUTE_CONNECT, 0,
|
||||||
0, &p, NULL, &nh, 0, zvrf->table_id, 0, 0, false);
|
0, &p, NULL, &nh, 0, zvrf->table_id, 0, 0, false, true);
|
||||||
|
|
||||||
rib_delete(afi, SAFI_MULTICAST, zvrf->vrf->vrf_id, ZEBRA_ROUTE_CONNECT,
|
rib_delete(afi, SAFI_MULTICAST, zvrf->vrf->vrf_id, ZEBRA_ROUTE_CONNECT,
|
||||||
0, 0, &p, NULL, &nh, 0, zvrf->table_id, 0, 0, false);
|
0, 0, &p, NULL, &nh, 0, zvrf->table_id, 0, 0, false, true);
|
||||||
|
|
||||||
/* Schedule LSP forwarding entries for processing, if appropriate. */
|
/* Schedule LSP forwarding entries for processing, if appropriate. */
|
||||||
if (zvrf->vrf->vrf_id == VRF_DEFAULT) {
|
if (zvrf->vrf->vrf_id == VRF_DEFAULT) {
|
||||||
|
@ -1136,7 +1136,7 @@ void rtm_read(struct rt_msghdr *rtm)
|
|||||||
if (rtm->rtm_type == RTM_CHANGE)
|
if (rtm->rtm_type == RTM_CHANGE)
|
||||||
rib_delete(afi, SAFI_UNICAST, VRF_DEFAULT, ZEBRA_ROUTE_KERNEL,
|
rib_delete(afi, SAFI_UNICAST, VRF_DEFAULT, ZEBRA_ROUTE_KERNEL,
|
||||||
0, zebra_flags, &p, NULL, NULL, 0, RT_TABLE_MAIN, 0,
|
0, zebra_flags, &p, NULL, NULL, 0, RT_TABLE_MAIN, 0,
|
||||||
0, true);
|
0, true, false);
|
||||||
if (rtm->rtm_type == RTM_GET || rtm->rtm_type == RTM_ADD
|
if (rtm->rtm_type == RTM_GET || rtm->rtm_type == RTM_ADD
|
||||||
|| rtm->rtm_type == RTM_CHANGE)
|
|| rtm->rtm_type == RTM_CHANGE)
|
||||||
rib_add(afi, SAFI_UNICAST, VRF_DEFAULT, ZEBRA_ROUTE_KERNEL, 0,
|
rib_add(afi, SAFI_UNICAST, VRF_DEFAULT, ZEBRA_ROUTE_KERNEL, 0,
|
||||||
@ -1145,7 +1145,7 @@ void rtm_read(struct rt_msghdr *rtm)
|
|||||||
else
|
else
|
||||||
rib_delete(afi, SAFI_UNICAST, VRF_DEFAULT, ZEBRA_ROUTE_KERNEL,
|
rib_delete(afi, SAFI_UNICAST, VRF_DEFAULT, ZEBRA_ROUTE_KERNEL,
|
||||||
0, zebra_flags, &p, NULL, &nh, 0, RT_TABLE_MAIN, 0,
|
0, zebra_flags, &p, NULL, &nh, 0, RT_TABLE_MAIN, 0,
|
||||||
0, true);
|
0, true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Interface function for the kernel routing table updates. Support
|
/* Interface function for the kernel routing table updates. Support
|
||||||
|
@ -727,7 +727,7 @@ int zebra_del_import_table_entry(struct zebra_vrf *zvrf, struct route_node *rn,
|
|||||||
rib_delete(afi, SAFI_UNICAST, zvrf->vrf->vrf_id, ZEBRA_ROUTE_TABLE,
|
rib_delete(afi, SAFI_UNICAST, zvrf->vrf->vrf_id, ZEBRA_ROUTE_TABLE,
|
||||||
re->table, re->flags, &p, NULL, re->nhe->nhg.nexthop,
|
re->table, re->flags, &p, NULL, re->nhe->nhg.nexthop,
|
||||||
re->nhe_id, zvrf->table_id, re->metric, re->distance,
|
re->nhe_id, zvrf->table_id, re->metric, re->distance,
|
||||||
false);
|
false, false);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -379,7 +379,7 @@ extern void rib_delete(afi_t afi, safi_t safi, vrf_id_t vrf_id, int type,
|
|||||||
unsigned short instance, int flags, struct prefix *p,
|
unsigned short instance, int flags, struct prefix *p,
|
||||||
struct prefix_ipv6 *src_p, const struct nexthop *nh,
|
struct prefix_ipv6 *src_p, const struct nexthop *nh,
|
||||||
uint32_t nhe_id, uint32_t table_id, uint32_t metric,
|
uint32_t nhe_id, uint32_t table_id, uint32_t metric,
|
||||||
uint8_t distance, bool fromkernel);
|
uint8_t distance, bool fromkernel, bool connected_down);
|
||||||
|
|
||||||
extern struct route_entry *rib_match(afi_t afi, safi_t safi, vrf_id_t vrf_id,
|
extern struct route_entry *rib_match(afi_t afi, safi_t safi, vrf_id_t vrf_id,
|
||||||
union g_addr *addr,
|
union g_addr *addr,
|
||||||
|
@ -837,7 +837,7 @@ static int netlink_route_change_read_unicast(struct nlmsghdr *h, ns_id_t ns_id,
|
|||||||
if (nhe_id) {
|
if (nhe_id) {
|
||||||
rib_delete(afi, SAFI_UNICAST, vrf_id, proto, 0, flags,
|
rib_delete(afi, SAFI_UNICAST, vrf_id, proto, 0, flags,
|
||||||
&p, &src_p, NULL, nhe_id, table, metric,
|
&p, &src_p, NULL, nhe_id, table, metric,
|
||||||
distance, true);
|
distance, true, false);
|
||||||
} else {
|
} else {
|
||||||
if (!tb[RTA_MULTIPATH]) {
|
if (!tb[RTA_MULTIPATH]) {
|
||||||
struct nexthop nh;
|
struct nexthop nh;
|
||||||
@ -847,13 +847,13 @@ static int netlink_route_change_read_unicast(struct nlmsghdr *h, ns_id_t ns_id,
|
|||||||
gate, afi, vrf_id);
|
gate, afi, vrf_id);
|
||||||
rib_delete(afi, SAFI_UNICAST, vrf_id, proto, 0,
|
rib_delete(afi, SAFI_UNICAST, vrf_id, proto, 0,
|
||||||
flags, &p, &src_p, &nh, 0, table,
|
flags, &p, &src_p, &nh, 0, table,
|
||||||
metric, distance, true);
|
metric, distance, true, false);
|
||||||
} else {
|
} else {
|
||||||
/* XXX: need to compare the entire list of
|
/* XXX: need to compare the entire list of
|
||||||
* nexthops here for NLM_F_APPEND stupidity */
|
* nexthops here for NLM_F_APPEND stupidity */
|
||||||
rib_delete(afi, SAFI_UNICAST, vrf_id, proto, 0,
|
rib_delete(afi, SAFI_UNICAST, vrf_id, proto, 0,
|
||||||
flags, &p, &src_p, NULL, 0, table,
|
flags, &p, &src_p, NULL, 0, table,
|
||||||
metric, distance, true);
|
metric, distance, true, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1890,7 +1890,7 @@ static void zread_route_del(ZAPI_HANDLER_ARGS)
|
|||||||
|
|
||||||
rib_delete(afi, api.safi, zvrf_id(zvrf), api.type, api.instance,
|
rib_delete(afi, api.safi, zvrf_id(zvrf), api.type, api.instance,
|
||||||
api.flags, &api.prefix, src_p, NULL, 0, table_id, api.metric,
|
api.flags, &api.prefix, src_p, NULL, 0, table_id, api.metric,
|
||||||
api.distance, false);
|
api.distance, false, false);
|
||||||
|
|
||||||
/* Stats */
|
/* Stats */
|
||||||
switch (api.prefix.family) {
|
switch (api.prefix.family) {
|
||||||
|
@ -3041,7 +3041,7 @@ void rib_delete(afi_t afi, safi_t safi, vrf_id_t vrf_id, int type,
|
|||||||
unsigned short instance, int flags, struct prefix *p,
|
unsigned short instance, int flags, struct prefix *p,
|
||||||
struct prefix_ipv6 *src_p, const struct nexthop *nh,
|
struct prefix_ipv6 *src_p, const struct nexthop *nh,
|
||||||
uint32_t nhe_id, uint32_t table_id, uint32_t metric,
|
uint32_t nhe_id, uint32_t table_id, uint32_t metric,
|
||||||
uint8_t distance, bool fromkernel)
|
uint8_t distance, bool fromkernel, bool connected_down)
|
||||||
{
|
{
|
||||||
struct route_table *table;
|
struct route_table *table;
|
||||||
struct route_node *rn;
|
struct route_node *rn;
|
||||||
@ -3163,7 +3163,8 @@ void rib_delete(afi_t afi, safi_t safi, vrf_id_t vrf_id, int type,
|
|||||||
rn, fib,
|
rn, fib,
|
||||||
zebra_route_string(fib->type));
|
zebra_route_string(fib->type));
|
||||||
}
|
}
|
||||||
if (allow_delete) {
|
if (allow_delete
|
||||||
|
|| CHECK_FLAG(dest->flags, RIB_ROUTE_ANY_QUEUED)) {
|
||||||
UNSET_FLAG(fib->status, ROUTE_ENTRY_INSTALLED);
|
UNSET_FLAG(fib->status, ROUTE_ENTRY_INSTALLED);
|
||||||
/* Unset flags. */
|
/* Unset flags. */
|
||||||
for (rtnh = fib->nhe->nhg.nexthop; rtnh;
|
for (rtnh = fib->nhe->nhg.nexthop; rtnh;
|
||||||
@ -3248,6 +3249,19 @@ void rib_delete(afi_t afi, safi_t safi, vrf_id_t vrf_id, int type,
|
|||||||
rib_delnode(rn, same);
|
rib_delnode(rn, same);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is to force an immediate re-eval of this particular
|
||||||
|
* node via nexthop tracking. Why? Because there are scenarios
|
||||||
|
* where the interface is flapping and the normal queuing methodology
|
||||||
|
* will cause down/up events to very very rarely be combined into
|
||||||
|
* a non-event from nexthop tracking perspective. Leading
|
||||||
|
* to some fun timing situations with upper level routing protocol
|
||||||
|
* trying to and failing to install routes during this blip. Especially
|
||||||
|
* when zebra is under load.
|
||||||
|
*/
|
||||||
|
if (connected_down)
|
||||||
|
zebra_rib_evaluate_rn_nexthops(rn,
|
||||||
|
zebra_router_get_next_sequence());
|
||||||
route_unlock_node(rn);
|
route_unlock_node(rn);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user