forked from Mirror/frr
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:
parent
dc70c83afa
commit
220e848cc5
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue