huginn_net_tcp/
display.rs1use 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}