From 14474a33e06e9a3332d120d5ca8cc81eef50cea9 Mon Sep 17 00:00:00 2001
From: Sunil Nimmagadda <sunil@nimmagadda.net>
Date: Thu, 19 Jun 2025 01:44:22 +0530
Subject: Read a vrrpv2 packet from the network.

---
 src/main.rs | 20 +++++++++++++++++---
 1 file 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(())
 }
-- 
cgit v1.2.3