From: Claudio Jeker Subject: bgpd: split out mrt capture in SE To: tech@openbsd.org Date: Tue, 18 Feb 2025 15:37:56 +0100 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 *);