1pub mod processor;
2pub mod state;
3pub mod update;
4
5use bgpkit_parser::parser::bmp::messages::BmpMessageBody;
6use bytes::Bytes;
7use core::net::IpAddr;
8use std::sync::mpsc::Sender;
9use tracing::{error, info, trace};
10
11use crate::processor::{
12 decode_bmp_message, peer_down_notification, peer_up_notification, route_monitoring,
13};
14use crate::state::AsyncState;
15use crate::update::{new_metadata, Update};
16
17pub async fn process_bmp_message(
18 state: Option<AsyncState>,
19 tx: Sender<Update>,
20 router_addr: IpAddr,
21 router_port: u16,
22 bytes: &mut Bytes,
23) {
24 let message = match decode_bmp_message(bytes) {
26 Ok(message) => message,
27 Err(e) => {
28 error!("failed to decode BMP message: {}", e);
29 return;
30 }
31 };
32
33 let metadata = match new_metadata(router_addr, router_port, message.clone()) {
35 Some(m) => m,
36 None => return,
37 };
38
39 match message.message_body {
40 BmpMessageBody::InitiationMessage(_) => {
41 info!(
42 "InitiationMessage: {} - {}",
43 metadata.router_addr, metadata.peer_addr
44 )
45 }
47 BmpMessageBody::PeerUpNotification(body) => {
48 trace!("{:?}", body);
49 info!(
50 "PeerUpNotification: {} - {}",
51 metadata.router_addr, metadata.peer_addr
52 );
53 peer_up_notification(state, tx, metadata, body).await;
54 }
55 BmpMessageBody::RouteMonitoring(body) => {
56 trace!("{:?}", body);
57 route_monitoring(state, tx, metadata, body).await;
58 }
59 BmpMessageBody::RouteMirroring(_) => {
60 info!(
61 "RouteMirroring: {} - {}",
62 metadata.router_addr, metadata.peer_addr
63 )
64 }
66 BmpMessageBody::PeerDownNotification(body) => {
67 trace!("{:?}", body);
68 info!(
69 "PeerDownNotification: {} - {}",
70 metadata.router_addr, metadata.peer_addr
71 );
72 peer_down_notification(state, tx, metadata, body).await;
73 }
74
75 BmpMessageBody::TerminationMessage(_) => {
76 info!(
77 "TerminationMessage: {} - {}",
78 metadata.router_addr, metadata.peer_addr
79 )
80 }
82 BmpMessageBody::StatsReport(_) => {
83 info!(
84 "StatsReport: {} - {}",
85 metadata.router_addr, metadata.peer_addr
86 )
87 }
89 }
90}