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;
|
uint32_t pw_remote_status;
|
||||||
|
|
||||||
void *data; /* fec specific data */
|
void *data; /* fec specific data */
|
||||||
|
uint8_t flags;
|
||||||
};
|
};
|
||||||
|
#define F_FEC_NHS_CHANGED 0x01
|
||||||
|
|
||||||
#define CHUNK_SIZE 64
|
#define CHUNK_SIZE 64
|
||||||
struct label_chunk {
|
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);
|
fnh = fec_nh_find(fn, af, nexthop, ifindex, route_type, route_instance);
|
||||||
if (fnh == NULL) {
|
if (fnh == NULL) {
|
||||||
|
fn->flags |= F_FEC_NHS_CHANGED;
|
||||||
|
|
||||||
fnh = fec_nh_add(fn, af, nexthop, ifindex, route_type,
|
fnh = fec_nh_add(fn, af, nexthop, ifindex, route_type,
|
||||||
route_instance);
|
route_instance);
|
||||||
/*
|
/*
|
||||||
|
@ -415,11 +417,17 @@ lde_kernel_update(struct fec *fec)
|
||||||
} else
|
} else
|
||||||
fnh->flags |= F_FEC_NH_NO_LDP;
|
fnh->flags |= F_FEC_NH_NO_LDP;
|
||||||
} else {
|
} else {
|
||||||
|
fn->flags |= F_FEC_NHS_CHANGED;
|
||||||
lde_send_delete_klabel(fn, fnh);
|
lde_send_delete_klabel(fn, fnh);
|
||||||
fec_nh_del(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)) {
|
if (LIST_EMPTY(&fn->nexthops)) {
|
||||||
RB_FOREACH(ln, nbr_tree, &lde_nbrs)
|
RB_FOREACH(ln, nbr_tree, &lde_nbrs)
|
||||||
lde_send_labelwithdraw(ln, fn, NULL, NULL);
|
lde_send_labelwithdraw(ln, fn, NULL, NULL);
|
||||||
|
|
Loading…
Reference in a new issue