]> git.proxmox.com Git - mirror_frr.git/commitdiff
ldpd: defer register for info until configured
authorFredi Raspall <fredi@voltanet.io>
Thu, 18 Feb 2021 22:45:08 +0000 (23:45 +0100)
committerEmanuele Di Pascale <emanuele@voltanet.io>
Mon, 26 Apr 2021 08:00:37 +0000 (10:00 +0200)
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 <fredi@voltanet.io>
Signed-off-by: Emanuele Di Pascale <emanuele@voltanet.io>
ldpd/ldp_vty_conf.c
ldpd/ldp_zebra.c
ldpd/ldpd.h

index d21e3c0409970bc1335b24690ef7586e208237d7..6e925d1410444290e9b182873278689f78cd6e28 100644 (file)
@@ -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);
index ea86c2dc039c40fbc474718066d7689e6dc7b8c8..92e329c3899a109fe07d651e1681d63d20a95287 100644 (file)
@@ -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();
 
index 8fdc16fc7b97b60a366147109df48c5510a332fc..7e70aa3a445776069a3d7553d2ace71fb14fc3b7 100644 (file)
@@ -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)