Skip to content

Commit

Permalink
impl Default for BgpElem
Browse files Browse the repository at this point in the history
  • Loading branch information
digizeph committed Nov 24, 2021
1 parent 320a1a1 commit 69fb5df
Show file tree
Hide file tree
Showing 6 changed files with 88 additions and 2 deletions.
1 change: 0 additions & 1 deletion src/bgp/attributes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,6 @@ impl AsPath {
self.segments.iter().map(AsPathSegment::count_asns).sum()
}


/// Construct AsPath from AS_PATH and AS4_PATH
///
/// https://datatracker.ietf.org/doc/html/rfc6793#section-4.2.3
Expand Down
43 changes: 43 additions & 0 deletions src/bgp/elem.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use std::fmt::{Display, Formatter};
use std::net::IpAddr;
use std::str::FromStr;
use itertools::Itertools;
use crate::bgp::attributes::{AsPath, AtomicAggregate, Community, Origin};
use crate::network::{Asn, NetworkPrefix};
Expand Down Expand Up @@ -38,6 +39,29 @@ pub struct BgpElem {
pub aggr_asn: Option<Asn>,
pub aggr_ip: Option<IpAddr>,
}

impl Default for BgpElem {
fn default() -> Self {
BgpElem {
timestamp: 0.0,
elem_type: ElemType::ANNOUNCE,
peer_ip: IpAddr::from_str("0.0.0.0").unwrap(),
peer_asn: 0,
prefix: NetworkPrefix::from_str("0.0.0.0/0").unwrap(),
next_hop: None,
as_path: None,
origin_asns: None,
origin: None,
local_pref: None,
med: None,
communities: None,
atomic: None,
aggr_asn: None,
aggr_ip: None
}
}
}

#[inline(always)]
pub fn option_to_string<T>(o: &Option<T>) -> String
where
Expand Down Expand Up @@ -86,3 +110,22 @@ impl Display for BgpElem {
}
}

#[cfg(test)]
mod tests {
use std::str::FromStr;
use std::default::Default;
use super::*;

#[test]
fn test_default() {
let elem = BgpElem{
timestamp: 0.0,
elem_type: ElemType::ANNOUNCE,
peer_ip: IpAddr::from_str("192.168.1.1").unwrap(),
peer_asn: 0,
prefix: NetworkPrefix::from_str("8.8.8.0/24").unwrap(),
..Default::default()
};
dbg!(elem);
}
}
26 changes: 26 additions & 0 deletions src/err.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
use std::error::Error;
use std::fmt::{Display, Formatter};
use ipnetwork::IpNetworkError;

#[derive(Debug)]
pub enum BgpModelsError {
PrefixParsingError(String),
}

impl Display for BgpModelsError {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self{
BgpModelsError::PrefixParsingError(msg) => {
write!(f, "cannot convert str to IP prefix: {}", msg)
}
}
}
}

impl Error for BgpModelsError{}

impl From<IpNetworkError> for BgpModelsError {
fn from(err: IpNetworkError) -> Self {
BgpModelsError::PrefixParsingError(err.to_string())
}
}
1 change: 1 addition & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ pub mod bgp;
pub mod network;
pub mod mrt;
pub mod prelude;
pub mod err;

#[macro_use]
extern crate enum_primitive_derive;
16 changes: 16 additions & 0 deletions src/network.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
use std::fmt::{Display, Formatter};
use std::net::{Ipv4Addr, Ipv6Addr};
use std::str::FromStr;
use ipnetwork::IpNetwork;
use crate::err::BgpModelsError;

/// Meta information for an address/prefix.
///
Expand Down Expand Up @@ -64,6 +66,20 @@ pub struct NetworkPrefix {
pub path_id: u32,
}

impl FromStr for NetworkPrefix {
type Err = BgpModelsError;

fn from_str(s: &str) -> Result<Self, Self::Err> {
let prefix = IpNetwork::from_str(s)?;
Ok(
NetworkPrefix{
prefix,
path_id: 0,
}
)
}
}

impl NetworkPrefix {
pub fn new(prefix: IpNetwork, path_id: u32) -> NetworkPrefix {
NetworkPrefix { prefix, path_id }
Expand Down
3 changes: 2 additions & 1 deletion src/prelude.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
pub use crate::bgp::*;
pub use crate::mrt::*;
pub use crate::network::*;
pub use crate::network::*;
pub use crate::err::BgpModelsError;

0 comments on commit 69fb5df

Please sign in to comment.