Index | Thread | Search

From:
Claudio Jeker <cjeker@diehard.n-r-g.com>
Subject:
bgpd: use peer_blast for route refresh
To:
tech@openbsd.org
Date:
Tue, 10 Dec 2024 14:26:16 +0100

Download raw body.

Thread
For an established session the Adj-RIB-Out is already calculated so
when a route refresh request is received we just need to blast out the
full table to the peer. Saves a fair bit of work.

-- 
:wq Claudio

Index: rde.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v
diff -u -p -r1.643 rde.c
--- rde.c	2 Dec 2024 16:31:51 -0000	1.643
+++ rde.c	10 Dec 2024 13:24:03 -0000
@@ -1349,7 +1349,7 @@ rde_dispatch_imsg_peer(struct rde_peer *
 		}
 		switch (rr.subtype) {
 		case ROUTE_REFRESH_REQUEST:
-			peer_dump(peer, rr.aid);
+			peer_blast(peer, rr.aid);
 			break;
 		case ROUTE_REFRESH_BEGIN_RR:
 			/* check if graceful restart EOR was received */
Index: rde.h
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.h,v
diff -u -p -r1.306 rde.h
--- rde.h	25 Sep 2024 14:46:51 -0000	1.306
+++ rde.h	10 Dec 2024 13:20:43 -0000
@@ -371,6 +371,7 @@ void		 peer_up(struct rde_peer *, struct
 void		 peer_down(struct rde_peer *, void *);
 void		 peer_flush(struct rde_peer *, uint8_t, time_t);
 void		 peer_stale(struct rde_peer *, uint8_t, int);
+void		 peer_blast(struct rde_peer *, uint8_t);
 void		 peer_dump(struct rde_peer *, uint8_t);
 void		 peer_begin_rrefresh(struct rde_peer *, uint8_t);
 
Index: rde_peer.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde_peer.c,v
diff -u -p -r1.39 rde_peer.c
--- rde_peer.c	10 Dec 2024 12:23:42 -0000	1.39
+++ rde_peer.c	10 Dec 2024 13:20:32 -0000
@@ -530,7 +530,7 @@ peer_blast_done(void *ptr, uint8_t aid)
  * Send out the full Adj-RIB-Out by putting all prefixes onto the update
  * queue.
  */
-static void
+void
 peer_blast(struct rde_peer *peer, uint8_t aid)
 {
 	if (peer->capa.enhanced_rr && (peer->sent_eor & (1 << aid)))