nullnet-firewall 0.2.2

Rust-based firewall for network drivers
Documentation
use std::fmt::{Display, Formatter};

#[derive(Debug)]
#[allow(non_camel_case_types, clippy::upper_case_acronyms)]
pub(crate) enum Proto {
    HOPOPT,
    ICMP,
    IGMP,
    GGP,
    IPv4,
    ST,
    TCP,
    CBT,
    EGP,
    IGP,
    BBN_RCC_MON,
    NVP_II,
    PUP,
    ARGUS,
    EMCON,
    XNET,
    CHAOS,
    UDP,
    MUX,
    DCN_MEAS,
    HMP,
    PRM,
    XNS_IDP,
    TRUNK_1,
    TRUNK_2,
    LEAF_1,
    LEAF_2,
    RDP,
    IRTP,
    ISO_TP4,
    NETBLT,
    MFE_NSP,
    MERIT_INP,
    DCCP,
    _3PC,
    IDPR,
    XTP,
    DDP,
    IDPR_CMTP,
    TP_PLUS_PLUS,
    IL,
    IPv6,
    SDRP,
    IPv6_Route,
    IPv6_Frag,
    IDRP,
    RSVP,
    GRE,
    DSR,
    BNA,
    ESP,
    AH,
    I_NLSP,
    SWIPE,
    NARP,
    Min_IPv4,
    TLSP,
    SKIP,
    IPv6_ICMP,
    IPv6_NoNxt,
    IPv6_Opts,
    CFTP,
    SAT_EXPAK,
    KRYPTOLAN,
    RVD,
    IPPC,
    SAT_MON,
    VISA,
    IPCV,
    CPNX,
    CPHB,
    WSN,
    PVP,
    BR_SAT_MON,
    SUN_ND,
    WB_MON,
    WB_EXPAK,
    ISO_IP,
    VMTP,
    SECURE_VMTP,
    VINES,
    IPTM,
    NSFNET_IGP,
    DGP,
    TCF,
    EIGRP,
    OSPFIGP,
    Sprite_RPC,
    LARP,
    MTP,
    AX_25,
    IPIP,
    MICP,
    SCC_SP,
    ETHERIP,
    ENCAP,
    GMTP,
    IFMP,
    PNNI,
    PIM,
    ARIS,
    SCPS,
    QNX,
    A_N,
    IPComp,
    SNP,
    Compaq_Peer,
    IPX_in_IP,
    VRRP,
    PGM,
    L2TP,
    DDX,
    IATP,
    STP,
    SRP,
    UTI,
    SMP,
    SM,
    PTP,
    ISIS_over_IPv4,
    FIRE,
    CRTP,
    CRUDP,
    SSCOPMCE,
    IPLT,
    SPS,
    PIPE,
    SCTP,
    FC,
    RSVP_E2E_IGNORE,
    Mobility_Header,
    UDPLite,
    MPLS_in_IP,
    manet,
    HIP,
    Shim6,
    WESP,
    ROHC,
    Ethernet,
    AGGFRAG,
    NSH,
    Unknown,
}

impl Proto {
    #[allow(clippy::too_many_lines)]
    pub(crate) fn from_number(num: Option<u8>) -> Proto {
        if let Some(proto) = num {
            return match proto {
                0 => Proto::HOPOPT,
                1 => Proto::ICMP,
                2 => Proto::IGMP,
                3 => Proto::GGP,
                4 => Proto::IPv4,
                5 => Proto::ST,
                6 => Proto::TCP,
                7 => Proto::CBT,
                8 => Proto::EGP,
                9 => Proto::IGP,
                10 => Proto::BBN_RCC_MON,
                11 => Proto::NVP_II,
                12 => Proto::PUP,
                13 => Proto::ARGUS,
                14 => Proto::EMCON,
                15 => Proto::XNET,
                16 => Proto::CHAOS,
                17 => Proto::UDP,
                18 => Proto::MUX,
                19 => Proto::DCN_MEAS,
                20 => Proto::HMP,
                21 => Proto::PRM,
                22 => Proto::XNS_IDP,
                23 => Proto::TRUNK_1,
                24 => Proto::TRUNK_2,
                25 => Proto::LEAF_1,
                26 => Proto::LEAF_2,
                27 => Proto::RDP,
                28 => Proto::IRTP,
                29 => Proto::ISO_TP4,
                30 => Proto::NETBLT,
                31 => Proto::MFE_NSP,
                32 => Proto::MERIT_INP,
                33 => Proto::DCCP,
                34 => Proto::_3PC,
                35 => Proto::IDPR,
                36 => Proto::XTP,
                37 => Proto::DDP,
                38 => Proto::IDPR_CMTP,
                39 => Proto::TP_PLUS_PLUS,
                40 => Proto::IL,
                41 => Proto::IPv6,
                42 => Proto::SDRP,
                43 => Proto::IPv6_Route,
                44 => Proto::IPv6_Frag,
                45 => Proto::IDRP,
                46 => Proto::RSVP,
                47 => Proto::GRE,
                48 => Proto::DSR,
                49 => Proto::BNA,
                50 => Proto::ESP,
                51 => Proto::AH,
                52 => Proto::I_NLSP,
                53 => Proto::SWIPE,
                54 => Proto::NARP,
                55 => Proto::Min_IPv4,
                56 => Proto::TLSP,
                57 => Proto::SKIP,
                58 => Proto::IPv6_ICMP,
                59 => Proto::IPv6_NoNxt,
                60 => Proto::IPv6_Opts,
                62 => Proto::CFTP,
                64 => Proto::SAT_EXPAK,
                65 => Proto::KRYPTOLAN,
                66 => Proto::RVD,
                67 => Proto::IPPC,
                69 => Proto::SAT_MON,
                70 => Proto::VISA,
                71 => Proto::IPCV,
                72 => Proto::CPNX,
                73 => Proto::CPHB,
                74 => Proto::WSN,
                75 => Proto::PVP,
                76 => Proto::BR_SAT_MON,
                77 => Proto::SUN_ND,
                78 => Proto::WB_MON,
                79 => Proto::WB_EXPAK,
                80 => Proto::ISO_IP,
                81 => Proto::VMTP,
                82 => Proto::SECURE_VMTP,
                83 => Proto::VINES,
                84 => Proto::IPTM,
                85 => Proto::NSFNET_IGP,
                86 => Proto::DGP,
                87 => Proto::TCF,
                88 => Proto::EIGRP,
                89 => Proto::OSPFIGP,
                90 => Proto::Sprite_RPC,
                91 => Proto::LARP,
                92 => Proto::MTP,
                93 => Proto::AX_25,
                94 => Proto::IPIP,
                95 => Proto::MICP,
                96 => Proto::SCC_SP,
                97 => Proto::ETHERIP,
                98 => Proto::ENCAP,
                100 => Proto::GMTP,
                101 => Proto::IFMP,
                102 => Proto::PNNI,
                103 => Proto::PIM,
                104 => Proto::ARIS,
                105 => Proto::SCPS,
                106 => Proto::QNX,
                107 => Proto::A_N,
                108 => Proto::IPComp,
                109 => Proto::SNP,
                110 => Proto::Compaq_Peer,
                111 => Proto::IPX_in_IP,
                112 => Proto::VRRP,
                113 => Proto::PGM,
                115 => Proto::L2TP,
                116 => Proto::DDX,
                117 => Proto::IATP,
                118 => Proto::STP,
                119 => Proto::SRP,
                120 => Proto::UTI,
                121 => Proto::SMP,
                122 => Proto::SM,
                123 => Proto::PTP,
                124 => Proto::ISIS_over_IPv4,
                125 => Proto::FIRE,
                126 => Proto::CRTP,
                127 => Proto::CRUDP,
                128 => Proto::SSCOPMCE,
                129 => Proto::IPLT,
                130 => Proto::SPS,
                131 => Proto::PIPE,
                132 => Proto::SCTP,
                133 => Proto::FC,
                134 => Proto::RSVP_E2E_IGNORE,
                135 => Proto::Mobility_Header,
                136 => Proto::UDPLite,
                137 => Proto::MPLS_in_IP,
                138 => Proto::manet,
                139 => Proto::HIP,
                140 => Proto::Shim6,
                141 => Proto::WESP,
                142 => Proto::ROHC,
                143 => Proto::Ethernet,
                144 => Proto::AGGFRAG,
                145 => Proto::NSH,
                _ => Proto::Unknown,
            };
        }
        Proto::Unknown
    }
}

impl Display for Proto {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        let proto = match self {
            Proto::BBN_RCC_MON => "BBN-RCC-MON".to_string(),
            Proto::NVP_II => "NVP-II".to_string(),
            Proto::DCN_MEAS => "DCN-MEAS".to_string(),
            Proto::XNS_IDP => "XNS-IDP".to_string(),
            Proto::TRUNK_1 => "TRUNK-1".to_string(),
            Proto::TRUNK_2 => "TRUNK-2".to_string(),
            Proto::LEAF_1 => "LEAF-1".to_string(),
            Proto::LEAF_2 => "LEAF-2".to_string(),
            Proto::ISO_TP4 => "ISO-TP4".to_string(),
            Proto::MFE_NSP => "MFE-NSP".to_string(),
            Proto::MERIT_INP => "MERIT-INP".to_string(),
            Proto::_3PC => "3PC".to_string(),
            Proto::IDPR_CMTP => "IDRP-CMTP".to_string(),
            Proto::TP_PLUS_PLUS => "TP++".to_string(),
            Proto::IPv6_Route => "IPv6-Route".to_string(),
            Proto::IPv6_Frag => "IPv6-Frag".to_string(),
            Proto::I_NLSP => "I-NLSP".to_string(),
            Proto::Min_IPv4 => "Min-IPv4".to_string(),
            Proto::IPv6_ICMP => "IPv6-ICMP".to_string(),
            Proto::IPv6_NoNxt => "IPv6-NoNxt".to_string(),
            Proto::IPv6_Opts => "IPv6-Opts".to_string(),
            Proto::SAT_MON => "SAT-MON".to_string(),
            Proto::BR_SAT_MON => "BR-SAT-MON".to_string(),
            Proto::SUN_ND => "SUN-ND".to_string(),
            Proto::WB_MON => "WB-MON".to_string(),
            Proto::WB_EXPAK => "WB-EXPAK".to_string(),
            Proto::ISO_IP => "ISO-IP".to_string(),
            Proto::SECURE_VMTP => "SECURE-VMPT".to_string(),
            Proto::NSFNET_IGP => "NSFNET-IGP".to_string(),
            Proto::Sprite_RPC => "Sprite-RPC".to_string(),
            Proto::AX_25 => "AX.25".to_string(),
            Proto::SCC_SP => "SCC-SP".to_string(),
            Proto::A_N => "A/N".to_string(),
            Proto::Compaq_Peer => "Compaq-Peer".to_string(),
            Proto::IPX_in_IP => "IPX-in-IP".to_string(),
            Proto::ISIS_over_IPv4 => "ISIS over IPv4".to_string(),
            Proto::RSVP_E2E_IGNORE => "RSVP-E2E-IGNORE".to_string(),
            Proto::Mobility_Header => "Mobility Header".to_string(),
            Proto::MPLS_in_IP => "MPLS-in-IP".to_string(),
            Proto::Unknown => "-".to_string(),
            _ => {
                format!("{self:?}")
            }
        };

        write!(f, "{proto}")
    }
}