falco_event/types/net/
ipv6addr.rs1use 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}