bgpkit_parser/parser/bmp/messages/
route_monitoring.rs

1use crate::models::*;
2use crate::parser::bgp::messages::parse_bgp_message;
3use crate::parser::bmp::error::ParserBmpError;
4use bytes::Bytes;
5
6#[derive(Debug, PartialEq, Clone)]
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8pub struct RouteMonitoring {
9    pub bgp_message: BgpMessage,
10}
11
12pub fn parse_route_monitoring(
13    data: &mut Bytes,
14    asn_len: &AsnLength,
15) -> Result<RouteMonitoring, ParserBmpError> {
16    let bgp_update = parse_bgp_message(data, false, asn_len)?;
17    Ok(RouteMonitoring {
18        bgp_message: bgp_update,
19    })
20}
21
22impl RouteMonitoring {
23    /// Check if the BMP route-monitoring message is an End-of-RIB marker.
24    pub fn is_end_of_rib(&self) -> bool {
25        if let BgpMessage::Update(u) = &self.bgp_message {
26            u.is_end_of_rib()
27        } else {
28            false
29        }
30    }
31}
32
33#[cfg(test)]
34mod tests {
35    use super::*;
36
37    #[test]
38    fn test_end_of_rib() {
39        let msg = BgpUpdateMessage {
40            withdrawn_prefixes: vec![],
41            attributes: Attributes::default(),
42            announced_prefixes: vec![],
43        };
44        assert!(msg.is_end_of_rib());
45
46        let mon_msg = RouteMonitoring {
47            bgp_message: BgpMessage::Update(msg),
48        };
49        assert!(mon_msg.is_end_of_rib());
50
51        let mon_msg = RouteMonitoring {
52            bgp_message: BgpMessage::KeepAlive,
53        };
54        assert!(!mon_msg.is_end_of_rib());
55    }
56
57    #[test]
58    fn test_debug() {
59        let msg = BgpUpdateMessage {
60            withdrawn_prefixes: vec![],
61            attributes: Attributes::default(),
62            announced_prefixes: vec![],
63        };
64        let mon_msg = RouteMonitoring {
65            bgp_message: BgpMessage::Update(msg),
66        };
67        assert_eq!(
68            format!("{:?}", mon_msg),
69            "RouteMonitoring { bgp_message: Update(BgpUpdateMessage { withdrawn_prefixes: [], attributes: Attributes { inner: [] }, announced_prefixes: [] }) }"
70        );
71    }
72}