Skip to main content

flowparser_sflow/flow_records/
sampled_ipv6.rs

1use 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}