summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSunil Nimmagadda <sunil@nimmagadda.net>2024-11-21 22:47:08 +0530
committerSunil Nimmagadda <sunil@nimmagadda.net>2024-11-21 22:47:08 +0530
commitb98fd94fc691b8b9e14ead3cda7e536fca966e9d (patch)
tree8415a0ac928fe88867c83552d4cbb233e3b3df9d
parentdf5b92ed0b6ca519fb601ff453a288c00d37e0d3 (diff)
Implement to_bytes method.
-rw-r--r--src/vrrpv2.rs40
1 files changed, 38 insertions, 2 deletions
diff --git a/src/vrrpv2.rs b/src/vrrpv2.rs
index c3d5715..9a08801 100644
--- a/src/vrrpv2.rs
+++ b/src/vrrpv2.rs
@@ -1,5 +1,5 @@
-use std::io::Read;
use std::io::{self, Cursor};
+use std::io::{Read, Write};
use std::net::Ipv4Addr;
/// A VRRP version 2 packet.
@@ -64,7 +64,7 @@ impl From<std::io::Error> for VRRPv2Error {
}
}
-#[derive(Debug, PartialEq)]
+#[derive(Clone, Copy, Debug, PartialEq)]
pub enum VRRPv2AuthType {
VRRPv2AuthNoAuth = 0x00,
VRRPv2AuthReserved1 = 0x01,
@@ -97,6 +97,31 @@ impl<T: AsRef<[u8]>> BytesReader for Cursor<T> {
}
}
+impl VRRPv2 {
+ pub fn to_bytes(&self) -> Result<Vec<u8>, std::io::Error> {
+ let sz = (4 + self.count_ip_addrs) * 4;
+ let bytes: Vec<u8> = Vec::with_capacity(sz.into());
+ let mut wr = Cursor::new(bytes);
+ wr.write(
+ [
+ 0x21,
+ self.virtual_router_id,
+ self.priority,
+ self.count_ip_addrs,
+ ]
+ .as_ref(),
+ )?;
+ wr.write([self.auth_type as u8, self.advertisement_interval].as_ref())?;
+ wr.write(self.checksum.to_be_bytes().as_ref())?;
+ for ip in self.ip_addrs.iter() {
+ wr.write(&ip.to_bits().to_be_bytes())?;
+ }
+ wr.write([0; 4].as_ref())?; // Authentication Data 1
+ wr.write([0; 4].as_ref())?; // Authentication Data 2
+ Ok(wr.into_inner())
+ }
+}
+
fn parse(bytes: &[u8]) -> Result<VRRPv2, VRRPv2Error> {
let mut rdr = Cursor::new(bytes);
let vertype = rdr.read_u8()?;
@@ -246,3 +271,14 @@ fn test_checksum_another() {
let bytes = [0xe3, 0x4f, 0x23, 0x96, 0x44, 0x27, 0x99, 0xf3];
assert_eq!(checksum(&bytes), 0x1aff);
}
+
+#[test]
+fn test_to_bytes() {
+ let in_bytes = [
+ 0x21, 0x01, 0x64, 0x01, 0x00, 0x01, 0xba, 0x52, 0xc0, 0xa8, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00,
+ ];
+ let vrrpv2 = from_bytes(&in_bytes).expect("parsing failed");
+ let out_bytes = vrrpv2.to_bytes().expect("conversion failed");
+ assert_eq!(in_bytes.as_ref(), out_bytes);
+}