summaryrefslogtreecommitdiff
path: root/proto/bgp/packets.c
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2023-04-28 19:13:56 +0200
committerOndrej Zajicek <santiago@crfreenet.org>2023-05-01 04:01:16 +0200
commit1be0be1b71f0127740a4aa6f35d4a256d6c34fb9 (patch)
tree807420edb2dba2a8c648845a9c3e7d311692ede5 /proto/bgp/packets.c
parenta8a64ca0fed41c78376b27880e934296bd3c3a7f (diff)
BGP: Save sent and received OPEN messages
These are necessary for BMP Peer UP message and it is better to keep them in BGP than in BMP (so BMP could be restarted or added later).
Diffstat (limited to 'proto/bgp/packets.c')
-rw-r--r--proto/bgp/packets.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/proto/bgp/packets.c b/proto/bgp/packets.c
index b9537169..c6c12cf2 100644
--- a/proto/bgp/packets.c
+++ b/proto/bgp/packets.c
@@ -773,6 +773,14 @@ err:
}
static byte *
+bgp_copy_open(struct bgp_proto *p, const byte *pkt, uint len)
+{
+ char *buf = mb_alloc(p->p.pool, len - BGP_HEADER_LENGTH);
+ memcpy(buf, pkt + BGP_HEADER_LENGTH, len - BGP_HEADER_LENGTH);
+ return buf;
+}
+
+static byte *
bgp_create_open(struct bgp_conn *conn, byte *buf)
{
struct bgp_proto *p = conn->bgp;
@@ -846,6 +854,9 @@ bgp_rx_open(struct bgp_conn *conn, byte *pkt, uint len)
id = get_u32(pkt+24);
BGP_TRACE(D_PACKETS, "Got OPEN(as=%d,hold=%d,id=%R)", asn, hold, id);
+ conn->remote_open_msg = bgp_copy_open(p, pkt, len);
+ conn->remote_open_length = len - BGP_HEADER_LENGTH;
+
if (bgp_read_options(conn, pkt+29, pkt[28], len-29) < 0)
return;
@@ -2984,7 +2995,7 @@ bgp_send(struct bgp_conn *conn, uint type, uint len)
conn->bgp->stats.tx_messages++;
conn->bgp->stats.tx_bytes += len;
- memset(buf, 0xff, 16); /* Marker */
+ memset(buf, 0xff, BGP_HDR_MARKER_LENGTH);
put_u16(buf+16, len);
buf[18] = type;
@@ -3032,6 +3043,10 @@ bgp_fire_tx(struct bgp_conn *conn)
{
conn->packets_to_send &= ~(1 << PKT_OPEN);
end = bgp_create_open(conn, pkt);
+
+ conn->local_open_msg = bgp_copy_open(p, buf, end - buf);
+ conn->local_open_length = end - buf - BGP_HEADER_LENGTH;
+
int rv = bgp_send(conn, PKT_OPEN, end - buf);
if (rv >= 0)
{