From 0aa4c0366d3b9b6793d562cdc9b91e6a52e86c07 Mon Sep 17 00:00:00 2001 From: Andrii Melnychenko <a.melnychenko@vyos.io> Date: Thu, 20 Mar 2025 12:25:44 +0100 Subject: T7226: Fixed ldpd crash with tLDP message for disabled LDP hello message Signed-off-by: Andrii Melnychenko <a.melnychenko@vyos.io> --- ...n-for-disabled-LDP-hello-message-during-T.patch | 174 -------------------- ...-for-disabled-LDP-hello-message-during-TC.patch | 176 +++++++++++++++++++++ 2 files changed, 176 insertions(+), 174 deletions(-) delete mode 100644 scripts/package-build/frr/patches/frr/0001-T7226-Option-for-disabled-LDP-hello-message-during-T.patch create mode 100644 scripts/package-build/frr/patches/frr/0001-ldpd-Option-for-disabled-LDP-hello-message-during-TC.patch diff --git a/scripts/package-build/frr/patches/frr/0001-T7226-Option-for-disabled-LDP-hello-message-during-T.patch b/scripts/package-build/frr/patches/frr/0001-T7226-Option-for-disabled-LDP-hello-message-during-T.patch deleted file mode 100644 index 4d17f777..00000000 --- a/scripts/package-build/frr/patches/frr/0001-T7226-Option-for-disabled-LDP-hello-message-during-T.patch +++ /dev/null @@ -1,174 +0,0 @@ -From 9f0dc1829119ea180c2ee2ebe7dcd847556c6fda Mon Sep 17 00:00:00 2001 -From: Andrii Melnychenko <a.melnychenko@vyos.io> -Date: Mon, 17 Mar 2025 13:25:20 +0100 -Subject: [PATCH 1/1] T7226 Option for disabled LDP hello message during TCP - -Added option "disable-establish-hello" that disableds -sending additional LDP hello multicast messages during -TCP session establishment. -This option enables per interface: "(config-ldp-af-if)". ---- - ldpd/interface.c | 2 ++ - ldpd/ldp_vty.h | 1 + - ldpd/ldp_vty_cmds.c | 11 +++++++++++ - ldpd/ldp_vty_conf.c | 32 ++++++++++++++++++++++++++++++++ - ldpd/ldpd.c | 1 + - ldpd/ldpd.h | 1 + - ldpd/neighbor.c | 5 +++-- - 7 files changed, 51 insertions(+), 2 deletions(-) - -diff --git a/ldpd/interface.c b/ldpd/interface.c -index f0e70cbac..6fccd4af5 100644 ---- a/ldpd/interface.c -+++ b/ldpd/interface.c -@@ -63,11 +63,13 @@ if_new(const char *name) - iface->ipv4.af = AF_INET; - iface->ipv4.iface = iface; - iface->ipv4.enabled = 0; -+ iface->ipv4.disable_establish_hello = 0; - - /* ipv6 */ - iface->ipv6.af = AF_INET6; - iface->ipv6.iface = iface; - iface->ipv6.enabled = 0; -+ iface->ipv6.disable_establish_hello = 0; - - return (iface); - } -diff --git a/ldpd/ldp_vty.h b/ldpd/ldp_vty.h -index 5c83d1c56..196d05c93 100644 ---- a/ldpd/ldp_vty.h -+++ b/ldpd/ldp_vty.h -@@ -24,6 +24,7 @@ int ldp_vty_allow_broken_lsp(struct vty *, const char *); - int ldp_vty_address_family (struct vty *, const char *, const char *); - int ldp_vty_disc_holdtime(struct vty *, const char *, enum hello_type, long); - int ldp_vty_disc_interval(struct vty *, const char *, enum hello_type, long); -+int ldp_vty_disable_establish_hello(struct vty *, const char *); - int ldp_vty_targeted_hello_accept(struct vty *, const char *, const char *); - int ldp_vty_nbr_session_holdtime(struct vty *, const char *, struct in_addr, long); - int ldp_vty_af_session_holdtime(struct vty *, const char *, long); -diff --git a/ldpd/ldp_vty_cmds.c b/ldpd/ldp_vty_cmds.c -index e046ae996..d6c36c35b 100644 ---- a/ldpd/ldp_vty_cmds.c -+++ b/ldpd/ldp_vty_cmds.c -@@ -122,6 +122,15 @@ DEFPY (ldp_discovery_link_interval, - return (ldp_vty_disc_interval(vty, no, HELLO_LINK, interval)); - } - -+DEFPY (ldp_disable_establish_hello, -+ ldp_disable_establish_hello_cmd, -+ "[no] disable-establish-hello", -+ NO_STR -+ "Disable sending additional LDP hello message on establishing LDP tcp connection\n") -+{ -+ return ldp_vty_disable_establish_hello(vty, no); -+} -+ - DEFPY (ldp_discovery_targeted_interval, - ldp_discovery_targeted_interval_cmd, - "[no] discovery targeted-hello interval (1-65535)$interval", -@@ -866,9 +875,11 @@ ldp_vty_init (void) - - install_element(LDP_IPV4_IFACE_NODE, &ldp_discovery_link_holdtime_cmd); - install_element(LDP_IPV4_IFACE_NODE, &ldp_discovery_link_interval_cmd); -+ install_element(LDP_IPV4_IFACE_NODE, &ldp_disable_establish_hello_cmd); - - install_element(LDP_IPV6_IFACE_NODE, &ldp_discovery_link_holdtime_cmd); - install_element(LDP_IPV6_IFACE_NODE, &ldp_discovery_link_interval_cmd); -+ install_element(LDP_IPV6_IFACE_NODE, &ldp_disable_establish_hello_cmd); - - install_element(LDP_L2VPN_NODE, &ldp_bridge_cmd); - install_element(LDP_L2VPN_NODE, &ldp_mtu_cmd); -diff --git a/ldpd/ldp_vty_conf.c b/ldpd/ldp_vty_conf.c -index ffff67683..56ad071c8 100644 ---- a/ldpd/ldp_vty_conf.c -+++ b/ldpd/ldp_vty_conf.c -@@ -119,6 +119,8 @@ ldp_af_iface_config_write(struct vty *vty, int af) - ia->hello_interval != 0) - vty_out (vty, " discovery hello interval %u\n", - ia->hello_interval); -+ if (ia->disable_establish_hello) -+ vty_out (vty, " disable-establish-hello\n"); - - vty_out (vty, " exit\n"); - } -@@ -632,6 +634,36 @@ ldp_vty_disc_interval(struct vty *vty, const char *negate, - return (CMD_SUCCESS); - } - -+int -+ldp_vty_disable_establish_hello(struct vty *vty, -+ const char *negate) -+{ -+ struct iface *iface; -+ struct iface_af *ia; -+ int af; -+ -+ switch (vty->node) { -+ case LDP_IPV4_IFACE_NODE: -+ case LDP_IPV6_IFACE_NODE: -+ af = ldp_vty_get_af(vty); -+ iface = VTY_GET_CONTEXT(iface); -+ VTY_CHECK_CONTEXT(iface); -+ -+ ia = iface_af_get(iface, af); -+ if (negate) -+ ia->disable_establish_hello = 0; -+ else -+ ia->disable_establish_hello = 1; -+ -+ ldp_config_apply(vty, vty_conf); -+ break; -+ default: -+ fatalx("ldp_vty_disable_establish_hello: unexpected node"); -+ } -+ -+ return (CMD_SUCCESS); -+} -+ - int - ldp_vty_targeted_hello_accept(struct vty *vty, const char *negate, - const char *acl_from_str) -diff --git a/ldpd/ldpd.c b/ldpd/ldpd.c -index 4d38fdcd0..9a5667c26 100644 ---- a/ldpd/ldpd.c -+++ b/ldpd/ldpd.c -@@ -1604,6 +1604,7 @@ merge_iface_af(struct iface_af *ia, struct iface_af *xi) - } - ia->hello_holdtime = xi->hello_holdtime; - ia->hello_interval = xi->hello_interval; -+ ia->disable_establish_hello = xi->disable_establish_hello; - } - - static void -diff --git a/ldpd/ldpd.h b/ldpd/ldpd.h -index ad831a6ea..40a1e8c3c 100644 ---- a/ldpd/ldpd.h -+++ b/ldpd/ldpd.h -@@ -332,6 +332,7 @@ struct iface_af { - struct event *hello_timer; - uint16_t hello_holdtime; - uint16_t hello_interval; -+ int disable_establish_hello; - }; - - struct iface_ldp_sync { -diff --git a/ldpd/neighbor.c b/ldpd/neighbor.c -index 2596c7948..b9199f0d9 100644 ---- a/ldpd/neighbor.c -+++ b/ldpd/neighbor.c -@@ -630,8 +630,9 @@ nbr_establish_connection(struct nbr *nbr) - * an adjacency as well. - */ - RB_FOREACH(adj, nbr_adj_head, &nbr->adj_tree) -- send_hello(adj->source.type, adj->source.link.ia, -- adj->source.target); -+ if (!adj->source.link.ia->disable_establish_hello) -+ send_hello(adj->source.type, adj->source.link.ia, -+ adj->source.target); - - if (connect(nbr->fd, &remote_su.sa, sockaddr_len(&remote_su.sa)) == -1) { - if (errno == EINPROGRESS) { --- -2.43.0 - diff --git a/scripts/package-build/frr/patches/frr/0001-ldpd-Option-for-disabled-LDP-hello-message-during-TC.patch b/scripts/package-build/frr/patches/frr/0001-ldpd-Option-for-disabled-LDP-hello-message-during-TC.patch new file mode 100644 index 00000000..67f85d01 --- /dev/null +++ b/scripts/package-build/frr/patches/frr/0001-ldpd-Option-for-disabled-LDP-hello-message-during-TC.patch @@ -0,0 +1,176 @@ +From 945eff42df61982585011fa8427050c74ca90c6b Mon Sep 17 00:00:00 2001 +From: Andrii Melnychenko <a.melnychenko@vyos.io> +Date: Mon, 17 Mar 2025 13:25:20 +0100 +Subject: [PATCH 1/1] ldpd: Option for disabled LDP hello message during TCP + +Added option "disable-establish-hello" that disableds +sending additional LDP hello multicast messages during +TCP session establishment. +This option enables per interface: "(config-ldp-af-if)". + +Signed-off-by: Andrii Melnychenko <a.melnychenko@vyos.io> +--- + ldpd/interface.c | 2 ++ + ldpd/ldp_vty.h | 1 + + ldpd/ldp_vty_cmds.c | 11 +++++++++++ + ldpd/ldp_vty_conf.c | 32 ++++++++++++++++++++++++++++++++ + ldpd/ldpd.c | 1 + + ldpd/ldpd.h | 1 + + ldpd/neighbor.c | 5 +++-- + 7 files changed, 51 insertions(+), 2 deletions(-) + +diff --git a/ldpd/interface.c b/ldpd/interface.c +index f0e70cbac..6fccd4af5 100644 +--- a/ldpd/interface.c ++++ b/ldpd/interface.c +@@ -63,11 +63,13 @@ if_new(const char *name) + iface->ipv4.af = AF_INET; + iface->ipv4.iface = iface; + iface->ipv4.enabled = 0; ++ iface->ipv4.disable_establish_hello = 0; + + /* ipv6 */ + iface->ipv6.af = AF_INET6; + iface->ipv6.iface = iface; + iface->ipv6.enabled = 0; ++ iface->ipv6.disable_establish_hello = 0; + + return (iface); + } +diff --git a/ldpd/ldp_vty.h b/ldpd/ldp_vty.h +index 5c83d1c56..196d05c93 100644 +--- a/ldpd/ldp_vty.h ++++ b/ldpd/ldp_vty.h +@@ -24,6 +24,7 @@ int ldp_vty_allow_broken_lsp(struct vty *, const char *); + int ldp_vty_address_family (struct vty *, const char *, const char *); + int ldp_vty_disc_holdtime(struct vty *, const char *, enum hello_type, long); + int ldp_vty_disc_interval(struct vty *, const char *, enum hello_type, long); ++int ldp_vty_disable_establish_hello(struct vty *, const char *); + int ldp_vty_targeted_hello_accept(struct vty *, const char *, const char *); + int ldp_vty_nbr_session_holdtime(struct vty *, const char *, struct in_addr, long); + int ldp_vty_af_session_holdtime(struct vty *, const char *, long); +diff --git a/ldpd/ldp_vty_cmds.c b/ldpd/ldp_vty_cmds.c +index e046ae996..d6c36c35b 100644 +--- a/ldpd/ldp_vty_cmds.c ++++ b/ldpd/ldp_vty_cmds.c +@@ -122,6 +122,15 @@ DEFPY (ldp_discovery_link_interval, + return (ldp_vty_disc_interval(vty, no, HELLO_LINK, interval)); + } + ++DEFPY (ldp_disable_establish_hello, ++ ldp_disable_establish_hello_cmd, ++ "[no] disable-establish-hello", ++ NO_STR ++ "Disable sending additional LDP hello message on establishing LDP tcp connection\n") ++{ ++ return ldp_vty_disable_establish_hello(vty, no); ++} ++ + DEFPY (ldp_discovery_targeted_interval, + ldp_discovery_targeted_interval_cmd, + "[no] discovery targeted-hello interval (1-65535)$interval", +@@ -866,9 +875,11 @@ ldp_vty_init (void) + + install_element(LDP_IPV4_IFACE_NODE, &ldp_discovery_link_holdtime_cmd); + install_element(LDP_IPV4_IFACE_NODE, &ldp_discovery_link_interval_cmd); ++ install_element(LDP_IPV4_IFACE_NODE, &ldp_disable_establish_hello_cmd); + + install_element(LDP_IPV6_IFACE_NODE, &ldp_discovery_link_holdtime_cmd); + install_element(LDP_IPV6_IFACE_NODE, &ldp_discovery_link_interval_cmd); ++ install_element(LDP_IPV6_IFACE_NODE, &ldp_disable_establish_hello_cmd); + + install_element(LDP_L2VPN_NODE, &ldp_bridge_cmd); + install_element(LDP_L2VPN_NODE, &ldp_mtu_cmd); +diff --git a/ldpd/ldp_vty_conf.c b/ldpd/ldp_vty_conf.c +index ffff67683..56ad071c8 100644 +--- a/ldpd/ldp_vty_conf.c ++++ b/ldpd/ldp_vty_conf.c +@@ -119,6 +119,8 @@ ldp_af_iface_config_write(struct vty *vty, int af) + ia->hello_interval != 0) + vty_out (vty, " discovery hello interval %u\n", + ia->hello_interval); ++ if (ia->disable_establish_hello) ++ vty_out (vty, " disable-establish-hello\n"); + + vty_out (vty, " exit\n"); + } +@@ -632,6 +634,36 @@ ldp_vty_disc_interval(struct vty *vty, const char *negate, + return (CMD_SUCCESS); + } + ++int ++ldp_vty_disable_establish_hello(struct vty *vty, ++ const char *negate) ++{ ++ struct iface *iface; ++ struct iface_af *ia; ++ int af; ++ ++ switch (vty->node) { ++ case LDP_IPV4_IFACE_NODE: ++ case LDP_IPV6_IFACE_NODE: ++ af = ldp_vty_get_af(vty); ++ iface = VTY_GET_CONTEXT(iface); ++ VTY_CHECK_CONTEXT(iface); ++ ++ ia = iface_af_get(iface, af); ++ if (negate) ++ ia->disable_establish_hello = 0; ++ else ++ ia->disable_establish_hello = 1; ++ ++ ldp_config_apply(vty, vty_conf); ++ break; ++ default: ++ fatalx("ldp_vty_disable_establish_hello: unexpected node"); ++ } ++ ++ return (CMD_SUCCESS); ++} ++ + int + ldp_vty_targeted_hello_accept(struct vty *vty, const char *negate, + const char *acl_from_str) +diff --git a/ldpd/ldpd.c b/ldpd/ldpd.c +index 4d38fdcd0..9a5667c26 100644 +--- a/ldpd/ldpd.c ++++ b/ldpd/ldpd.c +@@ -1604,6 +1604,7 @@ merge_iface_af(struct iface_af *ia, struct iface_af *xi) + } + ia->hello_holdtime = xi->hello_holdtime; + ia->hello_interval = xi->hello_interval; ++ ia->disable_establish_hello = xi->disable_establish_hello; + } + + static void +diff --git a/ldpd/ldpd.h b/ldpd/ldpd.h +index ad831a6ea..40a1e8c3c 100644 +--- a/ldpd/ldpd.h ++++ b/ldpd/ldpd.h +@@ -332,6 +332,7 @@ struct iface_af { + struct event *hello_timer; + uint16_t hello_holdtime; + uint16_t hello_interval; ++ int disable_establish_hello; + }; + + struct iface_ldp_sync { +diff --git a/ldpd/neighbor.c b/ldpd/neighbor.c +index 2596c7948..00a809186 100644 +--- a/ldpd/neighbor.c ++++ b/ldpd/neighbor.c +@@ -630,8 +630,9 @@ nbr_establish_connection(struct nbr *nbr) + * an adjacency as well. + */ + RB_FOREACH(adj, nbr_adj_head, &nbr->adj_tree) +- send_hello(adj->source.type, adj->source.link.ia, +- adj->source.target); ++ if (!(adj->source.type == HELLO_LINK && adj->source.link.ia->disable_establish_hello)) ++ send_hello(adj->source.type, adj->source.link.ia, ++ adj->source.target); + + if (connect(nbr->fd, &remote_su.sa, sockaddr_len(&remote_su.sa)) == -1) { + if (errno == EINPROGRESS) { +-- +2.43.0 + -- cgit v1.2.3