Index | Thread | Search

From:
Claudio Jeker <cjeker@diehard.n-r-g.com>
Subject:
bgpd: split out mrt capture in SE
To:
tech@openbsd.org
Date:
Tue, 18 Feb 2025 15:37:56 +0100

Download raw body.

Thread
I want to start splitting up session.c into smaller files.
One part I want split out is the message processing code and for that
mrt logging needs to be its own function since I don't want to export
the mrt head.

So this diff does that.
-- 
:wq Claudio

Index: session.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/session.c,v
diff -u -p -r1.516 session.c
--- session.c	17 Feb 2025 16:41:59 -0000	1.516
+++ session.c	18 Feb 2025 14:15:01 -0000
@@ -885,8 +885,6 @@ void
 change_state(struct peer *peer, enum session_state state,
     enum session_events event)
 {
-	struct mrt	*mrt;
-
 	switch (state) {
 	case STATE_IDLE:
 		/* carp demotion first. new peers handled in init_peer */
@@ -1000,14 +998,9 @@ change_state(struct peer *peer, enum ses
 	}
 
 	log_statechange(peer, state, event);
-	LIST_FOREACH(mrt, &mrthead, entry) {
-		if (!(mrt->type == MRT_ALL_IN || mrt->type == MRT_ALL_OUT))
-			continue;
-		if ((mrt->peer_id == 0 && mrt->group_id == 0) ||
-		    mrt->peer_id == peer->conf.id || (mrt->group_id != 0 &&
-		    mrt->group_id == peer->conf.groupid))
-			mrt_dump_state(mrt, peer->state, state, peer);
-	}
+
+	session_mrt_dump_state(peer, peer->state, state);
+
 	peer->prev_state = peer->state;
 	peer->state = state;
 }
@@ -1448,17 +1441,7 @@ session_newmsg(enum msg_type msgtype, ui
 void
 session_sendmsg(struct ibuf *msg, struct peer *p, enum msg_type msgtype)
 {
-	struct mrt		*mrt;
-
-	LIST_FOREACH(mrt, &mrthead, entry) {
-		if (!(mrt->type == MRT_ALL_OUT || (msgtype == BGP_UPDATE &&
-		    mrt->type == MRT_UPDATE_OUT)))
-			continue;
-		if ((mrt->peer_id == 0 && mrt->group_id == 0) ||
-		    mrt->peer_id == p->conf.id || (mrt->group_id != 0 &&
-		    mrt->group_id == p->conf.groupid))
-			mrt_dump_bgp_msg(mrt, msg, p, msgtype);
-	}
+	session_mrt_dump_bgp_msg(p, msg, msgtype, DIR_OUT);
 
 	ibuf_close(p->wbuf, msg);
 	if (!p->throttled && msgbuf_queuelen(p->wbuf) > SESS_MSG_HIGH_MARK) {
@@ -2063,7 +2046,6 @@ void
 session_process_msg(struct peer *p)
 {
 	struct ibuf	*msg;
-	struct mrt	*mrt;
 	int		processed = 0;
 	uint8_t		msgtype;
 
@@ -2086,17 +2068,7 @@ session_process_msg(struct peer *p)
 		}
 		ibuf_rewind(msg);
 
-		/* dump to MRT as soon as we have a full packet */
-		LIST_FOREACH(mrt, &mrthead, entry) {
-			if (!(mrt->type == MRT_ALL_IN ||
-			    (msgtype == BGP_UPDATE &&
-			    mrt->type == MRT_UPDATE_IN)))
-				continue;
-			if ((mrt->peer_id == 0 && mrt->group_id == 0) ||
-			    mrt->peer_id == p->conf.id || (mrt->group_id != 0 &&
-			    mrt->group_id == p->conf.groupid))
-				mrt_dump_bgp_msg(mrt, msg, p, msgtype);
-		}
+		session_mrt_dump_bgp_msg(p, msg, msgtype, DIR_IN);
 
 		ibuf_skip(msg, MSGSIZE_HEADER);
 
@@ -3027,6 +2999,47 @@ capa_neg_calc(struct peer *p)
 	session_notification(p, ERR_OPEN, ERR_OPEN_CAPA, ebuf);
 	ibuf_free(ebuf);
 	return (-1);
+}
+
+void
+session_mrt_dump_state(struct peer *p, enum session_state oldstate,
+    enum session_state newstate)
+{
+	struct mrt		*mrt;
+
+	LIST_FOREACH(mrt, &mrthead, entry) {
+		if (!(mrt->type == MRT_ALL_IN || mrt->type == MRT_ALL_OUT))
+			continue;
+		if ((mrt->peer_id == 0 && mrt->group_id == 0) ||
+		    mrt->peer_id == p->conf.id || (mrt->group_id != 0 &&
+		    mrt->group_id == p->conf.groupid))
+			mrt_dump_state(mrt, oldstate, newstate, p);
+	}
+}
+
+void
+session_mrt_dump_bgp_msg(struct peer *p, struct ibuf *msg,
+     enum msg_type msgtype, enum directions dir)
+{
+	struct mrt		*mrt;
+
+	LIST_FOREACH(mrt, &mrthead, entry) {
+		if (dir == DIR_IN) {
+			if (mrt->type != MRT_ALL_IN &&
+			    (mrt->type != MRT_UPDATE_IN ||
+			    msgtype != BGP_UPDATE))
+				continue;
+		} else {
+			if (mrt->type != MRT_ALL_OUT &&
+			    (mrt->type != MRT_UPDATE_OUT ||
+			    msgtype != BGP_UPDATE))
+				continue;
+		}
+		if ((mrt->peer_id == 0 && mrt->group_id == 0) ||
+		    mrt->peer_id == p->conf.id || (mrt->group_id != 0 &&
+		    mrt->group_id == p->conf.groupid))
+			mrt_dump_bgp_msg(mrt, msg, p, msgtype);
+	}
 }
 
 void
Index: session.h
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/session.h,v
diff -u -p -r1.185 session.h
--- session.h	31 Jan 2025 20:07:18 -0000	1.185
+++ session.h	18 Feb 2025 14:15:01 -0000
@@ -333,6 +333,10 @@ int		 session_neighbor_rrefresh(struct p
 struct peer	*getpeerbydesc(struct bgpd_config *, const char *);
 struct peer	*getpeerbyip(struct bgpd_config *, struct sockaddr *);
 struct peer	*getpeerbyid(struct bgpd_config *, uint32_t);
+void		 session_mrt_dump_state(struct peer *, enum session_state,
+		    enum session_state);
+void		 session_mrt_dump_bgp_msg(struct peer *, struct ibuf *,
+		    enum msg_type, enum directions);
 int		 peer_matched(struct peer *, struct ctl_neighbor *);
 int		 imsg_ctl_parent(struct imsg *);
 int		 imsg_ctl_rde(struct imsg *);