all lists on lists.proxmox.com
 help / color / mirror / Atom feed
* [pve-devel] [PATCH frr] fix #4040 : patch : ospf6d: fix infinite loop when adding ASBR route
@ 2023-04-13 11:48 Alexandre Derumier
  2023-06-06  8:40 ` [pve-devel] applied: " Thomas Lamprecht
  0 siblings, 1 reply; 2+ messages in thread
From: Alexandre Derumier @ 2023-04-13 11:48 UTC (permalink / raw)
  To: pve-devel

---
 .../frr/ospf6d-fix-infinite-loop.patch        | 76 +++++++++++++++++++
 debian/patches/series                         |  1 +
 2 files changed, 77 insertions(+)
 create mode 100644 debian/patches/frr/ospf6d-fix-infinite-loop.patch

diff --git a/debian/patches/frr/ospf6d-fix-infinite-loop.patch b/debian/patches/frr/ospf6d-fix-infinite-loop.patch
new file mode 100644
index 0000000..3af86cd
--- /dev/null
+++ b/debian/patches/frr/ospf6d-fix-infinite-loop.patch
@@ -0,0 +1,76 @@
+From 4dfe15200ab1a84a8d77fcbc33085c373d556eae Mon Sep 17 00:00:00 2001
+From: Renato Westphal <renato@opensourcerouting.org>
+Date: Wed, 23 Nov 2022 22:14:51 -0300
+Subject: [PATCH] ospf6d: fix infinite loop when adding ASBR route
+
+Commit 8f359e1593c414322 removed a check that prevented the same route
+from being added twice. In certain topologies, that change resulted in
+the following infinite loop when adding an ASBR route:
+
+ospf6_route_add
+ ospf6_top_brouter_hook_add
+  ospf6_abr_examin_brouter
+   ospf6_abr_examin_summary
+    ospf6_route_add
+     (repeat until stack overflow)
+
+Revert the offending commit and update `ospf6_route_is_identical()` to
+not do comparison using `memcmp()`.
+
+Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
+---
+ ospf6d/ospf6_route.c | 21 +++++++++++++++++++++
+ ospf6d/ospf6_route.h |  8 ++++++++
+ 2 files changed, 29 insertions(+)
+
+diff --git a/ospf6d/ospf6_route.c b/ospf6d/ospf6_route.c
+index db94b85b1b5..1cc1fcb47b3 100644
+--- a/ospf6d/ospf6_route.c
++++ b/ospf6d/ospf6_route.c
+@@ -702,6 +702,27 @@ struct ospf6_route *ospf6_route_add(struct ospf6_route *route,
+ 	}
+ 
+ 	if (old) {
++		/* if route does not actually change, return unchanged */
++		if (ospf6_route_is_identical(old, route)) {
++			if (IS_OSPF6_DEBUG_ROUTE(MEMORY))
++				zlog_debug(
++					"%s %p: route add %p: needless update of %p old cost %u",
++					ospf6_route_table_name(table),
++					(void *)table, (void *)route,
++					(void *)old, old->path.cost);
++			else if (IS_OSPF6_DEBUG_ROUTE(TABLE))
++				zlog_debug("%s: route add: needless update",
++					   ospf6_route_table_name(table));
++
++			ospf6_route_delete(route);
++			SET_FLAG(old->flag, OSPF6_ROUTE_ADD);
++			ospf6_route_table_assert(table);
++
++			/* to free the lookup lock */
++			route_unlock_node(node);
++			return old;
++		}
++
+ 		if (IS_OSPF6_DEBUG_ROUTE(MEMORY))
+ 			zlog_debug(
+ 				"%s %p: route add %p cost %u paths %u nh %u: update of %p cost %u paths %u nh %u",
+diff --git a/ospf6d/ospf6_route.h b/ospf6d/ospf6_route.h
+index bb5827a1766..c8411c015f8 100644
+--- a/ospf6d/ospf6_route.h
++++ b/ospf6d/ospf6_route.h
+@@ -297,6 +297,14 @@ extern const char *const ospf6_path_type_substr[OSPF6_PATH_TYPE_MAX];
+ 	 && (ra)->path.origin.type == (rb)->path.origin.type                   \
+ 	 && (ra)->path.origin.id == (rb)->path.origin.id                       \
+ 	 && (ra)->path.origin.adv_router == (rb)->path.origin.adv_router)
++#define ospf6_route_is_identical(ra, rb)                                       \
++	((ra)->type == (rb)->type &&                                           \
++	 prefix_same(&(ra)->prefix, &(rb)->prefix) &&                          \
++	 (ra)->path.type == (rb)->path.type &&                                 \
++	 (ra)->path.cost == (rb)->path.cost &&                                 \
++	 (ra)->path.u.cost_e2 == (rb)->path.u.cost_e2 &&                       \
++	 listcount(ra->paths) == listcount(rb->paths) &&                       \
++	 ospf6_route_cmp_nexthops(ra, rb) == 0)
+ 
+ #define ospf6_route_is_best(r) (CHECK_FLAG ((r)->flag, OSPF6_ROUTE_BEST))
+ 
diff --git a/debian/patches/series b/debian/patches/series
index c3b3fc0..b24c177 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -3,3 +3,4 @@ pve/0002-bgpd-add-an-option-for-RT-auto-derivation-to-force-A.patch
 frr/0001-zebra-buffering.patch
 frr/0002-zebra-buffering.patch
 frr/0003-zebra-buffering.patch
+frr/ospf6d-fix-infinite-loop.patch
\ No newline at end of file
-- 
2.30.2




^ permalink raw reply	[flat|nested] 2+ messages in thread

* [pve-devel] applied: [PATCH frr] fix #4040 : patch : ospf6d: fix infinite loop when adding ASBR route
  2023-04-13 11:48 [pve-devel] [PATCH frr] fix #4040 : patch : ospf6d: fix infinite loop when adding ASBR route Alexandre Derumier
@ 2023-06-06  8:40 ` Thomas Lamprecht
  0 siblings, 0 replies; 2+ messages in thread
From: Thomas Lamprecht @ 2023-06-06  8:40 UTC (permalink / raw)
  To: Proxmox VE development discussion, Alexandre Derumier

Am 13/04/2023 um 13:48 schrieb Alexandre Derumier:
> ---
>  .../frr/ospf6d-fix-infinite-loop.patch        | 76 +++++++++++++++++++
>  debian/patches/series                         |  1 +
>  2 files changed, 77 insertions(+)
>  create mode 100644 debian/patches/frr/ospf6d-fix-infinite-loop.patch
> 
>

applied,  thanks!

And yeah, rather late, but your frr update to 8.5.1 depends on that so this
was the easiest thing ^^




^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2023-06-06  8:40 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-04-13 11:48 [pve-devel] [PATCH frr] fix #4040 : patch : ospf6d: fix infinite loop when adding ASBR route Alexandre Derumier
2023-06-06  8:40 ` [pve-devel] applied: " Thomas Lamprecht

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal