From dd2bc4fb406cc9284d35ef623ebb8838cb158bc8 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Tue, 9 May 2023 13:10:35 -0400 Subject: [PATCH] ospfd: Respect loopback's cost that is set and set loopback costs to 0 When setting an loopback's cost, set the value to 0, unless the operator has assigned a value for the loopback's cost. RFC states: If the state of the interface is Loopback, add a Type 3 link (stub network) as long as this is not an interface to an unnumbered point-to-point network. The Link ID should be set to the IP interface address, the Link Data set to the mask 0xffffffff (indicating a host route), and the cost set to 0. FRR is going to allow this to be overridden if the operator specifically sets a value too. Fixes: #13472 Signed-off-by: Donald Sharp --- ospfd/ospf_interface.c | 3 +++ ospfd/ospf_lsa.c | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/ospfd/ospf_interface.c b/ospfd/ospf_interface.c index 5742ece1f7..f18aa399a4 100644 --- a/ospfd/ospf_interface.c +++ b/ospfd/ospf_interface.c @@ -101,6 +101,9 @@ int ospf_if_get_output_cost(struct ospf_interface *oi) cost = 1; else if (cost > 65535) cost = 65535; + + if (if_is_loopback(oi->ifp)) + cost = 0; } return cost; diff --git a/ospfd/ospf_lsa.c b/ospfd/ospf_lsa.c index 452a3ba374..67f1faf8a9 100644 --- a/ospfd/ospf_lsa.c +++ b/ospfd/ospf_lsa.c @@ -608,7 +608,8 @@ static int lsa_link_loopback_set(struct stream **s, struct ospf_interface *oi) mask.s_addr = 0xffffffff; id.s_addr = oi->address->u.prefix4.s_addr; - return link_info_set(s, id, mask, LSA_LINK_TYPE_STUB, 0, 0); + return link_info_set(s, id, mask, LSA_LINK_TYPE_STUB, 0, + oi->output_cost); } /* Describe Virtual Link. */