bgp-packet 0.0.2

A Border Gateway Protocol implementation
Documentation
use thiserror::Error;

#[derive(Debug, Error)]
#[repr(u8)]
pub enum BgpError {
    #[error("Message header error")]
    MsgHeader(MsgHeaderSubcode) = 1,

    #[error("Open message error")]
    OpenMsg(OpenMsgSubcode) = 2,

    #[error("Update message error")]
    UpdateMsg(UpdateMsgSubcode) = 3,

    #[error("Hold timer expired")]
    HoldTimer = 4,

    #[error("Finite state machine error")]
    FsmError(FsmSubcode) = 5,

    #[error("Cease")]
    Cease(CeaseSubcode) = 6,

    #[error("Route refresh message error")]
    RouteRefresh(RouteRefreshSubcode) = 7,

    #[error("Send hold timer expired")]
    SendHoldTimer = 8,
}

#[derive(Debug, Error)]
pub enum MsgHeaderSubcode {
    #[error("Connection not synchronized")]
    ConnNotSynchronized = 1,

    #[error("Bad message length")]
    BadMessageLength = 2,

    #[error("Bad message type")]
    BadMessagType = 3,
}

#[derive(Debug, Error)]
pub enum OpenMsgSubcode {
    #[error("Unsupported BGP version number")]
    UnsupportedVersion = 1,

    #[error("Bad peer AS number")]
    BadPeerAs = 2,

    #[error("Bad BGP identifier")]
    BadBgpId = 3,

    #[error("Unsupported optional parameter")]
    UnsupportedOptionalParam = 4,

    #[error("Unacceptable hold time")]
    UnacceptableHoldTime = 6,

    #[error("Unsupported capability")]
    UnsupportedCapability = 7,

    #[error("Role mismatch")]
    RoleMismatch = 8,
}

#[derive(Debug, Error)]
pub enum UpdateMsgSubcode {
    #[error("Malformed attribute list")]
    MalforedAttrs = 1,

    #[error("Unrecognized well known attribute")]
    UnrecognizedWellKnownAttr = 2,

    #[error("Missing well known attribute")]
    MissingWellKnown = 3,

    #[error("Attribute flags error")]
    AttributeFlags = 4,

    #[error("Attribute length error")]
    AttributeLength = 5,

    #[error("Invalid origin")]
    InvalidOrigin = 6,

    #[error("Invalid next hop")]
    InvalidNextHop = 8,

    #[error("Optional attribute error")]
    OptionalAttribute = 9,

    #[error("Invalid network field")]
    InvalidNetworkField = 10,

    #[error("Malformed AS path")]
    MalformedAsPath = 11,
}

#[derive(Debug, Error)]
pub enum FsmSubcode {
    #[error("Received an unexpected message in OpenSent state")]
    UnexpectedOpenSent = 1,

    #[error("Received an unexpected message in OpenConfirm state")]
    UnexpectedOpenConfirm = 2,

    #[error("Received an unexpected message in Established state")]
    UnexpectedEstablished = 3,
}

#[derive(Debug, Error)]
pub enum CeaseSubcode {
    #[error("Maximum number of prefixes reached")]
    MaxPrefixes = 1,

    #[error("Administrative shutdown")]
    AdminShutdown = 2,

    #[error("Peer deconfigured")]
    PeerDeconf = 3,

    #[error("Administrative reset")]
    AdminReset = 4,

    #[error("Connection rejected")]
    ConnRejected = 5,

    #[error("Configuration change")]
    ConfChange = 6,

    #[error("Connection collision resolution")]
    ConnCollisionResolution = 7,

    #[error("Out of resources")]
    OutOfResources = 8,

    #[error("Hard reset")]
    HardReset = 9,

    #[error("BFD down")]
    BfdDown = 10,
}

#[derive(Debug, Error)]
pub enum RouteRefreshSubcode {
    #[error("Invalid message length")]
    InvalidLength = 1,
}