flowparser_sflow/flow_records/
sampled_ipv6.rs1use nom::IResult;
2use nom::number::complete::{be_u32, be_u64};
3use serde::{Deserialize, Serialize};
4use std::net::Ipv6Addr;
5
6#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
7pub struct SampledIpv6 {
8 pub length: u32,
9 pub protocol: u32,
10 pub src_ip: Ipv6Addr,
11 pub dst_ip: Ipv6Addr,
12 pub src_port: u32,
13 pub dst_port: u32,
14 pub tcp_flags: u32,
15 pub priority: u32,
16}
17
18fn parse_ipv6(input: &[u8]) -> IResult<&[u8], Ipv6Addr> {
19 let (input, hi) = be_u64(input)?;
20 let (input, lo) = be_u64(input)?;
21 let mut octets = [0u8; 16];
22 octets[..8].copy_from_slice(&hi.to_be_bytes());
23 octets[8..].copy_from_slice(&lo.to_be_bytes());
24 Ok((input, Ipv6Addr::from(octets)))
25}
26
27pub(crate) fn parse_sampled_ipv6(input: &[u8]) -> IResult<&[u8], SampledIpv6> {
28 let (input, length) = be_u32(input)?;
29 let (input, protocol) = be_u32(input)?;
30 let (input, src_ip) = parse_ipv6(input)?;
31 let (input, dst_ip) = parse_ipv6(input)?;
32 let (input, src_port) = be_u32(input)?;
33 let (input, dst_port) = be_u32(input)?;
34 let (input, tcp_flags) = be_u32(input)?;
35 let (input, priority) = be_u32(input)?;
36
37 Ok((
38 input,
39 SampledIpv6 {
40 length,
41 protocol,
42 src_ip,
43 dst_ip,
44 src_port,
45 dst_port,
46 tcp_flags,
47 priority,
48 },
49 ))
50}