From 4ba644827d68db6450ec5883223f43cb31ddac19 Mon Sep 17 00:00:00 2001 From: Rayhaan Jaufeerally Date: Sat, 18 Apr 2026 13:22:24 +0200 Subject: [PATCH] Error codes cleanup & typo fix --- crates/packet/src/errors.rs | 40 +++++++++++++++++++++++++++--------- crates/packet/src/message.rs | 9 ++------ 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/crates/packet/src/errors.rs b/crates/packet/src/errors.rs index 246e997..aea255e 100644 --- a/crates/packet/src/errors.rs +++ b/crates/packet/src/errors.rs @@ -2,6 +2,13 @@ use serde::{Deserialize, Serialize}; use strum::FromRepr; use thiserror::Error; +#[derive(Debug, Error)] +#[error("Unknown BGP error code {code} subcode {subcode}")] +pub struct UnknownErrorCode { + pub code: u8, + pub subcode: u8, +} + #[derive(Debug, Clone, PartialEq, Eq, Error, Serialize, Deserialize)] #[repr(u8)] pub enum BgpError { @@ -31,17 +38,30 @@ pub enum BgpError { } impl BgpError { - pub fn from_code_subcode(code: u8, subcode: u8) -> Result { + pub fn from_code_subcode(code: u8, subcode: u8) -> Result { + let err = || UnknownErrorCode { code, subcode }; match code { - 1 => Ok(Self::MsgHeader(MsgHeaderSubcode::try_from(subcode)?)), - 2 => Ok(Self::OpenMsg(OpenMsgSubcode::try_from(subcode)?)), - 3 => Ok(Self::UpdateMsg(UpdateMsgSubcode::try_from(subcode)?)), + 1 => Ok(Self::MsgHeader( + MsgHeaderSubcode::try_from(subcode).map_err(|_| err())?, + )), + 2 => Ok(Self::OpenMsg( + OpenMsgSubcode::try_from(subcode).map_err(|_| err())?, + )), + 3 => Ok(Self::UpdateMsg( + UpdateMsgSubcode::try_from(subcode).map_err(|_| err())?, + )), 4 => Ok(Self::HoldTimer), - 5 => Ok(Self::FsmError(FsmSubcode::try_from(subcode)?)), - 6 => Ok(Self::Cease(CeaseSubcode::try_from(subcode)?)), - 7 => Ok(Self::RouteRefresh(RouteRefreshSubcode::try_from(subcode)?)), + 5 => Ok(Self::FsmError( + FsmSubcode::try_from(subcode).map_err(|_| err())?, + )), + 6 => Ok(Self::Cease( + CeaseSubcode::try_from(subcode).map_err(|_| err())?, + )), + 7 => Ok(Self::RouteRefresh( + RouteRefreshSubcode::try_from(subcode).map_err(|_| err())?, + )), 8 => Ok(Self::SendHoldTimer), - _ => Err(()), + _ => Err(err()), } } @@ -69,7 +89,7 @@ pub enum MsgHeaderSubcode { BadMessageLength = 2, #[error("Bad message type")] - BadMessagType = 3, + BadMessageType = 3, } impl TryFrom for MsgHeaderSubcode { @@ -115,7 +135,7 @@ impl TryFrom for OpenMsgSubcode { #[repr(u8)] pub enum UpdateMsgSubcode { #[error("Malformed attribute list")] - MalforedAttrs = 1, + MalformedAttrs = 1, #[error("Unrecognized well known attribute")] UnrecognizedWellKnownAttr = 2, diff --git a/crates/packet/src/message.rs b/crates/packet/src/message.rs index 8e0bf93..d009cf5 100644 --- a/crates/packet/src/message.rs +++ b/crates/packet/src/message.rs @@ -1443,13 +1443,8 @@ impl NotificationMessage { let (buf, error_code) = be_u8(buf)?; let (buf, error_subcode) = be_u8(buf)?; - let error = BgpError::from_code_subcode(error_code, error_subcode).map_err(|_| { - Failure(BgpParserError::Eyre(eyre!( - "Unknown NOTIFICATION error code {} subcode {}", - error_code, - error_subcode - ))) - })?; + let error = BgpError::from_code_subcode(error_code, error_subcode) + .map_err(|e| Failure(BgpParserError::Eyre(e.into())))?; Ok((&[], Self { error, data: buf.to_vec() })) }