falco_event/types/net/
ipv6addr.rs

1use crate::fields::FromBytes;
2use crate::fields::{FromBytesError, ToBytes};
3use std::io::{Read, Write};
4use std::net::Ipv6Addr;
5
6impl FromBytes<'_> for Ipv6Addr {
7    #[inline]
8    fn from_bytes(buf: &mut &[u8]) -> Result<Self, FromBytesError> {
9        if buf.len() < 16 {
10            return Err(FromBytesError::InvalidLength);
11        }
12
13        let mut out = [0u8; 16];
14        buf.read_exact(&mut out)?;
15        Ok(out.into())
16    }
17}
18
19impl ToBytes for Ipv6Addr {
20    #[inline]
21    fn binary_size(&self) -> usize {
22        16
23    }
24
25    #[inline]
26    fn write<W: Write>(&self, mut writer: W) -> std::io::Result<()> {
27        writer.write_all(self.octets().as_slice())?;
28        Ok(())
29    }
30
31    #[inline]
32    fn default_repr() -> impl ToBytes {
33        Ipv6Addr::from(0)
34    }
35}
36
37#[cfg(test)]
38mod tests {
39    use std::str::FromStr;
40
41    use super::*;
42
43    #[test]
44    fn test_ipv6_addr() {
45        let ip = Ipv6Addr::from_str("2001:4860:4860::8844").unwrap();
46
47        let mut binary = Vec::new();
48        ip.write(&mut binary).unwrap();
49        assert_eq!(
50            binary.as_slice(),
51            b"\x20\x01\x48\x60\x48\x60\0\0\0\0\0\0\0\0\x88\x44".as_slice()
52        );
53
54        let mut buf = binary.as_slice();
55        let ip2 = Ipv6Addr::from_bytes(&mut buf).unwrap();
56        assert_eq!(ip, ip2);
57    }
58}