diff --git a/docs/source/pcapkit/protocols/internet/igmpv2.rst b/docs/source/pcapkit/protocols/internet/igmpv2.rst index cd619e2136..16e0e92200 100644 --- a/docs/source/pcapkit/protocols/internet/igmpv2.rst +++ b/docs/source/pcapkit/protocols/internet/igmpv2.rst @@ -14,6 +14,7 @@ extractor for Internet Group Management Protocol version 2 (IGMPv2) :no-members: :show-inheritance: + .. autoproperty:: name .. autoproperty:: version .. autoproperty:: alias diff --git a/docs/source/pcapkit/protocols/internet/igmpv3.rst b/docs/source/pcapkit/protocols/internet/igmpv3.rst index 27c78ae0e5..23c5c6bf4e 100644 --- a/docs/source/pcapkit/protocols/internet/igmpv3.rst +++ b/docs/source/pcapkit/protocols/internet/igmpv3.rst @@ -49,6 +49,7 @@ Octets Bits Name Description :no-members: :show-inheritance: + .. autoproperty:: name .. autoproperty:: version .. autoproperty:: length diff --git a/pcapkit/protocols/internet/igmpv2.py b/pcapkit/protocols/internet/igmpv2.py index 6d07ab1a40..5949fc2fe8 100644 --- a/pcapkit/protocols/internet/igmpv2.py +++ b/pcapkit/protocols/internet/igmpv2.py @@ -33,6 +33,11 @@ class IGMPv2(IGMPBase[Data_IGMP, Schema_IGMP], # Properties. ########################################################################## + @property + def name(self) -> 'Literal["Internet Group Management Protocol version 2"]': # type: ignore[override] + """Name of corresponding protocol.""" + return 'Internet Group Management Protocol version 2' + @property def version(self) -> 'Literal[2]': """IGMP version this class reads: ``2``.""" diff --git a/pcapkit/protocols/internet/igmpv3.py b/pcapkit/protocols/internet/igmpv3.py index 57a9aca5ac..a81fd57e2c 100644 --- a/pcapkit/protocols/internet/igmpv3.py +++ b/pcapkit/protocols/internet/igmpv3.py @@ -158,6 +158,11 @@ class IGMPv3(IGMPBase[Data_IGMPv3, Schema_IGMPv3], # Properties. ########################################################################## + @property + def name(self) -> 'Literal["Internet Group Management Protocol version 3"]': # type: ignore[override] + """Name of corresponding protocol.""" + return 'Internet Group Management Protocol version 3' + @property def version(self) -> 'Literal[3]': """IGMP version this class reads: ``3``.""" diff --git a/tests/protocols/internet/test_igmp_unit.py b/tests/protocols/internet/test_igmp_unit.py index 7879e34ec4..8443a2df80 100644 --- a/tests/protocols/internet/test_igmp_unit.py +++ b/tests/protocols/internet/test_igmp_unit.py @@ -429,6 +429,19 @@ def test_id_and_version(self) -> None: self.assertEqual(object.__new__(IGMPv2).version, 2) self.assertEqual(object.__new__(IGMPv3).version, 3) + def test_name_carries_the_version_its_rfc_names(self) -> None: + """:rfc:`2236` and :rfc:`3376` name IGMPv2 and IGMPv3 with their versions, + so their ``name`` carries it; :rfc:`1112` names IGMPv1 without one (#2558).""" + expected = { + 'IGMPv1': 'Internet Group Management Protocol', + 'IGMPv2': 'Internet Group Management Protocol version 2', + 'IGMPv3': 'Internet Group Management Protocol version 3', + } + for name, (packet, version) in {**IGMP_PACKETS, **IGMPV3_PACKETS}.items(): + with self.subTest(packet=name): + parsed = igmp_class(version)(io.BytesIO(packet), len(packet)) + self.assertEqual(parsed.name, expected[version]) + def test_base_id_covers_all_three_versions(self) -> None: """The base lists each version's canonical name, and only those: IGMPv1's is the family name itself, so no ``id()`` carries ``'IGMPv1'``.""" @@ -630,7 +643,7 @@ def test_igmp_index_length_and_name(self) -> None: self.assertEqual(IGMP.__index__(), TransType.IGMP) self.assertEqual(proto.__length_hint__(), 8) self.assertEqual(proto.length, 8) - self.assertEqual(proto.name, 'Internet Group Management Protocol') + self.assertEqual(proto.name, 'Internet Group Management Protocol version 2') self.assertEqual(proto.alias, 'IGMPv2') def test_igmpv3_length_varies_with_the_message(self) -> None: