use crate::message::attributes::*;
#[cfg(feature = "serialization")]
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)]
#[cfg(feature = "serialization")]
#[derive(Serialize, Deserialize)]
pub enum BgpAttrOrigin {
Igp,
Egp,
Incomplete,
}
impl std::fmt::Display for BgpAttrOrigin {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
BgpAttrOrigin::Igp => f.write_str("Igp"),
BgpAttrOrigin::Egp => f.write_str("Egp"),
BgpAttrOrigin::Incomplete => f.write_str("Incomplete"),
}
}
}
#[derive(Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)]
#[cfg(feature = "serialization")]
#[derive(Serialize, Deserialize)]
#[serde(transparent)]
pub struct BgpOrigin {
pub value: BgpAttrOrigin,
}
impl BgpOrigin {
pub fn new(v: BgpAttrOrigin) -> BgpOrigin {
BgpOrigin { value: v }
}
pub fn decode_from(buf: &[u8]) -> Result<BgpOrigin, BgpError> {
if buf.is_empty() {
Err(BgpError::InsufficientBufferSize(file!(), line!()))
} else {
match buf[0] {
0 => Ok(BgpOrigin {
value: BgpAttrOrigin::Igp,
}),
1 => Ok(BgpOrigin {
value: BgpAttrOrigin::Egp,
}),
2 => Ok(BgpOrigin {
value: BgpAttrOrigin::Incomplete,
}),
_ => Err(BgpError::static_str("Invalid value for BgpOrigin")),
}
}
}
}
impl std::fmt::Debug for BgpOrigin {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("BgpOrigin")
.field("value", &self.value)
.finish()
}
}
impl std::fmt::Display for BgpOrigin {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self.value {
BgpAttrOrigin::Igp => {
write!(f, "igp")
}
BgpAttrOrigin::Egp => {
write!(f, "egp")
}
BgpAttrOrigin::Incomplete => {
write!(f, "incomplete")
}
}
}
}
impl BgpAttr for BgpOrigin {
fn attr(&self) -> BgpAttrParams {
BgpAttrParams {
typecode: 1,
flags: 64,
}
}
fn encode_to(&self, _peer: &BgpSessionParams, buf: &mut [u8]) -> Result<usize, BgpError> {
if buf.is_empty() {
Err(BgpError::InsufficientBufferSize(file!(), line!()))
} else {
match self.value {
BgpAttrOrigin::Igp => {
buf[0] = 0;
Ok(1)
}
BgpAttrOrigin::Egp => {
buf[0] = 1;
Ok(1)
}
BgpAttrOrigin::Incomplete => {
buf[0] = 2;
Ok(1)
}
}
}
}
}