ldpd: detect when route received from zebra hasn't changed

Add some code to detect when a route received from zebra hasn't
changed and ignore the notification in that case, preventing ldpd
from sending unnecessary label mappings.

Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
This commit is contained in:
Renato Westphal 2020-12-05 17:10:04 -03:00
parent dc70c83afa
commit 220e848cc5
2 changed files with 10 additions and 0 deletions

View File

@ -129,7 +129,9 @@ struct fec_node {
uint32_t pw_remote_status;
void *data; /* fec specific data */
uint8_t flags;
};
#define F_FEC_NHS_CHANGED 0x01
#define CHUNK_SIZE 64
struct label_chunk {

View File

@ -339,6 +339,8 @@ lde_kernel_insert(struct fec *fec, int af, union ldpd_addr *nexthop,
fnh = fec_nh_find(fn, af, nexthop, ifindex, route_type, route_instance);
if (fnh == NULL) {
fn->flags |= F_FEC_NHS_CHANGED;
fnh = fec_nh_add(fn, af, nexthop, ifindex, route_type,
route_instance);
/*
@ -415,11 +417,17 @@ lde_kernel_update(struct fec *fec)
} else
fnh->flags |= F_FEC_NH_NO_LDP;
} else {
fn->flags |= F_FEC_NHS_CHANGED;
lde_send_delete_klabel(fn, fnh);
fec_nh_del(fnh);
}
}
if (!(fn->flags & F_FEC_NHS_CHANGED))
/* return earlier if nothing has changed */
return;
fn->flags &= ~F_FEC_NHS_CHANGED;
if (LIST_EMPTY(&fn->nexthops)) {
RB_FOREACH(ln, nbr_tree, &lde_nbrs)
lde_send_labelwithdraw(ln, fn, NULL, NULL);