Download raw body.
bgpd: split out mrt capture in SE
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 *);
bgpd: split out mrt capture in SE