Crates.io | bgp-rs |
lib.rs | bgp-rs |
version | 0.6.0 |
source | src |
created_at | 2019-02-02 13:42:13.777554 |
updated_at | 2020-06-27 13:50:48.183551 |
description | A library for parsing Border Gateway Protocol (BGP) formatted streams. |
homepage | https://github.com/DevQps/bgp-rs |
repository | https://github.com/DevQps/bgp-rs |
max_upload_size | |
id | 112197 |
size | 159,831 |
A library for parsing Border Gateway Protocol (BGP) formatted streams in Rust. Messages such as UPDATE, OPEN, KEEPALIVE and NOTIFICATION can be read this way.
Reading a MRT file containing BGP4MP messages
use std::fs::File;
use std::io::Cursor;
use std::io::Read;
use std::io::BufReader;
use mrt_rs::Record;
use mrt_rs::bgp4mp::BGP4MP;
use libflate::gzip::Decoder;
use bgp_rs::{Identifier, PathAttribute};
fn main() {
// Download an update message.
let file = File::open("res/updates.20190101.0000.gz").unwrap();
// Decode the GZIP stream.
let decoder = Decoder::new(BufReader::new(file)).unwrap();
// Create a new MRTReader with a Cursor such that we can keep track of the position.
let mut reader = mrt_rs::Reader { stream: decoder };
// Keep reading MRT (Header, Record) tuples till the end of the file has been reached.
while let Ok(Some((_, record))) = reader.read() {
// Extract BGP4MP::MESSAGE_AS4 entries.
if let Record::BGP4MP(BGP4MP::MESSAGE_AS4(x)) = record {
// Read each BGP (Header, Message)
let cursor = Cursor::new(x.message);
let mut reader = bgp_rs::Reader::new(cursor);
let (_, message) = reader.read().unwrap();
// If this is an UPDATE message that contains announcements, extract its origin.
if let bgp_rs::Message::Update(x) = message {
if x.is_announcement() {
if let PathAttribute::AS_PATH(path) = x.get(Identifier::AS_PATH).unwrap()
{
// Test the path.origin() method.
let origin = path.origin();
// Do other stuff ...
}
}
}
}
}
Reading a MRT file containing TABLE_DUMP_V2 messages
For examples and documentation look here.
IANA has an official list of number assignments for BGP path attributes. In the table below one can see the status of each path attribute:
Number | Attribute | Specification | Status |
---|---|---|---|
1 | ORIGIN | RFC4271 | Implemented |
2 | AS_PATH | RFC4271 | Implemented |
3 | NEXT_HOP | RFC4271 | Implemented |
4 | MULTI_EXIT_DISC | RFC4271 | Implemented |
5 | LOCAL_PREF | RFC4271 | Implemented |
6 | ATOMIC_AGGREGATE | RFC4271 | Implemented |
7 | AGGREGATOR | RFC4271 | Implemented |
8 | COMMUNITY | RFC1997 | Implemented |
9 | ORIGINATOR_ID | RFC4456 | Implemented |
10 | CLUSTER_LIST | RFC4456 | Implemented |
11 | DPA (deprecated) | RFC6938 | Implemented |
12 | ADVERTISER (deprecated) | RFC1863 RFC4223 RFC6938 | Not yet implemented |
13 | RCID_PATH / CLUSTER_ID (deprecated) | RFC1863 RFC4223 RFC6938 | Not yet implemented |
14 | MP_REACH_NLRI | RFC4760 | Implemented |
15 | MP_UNREACH_NLRI | RFC4760 | Implemented |
16 | EXTENDED_COMMUNITIES | RFC4360 | Implemented |
17 | AS4_PATH | RFC6793 | Implemented |
18 | AS4_AGGREGATOR | RFC6793 | Implemented |
19 | SAFI Specific Attribute (deprecated) | draft-wijnands-mt-discovery-00 | Not yet implemented |
20 | CONNECTOR | RFC6037 | Implemented |
21 | AS_PATHLIMIT | draft-ietf-idr-as-pathlimit | Implemented |
22 | PMSI_TUNNEL | RFC6514 | Implemented |
23 | Tunnel Encapsulation | RFC5512 | Implemented |
24 | Traffic Engineering | RFC5543 | Not yet implemented |
25 | IPv6 Address Specific Extended Community | RFC5701 | Implemented |
26 | AIGP | RFC7311 | Implemented |
27 | PE Distinguisher Labels | RFC6514 | Not yet implemented |
28 | BGP Entropy Label Capability (deprecated) | RFC6790 RFC7447 | Not yet implemented |
29 | BGP-LS | RFC7752 | Not yet implemented |
32 | LARGE_COMMUNITY | RFC8092 | Implemented |
33 | BGPSEC_PATH | RFC8205 | Not yet implemented |
34 | BGP Community Container (temporary) | draft-ietf-idr-wide-bgp-communities | Not yet implemented |
35 | Internal Only To Customer (temporary) | draft-ietf-idr-bgp-open-policy | Not yet implemented |
40 | BGP Prefix-SID | RFC-ietf-idr-bgp-prefix-sid-27 | Not yet implemented |
128 | ATTR_SET | RFC6368 | Implemented |
This crate's minimum supported rustc
version is 1.34.2
.
The default feature set includes encoding & decoding of BGP Messages with attributes listed above
To enable Flowspec NLRI (SAFI 133) parsing (RFC5575), specify the flowspec
feature:
[dependencies]
...
bgp-rs = { version = "*", features = ["flowspec"]}
...
NOTE: This will add the bitflags
dependency