summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs20
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(())
}