#bgp #protocols #networking #attributes #message-parser #path #composing

zettabgp

这是一个针对Rust的BGP(解析和组合)和BMP(仅解析)协议驱动库

12个版本

0.3.4 2023年10月26日
0.3.3 2023年1月17日
0.3.0 2022年10月8日
0.2.1 2021年8月1日
0.1.2 2021年5月23日

#206 in 网络编程

Download history 135/week @ 2024-04-29 13/week @ 2024-05-06 7/week @ 2024-05-13 8/week @ 2024-05-20 5/week @ 2024-05-27 12/week @ 2024-06-03 45/week @ 2024-06-10 40/week @ 2024-06-17 45/week @ 2024-06-24 47/week @ 2024-07-01 48/week @ 2024-07-08 104/week @ 2024-07-15 74/week @ 2024-07-22 170/week @ 2024-07-29 121/week @ 2024-08-05

每月471次下载
用于 3 crate

MIT/Apache

340KB
8K SLoC

zettabgp - BGP&BMP Rust库

这是一个为Rust编写的BGP和BMP协议驱动库。

BGP - 边界网关协议版本4。BMP - BGP监控协议版本3。

支持的BGP消息类型

  • 打开
  • 通知
  • 保持活跃
  • 更新

支持的BMP消息类型

  • 初始化
  • 终止
  • PeerUpNotification
  • 路由监控

支持的地址族NLRI(网络层可达信息)

  • ipv4单播
  • ipv4标签单播
  • ipv4多播
  • ipv4 mvpn
  • ipv4 mdt
  • vpnv4单播
  • vpnv4多播
  • ipv6单播
  • ipv6标签单播
  • ipv6多播
  • ipv6 mdt
  • vpnv6单播
  • vpnv6多播
  • vpls
  • evpn
  • flowspec ipv4
  • flowspec ipv6

支持的路径属性

  • MED
  • 起源
  • 本地优先级
  • AS路径
  • 社区
  • 扩展社区
  • 聚合AS
  • 原子聚合
  • 集群列表
  • 发起者ID
  • 属性集
  • 连接器
  • 一些PMSI隧道

用法

库允许您将协议消息(作为二进制缓冲区)解析到Rust数据结构以进行进一步处理。或从Rust数据结构生成有效的协议消息。因此,它可以在任何环境中(同步或异步)使用,以创建BGP RR、监控系统或BGP分析。

use zettabgp::prelude::*;
use std::io::{Read,Write};
let mut socket = match std::net::TcpStream::connect("127.0.0.1:179") {
  Ok(sck) => sck,
  Err(e) => {eprintln!("Unable to connect to BGP neighbor: {}",e);return;}
};
let params=BgpSessionParams::new(64512,180,BgpTransportMode::IPv4,std::net::Ipv4Addr::new(1,1,1,1),vec![BgpCapability::SafiIPv4u].into_iter().collect());
let mut buf = [0 as u8; 32768];
let mut open_my = params.open_message();
let open_sz = open_my.encode_to(&params, &mut buf[19..]).unwrap();
let tosend = params.prepare_message_buf(&mut buf, BgpMessageType::Open, open_sz).unwrap();
socket.write_all(&buf[0..tosend]).unwrap();//send my open message
socket.read_exact(&mut buf[0..19]).unwrap();//read response message head
let messagehead=params.decode_message_head(&buf).unwrap();//decode message head
if messagehead.0 == BgpMessageType::Open {
   socket.read_exact(&mut buf[0..messagehead.1]).unwrap();//read message body
   let mut bom = BgpOpenMessage::new();
   bom.decode_from(&params, &buf[0..messagehead.1]).unwrap();//decode received message body
   eprintln!("BGP Open message received: {:?}", bom);
}

Crates.io

https://crates.io/crates/zettabgp

文档

https://docs.rs/zettabgp

许可证

MIT OR Apache-2.0

依赖关系

~46–250KB