summaryrefslogtreecommitdiff
path: root/net/bird3/files/patch-02-kernel-trace-the-final-result
diff options
context:
space:
mode:
Diffstat (limited to 'net/bird3/files/patch-02-kernel-trace-the-final-result')
-rw-r--r--net/bird3/files/patch-02-kernel-trace-the-final-result53
1 files changed, 53 insertions, 0 deletions
diff --git a/net/bird3/files/patch-02-kernel-trace-the-final-result b/net/bird3/files/patch-02-kernel-trace-the-final-result
new file mode 100644
index 000000000000..a3c97320f30e
--- /dev/null
+++ b/net/bird3/files/patch-02-kernel-trace-the-final-result
@@ -0,0 +1,53 @@
+From ab74652f96c301dd2d2d2a831dd1a159ae1d5e02 Mon Sep 17 00:00:00 2001
+From: Maria Matejka <mq@ucw.cz>
+Date: Thu, 19 Dec 2024 12:28:27 +0100
+Subject: [PATCH] Kernel: when channel traces, we have to trace the final
+ result
+
+Otherwise it looks like we are sending too much traffic to netlink
+every other while, which is not true. Now we can disambiguate between
+in-kernel updates and ignored routes.
+---
+ sysdep/unix/krt.c | 14 +++++++++++---
+ 1 file changed, 11 insertions(+), 3 deletions(-)
+
+diff --git a/sysdep/unix/krt.c b/sysdep/unix/krt.c
+index 2770b8be2..34882b88f 100644
+--- sysdep/unix/krt.c
++++ sysdep/unix/krt.c
+@@ -672,7 +672,7 @@ krt_preexport(struct channel *C, rte *e)
+ }
+
+ static void
+-krt_rt_notify(struct proto *P, struct channel *ch UNUSED, const net_addr *net,
++krt_rt_notify(struct proto *P, struct channel *ch, const net_addr *net,
+ rte *new, const rte *old)
+ {
+ struct krt_proto *p = (struct krt_proto *) P;
+@@ -688,13 +688,21 @@ krt_rt_notify(struct proto *P, struct channel *ch UNUSED, const net_addr *net,
+ case KPS_IDLE:
+ case KPS_PRUNING:
+ if (new && bmap_test(&p->seen_map, new->id))
+- /* Already installed and seen in the kernel dump */
+- return;
++ if (ch->debug & D_ROUTES)
++ {
++ /* Already installed and seen in the kernel dump */
++ log(L_TRACE "%s.%s: %N already in kernel",
++ P->name, ch->name, net);
++ return;
++ }
+
+ /* fall through */
+ case KPS_SCANNING:
+ /* Actually replace the route */
+ krt_replace_rte(p, net, new, old);
++ if (ch->debug & D_ROUTES)
++ log(L_TRACE "%s.%s: %N %s kernel",
++ P->name, ch->name, net, old ? "replaced in" : "added to");
+ break;
+
+ }
+--
+GitLab
+