From f8d75727a33cb71f0a30191497878dfc94272b15 Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Tue, 12 Dec 2023 14:48:06 -0500 Subject: [PATCH] Add the missing as_ref() for IpAddr --- src/memory.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/memory.rs b/src/memory.rs index 4344b90..60d7bfd 100644 --- a/src/memory.rs +++ b/src/memory.rs @@ -12,6 +12,7 @@ #[allow(unused_imports)] use std::mem::{needs_drop, size_of, MaybeUninit}; +use std::net::{IpAddr, Ipv4Addr, Ipv6Addr}; #[allow(unused_imports)] use std::ptr::copy_nonoverlapping; @@ -78,3 +79,14 @@ pub fn cast_to_struct(b: &[u8]) -> &T { assert!(!std::mem::needs_drop::()); unsafe { &*b.as_ptr().cast() } } + +/// The missing get-ip-octets-as-reference function for IpAddr +#[inline(always)] +pub fn ip_octets_ref(sa: &IpAddr) -> &[u8] { + assert_eq!(size_of::(), 4); + assert_eq!(size_of::(), 16); + match sa { + IpAddr::V4(ip4) => unsafe { &*(ip4 as *const Ipv4Addr).cast::<[u8; 4]>() }, + IpAddr::V6(ip6) => unsafe { &*(ip6 as *const Ipv6Addr).cast::<[u8; 16]>() }, + } +}