From ce510d2e0ed0c9f180e21f107d23e5d15d4cb51d Mon Sep 17 00:00:00 2001 From: Fredi Raspall Date: Thu, 18 Feb 2021 23:45:08 +0100 Subject: [PATCH] ldpd: defer register for info until configured Instead of registering to receive default-VRF information and routes when first connected to zebra, defer the registration until some ldp configuration is entered. This avoids redistributing IPv4/IPv6 routes to ldpd when not needed. Signed-off-by: Fredi Raspall Signed-off-by: Emanuele Di Pascale --- ldpd/ldp_vty_conf.c | 3 +++ ldpd/ldp_zebra.c | 39 ++++++++++++++++++++++++++++++++++----- ldpd/ldpd.h | 2 ++ 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/ldpd/ldp_vty_conf.c b/ldpd/ldp_vty_conf.c index d21e3c0409..6e925d1410 100644 --- a/ldpd/ldp_vty_conf.c +++ b/ldpd/ldp_vty_conf.c @@ -429,6 +429,9 @@ ldp_vty_mpls_ldp(struct vty *vty, const char *negate) vty_conf->flags |= F_LDPD_ENABLED; } + /* register / de-register to recv info from zebra */ + ldp_zebra_regdereg_zebra_info(!negate); + ldp_config_apply(vty, vty_conf); return (CMD_SUCCESS); diff --git a/ldpd/ldp_zebra.c b/ldpd/ldp_zebra.c index ea86c2dc03..92e329c389 100644 --- a/ldpd/ldp_zebra.c +++ b/ldpd/ldp_zebra.c @@ -54,6 +54,7 @@ static int ldp_zebra_opaque_msg_handler(ZAPI_CALLBACK_ARGS); static void ldp_sync_zebra_init(void); static struct zclient *zclient; +static bool zebra_registered = false; static void ifp2kif(struct interface *ifp, struct kif *kif) @@ -629,14 +630,42 @@ ldp_zebra_read_pw_status_update(ZAPI_CALLBACK_ARGS) return (0); } +void ldp_zebra_regdereg_zebra_info(bool want_register) +{ + if (zebra_registered == want_register) + return; + + log_debug("%s to receive default VRF information", + want_register ? "Register" : "De-register"); + + if (want_register) { + zclient_send_reg_requests(zclient, VRF_DEFAULT); + zebra_redistribute_send(ZEBRA_REDISTRIBUTE_ADD, zclient, AFI_IP, + ZEBRA_ROUTE_ALL, 0, VRF_DEFAULT); + zebra_redistribute_send(ZEBRA_REDISTRIBUTE_ADD, zclient, + AFI_IP6, ZEBRA_ROUTE_ALL, 0, + VRF_DEFAULT); + } else { + zclient_send_dereg_requests(zclient, VRF_DEFAULT); + zebra_redistribute_send(ZEBRA_REDISTRIBUTE_DELETE, zclient, + AFI_IP, ZEBRA_ROUTE_ALL, 0, + VRF_DEFAULT); + zebra_redistribute_send(ZEBRA_REDISTRIBUTE_DELETE, zclient, + AFI_IP6, ZEBRA_ROUTE_ALL, 0, + VRF_DEFAULT); + } + zebra_registered = want_register; +} + static void ldp_zebra_connected(struct zclient *zclient) { - zclient_send_reg_requests(zclient, VRF_DEFAULT); - zebra_redistribute_send(ZEBRA_REDISTRIBUTE_ADD, zclient, AFI_IP, - ZEBRA_ROUTE_ALL, 0, VRF_DEFAULT); - zebra_redistribute_send(ZEBRA_REDISTRIBUTE_ADD, zclient, AFI_IP6, - ZEBRA_ROUTE_ALL, 0, VRF_DEFAULT); + zebra_registered = false; + + /* if MPLS was already enabled and we are re-connecting, register again + */ + if (vty_conf->flags & F_LDPD_ENABLED) + ldp_zebra_regdereg_zebra_info(true); ldp_zebra_opaque_register(); diff --git a/ldpd/ldpd.h b/ldpd/ldpd.h index 8fdc16fc7b..7e70aa3a44 100644 --- a/ldpd/ldpd.h +++ b/ldpd/ldpd.h @@ -906,6 +906,8 @@ int ldp_sync_zebra_send_state_update(struct ldp_igp_sync_if_state *); int ldp_zebra_send_rlfa_labels(struct zapi_rlfa_response * rlfa_labels); +void ldp_zebra_regdereg_zebra_info(bool want_register); + /* compatibility */ #ifndef __OpenBSD__ #define __IPV6_ADDR_MC_SCOPE(a) ((a)->s6_addr[1] & 0x0f) -- 2.39.5