diff options
author | Claudio Jeker <claudio@cvs.openbsd.org> | 2024-08-28 13:21:40 +0000 |
---|---|---|
committer | Claudio Jeker <claudio@cvs.openbsd.org> | 2024-08-28 13:21:40 +0000 |
commit | 1a68ef738662e519e93f9ffd1fd05c6cfcff6744 (patch) | |
tree | 6e6b34af9075b71820ad672058b9526d70ac7368 | |
parent | 5a0713084cac4f1912480d34515855528b54ce82 (diff) |
Introduce peer_is_up() and use it instead of peer->state == PEER_UP checks
also enqueue update and rrfresh imsgs only if the peer is up and flush them
once this is no longer the case.
OK tb@
-rw-r--r-- | usr.sbin/bgpd/rde.c | 18 | ||||
-rw-r--r-- | usr.sbin/bgpd/rde.h | 8 | ||||
-rw-r--r-- | usr.sbin/bgpd/rde_peer.c | 4 |
3 files changed, 20 insertions, 10 deletions
diff --git a/usr.sbin/bgpd/rde.c b/usr.sbin/bgpd/rde.c index eefd7880def..d72afb28051 100644 --- a/usr.sbin/bgpd/rde.c +++ b/usr.sbin/bgpd/rde.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rde.c,v 1.628 2024/08/28 13:18:11 claudio Exp $ */ +/* $OpenBSD: rde.c,v 1.629 2024/08/28 13:21:39 claudio Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org> @@ -398,7 +398,8 @@ rde_dispatch_imsg_session(struct imsgbuf *imsgbuf) peerid); break; } - peer_imsg_push(peer, &imsg); + if (peer_is_up(peer)) + peer_imsg_push(peer, &imsg); break; case IMSG_SESSION_ADD: if (imsg_get_data(&imsg, &pconf, sizeof(pconf)) == -1) @@ -1311,13 +1312,16 @@ rde_dispatch_imsg_peer(struct rde_peer *peer, void *bula) struct imsg imsg; struct ibuf ibuf; + if (!peer_is_up(peer)) { + peer_imsg_flush(peer); + return; + } + if (!peer_imsg_pop(peer, &imsg)) return; switch (imsg_get_type(&imsg)) { case IMSG_UPDATE: - if (peer->state != PEER_UP) - break; if (imsg_get_ibuf(&imsg, &ibuf) == -1) log_warn("update: bad imsg"); else @@ -3332,7 +3336,7 @@ rde_update_queue_pending(void) RB_FOREACH(peer, peer_tree, &peertable) { if (peer->conf.id == 0) continue; - if (peer->state != PEER_UP) + if (!peer_is_up(peer)) continue; if (peer->throttled) continue; @@ -3358,7 +3362,7 @@ rde_update_queue_runner(uint8_t aid) RB_FOREACH(peer, peer_tree, &peertable) { if (peer->conf.id == 0) continue; - if (peer->state != PEER_UP) + if (!peer_is_up(peer)) continue; if (peer->throttled) continue; @@ -3387,7 +3391,7 @@ rde_update_queue_runner(uint8_t aid) RB_FOREACH(peer, peer_tree, &peertable) { if (peer->conf.id == 0) continue; - if (peer->state != PEER_UP) + if (!peer_is_up(peer)) continue; if (peer->throttled) continue; diff --git a/usr.sbin/bgpd/rde.h b/usr.sbin/bgpd/rde.h index 899833da05f..78494240aea 100644 --- a/usr.sbin/bgpd/rde.h +++ b/usr.sbin/bgpd/rde.h @@ -1,4 +1,4 @@ -/* $OpenBSD: rde.h,v 1.304 2024/08/14 19:09:51 claudio Exp $ */ +/* $OpenBSD: rde.h,v 1.305 2024/08/28 13:21:39 claudio Exp $ */ /* * Copyright (c) 2003, 2004 Claudio Jeker <claudio@openbsd.org> and @@ -379,6 +379,12 @@ int peer_imsg_pop(struct rde_peer *, struct imsg *); int peer_imsg_pending(void); void peer_imsg_flush(struct rde_peer *); +static inline int +peer_is_up(struct rde_peer *peer) +{ + return (peer->state == PEER_UP); +} + RB_PROTOTYPE(peer_tree, rde_peer, entry, peer_cmp); /* rde_attr.c */ diff --git a/usr.sbin/bgpd/rde_peer.c b/usr.sbin/bgpd/rde_peer.c index 9ddd692266c..351c0b4415a 100644 --- a/usr.sbin/bgpd/rde_peer.c +++ b/usr.sbin/bgpd/rde_peer.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rde_peer.c,v 1.37 2024/05/22 08:41:14 claudio Exp $ */ +/* $OpenBSD: rde_peer.c,v 1.38 2024/08/28 13:21:39 claudio Exp $ */ /* * Copyright (c) 2019 Claudio Jeker <claudio@openbsd.org> @@ -234,7 +234,7 @@ peer_generate_update(struct rde_peer *peer, struct rib_entry *re, /* skip ourself */ if (peer == peerself) return; - if (peer->state != PEER_UP) + if (!peer_is_up(peer)) return; /* skip peers using a different rib */ if (peer->loc_rib_id != re->rib_id) |