huginn_net_tcp/
display.rs

1use crate::observable::ObservableTcp;
2use core::fmt;
3use huginn_net_db::tcp::{IpVersion, PayloadSize, Quirk, TcpOption, Ttl, WindowSize};
4use std::fmt::Formatter;
5
6trait TcpDisplayFormat {
7    fn get_version(&self) -> IpVersion;
8    fn get_ittl(&self) -> Ttl;
9    fn get_olen(&self) -> u8;
10    fn get_mss(&self) -> Option<u16>;
11    fn get_wsize(&self) -> WindowSize;
12    fn get_wscale(&self) -> Option<u8>;
13    fn get_olayout(&self) -> &[TcpOption];
14    fn get_quirks(&self) -> &[Quirk];
15    fn get_pclass(&self) -> PayloadSize;
16
17    fn format_tcp_display(&self, f: &mut Formatter<'_>) -> fmt::Result {
18        write!(
19            f,
20            "{}:{}:{}:",
21            self.get_version(),
22            self.get_ittl(),
23            self.get_olen()
24        )?;
25
26        if let Some(mss) = self.get_mss() {
27            write!(f, "{mss}")?;
28        } else {
29            f.write_str("*")?;
30        }
31
32        write!(f, ":{},", self.get_wsize())?;
33
34        if let Some(scale) = self.get_wscale() {
35            write!(f, "{scale}")?;
36        } else {
37            f.write_str("*")?;
38        }
39
40        f.write_str(":")?;
41
42        for (i, o) in self.get_olayout().iter().enumerate() {
43            if i > 0 {
44                f.write_str(",")?;
45            }
46            write!(f, "{o}")?;
47        }
48
49        f.write_str(":")?;
50
51        for (i, q) in self.get_quirks().iter().enumerate() {
52            if i > 0 {
53                f.write_str(",")?;
54            }
55            write!(f, "{q}")?;
56        }
57
58        write!(f, ":{}", self.get_pclass())
59    }
60}
61
62impl TcpDisplayFormat for ObservableTcp {
63    fn get_version(&self) -> IpVersion {
64        self.matching.version
65    }
66    fn get_ittl(&self) -> Ttl {
67        self.matching.ittl.clone()
68    }
69    fn get_olen(&self) -> u8 {
70        self.matching.olen
71    }
72    fn get_mss(&self) -> Option<u16> {
73        self.matching.mss
74    }
75    fn get_wsize(&self) -> WindowSize {
76        self.matching.wsize.clone()
77    }
78    fn get_wscale(&self) -> Option<u8> {
79        self.matching.wscale
80    }
81    fn get_olayout(&self) -> &[TcpOption] {
82        &self.matching.olayout
83    }
84    fn get_quirks(&self) -> &[Quirk] {
85        &self.matching.quirks
86    }
87    fn get_pclass(&self) -> PayloadSize {
88        self.matching.pclass
89    }
90}
91
92impl fmt::Display for ObservableTcp {
93    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
94        self.format_tcp_display(f)
95    }
96}