flowparser_sflow/flow_records/
extended_proxy_socket_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 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}