stackforge_core/anonymize/
port.rs1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
9pub enum PortCategory {
10 WellKnown,
12 Registered,
14 Ephemeral,
16}
17
18impl PortCategory {
20 #[must_use]
22 pub const fn sentinel(self) -> u16 {
23 match self {
24 Self::WellKnown => 0,
25 Self::Registered => 1024,
26 Self::Ephemeral => 49152,
27 }
28 }
29}
30
31#[must_use]
33pub const fn categorize_port(port: u16) -> PortCategory {
34 match port {
35 0..=1023 => PortCategory::WellKnown,
36 1024..=49151 => PortCategory::Registered,
37 _ => PortCategory::Ephemeral,
38 }
39}
40
41#[must_use]
46pub const fn generalize_port(port: u16, preserve_well_known_dst: bool, is_dst: bool) -> u16 {
47 if preserve_well_known_dst && is_dst && port <= 1023 {
48 return port;
49 }
50 categorize_port(port).sentinel()
51}
52
53#[cfg(test)]
54mod tests {
55 use super::*;
56
57 #[test]
58 fn test_categorize() {
59 assert_eq!(categorize_port(80), PortCategory::WellKnown);
60 assert_eq!(categorize_port(443), PortCategory::WellKnown);
61 assert_eq!(categorize_port(8080), PortCategory::Registered);
62 assert_eq!(categorize_port(49152), PortCategory::Ephemeral);
63 assert_eq!(categorize_port(60000), PortCategory::Ephemeral);
64 assert_eq!(categorize_port(0), PortCategory::WellKnown);
65 assert_eq!(categorize_port(1023), PortCategory::WellKnown);
66 assert_eq!(categorize_port(1024), PortCategory::Registered);
67 }
68
69 #[test]
70 fn test_generalize_preserves_well_known_dst() {
71 assert_eq!(generalize_port(443, true, true), 443);
73 assert_eq!(generalize_port(443, true, false), 0);
75 }
76
77 #[test]
78 fn test_generalize_categorize_all() {
79 assert_eq!(generalize_port(443, false, true), 0);
81 assert_eq!(generalize_port(8080, false, true), 1024);
82 assert_eq!(generalize_port(55000, false, true), 49152);
83 }
84
85 #[test]
86 fn test_generalize_ephemeral_src() {
87 assert_eq!(generalize_port(54321, true, false), 49152);
88 }
89}