bgpkit_parser/parser/bmp/messages/
route_monitoring.rs1use 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 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}