Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ldpd: Option for disabled LDP hello message during TCP #18417

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions doc/user/ldpd.rst
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,19 @@ LDP Configuration
If GTSM is enabled, multi-hop neighbors should have either GTSM disabled
individually or configured with an appropriate ttl-security hops distance.

.. clicmd:: disable-establish-hello

Located under the MPLS address-family interface node. By default,
the ldpd service sends additional LDP multicast hello messages on TCP
session establishment. This should speed up the connection time, so
the "passive" service would receive the "hello" earlier and would "accept"
TCP without waiting for the UDP message on interval. This behaviour can
produce massive traffic with multicast packets if there are a lot of ldpd
services in one local network, essentially each "addition hello" may trigger
attempt for connection and sending "additional hello" from other ldpd
services. This option allows to disable that behaviour. LDP hello multicast
messages would be sent only by interval.

.. clicmd:: neighbor A.B.C.D password PASSWORD

The following command located under MPLS router node configures the router
Expand Down
2 changes: 2 additions & 0 deletions ldpd/interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
1 change: 1 addition & 0 deletions ldpd/ldp_vty.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
11 changes: 11 additions & 0 deletions ldpd/ldp_vty_cmds.c
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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);
Expand Down
32 changes: 32 additions & 0 deletions ldpd/ldp_vty_conf.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");
}
Expand Down Expand Up @@ -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)
Expand Down
1 change: 1 addition & 0 deletions ldpd/ldpd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions ldpd/ldpd.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
5 changes: 3 additions & 2 deletions ldpd/neighbor.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
21 changes: 21 additions & 0 deletions tests/topotests/ldp_establish_hello_topo1/r1/ldpd.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
hostname r1
log file ldpd.log
!
! debug mpls ldp zebra
! debug mpls ldp event
! debug mpls ldp errors
! debug mpls ldp messages recv
! debug mpls ldp messages sent
! debug mpls ldp discovery hello recv
! debug mpls ldp discovery hello sent
!
mpls ldp
router-id 1.1.1.1
!
address-family ipv4
discovery transport-address 1.1.1.1
!
!
!
line vty
!
17 changes: 17 additions & 0 deletions tests/topotests/ldp_establish_hello_topo1/r1/zebra.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
log file zebra.log
!
hostname r1
!
interface lo
ip address 1.1.1.1/32
!
interface r1-eth0
description to sw0
ip address 10.0.1.1/24
no link-detect
!
ip forwarding
!
!
line vty
!
21 changes: 21 additions & 0 deletions tests/topotests/ldp_establish_hello_topo1/r2/ldpd.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
hostname r2
log file ldpd.log
!
! debug mpls ldp zebra
! debug mpls ldp event
! debug mpls ldp errors
! debug mpls ldp messages recv
! debug mpls ldp messages sent
! debug mpls ldp discovery hello recv
! debug mpls ldp discovery hello sent
!
mpls ldp
router-id 2.2.2.2
!
address-family ipv4
discovery transport-address 2.2.2.2
!
!
!
line vty
!
17 changes: 17 additions & 0 deletions tests/topotests/ldp_establish_hello_topo1/r2/zebra.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
log file zebra.log
!
hostname r2
!
interface lo
ip address 2.2.2.2/32
!
interface r2-eth0
description to sw0
ip address 10.0.1.2/24
no link-detect
!
ip forwarding
!
!
line vty
!
21 changes: 21 additions & 0 deletions tests/topotests/ldp_establish_hello_topo1/r3/ldpd.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
hostname r3
log file ldpd.log
!
! debug mpls ldp zebra
! debug mpls ldp event
! debug mpls ldp errors
! debug mpls ldp messages recv
! debug mpls ldp messages sent
! debug mpls ldp discovery hello recv
! debug mpls ldp discovery hello sent
!
mpls ldp
router-id 3.3.3.3
!
address-family ipv4
discovery transport-address 3.3.3.3
!
!
!
line vty
!
17 changes: 17 additions & 0 deletions tests/topotests/ldp_establish_hello_topo1/r3/zebra.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
log file zebra.log
!
hostname r3
!
interface lo
ip address 3.3.3.3/32
!
interface r3-eth0
description to sw0
ip address 10.0.1.3/24
no link-detect
!
ip forwarding
!
!
line vty
!
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
## Color coding:
#########################
## Main FRR: #f08080 red
## Switches: #d0e0d0 gray
## RIP: #19e3d9 Cyan
## RIPng: #fcb314 dark yellow
## OSPFv2: #32b835 Green
## OSPFv3: #19e3d9 Cyan
## ISIS IPv4 #fcb314 dark yellow
## ISIS IPv6 #9a81ec purple
## BGP IPv4 #eee3d3 beige
## BGP IPv6 #fdff00 yellow
##### Colors (see http://www.color-hex.com/)

graph template {
label="Test Topology - LDP-ESTABLISH-HELLO 1";

# Routers
r1 [
shape=doubleoctagon,
label="1.1.1.1",
fillcolor="#f08080",
style=filled,
];
r2 [
shape=doubleoctagon
label="2.2.2.2",
fillcolor="#f08080",
style=filled,
];
r3 [
shape=doubleoctagon
label="3.3.3.3",
fillcolor="#f08080",
style=filled,
];

# Switches
sw0 [
shape=oval,
label="10.0.1.0/24",
fillcolor="#d0e0d0",
style=filled,
];

# Connections

r1 -- sw0 [label="r1-eth0"];
r2 -- sw0 [label="r2-eth0"];
r3 -- sw0 [label="r3-eth0"];
}
Loading
Loading