netgauze-bmp-pkt

Crates.ionetgauze-bmp-pkt
lib.rsnetgauze-bmp-pkt
version0.5.0
sourcesrc
created_at2023-03-05 11:24:10.208966
updated_at2024-11-05 16:53:38.170849
descriptionBMP Protocol representation and serde.
homepagehttps://github.com/NetGauze/NetGauze
repositoryhttps://github.com/NetGauze/NetGauze
max_upload_size
id801241
size286,838
Ahmed Elhassany (ahassany)

documentation

README

BMP Monitoring Protocol

BMP-4 Protocol representation and wire format serialization/deserialization (serde)

Example

To run example: cargo run --example bmp

use chrono::{DateTime, Utc};
use netgauze_bgp_pkt::BgpMessage;
use netgauze_bmp_pkt::{
    iana::RouteMirroringInformation, BmpMessage, BmpMessageValue, BmpPeerType, PeerHeader,
    RouteMirroringMessage, RouteMirroringValue,
};
use netgauze_parse_utils::{ReadablePDU, Span, WritablePDU};
use std::{
    io::Cursor,
    net::{IpAddr, Ipv4Addr, Ipv6Addr},
    str::FromStr,
};

fn main() {
    let bmp_msg = BgpMessage::V3(BmpMessageValue::RouteMirroring(RouteMirroringMessage::new(
        PeerHeader::new(
            BmpPeerType::LocRibInstancePeer { filtered: false },
            None,
            Some(IpAddr::V6(Ipv6Addr::from_str("2001::1").unwrap())),
            65000,
            Ipv4Addr::new(172, 10, 0, 1),
            Some(Utc::now()),
        ),
        vec![
            RouteMirroringValue::Information(RouteMirroringInformation::Experimental65531),
            RouteMirroringValue::BgpMessage(BgpMessage::KeepAlive),
        ],
    )));

    println!(
        "JSON representation of BMP packet: {}",
        serde_json::to_string(&bmp_msg).unwrap()
    );

    // Serialize the message into it's BGP binary format
    let mut buf: Vec<u8> = vec![];
    let mut cursor = Cursor::new(&mut buf);
    bmp_msg.write(&mut cursor).unwrap();
    assert_eq!(
        buf,
        vec![
            3, 0, 0, 0, 77, 6, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 1, 0, 0, 253, 232, 172, 10, 0, 1, 99, 67, 29, 215, 0, 10, 102, 27, 0, 1, 0, 2,
            255, 251, 0, 0, 0, 19, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
            255, 255, 255, 0, 19, 4
        ]
    );

    // Deserialize the message from binary format
    let (_, bmp_msg_back) = BmpMessage::from_wire(Span::new(&buf)).unwrap();
    assert_eq!(bmp_msg, bmp_msg_back);
}

Supported BMP Protocol RFCs

  1. RFC 7854 BGP Monitoring Protocol (BMP).
  2. RFC 8671 Support for Adj-RIB-Out in the BGP Monitoring Protocol ( BMP).
  3. RFC 9069 Support for Local RIB in the BGP Monitoring Protocol (BMP).

Development documentation

  • Using this library to fuzz other code accepting BmpMessage
#![no_main]

use libfuzzer_sys::fuzz_target;
use netgauze_bmp_pkt::BmpMessage;

fuzz_target!(|data: BmpMessage| {
    // Some fuzzing target that accepts BmpMessage as input and need to be fuzzed
});
Commit count: 552

cargo fmt