1use std::net::IpAddr;
2
3use serde::{Serialize, Deserialize};
4use uuid::Uuid;
5
6use crate::flow_table::Flow;
7use crate::stream::{SegmentInfo, SegmentType};
8
9#[derive(Clone, Serialize, Deserialize)]
11#[serde(untagged)]
12pub enum PacketExtra {
13 None,
14 LegacyPcap {
15 index: u64,
17 ts_sec: u32,
19 ts_usec: u32,
21 },
22}
23
24#[derive(Serialize, Deserialize)]
25pub struct ConnInfo {
26 pub id: Uuid,
27 pub src_addr: IpAddr,
28 pub src_port: u16,
29 pub dst_addr: IpAddr,
30 pub dst_port: u16,
31}
32
33impl ConnInfo {
34 pub fn new(uuid: Uuid, flow: &Flow) -> Self {
35 ConnInfo {
36 id: uuid,
37 src_addr: flow.src_addr,
38 src_port: flow.src_port,
39 dst_addr: flow.dst_addr,
40 dst_port: flow.dst_port,
41 }
42 }
43}
44
45#[derive(Serialize, Deserialize)]
46#[serde(tag = "type")]
47pub enum SerializedSegment {
48 #[serde(rename = "data")]
49 Data {
50 offset: u64,
51 len: usize,
52 is_retransmit: bool,
53 reverse_acked: u64,
54 #[serde(flatten)]
55 extra: PacketExtra,
56 },
57 #[serde(rename = "ack")]
58 Ack {
59 offset: u64,
60 window: usize,
61 reverse_acked: u64,
62 #[serde(flatten)]
63 extra: PacketExtra,
64 },
65 #[serde(rename = "fin")]
66 Fin {
67 offset: u64,
68 reverse_acked: u64,
69 #[serde(flatten)]
70 extra: PacketExtra,
71 },
72 #[serde(rename = "rst")]
73 Rst {
74 offset: u64,
75 reverse_acked: u64,
76 #[serde(flatten)]
77 extra: PacketExtra,
78 },
79 #[serde(rename = "gap")]
80 Gap { offset: u64, len: u64 },
81}
82
83impl SerializedSegment {
84 pub fn new_gap(offset: u64, len: u64) -> Self {
85 Self::Gap { offset, len }
86 }
87}
88
89impl From<&SegmentInfo> for SerializedSegment {
90 fn from(info: &SegmentInfo) -> Self {
91 match info.data {
92 SegmentType::Data { len, is_retransmit } => Self::Data {
93 offset: info.offset,
94 len,
95 is_retransmit,
96 reverse_acked: info.reverse_acked,
97 extra: info.extra.clone(),
98 },
99 SegmentType::Ack { window } => Self::Ack {
100 offset: info.offset,
101 window,
102 reverse_acked: info.reverse_acked,
103 extra: info.extra.clone(),
104 },
105 SegmentType::Fin { end_offset } => Self::Fin {
106 offset: end_offset,
107 reverse_acked: info.reverse_acked,
108 extra: info.extra.clone(),
109 },
110 SegmentType::Rst => Self::Rst {
111 offset: info.offset,
112 reverse_acked: info.reverse_acked,
113 extra: info.extra.clone(),
114 },
115 }
116 }
117}