pantrace/formats/iris/
from_internal.rs

1use crate::formats::internal::{MplsEntry, Traceroute, TracerouteHop};
2use crate::formats::iris::{IrisFlow, IrisMplsEntry, IrisReply, IrisTraceroute};
3
4impl From<&Traceroute> for IrisTraceroute {
5    fn from(traceroute: &Traceroute) -> Self {
6        IrisTraceroute {
7            measurement_uuid: traceroute.measurement_id.clone(),
8            agent_uuid: traceroute.agent_id.clone(),
9            traceroute_start: traceroute.start_time,
10            traceroute_end: traceroute.end_time,
11            probe_protocol: traceroute.protocol as u8,
12            probe_src_addr: traceroute.src_addr,
13            probe_dst_addr: traceroute.dst_addr,
14            flows: traceroute
15                .flows
16                .iter()
17                .map(|flow| IrisFlow {
18                    probe_src_port: flow.src_port,
19                    probe_dst_port: flow.dst_port,
20                    replies: flow.hops.iter().flat_map(<Vec<IrisReply>>::from).collect(),
21                })
22                .collect(),
23        }
24    }
25}
26
27impl From<&TracerouteHop> for Vec<IrisReply> {
28    fn from(hop: &TracerouteHop) -> Self {
29        hop.probes
30            .iter()
31            // Iris does not store probes without replies
32            .filter(|probe| probe.reply.is_some())
33            .map(|probe| {
34                let reply = probe.reply.as_ref().unwrap();
35                IrisReply(
36                    reply.timestamp,
37                    hop.ttl,
38                    reply.quoted_ttl,
39                    reply.icmp_type,
40                    reply.icmp_code,
41                    reply.ttl,
42                    reply.size,
43                    reply.mpls_labels.iter().map(|entry| entry.into()).collect(),
44                    reply.addr,
45                    (reply.rtt * 10.0) as u16,
46                )
47            })
48            .collect()
49    }
50}
51
52impl From<&MplsEntry> for IrisMplsEntry {
53    fn from(entry: &MplsEntry) -> Self {
54        IrisMplsEntry(entry.label, entry.exp, entry.bottom_of_stack, entry.ttl)
55    }
56}