parse_tcp/
serialized.rs

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/// extra information that may be associated with the packet
10#[derive(Clone, Serialize, Deserialize)]
11#[serde(untagged)]
12pub enum PacketExtra {
13    None,
14    LegacyPcap {
15        /// packet number
16        index: u64,
17        /// timestamp (seconds)
18        ts_sec: u32,
19        /// timestamp (microseconds)
20        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}