Skip to content

Commit

Permalink
Merge pull request #996 from thvdveld/hbh-failure-type
Browse files Browse the repository at this point in the history
fix: enter unreachable when discarding HBH Option with multicast destination address
  • Loading branch information
Dirbaio authored Sep 27, 2024
2 parents a2b92ed + 32f81a7 commit c114acd
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 19 deletions.
11 changes: 6 additions & 5 deletions src/iface/interface/ipv6.rs
Original file line number Diff line number Diff line change
Expand Up @@ -288,12 +288,13 @@ impl InterfaceInner {
Ipv6OptionFailureType::DiscardSendAll => {
return HopByHopResponse::Discard(param_problem());
}
Ipv6OptionFailureType::DiscardSendUnicast
if !ipv6_repr.dst_addr.is_multicast() =>
{
return HopByHopResponse::Discard(param_problem());
Ipv6OptionFailureType::DiscardSendUnicast => {
if !ipv6_repr.dst_addr.is_multicast() {
return HopByHopResponse::Discard(param_problem());
} else {
return HopByHopResponse::Discard(None);
}
}
_ => unreachable!(),
}
}
}
Expand Down
50 changes: 36 additions & 14 deletions src/wire/ipv6option.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,19 +51,42 @@ impl RouterAlert {
pub const DATA_LEN: u8 = 2;
}

enum_with_unknown! {
/// Action required when parsing the given IPv6 Extension
/// Header Option Type fails
pub enum FailureType(u8) {
/// Skip this option and continue processing the packet
Skip = 0b00000000,
/// Discard the containing packet
Discard = 0b01000000,
/// Discard the containing packet and notify the sender
DiscardSendAll = 0b10000000,
/// Discard the containing packet and only notify the sender
/// if the sender is a unicast address
DiscardSendUnicast = 0b11000000,
/// Action required when parsing the given IPv6 Extension
/// Header Option Type fails
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum FailureType {
/// Skip this option and continue processing the packet
Skip = 0b00000000,
/// Discard the containing packet
Discard = 0b01000000,
/// Discard the containing packet and notify the sender
DiscardSendAll = 0b10000000,
/// Discard the containing packet and only notify the sender
/// if the sender is a unicast address
DiscardSendUnicast = 0b11000000,
}

impl From<u8> for FailureType {
fn from(value: u8) -> FailureType {
match value & 0b11000000 {
0b00000000 => FailureType::Skip,
0b01000000 => FailureType::Discard,
0b10000000 => FailureType::DiscardSendAll,
0b11000000 => FailureType::DiscardSendUnicast,
_ => unreachable!(),
}
}
}

impl From<FailureType> for u8 {
fn from(value: FailureType) -> Self {
match value {
FailureType::Skip => 0b00000000,
FailureType::Discard => 0b01000000,
FailureType::DiscardSendAll => 0b10000000,
FailureType::DiscardSendUnicast => 0b11000000,
}
}
}

Expand All @@ -74,7 +97,6 @@ impl fmt::Display for FailureType {
FailureType::Discard => write!(f, "discard"),
FailureType::DiscardSendAll => write!(f, "discard and send error"),
FailureType::DiscardSendUnicast => write!(f, "discard and send error if unicast"),
FailureType::Unknown(id) => write!(f, "Unknown({id})"),
}
}
}
Expand Down

0 comments on commit c114acd

Please sign in to comment.