use crate::protocol::ethernet::EthType; use crate::protocol::ip::IPProtocol; use std::collections::HashMap; #[derive(Clone, Copy, Debug, Hash, PartialEq, Eq)] pub enum PacketStatus { Normal, InvalidPacketLength, // L2 UnsupportEthernetType(EthType), IncompleteEthernetFrame, IncompleteVLANHeader, IncompleteMPLSHeader, IncompletePWEthernetHeader, // L3 UnsupportIPProtocol(IPProtocol), IncompleteIPv4Header, IncompleteIPv6Header, // L3.5 UnsupportGREVersion, IncompleteGREHeader, IncompleteGREv0Header, IncompleteGREv1Header, // L4 IncompleteUDPHeader, IncompleteTCPHeader, IncompleteICMPHeader, IncompleteICMPv6Header, // L TUNNEL UnsupportGTPVersion, IncompleteGTPv1Header, UnsupportL2TPVersion, IncompleteL2TPHeader, IncompletePPTPHeader, IncompletePPPHeader, UnsupportPPPoEVersion, IncompletePPPoEHeader, } #[derive(Debug)] pub struct PacketMetrics { map: HashMap, } impl PacketMetrics { pub fn new() -> PacketMetrics { PacketMetrics { map: HashMap::new(), } } pub fn add(&mut self, err: PacketStatus) { let count = self.map.entry(err).or_insert(0); *count += 1; } pub fn get(&self, err: PacketStatus) -> Option<&usize> { self.map.get(&err) } pub fn dump(&self) { println!("PacketMetrics: {:?}", self.map); } }