diff options
author | Sunil Nimmagadda <sunil@nimmagadda.net> | 2025-06-19 01:44:22 +0530 |
---|---|---|
committer | Sunil Nimmagadda <sunil@nimmagadda.net> | 2025-06-19 01:44:22 +0530 |
commit | 14474a33e06e9a3332d120d5ca8cc81eef50cea9 (patch) | |
tree | 3329cfaa476f13689167abfde7e3a33c257debc6 /src/main.rs | |
parent | 837f273d0b06c8ca202fa3d61ca475d50a0a96fb (diff) |
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/src/main.rs b/src/main.rs index 6f2b133..bda3c70 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,14 +1,28 @@ use socket2::{Domain, Protocol, Socket, Type}; +use std::io::{Error, ErrorKind}; use std::mem::MaybeUninit; use std::net::Ipv4Addr; +use vrrpd::vrrpv2; fn main() -> std::io::Result<()> { let sock = Socket::new(Domain::IPV4, Type::RAW, Some(Protocol::from(112)))?; - let _ = sock.join_multicast_v4( + sock.join_multicast_v4( &Ipv4Addr::new(224, 0, 0, 18), &Ipv4Addr::UNSPECIFIED, )?; - let mut buf = [MaybeUninit::<u8>::uninit(); 256]; - let _ = sock.recv_from(&mut buf)?; + let mut buf = [MaybeUninit::<u8>::uninit(); 512]; + let (nbytes, _) = sock.recv_from(&mut buf)?; + let bytes = unsafe { + std::slice::from_raw_parts(buf.as_ptr() as *const u8, nbytes) + }; + let ihl = bytes[0] & 0xF; + let data_offset = (ihl * 4) as usize; + let vrrp = vrrpv2::from_bytes(&bytes[data_offset..]).map_err(|err| { + Error::new( + ErrorKind::InvalidData, + format!("vrrpv2::from_bytes(): {err}"), + ) + })?; + eprintln!("vrrp: {vrrp:?}"); Ok(()) } |