pantrace/formats/iris/
from_internal.rs1use 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 .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}