Skip to main content

flowparser_sflow/flow_records/
extended_proxy_socket_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 ExtendedProxySocketIpv6 {
8    pub protocol: u32,
9    pub local_ip: Ipv6Addr,
10    pub remote_ip: Ipv6Addr,
11    pub local_port: u32,
12    pub remote_port: u32,
13}
14
15fn parse_ipv6(input: &[u8]) -> IResult<&[u8], Ipv6Addr> {
16    let (input, hi) = be_u64(input)?;
17    let (input, lo) = be_u64(input)?;
18    let mut octets = [0u8; 16];
19    octets[..8].copy_from_slice(&hi.to_be_bytes());
20    octets[8..].copy_from_slice(&lo.to_be_bytes());
21    Ok((input, Ipv6Addr::from(octets)))
22}
23
24pub(crate) fn parse_extended_proxy_socket_ipv6(
25    input: &[u8],
26) -> IResult<&[u8], ExtendedProxySocketIpv6> {
27    let (input, protocol) = be_u32(input)?;
28    let (input, local_ip) = parse_ipv6(input)?;
29    let (input, remote_ip) = parse_ipv6(input)?;
30    let (input, local_port) = be_u32(input)?;
31    let (input, remote_port) = be_u32(input)?;
32
33    Ok((
34        input,
35        ExtendedProxySocketIpv6 {
36            protocol,
37            local_ip,
38            remote_ip,
39            local_port,
40            remote_port,
41        },
42    ))
43}