author | Sunil Nimmagadda <sunil@nimmagadda.net> |
Tue, 03 Jan 2023 20:35:05 +0530 | |
changeset 10 | aef7eb135a0c |
parent 8 | e4cad4eba60b |
child 11 | 0d19b7de6f5d |
permissions | -rw-r--r-- |
8
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
1 |
use nom::bits::{bits, streaming::take}; |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
2 |
use nom::combinator::map_res; |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
3 |
use nom::error::{Error, ErrorKind}; |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
4 |
use nom::multi::count; |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
5 |
use nom::number::complete::{be_u16, be_u32, u8}; |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
6 |
use nom::sequence::tuple; |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
7 |
use nom::{Err, IResult}; |
7
e3058ceb81cc
Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff
changeset
|
8 |
use std::net::Ipv4Addr; |
e3058ceb81cc
Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff
changeset
|
9 |
|
8
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
10 |
const VRRP_REQUIRED_VERSION: u8 = 2; |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
11 |
const VRRP_REQUIRED_TYPE: u8 = 1; // Advertisement |
7
e3058ceb81cc
Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff
changeset
|
12 |
|
8
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
13 |
#[derive(Debug, Clone, PartialEq)] |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
14 |
pub enum VRRPv2Error { |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
15 |
VRRPv2ParseError, |
7
e3058ceb81cc
Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff
changeset
|
16 |
} |
e3058ceb81cc
Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff
changeset
|
17 |
|
8
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
18 |
type NomError<'a> = nom::Err<nom::error::Error<&'a [u8]>>; |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
19 |
impl From<NomError<'_>> for VRRPv2Error { |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
20 |
fn from(_: NomError) -> Self { |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
21 |
Self::VRRPv2ParseError |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
22 |
} |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
23 |
} |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
24 |
|
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
25 |
#[derive(Debug, PartialEq)] |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
26 |
pub enum VRRPVersion { |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
27 |
V2, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
28 |
} |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
29 |
|
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
30 |
#[derive(Debug, PartialEq)] |
7
e3058ceb81cc
Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff
changeset
|
31 |
pub enum VRRPv2Type { |
e3058ceb81cc
Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff
changeset
|
32 |
VRRPv2Advertisement, |
e3058ceb81cc
Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff
changeset
|
33 |
} |
e3058ceb81cc
Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff
changeset
|
34 |
|
8
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
35 |
#[derive(Debug, PartialEq)] |
7
e3058ceb81cc
Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff
changeset
|
36 |
pub enum VRRPv2AuthType { |
e3058ceb81cc
Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff
changeset
|
37 |
VRRPv2AuthNoAuth = 0x00, |
e3058ceb81cc
Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff
changeset
|
38 |
VRRPv2AuthReserved1 = 0x01, |
e3058ceb81cc
Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff
changeset
|
39 |
VRRPv2AuthReserved2 = 0x02, |
e3058ceb81cc
Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff
changeset
|
40 |
} |
e3058ceb81cc
Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff
changeset
|
41 |
|
8
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
42 |
#[derive(Debug, PartialEq)] |
7
e3058ceb81cc
Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff
changeset
|
43 |
pub struct VRRPv2 { |
e3058ceb81cc
Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff
changeset
|
44 |
pub version: VRRPVersion, |
e3058ceb81cc
Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff
changeset
|
45 |
pub type_: VRRPv2Type, |
e3058ceb81cc
Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff
changeset
|
46 |
pub virtual_router_id: u8, |
e3058ceb81cc
Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff
changeset
|
47 |
pub priority: u8, |
e3058ceb81cc
Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff
changeset
|
48 |
pub count_ip_addrs: u8, |
e3058ceb81cc
Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff
changeset
|
49 |
pub auth_type: VRRPv2AuthType, |
e3058ceb81cc
Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff
changeset
|
50 |
pub advertisement_interval: u8, |
e3058ceb81cc
Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff
changeset
|
51 |
pub checksum: u16, |
e3058ceb81cc
Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff
changeset
|
52 |
pub ip_addrs: Vec<Ipv4Addr>, |
e3058ceb81cc
Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff
changeset
|
53 |
} |
e3058ceb81cc
Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff
changeset
|
54 |
|
8
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
55 |
fn two_nibbles(input: &[u8]) -> IResult<&[u8], (u8, u8)> { |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
56 |
bits::<_, _, Error<(&[u8], usize)>, _, _>(tuple((take(4usize), take(4usize))))(input) |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
57 |
} |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
58 |
|
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
59 |
fn parse_version_type(input: &[u8]) -> IResult<&[u8], (VRRPVersion, VRRPv2Type)> { |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
60 |
let (input, pair) = two_nibbles(input)?; |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
61 |
match pair { |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
62 |
(VRRP_REQUIRED_VERSION, VRRP_REQUIRED_TYPE) => { |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
63 |
Ok((input, (VRRPVersion::V2, VRRPv2Type::VRRPv2Advertisement))) |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
64 |
} |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
65 |
_ => Err(Err::Error(Error::new(input, ErrorKind::Alt))), |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
66 |
} |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
67 |
} |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
68 |
|
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
69 |
fn parse_auth_type(input: &[u8]) -> IResult<&[u8], VRRPv2AuthType> { |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
70 |
map_res(u8, |auth_type| { |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
71 |
Ok(match auth_type { |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
72 |
0 => VRRPv2AuthType::VRRPv2AuthNoAuth, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
73 |
1 => VRRPv2AuthType::VRRPv2AuthReserved1, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
74 |
2 => VRRPv2AuthType::VRRPv2AuthReserved2, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
75 |
_ => return Err(Err::Error(Error::new(input, ErrorKind::Alt))), |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
76 |
}) |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
77 |
})(input) |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
78 |
} |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
79 |
|
10 | 80 |
fn validate_checksum(bytes: &[u8]) -> bool { |
81 |
let mut sum: u32 = bytes.chunks(2).fold(0, |acc: u32, x| { |
|
82 |
acc + u32::from(u16::from_ne_bytes(x.try_into().unwrap())) |
|
83 |
}); |
|
84 |
while (sum >> 16) > 0 { |
|
85 |
sum = (sum & 0xffff) + (sum >> 16); |
|
86 |
} |
|
87 |
let checksum = !(sum as u16); |
|
88 |
checksum == 0 |
|
89 |
} |
|
90 |
||
8
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
91 |
fn parse(input: &[u8]) -> IResult<&[u8], VRRPv2> { |
10 | 92 |
if !validate_checksum(input) { |
93 |
return Err(Err::Error(Error::new(input, ErrorKind::Alt))); |
|
94 |
} |
|
8
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
95 |
let (input, (version, type_)) = parse_version_type(input)?; |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
96 |
let (input, virtual_router_id) = u8(input)?; |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
97 |
let (input, priority) = u8(input)?; |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
98 |
let (input, count_ip_addrs) = u8(input)?; |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
99 |
let (input, auth_type) = parse_auth_type(input)?; |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
100 |
let (input, advertisement_interval) = u8(input)?; |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
101 |
let (input, checksum) = be_u16(input)?; |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
102 |
let (input, xs) = count(be_u32, usize::from(count_ip_addrs))(input)?; |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
103 |
let ip_addrs = xs.into_iter().map(Ipv4Addr::from).collect(); |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
104 |
Ok(( |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
105 |
input, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
106 |
VRRPv2 { |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
107 |
version, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
108 |
type_, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
109 |
virtual_router_id, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
110 |
priority, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
111 |
count_ip_addrs, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
112 |
auth_type, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
113 |
advertisement_interval, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
114 |
checksum, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
115 |
ip_addrs, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
116 |
}, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
117 |
)) |
7
e3058ceb81cc
Module to parse(unimplemented) VRRPv2 packet.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff
changeset
|
118 |
} |
8
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
119 |
|
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
120 |
pub fn from_bytes(bytes: &[u8]) -> Result<VRRPv2, VRRPv2Error> { |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
121 |
match parse(bytes) { |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
122 |
Ok((_, v)) => Ok(v), |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
123 |
Err(e) => Err(e.into()), |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
124 |
} |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
125 |
} |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
126 |
|
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
127 |
#[test] |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
128 |
fn test_standard_bytes() { |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
129 |
let bytes = [ |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
130 |
0x21, 0x01, 0x64, 0x01, 0x00, 0x01, 0xba, 0x52, 0xc0, 0xa8, 0x00, 0x01, 0x00, 0x00, 0x00, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
131 |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
132 |
]; |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
133 |
let got = from_bytes(&bytes).unwrap(); |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
134 |
let expected = VRRPv2 { |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
135 |
version: VRRPVersion::V2, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
136 |
type_: VRRPv2Type::VRRPv2Advertisement, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
137 |
virtual_router_id: 1, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
138 |
priority: 100, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
139 |
count_ip_addrs: 1, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
140 |
auth_type: VRRPv2AuthType::VRRPv2AuthNoAuth, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
141 |
checksum: 47698, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
142 |
advertisement_interval: 1, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
143 |
ip_addrs: vec![Ipv4Addr::from([192, 168, 0, 1])], |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
144 |
}; |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
145 |
assert_eq!(got, expected); |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
146 |
} |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
147 |
|
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
148 |
#[test] |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
149 |
fn test_incomplete_bytes() { |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
150 |
let bytes = [0x21, 0x01]; |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
151 |
let got = from_bytes(&bytes); |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
152 |
assert_eq!(got.is_err(), true); |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
153 |
assert_eq!(got.err(), Some(VRRPv2Error::VRRPv2ParseError)); |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
154 |
} |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
155 |
|
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
156 |
#[test] |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
157 |
fn test_invalid_version_type() { |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
158 |
let bytes = [ |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
159 |
0x00, 0x01, 0x64, 0x01, 0x00, 0x01, 0xba, 0x52, 0xc0, 0xa8, 0x00, 0x01, 0x00, 0x00, 0x00, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
160 |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
161 |
]; |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
162 |
let got = from_bytes(&bytes); |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
163 |
assert_eq!(got.is_err(), true); |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
164 |
assert_eq!(got.err(), Some(VRRPv2Error::VRRPv2ParseError)); |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
165 |
} |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
166 |
|
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
167 |
#[test] |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
168 |
fn test_invalid_auth_type() { |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
169 |
let bytes = [ |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
170 |
0x21, 0x01, 0x64, 0x01, 0x03, 0x01, 0xba, 0x52, 0xc0, 0xa8, 0x00, 0x01, 0x00, 0x00, 0x00, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
171 |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
172 |
]; |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
173 |
let got = from_bytes(&bytes); |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
174 |
assert_eq!(got.is_err(), true); |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
175 |
assert_eq!(got.err(), Some(VRRPv2Error::VRRPv2ParseError)); |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
176 |
} |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
177 |
|
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
178 |
#[test] |
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
179 |
fn test_invalid_checksum() { |
10 | 180 |
let bytes = [ |
181 |
0x21, 0x01, 0x64, 0x01, 0x00, 0x01, 0xbb, 0x52, 0xc0, 0xa8, 0x00, 0x01, 0x00, 0x00, 0x00, |
|
182 |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
|
183 |
]; |
|
184 |
let got = from_bytes(&bytes); |
|
185 |
assert_eq!(got.is_err(), true); |
|
186 |
assert_eq!(got.err(), Some(VRRPv2Error::VRRPv2ParseError)); |
|
8
e4cad4eba60b
Implement a VRRPv2 packet parser.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
7
diff
changeset
|
187 |
} |