1use std::{
2 fmt,
3 net::{IpAddr, Ipv4Addr},
4};
5
6use serde::Serialize;
7
8use crate::three_tuple::ThreeTuple;
9
10#[derive(Clone, Debug, Eq, PartialEq, Hash, Ord, PartialOrd, Serialize)]
12pub struct FiveTuple {
13 pub proto: u8,
15 pub src: IpAddr,
17 pub dst: IpAddr,
19 pub src_port: u16,
21 pub dst_port: u16,
23}
24
25impl fmt::Display for FiveTuple {
26 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
27 write!(
28 f,
29 "{}:{} -> {}:{} [{}]",
30 self.src, self.src_port, self.dst, self.dst_port, self.proto
31 )
32 }
33}
34
35pub trait ToFiveTuple {
37 fn get_five_tuple(&self) -> FiveTuple;
39}
40
41impl FiveTuple {
42 pub fn from_three_tuple(t3: &ThreeTuple, src_port: u16, dst_port: u16) -> Self {
44 FiveTuple {
45 proto: t3.l4_proto,
46 src: t3.src,
47 dst: t3.dst,
48 src_port,
49 dst_port,
50 }
51 }
52 pub fn get_reverse(&self) -> FiveTuple {
54 FiveTuple {
55 proto: self.proto,
56 src: self.dst,
57 dst: self.src,
58 src_port: self.dst_port,
59 dst_port: self.src_port,
60 }
61 }
62}
63
64impl Default for FiveTuple {
65 fn default() -> Self {
66 FiveTuple {
67 proto: 0,
68 src: IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)),
69 dst: IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)),
70 src_port: 0,
71 dst_port: 0,
72 }
73 }
74}