diff --git a/holo-bgp/src/packet/message.rs b/holo-bgp/src/packet/message.rs index b108d98e..2955d694 100644 --- a/holo-bgp/src/packet/message.rs +++ b/holo-bgp/src/packet/message.rs @@ -994,9 +994,9 @@ pub(crate) fn decode_ipv4_prefix( } // Parse prefix address (variable length). - let mut prefix_bytes = vec![0; plen_wire]; - buf.copy_to_slice(&mut prefix_bytes); - let prefix = Ipv4Addr::from_slice(&prefix_bytes); + let mut prefix_bytes = [0; Ipv4Addr::LENGTH]; + buf.copy_to_slice(&mut prefix_bytes[..plen_wire]); + let prefix = Ipv4Addr::from(prefix_bytes); let prefix = Ipv4Network::new(prefix, plen) .map(|prefix| prefix.apply_mask()) .map_err(|_| UpdateMessageError::InvalidNetworkField)?; @@ -1023,9 +1023,9 @@ pub(crate) fn decode_ipv6_prefix( } // Parse prefix address (variable length). - let mut prefix_bytes = vec![0; plen_wire]; - buf.copy_to_slice(&mut prefix_bytes); - let prefix = Ipv6Addr::from_slice(&prefix_bytes); + let mut prefix_bytes = [0; Ipv6Addr::LENGTH]; + buf.copy_to_slice(&mut prefix_bytes[..plen_wire]); + let prefix = Ipv6Addr::from(prefix_bytes); let prefix = Ipv6Network::new(prefix, plen) .map(|prefix| prefix.apply_mask()) .map_err(|_| UpdateMessageError::InvalidNetworkField)?; diff --git a/holo-ldp/src/packet/messages/label.rs b/holo-ldp/src/packet/messages/label.rs index fdfde2be..5f70e27a 100644 --- a/holo-ldp/src/packet/messages/label.rs +++ b/holo-ldp/src/packet/messages/label.rs @@ -4,11 +4,12 @@ // SPDX-License-Identifier: MIT // -use std::net::IpAddr; +use std::net::{Ipv4Addr, Ipv6Addr}; use bytes::{Buf, BufMut, Bytes, BytesMut}; use holo_utils::ip::{ - AddressFamily, IpAddrExt, IpNetworkExt, Ipv4NetworkExt, Ipv6NetworkExt, + AddressFamily, IpAddrExt, IpNetworkExt, Ipv4AddrExt, Ipv4NetworkExt, + Ipv6AddrExt, Ipv6NetworkExt, }; use holo_utils::mpls::Label; use ipnetwork::{IpNetwork, Ipv4Network, Ipv6Network}; @@ -478,10 +479,19 @@ impl FecElem { } // Parse prefix. - let mut prefix_bytes = vec![0; plen_wire]; - buf.copy_to_slice(&mut prefix_bytes); + let prefix = match af { + AddressFamily::Ipv4 => { + let mut prefix_bytes = [0; Ipv4Addr::LENGTH]; + buf.copy_to_slice(&mut prefix_bytes[..plen_wire]); + Ipv4Addr::from(prefix_bytes).into() + } + AddressFamily::Ipv6 => { + let mut prefix_bytes = [0; Ipv6Addr::LENGTH]; + buf.copy_to_slice(&mut prefix_bytes[..plen_wire]); + Ipv6Addr::from(prefix_bytes).into() + } + }; *tlv_rlen -= plen_wire as u16; - let prefix = IpAddr::from_slice(af, &prefix_bytes); IpNetwork::new(prefix, plen) .map(|prefix| FecElem::Prefix(prefix.apply_mask())) .map_err(|_| DecodeError::InvalidTlvValue(tlvi.clone())) diff --git a/holo-ospf/src/ospfv3/packet/lsa.rs b/holo-ospf/src/ospfv3/packet/lsa.rs index d12498bb..0d780f9c 100644 --- a/holo-ospf/src/ospfv3/packet/lsa.rs +++ b/holo-ospf/src/ospfv3/packet/lsa.rs @@ -12,7 +12,7 @@ use bytes::{Buf, BufMut, Bytes, BytesMut}; use derive_new::new; use enum_as_inner::EnumAsInner; use holo_utils::bytes::{BytesExt, BytesMutExt}; -use holo_utils::ip::{AddressFamily, IpAddrExt}; +use holo_utils::ip::{AddressFamily, IpAddrExt, Ipv4AddrExt, Ipv6AddrExt}; use holo_utils::mpls::Label; use holo_utils::sr::{IgpAlgoType, Sid}; use ipnetwork::IpNetwork; @@ -2891,9 +2891,18 @@ fn decode_prefix( buf: &mut Bytes, ) -> DecodeResult { let plen_wire = prefix_wire_len(plen); - let mut prefix_bytes = vec![0; plen_wire]; - buf.copy_to_slice(&mut prefix_bytes); - let prefix = IpAddr::from_slice(af, &prefix_bytes); + let prefix = match af { + AddressFamily::Ipv4 => { + let mut prefix_bytes = [0; Ipv4Addr::LENGTH]; + buf.copy_to_slice(&mut prefix_bytes[..plen_wire]); + Ipv4Addr::from(prefix_bytes).into() + } + AddressFamily::Ipv6 => { + let mut prefix_bytes = [0; Ipv6Addr::LENGTH]; + buf.copy_to_slice(&mut prefix_bytes[..plen_wire]); + Ipv6Addr::from(prefix_bytes).into() + } + }; IpNetwork::new(prefix, plen).map_err(|_| DecodeError::InvalidIpPrefix) } diff --git a/holo-utils/src/ip.rs b/holo-utils/src/ip.rs index 70d8f29b..5c6c5309 100644 --- a/holo-utils/src/ip.rs +++ b/holo-utils/src/ip.rs @@ -34,9 +34,6 @@ pub trait IpAddrExt { // Returns vector of bytes that make up this address. fn bytes(&self) -> Vec; - // Creates an IpAddr from a slice of bytes. - fn from_slice(af: AddressFamily, bytes: &[u8]) -> IpAddr; - // Returns true if this is an usable address. fn is_usable(&self) -> bool; @@ -48,9 +45,6 @@ pub trait IpAddrExt { pub trait Ipv4AddrExt { const LENGTH: usize; - // Creates an Ipv4Addr from a slice of bytes. - fn from_slice(bytes: &[u8]) -> Ipv4Addr; - // Returns true if this is an usable address. fn is_usable(&self) -> bool; } @@ -59,9 +53,6 @@ pub trait Ipv4AddrExt { pub trait Ipv6AddrExt { const LENGTH: usize; - // Creates an Ip6Addr from a slice of bytes. - fn from_slice(bytes: &[u8]) -> Ipv6Addr; - // Returns true if this is an usable address. fn is_usable(&self) -> bool; } @@ -242,13 +233,6 @@ impl IpAddrExt for IpAddr { } } - fn from_slice(af: AddressFamily, bytes: &[u8]) -> IpAddr { - match af { - AddressFamily::Ipv4 => Ipv4Addr::from_slice(bytes).into(), - AddressFamily::Ipv6 => Ipv6Addr::from_slice(bytes).into(), - } - } - fn is_usable(&self) -> bool { !(self.is_loopback() || self.is_multicast() || self.is_unspecified()) } @@ -283,13 +267,6 @@ impl IpAddrKind for IpAddr { impl Ipv4AddrExt for Ipv4Addr { const LENGTH: usize = 4; - fn from_slice(bytes: &[u8]) -> Ipv4Addr { - let mut bytes = bytes.to_vec(); - bytes.resize(4, 0); - let bytes: [u8; 4] = bytes[..].try_into().unwrap(); - Ipv4Addr::from(bytes) - } - fn is_usable(&self) -> bool { !(self.is_loopback() || self.is_broadcast() @@ -320,13 +297,6 @@ impl IpAddrKind for Ipv4Addr { impl Ipv6AddrExt for Ipv6Addr { const LENGTH: usize = 16; - fn from_slice(bytes: &[u8]) -> Ipv6Addr { - let mut bytes = bytes.to_vec(); - bytes.resize(16, 0); - let bytes: [u8; 16] = bytes[..].try_into().unwrap(); - Ipv6Addr::from(bytes) - } - fn is_usable(&self) -> bool { !(self.is_loopback() || self.is_multicast() || self.is_unspecified()) }