risotto_lib/
lib.rs

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    // Parse the BMP message
25    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    // Extract header and peer information
34    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            // No-Op
46        }
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            // No-Op
65        }
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            // No-Op
81        }
82        BmpMessageBody::StatsReport(_) => {
83            info!(
84                "StatsReport: {} - {}",
85                metadata.router_addr, metadata.peer_addr
86            )
87            // No-Op
88        }
89    }
90}