Skip to main content

sniffnet_packet_parser/
igmp_type.rs

1use std::fmt::{Display, Formatter};
2
3#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
4/// The IGMP message type.
5pub enum IgmpType {
6    MembershipQuery,
7    MembershipReportV1,
8    MembershipReportV2,
9    MembershipReportV3,
10    LeaveGroup,
11    Dvmrp,
12    Pim,
13    CiscoTrace,
14    MulticastTracerouteResponse,
15    MulticastTraceroute,
16    MulticastRouterAdvertisement,
17    MulticastRouterSolicitation,
18    MulticastRouterTermination,
19    Unknown,
20}
21
22impl IgmpType {
23    #[must_use]
24    pub(crate) fn from_etherparse(igmp_type: &etherparse::IgmpType) -> IgmpType {
25        match igmp_type {
26            etherparse::IgmpType::MembershipQuery(_)
27            | etherparse::IgmpType::MembershipQueryWithSources(_) => IgmpType::MembershipQuery,
28            etherparse::IgmpType::MembershipReportV1(_) => IgmpType::MembershipReportV1,
29            etherparse::IgmpType::MembershipReportV2(_) => IgmpType::MembershipReportV2,
30            etherparse::IgmpType::MembershipReportV3(_) => IgmpType::MembershipReportV3,
31            etherparse::IgmpType::LeaveGroup(_) => IgmpType::LeaveGroup,
32            etherparse::IgmpType::Unknown(h) => match h.igmp_type {
33                0x13 => IgmpType::Dvmrp,
34                0x14 => IgmpType::Pim,
35                0x15 => IgmpType::CiscoTrace,
36                0x1e => IgmpType::MulticastTracerouteResponse,
37                0x1f => IgmpType::MulticastTraceroute,
38                0x30 => IgmpType::MulticastRouterAdvertisement,
39                0x31 => IgmpType::MulticastRouterSolicitation,
40                0x32 => IgmpType::MulticastRouterTermination,
41                _ => IgmpType::Unknown,
42            },
43        }
44    }
45}
46
47impl Display for IgmpType {
48    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
49        write!(
50            f,
51            "{}",
52            match self {
53                IgmpType::MembershipQuery => "Membership Query",
54                IgmpType::MembershipReportV1 => "Membership Report v1",
55                IgmpType::MembershipReportV2 => "Membership Report v2",
56                IgmpType::MembershipReportV3 => "Membership Report v3",
57                IgmpType::LeaveGroup => "Leave Group",
58                IgmpType::Dvmrp => "DVMRP",
59                IgmpType::Pim => "PIM v1",
60                IgmpType::CiscoTrace => "Cisco Trace",
61                IgmpType::MulticastTracerouteResponse => "Multicast Traceroute Response",
62                IgmpType::MulticastTraceroute => "Multicast Traceroute",
63                IgmpType::MulticastRouterAdvertisement => "Multicast Router Advertisement",
64                IgmpType::MulticastRouterSolicitation => "Multicast Router Solicitation",
65                IgmpType::MulticastRouterTermination => "Multicast Router Termination",
66                IgmpType::Unknown => "?",
67            }
68        )
69    }
70}