flowparser_sflow/flow_records/
extended_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 ExtendedSocketIpv6 {
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_socket_ipv6(input: &[u8]) -> IResult<&[u8], ExtendedSocketIpv6> {
25 let (input, protocol) = be_u32(input)?;
26 let (input, local_ip) = parse_ipv6(input)?;
27 let (input, remote_ip) = parse_ipv6(input)?;
28 let (input, local_port) = be_u32(input)?;
29 let (input, remote_port) = be_u32(input)?;
30
31 Ok((
32 input,
33 ExtendedSocketIpv6 {
34 protocol,
35 local_ip,
36 remote_ip,
37 local_port,
38 remote_port,
39 },
40 ))
41}