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)