5个版本 (3个重大变更)

新功能 0.4.1 2024年8月8日
0.4.0 2024年8月7日
0.3.0 2024年1月31日
0.2.0 2023年10月9日
0.1.0 2023年3月5日

#405 in 解析器实现

Download history 4/week @ 2024-05-17 2/week @ 2024-05-24 3/week @ 2024-05-31 3/week @ 2024-06-07 2/week @ 2024-06-14 25/week @ 2024-07-26 215/week @ 2024-08-02

每月240次下载
netgauze-bmp-service中使用

Apache-2.0

1.5MB
28K SLoC

BMP监控协议

BMP-4协议表示和序列化/反序列化(serde)

示例

运行示例: 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);
}

支持的BMP协议RFC

  1. RFC 7854 BGP监控协议(BMP)。
  2. RFC 8671 BGP监控协议(BMP)中对Adj-RIB-Out的支持。
  3. RFC 9069 BGP监控协议(BMP)中对Local RIB的支持。

开发文档

  • 使用此库对接受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
});

依赖项

~2–13MB
~157K SLoC