diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 54d6600927..197dbc6641 100755 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -119,7 +119,7 @@ Mechanical points that decide real cases: - **A private base class must stay documented when a documented subclass carries `:show-inheritance:`.** Sphinx renders that subclass's `Bases:` line as a link into the private class's page, so dropping the directive breaks a link a public page renders. This keeps - `pcapkit.protocols.schema.misc.pcapng._OPT_Option` and the other per-block option bases with + `pcapkit.protocols.misc.pcapng.schema._OPT_Option` and the other per-block option bases with documented subclasses, plus `_IPField`, `_IPInterfaceField` and `_TextField`. - **Dunders keep their directives.** A `__dunder__` is reached through public syntax, not by name (`len()` calls `__len__`, `obj[key]` calls `__getitem__`), so overriding one changes behaviour a diff --git a/docs/source/changelog/1.5.0.rst b/docs/source/changelog/1.5.0.rst index 9eeab1455e..e0041973da 100644 --- a/docs/source/changelog/1.5.0.rst +++ b/docs/source/changelog/1.5.0.rst @@ -72,7 +72,7 @@ Changed ``aenum.IntFlag`` to ``aenum.IntEnum``, so ``|`` between two members gives a plain ``int`` rather than a composite member (:issue:`808`, :pr:`836`). * **a breaking change to** :class:`~pcapkit.const.pcapng.tls_key_label.TLSKeyLabel`: the - hand-written class in :mod:`pcapkit.protocols.misc.pcapng` becomes the generated + hand-written class in :mod:`pcapkit.protocols.misc.pcapng.protocol` becomes the generated :class:`pcapkit.const.pcapng.tls_key_label.TLSKeyLabel` (``PCAPNG_TLSKeyLabel`` in :mod:`pcapkit.const.pcapng`), crawled from the IANA registry :rfc:`9850` creates (:issue:`886`, :pr:`890`), and the old path is removed (:issue:`1744`, @@ -113,7 +113,7 @@ Fixed :mod:`pcapkit.const.http.method` tested membership with the raw key but registered ``key.upper()``, so the *first* lowercase or mixed-case token raised ``TypeError: 'RETR' already in use``. Reachable from wire data: - :mod:`pcapkit.protocols.application.ftp` matches with ``re.I`` and passes the + :mod:`pcapkit.protocols.application.ftp.protocol` matches with ``re.I`` and passes the match verbatim, and :rfc:`959#section-5` makes FTP commands case-insensitive, so ``retr file.txt`` was a valid request the library could not parse. ``get()`` and ``_missing_`` now look the key up under the canonical upper-case name, so @@ -727,7 +727,7 @@ Fixed Fixed-length items are unchanged; the HTTP/2 ``SETTINGS`` pair, whose size is fixed, is given it in its own schema instead (:issue:`1140`, below) (:issue:`1148`). * a signed :class:`.NumberField` decoded as unsigned, a zero-length - :class:`.PayloadField` misread, and an empty :class:`~pcapkit.protocols.misc.raw.Raw` + :class:`.PayloadField` misread, and an empty :class:`~pcapkit.protocols.misc.raw.protocol.Raw` did not rebuild (:pr:`1331`). * ``from_dict(to_dict())`` lost nested values, and ``len()`` of an :class:`.Info` counted its hidden keys (:pr:`1334`). @@ -1003,7 +1003,7 @@ Changed rather than eagerly, cutting IP reassembly's own cost by 90.7% and TCP's by 23.7% (IP reassembly submits a datagram for every frame, fragmented or not) (:pr:`424`). Flow tracing over the same capture went from 1416.6 ms to 744.0 ms, because the flow - dumper handed each record to a :class:`~pcapkit.protocols.misc.pcap.frame.Frame` + dumper handed each record to a :class:`~pcapkit.protocols.misc.pcap.frame.protocol.Frame` constructor that re-dissected the whole stack to return the bytes it had just been given; options are no longer parsed twice either (:pr:`427`). * **a breaking change to** :attr:`.Extractor.engine` and @@ -1085,7 +1085,7 @@ Fixed * ``register_protocol`` displaced one protocol class with another and said nothing. The registry behind :data:`pcapkit.protocols.__proto__` is keyed on ``cls.__name__.upper()``, and several dispatchable classes are named ``HTTP`` - (the base :class:`pcapkit.protocols.application.http.HTTP` and the ``httpv1`` and + (the base :class:`pcapkit.protocols.application.http.protocol.HTTP` and the ``httpv1`` and ``httpv2`` implementations), so a bare assignment decided the winner: ``register_protocol(httpv2.HTTP)`` moved ``__proto__['HTTP']`` to the ``httpv2`` class with no exception, log line or :exc:`.RegistryWarning`, and @@ -1104,7 +1104,7 @@ Fixed (``register_tcp`` then ``register_udp``, a documented path) reaches it twice with nothing displaced. The collision is reported, not resolved: re-keying is a registry-format change that none of the bare-name readers can absorb (each degrades - *silently* to a string or :class:`~pcapkit.protocols.misc.raw.Raw` on a miss), so it + *silently* to a string or :class:`~pcapkit.protocols.misc.raw.protocol.Raw` on a miss), so it belongs to the registry redesign in :issue:`514`. The issue called this the one registrar with no warning; in fact none warned by itself, the siblings only by delegating to a guarded classmethod (:issue:`675`). @@ -1320,7 +1320,7 @@ Added verification through ``cryptography`` (``pip install pypcapkit[crypto]``) (:pr:`378`). Keys reach the dissector through a new caller-state channel, :mod:`pcapkit.corekit.context`, surfaced as the ``context=`` keyword on ``extract()`` - and :class:`.Extractor`, carrying an :class:`.esp.SecurityAssociation`. Nothing here + and :class:`.Extractor`, carrying an :class:`.esp.protocol.SecurityAssociation`. Nothing here raises: with no association the SPI and sequence number are still reported and the ciphertext is left opaque with ``status=NO_SA``, and a failed decryption or ICV check is recorded on the parsed result the same way. Extended Sequence Numbers, TFC @@ -1352,10 +1352,10 @@ Added (:pr:`436`): FTP-DATA on TCP 20, HTTP/1 on TCP 8080, HTTP on UDP 8080, :class:`.L2TPv2` on UDP 1701 and OSPF at :class:`~pcapkit.const.reg.transtype.TransType` 89. - :class:`~pcapkit.protocols.link.vlan.VLAN` became an abstract base with + :class:`~pcapkit.protocols.link.vlan.protocol.VLAN` became an abstract base with :class:`.C_Tag` (802.1Q) and :class:`.S_Tag` (802.1ad) as concrete subclasses, so a Q-in-Q frame no longer collapses into one opaque - :class:`~pcapkit.protocols.misc.raw.Raw`; :class:`~pcapkit.protocols.link.l2tp.L2TP` + :class:`~pcapkit.protocols.misc.raw.protocol.Raw`; :class:`~pcapkit.protocols.link.l2tp.protocol.L2TP` likewise became a base, with :class:`.L2TPv2` carrying the :rfc:`2661` implementation. * :class:`~pcapkit.protocols.protocol.Protocol`/:class:`.ProtocolBase` gain a ``code=`` class keyword for the next-layer dispatch registries (:attr:`.Link.__proto__`, @@ -1370,14 +1370,14 @@ Added :class:`.Link`, :class:`~pcapkit.const.reg.transtype.TransType` means :class:`.Internet`, :class:`~pcapkit.const.sctp.payload_protocol_identifier.PayloadProtocolIdentifier` - means :class:`~pcapkit.protocols.transport.sctp.SCTP`, and + means :class:`~pcapkit.protocols.transport.sctp.protocol.SCTP`, and :class:`~pcapkit.const.reg.linktype.LinkType` means *both* - :class:`~pcapkit.protocols.misc.pcap.frame.Frame` **and** - :class:`~pcapkit.protocols.misc.pcapng.PCAPNG`, mirroring ``register_linktype``), or a + :class:`~pcapkit.protocols.misc.pcap.frame.protocol.Frame` **and** + :class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG`, mirroring ``register_linktype``), or a ``{destination: key}`` mapping, required for a raw ``int`` such as a port number, which cannot say which transport it belongs to. Either form may appear in an iterable, so one declaration can register a class into several registries (e.g. a - :class:`~pcapkit.protocols.link.l2tp.L2TP` subclass reachable by IP protocol number + :class:`~pcapkit.protocols.link.l2tp.protocol.L2TP` subclass reachable by IP protocol number and by a UDP port), and the mapping form is accepted even where inference would work. Inference refuses rather than guesses: an enum member whose type names no known destination raises :exc:`.RegistryError`, and an unrecognised class keyword raises @@ -1393,7 +1393,7 @@ Added designates, read from the same ``__proto_dest__`` declaration backing ``code=`` so the two cannot drift. It walks the classes rather than the registry entries, so it catches a class nothing registered, the shape in which - :class:`~pcapkit.protocols.application.ospf.OSPF` once shipped (:issue:`548`). + :class:`~pcapkit.protocols.application.ospf.protocol.OSPF` once shipped (:issue:`548`). * ``tests/protocols/transport/test_tcp_mptcp_join_flag_ordering_unit.py``, covering all three MP_JOIN layouts through the *public* constructor, the construct-pack-parse cycle for each, the stale-flags case that rules out a zero-valued default, the @@ -1426,7 +1426,7 @@ Added Changed ~~~~~~~ -* **a breaking change to** :class:`~pcapkit.protocols.application.ospf.OSPF`, +* **a breaking change to** :class:`~pcapkit.protocols.application.ospf.protocol.OSPF`, :class:`.RARP` and :class:`.DRARP`: they move from :mod:`pcapkit.protocols.link` to :mod:`pcapkit.protocols.application`, with no deprecated re-export at the old path (:issue:`719`). Layer is decided by designed function, with the IETF as the single @@ -1436,12 +1436,12 @@ Changed Import paths, before to after: - * ``pcapkit.protocols.link.ospf`` to :mod:`pcapkit.protocols.application.ospf` + * ``pcapkit.protocols.link.ospf`` to :mod:`pcapkit.protocols.application.ospf.protocol` * ``pcapkit.protocols.data.link.ospf`` to - :mod:`pcapkit.protocols.data.application.ospf` + :mod:`pcapkit.protocols.application.ospf.data` * ``pcapkit.protocols.schema.link.ospf`` to - :mod:`pcapkit.protocols.schema.application.ospf` - * ``pcapkit.protocols.link.rarp`` to :mod:`pcapkit.protocols.application.rarp` + :mod:`pcapkit.protocols.application.ospf.schema` + * ``pcapkit.protocols.link.rarp`` to :mod:`pcapkit.protocols.application.rarp.protocol` ``from pcapkit import OSPF`` and ``from pcapkit.protocols import OSPF`` (likewise :class:`.RARP` and :class:`.DRARP`) are unaffected; @@ -1449,19 +1449,19 @@ Changed no ``data`` or ``schema`` module of its own, as it reuses ARP's. ``layer`` changes from ``'Link'`` to ``'Application'`` for OSPF, RARP and DRARP. - :class:`~pcapkit.protocols.application.ospf.OSPF` now takes :class:`.Application` as + :class:`~pcapkit.protocols.application.ospf.protocol.OSPF` now takes :class:`.Application` as its only base, and :class:`.RARP` becomes ``class RARP(Application, ARP)`` -- layer - base first, because :class:`~pcapkit.protocols.link.arp.ARP`'s chain reaches - :class:`.Link`, which owns ``__layer__``. :class:`~pcapkit.protocols.link.arp.ARP` and + base first, because :class:`~pcapkit.protocols.link.arp.protocol.ARP`'s chain reaches + :class:`.Link`, which owns ``__layer__``. :class:`~pcapkit.protocols.link.arp.protocol.ARP` and :class:`.InARP` stay ``'Link'``. Dispatch keys are unchanged: OSPF is still reached from :attr:`.Internet.__proto__` at :attr:`.TransType.OSPFIGP` and RARP from :attr:`.Link.__proto__` by EtherType. Leaving :class:`.Link` repoints ``OSPF.__proto__`` at :attr:`.ProtocolBase.__proto__`, so OSPF no longer sees Link's EtherType entries -- which nothing used, since it is reached by protocol number, and a - ``-1`` lookup falls back to :class:`~pcapkit.protocols.misc.raw.Raw` in either + ``-1`` lookup falls back to :class:`~pcapkit.protocols.misc.raw.protocol.Raw` in either registry without inserting. ``register`` and ``_read_protos`` still resolve, on :class:`.ProtocolBase` rather than :class:`.Link`. :class:`.RARP` keeps Link's through - :class:`~pcapkit.protocols.link.arp.ARP`. + :class:`~pcapkit.protocols.link.arp.protocol.ARP`. Layer-limited extraction: ``layer='link'`` no longer sets the termination flag on OSPF and ``layer='application'`` now does -- the same inversion applies to RARP -- but the @@ -1469,10 +1469,10 @@ Changed ``layer=`` value, including ``'internet'`` (``IPv4:OSPFIGP`` before and after, as IPv4 ends the chain itself). * renames with no compatibility alias left behind: PCAP-NG - :class:`~pcapkit.protocols.schema.misc.pcapng.Option` subclasses spell the namespace + :class:`~pcapkit.protocols.misc.pcapng.schema.Option` subclasses spell the namespace class keyword ``ns=`` instead of ``namespace=`` (:issue:`439`). * ``tests/protocols/transport/test_tcp_udp_unit.py`` now reaches the MP_JOIN - dispatchers through :class:`TCP() ` itself, + dispatchers through :class:`TCP() ` itself, instead of assigning a Python ``set`` to ``_flags`` on a bare ``TCP.__new__(TCP)``. A ``set`` answers the same membership tests, so every branch ran while the attribute had neither the type production assigns nor the ordering that governs when it exists -- @@ -1493,7 +1493,7 @@ Changed parent passed on. A new ``__keywords__`` opts a class out: a set, for a keyword read out of ``**kwargs`` by name (:meth:`.ESP.read` with ``packet``); and ``None``, for a dispatcher whose real signature belongs to a class chosen at call time (only - :meth:`HTTP.make `). The message names + :meth:`HTTP.make `). The message names the near neighbour (``seq`` reports *did you mean 'seq_no'?*). ``from_data`` warns :exc:`.UnknownFieldWarning` rather than raising for a key its own ``_make_data`` returned, which the caller cannot fix; a keyword passed to ``from_data`` itself @@ -1509,7 +1509,7 @@ Changed outright. It encodes "no further protocol layer above this one", which undissected trailer bytes are not, so ``_decode_next_layer`` and ``_import_next_layer`` accept the ``-1`` sentinel -- the rest of the packet, resolving to - :class:`~pcapkit.protocols.misc.raw.Raw`, or to + :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, or to :class:`~pcapkit.protocols.misc.null.NoPayload` when nothing remains -- and ``__post_init__`` keeps a payload that ``read`` set instead of overwriting it with :class:`~pcapkit.protocols.misc.null.NoPayload`. A real protocol number (any ``proto`` @@ -1525,8 +1525,8 @@ Changed (:issue:`1101`). * **a breaking change to** ``OSPF_CrytographicAuthentication``: the misspelling is corrected to ``OSPF_CryptographicAuthentication``, and ``CrytographicAuthentication`` - in :mod:`pcapkit.protocols.schema.application.ospf` and - :mod:`pcapkit.protocols.data.application.ospf` to ``CryptographicAuthentication``, + in :mod:`pcapkit.protocols.application.ospf.schema` and + :mod:`pcapkit.protocols.application.ospf.data` to ``CryptographicAuthentication``, with no alias left for the old spelling. Both OSPF names also move to the application group of ``schema.__all__`` and ``data.__all__``, after :issue:`719`'s move (:issue:`1090`). @@ -1540,8 +1540,8 @@ Changed frame cut at the chain bound warns once (:issue:`1619`, :pr:`1630`). * **a breaking change to** IPv6 extension headers: an unrecognised or unparsable one is parsed generically, per :rfc:`6564`, rather than collapsing the packet to - :class:`~pcapkit.protocols.misc.raw.Raw` (:issue:`891`, :pr:`904`). - :class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext` does it, and is also the shared + :class:`~pcapkit.protocols.misc.raw.protocol.Raw` (:issue:`891`, :pr:`904`). + :class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext` does it, and is also the shared base of every extension header (:issue:`917`, :pr:`924`). * **a breaking change to** ``pack()``: it no longer keeps the header it builds on the instance it is called on, which in 1.4.1 too left ``schema`` disagreeing with @@ -1549,8 +1549,8 @@ Changed ``info.srcport`` kept 1234. Once an instance has been parsed or constructed, ``pack()`` builds on a shallow copy, so ``schema``, ``info`` and what ``make()`` sets, such as TCP's ``connection``, stay as they were. The - :class:`~pcapkit.protocols.misc.pcap.frame.Frame`, - :class:`~pcapkit.protocols.misc.pcapng.PCAPNG` and ``HTTPv2`` overrides do the same, + :class:`~pcapkit.protocols.misc.pcap.frame.protocol.Frame`, + :class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG` and ``HTTPv2`` overrides do the same, and re-packing a PCAP-NG block that carries an option allowed only once no longer raises. Code that relied on ``pack()`` to re-sync ``schema`` calls ``make()`` or constructs a new instance (:issue:`1769`, :pr:`1791`). @@ -1560,9 +1560,9 @@ Changed header with exactly two octets of padding changes; a parsed one that carried two ``Pad1`` options still rebuilds byte for byte (:issue:`1793`, :pr:`1812`). * **a breaking change to** :class:`.NTPTimestamp`: it and :class:`.PMIPv6Timestamp` are - :class:`.Info` classes in :mod:`pcapkit.protocols.data.internet.mh` rather than + :class:`.Info` classes in :mod:`pcapkit.protocols.internet.mh.data` rather than tuples, and :class:`.NTPTimestamp` keeps no alias at its 1.4.x home in - :mod:`pcapkit.protocols.internet.mh`. As Mappings they no longer index, unpack, + :mod:`pcapkit.protocols.internet.mh.protocol`. As Mappings they no longer index, unpack, compare or hash as a tuple does; ``.seconds`` and ``.fraction`` still work, and the dumpers write both as keys (:issue:`1886`, :pr:`1887`). * **a breaking change to** rebuilding from ``to_dict()``: the payload is dispatched only @@ -1585,18 +1585,18 @@ Changed it opens. Code reading ``block.context`` for the section reads ``block.section_context`` (:issue:`2172`, :pr:`2205`). * **a breaking change to** ``FTP_DATA``: it derives from ``Application`` as well as - :class:`~pcapkit.protocols.misc.raw.Raw`, so its ``__layer__`` names the + :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, so its ``__layer__`` names the application layer where it was ``None`` -- a ``layer='application'`` extraction stops at it, and ``extract(layer=FTP_DATA)`` resolves to that layer rather than to ``'none'``. Raw still does the parsing and the rebuild, and ``__index__`` is the application layer's, raising ``IntError`` where it raised :exc:`.UnsupportedCall`. The class moves to - :mod:`pcapkit.protocols.application.ftp_data` with nothing left behind on the old - path in :mod:`pcapkit.protocols.application.ftp`, where it shipped from 1.0.0 + :mod:`pcapkit.protocols.application.ftp_data.protocol` with nothing left behind on the old + path in :mod:`pcapkit.protocols.application.ftp.protocol`, where it shipped from 1.0.0 through 1.4.1 (:issue:`2285`, :pr:`2357`). * **a breaking change to** HIP's ``REG_FAILED`` parameter: its first octet is the Failure Type, and it carries no lifetime (:rfc:`8003#section-4.5`), so - :class:`pcapkit.protocols.data.internet.hip.RegFailedParameter` replaces ``lifetime`` + :class:`pcapkit.protocols.internet.hip.data.RegFailedParameter` replaces ``lifetime`` with ``failure_type``, a :class:`~pcapkit.const.hip.registration_failure.RegistrationFailure`, with no alias, and its ``reg_type`` holds :class:`~pcapkit.const.hip.registration.Registration` values rather than failure @@ -1636,14 +1636,14 @@ Fixed fell through to ``collections.abc.Mapping``'s, so a single ``isinstance`` or ``issubclass`` answer poisoned every later question about that class for the rest of the process. A terminating PCAP-NG - :class:`~pcapkit.protocols.schema.misc.pcapng.EndRecord` tested ``True`` as an - :class:`~pcapkit.protocols.schema.misc.pcapng.IPv4Record` (:issue:`439`). + :class:`~pcapkit.protocols.misc.pcapng.schema.EndRecord` tested ``True`` as an + :class:`~pcapkit.protocols.misc.pcapng.schema.IPv4Record` (:issue:`439`). * construction, broken in several places at once: the generated typed ``__init__`` was never installed, so ``__post_init__`` did not run and a schema built from a subset of its fields could not be packed -- ``UDP(srcport=53, dstport=5353)`` now packs (:pr:`430`); IPv6 and Mobility Header option padding was wrong, leaving construction wholly broken (:pr:`398`); - :meth:`HTTP.make ` called the versioned + :meth:`HTTP.make ` called the versioned ``make`` unbound, so every real call raised ``TypeError`` (:issue:`452`, :pr:`462`); and :meth:`.IPv4._make_data` returned the fragment offset in octets where the wire wants 8-octet units, and read ``data.options`` on a packet that has none @@ -1676,7 +1676,7 @@ Fixed now goes through ``parse_ip_address``, the helper :pr:`539` and :issue:`552` route their own sites through, completing the programme :pr:`481` and :issue:`508` started. Pinning ``version=6`` on the - :class:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route` sites is a further, smaller + :class:`~pcapkit.protocols.internet.ipv6_route.protocol.IPv6_Route` sites is a further, smaller behaviour change: both converted a plain integer through the family-inferring ``ipaddress.ip_address``, so ``ip=[258]`` packed a 4-octet IPv4 address (``0.0.1.2``) inside an IPv6-only header; it now packs the 16-octet ``::102`` (:issue:`540`). @@ -1694,12 +1694,12 @@ Fixed its ``kind=``/``length=`` arguments were rejected with :exc:`.UnknownFieldWarning` and dropped, and ``.pack()`` then raised ``KeyError: 'length'`` from ``port``'s own condition, ``pkt['length'] in (10, 22)``. The cause was one layer up: - :class:`~pcapkit.protocols.schema.transport.tcp.MPTCP`, the base of every Multipath + :class:`~pcapkit.protocols.transport.tcp.schema.MPTCP`, the base of every Multipath TCP subtype schema, declared ``kind`` and ``length`` only under ``typing.TYPE_CHECKING`` rather than as real fields, unlike - :class:`~pcapkit.protocols.schema.transport.tcp.Option`. That dropped + :class:`~pcapkit.protocols.transport.tcp.schema.Option`. That dropped ``kind=``/``length=`` for every ``_make_mptcp_*`` constructor, so - :class:`~pcapkit.protocols.schema.transport.tcp.MPTCP` now declares both for real + :class:`~pcapkit.protocols.transport.tcp.schema.MPTCP` now declares both for real (:issue:`541`). The missing fields broke parsing too: a subtype schema's leading field read the ``kind`` octet itself, an off-by-two in field alignment rather than a wire-format change (a correct sender's octets were always right). Spec-correct @@ -1715,7 +1715,7 @@ Fixed multi-address header holds (:issue:`556`). * further defects :issue:`541` exposed by letting construction reach code that had never run. - :attr:`MPTCP.subtype ` was still + :attr:`MPTCP.subtype ` was still ``typing.TYPE_CHECKING``-only, so ``TCP(options=[(Enum_Option.Multipath_TCP, ...)])`` raised ``AttributeError: ... has no attribute 'subtype'`` for every subtype but ``MP_JOIN``: the convenience constructor reads the schema straight back through @@ -1728,7 +1728,7 @@ Fixed (:issue:`566`). Separately, ``_make_mptcp_capable`` wrote ``length=20 if rkey is None else 32`` where :rfc:`8684` section 3.1 gives 12 and 20, and - :attr:`MPTCPCapable.rkey `'s + :attr:`MPTCPCapable.rkey `'s condition (``pkt['length'] != 32``) dropped the receiver's key for exactly the length the maker used for "key present": a key-absent MP_CAPABLE could not be built, and a key-present one lost its key on the wire. Both, and the guard in @@ -1746,7 +1746,7 @@ Fixed ``checksum`` too, where it used to drop them silently through ``**kwargs``, and picks the length from how many of ``skey``, ``rkey``, ``dl_len`` and ``checksum`` are not ``None``. A field given without the one before it raises :exc:`.ProtocolError`. The - data model :class:`~pcapkit.protocols.data.transport.tcp.MPTCPCapable` gains + data model :class:`~pcapkit.protocols.transport.tcp.data.MPTCPCapable` gains ``dl_len`` and ``checksum``, and ``skey`` becomes ``Optional[int]``: code that constructs it directly must now pass both new fields, and ``to_dict()`` carries the new keys (:issue:`1042`). @@ -1783,7 +1783,7 @@ Fixed but nothing enforced it, so the hard-coded ``Literal[2]`` property and ``info.version`` answered 2 and 3 on the same octets. ``read`` now raises :exc:`.ProtocolError`, degrading the payload to - :class:`~pcapkit.protocols.misc.raw.Raw` through the existing ``beholder`` path with + :class:`~pcapkit.protocols.misc.raw.protocol.Raw` through the existing ``beholder`` path with the reason recorded. **This affects real captures**: :rfc:`3931` ยง4.1.2 puts L2TPv3 on port 1701 too, the port :attr:`.UDP.__proto__` binds, so ``Ethernet:IPv4:UDP:L2TPv2:Raw`` with invented field values becomes @@ -1795,7 +1795,7 @@ Fixed carries **no version nibble at all**, so a v2 parser cannot detect that the datagram is not its own. 115 is a missing *class*, not a missing registration, and stays unbound until an ``L2TPv3`` class exists; no dissector was invented to fill it. - The reasoning is recorded in :mod:`pcapkit.protocols.link.l2tp`, and + The reasoning is recorded in :mod:`pcapkit.protocols.link.l2tp.protocol`, and ``register_protocol_code``'s worked example, which named :class:`.L2TPv2` at 115, names ``L2TPv3`` instead (:issue:`548`). * building any ``MP_JOIN`` option raised @@ -1820,8 +1820,8 @@ Fixed that equals ``0`` and ORs identically. The read path's seed is unchanged: a flagless MP_JOIN is rejected by ``mptcp_data_selector`` before ``_read_mptcp_join`` runs (:issue:`587`). -* the ILNP Nonce option builders in :class:`~pcapkit.protocols.internet.hopopt.HOPOPT` - and :class:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts` sized the option with +* the ILNP Nonce option builders in :class:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT` + and :class:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts` sized the option with ``math.ceil(nonce.bit_length() // 8)``, floor division dressed as a ceiling (``//`` floors and ``math.ceil`` of an ``int`` is a no-op). The nonce is packed by a :class:`.NumberField` whose width *is* the declared ``len``, so an under-declared @@ -1889,10 +1889,10 @@ Fixed :mod:`pcapkit.corekit.fields.numbers`, which is where :pr:`598` then fixed it; the same paragraph sat in ``test_tcp_mptcp_length_arithmetic_unit.py``'s docstring, whose other stale claim was that MP_JOIN "cannot be built through the public - :class:`TCP() ` constructor at all", true only + :class:`TCP() ` constructor at all", true only until :issue:`587`. A callable-length :class:`.NumberField` packs and unpacks both DSS widths now, and wire *absence* was never the obstacle: - :attr:`MPTCPDSS.ssn `, ``dl_len`` + :attr:`MPTCPDSS.ssn `, ``dl_len`` and ``checksum`` have always been :class:`.ConditionalField` on the sibling ``M`` flag. The :class:`.SwitchField` form is kept for the narrower reason the note now gives: :class:`.ConditionalField`'s ``length`` forwards to the wrapped field without @@ -1916,7 +1916,7 @@ Fixed ``RHASH_len`` is a whole number of octets. For an arbitrary ``bit_length()`` the builder emitted an *odd* contents width, which its own reader refused: ``_read_param_solution``'s ``(schema.len - 4) % 2`` guard exists because - :class:`~pcapkit.protocols.schema.internet.hip.SolutionParameter` splits that width + :class:`~pcapkit.protocols.internet.hip.schema.SolutionParameter` splits that width into two equal halves. ``random=0x1`` with ``solution=0xfff`` declared ``len=7`` and raised ``ProtocolError: HIPv2: [ParamNo 321] invalid format`` on input the library had produced. The undersized length was worse: both fields take their width from that @@ -1933,7 +1933,7 @@ Fixed all-zero flags octet (an nmap NULL scan) left ``self._flags`` an ``int``, so a membership test raised ``TypeError: argument of type 'int' is not a container or iterable``, and - :attr:`TCP.connection ` returned an + :attr:`TCP.connection ` returned an ``int`` where it annotates :class:`~pcapkit.const.tcp.flags.Flags`. Any flag masked it, which is how it survived 100% statement and branch coverage. The seed is ``Flags(0)``, as :pr:`597` already did for the sibling accumulator in ``make``; @@ -1967,8 +1967,8 @@ Fixed existed until :pr:`614` (:issue:`618`). * the HIP ``PUZZLE`` and ``SOLUTION`` builders derived wire-format values from the payload value instead of the data model, and each was wrong. **This changes the** - :class:`~pcapkit.protocols.data.internet.hip.PuzzleParameter` **and** - :class:`~pcapkit.protocols.data.internet.hip.SolutionParameter` **data models and the + :class:`~pcapkit.protocols.internet.hip.data.PuzzleParameter` **and** + :class:`~pcapkit.protocols.internet.hip.data.SolutionParameter` **data models and the octets both parameters emit.** The width of ``Random #I`` and ``Puzzle solution #J`` came from ``int.bit_length()`` alone, so every leading zero octet was dropped on re-serialisation: a ``SOLUTION`` read with ``Length = 20`` rebuilt as ``Length = 6``, @@ -1999,8 +1999,8 @@ Fixed raise :exc:`.ProtocolError` (``(BaseError, ValueError)``, so a caller written around the bare exception still catches it). Migration: ``SolutionParameter.lifetime`` is now ``reserved`` and an ``int`` rather than a ``timedelta``; - :class:`~pcapkit.protocols.data.internet.hip.PuzzleParameter` and - :class:`~pcapkit.protocols.data.internet.hip.SolutionParameter` gained a required + :class:`~pcapkit.protocols.internet.hip.data.PuzzleParameter` and + :class:`~pcapkit.protocols.internet.hip.data.SolutionParameter` gained a required ``rhash_len``; and ``_make_param_solution`` no longer takes ``lifetime=``. Each was reachable end to end only once :issue:`608` was fixed in :pr:`629`, which removed the parity guard that had failed these rebuilds loudly; the round trip then stopped @@ -2027,11 +2027,11 @@ Fixed and one ``parameter_padding_len`` (:issue:`651`). ``LOCATOR_SET`` kept the old expression because defects there cancelled exactly: its padding callback never received the parameter's ``len`` (the nested - :class:`~pcapkit.protocols.schema.internet.hip.Locator` schemas share a packet context + :class:`~pcapkit.protocols.internet.hip.schema.Locator` schemas share a packet context whose own ``len`` shadowed it, so it saw 4 for an IPv6 locator), and the parameter's ``len`` was written in 4-octet units where the RFC's ``Length`` is a byte count; the result, ``4 + 24n + 4``, equalled the RFC total ``24n + 8``. :issue:`679` later fixed - both sites. :class:`~pcapkit.protocols.schema.internet.hip.EncryptedParameter`'s + both sites. :class:`~pcapkit.protocols.internet.hip.schema.EncryptedParameter`'s ``data`` length callback is fixed in the same change: it subtracted the sixteen ``iv`` octets but not the four ``reserved`` ones, which cancelled the padding's four at ``Length % 8`` in ``{0, 5, 6, 7}``, so correcting the padding alone would have made @@ -2070,11 +2070,11 @@ Fixed ``connection``. The seed is guarded because :class:`.FrameType.Flags` declares no members and, from Python 3.11, a memberless ``enum.Flag`` subclass refuses ``Flags(0)``, so the frame schemas that inherit it - (:class:`~pcapkit.protocols.schema.application.httpv2.UnassignedFrame`, - :class:`~pcapkit.protocols.schema.application.httpv2.PriorityFrame`, - :class:`~pcapkit.protocols.schema.application.httpv2.RSTStreamFrame`, - :class:`~pcapkit.protocols.schema.application.httpv2.GoawayFrame`, - :class:`~pcapkit.protocols.schema.application.httpv2.WindowUpdateFrame`) keep the + (:class:`~pcapkit.protocols.application.httpv2.schema.UnassignedFrame`, + :class:`~pcapkit.protocols.application.httpv2.schema.PriorityFrame`, + :class:`~pcapkit.protocols.application.httpv2.schema.RSTStreamFrame`, + :class:`~pcapkit.protocols.application.httpv2.schema.GoawayFrame`, + :class:`~pcapkit.protocols.application.httpv2.schema.WindowUpdateFrame`) keep the plain ``int``, which nothing observes since each passes ``flags=None``. A DATA round trip is **still** lossy for an unrelated reason found while measuring: payload length callbacks are mis-parenthesised, so an unpadded ``DATA``, ``HEADERS`` or @@ -2119,7 +2119,7 @@ Fixed ``self.packet.payload``. The inherited ``packet`` splits a protocol at ``self.length`` octets of header and takes the rest as payload, which holds only for a header followed by its payload; - :attr:`PCAPNG.length ` is the *Block + :attr:`PCAPNG.length ` is the *Block Total Length*, so the split consumed the whole block as header (``len(frame.packet.header) == 348`` on a 348-octet block), and a block's trailer (option list, repeated total length) means no ``length`` could make it right. The fix @@ -2161,7 +2161,7 @@ Fixed absent, so pcapkit was *emitting* malformed HTTP/2; a ``make`` -> parse -> ``make`` cycle of a non-empty unpadded payload now closes byte-for-byte. The only other conditional of this shape, - :attr:`TSOption.remainder ` + :attr:`TSOption.remainder ` in ``pcapkit/protocols/schema/internet/ipv4.py``, is correct: its ``else 0`` is intentional because ``ts_data`` consumes the whole option data area in that arm. The new tests use non-zero padding rather than the zeros :rfc:`9113#section-6.1` tells a @@ -2180,10 +2180,10 @@ Fixed faithful test only because :meth:`._EnumRegistry.__missing__` returns a miss without recording it, so parsing an unknown code cannot make the next legitimate registration warn. The code-keyed parser registrars (on :class:`.ProtocolBase`, - :class:`.Link`, :class:`.Internet`, :class:`~pcapkit.protocols.misc.pcap.frame.Frame`, - :class:`~pcapkit.protocols.misc.pcapng.PCAPNG`, + :class:`.Link`, :class:`.Internet`, :class:`~pcapkit.protocols.misc.pcap.frame.protocol.Frame`, + :class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG`, :class:`~pcapkit.protocols.transport.transport.Transport` and - :class:`~pcapkit.protocols.transport.sctp.SCTP`) now name the displaced entry and its + :class:`~pcapkit.protocols.transport.sctp.protocol.SCTP`) now name the displaced entry and its replacement, where they reported only that something was overwritten. Their firing condition is harmonised onto the narrower guard :pr:`681` gave ``register_protocol`` (:issue:`718`, :pr:`726`) rather than presence alone: that key is derived from the @@ -2196,7 +2196,7 @@ Fixed duplicate, and the reassembly and ESP registrars append to lists with no key, so none of them takes a guard. ``import pcapkit`` emits no :exc:`.RegistryWarning`: none of its registry writes - (:class:`~pcapkit.protocols.schema.internet.hip.R1CounterParameter`'s second code, + (:class:`~pcapkit.protocols.internet.hip.schema.R1CounterParameter`'s second code, from :issue:`690`, among them) lands on a key already present (:issue:`692`). * every EOF-truncated PCAP-NG file raised a bare ``ValueError`` out of :class:`.Extractor`, losing the whole extraction rather than the one truncated block. @@ -2228,7 +2228,7 @@ Fixed reports a displaced option schema as a :exc:`.RegistryWarning` naming every namespace the ``ns='opt'`` fan-out displaced something in, tested by membership (subscripting the per-namespace ``defaultdict`` would insert - :class:`~pcapkit.protocols.schema.misc.pcapng.UnknownOption` for a code nobody + :class:`~pcapkit.protocols.misc.pcapng.schema.UnknownOption` for a code nobody registered). The condition is identity-based like the parser registrars and :pr:`681`'s guard for ``register_protocol`` (:issue:`718`, :pr:`726`); a namespace the call itself creates is exempt. Flooring the decryption-secrets payloads that read @@ -2243,13 +2243,13 @@ Fixed :rfc:`7401#section-5.2.3` requires 16, and ``LOCATOR_SET`` declared its ``Length`` in 4-octet units where :rfc:`7401#section-5.2.1`'s ``Length`` is a byte count -- independent defects, fixed together because the evidence for either needed the other - out of the way. :class:`~pcapkit.protocols.schema.internet.hip.R1CounterParameter`'s + out of the way. :class:`~pcapkit.protocols.internet.hip.schema.R1CounterParameter`'s ``counter`` was a :class:`.UInt32Field` where the RFC states the width twice, "8 bytes" in the diagram and "a 64-bit unsigned integer" in prose; both versions whose *packing* reaches the class, ``R1_Counter`` (128) and ``R1_COUNTER`` (129), packed a 12-octet record at ``4 (mod 8)``. It is a :class:`.UInt64Field` now and the record is 16 octets (:issue:`672`). - :class:`~pcapkit.protocols.schema.internet.hip.LocatorSetParameter`'s ``Length`` was + :class:`~pcapkit.protocols.internet.hip.schema.LocatorSetParameter`'s ``Length`` was ``sum(Locator.len)``, in the 4-octet units :rfc:`8046#section-4` gives ``Locator Length``; a set of *n* plain IPv6 locators declared ``4n`` octets against ``24n`` present, and :meth:`.Schema.unpack` handed the nested :class:`.ListField` only @@ -2257,7 +2257,7 @@ Fixed the rest unconsumed. :meth:`.HIP._make_param_locator_set` now sums ``8 + Locator.len * 4`` per locator (:issue:`679`). Another defect in the same parameter's padding, which :issue:`651` left alone because it cancelled this one, is - fixed alongside: the nested :class:`~pcapkit.protocols.schema.internet.hip.Locator` + fixed alongside: the nested :class:`~pcapkit.protocols.internet.hip.schema.Locator` schemas share the parameter's packet context and pack their own ``len`` over it, so ``padding``, evaluated after the list, saw 4 rather than the real length. A new ``locator_set_len_callback`` snapshots ``Length`` under a private key before any @@ -2267,11 +2267,11 @@ Fixed are ``test_hip_r1_counter_width_unit.py`` and ``test_hip_locator_set_length_unit.py``. The ``hip-parameter/R1_Counter`` ``EXPECTED_FAILURES`` entry (code 128 registered no schema of its own, since - :class:`~pcapkit.protocols.schema.internet.hip.R1CounterParameter` declared only + :class:`~pcapkit.protocols.internet.hip.schema.R1CounterParameter` declared only ``code=129``) was deleted once that registry defect was fixed as :issue:`690`. ``HIP_COPIES`` dropped to one as :issue:`689`, once :issue:`672` and :issue:`679` left it routing around nothing. -* :class:`httpv1.HTTP ` raised a bare +* :class:`httpv1.HTTP ` raised a bare exception for any payload that is not an HTTP/1 message, at these sites: the header/body split in ``read``, the header's CRLF split and the start-line split in ``_read_http_header``, and ``item[1]`` on a field line with no colon. @@ -2279,20 +2279,20 @@ Fixed HTTP/1 attempt aborted the guess and the HTTP/2 arm below was dead code for each of those inputs. Each site now raises :exc:`.ProtocolError`, which each method's ``Raises:`` section documented, and a test pins the invariant (nothing escapes - :class:`httpv1.HTTP ` that is not a + :class:`httpv1.HTTP ` that is not a :exc:`.ProtocolError`), so any further bare-raising site would fail there. An obs-fold continuation line [:rfc:`9112#section-5.2`] is legal HTTP/1 and is now unfolded, the RFC's remedy, rather than read as a field of its own (with no colon it raised that ``IndexError``; with one it parsed into a spurious extra field). Reaching the HTTP/2 arm exposed a payload under nine octets to - :class:`httpv2.HTTP `, where it usually + :class:`httpv2.HTTP `, where it usually fails inside the schema with a bare ``struct.error`` (not a ``ValueError``, :exc:`.ProtocolError` or pcapkit :exc:`.StructError`, so uncatchable); ``read`` converts it and ``_guess_version`` suppresses it on the last arm only, since an arm that is not last hands the payload onward when it swallows. Separately, :attr:`.PayloadField.protocol` looked a ``str`` up in ``__proto__`` as given while the registry is keyed on the upper-cased class name, so a name not already upper-case - resolved to ``None`` and yielded :class:`~pcapkit.protocols.misc.raw.Raw`; it now + resolved to ``None`` and yielded :class:`~pcapkit.protocols.misc.raw.protocol.Raw`; it now folds case and warns with :exc:`.RegistryWarning` for a genuinely unregistered name, and ``__init__`` assigns through that property instead of writing ``_protocol`` past it (:issue:`787`, :pr:`789`). @@ -2310,7 +2310,7 @@ Fixed ``examples/generators/pcapng.py``'s ``_journal_entry`` cited a bare line number for the defect its alignment workaround avoids and mis-attributed the fix; it now names :issue:`678`'s ``not line.strip(b'\x00')`` guard and the mechanism (:issue:`791`). -* :meth:`.httpv2.HTTP.read` tested only the 24-bit declared length off the wire +* :meth:`.httpv2.protocol.HTTP.read` tested only the 24-bit declared length off the wire (``schema.length < 9``), never how many octets the buffer held, so a frame backed by far fewer real octets than declared parsed and reported the declared, attacker-controlled length. Sweeping the declared length against a four-octet buffer @@ -2374,10 +2374,10 @@ Fixed safe heuristic, since a ``type <= 9`` guess misfires on binary HTTP/1 bodies). Protochain over the sample captures is unchanged (:issue:`800`). * :attr:`.TCP.__proto__` bound - :class:`httpv1.HTTP ` directly for ports 80 + :class:`httpv1.HTTP ` directly for ports 80 and 8080, so a segment on either port was HTTP/1 by assertion of the port alone; both versions share those ports, so the payload has to decide. Repointed to the generic - :class:`pcapkit.protocols.application.http.HTTP` proxy, whose identification became + :class:`pcapkit.protocols.application.http.protocol.HTTP` proxy, whose identification became positive only once :issue:`800` and :pr:`814` landed, which is why this waited. ``udp.py`` already bound the proxy for both ports; this removes the asymmetry its docstring and ``docs/source/contributing/pep.rst`` documented as an open request. Over @@ -2386,7 +2386,7 @@ Fixed ``Ethernet:IPv4:TCP:HTTP/2``. Not labelled breaking, but not free: ``TCP:80/8080`` traffic that is neither valid HTTP/1 nor preface-carrying is now exposed to the fall-through arm, where the direct ``httpv1`` binding left it - :class:`~pcapkit.protocols.misc.raw.Raw` regardless; a caller depending on that is the + :class:`~pcapkit.protocols.misc.raw.protocol.Raw` regardless; a caller depending on that is the one who would notice (:issue:`682`). * **a breaking change to** more bespoke registries: step 2 of :issue:`860`, ahead of :class:`~pcapkit.const.reg.apptype.apptype.AppType` (:pr:`874`, above), @@ -2435,12 +2435,12 @@ Fixed the reason), since neither of :class:`~pcapkit.const.pcapng.option_type.OptionType`'s paths gets both pickling and correct rendering right at once (:pr:`869`). * ``register`` on :class:`.ProtocolBase`, - :class:`~pcapkit.protocols.misc.pcap.frame.Frame`, - :class:`~pcapkit.protocols.misc.pcapng.PCAPNG`, - :class:`~pcapkit.protocols.transport.sctp.SCTP`, :class:`.Link`, :class:`.Internet` + :class:`~pcapkit.protocols.misc.pcap.frame.protocol.Frame`, + :class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG`, + :class:`~pcapkit.protocols.transport.sctp.protocol.SCTP`, :class:`.Link`, :class:`.Internet` and the concrete :class:`~pcapkit.protocols.transport.transport.Transport` subclasses - (:class:`~pcapkit.protocols.transport.tcp.TCP`, - :class:`~pcapkit.protocols.transport.udp.UDP`) now raises :exc:`.RegistryError` for a + (:class:`~pcapkit.protocols.transport.tcp.protocol.TCP`, + :class:`~pcapkit.protocols.transport.udp.protocol.UDP`) now raises :exc:`.RegistryError` for a non-class argument, where it raised a bare ``TypeError`` ("issubclass() arg 1 must be a class") from inside ``abc``. Each guard gains an explicit ``isinstance(protocol, type)`` test ahead of its ``issubclass``, after the @@ -2461,7 +2461,7 @@ Fixed ``TypeError`` from ``abc`` did. That is the wrong-class path's existing behaviour, so the fix makes the two consistent rather than introducing something new. Follows the same fix for the foundation registrars (:issue:`1021`) (:issue:`1026`). -* :class:`~pcapkit.protocols.misc.pcapng.PCAPNG`'s ``ns_dnsname``, ``ns_dnsIP4addr`` and +* :class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG`'s ``ns_dnsname``, ``ns_dnsIP4addr`` and ``ns_dnsIP6addr`` scope guards, on both the read and the make side, now say the option "must be in Name Resolution Block", which is the block they check; they used to name the systemd(1) Journal Export Block, with a literal ``:manpage:`` role in the text. @@ -2473,7 +2473,7 @@ Fixed ``[if_rxspeed]`` rather than ``[if_txspeed]``, and ``_read_option_epb_queue``'s length guard says ``[epb_queue]`` rather than ``[epb_packetid]``. Only message text changes; the exception and warning types are unchanged (:issue:`1038`). -* :class:`httpv1.HTTP ` refused every HTTP/1 +* :class:`httpv1.HTTP ` refused every HTTP/1 message with no header fields, which [:rfc:`9112#section-2.1`] allows (``*( field-line CRLF )``): ``b'GET / HTTP/1.0\r\n\r\n'`` raised ``ProtocolError: HTTP: invalid format``, because ``_read_http_header`` treated a @@ -2511,7 +2511,7 @@ Fixed ``TRANSPORT_FORMAT_LIST`` were built and parsed in a HIPv1 packet; at version 1 the reader and the maker now raise :exc:`.ProtocolError`, as ``R1_Counter`` and ``HIP_TRANSFORM`` already do on a version mismatch (:issue:`1133`). -* the PCAP :class:`~pcapkit.protocols.misc.pcap.header.Header` could not rebuild itself. +* the PCAP :class:`~pcapkit.protocols.misc.pcap.header.protocol.Header` could not rebuild itself. ``_make_magic``'s explicit-endian branch ignored ``nanosecond`` (:issue:`1096`), and ``_make_data`` returned a ``magic_number`` that ``make()`` does not take -- one of the keys the :issue:`617` entry above reports -- so ``from_data`` dropped it with an @@ -2526,7 +2526,7 @@ Fixed and overrides ``byteorder``, and equal flags still raise :exc:`.EndianError` (:issue:`1144`). * TCP's NS flag was written by ``make()`` but never parsed: it had been commented out - of :class:`~pcapkit.protocols.data.transport.tcp.Flags`, the reader and + of :class:`~pcapkit.protocols.transport.tcp.data.Flags`, the reader and ``_make_data``, with no reason recorded. Per the owner's ruling it is exposed rather than removed, so ``info.flags.ns`` exists and ``from_data`` keeps the bit (:issue:`1098`). @@ -2552,12 +2552,12 @@ Fixed TCP's Quick-Start Response reader read one octet past the option, and its maker produced a negative rate code below 40 kbps; such a rate now rounds down to zero, which :rfc:`4782` permits (:issue:`1119`). -* :class:`~pcapkit.protocols.link.ethernet.Ethernet`, - :class:`~pcapkit.protocols.link.arp.ARP` and - :class:`~pcapkit.protocols.misc.pcapng.PCAPNG` packed MAC addresses as ASCII hex text. +* :class:`~pcapkit.protocols.link.ethernet.protocol.Ethernet`, + :class:`~pcapkit.protocols.link.arp.protocol.ARP` and + :class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG` packed MAC addresses as ASCII hex text. ``Ethernet._make_mac_addr`` returned the separator-stripped hex string and ``BytesField(length=6)`` truncated it, so - :class:`Ethernet() ` put ``303030303030`` on + :class:`Ethernet() ` put ``303030303030`` on the wire for an all-zero address (:issue:`1123`). ``ARP._make_addr_resolve``, ``PCAPNG._make_mac_addr`` and ``_make_eui_addr`` did the same; all now decode the hex to octets, and ``from_data`` rebuilds each byte for byte (:issue:`1134`). @@ -2597,9 +2597,9 @@ Fixed measured sample captures rebuilds its header octets, and ``options-*.pcap`` regenerate unchanged (:issue:`1151`). * **a breaking change to** ``from_data`` on a capture truncated by snaplen: - :class:`~pcapkit.protocols.internet.ipv4.IPv4`, - :class:`~pcapkit.protocols.internet.ipv6.IPv6` and - :class:`~pcapkit.protocols.transport.udp.UDP` rebuilt their length field from the + :class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4`, + :class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6` and + :class:`~pcapkit.protocols.transport.udp.protocol.UDP` rebuilt their length field from the payload at hand, writing the recorded length, so ``big_endian.pcap`` frame 3 came back as ``45000052`` where ``450004a2`` was on the wire. ``_make_data`` now passes the parsed length through to ``make()``'s new ``total_length`` (IPv4, UDP) or @@ -2612,16 +2612,16 @@ Fixed 8 invented UDP octets (:issue:`1167`). Every ``_import_next_layer`` now goes through one guard: no captured octets gives :class:`~pcapkit.protocols.misc.null.NoPayload`, and fewer than the next layer's ``__length_hint__`` gives - :class:`~pcapkit.protocols.misc.raw.Raw` unless the parsed header fits anyway, as a + :class:`~pcapkit.protocols.misc.raw.protocol.Raw` unless the parsed header fits anyway, as a 12-octet L2TPv2 ZLB does. A header-only IPv6 packet is ``IPv6`` rather than ``IPv6:UDP:Raw``, and frame 3 is ``Ethernet:Raw``, rebuilt byte for byte (:issue:`1170`). The guard needed honest hints, so - :class:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route` (4), - :class:`~pcapkit.protocols.internet.mh.MH` (6), - :class:`~pcapkit.protocols.internet.hopopt.HOPOPT` and - :class:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts` (2) now hint their 8-octet + :class:`~pcapkit.protocols.internet.ipv6_route.protocol.IPv6_Route` (4), + :class:`~pcapkit.protocols.internet.mh.protocol.MH` (6), + :class:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT` and + :class:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts` (2) now hint their 8-octet minimum header (:issue:`1173`), and so does the - :class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext` fallback, which hinted 2 + :class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext` fallback, which hinted 2 (:issue:`1178`). * **a breaking change to** :class:`.L2TPv2`, against :rfc:`2661` section 3.1. :class:`~pcapkit.const.l2tp.type.Type` was inverted; it is now ``Data = 0`` and @@ -2646,14 +2646,14 @@ Fixed :attr:`.HIP.alias` read ``_info`` before ``read`` had set it, which also broke a standalone HIP parse and ``HIP.from_data`` (:issue:`1184`), and the MPL option's maker called ``bit_length()`` on the ``IPv6Address`` seed of an S=0 option. MPL in - :class:`~pcapkit.protocols.internet.hopopt.HOPOPT` and - :class:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts` now takes ``S`` from the + :class:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT` and + :class:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts` now takes ``S`` from the parsed option or a new ``seed_type`` keyword, and a missing or oversized seed raises :exc:`.ProtocolError` (:issue:`1185`). With both fixed, every IPv6 frame of the ``options-*.pcap`` captures rebuilds byte for byte. * **a breaking change to** the SMF_DPD option's maker in - :class:`~pcapkit.protocols.internet.hopopt.HOPOPT` and - :class:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts`: it overwrote the parsed DPD + :class:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT` and + :class:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts`: it overwrote the parsed DPD mode, so H-DPD rebuilt as I-DPD, and inferred the TaggerID type from the Tagger ID's length, so a 4-octet ``DEFAULT`` Tagger ID rebuilt as IPv4. Both now come from the parsed option, or from ``mode`` and a new ``tid_type`` keyword. A Tagger ID that does @@ -2664,18 +2664,18 @@ Fixed * a :class:`.ForwardMatchField` that read short at the end of the stream rewound by its declared width, not by the octets it read, so the fields after it re-read the preceding octet. An SMF_DPD option in the last two octets of a - :class:`~pcapkit.protocols.internet.hopopt.HOPOPT` or - :class:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts` header was re-read from the + :class:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT` or + :class:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts` header was re-read from the padding and raised a bare ``TypeError``; it now raises :exc:`.FieldValueError`, as CALIPSO and MPL do. A full read rewinds as before (:issue:`1195`). -* :class:`HIP() ` with no parameters wrote Header +* :class:`HIP() ` with no parameters wrote Header Length 0, below :rfc:`7401` section 5.1's minimum of 4 for the two HITs, so it failed to read back with :exc:`.ProtocolError`; it now writes 4. ``read`` names a Header Length below 4 in a new ``invalid header length`` message. Lengths 0 to 3 already raised :exc:`.ProtocolError`, so only the message changes (:issue:`1189`). * the RPL option, type ``0x23``, raised ``AttributeError`` in - :class:`~pcapkit.protocols.internet.hopopt.HOPOPT` and - :class:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts` (:issue:`1196`, :pr:`1198`). + :class:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT` and + :class:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts` (:issue:`1196`, :pr:`1198`). The test that an option of any type in the last two octets of the header fails in-library no longer skips it; test-only (:issue:`1771`, :pr:`1776`). * **a breaking change to** the RPL option: it keeps its reserved flag bits on rebuild @@ -2709,8 +2709,8 @@ Fixed * IPv4 option areas, route slots, timestamps and reserved bits (:pr:`1344`); the TS option's slots beyond the pointer (:issue:`1349`, :pr:`1390`); TS and SEC options byte for byte (:pr:`1399`). - * IPv6 core headers (:pr:`1307`); :class:`~pcapkit.protocols.internet.hopopt.HOPOPT` - and :class:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts` option areas + * IPv6 core headers (:pr:`1307`); :class:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT` + and :class:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts` option areas (:pr:`1310`); a CALIPSO option's trailing pad (:issue:`1403`, :pr:`1407`), and its ``make()`` writing a corrupt length on overflow (:issue:`1408`, :pr:`1409`); an extension header parsed with ``extension=True`` (:issue:`1446`, :pr:`1449`); RPL @@ -2759,7 +2759,7 @@ Fixed (:issue:`1434`, :pr:`1440`), a jumbogram :rfc:`2675` calls an error is rejected (:issue:`1687`, :pr:`1713`), and so is a header whose Version is not 6 (:issue:`1680`, :pr:`1723`). -* the warnings of a next layer replaced by :class:`~pcapkit.protocols.misc.raw.Raw` are +* the warnings of a next layer replaced by :class:`~pcapkit.protocols.misc.raw.protocol.Raw` are dropped (:issue:`1580`, :pr:`1588`). * IPv6-Route's data-type readers name the routing type in their :exc:`.ProtocolError`, where each message read ``[TypeNo ]`` @@ -2791,8 +2791,8 @@ Fixed ``from pcapkit.protocols.protocol import *`` binds the module's public class (:issue:`1770`, :pr:`1778`). * the data and schema packages re-export what their submodules list in ``__all__``, - under the prefixes their siblings use: :mod:`pcapkit.protocols.data.link` exports the - L2TP data model as :class:`~pcapkit.protocols.data.link.l2tp.L2TP` and ``L2TP_Flags`` + under the prefixes their siblings use: ``pcapkit.protocols.data.link`` exports the + L2TP data model as :class:`~pcapkit.protocols.link.l2tp.data.L2TP` and ``L2TP_Flags`` (:issue:`1797`, :pr:`1806`), and the Mobility Header models, the HOPOPT and IPv6-Opts ``SMFDPDOption`` and ``QuickStartOption``, PCAP-NG's ``PacketBlock`` and ``PACK_*`` options and HTTP/2's ``Settings`` reach their packages and the aggregators @@ -2848,7 +2848,7 @@ Fixed * IPX dissects its payload from a registry of its own, :attr:`.IPX.__proto__`, keyed by IPX Packet Type, where it looked the Packet Type up as an IP protocol number, so a type 17 (NCP) payload parsed as ``IPX:UDP`` and type 4 as ``IPX:IPv4``. No IPX-native - protocol ships, so the payload is :class:`~pcapkit.protocols.misc.raw.Raw` unless one + protocol ships, so the payload is :class:`~pcapkit.protocols.misc.raw.protocol.Raw` unless one is registered (:issue:`2169`, :pr:`2187`). * HIP's ``ECHO_RESPONSE_UNSIGNED`` maker builds an ``EchoResponseUnsignedParameter`` schema, where it built the request's; the octets were already right (:issue:`2170`, @@ -2912,7 +2912,7 @@ Fixed ignores them. A new ``ProtocolBase.__own_make_keywords__`` marker, read per class like the ``__keywords__`` opt-out, keeps a base's parameters out of the allowlist once a subclass overrides ``make``, and - :class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext` sets it, so + :class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext` sets it, so ``IPv6_Route(len=99)`` is refused where it built the same octets as ``IPv6_Route()`` and a misspelling was steered to the dead keyword (:issue:`2286`, :pr:`2358`). @@ -2956,7 +2956,7 @@ Fixed what a parse found. * ESP's errors read in the house ``ESP: : ... {value!r}`` form: the messages raised by the cipher and integrity lookups, by - :class:`.esp.SecurityAssociation`'s SPI, destination, AEAD, ICV, key-splitting, + :class:`.esp.protocol.SecurityAssociation`'s SPI, destination, AEAD, ICV, key-splitting, decryption and encryption checks, by the context registrar and by ``make`` all carry the prefix and quote the offending value, where none carried an ``ESP:`` prefix and most printed the value bare (:issue:`2297`, :pr:`2366`). @@ -2971,12 +2971,12 @@ Fixed drop their trailing full stop, with the block-placement guard naming the block type through the ``BlockType`` registry rather than printing the raw number ``_type`` holds while a block is being made (:issue:`2301`, :pr:`2398`). -* :class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext`'s version gate reads +* :class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext`'s version gate reads ``invalid version: must be 6, not {version!r}``, in the house form and quoting the rejected value, where its bespoke tail read ``only valid for IPv6, got version=4`` -- naming the version it requires in prose rather than as the number it compares against (:issue:`2302`, :pr:`2397`). -* a trial parse kept as :class:`~pcapkit.protocols.misc.raw.Raw` because it raised +* a trial parse kept as :class:`~pcapkit.protocols.misc.raw.protocol.Raw` because it raised no longer replays its warnings: the holding context honours its ``discard`` on an exception exit too, and the next-layer reader discards a raising trial's warnings under ``beholder``, so an Ethernet frame cut inside its IPv4 header stops warning @@ -3823,11 +3823,11 @@ Fixed trusts ``committed_captures()`` for the tracked set. A hardcoded literal that happens to match the tracked names still passes; the test catches a set that is wrong when it runs (:issue:`708`). -* ``pcapkit.all.__all__`` listed :class:`~pcapkit.protocols.application.ospf.OSPF`, +* ``pcapkit.all.__all__`` listed :class:`~pcapkit.protocols.application.ospf.protocol.OSPF`, :class:`.RARP` and :class:`.DRARP` on its Link Layer line after :issue:`719` moved them (:issue:`1124`), and omitted names its packages export, among them - :class:`~pcapkit.protocols.internet.esp.ESP`, ``HTTPv1``, ``HTTPv2``, - :class:`~pcapkit.protocols.misc.pcapng.PCAPNG` and :class:`.EnumRegistry`, so + :class:`~pcapkit.protocols.internet.esp.protocol.ESP`, ``HTTPv1``, ``HTTPv2``, + :class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG` and :class:`.EnumRegistry`, so ``from pcapkit.all import *`` did not bind them. :mod:`pcapkit.utilities` stays unlisted deliberately, so generic helpers such as ``warn`` do not arrive through ``import *`` (:issue:`1136`). @@ -3886,7 +3886,7 @@ Fixed classes link as ``Raises:`` entries do (:issue:`2094`, :pr:`2096`). ``conf.py`` resolves a decorated function's overloads and qualifies a third-party class whose bare name collides (:issue:`1917`, :issue:`1918`, :pr:`1929`). The ``versionchanged`` - directives on :class:`.Info` iteration and :class:`~pcapkit.protocols.misc.raw.Raw` + directives on :class:`.Info` iteration and :class:`~pcapkit.protocols.misc.raw.protocol.Raw` name ``1.3.1.post8``, the release that shipped their change (:issue:`1933`, :pr:`1934`). * the Conda release legs: Create Release's Anaconda completeness check counts diff --git a/docs/source/conf.py b/docs/source/conf.py index 6b41e86701..cc304f50d2 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -53,7 +53,7 @@ import pcapkit from pcapkit.corekit.infoclass import Info from pcapkit.corekit.sentinels import NO_VALUE -from pcapkit.protocols.schema.schema import Schema +from pcapkit.protocols.schema import Schema if TYPE_CHECKING: from types import FunctionType, ModuleType @@ -122,9 +122,9 @@ # These are deliberately opt-in per site rather than an automatic ``#NNN`` rule, # because no digit-keyed pattern can tell a citation from a packet-diagram label: # ``#\d{3}`` misses every two- and four-digit number, while ``#\d+`` catches the -# one-digit RFC diagram labels in ``pcapkit/protocols/internet/hip.py``, -# ``pcapkit/protocols/transport/sctp.py`` and -# ``pcapkit/protocols/schema/internet/hip.py`` -- ``DH GROUP ID #1``, +# one-digit RFC diagram labels in ``pcapkit/protocols/internet/hip/protocol.py``, +# ``pcapkit/protocols/transport/sctp/protocol.py`` and +# ``pcapkit/protocols/internet/hip/schema.py`` -- ``DH GROUP ID #1``, # ``Gap Ack Block #1`` and the like -- which are not references to anything. A role # nobody writes cannot corrupt them. # @@ -446,7 +446,7 @@ def bind_guarded_names(mock_imports: 'List[str]', module: 'ModuleType') -> None: :exc:`NameError` for it and the schema class signatures fell back to the bare ``_VT``. The Python domain then found both :data:`pcapkit.corekit.multidict._VT` and - :data:`pcapkit.protocols.schema.schema._VT` for it, warned, and linked the + :data:`pcapkit.protocols.schema._VT` for it, warned, and linked the first, which is the wrong one. Binding what the library recorded restores what the releases before 3.14 did. diff --git a/docs/source/contributing/conventions/const-vendor-pairing.rst b/docs/source/contributing/conventions/const-vendor-pairing.rst index f9d6160d40..93f8c1fad9 100644 --- a/docs/source/contributing/conventions/const-vendor-pairing.rst +++ b/docs/source/contributing/conventions/const-vendor-pairing.rst @@ -76,7 +76,7 @@ predated the crawler and had drifted from it in the ways cross-review of IANA counterpart and no reference anywhere in the codebase (IANA leaves 0 inside its 0-19 ``Unassigned`` band, unnamed); it is dropped, and value 0 now resolves to ``Unassigned`` like the rest of that band. - :class:`~pcapkit.protocols.application.ssl.SSL` never checked this member + :class:`~pcapkit.protocols.application.ssl.protocol.SSL` never checked this member by name -- its wire-type allowlist already excluded value 0 by construction -- so the sentinel's removal is behaviourally a no-op there too. * the committed ``HandshakeType`` cited RFC 5246, 6066 and 4680 for several diff --git a/docs/source/contributing/conventions/extension-header-subclassing.rst b/docs/source/contributing/conventions/extension-header-subclassing.rst index b870570f27..cdb9ffbbc2 100644 --- a/docs/source/contributing/conventions/extension-header-subclassing.rst +++ b/docs/source/contributing/conventions/extension-header-subclassing.rst @@ -4,17 +4,17 @@ Extension-Header Base Classes ----------------------------- Every IPv6 extension header in this package subclasses -:class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext`. Some name a **second** base +:class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext`. Some name a **second** base as well, and which ones do is a ruling rather than an accident. The owner ruled, in -review of the rename that made :class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext` the +review of the rename that made :class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext` the shared base (:issue:`917`), that a header usable *only* as an extension header inherits -:class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext` and nothing else -- -:class:`~pcapkit.protocols.internet.ipv6_frag.IPv6_Frag` being the example -- while one +:class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext` and nothing else -- +:class:`~pcapkit.protocols.internet.ipv6_frag.protocol.IPv6_Frag` being the example -- while one that is usable as a standalone protocol in its own right inherits both -:class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext` and +:class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext` and :class:`~pcapkit.protocols.internet.internet.Internet` (or -:class:`~pcapkit.protocols.internet.ipsec.IPsec`), as -:class:`~pcapkit.protocols.internet.esp.ESP` does. +:class:`~pcapkit.protocols.internet.ipsec.protocol.IPsec`), as +:class:`~pcapkit.protocols.internet.esp.protocol.ESP` does. The family as it stands: @@ -25,26 +25,26 @@ The family as it stands: * - Header - Bases - Classification - * - :class:`~pcapkit.protocols.internet.hopopt.HOPOPT`, - :class:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route`, - :class:`~pcapkit.protocols.internet.ipv6_frag.IPv6_Frag`, - :class:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts`, - :class:`~pcapkit.protocols.internet.mh.MH` - - :class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext` + * - :class:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT`, + :class:`~pcapkit.protocols.internet.ipv6_route.protocol.IPv6_Route`, + :class:`~pcapkit.protocols.internet.ipv6_frag.protocol.IPv6_Frag`, + :class:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts`, + :class:`~pcapkit.protocols.internet.mh.protocol.MH` + - :class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext` - extension-header only - * - :class:`~pcapkit.protocols.internet.ah.AH`, - :class:`~pcapkit.protocols.internet.esp.ESP` - - :class:`~pcapkit.protocols.internet.ipsec.IPsec`, - :class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext` + * - :class:`~pcapkit.protocols.internet.ah.protocol.AH`, + :class:`~pcapkit.protocols.internet.esp.protocol.ESP` + - :class:`~pcapkit.protocols.internet.ipsec.protocol.IPsec`, + :class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext` - **also standalone** - * - :class:`~pcapkit.protocols.internet.hip.HIP` - - :class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext`, + * - :class:`~pcapkit.protocols.internet.hip.protocol.HIP` + - :class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext`, :class:`~pcapkit.protocols.internet.internet.Internet` - **also standalone** -:class:`~pcapkit.protocols.internet.ipsec.IPsec` is itself an +:class:`~pcapkit.protocols.internet.ipsec.protocol.IPsec` is itself an :class:`~pcapkit.protocols.internet.internet.Internet` subclass, which is the -parenthetical :class:`~pcapkit.protocols.internet.ipsec.IPsec` alternative in the ruling: +parenthetical :class:`~pcapkit.protocols.internet.ipsec.protocol.IPsec` alternative in the ruling: naming it satisfies the convention, and it is the right second base for a header whose standalone form is an IPsec one. @@ -58,15 +58,15 @@ measurably so: .. code-block:: pycon - >>> from pcapkit.protocols.internet.ipv4 import IPv4 + >>> from pcapkit.protocols.internet.ipv4.protocol import IPv4 >>> from pcapkit.protocols.internet.internet import Internet >>> IPv4.__proto__ is Internet.__proto__ True The protocol-number registry is **one shared object**, so *every* extension header is reachable as an IPv4 payload in this library -- -:class:`~pcapkit.protocols.internet.hopopt.HOPOPT` and -:class:`~pcapkit.protocols.internet.ipv6_frag.IPv6_Frag` included. Registry +:class:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT` and +:class:`~pcapkit.protocols.internet.ipv6_frag.protocol.IPv6_Frag` included. Registry membership therefore says nothing at all about standalone-ness, and a classification derived from it would make every one of them standalone. @@ -81,22 +81,22 @@ The IPv4-Payload Test So the census is read out of the specifications, on the owner's instruction: work through the RFCs to establish, for each defined IPv6 extension header, whether it is extension-header-only or a standalone protocol as well, and decide from that whether it -inherits :class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext` alone or names additional bases. +inherits :class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext` alone or names additional bases. And the limb that decides is **whether a primary source shows the header carried directly as an IPv4 payload**: -* :class:`~pcapkit.protocols.internet.ah.AH` -- :rfc:`4302#section-3.1.1`, *"In the +* :class:`~pcapkit.protocols.internet.ah.protocol.AH` -- :rfc:`4302#section-3.1.1`, *"In the context of IPv4, this calls for placing AH after the IP header"*, with a before-and-after IPv4 diagram. -* :class:`~pcapkit.protocols.internet.esp.ESP` -- :rfc:`4303#section-3.1.1`, the +* :class:`~pcapkit.protocols.internet.esp.protocol.ESP` -- :rfc:`4303#section-3.1.1`, the same sentence and the same diagram for ESP. -* :class:`~pcapkit.protocols.internet.hip.HIP` -- :rfc:`7401#appendix-C.2`, +* :class:`~pcapkit.protocols.internet.hip.protocol.HIP` -- :rfc:`7401#appendix-C.2`, *"IPv4 HIP Packet (I1 Packet)"*, whose worked checksum is over an IPv4 header carrying ``Next Header: 139``. :rfc:`7401#section-5.1` also calls the HIP header *"logically an IPv6 extension header"*, so HIP is genuinely both. -:class:`~pcapkit.protocols.internet.mh.MH` is the instructive failure, because it +:class:`~pcapkit.protocols.internet.mh.protocol.MH` is the instructive failure, because it **is** a protocol in its own right and still does not qualify: :rfc:`6275#section-6.1.1` defines its checksum over a pseudo-header of *"IPv6 header fields"* whose addresses are *"the addresses that appear in the Source and @@ -105,7 +105,7 @@ is no IPv4 variant of that computation -- and the IPv4 equivalent function is no protocol 135 at all, since :rfc:`5944` carries Mobile IPv4 over UDP port 434. ``Shim6`` (140) has the same shape and the same verdict; this package carries no parser class for it, so nothing implements the classification, but a future one inherits -:class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext` alone. +:class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext` alone. .. important:: @@ -115,13 +115,13 @@ class for it, so nothing implements the classification, but a future one inherit review of :issue:`917` and not taken, so MH and ``Shim6`` stay extension-only. A header that is a protocol in its own right but structurally cannot be an IPv4 payload names - :class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext` alone. + :class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext` alone. Explicit Base Declarations ~~~~~~~~~~~~~~~~~~~~~~~~~~ Name the second base **explicitly**, even where it is already in the MRO. -:class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext` derives +:class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext` derives :class:`~pcapkit.protocols.internet.internet.Internet`, so every extension header reaches :class:`~pcapkit.protocols.internet.internet.Internet` transitively and an ``__mro__`` check cannot tell the two groups apart. The declaration is the only place the @@ -140,7 +140,7 @@ held to the convention whether or not anyone remembers this page. ESP's Two Facts ~~~~~~~~~~~~~~~ -Two facts about :class:`~pcapkit.protocols.internet.esp.ESP` coexist, and each is +Two facts about :class:`~pcapkit.protocols.internet.esp.protocol.ESP` coexist, and each is routinely mistaken for a refutation of the other. **It is an extension header.** IANA's *IPv6 Extension Header Types* registry lists @@ -157,14 +157,14 @@ carries the same extension-mode contract as its siblings. **And it terminates the chain walk.** :rfc:`4303` places ESP's Next Header byte inside the *encrypted* trailer, so with no key material there is nothing to continue on: ESP's own data model reports ``next`` as :obj:`None`, and -:meth:`IPv6._decode_next_layer ` +:meth:`IPv6._decode_next_layer ` ends the ordinary way one iteration later -- not because ESP lacks a parser, which it has, but because it cannot hand the walk a successor. The full reasoning, including how ESP's terminal case differs from 253/254's, is written where the code is and is deliberately not restated at length here: see -:meth:`IPv6._import_next_layer ` -and the module docstring of :mod:`pcapkit.protocols.internet.ipv6_ext`. +:meth:`IPv6._import_next_layer ` +and the module docstring of :mod:`pcapkit.protocols.internet.ipv6_ext.protocol`. .. caution:: diff --git a/docs/source/contributing/conventions/index.rst b/docs/source/contributing/conventions/index.rst index b8dcf12c4d..b7fed7ade2 100644 --- a/docs/source/contributing/conventions/index.rst +++ b/docs/source/contributing/conventions/index.rst @@ -19,9 +19,9 @@ House Conventions :meth:`~pcapkit.protocols.protocol.Protocol.__index__` returns; * :ref:`extension-header-subclassing` -- a protocol class hierarchy; * :ref:`protocol-family-grouping` -- how a protocol family's base and members - spell :meth:`~pcapkit.protocols.protocol.Protocol.id`, how a protocol class - is named after its module, and how quietly a next-layer fallback keeps a - refused layer as :class:`~pcapkit.protocols.misc.raw.Raw`; + spell :meth:`~pcapkit.protocols.protocol.Protocol.id`, how a protocol's + package, modules and classes are named, and how quietly a next-layer fallback keeps a + refused layer as :class:`~pcapkit.protocols.misc.raw.protocol.Raw`; * :ref:`protocol-member-order` -- the order of members in a protocol class body; * :ref:`protocol-layer-placement` -- which subpackage a dissector belongs in; * :ref:`process` -- the repository rather than any of its code; diff --git a/docs/source/contributing/conventions/process.rst b/docs/source/contributing/conventions/process.rst index 2f600fe14e..e09283add3 100644 --- a/docs/source/contributing/conventions/process.rst +++ b/docs/source/contributing/conventions/process.rst @@ -304,8 +304,8 @@ carrying it are that kind: :issue:`759` raising one where a single-bit lookup used to return a member; * a public attribute's meaning -- - :issue:`618` swapping :attr:`Frame.len ` - and :attr:`Frame.cap_len ` + :issue:`618` swapping :attr:`Frame.len ` + and :attr:`Frame.cap_len ` between the PCAP and PCAP-NG readers; * a signature or a name a caller writes -- :issue:`806` retyping diff --git a/docs/source/contributing/conventions/protocol-family-grouping.rst b/docs/source/contributing/conventions/protocol-family-grouping.rst index 29bf136682..80fb679879 100644 --- a/docs/source/contributing/conventions/protocol-family-grouping.rst +++ b/docs/source/contributing/conventions/protocol-family-grouping.rst @@ -17,36 +17,36 @@ holds the ruling. The member list takes either of these forms: -* **Members only.** :meth:`IP.id() ` is - ``('IPv4', 'IPv6')``; :class:`~pcapkit.protocols.internet.ah.AH` and - :class:`~pcapkit.protocols.internet.esp.ESP` are not in it, since they belong to - the separate abstract :class:`~pcapkit.protocols.internet.ipsec.IPsec`, whose - :meth:`~pcapkit.protocols.internet.ipsec.IPsec.id` is ``('AH', 'ESP')``. - :meth:`HTTP.id() ` is +* **Members only.** :meth:`IP.id() ` is + ``('IPv4', 'IPv6')``; :class:`~pcapkit.protocols.internet.ah.protocol.AH` and + :class:`~pcapkit.protocols.internet.esp.protocol.ESP` are not in it, since they belong to + the separate abstract :class:`~pcapkit.protocols.internet.ipsec.protocol.IPsec`, whose + :meth:`~pcapkit.protocols.internet.ipsec.protocol.IPsec.id` is ``('AH', 'ESP')``. + :meth:`HTTP.id() ` is ``('HTTP/1', 'HTTP/2')``. * **The base's own name, then the members.** - :meth:`VLAN.id() ` is + :meth:`VLAN.id() ` is ``('VLAN', 'C_Tag', 'S_Tag')`` and - :meth:`L2TP.id() ` is ``('L2TP', 'L2TPv2')``. + :meth:`L2TP.id() ` is ``('L2TP', 'L2TPv2')``. -:meth:`ARP.id() ` is ``('ARP',)`` alone; see +:meth:`ARP.id() ` is ``('ARP',)`` alone; see :ref:`protocol-family-shapes`. Abstract Family Names ~~~~~~~~~~~~~~~~~~~~~ **An abstract family name composes its members.** The ruling on :issue:`2462` is that -:class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext` lists its direct concrete +:class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext` lists its direct concrete members in its ``id()``, and that each member narrows its own ``id()`` to itself. Grouping by Name ~~~~~~~~~~~~~~~~ **Members share a base because they share a name, not a wire format.** HTTP/1 and -HTTP/2 share :class:`~pcapkit.protocols.application.http.HTTP`, IPv4 and IPv6 share -:class:`~pcapkit.protocols.internet.ip.IP`, AH and ESP share -:class:`~pcapkit.protocols.internet.ipsec.IPsec`, and SSLv2 and SSLv3 share -:class:`~pcapkit.protocols.application.ssl.SSL` (:ref:`below `). +HTTP/2 share :class:`~pcapkit.protocols.application.http.protocol.HTTP`, IPv4 and IPv6 share +:class:`~pcapkit.protocols.internet.ip.protocol.IP`, AH and ESP share +:class:`~pcapkit.protocols.internet.ipsec.protocol.IPsec`, and SSLv2 and SSLv3 share +:class:`~pcapkit.protocols.application.ssl.protocol.SSL` (:ref:`below `). Ruled in review of :pr:`2441`; no issue holds the ruling. .. _protocol-family-ssl: @@ -57,21 +57,21 @@ The SSL Family **SSLv2 and SSLv3 share a base by name, though only SSLv3 shares TLS's record layer.** The owner asked on :pr:`2441` for this grouping to be recorded here; no issue holds the ruling. By the ``id()`` criterion, -:meth:`SSL.id() ` is +:meth:`SSL.id() ` is ``('SSLv2', 'TLS', 'DTLS')``, without SSLv3, which subclasses TLS. -**One** :class:`~pcapkit.protocols.application.tls.TLS` **class reads SSLv3 through +**One** :class:`~pcapkit.protocols.application.tls.protocol.TLS` **class reads SSLv3 through TLS 1.3**, in the ARP shape (:ref:`protocol-family-shapes`): ``id()`` stays ``('TLS',)`` and ``alias`` names the version read. Only record version ``0x0300`` is branded SSLv3, in ``name`` as well as ``alias``; every later version is TLS. -:class:`~pcapkit.protocols.application.sslv3.SSLv3` ``('SSLv3',)`` narrows ``id()`` and -nothing else, as :class:`~pcapkit.protocols.link.inarp.InARP` does under ARP, and nothing +:class:`~pcapkit.protocols.application.sslv3.protocol.SSLv3` ``('SSLv3',)`` narrows ``id()`` and +nothing else, as :class:`~pcapkit.protocols.link.inarp.protocol.InARP` does under ARP, and nothing dispatches to it: an SSLv3 record on TCP port 443 parses as TLS with alias ``SSLv3``. -:class:`~pcapkit.protocols.application.dtls.DTLS` ``('DTLS',)`` reads DTLS 1.0, 1.2 and +:class:`~pcapkit.protocols.application.dtls.protocol.DTLS` ``('DTLS',)`` reads DTLS 1.0, 1.2 and 1.3 the same way. TCP port 443 binds TLS and UDP port 5684 binds DTLS. -:class:`~pcapkit.protocols.application.sslv2.SSLv2` ``('SSLv2',)`` is bound to no port: +:class:`~pcapkit.protocols.application.sslv2.protocol.SSLv2` ``('SSLv2',)`` is bound to no port: on 443, TLS offers SSLv2 a segment whose first record it rejects, and a record SSLv2 takes stays a TLS layer with alias ``SSLv2``. So ``'SSL' in`` selects both TLS and DTLS layers, while ``'SSLv3' in`` and ``'SSLv2' in`` select no layer port 443 parsed; @@ -85,12 +85,12 @@ Dispatching Bases **A registry binds a family's base only where its code cannot tell the members apart, and there the base picks the member.** IP protocol number 2 is IGMP's in every version, and the TCP and UDP ports bound to HTTP are the family's, so -:class:`~pcapkit.protocols.internet.igmp.IGMP`'s ``_dispatch`` and -:meth:`~pcapkit.protocols.application.http.HTTP._dispatch_version` read the octets to +:class:`~pcapkit.protocols.internet.igmp.protocol.IGMP`'s ``_dispatch`` and +:meth:`~pcapkit.protocols.application.http.protocol.HTTP._dispatch_version` read the octets to choose. Every registry that reaches IPv4, IPv6, AH, ESP, TLS or DTLS has a code for -that member alone, so no registry binds :class:`~pcapkit.protocols.internet.ip.IP`, -:class:`~pcapkit.protocols.internet.ipsec.IPsec` or -:class:`~pcapkit.protocols.application.ssl.SSL`, and none of the three defines +that member alone, so no registry binds :class:`~pcapkit.protocols.internet.ip.protocol.IP`, +:class:`~pcapkit.protocols.internet.ipsec.protocol.IPsec` or +:class:`~pcapkit.protocols.application.ssl.protocol.SSL`, and none of the three defines ``read()``: none needs a dispatcher there. Ruled for IGMP on :pr:`2444` and for SSL on :pr:`2441`; no issue holds either ruling. The asymmetry is deliberate, and it concerns the registry only; parsing or building through a base directly is the rule below. @@ -122,38 +122,38 @@ version under that name to the layer it carries. - ``version`` - Octets without ``version`` - ``from_data`` - * - :class:`~pcapkit.protocols.application.http.HTTP` + * - :class:`~pcapkit.protocols.application.http.protocol.HTTP` - ``1``, ``2`` - - :meth:`~pcapkit.protocols.application.http.HTTP._dispatch_version`: the + - :meth:`~pcapkit.protocols.application.http.protocol.HTTP._dispatch_version`: the connection preface, a start line or a frame header - the data model; a :obj:`dict` is refused - * - :class:`~pcapkit.protocols.internet.igmp.IGMP` + * - :class:`~pcapkit.protocols.internet.igmp.protocol.IGMP` - ``1``, ``2``, ``3`` - - :meth:`~pcapkit.protocols.internet.igmp.IGMP._dispatch`: type, max response + - :meth:`~pcapkit.protocols.internet.igmp.protocol.IGMP._dispatch`: type, max response time and length, placed by - :meth:`~pcapkit.protocols.internet.igmp.IGMP._classify` + :meth:`~pcapkit.protocols.internet.igmp.protocol.IGMP._classify` - ``version``, which each IGMP data model carries though no octet does, ruled on :issue:`2574` - * - :class:`~pcapkit.protocols.internet.ip.IP` + * - :class:`~pcapkit.protocols.internet.ip.protocol.IP` - ``4``, ``6`` - the Version nibble - ``version`` - * - :class:`~pcapkit.protocols.internet.icmp.ICMP` + * - :class:`~pcapkit.protocols.internet.icmp.protocol.ICMP` - ``4``, ``6`` - refused, below - the data model; a :obj:`dict` is refused - * - :class:`~pcapkit.protocols.link.l2tp.L2TP` + * - :class:`~pcapkit.protocols.link.l2tp.protocol.L2TP` - ``2`` - the version nibble - ``version`` - * - :class:`~pcapkit.protocols.link.linux_sll.LinuxSLL` + * - :class:`~pcapkit.protocols.link.linux_sll.protocol.LinuxSLL` - ``1``, ``2`` - refused, below - the data model; a :obj:`dict` is refused HTTP octets carry their version, but the HTTP data models have no top-level ``version`` field, only HTTP/1's ``receipt.version`` string, so -:meth:`HTTP.from_data ` reads the +:meth:`HTTP.from_data ` reads the data model's class. It refuses a :obj:`dict` even though the ``receipt`` and ``sid`` keys would tell the members apart, since no key picks a member (:issue:`2628`). @@ -167,12 +167,12 @@ member. A version a family has no member for, such as L2TP's ``1`` (L2F) and ``3 raises the same way. **Octets neither version takes**, a frameless HTTP/2 connection preface among them, -are :class:`~pcapkit.protocols.misc.raw.Raw` with no ``error`` on the transport path, +are :class:`~pcapkit.protocols.misc.raw.protocol.Raw` with no ``error`` on the transport path, and a direct ``HTTP(...)`` on them raises :exc:`~pcapkit.utilities.exceptions.ProtocolError` (:issue:`2524`). Octets the -dispatcher gives :class:`~pcapkit.protocols.application.httpv2.HTTPv2` that its parser +dispatcher gives :class:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2` that its parser then refuses, such as a preface and three octets, are -:class:`~pcapkit.protocols.misc.raw.Raw` with the parser's ``error``. +:class:`~pcapkit.protocols.misc.raw.protocol.Raw` with the parser's ``error``. .. _protocol-family-refusals: @@ -186,13 +186,13 @@ a family's members (:issue:`2588`). The fallback is and the overrides that parse a next layer themselves. :meth:`Application._import_next_layer ` and -:meth:`TLS._import_next_layer ` +:meth:`TLS._import_next_layer ` are not decorated: they delegate to decorated methods, the base's or TLS's ``_import_next_record``. The decorated call runs inside a :class:`~pcapkit.utilities.exceptions.CaughtByCaller` block naming :exc:`~pcapkit.utilities.exceptions.ProtocolError`. A refused layer, the HTTP/2 case above or a GRE header of a nonzero version, is then recorded on the ``error`` of the -:class:`~pcapkit.protocols.misc.raw.Raw` that replaces it, and nowhere else: nothing +:class:`~pcapkit.protocols.misc.raw.protocol.Raw` that replaces it, and nowhere else: nothing reaches the ``pcapkit`` logger at any level, and neither :func:`sys.excepthook` nor :func:`threading.excepthook` is replaced. A refusal the parser handles is the control flow :class:`~pcapkit.utilities.exceptions.BaseError`'s quiet mode exists for, and @@ -202,7 +202,7 @@ effect. A parse whose refusal a fallback absorbs without :func:`~pcapkit.corekit.decorators.beholder` follows the same rule through an explicit ``CaughtByCaller(ProtocolError)`` around it, as -:meth:`DTLS.analyze_handshake ` +:meth:`DTLS.analyze_handshake ` keeps a body that does not decode raw -- an application of :issue:`2588`'s rule rather than a ruling of its own. @@ -212,7 +212,7 @@ stack is quiet, at any depth, unless an inner :class:`~pcapkit.utilities.exceptions.CaughtByCaller` says otherwise: * one a parser below catches itself, such as the ``supported_versions`` peek of - :meth:`SSL._tls_negotiates ` + :meth:`SSL._tls_negotiates ` or TLS's SSLv2 trial, which is then recorded nowhere; * one reporting library state rather than the octets, such as a :class:`~pcapkit.corekit.module.ModuleDescriptor` entry whose class its module has @@ -256,38 +256,38 @@ Member Shapes - In the tree * - Narrow to self - the member's own name only - - :class:`~pcapkit.protocols.internet.ah.AH` ``('AH',)``, - :class:`~pcapkit.protocols.internet.esp.ESP` ``('ESP',)``; - :class:`IGMPv2 ` ``('IGMPv2',)`` and - :class:`IGMPv3 ` ``('IGMPv3',)`` -- - :class:`IGMPv1 ` narrows the same way, + - :class:`~pcapkit.protocols.internet.ah.protocol.AH` ``('AH',)``, + :class:`~pcapkit.protocols.internet.esp.protocol.ESP` ``('ESP',)``; + :class:`IGMPv2 ` ``('IGMPv2',)`` and + :class:`IGMPv3 ` ``('IGMPv3',)`` -- + :class:`IGMPv1 ` narrows the same way, but to the RFC canonical name rather than a versioned one (:ref:`protocol-family-canonical-names`); - :class:`HTTPv1 ` ``('HTTP/1',)`` - and :class:`HTTPv2 ` - ``('HTTP/2',)``; :class:`~pcapkit.protocols.application.sslv2.SSLv2` + :class:`HTTPv1 ` ``('HTTP/1',)`` + and :class:`HTTPv2 ` + ``('HTTP/2',)``; :class:`~pcapkit.protocols.application.sslv2.protocol.SSLv2` ``('SSLv2',)`` * - Family-inclusive - the member's label plus the family name - - :class:`~pcapkit.protocols.link.c_tag.C_Tag` ``('C_Tag', 'VLAN')``, - :class:`~pcapkit.protocols.link.s_tag.S_Tag` ``('S_Tag', 'VLAN')``; - :class:`~pcapkit.protocols.link.l2tpv2.L2TPv2` ``('L2TP', 'L2TPv2')`` + - :class:`~pcapkit.protocols.link.c_tag.protocol.C_Tag` ``('C_Tag', 'VLAN')``, + :class:`~pcapkit.protocols.link.s_tag.protocol.S_Tag` ``('S_Tag', 'VLAN')``; + :class:`~pcapkit.protocols.link.l2tpv2.protocol.L2TPv2` ``('L2TP', 'L2TPv2')`` * - One parser, dynamic alias - fixed, whichever protocol was read - - :class:`~pcapkit.protocols.link.arp.ARP` ``('ARP',)`` reads the operation + - :class:`~pcapkit.protocols.link.arp.protocol.ARP` ``('ARP',)`` reads the operation code and reports ARP, RARP, DRARP or InARP through :attr:`~pcapkit.protocols.protocol.Protocol.alias`; - :class:`~pcapkit.protocols.application.tls.TLS` ``('TLS',)`` reports SSLv3 or a - TLS version, and :class:`~pcapkit.protocols.application.dtls.DTLS` + :class:`~pcapkit.protocols.application.tls.protocol.TLS` ``('TLS',)`` reports SSLv3 or a + TLS version, and :class:`~pcapkit.protocols.application.dtls.protocol.DTLS` ``('DTLS',)`` a DTLS version (:ref:`protocol-family-ssl`) -Nothing dispatches to :class:`~pcapkit.protocols.link.inarp.InARP` ``('InARP',)``: +Nothing dispatches to :class:`~pcapkit.protocols.link.inarp.protocol.InARP` ``('InARP',)``: under EtherType ``0x0806``, operation 8 parses as ARP with alias ``InARP``. -Only :class:`~pcapkit.protocols.application.rarp.RARP` ``('RARP', 'DRARP')`` is bound +Only :class:`~pcapkit.protocols.application.rarp.protocol.RARP` ``('RARP', 'DRARP')`` is bound to EtherType ``0x8035`` (:attr:`~pcapkit.const.reg.ethertype.EtherType.Reverse_Address_Resolution_Protocol`). A parsed RARP takes ``DRARP`` as its alias for operation 5, and -:class:`~pcapkit.protocols.application.drarp.DRARP` ``('DRARP',)`` inherits the +:class:`~pcapkit.protocols.application.drarp.protocol.DRARP` ``('DRARP',)`` inherits the ``__index__`` of RARP. A family-inclusive member is selected by any sibling's registry key (a key of @@ -296,7 +296,7 @@ A family-inclusive member is selected by any sibling's registry key (a key of and by the key of each family whose ``id()`` lists it: ``HTTPv1`` and ``HTTPv2`` by ``HTTP``, and ``AH`` and ``ESP`` by ``IPsec`` and by ``IPv6_Ext`` where IPv4 carries them. Under IPv6 they are no layer of their own but entries of -:attr:`IPv6.extension_headers `, +:attr:`IPv6.extension_headers `, so on an ``Ethernet:IPv6:AH`` frame ``'AH' in``, ``'IPsec' in`` and ``'IPv6_Ext' in`` are all ``False``; only ``frame.protochain`` matches them. @@ -313,9 +313,9 @@ then a ``CLIENT-MASTER-KEY`` read ``TCP:SSLv2:SSLv2``. **HTTP/2 frames chain the same way** (:issue:`2536`): a ``SETTINGS`` frame then a ``WINDOW_UPDATE`` read ``TCP:HTTP/2:HTTP/2``. A later whole frame that fails to decode -is :class:`~pcapkit.protocols.misc.raw.Raw` with the rest of the segment and the +is :class:`~pcapkit.protocols.misc.raw.protocol.Raw` with the rest of the segment and the parser's ``error``, a frame the segment ends inside stays -:class:`~pcapkit.protocols.misc.raw.Raw` with none, and ``protocol=``, ``layer=`` and +:class:`~pcapkit.protocols.misc.raw.protocol.Raw` with none, and ``protocol=``, ``layer=`` and :data:`~pcapkit.utilities.config.FRAME_LAYER_LIMIT` stop the chain, as for TLS. .. _protocol-family-canonical-names: @@ -325,7 +325,7 @@ Canonical Names **A versioned protocol's display name includes its version.** This is the preference stated in review of :pr:`2444`, not a settled rule; no issue holds it. -:class:`~pcapkit.protocols.link.l2tpv2.L2TPv2`'s ``name`` is +:class:`~pcapkit.protocols.link.l2tpv2.protocol.L2TPv2`'s ``name`` is ``Layer 2 Tunnelling Protocol version 2``. The HTTP/1.1 and HTTP/2 classes define no ``name`` of their own, so they report ``Hypertext Transfer Protocol``, which carries no version. @@ -339,26 +339,26 @@ version, since :rfc:`4443` names it with one. **IGMPv1 follows the same shape, by the same reasoning**, ruled in review of :pr:`2506`; no issue holds the ruling. :rfc:`1112` names IGMPv1's protocol plain ``IGMP``, so -:meth:`IGMPv1.id() ` is ``('IGMP',)`` and +:meth:`IGMPv1.id() ` is ``('IGMP',)`` and its ``alias`` is ``'IGMP'``, while -:meth:`IGMPv2.id() ` and -:meth:`IGMPv3.id() ` keep their own +:meth:`IGMPv2.id() ` and +:meth:`IGMPv3.id() ` keep their own versions, ``('IGMPv2',)`` and ``('IGMPv3',)``, since :rfc:`2236` and :rfc:`3376` name them with one. The family base's ``id()`` follows: -:meth:`IGMP.id() ` is +:meth:`IGMP.id() ` is ``('IGMP', 'IGMPv2', 'IGMPv3')``, the family-inclusive shape, because IGMPv1's canonical name and the family's own name are the same string -- the same shape -:meth:`ICMP.id() ` takes, ``('ICMP', 'ICMPv6')``. +:meth:`ICMP.id() ` takes, ``('ICMP', 'ICMPv6')``. **HTTP takes the RFC names as well** (:issue:`2524`). :rfc:`9113` names its protocol -``HTTP/2``, so :meth:`HTTPv2.id() ` is +``HTTP/2``, so :meth:`HTTPv2.id() ` is ``('HTTP/2',)``. :rfc:`9112` names ``HTTP/1.1``, but the HTTP/1 class also reads messages declaring 1.0 or 0.9, so -:meth:`HTTPv1.id() ` is the major +:meth:`HTTPv1.id() ` is the major version, ``('HTTP/1',)``, and ``alias`` carries the exact one. No member's name -is the family's, so :meth:`HTTP.id() ` +is the family's, so :meth:`HTTP.id() ` lists the members alone, ``('HTTP/1', 'HTTP/2')``, the shape of -:meth:`IP.id() `. +:meth:`IP.id() `. .. _protocol-family-selectors: @@ -372,7 +372,7 @@ and ``'IPv4' in`` is ``False``. HTTP follows it too (:issue:`2524`). On an HTTP/1.1 frame, ``'HTTP' in`` and ``'HTTP/1' in`` are ``True`` and ``'HTTP/2' in`` is ``False``, since the layer is -:class:`~pcapkit.protocols.application.httpv1.HTTPv1`; an HTTP/2 frame is the reverse. +:class:`~pcapkit.protocols.application.httpv1.protocol.HTTPv1`; an HTTP/2 frame is the reverse. What a selector on a frame or a layer reaches is defined by :meth:`~pcapkit.protocols.protocol.Protocol.expand_comp`, @@ -405,27 +405,71 @@ No Invented Suffixes ~~~~~~~~~~~~~~~~~~~~ **The family base takes the family's own name.** -:class:`~pcapkit.protocols.internet.ip.IP`, -:class:`~pcapkit.protocols.internet.ipsec.IPsec`, -:class:`~pcapkit.protocols.application.http.HTTP`, -:class:`~pcapkit.protocols.link.vlan.VLAN` and -:class:`~pcapkit.protocols.link.l2tp.L2TP` are the precedent. No ``_Family`` suffix is +:class:`~pcapkit.protocols.internet.ip.protocol.IP`, +:class:`~pcapkit.protocols.internet.ipsec.protocol.IPsec`, +:class:`~pcapkit.protocols.application.http.protocol.HTTP`, +:class:`~pcapkit.protocols.link.vlan.protocol.VLAN` and +:class:`~pcapkit.protocols.link.l2tp.protocol.L2TP` are the precedent. No ``_Family`` suffix is added, as ruled in review of :pr:`2446` (:issue:`2436`). -**A protocol class takes its module's name**, whatever its canonical name and -``id()``. The family base takes the family's name and a member its module's versioned -name: :mod:`~pcapkit.protocols.internet.igmpv1` holds -:class:`~pcapkit.protocols.internet.igmpv1.IGMPv1`, though its ``id()`` is ``('IGMP',)`` -(:ref:`above `). **A module holds one protocol -class.** :mod:`~pcapkit.protocols.protocol` is exempt: its -:class:`~pcapkit.protocols.protocol.ProtocolBase` and -:class:`~pcapkit.protocols.protocol.Protocol` are framework bases rather than -dissectors. Both ruled on :issue:`2529`. - -The name match ignores case and underscores: :mod:`~pcapkit.protocols.link.c_tag` holds -:class:`~pcapkit.protocols.link.c_tag.C_Tag` and :mod:`~pcapkit.protocols.link.linux_sll1` -holds :class:`~pcapkit.protocols.link.linux_sll1.LinuxSLL1`. **The** ``schema/`` **and** -``data/`` **modules follow the same layout**: the top-level class takes the module's -name, and sub-structure classes such as -:class:`~pcapkit.protocols.schema.internet.igmpv3.Query` share its module. Ruled on +**A protocol has a package of its own, named after it, whose modules take their +role** (:issue:`2534`): ``protocol`` holds the dissector, ``schema`` its header +schema and ``data`` its data model, and each holds the class named after the +package. The package's ``__init__`` exports the protocol class alone, and binds +each class its ``schema`` and ``data`` modules define as ``Schema_`` and +``Data_`` outside ``__all__``, as 1.5.1's aggregators exposed them, ruled in +review of :pr:`2753` (:issue:`2534`). The class +takes the package's name whatever its canonical name and ``id()``: the family base +takes the family's name and a member its versioned name, so +:mod:`~pcapkit.protocols.internet.igmpv1` holds +:class:`~pcapkit.protocols.internet.igmpv1.protocol.IGMPv1`, though its ``id()`` is +``('IGMP',)`` (:ref:`above `). **A package holds +one protocol class.** The framework is exempt: :mod:`~pcapkit.protocols.protocol` +holds the bases :class:`~pcapkit.protocols.protocol.ProtocolBase` and +:class:`~pcapkit.protocols.protocol.Protocol`, :mod:`~pcapkit.protocols.schema` and +:mod:`~pcapkit.protocols.data` hold the schema and data-model bases, and a layer's +base stays in ``/.py``. The naming was ruled on :issue:`2529`, the +package layout on :issue:`2534`. + +A package's ``__init__`` imports its protocol class, then the ``Schema_*`` aliases +under a heading, then the ``Data_*`` aliases under theirs, as +:mod:`~pcapkit.protocols.internet.ipv4` does: + +.. code-block:: python + + from pcapkit.protocols.internet.ipv4.protocol import IPv4 + + # Header Schemas + from pcapkit.protocols.internet.ipv4.schema import EOOLOption as Schema_EOOLOption + ... + + # Data Models + from pcapkit.protocols.internet.ipv4.data import EOOLOption as Data_EOOLOption + ... + + __all__ = ['IPv4'] + +A package whose ``schema`` or ``data`` module defines no class has no block for it. +Each block keeps :program:`isort`'s own order and wrapping, and :program:`isort` +leaves the file alone: the ``[tool.isort]`` section of :file:`pyproject.toml` skips +these files with ``filter_files`` set, so one named on the command line is skipped +too, and ``make isort`` skips every ``__init__.py`` besides. Ruled in review of +:pr:`2753` (:issue:`2534`). + +**A family's shared pieces live in the family base's package**, and its members +import them (:issue:`2534`): :class:`~pcapkit.protocols.link.c_tag.protocol.C_Tag` +and :class:`~pcapkit.protocols.link.s_tag.protocol.S_Tag` read the schema and data +model of :mod:`~pcapkit.protocols.link.vlan`, the option helpers HOPOPT and +IPv6-Opts share are in :mod:`pcapkit.protocols.internet.ipv6_ext.schema`, and the +TLS record data models the SSL family's dissectors read are in +:mod:`pcapkit.protocols.application.ssl.data`. A base never reads a member's +schema or data module, since the member imports the base. + +The name match ignores case and underscores: :mod:`~pcapkit.protocols.link.c_tag` +holds :class:`~pcapkit.protocols.link.c_tag.protocol.C_Tag` and +:mod:`~pcapkit.protocols.link.linux_sll1` holds +:class:`~pcapkit.protocols.link.linux_sll1.protocol.LinuxSLL1`. **The** ``schema`` +**and** ``data`` **modules follow the same rule**: the top-level class takes the +package's name, and sub-structure classes such as +:class:`~pcapkit.protocols.internet.igmpv3.schema.Query` share its module. Ruled on :issue:`2529`. diff --git a/docs/source/contributing/conventions/protocol-layer-placement.rst b/docs/source/contributing/conventions/protocol-layer-placement.rst index 30a3dea4fa..b04774b497 100644 --- a/docs/source/contributing/conventions/protocol-layer-placement.rst +++ b/docs/source/contributing/conventions/protocol-layer-placement.rst @@ -46,8 +46,8 @@ The subpackages, functionally rather than by carrier: .. important:: :mod:`~pcapkit.protocols.application` is **not** "payloads reached by port or SCTP - PPID". :class:`~pcapkit.protocols.application.ospf.OSPF` is reached by IANA protocol - number and :class:`~pcapkit.protocols.application.rarp.RARP` by EtherType, and + PPID". :class:`~pcapkit.protocols.application.ospf.protocol.OSPF` is reached by IANA protocol + number and :class:`~pcapkit.protocols.application.rarp.protocol.RARP` by EtherType, and neither has a port. Why Function and Not Encapsulation @@ -108,8 +108,8 @@ Tunnelling Protocols: Payload, Not Carrier ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A tunnelling protocol is placed by what it carries, not by what carries it. So -:class:`~pcapkit.protocols.link.l2tp.L2TP` and -:class:`~pcapkit.protocols.link.l2tpv2.L2TPv2` stay in +:class:`~pcapkit.protocols.link.l2tp.protocol.L2TP` and +:class:`~pcapkit.protocols.link.l2tpv2.protocol.L2TPv2` stay in :mod:`~pcapkit.protocols.link` and are **not** application-layer, even though L2TP is commonly seen over UDP. @@ -134,17 +134,17 @@ the MRO, so whichever base owns it *earliest* wins: .. code-block:: pycon >>> from pcapkit.protocols.link.link import Link - >>> from pcapkit.protocols.misc.raw import Raw + >>> from pcapkit.protocols.misc.raw.protocol import Raw >>> '__layer__' in vars(Link), '__layer__' in vars(Raw) (True, False) -:class:`~pcapkit.protocols.misc.raw.Raw` does **not** own ``__layer__`` -- it inherits +:class:`~pcapkit.protocols.misc.raw.protocol.Raw` does **not** own ``__layer__`` -- it inherits :obj:`None` from :class:`~pcapkit.protocols.protocol.ProtocolBase` -- so a class naming both :class:`~pcapkit.protocols.application.application.Application` and -:class:`~pcapkit.protocols.misc.raw.Raw` reports ``'Application'`` in either base order. -So :class:`~pcapkit.protocols.application.ftp_data.FTP_DATA`, declared +:class:`~pcapkit.protocols.misc.raw.protocol.Raw` reports ``'Application'`` in either base order. +So :class:`~pcapkit.protocols.application.ftp_data.protocol.FTP_DATA`, declared ``class FTP_DATA(Application, Raw)``, reports ``'Application'``. -:class:`~pcapkit.protocols.link.arp.ARP`'s chain reaches +:class:`~pcapkit.protocols.link.arp.protocol.ARP`'s chain reaches :class:`~pcapkit.protocols.link.link.Link`, which **does** own it, so ``class RARP(ARP, Application)`` would report ``'Link'`` and be wrong. @@ -157,13 +157,13 @@ Apparent Mistakes Each is deliberate. Do not "fix" any of them. **A parsing base may live in another subpackage.** -:mod:`pcapkit.protocols.application.rarp` imports -:class:`~pcapkit.protocols.link.arp.ARP` from :mod:`pcapkit.protocols.link.arp`. That +:mod:`pcapkit.protocols.application.rarp.protocol` imports +:class:`~pcapkit.protocols.link.arp.protocol.ARP` from :mod:`pcapkit.protocols.link.arp.protocol`. That ``application/ โ†’ link/`` dependency is the honest consequence of letting layer and parser disagree. **A pseudo-header protocol is in** :mod:`~pcapkit.protocols.misc`, **not beside the -layer it is built from.** :class:`~pcapkit.protocols.misc.checksum.ip_pseudo.IP_Pseudo` +layer it is built from.** :class:`~pcapkit.protocols.misc.checksum.ip_pseudo.protocol.IP_Pseudo` is built from an IPv4 or IPv6 layer but is no layer on the wire, and its ``__layer__`` is :obj:`None`. Pseudo-header protocols share :mod:`pcapkit.protocols.misc.checksum`, ruled in review of the IP pseudo-header, :pr:`2479` (:issue:`2471`); the issue's @@ -179,17 +179,17 @@ nothing about which registry reaches it, and no dispatch key depends on it: * - Class - Dispatched from - Subpackage - * - :class:`~pcapkit.protocols.application.ospf.OSPF` + * - :class:`~pcapkit.protocols.application.ospf.protocol.OSPF` - :attr:`Internet.__proto__ ` by :attr:`~pcapkit.const.reg.transtype.TransType.OSPFIGP` - :mod:`~pcapkit.protocols.application` - * - :class:`~pcapkit.protocols.application.rarp.RARP` + * - :class:`~pcapkit.protocols.application.rarp.protocol.RARP` - :attr:`Link.__proto__ ` by EtherType - :mod:`~pcapkit.protocols.application` Nothing else needs overriding. :class:`~pcapkit.protocols.application.application.Application` accepts the ``-1`` sentinel (the undissected remainder) and resolves it to -:class:`~pcapkit.protocols.misc.raw.Raw`, so OSPF's body and the padding Ethernet adds +:class:`~pcapkit.protocols.misc.raw.protocol.Raw`, so OSPF's body and the padding Ethernet adds to a short RARP frame attach without either class touching ``__post_init__``, ``_decode_next_layer`` or ``_import_next_layer``. Only a real protocol number is refused. @@ -210,13 +210,13 @@ plus ``__index__``, ``_decode_next_layer`` and ``_import_next_layer``. ``register``, ``_read_protos`` and ``_shipped_proto``, the last set because :class:`~pcapkit.protocols.link.link.Link` defines its own ``__proto__`` -- and each of those also exists on :class:`~pcapkit.protocols.protocol.ProtocolBase`, so each still -resolves on :class:`~pcapkit.protocols.application.ospf.OSPF`. The strict difference +resolves on :class:`~pcapkit.protocols.application.ospf.protocol.OSPF`. The strict difference :class:`~pcapkit.protocols.link.link.Link` minus :class:`~pcapkit.protocols.application.application.Application` minus :class:`~pcapkit.protocols.protocol.ProtocolBase` is ``__proto_key__`` alone, which :class:`~pcapkit.protocols.link.link.Link` declares, as asked for on :pr:`2392` (no issue holds the ruling), and neither of the others does, so it does **not** resolve on -:class:`~pcapkit.protocols.application.ospf.OSPF`. Nothing turns on that: +:class:`~pcapkit.protocols.application.ospf.protocol.OSPF`. Nothing turns on that: :func:`~pcapkit.foundation.registry.protocols.protocol.register_protocol_code` reads the pairing out of the registry owner's own namespace rather than off the class, and reads its absence as *declares no pairing* rather than as an error. What changes is which @@ -225,10 +225,10 @@ registry it resolves *to*: ``OSPF.__proto__`` is than :attr:`Link.__proto__ `, so OSPF does not see Link's EtherType entries. That is inert -- nothing reaches OSPF by EtherType, and a ``-1`` lookup misses in both registries alike and resolves to -:class:`~pcapkit.protocols.misc.raw.Raw`, inserting nothing on the miss. -:class:`~pcapkit.protocols.application.rarp.RARP` keeps +:class:`~pcapkit.protocols.misc.raw.protocol.Raw`, inserting nothing on the miss. +:class:`~pcapkit.protocols.application.rarp.protocol.RARP` keeps :class:`~pcapkit.protocols.link.link.Link`'s through -:class:`~pcapkit.protocols.link.arp.ARP`. +:class:`~pcapkit.protocols.link.arp.protocol.ARP`. Tie-Break Order ~~~~~~~~~~~~~~~ diff --git a/docs/source/contributing/conventions/protocol-member-order.rst b/docs/source/contributing/conventions/protocol-member-order.rst index bc48c2edc9..31354b2ac7 100644 --- a/docs/source/contributing/conventions/protocol-member-order.rst +++ b/docs/source/contributing/conventions/protocol-member-order.rst @@ -28,7 +28,7 @@ The Order by the enum value order of the corresponding code, or by the registry's order where there is no enum. A registry fallback that ``read()`` or ``make()`` names directly, such as ``_read_msg_unknown()`` in - :class:`~pcapkit.protocols.internet.mh.MH`, does not count either: it is a + :class:`~pcapkit.protocols.internet.mh.protocol.MH`, does not count either: it is a specific reader, ruled on :issue:`2490`. Each helper's ``_read_`` and ``_make_`` methods stay together, with the reader first: ``_read_addr_resolve()`` then ``_make_addr_resolve()``. @@ -36,12 +36,12 @@ The Order all ``_read_*()`` before all ``_make_*()``. Each set opens with the registry's default, its fallback for a code with no entry of its own, as ``_read_opt_unassigned()`` opens the readers of - :class:`~pcapkit.protocols.internet.ipv4.IPv4`; the rest follow the enum value + :class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4`; the rest follow the enum value of the code or type each handles, not alphabetical order. Ruled on :issue:`2490`. d. **Other helpers.** Every helper that ``read()``, ``make()`` and the registries do not reach goes last, including one that only another helper calls, such as - ``_decode_text()`` in :class:`~pcapkit.protocols.application.httpv1.HTTPv1`. + ``_decode_text()`` in :class:`~pcapkit.protocols.application.httpv1.protocol.HTTPv1`. Ruled on :issue:`2490`. **Registry maps.** The registry maps themselves (``__proto__``, ``__option__``, @@ -56,7 +56,7 @@ before its ``_make_xxx()``, and subgroup b, with a table of known exceptions Example ~~~~~~~ -The utilities of :class:`~pcapkit.protocols.link.arp.ARP`, reduced to its member +The utilities of :class:`~pcapkit.protocols.link.arp.protocol.ARP`, reduced to its member names. ``read()`` resolves a hardware address before a protocol address, so the hardware pair comes first: @@ -83,10 +83,10 @@ hardware pair comes first: The Reference ~~~~~~~~~~~~~ -:class:`~pcapkit.protocols.link.arp.ARP` is the reference for the utilities +:class:`~pcapkit.protocols.link.arp.protocol.ARP` is the reference for the utilities order. Its utilities are ``_make_data()`` and the helpers that ``read()`` and ``make()`` name, and nothing else, and there is more than one helper, so the first-use order of subgroup b shows as well as each reader preceding its maker. Chosen on :issue:`2614`, when the MAC address pair of -:class:`~pcapkit.protocols.link.ethernet.Ethernet`, the reference before it, +:class:`~pcapkit.protocols.link.ethernet.protocol.Ethernet`, the reference before it, moved to the base class. diff --git a/docs/source/contributing/conventions/reassembly-integration.rst b/docs/source/contributing/conventions/reassembly-integration.rst index 5d0e40332d..b3c0363c01 100644 --- a/docs/source/contributing/conventions/reassembly-integration.rst +++ b/docs/source/contributing/conventions/reassembly-integration.rst @@ -48,7 +48,7 @@ Parse Ownership :meth:`Protocol.analyze ` for IPv4 and IPv6, :meth:`Transport.analyze ` for TCP, and - :meth:`DTLS.analyze_handshake ` + :meth:`DTLS.analyze_handshake ` for a DTLS handshake message. * Each :mod:`pcapkit.foundation.analysis` function is a public wrapper that calls that method and holds no parsing of its own. @@ -66,17 +66,17 @@ Compliance, Measured ~~~~~~~~~~~~~~~~~~~~~ **Point 1 holds for every engine.** None of -:class:`~pcapkit.protocols.internet.ipv4.IPv4`, -:class:`~pcapkit.protocols.internet.ipv6.IPv6`, -:class:`~pcapkit.protocols.transport.tcp.TCP` and -:class:`~pcapkit.protocols.application.dtls.DTLS` imports or calls into +:class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4`, +:class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6`, +:class:`~pcapkit.protocols.transport.tcp.protocol.TCP` and +:class:`~pcapkit.protocols.application.dtls.protocol.DTLS` imports or calls into :mod:`pcapkit.foundation.reassembly` at all. The real path is :mod:`pcapkit.foundation.engines` calling a ``pcapkit.toolkit.`` extraction function on an already-parsed frame, feeding the result to the reassembly instance the :class:`~pcapkit.foundation.extraction.Extractor` holds; for DTLS that function is :func:`pcapkit.toolkit.pcap.dtls_reassembly` (:issue:`2496`). -:meth:`DTLS.read_handshake ` -and :meth:`DTLS.analyze_handshake ` +:meth:`DTLS.read_handshake ` +and :meth:`DTLS.analyze_handshake ` are the parser methods the rule allows. **No engine meets point 2.** No single :mod:`pcapkit.toolkit` helper enumerates which @@ -95,7 +95,7 @@ datagram's by its ports, through :meth:`Transport.analyze `; and :func:`~pcapkit.foundation.analysis.dtls.dtls_handshake` decodes a reassembled DTLS handshake message (:issue:`2496`), through -:meth:`DTLS.analyze_handshake ` +:meth:`DTLS.analyze_handshake ` (:issue:`2622`). The owner chose on :issue:`2581` to give IP and TCP modules of their own, each function named for the datagram its engine reassembles, rather than leave their outcomes to those dispatchers with no analysis method, which kept the rule true diff --git a/docs/source/contributing/conventions/registry-protocol.rst b/docs/source/contributing/conventions/registry-protocol.rst index d732f84121..58dbaddc80 100644 --- a/docs/source/contributing/conventions/registry-protocol.rst +++ b/docs/source/contributing/conventions/registry-protocol.rst @@ -314,7 +314,7 @@ in **zero** of them, and neither class carried an alias (``__members__`` 6 and 4 docstrings to refer to. Offered the choice between merging the widened copies and deleting them in a follow-up, the owner ruled for deleting them outright. Both ``get`` methods and both suppressions went with it, and -:mod:`pcapkit.protocols.internet.mh` defines no ``get`` at all. +:mod:`pcapkit.protocols.internet.mh.protocol` defines no ``get`` at all. The one input where the copies **did** differ is why this matters beyond line count, and it is the trap for whoever writes the next override: the base branches on @@ -473,8 +473,8 @@ subclass, every one of them under :mod:`pcapkit.const` and each either :class:`int`-valued (the flag registries among them) or ``aenum.StrEnum``-valued, plus every non-registry enumeration a runtime walk over both the :mod:`enum` and |aenum|_ flavours finds, nested classes included -- such as -:class:`FrameType.Flags ` in -:mod:`pcapkit.protocols.schema.application.httpv2` and its concrete per-frame subclasses. +:class:`FrameType.Flags ` in +:mod:`pcapkit.protocols.application.httpv2.schema` and its concrete per-frame subclasses. **The** :class:`int`\ **-valued tier is case-sensitive throughout, and the criterion is vacuous on it rather than merely unmet.** A registry whose values are numbers has @@ -573,36 +573,36 @@ That leaves the classes with something to decide: ``a`` 18, ``p`` 16, ``s/p`` 3, blank 1; ``o`` 28, ``m`` 27, ``h`` 7, ``m [1]`` 2). Both tallies cover all 64 rows. - **open** -- see below - * - The :mod:`~pcapkit.protocols.internet.mh` and - :mod:`~pcapkit.protocols.application.ngap` helper enumerations + * - The :mod:`~pcapkit.protocols.internet.mh.protocol` and + :mod:`~pcapkit.protocols.application.ngap.protocol` helper enumerations - IANA Mobility Header registries, 3GPP TS 38.413 - - :class:`~pcapkit.protocols.internet.mh.FastBindingAcknowledgmentStatus`, - :class:`~pcapkit.protocols.internet.mh.IPv6AddressPrefixCode`, - :class:`~pcapkit.protocols.internet.mh.LMAAddressCode`, - :class:`~pcapkit.protocols.internet.mh.LocalizedRoutingStatus`, - :class:`~pcapkit.protocols.application.ngap.Criticality` and - :class:`~pcapkit.protocols.application.ngap.PDUKind`. **All but** - :class:`~pcapkit.protocols.application.ngap.PDUKind` carry numeric codes, so the + - :class:`~pcapkit.protocols.internet.mh.protocol.FastBindingAcknowledgmentStatus`, + :class:`~pcapkit.protocols.internet.mh.protocol.IPv6AddressPrefixCode`, + :class:`~pcapkit.protocols.internet.mh.protocol.LMAAddressCode`, + :class:`~pcapkit.protocols.internet.mh.protocol.LocalizedRoutingStatus`, + :class:`~pcapkit.protocols.application.ngap.protocol.Criticality` and + :class:`~pcapkit.protocols.application.ngap.protocol.PDUKind`. **All but** + :class:`~pcapkit.protocols.application.ngap.protocol.PDUKind` carry numeric codes, so the criterion is vacuous on them exactly as for the :class:`int` tier above; - :class:`~pcapkit.protocols.application.ngap.PDUKind`'s are :class:`str` ASN.1 + :class:`~pcapkit.protocols.application.ngap.protocol.PDUKind`'s are :class:`str` ASN.1 identifiers from 3GPP TS 38.413, and ASN.1 identifiers are case-significant by construction, so it lands the same way for a different reason. **None** of them defines a ``get`` of its own. Some did when this audit was taken -- - :class:`~pcapkit.protocols.internet.mh.FastBindingAcknowledgmentStatus` and - :class:`~pcapkit.protocols.internet.mh.IPv6AddressPrefixCode`, for signature + :class:`~pcapkit.protocols.internet.mh.protocol.FastBindingAcknowledgmentStatus` and + :class:`~pcapkit.protocols.internet.mh.protocol.IPv6AddressPrefixCode`, for signature reasons (no ``default``, and an :class:`int`/:class:`str` dispatch) rather than for case -- and both were deleted as redundant rather than widened, on the ruling recorded in the section above and given in review of the widening itself; each inherits ``get`` from :class:`~pcapkit.corekit.enum.EnumLookup` unchanged. - :class:`~pcapkit.protocols.internet.mh.LMAAddressCode` and - :class:`~pcapkit.protocols.internet.mh.LocalizedRoutingStatus` never carried a + :class:`~pcapkit.protocols.internet.mh.protocol.LMAAddressCode` and + :class:`~pcapkit.protocols.internet.mh.protocol.LocalizedRoutingStatus` never carried a ``get`` at all, so they had no string lookup to fold. - :class:`~pcapkit.protocols.application.ngap.Criticality` had one when this audit + :class:`~pcapkit.protocols.application.ngap.protocol.Criticality` had one when this audit was taken and inherits ``get`` unchanged: :issue:`877` re-parented it onto :class:`~pcapkit.corekit.enum.EnumLookup` and :issue:`923` retired the exception conversion that was the override's only remaining job. - **case-sensitive** -- conforms - * - :class:`~pcapkit.protocols.misc.pcapng.WireGuardKeyLabel` + * - :class:`~pcapkit.protocols.misc.pcapng.protocol.WireGuardKeyLabel` - ``draft-tuexen-opsawg-pcapng`` - The draft names the labels outright (*"The key type is one of LOCAL_STATIC_PRIVATE_KEY, ..."*) and, as for @@ -613,13 +613,13 @@ That leaves the classes with something to decide: - -- - Each is one of pcapkit's own discriminators and bit labels, with no registrar behind them at all -- :class:`~pcapkit.foundation.reassembly.data.data.Completion`, - :class:`ftp.Type `, - :class:`httpv1.Type `, + :class:`ftp.Type `, + :class:`httpv1.Type `, :class:`~pcapkit.corekit.infoclass.FinalisedState`, - :class:`~pcapkit.protocols.internet.esp.ESPStatus`, - :class:`~pcapkit.protocols.misc.pcapng.PacketDirection`, - :class:`~pcapkit.protocols.misc.pcapng.PacketReception`, and the httpv2 - :class:`~pcapkit.protocols.schema.application.httpv2.FrameType.Flags`. + :class:`~pcapkit.protocols.internet.esp.protocol.ESPStatus`, + :class:`~pcapkit.protocols.misc.pcapng.protocol.PacketDirection`, + :class:`~pcapkit.protocols.misc.pcapng.protocol.PacketReception`, and the httpv2 + :class:`~pcapkit.protocols.application.httpv2.schema.FrameType.Flags`. - **case-sensitive** -- nothing to cite, nothing to change Rows the audit deliberately left open rather than acting on, because each is @@ -651,10 +651,10 @@ wider than a case fix: Some case folds live **outside** any registry's ``get``, and so escape this convention. Each is recorded here with its basis, or the lack of one: -* :func:`~pcapkit.protocols.internet.esp._resolve` upper-cases its ``value`` before +* :func:`~pcapkit.protocols.internet.esp.protocol._resolve` upper-cases its ``value`` before matching it against :class:`~pcapkit.const.esp.cipher.Cipher` and :class:`~pcapkit.const.esp.integrity.Integrity` member names, and - :meth:`IntegritySuite.get ` + :meth:`IntegritySuite.get ` upper-cases a name before handing it on. :rfc:`7296` states no comparison rule for IKEv2 transform names -- checked, it does not discuss case at all -- so these are conveniences with no citation behind them. @@ -663,19 +663,19 @@ Each is recorded here with its basis, or the lack of one: :class:`~pcapkit.const.reg.apptype.apptype.TransportProtocol`'s member names, so ``'TCP'`` names ``TransportProtocol.tcp``. Its basis is that class's row above, :rfc:`6335#section-8.1.1` by limb 2. -* :meth:`TCP.read ` and - :meth:`TCP.make ` upper-case the TCP +* :meth:`TCP.read ` and + :meth:`TCP.make ` upper-case the TCP schema's flag keys, ``cwr`` to ``fin``, to look up :class:`~pcapkit.const.tcp.flags.Flags` members. Both spellings are pcapkit's own and the keys a fixed set, so no caller's text is folded and there is nothing to cite. -* :meth:`TLSKeyLog.post_process ` +* :meth:`TLSKeyLog.post_process ` and - :meth:`WireGuardKeyLog.post_process ` + :meth:`WireGuardKeyLog.post_process ` upper-case a key log line's label before matching :class:`~pcapkit.const.pcapng.tls_key_label.TLSKeyLabel` or - :class:`~pcapkit.protocols.misc.pcapng.WireGuardKeyLabel`, so ``client_random`` parses + :class:`~pcapkit.protocols.misc.pcapng.protocol.WireGuardKeyLabel`, so ``client_random`` parses as ``CLIENT_RANDOM``, and - :func:`~pcapkit.protocols.schema.misc.pcapng._malformed_line_message` folds the same + :func:`~pcapkit.protocols.misc.pcapng.schema._malformed_line_message` folds the same way to name a malformed line's label. No comparison rule backs them: :rfc:`9850#section-2` makes only the hexadecimal fields case-insensitive, and the rows above find none for either label set. @@ -762,19 +762,19 @@ established ones carry. A map's registration comes in two parts: -- which writes it and warns when it displaces an entry. An inherited one counts only when it is typed and validated for exactly that map's keys, which the owner chose over an override on every class (:issue:`2511`). So - :class:`~pcapkit.protocols.transport.tcp.TCP` and - :class:`~pcapkit.protocols.transport.udp.UDP` keep + :class:`~pcapkit.protocols.transport.tcp.protocol.TCP` and + :class:`~pcapkit.protocols.transport.udp.protocol.UDP` keep :meth:`Transport.register `, typed for the port their maps are keyed by. A class whose map takes other keys - overrides its parent's instead: :class:`~pcapkit.protocols.transport.sctp.SCTP` for + overrides its parent's instead: :class:`~pcapkit.protocols.transport.sctp.protocol.SCTP` for payload protocol identifiers rather than ports; - :class:`~pcapkit.protocols.internet.ipx.IPX` for IPX packet types rather than the + :class:`~pcapkit.protocols.internet.ipx.protocol.IPX` for IPX packet types rather than the :class:`~pcapkit.const.reg.transtype.TransType` :meth:`Internet.register ` - takes; and :class:`~pcapkit.protocols.link.loopback.Loopback`, - :class:`~pcapkit.protocols.link.linux_sll.LinuxSLL`, - :class:`~pcapkit.protocols.link.frad.FRAD` and - :class:`~pcapkit.protocols.link.netlink.Netlink` for address families, ARPHRD types, + takes; and :class:`~pcapkit.protocols.link.loopback.protocol.Loopback`, + :class:`~pcapkit.protocols.link.linux_sll.protocol.LinuxSLL`, + :class:`~pcapkit.protocols.link.frad.protocol.FRAD` and + :class:`~pcapkit.protocols.link.netlink.protocol.Netlink` for address families, ARPHRD types, NLPIDs and ``nlmsg_type`` values rather than the :class:`~pcapkit.const.reg.ethertype.EtherType` :meth:`Link.register ` takes. @@ -831,8 +831,8 @@ depart from it: of the frame behind a radiotap header, and takes its owning protocol's name for the same reason. * :func:`~pcapkit.foundation.registry.protocols.transport.register_apptype` takes - bare :class:`int` keys, but writes :class:`~pcapkit.protocols.transport.tcp.TCP`'s - map, :class:`~pcapkit.protocols.transport.udp.UDP`'s or both, by transport, so no + bare :class:`int` keys, but writes :class:`~pcapkit.protocols.transport.tcp.protocol.TCP`'s + map, :class:`~pcapkit.protocols.transport.udp.protocol.UDP`'s or both, by transport, so no one owner's name fits and it takes :class:`~pcapkit.const.reg.apptype.apptype.AppType`'s. @@ -846,7 +846,7 @@ shape for a parser map: .. code-block:: python - # NOTE: pcapkit.protocols.transport.sctp.SCTP.__chunk__ + # NOTE: pcapkit.protocols.transport.sctp.protocol.SCTP.__chunk__ def register_sctp_chunk(code, meth, *, schema=None): _check_code(code, SCTP_Chunk, SCTP) if isinstance(meth, str) and not hasattr(SCTP, f'_read_chunk_{meth}'): @@ -867,15 +867,15 @@ the one typed for that map's keys. each layout is a concrete schema.** Ruled in review of :pr:`2657` (:issue:`2576`): the table is a class-level map on the protocol, with its ``register_`` classmethod and its wrapper, and never a dictionary at module level; each layout is a -:class:`~pcapkit.protocols.schema.schema.Schema` subclass with typed fields, defined with +:class:`~pcapkit.protocols.schema.Schema` subclass with typed fields, defined with the protocol's other schemas, and never built inside the map. Radiotap's field types are the example: -:attr:`Radiotap.__field__ ` is -written by :meth:`Radiotap.register_field ` +:attr:`Radiotap.__field__ ` is +written by :meth:`Radiotap.register_field ` and :func:`~pcapkit.foundation.registry.protocols.link.register_radiotap_field`, in the shape of :func:`~pcapkit.foundation.registry.protocols.transport.register_sctp_chunk` above, and each type's layout is a -:class:`~pcapkit.protocols.schema.link.radiotap.RadiotapField` subclass, whose fields +:class:`~pcapkit.protocols.link.radiotap.schema.RadiotapField` subclass, whose fields are the type's subfields and whose ``__align__`` is its alignment. .. _registry-protocol-make-fields: @@ -925,34 +925,34 @@ The Registry Index :class:`~pcapkit.const.reg.transtype.TransType` **or** :class:`~pcapkit.const.reg.apptype.apptype.AppType` **member wherever one names it**, ahead of any other registry's code, such as an :class:`~pcapkit.const.linux.arphrd.ARPHRD` type or an -NLPID. Ruled on :issue:`2627`. So :class:`~pcapkit.protocols.link.radiotap.Radiotap` returns +NLPID. Ruled on :issue:`2627`. So :class:`~pcapkit.protocols.link.radiotap.protocol.Radiotap` returns ``LinkType.IEEE802_11_RADIOTAP`` rather than ``ARPHRD.IEEE80211_RADIOTAP``. * **An AppType value is returned as its port.** An :class:`~pcapkit.const.reg.apptype.apptype.AppType` member is a :class:`str`, and :func:`int` and :func:`operator.index` raise :exc:`TypeError` when ``__index__`` returns anything but an :class:`int`, so a class an AppType member names returns that member's - port: :class:`~pcapkit.protocols.link.l2tpv2.L2TPv2` returns 1701, ``int(UDP.l2tp)``. - :class:`~pcapkit.protocols.application.tls.TLS`, which - :class:`~pcapkit.protocols.application.sslv3.SSLv3` inherits, and - :class:`~pcapkit.protocols.application.dtls.DTLS` return the ports TCP and UDP dispatch + port: :class:`~pcapkit.protocols.link.l2tpv2.protocol.L2TPv2` returns 1701, ``int(UDP.l2tp)``. + :class:`~pcapkit.protocols.application.tls.protocol.TLS`, which + :class:`~pcapkit.protocols.application.sslv3.protocol.SSLv3` inherits, and + :class:`~pcapkit.protocols.application.dtls.protocol.DTLS` return the ports TCP and UDP dispatch them at, 443 and 5684, although IANA registers those ports as ``https`` and ``coaps``, the protocols carried over them. Ruled on :issue:`2627`. * **Netlink keeps** ``ARPHRD.NETLINK``: ``LINKTYPE_NETLINK`` (253) names the SLL-framed - form, not the ``nlmsghdr`` :class:`~pcapkit.protocols.link.netlink.Netlink` reads. Ruled + form, not the ``nlmsghdr`` :class:`~pcapkit.protocols.link.netlink.protocol.Netlink` reads. Ruled on :issue:`2627`. * **The index keys no registration.** Every built-in ``__proto__`` entry spells out its key, so a class keeps its place in a secondary registry whatever its index: - :class:`~pcapkit.protocols.link.frad.FRAD` stays under ``ARPHRD.FRAD`` in - :attr:`LinuxSLL.__proto__ `. + :class:`~pcapkit.protocols.link.frad.protocol.FRAD` stays under ``ARPHRD.FRAD`` in + :attr:`LinuxSLL.__proto__ `. * **A class dispatched under several values returns one of them.** - :class:`~pcapkit.protocols.internet.ipv4.IPv4` and - :class:`~pcapkit.protocols.internet.ipv6.IPv6`, dispatched under LinkType 228 and 229, + :class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4` and + :class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6`, dispatched under LinkType 228 and 229, EtherType 0x0800 and 0x86DD, and TransType 4 and 41, and - :class:`~pcapkit.protocols.internet.ipx.IPX`, under EtherType 0x8137 and TransType 111, + :class:`~pcapkit.protocols.internet.ipx.protocol.IPX`, under EtherType 0x8137 and TransType 111, keep the TransType value they returned in 1.5.x, so no shipped value changes. - :class:`~pcapkit.protocols.link.loopback.Loopback`, at LinkType 0 and 108, returns - ``LinkType.NULL``, 0, and :class:`~pcapkit.protocols.application.http.HTTP`, at TCP and + :class:`~pcapkit.protocols.link.loopback.protocol.Loopback`, at LinkType 0 and 108, returns + ``LinkType.NULL``, 0, and :class:`~pcapkit.protocols.application.http.protocol.HTTP`, at TCP and UDP ports 80 and 8080, returns 80. * **An index is a reachability claim** wherever its enum declares ``__proto_dest__``. :file:`tests/protocols/test_dispatch_reachability_unit.py` requires the class in the @@ -962,33 +962,33 @@ NLPID. Ruled on :issue:`2627`. So :class:`~pcapkit.protocols.link.radiotap.Radio * **No value, no index.** :class:`~pcapkit.protocols.link.link.Link`, :class:`~pcapkit.protocols.internet.internet.Internet` and :class:`~pcapkit.protocols.transport.transport.Transport`, and the - :class:`~pcapkit.protocols.internet.ip.IP`, :class:`~pcapkit.protocols.internet.ipsec.IPsec` - and :class:`~pcapkit.protocols.internet.icmp.ICMP` family bases, leave the abstract method + :class:`~pcapkit.protocols.internet.ip.protocol.IP`, :class:`~pcapkit.protocols.internet.ipsec.protocol.IPsec` + and :class:`~pcapkit.protocols.internet.icmp.protocol.ICMP` family bases, leave the abstract method unimplemented and return :obj:`None`. These raise: - - :class:`~pcapkit.protocols.link.vlan.VLAN`, - :class:`~pcapkit.protocols.link.linux_sll.LinuxSLL` and - :class:`~pcapkit.protocols.link.l2tp.L2TP`, abstract family bases nothing dispatches + - :class:`~pcapkit.protocols.link.vlan.protocol.VLAN`, + :class:`~pcapkit.protocols.link.linux_sll.protocol.LinuxSLL` and + :class:`~pcapkit.protocols.link.l2tp.protocol.L2TP`, abstract family bases nothing dispatches to, whose members each carry a value of their own; - - :class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext`, although + - :class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext`, although :attr:`Internet.__proto__ ` dispatches it at TransType 140, Shim6: one class parses Shim6 and any other :rfc:`6564`-format header registered to it, so its value differs per instance, and ``__index__`` is a class method; - :class:`~pcapkit.protocols.application.application.Application`, and the - :class:`~pcapkit.protocols.application.ssl.SSL` family base and - :class:`~pcapkit.protocols.application.sslv2.SSLv2`, which define no ``__index__`` and + :class:`~pcapkit.protocols.application.ssl.protocol.SSL` family base and + :class:`~pcapkit.protocols.application.sslv2.protocol.SSLv2`, which define no ``__index__`` and inherit its raise. Nothing dispatches to SSLv2: an SSLv2 record on TCP port 443 parses as a TLS layer adopting SSLv2's data; - - :class:`~pcapkit.protocols.misc.raw.Raw` and - :class:`~pcapkit.protocols.misc.no_payload.NoPayload`, the undissected octets and the - empty payload, and :class:`~pcapkit.protocols.misc.checksum.ip_pseudo.IP_Pseudo`, the + - :class:`~pcapkit.protocols.misc.raw.protocol.Raw` and + :class:`~pcapkit.protocols.misc.no_payload.protocol.NoPayload`, the undissected octets and the + empty payload, and :class:`~pcapkit.protocols.misc.checksum.ip_pseudo.protocol.IP_Pseudo`, the checksum pseudo-header, which no registry value names. TransType 59, under which :attr:`Internet.__proto__ ` dispatches Raw, is IPv6-NoNxt, no next header; - - the PCAP :class:`~pcapkit.protocols.misc.pcap.header.Header` and - :class:`~pcapkit.protocols.misc.pcap.frame.Frame`, and - :class:`~pcapkit.protocols.misc.pcapng.PCAPNG`, the capture file's own records. A PCAP + - the PCAP :class:`~pcapkit.protocols.misc.pcap.header.protocol.Header` and + :class:`~pcapkit.protocols.misc.pcap.frame.protocol.Frame`, and + :class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG`, the capture file's own records. A PCAP frame or PCAP-NG packet block instance returns its index number, an ordinal outside the rule. diff --git a/docs/source/contributing/conventions/test-coverage.rst b/docs/source/contributing/conventions/test-coverage.rst index 3a916e5d44..04b78604e1 100644 --- a/docs/source/contributing/conventions/test-coverage.rst +++ b/docs/source/contributing/conventions/test-coverage.rst @@ -222,16 +222,16 @@ above: needs its ``PINNED_TARGETS`` entry in its family's module under :file:`examples/generators/dispatch_families/`, which ``test_every_case_has_a_pinned_target`` enforces. A protocol with a dispatch - registry of its own, as :class:`~pcapkit.protocols.link.frad.FRAD`, - :class:`~pcapkit.protocols.link.loopback.Loopback` and - :class:`~pcapkit.protocols.link.linux_sll.LinuxSLL` have, also needs a + registry of its own, as :class:`~pcapkit.protocols.link.frad.protocol.FRAD`, + :class:`~pcapkit.protocols.link.loopback.protocol.Loopback` and + :class:`~pcapkit.protocols.link.linux_sll.protocol.LinuxSLL` have, also needs a ``Family`` probing that ``__proto__`` table once it holds an entry, in a module of its own there, which ``test_every_dispatch_table_has_a_family`` enforces; another family whose probe passes through the table does not count (:issue:`2592`). Where a versioned family base owns the table, each member takes a family of its own, as - :class:`~pcapkit.protocols.link.linux_sll1.LinuxSLL1` and - :class:`~pcapkit.protocols.link.linux_sll2.LinuxSLL2` do, which + :class:`~pcapkit.protocols.link.linux_sll1.protocol.LinuxSLL1` and + :class:`~pcapkit.protocols.link.linux_sll2.protocol.LinuxSLL2` do, which ``test_a_versioned_base_table_has_a_family_per_member`` enforces. A :mod:`pcapkit.const` registry it adds is a line in its package's module under :file:`tests/const/census/`, in sorted order, or a module of its own there for a diff --git a/docs/source/contributing/conventions/utilities-or-corekit.rst b/docs/source/contributing/conventions/utilities-or-corekit.rst index ebe6d27e79..49e9425031 100644 --- a/docs/source/contributing/conventions/utilities-or-corekit.rst +++ b/docs/source/contributing/conventions/utilities-or-corekit.rst @@ -50,7 +50,7 @@ checksums through it, so it imports :mod:`pcapkit` only from ``corekit`` and ``utilities``, never from :mod:`pcapkit.protocols`; :file:`tests/corekit/test_checksum_import_boundary_2580_unit.py` checks that. What needs IPv4 and IPv6 stays beside -:class:`~pcapkit.protocols.misc.checksum.ip_pseudo.IP_Pseudo`. The package holds one +:class:`~pcapkit.protocols.misc.checksum.ip_pseudo.protocol.IP_Pseudo`. The package holds one module per checksum family, so a new family sits beside :mod:`~pcapkit.corekit.checksum.internet`. @@ -69,14 +69,14 @@ of placing each by the questions above. So :func:`~pcapkit.corekit.schema.shortread.replay_short_read` in :mod:`pcapkit.corekit.schema.shortread`. :mod:`pcapkit.corekit.schema` is not the header schema framework, which stays :mod:`pcapkit.protocols.schema` and its -:class:`~pcapkit.protocols.schema.schema.Schema`; it holds only the helpers shared +:class:`~pcapkit.protocols.schema.Schema`; it holds only the helpers shared across the layer. **A capture cut belongs to the built-in short read of** -:class:`~pcapkit.protocols.schema.schema.Schema`. :meth:`Schema.unpack -` records the field the data ends +:class:`~pcapkit.protocols.schema.Schema`. :meth:`Schema.unpack +` records the field the data ends inside, through ``_note_short_read``, as ``__short_read__``; -:meth:`~pcapkit.protocols.schema.schema.Schema._cut_short_read` packs back only the +:meth:`~pcapkit.protocols.schema.Schema._cut_short_read` packs back only the octets read; and :func:`~pcapkit.corekit.schema.shortread.keep_short_read` and :func:`~pcapkit.corekit.schema.shortread.replay_short_read` carry the record through ``info`` and cut a rebuild back by it. A protocol reads and rebuilds a cut header @@ -85,12 +85,12 @@ clamped to the octets present, which hides the cut from the record. Ruled in rev of :pr:`2682` (:issue:`2680`), and applied to option areas on :issue:`2694`. A field callback tells a value the cut left as zero from one read through the same -record: :meth:`Schema.unpack ` gives +record: :meth:`Schema.unpack ` gives it to the fields after the one the data ends inside, as ``__short_read__`` in their packet. A callback that would refuse such a zero leaves it to the short read, and refuses a value read with a :exc:`~pcapkit.utilities.exceptions.ProtocolError`, as the ``Opt Data Len`` helpers of -:mod:`pcapkit.protocols.schema.internet.ipv6_option` do (:issue:`2727`). +:mod:`pcapkit.protocols.internet.ipv6_ext.schema` do (:issue:`2727`). **A helper in one protocol's own schema module moves there too once code outside that protocol uses it and it is generic enough to reuse**, so that another implementor can @@ -99,9 +99,9 @@ find it; a helper only its own protocol calls stays beside the schema. Ruled on :func:`~pcapkit.corekit.schema.jumbogram.jumbo_payload_length`, which the IPv6 pseudo-header and the Scapy toolkit read as well as IPv6 itself, is in :mod:`pcapkit.corekit.schema.jumbogram`, while -:func:`~pcapkit.protocols.schema.internet.ipv6.jumbogram_error`, which only IPv6 -calls, stays in :mod:`pcapkit.protocols.schema.internet.ipv6`. The IPv6 option -helpers in :mod:`pcapkit.protocols.schema.internet.ipv6_option` belong to the HOPOPT +:func:`~pcapkit.protocols.internet.ipv6.schema.jumbogram_error`, which only IPv6 +calls, stays in :mod:`pcapkit.protocols.internet.ipv6.schema`. The IPv6 option +helpers in :mod:`pcapkit.protocols.internet.ipv6_ext.schema` belong to the HOPOPT and IPv6-Opts headers that share them, and stay there too. The field modules and the protocols import these helpers, so a helper module imports @@ -110,7 +110,7 @@ block; the package's ``__init__.py`` imports none of its modules, so a field mod loads only the group it asks for. :file:`tests/project/test_schema_helpers_boundary_2674_unit.py` fails on a helper module that does, on a module outside the layer that refers to a function defined in -a field module or in :mod:`pcapkit.protocols.schema.schema`, and on a module outside +a field module or in :mod:`pcapkit.protocols.schema`, and on a module outside a protocol that refers to a function defined in that protocol's schema module, by import or as an attribute of the module. diff --git a/docs/source/contributing/pep.rst b/docs/source/contributing/pep.rst index 6547b20853..86974241fa 100644 --- a/docs/source/contributing/pep.rst +++ b/docs/source/contributing/pep.rst @@ -49,20 +49,20 @@ the ones outstanding are, Several of these come in pairs that want a shared abstract base rather than two independent implementations, in the way -:class:`~pcapkit.protocols.internet.ip.IP` and -:class:`~pcapkit.protocols.internet.icmp.ICMP` already cover their families: +:class:`~pcapkit.protocols.internet.ip.protocol.IP` and +:class:`~pcapkit.protocols.internet.icmp.protocol.ICMP` already cover their families: IP and IPsec, and TLS/SSL with DTLS. **Done** for TLS/SSL -with DTLS: :class:`~pcapkit.protocols.application.sslv2.SSLv2`, -:class:`~pcapkit.protocols.application.tls.TLS` and -:class:`~pcapkit.protocols.application.dtls.DTLS` share -:class:`~pcapkit.protocols.application.ssl.SSL` as their base by name, and only +with DTLS: :class:`~pcapkit.protocols.application.sslv2.protocol.SSLv2`, +:class:`~pcapkit.protocols.application.tls.protocol.TLS` and +:class:`~pcapkit.protocols.application.dtls.protocol.DTLS` share +:class:`~pcapkit.protocols.application.ssl.protocol.SSL` as their base by name, and only TLS and DTLS share its record layer -- see the `DTLS`_ section below. Neighbor Discovery (:rfc:`4861`, the ``NDP`` above) and Multicast Listener Discovery (:rfc:`9777`), both carried in ICMPv6, are not implemented. -:class:`~pcapkit.protocols.link.vlan.VLAN` is the closer precedent for a pair +:class:`~pcapkit.protocols.link.vlan.protocol.VLAN` is the closer precedent for a pair whose *layout* is identical -- it holds the whole of the tag, and -:class:`~pcapkit.protocols.link.c_tag.C_Tag` and -:class:`~pcapkit.protocols.link.s_tag.S_Tag` add only how each names itself. +:class:`~pcapkit.protocols.link.c_tag.protocol.C_Tag` and +:class:`~pcapkit.protocols.link.s_tag.protocol.S_Tag` add only how each names itself. .. note:: @@ -77,7 +77,7 @@ whose *layout* is identical -- it holds the whole of the tag, and SCTP ~~~~ -**Done.** :class:`~pcapkit.protocols.transport.sctp.SCTP` is a first-class +**Done.** :class:`~pcapkit.protocols.transport.sctp.protocol.SCTP` is a first-class transport layer protocol implemented per :rfc:`9260`: the common header, every chunk type, chunk parameter and error cause the RFC defines, and CRC32c checksum verification. @@ -103,7 +103,7 @@ messages -- see `Reassembly Beyond IP and TCP`_ below, since it needs work in ESP ~~~ -**Done.** :class:`~pcapkit.protocols.internet.esp.ESP` parses without keys, and +**Done.** :class:`~pcapkit.protocols.internet.esp.protocol.ESP` parses without keys, and decrypts when a Security Association is supplied through the protocol keyed :mod:`pcapkit.corekit.context` channel. @@ -111,8 +111,8 @@ What is still wanted there is wider algorithm coverage. The enumerations under :doc:`/pcapkit/const/esp` -- :class:`~pcapkit.const.esp.cipher.Cipher` and :class:`~pcapkit.const.esp.integrity.Integrity` -- carry every transform IANA has -registered, but :data:`~pcapkit.protocols.internet.esp.CIPHER_SUITES` and -:data:`~pcapkit.protocols.internet.esp.INTEGRITY_SUITES` apply only a few of +registered, but :data:`~pcapkit.protocols.internet.esp.protocol.CIPHER_SUITES` and +:data:`~pcapkit.protocols.internet.esp.protocol.INTEGRITY_SUITES` apply only a few of them, the no-ops ``ENCR_NULL`` and ``NONE`` among them. So the real coverage is AES-CBC and AES-GCM at every tag length for encryption, and HMAC-SHA1-96 plus the :rfc:`4868` HMAC-SHA2 truncations for integrity. @@ -129,9 +129,9 @@ they widen both the ICV coverage and the AEAD associated data. The structure limits what a new row can do. Adding an integrity algorithm that is not an HMAC needs more than a row -- -:class:`~pcapkit.protocols.internet.esp.IntegritySuite` records the digest as +:class:`~pcapkit.protocols.internet.esp.protocol.IntegritySuite` records the digest as the name of a :mod:`hashlib` constructor, which AES-XCBC and AES-CMAC are not. -And :func:`~pcapkit.protocols.internet.esp.load_cryptography` imports only the +And :func:`~pcapkit.protocols.internet.esp.protocol.load_cryptography` imports only the ``ciphers`` submodules of |cryptography|_, so the AEAD and CMAC primitives have to be added there before a cipher suite can reach them. Unsupported algorithms are refused loudly, when the Security Association is constructed @@ -141,12 +141,12 @@ Mobility Header ~~~~~~~~~~~~~~~ **Done.** -:class:`~pcapkit.protocols.internet.mh.MH` decodes and constructs the whole +:class:`~pcapkit.protocols.internet.mh.protocol.MH` decodes and constructs the whole registry: **every registered message data type**, **every CGA extension**, and **every registered option**. Every one of them is registered in -:attr:`~pcapkit.protocols.internet.mh.MH.__message__`, -:attr:`~pcapkit.protocols.internet.mh.MH.__option__` or -:attr:`~pcapkit.protocols.internet.mh.MH.__extension__` with both a ``_read_`` +:attr:`~pcapkit.protocols.internet.mh.protocol.MH.__message__`, +:attr:`~pcapkit.protocols.internet.mh.protocol.MH.__option__` or +:attr:`~pcapkit.protocols.internet.mh.protocol.MH.__extension__` with both a ``_read_`` and a ``_make_`` handler. Every message type and every one of those options round-trips byte-for-byte @@ -156,7 +156,7 @@ the same octets, which registry. The **CGA extensions round-trip end to end as well**: the CGA Parameters option (type 12) is the only thing that can carry a CGA extension on the wire, so registering it reached the whole -:attr:`~pcapkit.protocols.internet.mh.MH.__extension__` registry with it, and no +:attr:`~pcapkit.protocols.internet.mh.protocol.MH.__extension__` registry with it, and no ``mh-extension`` entry appears in that test's ``EXPECTED_FAILURES``. The sub-registries are the easy half: binding revocation types and triggers, @@ -166,9 +166,9 @@ traffic selector formats and QoS attributes are all generated in full under :doc:`/pcapkit/const/mh`. Value sets that IANA does not register live in ``mh.py`` itself rather than in :mod:`pcapkit.const.mh`: the localized routing acknowledgment status codes of :rfc:`6705#section-10.2` -(:class:`~pcapkit.protocols.internet.mh.LocalizedRoutingStatus`) and the local +(:class:`~pcapkit.protocols.internet.mh.protocol.LocalizedRoutingStatus`) and the local mobility anchor address option codes of :rfc:`5949#section-6.2.2` -(:class:`~pcapkit.protocols.internet.mh.LMAAddressCode`). Sets from :rfc:`5568` +(:class:`~pcapkit.protocols.internet.mh.protocol.LMAAddressCode`). Sets from :rfc:`5568` live there alongside them. What is left, and why: @@ -180,16 +180,16 @@ What is left, and why: with its own dissector's worth of structure; the mobility options around them are fully decoded, and each records which format its payload is in. - What is wanted is to carry these as :class:`~pcapkit.protocols.misc.raw.Raw` + What is wanted is to carry these as :class:`~pcapkit.protocols.misc.raw.protocol.Raw` rather than as bare :obj:`bytes`, dispatched through a **per-payload registry** - in the style of :attr:`MH.__option__ `, + in the style of :attr:`MH.__option__ `, keyed on the field that already names the format -- - :attr:`~pcapkit.protocols.schema.internet.mh.TrafficSelectorSuboption.ts_format` + :attr:`~pcapkit.protocols.internet.mh.schema.TrafficSelectorSuboption.ts_format` for the traffic selectors, and on the multicast options the message-type octet each carries: ``protocol`` on option 54, ``igmp_type`` and ``mld_type`` on 56 and 57, and ``code`` on 60. Not the ``M`` flag on option 54, which selects the routing mode rather than the record format [:rfc:`7028#section-5.1.2`]. - :class:`~pcapkit.protocols.misc.raw.Raw` is already what an unregistered dispatch falls back + :class:`~pcapkit.protocols.misc.raw.protocol.Raw` is already what an unregistered dispatch falls back to everywhere else in the package, so this makes the mobility header consistent with the rest rather than inventing a convention; and once a dissector for one of these formats exists, registering it needs no change at the option site. @@ -197,8 +197,8 @@ What is left, and why: None of those keys is checked against the values its RFC allows, on either side. :rfc:`7028` says ``protocol`` MUST be 143 or 131 for MLD, or ``0x12``, ``0x16`` or ``0x22`` for IGMP, yet - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_mcast_sel` builds and - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_mcast_sel` parses any octet + :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_mcast_sel` builds and + :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_mcast_sel` parses any octet without a warning, and the other keys behave the same. The registry is where an unknown key would first be noticed, so the check belongs there rather than in each maker separately. @@ -209,7 +209,7 @@ What is left, and why: An MLD address record inside a mobility option does not follow MH on the wire, so putting it in that chain would make ``layer=`` and ``protocol=`` limits behave wrongly. Changing the parsed shape from :obj:`bytes` to - :class:`~pcapkit.protocols.misc.raw.Raw` also changes what existing captures dump to, so + :class:`~pcapkit.protocols.misc.raw.protocol.Raw` also changes what existing captures dump to, so it is its own change. Wire-format traps are worth knowing before touching this code, since each @@ -224,44 +224,44 @@ looks like an ordinary field and is not: 48/16 fixed-point split, where NTP counts from 1900 in a 32/32 one, so reading one as the other is wrong in the epoch and in both field widths. They have separate types for that reason: - :class:`~pcapkit.protocols.data.internet.mh.PMIPv6Timestamp` and - :class:`~pcapkit.protocols.data.internet.mh.NTPTimestamp`. + :class:`~pcapkit.protocols.internet.mh.data.PMIPv6Timestamp` and + :class:`~pcapkit.protocols.internet.mh.data.NTPTimestamp`. DTLS ~~~~ **Done** for the record layer and handshake message framing: -:class:`~pcapkit.protocols.application.tls.TLS` (SSLv3, :rfc:`6101`; TLS +:class:`~pcapkit.protocols.application.tls.protocol.TLS` (SSLv3, :rfc:`6101`; TLS 1.0, :rfc:`2246`; TLS 1.1, :rfc:`4346`; TLS 1.2, :rfc:`5246`; TLS 1.3, -:rfc:`9846`) and :class:`~pcapkit.protocols.application.dtls.DTLS` (DTLS +:rfc:`9846`) and :class:`~pcapkit.protocols.application.dtls.protocol.DTLS` (DTLS 1.0, :rfc:`4347`; DTLS 1.2, :rfc:`6347`; DTLS 1.3, :rfc:`9147`) share -:class:`~pcapkit.protocols.application.ssl.SSL` as their record-layer base -- +:class:`~pcapkit.protocols.application.ssl.protocol.SSL` as their record-layer base -- content type, legacy version, length, and content-type dispatch -- with DTLS's own divergence (the epoch/sequence-number pair in its record header, and the fragment header each handshake message carries) staying in -:class:`~pcapkit.protocols.application.dtls.DTLS` alone. ``ClientHello`` and +:class:`~pcapkit.protocols.application.dtls.protocol.DTLS` alone. ``ClientHello`` and ``ServerHello`` decode down to their cipher suite(s), compression method(s) and extension list, and ``EncryptedExtensions`` down to its extension list. An extension body decodes where -:attr:`SSL.__extension__ ` +:attr:`SSL.__extension__ ` registers a decoder for its type, and stays raw octets where none is registered or the decoder rejects it (:issue:`2514`). Every other handshake message is message-TYPE-level framing only. Decryption is a separate question and is not needed to make the record structure legible, in -the same way :class:`ESP ` parses +the same way :class:`ESP ` parses without keys. **Done** for SSLv2 too (draft-hickman-netscape-ssl-00, :issue:`2457`): -:class:`~pcapkit.protocols.application.sslv2.SSLv2` shares -:class:`~pcapkit.protocols.application.ssl.SSL` by name only, since its 2- or +:class:`~pcapkit.protocols.application.sslv2.protocol.SSLv2` shares +:class:`~pcapkit.protocols.application.ssl.protocol.SSL` by name only, since its 2- or 3-octet record header carries no content type and no ``0x03xx`` version. No port binds it: on TCP port 443, TLS offers it a segment whose first record TLS rejects, and adopts the parse only when that record is a complete ``CLIENT-HELLO`` or ``SERVER-HELLO``, keeping anything else -:class:`~pcapkit.protocols.misc.raw.Raw`. A whole record after the first is a +:class:`~pcapkit.protocols.misc.raw.protocol.Raw`. A whole record after the first is a further layer, the previous record's payload (:issue:`2567`), with the exceptions -:mod:`pcapkit.protocols.application.sslv2` lists. Among them, a record with a -``RECORD-LENGTH`` of ``0`` is :class:`~pcapkit.protocols.misc.raw.Raw` together +:mod:`pcapkit.protocols.application.sslv2.protocol` lists. Among them, a record with a +``RECORD-LENGTH`` of ``0`` is :class:`~pcapkit.protocols.misc.raw.protocol.Raw` together with everything after it, and :data:`~pcapkit.utilities.config.FRAME_LAYER_LIMIT` bounds how many are dissected. :ref:`protocol-family-ssl` gives how ``id()`` and ``alias`` tell the family's members apart. @@ -275,17 +275,17 @@ default engine, which feeds it through :func:`~pcapkit.foundation.analysis.dtls.dtls_handshake` decodes each reassembled message, of any length (:issue:`2496`). In the frame itself every fragment's body stays that one fragment's raw octets -- see -:attr:`DTLSHandshake.is_fragmented `. +:attr:`DTLSHandshake.is_fragmented `. An unfragmented message is unaffected either way. NGAP over DTLS over SCTP (PPID 66, :class:`~pcapkit.const.sctp.payload_protocol_identifier.PayloadProtocolIdentifier`), asked for in `discussion #251 `__, is **not** -decoded: :attr:`SCTP.__proto__ ` -maps PPID 66 to :class:`~pcapkit.protocols.application.ngap.NGAP` rather than -through :class:`~pcapkit.protocols.application.dtls.DTLS`, so those bytes -degrade to :class:`~pcapkit.protocols.misc.raw.Raw`. Rewiring that dispatch +decoded: :attr:`SCTP.__proto__ ` +maps PPID 66 to :class:`~pcapkit.protocols.application.ngap.protocol.NGAP` rather than +through :class:`~pcapkit.protocols.application.dtls.protocol.DTLS`, so those bytes +degrade to :class:`~pcapkit.protocols.misc.raw.protocol.Raw`. Rewiring that dispatch needs a decision on what an undecrypted DTLS-wrapped NGAP PDU reports. Registered, but Not Dissected @@ -294,14 +294,14 @@ Registered, but Not Dissected A different shape of gap from the empty stubs, and easy to miss because nothing announces it. The :doc:`/pcapkit/const/reg` enumerations are complete, but only a small part of each is bound to a dissector; everything else resolves to -:class:`~pcapkit.protocols.misc.raw.Raw`, so the capture parses without +:class:`~pcapkit.protocols.misc.raw.protocol.Raw`, so the capture parses without complaint and yields nothing useful. * :class:`~pcapkit.const.reg.linktype.LinkType` -- ``NULL``, ``ETHERNET``, ``IEEE802_11``, ``FRELAY``, ``LOOP``, ``LINUX_SLL``, ``IEEE802_11_RADIOTAP``, ``IPV4``, ``IPV6`` and ``LINUX_SLL2``, declared identically - in :class:`~pcapkit.protocols.misc.pcap.frame.Frame` and - :class:`~pcapkit.protocols.misc.pcapng.PCAPNG`, which also read ``RAW`` as + in :class:`~pcapkit.protocols.misc.pcap.frame.protocol.Frame` and + :class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG`, which also read ``RAW`` as ``IPV4`` or ``IPV6`` by its version nibble. * :class:`~pcapkit.const.reg.transtype.TransType` -- the values in :attr:`Internet.__proto__ @@ -310,16 +310,16 @@ complaint and yields nothing useful. :attr:`Link.__proto__ `: ARP, RARP, IPv4, IPv6, IPX and both VLAN tags. * :class:`~pcapkit.const.reg.apptype.apptype.AppType` -- the ports bound in - :attr:`TCP.__proto__ ` and - :attr:`UDP.__proto__ `, out of + :attr:`TCP.__proto__ ` and + :attr:`UDP.__proto__ `, out of a registry carrying every IANA service name: TCP 20 to FTP-DATA, 21 to FTP and 443 to TLS, ports 80 and 8080 to HTTP on both TCP and UDP, and UDP 1701 to L2TPv2 and 5684 to DTLS. * :class:`~pcapkit.const.sctp.payload_protocol_identifier.PayloadProtocolIdentifier` -- the values in :attr:`SCTP.__proto__ - `: PPIDs 60 and 66, each to - :class:`~pcapkit.protocols.application.ngap.NGAP`. Every other DATA chunk - payload is :class:`~pcapkit.protocols.misc.raw.Raw` until something calls + `: PPIDs 60 and 66, each to + :class:`~pcapkit.protocols.application.ngap.protocol.NGAP`. Every other DATA chunk + payload is :class:`~pcapkit.protocols.misc.raw.protocol.Raw` until something calls :func:`~pcapkit.foundation.registry.protocols.transport.register_sctp`. How much of each registry is bound is measurable, so measure it rather than @@ -334,33 +334,33 @@ trust a figure written down here: Most of those want a dissector written and are covered by the stub list above. Some wanted only a table entry, because the dissector was already there: -* **Done.** :class:`~pcapkit.protocols.application.ospf.OSPF` is bound at +* **Done.** :class:`~pcapkit.protocols.application.ospf.protocol.OSPF` is bound at :class:`~pcapkit.const.reg.transtype.TransType` 89 (``OSPFIGP``) and - :class:`~pcapkit.protocols.link.l2tpv2.L2TPv2` at UDP port 1701, and + :class:`~pcapkit.protocols.link.l2tpv2.protocol.L2TPv2` at UDP port 1701, and ``__index__`` returns those values: ``TransType.OSPFIGP``, and 1701 as an :class:`int`, as an AppType-valued index is the member's port (:ref:`registry-protocol-index`). -* **Done.** :class:`~pcapkit.protocols.application.ftp_data.FTP_DATA` is bound at TCP +* **Done.** :class:`~pcapkit.protocols.application.ftp_data.protocol.FTP_DATA` is bound at TCP port 20 (IANA ``ftp-data``). It is a thin - :class:`~pcapkit.protocols.misc.raw.Raw` subclass, so this buys the payload a + :class:`~pcapkit.protocols.misc.raw.protocol.Raw` subclass, so this buys the payload a *name* rather than a parse -- which is the right answer for a data channel carrying an arbitrary file. * **Done.** HTTP is additionally bound on 8080 (IANA ``http-alt``, "HTTP Alternate (see port 80)") on both TCP and UDP. TCP 443 (IANA ``https``) is - bound to :class:`~pcapkit.protocols.application.tls.TLS` and UDP 5684 (IANA - ``coaps``) to :class:`~pcapkit.protocols.application.dtls.DTLS`. **8443 is deliberately left unbound**: IANA registers it as + bound to :class:`~pcapkit.protocols.application.tls.protocol.TLS` and UDP 5684 (IANA + ``coaps``) to :class:`~pcapkit.protocols.application.dtls.protocol.DTLS`. **8443 is deliberately left unbound**: IANA registers it as ``pcsync-https``, not as an HTTP alternate, and binding it to HTTP would feed a TLS record to an HTTP parser; binding it to TLS instead would be a guess this registry does not make for a service IANA does not actually name there. * **Done.** The service VLAN tag identifier (S-Tag), ``0x88A8``, is bound to - :class:`~pcapkit.protocols.link.s_tag.S_Tag`, and the customer tag ``0x8100`` - to :class:`~pcapkit.protocols.link.c_tag.C_Tag`. Both subclass the abstract - :class:`~pcapkit.protocols.link.vlan.VLAN`, which carries the shared tag + :class:`~pcapkit.protocols.link.s_tag.protocol.S_Tag`, and the customer tag ``0x8100`` + to :class:`~pcapkit.protocols.link.c_tag.protocol.C_Tag`. Both subclass the abstract + :class:`~pcapkit.protocols.link.vlan.protocol.VLAN`, which carries the shared tag layout; the split exists so that a Q-in-Q frame's two tags stay distinct in the parsed output. * **Done.** :class:`~pcapkit.const.reg.linktype.LinkType` ``NULL`` and ``LOOP`` are bound to - :class:`~pcapkit.protocols.link.loopback.Loopback`, which reads the four-octet + :class:`~pcapkit.protocols.link.loopback.protocol.Loopback`, which reads the four-octet address family word and hands 2 to IPv4 and 24, 28 or 30 to IPv6 (:issue:`1574`). ``RAW`` has no binding of its own: its bare IPv4 or IPv6 is dispatched by the version nibble of the first octet (:issue:`1502`). @@ -370,22 +370,22 @@ Follow-ups to the bindings above: * :class:`~pcapkit.const.reg.transtype.TransType` 115 (``L2TP``) stays unbound, and the reason is structural: it references :rfc:`3931`, i.e. L2TPv3 over IP, and **there is no** ``L2TPv3`` **class for it to point at**. What exists is - :class:`~pcapkit.protocols.link.l2tpv2.L2TPv2`, the :rfc:`2661` v2 framing, reached over + :class:`~pcapkit.protocols.link.l2tpv2.protocol.L2TPv2`, the :rfc:`2661` v2 framing, reached over UDP 1701, which is its :meth:`~pcapkit.protocols.protocol.Protocol.__index__`. So the - binding waits on a v3 dissector. :mod:`pcapkit.protocols.link.l2tp` records what v3 + binding waits on a v3 dissector. :mod:`pcapkit.protocols.link.l2tp.protocol` records what v3 needs, and what ``L2F`` needs alongside it: the version nibble reading ``1`` selects L2F [:rfc:`2341`], a separate protocol, not an earlier L2TP. -* The :class:`~pcapkit.protocols.link.l2tp.L2TP` family lives under +* The :class:`~pcapkit.protocols.link.l2tp.protocol.L2TP` family lives under :mod:`pcapkit.protocols.link` and so reports ``layer == 'Link'``, although it is carried inside UDP. That is deliberate: a tunnelling protocol is placed by what it carries (:ref:`protocol-layer-placement`). It is inert for layer-limited extraction, since IPv4 and IPv6 terminate an ``internet`` extraction before it is reached. * **Done.** :attr:`TCP.__proto__ - ` and :attr:`UDP.__proto__ - ` both point their HTTP ports at - the version-identifying proxy :class:`pcapkit.protocols.application.http.HTTP` - rather than at :class:`pcapkit.protocols.application.httpv1.HTTPv1`, so a + ` and :attr:`UDP.__proto__ + ` both point their HTTP ports at + the version-identifying proxy :class:`pcapkit.protocols.application.http.protocol.HTTP` + rather than at :class:`pcapkit.protocols.application.httpv1.protocol.HTTPv1`, so a segment's HTTP version is decided by its payload rather than asserted by its port number. That depends on the proxy identifying the version positively instead of guessing, since a guess path is wrong on non-HTTP input. @@ -398,7 +398,7 @@ PCAPNG Support -------------- **Done.** The builtin default engine parses PCAP-NG files; -:class:`~pcapkit.protocols.misc.pcapng.PCAPNG` implements the format, with its +:class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG` implements the format, with its block and option enumerations under :doc:`/pcapkit/const/pcapng`. This closes :issue:`35`. @@ -417,7 +417,7 @@ predicted: :func:`copy.copy` machinery, 63207 times per extraction; * :attr:`Field.length ` recomputes :func:`struct.calcsize` on each read and was read two to four times per field; -* :class:`~pcapkit.protocols.schema.schema.Schema`'s ``__setattr__`` re-entered +* :class:`~pcapkit.protocols.schema.Schema`'s ``__setattr__`` re-entered itself once per field assigned. Predictions the profiling **contradicted**, recorded so nobody spends time on @@ -432,7 +432,7 @@ addressed in full or in part: * **The flow dumper reopens its output file once per frame**, in :class:`~pcapkit.dumpkit.pcap.PCAPIO`'s ``__call__``. It does not *also* rebuild a whole - :class:`~pcapkit.protocols.misc.pcap.frame.Frame` to obtain bytes it already + :class:`~pcapkit.protocols.misc.pcap.frame.protocol.Frame` to obtain bytes it already holds; dropping that re-dissection was about 82% of the cost of a flow-traced extraction by itself. The reopen is what remains. * **A datagram is submitted for every frame, fragmented or not**, because @@ -472,7 +472,7 @@ Recursion stays, with a counted bound: :data:`~pcapkit.utilities.config.FRAME_LAYER_LIMIT` caps a frame at 64 layers by default, and :data:`~pcapkit.utilities.config.EXTENSION_HEADER_LIMIT` caps one chain of extension headers at 32 by default. Past either, the rest stays -:class:`~pcapkit.protocols.misc.raw.Raw`, with one +:class:`~pcapkit.protocols.misc.raw.protocol.Raw`, with one :exc:`~pcapkit.utilities.warnings.ProtocolWarning`. Raising :func:`sys.setrecursionlimit` instead was rejected: it is process-wide, and the cut-off would still move with the caller's stack. The bound fits with room to @@ -687,7 +687,7 @@ back together, and :mod:`pcapkit.foundation.reassembly` has no SCTP reassembler. What that costs is concrete. The dissector already exposes everything a reassembler needs, on -:class:`~pcapkit.protocols.data.transport.sctp.DATAChunk` -- ``tsn``, +:class:`~pcapkit.protocols.transport.sctp.data.DATAChunk` -- ``tsn``, ``stream_id``, ``stream_seq``, ``ppid``, ``data``, and ``flags.B`` and ``flags.E`` for the beginning and ending fragment bits -- and nothing reads those two bits outside the construction path. So each fragment is dispatched on @@ -837,21 +837,21 @@ Checksum and Integrity Verification ----------------------------------- These protocols parse a checksum or CRC field โ€” -:class:`~pcapkit.protocols.link.gre.GRE`, -:class:`~pcapkit.protocols.internet.hip.HIP`, -:class:`~pcapkit.protocols.internet.hopopt.HOPOPT`, -:class:`~pcapkit.protocols.internet.igmp.IGMP`, -:class:`~pcapkit.protocols.internet.ipv4.IPv4`, -:class:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts`, -:class:`~pcapkit.protocols.internet.ipx.IPX`, -:class:`~pcapkit.protocols.internet.mh.MH`, -:class:`~pcapkit.protocols.application.ospf.OSPF`, -:class:`~pcapkit.protocols.transport.dccp.DCCP`, -:class:`~pcapkit.protocols.transport.sctp.SCTP`, -:class:`~pcapkit.protocols.transport.tcp.TCP` and -:class:`~pcapkit.protocols.transport.udp.UDP` โ€” and SCTP was the first to +:class:`~pcapkit.protocols.link.gre.protocol.GRE`, +:class:`~pcapkit.protocols.internet.hip.protocol.HIP`, +:class:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT`, +:class:`~pcapkit.protocols.internet.igmp.protocol.IGMP`, +:class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4`, +:class:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts`, +:class:`~pcapkit.protocols.internet.ipx.protocol.IPX`, +:class:`~pcapkit.protocols.internet.mh.protocol.MH`, +:class:`~pcapkit.protocols.application.ospf.protocol.OSPF`, +:class:`~pcapkit.protocols.transport.dccp.protocol.DCCP`, +:class:`~pcapkit.protocols.transport.sctp.protocol.SCTP`, +:class:`~pcapkit.protocols.transport.tcp.protocol.TCP` and +:class:`~pcapkit.protocols.transport.udp.protocol.UDP` โ€” and SCTP was the first to check whether the value is *right*, through -:attr:`SCTP.checksum_valid `. +:attr:`SCTP.checksum_valid `. IPv4, OSPF, TCP, UDP and DCCP check it too, as do ICMP, ICMPv6, IGMP and GRE, as the one's-complement half below describes. For HIP, HOPOPT, IPv6-Opts, IPX and MH the field is recorded and never questioned, so a corrupted capture parses as @@ -872,12 +872,12 @@ That is precisely why SCTP came first and is not evidence the rest are easy: :rfc:`9260#section-6.8` defines its CRC32c over the common header and chunks with the checksum field zeroed and **no pseudo-header**, so it can be verified from the SCTP packet alone. Note also that SCTP's CRC32c is a hand-rolled lookup table -in :mod:`pcapkit.protocols.transport.sctp`, not a library call, so it is not +in :mod:`pcapkit.protocols.transport.sctp.protocol`, not a library call, so it is not precedent for a dependency either. **The cryptographic integrity checks** are where the |cryptography|_ dependency โ€” introduced for ESP โ€” genuinely buys something new, and half of that -is already done. :class:`~pcapkit.protocols.internet.esp.ESP` **already verifies +is already done. :class:`~pcapkit.protocols.internet.esp.protocol.ESP` **already verifies its ICV** when a Security Association is supplied, and deliberately reports a failure rather than raising, so a forged packet still parses and says so. What is *not* done is **HIP**: its ``HIP_MAC``, ``HIP_MAC_2``, ``RVS_HMAC`` and @@ -898,7 +898,7 @@ owner, and each lands on a precedent the library already has: :class:`~pcapkit.utilities.warnings.ChecksumWarning`, a :class:`~pcapkit.utilities.warnings.ProtocolWarning` of its own so a filter can silence it alone (:issue:`2470`), and the recording has an - exact precedent in :class:`~pcapkit.protocols.internet.esp.ESPStatus`: an + exact precedent in :class:`~pcapkit.protocols.internet.esp.protocol.ESPStatus`: an enumeration of outcomes carried on the parsed result, so a caller can ask after the fact rather than having to have been capturing warnings at the time. That distinction matters โ€” a warning is for the human watching, and the @@ -919,12 +919,12 @@ host routinely contains checksums the NIC had not computed yet, so the field is zero or garbage on the wire and "invalid" is the wrong word for it. Whatever status enumeration this grows should be able to say *not computed* distinctly from *wrong*, or it will cry wolf on the commonest capture there is โ€” -:class:`~pcapkit.protocols.internet.esp.ESPStatus`'s ``NO_SA`` member is the +:class:`~pcapkit.protocols.internet.esp.protocol.ESPStatus`'s ``NO_SA`` member is the model for how to spell "expected, not an error". **The one's-complement half is done** for every protocol named above (:issue:`2470`, :issue:`2472` to :issue:`2475`, :issue:`2489`, :issue:`2618`), on -:class:`~pcapkit.protocols.misc.checksum.ip_pseudo.IP_Pseudo` +:class:`~pcapkit.protocols.misc.checksum.ip_pseudo.protocol.IP_Pseudo` (:issue:`2471`) and :mod:`pcapkit.corekit.checksum.internet`, settled as below: the toggles by the owner on :issue:`2471`, the rest at implementation, as the offload question above asked; the owner accepted the toggles and the @@ -938,8 +938,8 @@ offload heuristic on :issue:`2470`. a caller needs one. A checksum given to ``make()`` is written as given, which is what keeps a rebuild byte for byte; there is no :class:`~pcapkit.foundation.extraction.Extractor` or per-instance parameter. -* **The IP layer owns the pseudo-header.** :class:`~pcapkit.protocols.internet.ipv4.IPv4` - and :class:`~pcapkit.protocols.internet.ipv6.IPv6` verify their upper layer's +* **The IP layer owns the pseudo-header.** :class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4` + and :class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6` verify their upper layer's checksum once parsed, and compute it for an upper layer constructed as their payload; ``make()`` of TCP, UDP and ICMPv6 also takes the ``pseudo`` itself. * **Offload is** :attr:`~pcapkit.corekit.checksum.internet.ChecksumStatus.NOT_COMPUTED`, @@ -1016,7 +1016,7 @@ So no ``make()`` infers a member from a string, ruled in review of :pr:`2593` ``int``, resolved with the enumeration's :meth:`~pcapkit.corekit.enum.EnumLookup.get`. That settles a call's contract at the signature, the way :func:`~pcapkit.corekit.infoclass.info_final` and -:func:`~pcapkit.protocols.schema.schema.schema_final` settle a constructor's +:func:`~pcapkit.protocols.schema.schema_final` settle a constructor's keyword set once at class-definition time, and :attr:`~pcapkit.protocols.protocol.Protocol.__own_make_keywords__` (:issue:`2286`) which keywords a ``make()`` override owns. The pieces: @@ -1154,7 +1154,7 @@ so in the `discussion thread **Wave 1 โ€” done.** The Mobility Header registry completion, the protocol bindings (FTP-DATA, HTTP-alt, OSPF, L2TP, the 802.1ad S-Tag), the -:class:`~pcapkit.protocols.link.vlan.VLAN` C-Tag/S-Tag split, the option +:class:`~pcapkit.protocols.link.vlan.protocol.VLAN` C-Tag/S-Tag split, the option round-trip coverage harness, and reassembly's :rfc:`8200` timeout with bidirectional flow tracing. Its defect tail closed out through the post-wave-1 consistency sweep described under `Release Plan โ€” 1.5.0 in Two @@ -1167,32 +1167,32 @@ question is the design work and doing either half of a pair alone would answer i twice. **DCCP โ€” done within wave 2** (:issue:`2489`). -:class:`~pcapkit.protocols.transport.dccp.DCCP` dissects every :rfc:`4340` packet +:class:`~pcapkit.protocols.transport.dccp.protocol.DCCP` dissects every :rfc:`4340` packet type and DCCP-Listen (:rfc:`5596`), with short and long sequence numbers, and the options :rfc:`4340` defines; its checksum is verified and computed over -:class:`~pcapkit.protocols.misc.checksum.ip_pseudo.IP_Pseudo`, as `Checksum and +:class:`~pcapkit.protocols.misc.checksum.ip_pseudo.protocol.IP_Pseudo`, as `Checksum and Integrity Verification`_ above describes. The Data Checksum option's CRC-32c is recorded and not checked. -**Done within wave 2 โ€” ICMP/ICMPv6 shared base.** :class:`~pcapkit.protocols.internet.icmp.ICMP` -is the abstract base :class:`~pcapkit.protocols.internet.icmpv4.ICMPv4` and -:class:`~pcapkit.protocols.internet.icmpv6.ICMPv6` share for selector composition +**Done within wave 2 โ€” ICMP/ICMPv6 shared base.** :class:`~pcapkit.protocols.internet.icmp.protocol.ICMP` +is the abstract base :class:`~pcapkit.protocols.internet.icmpv4.protocol.ICMPv4` and +:class:`~pcapkit.protocols.internet.icmpv6.protocol.ICMPv6` share for selector composition (:issue:`2436`); each implements its own message-type parsing independently rather than through a shared method body. The two are distinguished by whether they carry pseudo-header checksums (ICMPv6 does; ICMPv4 does not), both verified and computed (:issue:`2470`). **IGMP โ€” done within wave 2** (:issue:`2439`, :issue:`2448`). -The three concrete classes :class:`IGMPv1 `, -:class:`IGMPv2 ` and -:class:`IGMPv3 ` share one read path on -the abstract :class:`~pcapkit.protocols.internet.igmp.IGMP` base, which -:meth:`~pcapkit.protocols.internet.igmp.IGMP._classify` dispatches to the right +The three concrete classes :class:`IGMPv1 `, +:class:`IGMPv2 ` and +:class:`IGMPv3 ` share one read path on +the abstract :class:`~pcapkit.protocols.internet.igmp.protocol.IGMP` base, which +:meth:`~pcapkit.protocols.internet.igmp.protocol.IGMP._classify` dispatches to the right one. IGMPv1/v2 share one 8-octet message shape; IGMPv3 (:rfc:`3376`) adds the Membership Query's source-list extension and the Membership Report's group-record list, each a shape of its own. **Done within wave 2 โ€” TLS/SSL with DTLS.** The `DTLS`_ section above lists -what is decoded: the shared :class:`~pcapkit.protocols.application.ssl.SSL` +what is decoded: the shared :class:`~pcapkit.protocols.application.ssl.protocol.SSL` base, SSLv2 (:issue:`2457`, :issue:`2567`), TLS, DTLS, handshake message framing, the hello and ``EncryptedExtensions`` extension lists with their registered extension bodies @@ -1204,22 +1204,22 @@ genuine DLT that a capture can legitimately be rooted in โ€” ``DLT_NULL`` (0) is BSD's loopback encapsulation, ``DLT_RAW`` (101) an IP packet with no link header at all, and ``DLT_LINUX_SLL`` (113) with ``DLT_LINUX_SLL2`` (276) the Linux "cooked" capture header every ``tcpdump -i any`` capture uses. -:class:`~pcapkit.protocols.link.loopback.Loopback` dissects ``DLT_NULL`` and +:class:`~pcapkit.protocols.link.loopback.protocol.Loopback` dissects ``DLT_NULL`` and ``DLT_LOOP`` (:issue:`1574`), the frame dispatcher reads ``DLT_RAW`` as IPv4 or IPv6 by its version nibble (:issue:`1502`), and -:class:`~pcapkit.protocols.link.linux_sll1.LinuxSLL1` with -:class:`~pcapkit.protocols.link.linux_sll2.LinuxSLL2` dissect the Linux +:class:`~pcapkit.protocols.link.linux_sll1.protocol.LinuxSLL1` with +:class:`~pcapkit.protocols.link.linux_sll2.protocol.LinuxSLL2` dissect the Linux cooked-capture variants (:issue:`2438`). The ``arphrd_type`` values neither header treats as carrying an EtherType each have a dissector of their own (:issue:`2460`), dispatched through :attr:`LinuxSLL.__proto__ -` (:issue:`2510`): -``NETLINK`` to :class:`~pcapkit.protocols.link.netlink.Netlink`, ``IPGRE`` and -``IP6GRE`` to :class:`~pcapkit.protocols.link.gre.GRE`, ``FRAD`` to -:class:`~pcapkit.protocols.link.frad.FRAD`, and ``IEEE80211_RADIOTAP`` to -:class:`~pcapkit.protocols.link.radiotap.Radiotap` (:issue:`2502`), which decodes its +` (:issue:`2510`): +``NETLINK`` to :class:`~pcapkit.protocols.link.netlink.protocol.Netlink`, ``IPGRE`` and +``IP6GRE`` to :class:`~pcapkit.protocols.link.gre.protocol.GRE`, ``FRAD`` to +:class:`~pcapkit.protocols.link.frad.protocol.FRAD`, and ``IEEE80211_RADIOTAP`` to +:class:`~pcapkit.protocols.link.radiotap.protocol.Radiotap` (:issue:`2502`), which decodes its optional fields (:issue:`2576`) and hands the 802.11 frame to -:class:`~pcapkit.protocols.link.ieee802_11.IEEE802_11`, which dissects the MAC -header and keeps the frame body :class:`~pcapkit.protocols.misc.raw.Raw` +:class:`~pcapkit.protocols.link.ieee802_11.protocol.IEEE802_11`, which dissects the MAC +header and keeps the frame body :class:`~pcapkit.protocols.misc.raw.protocol.Raw` (:issue:`2575`). Neither ``NULL`` nor ``RAW`` is an honest stand-in for "unknown link type", which is why the toolkit raises for an unresolvable link-layer @@ -1234,7 +1234,7 @@ are in. **Sequenced after wave 2 โ€” the Mobility Header sub-layer registry.** Several mobility options carry a payload belonging to another protocol, and those -payloads want carrying as :class:`~pcapkit.protocols.misc.raw.Raw` through a +payloads want carrying as :class:`~pcapkit.protocols.misc.raw.protocol.Raw` through a per-payload registry rather than as bare :obj:`bytes` โ€” see `Mobility Header`_ above, which describes the payloads in question and why a registry of their own is wanted instead of @@ -1245,9 +1245,9 @@ rides in **ICMPv6**, and :rfc:`3376` **IGMPv3** group records. ICMPv6 and IGMP, IGMPv3 included (:issue:`2448`), are both wave 2 deliverables, done; MLD itself is a follow-up to ICMPv6 (see `More Protocols, More!!!`_ above). Landing the registry first would give a dispatch table with -:class:`~pcapkit.protocols.misc.raw.Raw` to register. The +:class:`~pcapkit.protocols.misc.raw.protocol.Raw` to register. The counter-argument is real though, and worth weighing rather than dismissing: changing the -parsed shape from :obj:`bytes` to :class:`~pcapkit.protocols.misc.raw.Raw` is the +parsed shape from :obj:`bytes` to :class:`~pcapkit.protocols.misc.raw.protocol.Raw` is the disruptive half, since it changes what existing captures dump to, so there is a case for taking that churn early and registering dissectors later. The remaining format, the :rfc:`6088` traffic selectors of :rfc:`6089` and :rfc:`7222`, has no wave at all โ€” it is a @@ -1337,7 +1337,7 @@ divided into strands: already *caused* defects rather than merely offended tidiness: - :issue:`487` existed because - :meth:`IPv6_Route.make() ` + :meth:`IPv6_Route.make() ` computed ``Hdr Ext Len`` in **separate** branches with different wrong units, and the read side computed the inverse elsewhere with yet another. The fix was not new arithmetic but one helper per direction, each documenting the :rfc:`8200#section-4.4` @@ -1367,14 +1367,14 @@ both wrong when re-derived. **Queued for wave 3 โ€” cryptographic integrity verification.** See `Checksum and Integrity Verification`_ above. HIP's ``HIP_MAC``/``RVS_HMAC``/``RELAY_HMAC`` and its signature parameters could start whenever, since -:class:`~pcapkit.protocols.internet.esp.ESP` has already established both the +:class:`~pcapkit.protocols.internet.esp.protocol.ESP` has already established both the keying-context channel and the report-rather-than-raise policy. The one's-complement half (IPv4, TCP, UDP, ICMP/ICMPv6, OSPF) is **done** (:issue:`2470`, :issue:`2472` to :issue:`2475`), and DCCP's with it (:issue:`2489`), as are IGMP's and GRE's (:issue:`2618`). **IP pseudo-header โ€” done** (:issue:`2471`). -:class:`~pcapkit.protocols.misc.checksum.ip_pseudo.IP_Pseudo` is the +:class:`~pcapkit.protocols.misc.checksum.ip_pseudo.protocol.IP_Pseudo` is the **pseudo-protocol class** for the IP family the owner settled on, serving both the parsing and the constructing path, rather than a back-reference from a parsed protocol to its parent. diff --git a/docs/source/ext.rst b/docs/source/ext.rst index 1e66e65110..1f107803aa 100644 --- a/docs/source/ext.rst +++ b/docs/source/ext.rst @@ -17,121 +17,121 @@ rather than from :class:`~pcapkit.protocols.protocol.Protocol` itself. The protocol classes :mod:`pcapkit` ships: -+------------------------------------------------------------------+----------------+-----------------------+-------------------------------------------------------------+ -| Protocol Type | Protocol Class | -+==================================================================+================+==============+======================================================================+ -| | | :class:`pcapkit.protocols.link.arp.ARP` | -+ + ARP Family +-----------------------+-------------------------------------------------------------+ -| | | :class:`pcapkit.protocols.link.inarp.InARP` | -+ Link Layer +----------------+-----------------------+-------------------------------------------------------------+ -| (:class:`~pcapkit.protocols.link.link.Link` subclasses) | :class:`pcapkit.protocols.link.ethernet.Ethernet` | -+ +----------------+-----------------------+-------------------------------------------------------------+ -| | | :class:`pcapkit.protocols.link.l2tp.L2TP` | -+ + +-----------------------+-------------------------------------------------------------+ -| | L2TP Family | :class:`pcapkit.protocols.link.l2tpv2.L2TPv2` | -+ +----------------+-----------------------+-------------------------------------------------------------+ -| | | :class:`pcapkit.protocols.link.linux_sll.LinuxSLL` | -+ + +-----------------------+-------------------------------------------------------------+ -| | LINUX_SLL | :class:`pcapkit.protocols.link.linux_sll1.LinuxSLL1` | -+ + Family +-----------------------+-------------------------------------------------------------+ -| | | :class:`pcapkit.protocols.link.linux_sll2.LinuxSLL2` | -+ +----------------+-----------------------+-------------------------------------------------------------+ -| | :class:`pcapkit.protocols.link.loopback.Loopback` | -+ +----------------+-----------------------+-------------------------------------------------------------+ -| | | :class:`pcapkit.protocols.link.vlan.VLAN` | -+ + +-----------------------+-------------------------------------------------------------+ -| | VLAN Family | :class:`pcapkit.protocols.link.c_tag.C_Tag` | -+ + +-----------------------+-------------------------------------------------------------+ -| | | :class:`pcapkit.protocols.link.s_tag.S_Tag` | -+------------------------------------------------------------------+----------------+-----------------------+-------------------------------------------------------------+ -| | | :class:`pcapkit.protocols.internet.ip.IP` | -+ + +-----------------------+-------------------------------------------------------------+ -| | | :class:`pcapkit.protocols.internet.ipv4.IPv4` | -+ + +-----------------------+-------------------------------------------------------------+ -| | | :class:`pcapkit.protocols.internet.ipv6.IPv6` | -+ + +-----------------------+-------------------------------------------------------------+ -| | | | :class:`pcapkit.protocols.internet.ipv6_ext.IPv6_Ext` | -+ + + +-------------------------------------------------------------+ -| | | | :class:`pcapkit.protocols.internet.ipv6_frag.IPv6_Frag` | -+ + + +-------------------------------------------------------------+ -| | | | :class:`pcapkit.protocols.internet.ipv6_opts.IPv6_Opts` | -+ + IP Family + +-------------------------------------------------------------+ -| Internet Layer | | IPv6 Extension Header | :class:`pcapkit.protocols.internet.ipv6_route.IPv6_Route` | -+ (:class:`~pcapkit.protocols.internet.internet.Internet` + + +-------------------------------------------------------------+ -| subclasses) | | | :class:`pcapkit.protocols.internet.hopopt.HOPOPT` | -+ + + +-------------------------------------------------------------+ -| | | | :class:`pcapkit.protocols.internet.mh.MH` | -+ + +-----------------------+-------------------------------------------------------------+ -| | | | :class:`pcapkit.protocols.internet.ipsec.IPsec` | -+ + + IPsec Family +-------------------------------------------------------------+ -| | | | :class:`pcapkit.protocols.internet.ah.AH` | -+ + + +-------------------------------------------------------------+ -| | | | :class:`pcapkit.protocols.internet.esp.ESP` | -+ +----------------+-----------------------+-------------------------------------------------------------+ -| | | :class:`pcapkit.protocols.internet.icmp.ICMP` | -+ + +-----------------------+-------------------------------------------------------------+ -| | ICMP Family | :class:`pcapkit.protocols.internet.icmpv4.ICMPv4` | -+ + +-----------------------+-------------------------------------------------------------+ -| | | :class:`pcapkit.protocols.internet.icmpv6.ICMPv6` | -+ +----------------+-----------------------+-------------------------------------------------------------+ -| | :class:`pcapkit.protocols.internet.ipx.IPX` | -+ +----------------+-----------------------+-------------------------------------------------------------+ -| | :class:`pcapkit.protocols.internet.hip.HIP` | -+ +----------------+-----------------------+-------------------------------------------------------------+ -| | | :class:`pcapkit.protocols.internet.igmp.IGMP` | -+ + +-----------------------+-------------------------------------------------------------+ -| | | :class:`pcapkit.protocols.internet.igmpv1.IGMPv1` | -+ + IGMP Family +-----------------------+-------------------------------------------------------------+ -| | | :class:`pcapkit.protocols.internet.igmpv2.IGMPv2` | -+ + +-----------------------+-------------------------------------------------------------+ -| | | :class:`pcapkit.protocols.internet.igmpv3.IGMPv3` | -+------------------------------------------------------------------+----------------+-----------------------+-------------------------------------------------------------+ -| Transport Layer | :class:`pcapkit.protocols.transport.tcp.TCP` | -+ (:class:`~pcapkit.protocols.transport.transport.Transport` +----------------+-----------------------+-------------------------------------------------------------+ -| subclasses) | :class:`pcapkit.protocols.transport.udp.UDP` | -+ +----------------+-----------------------+-------------------------------------------------------------+ -| | :class:`pcapkit.protocols.transport.sctp.SCTP` | -+ +----------------+-----------------------+-------------------------------------------------------------+ -| | :class:`pcapkit.protocols.transport.dccp.DCCP` | -+------------------------------------------------------------------+----------------+-----------------------+-------------------------------------------------------------+ -| | | :class:`pcapkit.protocols.application.ftp.FTP` | -+ + FTP Family +-----------------------+-------------------------------------------------------------+ -| | | :class:`pcapkit.protocols.application.ftp_data.FTP_DATA` | -+ Application Layer +----------------+-----------------------+-------------------------------------------------------------+ -| (:class:`~pcapkit.protocols.application.application.Application` | | :class:`pcapkit.protocols.application.http.HTTP` | -+ subclasses) + +-----------------------+-------------------------------------------------------------+ -| | HTTP Family | :class:`pcapkit.protocols.application.httpv1.HTTPv1` | -+ + +-----------------------+-------------------------------------------------------------+ -| | | :class:`pcapkit.protocols.application.httpv2.HTTPv2` | -+ +----------------+-----------------------+-------------------------------------------------------------+ -| | :class:`pcapkit.protocols.application.ngap.NGAP` | -+ +----------------+-----------------------+-------------------------------------------------------------+ -| | :class:`pcapkit.protocols.application.ospf.OSPF` | -+ +----------------+-----------------------+-------------------------------------------------------------+ -| | | :class:`pcapkit.protocols.application.rarp.RARP` | -+ + RARP Family +-----------------------+-------------------------------------------------------------+ -| | | :class:`pcapkit.protocols.application.drarp.DRARP` | -+ +----------------+-----------------------+-------------------------------------------------------------+ -| | | :class:`pcapkit.protocols.application.ssl.SSL` | -+ + +-----------------------+-------------------------------------------------------------+ -| | | :class:`pcapkit.protocols.application.tls.TLS` | -+ + +-----------------------+-------------------------------------------------------------+ -| | SSL Family | :class:`pcapkit.protocols.application.sslv3.SSLv3` | -+ + +-----------------------+-------------------------------------------------------------+ -| | | :class:`pcapkit.protocols.application.dtls.DTLS` | -+ + +-----------------------+-------------------------------------------------------------+ -| | | :class:`pcapkit.protocols.application.sslv2.SSLv2` | -+------------------------------------------------------------------+----------------+-----------------------+-------------------------------------------------------------+ -| | | :class:`pcapkit.protocols.misc.pcap.header.Header` | -+ + PCAP Format +-----------------------+-------------------------------------------------------------+ -| | | :class:`pcapkit.protocols.misc.pcap.frame.Frame` | -+ +----------------+-----------------------+-------------------------------------------------------------+ -| Miscellaneous Protocols | PCAP-NG Format | :class:`pcapkit.protocols.misc.pcapng.PCAPNG` | -+ +----------------+-----------------------+-------------------------------------------------------------+ -| | :class:`pcapkit.protocols.misc.raw.Raw` | -+ +----------------+-----------------------+-------------------------------------------------------------+ -| | :class:`pcapkit.protocols.misc.no_payload.NoPayload` | -+------------------------------------------------------------------+----------------+-----------------------+-------------------------------------------------------------+ ++------------------------------------------------------------------+----------------+-----------------------+--------------------------------------------------------------------+ +| Protocol Type | Protocol Class | ++==================================================================+================+==============+=============================================================================+ +| | | :class:`pcapkit.protocols.link.arp.protocol.ARP` | ++ + ARP Family +-----------------------+--------------------------------------------------------------------+ +| | | :class:`pcapkit.protocols.link.inarp.protocol.InARP` | ++ Link Layer +----------------+-----------------------+--------------------------------------------------------------------+ +| (:class:`~pcapkit.protocols.link.link.Link` subclasses) | :class:`pcapkit.protocols.link.ethernet.protocol.Ethernet` | ++ +----------------+-----------------------+--------------------------------------------------------------------+ +| | | :class:`pcapkit.protocols.link.l2tp.protocol.L2TP` | ++ + +-----------------------+--------------------------------------------------------------------+ +| | L2TP Family | :class:`pcapkit.protocols.link.l2tpv2.protocol.L2TPv2` | ++ +----------------+-----------------------+--------------------------------------------------------------------+ +| | | :class:`pcapkit.protocols.link.linux_sll.protocol.LinuxSLL` | ++ + +-----------------------+--------------------------------------------------------------------+ +| | LINUX_SLL | :class:`pcapkit.protocols.link.linux_sll1.protocol.LinuxSLL1` | ++ + Family +-----------------------+--------------------------------------------------------------------+ +| | | :class:`pcapkit.protocols.link.linux_sll2.protocol.LinuxSLL2` | ++ +----------------+-----------------------+--------------------------------------------------------------------+ +| | :class:`pcapkit.protocols.link.loopback.protocol.Loopback` | ++ +----------------+-----------------------+--------------------------------------------------------------------+ +| | | :class:`pcapkit.protocols.link.vlan.protocol.VLAN` | ++ + +-----------------------+--------------------------------------------------------------------+ +| | VLAN Family | :class:`pcapkit.protocols.link.c_tag.protocol.C_Tag` | ++ + +-----------------------+--------------------------------------------------------------------+ +| | | :class:`pcapkit.protocols.link.s_tag.protocol.S_Tag` | ++------------------------------------------------------------------+----------------+-----------------------+--------------------------------------------------------------------+ +| | | :class:`pcapkit.protocols.internet.ip.protocol.IP` | ++ + +-----------------------+--------------------------------------------------------------------+ +| | | :class:`pcapkit.protocols.internet.ipv4.protocol.IPv4` | ++ + +-----------------------+--------------------------------------------------------------------+ +| | | :class:`pcapkit.protocols.internet.ipv6.protocol.IPv6` | ++ + +-----------------------+--------------------------------------------------------------------+ +| | | | :class:`pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext` | ++ + + +--------------------------------------------------------------------+ +| | | | :class:`pcapkit.protocols.internet.ipv6_frag.protocol.IPv6_Frag` | ++ + + +--------------------------------------------------------------------+ +| | | | :class:`pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts` | ++ + IP Family + +--------------------------------------------------------------------+ +| Internet Layer | | IPv6 Extension Header | :class:`pcapkit.protocols.internet.ipv6_route.protocol.IPv6_Route` | ++ (:class:`~pcapkit.protocols.internet.internet.Internet` + + +--------------------------------------------------------------------+ +| subclasses) | | | :class:`pcapkit.protocols.internet.hopopt.protocol.HOPOPT` | ++ + + +--------------------------------------------------------------------+ +| | | | :class:`pcapkit.protocols.internet.mh.protocol.MH` | ++ + +-----------------------+--------------------------------------------------------------------+ +| | | | :class:`pcapkit.protocols.internet.ipsec.protocol.IPsec` | ++ + + IPsec Family +--------------------------------------------------------------------+ +| | | | :class:`pcapkit.protocols.internet.ah.protocol.AH` | ++ + + +--------------------------------------------------------------------+ +| | | | :class:`pcapkit.protocols.internet.esp.protocol.ESP` | ++ +----------------+-----------------------+--------------------------------------------------------------------+ +| | | :class:`pcapkit.protocols.internet.icmp.protocol.ICMP` | ++ + +-----------------------+--------------------------------------------------------------------+ +| | ICMP Family | :class:`pcapkit.protocols.internet.icmpv4.protocol.ICMPv4` | ++ + +-----------------------+--------------------------------------------------------------------+ +| | | :class:`pcapkit.protocols.internet.icmpv6.protocol.ICMPv6` | ++ +----------------+-----------------------+--------------------------------------------------------------------+ +| | :class:`pcapkit.protocols.internet.ipx.protocol.IPX` | ++ +----------------+-----------------------+--------------------------------------------------------------------+ +| | :class:`pcapkit.protocols.internet.hip.protocol.HIP` | ++ +----------------+-----------------------+--------------------------------------------------------------------+ +| | | :class:`pcapkit.protocols.internet.igmp.protocol.IGMP` | ++ + +-----------------------+--------------------------------------------------------------------+ +| | | :class:`pcapkit.protocols.internet.igmpv1.protocol.IGMPv1` | ++ + IGMP Family +-----------------------+--------------------------------------------------------------------+ +| | | :class:`pcapkit.protocols.internet.igmpv2.protocol.IGMPv2` | ++ + +-----------------------+--------------------------------------------------------------------+ +| | | :class:`pcapkit.protocols.internet.igmpv3.protocol.IGMPv3` | ++------------------------------------------------------------------+----------------+-----------------------+--------------------------------------------------------------------+ +| Transport Layer | :class:`pcapkit.protocols.transport.tcp.protocol.TCP` | ++ (:class:`~pcapkit.protocols.transport.transport.Transport` +----------------+-----------------------+--------------------------------------------------------------------+ +| subclasses) | :class:`pcapkit.protocols.transport.udp.protocol.UDP` | ++ +----------------+-----------------------+--------------------------------------------------------------------+ +| | :class:`pcapkit.protocols.transport.sctp.protocol.SCTP` | ++ +----------------+-----------------------+--------------------------------------------------------------------+ +| | :class:`pcapkit.protocols.transport.dccp.protocol.DCCP` | ++------------------------------------------------------------------+----------------+-----------------------+--------------------------------------------------------------------+ +| | | :class:`pcapkit.protocols.application.ftp.protocol.FTP` | ++ + FTP Family +-----------------------+--------------------------------------------------------------------+ +| | | :class:`pcapkit.protocols.application.ftp_data.protocol.FTP_DATA` | ++ Application Layer +----------------+-----------------------+--------------------------------------------------------------------+ +| (:class:`~pcapkit.protocols.application.application.Application` | | :class:`pcapkit.protocols.application.http.protocol.HTTP` | ++ subclasses) + +-----------------------+--------------------------------------------------------------------+ +| | HTTP Family | :class:`pcapkit.protocols.application.httpv1.protocol.HTTPv1` | ++ + +-----------------------+--------------------------------------------------------------------+ +| | | :class:`pcapkit.protocols.application.httpv2.protocol.HTTPv2` | ++ +----------------+-----------------------+--------------------------------------------------------------------+ +| | :class:`pcapkit.protocols.application.ngap.protocol.NGAP` | ++ +----------------+-----------------------+--------------------------------------------------------------------+ +| | :class:`pcapkit.protocols.application.ospf.protocol.OSPF` | ++ +----------------+-----------------------+--------------------------------------------------------------------+ +| | | :class:`pcapkit.protocols.application.rarp.protocol.RARP` | ++ + RARP Family +-----------------------+--------------------------------------------------------------------+ +| | | :class:`pcapkit.protocols.application.drarp.protocol.DRARP` | ++ +----------------+-----------------------+--------------------------------------------------------------------+ +| | | :class:`pcapkit.protocols.application.ssl.protocol.SSL` | ++ + +-----------------------+--------------------------------------------------------------------+ +| | | :class:`pcapkit.protocols.application.tls.protocol.TLS` | ++ + +-----------------------+--------------------------------------------------------------------+ +| | SSL Family | :class:`pcapkit.protocols.application.sslv3.protocol.SSLv3` | ++ + +-----------------------+--------------------------------------------------------------------+ +| | | :class:`pcapkit.protocols.application.dtls.protocol.DTLS` | ++ + +-----------------------+--------------------------------------------------------------------+ +| | | :class:`pcapkit.protocols.application.sslv2.protocol.SSLv2` | ++------------------------------------------------------------------+----------------+-----------------------+--------------------------------------------------------------------+ +| | | :class:`pcapkit.protocols.misc.pcap.header.protocol.Header` | ++ + PCAP Format +-----------------------+--------------------------------------------------------------------+ +| | | :class:`pcapkit.protocols.misc.pcap.frame.protocol.Frame` | ++ +----------------+-----------------------+--------------------------------------------------------------------+ +| Miscellaneous Protocols | PCAP-NG Format | :class:`pcapkit.protocols.misc.pcapng.protocol.PCAPNG` | ++ +----------------+-----------------------+--------------------------------------------------------------------+ +| | :class:`pcapkit.protocols.misc.raw.protocol.Raw` | ++ +----------------+-----------------------+--------------------------------------------------------------------+ +| | :class:`pcapkit.protocols.misc.no_payload.protocol.NoPayload` | ++------------------------------------------------------------------+----------------+-----------------------+--------------------------------------------------------------------+ .. _ext-new-protocol: @@ -158,9 +158,9 @@ protocols, respectively. from :class:`~pcapkit.protocols.protocol.Protocol`. Besides, you need to implement the corresponding schema and data model for the -new protocol. The schema is a :class:`~pcapkit.protocols.schema.schema.Schema` +new protocol. The schema is a :class:`~pcapkit.protocols.schema.Schema` subclass that defines the field structure of the protocol, and the data model -is a :class:`~pcapkit.protocols.data.data.Data` subclass that defines the data +is a :class:`~pcapkit.protocols.data.Data` subclass that defines the data attributes of the protocol. .. note:: @@ -216,7 +216,7 @@ The following code snippet shows how to create a new protocol class: Following is a PoC implementation of a new internet layer protocol. For demonstration purposes, we use the IPv4 protocol as an example, where the comprehensive implementation can be found in the - :mod:`pcapkit.protocols.internet.ipv4` module. + :mod:`pcapkit.protocols.internet.ipv4.protocol` module. .. code-block:: python @@ -224,8 +224,8 @@ The following code snippet shows how to create a new protocol class: from pcapkit.protocols.internet.internet import Internet # import base class - from pcapkit.protocols.data.data import Data # import data class - from pcapkit.protocols.schema.schema import Schema # import schema class + from pcapkit.protocols.data import Data # import data class + from pcapkit.protocols.schema import Schema # import schema class from pcapkit.corekit.fields.ipaddress import IPv4AddressField # import field class @@ -304,8 +304,8 @@ The following code snippet shows how to create a new protocol class: Setting it to :obj:`None` skips the check entirely, and is meant only for a *dispatcher* whose real signature belongs to a class chosen at call time -- - :class:`~pcapkit.protocols.application.http.HTTP`, whose - :meth:`~pcapkit.protocols.application.http.HTTP.make` builds the HTTP version it + :class:`~pcapkit.protocols.application.http.protocol.HTTP`, whose + :meth:`~pcapkit.protocols.application.http.protocol.HTTP.make` builds the HTTP version it is given, is the only such class in the library. Unlike a set, :obj:`None` is not inherited, so a subclass of a dispatcher is checked normally. Prefer a declared parameter to @@ -327,7 +327,7 @@ The following code snippet shows how to create a new protocol class: leads to -- but **not** a direct ``SomeProtocol.make(...)`` call, which still discards an undeclared keyword in silence. ``object.__new__(cls).make(...)`` is the idiom that reaches it, used by this package's own tests and by - :meth:`HTTP.make ` to reach its + :meth:`HTTP.make ` to reach its versioned implementation. Covering that would mean interposing on every ``make`` in the tree -- a larger change this package deliberately does not make. Construct through the constructor to get the check. @@ -377,53 +377,53 @@ extension point you need, then register your methods against it. The extension points of each protocol class, with the registry function that writes them: -+-------------------+------------------------------------------------------------+-----------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ -| Protocol Type | Protocol Class | Extensible Registry | Registry Function | -+===================+============================================================+===============================================================================================+=====================================================================================+ -| | :class:`~pcapkit.protocols.internet.ipv4.IPv4` | :attr:`IPv4.__option__ ` | :func:`~pcapkit.foundation.registry.protocols.internet.register_ipv4_option` | -+ +------------------------------------------------------------+-----------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ -| | :class:`~pcapkit.protocols.internet.hip.HIP` | :attr:`HIP.__parameter__ ` | :func:`~pcapkit.foundation.registry.protocols.internet.register_hip_parameter` | -+ +------------------------------------------------------------+-----------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ -| | :class:`~pcapkit.protocols.internet.hopopt.HOPOPT` | :attr:`HOPOPT.__option__ ` | :func:`~pcapkit.foundation.registry.protocols.internet.register_hopopt_option` | -+ Internet Layer +------------------------------------------------------------+-----------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ -| | :class:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts` | :attr:`IPv6_Opts.__option__ ` | :func:`~pcapkit.foundation.registry.protocols.internet.register_ipv6_opts_option` | -+ +------------------------------------------------------------+-----------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ -| | :class:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route` | :attr:`IPv6_Route.__routing__ ` | :func:`~pcapkit.foundation.registry.protocols.internet.register_ipv6_route_routing` | -+ +------------------------------------------------------------+-----------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ -| | | :attr:`MH.__message__ ` | :func:`~pcapkit.foundation.registry.protocols.internet.register_mh_message` | -+ + +-----------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ -| | :class:`~pcapkit.protocols.internet.mh.MH` | :attr:`MH.__option__ ` | :func:`~pcapkit.foundation.registry.protocols.internet.register_mh_option` | -+ + +-----------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ -| | | :attr:`MH.__extension__ ` | :func:`~pcapkit.foundation.registry.protocols.internet.register_mh_extension` | -+ +------------------------------------------------------------+-----------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ -| | :class:`~pcapkit.protocols.internet.icmpv4.ICMPv4` | :attr:`ICMPv4.__type__ ` | :func:`~pcapkit.foundation.registry.protocols.internet.register_icmp_type` | -+ +------------------------------------------------------------+-----------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ -| | :class:`~pcapkit.protocols.internet.icmpv6.ICMPv6` | :attr:`ICMPv6.__type__ ` | :func:`~pcapkit.foundation.registry.protocols.internet.register_icmp_type` | -+-------------------+------------------------------------------------------------+-----------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ -| | | :attr:`TCP.__option__ ` | :func:`~pcapkit.foundation.registry.protocols.transport.register_tcp_option` | -+ Transport Layer + :class:`~pcapkit.protocols.transport.tcp.TCP` +-----------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ -| | | :attr:`TCP.__mp_option__ ` | :func:`~pcapkit.foundation.registry.protocols.transport.register_tcp_mp_option` | -+ +------------------------------------------------------------+-----------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ -| | | :attr:`SCTP.__chunk__ ` | :func:`~pcapkit.foundation.registry.protocols.transport.register_sctp_chunk` | -+ + +-----------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ -| | :class:`~pcapkit.protocols.transport.sctp.SCTP` | :attr:`SCTP.__parameter__ ` | :func:`~pcapkit.foundation.registry.protocols.transport.register_sctp_parameter` | -+ + +-----------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ -| | | :attr:`SCTP.__cause__ ` | :func:`~pcapkit.foundation.registry.protocols.transport.register_sctp_cause` | -+ +------------------------------------------------------------+-----------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ -| | :class:`~pcapkit.protocols.transport.dccp.DCCP` | :attr:`DCCP.__option__ ` | :func:`~pcapkit.foundation.registry.protocols.transport.register_dccp_option` | -+-------------------+------------------------------------------------------------+-----------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ -| | :class:`~pcapkit.protocols.application.httpv2.HTTPv2` | :attr:`HTTPv2.__frame__ ` | :func:`~pcapkit.foundation.registry.protocols.application.register_http_frame` | -+ Application Layer +------------------------------------------------------------+-----------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ -| | :class:`~pcapkit.protocols.application.ssl.SSL` | :attr:`SSL.__extension__ ` | :func:`~pcapkit.foundation.registry.protocols.application.register_tls_extension` | -+-------------------+------------------------------------------------------------+-----------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ -| | | :attr:`PCAPNG.__block__ ` | :func:`~pcapkit.foundation.registry.protocols.misc.register_pcapng_block` | -+ + +-----------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ -| | | :attr:`PCAPNG.__option__ ` | :func:`~pcapkit.foundation.registry.protocols.misc.register_pcapng_option` | -+ Miscellaneous + :class:`~pcapkit.protocols.misc.pcapng.PCAPNG` +-----------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ -| Protocols | | :attr:`PCAPNG.__record__ ` | :func:`~pcapkit.foundation.registry.protocols.misc.register_pcapng_record` | -+ + +-----------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ -| | | :attr:`PCAPNG.__secrets__ ` | :func:`~pcapkit.foundation.registry.protocols.misc.register_pcapng_secrets` | -+-------------------+------------------------------------------------------------+-----------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ ++-------------------+---------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ +| Protocol Type | Protocol Class | Extensible Registry | Registry Function | ++===================+=====================================================================+========================================================================================================+=====================================================================================+ +| | :class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4` | :attr:`IPv4.__option__ ` | :func:`~pcapkit.foundation.registry.protocols.internet.register_ipv4_option` | ++ +---------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ +| | :class:`~pcapkit.protocols.internet.hip.protocol.HIP` | :attr:`HIP.__parameter__ ` | :func:`~pcapkit.foundation.registry.protocols.internet.register_hip_parameter` | ++ +---------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ +| | :class:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT` | :attr:`HOPOPT.__option__ ` | :func:`~pcapkit.foundation.registry.protocols.internet.register_hopopt_option` | ++ Internet Layer +---------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ +| | :class:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts` | :attr:`IPv6_Opts.__option__ ` | :func:`~pcapkit.foundation.registry.protocols.internet.register_ipv6_opts_option` | ++ +---------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ +| | :class:`~pcapkit.protocols.internet.ipv6_route.protocol.IPv6_Route` | :attr:`IPv6_Route.__routing__ ` | :func:`~pcapkit.foundation.registry.protocols.internet.register_ipv6_route_routing` | ++ +---------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ +| | | :attr:`MH.__message__ ` | :func:`~pcapkit.foundation.registry.protocols.internet.register_mh_message` | ++ + +--------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ +| | :class:`~pcapkit.protocols.internet.mh.protocol.MH` | :attr:`MH.__option__ ` | :func:`~pcapkit.foundation.registry.protocols.internet.register_mh_option` | ++ + +--------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ +| | | :attr:`MH.__extension__ ` | :func:`~pcapkit.foundation.registry.protocols.internet.register_mh_extension` | ++ +---------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ +| | :class:`~pcapkit.protocols.internet.icmpv4.protocol.ICMPv4` | :attr:`ICMPv4.__type__ ` | :func:`~pcapkit.foundation.registry.protocols.internet.register_icmp_type` | ++ +---------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ +| | :class:`~pcapkit.protocols.internet.icmpv6.protocol.ICMPv6` | :attr:`ICMPv6.__type__ ` | :func:`~pcapkit.foundation.registry.protocols.internet.register_icmp_type` | ++-------------------+---------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ +| | | :attr:`TCP.__option__ ` | :func:`~pcapkit.foundation.registry.protocols.transport.register_tcp_option` | ++ Transport Layer + :class:`~pcapkit.protocols.transport.tcp.protocol.TCP` +--------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ +| | | :attr:`TCP.__mp_option__ ` | :func:`~pcapkit.foundation.registry.protocols.transport.register_tcp_mp_option` | ++ +---------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ +| | | :attr:`SCTP.__chunk__ ` | :func:`~pcapkit.foundation.registry.protocols.transport.register_sctp_chunk` | ++ + +--------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ +| | :class:`~pcapkit.protocols.transport.sctp.protocol.SCTP` | :attr:`SCTP.__parameter__ ` | :func:`~pcapkit.foundation.registry.protocols.transport.register_sctp_parameter` | ++ + +--------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ +| | | :attr:`SCTP.__cause__ ` | :func:`~pcapkit.foundation.registry.protocols.transport.register_sctp_cause` | ++ +---------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ +| | :class:`~pcapkit.protocols.transport.dccp.protocol.DCCP` | :attr:`DCCP.__option__ ` | :func:`~pcapkit.foundation.registry.protocols.transport.register_dccp_option` | ++-------------------+---------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ +| | :class:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2` | :attr:`HTTPv2.__frame__ ` | :func:`~pcapkit.foundation.registry.protocols.application.register_http_frame` | ++ Application Layer +---------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ +| | :class:`~pcapkit.protocols.application.ssl.protocol.SSL` | :attr:`SSL.__extension__ ` | :func:`~pcapkit.foundation.registry.protocols.application.register_tls_extension` | ++-------------------+---------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ +| | | :attr:`PCAPNG.__block__ ` | :func:`~pcapkit.foundation.registry.protocols.misc.register_pcapng_block` | ++ + +--------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ +| | | :attr:`PCAPNG.__option__ ` | :func:`~pcapkit.foundation.registry.protocols.misc.register_pcapng_option` | ++ Miscellaneous + :class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG` +--------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ +| Protocols | | :attr:`PCAPNG.__record__ ` | :func:`~pcapkit.foundation.registry.protocols.misc.register_pcapng_record` | ++ + +--------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ +| | | :attr:`PCAPNG.__secrets__ ` | :func:`~pcapkit.foundation.registry.protocols.misc.register_pcapng_secrets` | ++-------------------+---------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------+ .. important:: @@ -706,8 +706,8 @@ The following code snippet shows how to create a new dumper class: from pcapkit.dumpkit.common import Dumper # import base class - from pcapkit.protocols.misc.pcap.header import Header # import PCAP header class - from pcapkit.protocols.misc.pcap.frame import Frame # import PCAP frame class + from pcapkit.protocols.misc.pcap.header.protocol import Header # import PCAP header class + from pcapkit.protocols.misc.pcap.frame.protocol import Frame # import PCAP frame class if TYPE_CHECKING: from typing import Optional @@ -783,15 +783,15 @@ your own on, since they carry the ``protocol=`` registration hook. The reassembly and flow tracing classes, per protocol: -+------------------------------------------------+--------------------------------------------------+-----------------------------------------------+ -| Protocol | Reassembly Class | Flow Tracing Class | -+================================================+==================================================+===============================================+ -| :class:`~pcapkit.protocols.internet.ipv4.IPv4` | :class:`pcapkit.foundation.reassembly.ipv4.IPv4` | | -+------------------------------------------------+--------------------------------------------------+-----------------------------------------------+ -| :class:`~pcapkit.protocols.internet.ipv6.IPv6` | :class:`pcapkit.foundation.reassembly.ipv6.IPv6` | | -+------------------------------------------------+--------------------------------------------------+-----------------------------------------------+ -| :class:`~pcapkit.protocols.transport.tcp.TCP` | :class:`pcapkit.foundation.reassembly.tcp.TCP` | :class:`pcapkit.foundation.traceflow.tcp.TCP` | -+------------------------------------------------+--------------------------------------------------+-----------------------------------------------+ ++---------------------------------------------------------+--------------------------------------------------+-----------------------------------------------+ +| Protocol | Reassembly Class | Flow Tracing Class | ++=========================================================+==================================================+===============================================+ +| :class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4` | :class:`pcapkit.foundation.reassembly.ipv4.IPv4` | | ++---------------------------------------------------------+--------------------------------------------------+-----------------------------------------------+ +| :class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6` | :class:`pcapkit.foundation.reassembly.ipv6.IPv6` | | ++---------------------------------------------------------+--------------------------------------------------+-----------------------------------------------+ +| :class:`~pcapkit.protocols.transport.tcp.protocol.TCP` | :class:`pcapkit.foundation.reassembly.tcp.TCP` | :class:`pcapkit.foundation.traceflow.tcp.TCP` | ++---------------------------------------------------------+--------------------------------------------------+-----------------------------------------------+ .. seealso:: @@ -819,7 +819,7 @@ A new reassembly or flow tracing class subclasses from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import Info, info_final # import Info class for data model definitions - from pcapkit.protocols.internet.ipv4 import IPv4 # import protocol class for attribute definitions + from pcapkit.protocols.internet.ipv4.protocol import IPv4 # import protocol class for attribute definitions from pcapkit.foundation.reassembly.reassembly import Reassembly # import base class diff --git a/docs/source/glossary.rst b/docs/source/glossary.rst index e550ad5e5a..36e7809aa1 100644 --- a/docs/source/glossary.rst +++ b/docs/source/glossary.rst @@ -7,7 +7,7 @@ sense applies where, and links to the page that explains it. .. glossary:: data model - A :class:`~pcapkit.protocols.data.data.Data` subclass, or an instance of + A :class:`~pcapkit.protocols.data.Data` subclass, or an instance of one: a protocol's fields as parsed values, which :attr:`Protocol.info ` returns, as against the raw octets of :attr:`Protocol.data `. @@ -48,11 +48,11 @@ sense applies where, and links to the page that explains it. registration functions that write to one (:doc:`pcapkit/foundation/registry`); * :attr:`EnumMeta.registry - `, the mapping from + `, the mapping from an enumeration member to the :term:`schema` that parses it. schema - A :class:`~pcapkit.protocols.schema.schema.Schema` subclass, which lays + A :class:`~pcapkit.protocols.schema.Schema` subclass, which lays out a protocol header's fields as they sit on the wire, or an instance of one: the header as read or built, which :attr:`Protocol.schema ` returns. It is not the diff --git a/docs/source/pcapkit/const/arp.rst b/docs/source/pcapkit/const/arp.rst index 4d3bdb8b6e..f5af90e38f 100644 --- a/docs/source/pcapkit/const/arp.rst +++ b/docs/source/pcapkit/const/arp.rst @@ -1,11 +1,11 @@ -============================================================== -:class:`~pcapkit.protocols.link.arp.ARP` Constant Enumerations -============================================================== +======================================================================= +:class:`~pcapkit.protocols.link.arp.protocol.ARP` Constant Enumerations +======================================================================= .. module:: pcapkit.const.arp -This module contains all constant enumerations of :class:`~pcapkit.protocols.link.arp.ARP` -and :class:`~pcapkit.protocols.application.rarp.RARP` implementations. Available +This module contains all constant enumerations of :class:`~pcapkit.protocols.link.arp.protocol.ARP` +and :class:`~pcapkit.protocols.application.rarp.protocol.RARP` implementations. Available enumerations include: .. list-table:: diff --git a/docs/source/pcapkit/const/dccp.rst b/docs/source/pcapkit/const/dccp.rst index 5f0d20ed6f..33073f6c00 100644 --- a/docs/source/pcapkit/const/dccp.rst +++ b/docs/source/pcapkit/const/dccp.rst @@ -1,11 +1,11 @@ -===================================================================== -:class:`~pcapkit.protocols.transport.dccp.DCCP` Constant Enumerations -===================================================================== +============================================================================== +:class:`~pcapkit.protocols.transport.dccp.protocol.DCCP` Constant Enumerations +============================================================================== .. module:: pcapkit.const.dccp This module contains all constant enumerations of -:class:`~pcapkit.protocols.transport.dccp.DCCP` implementations. Available +:class:`~pcapkit.protocols.transport.dccp.protocol.DCCP` implementations. Available enumerations include: .. list-table:: diff --git a/docs/source/pcapkit/const/esp.rst b/docs/source/pcapkit/const/esp.rst index 7e8ad84675..f2e55697d8 100644 --- a/docs/source/pcapkit/const/esp.rst +++ b/docs/source/pcapkit/const/esp.rst @@ -1,11 +1,11 @@ -================================================================== -:class:`~pcapkit.protocols.internet.esp.ESP` Constant Enumerations -================================================================== +=========================================================================== +:class:`~pcapkit.protocols.internet.esp.protocol.ESP` Constant Enumerations +=========================================================================== .. module:: pcapkit.const.esp This module contains all constant enumerations of -:class:`~pcapkit.protocols.internet.esp.ESP` implementations. Available +:class:`~pcapkit.protocols.internet.esp.protocol.ESP` implementations. Available enumerations include: .. list-table:: @@ -18,14 +18,14 @@ enumerations include: ESP has no algorithm registry of its own: an SA's algorithms are negotiated by IKEv2, so both enumerations are the corresponding IKEv2 *transform ID* sub-registries. They live here rather than under an ``ikev2`` package because -:class:`~pcapkit.protocols.internet.esp.ESP` is the only thing in +:class:`~pcapkit.protocols.internet.esp.protocol.ESP` is the only thing in :mod:`pcapkit` that consumes them. Both enumerate every transform **IANA has registered**, which is a much larger set than :mod:`pcapkit` can apply. Which of them ESP actually implements is a separate question, answered by -:data:`~pcapkit.protocols.internet.esp.CIPHER_SUITES` and -:data:`~pcapkit.protocols.internet.esp.INTEGRITY_SUITES`. +:data:`~pcapkit.protocols.internet.esp.protocol.CIPHER_SUITES` and +:data:`~pcapkit.protocols.internet.esp.protocol.INTEGRITY_SUITES`. .. [*] https://www.iana.org/assignments/ikev2-parameters/ikev2-parameters.xhtml#ikev2-parameters-5 .. [*] https://www.iana.org/assignments/ikev2-parameters/ikev2-parameters.xhtml#ikev2-parameters-7 diff --git a/docs/source/pcapkit/const/ftp.rst b/docs/source/pcapkit/const/ftp.rst index ef961b22be..4138ac6db0 100644 --- a/docs/source/pcapkit/const/ftp.rst +++ b/docs/source/pcapkit/const/ftp.rst @@ -1,11 +1,11 @@ -===================================================================== -:class:`~pcapkit.protocols.application.ftp.FTP` Constant Enumerations -===================================================================== +============================================================================== +:class:`~pcapkit.protocols.application.ftp.protocol.FTP` Constant Enumerations +============================================================================== .. module:: pcapkit.const.ftp This module contains all constant enumerations of -:class:`~pcapkit.protocols.application.ftp.FTP` implementations. Available +:class:`~pcapkit.protocols.application.ftp.protocol.FTP` implementations. Available enumerations include: .. list-table:: diff --git a/docs/source/pcapkit/const/hip.rst b/docs/source/pcapkit/const/hip.rst index 8f2f6969fb..b1a116c065 100644 --- a/docs/source/pcapkit/const/hip.rst +++ b/docs/source/pcapkit/const/hip.rst @@ -1,11 +1,11 @@ -================================================================== -:class:`~pcapkit.protocols.internet.hip.HIP` Constant Enumerations -================================================================== +=========================================================================== +:class:`~pcapkit.protocols.internet.hip.protocol.HIP` Constant Enumerations +=========================================================================== .. module:: pcapkit.const.hip This module contains all constant enumerations of -:class:`~pcapkit.protocols.internet.hip.HIP` implementations. Available +:class:`~pcapkit.protocols.internet.hip.protocol.HIP` implementations. Available enumerations include: .. list-table:: diff --git a/docs/source/pcapkit/const/http.rst b/docs/source/pcapkit/const/http.rst index f2c6aa5532..2c24921d80 100644 --- a/docs/source/pcapkit/const/http.rst +++ b/docs/source/pcapkit/const/http.rst @@ -1,11 +1,11 @@ -======================================================================= -:class:`~pcapkit.protocols.application.http.HTTP` Constant Enumerations -======================================================================= +================================================================================ +:class:`~pcapkit.protocols.application.http.protocol.HTTP` Constant Enumerations +================================================================================ .. module:: pcapkit.const.http This module contains all constant enumerations of -:class:`~pcapkit.protocols.application.http.HTTP` implementations. Available +:class:`~pcapkit.protocols.application.http.protocol.HTTP` implementations. Available enumerations include: .. list-table:: diff --git a/docs/source/pcapkit/const/icmp.rst b/docs/source/pcapkit/const/icmp.rst index e7e484e4a4..fcc9069c84 100644 --- a/docs/source/pcapkit/const/icmp.rst +++ b/docs/source/pcapkit/const/icmp.rst @@ -1,11 +1,11 @@ -======================================================================== -:class:`~pcapkit.protocols.internet.icmpv4.ICMPv4` Constant Enumerations -======================================================================== +================================================================================= +:class:`~pcapkit.protocols.internet.icmpv4.protocol.ICMPv4` Constant Enumerations +================================================================================= .. module:: pcapkit.const.icmp This module contains all constant enumerations of -:class:`~pcapkit.protocols.internet.icmpv4.ICMPv4` implementations. Available +:class:`~pcapkit.protocols.internet.icmpv4.protocol.ICMPv4` implementations. Available enumerations include: .. list-table:: diff --git a/docs/source/pcapkit/const/icmpv6.rst b/docs/source/pcapkit/const/icmpv6.rst index 4702a571ca..cb3ec259bd 100644 --- a/docs/source/pcapkit/const/icmpv6.rst +++ b/docs/source/pcapkit/const/icmpv6.rst @@ -1,11 +1,11 @@ -========================================================================= -:class:`~pcapkit.protocols.internet.icmpv6.ICMPv6` Constant Enumerations -========================================================================= +================================================================================== +:class:`~pcapkit.protocols.internet.icmpv6.protocol.ICMPv6` Constant Enumerations +================================================================================== .. module:: pcapkit.const.icmpv6 This module contains all constant enumerations of -:class:`~pcapkit.protocols.internet.icmpv6.ICMPv6` implementations. Available +:class:`~pcapkit.protocols.internet.icmpv6.protocol.ICMPv6` implementations. Available enumerations include: .. list-table:: diff --git a/docs/source/pcapkit/const/ieee802_11.rst b/docs/source/pcapkit/const/ieee802_11.rst index e636dcfae8..295f15470f 100644 --- a/docs/source/pcapkit/const/ieee802_11.rst +++ b/docs/source/pcapkit/const/ieee802_11.rst @@ -1,11 +1,11 @@ -============================================================================== -:class:`~pcapkit.protocols.link.ieee802_11.IEEE802_11` Constant Enumerations -============================================================================== +======================================================================================= +:class:`~pcapkit.protocols.link.ieee802_11.protocol.IEEE802_11` Constant Enumerations +======================================================================================= .. module:: pcapkit.const.ieee802_11 This module contains all constant enumerations of -:class:`~pcapkit.protocols.link.ieee802_11.IEEE802_11` implementations, each +:class:`~pcapkit.protocols.link.ieee802_11.protocol.IEEE802_11` implementations, each from IEEE Std 802.11-2020, Table 9-1, *Valid type and subtype combinations*. Available enumerations include: diff --git a/docs/source/pcapkit/const/igmp.rst b/docs/source/pcapkit/const/igmp.rst index ce848d264c..9e0f74a606 100644 --- a/docs/source/pcapkit/const/igmp.rst +++ b/docs/source/pcapkit/const/igmp.rst @@ -1,11 +1,11 @@ -==================================================================== -:class:`~pcapkit.protocols.internet.igmp.IGMP` Constant Enumerations -==================================================================== +============================================================================= +:class:`~pcapkit.protocols.internet.igmp.protocol.IGMP` Constant Enumerations +============================================================================= .. module:: pcapkit.const.igmp This module contains all constant enumerations of -:class:`~pcapkit.protocols.internet.igmp.IGMP` implementations. Available +:class:`~pcapkit.protocols.internet.igmp.protocol.IGMP` implementations. Available enumerations include: .. list-table:: diff --git a/docs/source/pcapkit/const/ipv4.rst b/docs/source/pcapkit/const/ipv4.rst index 15a9745cc0..369de66f13 100644 --- a/docs/source/pcapkit/const/ipv4.rst +++ b/docs/source/pcapkit/const/ipv4.rst @@ -1,11 +1,11 @@ -==================================================================== -:class:`~pcapkit.protocols.internet.ipv4.IPv4` Constant Enumerations -==================================================================== +============================================================================= +:class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4` Constant Enumerations +============================================================================= .. module:: pcapkit.const.ipv4 This module contains all constant enumerations of -:class:`~pcapkit.protocols.internet.ipv4.IPv4` implementations. Available +:class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4` implementations. Available enumerations include: .. list-table:: diff --git a/docs/source/pcapkit/const/ipv6.rst b/docs/source/pcapkit/const/ipv6.rst index d25a7d2c83..b002170d71 100644 --- a/docs/source/pcapkit/const/ipv6.rst +++ b/docs/source/pcapkit/const/ipv6.rst @@ -1,11 +1,11 @@ -===================================================================== -:class:`~pcapkit.protocols.internet.ipv6.IPv6` Constant Enumerations -===================================================================== +============================================================================== +:class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6` Constant Enumerations +============================================================================== .. module:: pcapkit.const.ipv6 This module contains all constant enumerations of -:class:`~pcapkit.protocols.internet.ipv6.IPv6` implementations. Available +:class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6` implementations. Available enumerations include: .. list-table:: diff --git a/docs/source/pcapkit/const/ipx.rst b/docs/source/pcapkit/const/ipx.rst index 0fe2f95106..16c867d26b 100644 --- a/docs/source/pcapkit/const/ipx.rst +++ b/docs/source/pcapkit/const/ipx.rst @@ -1,11 +1,11 @@ -================================================================== -:class:`~pcapkit.protocols.internet.ipx.IPX` Constant Enumerations -================================================================== +=========================================================================== +:class:`~pcapkit.protocols.internet.ipx.protocol.IPX` Constant Enumerations +=========================================================================== .. module:: pcapkit.const.ipx This module contains all constant enumerations of -:class:`~pcapkit.protocols.internet.ipx.IPX` implementations. Available +:class:`~pcapkit.protocols.internet.ipx.protocol.IPX` implementations. Available enumerations include: .. list-table:: diff --git a/docs/source/pcapkit/const/l2tp.rst b/docs/source/pcapkit/const/l2tp.rst index 22257b5a60..7b25ce7efe 100644 --- a/docs/source/pcapkit/const/l2tp.rst +++ b/docs/source/pcapkit/const/l2tp.rst @@ -1,11 +1,11 @@ -================================================================ -:class:`~pcapkit.protocols.link.l2tp.L2TP` Constant Enumerations -================================================================ +========================================================================= +:class:`~pcapkit.protocols.link.l2tp.protocol.L2TP` Constant Enumerations +========================================================================= .. module:: pcapkit.const.l2tp This module contains all constant enumerations of -:class:`~pcapkit.protocols.link.l2tp.L2TP` implementations. Available +:class:`~pcapkit.protocols.link.l2tp.protocol.L2TP` implementations. Available enumerations include: .. list-table:: diff --git a/docs/source/pcapkit/const/linux.rst b/docs/source/pcapkit/const/linux.rst index 0cd0b5d10e..3f236de9fa 100644 --- a/docs/source/pcapkit/const/linux.rst +++ b/docs/source/pcapkit/const/linux.rst @@ -5,7 +5,7 @@ Linux-Specific Constant Enumerations .. module:: pcapkit.const.linux This module contains all constant enumerations of the Linux-specific -encapsulations, e.g. :class:`~pcapkit.protocols.link.linux_sll.LinuxSLL`. +encapsulations, e.g. :class:`~pcapkit.protocols.link.linux_sll.protocol.LinuxSLL`. Available enumerations include: .. list-table:: diff --git a/docs/source/pcapkit/const/mh.rst b/docs/source/pcapkit/const/mh.rst index 2a3e0bcb93..d1a2dd6235 100644 --- a/docs/source/pcapkit/const/mh.rst +++ b/docs/source/pcapkit/const/mh.rst @@ -1,11 +1,11 @@ -================================================================ -:class:`~pcapkit.protocols.internet.mh.MH` Constant Enumerations -================================================================ +========================================================================= +:class:`~pcapkit.protocols.internet.mh.protocol.MH` Constant Enumerations +========================================================================= .. module:: pcapkit.const.mh This module contains all constant enumerations of -:class:`~pcapkit.protocols.internet.mh.MH` implementations. Available +:class:`~pcapkit.protocols.internet.mh.protocol.MH` implementations. Available enumerations include: .. list-table:: diff --git a/docs/source/pcapkit/const/ngap.rst b/docs/source/pcapkit/const/ngap.rst index ef2687c510..74f0d3c0bb 100644 --- a/docs/source/pcapkit/const/ngap.rst +++ b/docs/source/pcapkit/const/ngap.rst @@ -1,11 +1,11 @@ -======================================================================== -:class:`~pcapkit.protocols.application.ngap.NGAP` Constant Enumerations -======================================================================== +================================================================================= +:class:`~pcapkit.protocols.application.ngap.protocol.NGAP` Constant Enumerations +================================================================================= .. module:: pcapkit.const.ngap This module contains all constant enumerations of -:class:`~pcapkit.protocols.application.ngap.NGAP` implementations. Available +:class:`~pcapkit.protocols.application.ngap.protocol.NGAP` implementations. Available enumerations include: .. list-table:: diff --git a/docs/source/pcapkit/const/ospf.rst b/docs/source/pcapkit/const/ospf.rst index 3d2ddfb4c0..3084311c61 100644 --- a/docs/source/pcapkit/const/ospf.rst +++ b/docs/source/pcapkit/const/ospf.rst @@ -1,11 +1,11 @@ -======================================================================= -:class:`~pcapkit.protocols.application.ospf.OSPF` Constant Enumerations -======================================================================= +================================================================================ +:class:`~pcapkit.protocols.application.ospf.protocol.OSPF` Constant Enumerations +================================================================================ .. module:: pcapkit.const.ospf This module contains all constant enumerations of -:class:`~pcapkit.protocols.application.ospf.OSPF` implementations. Available +:class:`~pcapkit.protocols.application.ospf.protocol.OSPF` implementations. Available enumerations include: .. list-table:: diff --git a/docs/source/pcapkit/const/pcapng.rst b/docs/source/pcapkit/const/pcapng.rst index fb07c68130..da64b7d798 100644 --- a/docs/source/pcapkit/const/pcapng.rst +++ b/docs/source/pcapkit/const/pcapng.rst @@ -1,11 +1,11 @@ -==================================================================== -:class:`~pcapkit.protocols.misc.pcapng.PCAPNG` Constant Enumerations -==================================================================== +============================================================================= +:class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG` Constant Enumerations +============================================================================= .. module:: pcapkit.const.pcapng This module contains all constant enumerations of -:class:`~pcapkit.protocols.misc.pcapng.PCAPNG` implementations. Available +:class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG` implementations. Available enumerations include: .. list-table:: @@ -137,7 +137,7 @@ which is automatically generated from :class:`pcapkit.vendor.pcapng.tls_key_labe .. versionadded:: 1.5.0 - Moved here from :mod:`pcapkit.protocols.misc.pcapng` (:issue:`886`). + Moved here from :mod:`pcapkit.protocols.misc.pcapng.protocol` (:issue:`886`). .. autoclass:: pcapkit.const.pcapng.tls_key_label.TLSKeyLabel :members: diff --git a/docs/source/pcapkit/const/radiotap.rst b/docs/source/pcapkit/const/radiotap.rst index a47a1c9c97..adc1df8611 100644 --- a/docs/source/pcapkit/const/radiotap.rst +++ b/docs/source/pcapkit/const/radiotap.rst @@ -1,11 +1,11 @@ -========================================================================== -:class:`~pcapkit.protocols.link.radiotap.Radiotap` Constant Enumerations -========================================================================== +=================================================================================== +:class:`~pcapkit.protocols.link.radiotap.protocol.Radiotap` Constant Enumerations +=================================================================================== .. module:: pcapkit.const.radiotap This module contains all constant enumerations of -:class:`~pcapkit.protocols.link.radiotap.Radiotap` implementations, each scraped +:class:`~pcapkit.protocols.link.radiotap.protocol.Radiotap` implementations, each scraped from radiotap.org [*]_. Available enumerations include: .. list-table:: diff --git a/docs/source/pcapkit/const/sctp.rst b/docs/source/pcapkit/const/sctp.rst index acf29b6cec..443a118dc7 100644 --- a/docs/source/pcapkit/const/sctp.rst +++ b/docs/source/pcapkit/const/sctp.rst @@ -1,11 +1,11 @@ -===================================================================== -:class:`~pcapkit.protocols.transport.sctp.SCTP` Constant Enumerations -===================================================================== +============================================================================== +:class:`~pcapkit.protocols.transport.sctp.protocol.SCTP` Constant Enumerations +============================================================================== .. module:: pcapkit.const.sctp This module contains all constant enumerations of -:class:`~pcapkit.protocols.transport.sctp.SCTP` implementations. Available +:class:`~pcapkit.protocols.transport.sctp.protocol.SCTP` implementations. Available enumerations include: .. list-table:: diff --git a/docs/source/pcapkit/const/sslv2.rst b/docs/source/pcapkit/const/sslv2.rst index 2c9eda017a..1f87f6dea1 100644 --- a/docs/source/pcapkit/const/sslv2.rst +++ b/docs/source/pcapkit/const/sslv2.rst @@ -1,11 +1,11 @@ -========================================================================= -:class:`~pcapkit.protocols.application.sslv2.SSLv2` Constant Enumerations -========================================================================= +================================================================================== +:class:`~pcapkit.protocols.application.sslv2.protocol.SSLv2` Constant Enumerations +================================================================================== .. module:: pcapkit.const.sslv2 This module contains all constant enumerations of -:class:`~pcapkit.protocols.application.sslv2.SSLv2` implementations. Available +:class:`~pcapkit.protocols.application.sslv2.protocol.SSLv2` implementations. Available enumerations include: .. list-table:: diff --git a/docs/source/pcapkit/const/tcp.rst b/docs/source/pcapkit/const/tcp.rst index c605b8eae1..673787d1c9 100644 --- a/docs/source/pcapkit/const/tcp.rst +++ b/docs/source/pcapkit/const/tcp.rst @@ -1,11 +1,11 @@ -=================================================================== -:class:`~pcapkit.protocols.transport.tcp.TCP` Constant Enumerations -=================================================================== +============================================================================ +:class:`~pcapkit.protocols.transport.tcp.protocol.TCP` Constant Enumerations +============================================================================ .. module:: pcapkit.const.tcp This module contains all constant enumerations of -:class:`~pcapkit.protocols.transport.tcp.TCP` implementations. Available +:class:`~pcapkit.protocols.transport.tcp.protocol.TCP` implementations. Available enumerations include: .. list-table:: diff --git a/docs/source/pcapkit/const/tls.rst b/docs/source/pcapkit/const/tls.rst index f16f8fa0eb..338645f024 100644 --- a/docs/source/pcapkit/const/tls.rst +++ b/docs/source/pcapkit/const/tls.rst @@ -1,13 +1,13 @@ -===================================================================== -:class:`~pcapkit.protocols.application.ssl.SSL` Constant Enumerations -===================================================================== +============================================================================== +:class:`~pcapkit.protocols.application.ssl.protocol.SSL` Constant Enumerations +============================================================================== .. module:: pcapkit.const.tls This module contains the constant enumerations shared by the record-layer -implementations under the :class:`~pcapkit.protocols.application.ssl.SSL` -umbrella -- :class:`~pcapkit.protocols.application.tls.TLS` (SSLv3 through -TLS 1.3) and :class:`~pcapkit.protocols.application.dtls.DTLS`. Available +implementations under the :class:`~pcapkit.protocols.application.ssl.protocol.SSL` +umbrella -- :class:`~pcapkit.protocols.application.tls.protocol.TLS` (SSLv3 through +TLS 1.3) and :class:`~pcapkit.protocols.application.dtls.protocol.DTLS`. Available enumerations include: .. list-table:: diff --git a/docs/source/pcapkit/const/vlan.rst b/docs/source/pcapkit/const/vlan.rst index bbaf693e02..c50cb9c4c2 100644 --- a/docs/source/pcapkit/const/vlan.rst +++ b/docs/source/pcapkit/const/vlan.rst @@ -1,11 +1,11 @@ -================================================================ -:class:`~pcapkit.protocols.link.vlan.VLAN` Constant Enumerations -================================================================ +========================================================================= +:class:`~pcapkit.protocols.link.vlan.protocol.VLAN` Constant Enumerations +========================================================================= .. module:: pcapkit.const.vlan This module contains all constant enumerations of -:class:`~pcapkit.protocols.link.vlan.VLAN` implementations. Available +:class:`~pcapkit.protocols.link.vlan.protocol.VLAN` implementations. Available enumerations include: .. list-table:: diff --git a/docs/source/pcapkit/corekit/checksum/internet.rst b/docs/source/pcapkit/corekit/checksum/internet.rst index 17f365eabf..d926616186 100644 --- a/docs/source/pcapkit/corekit/checksum/internet.rst +++ b/docs/source/pcapkit/corekit/checksum/internet.rst @@ -14,7 +14,7 @@ which a filter can silence alone (:issue:`2470`). It imports nothing from :mod:`pcapkit.protocols`, which builds on it (:issue:`2580`). A checksum over the IP pseudo-header is left to the enclosing -IP layer, see :mod:`pcapkit.protocols.misc.checksum.ip_pseudo`. ICMP's, IGMP's +IP layer, see :mod:`pcapkit.protocols.misc.checksum.ip_pseudo.protocol`. ICMP's, IGMP's and GRE's checksums, over the message alone, are verified as it is parsed, unless the IP layer it is parsed from is a fragment, see :func:`verify_message` (:issue:`2618`). diff --git a/docs/source/pcapkit/corekit/context.rst b/docs/source/pcapkit/corekit/context.rst index 92da6f5467..1b56a53775 100644 --- a/docs/source/pcapkit/corekit/context.rst +++ b/docs/source/pcapkit/corekit/context.rst @@ -9,7 +9,7 @@ is **not** carried on the wire. Most protocols are self-describing: every length, offset and type needed to walk a packet is in the packet. A few are not, and -:class:`~pcapkit.protocols.internet.esp.ESP` is the motivating example: +:class:`~pcapkit.protocols.internet.esp.protocol.ESP` is the motivating example: :rfc:`4303` deliberately leaves the payload length, the position of the ``Pad Length`` / ``Next Header`` trailer and the length of the ``Integrity Check Value`` to the Security Association (SA), which is negotiated out of band @@ -31,7 +31,7 @@ Decoding an ESP tunnel end to end: .. code-block:: python >>> import pcapkit - >>> from pcapkit.protocols.internet.esp import (Cipher, ESPContext, + >>> from pcapkit.protocols.internet.esp.protocol import (Cipher, ESPContext, ... Integrity, SecurityAssociation) >>> sa = SecurityAssociation( ... spi=0x4321, diff --git a/docs/source/pcapkit/corekit/decorators.rst b/docs/source/pcapkit/corekit/decorators.rst index 34d8be05a8..758514eb49 100644 --- a/docs/source/pcapkit/corekit/decorators.rst +++ b/docs/source/pcapkit/corekit/decorators.rst @@ -40,4 +40,4 @@ Type Variables :type: pcapkit.protocols.protocol.ProtocolBase .. data:: R_prepare - :type: pcapkit.protocols.schema.schema.Schema + :type: pcapkit.protocols.schema.Schema diff --git a/docs/source/pcapkit/corekit/fields/collections.rst b/docs/source/pcapkit/corekit/fields/collections.rst index 7affc2e12f..19e9f7d1db 100644 --- a/docs/source/pcapkit/corekit/fields/collections.rst +++ b/docs/source/pcapkit/corekit/fields/collections.rst @@ -21,7 +21,7 @@ Type Variables ~~~~~~~~~~~~~~ .. data:: _TL - :type: pcapkit.protocols.schema.schema.Schema | pcapkit.corekit.fields.field.FieldBase | bytes + :type: pcapkit.protocols.schema.Schema | pcapkit.corekit.fields.field.FieldBase | bytes .. data:: _TS - :type: pcapkit.protocols.schema.schema.Schema + :type: pcapkit.protocols.schema.Schema diff --git a/docs/source/pcapkit/corekit/fields/misc.rst b/docs/source/pcapkit/corekit/fields/misc.rst index 6c3d8bbcab..f969f2fbb4 100644 --- a/docs/source/pcapkit/corekit/fields/misc.rst +++ b/docs/source/pcapkit/corekit/fields/misc.rst @@ -42,7 +42,7 @@ Type Variables :type: typing.Any .. data:: _TS - :type: pcapkit.protocols.schema.schema.Schema + :type: pcapkit.protocols.schema.Schema .. data:: _TP :type: pcapkit.protocols.protocol.ProtocolBase diff --git a/docs/source/pcapkit/corekit/schema/byteorder.rst b/docs/source/pcapkit/corekit/schema/byteorder.rst index ec1fac5f08..218163b9f2 100644 --- a/docs/source/pcapkit/corekit/schema/byteorder.rst +++ b/docs/source/pcapkit/corekit/schema/byteorder.rst @@ -6,10 +6,10 @@ Byte-Order Helpers :mod:`pcapkit.corekit.schema.byteorder` reads the byte order a capture file or section declares out of the packet data: :func:`byteorder_callback` sets it on a :class:`~pcapkit.corekit.fields.numbers.NumberField` for the record header of a -classic PCAP file (:mod:`~pcapkit.protocols.schema.misc.pcap.frame`) and the -blocks of a PCAP-NG file (:mod:`~pcapkit.protocols.schema.misc.pcapng`), and +classic PCAP file (:mod:`~pcapkit.protocols.misc.pcap.frame.schema`) and the +blocks of a PCAP-NG file (:mod:`~pcapkit.protocols.misc.pcapng.schema`), and :func:`packet_byteorder` is what the callback and the PCAP-NG makers -(:mod:`pcapkit.protocols.misc.pcapng`) read it with. It is one of the +(:mod:`pcapkit.protocols.misc.pcapng.protocol`) read it with. It is one of the :mod:`pcapkit.corekit.schema` helpers shared across the schema layer, not part of the header schema framework in :mod:`pcapkit.protocols.schema`; see :ref:`utilities-or-corekit`. diff --git a/docs/source/pcapkit/corekit/schema/index.rst b/docs/source/pcapkit/corekit/schema/index.rst index 50a2f03fed..774ede0eae 100644 --- a/docs/source/pcapkit/corekit/schema/index.rst +++ b/docs/source/pcapkit/corekit/schema/index.rst @@ -7,7 +7,7 @@ Schema Helpers the functions the field classes, the header schemas, the protocols and the capture engines all call, one module per group. It is not the header schema framework, which is :mod:`pcapkit.protocols.schema` and its -:class:`~pcapkit.protocols.schema.schema.Schema`; see :ref:`utilities-or-corekit`. +:class:`~pcapkit.protocols.schema.Schema`; see :ref:`utilities-or-corekit`. The package exports nothing itself, so that the field modules importing a helper from it load no other group: import each helper from its own module. diff --git a/docs/source/pcapkit/foundation/analysis/dtls.rst b/docs/source/pcapkit/foundation/analysis/dtls.rst index b8c6d6e7e5..e4e014cd0d 100644 --- a/docs/source/pcapkit/foundation/analysis/dtls.rst +++ b/docs/source/pcapkit/foundation/analysis/dtls.rst @@ -9,6 +9,6 @@ DTLS Handshake-Message Analysis DTLS handshake message that :class:`~pcapkit.foundation.reassembly.dtls.DTLS` reassembled (:rfc:`6347#section-4.2.3`). The decode itself is :meth:`DTLS.analyze_handshake -` (:issue:`2622`). +` (:issue:`2622`). .. autofunction:: pcapkit.foundation.analysis.dtls.dtls_handshake diff --git a/docs/source/pcapkit/foundation/engines/3rdparty.rst b/docs/source/pcapkit/foundation/engines/3rdparty.rst index fb29287adc..336803a764 100644 --- a/docs/source/pcapkit/foundation/engines/3rdparty.rst +++ b/docs/source/pcapkit/foundation/engines/3rdparty.rst @@ -74,7 +74,7 @@ support, as is used by :class:`pcapkit.foundation.extraction.Extractor`. ``dpkt.pcapng.Reader`` also skips Simple Packet Blocks, which `DPKT`_ has no type for; :class:`~pcapkit.foundation.engines.dpkt.PCAPNGReader` reads them - through :mod:`pcapkit`'s own :class:`~pcapkit.protocols.misc.pcapng.PCAPNG` + through :mod:`pcapkit`'s own :class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG` and, since the block carries no timestamp, dates them 0 (:issue:`1520`). .. autoclass:: pcapkit.foundation.engines.dpkt.DPKT diff --git a/docs/source/pcapkit/foundation/engines/builtin.rst b/docs/source/pcapkit/foundation/engines/builtin.rst index 6bbb0d276d..59d702e54d 100644 --- a/docs/source/pcapkit/foundation/engines/builtin.rst +++ b/docs/source/pcapkit/foundation/engines/builtin.rst @@ -63,9 +63,9 @@ Internal Definitions .. important:: Packet blocks -- - :class:`~pcapkit.protocols.data.misc.pcapng.PacketBlock`, - :class:`~pcapkit.protocols.data.misc.pcapng.SimplePacketBlock` and - :class:`~pcapkit.protocols.data.misc.pcapng.EnhancedPacketBlock` -- are + :class:`~pcapkit.protocols.misc.pcapng.data.PacketBlock`, + :class:`~pcapkit.protocols.misc.pcapng.data.SimplePacketBlock` and + :class:`~pcapkit.protocols.misc.pcapng.data.EnhancedPacketBlock` -- are not stored in :class:`Context`, since the :class:`~pcapkit.foundation.extraction.Extractor` stores them directly. diff --git a/docs/source/pcapkit/foundation/reassembly/dtls.rst b/docs/source/pcapkit/foundation/reassembly/dtls.rst index 872a6f33ab..ecb49cf8b1 100644 --- a/docs/source/pcapkit/foundation/reassembly/dtls.rst +++ b/docs/source/pcapkit/foundation/reassembly/dtls.rst @@ -36,7 +36,7 @@ Algorithm A DTLS handshake record may carry more than one message fragment -- :rfc:`6347#section-4.2.3` allows several handshake messages (or fragments of them) to be coalesced into one record, and :meth:`SSL._read_tls_handshake_messages -` +` reads however many fit rather than assuming exactly one. A fragment names the message it belongs to (``message_seq``), the message's total length (``length``), and its own byte range within that message (``fragment_offset``, @@ -57,7 +57,7 @@ Terminology ``fragment_length`` and raw ``payload``, built by :func:`pcapkit.toolkit.pcap.dtls_reassembly` or :func:`pcapkit.toolkit.pcapng.dtls_reassembly` from a single - :class:`~pcapkit.protocols.data.application.dtls.DTLSHandshake`. + :class:`~pcapkit.protocols.application.dtls.data.DTLSHandshake`. reasm.dtls.datagram Data structure for **reassembled DTLS handshake message** (element of diff --git a/docs/source/pcapkit/foundation/reassembly/ip/ipv6.rst b/docs/source/pcapkit/foundation/reassembly/ip/ipv6.rst index 94ba306009..f7ba4b73af 100644 --- a/docs/source/pcapkit/foundation/reassembly/ip/ipv6.rst +++ b/docs/source/pcapkit/foundation/reassembly/ip/ipv6.rst @@ -59,7 +59,7 @@ Terminology ``ihl``, ``header`` and ``tl`` all stop short of the 8-octet Fragment header, because :rfc:`8200#section-4.5` says it is not present in the - reassembled packet. :attr:`IPv6.hdr_len ` + reassembled packet. :attr:`IPv6.hdr_len ` does count it -- it is a header length, and the Fragment header is one of the extension headers it has walked -- so the ``pcap`` and ``pcapng`` adapters subtract it back off. The ``dpkt`` and ``scapy`` diff --git a/docs/source/pcapkit/foundation/registry.rst b/docs/source/pcapkit/foundation/registry.rst index c5a2f9e506..0cca62e447 100644 --- a/docs/source/pcapkit/foundation/registry.rst +++ b/docs/source/pcapkit/foundation/registry.rst @@ -88,8 +88,8 @@ Top-Level Registries .. module:: pcapkit.foundation.registry.protocols.misc These are in :mod:`~pcapkit.foundation.registry.protocols.misc` with the -PCAP-NG registries below, as :class:`~pcapkit.protocols.misc.pcap.frame.Frame` -and :class:`~pcapkit.protocols.misc.pcapng.PCAPNG` are in +PCAP-NG registries below, as :class:`~pcapkit.protocols.misc.pcap.frame.protocol.Frame` +and :class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG` are in :mod:`pcapkit.protocols.misc`. .. autofunction:: pcapkit.foundation.registry.protocols.misc.register_linktype diff --git a/docs/source/pcapkit/protocols/application/application.rst b/docs/source/pcapkit/protocols/application/application.rst index 5c9c7c698b..2719bb438a 100644 --- a/docs/source/pcapkit/protocols/application/application.rst +++ b/docs/source/pcapkit/protocols/application/application.rst @@ -6,8 +6,8 @@ Application Layer Base Protocol :mod:`pcapkit.protocols.application.application` contains only :class:`~pcapkit.protocols.application.application.Application`, which is a base class for application layer protocols, e.g. -:class:`HTTP/1.* ` and -:class:`HTTP/2 `. +:class:`HTTP/1.* ` and +:class:`HTTP/2 `. .. versionchanged:: 1.5.0 diff --git a/docs/source/pcapkit/protocols/application/drarp.rst b/docs/source/pcapkit/protocols/application/drarp.rst index 85e2dc3430..5b95df605f 100644 --- a/docs/source/pcapkit/protocols/application/drarp.rst +++ b/docs/source/pcapkit/protocols/application/drarp.rst @@ -2,24 +2,25 @@ DRARP - Dynamic Reverse Address Resolution Protocol =================================================== .. module:: pcapkit.protocols.application.drarp +.. module:: pcapkit.protocols.application.drarp.protocol -:mod:`pcapkit.protocols.application.drarp` contains -:class:`~pcapkit.protocols.application.drarp.DRARP` only, +:mod:`pcapkit.protocols.application.drarp.protocol` contains +:class:`~pcapkit.protocols.application.drarp.protocol.DRARP` only, which implements an extractor for Dynamic Reverse Address Resolution Protocol (DRARP) [*]_, whose frame is the one -:mod:`pcapkit.protocols.application.rarp` describes. +:mod:`pcapkit.protocols.application.rarp.protocol` describes. -Nothing dispatches to :class:`~pcapkit.protocols.application.drarp.DRARP`: +Nothing dispatches to :class:`~pcapkit.protocols.application.drarp.protocol.DRARP`: under EtherType ``0x8035``, a DRARP operation parses as -:class:`~pcapkit.protocols.application.rarp.RARP` with alias ``DRARP``. +:class:`~pcapkit.protocols.application.rarp.protocol.RARP` with alias ``DRARP``. .. versionadded:: 1.6.0 - Moved here from :mod:`pcapkit.protocols.application.rarp`, which keeps - :class:`~pcapkit.protocols.application.rarp.RARP` alone, since a module + Moved here from :mod:`pcapkit.protocols.application.rarp.protocol`, which keeps + :class:`~pcapkit.protocols.application.rarp.protocol.RARP` alone, since a module holds one protocol class, named after it (:issue:`2529`). -.. autoclass:: pcapkit.protocols.application.drarp.DRARP +.. autoclass:: pcapkit.protocols.application.drarp.protocol.DRARP :no-members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/application/dtls.rst b/docs/source/pcapkit/protocols/application/dtls.rst index ad6f750e85..03a42548cd 100644 --- a/docs/source/pcapkit/protocols/application/dtls.rst +++ b/docs/source/pcapkit/protocols/application/dtls.rst @@ -2,32 +2,33 @@ DTLS - Datagram Transport Layer Security ============================================== .. module:: pcapkit.protocols.application.dtls +.. module:: pcapkit.protocols.application.dtls.protocol -:mod:`pcapkit.protocols.application.dtls` contains -:class:`~pcapkit.protocols.application.dtls.DTLS`, which implements an +:mod:`pcapkit.protocols.application.dtls.protocol` contains +:class:`~pcapkit.protocols.application.dtls.protocol.DTLS`, which implements an extractor for Datagram Transport Layer Security (DTLS) [*]_ -- DTLS 1.0 (:rfc:`4347`), DTLS 1.2 (:rfc:`6347`) and its connection-ID records (:rfc:`9146`), and DTLS 1.3's legacy-format and unified-header records (:rfc:`9147`) -- at the record layer, plus the epoch/sequence-number fields and the handshake-message fragment header that set DTLS apart from -:class:`~pcapkit.protocols.application.tls.TLS`, whose reliable, ordered +:class:`~pcapkit.protocols.application.tls.protocol.TLS`, whose reliable, ordered transport needs neither. It also contains -:class:`~pcapkit.protocols.application.dtls.DTLSContext`, which holds the +:class:`~pcapkit.protocols.application.dtls.protocol.DTLSContext`, which holds the connection IDs those records carry. Version Identification ---------------------- -As with :class:`~pcapkit.protocols.application.tls.TLS`, one class parses -every version and :meth:`~pcapkit.protocols.application.dtls.DTLS.read` sets -:attr:`~pcapkit.protocols.application.dtls.DTLS.alias` from the record; -:meth:`~pcapkit.protocols.application.dtls.DTLS.id` stays ``('DTLS',)``. +As with :class:`~pcapkit.protocols.application.tls.protocol.TLS`, one class parses +every version and :meth:`~pcapkit.protocols.application.dtls.protocol.DTLS.read` sets +:attr:`~pcapkit.protocols.application.dtls.protocol.DTLS.alias` from the record; +:meth:`~pcapkit.protocols.application.dtls.protocol.DTLS.id` stays ``('DTLS',)``. .. list-table:: :header-rows: 1 * - Legacy record version - - :attr:`~pcapkit.protocols.application.dtls.DTLS.alias` + - :attr:`~pcapkit.protocols.application.dtls.protocol.DTLS.alias` * - ``0xFEFF`` - ``DTLS 1.0`` * - ``0xFEFD`` @@ -59,7 +60,7 @@ A ``tls12_cid`` record carries a connection ID between its sequence number and its length (:rfc:`9146#section-4`), and a DTLS 1.3 unified header with its ``C`` bit set carries one between its first octet and its sequence number (:rfc:`9147#section-4`). Either way the ID's length is negotiated rather than -carried. :class:`~pcapkit.protocols.application.dtls.DTLSContext` resolves +carried. :class:`~pcapkit.protocols.application.dtls.protocol.DTLSContext` resolves it for both, in this order: * a connection ID that a ``ClientHello`` or ``ServerHello`` @@ -67,9 +68,9 @@ it for both, in this order: naming the one it receives (:rfc:`9146#section-3`, :rfc:`9147#section-9.1`), and that the record's ID begins with; * the ``cid_length`` the caller gives - :class:`~pcapkit.protocols.application.dtls.DTLSContext`. + :class:`~pcapkit.protocols.application.dtls.protocol.DTLSContext`. -Without either the record stays :class:`~pcapkit.protocols.misc.raw.Raw`. +Without either the record stays :class:`~pcapkit.protocols.misc.raw.protocol.Raw`. A dissected one reports its connection ID alongside its other header fields, and keeps its encrypted content as octets. The context reaches DTLS through :mod:`pcapkit.corekit.context`: @@ -77,12 +78,12 @@ and keeps its encrypted content as octets. The context reaches DTLS through .. code-block:: python import pcapkit - from pcapkit.protocols.application.dtls import DTLSContext + from pcapkit.protocols.application.dtls.protocol import DTLSContext extraction = pcapkit.extract('dtls.pcap', context=DTLSContext(cid_length=8)) The connection IDs a -:class:`~pcapkit.protocols.application.dtls.DTLSContext` learns belong to that +:class:`~pcapkit.protocols.application.dtls.protocol.DTLSContext` learns belong to that instance. A new instance starts with none, and one the caller reuses keeps what it has learned. An extraction given none gets its own in its own registry, so it carries what its handshakes negotiate across its capture and @@ -96,13 +97,13 @@ Matching by value relies on IDs being self-delineating A rebuild parses each layer's octets again, so ``from_data`` takes the same ``__context__``. Without it the octets still rebuild exactly, and ``DTLS.from_data`` keeps its chain, but a record with a connection ID under a -rebuilt UDP layer reads as :class:`~pcapkit.protocols.misc.raw.Raw`. +rebuilt UDP layer reads as :class:`~pcapkit.protocols.misc.raw.protocol.Raw`. Records in One Datagram ----------------------- A whole record after the first in a UDP datagram is dissected as a further -:class:`~pcapkit.protocols.application.dtls.DTLS` layer, the previous record's +:class:`~pcapkit.protocols.application.dtls.protocol.DTLS` layer, the previous record's payload (:rfc:`6347#section-4.1.1`, :rfc:`9147#section-4.3`, :issue:`2535`): a ``ChangeCipherSpec`` followed by an ``Alert`` reads ``UDP:DTLS 1.2:DTLS 1.2``. A unified-header record is delimited by its length; one without a length runs @@ -110,7 +111,7 @@ to the end of the datagram, so it is the last (:rfc:`9147#section-4`). The exceptions: * A whole record that fails to decode becomes - :class:`~pcapkit.protocols.misc.raw.Raw` together with everything after it. + :class:`~pcapkit.protocols.misc.raw.protocol.Raw` together with everything after it. * Octets that open no whole record stay raw, with no error: an unsupported content type, a legacy version outside ``0xFExx``, a header cut short, a length past the end of the datagram, or a connection ID whose length is @@ -125,12 +126,12 @@ Known Limitations **A handshake message split across DTLS records is not decoded here** (:rfc:`6347#section-4.2.3`, :issue:`2440`). Each fragment is flagged -:attr:`~pcapkit.protocols.data.application.dtls.DTLSHandshake.is_fragmented` -and its :attr:`~pcapkit.protocols.data.application.dtls.DTLSHandshake.body` +:attr:`~pcapkit.protocols.application.dtls.data.DTLSHandshake.is_fragmented` +and its :attr:`~pcapkit.protocols.application.dtls.data.DTLSHandshake.body` kept as raw octets. ``Extractor(reassembly=True, dtls=True)`` reassembles the message, and :func:`~pcapkit.foundation.analysis.dtls.dtls_handshake` decodes it -with :meth:`~pcapkit.protocols.application.dtls.DTLS.analyze_handshake`, which -reads it with :meth:`~pcapkit.protocols.application.dtls.DTLS.read_handshake`. +with :meth:`~pcapkit.protocols.application.dtls.protocol.DTLS.analyze_handshake`, which +reads it with :meth:`~pcapkit.protocols.application.dtls.protocol.DTLS.read_handshake`. **A connection ID negotiated in a fragmented hello is not learned**: the message is not decoded here, so its ``connection_id`` extension is not read. @@ -138,7 +139,7 @@ message is not decoded here, so its ``connection_id`` extension is not read. **A connection ID a DTLS 1.3** ``NewConnectionId`` **issues is not learned** (:rfc:`9147#section-9`, :issue:`2625`): the message is encrypted, so only the caller can give it to -:class:`~pcapkit.protocols.application.dtls.DTLSContext`. +:class:`~pcapkit.protocols.application.dtls.protocol.DTLSContext`. **A unified-header record carries only the low two bits of the epoch**, and its sequence number is header-protected, so the values it reports are the @@ -150,7 +151,7 @@ ones on the wire.
-.. autoclass:: pcapkit.protocols.application.dtls.DTLS +.. autoclass:: pcapkit.protocols.application.dtls.protocol.DTLS :no-members: :show-inheritance: @@ -171,7 +172,7 @@ ones on the wire. .. automethod:: _make_data -.. autoclass:: pcapkit.protocols.application.dtls.DTLSContext +.. autoclass:: pcapkit.protocols.application.dtls.protocol.DTLSContext :no-members: :show-inheritance: @@ -185,44 +186,44 @@ ones on the wire. Header Schema ------------- -.. module:: pcapkit.protocols.schema.application.dtls +.. module:: pcapkit.protocols.application.dtls.schema -.. autoclass:: pcapkit.protocols.schema.application.dtls.DTLS +.. autoclass:: pcapkit.protocols.application.dtls.schema.DTLS :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.application.dtls.DTLSCiphertext +.. autoclass:: pcapkit.protocols.application.dtls.schema.DTLSCiphertext :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.application.dtls.DTLSCIDCiphertext +.. autoclass:: pcapkit.protocols.application.dtls.schema.DTLSCIDCiphertext :members: :show-inheritance: Data Models ----------- -.. module:: pcapkit.protocols.data.application.dtls +.. module:: pcapkit.protocols.application.dtls.data -.. autoclass:: pcapkit.protocols.data.application.dtls.DTLS +.. autoclass:: pcapkit.protocols.application.dtls.data.DTLS :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.dtls.DTLSCiphertext +.. autoclass:: pcapkit.protocols.application.dtls.data.DTLSCiphertext :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.dtls.DTLSCIDCiphertext +.. autoclass:: pcapkit.protocols.application.dtls.data.DTLSCIDCiphertext :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.dtls.DTLSHandshake +.. autoclass:: pcapkit.protocols.application.dtls.data.DTLSHandshake :members: :show-inheritance: See :doc:`ssl` for ``ClientHello``, ``ServerHello``, ``EncryptedExtensions``, ``Extension`` and its decoded bodies, ``Alert`` and ``ChangeCipherSpec``, -shared verbatim with :class:`~pcapkit.protocols.application.tls.TLS`. +shared verbatim with :class:`~pcapkit.protocols.application.tls.protocol.TLS`. .. rubric:: Footnotes diff --git a/docs/source/pcapkit/protocols/application/ftp.rst b/docs/source/pcapkit/protocols/application/ftp.rst index 0ab9d05089..604acbe943 100644 --- a/docs/source/pcapkit/protocols/application/ftp.rst +++ b/docs/source/pcapkit/protocols/application/ftp.rst @@ -2,13 +2,22 @@ FTP - File Transfer Protocol ============================ .. module:: pcapkit.protocols.application.ftp +.. module:: pcapkit.protocols.application.ftp.protocol -:mod:`pcapkit.protocols.application.ftp` contains -:class:`~pcapkit.protocols.application.ftp.FTP`, +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.application.ftp.FTP_REQUEST``, + ``pcapkit.protocols.application.ftp.FTP_RESPONSE`` and + ``pcapkit.protocols.application.ftp.Type``, with no alias: they are in this module, + and :mod:`pcapkit.protocols.application.ftp` exports the protocol class alone + (:issue:`2534`). + +:mod:`pcapkit.protocols.application.ftp.protocol` contains +:class:`~pcapkit.protocols.application.ftp.protocol.FTP`, which implements an extractor for File Transfer Protocol (FTP) [*]_, the control channel; the data channel is -:class:`~pcapkit.protocols.application.ftp_data.FTP_DATA`, in -:mod:`pcapkit.protocols.application.ftp_data`. +:class:`~pcapkit.protocols.application.ftp_data.protocol.FTP_DATA`, in +:mod:`pcapkit.protocols.application.ftp_data.protocol`. .. versionchanged:: 1.5.0 @@ -21,11 +30,11 @@ which implements an extractor for File Transfer Protocol .. versionremoved:: 1.5.0 ``pcapkit.protocols.application.ftp.FTP_DATA``, with no alias. The class - moved to :mod:`pcapkit.protocols.application.ftp_data`, since TCP port 20 + moved to :mod:`pcapkit.protocols.application.ftp_data.protocol`, since TCP port 20 dispatches it and port 21 the control channel -- two protocols, so two modules (:issue:`2285`). -.. autoclass:: pcapkit.protocols.application.ftp.FTP +.. autoclass:: pcapkit.protocols.application.ftp.protocol.FTP :no-members: :show-inheritance: @@ -42,33 +51,43 @@ which implements an extractor for File Transfer Protocol Auxiliary Data -------------- -.. autoclass:: pcapkit.protocols.application.ftp.Type +.. autoclass:: pcapkit.protocols.application.ftp.protocol.Type :members: :show-inheritance: Header Schemas -------------- -.. module:: pcapkit.protocols.schema.application.ftp +.. module:: pcapkit.protocols.application.ftp.schema + +.. versionremoved:: 1.6.0 -.. autoclass:: pcapkit.protocols.schema.application.ftp.FTP + ``pcapkit.protocols.schema.application.ftp``, with no alias: the module moved here + (:issue:`2534`). + +.. autoclass:: pcapkit.protocols.application.ftp.schema.FTP :members: :show-inheritance: Data Models ----------- -.. module:: pcapkit.protocols.data.application.ftp +.. module:: pcapkit.protocols.application.ftp.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.application.ftp``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.data.application.ftp.FTP +.. autoclass:: pcapkit.protocols.application.ftp.data.FTP :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.ftp.Request +.. autoclass:: pcapkit.protocols.application.ftp.data.Request :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.ftp.Response +.. autoclass:: pcapkit.protocols.application.ftp.data.Response :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/application/ftp_data.rst b/docs/source/pcapkit/protocols/application/ftp_data.rst index b87aa47e82..0d089c04a0 100644 --- a/docs/source/pcapkit/protocols/application/ftp_data.rst +++ b/docs/source/pcapkit/protocols/application/ftp_data.rst @@ -2,21 +2,22 @@ FTP_DATA - FTP Data Channel =========================== .. module:: pcapkit.protocols.application.ftp_data +.. module:: pcapkit.protocols.application.ftp_data.protocol -:mod:`pcapkit.protocols.application.ftp_data` contains -:class:`~pcapkit.protocols.application.ftp_data.FTP_DATA` only, +:mod:`pcapkit.protocols.application.ftp_data.protocol` contains +:class:`~pcapkit.protocols.application.ftp_data.protocol.FTP_DATA` only, which implements an extractor for the data channel of File Transfer Protocol (FTP) [*]_, whose octets it keeps undissected. .. versionadded:: 1.5.0 - Moved here from :mod:`pcapkit.protocols.application.ftp`, which keeps - :class:`~pcapkit.protocols.application.ftp.FTP` alone. The control and data + Moved here from :mod:`pcapkit.protocols.application.ftp.protocol`, which keeps + :class:`~pcapkit.protocols.application.ftp.protocol.FTP` alone. The control and data channels are dispatched separately -- FTP at TCP port 21, the data channel at port 20 -- so each is a protocol of its own and gets its own module (:issue:`2285`). -.. autoclass:: pcapkit.protocols.application.ftp_data.FTP_DATA +.. autoclass:: pcapkit.protocols.application.ftp_data.protocol.FTP_DATA :no-members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/application/http.rst b/docs/source/pcapkit/protocols/application/http.rst index 5037a7e151..45fe3f8ba9 100644 --- a/docs/source/pcapkit/protocols/application/http.rst +++ b/docs/source/pcapkit/protocols/application/http.rst @@ -2,30 +2,38 @@ HTTP - Hypertext Transfer Protocol ================================== .. module:: pcapkit.protocols.application.http +.. module:: pcapkit.protocols.application.http.protocol -:mod:`pcapkit.protocols.application.http` contains -:class:`~pcapkit.protocols.application.http.HTTP`, +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.application.http._HTTP2_PREFACE`` and + ``pcapkit.protocols.application.http.test_start_line``, with no alias: they are in + this module, and :mod:`pcapkit.protocols.application.http` exports the protocol class + alone (:issue:`2534`). + +:mod:`pcapkit.protocols.application.http.protocol` contains +:class:`~pcapkit.protocols.application.http.protocol.HTTP`, which is a base class for Hypertext Transfer Protocol (HTTP) [*]_ family, e.g. -:class:`HTTP/1.* ` -and :class:`HTTP/2 `, -and :func:`~pcapkit.protocols.application.http.test_start_line`, +:class:`HTTP/1.* ` +and :class:`HTTP/2 `, +and :func:`~pcapkit.protocols.application.http.protocol.test_start_line`, which tells whether a payload opens with an HTTP/1.* start line. .. versionchanged:: 1.6.0 A payload a transport port binds to - :class:`~pcapkit.protocols.application.http.HTTP`, and constructing or + :class:`~pcapkit.protocols.application.http.protocol.HTTP`, and constructing or rebuilding that class, give - :class:`~pcapkit.protocols.application.httpv1.HTTPv1` or - :class:`~pcapkit.protocols.application.httpv2.HTTPv2` rather than an instance + :class:`~pcapkit.protocols.application.httpv1.protocol.HTTPv1` or + :class:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2` rather than an instance of it, so the data sits under ``httpv1`` or ``httpv2`` rather than ``http`` (:issue:`2524`). Building it from fields takes ``version`` and is refused without it, where it built HTTP/1.*, and its - :meth:`~pcapkit.protocols.application.http.HTTP.from_data` refuses a + :meth:`~pcapkit.protocols.application.http.protocol.HTTP.from_data` refuses a :obj:`dict`, where it read the ``receipt`` or ``sid`` key (:issue:`2628`). -.. autoclass:: pcapkit.protocols.application.http.HTTP +.. autoclass:: pcapkit.protocols.application.http.protocol.HTTP :no-members: :show-inheritance: @@ -53,9 +61,9 @@ which tells whether a payload opens with an HTTP/1.* start line. .. automethod:: from_data -.. autofunction:: pcapkit.protocols.application.http.test_start_line +.. autofunction:: pcapkit.protocols.application.http.protocol.test_start_line -.. autodata:: pcapkit.protocols.application.http._HTTP2_PREFACE +.. autodata:: pcapkit.protocols.application.http.protocol._HTTP2_PREFACE .. rubric:: Footnotes diff --git a/docs/source/pcapkit/protocols/application/httpv1.rst b/docs/source/pcapkit/protocols/application/httpv1.rst index 0a981810e6..eb33c5c13a 100644 --- a/docs/source/pcapkit/protocols/application/httpv1.rst +++ b/docs/source/pcapkit/protocols/application/httpv1.rst @@ -2,12 +2,19 @@ HTTP/1.* - Hypertext Transfer Protocol ====================================== .. module:: pcapkit.protocols.application.httpv1 +.. module:: pcapkit.protocols.application.httpv1.protocol -:mod:`pcapkit.protocols.application.httpv1` contains -:class:`~pcapkit.protocols.application.httpv1.HTTPv1`, +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.application.httpv1.Type``, with no alias: it is in this module, + and :mod:`pcapkit.protocols.application.httpv1` exports the protocol class alone + (:issue:`2534`). + +:mod:`pcapkit.protocols.application.httpv1.protocol` contains +:class:`~pcapkit.protocols.application.httpv1.protocol.HTTPv1`, which implements an extractor for Hypertext Transfer Protocol (HTTP/1.*) [*]_, and its -:class:`~pcapkit.protocols.application.httpv1.Type` enumeration. The +:class:`~pcapkit.protocols.application.httpv1.protocol.Type` enumeration. The structure of an HTTP/1.* message is described as below: .. code-block:: text @@ -34,10 +41,10 @@ structure of an HTTP/1.* message is described as below: .. versionremoved:: 1.6.0 ``pcapkit.protocols.application.httpv1.HTTP``, with no alias. The - class is renamed :class:`~pcapkit.protocols.application.httpv1.HTTPv1`, + class is renamed :class:`~pcapkit.protocols.application.httpv1.protocol.HTTPv1`, after its module (:issue:`2529`). -.. autoclass:: pcapkit.protocols.application.httpv1.HTTPv1 +.. autoclass:: pcapkit.protocols.application.httpv1.protocol.HTTPv1 :no-members: :show-inheritance: @@ -57,49 +64,59 @@ structure of an HTTP/1.* message is described as below: Auxiliary Data -------------- -.. autoclass:: pcapkit.protocols.application.httpv1.Type +.. autoclass:: pcapkit.protocols.application.httpv1.protocol.Type :members: :show-inheritance: Header Schemas -------------- -.. module:: pcapkit.protocols.schema.application.httpv1 +.. module:: pcapkit.protocols.application.httpv1.schema + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.schema.application.httpv1``, with no alias: the module moved here + (:issue:`2534`). .. versionremoved:: 1.6.0 ``pcapkit.protocols.schema.application.httpv1.HTTP``, with no alias. The - class is renamed :class:`~pcapkit.protocols.schema.application.httpv1.HTTPv1`, + class is renamed :class:`~pcapkit.protocols.application.httpv1.schema.HTTPv1`, after its module (:issue:`2529`). -.. autoclass:: pcapkit.protocols.schema.application.httpv1.HTTPv1 +.. autoclass:: pcapkit.protocols.application.httpv1.schema.HTTPv1 :members: :show-inheritance: Data Models ----------- -.. module:: pcapkit.protocols.data.application.httpv1 +.. module:: pcapkit.protocols.application.httpv1.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.application.httpv1``, with no alias: the module moved here + (:issue:`2534`). .. versionremoved:: 1.6.0 ``pcapkit.protocols.data.application.httpv1.HTTP``, with no alias. The - class is renamed :class:`~pcapkit.protocols.data.application.httpv1.HTTPv1`, + class is renamed :class:`~pcapkit.protocols.application.httpv1.data.HTTPv1`, after its module (:issue:`2529`). -.. autoclass:: pcapkit.protocols.data.application.httpv1.HTTPv1 +.. autoclass:: pcapkit.protocols.application.httpv1.data.HTTPv1 :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.httpv1.Header +.. autoclass:: pcapkit.protocols.application.httpv1.data.Header :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.httpv1.RequestHeader +.. autoclass:: pcapkit.protocols.application.httpv1.data.RequestHeader :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.httpv1.ResponseHeader +.. autoclass:: pcapkit.protocols.application.httpv1.data.ResponseHeader :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/application/httpv2.rst b/docs/source/pcapkit/protocols/application/httpv2.rst index 7cd2178585..b6604b8bdd 100644 --- a/docs/source/pcapkit/protocols/application/httpv2.rst +++ b/docs/source/pcapkit/protocols/application/httpv2.rst @@ -2,9 +2,10 @@ HTTP/2 - Hypertext Transfer Protocol ==================================== .. module:: pcapkit.protocols.application.httpv2 +.. module:: pcapkit.protocols.application.httpv2.protocol -:mod:`pcapkit.protocols.application.httpv2` contains -:class:`~pcapkit.protocols.application.httpv2.HTTPv2` +:mod:`pcapkit.protocols.application.httpv2.protocol` contains +:class:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2` only, which implements an extractor for Hypertext Transfer Protocol (HTTP/2) [*]_, whose structure is described as below: @@ -24,14 +25,14 @@ Frames in One Segment --------------------- A whole frame after the first in a TCP segment is dissected as a further -:class:`~pcapkit.protocols.application.httpv2.HTTPv2` layer, the previous +:class:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2` layer, the previous frame's payload (:issue:`2536`), as -:class:`~pcapkit.protocols.application.tls.TLS` chains records: a ``SETTINGS`` +:class:`~pcapkit.protocols.application.tls.protocol.TLS` chains records: a ``SETTINGS`` frame followed by a ``WINDOW_UPDATE`` reads ``TCP:HTTP/2:HTTP/2``. The exceptions: * A whole frame that fails to decode becomes - :class:`~pcapkit.protocols.misc.raw.Raw` together with everything after it, + :class:`~pcapkit.protocols.misc.raw.protocol.Raw` together with everything after it, with the parser's ``error``. * A frame the segment ends inside, its header or its payload cut short, stays raw, with no error. @@ -54,14 +55,14 @@ exceptions: .. versionremoved:: 1.6.0 ``pcapkit.protocols.application.httpv2.HTTP``, with no alias. The - class is renamed :class:`~pcapkit.protocols.application.httpv2.HTTPv2`, + class is renamed :class:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2`, after its module (:issue:`2529`). .. raw:: html
-.. autoclass:: pcapkit.protocols.application.httpv2.HTTPv2 +.. autoclass:: pcapkit.protocols.application.httpv2.protocol.HTTPv2 :no-members: :show-inheritance: @@ -109,182 +110,192 @@ exceptions: Header Schemas -------------- -.. module:: pcapkit.protocols.schema.application.httpv2 +.. module:: pcapkit.protocols.application.httpv2.schema + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.schema.application.httpv2``, with no alias: the module moved here + (:issue:`2534`). .. versionremoved:: 1.6.0 ``pcapkit.protocols.schema.application.httpv2.HTTP``, with no alias. The - class is renamed :class:`~pcapkit.protocols.schema.application.httpv2.HTTPv2`, + class is renamed :class:`~pcapkit.protocols.application.httpv2.schema.HTTPv2`, after its module (:issue:`2529`). -.. autoclass:: pcapkit.protocols.schema.application.httpv2.HTTPv2 +.. autoclass:: pcapkit.protocols.application.httpv2.schema.HTTPv2 :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.application.httpv2.FrameType +.. autoclass:: pcapkit.protocols.application.httpv2.schema.FrameType :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.application.httpv2.UnassignedFrame +.. autoclass:: pcapkit.protocols.application.httpv2.schema.UnassignedFrame :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.application.httpv2.DataFrame +.. autoclass:: pcapkit.protocols.application.httpv2.schema.DataFrame :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.application.httpv2.HeadersFrame +.. autoclass:: pcapkit.protocols.application.httpv2.schema.HeadersFrame :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.application.httpv2.PriorityFrame +.. autoclass:: pcapkit.protocols.application.httpv2.schema.PriorityFrame :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.application.httpv2.RSTStreamFrame +.. autoclass:: pcapkit.protocols.application.httpv2.schema.RSTStreamFrame :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.application.httpv2.SettingPair +.. autoclass:: pcapkit.protocols.application.httpv2.schema.SettingPair :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.application.httpv2.SettingsFrame +.. autoclass:: pcapkit.protocols.application.httpv2.schema.SettingsFrame :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.application.httpv2.PushPromiseFrame +.. autoclass:: pcapkit.protocols.application.httpv2.schema.PushPromiseFrame :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.application.httpv2.PingFrame +.. autoclass:: pcapkit.protocols.application.httpv2.schema.PingFrame :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.application.httpv2.GoawayFrame +.. autoclass:: pcapkit.protocols.application.httpv2.schema.GoawayFrame :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.application.httpv2.WindowUpdateFrame +.. autoclass:: pcapkit.protocols.application.httpv2.schema.WindowUpdateFrame :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.application.httpv2.ContinuationFrame +.. autoclass:: pcapkit.protocols.application.httpv2.schema.ContinuationFrame :members: :show-inheritance: Type Stubs ~~~~~~~~~~ -.. autoclass:: pcapkit.protocols.schema.application.httpv2.FrameFlags +.. autoclass:: pcapkit.protocols.application.httpv2.schema.FrameFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.application.httpv2.StreamID +.. autoclass:: pcapkit.protocols.application.httpv2.schema.StreamID :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.application.httpv2.StreamDependency +.. autoclass:: pcapkit.protocols.application.httpv2.schema.StreamDependency :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.application.httpv2.WindowSize +.. autoclass:: pcapkit.protocols.application.httpv2.schema.WindowSize :members: :show-inheritance: Auxiliary Functions ~~~~~~~~~~~~~~~~~~~ -.. autofunction:: pcapkit.protocols.schema.application.httpv2.http_frame_selector +.. autofunction:: pcapkit.protocols.application.httpv2.schema.http_frame_selector Data Models ----------- -.. module:: pcapkit.protocols.data.application.httpv2 +.. module:: pcapkit.protocols.application.httpv2.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.application.httpv2``, with no alias: the module moved here + (:issue:`2534`). .. versionremoved:: 1.6.0 ``pcapkit.protocols.data.application.httpv2.HTTP``, with no alias. The - class is renamed :class:`~pcapkit.protocols.data.application.httpv2.HTTPv2`, + class is renamed :class:`~pcapkit.protocols.application.httpv2.data.HTTPv2`, after its module (:issue:`2529`). -.. autoclass:: pcapkit.protocols.data.application.httpv2.HTTPv2 +.. autoclass:: pcapkit.protocols.application.httpv2.data.HTTPv2 :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.httpv2.Flags +.. autoclass:: pcapkit.protocols.application.httpv2.data.Flags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.httpv2.UnassignedFrame +.. autoclass:: pcapkit.protocols.application.httpv2.data.UnassignedFrame :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.httpv2.DataFrame +.. autoclass:: pcapkit.protocols.application.httpv2.data.DataFrame :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.httpv2.DataFrameFlags +.. autoclass:: pcapkit.protocols.application.httpv2.data.DataFrameFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.httpv2.HeadersFrame +.. autoclass:: pcapkit.protocols.application.httpv2.data.HeadersFrame :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.httpv2.HeadersFrameFlags +.. autoclass:: pcapkit.protocols.application.httpv2.data.HeadersFrameFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.httpv2.PriorityFrame +.. autoclass:: pcapkit.protocols.application.httpv2.data.PriorityFrame :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.httpv2.RSTStreamFrame +.. autoclass:: pcapkit.protocols.application.httpv2.data.RSTStreamFrame :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.httpv2.SettingsFrame +.. autoclass:: pcapkit.protocols.application.httpv2.data.SettingsFrame :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.httpv2.Settings +.. autoclass:: pcapkit.protocols.application.httpv2.data.Settings :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.httpv2.SettingsFrameFlags +.. autoclass:: pcapkit.protocols.application.httpv2.data.SettingsFrameFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.httpv2.PushPromiseFrame +.. autoclass:: pcapkit.protocols.application.httpv2.data.PushPromiseFrame :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.httpv2.PushPromiseFrameFlags +.. autoclass:: pcapkit.protocols.application.httpv2.data.PushPromiseFrameFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.httpv2.PingFrame +.. autoclass:: pcapkit.protocols.application.httpv2.data.PingFrame :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.httpv2.PingFrameFlags +.. autoclass:: pcapkit.protocols.application.httpv2.data.PingFrameFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.httpv2.GoawayFrame +.. autoclass:: pcapkit.protocols.application.httpv2.data.GoawayFrame :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.httpv2.WindowUpdateFrame +.. autoclass:: pcapkit.protocols.application.httpv2.data.WindowUpdateFrame :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.httpv2.ContinuationFrame +.. autoclass:: pcapkit.protocols.application.httpv2.data.ContinuationFrame :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.httpv2.ContinuationFrameFlags +.. autoclass:: pcapkit.protocols.application.httpv2.data.ContinuationFrameFlags :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/application/index.rst b/docs/source/pcapkit/protocols/application/index.rst index e74e2d09f8..66cdf78eea 100644 --- a/docs/source/pcapkit/protocols/application/index.rst +++ b/docs/source/pcapkit/protocols/application/index.rst @@ -2,8 +2,6 @@ Application Layer ================= .. module:: pcapkit.protocols.application -.. module:: pcapkit.protocols.data.application -.. module:: pcapkit.protocols.schema.application :mod:`pcapkit.protocols.application` is the collection of all protocols in application layer, with detailed implementation and methods. Layer is decided by diff --git a/docs/source/pcapkit/protocols/application/ngap.rst b/docs/source/pcapkit/protocols/application/ngap.rst index f79f8006ec..77635c7d33 100644 --- a/docs/source/pcapkit/protocols/application/ngap.rst +++ b/docs/source/pcapkit/protocols/application/ngap.rst @@ -2,21 +2,34 @@ NGAP - NG Application Protocol ============================== .. module:: pcapkit.protocols.application.ngap - -:mod:`pcapkit.protocols.application.ngap` contains -:class:`~pcapkit.protocols.application.ngap.NGAP`, +.. module:: pcapkit.protocols.application.ngap.protocol + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.application.ngap._PYCRATE``, + ``pcapkit.protocols.application.ngap._PDU_LOCK``, + ``pcapkit.protocols.application.ngap.load_pycrate``, + ``pcapkit.protocols.application.ngap.PDUKind``, + ``pcapkit.protocols.application.ngap.Criticality``, + ``pcapkit.protocols.application.ngap._convert`` and + ``pcapkit.protocols.application.ngap._revert``, with no alias: they are in this + module, and :mod:`pcapkit.protocols.application.ngap` exports the protocol class + alone (:issue:`2534`). + +:mod:`pcapkit.protocols.application.ngap.protocol` contains +:class:`~pcapkit.protocols.application.ngap.protocol.NGAP`, which implements an extractor for the NG Application Protocol (NGAP) [*]_, as specified in 3GPP TS 38.413, and the enumerations its data models report with: -:class:`~pcapkit.protocols.application.ngap.PDUKind`, -:class:`~pcapkit.protocols.application.ngap.Criticality`, +:class:`~pcapkit.protocols.application.ngap.protocol.PDUKind`, +:class:`~pcapkit.protocols.application.ngap.protocol.Criticality`, :class:`~pcapkit.const.ngap.procedure_code.ProcedureCode` and :class:`~pcapkit.const.ngap.protocol_ie.ProtocolIE`. NGAP is the control plane between a 5G RAN node (gNB or ng-eNB) and an AMF. It runs over SCTP and is named by the DATA chunk's *payload protocol identifier* rather than by a port, so :class:`NGAP` is registered on -:attr:`SCTP.__proto__ ` under +:attr:`SCTP.__proto__ ` under PPID 60 (:attr:`~pcapkit.const.sctp.payload_protocol_identifier.PayloadProtocolIdentifier.PayloadProtocolIdentifier_3GPP_NG_Application_Protocol`) and PPID 66 @@ -34,11 +47,11 @@ Decoding therefore needs the optional |pycrate|_ dependency it; an NGAP payload simply degrades to the opaque payload path, exactly as an unregistered PPID would, because :meth:`~pcapkit.protocols.protocol.Protocol._import_next_layer`, which -:class:`~pcapkit.protocols.transport.sctp.SCTP` inherits, is wrapped in +:class:`~pcapkit.protocols.transport.sctp.protocol.SCTP` inherits, is wrapped in :func:`~pcapkit.corekit.decorators.beholder` and falls back to -:class:`~pcapkit.protocols.misc.raw.Raw`. +:class:`~pcapkit.protocols.misc.raw.protocol.Raw`. -.. autoclass:: pcapkit.protocols.application.ngap.NGAP +.. autoclass:: pcapkit.protocols.application.ngap.protocol.NGAP :no-members: :show-inheritance: @@ -72,10 +85,10 @@ objects **structurally**, by ASN.1 shape rather than by procedure: ========================================================== ========================================================== ASN.1 / |pycrate|_ shape :mod:`pcapkit` model ========================================================== ========================================================== -``SEQUENCE`` / ``SET`` (a dict) :class:`~pcapkit.protocols.data.application.ngap.Sequence` +``SEQUENCE`` / ``SET`` (a dict) :class:`~pcapkit.protocols.application.ngap.data.Sequence` ``SEQUENCE OF`` (a list) :obj:`list` -``CHOICE`` / open type :class:`~pcapkit.protocols.data.application.ngap.Choice` -``BIT STRING`` :class:`~pcapkit.protocols.data.application.ngap.BitString` +``CHOICE`` / open type :class:`~pcapkit.protocols.application.ngap.data.Choice` +``BIT STRING`` :class:`~pcapkit.protocols.application.ngap.data.BitString` ``INTEGER``, ``OCTET STRING``, ``ENUMERATED``, ``BOOLEAN`` kept as :obj:`int`, :obj:`bytes`, :obj:`str`, :obj:`bool` ========================================================== ========================================================== @@ -86,19 +99,19 @@ reported in the specification's own shape rather than as a :mod:`pcapkit`-specific model. The fields worth reading at a glance -- the PDU kind, procedure code, criticality, message type name and the IE list -- are surfaced as first-class fields on -:class:`~pcapkit.protocols.data.application.ngap.NGAP` regardless. +:class:`~pcapkit.protocols.application.ngap.data.NGAP` regardless. Known Limitations ----------------- * **PPID 66 payloads are not decoded.** NGAP over DTLS over SCTP wraps the ``NGAP-PDU`` in a DTLS record, and :attr:`SCTP.__proto__ - ` maps PPID 66 to - :class:`~pcapkit.protocols.application.ngap.NGAP` rather than - through :class:`~pcapkit.protocols.application.dtls.DTLS`, so the bytes + ` maps PPID 66 to + :class:`~pcapkit.protocols.application.ngap.protocol.NGAP` rather than + through :class:`~pcapkit.protocols.application.dtls.protocol.DTLS`, so the bytes reaching :meth:`NGAP.read` are not an APER encoding. The PPID is registered so that it is *named* rather than anonymous; the payload itself - degrades to :class:`~pcapkit.protocols.misc.raw.Raw`. + degrades to :class:`~pcapkit.protocols.misc.raw.protocol.Raw`. * **The specification version is that of the installed decoder, not this package's.** The IE and procedure enumerations were generated from ``NGAP_Constants`` of |pycrate|_ 0.8.1 (Release-18-era). A |pycrate|_ that @@ -117,60 +130,70 @@ Known Limitations Auxiliary Functions ------------------- -.. autofunction:: pcapkit.protocols.application.ngap.load_pycrate +.. autofunction:: pcapkit.protocols.application.ngap.protocol.load_pycrate -.. autofunction:: pcapkit.protocols.application.ngap._convert +.. autofunction:: pcapkit.protocols.application.ngap.protocol._convert -.. autofunction:: pcapkit.protocols.application.ngap._revert +.. autofunction:: pcapkit.protocols.application.ngap.protocol._revert Auxiliary Data -------------- -.. autoclass:: pcapkit.protocols.application.ngap.PDUKind +.. autoclass:: pcapkit.protocols.application.ngap.protocol.PDUKind :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.application.ngap.Criticality +.. autoclass:: pcapkit.protocols.application.ngap.protocol.Criticality :members: :show-inheritance: -.. autodata:: pcapkit.protocols.application.ngap._PYCRATE +.. autodata:: pcapkit.protocols.application.ngap.protocol._PYCRATE :no-value: -.. autodata:: pcapkit.protocols.application.ngap._PDU_LOCK +.. autodata:: pcapkit.protocols.application.ngap.protocol._PDU_LOCK :no-value: Header Schemas -------------- -.. module:: pcapkit.protocols.schema.application.ngap +.. module:: pcapkit.protocols.application.ngap.schema + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.schema.application.ngap``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.schema.application.ngap.NGAP +.. autoclass:: pcapkit.protocols.application.ngap.schema.NGAP :members: :show-inheritance: Data Models ----------- -.. module:: pcapkit.protocols.data.application.ngap +.. module:: pcapkit.protocols.application.ngap.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.application.ngap``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.data.application.ngap.NGAP +.. autoclass:: pcapkit.protocols.application.ngap.data.NGAP :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.ngap.IE +.. autoclass:: pcapkit.protocols.application.ngap.data.IE :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.ngap.Choice +.. autoclass:: pcapkit.protocols.application.ngap.data.Choice :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.ngap.BitString +.. autoclass:: pcapkit.protocols.application.ngap.data.BitString :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.ngap.Sequence +.. autoclass:: pcapkit.protocols.application.ngap.data.Sequence :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/application/ospf.rst b/docs/source/pcapkit/protocols/application/ospf.rst index 89c58d1855..6b6a567d2c 100644 --- a/docs/source/pcapkit/protocols/application/ospf.rst +++ b/docs/source/pcapkit/protocols/application/ospf.rst @@ -2,9 +2,10 @@ OSPF - Open Shortest Path First =============================== .. module:: pcapkit.protocols.application.ospf +.. module:: pcapkit.protocols.application.ospf.protocol -:mod:`pcapkit.protocols.application.ospf` contains -:class:`~pcapkit.protocols.application.ospf.OSPF` only, +:mod:`pcapkit.protocols.application.ospf.protocol` contains +:class:`~pcapkit.protocols.application.ospf.protocol.OSPF` only, which implements an extractor for Open Shortest Path First (OSPF) [*]_, whose structure is described as below: @@ -34,7 +35,7 @@ as below: .. versionadded:: 1.5.0 Moved here from ``pcapkit.protocols.link.ospf``, with its data model and - header schema. :class:`~pcapkit.protocols.application.ospf.OSPF` derives + header schema. :class:`~pcapkit.protocols.application.ospf.protocol.OSPF` derives from :class:`~pcapkit.protocols.application.application.Application`, so its layer is ``'Application'`` (:issue:`719`). @@ -42,16 +43,16 @@ as below: ``pcapkit.protocols.link.ospf``, ``pcapkit.protocols.data.link.ospf`` and ``pcapkit.protocols.schema.link.ospf``, the ``OSPF`` name that - :mod:`pcapkit.protocols.link`, :mod:`pcapkit.protocols.data.link` and - :mod:`pcapkit.protocols.schema.link` each exported, and the + :mod:`pcapkit.protocols.link`, ``pcapkit.protocols.data.link`` and + ``pcapkit.protocols.schema.link`` each exported, and the ``OSPF_CrytographicAuthentication`` name that - :mod:`pcapkit.protocols.data.link` and :mod:`pcapkit.protocols.schema.link` + ``pcapkit.protocols.data.link`` and ``pcapkit.protocols.schema.link`` exported, with no alias (:issue:`719`, :issue:`1090`). .. versionchanged:: 1.5.0 A rebuild keeps the parsed Packet Length and the octets past it, where - :meth:`~pcapkit.protocols.application.ospf.OSPF.make` recomputed the + :meth:`~pcapkit.protocols.application.ospf.protocol.OSPF.make` recomputed the length from the payload and dropped those octets; it takes them as ``packet_length`` and ``trailer`` (:issue:`1249`, :issue:`1455`). @@ -59,7 +60,7 @@ as below:
-.. autoclass:: pcapkit.protocols.application.ospf.OSPF +.. autoclass:: pcapkit.protocols.application.ospf.protocol.OSPF :no-members: :show-inheritance: @@ -83,31 +84,41 @@ as below: Header Schemas -------------- -.. module:: pcapkit.protocols.schema.application.ospf +.. module:: pcapkit.protocols.application.ospf.schema -.. autoclass:: pcapkit.protocols.schema.application.ospf.OSPF +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.schema.application.ospf``, with no alias: the module moved here + (:issue:`2534`). + +.. autoclass:: pcapkit.protocols.application.ospf.schema.OSPF :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.application.ospf.CryptographicAuthentication +.. autoclass:: pcapkit.protocols.application.ospf.schema.CryptographicAuthentication :members: :show-inheritance: Auxiliary Functions ~~~~~~~~~~~~~~~~~~~ -.. autofunction:: pcapkit.protocols.schema.application.ospf.ospf_auth_data_selector +.. autofunction:: pcapkit.protocols.application.ospf.schema.ospf_auth_data_selector Data Models ----------- -.. module:: pcapkit.protocols.data.application.ospf +.. module:: pcapkit.protocols.application.ospf.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.application.ospf``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.data.application.ospf.OSPF +.. autoclass:: pcapkit.protocols.application.ospf.data.OSPF :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.ospf.CryptographicAuthentication +.. autoclass:: pcapkit.protocols.application.ospf.data.CryptographicAuthentication :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/application/rarp.rst b/docs/source/pcapkit/protocols/application/rarp.rst index 7ec30535c9..95c0c8e3ce 100644 --- a/docs/source/pcapkit/protocols/application/rarp.rst +++ b/docs/source/pcapkit/protocols/application/rarp.rst @@ -2,9 +2,10 @@ RARP - Reverse Address Resolution Protocol ========================================== .. module:: pcapkit.protocols.application.rarp +.. module:: pcapkit.protocols.application.rarp.protocol -:mod:`pcapkit.protocols.application.rarp` contains -:class:`~pcapkit.protocols.application.rarp.RARP` only, +:mod:`pcapkit.protocols.application.rarp.protocol` contains +:class:`~pcapkit.protocols.application.rarp.protocol.RARP` only, which implements an extractor for Reverse Address Resolution Protocol (RARP) [*]_, whose structure is described as below: @@ -26,10 +27,10 @@ Octets Bits Name Description .. versionadded:: 1.5.0 Moved here from ``pcapkit.protocols.link.rarp``. - :class:`~pcapkit.protocols.application.rarp.RARP` and - :class:`~pcapkit.protocols.application.drarp.DRARP` derive from + :class:`~pcapkit.protocols.application.rarp.protocol.RARP` and + :class:`~pcapkit.protocols.application.drarp.protocol.DRARP` derive from :class:`~pcapkit.protocols.application.application.Application` as well as - :class:`~pcapkit.protocols.link.arp.ARP`, so their layer is + :class:`~pcapkit.protocols.link.arp.protocol.ARP`, so their layer is ``'Application'`` (:issue:`719`). .. versionremoved:: 1.5.0 @@ -40,10 +41,10 @@ Octets Bits Name Description .. versionremoved:: 1.6.0 ``pcapkit.protocols.application.rarp.DRARP``, with no alias. The class - moved to :mod:`pcapkit.protocols.application.drarp`, since a module holds + moved to :mod:`pcapkit.protocols.application.drarp.protocol`, since a module holds one protocol class, named after it (:issue:`2529`). -.. autoclass:: pcapkit.protocols.application.rarp.RARP +.. autoclass:: pcapkit.protocols.application.rarp.protocol.RARP :no-members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/application/ssl.rst b/docs/source/pcapkit/protocols/application/ssl.rst index bd765115db..0b99dd41e1 100644 --- a/docs/source/pcapkit/protocols/application/ssl.rst +++ b/docs/source/pcapkit/protocols/application/ssl.rst @@ -2,20 +2,21 @@ SSL - Secure Sockets Layer =============================== .. module:: pcapkit.protocols.application.ssl +.. module:: pcapkit.protocols.application.ssl.protocol -:mod:`pcapkit.protocols.application.ssl` contains -:class:`~pcapkit.protocols.application.ssl.SSL` only, +:mod:`pcapkit.protocols.application.ssl.protocol` contains +:class:`~pcapkit.protocols.application.ssl.protocol.SSL` only, which is the umbrella base class for the Secure Sockets Layer protocol family [*]_ -- the SSL versions, Transport Layer Security and Datagram TLS: -* :class:`~pcapkit.protocols.application.sslv2.SSLv2` -- SSL 2.0, whose +* :class:`~pcapkit.protocols.application.sslv2.protocol.SSLv2` -- SSL 2.0, whose record layer shares no wire format with the others; -* :class:`~pcapkit.protocols.application.tls.TLS` -- SSLv3 and TLS 1.0 - through TLS 1.3, with :class:`~pcapkit.protocols.application.sslv3.SSLv3` as +* :class:`~pcapkit.protocols.application.tls.protocol.TLS` -- SSLv3 and TLS 1.0 + through TLS 1.3, with :class:`~pcapkit.protocols.application.sslv3.protocol.SSLv3` as its thin subclass for explicit construction; -* :class:`~pcapkit.protocols.application.dtls.DTLS` -- DTLS 1.0, 1.2 and 1.3. +* :class:`~pcapkit.protocols.application.dtls.protocol.DTLS` -- DTLS 1.0, 1.2 and 1.3. -:meth:`SSL.id ` lists the direct +:meth:`SSL.id ` lists the direct concrete subclasses, so a lookup keyed on ``SSL`` matches any of them. The TLS record header (:rfc:`9846#section-5.1`) is a @@ -24,7 +25,7 @@ and a length. The DTLS ``DTLSPlaintext`` header (:rfc:`9147#section-4`) has the same fields plus an epoch and a 48-bit sequence number *between* the version and the length, and DTLS adds a fragment header to each handshake message. Each record header is declared in its subclass's own schema, and -:class:`~pcapkit.protocols.application.dtls.DTLS` reads the epoch and sequence +:class:`~pcapkit.protocols.application.dtls.protocol.DTLS` reads the epoch and sequence number. This base class carries the logic the two share -- content-type dispatch, handshake-message decoding (including the DTLS fragment header), the extension registry, and the record-level validation that keeps dispatch from @@ -36,7 +37,7 @@ accepting bytes that cannot be a genuine record.
-.. autoclass:: pcapkit.protocols.application.ssl.SSL +.. autoclass:: pcapkit.protocols.application.ssl.protocol.SSL :no-members: :show-inheritance: @@ -89,85 +90,85 @@ accepting bytes that cannot be a genuine record. Data Models ----------- -.. module:: pcapkit.protocols.data.application.tls +.. module:: pcapkit.protocols.application.ssl.data -.. autoclass:: pcapkit.protocols.data.application.tls.Handshake +.. autoclass:: pcapkit.protocols.application.ssl.data.Handshake :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.tls.ClientHello +.. autoclass:: pcapkit.protocols.application.ssl.data.ClientHello :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.tls.ServerHello +.. autoclass:: pcapkit.protocols.application.ssl.data.ServerHello :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.tls.EncryptedExtensions +.. autoclass:: pcapkit.protocols.application.ssl.data.EncryptedExtensions :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.tls.Extension +.. autoclass:: pcapkit.protocols.application.ssl.data.Extension :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.tls.ExtensionData +.. autoclass:: pcapkit.protocols.application.ssl.data.ExtensionData :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.tls.ServerNameList +.. autoclass:: pcapkit.protocols.application.ssl.data.ServerNameList :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.tls.ServerName +.. autoclass:: pcapkit.protocols.application.ssl.data.ServerName :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.tls.NamedGroupList +.. autoclass:: pcapkit.protocols.application.ssl.data.NamedGroupList :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.tls.SignatureSchemeList +.. autoclass:: pcapkit.protocols.application.ssl.data.SignatureSchemeList :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.tls.ProtocolNameList +.. autoclass:: pcapkit.protocols.application.ssl.data.ProtocolNameList :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.tls.SupportedVersionsClientHello +.. autoclass:: pcapkit.protocols.application.ssl.data.SupportedVersionsClientHello :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.tls.SupportedVersionsServerHello +.. autoclass:: pcapkit.protocols.application.ssl.data.SupportedVersionsServerHello :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.tls.KeyShareClientHello +.. autoclass:: pcapkit.protocols.application.ssl.data.KeyShareClientHello :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.tls.KeyShareHelloRetryRequest +.. autoclass:: pcapkit.protocols.application.ssl.data.KeyShareHelloRetryRequest :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.tls.KeyShareServerHello +.. autoclass:: pcapkit.protocols.application.ssl.data.KeyShareServerHello :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.tls.KeyShareEntry +.. autoclass:: pcapkit.protocols.application.ssl.data.KeyShareEntry :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.tls.ConnectionId +.. autoclass:: pcapkit.protocols.application.ssl.data.ConnectionId :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.tls.Alert +.. autoclass:: pcapkit.protocols.application.ssl.data.Alert :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.tls.ChangeCipherSpec +.. autoclass:: pcapkit.protocols.application.ssl.data.ChangeCipherSpec :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/application/sslv2.rst b/docs/source/pcapkit/protocols/application/sslv2.rst index d34e667e65..ef29e23775 100644 --- a/docs/source/pcapkit/protocols/application/sslv2.rst +++ b/docs/source/pcapkit/protocols/application/sslv2.rst @@ -2,9 +2,10 @@ SSLv2 - Secure Sockets Layer Version 2 ======================================= .. module:: pcapkit.protocols.application.sslv2 +.. module:: pcapkit.protocols.application.sslv2.protocol -:mod:`pcapkit.protocols.application.sslv2` contains -:class:`~pcapkit.protocols.application.sslv2.SSLv2` only, +:mod:`pcapkit.protocols.application.sslv2.protocol` contains +:class:`~pcapkit.protocols.application.sslv2.protocol.SSLv2` only, which implements an extractor for Secure Sockets Layer version 2 (SSLv2) [*]_, whose record header is 2 or 3 octets, chosen by the high bit of its first octet (``sslv2.indicator``): @@ -30,7 +31,7 @@ high bit of its first octet (``sslv2.indicator``): |sslv2.msg_type | handshake message body ... ``E`` is the ``IS-ESCAPE`` flag, meaningful only in the 3-octet form. See -:func:`~pcapkit.protocols.schema.application.sslv2.sslv2_record_length` for the +:func:`~pcapkit.protocols.application.sslv2.schema.sslv2_record_length` for the exact bit arithmetic. SSLv2 is wire-*incompatible* with SSLv3 and TLS: it carries no content-type @@ -46,12 +47,12 @@ Records in One Segment ---------------------- A whole record after the first in a TCP segment is dissected as a further -:class:`~pcapkit.protocols.application.sslv2.SSLv2` layer, the previous record's +:class:`~pcapkit.protocols.application.sslv2.protocol.SSLv2` layer, the previous record's payload, whatever its message type (:issue:`2567`): a ``CLIENT-HELLO`` followed by a ``CLIENT-MASTER-KEY`` reads ``SSLv2:SSLv2``. The exceptions: * A whole record that fails to decode -- a ``RECORD-LENGTH`` of ``0``, which - leaves no ``MSG-TYPE`` -- becomes :class:`~pcapkit.protocols.misc.raw.Raw` + leaves no ``MSG-TYPE`` -- becomes :class:`~pcapkit.protocols.misc.raw.protocol.Raw` together with everything after it. * Octets that open no record -- a header cut short, or a record the segment ends inside -- stay raw, with no error. @@ -66,7 +67,7 @@ a ``CLIENT-MASTER-KEY`` reads ``SSLv2:SSLv2``. The exceptions:
-.. autoclass:: pcapkit.protocols.application.sslv2.SSLv2 +.. autoclass:: pcapkit.protocols.application.sslv2.protocol.SSLv2 :no-members: :show-inheritance: @@ -86,50 +87,50 @@ a ``CLIENT-MASTER-KEY`` reads ``SSLv2:SSLv2``. The exceptions: Header Schemas -------------- -.. module:: pcapkit.protocols.schema.application.sslv2 +.. module:: pcapkit.protocols.application.sslv2.schema -.. autoclass:: pcapkit.protocols.schema.application.sslv2.SSLv2 +.. autoclass:: pcapkit.protocols.application.sslv2.schema.SSLv2 :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.application.sslv2.HandshakeBody +.. autoclass:: pcapkit.protocols.application.sslv2.schema.HandshakeBody :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.application.sslv2.UnknownHandshakeBody +.. autoclass:: pcapkit.protocols.application.sslv2.schema.UnknownHandshakeBody :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.application.sslv2.ClientHello +.. autoclass:: pcapkit.protocols.application.sslv2.schema.ClientHello :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.application.sslv2.ServerHello +.. autoclass:: pcapkit.protocols.application.sslv2.schema.ServerHello :members: :show-inheritance: Auxiliary Functions ~~~~~~~~~~~~~~~~~~~~ -.. autofunction:: pcapkit.protocols.schema.application.sslv2.sslv2_record_length -.. autofunction:: pcapkit.protocols.schema.application.sslv2.sslv2_hello_probe_length -.. autofunction:: pcapkit.protocols.schema.application.sslv2.sslv2_hello_probe_is_plausible -.. autofunction:: pcapkit.protocols.schema.application.sslv2.sslv2_body_selector +.. autofunction:: pcapkit.protocols.application.sslv2.schema.sslv2_record_length +.. autofunction:: pcapkit.protocols.application.sslv2.schema.sslv2_hello_probe_length +.. autofunction:: pcapkit.protocols.application.sslv2.schema.sslv2_hello_probe_is_plausible +.. autofunction:: pcapkit.protocols.application.sslv2.schema.sslv2_body_selector Data Models ----------- -.. module:: pcapkit.protocols.data.application.sslv2 +.. module:: pcapkit.protocols.application.sslv2.data -.. autoclass:: pcapkit.protocols.data.application.sslv2.SSLv2 +.. autoclass:: pcapkit.protocols.application.sslv2.data.SSLv2 :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.sslv2.ClientHello +.. autoclass:: pcapkit.protocols.application.sslv2.data.ClientHello :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.application.sslv2.ServerHello +.. autoclass:: pcapkit.protocols.application.sslv2.data.ServerHello :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/application/sslv3.rst b/docs/source/pcapkit/protocols/application/sslv3.rst index e90d63373f..f8163a23ca 100644 --- a/docs/source/pcapkit/protocols/application/sslv3.rst +++ b/docs/source/pcapkit/protocols/application/sslv3.rst @@ -2,20 +2,21 @@ SSLv3 - Secure Sockets Layer Version 3 ====================================== .. module:: pcapkit.protocols.application.sslv3 +.. module:: pcapkit.protocols.application.sslv3.protocol -:mod:`pcapkit.protocols.application.sslv3` contains -:class:`~pcapkit.protocols.application.sslv3.SSLv3` only, +:mod:`pcapkit.protocols.application.sslv3.protocol` contains +:class:`~pcapkit.protocols.application.sslv3.protocol.SSLv3` only, which implements an extractor for Secure Sockets Layer version 3 (SSLv3) [*]_, whose record is the one -:mod:`pcapkit.protocols.application.tls` describes. +:mod:`pcapkit.protocols.application.tls.protocol` describes. -Nothing dispatches to :class:`~pcapkit.protocols.application.sslv3.SSLv3`: -an SSLv3 record parses as :class:`~pcapkit.protocols.application.tls.TLS` +Nothing dispatches to :class:`~pcapkit.protocols.application.sslv3.protocol.SSLv3`: +an SSLv3 record parses as :class:`~pcapkit.protocols.application.tls.protocol.TLS` with alias ``SSLv3``. .. versionadded:: 1.6.0 -.. autoclass:: pcapkit.protocols.application.sslv3.SSLv3 +.. autoclass:: pcapkit.protocols.application.sslv3.protocol.SSLv3 :no-members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/application/tls.rst b/docs/source/pcapkit/protocols/application/tls.rst index 03e9232ba9..2c8f593d29 100644 --- a/docs/source/pcapkit/protocols/application/tls.rst +++ b/docs/source/pcapkit/protocols/application/tls.rst @@ -2,9 +2,10 @@ TLS/SSL - Transport Layer Security ======================================== .. module:: pcapkit.protocols.application.tls +.. module:: pcapkit.protocols.application.tls.protocol -:mod:`pcapkit.protocols.application.tls` contains -:class:`~pcapkit.protocols.application.tls.TLS` only, which implements an +:mod:`pcapkit.protocols.application.tls.protocol` contains +:class:`~pcapkit.protocols.application.tls.protocol.TLS` only, which implements an extractor for the TLS/SSLv3+ record-layer family [*]_ -- SSLv3 (:rfc:`6101`), TLS 1.0 (:rfc:`2246`), TLS 1.1 (:rfc:`4346`), TLS 1.2 (:rfc:`5246`) and TLS 1.3 (:rfc:`9846`, which obsoletes :rfc:`5077`, :rfc:`5246`, :rfc:`6961`, @@ -15,21 +16,21 @@ Version Identification ---------------------- The record layer is wire-identical across the family, so one -:class:`~pcapkit.protocols.application.tls.TLS` class parses all of it and +:class:`~pcapkit.protocols.application.tls.protocol.TLS` class parses all of it and reports the version it identified through -:attr:`~pcapkit.protocols.application.tls.TLS.alias` and -:attr:`~pcapkit.protocols.application.tls.TLS.name`, set by -:meth:`~pcapkit.protocols.application.tls.TLS.read` -- the same shape -:class:`~pcapkit.protocols.link.arp.ARP` uses for RARP/DRARP/InARP. -:meth:`~pcapkit.protocols.application.tls.TLS.id` stays ``('TLS',)`` +:attr:`~pcapkit.protocols.application.tls.protocol.TLS.alias` and +:attr:`~pcapkit.protocols.application.tls.protocol.TLS.name`, set by +:meth:`~pcapkit.protocols.application.tls.protocol.TLS.read` -- the same shape +:class:`~pcapkit.protocols.link.arp.protocol.ARP` uses for RARP/DRARP/InARP. +:meth:`~pcapkit.protocols.application.tls.protocol.TLS.id` stays ``('TLS',)`` whatever the version. .. list-table:: :header-rows: 1 * - Legacy record version - - :attr:`~pcapkit.protocols.application.tls.TLS.alias` - - :attr:`~pcapkit.protocols.application.tls.TLS.name` + - :attr:`~pcapkit.protocols.application.tls.protocol.TLS.alias` + - :attr:`~pcapkit.protocols.application.tls.protocol.TLS.name` * - ``0x0300`` - ``SSLv3`` - ``Secure Sockets Layer version 3`` @@ -60,10 +61,10 @@ negotiated one. So in a TLS 1.3 connection, every record after the hellos carries ``0x0303`` and reads ``TLS 1.2``; and a TLS 1.2 ``ClientHello`` sent at record version ``0x0301`` reads ``TLS 1.0``. -:class:`~pcapkit.protocols.application.sslv3.SSLv3` is for explicit -construction only, mirroring :class:`~pcapkit.protocols.link.inarp.InARP`: it -narrows :meth:`~pcapkit.protocols.application.sslv3.SSLv3.id` to ``('SSLv3',)`` -and inherits :meth:`~pcapkit.protocols.application.tls.TLS.read` unchanged, +:class:`~pcapkit.protocols.application.sslv3.protocol.SSLv3` is for explicit +construction only, mirroring :class:`~pcapkit.protocols.link.inarp.protocol.InARP`: it +narrows :meth:`~pcapkit.protocols.application.sslv3.protocol.SSLv3.id` to ``('SSLv3',)`` +and inherits :meth:`~pcapkit.protocols.application.tls.protocol.TLS.read` unchanged, so the alias still follows the wire. Dispatch never constructs one. Decoded Fields @@ -71,13 +72,13 @@ Decoded Fields * The record header, always: it is never encrypted. * A **cleartext** ``handshake``, ``alert`` or ``change_cipher_spec`` record - (:meth:`SSL._tls_content_is_cleartext ` + (:meth:`SSL._tls_content_is_cleartext ` decides which are): * ``ClientHello``/``ServerHello`` down to their cipher suites, compression methods and extensions, and ``EncryptedExtensions`` down to its extensions; an extension's body decodes where - :attr:`SSL.__extension__ ` + :attr:`SSL.__extension__ ` registers a decoder for its type. * Every other handshake message at type and length only. * ``Alert`` and ``ChangeCipherSpec`` in full. @@ -89,12 +90,12 @@ Records in One Segment ---------------------- A whole record after the first in a TCP segment is dissected as a further -:class:`~pcapkit.protocols.application.tls.TLS` layer, the previous record's +:class:`~pcapkit.protocols.application.tls.protocol.TLS` layer, the previous record's payload (:issue:`2517`): a ``ServerHello`` followed by a ``ChangeCipherSpec`` reads ``TCP:TLS 1.3:TLS 1.2``. The exceptions: * A whole record that fails to decode becomes - :class:`~pcapkit.protocols.misc.raw.Raw` together with everything after it, + :class:`~pcapkit.protocols.misc.raw.protocol.Raw` together with everything after it, with no SSLv2 trial. * Octets that open no record -- an unsupported content type, a legacy version outside ``0x03xx``, or a header cut short -- stay raw, with no error. @@ -107,7 +108,7 @@ Known Limitation ---------------- **A record split across two TCP segments is not reassembled**, and decodes as -:class:`~pcapkit.protocols.misc.raw.Raw`, as does the partial record a segment +:class:`~pcapkit.protocols.misc.raw.protocol.Raw`, as does the partial record a segment ends inside. A record may be up to 16 KiB against a typical 1460-octet MSS, so this is routine. @@ -117,7 +118,7 @@ this is routine.
-.. autoclass:: pcapkit.protocols.application.tls.TLS +.. autoclass:: pcapkit.protocols.application.tls.protocol.TLS :no-members: :show-inheritance: @@ -139,25 +140,25 @@ this is routine. Header Schema ------------- -.. module:: pcapkit.protocols.schema.application.tls +.. module:: pcapkit.protocols.application.tls.schema -.. autoclass:: pcapkit.protocols.schema.application.tls.TLS +.. autoclass:: pcapkit.protocols.application.tls.schema.TLS :members: :show-inheritance: Data Model ---------- -.. currentmodule:: pcapkit.protocols.data.application.tls +.. module:: pcapkit.protocols.application.tls.data -.. autoclass:: pcapkit.protocols.data.application.tls.TLS +.. autoclass:: pcapkit.protocols.application.tls.data.TLS :members: :show-inheritance: See :doc:`ssl` for ``ClientHello``, ``ServerHello``, ``EncryptedExtensions``, ``Handshake``, ``Extension`` and its decoded bodies, ``Alert`` and ``ChangeCipherSpec``, shared verbatim with -:class:`~pcapkit.protocols.application.dtls.DTLS`. +:class:`~pcapkit.protocols.application.dtls.protocol.DTLS`. .. rubric:: Footnotes diff --git a/docs/source/pcapkit/protocols/index.rst b/docs/source/pcapkit/protocols/index.rst index ac5d0958b1..ddf072d5fb 100644 --- a/docs/source/pcapkit/protocols/index.rst +++ b/docs/source/pcapkit/protocols/index.rst @@ -2,8 +2,6 @@ Protocol Family =============== .. module:: pcapkit.protocols -.. module:: pcapkit.protocols.data -.. module:: pcapkit.protocols.schema :mod:`pcapkit.protocols` is the collection of all protocol families. @@ -130,70 +128,70 @@ from given information. The class hierarchy of :mod:`pcapkit.protocols`: click D "../../ext.html#customising-protocols" click Link "link/link.html#pcapkit.protocols.link.link.Link" - click Ethernet "link/ethernet.html#pcapkit.protocols.link.ethernet.Ethernet" - click L2TP "link/l2tp.html#pcapkit.protocols.link.l2tp.L2TP" - click L2TPv2 "link/l2tpv2.html#pcapkit.protocols.link.l2tpv2.L2TPv2" - click LinuxSLL "link/linux_sll.html#pcapkit.protocols.link.linux_sll.LinuxSLL" - click LinuxSLL1 "link/linux_sll1.html#pcapkit.protocols.link.linux_sll1.LinuxSLL1" - click LinuxSLL2 "link/linux_sll2.html#pcapkit.protocols.link.linux_sll2.LinuxSLL2" - click Loopback "link/loopback.html#pcapkit.protocols.link.loopback.Loopback" - click VLAN "link/vlan.html#pcapkit.protocols.link.vlan.VLAN" - click C_Tag "link/c_tag.html#pcapkit.protocols.link.c_tag.C_Tag" - click S_Tag "link/s_tag.html#pcapkit.protocols.link.s_tag.S_Tag" - click ARP "link/arp.html#pcapkit.protocols.link.arp.ARP" - click InARP "link/inarp.html#pcapkit.protocols.link.inarp.InARP" + click Ethernet "link/ethernet.html#pcapkit.protocols.link.ethernet.protocol.Ethernet" + click L2TP "link/l2tp.html#pcapkit.protocols.link.l2tp.protocol.L2TP" + click L2TPv2 "link/l2tpv2.html#pcapkit.protocols.link.l2tpv2.protocol.L2TPv2" + click LinuxSLL "link/linux_sll.html#pcapkit.protocols.link.linux_sll.protocol.LinuxSLL" + click LinuxSLL1 "link/linux_sll1.html#pcapkit.protocols.link.linux_sll1.protocol.LinuxSLL1" + click LinuxSLL2 "link/linux_sll2.html#pcapkit.protocols.link.linux_sll2.protocol.LinuxSLL2" + click Loopback "link/loopback.html#pcapkit.protocols.link.loopback.protocol.Loopback" + click VLAN "link/vlan.html#pcapkit.protocols.link.vlan.protocol.VLAN" + click C_Tag "link/c_tag.html#pcapkit.protocols.link.c_tag.protocol.C_Tag" + click S_Tag "link/s_tag.html#pcapkit.protocols.link.s_tag.protocol.S_Tag" + click ARP "link/arp.html#pcapkit.protocols.link.arp.protocol.ARP" + click InARP "link/inarp.html#pcapkit.protocols.link.inarp.protocol.InARP" click Internet "internet/internet.html#pcapkit.protocols.internet.internet.Internet" - click AH "internet/ah.html#pcapkit.protocols.internet.ah.AH" - click ESP "internet/esp.html#pcapkit.protocols.internet.esp.ESP" - click HIP "internet/hip.html#pcapkit.protocols.internet.hip.HIP" - click IGMP "internet/igmp.html#pcapkit.protocols.internet.igmp.IGMP" - click IGMPv1 "internet/igmpv1.html#pcapkit.protocols.internet.igmpv1.IGMPv1" - click IGMPv2 "internet/igmpv2.html#pcapkit.protocols.internet.igmpv2.IGMPv2" - click IGMPv3 "internet/igmpv3.html#pcapkit.protocols.internet.igmpv3.IGMPv3" - click HOPOPT "internet/hopopt.html#pcapkit.protocols.internet.hopopt.HOPOPT" - click ICMP "internet/icmp.html#pcapkit.protocols.internet.icmp.ICMP" - click ICMPv4 "internet/icmpv4.html#pcapkit.protocols.internet.icmpv4.ICMPv4" - click ICMPv6 "internet/icmpv6.html#pcapkit.protocols.internet.icmpv6.ICMPv6" - click IP "internet/ip.html#pcapkit.protocols.internet.ip.IP" - click IPsec "internet/ipsec.html#pcapkit.protocols.internet.ipsec.IPsec" - click IPv4 "internet/ipv4.html#pcapkit.protocols.internet.ipv4.IPv4" - click IPv6 "internet/ipv6.html#pcapkit.protocols.internet.ipv6.IPv6" - click IPv6_Ext "internet/ipv6_ext.html#pcapkit.protocols.internet.ipv6_ext.IPv6_Ext" - click IPv6-Frag "internet/ipv6_frag.html#pcapkit.protocols.internet.ipv6_frag.IPv6_Frag" - click IPv6-Opts "internet/ipv6_opts.html#pcapkit.protocols.internet.ipv6_opts.IPv6_Opts" - click IPv6-Route "internet/ipv6_route.html#pcapkit.protocols.internet.ipv6_route.IPv6_Route" - click IP_Pseudo "misc/checksum.html#pcapkit.protocols.misc.checksum.ip_pseudo.IP_Pseudo" - click IPX "internet/ipx.html#pcapkit.protocols.internet.ipx.IPX" - click MH "internet/mh.html#pcapkit.protocols.internet.mh.MH" + click AH "internet/ah.html#pcapkit.protocols.internet.ah.protocol.AH" + click ESP "internet/esp.html#pcapkit.protocols.internet.esp.protocol.ESP" + click HIP "internet/hip.html#pcapkit.protocols.internet.hip.protocol.HIP" + click IGMP "internet/igmp.html#pcapkit.protocols.internet.igmp.protocol.IGMP" + click IGMPv1 "internet/igmpv1.html#pcapkit.protocols.internet.igmpv1.protocol.IGMPv1" + click IGMPv2 "internet/igmpv2.html#pcapkit.protocols.internet.igmpv2.protocol.IGMPv2" + click IGMPv3 "internet/igmpv3.html#pcapkit.protocols.internet.igmpv3.protocol.IGMPv3" + click HOPOPT "internet/hopopt.html#pcapkit.protocols.internet.hopopt.protocol.HOPOPT" + click ICMP "internet/icmp.html#pcapkit.protocols.internet.icmp.protocol.ICMP" + click ICMPv4 "internet/icmpv4.html#pcapkit.protocols.internet.icmpv4.protocol.ICMPv4" + click ICMPv6 "internet/icmpv6.html#pcapkit.protocols.internet.icmpv6.protocol.ICMPv6" + click IP "internet/ip.html#pcapkit.protocols.internet.ip.protocol.IP" + click IPsec "internet/ipsec.html#pcapkit.protocols.internet.ipsec.protocol.IPsec" + click IPv4 "internet/ipv4.html#pcapkit.protocols.internet.ipv4.protocol.IPv4" + click IPv6 "internet/ipv6.html#pcapkit.protocols.internet.ipv6.protocol.IPv6" + click IPv6_Ext "internet/ipv6_ext.html#pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext" + click IPv6-Frag "internet/ipv6_frag.html#pcapkit.protocols.internet.ipv6_frag.protocol.IPv6_Frag" + click IPv6-Opts "internet/ipv6_opts.html#pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts" + click IPv6-Route "internet/ipv6_route.html#pcapkit.protocols.internet.ipv6_route.protocol.IPv6_Route" + click IP_Pseudo "misc/checksum.html#pcapkit.protocols.misc.checksum.ip_pseudo.protocol.IP_Pseudo" + click IPX "internet/ipx.html#pcapkit.protocols.internet.ipx.protocol.IPX" + click MH "internet/mh.html#pcapkit.protocols.internet.mh.protocol.MH" click Transport "transport/transport.html#pcapkit.protocols.transport.transport.Transport" - click TCP "transport/tcp.html#pcapkit.protocols.transport.tcp.TCP" - click UDP "transport/udp.html#pcapkit.protocols.transport.udp.UDP" - click SCTP "transport/sctp.html#pcapkit.protocols.transport.sctp.SCTP" - click DCCP "transport/dccp.html#pcapkit.protocols.transport.dccp.DCCP" + click TCP "transport/tcp.html#pcapkit.protocols.transport.tcp.protocol.TCP" + click UDP "transport/udp.html#pcapkit.protocols.transport.udp.protocol.UDP" + click SCTP "transport/sctp.html#pcapkit.protocols.transport.sctp.protocol.SCTP" + click DCCP "transport/dccp.html#pcapkit.protocols.transport.dccp.protocol.DCCP" click Application "application/application.html#pcapkit.protocols.application.application.Application" - click HTTP "application/http.html#pcapkit.protocols.application.http.HTTP" - click h1 "application/httpv1.html#pcapkit.protocols.application.httpv1.HTTPv1" - click h2 "application/httpv2.html#pcapkit.protocols.application.httpv2.HTTPv2" - click FTP "application/ftp.html#pcapkit.protocols.application.ftp.FTP" - click FTP_DATA "application/ftp_data.html#pcapkit.protocols.application.ftp_data.FTP_DATA" - click NGAP "application/ngap.html#pcapkit.protocols.application.ngap.NGAP" - click OSPF "application/ospf.html#pcapkit.protocols.application.ospf.OSPF" - click RARP "application/rarp.html#pcapkit.protocols.application.rarp.RARP" - click DRARP "application/drarp.html#pcapkit.protocols.application.drarp.DRARP" - click SSL "application/ssl.html#pcapkit.protocols.application.ssl.SSL" - click SSLv2 "application/sslv2.html#pcapkit.protocols.application.sslv2.SSLv2" - click TLS "application/tls.html#pcapkit.protocols.application.tls.TLS" - click SSLv3 "application/sslv3.html#pcapkit.protocols.application.sslv3.SSLv3" - click DTLS "application/dtls.html#pcapkit.protocols.application.dtls.DTLS" - - click Raw "misc/raw.html#pcapkit.protocols.misc.raw.Raw" - click NoPayload "misc/no_payload.html#pcapkit.protocols.misc.no_payload.NoPayload" - click PCAPNG "misc/pcapng.html#pcapkit.protocols.misc.pcapng.PCAPNG" - click Header "misc/pcap.html#pcapkit.protocols.misc.pcap.header.Header" - click Frame "misc/pcap.html#pcapkit.protocols.misc.pcap.frame.Frame" + click HTTP "application/http.html#pcapkit.protocols.application.http.protocol.HTTP" + click h1 "application/httpv1.html#pcapkit.protocols.application.httpv1.protocol.HTTPv1" + click h2 "application/httpv2.html#pcapkit.protocols.application.httpv2.protocol.HTTPv2" + click FTP "application/ftp.html#pcapkit.protocols.application.ftp.protocol.FTP" + click FTP_DATA "application/ftp_data.html#pcapkit.protocols.application.ftp_data.protocol.FTP_DATA" + click NGAP "application/ngap.html#pcapkit.protocols.application.ngap.protocol.NGAP" + click OSPF "application/ospf.html#pcapkit.protocols.application.ospf.protocol.OSPF" + click RARP "application/rarp.html#pcapkit.protocols.application.rarp.protocol.RARP" + click DRARP "application/drarp.html#pcapkit.protocols.application.drarp.protocol.DRARP" + click SSL "application/ssl.html#pcapkit.protocols.application.ssl.protocol.SSL" + click SSLv2 "application/sslv2.html#pcapkit.protocols.application.sslv2.protocol.SSLv2" + click TLS "application/tls.html#pcapkit.protocols.application.tls.protocol.TLS" + click SSLv3 "application/sslv3.html#pcapkit.protocols.application.sslv3.protocol.SSLv3" + click DTLS "application/dtls.html#pcapkit.protocols.application.dtls.protocol.DTLS" + + click Raw "misc/raw.html#pcapkit.protocols.misc.raw.protocol.Raw" + click NoPayload "misc/no_payload.html#pcapkit.protocols.misc.no_payload.protocol.NoPayload" + click PCAPNG "misc/pcapng.html#pcapkit.protocols.misc.pcapng.protocol.PCAPNG" + click Header "misc/pcap.html#pcapkit.protocols.misc.pcap.header.protocol.Header" + click Frame "misc/pcap.html#pcapkit.protocols.misc.pcap.frame.protocol.Frame" Protocol Registry ----------------- @@ -209,7 +207,18 @@ Protocol Registry Header Schema ------------- -.. module:: pcapkit.protocols.schema.schema +.. module:: pcapkit.protocols.schema + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.schema.schema``, with no alias: the module moved here. The + ``pcapkit.protocols.schema.application``, ``pcapkit.protocols.schema.internet``, + ``pcapkit.protocols.schema.link``, ``pcapkit.protocols.schema.misc``, + ``pcapkit.protocols.schema.misc.checksum``, ``pcapkit.protocols.schema.misc.pcap`` + and ``pcapkit.protocols.schema.transport`` subpackages, and the header schemas they + and ``pcapkit.protocols.schema`` collected, with no alias: each protocol's are in the + ``schema`` module of its own package, such as + :mod:`pcapkit.protocols.link.vlan.schema` (:issue:`2534`). .. versionremoved:: 1.6.0 @@ -218,7 +227,7 @@ Header Schema :func:`pcapkit.corekit.schema.shortread.keep_short_read` and :func:`pcapkit.corekit.schema.shortread.replay_short_read` (:issue:`2674`). -.. autoclass:: pcapkit.protocols.schema.schema.Schema +.. autoclass:: pcapkit.protocols.schema.Schema :no-members: :show-inheritance: @@ -249,7 +258,7 @@ Header Schema .. automethod:: _cut_short_read -.. autoclass:: pcapkit.protocols.schema.schema.EnumSchema +.. autoclass:: pcapkit.protocols.schema.EnumSchema :no-members: :show-inheritance: @@ -264,24 +273,24 @@ Header Schema .. automethod:: __init_subclass__ -.. autodecorator:: pcapkit.protocols.schema.schema.schema_final +.. autodecorator:: pcapkit.protocols.schema.schema_final Internal Definitions ~~~~~~~~~~~~~~~~~~~~ -.. autoclass:: pcapkit.protocols.schema.schema.SchemaMeta +.. autoclass:: pcapkit.protocols.schema.SchemaMeta :no-members: :show-inheritance: .. automethod:: __prepare__ -.. autoclass:: pcapkit.protocols.schema.schema.EnumMeta +.. autoclass:: pcapkit.protocols.schema.EnumMeta :no-members: :show-inheritance: .. autoproperty:: registry -.. autoclass:: pcapkit.protocols.schema.schema._EnumRegistry +.. autoclass:: pcapkit.protocols.schema._EnumRegistry :no-members: :show-inheritance: @@ -297,14 +306,25 @@ Type Variables :type: enum.Enum .. data:: _ST - :type: typing.Type[pcapkit.protocols.schema.schema.Schema] + :type: typing.Type[pcapkit.protocols.schema.Schema] Data Model ---------- -.. module:: pcapkit.protocols.data.data +.. module:: pcapkit.protocols.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.data`` and ``pcapkit.protocols.data.protocol``, with no + alias: the modules merged here. The ``pcapkit.protocols.data.application``, + ``pcapkit.protocols.data.internet``, ``pcapkit.protocols.data.link``, + ``pcapkit.protocols.data.misc``, ``pcapkit.protocols.data.misc.checksum``, + ``pcapkit.protocols.data.misc.pcap`` and ``pcapkit.protocols.data.transport`` + subpackages, and the data models they and ``pcapkit.protocols.data`` collected, with + no alias: each protocol's are in the ``data`` module of its own package, such as + :mod:`pcapkit.protocols.link.vlan.data` (:issue:`2534`). -.. autoclass:: pcapkit.protocols.data.data.Data +.. autoclass:: pcapkit.protocols.data.Data :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/internet/ah.rst b/docs/source/pcapkit/protocols/internet/ah.rst index cbda33ca33..900465ebd6 100644 --- a/docs/source/pcapkit/protocols/internet/ah.rst +++ b/docs/source/pcapkit/protocols/internet/ah.rst @@ -2,9 +2,10 @@ AH - Authentication Header ========================== .. module:: pcapkit.protocols.internet.ah +.. module:: pcapkit.protocols.internet.ah.protocol -:mod:`pcapkit.protocols.internet.ah` contains -:class:`~pcapkit.protocols.internet.ah.AH` only, +:mod:`pcapkit.protocols.internet.ah.protocol` contains +:class:`~pcapkit.protocols.internet.ah.protocol.AH` only, which implements the extractor for Authentication Header (AH) [*]_, whose structure is described as below: @@ -20,7 +21,7 @@ Octets Bits Name Description 12 96 ``ah.icv`` Integrity Check Value (ICV) ======= ========= ======================= =================================== -.. autoclass:: pcapkit.protocols.internet.ah.AH +.. autoclass:: pcapkit.protocols.internet.ah.protocol.AH :no-members: :show-inheritance: @@ -44,20 +45,30 @@ Octets Bits Name Description Header Schemas -------------- -.. module:: pcapkit.protocols.schema.internet.ah +.. module:: pcapkit.protocols.internet.ah.schema -.. autodata:: pcapkit.protocols.schema.internet.ah.AH_HEADER_LEN +.. versionremoved:: 1.6.0 -.. autoclass:: pcapkit.protocols.schema.internet.ah.AH + ``pcapkit.protocols.schema.internet.ah``, with no alias: the module moved here + (:issue:`2534`). + +.. autodata:: pcapkit.protocols.internet.ah.schema.AH_HEADER_LEN + +.. autoclass:: pcapkit.protocols.internet.ah.schema.AH :members: :show-inheritance: Data Models ----------- -.. module:: pcapkit.protocols.data.internet.ah +.. module:: pcapkit.protocols.internet.ah.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.internet.ah``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.data.internet.ah.AH +.. autoclass:: pcapkit.protocols.internet.ah.data.AH :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/internet/esp.rst b/docs/source/pcapkit/protocols/internet/esp.rst index dc673f14bf..ed7ff4b5aa 100644 --- a/docs/source/pcapkit/protocols/internet/esp.rst +++ b/docs/source/pcapkit/protocols/internet/esp.rst @@ -2,9 +2,28 @@ ESP - Encapsulating Security Payload ==================================== .. module:: pcapkit.protocols.internet.esp - -:mod:`pcapkit.protocols.internet.esp` contains -:class:`~pcapkit.protocols.internet.esp.ESP`, +.. module:: pcapkit.protocols.internet.esp.protocol + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.internet.esp._CRYPTO``, + ``pcapkit.protocols.internet.esp.load_cryptography``, + ``pcapkit.protocols.internet.esp._resolve``, + ``pcapkit.protocols.internet.esp.CipherSuite``, + ``pcapkit.protocols.internet.esp.IntegritySuite``, + ``pcapkit.protocols.internet.esp.CIPHER_SUITES``, + ``pcapkit.protocols.internet.esp.INTEGRITY_SUITES``, + ``pcapkit.protocols.internet.esp.ESPStatus``, + ``pcapkit.protocols.internet.esp.SecurityAssociation`` and + ``pcapkit.protocols.internet.esp.ESPContext``, with no alias: they are in this + module, and :mod:`pcapkit.protocols.internet.esp` exports the protocol class alone. + ``pcapkit.protocols.internet.esp.Cipher`` and + ``pcapkit.protocols.internet.esp.Integrity``, which it re-exported, with no alias: + use :class:`pcapkit.const.esp.cipher.Cipher` and + :class:`pcapkit.const.esp.integrity.Integrity` instead (:issue:`2534`). + +:mod:`pcapkit.protocols.internet.esp.protocol` contains +:class:`~pcapkit.protocols.internet.esp.protocol.ESP`, which implements the extractor for Encapsulating Security Payload (ESP) [*]_, and the security association, algorithm and status types documented below. The ESP structure is described as below: @@ -26,19 +45,19 @@ fields *inside* the ciphertext, and leaves the length of the ``Integrity Check Value`` to be determined by the Security Association (SA), which is negotiated out of band. Therefore: -* **Without** SA context, :class:`~pcapkit.protocols.internet.esp.ESP` +* **Without** SA context, :class:`~pcapkit.protocols.internet.esp.protocol.ESP` parses the ``SPI`` and ``Sequence Number``, reports the remainder as an opaque encrypted payload, and says so through - :attr:`esp.status `. + :attr:`esp.status `. It does *not* guess at the trailer, and it does not raise. -* **With** SA context, :class:`~pcapkit.protocols.internet.esp.ESP` splits +* **With** SA context, :class:`~pcapkit.protocols.internet.esp.protocol.ESP` splits off the ICV, verifies integrity, decrypts, strips the padding using ``Pad Length``, and dispatches the recovered plaintext to the next layer using ``Next Header`` -- so an ESP tunnelled TCP segment decodes as TCP. .. versionadded:: 1.5.0 -.. autoclass:: pcapkit.protocols.internet.esp.ESP +.. autoclass:: pcapkit.protocols.internet.esp.protocol.ESP :no-members: :show-inheritance: @@ -69,7 +88,7 @@ in :mod:`pcapkit.corekit.context`: .. code-block:: python import pcapkit - from pcapkit.protocols.internet.esp import (Cipher, ESPContext, Integrity, + from pcapkit.protocols.internet.esp.protocol import (Cipher, ESPContext, Integrity, SecurityAssociation) sa = SecurityAssociation( @@ -82,7 +101,7 @@ in :mod:`pcapkit.corekit.context`: ) extraction = pcapkit.extract('esp.pcap', context=ESPContext(sa)) -.. autoclass:: pcapkit.protocols.internet.esp.SecurityAssociation +.. autoclass:: pcapkit.protocols.internet.esp.protocol.SecurityAssociation :no-members: :show-inheritance: @@ -101,7 +120,7 @@ in :mod:`pcapkit.corekit.context`: .. automethod:: _split_key .. automethod:: __repr__ -.. autoclass:: pcapkit.protocols.internet.esp.ESPContext +.. autoclass:: pcapkit.protocols.internet.esp.protocol.ESPContext :no-members: :show-inheritance: @@ -143,10 +162,10 @@ A registry enumerates what IANA assigned an ID to, which is far more than :mod:`pcapkit` implements. **Registration is not support.** A member of either enumeration says only that IANA assigned the transform an ID; what :mod:`pcapkit` can actually apply is the separate, explicit -:data:`~pcapkit.protocols.internet.esp.CIPHER_SUITES` and -:data:`~pcapkit.protocols.internet.esp.INTEGRITY_SUITES` tables, and -:meth:`CipherSuite.get ` / -:meth:`IntegritySuite.get ` +:data:`~pcapkit.protocols.internet.esp.protocol.CIPHER_SUITES` and +:data:`~pcapkit.protocols.internet.esp.protocol.INTEGRITY_SUITES` tables, and +:meth:`CipherSuite.get ` / +:meth:`IntegritySuite.get ` refuse anything outside them rather than half-working: .. code-block:: python @@ -168,7 +187,7 @@ payload path, with a warning. The supported set is anchored on the *mandatory to implement* algorithms of :rfc:`8221`. The tables below are the authority on what an SA may actually name; the rows marked ``yes`` are exactly the keys of -:data:`~pcapkit.protocols.internet.esp.CIPHER_SUITES`, and everything else the +:data:`~pcapkit.protocols.internet.esp.protocol.CIPHER_SUITES`, and everything else the registry lists is enumerated and rejected. ============================ =================== ============ ================================== @@ -189,7 +208,7 @@ DES, Blowfish, 3IDEA MUST NOT **no** registered, delibe ``ENCR_DES_IV32``, ``ENCR_BLOWFISH`` and ``ENCR_3IDEA``. Likewise, the rows marked ``yes`` below are exactly the keys of -:data:`~pcapkit.protocols.internet.esp.INTEGRITY_SUITES`: +:data:`~pcapkit.protocols.internet.esp.protocol.INTEGRITY_SUITES`: ============================ =================== ============ ================================== Integrity :rfc:`8221` status Implemented Notes @@ -208,8 +227,8 @@ MD5, DES-MAC, KPDK-MD5 MUST NOT **no** registered, delibe ``AUTH_HMAC_MD5_128``, ``AUTH_DES_MAC`` and ``AUTH_KPDK_MD5``. Each implemented suite applies its algorithm with the parameters below, as -:data:`~pcapkit.protocols.internet.esp.CIPHER_SUITES` and -:data:`~pcapkit.protocols.internet.esp.INTEGRITY_SUITES` record them. Lengths +:data:`~pcapkit.protocols.internet.esp.protocol.CIPHER_SUITES` and +:data:`~pcapkit.protocols.internet.esp.protocol.INTEGRITY_SUITES` record them. Lengths and sizes are in octets. ========================== =========== ============== ============== ============== ============== =============== ========================= @@ -232,20 +251,20 @@ Integrity ``digest`` ``icv_length`` ``key_size`` ``AUTH_HMAC_SHA2_512_256`` ``sha512`` 32 64 ========================== ============== ============== ============== -.. autoclass:: pcapkit.protocols.internet.esp.CipherSuite +.. autoclass:: pcapkit.protocols.internet.esp.protocol.CipherSuite :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.internet.esp.IntegritySuite +.. autoclass:: pcapkit.protocols.internet.esp.protocol.IntegritySuite :members: :undoc-members: :show-inheritance: -.. autodata:: pcapkit.protocols.internet.esp.CIPHER_SUITES +.. autodata:: pcapkit.protocols.internet.esp.protocol.CIPHER_SUITES :no-value: -.. autodata:: pcapkit.protocols.internet.esp.INTEGRITY_SUITES +.. autodata:: pcapkit.protocols.internet.esp.protocol.INTEGRITY_SUITES :no-value: Known Limitations @@ -268,32 +287,42 @@ Known Limitations Processing Status ----------------- -.. autoclass:: pcapkit.protocols.internet.esp.ESPStatus +.. autoclass:: pcapkit.protocols.internet.esp.protocol.ESPStatus :members: :show-inheritance: -.. autofunction:: pcapkit.protocols.internet.esp.load_cryptography +.. autofunction:: pcapkit.protocols.internet.esp.protocol.load_cryptography -.. autodata:: pcapkit.protocols.internet.esp._CRYPTO +.. autodata:: pcapkit.protocols.internet.esp.protocol._CRYPTO :no-value: -.. autofunction:: pcapkit.protocols.internet.esp._resolve +.. autofunction:: pcapkit.protocols.internet.esp.protocol._resolve Header Schemas -------------- -.. module:: pcapkit.protocols.schema.internet.esp +.. module:: pcapkit.protocols.internet.esp.schema + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.schema.internet.esp``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.schema.internet.esp.ESP +.. autoclass:: pcapkit.protocols.internet.esp.schema.ESP :members: :show-inheritance: Data Models ----------- -.. module:: pcapkit.protocols.data.internet.esp +.. module:: pcapkit.protocols.internet.esp.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.internet.esp``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.data.internet.esp.ESP +.. autoclass:: pcapkit.protocols.internet.esp.data.ESP :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/internet/hip.rst b/docs/source/pcapkit/protocols/internet/hip.rst index ecc9777e89..912b4b5544 100644 --- a/docs/source/pcapkit/protocols/internet/hip.rst +++ b/docs/source/pcapkit/protocols/internet/hip.rst @@ -2,9 +2,16 @@ HIP - Host Identity Protocol ============================ .. module:: pcapkit.protocols.internet.hip +.. module:: pcapkit.protocols.internet.hip.protocol -:mod:`pcapkit.protocols.internet.hip` contains -:class:`~pcapkit.protocols.internet.hip.HIP` only, +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.internet.hip.Locator``, with no alias: it is in this module, and + :mod:`pcapkit.protocols.internet.hip` exports the protocol class alone + (:issue:`2534`). + +:mod:`pcapkit.protocols.internet.hip.protocol` contains +:class:`~pcapkit.protocols.internet.hip.protocol.HIP` only, which implements the extractor for Host Identity Protocol (HIP) [*]_, whose structure is described as below: @@ -26,7 +33,7 @@ Octets Bits Name Description 40 320 ``hip.parameters`` HIP Parameters ======= ========= ====================== ================================== -.. autoclass:: pcapkit.protocols.internet.hip.HIP +.. autoclass:: pcapkit.protocols.internet.hip.protocol.HIP :no-members: :show-inheritance: @@ -158,517 +165,527 @@ Octets Bits Name Description Type Stubs ---------- -.. autoclass:: pcapkit.protocols.internet.hip.Locator +.. autoclass:: pcapkit.protocols.internet.hip.protocol.Locator :members: :show-inheritance: Header Schemas -------------- -.. module:: pcapkit.protocols.schema.internet.hip +.. module:: pcapkit.protocols.internet.hip.schema + +.. versionremoved:: 1.6.0 -.. autoclass:: pcapkit.protocols.schema.internet.hip.HIP + ``pcapkit.protocols.schema.internet.hip``, with no alias: the module moved here + (:issue:`2534`). + +.. autoclass:: pcapkit.protocols.internet.hip.schema.HIP :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.Parameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.Parameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.UnassignedParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.UnassignedParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.ESPInfoParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.ESPInfoParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.R1CounterParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.R1CounterParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.LocatorSetParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.LocatorSetParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.Locator +.. autoclass:: pcapkit.protocols.internet.hip.schema.Locator :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.LocatorData +.. autoclass:: pcapkit.protocols.internet.hip.schema.LocatorData :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.PuzzleParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.PuzzleParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.SolutionParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.SolutionParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.SEQParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.SEQParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.ACKParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.ACKParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.DHGroupListParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.DHGroupListParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.DiffieHellmanParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.DiffieHellmanParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.HIPTransformParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.HIPTransformParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.HIPCipherParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.HIPCipherParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.NATTraversalModeParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.NATTraversalModeParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.TransactionPacingParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.TransactionPacingParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.EncryptedParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.EncryptedParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.HostIDParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.HostIDParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.HostIdentity +.. autoclass:: pcapkit.protocols.internet.hip.schema.HostIdentity :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.ECDSACurveHostIdentity +.. autoclass:: pcapkit.protocols.internet.hip.schema.ECDSACurveHostIdentity :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.ECDSALowCurveHostIdentity +.. autoclass:: pcapkit.protocols.internet.hip.schema.ECDSALowCurveHostIdentity :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.EdDSACurveHostIdentity +.. autoclass:: pcapkit.protocols.internet.hip.schema.EdDSACurveHostIdentity :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.HITSuiteListParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.HITSuiteListParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.CertParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.CertParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.NotificationParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.NotificationParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.EchoRequestSignedParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.EchoRequestSignedParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.RegInfoParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.RegInfoParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.RegRequestParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.RegRequestParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.RegResponseParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.RegResponseParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.RegFailedParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.RegFailedParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.RegFromParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.RegFromParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.EchoResponseSignedParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.EchoResponseSignedParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.TransportFormatListParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.TransportFormatListParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.ESPTransformParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.ESPTransformParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.SeqDataParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.SeqDataParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.AckDataParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.AckDataParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.PayloadMICParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.PayloadMICParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.TransactionIDParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.TransactionIDParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.OverlayIDParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.OverlayIDParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.RouteDstParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.RouteDstParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.HIPTransportModeParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.HIPTransportModeParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.HIPMACParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.HIPMACParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.HIPMAC2Parameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.HIPMAC2Parameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.HIPSignature2Parameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.HIPSignature2Parameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.HIPSignatureParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.HIPSignatureParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.EchoRequestUnsignedParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.EchoRequestUnsignedParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.EchoResponseUnsignedParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.EchoResponseUnsignedParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.RelayFromParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.RelayFromParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.RelayToParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.RelayToParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.OverlayTTLParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.OverlayTTLParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.RouteViaParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.RouteViaParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.FromParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.FromParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.RVSHMACParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.RVSHMACParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.ViaRVSParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.ViaRVSParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.RelayHMACParameter +.. autoclass:: pcapkit.protocols.internet.hip.schema.RelayHMACParameter :members: :show-inheritance: Type Stubs ~~~~~~~~~~ -.. autoclass:: pcapkit.protocols.schema.internet.hip.PacketType +.. autoclass:: pcapkit.protocols.internet.hip.schema.PacketType :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.VersionType +.. autoclass:: pcapkit.protocols.internet.hip.schema.VersionType :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.ControlsType +.. autoclass:: pcapkit.protocols.internet.hip.schema.ControlsType :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.LocatorFlags +.. autoclass:: pcapkit.protocols.internet.hip.schema.LocatorFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.DIData +.. autoclass:: pcapkit.protocols.internet.hip.schema.DIData :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hip.RouteFlags +.. autoclass:: pcapkit.protocols.internet.hip.schema.RouteFlags :members: :show-inheritance: Auxiliary Functions ~~~~~~~~~~~~~~~~~~~ -.. autofunction:: pcapkit.protocols.schema.internet.hip.locator_value_selector -.. autofunction:: pcapkit.protocols.schema.internet.hip.host_id_hi_selector -.. autofunction:: pcapkit.protocols.schema.internet.hip.registration_type_list_len -.. autofunction:: pcapkit.protocols.schema.internet.hip.reg_info_list_len -.. autofunction:: pcapkit.protocols.schema.internet.hip.two_octet_prefix_list_len -.. autofunction:: pcapkit.protocols.schema.internet.hip.transport_format_list_len -.. autofunction:: pcapkit.protocols.schema.internet.hip.encrypted_data_len -.. autofunction:: pcapkit.protocols.schema.internet.hip.parameter_total_len -.. autofunction:: pcapkit.protocols.schema.internet.hip.parameter_padding_len -.. autofunction:: pcapkit.protocols.schema.internet.hip.locator_set_len_callback -.. autofunction:: pcapkit.protocols.schema.internet.hip.locator_set_padding_len +.. autofunction:: pcapkit.protocols.internet.hip.schema.locator_value_selector +.. autofunction:: pcapkit.protocols.internet.hip.schema.host_id_hi_selector +.. autofunction:: pcapkit.protocols.internet.hip.schema.registration_type_list_len +.. autofunction:: pcapkit.protocols.internet.hip.schema.reg_info_list_len +.. autofunction:: pcapkit.protocols.internet.hip.schema.two_octet_prefix_list_len +.. autofunction:: pcapkit.protocols.internet.hip.schema.transport_format_list_len +.. autofunction:: pcapkit.protocols.internet.hip.schema.encrypted_data_len +.. autofunction:: pcapkit.protocols.internet.hip.schema.parameter_total_len +.. autofunction:: pcapkit.protocols.internet.hip.schema.parameter_padding_len +.. autofunction:: pcapkit.protocols.internet.hip.schema.locator_set_len_callback +.. autofunction:: pcapkit.protocols.internet.hip.schema.locator_set_padding_len -.. autodata:: pcapkit.protocols.schema.internet.hip.LOCATOR_SET_LEN +.. autodata:: pcapkit.protocols.internet.hip.schema.LOCATOR_SET_LEN Data Models ----------- -.. module:: pcapkit.protocols.data.internet.hip +.. module:: pcapkit.protocols.internet.hip.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.internet.hip``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.data.internet.hip.HIP +.. autoclass:: pcapkit.protocols.internet.hip.data.HIP :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.Control +.. autoclass:: pcapkit.protocols.internet.hip.data.Control :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.Parameter +.. autoclass:: pcapkit.protocols.internet.hip.data.Parameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.UnassignedParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.UnassignedParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.ESPInfoParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.ESPInfoParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.R1CounterParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.R1CounterParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.LocatorSetParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.LocatorSetParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.Locator +.. autoclass:: pcapkit.protocols.internet.hip.data.Locator :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.LocatorData +.. autoclass:: pcapkit.protocols.internet.hip.data.LocatorData :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.PuzzleParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.PuzzleParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.SolutionParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.SolutionParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.SEQParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.SEQParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.ACKParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.ACKParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.DHGroupListParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.DHGroupListParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.DiffieHellmanParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.DiffieHellmanParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.HIPTransformParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.HIPTransformParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.HIPCipherParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.HIPCipherParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.NATTraversalModeParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.NATTraversalModeParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.TransactionPacingParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.TransactionPacingParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.EncryptedParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.EncryptedParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.HostIDParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.HostIDParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.HostIdentity +.. autoclass:: pcapkit.protocols.internet.hip.data.HostIdentity :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.HITSuiteListParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.HITSuiteListParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.CertParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.CertParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.NotificationParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.NotificationParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.EchoRequestSignedParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.EchoRequestSignedParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.RegInfoParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.RegInfoParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.Lifetime +.. autoclass:: pcapkit.protocols.internet.hip.data.Lifetime :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.RegRequestParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.RegRequestParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.RegResponseParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.RegResponseParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.RegFailedParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.RegFailedParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.RegFromParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.RegFromParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.EchoResponseSignedParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.EchoResponseSignedParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.TransportFormatListParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.TransportFormatListParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.ESPTransformParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.ESPTransformParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.SeqDataParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.SeqDataParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.AckDataParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.AckDataParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.PayloadMICParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.PayloadMICParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.TransactionIDParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.TransactionIDParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.OverlayIDParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.OverlayIDParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.RouteDstParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.RouteDstParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.Flags +.. autoclass:: pcapkit.protocols.internet.hip.data.Flags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.HIPTransportModeParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.HIPTransportModeParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.HIPMACParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.HIPMACParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.HIPMAC2Parameter +.. autoclass:: pcapkit.protocols.internet.hip.data.HIPMAC2Parameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.HIPSignature2Parameter +.. autoclass:: pcapkit.protocols.internet.hip.data.HIPSignature2Parameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.HIPSignatureParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.HIPSignatureParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.EchoRequestUnsignedParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.EchoRequestUnsignedParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.EchoResponseUnsignedParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.EchoResponseUnsignedParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.RelayFromParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.RelayFromParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.RelayToParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.RelayToParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.OverlayTTLParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.OverlayTTLParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.RouteViaParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.RouteViaParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.FromParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.FromParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.RVSHMACParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.RVSHMACParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.ViaRVSParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.ViaRVSParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hip.RelayHMACParameter +.. autoclass:: pcapkit.protocols.internet.hip.data.RelayHMACParameter :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/internet/hopopt.rst b/docs/source/pcapkit/protocols/internet/hopopt.rst index 1747e3821c..17933ae8dc 100644 --- a/docs/source/pcapkit/protocols/internet/hopopt.rst +++ b/docs/source/pcapkit/protocols/internet/hopopt.rst @@ -2,9 +2,10 @@ HOPOPT - IPv6 Hop-by-Hop Options ================================ .. module:: pcapkit.protocols.internet.hopopt +.. module:: pcapkit.protocols.internet.hopopt.protocol -:mod:`pcapkit.protocols.internet.hopopt` contains -:class:`~pcapkit.protocols.internet.hopopt.HOPOPT` +:mod:`pcapkit.protocols.internet.hopopt.protocol` contains +:class:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT` only, which implements the extractor for IPv6 Hop-by-Hop Options header (HOPOPT) [*]_, whose structure is described as below: @@ -17,7 +18,7 @@ Octets Bits Name Description 2 16 ``hopopt.options`` Options ======= ========= =================== ================================= -.. autoclass:: pcapkit.protocols.internet.hopopt.HOPOPT +.. autoclass:: pcapkit.protocols.internet.hopopt.protocol.HOPOPT :no-members: :show-inheritance: @@ -80,132 +81,137 @@ Octets Bits Name Description Header Schemas -------------- -.. module:: pcapkit.protocols.schema.internet.hopopt +.. module:: pcapkit.protocols.internet.hopopt.schema -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.HOPOPT +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.schema.internet.hopopt``, with no alias: the module moved here + (:issue:`2534`). + +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.HOPOPT :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.Option +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.Option :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.UnassignedOption +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.UnassignedOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.PadOption +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.PadOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.TunnelEncapsulationLimitOption +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.TunnelEncapsulationLimitOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.RouterAlertOption +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.RouterAlertOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.CALIPSOOption +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.CALIPSOOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt._SMFDPDOption +.. autoclass:: pcapkit.protocols.internet.hopopt.schema._SMFDPDOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.SMFDPDOption +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.SMFDPDOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.SMFIdentificationBasedDPDOption +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.SMFIdentificationBasedDPDOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.SMFHashBasedDPDOption +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.SMFHashBasedDPDOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.PDMOption +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.PDMOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt._QuickStartOption +.. autoclass:: pcapkit.protocols.internet.hopopt.schema._QuickStartOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.QuickStartOption +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.QuickStartOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.QuickStartRequestOption +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.QuickStartRequestOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.QuickStartReportOption +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.QuickStartReportOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.RPLOption +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.RPLOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.MPLOption +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.MPLOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.ILNPOption +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.ILNPOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.LineIdentificationOption +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.LineIdentificationOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.JumboPayloadOption +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.JumboPayloadOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.HomeAddressOption +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.HomeAddressOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.IPDFFOption +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.IPDFFOption :members: :show-inheritance: Type Stubs ~~~~~~~~~~ -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.TaggerIDInfo +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.TaggerIDInfo :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.QuickStartFlags +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.QuickStartFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.RPLFlags +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.RPLFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.MPLFlags +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.MPLFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.DFFFlags +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.DFFFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.SMFDPDTestFlag +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.SMFDPDTestFlag :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.QSTestFlags +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.QSTestFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.hopopt.QSNonce +.. autoclass:: pcapkit.protocols.internet.hopopt.schema.QSNonce :members: :show-inheritance: @@ -213,120 +219,125 @@ Auxiliary Functions ~~~~~~~~~~~~~~~~~~~ The option helpers are shared with -:mod:`~pcapkit.protocols.schema.internet.ipv6_opts` and documented in -:mod:`pcapkit.protocols.schema.internet.ipv6_option`. The functions below bind +:mod:`~pcapkit.protocols.internet.ipv6_opts.schema` and documented in +:mod:`pcapkit.protocols.internet.ipv6_ext.schema`. The functions below bind them to this module's error prefix and option schemas; -:func:`~pcapkit.protocols.schema.internet.ipv6_option.rpl_opt_sub_tlv_len` and -:func:`~pcapkit.protocols.schema.internet.ipv6_option.pad_opt_data_len` are +:func:`~pcapkit.protocols.internet.ipv6_ext.schema.rpl_opt_sub_tlv_len` and +:func:`~pcapkit.protocols.internet.ipv6_ext.schema.pad_opt_data_len` are used unchanged. -.. autofunction:: pcapkit.protocols.schema.internet.hopopt.mpl_opt_seed_id_len -.. autofunction:: pcapkit.protocols.schema.internet.hopopt.calipso_pad_len -.. autofunction:: pcapkit.protocols.schema.internet.hopopt.mpl_opt_pad_len +.. autofunction:: pcapkit.protocols.internet.hopopt.schema.mpl_opt_seed_id_len +.. autofunction:: pcapkit.protocols.internet.hopopt.schema.calipso_pad_len +.. autofunction:: pcapkit.protocols.internet.hopopt.schema.mpl_opt_pad_len -.. autofunction:: pcapkit.protocols.schema.internet.hopopt.smf_dpd_data_selector -.. autofunction:: pcapkit.protocols.schema.internet.hopopt.smf_i_dpd_tid_selector -.. autofunction:: pcapkit.protocols.schema.internet.hopopt.smf_i_dpd_id_len -.. autofunction:: pcapkit.protocols.schema.internet.hopopt.quick_start_data_selector +.. autofunction:: pcapkit.protocols.internet.hopopt.schema.smf_dpd_data_selector +.. autofunction:: pcapkit.protocols.internet.hopopt.schema.smf_i_dpd_tid_selector +.. autofunction:: pcapkit.protocols.internet.hopopt.schema.smf_i_dpd_id_len +.. autofunction:: pcapkit.protocols.internet.hopopt.schema.quick_start_data_selector Data Models ----------- -.. module:: pcapkit.protocols.data.internet.hopopt +.. module:: pcapkit.protocols.internet.hopopt.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.internet.hopopt``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.data.internet.hopopt.HOPOPT +.. autoclass:: pcapkit.protocols.internet.hopopt.data.HOPOPT :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hopopt.Option +.. autoclass:: pcapkit.protocols.internet.hopopt.data.Option :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hopopt.UnassignedOption +.. autoclass:: pcapkit.protocols.internet.hopopt.data.UnassignedOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hopopt.PadOption +.. autoclass:: pcapkit.protocols.internet.hopopt.data.PadOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hopopt.TunnelEncapsulationLimitOption +.. autoclass:: pcapkit.protocols.internet.hopopt.data.TunnelEncapsulationLimitOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hopopt.RouterAlertOption +.. autoclass:: pcapkit.protocols.internet.hopopt.data.RouterAlertOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hopopt.CALIPSOOption +.. autoclass:: pcapkit.protocols.internet.hopopt.data.CALIPSOOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hopopt.SMFDPDOption +.. autoclass:: pcapkit.protocols.internet.hopopt.data.SMFDPDOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hopopt.SMFIdentificationBasedDPDOption +.. autoclass:: pcapkit.protocols.internet.hopopt.data.SMFIdentificationBasedDPDOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hopopt.SMFHashBasedDPDOption +.. autoclass:: pcapkit.protocols.internet.hopopt.data.SMFHashBasedDPDOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hopopt.PDMOption +.. autoclass:: pcapkit.protocols.internet.hopopt.data.PDMOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hopopt.QuickStartOption +.. autoclass:: pcapkit.protocols.internet.hopopt.data.QuickStartOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hopopt.QuickStartRequestOption +.. autoclass:: pcapkit.protocols.internet.hopopt.data.QuickStartRequestOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hopopt.QuickStartReportOption +.. autoclass:: pcapkit.protocols.internet.hopopt.data.QuickStartReportOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hopopt.RPLOption +.. autoclass:: pcapkit.protocols.internet.hopopt.data.RPLOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hopopt.RPLFlags +.. autoclass:: pcapkit.protocols.internet.hopopt.data.RPLFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hopopt.MPLOption +.. autoclass:: pcapkit.protocols.internet.hopopt.data.MPLOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hopopt.MPLFlags +.. autoclass:: pcapkit.protocols.internet.hopopt.data.MPLFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hopopt.ILNPOption +.. autoclass:: pcapkit.protocols.internet.hopopt.data.ILNPOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hopopt.LineIdentificationOption +.. autoclass:: pcapkit.protocols.internet.hopopt.data.LineIdentificationOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hopopt.JumboPayloadOption +.. autoclass:: pcapkit.protocols.internet.hopopt.data.JumboPayloadOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hopopt.HomeAddressOption +.. autoclass:: pcapkit.protocols.internet.hopopt.data.HomeAddressOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hopopt.IPDFFOption +.. autoclass:: pcapkit.protocols.internet.hopopt.data.IPDFFOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.hopopt.DFFFlags +.. autoclass:: pcapkit.protocols.internet.hopopt.data.DFFFlags :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/internet/icmp.rst b/docs/source/pcapkit/protocols/internet/icmp.rst index 6a0316e14f..211316bad4 100644 --- a/docs/source/pcapkit/protocols/internet/icmp.rst +++ b/docs/source/pcapkit/protocols/internet/icmp.rst @@ -2,19 +2,20 @@ ICMP - Internet Control Message Protocol ======================================== .. module:: pcapkit.protocols.internet.icmp +.. module:: pcapkit.protocols.internet.icmp.protocol -:mod:`pcapkit.protocols.internet.icmp` contains -:class:`~pcapkit.protocols.internet.icmp.ICMP` only, +:mod:`pcapkit.protocols.internet.icmp.protocol` contains +:class:`~pcapkit.protocols.internet.icmp.protocol.ICMP` only, which is a base class for Internet Control Message Protocol (ICMP) protocol family [*]_, e.g. -:class:`~pcapkit.protocols.internet.icmpv4.ICMPv4` and -:class:`~pcapkit.protocols.internet.icmpv6.ICMPv6`. Constructing the base gives the +:class:`~pcapkit.protocols.internet.icmpv4.protocol.ICMPv4` and +:class:`~pcapkit.protocols.internet.icmpv6.protocol.ICMPv6`. Constructing the base gives the one its ``version`` keyword names, from octets or from fields, and is refused without it, since an ICMP message carries no version of its own. Its -:meth:`~pcapkit.protocols.internet.icmp.ICMP.from_data` gives the one whose data +:meth:`~pcapkit.protocols.internet.icmp.protocol.ICMP.from_data` gives the one whose data model it is handed (:issue:`2574`). -.. autoclass:: pcapkit.protocols.internet.icmp.ICMP +.. autoclass:: pcapkit.protocols.internet.icmp.protocol.ICMP :no-members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/internet/icmpv4.rst b/docs/source/pcapkit/protocols/internet/icmpv4.rst index f84b876a1c..2f5ad04f5e 100644 --- a/docs/source/pcapkit/protocols/internet/icmpv4.rst +++ b/docs/source/pcapkit/protocols/internet/icmpv4.rst @@ -2,9 +2,10 @@ ICMPv4 - Internet Control Message Protocol ========================================== .. module:: pcapkit.protocols.internet.icmpv4 +.. module:: pcapkit.protocols.internet.icmpv4.protocol -:mod:`pcapkit.protocols.internet.icmpv4` contains -:class:`~pcapkit.protocols.internet.icmpv4.ICMPv4` only, +:mod:`pcapkit.protocols.internet.icmpv4.protocol` contains +:class:`~pcapkit.protocols.internet.icmpv4.protocol.ICMPv4` only, which implements extractor for Internet Control Message Protocol (ICMP) [*]_, whose structure is described as below: @@ -18,7 +19,7 @@ Octets Bits Name Description 4 32 ``icmpv4.data`` Message Body ======= ========= ======================= =================================== -.. autoclass:: pcapkit.protocols.internet.icmpv4.ICMPv4 +.. autoclass:: pcapkit.protocols.internet.icmpv4.protocol.ICMPv4 :no-members: :show-inheritance: @@ -55,67 +56,67 @@ Octets Bits Name Description Header Schemas -------------- -.. module:: pcapkit.protocols.schema.internet.icmpv4 +.. module:: pcapkit.protocols.internet.icmpv4.schema -.. autoclass:: pcapkit.protocols.schema.internet.icmpv4.ICMPv4 +.. autoclass:: pcapkit.protocols.internet.icmpv4.schema.ICMPv4 :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.icmpv4.ICMPv4Type +.. autoclass:: pcapkit.protocols.internet.icmpv4.schema.ICMPv4Type :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.icmpv4.Unknown +.. autoclass:: pcapkit.protocols.internet.icmpv4.schema.Unknown :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.icmpv4.Echo +.. autoclass:: pcapkit.protocols.internet.icmpv4.schema.Echo :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.icmpv4.DestinationUnreachable +.. autoclass:: pcapkit.protocols.internet.icmpv4.schema.DestinationUnreachable :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.icmpv4.TimeExceeded +.. autoclass:: pcapkit.protocols.internet.icmpv4.schema.TimeExceeded :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.icmpv4.ParameterProblem +.. autoclass:: pcapkit.protocols.internet.icmpv4.schema.ParameterProblem :members: :show-inheritance: Auxiliary Functions ~~~~~~~~~~~~~~~~~~~~ -.. autofunction:: pcapkit.protocols.schema.internet.icmpv4.icmpv4_data_selector +.. autofunction:: pcapkit.protocols.internet.icmpv4.schema.icmpv4_data_selector Data Models ----------- -.. module:: pcapkit.protocols.data.internet.icmpv4 +.. module:: pcapkit.protocols.internet.icmpv4.data -.. autoclass:: pcapkit.protocols.data.internet.icmpv4.ICMPv4 +.. autoclass:: pcapkit.protocols.internet.icmpv4.data.ICMPv4 :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.icmpv4.Unknown +.. autoclass:: pcapkit.protocols.internet.icmpv4.data.Unknown :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.icmpv4.Echo +.. autoclass:: pcapkit.protocols.internet.icmpv4.data.Echo :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.icmpv4.DestinationUnreachable +.. autoclass:: pcapkit.protocols.internet.icmpv4.data.DestinationUnreachable :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.icmpv4.TimeExceeded +.. autoclass:: pcapkit.protocols.internet.icmpv4.data.TimeExceeded :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.icmpv4.ParameterProblem +.. autoclass:: pcapkit.protocols.internet.icmpv4.data.ParameterProblem :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/internet/icmpv6.rst b/docs/source/pcapkit/protocols/internet/icmpv6.rst index 09aced2e6f..0f74c0bad4 100644 --- a/docs/source/pcapkit/protocols/internet/icmpv6.rst +++ b/docs/source/pcapkit/protocols/internet/icmpv6.rst @@ -2,9 +2,10 @@ ICMPv6 - Internet Control Message Protocol for IPv6 ======================================================= .. module:: pcapkit.protocols.internet.icmpv6 +.. module:: pcapkit.protocols.internet.icmpv6.protocol -:mod:`pcapkit.protocols.internet.icmpv6` contains -:class:`~pcapkit.protocols.internet.icmpv6.ICMPv6` only, +:mod:`pcapkit.protocols.internet.icmpv6.protocol` contains +:class:`~pcapkit.protocols.internet.icmpv6.protocol.ICMPv6` only, which implements extractor for Internet Control Message Protocol for IPv6 (ICMPv6) [*]_, whose structure is described as below: @@ -18,7 +19,7 @@ Octets Bits Name Description 4 32 ``icmpv6.data`` Message Body ======= ========= ======================= =================================== -.. autoclass:: pcapkit.protocols.internet.icmpv6.ICMPv6 +.. autoclass:: pcapkit.protocols.internet.icmpv6.protocol.ICMPv6 :no-members: :show-inheritance: @@ -58,75 +59,75 @@ Octets Bits Name Description Header Schemas -------------- -.. module:: pcapkit.protocols.schema.internet.icmpv6 +.. module:: pcapkit.protocols.internet.icmpv6.schema -.. autoclass:: pcapkit.protocols.schema.internet.icmpv6.ICMPv6 +.. autoclass:: pcapkit.protocols.internet.icmpv6.schema.ICMPv6 :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.icmpv6.ICMPv6Type +.. autoclass:: pcapkit.protocols.internet.icmpv6.schema.ICMPv6Type :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.icmpv6.Unknown +.. autoclass:: pcapkit.protocols.internet.icmpv6.schema.Unknown :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.icmpv6.DestinationUnreachable +.. autoclass:: pcapkit.protocols.internet.icmpv6.schema.DestinationUnreachable :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.icmpv6.PacketTooBig +.. autoclass:: pcapkit.protocols.internet.icmpv6.schema.PacketTooBig :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.icmpv6.TimeExceeded +.. autoclass:: pcapkit.protocols.internet.icmpv6.schema.TimeExceeded :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.icmpv6.ParameterProblem +.. autoclass:: pcapkit.protocols.internet.icmpv6.schema.ParameterProblem :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.icmpv6.Echo +.. autoclass:: pcapkit.protocols.internet.icmpv6.schema.Echo :members: :show-inheritance: Auxiliary Functions ~~~~~~~~~~~~~~~~~~~~ -.. autofunction:: pcapkit.protocols.schema.internet.icmpv6.icmpv6_data_selector +.. autofunction:: pcapkit.protocols.internet.icmpv6.schema.icmpv6_data_selector Data Models ----------- -.. module:: pcapkit.protocols.data.internet.icmpv6 +.. module:: pcapkit.protocols.internet.icmpv6.data -.. autoclass:: pcapkit.protocols.data.internet.icmpv6.ICMPv6 +.. autoclass:: pcapkit.protocols.internet.icmpv6.data.ICMPv6 :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.icmpv6.Unknown +.. autoclass:: pcapkit.protocols.internet.icmpv6.data.Unknown :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.icmpv6.DestinationUnreachable +.. autoclass:: pcapkit.protocols.internet.icmpv6.data.DestinationUnreachable :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.icmpv6.PacketTooBig +.. autoclass:: pcapkit.protocols.internet.icmpv6.data.PacketTooBig :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.icmpv6.TimeExceeded +.. autoclass:: pcapkit.protocols.internet.icmpv6.data.TimeExceeded :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.icmpv6.ParameterProblem +.. autoclass:: pcapkit.protocols.internet.icmpv6.data.ParameterProblem :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.icmpv6.Echo +.. autoclass:: pcapkit.protocols.internet.icmpv6.data.Echo :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/internet/igmp.rst b/docs/source/pcapkit/protocols/internet/igmp.rst index 439d3855f2..fa0925e5ca 100644 --- a/docs/source/pcapkit/protocols/internet/igmp.rst +++ b/docs/source/pcapkit/protocols/internet/igmp.rst @@ -2,23 +2,24 @@ IGMP - Internet Group Management Protocol ========================================== .. module:: pcapkit.protocols.internet.igmp +.. module:: pcapkit.protocols.internet.igmp.protocol -:mod:`pcapkit.protocols.internet.igmp` contains -:class:`~pcapkit.protocols.internet.igmp.IGMP`, the abstract base of the +:mod:`pcapkit.protocols.internet.igmp.protocol` contains +:class:`~pcapkit.protocols.internet.igmp.protocol.IGMP`, the abstract base of the Internet Group Management Protocol (IGMP) [*]_ versions 1, 2 and 3. IGMPv1 and IGMPv2 share the 8-octet structure below. -:class:`IGMPv1 ` and -:class:`IGMPv2 ` set -:attr:`~pcapkit.protocols.internet.igmp.IGMP.version` and reuse this schema and +:class:`IGMPv1 ` and +:class:`IGMPv2 ` set +:attr:`~pcapkit.protocols.internet.igmp.protocol.IGMP.version` and reuse this schema and data model as-is; IGMPv3's wire format differs materially by message, so -:class:`IGMPv3 ` carries its own +:class:`IGMPv3 ` carries its own instead -- see :doc:`igmpv3`. -:attr:`~pcapkit.protocols.internet.igmp.IGMP.alias` names the protocol each +:attr:`~pcapkit.protocols.internet.igmp.protocol.IGMP.alias` names the protocol each message is read as: ``'IGMP'`` for IGMPv1, the name :rfc:`1112` gives it, and ``'IGMPv2'`` or ``'IGMPv3'`` for the others. Constructing the base gives the version class its ``version`` keyword names; without it, octets give the class the message classifies as, and fields are refused. Its -:meth:`~pcapkit.protocols.internet.igmp.IGMP.from_data` gives the class the +:meth:`~pcapkit.protocols.internet.igmp.protocol.IGMP.from_data` gives the class the ``version`` of its data names: every IGMP data model carries one, ``1``, ``2`` or ``3``, set by the class that read or built the message and on no octet, so an IGMPv1 and an IGMPv2 message read alike apart from it (:issue:`2574`). @@ -35,7 +36,7 @@ Octets Bits Name Description 4 32 ``igmpv1.group`` Group Address ======= ========= ========================= =================================== -.. autoclass:: pcapkit.protocols.internet.igmp.IGMP +.. autoclass:: pcapkit.protocols.internet.igmp.protocol.IGMP :no-members: :show-inheritance: @@ -63,18 +64,18 @@ Octets Bits Name Description Header Schemas -------------- -.. module:: pcapkit.protocols.schema.internet.igmp +.. module:: pcapkit.protocols.internet.igmp.schema -.. autoclass:: pcapkit.protocols.schema.internet.igmp.IGMP +.. autoclass:: pcapkit.protocols.internet.igmp.schema.IGMP :members: :show-inheritance: Data Models ----------- -.. module:: pcapkit.protocols.data.internet.igmp +.. module:: pcapkit.protocols.internet.igmp.data -.. autoclass:: pcapkit.protocols.data.internet.igmp.IGMP +.. autoclass:: pcapkit.protocols.internet.igmp.data.IGMP :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/internet/igmpv1.rst b/docs/source/pcapkit/protocols/internet/igmpv1.rst index 826945df2f..498e93bed8 100644 --- a/docs/source/pcapkit/protocols/internet/igmpv1.rst +++ b/docs/source/pcapkit/protocols/internet/igmpv1.rst @@ -2,15 +2,16 @@ IGMPv1 - Internet Group Management Protocol Version 1 ============================================================= .. module:: pcapkit.protocols.internet.igmpv1 +.. module:: pcapkit.protocols.internet.igmpv1.protocol -:mod:`pcapkit.protocols.internet.igmpv1` contains -:class:`~pcapkit.protocols.internet.igmpv1.IGMPv1`, which implements an +:mod:`pcapkit.protocols.internet.igmpv1.protocol` contains +:class:`~pcapkit.protocols.internet.igmpv1.protocol.IGMPv1`, which implements an extractor for Internet Group Management Protocol version 1 (IGMPv1) [:rfc:`1112`]. It shares its header schema and data model with -:class:`IGMPv2 ` -- see -:mod:`~pcapkit.protocols.internet.igmp` for both. +:class:`IGMPv2 ` -- see +:mod:`~pcapkit.protocols.internet.igmp.protocol` for both. -.. autoclass:: pcapkit.protocols.internet.igmpv1.IGMPv1 +.. autoclass:: pcapkit.protocols.internet.igmpv1.protocol.IGMPv1 :no-members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/internet/igmpv2.rst b/docs/source/pcapkit/protocols/internet/igmpv2.rst index 585040eb7d..eb9a8520c4 100644 --- a/docs/source/pcapkit/protocols/internet/igmpv2.rst +++ b/docs/source/pcapkit/protocols/internet/igmpv2.rst @@ -2,15 +2,16 @@ IGMPv2 - Internet Group Management Protocol Version 2 ============================================================= .. module:: pcapkit.protocols.internet.igmpv2 +.. module:: pcapkit.protocols.internet.igmpv2.protocol -:mod:`pcapkit.protocols.internet.igmpv2` contains -:class:`~pcapkit.protocols.internet.igmpv2.IGMPv2`, which implements an +:mod:`pcapkit.protocols.internet.igmpv2.protocol` contains +:class:`~pcapkit.protocols.internet.igmpv2.protocol.IGMPv2`, which implements an extractor for Internet Group Management Protocol version 2 (IGMPv2) [:rfc:`2236`]. It shares its header schema and data model with -:class:`IGMPv1 ` -- see -:mod:`~pcapkit.protocols.internet.igmp` for both. +:class:`IGMPv1 ` -- see +:mod:`~pcapkit.protocols.internet.igmp.protocol` for both. -.. autoclass:: pcapkit.protocols.internet.igmpv2.IGMPv2 +.. autoclass:: pcapkit.protocols.internet.igmpv2.protocol.IGMPv2 :no-members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/internet/igmpv3.rst b/docs/source/pcapkit/protocols/internet/igmpv3.rst index 450272889e..e9b508b16b 100644 --- a/docs/source/pcapkit/protocols/internet/igmpv3.rst +++ b/docs/source/pcapkit/protocols/internet/igmpv3.rst @@ -2,14 +2,15 @@ IGMPv3 - Internet Group Management Protocol Version 3 ============================================================== .. module:: pcapkit.protocols.internet.igmpv3 +.. module:: pcapkit.protocols.internet.igmpv3.protocol -:mod:`pcapkit.protocols.internet.igmpv3` contains -:class:`~pcapkit.protocols.internet.igmpv3.IGMPv3`, which implements an +:mod:`pcapkit.protocols.internet.igmpv3.protocol` contains +:class:`~pcapkit.protocols.internet.igmpv3.protocol.IGMPv3`, which implements an extractor for Internet Group Management Protocol version 3 (IGMPv3) -[:rfc:`3376`]. Unlike :class:`IGMPv1 ` -and :class:`IGMPv2 `, which reuse the +[:rfc:`3376`]. Unlike :class:`IGMPv1 ` +and :class:`IGMPv2 `, which reuse the abstract base's own 8-octet schema and data model (see -:mod:`~pcapkit.protocols.internet.igmp`), IGMPv3 defines two message shapes +:mod:`~pcapkit.protocols.internet.igmp.protocol`), IGMPv3 defines two message shapes of its own: An IGMPv3 Membership Query (type ``0x11``, shared with v1/v2) reuses the @@ -45,7 +46,7 @@ Octets Bits Name Description 8 64 ``igmpv3.records`` Group Record [1..M] ======= ========= ================================== =================================== -.. autoclass:: pcapkit.protocols.internet.igmpv3.IGMPv3 +.. autoclass:: pcapkit.protocols.internet.igmpv3.protocol.IGMPv3 :no-members: :show-inheritance: @@ -64,45 +65,45 @@ Octets Bits Name Description Header Schemas -------------- -.. module:: pcapkit.protocols.schema.internet.igmpv3 +.. module:: pcapkit.protocols.internet.igmpv3.schema -.. autoclass:: pcapkit.protocols.schema.internet.igmpv3.IGMPv3 +.. autoclass:: pcapkit.protocols.internet.igmpv3.schema.IGMPv3 :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.igmpv3.Query +.. autoclass:: pcapkit.protocols.internet.igmpv3.schema.Query :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.igmpv3.QueryExtension +.. autoclass:: pcapkit.protocols.internet.igmpv3.schema.QueryExtension :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.igmpv3.Report +.. autoclass:: pcapkit.protocols.internet.igmpv3.schema.Report :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.igmpv3.GroupRecord +.. autoclass:: pcapkit.protocols.internet.igmpv3.schema.GroupRecord :members: :show-inheritance: Data Models ----------- -.. module:: pcapkit.protocols.data.internet.igmpv3 +.. module:: pcapkit.protocols.internet.igmpv3.data -.. autoclass:: pcapkit.protocols.data.internet.igmpv3.IGMPv3 +.. autoclass:: pcapkit.protocols.internet.igmpv3.data.IGMPv3 :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.igmpv3.Query +.. autoclass:: pcapkit.protocols.internet.igmpv3.data.Query :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.igmpv3.Report +.. autoclass:: pcapkit.protocols.internet.igmpv3.data.Report :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.igmpv3.GroupRecord +.. autoclass:: pcapkit.protocols.internet.igmpv3.data.GroupRecord :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/internet/index.rst b/docs/source/pcapkit/protocols/internet/index.rst index 0c1e42818a..4efddac212 100644 --- a/docs/source/pcapkit/protocols/internet/index.rst +++ b/docs/source/pcapkit/protocols/internet/index.rst @@ -2,8 +2,6 @@ Internet Layer ============== .. module:: pcapkit.protocols.internet -.. module:: pcapkit.protocols.data.internet -.. module:: pcapkit.protocols.schema.internet :mod:`pcapkit.protocols.internet` is the collection of all protocols in internet layer, with detailed implementation and methods. diff --git a/docs/source/pcapkit/protocols/internet/internet.rst b/docs/source/pcapkit/protocols/internet/internet.rst index 4861661ff5..3f4368b143 100644 --- a/docs/source/pcapkit/protocols/internet/internet.rst +++ b/docs/source/pcapkit/protocols/internet/internet.rst @@ -4,9 +4,9 @@ Internet Layer Base Protocol .. module:: pcapkit.protocols.internet.internet :mod:`pcapkit.protocols.internet.internet` contains :class:`~pcapkit.protocols.internet.internet.Internet`, -which is a base class for internet layer protocols, e.g. :class:`~pcapkit.protocols.internet.ah.AH`, -:class:`~pcapkit.protocols.internet.ipsec.IPsec`, :class:`~pcapkit.protocols.internet.ipv4.IPv4`, -:class:`~pcapkit.protocols.internet.ipv6.IPv6` and :class:`~pcapkit.protocols.internet.ipx.IPX`. +which is a base class for internet layer protocols, e.g. :class:`~pcapkit.protocols.internet.ah.protocol.AH`, +:class:`~pcapkit.protocols.internet.ipsec.protocol.IPsec`, :class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4`, +:class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6` and :class:`~pcapkit.protocols.internet.ipx.protocol.IPX`. .. autoclass:: pcapkit.protocols.internet.internet.Internet :no-members: @@ -41,7 +41,7 @@ Extension Header Chains A chain of IPv6 extension headers is dissected to at most :data:`~pcapkit.utilities.config.EXTENSION_HEADER_LIMIT` headers in a row, whether it follows IPv6 or another layer such as IPv4. What follows is -kept as :class:`~pcapkit.protocols.misc.raw.Raw`, with one +kept as :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, with one :exc:`~pcapkit.utilities.warnings.ProtocolWarning` (:issue:`1604`). The ``pyshark`` engine leaves the walk to its own parser, which does not stop there, so it may still find the upper layer past it (:issue:`1609`). So may the diff --git a/docs/source/pcapkit/protocols/internet/ip.rst b/docs/source/pcapkit/protocols/internet/ip.rst index 18402337c5..ad942a578f 100644 --- a/docs/source/pcapkit/protocols/internet/ip.rst +++ b/docs/source/pcapkit/protocols/internet/ip.rst @@ -2,19 +2,20 @@ IP - Internet Protocol ====================== .. module:: pcapkit.protocols.internet.ip +.. module:: pcapkit.protocols.internet.ip.protocol -:mod:`pcapkit.protocols.internet.ip` contains -:class:`~pcapkit.protocols.internet.ip.IP` only, +:mod:`pcapkit.protocols.internet.ip.protocol` contains +:class:`~pcapkit.protocols.internet.ip.protocol.IP` only, which is a base class for Internet Protocol (IP) protocol family [*]_, e.g. -:class:`~pcapkit.protocols.internet.ipv4.IPv4` and -:class:`~pcapkit.protocols.internet.ipv6.IPv6`. Constructing the base gives the one +:class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4` and +:class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6`. Constructing the base gives the one its ``version`` keyword names; without it, octets give the one their Version field names, and fields are refused. Its -:meth:`~pcapkit.protocols.internet.ip.IP.from_data` reads the ``version`` of its +:meth:`~pcapkit.protocols.internet.ip.protocol.IP.from_data` reads the ``version`` of its data (:issue:`2574`). -.. autoclass:: pcapkit.protocols.internet.ip.IP +.. autoclass:: pcapkit.protocols.internet.ip.protocol.IP :no-members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/internet/ipsec.rst b/docs/source/pcapkit/protocols/internet/ipsec.rst index 681f499be3..3ec7e23280 100644 --- a/docs/source/pcapkit/protocols/internet/ipsec.rst +++ b/docs/source/pcapkit/protocols/internet/ipsec.rst @@ -2,15 +2,16 @@ IPsec - Internet Protocol Security ================================== .. module:: pcapkit.protocols.internet.ipsec +.. module:: pcapkit.protocols.internet.ipsec.protocol -:mod:`pcapkit.protocols.internet.ipsec` contains -:class:`~pcapkit.protocols.internet.ipsec.IPsec` +:mod:`pcapkit.protocols.internet.ipsec.protocol` contains +:class:`~pcapkit.protocols.internet.ipsec.protocol.IPsec` only, which is a base class for Internet Protocol Security (IPsec) protocol family [*]_, e.g. -:class:`~pcapkit.protocols.internet.ah.AH` and -:class:`~pcapkit.protocols.internet.esp.ESP`. +:class:`~pcapkit.protocols.internet.ah.protocol.AH` and +:class:`~pcapkit.protocols.internet.esp.protocol.ESP`. -.. autoclass:: pcapkit.protocols.internet.ipsec.IPsec +.. autoclass:: pcapkit.protocols.internet.ipsec.protocol.IPsec :no-members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/internet/ipv4.rst b/docs/source/pcapkit/protocols/internet/ipv4.rst index a53a975d52..f8acfd3372 100644 --- a/docs/source/pcapkit/protocols/internet/ipv4.rst +++ b/docs/source/pcapkit/protocols/internet/ipv4.rst @@ -2,9 +2,10 @@ IPv4 - Internet Protocol Version 4 ================================== .. module:: pcapkit.protocols.internet.ipv4 +.. module:: pcapkit.protocols.internet.ipv4.protocol -:mod:`pcapkit.protocols.internet.ipv4` contains -:class:`~pcapkit.protocols.internet.ipv4.IPv4` only, +:mod:`pcapkit.protocols.internet.ipv4.protocol` contains +:class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4` only, which implements the extractor for Internet Protocol version 4 (IPv4) [*]_, whose structure is described as below: @@ -33,7 +34,7 @@ Octets Bits Name Description 20 160 ``ipv4.options`` IP Options (if IHL > ``5``) ======= ========= ======================= ============================================ -.. autoclass:: pcapkit.protocols.internet.ipv4.IPv4 +.. autoclass:: pcapkit.protocols.internet.ipv4.protocol.IPv4 :no-members: :show-inheritance: @@ -95,138 +96,148 @@ Octets Bits Name Description Header Schemas -------------- -.. module:: pcapkit.protocols.schema.internet.ipv4 +.. module:: pcapkit.protocols.internet.ipv4.schema -.. autodata:: pcapkit.protocols.schema.internet.ipv4.IPV4_HEADER_LEN +.. versionremoved:: 1.6.0 -.. autoclass:: pcapkit.protocols.schema.internet.ipv4.IPv4 + ``pcapkit.protocols.schema.internet.ipv4``, with no alias: the module moved here + (:issue:`2534`). + +.. autodata:: pcapkit.protocols.internet.ipv4.schema.IPV4_HEADER_LEN + +.. autoclass:: pcapkit.protocols.internet.ipv4.schema.IPv4 :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv4.Option +.. autoclass:: pcapkit.protocols.internet.ipv4.schema.Option :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv4.UnassignedOption +.. autoclass:: pcapkit.protocols.internet.ipv4.schema.UnassignedOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv4.EOOLOption +.. autoclass:: pcapkit.protocols.internet.ipv4.schema.EOOLOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv4.NOPOption +.. autoclass:: pcapkit.protocols.internet.ipv4.schema.NOPOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv4.SECOption +.. autoclass:: pcapkit.protocols.internet.ipv4.schema.SECOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv4.LSROption +.. autoclass:: pcapkit.protocols.internet.ipv4.schema.LSROption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv4.TSOption +.. autoclass:: pcapkit.protocols.internet.ipv4.schema.TSOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv4.ESECOption +.. autoclass:: pcapkit.protocols.internet.ipv4.schema.ESECOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv4.RROption +.. autoclass:: pcapkit.protocols.internet.ipv4.schema.RROption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv4.SIDOption +.. autoclass:: pcapkit.protocols.internet.ipv4.schema.SIDOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv4.SSROption +.. autoclass:: pcapkit.protocols.internet.ipv4.schema.SSROption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv4.MTUPOption +.. autoclass:: pcapkit.protocols.internet.ipv4.schema.MTUPOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv4.MTUROption +.. autoclass:: pcapkit.protocols.internet.ipv4.schema.MTUROption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv4.TROption +.. autoclass:: pcapkit.protocols.internet.ipv4.schema.TROption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv4.RTRALTOption +.. autoclass:: pcapkit.protocols.internet.ipv4.schema.RTRALTOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv4._QSOption +.. autoclass:: pcapkit.protocols.internet.ipv4.schema._QSOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv4.QSOption +.. autoclass:: pcapkit.protocols.internet.ipv4.schema.QSOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv4.QuickStartRequestOption +.. autoclass:: pcapkit.protocols.internet.ipv4.schema.QuickStartRequestOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv4.QuickStartReportOption +.. autoclass:: pcapkit.protocols.internet.ipv4.schema.QuickStartReportOption :members: :show-inheritance: Type Stubs ~~~~~~~~~~ -.. autoclass:: pcapkit.protocols.schema.internet.ipv4.VerIHLField +.. autoclass:: pcapkit.protocols.internet.ipv4.schema.VerIHLField :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv4.ToSField +.. autoclass:: pcapkit.protocols.internet.ipv4.schema.ToSField :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv4.Flags +.. autoclass:: pcapkit.protocols.internet.ipv4.schema.Flags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv4.TSFlags +.. autoclass:: pcapkit.protocols.internet.ipv4.schema.TSFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv4.QuickStartFlags +.. autoclass:: pcapkit.protocols.internet.ipv4.schema.QuickStartFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv4.QSTestFlags +.. autoclass:: pcapkit.protocols.internet.ipv4.schema.QSTestFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv4.QSNonce +.. autoclass:: pcapkit.protocols.internet.ipv4.schema.QSNonce :members: :show-inheritance: Auxiliary Functions ~~~~~~~~~~~~~~~~~~~ -.. autofunction:: pcapkit.protocols.schema.internet.ipv4.quick_start_option_length +.. autofunction:: pcapkit.protocols.internet.ipv4.schema.quick_start_option_length -.. autofunction:: pcapkit.protocols.schema.internet.ipv4.quick_start_data_selector +.. autofunction:: pcapkit.protocols.internet.ipv4.schema.quick_start_data_selector Data Models ----------- -.. module:: pcapkit.protocols.data.internet.ipv4 +.. module:: pcapkit.protocols.internet.ipv4.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.internet.ipv4``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.data.internet.ipv4.IPv4 +.. autoclass:: pcapkit.protocols.internet.ipv4.data.IPv4 :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv4.ToSField +.. autoclass:: pcapkit.protocols.internet.ipv4.data.ToSField :members: :show-inheritance: @@ -240,15 +251,15 @@ Data Models This field's name conflicts with the :keyword:`del` keyword, so access it with :func:`getattr` instead. -.. autoclass:: pcapkit.protocols.data.internet.ipv4.Flags +.. autoclass:: pcapkit.protocols.internet.ipv4.data.Flags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv4.Option +.. autoclass:: pcapkit.protocols.internet.ipv4.data.Option :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv4.OptionType +.. autoclass:: pcapkit.protocols.internet.ipv4.data.OptionType :members: :show-inheritance: @@ -262,55 +273,55 @@ Data Models This field's name conflicts with the :keyword:`class` keyword, so access it with :func:`getattr` instead. -.. autoclass:: pcapkit.protocols.data.internet.ipv4.UnassignedOption +.. autoclass:: pcapkit.protocols.internet.ipv4.data.UnassignedOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv4.EOOLOption +.. autoclass:: pcapkit.protocols.internet.ipv4.data.EOOLOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv4.NOPOption +.. autoclass:: pcapkit.protocols.internet.ipv4.data.NOPOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv4.SECOption +.. autoclass:: pcapkit.protocols.internet.ipv4.data.SECOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv4.LSROption +.. autoclass:: pcapkit.protocols.internet.ipv4.data.LSROption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv4.TSOption +.. autoclass:: pcapkit.protocols.internet.ipv4.data.TSOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv4.ESECOption +.. autoclass:: pcapkit.protocols.internet.ipv4.data.ESECOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv4.RROption +.. autoclass:: pcapkit.protocols.internet.ipv4.data.RROption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv4.SIDOption +.. autoclass:: pcapkit.protocols.internet.ipv4.data.SIDOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv4.SSROption +.. autoclass:: pcapkit.protocols.internet.ipv4.data.SSROption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv4.MTUPOption +.. autoclass:: pcapkit.protocols.internet.ipv4.data.MTUPOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv4.MTUROption +.. autoclass:: pcapkit.protocols.internet.ipv4.data.MTUROption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv4.TROption +.. autoclass:: pcapkit.protocols.internet.ipv4.data.TROption :members: :show-inheritance: @@ -324,19 +335,19 @@ Data Models This field's name conflicts with the :keyword:`return` keyword, so access it with :func:`getattr` instead. -.. autoclass:: pcapkit.protocols.data.internet.ipv4.RTRALTOption +.. autoclass:: pcapkit.protocols.internet.ipv4.data.RTRALTOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv4.QSOption +.. autoclass:: pcapkit.protocols.internet.ipv4.data.QSOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv4.QuickStartRequestOption +.. autoclass:: pcapkit.protocols.internet.ipv4.data.QuickStartRequestOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv4.QuickStartReportOption +.. autoclass:: pcapkit.protocols.internet.ipv4.data.QuickStartReportOption :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/internet/ipv6.rst b/docs/source/pcapkit/protocols/internet/ipv6.rst index 61dc23aaf4..f04da1ae49 100644 --- a/docs/source/pcapkit/protocols/internet/ipv6.rst +++ b/docs/source/pcapkit/protocols/internet/ipv6.rst @@ -2,9 +2,17 @@ IPv6 - Internet Protocol Version 6 ================================== .. module:: pcapkit.protocols.internet.ipv6 +.. module:: pcapkit.protocols.internet.ipv6.protocol -:mod:`pcapkit.protocols.internet.ipv6` contains -:class:`~pcapkit.protocols.internet.ipv6.IPv6` only, +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.internet.ipv6.IPV6_HEADER_LEN`` and + ``pcapkit.protocols.internet.ipv6.IPV6_NEXT_HEADER_OFFSET``, with no alias: they are + in this module, and :mod:`pcapkit.protocols.internet.ipv6` exports the protocol class + alone (:issue:`2534`). + +:mod:`pcapkit.protocols.internet.ipv6.protocol` contains +:class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6` only, which implements the extractor for Internet Protocol version 6 (IPv6) [*]_, whose structure is described as below: @@ -22,7 +30,7 @@ Octets Bits Name Description 24 192 ``ipv6.dst`` Destination Address ======= ========= ===================== ======================================= -.. autoclass:: pcapkit.protocols.internet.ipv6.IPv6 +.. autoclass:: pcapkit.protocols.internet.ipv6.protocol.IPv6 :no-members: :show-inheritance: @@ -52,30 +60,35 @@ Octets Bits Name Description Protocol Constants ------------------ -.. autodata:: pcapkit.protocols.internet.ipv6.IPV6_HEADER_LEN +.. autodata:: pcapkit.protocols.internet.ipv6.protocol.IPV6_HEADER_LEN -.. autodata:: pcapkit.protocols.internet.ipv6.IPV6_NEXT_HEADER_OFFSET +.. autodata:: pcapkit.protocols.internet.ipv6.protocol.IPV6_NEXT_HEADER_OFFSET Header Schemas -------------- -.. module:: pcapkit.protocols.schema.internet.ipv6 +.. module:: pcapkit.protocols.internet.ipv6.schema + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.schema.internet.ipv6``, with no alias: the module moved here + (:issue:`2534`). .. versionremoved:: 1.6.0 ``pcapkit.protocols.schema.internet.ipv6.jumbo_payload_length``, now :func:`pcapkit.corekit.schema.jumbogram.jumbo_payload_length` (:issue:`2674`). -.. autodata:: pcapkit.protocols.schema.internet.ipv6.IP_MAX_LENGTH +.. autodata:: pcapkit.protocols.internet.ipv6.schema.IP_MAX_LENGTH -.. autoclass:: pcapkit.protocols.schema.internet.ipv6.IPv6 +.. autoclass:: pcapkit.protocols.internet.ipv6.schema.IPv6 :members: :show-inheritance: Type Stubs ~~~~~~~~~~ -.. autoclass:: pcapkit.protocols.schema.internet.ipv6.IPv6Hextet +.. autoclass:: pcapkit.protocols.internet.ipv6.schema.IPv6Hextet :members: :show-inheritance: @@ -97,14 +110,19 @@ Type Stubs Auxiliary Functions ~~~~~~~~~~~~~~~~~~~ -.. autofunction:: pcapkit.protocols.schema.internet.ipv6.jumbogram_error +.. autofunction:: pcapkit.protocols.internet.ipv6.schema.jumbogram_error Data Models ----------- -.. module:: pcapkit.protocols.data.internet.ipv6 +.. module:: pcapkit.protocols.internet.ipv6.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.internet.ipv6``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.data.internet.ipv6.IPv6 +.. autoclass:: pcapkit.protocols.internet.ipv6.data.IPv6 :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/internet/ipv6_ext.rst b/docs/source/pcapkit/protocols/internet/ipv6_ext.rst index 027867219a..dd3ff908df 100644 --- a/docs/source/pcapkit/protocols/internet/ipv6_ext.rst +++ b/docs/source/pcapkit/protocols/internet/ipv6_ext.rst @@ -2,17 +2,18 @@ IPv6-Ext - IPv6 Extension Header ================================ .. module:: pcapkit.protocols.internet.ipv6_ext +.. module:: pcapkit.protocols.internet.ipv6_ext.protocol -:mod:`pcapkit.protocols.internet.ipv6_ext` contains -:class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext` +:mod:`pcapkit.protocols.internet.ipv6_ext.protocol` contains +:class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext` only, which plays a double role. It is the shared **base class** of every IPv6 extension header this package implements, supplying the ``extension``-mode contract: the guards that make -:attr:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext.payload` and -:attr:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext.protochain` +:attr:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext.payload` and +:attr:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext.protochain` unavailable on a header parsed as part of an IPv6 chain. Each subclass guards its own ``protocol`` the same way; this class's -:attr:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext.protocol` deliberately +:attr:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext.protocol` deliberately does not. It also implements a **generic** extractor for IPv6 extension headers [*]_, for a header with no dedicated parser. :rfc:`6564#section-4` @@ -33,7 +34,7 @@ header. The sections below the class give the headers that depart from that rule, the ways this class is dispatched to, and why an overrun stops the walk instead of clipping it. -.. autoclass:: pcapkit.protocols.internet.ipv6_ext.IPv6_Ext +.. autoclass:: pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext :no-members: :show-inheritance: @@ -81,7 +82,7 @@ Header(s) Length rul counts in 4-octet units with a bias of 2, not :rfc:`6564`'s 8-octet units and bias of 1 ``ESP`` terminal -- has a dedicated, registered parser - (:class:`~pcapkit.protocols.internet.esp.ESP`), + (:class:`~pcapkit.protocols.internet.esp.protocol.ESP`), but its Next Header byte is inside the encrypted trailer (:rfc:`4303`), so the walk cannot step past it on the wire @@ -104,16 +105,16 @@ field in the cleartext part. 253 and 254 are reserved for private experimentation (:rfc:`3692`) with no wire format at all. None of them is reachable through this class, by construction; see :meth:`IPv6._import_next_layer -`. Each still enters +`. Each still enters :meth:`IPv6._decode_next_layer -`'s walk, being a real +`'s walk, being a real :class:`~pcapkit.const.ipv6.extension_header.ExtensionHeader` member, but they part ways there. ``ESP`` resolves to its own dedicated parser, which decodes any plaintext it recovers itself and whose info carries a ``next`` of :data:`None` whenever the payload stays opaque, so the walk ends the ordinary way with ``ExtensionHeader(None)`` failing at the top of the next iteration. ``253`` and ``254`` have no dedicated parser and resolve to plain -:class:`~pcapkit.protocols.misc.raw.Raw`, whose info has no ``next`` +:class:`~pcapkit.protocols.misc.raw.protocol.Raw`, whose info has no ``next`` *attribute*. For these two, and any future IANA code without an implementation, the walk stops on a *structural* check (does the parsed layer carry a ``next`` at all?) rather than on a list of codes. @@ -127,20 +128,20 @@ This class is reached by direct dispatch only. :attr:`~pcapkit.const.ipv6.extension_header.ExtensionHeader.Shim6` is a real IANA extension header (:rfc:`5533`) with no dedicated parser, so :meth:`Internet._lookup_next_layer ` -would default it to plain :class:`~pcapkit.protocols.misc.raw.Raw`, whose +would default it to plain :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, whose missing ``next`` field would end the walk in -:meth:`IPv6._decode_next_layer ` +:meth:`IPv6._decode_next_layer ` there (:issue:`891`). This module registers this class for that code instead, at the bottom of the module, so dispatch reaches a working generic parser directly. The registration is global, shared by every :class:`~pcapkit.protocols.internet.internet.Internet` subclass, so -:meth:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext.__post_init__` gates on +:meth:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext.__post_init__` gates on ``version == 6`` to keep it from also activating for an IPv4 payload that carries protocol number 140; see its docstring. A header with a dedicated class whose parser raises does not reach this class. :func:`~pcapkit.corekit.decorators.beholder` makes it plain -:class:`~pcapkit.protocols.misc.raw.Raw`, and the walk stops there, as +:class:`~pcapkit.protocols.misc.raw.protocol.Raw`, and the walk stops there, as :rfc:`8200#section-4` has a node discard such a packet (:issue:`2477`). .. _ipv6-ext-overrun-guard: @@ -151,12 +152,12 @@ The Overrun Guard The house convention for a declared length that does not fit what remains is warn-and-clip: emit a warning naming what was declared against what is left, then read only what is left. See -:func:`pcapkit.protocols.schema.misc.pcapng.bounded_area` and -:meth:`pcapkit.protocols.misc.pcapng.PCAPNG.read`. +:func:`pcapkit.protocols.misc.pcapng.schema.bounded_area` and +:meth:`pcapkit.protocols.misc.pcapng.protocol.PCAPNG.read`. This class follows that convention's *warning* -- a :class:`~pcapkit.utilities.warnings.SchemaWarning`, as -:func:`~pcapkit.protocols.schema.misc.pcapng.bounded_area` emits -- and +:func:`~pcapkit.protocols.misc.pcapng.schema.bounded_area` emits -- and deliberately diverges on the *action*. Clipping is right when the declared length only governs how much of the current object to read, since there is always a well-defined "what is left" to fall back to. Here the declared length @@ -164,9 +165,9 @@ also decides *where the next header starts*; a clipped skip distance points at whatever bytes end the buffer, which are not a header. Continuing from there would fabricate a layer and record a false entry in :class:`~pcapkit.corekit.protochain.ProtoChain`, which reads as a parsed fact -rather than a guess. So :meth:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext.read` +rather than a guess. So :meth:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext.read` warns in the same form as -:func:`~pcapkit.protocols.schema.misc.pcapng.bounded_area`, then **stops the +:func:`~pcapkit.protocols.misc.pcapng.schema.bounded_area`, then **stops the walk**: this instance absorbs every remaining octet and reports :data:`None` for ``next``, which the caller's loop already reads as "no more extension headers". The chain ends honestly at the bad header instead of inventing what @@ -175,18 +176,29 @@ follows it. Header Schemas -------------- -.. module:: pcapkit.protocols.schema.internet.ipv6_ext +.. module:: pcapkit.protocols.internet.ipv6_ext.schema -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_ext.IPv6_Ext +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.schema.internet.ipv6_ext`` and + ``pcapkit.protocols.schema.internet.ipv6_option``, with no alias: the modules merged + here (:issue:`2534`). + +.. autoclass:: pcapkit.protocols.internet.ipv6_ext.schema.IPv6_Ext :members: :show-inheritance: Data Models ----------- -.. module:: pcapkit.protocols.data.internet.ipv6_ext +.. module:: pcapkit.protocols.internet.ipv6_ext.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.internet.ipv6_ext``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.data.internet.ipv6_ext.IPv6_Ext +.. autoclass:: pcapkit.protocols.internet.ipv6_ext.data.IPv6_Ext :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/internet/ipv6_frag.rst b/docs/source/pcapkit/protocols/internet/ipv6_frag.rst index 432178c96e..3c4223ab30 100644 --- a/docs/source/pcapkit/protocols/internet/ipv6_frag.rst +++ b/docs/source/pcapkit/protocols/internet/ipv6_frag.rst @@ -2,9 +2,10 @@ IPv6-Frag - Fragment Header for IPv6 ==================================== .. module:: pcapkit.protocols.internet.ipv6_frag +.. module:: pcapkit.protocols.internet.ipv6_frag.protocol -:mod:`pcapkit.protocols.internet.ipv6_frag` contains -:class:`~pcapkit.protocols.internet.ipv6_frag.IPv6_Frag` +:mod:`pcapkit.protocols.internet.ipv6_frag.protocol` contains +:class:`~pcapkit.protocols.internet.ipv6_frag.protocol.IPv6_Frag` only, which implements the extractor for Fragment Header for IPv6 (IPv6-Frag) [*]_, whose structure is described as below: @@ -20,7 +21,7 @@ Octets Bits Name Description 4 32 ``frag.id`` Identification ======= ========= ========================= ======================= -.. autoclass:: pcapkit.protocols.internet.ipv6_frag.IPv6_Frag +.. autoclass:: pcapkit.protocols.internet.ipv6_frag.protocol.IPv6_Frag :no-members: :show-inheritance: @@ -44,18 +45,28 @@ Octets Bits Name Description Header Schemas -------------- -.. module:: pcapkit.protocols.schema.internet.ipv6_frag +.. module:: pcapkit.protocols.internet.ipv6_frag.schema -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_frag.IPv6_Frag +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.schema.internet.ipv6_frag``, with no alias: the module moved here + (:issue:`2534`). + +.. autoclass:: pcapkit.protocols.internet.ipv6_frag.schema.IPv6_Frag :members: :show-inheritance: Data Models ----------- -.. module:: pcapkit.protocols.data.internet.ipv6_frag +.. module:: pcapkit.protocols.internet.ipv6_frag.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.internet.ipv6_frag``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.data.internet.ipv6_frag.IPv6_Frag +.. autoclass:: pcapkit.protocols.internet.ipv6_frag.data.IPv6_Frag :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/internet/ipv6_option.rst b/docs/source/pcapkit/protocols/internet/ipv6_option.rst index 93520ae6e8..d64865f79a 100644 --- a/docs/source/pcapkit/protocols/internet/ipv6_option.rst +++ b/docs/source/pcapkit/protocols/internet/ipv6_option.rst @@ -1,12 +1,12 @@ IPv6 Options - Shared Option Helpers ==================================== -.. module:: pcapkit.protocols.schema.internet.ipv6_option +.. currentmodule:: pcapkit.protocols.internet.ipv6_ext.schema -:mod:`pcapkit.protocols.schema.internet.ipv6_option` contains the field helpers +:mod:`pcapkit.protocols.internet.ipv6_ext.schema` contains the field helpers shared by the option schemas of -:mod:`~pcapkit.protocols.schema.internet.hopopt` (HOPOPT) and -:mod:`~pcapkit.protocols.schema.internet.ipv6_opts` (IPv6-Opts), since both +:mod:`~pcapkit.protocols.internet.hopopt.schema` (HOPOPT) and +:mod:`~pcapkit.protocols.internet.ipv6_opts.schema` (IPv6-Opts), since both headers carry the same IPv6 options [*]_. A helper that reports an error takes the header's name as ``prefix``, and a selector takes the header's option schemas. Each header module binds them in a function of the same name, which @@ -15,16 +15,16 @@ is what its fields use. Auxiliary Functions ------------------- -.. autofunction:: pcapkit.protocols.schema.internet.ipv6_option.rpl_opt_sub_tlv_len -.. autofunction:: pcapkit.protocols.schema.internet.ipv6_option.mpl_opt_seed_id_len -.. autofunction:: pcapkit.protocols.schema.internet.ipv6_option.pad_opt_data_len -.. autofunction:: pcapkit.protocols.schema.internet.ipv6_option.calipso_pad_len -.. autofunction:: pcapkit.protocols.schema.internet.ipv6_option.mpl_opt_pad_len +.. autofunction:: pcapkit.protocols.internet.ipv6_ext.schema.rpl_opt_sub_tlv_len +.. autofunction:: pcapkit.protocols.internet.ipv6_ext.schema.mpl_opt_seed_id_len +.. autofunction:: pcapkit.protocols.internet.ipv6_ext.schema.pad_opt_data_len +.. autofunction:: pcapkit.protocols.internet.ipv6_ext.schema.calipso_pad_len +.. autofunction:: pcapkit.protocols.internet.ipv6_ext.schema.mpl_opt_pad_len -.. autofunction:: pcapkit.protocols.schema.internet.ipv6_option.smf_dpd_data_selector -.. autofunction:: pcapkit.protocols.schema.internet.ipv6_option.smf_i_dpd_tid_selector -.. autofunction:: pcapkit.protocols.schema.internet.ipv6_option.smf_i_dpd_id_len -.. autofunction:: pcapkit.protocols.schema.internet.ipv6_option.quick_start_data_selector +.. autofunction:: pcapkit.protocols.internet.ipv6_ext.schema.smf_dpd_data_selector +.. autofunction:: pcapkit.protocols.internet.ipv6_ext.schema.smf_i_dpd_tid_selector +.. autofunction:: pcapkit.protocols.internet.ipv6_ext.schema.smf_i_dpd_id_len +.. autofunction:: pcapkit.protocols.internet.ipv6_ext.schema.quick_start_data_selector .. rubric:: Footnotes diff --git a/docs/source/pcapkit/protocols/internet/ipv6_opts.rst b/docs/source/pcapkit/protocols/internet/ipv6_opts.rst index 5c8ad36168..743fcb43e4 100644 --- a/docs/source/pcapkit/protocols/internet/ipv6_opts.rst +++ b/docs/source/pcapkit/protocols/internet/ipv6_opts.rst @@ -2,9 +2,10 @@ IPv6-Opts - Destination Options for IPv6 ======================================== .. module:: pcapkit.protocols.internet.ipv6_opts +.. module:: pcapkit.protocols.internet.ipv6_opts.protocol -:mod:`pcapkit.protocols.internet.ipv6_opts` contains -:class:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts` +:mod:`pcapkit.protocols.internet.ipv6_opts.protocol` contains +:class:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts` only, which implements the extractor for Destination Options for IPv6 (IPv6-Opts) [*]_, whose structure is described as below: @@ -17,7 +18,7 @@ Octets Bits Name Description 2 16 ``opts.options`` Options ======= ========= =================== ================================= -.. autoclass:: pcapkit.protocols.internet.ipv6_opts.IPv6_Opts +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts :no-members: :show-inheritance: @@ -80,132 +81,137 @@ Octets Bits Name Description Header Schemas -------------- -.. module:: pcapkit.protocols.schema.internet.ipv6_opts +.. module:: pcapkit.protocols.internet.ipv6_opts.schema -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.IPv6_Opts +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.schema.internet.ipv6_opts``, with no alias: the module moved here + (:issue:`2534`). + +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.IPv6_Opts :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.Option +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.Option :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.UnassignedOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.UnassignedOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.PadOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.PadOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.TunnelEncapsulationLimitOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.TunnelEncapsulationLimitOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.RouterAlertOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.RouterAlertOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.CALIPSOOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.CALIPSOOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts._SMFDPDOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema._SMFDPDOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.SMFDPDOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.SMFDPDOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.SMFIdentificationBasedDPDOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.SMFIdentificationBasedDPDOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.SMFHashBasedDPDOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.SMFHashBasedDPDOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.PDMOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.PDMOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts._QuickStartOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema._QuickStartOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.QuickStartOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.QuickStartOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.QuickStartRequestOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.QuickStartRequestOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.QuickStartReportOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.QuickStartReportOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.RPLOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.RPLOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.MPLOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.MPLOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.ILNPOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.ILNPOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.LineIdentificationOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.LineIdentificationOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.JumboPayloadOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.JumboPayloadOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.HomeAddressOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.HomeAddressOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.IPDFFOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.IPDFFOption :members: :show-inheritance: Type Stubs ~~~~~~~~~~ -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.TaggerIDInfo +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.TaggerIDInfo :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.QuickStartFlags +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.QuickStartFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.RPLFlags +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.RPLFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.MPLFlags +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.MPLFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.DFFFlags +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.DFFFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.SMFDPDTestFlag +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.SMFDPDTestFlag :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.QSTestFlags +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.QSTestFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_opts.QSNonce +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.schema.QSNonce :members: :show-inheritance: @@ -213,120 +219,125 @@ Auxiliary Functions ~~~~~~~~~~~~~~~~~~~ The option helpers are shared with -:mod:`~pcapkit.protocols.schema.internet.hopopt` and documented in -:mod:`pcapkit.protocols.schema.internet.ipv6_option`. The functions below bind +:mod:`~pcapkit.protocols.internet.hopopt.schema` and documented in +:mod:`pcapkit.protocols.internet.ipv6_ext.schema`. The functions below bind them to this module's error prefix and option schemas; -:func:`~pcapkit.protocols.schema.internet.ipv6_option.rpl_opt_sub_tlv_len` and -:func:`~pcapkit.protocols.schema.internet.ipv6_option.pad_opt_data_len` are +:func:`~pcapkit.protocols.internet.ipv6_ext.schema.rpl_opt_sub_tlv_len` and +:func:`~pcapkit.protocols.internet.ipv6_ext.schema.pad_opt_data_len` are used unchanged. -.. autofunction:: pcapkit.protocols.schema.internet.ipv6_opts.mpl_opt_seed_id_len -.. autofunction:: pcapkit.protocols.schema.internet.ipv6_opts.calipso_pad_len -.. autofunction:: pcapkit.protocols.schema.internet.ipv6_opts.mpl_opt_pad_len +.. autofunction:: pcapkit.protocols.internet.ipv6_opts.schema.mpl_opt_seed_id_len +.. autofunction:: pcapkit.protocols.internet.ipv6_opts.schema.calipso_pad_len +.. autofunction:: pcapkit.protocols.internet.ipv6_opts.schema.mpl_opt_pad_len -.. autofunction:: pcapkit.protocols.schema.internet.ipv6_opts.smf_dpd_data_selector -.. autofunction:: pcapkit.protocols.schema.internet.ipv6_opts.smf_i_dpd_tid_selector -.. autofunction:: pcapkit.protocols.schema.internet.ipv6_opts.smf_i_dpd_id_len -.. autofunction:: pcapkit.protocols.schema.internet.ipv6_opts.quick_start_data_selector +.. autofunction:: pcapkit.protocols.internet.ipv6_opts.schema.smf_dpd_data_selector +.. autofunction:: pcapkit.protocols.internet.ipv6_opts.schema.smf_i_dpd_tid_selector +.. autofunction:: pcapkit.protocols.internet.ipv6_opts.schema.smf_i_dpd_id_len +.. autofunction:: pcapkit.protocols.internet.ipv6_opts.schema.quick_start_data_selector Data Models ----------- -.. module:: pcapkit.protocols.data.internet.ipv6_opts +.. module:: pcapkit.protocols.internet.ipv6_opts.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.internet.ipv6_opts``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.data.internet.ipv6_opts.IPv6_Opts +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.data.IPv6_Opts :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv6_opts.Option +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.data.Option :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv6_opts.UnassignedOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.data.UnassignedOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv6_opts.PadOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.data.PadOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv6_opts.TunnelEncapsulationLimitOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.data.TunnelEncapsulationLimitOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv6_opts.RouterAlertOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.data.RouterAlertOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv6_opts.CALIPSOOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.data.CALIPSOOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv6_opts.SMFDPDOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.data.SMFDPDOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv6_opts.SMFIdentificationBasedDPDOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.data.SMFIdentificationBasedDPDOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv6_opts.SMFHashBasedDPDOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.data.SMFHashBasedDPDOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv6_opts.PDMOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.data.PDMOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv6_opts.QuickStartOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.data.QuickStartOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv6_opts.QuickStartRequestOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.data.QuickStartRequestOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv6_opts.QuickStartReportOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.data.QuickStartReportOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv6_opts.RPLOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.data.RPLOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv6_opts.RPLFlags +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.data.RPLFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv6_opts.MPLOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.data.MPLOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv6_opts.MPLFlags +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.data.MPLFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv6_opts.ILNPOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.data.ILNPOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv6_opts.LineIdentificationOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.data.LineIdentificationOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv6_opts.JumboPayloadOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.data.JumboPayloadOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv6_opts.HomeAddressOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.data.HomeAddressOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv6_opts.IPDFFOption +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.data.IPDFFOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv6_opts.DFFFlags +.. autoclass:: pcapkit.protocols.internet.ipv6_opts.data.DFFFlags :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/internet/ipv6_route.rst b/docs/source/pcapkit/protocols/internet/ipv6_route.rst index 7c356d991e..e47f3e92b6 100644 --- a/docs/source/pcapkit/protocols/internet/ipv6_route.rst +++ b/docs/source/pcapkit/protocols/internet/ipv6_route.rst @@ -2,9 +2,10 @@ IPv6-Route - Routing Header for IPv6 ==================================== .. module:: pcapkit.protocols.internet.ipv6_route +.. module:: pcapkit.protocols.internet.ipv6_route.protocol -:mod:`pcapkit.protocols.internet.ipv6_route` contains -:class:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route` +:mod:`pcapkit.protocols.internet.ipv6_route.protocol` contains +:class:`~pcapkit.protocols.internet.ipv6_route.protocol.IPv6_Route` only, which implements the extractor for Routing Header for IPv6 (IPv6-Route) [*]_, whose structure is described as below: @@ -18,7 +19,7 @@ Octets Bits Name Description 4 32 ``route.data`` Type-Specific Data ======= ========= ==================== =============================== -.. autoclass:: pcapkit.protocols.internet.ipv6_route.IPv6_Route +.. autoclass:: pcapkit.protocols.internet.ipv6_route.protocol.IPv6_Route :no-members: :show-inheritance: @@ -58,72 +59,82 @@ Octets Bits Name Description Header Schemas -------------- -.. module:: pcapkit.protocols.schema.internet.ipv6_route +.. module:: pcapkit.protocols.internet.ipv6_route.schema -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_route.IPv6_Route +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.schema.internet.ipv6_route``, with no alias: the module moved + here (:issue:`2534`). + +.. autoclass:: pcapkit.protocols.internet.ipv6_route.schema.IPv6_Route :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_route.RoutingType +.. autoclass:: pcapkit.protocols.internet.ipv6_route.schema.RoutingType :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_route.UnknownType +.. autoclass:: pcapkit.protocols.internet.ipv6_route.schema.UnknownType :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_route.SourceRoute +.. autoclass:: pcapkit.protocols.internet.ipv6_route.schema.SourceRoute :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_route.Type2 +.. autoclass:: pcapkit.protocols.internet.ipv6_route.schema.Type2 :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_route.RPL +.. autoclass:: pcapkit.protocols.internet.ipv6_route.schema.RPL :members: :show-inheritance: Type Stubs ~~~~~~~~~~ -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_route.CmprInfo +.. autoclass:: pcapkit.protocols.internet.ipv6_route.schema.CmprInfo :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.ipv6_route.PadInfo +.. autoclass:: pcapkit.protocols.internet.ipv6_route.schema.PadInfo :members: :show-inheritance: Auxiliary Functions ~~~~~~~~~~~~~~~~~~~ -.. autofunction:: pcapkit.protocols.schema.internet.ipv6_route.ipv6_route_data_selector -.. autofunction:: pcapkit.protocols.schema.internet.ipv6_route.ipv6_route_data_length -.. autofunction:: pcapkit.protocols.schema.internet.ipv6_route.ipv6_route_header_length +.. autofunction:: pcapkit.protocols.internet.ipv6_route.schema.ipv6_route_data_selector +.. autofunction:: pcapkit.protocols.internet.ipv6_route.schema.ipv6_route_data_length +.. autofunction:: pcapkit.protocols.internet.ipv6_route.schema.ipv6_route_header_length Data Models ----------- -.. module:: pcapkit.protocols.data.internet.ipv6_route +.. module:: pcapkit.protocols.internet.ipv6_route.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.internet.ipv6_route``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.data.internet.ipv6_route.IPv6_Route +.. autoclass:: pcapkit.protocols.internet.ipv6_route.data.IPv6_Route :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv6_route.UnknownType +.. autoclass:: pcapkit.protocols.internet.ipv6_route.data.UnknownType :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv6_route.SourceRoute +.. autoclass:: pcapkit.protocols.internet.ipv6_route.data.SourceRoute :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv6_route.Type2 +.. autoclass:: pcapkit.protocols.internet.ipv6_route.data.Type2 :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipv6_route.RPL +.. autoclass:: pcapkit.protocols.internet.ipv6_route.data.RPL :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/internet/ipx.rst b/docs/source/pcapkit/protocols/internet/ipx.rst index 69f4975337..eada618aa8 100644 --- a/docs/source/pcapkit/protocols/internet/ipx.rst +++ b/docs/source/pcapkit/protocols/internet/ipx.rst @@ -2,9 +2,10 @@ IPX - Internetwork Packet Exchange ================================== .. module:: pcapkit.protocols.internet.ipx +.. module:: pcapkit.protocols.internet.ipx.protocol -:mod:`pcapkit.protocols.internet.ipx` contains -:class:`~pcapkit.protocols.internet.ipx.IPX` only, +:mod:`pcapkit.protocols.internet.ipx.protocol` contains +:class:`~pcapkit.protocols.internet.ipx.protocol.IPX` only, which implements the extractor for Internetwork Packet Exchange (IPX) [*]_, whose structure is described as below: @@ -20,7 +21,7 @@ Octets Bits Name Description 18 144 ``ipx.src`` Source Address ======= ========= ====================== ===================================== -.. autoclass:: pcapkit.protocols.internet.ipx.IPX +.. autoclass:: pcapkit.protocols.internet.ipx.protocol.IPX :no-members: :show-inheritance: @@ -47,22 +48,32 @@ Octets Bits Name Description Header Schemas -------------- -.. module:: pcapkit.protocols.schema.internet.ipx +.. module:: pcapkit.protocols.internet.ipx.schema -.. autoclass:: pcapkit.protocols.schema.internet.ipx.IPX +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.schema.internet.ipx``, with no alias: the module moved here + (:issue:`2534`). + +.. autoclass:: pcapkit.protocols.internet.ipx.schema.IPX :members: :show-inheritance: Data Models ----------- -.. module:: pcapkit.protocols.data.internet.ipx +.. module:: pcapkit.protocols.internet.ipx.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.internet.ipx``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.data.internet.ipx.IPX +.. autoclass:: pcapkit.protocols.internet.ipx.data.IPX :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.ipx.Address +.. autoclass:: pcapkit.protocols.internet.ipx.data.Address :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/internet/mh.rst b/docs/source/pcapkit/protocols/internet/mh.rst index 5bef68ea02..e658990737 100644 --- a/docs/source/pcapkit/protocols/internet/mh.rst +++ b/docs/source/pcapkit/protocols/internet/mh.rst @@ -2,9 +2,19 @@ MH - Mobility Header ==================== .. module:: pcapkit.protocols.internet.mh +.. module:: pcapkit.protocols.internet.mh.protocol -:mod:`pcapkit.protocols.internet.mh` contains -:class:`~pcapkit.protocols.internet.mh.MH`, +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.internet.mh.FastBindingAcknowledgmentStatus``, + ``pcapkit.protocols.internet.mh.IPv6AddressPrefixCode``, + ``pcapkit.protocols.internet.mh.LocalizedRoutingStatus`` and + ``pcapkit.protocols.internet.mh.LMAAddressCode``, with no alias: they are in this + module, and :mod:`pcapkit.protocols.internet.mh` exports the protocol class alone + (:issue:`2534`). + +:mod:`pcapkit.protocols.internet.mh.protocol` contains +:class:`~pcapkit.protocols.internet.mh.protocol.MH`, which implements the extractor for Mobility Header (MH) [*]_, whose structure is described as below: @@ -22,10 +32,10 @@ Octets Bits Name Description .. versionremoved:: 1.5.0 ``pcapkit.protocols.internet.mh.NTPTimestamp``, with no alias; use - :class:`pcapkit.protocols.data.internet.mh.NTPTimestamp` instead + :class:`pcapkit.protocols.internet.mh.data.NTPTimestamp` instead (:issue:`1886`). -.. autoclass:: pcapkit.protocols.internet.mh.MH +.. autoclass:: pcapkit.protocols.internet.mh.protocol.MH :no-members: :show-inheritance: @@ -281,22 +291,22 @@ Octets Bits Name Description Auxiliary Data -------------- -.. autoclass:: pcapkit.protocols.internet.mh.FastBindingAcknowledgmentStatus +.. autoclass:: pcapkit.protocols.internet.mh.protocol.FastBindingAcknowledgmentStatus :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.internet.mh.IPv6AddressPrefixCode +.. autoclass:: pcapkit.protocols.internet.mh.protocol.IPv6AddressPrefixCode :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.internet.mh.LocalizedRoutingStatus +.. autoclass:: pcapkit.protocols.internet.mh.protocol.LocalizedRoutingStatus :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.internet.mh.LMAAddressCode +.. autoclass:: pcapkit.protocols.internet.mh.protocol.LMAAddressCode :members: :undoc-members: :show-inheritance: @@ -304,677 +314,682 @@ Auxiliary Data Header Schemas -------------- -.. module:: pcapkit.protocols.schema.internet.mh +.. module:: pcapkit.protocols.internet.mh.schema + +.. versionremoved:: 1.6.0 -.. autoclass:: pcapkit.protocols.schema.internet.mh.MH + ``pcapkit.protocols.schema.internet.mh``, with no alias: the module moved here + (:issue:`2534`). + +.. autoclass:: pcapkit.protocols.internet.mh.schema.MH :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.Option +.. autoclass:: pcapkit.protocols.internet.mh.schema.Option :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.UnassignedOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.UnassignedOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.PadOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.PadOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.BindingRefreshAdviceOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.BindingRefreshAdviceOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.AlternateCareofAddressOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.AlternateCareofAddressOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.NonceIndicesOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.NonceIndicesOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.AuthorizationDataOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.AuthorizationDataOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.MobileNetworkPrefixOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.MobileNetworkPrefixOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.LinkLayerAddressOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.LinkLayerAddressOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.MNIDOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.MNIDOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.AuthOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.AuthOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.MesgIDOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.MesgIDOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.CGAParametersRequestOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.CGAParametersRequestOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.CGAExtension +.. autoclass:: pcapkit.protocols.internet.mh.schema.CGAExtension :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.CGAParameter +.. autoclass:: pcapkit.protocols.internet.mh.schema.CGAParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.CGAParametersOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.CGAParametersOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.UnknownExtension +.. autoclass:: pcapkit.protocols.internet.mh.schema.UnknownExtension :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.MultiPrefixExtension +.. autoclass:: pcapkit.protocols.internet.mh.schema.MultiPrefixExtension :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.Packet +.. autoclass:: pcapkit.protocols.internet.mh.schema.Packet :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.SignatureOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.SignatureOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.PermanentHomeKeygenTokenOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.PermanentHomeKeygenTokenOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.CareofTestInitOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.CareofTestInitOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.CareofTestOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.CareofTestOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.ExperimentalMobilityOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.ExperimentalMobilityOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.BADFOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.BADFOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.IPv6AddressPrefixOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.IPv6AddressPrefixOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.UnknownMessage +.. autoclass:: pcapkit.protocols.internet.mh.schema.UnknownMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.BindingRefreshRequestMessage +.. autoclass:: pcapkit.protocols.internet.mh.schema.BindingRefreshRequestMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.HomeTestInitMessage +.. autoclass:: pcapkit.protocols.internet.mh.schema.HomeTestInitMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.CareofTestInitMessage +.. autoclass:: pcapkit.protocols.internet.mh.schema.CareofTestInitMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.HomeTestMessage +.. autoclass:: pcapkit.protocols.internet.mh.schema.HomeTestMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.CareofTestMessage +.. autoclass:: pcapkit.protocols.internet.mh.schema.CareofTestMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.BindingUpdateMessage +.. autoclass:: pcapkit.protocols.internet.mh.schema.BindingUpdateMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.BindingAcknowledgementMessage +.. autoclass:: pcapkit.protocols.internet.mh.schema.BindingAcknowledgementMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.BindingErrorMessage +.. autoclass:: pcapkit.protocols.internet.mh.schema.BindingErrorMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.FastBindingUpdateMessage +.. autoclass:: pcapkit.protocols.internet.mh.schema.FastBindingUpdateMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.FastBindingAcknowledgmentMessage +.. autoclass:: pcapkit.protocols.internet.mh.schema.FastBindingAcknowledgmentMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.FastNeighborAdvertisementMessage +.. autoclass:: pcapkit.protocols.internet.mh.schema.FastNeighborAdvertisementMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.ExperimentalMessage +.. autoclass:: pcapkit.protocols.internet.mh.schema.ExperimentalMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.HandoverInitiateMessage +.. autoclass:: pcapkit.protocols.internet.mh.schema.HandoverInitiateMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.HandoverAcknowledgeMessage +.. autoclass:: pcapkit.protocols.internet.mh.schema.HandoverAcknowledgeMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.HeartbeatMessage +.. autoclass:: pcapkit.protocols.internet.mh.schema.HeartbeatMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.HomeAgentSwitchMessage +.. autoclass:: pcapkit.protocols.internet.mh.schema.HomeAgentSwitchMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.BindingRevocationMessage +.. autoclass:: pcapkit.protocols.internet.mh.schema.BindingRevocationMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.LocalizedRoutingInitiationMessage +.. autoclass:: pcapkit.protocols.internet.mh.schema.LocalizedRoutingInitiationMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.LocalizedRoutingAcknowledgmentMessage +.. autoclass:: pcapkit.protocols.internet.mh.schema.LocalizedRoutingAcknowledgmentMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.UpdateNotificationMessage +.. autoclass:: pcapkit.protocols.internet.mh.schema.UpdateNotificationMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.UpdateNotificationAcknowledgementMessage +.. autoclass:: pcapkit.protocols.internet.mh.schema.UpdateNotificationAcknowledgementMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.FlowBindingMessage +.. autoclass:: pcapkit.protocols.internet.mh.schema.FlowBindingMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.SubscriptionQueryMessage +.. autoclass:: pcapkit.protocols.internet.mh.schema.SubscriptionQueryMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.SubscriptionResponseMessage +.. autoclass:: pcapkit.protocols.internet.mh.schema.SubscriptionResponseMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.HomeNetworkPrefixOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.HomeNetworkPrefixOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.HandoffIndicatorOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.HandoffIndicatorOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.AccessTechnologyTypeOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.AccessTechnologyTypeOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.MNLLIdentifierOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.MNLLIdentifierOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.LinkLocalAddressOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.LinkLocalAddressOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.TimestampOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.TimestampOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.RestartCounterOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.RestartCounterOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.DNSUpdateOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.DNSUpdateOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.VendorSpecificOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.VendorSpecificOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.ServiceSelectionOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.ServiceSelectionOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.IPv4HomeAddressOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.IPv4HomeAddressOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.IPv4AddressAcknowledgementOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.IPv4AddressAcknowledgementOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.NATDetectionOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.NATDetectionOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.IPv4CareofAddressOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.IPv4CareofAddressOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.GREKeyOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.GREKeyOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.BindingIdentifierOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.BindingIdentifierOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.IPv4HomeAddressRequestOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.IPv4HomeAddressRequestOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.IPv4HomeAddressReplyOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.IPv4HomeAddressReplyOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.IPv4DefaultRouterAddressOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.IPv4DefaultRouterAddressOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.IPv4DHCPSupportModeOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.IPv4DHCPSupportModeOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.ContextRequestOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.ContextRequestOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.LMAAddressOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.LMAAddressOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.MNLLAIIDOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.MNLLAIIDOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.TransientBindingOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.TransientBindingOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.FlowSummaryOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.FlowSummaryOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.FlowIdentificationOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.FlowIdentificationOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.RedirectCapabilityOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.RedirectCapabilityOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.RedirectOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.RedirectOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.LoadInformationOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.LoadInformationOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.AlternateIPv4CareofAddressOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.AlternateIPv4CareofAddressOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.MNGroupIdentifierOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.MNGroupIdentifierOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.MAGIPv6AddressOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.MAGIPv6AddressOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.AccessNetworkIdentifierOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.AccessNetworkIdentifierOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.IPv4TrafficOffloadSelectorOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.IPv4TrafficOffloadSelectorOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.DynamicIPMulticastSelectorOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.DynamicIPMulticastSelectorOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.DelegatedMNPOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.DelegatedMNPOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.ActiveMulticastSubscriptionIPv4Option +.. autoclass:: pcapkit.protocols.internet.mh.schema.ActiveMulticastSubscriptionIPv4Option :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.ActiveMulticastSubscriptionIPv6Option +.. autoclass:: pcapkit.protocols.internet.mh.schema.ActiveMulticastSubscriptionIPv6Option :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.QualityOfServiceOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.QualityOfServiceOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.LMAUserPlaneAddressOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.LMAUserPlaneAddressOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.MulticastMobilityOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.MulticastMobilityOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.MulticastAcknowledgementOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.MulticastAcknowledgementOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.LMAControlledMAGParametersOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.LMAControlledMAGParametersOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.MAGMultipathBindingOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.MAGMultipathBindingOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.MAGIdentifierOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.MAGIdentifierOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.AnchoredPrefixOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.AnchoredPrefixOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.LocalPrefixOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.LocalPrefixOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.PreviousMAAROption +.. autoclass:: pcapkit.protocols.internet.mh.schema.PreviousMAAROption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.ServingMAAROption +.. autoclass:: pcapkit.protocols.internet.mh.schema.ServingMAAROption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.DLIFLinkLocalAddressOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.DLIFLinkLocalAddressOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.DLIFLinkLayerAddressOption +.. autoclass:: pcapkit.protocols.internet.mh.schema.DLIFLinkLayerAddressOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.FlowIdentificationSuboption +.. autoclass:: pcapkit.protocols.internet.mh.schema.FlowIdentificationSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.UnassignedFlowIdentificationSuboption +.. autoclass:: pcapkit.protocols.internet.mh.schema.UnassignedFlowIdentificationSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.PadFlowIdentificationSuboption +.. autoclass:: pcapkit.protocols.internet.mh.schema.PadFlowIdentificationSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.BIDReferenceSuboption +.. autoclass:: pcapkit.protocols.internet.mh.schema.BIDReferenceSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.TrafficSelectorSuboption +.. autoclass:: pcapkit.protocols.internet.mh.schema.TrafficSelectorSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.FlowBindingActionSuboption +.. autoclass:: pcapkit.protocols.internet.mh.schema.FlowBindingActionSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.TargetCareofAddressSuboption +.. autoclass:: pcapkit.protocols.internet.mh.schema.TargetCareofAddressSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.ANISuboption +.. autoclass:: pcapkit.protocols.internet.mh.schema.ANISuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.UnassignedANISuboption +.. autoclass:: pcapkit.protocols.internet.mh.schema.UnassignedANISuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.ANINetworkIdentifierSuboption +.. autoclass:: pcapkit.protocols.internet.mh.schema.ANINetworkIdentifierSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.ANIGeoLocationSuboption +.. autoclass:: pcapkit.protocols.internet.mh.schema.ANIGeoLocationSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.ANIOperatorIdentifierSuboption +.. autoclass:: pcapkit.protocols.internet.mh.schema.ANIOperatorIdentifierSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.ANICivicLocationSuboption +.. autoclass:: pcapkit.protocols.internet.mh.schema.ANICivicLocationSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.ANIMAGGroupIdentifierSuboption +.. autoclass:: pcapkit.protocols.internet.mh.schema.ANIMAGGroupIdentifierSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.ANIUpdateTimerSuboption +.. autoclass:: pcapkit.protocols.internet.mh.schema.ANIUpdateTimerSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.QoSAttribute +.. autoclass:: pcapkit.protocols.internet.mh.schema.QoSAttribute :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.UnassignedQoSAttribute +.. autoclass:: pcapkit.protocols.internet.mh.schema.UnassignedQoSAttribute :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.BitRateAttribute +.. autoclass:: pcapkit.protocols.internet.mh.schema.BitRateAttribute :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.PerSessionBitRateAttribute +.. autoclass:: pcapkit.protocols.internet.mh.schema.PerSessionBitRateAttribute :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.AllocationRetentionPriorityAttribute +.. autoclass:: pcapkit.protocols.internet.mh.schema.AllocationRetentionPriorityAttribute :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.QoSTrafficSelectorAttribute +.. autoclass:: pcapkit.protocols.internet.mh.schema.QoSTrafficSelectorAttribute :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.QoSVendorSpecificAttribute +.. autoclass:: pcapkit.protocols.internet.mh.schema.QoSVendorSpecificAttribute :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.LMAControlledMAGSuboption +.. autoclass:: pcapkit.protocols.internet.mh.schema.LMAControlledMAGSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.UnassignedLMAControlledMAGSuboption +.. autoclass:: pcapkit.protocols.internet.mh.schema.UnassignedLMAControlledMAGSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.BindingReregistrationControlSuboption +.. autoclass:: pcapkit.protocols.internet.mh.schema.BindingReregistrationControlSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.HeartbeatControlSuboption +.. autoclass:: pcapkit.protocols.internet.mh.schema.HeartbeatControlSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.ExperimentalExtension +.. autoclass:: pcapkit.protocols.internet.mh.schema.ExperimentalExtension :members: :show-inheritance: Type Stubs ~~~~~~~~~~ -.. autoclass:: pcapkit.protocols.schema.internet.mh.ANSIKeyLengthTest +.. autoclass:: pcapkit.protocols.internet.mh.schema.ANSIKeyLengthTest :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.MultiPrefixExtensionFlags +.. autoclass:: pcapkit.protocols.internet.mh.schema.MultiPrefixExtensionFlags :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.BindingUpdateMessageFlags +.. autoclass:: pcapkit.protocols.internet.mh.schema.BindingUpdateMessageFlags :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.BindingAcknowledgementMessageFlags +.. autoclass:: pcapkit.protocols.internet.mh.schema.BindingAcknowledgementMessageFlags :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.FastBindingUpdateMessageFlags +.. autoclass:: pcapkit.protocols.internet.mh.schema.FastBindingUpdateMessageFlags :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.FastBindingAcknowledgmentMessageFlags +.. autoclass:: pcapkit.protocols.internet.mh.schema.FastBindingAcknowledgmentMessageFlags :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.HandoverInitiateMessageFlags +.. autoclass:: pcapkit.protocols.internet.mh.schema.HandoverInitiateMessageFlags :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.HandoverAcknowledgeMessageFlags +.. autoclass:: pcapkit.protocols.internet.mh.schema.HandoverAcknowledgeMessageFlags :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.HeartbeatMessageFlags +.. autoclass:: pcapkit.protocols.internet.mh.schema.HeartbeatMessageFlags :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.FixedPointTimestamp +.. autoclass:: pcapkit.protocols.internet.mh.schema.FixedPointTimestamp :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.BindingRevocationMessageFlags +.. autoclass:: pcapkit.protocols.internet.mh.schema.BindingRevocationMessageFlags :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.LocalizedRoutingAcknowledgmentMessageFlags +.. autoclass:: pcapkit.protocols.internet.mh.schema.LocalizedRoutingAcknowledgmentMessageFlags :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.FlowBindingMessageFlags +.. autoclass:: pcapkit.protocols.internet.mh.schema.FlowBindingMessageFlags :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.UpdateNotificationMessageFlags +.. autoclass:: pcapkit.protocols.internet.mh.schema.UpdateNotificationMessageFlags :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.SubscriptionResponseMessageFlags +.. autoclass:: pcapkit.protocols.internet.mh.schema.SubscriptionResponseMessageFlags :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.DNSUpdateOptionFlags +.. autoclass:: pcapkit.protocols.internet.mh.schema.DNSUpdateOptionFlags :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.IPv4HomeAddressOptionFlags +.. autoclass:: pcapkit.protocols.internet.mh.schema.IPv4HomeAddressOptionFlags :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.PrefixLengthOnly +.. autoclass:: pcapkit.protocols.internet.mh.schema.PrefixLengthOnly :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.NATDetectionOptionFlags +.. autoclass:: pcapkit.protocols.internet.mh.schema.NATDetectionOptionFlags :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.IPv4DHCPSupportModeOptionFlags +.. autoclass:: pcapkit.protocols.internet.mh.schema.IPv4DHCPSupportModeOptionFlags :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.RedirectOptionFlags +.. autoclass:: pcapkit.protocols.internet.mh.schema.RedirectOptionFlags :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.BindingIdentifierOptionFlags +.. autoclass:: pcapkit.protocols.internet.mh.schema.BindingIdentifierOptionFlags :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.TransientBindingOptionFlags +.. autoclass:: pcapkit.protocols.internet.mh.schema.TransientBindingOptionFlags :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.ModeFlagOnly +.. autoclass:: pcapkit.protocols.internet.mh.schema.ModeFlagOnly :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.DelegatedMNPOptionFlags +.. autoclass:: pcapkit.protocols.internet.mh.schema.DelegatedMNPOptionFlags :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.MAGMultipathBindingOptionFlags +.. autoclass:: pcapkit.protocols.internet.mh.schema.MAGMultipathBindingOptionFlags :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.ANINetworkIdentifierFlags +.. autoclass:: pcapkit.protocols.internet.mh.schema.ANINetworkIdentifierFlags :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.GeoLocationDegrees +.. autoclass:: pcapkit.protocols.internet.mh.schema.GeoLocationDegrees :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.SessionBitRateFlags +.. autoclass:: pcapkit.protocols.internet.mh.schema.SessionBitRateFlags :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.internet.mh.AllocationRetentionPriorityFields +.. autoclass:: pcapkit.protocols.internet.mh.schema.AllocationRetentionPriorityFields :members: :undoc-members: :show-inheritance: @@ -982,190 +997,195 @@ Type Stubs Auxiliary Functions ~~~~~~~~~~~~~~~~~~~ -.. autofunction:: pcapkit.protocols.schema.internet.mh.mh_data_selector -.. autofunction:: pcapkit.protocols.schema.internet.mh.mn_id_selector -.. autofunction:: pcapkit.protocols.schema.internet.mh.pad_opt_data_len -.. autofunction:: pcapkit.protocols.schema.internet.mh.bid_address_selector -.. autofunction:: pcapkit.protocols.schema.internet.mh.br_code_selector -.. autofunction:: pcapkit.protocols.schema.internet.mh.cga_public_key_length -.. autofunction:: pcapkit.protocols.schema.internet.mh.item_list_length -.. autofunction:: pcapkit.protocols.schema.internet.mh.dmnp_prefix_selector -.. autofunction:: pcapkit.protocols.schema.internet.mh.fb_code_selector -.. autofunction:: pcapkit.protocols.schema.internet.mh.lma_address_selector -.. autofunction:: pcapkit.protocols.schema.internet.mh.lma_user_plane_selector -.. autofunction:: pcapkit.protocols.schema.internet.mh.pad_subopt_data_len -.. autofunction:: pcapkit.protocols.schema.internet.mh.target_coa_selector +.. autofunction:: pcapkit.protocols.internet.mh.schema.mh_data_selector +.. autofunction:: pcapkit.protocols.internet.mh.schema.mn_id_selector +.. autofunction:: pcapkit.protocols.internet.mh.schema.pad_opt_data_len +.. autofunction:: pcapkit.protocols.internet.mh.schema.bid_address_selector +.. autofunction:: pcapkit.protocols.internet.mh.schema.br_code_selector +.. autofunction:: pcapkit.protocols.internet.mh.schema.cga_public_key_length +.. autofunction:: pcapkit.protocols.internet.mh.schema.item_list_length +.. autofunction:: pcapkit.protocols.internet.mh.schema.dmnp_prefix_selector +.. autofunction:: pcapkit.protocols.internet.mh.schema.fb_code_selector +.. autofunction:: pcapkit.protocols.internet.mh.schema.lma_address_selector +.. autofunction:: pcapkit.protocols.internet.mh.schema.lma_user_plane_selector +.. autofunction:: pcapkit.protocols.internet.mh.schema.pad_subopt_data_len +.. autofunction:: pcapkit.protocols.internet.mh.schema.target_coa_selector Data Models ----------- -.. module:: pcapkit.protocols.data.internet.mh +.. module:: pcapkit.protocols.internet.mh.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.internet.mh``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.data.internet.mh.MH +.. autoclass:: pcapkit.protocols.internet.mh.data.MH :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.Option +.. autoclass:: pcapkit.protocols.internet.mh.data.Option :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.UnassignedOption +.. autoclass:: pcapkit.protocols.internet.mh.data.UnassignedOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.PadOption +.. autoclass:: pcapkit.protocols.internet.mh.data.PadOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.BindingRefreshAdviceOption +.. autoclass:: pcapkit.protocols.internet.mh.data.BindingRefreshAdviceOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.AlternateCareofAddressOption +.. autoclass:: pcapkit.protocols.internet.mh.data.AlternateCareofAddressOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.NonceIndicesOption +.. autoclass:: pcapkit.protocols.internet.mh.data.NonceIndicesOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.AuthorizationDataOption +.. autoclass:: pcapkit.protocols.internet.mh.data.AuthorizationDataOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.MobileNetworkPrefixOption +.. autoclass:: pcapkit.protocols.internet.mh.data.MobileNetworkPrefixOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.LinkLayerAddressOption +.. autoclass:: pcapkit.protocols.internet.mh.data.LinkLayerAddressOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.MNIDOption +.. autoclass:: pcapkit.protocols.internet.mh.data.MNIDOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.AuthOption +.. autoclass:: pcapkit.protocols.internet.mh.data.AuthOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.MesgIDOption +.. autoclass:: pcapkit.protocols.internet.mh.data.MesgIDOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.NTPTimestamp +.. autoclass:: pcapkit.protocols.internet.mh.data.NTPTimestamp :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.CGAParametersRequestOption +.. autoclass:: pcapkit.protocols.internet.mh.data.CGAParametersRequestOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.CGAExtension +.. autoclass:: pcapkit.protocols.internet.mh.data.CGAExtension :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.CGAParameter +.. autoclass:: pcapkit.protocols.internet.mh.data.CGAParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.CGAParametersOption +.. autoclass:: pcapkit.protocols.internet.mh.data.CGAParametersOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.UnknownExtension +.. autoclass:: pcapkit.protocols.internet.mh.data.UnknownExtension :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.MultiPrefixExtension +.. autoclass:: pcapkit.protocols.internet.mh.data.MultiPrefixExtension :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.SignatureOption +.. autoclass:: pcapkit.protocols.internet.mh.data.SignatureOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.PermanentHomeKeygenTokenOption +.. autoclass:: pcapkit.protocols.internet.mh.data.PermanentHomeKeygenTokenOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.CareofTestInitOption +.. autoclass:: pcapkit.protocols.internet.mh.data.CareofTestInitOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.CareofTestOption +.. autoclass:: pcapkit.protocols.internet.mh.data.CareofTestOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.ExperimentalMobilityOption +.. autoclass:: pcapkit.protocols.internet.mh.data.ExperimentalMobilityOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.BADFOption +.. autoclass:: pcapkit.protocols.internet.mh.data.BADFOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.IPv6AddressPrefixOption +.. autoclass:: pcapkit.protocols.internet.mh.data.IPv6AddressPrefixOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.UnknownMessage +.. autoclass:: pcapkit.protocols.internet.mh.data.UnknownMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.BindingRefreshRequestMessage +.. autoclass:: pcapkit.protocols.internet.mh.data.BindingRefreshRequestMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.HomeTestInitMessage +.. autoclass:: pcapkit.protocols.internet.mh.data.HomeTestInitMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.CareofTestInitMessage +.. autoclass:: pcapkit.protocols.internet.mh.data.CareofTestInitMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.HomeTestMessage +.. autoclass:: pcapkit.protocols.internet.mh.data.HomeTestMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.CareofTestMessage +.. autoclass:: pcapkit.protocols.internet.mh.data.CareofTestMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.BindingUpdateMessage +.. autoclass:: pcapkit.protocols.internet.mh.data.BindingUpdateMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.BindingAcknowledgementMessage +.. autoclass:: pcapkit.protocols.internet.mh.data.BindingAcknowledgementMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.BindingErrorMessage +.. autoclass:: pcapkit.protocols.internet.mh.data.BindingErrorMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.FastBindingUpdateMessage +.. autoclass:: pcapkit.protocols.internet.mh.data.FastBindingUpdateMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.FastBindingAcknowledgmentMessage +.. autoclass:: pcapkit.protocols.internet.mh.data.FastBindingAcknowledgmentMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.FastNeighborAdvertisementMessage +.. autoclass:: pcapkit.protocols.internet.mh.data.FastNeighborAdvertisementMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.ExperimentalMessage +.. autoclass:: pcapkit.protocols.internet.mh.data.ExperimentalMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.HandoverInitiateMessage +.. autoclass:: pcapkit.protocols.internet.mh.data.HandoverInitiateMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.HandoverAcknowledgeMessage +.. autoclass:: pcapkit.protocols.internet.mh.data.HandoverAcknowledgeMessage :members: :show-inheritance: @@ -1173,362 +1193,362 @@ Data Models .. [*] https://en.wikipedia.org/wiki/Mobile_IP#Changes_in_IPv6_for_Mobile_IPv6 -.. autoclass:: pcapkit.protocols.data.internet.mh.HeartbeatMessage +.. autoclass:: pcapkit.protocols.internet.mh.data.HeartbeatMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.HomeAgentSwitchMessage +.. autoclass:: pcapkit.protocols.internet.mh.data.HomeAgentSwitchMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.BindingRevocationMessage +.. autoclass:: pcapkit.protocols.internet.mh.data.BindingRevocationMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.LocalizedRoutingInitiationMessage +.. autoclass:: pcapkit.protocols.internet.mh.data.LocalizedRoutingInitiationMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.LocalizedRoutingAcknowledgmentMessage +.. autoclass:: pcapkit.protocols.internet.mh.data.LocalizedRoutingAcknowledgmentMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.UpdateNotificationMessage +.. autoclass:: pcapkit.protocols.internet.mh.data.UpdateNotificationMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.UpdateNotificationAcknowledgementMessage +.. autoclass:: pcapkit.protocols.internet.mh.data.UpdateNotificationAcknowledgementMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.FlowBindingMessage +.. autoclass:: pcapkit.protocols.internet.mh.data.FlowBindingMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.SubscriptionQueryMessage +.. autoclass:: pcapkit.protocols.internet.mh.data.SubscriptionQueryMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.SubscriptionResponseMessage +.. autoclass:: pcapkit.protocols.internet.mh.data.SubscriptionResponseMessage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.HomeNetworkPrefixOption +.. autoclass:: pcapkit.protocols.internet.mh.data.HomeNetworkPrefixOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.HandoffIndicatorOption +.. autoclass:: pcapkit.protocols.internet.mh.data.HandoffIndicatorOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.AccessTechnologyTypeOption +.. autoclass:: pcapkit.protocols.internet.mh.data.AccessTechnologyTypeOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.MNLLIdentifierOption +.. autoclass:: pcapkit.protocols.internet.mh.data.MNLLIdentifierOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.LinkLocalAddressOption +.. autoclass:: pcapkit.protocols.internet.mh.data.LinkLocalAddressOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.TimestampOption +.. autoclass:: pcapkit.protocols.internet.mh.data.TimestampOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.PMIPv6Timestamp +.. autoclass:: pcapkit.protocols.internet.mh.data.PMIPv6Timestamp :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.RestartCounterOption +.. autoclass:: pcapkit.protocols.internet.mh.data.RestartCounterOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.DNSUpdateOption +.. autoclass:: pcapkit.protocols.internet.mh.data.DNSUpdateOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.VendorSpecificOption +.. autoclass:: pcapkit.protocols.internet.mh.data.VendorSpecificOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.ServiceSelectionOption +.. autoclass:: pcapkit.protocols.internet.mh.data.ServiceSelectionOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.IPv4HomeAddressOption +.. autoclass:: pcapkit.protocols.internet.mh.data.IPv4HomeAddressOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.IPv4AddressAcknowledgementOption +.. autoclass:: pcapkit.protocols.internet.mh.data.IPv4AddressAcknowledgementOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.NATDetectionOption +.. autoclass:: pcapkit.protocols.internet.mh.data.NATDetectionOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.IPv4CareofAddressOption +.. autoclass:: pcapkit.protocols.internet.mh.data.IPv4CareofAddressOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.GREKeyOption +.. autoclass:: pcapkit.protocols.internet.mh.data.GREKeyOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.BindingIdentifierOption +.. autoclass:: pcapkit.protocols.internet.mh.data.BindingIdentifierOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.IPv4HomeAddressRequestOption +.. autoclass:: pcapkit.protocols.internet.mh.data.IPv4HomeAddressRequestOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.IPv4HomeAddressReplyOption +.. autoclass:: pcapkit.protocols.internet.mh.data.IPv4HomeAddressReplyOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.IPv4DefaultRouterAddressOption +.. autoclass:: pcapkit.protocols.internet.mh.data.IPv4DefaultRouterAddressOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.IPv4DHCPSupportModeOption +.. autoclass:: pcapkit.protocols.internet.mh.data.IPv4DHCPSupportModeOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.ContextRequestOption +.. autoclass:: pcapkit.protocols.internet.mh.data.ContextRequestOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.LMAAddressOption +.. autoclass:: pcapkit.protocols.internet.mh.data.LMAAddressOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.MNLLAIIDOption +.. autoclass:: pcapkit.protocols.internet.mh.data.MNLLAIIDOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.TransientBindingOption +.. autoclass:: pcapkit.protocols.internet.mh.data.TransientBindingOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.FlowSummaryOption +.. autoclass:: pcapkit.protocols.internet.mh.data.FlowSummaryOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.FlowIdentificationOption +.. autoclass:: pcapkit.protocols.internet.mh.data.FlowIdentificationOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.RedirectCapabilityOption +.. autoclass:: pcapkit.protocols.internet.mh.data.RedirectCapabilityOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.RedirectOption +.. autoclass:: pcapkit.protocols.internet.mh.data.RedirectOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.LoadInformationOption +.. autoclass:: pcapkit.protocols.internet.mh.data.LoadInformationOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.AlternateIPv4CareofAddressOption +.. autoclass:: pcapkit.protocols.internet.mh.data.AlternateIPv4CareofAddressOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.MNGroupIdentifierOption +.. autoclass:: pcapkit.protocols.internet.mh.data.MNGroupIdentifierOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.MAGIPv6AddressOption +.. autoclass:: pcapkit.protocols.internet.mh.data.MAGIPv6AddressOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.AccessNetworkIdentifierOption +.. autoclass:: pcapkit.protocols.internet.mh.data.AccessNetworkIdentifierOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.IPv4TrafficOffloadSelectorOption +.. autoclass:: pcapkit.protocols.internet.mh.data.IPv4TrafficOffloadSelectorOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.DynamicIPMulticastSelectorOption +.. autoclass:: pcapkit.protocols.internet.mh.data.DynamicIPMulticastSelectorOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.DelegatedMNPOption +.. autoclass:: pcapkit.protocols.internet.mh.data.DelegatedMNPOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.ActiveMulticastSubscriptionIPv4Option +.. autoclass:: pcapkit.protocols.internet.mh.data.ActiveMulticastSubscriptionIPv4Option :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.ActiveMulticastSubscriptionIPv6Option +.. autoclass:: pcapkit.protocols.internet.mh.data.ActiveMulticastSubscriptionIPv6Option :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.QualityOfServiceOption +.. autoclass:: pcapkit.protocols.internet.mh.data.QualityOfServiceOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.LMAUserPlaneAddressOption +.. autoclass:: pcapkit.protocols.internet.mh.data.LMAUserPlaneAddressOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.MulticastMobilityOption +.. autoclass:: pcapkit.protocols.internet.mh.data.MulticastMobilityOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.MulticastAcknowledgementOption +.. autoclass:: pcapkit.protocols.internet.mh.data.MulticastAcknowledgementOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.LMAControlledMAGParametersOption +.. autoclass:: pcapkit.protocols.internet.mh.data.LMAControlledMAGParametersOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.MAGMultipathBindingOption +.. autoclass:: pcapkit.protocols.internet.mh.data.MAGMultipathBindingOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.MAGIdentifierOption +.. autoclass:: pcapkit.protocols.internet.mh.data.MAGIdentifierOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.AnchoredPrefixOption +.. autoclass:: pcapkit.protocols.internet.mh.data.AnchoredPrefixOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.LocalPrefixOption +.. autoclass:: pcapkit.protocols.internet.mh.data.LocalPrefixOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.PreviousMAAROption +.. autoclass:: pcapkit.protocols.internet.mh.data.PreviousMAAROption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.ServingMAAROption +.. autoclass:: pcapkit.protocols.internet.mh.data.ServingMAAROption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.DLIFLinkLocalAddressOption +.. autoclass:: pcapkit.protocols.internet.mh.data.DLIFLinkLocalAddressOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.DLIFLinkLayerAddressOption +.. autoclass:: pcapkit.protocols.internet.mh.data.DLIFLinkLayerAddressOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.ContextRequest +.. autoclass:: pcapkit.protocols.internet.mh.data.ContextRequest :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.FlowIdentificationSuboption +.. autoclass:: pcapkit.protocols.internet.mh.data.FlowIdentificationSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.UnassignedFlowIdentificationSuboption +.. autoclass:: pcapkit.protocols.internet.mh.data.UnassignedFlowIdentificationSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.PadFlowIdentificationSuboption +.. autoclass:: pcapkit.protocols.internet.mh.data.PadFlowIdentificationSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.BIDReferenceSuboption +.. autoclass:: pcapkit.protocols.internet.mh.data.BIDReferenceSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.TrafficSelectorSuboption +.. autoclass:: pcapkit.protocols.internet.mh.data.TrafficSelectorSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.FlowBindingActionSuboption +.. autoclass:: pcapkit.protocols.internet.mh.data.FlowBindingActionSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.TargetCareofAddressSuboption +.. autoclass:: pcapkit.protocols.internet.mh.data.TargetCareofAddressSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.ANISuboption +.. autoclass:: pcapkit.protocols.internet.mh.data.ANISuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.UnassignedANISuboption +.. autoclass:: pcapkit.protocols.internet.mh.data.UnassignedANISuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.ANINetworkIdentifierSuboption +.. autoclass:: pcapkit.protocols.internet.mh.data.ANINetworkIdentifierSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.ANIGeoLocationSuboption +.. autoclass:: pcapkit.protocols.internet.mh.data.ANIGeoLocationSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.ANIOperatorIdentifierSuboption +.. autoclass:: pcapkit.protocols.internet.mh.data.ANIOperatorIdentifierSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.ANICivicLocationSuboption +.. autoclass:: pcapkit.protocols.internet.mh.data.ANICivicLocationSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.ANIMAGGroupIdentifierSuboption +.. autoclass:: pcapkit.protocols.internet.mh.data.ANIMAGGroupIdentifierSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.ANIUpdateTimerSuboption +.. autoclass:: pcapkit.protocols.internet.mh.data.ANIUpdateTimerSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.QoSAttribute +.. autoclass:: pcapkit.protocols.internet.mh.data.QoSAttribute :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.UnassignedQoSAttribute +.. autoclass:: pcapkit.protocols.internet.mh.data.UnassignedQoSAttribute :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.BitRateAttribute +.. autoclass:: pcapkit.protocols.internet.mh.data.BitRateAttribute :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.PerSessionBitRateAttribute +.. autoclass:: pcapkit.protocols.internet.mh.data.PerSessionBitRateAttribute :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.AllocationRetentionPriorityAttribute +.. autoclass:: pcapkit.protocols.internet.mh.data.AllocationRetentionPriorityAttribute :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.QoSTrafficSelectorAttribute +.. autoclass:: pcapkit.protocols.internet.mh.data.QoSTrafficSelectorAttribute :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.QoSVendorSpecificAttribute +.. autoclass:: pcapkit.protocols.internet.mh.data.QoSVendorSpecificAttribute :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.LMAControlledMAGSuboption +.. autoclass:: pcapkit.protocols.internet.mh.data.LMAControlledMAGSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.UnassignedLMAControlledMAGSuboption +.. autoclass:: pcapkit.protocols.internet.mh.data.UnassignedLMAControlledMAGSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.BindingReregistrationControlSuboption +.. autoclass:: pcapkit.protocols.internet.mh.data.BindingReregistrationControlSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.HeartbeatControlSuboption +.. autoclass:: pcapkit.protocols.internet.mh.data.HeartbeatControlSuboption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.internet.mh.ExperimentalExtension +.. autoclass:: pcapkit.protocols.internet.mh.data.ExperimentalExtension :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/link/arp.rst b/docs/source/pcapkit/protocols/link/arp.rst index aabe50fb2c..1358a08d56 100644 --- a/docs/source/pcapkit/protocols/link/arp.rst +++ b/docs/source/pcapkit/protocols/link/arp.rst @@ -2,9 +2,17 @@ ARP - Address Resolution Protocol ================================= .. module:: pcapkit.protocols.link.arp +.. module:: pcapkit.protocols.link.arp.protocol -:mod:`pcapkit.protocols.link.arp` contains -:class:`~pcapkit.protocols.link.arp.ARP` only, +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.link.arp.PAT_MAC_ADDR``, with no alias: + :meth:`~pcapkit.protocols.protocol.Protocol._read_mac_addr` and + :meth:`~pcapkit.protocols.protocol.Protocol._make_mac_addr` read and make the address + (:issue:`2614`). + +:mod:`pcapkit.protocols.link.arp.protocol` contains +:class:`~pcapkit.protocols.link.arp.protocol.ARP` only, which implements an extractor for Address Resolution Protocol (ARP) [*]_, whose structure is described as below: @@ -36,10 +44,10 @@ below: .. versionremoved:: 1.6.0 ``pcapkit.protocols.link.arp.InARP``, with no alias. The class moved to - :mod:`pcapkit.protocols.link.inarp`, since a module holds one protocol + :mod:`pcapkit.protocols.link.inarp.protocol`, since a module holds one protocol class, named after it (:issue:`2529`). -.. autoclass:: pcapkit.protocols.link.arp.ARP +.. autoclass:: pcapkit.protocols.link.arp.protocol.ARP :no-members: :show-inheritance: @@ -67,26 +75,36 @@ below: Header Schemas -------------- -.. module:: pcapkit.protocols.schema.link.arp +.. module:: pcapkit.protocols.link.arp.schema + +.. versionremoved:: 1.6.0 -.. autoclass:: pcapkit.protocols.schema.link.arp.ARP + ``pcapkit.protocols.schema.link.arp``, with no alias: the module moved here + (:issue:`2534`). + +.. autoclass:: pcapkit.protocols.link.arp.schema.ARP :members: :show-inheritance: Data Models ----------- -.. module:: pcapkit.protocols.data.link.arp +.. module:: pcapkit.protocols.link.arp.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.link.arp``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.data.link.arp.ARP +.. autoclass:: pcapkit.protocols.link.arp.data.ARP :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.arp.Address +.. autoclass:: pcapkit.protocols.link.arp.data.Address :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.arp.Type +.. autoclass:: pcapkit.protocols.link.arp.data.Type :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/link/c_tag.rst b/docs/source/pcapkit/protocols/link/c_tag.rst index c24765a551..b0f6271e0c 100644 --- a/docs/source/pcapkit/protocols/link/c_tag.rst +++ b/docs/source/pcapkit/protocols/link/c_tag.rst @@ -2,26 +2,27 @@ C_Tag - 802.1Q Customer VLAN Tag Type ===================================== .. module:: pcapkit.protocols.link.c_tag +.. module:: pcapkit.protocols.link.c_tag.protocol -:mod:`pcapkit.protocols.link.c_tag` contains -:class:`~pcapkit.protocols.link.c_tag.C_Tag` only, which implements the extractor for +:mod:`pcapkit.protocols.link.c_tag.protocol` contains +:class:`~pcapkit.protocols.link.c_tag.protocol.C_Tag` only, which implements the extractor for the 802.1Q Customer VLAN Tag Type (C-Tag) [*]_, EtherType ``0x8100``. Its structure, and all of its parsing and construction, come from -:class:`~pcapkit.protocols.link.vlan.VLAN`; this class adds only the tag's own -identity -- :attr:`~pcapkit.protocols.link.c_tag.C_Tag.name`, -:attr:`~pcapkit.protocols.link.c_tag.C_Tag.alias`, -:attr:`~pcapkit.protocols.link.c_tag.C_Tag.info_name`, -:meth:`~pcapkit.protocols.link.c_tag.C_Tag.id` -- and its registry index. - -It has a module of its own, apart from -:class:`~pcapkit.protocols.link.s_tag.S_Tag`, since a module holds one protocol +:class:`~pcapkit.protocols.link.vlan.protocol.VLAN`; this class adds only the tag's own +identity -- :attr:`~pcapkit.protocols.link.c_tag.protocol.C_Tag.name`, +:attr:`~pcapkit.protocols.link.c_tag.protocol.C_Tag.alias`, +:attr:`~pcapkit.protocols.link.c_tag.protocol.C_Tag.info_name`, +:meth:`~pcapkit.protocols.link.c_tag.protocol.C_Tag.id` -- and its registry index. + +It has a package of its own, apart from +:class:`~pcapkit.protocols.link.s_tag.protocol.S_Tag`, since a package holds one protocol class, named after it, with only the framework bases in :mod:`pcapkit.protocols.protocol` exempt (:issue:`2529`). The two tags are reached through different registry indices, ``0x8100`` against ``0x88A8``. -.. autoclass:: pcapkit.protocols.link.c_tag.C_Tag +.. autoclass:: pcapkit.protocols.link.c_tag.protocol.C_Tag :no-members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/link/ethernet.rst b/docs/source/pcapkit/protocols/link/ethernet.rst index 47a2cfec88..8e10573643 100644 --- a/docs/source/pcapkit/protocols/link/ethernet.rst +++ b/docs/source/pcapkit/protocols/link/ethernet.rst @@ -2,9 +2,17 @@ Ethernet Protocol ================= .. module:: pcapkit.protocols.link.ethernet +.. module:: pcapkit.protocols.link.ethernet.protocol -:mod:`pcapkit.protocols.link.ethernet` contains -:class:`~pcapkit.protocols.link.ethernet.Ethernet` +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.link.ethernet.PAT_MAC_ADDR``, with no alias: + :meth:`~pcapkit.protocols.protocol.Protocol._read_mac_addr` and + :meth:`~pcapkit.protocols.protocol.Protocol._make_mac_addr` read and make the address + (:issue:`2614`). + +:mod:`pcapkit.protocols.link.ethernet.protocol` contains +:class:`~pcapkit.protocols.link.ethernet.protocol.Ethernet` only, which implements the extractor for Ethernet Protocol [*]_, whose structure is described as below: @@ -21,7 +29,7 @@ below: 12 96 ``ethernet.type`` Protocol (Internet Layer) ====== ===== ================= ========================= -.. autoclass:: pcapkit.protocols.link.ethernet.Ethernet +.. autoclass:: pcapkit.protocols.link.ethernet.protocol.Ethernet :no-members: :show-inheritance: @@ -41,23 +49,33 @@ below: Header Schemas -------------- -.. module:: pcapkit.protocols.schema.link.ethernet +.. module:: pcapkit.protocols.link.ethernet.schema + +.. versionremoved:: 1.6.0 -.. autoclass:: pcapkit.protocols.schema.link.ethernet.Ethernet + ``pcapkit.protocols.schema.link.ethernet``, with no alias: the module moved here + (:issue:`2534`). + +.. autoclass:: pcapkit.protocols.link.ethernet.schema.Ethernet :members: :show-inheritance: Auxiliary Functions ~~~~~~~~~~~~~~~~~~~ -.. autofunction:: pcapkit.protocols.schema.link.ethernet.callback_payload +.. autofunction:: pcapkit.protocols.link.ethernet.schema.callback_payload Data Models ----------- -.. module:: pcapkit.protocols.data.link.ethernet +.. module:: pcapkit.protocols.link.ethernet.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.link.ethernet``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.data.link.ethernet.Ethernet +.. autoclass:: pcapkit.protocols.link.ethernet.data.Ethernet :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/link/frad.rst b/docs/source/pcapkit/protocols/link/frad.rst index 92638ea319..628cb15ef7 100644 --- a/docs/source/pcapkit/protocols/link/frad.rst +++ b/docs/source/pcapkit/protocols/link/frad.rst @@ -2,9 +2,10 @@ FRAD - Frame Relay Access Device ================================= .. module:: pcapkit.protocols.link.frad +.. module:: pcapkit.protocols.link.frad.protocol -:mod:`pcapkit.protocols.link.frad` contains -:class:`~pcapkit.protocols.link.frad.FRAD` +:mod:`pcapkit.protocols.link.frad.protocol` contains +:class:`~pcapkit.protocols.link.frad.protocol.FRAD` only, which implements the extractor for Frame Relay's multiprotocol encapsulation [*]_, as seen on a ``LINKTYPE_FRELAY`` capture, or on a ``LINKTYPE_LINUX_SLL``/``LINKTYPE_LINUX_SLL2`` capture whose ``arphrd_type`` is @@ -25,7 +26,7 @@ When ``nlpid`` is the ``0x00`` pad, the NLPID follows it as ``frad.ext_nlpid``. An NLPID of ``0x80``, with or without the pad, is followed by a SNAP header, a 3-octet OUI and a 2-octet PID, kept as ``frad.oui`` and ``frad.pid``. -.. autoclass:: pcapkit.protocols.link.frad.FRAD +.. autoclass:: pcapkit.protocols.link.frad.protocol.FRAD :no-members: :show-inheritance: @@ -52,18 +53,18 @@ An NLPID of ``0x80``, with or without the pad, is followed by a SNAP header, a Header Schemas -------------- -.. module:: pcapkit.protocols.schema.link.frad +.. module:: pcapkit.protocols.link.frad.schema -.. autoclass:: pcapkit.protocols.schema.link.frad.FRAD +.. autoclass:: pcapkit.protocols.link.frad.schema.FRAD :members: :show-inheritance: Data Models ----------- -.. module:: pcapkit.protocols.data.link.frad +.. module:: pcapkit.protocols.link.frad.data -.. autoclass:: pcapkit.protocols.data.link.frad.FRAD +.. autoclass:: pcapkit.protocols.link.frad.data.FRAD :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/link/gre.rst b/docs/source/pcapkit/protocols/link/gre.rst index 7e587db8a0..45a4a91e71 100644 --- a/docs/source/pcapkit/protocols/link/gre.rst +++ b/docs/source/pcapkit/protocols/link/gre.rst @@ -2,9 +2,10 @@ GRE - Generic Routing Encapsulation ==================================== .. module:: pcapkit.protocols.link.gre +.. module:: pcapkit.protocols.link.gre.protocol -:mod:`pcapkit.protocols.link.gre` contains -:class:`~pcapkit.protocols.link.gre.GRE` +:mod:`pcapkit.protocols.link.gre.protocol` contains +:class:`~pcapkit.protocols.link.gre.protocol.GRE` only, which implements the extractor for the Generic Routing Encapsulation base header [*]_ plus the optional Key and Sequence Number extensions [*]_, as reached through IP protocol number 47 behind any layer sharing @@ -45,7 +46,7 @@ is 4, 8, 12 or 16 octets depending on which are set. The Protocol Type field is an EtherType, dispatched onward through :attr:`Link.__proto__ `, the same family registry Ethernet, VLAN and LinuxSLL already share -- unlike -:class:`~pcapkit.protocols.link.frad.FRAD`, this class keeps no registry of +:class:`~pcapkit.protocols.link.frad.protocol.FRAD`, this class keeps no registry of its own. A nonzero Version Number (RFC 2637's "Enhanced GRE"/PPTP, version 1) is a different, incompatible protocol and is refused rather than misread; see the module docstring's *Scope* section. @@ -55,7 +56,7 @@ IP header nearest the TCP segment as for any tunnel (:issue:`1581`), and IPv4 reassembly of an outer datagram fragmented in transit yields a parsed GRE layer. -.. autoclass:: pcapkit.protocols.link.gre.GRE +.. autoclass:: pcapkit.protocols.link.gre.protocol.GRE :no-members: :show-inheritance: @@ -77,18 +78,18 @@ layer. Header Schemas -------------- -.. module:: pcapkit.protocols.schema.link.gre +.. module:: pcapkit.protocols.link.gre.schema -.. autoclass:: pcapkit.protocols.schema.link.gre.GRE +.. autoclass:: pcapkit.protocols.link.gre.schema.GRE :members: :show-inheritance: Data Models ----------- -.. module:: pcapkit.protocols.data.link.gre +.. module:: pcapkit.protocols.link.gre.data -.. autoclass:: pcapkit.protocols.data.link.gre.GRE +.. autoclass:: pcapkit.protocols.link.gre.data.GRE :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/link/ieee802_11.rst b/docs/source/pcapkit/protocols/link/ieee802_11.rst index eee2ef9820..1337b000ef 100644 --- a/docs/source/pcapkit/protocols/link/ieee802_11.rst +++ b/docs/source/pcapkit/protocols/link/ieee802_11.rst @@ -2,12 +2,13 @@ IEEE 802.11 - Wireless LAN MAC Header ===================================== .. module:: pcapkit.protocols.link.ieee802_11 +.. module:: pcapkit.protocols.link.ieee802_11.protocol -:mod:`pcapkit.protocols.link.ieee802_11` contains -:class:`~pcapkit.protocols.link.ieee802_11.IEEE802_11` only, which implements +:mod:`pcapkit.protocols.link.ieee802_11.protocol` contains +:class:`~pcapkit.protocols.link.ieee802_11.protocol.IEEE802_11` only, which implements the extractor for the IEEE 802.11 MAC header [*]_ of a protocol version 0 frame, as a ``LINKTYPE_IEEE802_11`` capture carries it or -:class:`~pcapkit.protocols.link.radiotap.Radiotap` hands it on. Its fields, in +:class:`~pcapkit.protocols.link.radiotap.protocol.Radiotap` hands it on. Its fields, in the order they appear, numeric ones little-endian: .. table:: @@ -29,22 +30,22 @@ the order they appear, numeric ones little-endian: with +HTC/Order set (ยง9.2.4.6) ======================= ======= ============================================ -:func:`~pcapkit.protocols.schema.link.ieee802_11.layout` gives the rule per +:func:`~pcapkit.protocols.link.ieee802_11.schema.layout` gives the rule per frame type. A Control frame of a subtype whose layout this class does not model, and an Extension frame, are read as the minimal frame format of ยง9.2.3: the first three fields only. A Control Frame Extension frame and an S1G Beacon lay out B8-B15 of Frame Control differently; see -:class:`~pcapkit.protocols.data.link.ieee802_11.FrameControl`. +:class:`~pcapkit.protocols.link.ieee802_11.data.FrameControl`. Scope ----- * **The frame body** (ยง9.2.4.7) is kept as - :class:`~pcapkit.protocols.misc.raw.Raw`, protected or not. + :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, protected or not. * **The FCS** (ยง9.2.4.8), where one was captured, stays at the end of the body: this class does not decide whether a capture carries one, which behind radiotap is a Flags bit - :class:`~pcapkit.protocols.link.radiotap.Radiotap` decodes but does not + :class:`~pcapkit.protocols.link.radiotap.protocol.Radiotap` decodes but does not pass on. * **Pad octets** that radiotap's data-pad flag says follow the header stay at the start of the body, for the same reason. @@ -52,7 +53,7 @@ Scope frame format of ยง9.8, whose Frame Control field is laid out differently, and versions 2 and 3 are reserved. -.. autoclass:: pcapkit.protocols.link.ieee802_11.IEEE802_11 +.. autoclass:: pcapkit.protocols.link.ieee802_11.protocol.IEEE802_11 :no-members: :show-inheritance: @@ -79,49 +80,49 @@ Scope .. automethod:: _make_ht_control .. automethod:: _make_mac_addr -.. autodata:: pcapkit.protocols.link.ieee802_11.SUBTYPE +.. autodata:: pcapkit.protocols.link.ieee802_11.protocol.SUBTYPE :no-value: Header Schemas -------------- -.. module:: pcapkit.protocols.schema.link.ieee802_11 +.. module:: pcapkit.protocols.link.ieee802_11.schema -.. autoclass:: pcapkit.protocols.schema.link.ieee802_11.IEEE802_11 +.. autoclass:: pcapkit.protocols.link.ieee802_11.schema.IEEE802_11 :members: :show-inheritance: -.. autofunction:: pcapkit.protocols.schema.link.ieee802_11.layout +.. autofunction:: pcapkit.protocols.link.ieee802_11.schema.layout -.. autoclass:: pcapkit.protocols.schema.link.ieee802_11.Layout +.. autoclass:: pcapkit.protocols.link.ieee802_11.schema.Layout :members: :show-inheritance: -.. autodata:: pcapkit.protocols.schema.link.ieee802_11.CONTROL_WITH_ADDR2 +.. autodata:: pcapkit.protocols.link.ieee802_11.schema.CONTROL_WITH_ADDR2 :no-value: Data Models ----------- -.. module:: pcapkit.protocols.data.link.ieee802_11 +.. module:: pcapkit.protocols.link.ieee802_11.data -.. autoclass:: pcapkit.protocols.data.link.ieee802_11.IEEE802_11 +.. autoclass:: pcapkit.protocols.link.ieee802_11.data.IEEE802_11 :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.ieee802_11.FrameControl +.. autoclass:: pcapkit.protocols.link.ieee802_11.data.FrameControl :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.ieee802_11.SequenceControl +.. autoclass:: pcapkit.protocols.link.ieee802_11.data.SequenceControl :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.ieee802_11.QoSControl +.. autoclass:: pcapkit.protocols.link.ieee802_11.data.QoSControl :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.ieee802_11.HTControl +.. autoclass:: pcapkit.protocols.link.ieee802_11.data.HTControl :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/link/inarp.rst b/docs/source/pcapkit/protocols/link/inarp.rst index b3689b7732..1e2cb29e4a 100644 --- a/docs/source/pcapkit/protocols/link/inarp.rst +++ b/docs/source/pcapkit/protocols/link/inarp.rst @@ -2,24 +2,25 @@ InARP - Inverse Address Resolution Protocol =========================================== .. module:: pcapkit.protocols.link.inarp +.. module:: pcapkit.protocols.link.inarp.protocol -:mod:`pcapkit.protocols.link.inarp` contains -:class:`~pcapkit.protocols.link.inarp.InARP` only, +:mod:`pcapkit.protocols.link.inarp.protocol` contains +:class:`~pcapkit.protocols.link.inarp.protocol.InARP` only, which implements an extractor for Inverse Address Resolution Protocol (InARP) [*]_, whose frame is the one -:mod:`pcapkit.protocols.link.arp` describes. +:mod:`pcapkit.protocols.link.arp.protocol` describes. -Nothing dispatches to :class:`~pcapkit.protocols.link.inarp.InARP`: +Nothing dispatches to :class:`~pcapkit.protocols.link.inarp.protocol.InARP`: under EtherType ``0x0806``, an InARP operation parses as -:class:`~pcapkit.protocols.link.arp.ARP` with alias ``InARP``. +:class:`~pcapkit.protocols.link.arp.protocol.ARP` with alias ``InARP``. .. versionadded:: 1.6.0 - Moved here from :mod:`pcapkit.protocols.link.arp`, which keeps - :class:`~pcapkit.protocols.link.arp.ARP` alone, since a module holds one + Moved here from :mod:`pcapkit.protocols.link.arp.protocol`, which keeps + :class:`~pcapkit.protocols.link.arp.protocol.ARP` alone, since a module holds one protocol class, named after it (:issue:`2529`). -.. autoclass:: pcapkit.protocols.link.inarp.InARP +.. autoclass:: pcapkit.protocols.link.inarp.protocol.InARP :no-members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/link/index.rst b/docs/source/pcapkit/protocols/link/index.rst index 52399c9a1c..48ed783772 100644 --- a/docs/source/pcapkit/protocols/link/index.rst +++ b/docs/source/pcapkit/protocols/link/index.rst @@ -2,8 +2,6 @@ Link Layer ========== .. module:: pcapkit.protocols.link -.. module:: pcapkit.protocols.data.link -.. module:: pcapkit.protocols.schema.link :mod:`pcapkit.protocols.link` is the collection of all protocols in link layer, with detailed implementation and methods. @@ -12,11 +10,11 @@ link layer, with detailed implementation and methods. ``pcapkit.protocols.link.OSPF``, ``pcapkit.protocols.link.RARP`` and ``pcapkit.protocols.link.DRARP``, and ``OSPF`` and - ``OSPF_CrytographicAuthentication`` in :mod:`pcapkit.protocols.data.link` and - :mod:`pcapkit.protocols.schema.link`, with no alias. The protocols moved to + ``OSPF_CrytographicAuthentication`` in ``pcapkit.protocols.data.link`` and + ``pcapkit.protocols.schema.link``, with no alias. The protocols moved to :mod:`pcapkit.protocols.application` (:issue:`719`); see - :class:`~pcapkit.protocols.application.ospf.OSPF` and - :class:`~pcapkit.protocols.application.rarp.RARP`. + :class:`~pcapkit.protocols.application.ospf.protocol.OSPF` and + :class:`~pcapkit.protocols.application.rarp.protocol.RARP`. .. toctree:: :maxdepth: 1 diff --git a/docs/source/pcapkit/protocols/link/l2tp.rst b/docs/source/pcapkit/protocols/link/l2tp.rst index 764b1b4aa7..f206274ebf 100644 --- a/docs/source/pcapkit/protocols/link/l2tp.rst +++ b/docs/source/pcapkit/protocols/link/l2tp.rst @@ -2,9 +2,10 @@ L2TP - Layer Two Tunnelling Protocol ==================================== .. module:: pcapkit.protocols.link.l2tp +.. module:: pcapkit.protocols.link.l2tp.protocol -:mod:`pcapkit.protocols.link.l2tp` contains -:class:`~pcapkit.protocols.link.l2tp.L2TP` only, an abstract base class for the +:mod:`pcapkit.protocols.link.l2tp.protocol` contains +:class:`~pcapkit.protocols.link.l2tp.protocol.L2TP` only, an abstract base class for the Layer Two Tunnelling Protocol family [*]_. The concrete versions live in modules of their own: @@ -15,18 +16,18 @@ of their own: - Class - Specification * - L2TPv2 - - :class:`~pcapkit.protocols.link.l2tpv2.L2TPv2` + - :class:`~pcapkit.protocols.link.l2tpv2.protocol.L2TPv2` - :rfc:`2661` Only L2TPv2 is implemented. The base deliberately parses no header, as -:class:`~pcapkit.protocols.internet.ip.IP` does for its family, because the +:class:`~pcapkit.protocols.internet.ip.protocol.IP` does for its family, because the versions do not share one. Only the first 16-bit word, with a version nibble at bits 12-15, is common to all of them; a base that parsed further would assume one version's layout for every version. -.. autoclass:: pcapkit.protocols.link.l2tp.L2TP +.. autoclass:: pcapkit.protocols.link.l2tp.protocol.L2TP :no-members: :show-inheritance: @@ -57,7 +58,7 @@ the value 1 "to permit detection of L2F packets should they arrive intermixed wi L2TP packets". L2F is a separate protocol with its own header, so it is to be implemented as ``L2F``, the canonical name, with ``L2TPv1`` only as an alias in its :meth:`~pcapkit.protocols.protocol.Protocol.id`. See -:meth:`L2TPv2.id ` for +:meth:`L2TPv2.id ` for how a version-flavoured alias is spelled: canonical name first, alias second, since callers take element zero as canonical. @@ -67,16 +68,16 @@ Version Dispatch Constructing the base gives the member its ``version`` field names, from octets or from fields; without it, octets give the one their version nibble names, and fields are refused, since no field picks a member (:issue:`2574`). -:meth:`~pcapkit.protocols.link.l2tp.L2TP._member_of_version` maps ``2`` to -:class:`~pcapkit.protocols.link.l2tpv2.L2TPv2` and refuses any other version, for +:meth:`~pcapkit.protocols.link.l2tp.protocol.L2TP._member_of_version` maps ``2`` to +:class:`~pcapkit.protocols.link.l2tpv2.protocol.L2TPv2` and refuses any other version, for that field, for the nibble and for the data -:meth:`~pcapkit.protocols.link.l2tp.L2TP.from_data` is handed. UDP port 1701 binds +:meth:`~pcapkit.protocols.link.l2tp.protocol.L2TP.from_data` is handed. UDP port 1701 binds L2TPv2 itself, the only member. The switch is where a further member goes, and binding the port to the base through a hook making the same switch, as -:meth:`IGMP._dispatch ` does for +:meth:`IGMP._dispatch ` does for IP protocol 2, needs no new registry. L2TP is the easier case beside -:class:`~pcapkit.protocols.application.http.HTTP`, whose -:meth:`~pcapkit.protocols.application.http.HTTP._guess_version` has to *infer* +:class:`~pcapkit.protocols.application.http.protocol.HTTP`, whose +:meth:`~pcapkit.protocols.application.http.protocol.HTTP._guess_version` has to *infer* the version, because HTTP's wire format carries no version field, whereas L2TP states its version explicitly in those four bits. diff --git a/docs/source/pcapkit/protocols/link/l2tpv2.rst b/docs/source/pcapkit/protocols/link/l2tpv2.rst index bdb03b4212..2cfe941f79 100644 --- a/docs/source/pcapkit/protocols/link/l2tpv2.rst +++ b/docs/source/pcapkit/protocols/link/l2tpv2.rst @@ -2,13 +2,14 @@ L2TPv2 - Layer Two Tunnelling Protocol Version 2 ================================================ .. module:: pcapkit.protocols.link.l2tpv2 +.. module:: pcapkit.protocols.link.l2tpv2.protocol -:mod:`pcapkit.protocols.link.l2tpv2` contains -:class:`~pcapkit.protocols.link.l2tpv2.L2TPv2` only, which implements the extractor +:mod:`pcapkit.protocols.link.l2tpv2.protocol` contains +:class:`~pcapkit.protocols.link.l2tpv2.protocol.L2TPv2` only, which implements the extractor for the Layer Two Tunnelling Protocol version 2 (L2TPv2) [*]_ as specified by :rfc:`2661` -- a 16-bit tunnel ID and a 16-bit session ID, with the version nibble reading ``2``. It is dispatched from -:attr:`UDP.__proto__ ` at port +:attr:`UDP.__proto__ ` at port 1701. Its structure is described as below: .. table:: @@ -52,12 +53,12 @@ reading ``2``. It is dispatched from .. note:: The parsed datagram appears under ``l2tp``, not ``l2tpv2``: - :attr:`~pcapkit.protocols.link.l2tp.L2TP.info_name` is declared on the + :attr:`~pcapkit.protocols.link.l2tp.protocol.L2TP.info_name` is declared on the version-agnostic base so that a consumer finds the data at the same key whichever version was on the wire. The version is reported by - :attr:`~pcapkit.protocols.link.l2tpv2.L2TPv2.alias` instead. + :attr:`~pcapkit.protocols.link.l2tpv2.protocol.L2TPv2.alias` instead. -.. autoclass:: pcapkit.protocols.link.l2tpv2.L2TPv2 +.. autoclass:: pcapkit.protocols.link.l2tpv2.protocol.L2TPv2 :no-members: :show-inheritance: @@ -78,34 +79,44 @@ reading ``2``. It is dispatched from Header Schemas -------------- -.. module:: pcapkit.protocols.schema.link.l2tp +.. module:: pcapkit.protocols.link.l2tp.schema -.. autoclass:: pcapkit.protocols.schema.link.l2tp.L2TP +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.schema.link.l2tp``, with no alias: the module moved here + (:issue:`2534`). + +.. autoclass:: pcapkit.protocols.link.l2tp.schema.L2TP :members: :show-inheritance: Type Stubs ~~~~~~~~~~ -.. autoclass:: pcapkit.protocols.schema.link.l2tp.FlagsType +.. autoclass:: pcapkit.protocols.link.l2tp.schema.FlagsType :members: :show-inheritance: Auxiliary Functions ~~~~~~~~~~~~~~~~~~~ -.. autofunction:: pcapkit.protocols.schema.link.l2tp.l2tp_payload_length +.. autofunction:: pcapkit.protocols.link.l2tp.schema.l2tp_payload_length Data Models ----------- -.. module:: pcapkit.protocols.data.link.l2tp +.. module:: pcapkit.protocols.link.l2tp.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.link.l2tp``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.data.link.l2tp.L2TP +.. autoclass:: pcapkit.protocols.link.l2tp.data.L2TP :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.l2tp.Flags +.. autoclass:: pcapkit.protocols.link.l2tp.data.Flags :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/link/link.rst b/docs/source/pcapkit/protocols/link/link.rst index 9373433e6f..9df1903fc7 100644 --- a/docs/source/pcapkit/protocols/link/link.rst +++ b/docs/source/pcapkit/protocols/link/link.rst @@ -5,9 +5,9 @@ Link Layer Base Protocol :mod:`pcapkit.protocols.link.link` contains :class:`~pcapkit.protocols.link.link.Link`, which is a base class for link layer protocols, e.g. -:class:`~pcapkit.protocols.link.arp.ARP`/:class:`~pcapkit.protocols.link.inarp.InARP`, -:class:`~pcapkit.protocols.link.ethernet.Ethernet`, :class:`~pcapkit.protocols.link.l2tp.L2TP` -and :class:`~pcapkit.protocols.link.vlan.VLAN`. +:class:`~pcapkit.protocols.link.arp.protocol.ARP`/:class:`~pcapkit.protocols.link.inarp.protocol.InARP`, +:class:`~pcapkit.protocols.link.ethernet.protocol.Ethernet`, :class:`~pcapkit.protocols.link.l2tp.protocol.L2TP` +and :class:`~pcapkit.protocols.link.vlan.protocol.VLAN`. .. autoclass:: pcapkit.protocols.link.link.Link :no-members: diff --git a/docs/source/pcapkit/protocols/link/linux_sll.rst b/docs/source/pcapkit/protocols/link/linux_sll.rst index c9da4d945c..cde332ad1a 100644 --- a/docs/source/pcapkit/protocols/link/linux_sll.rst +++ b/docs/source/pcapkit/protocols/link/linux_sll.rst @@ -2,9 +2,10 @@ LinuxSLL - Linux "Cooked" Capture Encapsulation Family ====================================================== .. module:: pcapkit.protocols.link.linux_sll +.. module:: pcapkit.protocols.link.linux_sll.protocol -:mod:`pcapkit.protocols.link.linux_sll` contains -:class:`~pcapkit.protocols.link.linux_sll.LinuxSLL` only, the base class of the +:mod:`pcapkit.protocols.link.linux_sll.protocol` contains +:class:`~pcapkit.protocols.link.linux_sll.protocol.LinuxSLL` only, the base class of the Linux "cooked" capture encapsulation family: .. list-table:: @@ -13,9 +14,9 @@ Linux "cooked" capture encapsulation family: * - ``LinkType`` - Class * - ``LINUX_SLL`` (113) - - :class:`~pcapkit.protocols.link.linux_sll1.LinuxSLL1` + - :class:`~pcapkit.protocols.link.linux_sll1.protocol.LinuxSLL1` * - ``LINUX_SLL2`` (276) - - :class:`~pcapkit.protocols.link.linux_sll2.LinuxSLL2` + - :class:`~pcapkit.protocols.link.linux_sll2.protocol.LinuxSLL2` The versions differ in field order and width, so each parses its own header. The base holds what they share: the next-layer dispatch, and link-layer address @@ -23,10 +24,10 @@ validation. It has no registry index, so its ``__index__`` raises. Constructing the base gives the version its ``version`` keyword names, from octets or from fields, and is refused without it, since the link type rather than the header names the version. Its -:meth:`~pcapkit.protocols.link.linux_sll.LinuxSLL.from_data` gives the version +:meth:`~pcapkit.protocols.link.linux_sll.protocol.LinuxSLL.from_data` gives the version whose data model it is handed (:issue:`2574`). -.. autoclass:: pcapkit.protocols.link.linux_sll.LinuxSLL +.. autoclass:: pcapkit.protocols.link.linux_sll.protocol.LinuxSLL :no-members: :show-inheritance: @@ -47,13 +48,13 @@ whose data model it is handed (:issue:`2574`). Auxiliary Functions ------------------- -.. autofunction:: pcapkit.protocols.link.linux_sll._resolve_next_layer_proto -.. autofunction:: pcapkit.protocols.link.linux_sll._validate_link_addr +.. autofunction:: pcapkit.protocols.link.linux_sll.protocol._resolve_next_layer_proto +.. autofunction:: pcapkit.protocols.link.linux_sll.protocol._validate_link_addr Auxiliary Constants ------------------- -.. autodata:: pcapkit.protocols.link.linux_sll._ETHERTYPE_FIELD +.. autodata:: pcapkit.protocols.link.linux_sll.protocol._ETHERTYPE_FIELD :no-value: Hardware Types @@ -68,8 +69,8 @@ Selecting a Version ------------------- The family name selects either version, and each version's own name selects that -version only, as :class:`~pcapkit.protocols.internet.ipv4.IPv4` and -:class:`~pcapkit.protocols.internet.ipv6.IPv6` do under -:class:`~pcapkit.protocols.internet.ip.IP`. ``'LinuxSLL'`` is in both versions; +version only, as :class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4` and +:class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6` do under +:class:`~pcapkit.protocols.internet.ip.protocol.IP`. ``'LinuxSLL'`` is in both versions; ``'LinuxSLL1' in`` a v2 layer is :data:`False`. String ``==`` does not expand a key, so ``v1 == 'LinuxSLL'`` is :data:`False` while ``'LinuxSLL' in v1`` is :data:`True`. diff --git a/docs/source/pcapkit/protocols/link/linux_sll1.rst b/docs/source/pcapkit/protocols/link/linux_sll1.rst index 1be95ee3cf..7c47d7fe4d 100644 --- a/docs/source/pcapkit/protocols/link/linux_sll1.rst +++ b/docs/source/pcapkit/protocols/link/linux_sll1.rst @@ -2,9 +2,10 @@ Linux "Cooked" Capture Encapsulation ===================================== .. module:: pcapkit.protocols.link.linux_sll1 +.. module:: pcapkit.protocols.link.linux_sll1.protocol -:mod:`pcapkit.protocols.link.linux_sll1` contains -:class:`~pcapkit.protocols.link.linux_sll1.LinuxSLL1` +:mod:`pcapkit.protocols.link.linux_sll1.protocol` contains +:class:`~pcapkit.protocols.link.linux_sll1.protocol.LinuxSLL1` only, which implements the extractor for the Linux "cooked" capture encapsulation [*]_ of ``LINKTYPE_LINUX_SLL`` -- the header every ``tcpdump -i any`` capture on Linux uses -- whose structure is described as @@ -27,14 +28,14 @@ below: ====== ===== ============================== ================================ Next-layer dispatch is shared with -:class:`~pcapkit.protocols.link.linux_sll2.LinuxSLL2`; see -:mod:`~pcapkit.protocols.link.linux_sll`. Its -:meth:`~pcapkit.protocols.link.linux_sll1.LinuxSLL1.id` is +:class:`~pcapkit.protocols.link.linux_sll2.protocol.LinuxSLL2`; see +:mod:`~pcapkit.protocols.link.linux_sll.protocol`. Its +:meth:`~pcapkit.protocols.link.linux_sll1.protocol.LinuxSLL1.id` is ``('LinuxSLL1',)``, and its -:attr:`~pcapkit.protocols.link.linux_sll1.LinuxSLL1.alias` is ``'LINUX_SLL1'``; +:attr:`~pcapkit.protocols.link.linux_sll1.protocol.LinuxSLL1.alias` is ``'LINUX_SLL1'``; see :ref:`linux-sll-labels`. -.. autoclass:: pcapkit.protocols.link.linux_sll1.LinuxSLL1 +.. autoclass:: pcapkit.protocols.link.linux_sll1.protocol.LinuxSLL1 :no-members: :show-inheritance: @@ -55,18 +56,18 @@ see :ref:`linux-sll-labels`. Header Schemas -------------- -.. module:: pcapkit.protocols.schema.link.linux_sll1 +.. module:: pcapkit.protocols.link.linux_sll1.schema -.. autoclass:: pcapkit.protocols.schema.link.linux_sll1.LinuxSLL1 +.. autoclass:: pcapkit.protocols.link.linux_sll1.schema.LinuxSLL1 :members: :show-inheritance: Data Models ----------- -.. module:: pcapkit.protocols.data.link.linux_sll1 +.. module:: pcapkit.protocols.link.linux_sll1.data -.. autoclass:: pcapkit.protocols.data.link.linux_sll1.LinuxSLL1 +.. autoclass:: pcapkit.protocols.link.linux_sll1.data.LinuxSLL1 :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/link/linux_sll2.rst b/docs/source/pcapkit/protocols/link/linux_sll2.rst index 8d0dac66f3..c3506b9b55 100644 --- a/docs/source/pcapkit/protocols/link/linux_sll2.rst +++ b/docs/source/pcapkit/protocols/link/linux_sll2.rst @@ -2,9 +2,10 @@ Linux "Cooked" Capture Encapsulation v2 ========================================= .. module:: pcapkit.protocols.link.linux_sll2 +.. module:: pcapkit.protocols.link.linux_sll2.protocol -:mod:`pcapkit.protocols.link.linux_sll2` contains -:class:`~pcapkit.protocols.link.linux_sll2.LinuxSLL2` +:mod:`pcapkit.protocols.link.linux_sll2.protocol` contains +:class:`~pcapkit.protocols.link.linux_sll2.protocol.LinuxSLL2` only, which implements the extractor for the Linux "cooked" capture encapsulation v2 [*]_ of ``LINKTYPE_LINUX_SLL2``, whose structure is described as below: @@ -31,14 +32,14 @@ as below: Unlike v1, ``protocol_type`` comes first, ``interface_index`` is new, and ``packet_type`` and ``link_addr_length`` are 1 octet rather than 2. See -:class:`~pcapkit.protocols.link.linux_sll1.LinuxSLL1` for v1; next-layer -dispatch is shared, see :mod:`~pcapkit.protocols.link.linux_sll`. Its -:meth:`~pcapkit.protocols.link.linux_sll2.LinuxSLL2.id` is +:class:`~pcapkit.protocols.link.linux_sll1.protocol.LinuxSLL1` for v1; next-layer +dispatch is shared, see :mod:`~pcapkit.protocols.link.linux_sll.protocol`. Its +:meth:`~pcapkit.protocols.link.linux_sll2.protocol.LinuxSLL2.id` is ``('LinuxSLL2',)``, and its -:attr:`~pcapkit.protocols.link.linux_sll2.LinuxSLL2.alias` is ``'LINUX_SLL2'``; +:attr:`~pcapkit.protocols.link.linux_sll2.protocol.LinuxSLL2.alias` is ``'LINUX_SLL2'``; see :ref:`linux-sll-labels`. -.. autoclass:: pcapkit.protocols.link.linux_sll2.LinuxSLL2 +.. autoclass:: pcapkit.protocols.link.linux_sll2.protocol.LinuxSLL2 :no-members: :show-inheritance: @@ -59,18 +60,18 @@ see :ref:`linux-sll-labels`. Header Schemas -------------- -.. module:: pcapkit.protocols.schema.link.linux_sll2 +.. module:: pcapkit.protocols.link.linux_sll2.schema -.. autoclass:: pcapkit.protocols.schema.link.linux_sll2.LinuxSLL2 +.. autoclass:: pcapkit.protocols.link.linux_sll2.schema.LinuxSLL2 :members: :show-inheritance: Data Models ----------- -.. module:: pcapkit.protocols.data.link.linux_sll2 +.. module:: pcapkit.protocols.link.linux_sll2.data -.. autoclass:: pcapkit.protocols.data.link.linux_sll2.LinuxSLL2 +.. autoclass:: pcapkit.protocols.link.linux_sll2.data.LinuxSLL2 :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/link/loopback.rst b/docs/source/pcapkit/protocols/link/loopback.rst index 6f942eb81a..4431467356 100644 --- a/docs/source/pcapkit/protocols/link/loopback.rst +++ b/docs/source/pcapkit/protocols/link/loopback.rst @@ -2,9 +2,16 @@ BSD Loopback Encapsulation ========================== .. module:: pcapkit.protocols.link.loopback +.. module:: pcapkit.protocols.link.loopback.protocol -:mod:`pcapkit.protocols.link.loopback` contains -:class:`~pcapkit.protocols.link.loopback.Loopback` +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.link.loopback.family_byteorder``, with no alias: it is in this + module, and :mod:`pcapkit.protocols.link.loopback` exports the protocol class alone + (:issue:`2534`). + +:mod:`pcapkit.protocols.link.loopback.protocol` contains +:class:`~pcapkit.protocols.link.loopback.protocol.Loopback` only, which implements the extractor for the BSD loopback encapsulation [*]_ of ``LINKTYPE_NULL`` and ``LINKTYPE_LOOP``, whose structure is described as below: @@ -22,7 +29,7 @@ The address family is in the byte order of the capturing host for octets; for ``LINKTYPE_LOOP`` it is always in network byte order. Either way it is kept as ``loopback.byteorder``. -.. autoclass:: pcapkit.protocols.link.loopback.Loopback +.. autoclass:: pcapkit.protocols.link.loopback.protocol.Loopback :no-members: :show-inheritance: @@ -41,23 +48,33 @@ is kept as ``loopback.byteorder``. .. autoattribute:: __proto__ :no-value: -.. autofunction:: pcapkit.protocols.link.loopback.family_byteorder +.. autofunction:: pcapkit.protocols.link.loopback.protocol.family_byteorder Header Schemas -------------- -.. module:: pcapkit.protocols.schema.link.loopback +.. module:: pcapkit.protocols.link.loopback.schema + +.. versionremoved:: 1.6.0 -.. autoclass:: pcapkit.protocols.schema.link.loopback.Loopback + ``pcapkit.protocols.schema.link.loopback``, with no alias: the module moved here + (:issue:`2534`). + +.. autoclass:: pcapkit.protocols.link.loopback.schema.Loopback :members: :show-inheritance: Data Models ----------- -.. module:: pcapkit.protocols.data.link.loopback +.. module:: pcapkit.protocols.link.loopback.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.link.loopback``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.data.link.loopback.Loopback +.. autoclass:: pcapkit.protocols.link.loopback.data.Loopback :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/link/netlink.rst b/docs/source/pcapkit/protocols/link/netlink.rst index f5bed1d2c5..28127c78e0 100644 --- a/docs/source/pcapkit/protocols/link/netlink.rst +++ b/docs/source/pcapkit/protocols/link/netlink.rst @@ -2,9 +2,10 @@ Netlink - Linux Netlink Socket Framing ======================================= .. module:: pcapkit.protocols.link.netlink +.. module:: pcapkit.protocols.link.netlink.protocol -:mod:`pcapkit.protocols.link.netlink` contains -:class:`~pcapkit.protocols.link.netlink.Netlink` +:mod:`pcapkit.protocols.link.netlink.protocol` contains +:class:`~pcapkit.protocols.link.netlink.protocol.Netlink` only, which implements the extractor for the ``struct nlmsghdr`` framing of Linux's own kernel/user IPC transport, as seen on a ``LINKTYPE_LINUX_SLL``/``LINKTYPE_LINUX_SLL2`` capture whose ``arphrd_type`` @@ -30,7 +31,7 @@ was written in is ambiguous (Netlink [*]_ is kernel/userspace IPC, not wire format) and is guessed by :func:`nlmsg_byteorder`; either way it is kept as ``netlink.byteorder``. -.. autoclass:: pcapkit.protocols.link.netlink.Netlink +.. autoclass:: pcapkit.protocols.link.netlink.protocol.Netlink :no-members: :show-inheritance: @@ -53,23 +54,23 @@ format) and is guessed by :func:`nlmsg_byteorder`; either way it is kept as .. autoattribute:: __proto__ :no-value: -.. autofunction:: pcapkit.protocols.link.netlink.nlmsg_byteorder +.. autofunction:: pcapkit.protocols.link.netlink.protocol.nlmsg_byteorder Header Schemas -------------- -.. module:: pcapkit.protocols.schema.link.netlink +.. module:: pcapkit.protocols.link.netlink.schema -.. autoclass:: pcapkit.protocols.schema.link.netlink.Netlink +.. autoclass:: pcapkit.protocols.link.netlink.schema.Netlink :members: :show-inheritance: Data Models ----------- -.. module:: pcapkit.protocols.data.link.netlink +.. module:: pcapkit.protocols.link.netlink.data -.. autoclass:: pcapkit.protocols.data.link.netlink.Netlink +.. autoclass:: pcapkit.protocols.link.netlink.data.Netlink :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/link/radiotap.rst b/docs/source/pcapkit/protocols/link/radiotap.rst index 25592f13b6..13c6756ec2 100644 --- a/docs/source/pcapkit/protocols/link/radiotap.rst +++ b/docs/source/pcapkit/protocols/link/radiotap.rst @@ -2,9 +2,10 @@ Radiotap - IEEE 802.11 Radiotap Header ======================================== .. module:: pcapkit.protocols.link.radiotap +.. module:: pcapkit.protocols.link.radiotap.protocol -:mod:`pcapkit.protocols.link.radiotap` contains -:class:`~pcapkit.protocols.link.radiotap.Radiotap` +:mod:`pcapkit.protocols.link.radiotap.protocol` contains +:class:`~pcapkit.protocols.link.radiotap.protocol.Radiotap` only, which implements the extractor for the radiotap header [*]_ capture tools prepend to an 802.11 frame, as seen on a ``LINKTYPE_IEEE802_11_RADIOTAP`` capture, or on a @@ -37,18 +38,18 @@ This class: * **Decodes** the fixed 8-octet start -- ``it_version``, ``it_pad``, ``it_len`` -- and walks the present-flags chain, recording every word as - :attr:`~pcapkit.protocols.data.link.radiotap.Radiotap.present`. + :attr:`~pcapkit.protocols.link.radiotap.data.Radiotap.present`. * **Keeps** the optional-field region those bits select whole, as - :attr:`~pcapkit.protocols.data.link.radiotap.Radiotap.fields`, which is + :attr:`~pcapkit.protocols.link.radiotap.data.Radiotap.fields`, which is what a rebuild from the data model writes, and **decodes** it as - :attr:`~pcapkit.protocols.data.link.radiotap.Radiotap.decoded`, by the + :attr:`~pcapkit.protocols.link.radiotap.data.Radiotap.decoded`, by the rules below. * **Hands** everything from ``it_len`` on, the 802.11 MAC frame, to - :class:`~pcapkit.protocols.link.ieee802_11.IEEE802_11` - (:class:`~pcapkit.protocols.misc.no_payload.NoPayload` when nothing follows). + :class:`~pcapkit.protocols.link.ieee802_11.protocol.IEEE802_11` + (:class:`~pcapkit.protocols.misc.no_payload.protocol.NoPayload` when nothing follows). The header names no next protocol, since an 802.11 frame always follows it, so the frame is looked up in - :attr:`Radiotap.__proto__ ` + :attr:`Radiotap.__proto__ ` under :attr:`LinkType.IEEE802_11 `; :func:`~pcapkit.foundation.registry.protocols.link.register_radiotap` replaces the entry. @@ -59,9 +60,9 @@ Field Decoding The bits are walked in order, word by word, and the fields they select follow one another in the same order, each aligned to its own boundary counted from the start of the header. A field type is read and made by the methods -:attr:`Radiotap.__field__ ` +:attr:`Radiotap.__field__ ` names for it, through the schema the -:class:`~pcapkit.protocols.schema.link.radiotap.RadiotapField` registry holds +:class:`~pcapkit.protocols.link.radiotap.schema.RadiotapField` registry holds for it: the schema's fields are the subfields of the type's page on radiotap.org, their total is its size, and its ``__align__`` its alignment, which match the tables of the Linux kernel, Wireshark and radiotap.org's own @@ -93,24 +94,24 @@ decoded the same way. data. radiotap.org lets a producer leave out the octets that end an item, which are then zeros, so an item short of its schema, or of the vendor header, is decoded as though they were there. Its decoded data records the cut as - ``__short_read__``, as :meth:`Schema.unpack ` - does, so :meth:`Radiotap.make ` + ``__short_read__``, as :meth:`Schema.unpack ` + does, so :meth:`Radiotap.make ` writes the octets that were captured. * **What is not decoded.** A radiotap-namespace bit no field is defined for -- 18, FreeBSD's XChannel, which radiotap.org lists as unofficial, and every one numbered 32 or more, the TLV-only types included -- or a field that runs past the region, ends the walk, since nothing after it can be located: an - :class:`~pcapkit.protocols.data.link.radiotap.Unknown` entry keeps every + :class:`~pcapkit.protocols.link.radiotap.data.Unknown` entry keeps every octet from there on, and its ``reason`` says which of the two it was. Each bit with data in the radiotap namespace, and each namespace field, has -one entry in :attr:`~pcapkit.protocols.data.link.radiotap.Radiotap.decoded`, +one entry in :attr:`~pcapkit.protocols.link.radiotap.data.Radiotap.decoded`, keyed by its :class:`~pcapkit.const.radiotap.field_type.FieldType`; the subfields keep radiotap.org's names. -:meth:`~pcapkit.protocols.link.radiotap.Radiotap.make` takes the same entries +:meth:`~pcapkit.protocols.link.radiotap.protocol.Radiotap.make` takes the same entries as ``fields`` and encodes them with zero padding. -.. autoclass:: pcapkit.protocols.link.radiotap.Radiotap +.. autoclass:: pcapkit.protocols.link.radiotap.protocol.Radiotap :no-members: :show-inheritance: @@ -208,332 +209,332 @@ as ``fields`` and encodes them with zero padding. Header Schemas -------------- -.. module:: pcapkit.protocols.schema.link.radiotap +.. module:: pcapkit.protocols.link.radiotap.schema -.. autoclass:: pcapkit.protocols.schema.link.radiotap.Radiotap +.. autoclass:: pcapkit.protocols.link.radiotap.schema.Radiotap :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.RadiotapField +.. autoclass:: pcapkit.protocols.link.radiotap.schema.RadiotapField :members: :show-inheritance: .. autoattribute:: __align__ -.. autoclass:: pcapkit.protocols.schema.link.radiotap.Unknown +.. autoclass:: pcapkit.protocols.link.radiotap.schema.Unknown :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.TSFT +.. autoclass:: pcapkit.protocols.link.radiotap.schema.TSFT :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.Flags +.. autoclass:: pcapkit.protocols.link.radiotap.schema.Flags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.Rate +.. autoclass:: pcapkit.protocols.link.radiotap.schema.Rate :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.Channel +.. autoclass:: pcapkit.protocols.link.radiotap.schema.Channel :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.FHSS +.. autoclass:: pcapkit.protocols.link.radiotap.schema.FHSS :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.AntennaSignal +.. autoclass:: pcapkit.protocols.link.radiotap.schema.AntennaSignal :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.AntennaNoise +.. autoclass:: pcapkit.protocols.link.radiotap.schema.AntennaNoise :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.LockQuality +.. autoclass:: pcapkit.protocols.link.radiotap.schema.LockQuality :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.TXAttenuation +.. autoclass:: pcapkit.protocols.link.radiotap.schema.TXAttenuation :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.DBTXAttenuation +.. autoclass:: pcapkit.protocols.link.radiotap.schema.DBTXAttenuation :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.DBmTXPower +.. autoclass:: pcapkit.protocols.link.radiotap.schema.DBmTXPower :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.Antenna +.. autoclass:: pcapkit.protocols.link.radiotap.schema.Antenna :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.DBAntennaSignal +.. autoclass:: pcapkit.protocols.link.radiotap.schema.DBAntennaSignal :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.DBAntennaNoise +.. autoclass:: pcapkit.protocols.link.radiotap.schema.DBAntennaNoise :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.RXFlags +.. autoclass:: pcapkit.protocols.link.radiotap.schema.RXFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.TXFlags +.. autoclass:: pcapkit.protocols.link.radiotap.schema.TXFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.RTSRetries +.. autoclass:: pcapkit.protocols.link.radiotap.schema.RTSRetries :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.DataRetries +.. autoclass:: pcapkit.protocols.link.radiotap.schema.DataRetries :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.MCS +.. autoclass:: pcapkit.protocols.link.radiotap.schema.MCS :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.AMPDUStatus +.. autoclass:: pcapkit.protocols.link.radiotap.schema.AMPDUStatus :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.VHT +.. autoclass:: pcapkit.protocols.link.radiotap.schema.VHT :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.Timestamp +.. autoclass:: pcapkit.protocols.link.radiotap.schema.Timestamp :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.HE +.. autoclass:: pcapkit.protocols.link.radiotap.schema.HE :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.HEMU +.. autoclass:: pcapkit.protocols.link.radiotap.schema.HEMU :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.HEMUOtherUser +.. autoclass:: pcapkit.protocols.link.radiotap.schema.HEMUOtherUser :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.ZeroLengthPSDU +.. autoclass:: pcapkit.protocols.link.radiotap.schema.ZeroLengthPSDU :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.LSIG +.. autoclass:: pcapkit.protocols.link.radiotap.schema.LSIG :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.VendorNamespace +.. autoclass:: pcapkit.protocols.link.radiotap.schema.VendorNamespace :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.S1G +.. autoclass:: pcapkit.protocols.link.radiotap.schema.S1G :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.USIG +.. autoclass:: pcapkit.protocols.link.radiotap.schema.USIG :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.EHT +.. autoclass:: pcapkit.protocols.link.radiotap.schema.EHT :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.TLV +.. autoclass:: pcapkit.protocols.link.radiotap.schema.TLV :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.radiotap.VendorTLV +.. autoclass:: pcapkit.protocols.link.radiotap.schema.VendorTLV :members: :show-inheritance: Data Models ----------- -.. module:: pcapkit.protocols.data.link.radiotap +.. module:: pcapkit.protocols.link.radiotap.data -.. autoclass:: pcapkit.protocols.data.link.radiotap.Radiotap +.. autoclass:: pcapkit.protocols.link.radiotap.data.Radiotap :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.RadiotapField +.. autoclass:: pcapkit.protocols.link.radiotap.data.RadiotapField :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.Unknown +.. autoclass:: pcapkit.protocols.link.radiotap.data.Unknown :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.TSFT +.. autoclass:: pcapkit.protocols.link.radiotap.data.TSFT :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.Flags +.. autoclass:: pcapkit.protocols.link.radiotap.data.Flags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.Rate +.. autoclass:: pcapkit.protocols.link.radiotap.data.Rate :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.Channel +.. autoclass:: pcapkit.protocols.link.radiotap.data.Channel :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.FHSS +.. autoclass:: pcapkit.protocols.link.radiotap.data.FHSS :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.AntennaSignal +.. autoclass:: pcapkit.protocols.link.radiotap.data.AntennaSignal :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.AntennaNoise +.. autoclass:: pcapkit.protocols.link.radiotap.data.AntennaNoise :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.LockQuality +.. autoclass:: pcapkit.protocols.link.radiotap.data.LockQuality :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.TXAttenuation +.. autoclass:: pcapkit.protocols.link.radiotap.data.TXAttenuation :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.DBTXAttenuation +.. autoclass:: pcapkit.protocols.link.radiotap.data.DBTXAttenuation :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.DBmTXPower +.. autoclass:: pcapkit.protocols.link.radiotap.data.DBmTXPower :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.Antenna +.. autoclass:: pcapkit.protocols.link.radiotap.data.Antenna :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.DBAntennaSignal +.. autoclass:: pcapkit.protocols.link.radiotap.data.DBAntennaSignal :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.DBAntennaNoise +.. autoclass:: pcapkit.protocols.link.radiotap.data.DBAntennaNoise :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.RXFlags +.. autoclass:: pcapkit.protocols.link.radiotap.data.RXFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.TXFlags +.. autoclass:: pcapkit.protocols.link.radiotap.data.TXFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.RTSRetries +.. autoclass:: pcapkit.protocols.link.radiotap.data.RTSRetries :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.DataRetries +.. autoclass:: pcapkit.protocols.link.radiotap.data.DataRetries :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.MCS +.. autoclass:: pcapkit.protocols.link.radiotap.data.MCS :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.MCSFlags +.. autoclass:: pcapkit.protocols.link.radiotap.data.MCSFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.AMPDUStatus +.. autoclass:: pcapkit.protocols.link.radiotap.data.AMPDUStatus :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.VHT +.. autoclass:: pcapkit.protocols.link.radiotap.data.VHT :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.Timestamp +.. autoclass:: pcapkit.protocols.link.radiotap.data.Timestamp :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.HE +.. autoclass:: pcapkit.protocols.link.radiotap.data.HE :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.HEData1 +.. autoclass:: pcapkit.protocols.link.radiotap.data.HEData1 :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.HEData2 +.. autoclass:: pcapkit.protocols.link.radiotap.data.HEData2 :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.HEMU +.. autoclass:: pcapkit.protocols.link.radiotap.data.HEMU :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.HEMUFlags1 +.. autoclass:: pcapkit.protocols.link.radiotap.data.HEMUFlags1 :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.HEMUFlags2 +.. autoclass:: pcapkit.protocols.link.radiotap.data.HEMUFlags2 :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.HEMUOtherUser +.. autoclass:: pcapkit.protocols.link.radiotap.data.HEMUOtherUser :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.ZeroLengthPSDU +.. autoclass:: pcapkit.protocols.link.radiotap.data.ZeroLengthPSDU :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.LSIG +.. autoclass:: pcapkit.protocols.link.radiotap.data.LSIG :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.TLVFields +.. autoclass:: pcapkit.protocols.link.radiotap.data.TLVFields :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.RadiotapNamespace +.. autoclass:: pcapkit.protocols.link.radiotap.data.RadiotapNamespace :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.VendorNamespace +.. autoclass:: pcapkit.protocols.link.radiotap.data.VendorNamespace :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.S1G +.. autoclass:: pcapkit.protocols.link.radiotap.data.S1G :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.USIG +.. autoclass:: pcapkit.protocols.link.radiotap.data.USIG :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.USIGCommon +.. autoclass:: pcapkit.protocols.link.radiotap.data.USIGCommon :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.EHT +.. autoclass:: pcapkit.protocols.link.radiotap.data.EHT :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.TLV +.. autoclass:: pcapkit.protocols.link.radiotap.data.TLV :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.radiotap.VendorTLV +.. autoclass:: pcapkit.protocols.link.radiotap.data.VendorTLV :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/link/s_tag.rst b/docs/source/pcapkit/protocols/link/s_tag.rst index 49c6a635b8..5641b57105 100644 --- a/docs/source/pcapkit/protocols/link/s_tag.rst +++ b/docs/source/pcapkit/protocols/link/s_tag.rst @@ -2,25 +2,26 @@ S_Tag - 802.1ad Service VLAN Tag Type ===================================== .. module:: pcapkit.protocols.link.s_tag +.. module:: pcapkit.protocols.link.s_tag.protocol -:mod:`pcapkit.protocols.link.s_tag` contains -:class:`~pcapkit.protocols.link.s_tag.S_Tag` only, which implements the extractor for +:mod:`pcapkit.protocols.link.s_tag.protocol` contains +:class:`~pcapkit.protocols.link.s_tag.protocol.S_Tag` only, which implements the extractor for the 802.1ad Service VLAN Tag Type (S-Tag) [*]_, EtherType ``0x88A8``. Its structure, and all of its parsing and construction, come from -:class:`~pcapkit.protocols.link.vlan.VLAN`; this class adds only the tag's own -identity -- :attr:`~pcapkit.protocols.link.s_tag.S_Tag.name`, -:attr:`~pcapkit.protocols.link.s_tag.S_Tag.alias`, -:attr:`~pcapkit.protocols.link.s_tag.S_Tag.info_name`, -:meth:`~pcapkit.protocols.link.s_tag.S_Tag.id` -- and its registry index. - -It has a module of its own, apart from -:class:`~pcapkit.protocols.link.c_tag.C_Tag`, since a module holds one protocol +:class:`~pcapkit.protocols.link.vlan.protocol.VLAN`; this class adds only the tag's own +identity -- :attr:`~pcapkit.protocols.link.s_tag.protocol.S_Tag.name`, +:attr:`~pcapkit.protocols.link.s_tag.protocol.S_Tag.alias`, +:attr:`~pcapkit.protocols.link.s_tag.protocol.S_Tag.info_name`, +:meth:`~pcapkit.protocols.link.s_tag.protocol.S_Tag.id` -- and its registry index. + +It has a package of its own, apart from +:class:`~pcapkit.protocols.link.c_tag.protocol.C_Tag`, since a package holds one protocol class, named after it, with only the framework bases in :mod:`pcapkit.protocols.protocol` exempt (:issue:`2529`). The two tags are reached through different registry indices, ``0x88A8`` against ``0x8100``. -.. autoclass:: pcapkit.protocols.link.s_tag.S_Tag +.. autoclass:: pcapkit.protocols.link.s_tag.protocol.S_Tag :no-members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/link/vlan.rst b/docs/source/pcapkit/protocols/link/vlan.rst index 23e9c5a110..bae4733f35 100644 --- a/docs/source/pcapkit/protocols/link/vlan.rst +++ b/docs/source/pcapkit/protocols/link/vlan.rst @@ -2,11 +2,12 @@ VLAN - 802.1Q/802.1ad VLAN Tag Types ==================================== .. module:: pcapkit.protocols.link.vlan +.. module:: pcapkit.protocols.link.vlan.protocol -:mod:`pcapkit.protocols.link.vlan` contains -:class:`~pcapkit.protocols.link.vlan.VLAN` only, an abstract base class holding +:mod:`pcapkit.protocols.link.vlan.protocol` contains +:class:`~pcapkit.protocols.link.vlan.protocol.VLAN` only, an abstract base class holding the tag layout shared by every VLAN tag [*]_. The concrete tags live in -modules of their own: +packages of their own: .. list-table:: :header-rows: 1 @@ -14,9 +15,9 @@ modules of their own: * - EtherType - Class * - ``0x8100`` (customer tag, 802.1Q) - - :class:`~pcapkit.protocols.link.c_tag.C_Tag` + - :class:`~pcapkit.protocols.link.c_tag.protocol.C_Tag` * - ``0x88A8`` (service tag, 802.1ad) - - :class:`~pcapkit.protocols.link.s_tag.S_Tag` + - :class:`~pcapkit.protocols.link.s_tag.protocol.S_Tag` The tag structure is described as below, keyed as for a customer tag; a service tag's keys start ``s_tag`` instead: @@ -56,13 +57,13 @@ next-EtherType is ``0x8100``, which selects a customer tag in turn: would nest a ``c_tag`` inside a ``c_tag``, leaving nothing to say which was the service tag. -Each tag has a module of its own because a module holds one protocol class, +Each tag has a package of its own because a package holds one protocol class, named after it, with only the framework bases in :mod:`pcapkit.protocols.protocol` exempt (:issue:`2529`). This base is abstract, nothing dispatches to it, and it declares no :meth:`~pcapkit.protocols.protocol.Protocol.__index__`, so its ``__index__`` raises. -.. autoclass:: pcapkit.protocols.link.vlan.VLAN +.. autoclass:: pcapkit.protocols.link.vlan.protocol.VLAN :no-members: :show-inheritance: @@ -80,35 +81,45 @@ declares no :meth:`~pcapkit.protocols.protocol.Protocol.__index__`, so its Header Schemas -------------- -.. module:: pcapkit.protocols.schema.link.vlan +.. module:: pcapkit.protocols.link.vlan.schema + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.schema.link.vlan``, with no alias: the module moved here + (:issue:`2534`). Both tags share these, since their layouts are identical. -.. autoclass:: pcapkit.protocols.schema.link.vlan.VLAN +.. autoclass:: pcapkit.protocols.link.vlan.schema.VLAN :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.link.vlan.TCI +.. autoclass:: pcapkit.protocols.link.vlan.schema.TCI :members: :show-inheritance: Type Stubs ~~~~~~~~~~ -.. autoclass:: pcapkit.protocols.schema.link.vlan.TCIType +.. autoclass:: pcapkit.protocols.link.vlan.schema.TCIType :members: :show-inheritance: Data Models ----------- -.. module:: pcapkit.protocols.data.link.vlan +.. module:: pcapkit.protocols.link.vlan.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.link.vlan``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.data.link.vlan.VLAN +.. autoclass:: pcapkit.protocols.link.vlan.data.VLAN :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.link.vlan.TCI +.. autoclass:: pcapkit.protocols.link.vlan.data.TCI :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/misc/checksum.rst b/docs/source/pcapkit/protocols/misc/checksum.rst index c6737fa3cb..80e9c1fabf 100644 --- a/docs/source/pcapkit/protocols/misc/checksum.rst +++ b/docs/source/pcapkit/protocols/misc/checksum.rst @@ -3,12 +3,10 @@ Checksums ========= .. module:: pcapkit.protocols.misc.checksum -.. module:: pcapkit.protocols.data.misc.checksum -.. module:: pcapkit.protocols.schema.misc.checksum :mod:`pcapkit.protocols.misc.checksum` contains the pseudo-header that upper-layer checksums cover, -:class:`~pcapkit.protocols.misc.checksum.ip_pseudo.IP_Pseudo`. What the +:class:`~pcapkit.protocols.misc.checksum.ip_pseudo.protocol.IP_Pseudo`. What the one's-complement checksums share, such as :class:`~pcapkit.corekit.checksum.internet.ChecksumStatus`, is in :mod:`pcapkit.corekit.checksum.internet`. @@ -17,9 +15,10 @@ IP Pseudo-Header ================ .. module:: pcapkit.protocols.misc.checksum.ip_pseudo +.. module:: pcapkit.protocols.misc.checksum.ip_pseudo.protocol -:mod:`pcapkit.protocols.misc.checksum.ip_pseudo` contains -:class:`~pcapkit.protocols.misc.checksum.ip_pseudo.IP_Pseudo`, +:mod:`pcapkit.protocols.misc.checksum.ip_pseudo.protocol` contains +:class:`~pcapkit.protocols.misc.checksum.ip_pseudo.protocol.IP_Pseudo`, which implements the pseudo-header of the IP protocol family that the upper-layer checksums cover, and :func:`pseudo_header` and :func:`verify_upper`, through which the IP layers use it. The @@ -50,16 +49,16 @@ Octets Bits Name Description ======= ========= ========================= =============================== A checksum over the IP pseudo-header is verified and computed by the enclosing -:class:`~pcapkit.protocols.internet.ipv4.IPv4` or -:class:`~pcapkit.protocols.internet.ipv6.IPv6` layer, which builds the -:class:`~pcapkit.protocols.misc.checksum.ip_pseudo.IP_Pseudo`, rather than by +:class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4` or +:class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6` layer, which builds the +:class:`~pcapkit.protocols.misc.checksum.ip_pseudo.protocol.IP_Pseudo`, rather than by the upper layer reaching back to its parent. So an upper layer constructed alone, or behind another header such as an IPv6 extension header or an Authentication Header, has its checksum computed only if given the ``pseudo`` to compute it over, and one parsed alone records no outcome. The sum itself is in :mod:`pcapkit.corekit.checksum.internet`. -.. autoclass:: pcapkit.protocols.misc.checksum.ip_pseudo.IP_Pseudo +.. autoclass:: pcapkit.protocols.misc.checksum.ip_pseudo.protocol.IP_Pseudo :no-members: :show-inheritance: @@ -82,33 +81,33 @@ in :mod:`pcapkit.corekit.checksum.internet`. .. automethod:: __post_init__ .. automethod:: __index__ -.. autofunction:: pcapkit.protocols.misc.checksum.ip_pseudo.pseudo_header -.. autofunction:: pcapkit.protocols.misc.checksum.ip_pseudo.verify_upper +.. autofunction:: pcapkit.protocols.misc.checksum.ip_pseudo.protocol.pseudo_header +.. autofunction:: pcapkit.protocols.misc.checksum.ip_pseudo.protocol.verify_upper Header Schemas -------------- -.. module:: pcapkit.protocols.schema.misc.checksum.ip_pseudo +.. module:: pcapkit.protocols.misc.checksum.ip_pseudo.schema -.. autodata:: pcapkit.protocols.schema.misc.checksum.ip_pseudo.IPV4_PSEUDO_LEN -.. autodata:: pcapkit.protocols.schema.misc.checksum.ip_pseudo.IPV6_PSEUDO_LEN +.. autodata:: pcapkit.protocols.misc.checksum.ip_pseudo.schema.IPV4_PSEUDO_LEN +.. autodata:: pcapkit.protocols.misc.checksum.ip_pseudo.schema.IPV6_PSEUDO_LEN -.. autoclass:: pcapkit.protocols.schema.misc.checksum.ip_pseudo.IP_Pseudo +.. autoclass:: pcapkit.protocols.misc.checksum.ip_pseudo.schema.IP_Pseudo :members: :show-inheritance: Auxiliary Functions ~~~~~~~~~~~~~~~~~~~ -.. autofunction:: pcapkit.protocols.schema.misc.checksum.ip_pseudo.is_ipv6 -.. autofunction:: pcapkit.protocols.schema.misc.checksum.ip_pseudo.ip_pseudo_address_selector -.. autofunction:: pcapkit.protocols.schema.misc.checksum.ip_pseudo.ip_pseudo_zero_selector +.. autofunction:: pcapkit.protocols.misc.checksum.ip_pseudo.schema.is_ipv6 +.. autofunction:: pcapkit.protocols.misc.checksum.ip_pseudo.schema.ip_pseudo_address_selector +.. autofunction:: pcapkit.protocols.misc.checksum.ip_pseudo.schema.ip_pseudo_zero_selector Data Models ----------- -.. module:: pcapkit.protocols.data.misc.checksum.ip_pseudo +.. module:: pcapkit.protocols.misc.checksum.ip_pseudo.data -.. autoclass:: pcapkit.protocols.data.misc.checksum.ip_pseudo.IP_Pseudo +.. autoclass:: pcapkit.protocols.misc.checksum.ip_pseudo.data.IP_Pseudo :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/misc/index.rst b/docs/source/pcapkit/protocols/misc/index.rst index 492ac25473..11b26adbd3 100644 --- a/docs/source/pcapkit/protocols/misc/index.rst +++ b/docs/source/pcapkit/protocols/misc/index.rst @@ -2,14 +2,12 @@ Auxiliary Protocols =================== .. module:: pcapkit.protocols.misc -.. module:: pcapkit.protocols.data.misc -.. module:: pcapkit.protocols.schema.misc :mod:`pcapkit.protocols.misc` contains the auxiliary protocol implementations. These include the PCAP header classes, the PCAP-NG -:class:`~pcapkit.protocols.misc.pcapng.PCAPNG` class, the -:class:`~pcapkit.protocols.misc.raw.Raw` class for not-supported protocols, and -the :class:`~pcapkit.protocols.misc.no_payload.NoPayload` class for indication of +:class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG` class, the +:class:`~pcapkit.protocols.misc.raw.protocol.Raw` class for not-supported protocols, and +the :class:`~pcapkit.protocols.misc.no_payload.protocol.NoPayload` class for indication of empty payload. .. toctree:: diff --git a/docs/source/pcapkit/protocols/misc/no_payload.rst b/docs/source/pcapkit/protocols/misc/no_payload.rst index 604322eb96..735f55a05f 100644 --- a/docs/source/pcapkit/protocols/misc/no_payload.rst +++ b/docs/source/pcapkit/protocols/misc/no_payload.rst @@ -2,12 +2,13 @@ No-Payload Packet ================= .. module:: pcapkit.protocols.misc.no_payload +.. module:: pcapkit.protocols.misc.no_payload.protocol -:mod:`pcapkit.protocols.misc.no_payload` contains -:class:`~pcapkit.protocols.misc.no_payload.NoPayload` only, which +:mod:`pcapkit.protocols.misc.no_payload.protocol` contains +:class:`~pcapkit.protocols.misc.no_payload.protocol.NoPayload` only, which implements a :class:`~pcapkit.protocols.protocol.Protocol` like object whose payload is recursively -:class:`~pcapkit.protocols.misc.no_payload.NoPayload` itself. +:class:`~pcapkit.protocols.misc.no_payload.protocol.NoPayload` itself. .. versionadded:: 1.6.0 @@ -20,7 +21,7 @@ object whose payload is recursively ``pcapkit.protocols.misc.null``, ``pcapkit.protocols.data.misc.null`` and ``pcapkit.protocols.schema.misc.null``, with no alias (:issue:`2529`). -.. autoclass:: pcapkit.protocols.misc.no_payload.NoPayload +.. autoclass:: pcapkit.protocols.misc.no_payload.protocol.NoPayload :no-members: :show-inheritance: @@ -37,17 +38,17 @@ object whose payload is recursively Header Schemas -------------- -.. module:: pcapkit.protocols.schema.misc.no_payload +.. module:: pcapkit.protocols.misc.no_payload.schema -.. autoclass:: pcapkit.protocols.schema.misc.no_payload.NoPayload +.. autoclass:: pcapkit.protocols.misc.no_payload.schema.NoPayload :members: :show-inheritance: Data Models ----------- -.. module:: pcapkit.protocols.data.misc.no_payload +.. module:: pcapkit.protocols.misc.no_payload.data -.. autoclass:: pcapkit.protocols.data.misc.no_payload.NoPayload +.. autoclass:: pcapkit.protocols.misc.no_payload.data.NoPayload :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/misc/pcap.rst b/docs/source/pcapkit/protocols/misc/pcap.rst index 57041c2f99..a2f5a1a077 100644 --- a/docs/source/pcapkit/protocols/misc/pcap.rst +++ b/docs/source/pcapkit/protocols/misc/pcap.rst @@ -3,21 +3,20 @@ PCAP File Headers ================= .. module:: pcapkit.protocols.misc.pcap -.. module:: pcapkit.protocols.data.misc.pcap -.. module:: pcapkit.protocols.schema.misc.pcap :mod:`pcapkit.protocols.misc.pcap` contains header descriptions for PCAP files, including global header -(:class:`~pcapkit.protocols.misc.pcap.header.Header`) and frame header -(:class:`~pcapkit.protocols.misc.pcap.frame.Frame`). +(:class:`~pcapkit.protocols.misc.pcap.header.protocol.Header`) and frame header +(:class:`~pcapkit.protocols.misc.pcap.frame.protocol.Frame`). Global Header ============= .. module:: pcapkit.protocols.misc.pcap.header +.. module:: pcapkit.protocols.misc.pcap.header.protocol -:mod:`pcapkit.protocols.misc.pcap.header` contains -:class:`~pcapkit.protocols.misc.pcap.header.Header` only, +:mod:`pcapkit.protocols.misc.pcap.header.protocol` contains +:class:`~pcapkit.protocols.misc.pcap.header.protocol.Header` only, which implements an extractor for global headers [*]_ of PCAP, whose structure is described as below: @@ -38,7 +37,7 @@ of PCAP, whose structure is described as below: A global header cut short rebuilds as captured, where it rebuilt at full width (:issue:`1470`). -.. autoclass:: pcapkit.protocols.misc.pcap.header.Header +.. autoclass:: pcapkit.protocols.misc.pcap.header.protocol.Header :no-members: :show-inheritance: @@ -64,33 +63,43 @@ of PCAP, whose structure is described as below: Header Schemas -------------- -.. module:: pcapkit.protocols.schema.misc.pcap.header +.. module:: pcapkit.protocols.misc.pcap.header.schema -.. autodata:: pcapkit.protocols.schema.misc.pcap.header.GLOBAL_HEADER_LEN +.. versionremoved:: 1.6.0 -.. autodata:: pcapkit.protocols.schema.misc.pcap.header.MAGIC_NUMBER + ``pcapkit.protocols.schema.misc.pcap.header``, with no alias: the module moved here + (:issue:`2534`). + +.. autodata:: pcapkit.protocols.misc.pcap.header.schema.GLOBAL_HEADER_LEN + +.. autodata:: pcapkit.protocols.misc.pcap.header.schema.MAGIC_NUMBER :no-value: -.. autodata:: pcapkit.protocols.schema.misc.pcap.header.RESOLUTION +.. autodata:: pcapkit.protocols.misc.pcap.header.schema.RESOLUTION :no-value: -.. autodata:: pcapkit.protocols.schema.misc.pcap.header.RESOLUTION_PLACES +.. autodata:: pcapkit.protocols.misc.pcap.header.schema.RESOLUTION_PLACES :no-value: -.. autoclass:: pcapkit.protocols.schema.misc.pcap.header.Header +.. autoclass:: pcapkit.protocols.misc.pcap.header.schema.Header :members: :show-inheritance: Data Models ----------- -.. module:: pcapkit.protocols.data.misc.pcap.header +.. module:: pcapkit.protocols.misc.pcap.header.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.misc.pcap.header``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.data.misc.pcap.header.Header +.. autoclass:: pcapkit.protocols.misc.pcap.header.data.Header :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcap.header.MagicNumber +.. autoclass:: pcapkit.protocols.misc.pcap.header.data.MagicNumber :members: :show-inheritance: @@ -98,9 +107,10 @@ Frame Header ============ .. module:: pcapkit.protocols.misc.pcap.frame +.. module:: pcapkit.protocols.misc.pcap.frame.protocol -:mod:`pcapkit.protocols.misc.pcap.frame` contains -:class:`~pcapkit.protocols.misc.pcap.frame.Frame` only, +:mod:`pcapkit.protocols.misc.pcap.frame.protocol` contains +:class:`~pcapkit.protocols.misc.pcap.frame.protocol.Frame` only, which implements an extractor for frame headers [*]_ of PCAP, whose structure is described as below: @@ -121,7 +131,7 @@ whose structure is described as below: ``len`` is the on-wire length and ``cap_len`` the captured one, where the two were swapped (:issue:`618`). -.. autoclass:: pcapkit.protocols.misc.pcap.frame.Frame +.. autoclass:: pcapkit.protocols.misc.pcap.frame.protocol.Frame :no-members: :show-inheritance: @@ -152,24 +162,34 @@ whose structure is described as below: Header Schemas -------------- -.. module:: pcapkit.protocols.schema.misc.pcap.frame +.. module:: pcapkit.protocols.misc.pcap.frame.schema -.. autodata:: pcapkit.protocols.schema.misc.pcap.frame.RECORD_HEADER_LEN +.. versionremoved:: 1.6.0 -.. autoclass:: pcapkit.protocols.schema.misc.pcap.frame.Frame + ``pcapkit.protocols.schema.misc.pcap.frame``, with no alias: the module moved here + (:issue:`2534`). + +.. autodata:: pcapkit.protocols.misc.pcap.frame.schema.RECORD_HEADER_LEN + +.. autoclass:: pcapkit.protocols.misc.pcap.frame.schema.Frame :members: :show-inheritance: Data Models ----------- -.. module:: pcapkit.protocols.data.misc.pcap.frame +.. module:: pcapkit.protocols.misc.pcap.frame.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.misc.pcap.frame``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.data.misc.pcap.frame.Frame +.. autoclass:: pcapkit.protocols.misc.pcap.frame.data.Frame :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcap.frame.FrameInfo +.. autoclass:: pcapkit.protocols.misc.pcap.frame.data.FrameInfo :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/misc/pcapng.rst b/docs/source/pcapkit/protocols/misc/pcapng.rst index cb1a6d1f39..e073bbe9d3 100644 --- a/docs/source/pcapkit/protocols/misc/pcapng.rst +++ b/docs/source/pcapkit/protocols/misc/pcapng.rst @@ -3,13 +3,26 @@ PCAP-NG File Format =================== .. module:: pcapkit.protocols.misc.pcapng - -:mod:`pcapkit.protocols.misc.pcapng` contains -:class:`~pcapkit.protocols.misc.pcapng.PCAPNG`, +.. module:: pcapkit.protocols.misc.pcapng.protocol + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.misc.pcapng.PacketDirection``, + ``pcapkit.protocols.misc.pcapng.PacketReception`` and + ``pcapkit.protocols.misc.pcapng.WireGuardKeyLabel``, with no alias: they are in this + module, and :mod:`pcapkit.protocols.misc.pcapng` exports the protocol class alone + (:issue:`2534`). ``pcapkit.protocols.misc.pcapng.PAT_EUI_ADDR`` and + ``pcapkit.protocols.misc.pcapng.PAT_MAC_ADDR``, with no alias: + :meth:`~pcapkit.protocols.protocol.Protocol._read_mac_addr` and + :meth:`~pcapkit.protocols.protocol.Protocol._make_mac_addr` read and make the address + (:issue:`2614`). + +:mod:`pcapkit.protocols.misc.pcapng.protocol` contains +:class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG`, which implements an extractor for PCAP-NG file format [*]_, and the -:class:`~pcapkit.protocols.misc.pcapng.PacketDirection`, -:class:`~pcapkit.protocols.misc.pcapng.PacketReception` and -:class:`~pcapkit.protocols.misc.pcapng.WireGuardKeyLabel` enumerations. +:class:`~pcapkit.protocols.misc.pcapng.protocol.PacketDirection`, +:class:`~pcapkit.protocols.misc.pcapng.protocol.PacketReception` and +:class:`~pcapkit.protocols.misc.pcapng.protocol.WireGuardKeyLabel` enumerations. .. versionchanged:: 1.5.0 @@ -28,7 +41,7 @@ which implements an extractor for PCAP-NG file format [*]_, and the raise :exc:`ValueError` (:issue:`678`); and ``timestamp_epoch`` is not shifted by the host's timezone (:issue:`361`). -.. autoclass:: pcapkit.protocols.misc.pcapng.PCAPNG +.. autoclass:: pcapkit.protocols.misc.pcapng.protocol.PCAPNG :no-members: :show-inheritance: @@ -222,12 +235,12 @@ which implements an extractor for PCAP-NG file format [*]_, and the Auxiliary Data -------------- -.. autoclass:: pcapkit.protocols.misc.pcapng.PacketDirection +.. autoclass:: pcapkit.protocols.misc.pcapng.protocol.PacketDirection :members: :undoc-members: :show-inheritance: -.. autoclass:: pcapkit.protocols.misc.pcapng.PacketReception +.. autoclass:: pcapkit.protocols.misc.pcapng.protocol.PacketReception :members: :undoc-members: :show-inheritance: @@ -243,7 +256,7 @@ IANA registry. :class:`pcapkit.const.pcapng.tls_key_label.TLSKeyLabel` instead (:issue:`886`, :issue:`1744`). -.. autoclass:: pcapkit.protocols.misc.pcapng.WireGuardKeyLabel +.. autoclass:: pcapkit.protocols.misc.pcapng.protocol.WireGuardKeyLabel :members: :undoc-members: :show-inheritance: @@ -251,325 +264,330 @@ IANA registry. Header Schemas -------------- -.. module:: pcapkit.protocols.schema.misc.pcapng +.. module:: pcapkit.protocols.misc.pcapng.schema + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.schema.misc.pcapng``, with no alias: the module moved here + (:issue:`2534`). -.. autodata:: pcapkit.protocols.schema.misc.pcapng.BYTE_ORDER_MAGIC +.. autodata:: pcapkit.protocols.misc.pcapng.schema.BYTE_ORDER_MAGIC -.. autodata:: pcapkit.protocols.schema.misc.pcapng.GENERIC_BLOCK_MINIMUM +.. autodata:: pcapkit.protocols.misc.pcapng.schema.GENERIC_BLOCK_MINIMUM -.. autodata:: pcapkit.protocols.schema.misc.pcapng.BLOCK_MINIMUM +.. autodata:: pcapkit.protocols.misc.pcapng.schema.BLOCK_MINIMUM :no-value: -.. autodata:: pcapkit.protocols.schema.misc.pcapng.DEFAULT_RESOLUTION +.. autodata:: pcapkit.protocols.misc.pcapng.schema.DEFAULT_RESOLUTION -.. autodata:: pcapkit.protocols.schema.misc.pcapng.PACKET_FLAGS +.. autodata:: pcapkit.protocols.misc.pcapng.schema.PACKET_FLAGS :no-value: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.PCAPNG +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.PCAPNG :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.BlockType +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.BlockType :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.UnknownBlock +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.UnknownBlock :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.SectionHeaderBlock +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.SectionHeaderBlock :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.InterfaceDescriptionBlock +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.InterfaceDescriptionBlock :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.EnhancedPacketBlock +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.EnhancedPacketBlock :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.SimplePacketBlock +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.SimplePacketBlock :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.NameResolutionBlock +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.NameResolutionBlock :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.InterfaceStatisticsBlock +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.InterfaceStatisticsBlock :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.SystemdJournalExportBlock +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.SystemdJournalExportBlock :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.DecryptionSecretsBlock +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.DecryptionSecretsBlock :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.CustomBlock +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.CustomBlock :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.PacketBlock +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.PacketBlock :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.Option +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.Option :members: :show-inheritance: :special-members: __enum__ -.. autoclass:: pcapkit.protocols.schema.misc.pcapng._OPT_Option +.. autoclass:: pcapkit.protocols.misc.pcapng.schema._OPT_Option :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.UnknownOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.UnknownOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.EndOfOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.EndOfOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.CommentOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.CommentOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.CustomOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.CustomOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng._IF_Option +.. autoclass:: pcapkit.protocols.misc.pcapng.schema._IF_Option :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.IF_NameOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.IF_NameOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.IF_DescriptionOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.IF_DescriptionOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.IF_IPv4AddrOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.IF_IPv4AddrOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.IF_IPv6AddrOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.IF_IPv6AddrOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.IF_MACAddrOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.IF_MACAddrOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.IF_EUIAddrOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.IF_EUIAddrOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.IF_SpeedOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.IF_SpeedOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.IF_TSResolOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.IF_TSResolOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.IF_TZoneOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.IF_TZoneOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.IF_FilterOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.IF_FilterOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.IF_OSOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.IF_OSOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.IF_FCSLenOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.IF_FCSLenOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.IF_TSOffsetOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.IF_TSOffsetOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.IF_HardwareOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.IF_HardwareOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.IF_TxSpeedOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.IF_TxSpeedOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.IF_RxSpeedOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.IF_RxSpeedOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng._EPB_Option +.. autoclass:: pcapkit.protocols.misc.pcapng.schema._EPB_Option :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.EPB_FlagsOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.EPB_FlagsOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.EPB_HashOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.EPB_HashOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.EPB_DropCountOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.EPB_DropCountOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.EPB_PacketIDOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.EPB_PacketIDOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.EPB_QueueOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.EPB_QueueOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.EPB_VerdictOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.EPB_VerdictOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng._NS_Option +.. autoclass:: pcapkit.protocols.misc.pcapng.schema._NS_Option :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.NS_DNSNameOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.NS_DNSNameOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.NS_DNSIP4AddrOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.NS_DNSIP4AddrOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.NS_DNSIP6AddrOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.NS_DNSIP6AddrOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng._ISB_Option +.. autoclass:: pcapkit.protocols.misc.pcapng.schema._ISB_Option :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.ISB_StartTimeOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.ISB_StartTimeOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.ISB_EndTimeOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.ISB_EndTimeOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.ISB_IFRecvOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.ISB_IFRecvOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.ISB_IFDropOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.ISB_IFDropOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.ISB_FilterAcceptOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.ISB_FilterAcceptOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.ISB_OSDropOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.ISB_OSDropOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.ISB_UsrDelivOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.ISB_UsrDelivOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng._PACK_Option +.. autoclass:: pcapkit.protocols.misc.pcapng.schema._PACK_Option :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.PACK_FlagsOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.PACK_FlagsOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.PACK_HashOption +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.PACK_HashOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.NameResolutionRecord +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.NameResolutionRecord :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.UnknownRecord +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.UnknownRecord :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.EndRecord +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.EndRecord :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.IPv4Record +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.IPv4Record :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.IPv6Record +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.IPv6Record :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.DSBSecrets +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.DSBSecrets :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.UnknownSecrets +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.UnknownSecrets :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.TLSKeyLog +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.TLSKeyLog :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.WireGuardKeyLog +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.WireGuardKeyLog :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.ZigBeeNWKKey +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.ZigBeeNWKKey :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.ZigBeeAPSKey +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.ZigBeeAPSKey :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.FlagsField +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.FlagsField :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.OptionEnumField +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.OptionEnumField :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.OptionAreaField +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.OptionAreaField :members: :show-inheritance: Type Stubs ---------- -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.ByteorderTest +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.ByteorderTest :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.ResolutionData +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.ResolutionData :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.EPBFlags +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.EPBFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.misc.pcapng.PACKFlags +.. autoclass:: pcapkit.protocols.misc.pcapng.schema.PACKFlags :members: :show-inheritance: @@ -581,277 +599,282 @@ The byte order of every block but the Section Header Block is read by shared with the PCAP frame header and documented in :mod:`pcapkit.corekit.schema.byteorder`. -.. autofunction:: pcapkit.protocols.schema.misc.pcapng.shb_byteorder_callback -.. autofunction:: pcapkit.protocols.schema.misc.pcapng.pcapng_block_selector -.. autofunction:: pcapkit.protocols.schema.misc.pcapng.dsb_secrets_selector - -.. autofunction:: pcapkit.protocols.schema.misc.pcapng.nonnegative -.. autofunction:: pcapkit.protocols.schema.misc.pcapng.held_body -.. autofunction:: pcapkit.protocols.schema.misc.pcapng.bounded_option -.. autofunction:: pcapkit.protocols.schema.misc.pcapng.bounded_area -.. autofunction:: pcapkit.protocols.schema.misc.pcapng.captured_area -.. autofunction:: pcapkit.protocols.schema.misc.pcapng.secrets_area -.. autofunction:: pcapkit.protocols.schema.misc.pcapng.zigbee_key_has_trailing -.. autofunction:: pcapkit.protocols.schema.misc.pcapng.zigbee_key_trailing -.. autofunction:: pcapkit.protocols.schema.misc.pcapng.zigbee_key_held -.. autofunction:: pcapkit.protocols.schema.misc.pcapng._spb_data_length -.. autofunction:: pcapkit.protocols.schema.misc.pcapng._cut_last_line -.. autofunction:: pcapkit.protocols.schema.misc.pcapng._malformed_line_message +.. autofunction:: pcapkit.protocols.misc.pcapng.schema.shb_byteorder_callback +.. autofunction:: pcapkit.protocols.misc.pcapng.schema.pcapng_block_selector +.. autofunction:: pcapkit.protocols.misc.pcapng.schema.dsb_secrets_selector + +.. autofunction:: pcapkit.protocols.misc.pcapng.schema.nonnegative +.. autofunction:: pcapkit.protocols.misc.pcapng.schema.held_body +.. autofunction:: pcapkit.protocols.misc.pcapng.schema.bounded_option +.. autofunction:: pcapkit.protocols.misc.pcapng.schema.bounded_area +.. autofunction:: pcapkit.protocols.misc.pcapng.schema.captured_area +.. autofunction:: pcapkit.protocols.misc.pcapng.schema.secrets_area +.. autofunction:: pcapkit.protocols.misc.pcapng.schema.zigbee_key_has_trailing +.. autofunction:: pcapkit.protocols.misc.pcapng.schema.zigbee_key_trailing +.. autofunction:: pcapkit.protocols.misc.pcapng.schema.zigbee_key_held +.. autofunction:: pcapkit.protocols.misc.pcapng.schema._spb_data_length +.. autofunction:: pcapkit.protocols.misc.pcapng.schema._cut_last_line +.. autofunction:: pcapkit.protocols.misc.pcapng.schema._malformed_line_message Data Models ----------- -.. module:: pcapkit.protocols.data.misc.pcapng +.. module:: pcapkit.protocols.misc.pcapng.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.misc.pcapng``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.data.misc.pcapng.PCAPNG +.. autoclass:: pcapkit.protocols.misc.pcapng.data.PCAPNG :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.UnknownBlock +.. autoclass:: pcapkit.protocols.misc.pcapng.data.UnknownBlock :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.SectionHeaderBlock +.. autoclass:: pcapkit.protocols.misc.pcapng.data.SectionHeaderBlock :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.InterfaceDescriptionBlock +.. autoclass:: pcapkit.protocols.misc.pcapng.data.InterfaceDescriptionBlock :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.EnhancedPacketBlock +.. autoclass:: pcapkit.protocols.misc.pcapng.data.EnhancedPacketBlock :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.SimplePacketBlock +.. autoclass:: pcapkit.protocols.misc.pcapng.data.SimplePacketBlock :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.NameResolutionBlock +.. autoclass:: pcapkit.protocols.misc.pcapng.data.NameResolutionBlock :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.InterfaceStatisticsBlock +.. autoclass:: pcapkit.protocols.misc.pcapng.data.InterfaceStatisticsBlock :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.SystemdJournalExportBlock +.. autoclass:: pcapkit.protocols.misc.pcapng.data.SystemdJournalExportBlock :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.DecryptionSecretsBlock +.. autoclass:: pcapkit.protocols.misc.pcapng.data.DecryptionSecretsBlock :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.CustomBlock +.. autoclass:: pcapkit.protocols.misc.pcapng.data.CustomBlock :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.PacketBlock +.. autoclass:: pcapkit.protocols.misc.pcapng.data.PacketBlock :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.Option +.. autoclass:: pcapkit.protocols.misc.pcapng.data.Option :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.UnknownOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.UnknownOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.EndOfOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.EndOfOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.CommentOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.CommentOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.CustomOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.CustomOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.IF_NameOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.IF_NameOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.IF_DescriptionOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.IF_DescriptionOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.IF_IPv4AddrOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.IF_IPv4AddrOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.IF_IPv6AddrOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.IF_IPv6AddrOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.IF_MACAddrOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.IF_MACAddrOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.IF_EUIAddrOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.IF_EUIAddrOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.IF_SpeedOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.IF_SpeedOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.IF_TSResolOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.IF_TSResolOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.IF_TZoneOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.IF_TZoneOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.IF_FilterOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.IF_FilterOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.IF_OSOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.IF_OSOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.IF_FCSLenOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.IF_FCSLenOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.IF_TSOffsetOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.IF_TSOffsetOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.IF_HardwareOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.IF_HardwareOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.IF_TxSpeedOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.IF_TxSpeedOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.IF_RxSpeedOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.IF_RxSpeedOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.EPB_FlagsOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.EPB_FlagsOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.EPB_HashOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.EPB_HashOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.EPB_DropCountOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.EPB_DropCountOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.EPB_PacketIDOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.EPB_PacketIDOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.EPB_QueueOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.EPB_QueueOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.EPB_VerdictOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.EPB_VerdictOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.NS_DNSNameOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.NS_DNSNameOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.NS_DNSIP4AddrOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.NS_DNSIP4AddrOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.NS_DNSIP6AddrOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.NS_DNSIP6AddrOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.ISB_StartTimeOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.ISB_StartTimeOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.ISB_EndTimeOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.ISB_EndTimeOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.ISB_IFRecvOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.ISB_IFRecvOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.ISB_IFDropOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.ISB_IFDropOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.ISB_FilterAcceptOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.ISB_FilterAcceptOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.ISB_OSDropOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.ISB_OSDropOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.ISB_UsrDelivOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.ISB_UsrDelivOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.PACK_FlagsOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.PACK_FlagsOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.PACK_HashOption +.. autoclass:: pcapkit.protocols.misc.pcapng.data.PACK_HashOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.NameResolutionRecord +.. autoclass:: pcapkit.protocols.misc.pcapng.data.NameResolutionRecord :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.UnknownRecord +.. autoclass:: pcapkit.protocols.misc.pcapng.data.UnknownRecord :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.EndRecord +.. autoclass:: pcapkit.protocols.misc.pcapng.data.EndRecord :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.IPv4Record +.. autoclass:: pcapkit.protocols.misc.pcapng.data.IPv4Record :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.IPv6Record +.. autoclass:: pcapkit.protocols.misc.pcapng.data.IPv6Record :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.DSBSecrets +.. autoclass:: pcapkit.protocols.misc.pcapng.data.DSBSecrets :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.UnknownSecrets +.. autoclass:: pcapkit.protocols.misc.pcapng.data.UnknownSecrets :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.TLSKeyLogEntries +.. autoclass:: pcapkit.protocols.misc.pcapng.data.TLSKeyLogEntries :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.TLSKeyLog +.. autoclass:: pcapkit.protocols.misc.pcapng.data.TLSKeyLog :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.WireGuardKeyLog +.. autoclass:: pcapkit.protocols.misc.pcapng.data.WireGuardKeyLog :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.ZigBeeNWKKey +.. autoclass:: pcapkit.protocols.misc.pcapng.data.ZigBeeNWKKey :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.misc.pcapng.ZigBeeAPSKey +.. autoclass:: pcapkit.protocols.misc.pcapng.data.ZigBeeAPSKey :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/misc/raw.rst b/docs/source/pcapkit/protocols/misc/raw.rst index dd43093ee0..e3d4a4790a 100644 --- a/docs/source/pcapkit/protocols/misc/raw.rst +++ b/docs/source/pcapkit/protocols/misc/raw.rst @@ -2,13 +2,14 @@ Raw Packet Data =============== .. module:: pcapkit.protocols.misc.raw +.. module:: pcapkit.protocols.misc.raw.protocol -:mod:`pcapkit.protocols.misc.raw` contains -:class:`~pcapkit.protocols.misc.raw.Raw` only, which implements +:mod:`pcapkit.protocols.misc.raw.protocol` contains +:class:`~pcapkit.protocols.misc.raw.protocol.Raw` only, which implements an extractor for unknown protocols, and constructs a :class:`~pcapkit.protocols.protocol.Protocol` like object. -.. autoclass:: pcapkit.protocols.misc.raw.Raw +.. autoclass:: pcapkit.protocols.misc.raw.protocol.Raw :no-members: :show-inheritance: @@ -27,17 +28,27 @@ an extractor for unknown protocols, and constructs a Header Schemas -------------- -.. module:: pcapkit.protocols.schema.misc.raw +.. module:: pcapkit.protocols.misc.raw.schema -.. autoclass:: pcapkit.protocols.schema.misc.raw.Raw +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.schema.misc.raw``, with no alias: the module moved here + (:issue:`2534`). + +.. autoclass:: pcapkit.protocols.misc.raw.schema.Raw :members: :show-inheritance: Data Models ----------- -.. module:: pcapkit.protocols.data.misc.raw +.. module:: pcapkit.protocols.misc.raw.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.misc.raw``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.data.misc.raw.Raw +.. autoclass:: pcapkit.protocols.misc.raw.data.Raw :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/protocol.rst b/docs/source/pcapkit/protocols/protocol.rst index e1cf494c02..1b865f8f8e 100644 --- a/docs/source/pcapkit/protocols/protocol.rst +++ b/docs/source/pcapkit/protocols/protocol.rst @@ -2,7 +2,6 @@ Root Protocol ============= .. module:: pcapkit.protocols.protocol -.. module:: pcapkit.protocols.data.protocol .. currentmodule:: pcapkit.protocols.protocol :mod:`pcapkit.protocols.protocol` contains @@ -23,7 +22,7 @@ Internal Definitions below. Constructing a protocol with a keyword that none of its signatures declares raises :exc:`~pcapkit.utilities.exceptions.UnsupportedCall`, where it was discarded (:issue:`617`). A next layer captured shorter than - its header is kept as :class:`~pcapkit.protocols.misc.raw.Raw`, where it + its header is kept as :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, where it was parsed with zero-filled fields (:issue:`1170`). .. autoclass:: pcapkit.protocols.protocol.Protocol @@ -144,7 +143,7 @@ A frame is dissected to at most :data:`~pcapkit.utilities.config.FRAME_LAYER_LIMIT` layers of its protocol chain, counted from the first layer the frame record carries, through tunnels, VLAN tags and IPv6 extension headers alike. What follows is kept as -:class:`~pcapkit.protocols.misc.raw.Raw`, with one +:class:`~pcapkit.protocols.misc.raw.protocol.Raw`, with one :exc:`~pcapkit.utilities.warnings.ProtocolWarning` (:issue:`1610`), and is marked :attr:`~pcapkit.protocols.protocol.Protocol._past_layer_limit`, so the :term:`default engine`'s TCP reassembly and flow tracing do not read a TCP segment @@ -182,11 +181,11 @@ length to an alignment boundary. Data Models ----------- -.. autoclass:: pcapkit.protocols.data.protocol.Protocol +.. autoclass:: pcapkit.protocols.data.Protocol :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.protocol.Packet +.. autoclass:: pcapkit.protocols.data.Packet :members: :show-inheritance: @@ -353,7 +352,7 @@ Type Variables -------------- .. data:: _PT - :type: pcapkit.protocols.data.data.Data + :type: pcapkit.protocols.data.Data .. data:: _ST - :type: pcapkit.protocols.schema.schema.Schema + :type: pcapkit.protocols.schema.Schema diff --git a/docs/source/pcapkit/protocols/transport/dccp.rst b/docs/source/pcapkit/protocols/transport/dccp.rst index 8f52fd7cef..ccb0b333ef 100644 --- a/docs/source/pcapkit/protocols/transport/dccp.rst +++ b/docs/source/pcapkit/protocols/transport/dccp.rst @@ -2,9 +2,10 @@ DCCP - Datagram Congestion Control Protocol =========================================== .. module:: pcapkit.protocols.transport.dccp +.. module:: pcapkit.protocols.transport.dccp.protocol -:mod:`pcapkit.protocols.transport.dccp` contains -:class:`~pcapkit.protocols.transport.dccp.DCCP` only, +:mod:`pcapkit.protocols.transport.dccp.protocol` contains +:class:`~pcapkit.protocols.transport.dccp.protocol.DCCP` only, which implements the extractor for Datagram Congestion Control Protocol (DCCP) [*]_, whose generic header is described as below: @@ -30,7 +31,7 @@ header 12 octets long. The fields of the packet type, then the options, follow. .. versionadded:: 1.6.0 -.. autoclass:: pcapkit.protocols.transport.dccp.DCCP +.. autoclass:: pcapkit.protocols.transport.dccp.protocol.DCCP :no-members: :show-inheritance: @@ -88,173 +89,173 @@ header 12 octets long. The fields of the packet type, then the options, follow. .. automethod:: __index__ -.. autodata:: pcapkit.protocols.transport.dccp.DCCP_MAX_HEADER_LEN +.. autodata:: pcapkit.protocols.transport.dccp.protocol.DCCP_MAX_HEADER_LEN Header Schemas -------------- -.. module:: pcapkit.protocols.schema.transport.dccp +.. module:: pcapkit.protocols.transport.dccp.schema -.. autodata:: pcapkit.protocols.schema.transport.dccp.DCCP_MIN_HEADER_LEN +.. autodata:: pcapkit.protocols.transport.dccp.schema.DCCP_MIN_HEADER_LEN -.. autodata:: pcapkit.protocols.schema.transport.dccp.DCCP_SINGLE_OCTET_OPTION_MAX +.. autodata:: pcapkit.protocols.transport.dccp.schema.DCCP_SINGLE_OCTET_OPTION_MAX -.. autodata:: pcapkit.protocols.schema.transport.dccp.ACK_TYPES +.. autodata:: pcapkit.protocols.transport.dccp.schema.ACK_TYPES :no-value: -.. autodata:: pcapkit.protocols.schema.transport.dccp.SERVICE_TYPES +.. autodata:: pcapkit.protocols.transport.dccp.schema.SERVICE_TYPES :no-value: -.. autodata:: pcapkit.protocols.schema.transport.dccp.RESET_TYPE +.. autodata:: pcapkit.protocols.transport.dccp.schema.RESET_TYPE -.. autofunction:: pcapkit.protocols.schema.transport.dccp.header_length +.. autofunction:: pcapkit.protocols.transport.dccp.schema.header_length -.. autoclass:: pcapkit.protocols.schema.transport.dccp.DCCP +.. autoclass:: pcapkit.protocols.transport.dccp.schema.DCCP :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.dccp.Coverage +.. autoclass:: pcapkit.protocols.transport.dccp.schema.Coverage :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.dccp.TypeField +.. autoclass:: pcapkit.protocols.transport.dccp.schema.TypeField :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.dccp.Option +.. autoclass:: pcapkit.protocols.transport.dccp.schema.Option :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.dccp.UnassignedOption +.. autoclass:: pcapkit.protocols.transport.dccp.schema.UnassignedOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.dccp.Padding +.. autoclass:: pcapkit.protocols.transport.dccp.schema.Padding :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.dccp.Mandatory +.. autoclass:: pcapkit.protocols.transport.dccp.schema.Mandatory :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.dccp.SlowReceiver +.. autoclass:: pcapkit.protocols.transport.dccp.schema.SlowReceiver :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.dccp.Change +.. autoclass:: pcapkit.protocols.transport.dccp.schema.Change :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.dccp.Confirm +.. autoclass:: pcapkit.protocols.transport.dccp.schema.Confirm :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.dccp.InitCookie +.. autoclass:: pcapkit.protocols.transport.dccp.schema.InitCookie :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.dccp.NDPCount +.. autoclass:: pcapkit.protocols.transport.dccp.schema.NDPCount :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.dccp.AckVector +.. autoclass:: pcapkit.protocols.transport.dccp.schema.AckVector :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.dccp.DataDropped +.. autoclass:: pcapkit.protocols.transport.dccp.schema.DataDropped :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.dccp.Timestamp +.. autoclass:: pcapkit.protocols.transport.dccp.schema.Timestamp :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.dccp.TimestampEcho +.. autoclass:: pcapkit.protocols.transport.dccp.schema.TimestampEcho :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.dccp.ElapsedTime +.. autoclass:: pcapkit.protocols.transport.dccp.schema.ElapsedTime :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.dccp.DataChecksum +.. autoclass:: pcapkit.protocols.transport.dccp.schema.DataChecksum :members: :show-inheritance: Data Models ----------- -.. module:: pcapkit.protocols.data.transport.dccp +.. module:: pcapkit.protocols.transport.dccp.data -.. autoclass:: pcapkit.protocols.data.transport.dccp.DCCP +.. autoclass:: pcapkit.protocols.transport.dccp.data.DCCP :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.dccp.Option +.. autoclass:: pcapkit.protocols.transport.dccp.data.Option :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.dccp.UnassignedOption +.. autoclass:: pcapkit.protocols.transport.dccp.data.UnassignedOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.dccp.Padding +.. autoclass:: pcapkit.protocols.transport.dccp.data.Padding :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.dccp.Mandatory +.. autoclass:: pcapkit.protocols.transport.dccp.data.Mandatory :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.dccp.SlowReceiver +.. autoclass:: pcapkit.protocols.transport.dccp.data.SlowReceiver :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.dccp.Change +.. autoclass:: pcapkit.protocols.transport.dccp.data.Change :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.dccp.Confirm +.. autoclass:: pcapkit.protocols.transport.dccp.data.Confirm :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.dccp.InitCookie +.. autoclass:: pcapkit.protocols.transport.dccp.data.InitCookie :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.dccp.NDPCount +.. autoclass:: pcapkit.protocols.transport.dccp.data.NDPCount :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.dccp.AckVector +.. autoclass:: pcapkit.protocols.transport.dccp.data.AckVector :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.dccp.AckVectorRun +.. autoclass:: pcapkit.protocols.transport.dccp.data.AckVectorRun :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.dccp.DataDropped +.. autoclass:: pcapkit.protocols.transport.dccp.data.DataDropped :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.dccp.DataDroppedBlock +.. autoclass:: pcapkit.protocols.transport.dccp.data.DataDroppedBlock :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.dccp.Timestamp +.. autoclass:: pcapkit.protocols.transport.dccp.data.Timestamp :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.dccp.TimestampEcho +.. autoclass:: pcapkit.protocols.transport.dccp.data.TimestampEcho :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.dccp.ElapsedTime +.. autoclass:: pcapkit.protocols.transport.dccp.data.ElapsedTime :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.dccp.DataChecksum +.. autoclass:: pcapkit.protocols.transport.dccp.data.DataChecksum :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/transport/index.rst b/docs/source/pcapkit/protocols/transport/index.rst index 4665b35605..3a88fa5fbb 100644 --- a/docs/source/pcapkit/protocols/transport/index.rst +++ b/docs/source/pcapkit/protocols/transport/index.rst @@ -2,8 +2,6 @@ Transport Layer =============== .. module:: pcapkit.protocols.transport -.. module:: pcapkit.protocols.data.transport -.. module:: pcapkit.protocols.schema.transport :mod:`pcapkit.protocols.transport` is the collection of all protocols in transport layer, with detailed implementation and methods. diff --git a/docs/source/pcapkit/protocols/transport/sctp.rst b/docs/source/pcapkit/protocols/transport/sctp.rst index 5c48ac7f05..bda513e483 100644 --- a/docs/source/pcapkit/protocols/transport/sctp.rst +++ b/docs/source/pcapkit/protocols/transport/sctp.rst @@ -2,9 +2,16 @@ SCTP - Stream Control Transmission Protocol =========================================== .. module:: pcapkit.protocols.transport.sctp +.. module:: pcapkit.protocols.transport.sctp.protocol -:mod:`pcapkit.protocols.transport.sctp` contains -:class:`~pcapkit.protocols.transport.sctp.SCTP` only, +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.transport.sctp.CRC32C_TABLE``, with no alias: it is in this + module, and :mod:`pcapkit.protocols.transport.sctp` exports the protocol class alone + (:issue:`2534`). + +:mod:`pcapkit.protocols.transport.sctp.protocol` contains +:class:`~pcapkit.protocols.transport.sctp.protocol.SCTP` only, which implements the extractor for Stream Control Transmission Protocol (SCTP) [*]_, whose structure is described as below: @@ -19,7 +26,7 @@ Octets Bits Name Description 12 96 ``sctp.chunks`` Chunks ======= ========= ========================= ======================================= -.. autoclass:: pcapkit.protocols.transport.sctp.SCTP +.. autoclass:: pcapkit.protocols.transport.sctp.protocol.SCTP :no-members: :show-inheritance: @@ -153,382 +160,392 @@ Octets Bits Name Description Header Schemas -------------- -.. module:: pcapkit.protocols.schema.transport.sctp +.. module:: pcapkit.protocols.transport.sctp.schema + +.. versionremoved:: 1.6.0 -.. autoclass:: pcapkit.protocols.schema.transport.sctp.SCTP + ``pcapkit.protocols.schema.transport.sctp``, with no alias: the module moved here + (:issue:`2534`). + +.. autoclass:: pcapkit.protocols.transport.sctp.schema.SCTP :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.Chunk +.. autoclass:: pcapkit.protocols.transport.sctp.schema.Chunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.UnknownChunk +.. autoclass:: pcapkit.protocols.transport.sctp.schema.UnknownChunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.DATAChunk +.. autoclass:: pcapkit.protocols.transport.sctp.schema.DATAChunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.INITChunk +.. autoclass:: pcapkit.protocols.transport.sctp.schema.INITChunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.INITACKChunk +.. autoclass:: pcapkit.protocols.transport.sctp.schema.INITACKChunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.SACKChunk +.. autoclass:: pcapkit.protocols.transport.sctp.schema.SACKChunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.HeartbeatChunk +.. autoclass:: pcapkit.protocols.transport.sctp.schema.HeartbeatChunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.HeartbeatACKChunk +.. autoclass:: pcapkit.protocols.transport.sctp.schema.HeartbeatACKChunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.AbortChunk +.. autoclass:: pcapkit.protocols.transport.sctp.schema.AbortChunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.ShutdownChunk +.. autoclass:: pcapkit.protocols.transport.sctp.schema.ShutdownChunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.ShutdownACKChunk +.. autoclass:: pcapkit.protocols.transport.sctp.schema.ShutdownACKChunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.ErrorChunk +.. autoclass:: pcapkit.protocols.transport.sctp.schema.ErrorChunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.CookieEchoChunk +.. autoclass:: pcapkit.protocols.transport.sctp.schema.CookieEchoChunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.CookieACKChunk +.. autoclass:: pcapkit.protocols.transport.sctp.schema.CookieACKChunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.ShutdownCompleteChunk +.. autoclass:: pcapkit.protocols.transport.sctp.schema.ShutdownCompleteChunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.GapAckBlock +.. autoclass:: pcapkit.protocols.transport.sctp.schema.GapAckBlock :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.Parameter +.. autoclass:: pcapkit.protocols.transport.sctp.schema.Parameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.UnknownParameter +.. autoclass:: pcapkit.protocols.transport.sctp.schema.UnknownParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.HeartbeatInfoParameter +.. autoclass:: pcapkit.protocols.transport.sctp.schema.HeartbeatInfoParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.IPv4AddressParameter +.. autoclass:: pcapkit.protocols.transport.sctp.schema.IPv4AddressParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.IPv6AddressParameter +.. autoclass:: pcapkit.protocols.transport.sctp.schema.IPv6AddressParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.StateCookieParameter +.. autoclass:: pcapkit.protocols.transport.sctp.schema.StateCookieParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.UnrecognizedParameter +.. autoclass:: pcapkit.protocols.transport.sctp.schema.UnrecognizedParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.CookiePreservativeParameter +.. autoclass:: pcapkit.protocols.transport.sctp.schema.CookiePreservativeParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.HostNameAddressParameter +.. autoclass:: pcapkit.protocols.transport.sctp.schema.HostNameAddressParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.SupportedAddressTypesParameter +.. autoclass:: pcapkit.protocols.transport.sctp.schema.SupportedAddressTypesParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.ErrorCause +.. autoclass:: pcapkit.protocols.transport.sctp.schema.ErrorCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.UnknownCause +.. autoclass:: pcapkit.protocols.transport.sctp.schema.UnknownCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.InvalidStreamIdentifierCause +.. autoclass:: pcapkit.protocols.transport.sctp.schema.InvalidStreamIdentifierCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.MissingMandatoryParameterCause +.. autoclass:: pcapkit.protocols.transport.sctp.schema.MissingMandatoryParameterCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.StaleCookieCause +.. autoclass:: pcapkit.protocols.transport.sctp.schema.StaleCookieCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.OutOfResourceCause +.. autoclass:: pcapkit.protocols.transport.sctp.schema.OutOfResourceCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.UnresolvableAddressCause +.. autoclass:: pcapkit.protocols.transport.sctp.schema.UnresolvableAddressCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.UnrecognizedChunkTypeCause +.. autoclass:: pcapkit.protocols.transport.sctp.schema.UnrecognizedChunkTypeCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.InvalidMandatoryParameterCause +.. autoclass:: pcapkit.protocols.transport.sctp.schema.InvalidMandatoryParameterCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.UnrecognizedParametersCause +.. autoclass:: pcapkit.protocols.transport.sctp.schema.UnrecognizedParametersCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.NoUserDataCause +.. autoclass:: pcapkit.protocols.transport.sctp.schema.NoUserDataCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.CookieReceivedWhileShuttingDownCause +.. autoclass:: pcapkit.protocols.transport.sctp.schema.CookieReceivedWhileShuttingDownCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.RestartOfAnAssociationWithNewAddressesCause +.. autoclass:: pcapkit.protocols.transport.sctp.schema.RestartOfAnAssociationWithNewAddressesCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.UserInitiatedAbortCause +.. autoclass:: pcapkit.protocols.transport.sctp.schema.UserInitiatedAbortCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.ProtocolViolationCause +.. autoclass:: pcapkit.protocols.transport.sctp.schema.ProtocolViolationCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.PaddedOptionField +.. autoclass:: pcapkit.protocols.transport.sctp.schema.PaddedOptionField :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.ChunkListField +.. autoclass:: pcapkit.protocols.transport.sctp.schema.ChunkListField :members: :show-inheritance: Type Stubs ~~~~~~~~~~ -.. autoclass:: pcapkit.protocols.schema.transport.sctp.DATAChunkFlags +.. autoclass:: pcapkit.protocols.transport.sctp.schema.DATAChunkFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.sctp.TBitFlags +.. autoclass:: pcapkit.protocols.transport.sctp.schema.TBitFlags :members: :show-inheritance: Auxiliary Functions ~~~~~~~~~~~~~~~~~~~ -.. autofunction:: pcapkit.protocols.schema.transport.sctp.padding_length -.. autofunction:: pcapkit.protocols.schema.transport.sctp.pre_pack_padding -.. autofunction:: pcapkit.protocols.schema.transport.sctp.bounded -.. autofunction:: pcapkit.protocols.schema.transport.sctp.nested_length -.. autofunction:: pcapkit.protocols.schema.transport.sctp.whole_chunks_length +.. autofunction:: pcapkit.protocols.transport.sctp.schema.padding_length +.. autofunction:: pcapkit.protocols.transport.sctp.schema.pre_pack_padding +.. autofunction:: pcapkit.protocols.transport.sctp.schema.bounded +.. autofunction:: pcapkit.protocols.transport.sctp.schema.nested_length +.. autofunction:: pcapkit.protocols.transport.sctp.schema.whole_chunks_length Data Models ----------- -.. module:: pcapkit.protocols.data.transport.sctp +.. module:: pcapkit.protocols.transport.sctp.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.transport.sctp``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.data.transport.sctp.SCTP +.. autoclass:: pcapkit.protocols.transport.sctp.data.SCTP :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.DATAChunkFlags +.. autoclass:: pcapkit.protocols.transport.sctp.data.DATAChunkFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.TBitFlags +.. autoclass:: pcapkit.protocols.transport.sctp.data.TBitFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.GapAckBlock +.. autoclass:: pcapkit.protocols.transport.sctp.data.GapAckBlock :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.Chunk +.. autoclass:: pcapkit.protocols.transport.sctp.data.Chunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.UnknownChunk +.. autoclass:: pcapkit.protocols.transport.sctp.data.UnknownChunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.DATAChunk +.. autoclass:: pcapkit.protocols.transport.sctp.data.DATAChunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.INITChunk +.. autoclass:: pcapkit.protocols.transport.sctp.data.INITChunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.INITACKChunk +.. autoclass:: pcapkit.protocols.transport.sctp.data.INITACKChunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.SACKChunk +.. autoclass:: pcapkit.protocols.transport.sctp.data.SACKChunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.HeartbeatChunk +.. autoclass:: pcapkit.protocols.transport.sctp.data.HeartbeatChunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.HeartbeatACKChunk +.. autoclass:: pcapkit.protocols.transport.sctp.data.HeartbeatACKChunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.AbortChunk +.. autoclass:: pcapkit.protocols.transport.sctp.data.AbortChunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.ShutdownChunk +.. autoclass:: pcapkit.protocols.transport.sctp.data.ShutdownChunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.ShutdownACKChunk +.. autoclass:: pcapkit.protocols.transport.sctp.data.ShutdownACKChunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.ErrorChunk +.. autoclass:: pcapkit.protocols.transport.sctp.data.ErrorChunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.CookieEchoChunk +.. autoclass:: pcapkit.protocols.transport.sctp.data.CookieEchoChunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.CookieACKChunk +.. autoclass:: pcapkit.protocols.transport.sctp.data.CookieACKChunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.ShutdownCompleteChunk +.. autoclass:: pcapkit.protocols.transport.sctp.data.ShutdownCompleteChunk :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.Parameter +.. autoclass:: pcapkit.protocols.transport.sctp.data.Parameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.UnknownParameter +.. autoclass:: pcapkit.protocols.transport.sctp.data.UnknownParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.HeartbeatInfoParameter +.. autoclass:: pcapkit.protocols.transport.sctp.data.HeartbeatInfoParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.IPv4AddressParameter +.. autoclass:: pcapkit.protocols.transport.sctp.data.IPv4AddressParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.IPv6AddressParameter +.. autoclass:: pcapkit.protocols.transport.sctp.data.IPv6AddressParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.StateCookieParameter +.. autoclass:: pcapkit.protocols.transport.sctp.data.StateCookieParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.UnrecognizedParameter +.. autoclass:: pcapkit.protocols.transport.sctp.data.UnrecognizedParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.CookiePreservativeParameter +.. autoclass:: pcapkit.protocols.transport.sctp.data.CookiePreservativeParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.HostNameAddressParameter +.. autoclass:: pcapkit.protocols.transport.sctp.data.HostNameAddressParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.SupportedAddressTypesParameter +.. autoclass:: pcapkit.protocols.transport.sctp.data.SupportedAddressTypesParameter :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.ErrorCause +.. autoclass:: pcapkit.protocols.transport.sctp.data.ErrorCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.UnknownCause +.. autoclass:: pcapkit.protocols.transport.sctp.data.UnknownCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.InvalidStreamIdentifierCause +.. autoclass:: pcapkit.protocols.transport.sctp.data.InvalidStreamIdentifierCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.MissingMandatoryParameterCause +.. autoclass:: pcapkit.protocols.transport.sctp.data.MissingMandatoryParameterCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.StaleCookieCause +.. autoclass:: pcapkit.protocols.transport.sctp.data.StaleCookieCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.OutOfResourceCause +.. autoclass:: pcapkit.protocols.transport.sctp.data.OutOfResourceCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.UnresolvableAddressCause +.. autoclass:: pcapkit.protocols.transport.sctp.data.UnresolvableAddressCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.UnrecognizedChunkTypeCause +.. autoclass:: pcapkit.protocols.transport.sctp.data.UnrecognizedChunkTypeCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.InvalidMandatoryParameterCause +.. autoclass:: pcapkit.protocols.transport.sctp.data.InvalidMandatoryParameterCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.UnrecognizedParametersCause +.. autoclass:: pcapkit.protocols.transport.sctp.data.UnrecognizedParametersCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.NoUserDataCause +.. autoclass:: pcapkit.protocols.transport.sctp.data.NoUserDataCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.CookieReceivedWhileShuttingDownCause +.. autoclass:: pcapkit.protocols.transport.sctp.data.CookieReceivedWhileShuttingDownCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.RestartOfAnAssociationWithNewAddressesCause +.. autoclass:: pcapkit.protocols.transport.sctp.data.RestartOfAnAssociationWithNewAddressesCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.UserInitiatedAbortCause +.. autoclass:: pcapkit.protocols.transport.sctp.data.UserInitiatedAbortCause :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.sctp.ProtocolViolationCause +.. autoclass:: pcapkit.protocols.transport.sctp.data.ProtocolViolationCause :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/transport/tcp.rst b/docs/source/pcapkit/protocols/transport/tcp.rst index 28f6cb112f..9c78f0f0da 100644 --- a/docs/source/pcapkit/protocols/transport/tcp.rst +++ b/docs/source/pcapkit/protocols/transport/tcp.rst @@ -2,9 +2,10 @@ TCP - Transmission Control Protocol =================================== .. module:: pcapkit.protocols.transport.tcp +.. module:: pcapkit.protocols.transport.tcp.protocol -:mod:`pcapkit.protocols.transport.tcp` contains -:class:`~pcapkit.protocols.transport.tcp.TCP` only, +:mod:`pcapkit.protocols.transport.tcp.protocol` contains +:class:`~pcapkit.protocols.transport.tcp.protocol.TCP` only, which implements the extractor for Transmission Control Protocol (TCP) [*]_, whose structure is described as below: @@ -33,7 +34,7 @@ Octets Bits Name Description 20 160 ``tcp.options`` TCP Options (if data offset > 5) ======= ========= ========================= ======================================= -.. autoclass:: pcapkit.protocols.transport.tcp.TCP +.. autoclass:: pcapkit.protocols.transport.tcp.protocol.TCP :no-members: :show-inheritance: @@ -144,410 +145,420 @@ Octets Bits Name Description Header Schemas -------------- -.. module:: pcapkit.protocols.schema.transport.tcp +.. module:: pcapkit.protocols.transport.tcp.schema -.. autodata:: pcapkit.protocols.schema.transport.tcp.TCP_MIN_HEADER_LEN +.. versionremoved:: 1.6.0 -.. autodata:: pcapkit.protocols.schema.transport.tcp.TCP_DATA_OFFSET_OCTET + ``pcapkit.protocols.schema.transport.tcp``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.schema.transport.tcp.TCP +.. autodata:: pcapkit.protocols.transport.tcp.schema.TCP_MIN_HEADER_LEN + +.. autodata:: pcapkit.protocols.transport.tcp.schema.TCP_DATA_OFFSET_OCTET + +.. autoclass:: pcapkit.protocols.transport.tcp.schema.TCP :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.Flags +.. autoclass:: pcapkit.protocols.transport.tcp.schema.Flags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.Option +.. autoclass:: pcapkit.protocols.transport.tcp.schema.Option :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.UnassignedOption +.. autoclass:: pcapkit.protocols.transport.tcp.schema.UnassignedOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.EndOfOptionList +.. autoclass:: pcapkit.protocols.transport.tcp.schema.EndOfOptionList :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.NoOperation +.. autoclass:: pcapkit.protocols.transport.tcp.schema.NoOperation :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.MaximumSegmentSize +.. autoclass:: pcapkit.protocols.transport.tcp.schema.MaximumSegmentSize :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.WindowScale +.. autoclass:: pcapkit.protocols.transport.tcp.schema.WindowScale :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.SACKPermitted +.. autoclass:: pcapkit.protocols.transport.tcp.schema.SACKPermitted :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.SACK +.. autoclass:: pcapkit.protocols.transport.tcp.schema.SACK :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.SACKBlock +.. autoclass:: pcapkit.protocols.transport.tcp.schema.SACKBlock :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.Echo +.. autoclass:: pcapkit.protocols.transport.tcp.schema.Echo :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.EchoReply +.. autoclass:: pcapkit.protocols.transport.tcp.schema.EchoReply :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.Timestamps +.. autoclass:: pcapkit.protocols.transport.tcp.schema.Timestamps :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.PartialOrderConnectionPermitted +.. autoclass:: pcapkit.protocols.transport.tcp.schema.PartialOrderConnectionPermitted :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.PartialOrderServiceProfile +.. autoclass:: pcapkit.protocols.transport.tcp.schema.PartialOrderServiceProfile :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.CC +.. autoclass:: pcapkit.protocols.transport.tcp.schema.CC :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.CCNew +.. autoclass:: pcapkit.protocols.transport.tcp.schema.CCNew :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.CCEcho +.. autoclass:: pcapkit.protocols.transport.tcp.schema.CCEcho :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.AlternateChecksumRequest +.. autoclass:: pcapkit.protocols.transport.tcp.schema.AlternateChecksumRequest :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.AlternateChecksumData(kind, length, data) +.. autoclass:: pcapkit.protocols.transport.tcp.schema.AlternateChecksumData(kind, length, data) :no-members: :show-inheritance: .. autoattribute:: data -.. autoclass:: pcapkit.protocols.schema.transport.tcp.MD5Signature(kind, length, digest) +.. autoclass:: pcapkit.protocols.transport.tcp.schema.MD5Signature(kind, length, digest) :no-members: :show-inheritance: .. autoattribute:: digest -.. autoclass:: pcapkit.protocols.schema.transport.tcp.QuickStartResponse +.. autoclass:: pcapkit.protocols.transport.tcp.schema.QuickStartResponse :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.UserTimeout +.. autoclass:: pcapkit.protocols.transport.tcp.schema.UserTimeout :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.Authentication +.. autoclass:: pcapkit.protocols.transport.tcp.schema.Authentication :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.FastOpenCookie +.. autoclass:: pcapkit.protocols.transport.tcp.schema.FastOpenCookie :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp._MPTCP +.. autoclass:: pcapkit.protocols.transport.tcp.schema._MPTCP :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.MPTCP +.. autoclass:: pcapkit.protocols.transport.tcp.schema.MPTCP :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.MPTCPUnknown +.. autoclass:: pcapkit.protocols.transport.tcp.schema.MPTCPUnknown :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.MPTCPCapable +.. autoclass:: pcapkit.protocols.transport.tcp.schema.MPTCPCapable :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.MPTCPJoin +.. autoclass:: pcapkit.protocols.transport.tcp.schema.MPTCPJoin :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.MPTCPJoinSYN +.. autoclass:: pcapkit.protocols.transport.tcp.schema.MPTCPJoinSYN :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.MPTCPJoinSYNACK +.. autoclass:: pcapkit.protocols.transport.tcp.schema.MPTCPJoinSYNACK :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.MPTCPJoinACK +.. autoclass:: pcapkit.protocols.transport.tcp.schema.MPTCPJoinACK :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.MPTCPDSS +.. autoclass:: pcapkit.protocols.transport.tcp.schema.MPTCPDSS :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.MPTCPAddAddress +.. autoclass:: pcapkit.protocols.transport.tcp.schema.MPTCPAddAddress :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.MPTCPRemoveAddress +.. autoclass:: pcapkit.protocols.transport.tcp.schema.MPTCPRemoveAddress :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.MPTCPPriority +.. autoclass:: pcapkit.protocols.transport.tcp.schema.MPTCPPriority :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.MPTCPFallback +.. autoclass:: pcapkit.protocols.transport.tcp.schema.MPTCPFallback :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.MPTCPFastclose +.. autoclass:: pcapkit.protocols.transport.tcp.schema.MPTCPFastclose :members: :show-inheritance: Type Stubs ~~~~~~~~~~ -.. autoclass:: pcapkit.protocols.schema.transport.tcp.OffsetFlag +.. autoclass:: pcapkit.protocols.transport.tcp.schema.OffsetFlag :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.POCProfile +.. autoclass:: pcapkit.protocols.transport.tcp.schema.POCProfile :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.QuickStartFlags +.. autoclass:: pcapkit.protocols.transport.tcp.schema.QuickStartFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.QuickStartNonce +.. autoclass:: pcapkit.protocols.transport.tcp.schema.QuickStartNonce :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.TimeoutInfo +.. autoclass:: pcapkit.protocols.transport.tcp.schema.TimeoutInfo :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.MPTCPSubtypeTest +.. autoclass:: pcapkit.protocols.transport.tcp.schema.MPTCPSubtypeTest :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.MPTCPSubtypeUnknown +.. autoclass:: pcapkit.protocols.transport.tcp.schema.MPTCPSubtypeUnknown :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.MPTCPSubtypeCapable +.. autoclass:: pcapkit.protocols.transport.tcp.schema.MPTCPSubtypeCapable :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.MPTCPCapableFlags +.. autoclass:: pcapkit.protocols.transport.tcp.schema.MPTCPCapableFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.MPTCPSubtypeJoin +.. autoclass:: pcapkit.protocols.transport.tcp.schema.MPTCPSubtypeJoin :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.MPTCPSubtype +.. autoclass:: pcapkit.protocols.transport.tcp.schema.MPTCPSubtype :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.MPTCPDSSFlags +.. autoclass:: pcapkit.protocols.transport.tcp.schema.MPTCPDSSFlags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.MPTCPSubtypeAddAddress +.. autoclass:: pcapkit.protocols.transport.tcp.schema.MPTCPSubtypeAddAddress :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.schema.transport.tcp.MPTCPSubtypePriority +.. autoclass:: pcapkit.protocols.transport.tcp.schema.MPTCPSubtypePriority :members: :show-inheritance: Auxiliary Functions ~~~~~~~~~~~~~~~~~~~ -.. autofunction:: pcapkit.protocols.schema.transport.tcp.mptcp_data_selector -.. autofunction:: pcapkit.protocols.schema.transport.tcp.mptcp_add_address_selector -.. autofunction:: pcapkit.protocols.schema.transport.tcp.mptcp_dss_checksum -.. autofunction:: pcapkit.protocols.schema.transport.tcp.mptcp_dss_ack_selector -.. autofunction:: pcapkit.protocols.schema.transport.tcp.mptcp_dss_dsn_selector +.. autofunction:: pcapkit.protocols.transport.tcp.schema.mptcp_data_selector +.. autofunction:: pcapkit.protocols.transport.tcp.schema.mptcp_add_address_selector +.. autofunction:: pcapkit.protocols.transport.tcp.schema.mptcp_dss_checksum +.. autofunction:: pcapkit.protocols.transport.tcp.schema.mptcp_dss_ack_selector +.. autofunction:: pcapkit.protocols.transport.tcp.schema.mptcp_dss_dsn_selector Data Models ----------- -.. module:: pcapkit.protocols.data.transport.tcp +.. module:: pcapkit.protocols.transport.tcp.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.transport.tcp``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.data.transport.tcp.TCP +.. autoclass:: pcapkit.protocols.transport.tcp.data.TCP :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.Flags +.. autoclass:: pcapkit.protocols.transport.tcp.data.Flags :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.Option +.. autoclass:: pcapkit.protocols.transport.tcp.data.Option :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.UnassignedOption +.. autoclass:: pcapkit.protocols.transport.tcp.data.UnassignedOption :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.EndOfOptionList +.. autoclass:: pcapkit.protocols.transport.tcp.data.EndOfOptionList :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.NoOperation +.. autoclass:: pcapkit.protocols.transport.tcp.data.NoOperation :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.MaximumSegmentSize +.. autoclass:: pcapkit.protocols.transport.tcp.data.MaximumSegmentSize :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.WindowScale +.. autoclass:: pcapkit.protocols.transport.tcp.data.WindowScale :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.SACKPermitted +.. autoclass:: pcapkit.protocols.transport.tcp.data.SACKPermitted :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.SACK +.. autoclass:: pcapkit.protocols.transport.tcp.data.SACK :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.SACKBlock +.. autoclass:: pcapkit.protocols.transport.tcp.data.SACKBlock :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.Echo +.. autoclass:: pcapkit.protocols.transport.tcp.data.Echo :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.EchoReply +.. autoclass:: pcapkit.protocols.transport.tcp.data.EchoReply :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.Timestamps +.. autoclass:: pcapkit.protocols.transport.tcp.data.Timestamps :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.PartialOrderConnectionPermitted +.. autoclass:: pcapkit.protocols.transport.tcp.data.PartialOrderConnectionPermitted :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.PartialOrderServiceProfile +.. autoclass:: pcapkit.protocols.transport.tcp.data.PartialOrderServiceProfile :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.CC +.. autoclass:: pcapkit.protocols.transport.tcp.data.CC :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.CCNew +.. autoclass:: pcapkit.protocols.transport.tcp.data.CCNew :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.CCEcho +.. autoclass:: pcapkit.protocols.transport.tcp.data.CCEcho :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.AlternateChecksumRequest +.. autoclass:: pcapkit.protocols.transport.tcp.data.AlternateChecksumRequest :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.AlternateChecksumData(kind, length, data) +.. autoclass:: pcapkit.protocols.transport.tcp.data.AlternateChecksumData(kind, length, data) :no-members: :show-inheritance: .. autoattribute:: data -.. autoclass:: pcapkit.protocols.data.transport.tcp.MD5Signature(kind, length, digest) +.. autoclass:: pcapkit.protocols.transport.tcp.data.MD5Signature(kind, length, digest) :no-members: :show-inheritance: .. autoattribute:: digest -.. autoclass:: pcapkit.protocols.data.transport.tcp.QuickStartResponse +.. autoclass:: pcapkit.protocols.transport.tcp.data.QuickStartResponse :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.UserTimeout +.. autoclass:: pcapkit.protocols.transport.tcp.data.UserTimeout :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.Authentication +.. autoclass:: pcapkit.protocols.transport.tcp.data.Authentication :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.FastOpenCookie +.. autoclass:: pcapkit.protocols.transport.tcp.data.FastOpenCookie :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.MPTCP +.. autoclass:: pcapkit.protocols.transport.tcp.data.MPTCP :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.MPTCPUnknown +.. autoclass:: pcapkit.protocols.transport.tcp.data.MPTCPUnknown :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.MPTCPCapable +.. autoclass:: pcapkit.protocols.transport.tcp.data.MPTCPCapable :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.MPTCPCapableFlag +.. autoclass:: pcapkit.protocols.transport.tcp.data.MPTCPCapableFlag :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.MPTCPJoin +.. autoclass:: pcapkit.protocols.transport.tcp.data.MPTCPJoin :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.MPTCPJoinSYN +.. autoclass:: pcapkit.protocols.transport.tcp.data.MPTCPJoinSYN :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.MPTCPJoinSYNACK +.. autoclass:: pcapkit.protocols.transport.tcp.data.MPTCPJoinSYNACK :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.MPTCPJoinACK +.. autoclass:: pcapkit.protocols.transport.tcp.data.MPTCPJoinACK :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.MPTCPDSS +.. autoclass:: pcapkit.protocols.transport.tcp.data.MPTCPDSS :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.MPTCPAddAddress +.. autoclass:: pcapkit.protocols.transport.tcp.data.MPTCPAddAddress :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.MPTCPRemoveAddress +.. autoclass:: pcapkit.protocols.transport.tcp.data.MPTCPRemoveAddress :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.MPTCPPriority +.. autoclass:: pcapkit.protocols.transport.tcp.data.MPTCPPriority :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.MPTCPFallback +.. autoclass:: pcapkit.protocols.transport.tcp.data.MPTCPFallback :members: :show-inheritance: -.. autoclass:: pcapkit.protocols.data.transport.tcp.MPTCPFastclose +.. autoclass:: pcapkit.protocols.transport.tcp.data.MPTCPFastclose :members: :show-inheritance: diff --git a/docs/source/pcapkit/protocols/transport/transport.rst b/docs/source/pcapkit/protocols/transport/transport.rst index 8519d1bee1..074c6b1e28 100644 --- a/docs/source/pcapkit/protocols/transport/transport.rst +++ b/docs/source/pcapkit/protocols/transport/transport.rst @@ -6,9 +6,9 @@ Transport Layer Base Protocol :mod:`pcapkit.protocols.transport.transport` contains :class:`~pcapkit.protocols.transport.transport.Transport`, which is a base class for transport layer protocols, e.g. -:class:`~pcapkit.protocols.transport.tcp.TCP`, -:class:`~pcapkit.protocols.transport.udp.UDP` and -:class:`~pcapkit.protocols.transport.sctp.SCTP`. +:class:`~pcapkit.protocols.transport.tcp.protocol.TCP`, +:class:`~pcapkit.protocols.transport.udp.protocol.UDP` and +:class:`~pcapkit.protocols.transport.sctp.protocol.SCTP`. .. autoclass:: pcapkit.protocols.transport.transport.Transport :no-members: diff --git a/docs/source/pcapkit/protocols/transport/udp.rst b/docs/source/pcapkit/protocols/transport/udp.rst index e14c7208df..dc66e0ee9d 100644 --- a/docs/source/pcapkit/protocols/transport/udp.rst +++ b/docs/source/pcapkit/protocols/transport/udp.rst @@ -2,9 +2,10 @@ UDP - User Datagram Protocol ============================ .. module:: pcapkit.protocols.transport.udp +.. module:: pcapkit.protocols.transport.udp.protocol -:mod:`pcapkit.protocols.transport.udp` contains -:class:`~pcapkit.protocols.transport.udp.UDP` only, +:mod:`pcapkit.protocols.transport.udp.protocol` contains +:class:`~pcapkit.protocols.transport.udp.protocol.UDP` only, which implements the extractor for User Datagram Protocol (UDP) [*]_, whose structure is described as below: @@ -17,7 +18,7 @@ Octets Bits Name Description 6 48 ``udp.checksum`` Checksum ======= ========= ===================== =============================== -.. autoclass:: pcapkit.protocols.transport.udp.UDP +.. autoclass:: pcapkit.protocols.transport.udp.protocol.UDP :no-members: :show-inheritance: @@ -42,18 +43,28 @@ Octets Bits Name Description Header Schemas -------------- -.. module:: pcapkit.protocols.schema.transport.udp +.. module:: pcapkit.protocols.transport.udp.schema -.. autoclass:: pcapkit.protocols.schema.transport.udp.UDP +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.schema.transport.udp``, with no alias: the module moved here + (:issue:`2534`). + +.. autoclass:: pcapkit.protocols.transport.udp.schema.UDP :members: :show-inheritance: Data Models ----------- -.. module:: pcapkit.protocols.data.transport.udp +.. module:: pcapkit.protocols.transport.udp.data + +.. versionremoved:: 1.6.0 + + ``pcapkit.protocols.data.transport.udp``, with no alias: the module moved here + (:issue:`2534`). -.. autoclass:: pcapkit.protocols.data.transport.udp.UDP +.. autoclass:: pcapkit.protocols.transport.udp.data.UDP :members: :show-inheritance: diff --git a/docs/source/pcapkit/utilities/exceptions.rst b/docs/source/pcapkit/utilities/exceptions.rst index cf051b062a..f6b449b989 100644 --- a/docs/source/pcapkit/utilities/exceptions.rst +++ b/docs/source/pcapkit/utilities/exceptions.rst @@ -35,7 +35,7 @@ code it calls but does not own, such as a generated ``_validate_value`` override, which cannot know to pass ``quiet=True`` itself (:issue:`1845`). :func:`~pcapkit.corekit.decorators.beholder` runs the whole call to a next layer in such a block for :exc:`~pcapkit.utilities.exceptions.ProtocolError`, so a refusal it -keeps as :class:`~pcapkit.protocols.misc.raw.Raw` is recorded on that layer's ``error`` +keeps as :class:`~pcapkit.protocols.misc.raw.protocol.Raw` is recorded on that layer's ``error`` alone (:issue:`2588`). .. versionchanged:: 1.5.0 diff --git a/docs/source/pcapkit/utilities/index.rst b/docs/source/pcapkit/utilities/index.rst index 589c18089a..e99b09e5b5 100644 --- a/docs/source/pcapkit/utilities/index.rst +++ b/docs/source/pcapkit/utilities/index.rst @@ -76,9 +76,9 @@ later (:issue:`2051`). :func:`typing.final` from Python 3.11 on, and ``typing_extensions.final`` below it. Both record ``__final__ = True`` on the decorated object at runtime, which :class:`~pcapkit.corekit.infoclass.Info` and - :class:`~pcapkit.protocols.schema.schema.Schema` read to refuse a class + :class:`~pcapkit.protocols.schema.Schema` read to refuse a class marked ``@final`` without :func:`~pcapkit.corekit.infoclass.info_final` or - :func:`~pcapkit.protocols.schema.schema.schema_final`. Plain + :func:`~pcapkit.protocols.schema.schema_final`. Plain :func:`typing.final` records nothing below 3.11 (gh-90500). .. versionchanged:: 1.5.0 diff --git a/docs/source/pcapkit/utilities/warnings.rst b/docs/source/pcapkit/utilities/warnings.rst index 425dba8276..0eb71414f6 100644 --- a/docs/source/pcapkit/utilities/warnings.rst +++ b/docs/source/pcapkit/utilities/warnings.rst @@ -35,7 +35,7 @@ there are. Constructing a warning class is not an act of reporting one -- it emits nothing and has no side effects. A next layer is parsed on trial, and replaced with -:class:`~pcapkit.protocols.misc.raw.Raw` when its header was not captured or its +:class:`~pcapkit.protocols.misc.raw.protocol.Raw` when its header was not captured or its parse raises. The trial's warnings are held back by :class:`~pcapkit.utilities.warnings.hold_warnings`: a replaced layer's are dropped on each channel, since they describe a layer the result does not have, and a kept diff --git a/docs/source/pcapkit/vendor/arp.rst b/docs/source/pcapkit/vendor/arp.rst index a6c96e874d..d3205079dd 100644 --- a/docs/source/pcapkit/vendor/arp.rst +++ b/docs/source/pcapkit/vendor/arp.rst @@ -1,11 +1,11 @@ -======================================================== -:class:`~pcapkit.protocols.link.arp.ARP` Vendor Crawlers -======================================================== +================================================================= +:class:`~pcapkit.protocols.link.arp.protocol.ARP` Vendor Crawlers +================================================================= .. module:: pcapkit.vendor.arp -This module contains all vendor crawlers of :class:`~pcapkit.protocols.link.arp.ARP` -and :class:`~pcapkit.protocols.application.rarp.RARP` implementations. Available +This module contains all vendor crawlers of :class:`~pcapkit.protocols.link.arp.protocol.ARP` +and :class:`~pcapkit.protocols.application.rarp.protocol.RARP` implementations. Available vendor crawlers include: .. list-table:: diff --git a/docs/source/pcapkit/vendor/dccp.rst b/docs/source/pcapkit/vendor/dccp.rst index bfdaeebe18..6924d80474 100644 --- a/docs/source/pcapkit/vendor/dccp.rst +++ b/docs/source/pcapkit/vendor/dccp.rst @@ -1,11 +1,11 @@ -=============================================================== -:class:`~pcapkit.protocols.transport.dccp.DCCP` Vendor Crawlers -=============================================================== +======================================================================== +:class:`~pcapkit.protocols.transport.dccp.protocol.DCCP` Vendor Crawlers +======================================================================== .. module:: pcapkit.vendor.dccp This module contains all vendor crawlers of -:class:`~pcapkit.protocols.transport.dccp.DCCP` implementations. Available +:class:`~pcapkit.protocols.transport.dccp.protocol.DCCP` implementations. Available vendor crawlers include: .. list-table:: diff --git a/docs/source/pcapkit/vendor/esp.rst b/docs/source/pcapkit/vendor/esp.rst index f144c59ce5..3da5e71594 100644 --- a/docs/source/pcapkit/vendor/esp.rst +++ b/docs/source/pcapkit/vendor/esp.rst @@ -1,11 +1,11 @@ -============================================================ -:class:`~pcapkit.protocols.internet.esp.ESP` Vendor Crawlers -============================================================ +===================================================================== +:class:`~pcapkit.protocols.internet.esp.protocol.ESP` Vendor Crawlers +===================================================================== .. module:: pcapkit.vendor.esp This module contains all vendor crawlers of -:class:`~pcapkit.protocols.internet.esp.ESP` implementations. Available +:class:`~pcapkit.protocols.internet.esp.protocol.ESP` implementations. Available vendor crawlers include: .. list-table:: diff --git a/docs/source/pcapkit/vendor/ftp.rst b/docs/source/pcapkit/vendor/ftp.rst index 50d4bb94cd..a1a16ff0e0 100644 --- a/docs/source/pcapkit/vendor/ftp.rst +++ b/docs/source/pcapkit/vendor/ftp.rst @@ -1,11 +1,11 @@ -============================================================== -:class:`~pcapkit.protocols.application.ftp.FTP` Vendor Crawler -============================================================== +======================================================================= +:class:`~pcapkit.protocols.application.ftp.protocol.FTP` Vendor Crawler +======================================================================= .. module:: pcapkit.vendor.ftp This module contains all vendor crawlers of -:class:`~pcapkit.protocols.application.ftp.FTP` implementations. Available +:class:`~pcapkit.protocols.application.ftp.protocol.FTP` implementations. Available crawlers include: .. list-table:: diff --git a/docs/source/pcapkit/vendor/hip.rst b/docs/source/pcapkit/vendor/hip.rst index ae103eb796..5a817453ef 100644 --- a/docs/source/pcapkit/vendor/hip.rst +++ b/docs/source/pcapkit/vendor/hip.rst @@ -1,11 +1,11 @@ -=========================================================== -:class:`~pcapkit.protocols.internet.hip.HIP` Vendor Crawler -=========================================================== +==================================================================== +:class:`~pcapkit.protocols.internet.hip.protocol.HIP` Vendor Crawler +==================================================================== .. module:: pcapkit.vendor.hip This module contains all vendor crawlers of -:class:`~pcapkit.protocols.internet.hip.HIP` implementations. Available +:class:`~pcapkit.protocols.internet.hip.protocol.HIP` implementations. Available vendor crawlers include: .. list-table:: diff --git a/docs/source/pcapkit/vendor/http.rst b/docs/source/pcapkit/vendor/http.rst index 6b84c65ccf..899dfff021 100644 --- a/docs/source/pcapkit/vendor/http.rst +++ b/docs/source/pcapkit/vendor/http.rst @@ -1,12 +1,12 @@ -================================================================ -:class:`~pcapkit.protocols.application.http.HTTP` Vendor Crawler -================================================================ +========================================================================= +:class:`~pcapkit.protocols.application.http.protocol.HTTP` Vendor Crawler +========================================================================= .. module:: pcapkit.vendor.http This module contains all vendor crawlers of -:class:`~pcapkit.protocols.application.http.HTTP` implementations. Available +:class:`~pcapkit.protocols.application.http.protocol.HTTP` implementations. Available vendor crawlers include: .. list-table:: diff --git a/docs/source/pcapkit/vendor/icmp.rst b/docs/source/pcapkit/vendor/icmp.rst index 022072c45e..de730861b3 100644 --- a/docs/source/pcapkit/vendor/icmp.rst +++ b/docs/source/pcapkit/vendor/icmp.rst @@ -1,11 +1,11 @@ -================================================================== -:class:`~pcapkit.protocols.internet.icmpv4.ICMPv4` Vendor Crawlers -================================================================== +=========================================================================== +:class:`~pcapkit.protocols.internet.icmpv4.protocol.ICMPv4` Vendor Crawlers +=========================================================================== .. module:: pcapkit.vendor.icmp This module contains all vendor crawlers of -:class:`~pcapkit.protocols.internet.icmpv4.ICMPv4` implementations. Available +:class:`~pcapkit.protocols.internet.icmpv4.protocol.ICMPv4` implementations. Available vendor crawlers include: .. list-table:: diff --git a/docs/source/pcapkit/vendor/icmpv6.rst b/docs/source/pcapkit/vendor/icmpv6.rst index 8712367514..0419998e19 100644 --- a/docs/source/pcapkit/vendor/icmpv6.rst +++ b/docs/source/pcapkit/vendor/icmpv6.rst @@ -1,11 +1,11 @@ -================================================================== -:class:`~pcapkit.protocols.internet.icmpv6.ICMPv6` Vendor Crawlers -================================================================== +=========================================================================== +:class:`~pcapkit.protocols.internet.icmpv6.protocol.ICMPv6` Vendor Crawlers +=========================================================================== .. module:: pcapkit.vendor.icmpv6 This module contains all vendor crawlers of -:class:`~pcapkit.protocols.internet.icmpv6.ICMPv6` implementations. Available +:class:`~pcapkit.protocols.internet.icmpv6.protocol.ICMPv6` implementations. Available vendor crawlers include: .. list-table:: diff --git a/docs/source/pcapkit/vendor/ieee802_11.rst b/docs/source/pcapkit/vendor/ieee802_11.rst index 9d8809c7ce..aa9dfd7228 100644 --- a/docs/source/pcapkit/vendor/ieee802_11.rst +++ b/docs/source/pcapkit/vendor/ieee802_11.rst @@ -1,11 +1,11 @@ -========================================================================== -:class:`~pcapkit.protocols.link.ieee802_11.IEEE802_11` Vendor Crawlers -========================================================================== +=================================================================================== +:class:`~pcapkit.protocols.link.ieee802_11.protocol.IEEE802_11` Vendor Crawlers +=================================================================================== .. module:: pcapkit.vendor.ieee802_11 This module contains all vendor crawlers of -:class:`~pcapkit.protocols.link.ieee802_11.IEEE802_11` implementations. +:class:`~pcapkit.protocols.link.ieee802_11.protocol.IEEE802_11` implementations. Available vendor crawlers include: .. list-table:: diff --git a/docs/source/pcapkit/vendor/igmp.rst b/docs/source/pcapkit/vendor/igmp.rst index bd93f2d8fd..713d6a8a0c 100644 --- a/docs/source/pcapkit/vendor/igmp.rst +++ b/docs/source/pcapkit/vendor/igmp.rst @@ -1,11 +1,11 @@ -============================================================== -:class:`~pcapkit.protocols.internet.igmp.IGMP` Vendor Crawlers -============================================================== +======================================================================= +:class:`~pcapkit.protocols.internet.igmp.protocol.IGMP` Vendor Crawlers +======================================================================= .. module:: pcapkit.vendor.igmp This module contains all vendor crawlers of -:class:`~pcapkit.protocols.internet.igmp.IGMP` implementations. Available +:class:`~pcapkit.protocols.internet.igmp.protocol.IGMP` implementations. Available vendor crawlers include: .. list-table:: diff --git a/docs/source/pcapkit/vendor/ipv4.rst b/docs/source/pcapkit/vendor/ipv4.rst index 488a861658..8c6510eb45 100644 --- a/docs/source/pcapkit/vendor/ipv4.rst +++ b/docs/source/pcapkit/vendor/ipv4.rst @@ -1,11 +1,11 @@ -============================================================== -:class:`~pcapkit.protocols.internet.ipv4.IPv4` Vendor Crawlers -============================================================== +======================================================================= +:class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4` Vendor Crawlers +======================================================================= .. module:: pcapkit.vendor.ipv4 This module contains all vendor crawlers of -:class:`~pcapkit.protocols.internet.ipv4.IPv4` implementations. Available +:class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4` implementations. Available vendor crawlers include: .. list-table:: diff --git a/docs/source/pcapkit/vendor/ipv6.rst b/docs/source/pcapkit/vendor/ipv6.rst index e5bac60cb1..2867f91ce2 100644 --- a/docs/source/pcapkit/vendor/ipv6.rst +++ b/docs/source/pcapkit/vendor/ipv6.rst @@ -1,11 +1,11 @@ -============================================================== -:class:`~pcapkit.protocols.internet.ipv6.IPv6` Vendor Crawlers -============================================================== +======================================================================= +:class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6` Vendor Crawlers +======================================================================= .. module:: pcapkit.vendor.ipv6 This module contains all vendor crawlers of -:class:`~pcapkit.protocols.internet.ipv6.IPv6` implementations. Available +:class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6` implementations. Available vendor crawlers include: .. list-table:: diff --git a/docs/source/pcapkit/vendor/ipx.rst b/docs/source/pcapkit/vendor/ipx.rst index a0999cd1fb..695c526360 100644 --- a/docs/source/pcapkit/vendor/ipx.rst +++ b/docs/source/pcapkit/vendor/ipx.rst @@ -1,11 +1,11 @@ -============================================================ -:class:`~pcapkit.protocols.internet.ipx.IPX` Vendor Crawlers -============================================================ +===================================================================== +:class:`~pcapkit.protocols.internet.ipx.protocol.IPX` Vendor Crawlers +===================================================================== .. module:: pcapkit.vendor.ipx This module contains all vendor crawlers of -:class:`~pcapkit.protocols.internet.ipx.IPX` implementations. Available +:class:`~pcapkit.protocols.internet.ipx.protocol.IPX` implementations. Available vendor crawlers include: .. list-table:: diff --git a/docs/source/pcapkit/vendor/l2tp.rst b/docs/source/pcapkit/vendor/l2tp.rst index 9f1bc24307..4ce1be8e7c 100644 --- a/docs/source/pcapkit/vendor/l2tp.rst +++ b/docs/source/pcapkit/vendor/l2tp.rst @@ -1,11 +1,11 @@ -================================================================ -:class:`~pcapkit.protocols.link.l2tp.L2TP` Vendor Crawlers -================================================================ +========================================================================= +:class:`~pcapkit.protocols.link.l2tp.protocol.L2TP` Vendor Crawlers +========================================================================= .. module:: pcapkit.vendor.l2tp This module contains all vendor crawlers of -:class:`~pcapkit.protocols.link.l2tp.L2TP` implementations. Available +:class:`~pcapkit.protocols.link.l2tp.protocol.L2TP` implementations. Available vendor crawlers include: .. list-table:: diff --git a/docs/source/pcapkit/vendor/linux.rst b/docs/source/pcapkit/vendor/linux.rst index 0b827971c3..be29e99ace 100644 --- a/docs/source/pcapkit/vendor/linux.rst +++ b/docs/source/pcapkit/vendor/linux.rst @@ -5,7 +5,7 @@ Linux-Specific Vendor Crawlers .. module:: pcapkit.vendor.linux This module contains all vendor crawlers of the Linux-specific -encapsulations, e.g. :class:`~pcapkit.protocols.link.linux_sll.LinuxSLL`. +encapsulations, e.g. :class:`~pcapkit.protocols.link.linux_sll.protocol.LinuxSLL`. Available vendor crawlers include: .. list-table:: diff --git a/docs/source/pcapkit/vendor/mh.rst b/docs/source/pcapkit/vendor/mh.rst index 102dcaba30..e3937ace3e 100644 --- a/docs/source/pcapkit/vendor/mh.rst +++ b/docs/source/pcapkit/vendor/mh.rst @@ -1,11 +1,11 @@ -================================================================ -:class:`~pcapkit.protocols.internet.mh.MH` Vendor Crawlers -================================================================ +========================================================================= +:class:`~pcapkit.protocols.internet.mh.protocol.MH` Vendor Crawlers +========================================================================= .. module:: pcapkit.vendor.mh This module contains all vendor crawlers of -:class:`~pcapkit.protocols.internet.mh.MH` implementations. Available +:class:`~pcapkit.protocols.internet.mh.protocol.MH` implementations. Available vendor crawlers include: .. list-table:: diff --git a/docs/source/pcapkit/vendor/ngap.rst b/docs/source/pcapkit/vendor/ngap.rst index 70dded6c85..7c876bd3da 100644 --- a/docs/source/pcapkit/vendor/ngap.rst +++ b/docs/source/pcapkit/vendor/ngap.rst @@ -1,11 +1,11 @@ -==================================================================== -:class:`~pcapkit.protocols.application.ngap.NGAP` Vendor Crawlers -==================================================================== +============================================================================= +:class:`~pcapkit.protocols.application.ngap.protocol.NGAP` Vendor Crawlers +============================================================================= .. module:: pcapkit.vendor.ngap This module contains all vendor crawlers of -:class:`~pcapkit.protocols.application.ngap.NGAP` implementations. Available +:class:`~pcapkit.protocols.application.ngap.protocol.NGAP` implementations. Available vendor crawlers include: .. list-table:: diff --git a/docs/source/pcapkit/vendor/ospf.rst b/docs/source/pcapkit/vendor/ospf.rst index d3086b10e2..57dafa4748 100644 --- a/docs/source/pcapkit/vendor/ospf.rst +++ b/docs/source/pcapkit/vendor/ospf.rst @@ -1,11 +1,11 @@ -================================================================= -:class:`~pcapkit.protocols.application.ospf.OSPF` Vendor Crawlers -================================================================= +========================================================================== +:class:`~pcapkit.protocols.application.ospf.protocol.OSPF` Vendor Crawlers +========================================================================== .. module:: pcapkit.vendor.ospf This module contains all vendor crawlers of -:class:`~pcapkit.protocols.application.ospf.OSPF` implementations. Available +:class:`~pcapkit.protocols.application.ospf.protocol.OSPF` implementations. Available vendor crawlers include: .. list-table:: diff --git a/docs/source/pcapkit/vendor/pcapng.rst b/docs/source/pcapkit/vendor/pcapng.rst index cd7211ece5..5b80e52f99 100644 --- a/docs/source/pcapkit/vendor/pcapng.rst +++ b/docs/source/pcapkit/vendor/pcapng.rst @@ -1,11 +1,11 @@ -==================================================================== -:class:`~pcapkit.protocols.misc.pcapng.PCAPNG` Vendor Crawlers -==================================================================== +============================================================================= +:class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG` Vendor Crawlers +============================================================================= .. module:: pcapkit.vendor.pcapng This module contains all vendor crawlers of -:class:`~pcapkit.protocols.misc.pcapng.PCAPNG` implementations. Available +:class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG` implementations. Available vendor crawlers include: .. list-table:: diff --git a/docs/source/pcapkit/vendor/radiotap.rst b/docs/source/pcapkit/vendor/radiotap.rst index 82d0e09841..9672397e18 100644 --- a/docs/source/pcapkit/vendor/radiotap.rst +++ b/docs/source/pcapkit/vendor/radiotap.rst @@ -1,11 +1,11 @@ -====================================================================== -:class:`~pcapkit.protocols.link.radiotap.Radiotap` Vendor Crawlers -====================================================================== +=============================================================================== +:class:`~pcapkit.protocols.link.radiotap.protocol.Radiotap` Vendor Crawlers +=============================================================================== .. module:: pcapkit.vendor.radiotap This module contains all vendor crawlers of -:class:`~pcapkit.protocols.link.radiotap.Radiotap` implementations, each scraping +:class:`~pcapkit.protocols.link.radiotap.protocol.Radiotap` implementations, each scraping radiotap.org [*]_. Available vendor crawlers include: .. list-table:: diff --git a/docs/source/pcapkit/vendor/sctp.rst b/docs/source/pcapkit/vendor/sctp.rst index 063ad77ef4..5ade6a3ef5 100644 --- a/docs/source/pcapkit/vendor/sctp.rst +++ b/docs/source/pcapkit/vendor/sctp.rst @@ -1,11 +1,11 @@ -===================================================================== -:class:`~pcapkit.protocols.transport.sctp.SCTP` Vendor Crawlers -===================================================================== +============================================================================== +:class:`~pcapkit.protocols.transport.sctp.protocol.SCTP` Vendor Crawlers +============================================================================== .. module:: pcapkit.vendor.sctp This module contains all vendor crawlers of -:class:`~pcapkit.protocols.transport.sctp.SCTP` implementations. Available +:class:`~pcapkit.protocols.transport.sctp.protocol.SCTP` implementations. Available vendor crawlers include: .. list-table:: diff --git a/docs/source/pcapkit/vendor/sslv2.rst b/docs/source/pcapkit/vendor/sslv2.rst index 7c2c364386..72369146fa 100644 --- a/docs/source/pcapkit/vendor/sslv2.rst +++ b/docs/source/pcapkit/vendor/sslv2.rst @@ -1,11 +1,11 @@ -=================================================================== -:class:`~pcapkit.protocols.application.sslv2.SSLv2` Vendor Crawlers -=================================================================== +============================================================================ +:class:`~pcapkit.protocols.application.sslv2.protocol.SSLv2` Vendor Crawlers +============================================================================ .. module:: pcapkit.vendor.sslv2 This module contains all vendor crawlers of -:class:`~pcapkit.protocols.application.sslv2.SSLv2` implementations. Available +:class:`~pcapkit.protocols.application.sslv2.protocol.SSLv2` implementations. Available vendor crawlers include: .. list-table:: diff --git a/docs/source/pcapkit/vendor/tcp.rst b/docs/source/pcapkit/vendor/tcp.rst index 9f71d95a29..6e194dcee9 100644 --- a/docs/source/pcapkit/vendor/tcp.rst +++ b/docs/source/pcapkit/vendor/tcp.rst @@ -1,11 +1,11 @@ -=================================================================== -:class:`~pcapkit.protocols.transport.tcp.TCP` Vendor Crawlers -=================================================================== +============================================================================ +:class:`~pcapkit.protocols.transport.tcp.protocol.TCP` Vendor Crawlers +============================================================================ .. module:: pcapkit.vendor.tcp This module contains all vendor crawlers of -:class:`~pcapkit.protocols.transport.tcp.TCP` implementations. Available +:class:`~pcapkit.protocols.transport.tcp.protocol.TCP` implementations. Available vendor crawlers include: .. list-table:: diff --git a/docs/source/pcapkit/vendor/tls.rst b/docs/source/pcapkit/vendor/tls.rst index c254a468a7..80f7aed8f3 100644 --- a/docs/source/pcapkit/vendor/tls.rst +++ b/docs/source/pcapkit/vendor/tls.rst @@ -1,14 +1,14 @@ -=============================================================== -:class:`~pcapkit.protocols.application.ssl.SSL` Vendor Crawlers -=============================================================== +======================================================================== +:class:`~pcapkit.protocols.application.ssl.protocol.SSL` Vendor Crawlers +======================================================================== .. module:: pcapkit.vendor.tls This module contains the vendor crawlers of the constant enumerations shared by the record-layer implementations under the -:class:`~pcapkit.protocols.application.ssl.SSL` umbrella -- -:class:`~pcapkit.protocols.application.tls.TLS` (SSLv3 through TLS 1.3) and -:class:`~pcapkit.protocols.application.dtls.DTLS`. Available vendor crawlers +:class:`~pcapkit.protocols.application.ssl.protocol.SSL` umbrella -- +:class:`~pcapkit.protocols.application.tls.protocol.TLS` (SSLv3 through TLS 1.3) and +:class:`~pcapkit.protocols.application.dtls.protocol.DTLS`. Available vendor crawlers include: .. list-table:: diff --git a/docs/source/pcapkit/vendor/vlan.rst b/docs/source/pcapkit/vendor/vlan.rst index 80d3a3b917..fc9560e87a 100644 --- a/docs/source/pcapkit/vendor/vlan.rst +++ b/docs/source/pcapkit/vendor/vlan.rst @@ -1,11 +1,11 @@ -================================================================ -:class:`~pcapkit.protocols.link.vlan.VLAN` Vendor Crawlers -================================================================ +========================================================================= +:class:`~pcapkit.protocols.link.vlan.protocol.VLAN` Vendor Crawlers +========================================================================= .. module:: pcapkit.vendor.vlan This module contains all vendor crawlers of -:class:`~pcapkit.protocols.link.vlan.VLAN` implementations. Available +:class:`~pcapkit.protocols.link.vlan.protocol.VLAN` implementations. Available vendor crawlers include: .. list-table:: diff --git a/examples/generators/dispatch.py b/examples/generators/dispatch.py index 591b326e6c..9dacfcb192 100644 --- a/examples/generators/dispatch.py +++ b/examples/generators/dispatch.py @@ -28,16 +28,16 @@ such symmetry to exploit, so :func:`probe` instead builds one minimal envelope per code, decodes it the way the library itself would (through :func:`pcapkit.extract` for the packet-level tables, or by handing the -:class:`~pcapkit.protocols.misc.pcap.frame.Frame` bytes straight to +:class:`~pcapkit.protocols.misc.pcap.frame.protocol.Frame` bytes straight to :func:`pcapkit.extract` for the pcap/pcapng link-type tables, which is the same call with a different global header), and asks whether the resulting :class:`~pcapkit.corekit.protochain.ProtoChain` actually contains the class :data:`PINNED_TARGETS` says the code is *supposed* to reach -- not merely that the alias string looks right, since several of these classes rename themselves -on the wire (:class:`~pcapkit.protocols.application.rarp.RARP` reports ``'ARP'`` for -``oper in (1, 2)``; :class:`~pcapkit.protocols.internet.hip.HIP` reports +on the wire (:class:`~pcapkit.protocols.application.rarp.protocol.RARP` reports ``'ARP'`` for +``oper in (1, 2)``; :class:`~pcapkit.protocols.internet.hip.protocol.HIP` reports ``'HIPv2'``), and a table entry whose target *is* -:class:`~pcapkit.protocols.misc.raw.Raw` itself is not a defect. +:class:`~pcapkit.protocols.misc.raw.protocol.Raw` itself is not a defect. The expected class is deliberately **not** read out of the registry under test. Read from there (``target=_resolve(entry)``), the check would be @@ -56,13 +56,13 @@ Some entries are known to degrade to :class:`Raw`, for reasons recorded in :data:`KNOWN_DEGRADED` rather than fixed here -- this module reports defects, it does not carry workarounds for them. They are -:class:`~pcapkit.protocols.transport.sctp.SCTP` payload protocol identifiers -reaching :class:`~pcapkit.protocols.application.ngap.NGAP`, and neither is a +:class:`~pcapkit.protocols.transport.sctp.protocol.SCTP` payload protocol identifiers +reaching :class:`~pcapkit.protocols.application.ngap.protocol.NGAP`, and neither is a defect: building a well-formed PER-encoded ``NGAP-PDU`` is out of scope for a minimal dispatch probe, so both use the same placeholder payload :meth:`~tests.protocols.transport.test_sctp_unit.SCTPUnitTests.test_ppid_dispatch_hook` already does, and for the same documented reason -- one PPID is DTLS-wrapped -and :attr:`SCTP.__proto__ ` +and :attr:`SCTP.__proto__ ` maps it to NGAP rather than through DTLS; the other degrades identically because the payload is not an aligned PER encoding, exactly as that test's own docstring records. @@ -105,7 +105,7 @@ #: TCP header fields held constant across every case that needs a TCP segment. #: Only ``dstport``/``payload`` vary. #: -#: Every key is a parameter :meth:`TCP.make ` +#: Every key is a parameter :meth:`TCP.make ` #: declares, which is not a style point: ``ack`` is the acknowledgement *flag*, #: not the number, and ``seq``, ``ack_flag`` and ``urgent_pointer`` are not #: parameters at all. An undeclared keyword raises @@ -194,7 +194,7 @@ def _pcap_bytes(frames: 'tuple[bytes, ...]', linktype: 'int') -> 'bytes': def _pcapng_bytes(linktype: 'Any', packet_data: 'bytes') -> 'bytes': """A minimal PCAP-NG file: one section, one interface, one packet block. - Built through :mod:`pcapkit`'s own :class:`~pcapkit.protocols.misc.pcapng.PCAPNG` + Built through :mod:`pcapkit`'s own :class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG` construction API rather than hand-rolled :mod:`struct` packing, the same way :func:`examples.generators.option_families.pcapng._pcapng_context` does -- GitHub issue #496 judged hand-building a valid SHB+IDB+EPB stream riskier than @@ -212,7 +212,7 @@ def _pcapng_bytes(linktype: 'Any', packet_data: 'bytes') -> 'bytes': """ from pcapkit.const.pcapng.block_type import BlockType from pcapkit.foundation.engines.pcapng import Context - from pcapkit.protocols.misc.pcapng import PCAPNG + from pcapkit.protocols.misc.pcapng.protocol import PCAPNG shb = PCAPNG(num=0, sct=1, ctx=None, type=BlockType.Section_Header_Block, block={}) context = Context(shb.info) @@ -253,49 +253,49 @@ def _extract_first(data: 'bytes', suffix: 'str') -> 'Any': def _tcp(dstport: 'int', payload: 'bytes' = b'') -> 'bytes': """A minimal TCP segment to ``dstport``.""" - from pcapkit.protocols.transport.tcp import TCP + from pcapkit.protocols.transport.tcp.protocol import TCP return bytes(TCP(dstport=dstport, payload=payload, **_TCP_BASE)) def _udp(dstport: 'int', payload: 'bytes' = b'') -> 'bytes': """A minimal UDP datagram to ``dstport``.""" - from pcapkit.protocols.transport.udp import UDP + from pcapkit.protocols.transport.udp.protocol import UDP return bytes(UDP(srcport=50000, dstport=dstport, payload=payload)) def _ip4(protocol: 'int', payload: 'bytes') -> 'bytes': """A minimal option-less IPv4 header carrying ``payload``.""" - from pcapkit.protocols.internet.ipv4 import IPv4 + from pcapkit.protocols.internet.ipv4.protocol import IPv4 return bytes(IPv4(protocol=protocol, src='192.0.2.1', dst='198.51.100.1', payload=payload)) def _ip6(next_: 'int', payload: 'bytes') -> 'bytes': """A minimal IPv6 header carrying ``payload``.""" - from pcapkit.protocols.internet.ipv6 import IPv6 + from pcapkit.protocols.internet.ipv6.protocol import IPv6 return bytes(IPv6(next=next_, src='2001:db8::1', dst='2001:db8::2', payload=payload)) def _ethernet(ethertype: 'int', payload: 'bytes') -> 'bytes': """A minimal Ethernet II frame carrying ``payload``.""" - from pcapkit.protocols.link.ethernet import Ethernet + from pcapkit.protocols.link.ethernet.protocol import Ethernet return bytes(Ethernet(type=ethertype, payload=payload)) def _loopback(family: 'int', payload: 'bytes', byteorder: 'str' = 'little') -> 'bytes': """A BSD loopback header carrying ``payload``.""" - from pcapkit.protocols.link.loopback import Loopback + from pcapkit.protocols.link.loopback.protocol import Loopback return bytes(Loopback(family=family, byteorder=byteorder, payload=payload)) def _linux_sll(payload: 'bytes') -> 'bytes': """A ``LINUX_SLL`` header carrying ``payload``.""" - from pcapkit.protocols.link.linux_sll1 import LinuxSLL1 + from pcapkit.protocols.link.linux_sll1.protocol import LinuxSLL1 return bytes(LinuxSLL1(payload=payload)) def _linux_sll2(payload: 'bytes') -> 'bytes': """A ``LINUX_SLL2`` header carrying ``payload``.""" - from pcapkit.protocols.link.linux_sll2 import LinuxSLL2 + from pcapkit.protocols.link.linux_sll2.protocol import LinuxSLL2 return bytes(LinuxSLL2(payload=payload)) @@ -303,7 +303,7 @@ def _linux_sll_payload(arphrd_type: 'Any') -> 'tuple[int, bytes]': """The ``protocol_type`` and payload of a cooked header on a registered ``arphrd_type``. Shared by the ``linux_sll`` and ``linux_sll2`` families, which probe - :attr:`LinuxSLL.__proto__ ` + :attr:`LinuxSLL.__proto__ ` through each version. Args: @@ -319,20 +319,20 @@ def _linux_sll_payload(arphrd_type: 'Any') -> 'tuple[int, bytes]': from pcapkit.const.linux.arphrd import ARPHRD if arphrd_type == ARPHRD.FRAD: - from pcapkit.protocols.link.frad import FRAD + from pcapkit.protocols.link.frad.protocol import FRAD return 0, bytes(FRAD(nlpid=0xCC, payload=_ip4(6, _tcp(9999)))) if arphrd_type in (ARPHRD.IPGRE, ARPHRD.IP6GRE): - from pcapkit.protocols.link.gre import GRE + from pcapkit.protocols.link.gre.protocol import GRE return 0x0800, bytes(GRE(protocol_type=0x0800, payload=_ip4(6, _tcp(9999)))) if arphrd_type == ARPHRD.IEEE80211_RADIOTAP: from pcapkit.const.ieee802_11.control_subtype import ControlSubtype from pcapkit.const.ieee802_11.type import Type - from pcapkit.protocols.link.ieee802_11 import IEEE802_11 - from pcapkit.protocols.link.radiotap import Radiotap + from pcapkit.protocols.link.ieee802_11.protocol import IEEE802_11 + from pcapkit.protocols.link.radiotap.protocol import Radiotap ack = bytes(IEEE802_11(type=Type.Control, subtype=ControlSubtype.ACK, addr1='02:00:00:00:00:01')) return 0, bytes(Radiotap(payload=ack)) if arphrd_type == ARPHRD.NETLINK: - from pcapkit.protocols.link.netlink import Netlink + from pcapkit.protocols.link.netlink.protocol import Netlink return 0, bytes(Netlink(nlmsg_type=3, nlmsg_seq=1, byteorder='little', payload=b'\xaa\xbb\xcc\xdd')) raise LookupError(f'linux_sll: no payload builder for {arphrd_type!r}') # pragma: no cover @@ -504,9 +504,9 @@ class Outcome(NamedTuple): #: ``target in frame.protochain``. The latter also matches on the layer's #: alias string and on ``Type.id()``, which is right for telling a #: renamed-on-the-wire class (RARP reporting itself as ``'ARP'``) from a - #: wrong one -- but wrong here, because :class:`~pcapkit.protocols.misc.raw.Raw` + #: wrong one -- but wrong here, because :class:`~pcapkit.protocols.misc.raw.protocol.Raw` #: itself constructs with ``alias=`` set to the *dispatching* code's own - #: name (``Raw.__post_init__``, pcapkit/protocols/misc/raw.py), so a + #: name (``Raw.__post_init__``, pcapkit/protocols/misc/raw/protocol.py), so a #: mis-pointed registry entry still renders its original code's name and #: would satisfy the string check while no instance of the pinned class #: exists anywhere in the chain. @@ -518,7 +518,7 @@ class Outcome(NamedTuple): #: The first ``'error'`` value found anywhere in the parsed frame's nested #: info mapping, or ``''`` if none is present. This is what #: :func:`pcapkit.corekit.decorators.beholder` records when a dissector - #: raises and gets replaced with :class:`~pcapkit.protocols.misc.raw.Raw`, + #: raises and gets replaced with :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, #: so it is the fragment :data:`KNOWN_DEGRADED` pins against. error: 'str' @@ -613,7 +613,7 @@ def probe(case: 'Case') -> 'Outcome': # some ``oper`` values, and is still the RARP class), but it is exactly # the loophole that let a mis-pointed registry entry through here: several # dissectors -- Raw chief among them, in ``Raw.__post_init__`` - # (pcapkit/protocols/misc/raw.py) -- construct with ``alias=`` set to + # (pcapkit/protocols/misc/raw/protocol.py) -- construct with ``alias=`` set to # the *dispatching* code's own name, so a code named ``AH`` retargeted at # Raw still renders as ``'...:AH'`` and still satisfies ``AH in # protochain`` on the string alone, even though no AH instance exists @@ -635,7 +635,7 @@ def outcomes(families: 'Optional[tuple[Family, ...]]' = None) -> 'list[Outcome]' return [probe(case) for case in cases(families)] -#: Codes known to degrade to :class:`~pcapkit.protocols.misc.raw.Raw`, each +#: Codes known to degrade to :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, each #: with the ``'error'`` fragments it may report and the reason it degrades. #: Recorded, not fixed -- GitHub issue #496 is a test-harness change and none #: of these classes is this module's to touch. @@ -669,7 +669,7 @@ def outcomes(families: 'Optional[tuple[Family, ...]]' = None) -> 'list[Outcome]' # PPID 66 is NGAP wrapped in a DTLS record, and the registry maps it to # NGAP rather than through DTLS -- registered so the PPID # is *named*, per the registry's own comment in - # pcapkit/protocols/transport/sctp.py, not because it decodes. The same + # pcapkit/protocols/transport/sctp/protocol.py, not because it decodes. The same # placeholder payload fails the same way, for the same reason. 'sctp/PayloadProtocolIdentifier_3GPP_NGAP_over_DTLS_over_SCTP': ( ('malformed NGAP-PDU', 'needs the optional "pycrate" dependency'), diff --git a/examples/generators/dispatch_families/frad.py b/examples/generators/dispatch_families/frad.py index 7858d445f7..bd320496bd 100644 --- a/examples/generators/dispatch_families/frad.py +++ b/examples/generators/dispatch_families/frad.py @@ -18,7 +18,7 @@ def _registry() -> 'Any': - from pcapkit.protocols.link.frad import FRAD + from pcapkit.protocols.link.frad.protocol import FRAD return FRAD.__proto__ @@ -34,8 +34,8 @@ def _payload(nlpid: 'int') -> 'bytes': def _build(nlpid: 'int') -> 'Any': """A direct-NLPID FRAD frame, reached as LinuxSLL dispatches it in a capture.""" from pcapkit.const.linux.arphrd import ARPHRD - from pcapkit.protocols.link.frad import FRAD - from pcapkit.protocols.link.linux_sll1 import LinuxSLL1 + from pcapkit.protocols.link.frad.protocol import FRAD + from pcapkit.protocols.link.linux_sll1.protocol import LinuxSLL1 frad = bytes(FRAD(nlpid=int(nlpid), payload=_payload(nlpid))) record = bytes(LinuxSLL1(arphrd_type=ARPHRD.FRAD, protocol_type=0, payload=frad)) @@ -51,6 +51,6 @@ def _build(nlpid: 'int') -> 'Any': #: :data:`examples.generators.dispatch.PINNED_TARGETS` describes. Keyed in #: decimal: 0x8E, 0xCC. PINNED_TARGETS = { - 'frad/142': ('pcapkit.protocols.internet.ipv6', 'IPv6'), - 'frad/204': ('pcapkit.protocols.internet.ipv4', 'IPv4'), + 'frad/142': ('pcapkit.protocols.internet.ipv6.protocol', 'IPv6'), + 'frad/204': ('pcapkit.protocols.internet.ipv4.protocol', 'IPv4'), } diff --git a/examples/generators/dispatch_families/internet.py b/examples/generators/dispatch_families/internet.py index 6b5686861a..ae80466214 100644 --- a/examples/generators/dispatch_families/internet.py +++ b/examples/generators/dispatch_families/internet.py @@ -47,18 +47,18 @@ def _payload(code: 'int') -> 'bytes': _ip4, _ip6, _tcp, _udp = generator._ip4, generator._ip6, generator._tcp, generator._udp if code == TransType.HOPOPT: - from pcapkit.protocols.internet.hopopt import HOPOPT + from pcapkit.protocols.internet.hopopt.protocol import HOPOPT return bytes(HOPOPT(options=[], next=6, payload=_tcp(9999))) if code == TransType.IPv4: # IP-in-IP. return _ip4(6, _tcp(9999)) if code == TransType.ICMP: - from pcapkit.protocols.internet.icmpv4 import ICMPv4 + from pcapkit.protocols.internet.icmpv4.protocol import ICMPv4 # NOTE: the checksum is left uncomputed (#2470). return bytes(ICMPv4(type=8, code=0, body={'id': 1, 'seq': 1, 'data': b'ping'})) if code == TransType.IPv6_ICMP: - from pcapkit.protocols.internet.icmpv6 import ICMPv6 + from pcapkit.protocols.internet.icmpv6.protocol import ICMPv6 # NOTE: the checksum is left uncomputed (#2470). return bytes(ICMPv6(type=128, code=0, @@ -68,31 +68,31 @@ def _payload(code: 'int') -> 'bytes': if code == TransType.UDP: return _udp(9999) if code == TransType.DCCP: - from pcapkit.protocols.transport.dccp import DCCP + from pcapkit.protocols.transport.dccp.protocol import DCCP return bytes(DCCP(srcport=50000, dstport=9999, seq=1, payload=b'\x01\x02\x03')) if code == TransType.IPv6: return _ip6(6, _tcp(9999)) if code == TransType.IPv6_Route: from pcapkit.const.ipv6.routing import Routing - from pcapkit.protocols.internet.ipv6_route import IPv6_Route + from pcapkit.protocols.internet.ipv6_route.protocol import IPv6_Route return bytes(IPv6_Route(type=Routing.Type_2_Routing_Header, data={'ip': '2001:db8::2'}, next=6, seg_left=0, payload=_tcp(9999))) if code == TransType.IPv6_Frag: - from pcapkit.protocols.internet.ipv6_frag import IPv6_Frag + from pcapkit.protocols.internet.ipv6_frag.protocol import IPv6_Frag return bytes(IPv6_Frag(next=17, id=1, offset=0, mf=False, payload=_udp(9999))) if code == TransType.GRE: - from pcapkit.protocols.link.gre import GRE + from pcapkit.protocols.link.gre.protocol import GRE return bytes(GRE(protocol_type=0x0800, payload=_ip4(6, _tcp(9999)))) if code == TransType.ESP: - from pcapkit.protocols.internet.esp import ESP + from pcapkit.protocols.internet.esp.protocol import ESP return bytes(ESP(spi=0x1234, seq=1, payload=b'\x01\x02\x03\x04')) if code == TransType.AH: - from pcapkit.protocols.internet.ah import AH + from pcapkit.protocols.internet.ah.protocol import AH return bytes(AH(next=TransType.TCP, spi=0x1234, seq=1, icv=b'\x00' * 12, payload=_tcp(9999))) if code == TransType.IGMP: from pcapkit.const.igmp.type import Type - from pcapkit.protocols.internet.igmpv2 import IGMPv2 + from pcapkit.protocols.internet.igmpv2.protocol import IGMPv2 # A General Query: an IGMPv1/v2 message is the 8-octet header and # nothing else, so there is no further payload to wrap. A nonzero @@ -104,24 +104,24 @@ def _payload(code: 'int') -> 'bytes': # non-empty payload demonstrates the same thing an empty one would. return b'\x01\x02\x03' if code == TransType.IPv6_Opts: - from pcapkit.protocols.internet.ipv6_opts import IPv6_Opts + from pcapkit.protocols.internet.ipv6_opts.protocol import IPv6_Opts return bytes(IPv6_Opts(options=[], next=6, payload=_tcp(9999))) if code == TransType.IPX_in_IP: - from pcapkit.protocols.internet.ipx import IPX + from pcapkit.protocols.internet.ipx.protocol import IPX return bytes(IPX()) if code == TransType.SCTP: from pcapkit.const.sctp.chunk import Chunk - from pcapkit.protocols.transport.sctp import SCTP + from pcapkit.protocols.transport.sctp.protocol import SCTP return bytes(SCTP(srcport=50000, dstport=80, vtag=0x11223344, chksum=b'\x00' * 4, chunks=[(Chunk.Payload_Data, {'data': b'\x01\x02\x03'})])) if code == TransType.Mobility_Header: from pcapkit.const.mh.packet import Packet - from pcapkit.protocols.internet.mh import MH + from pcapkit.protocols.internet.mh.protocol import MH return bytes(MH(next=6, chksum=b'\x00\x00', type=Packet.Binding_Refresh_Request, data={'options': []}, payload=_tcp(9999))) if code == TransType.HIP: from pcapkit.const.hip.parameter import Parameter - from pcapkit.protocols.internet.hip import HIP + from pcapkit.protocols.internet.hip.protocol import HIP # Only the dispatch into HIP is under test here, so which parameter # travels inside it does not matter. @@ -129,7 +129,7 @@ def _payload(code: 'int') -> 'bytes': next=6, packet=1, version=2, checksum=b'\x00\x00', controls_anonymous=False, shit=0, rhit=0, payload=_tcp(9999))) if code == TransType.OSPFIGP: - from pcapkit.protocols.application.ospf import OSPF + from pcapkit.protocols.application.ospf.protocol import OSPF return bytes(OSPF()) if code == TransType.Shim6: # #904: no dedicated dissector exists for Shim6 -- IPv6_Ext @@ -158,29 +158,29 @@ def _build(code: 'int') -> 'Any': #: The class each case of :data:`FAMILIES` is pinned to, as #: :data:`examples.generators.dispatch.PINNED_TARGETS` describes. PINNED_TARGETS = { - 'internet/HOPOPT': ('pcapkit.protocols.internet.hopopt', 'HOPOPT'), - 'internet/IPv4': ('pcapkit.protocols.internet.ipv4', 'IPv4'), - 'internet/ICMP': ('pcapkit.protocols.internet.icmpv4', 'ICMPv4'), - 'internet/TCP': ('pcapkit.protocols.transport.tcp', 'TCP'), - 'internet/UDP': ('pcapkit.protocols.transport.udp', 'UDP'), - 'internet/DCCP': ('pcapkit.protocols.transport.dccp', 'DCCP'), - 'internet/IPv6': ('pcapkit.protocols.internet.ipv6', 'IPv6'), - 'internet/IPv6_ICMP': ('pcapkit.protocols.internet.icmpv6', 'ICMPv6'), - 'internet/IPv6_Route': ('pcapkit.protocols.internet.ipv6_route', 'IPv6_Route'), - 'internet/IPv6_Frag': ('pcapkit.protocols.internet.ipv6_frag', 'IPv6_Frag'), - 'internet/GRE': ('pcapkit.protocols.link.gre', 'GRE'), - 'internet/ESP': ('pcapkit.protocols.internet.esp', 'ESP'), - 'internet/AH': ('pcapkit.protocols.internet.ah', 'AH'), - 'internet/IGMP': ('pcapkit.protocols.internet.igmp', 'IGMP'), - 'internet/IPv6_NoNxt': ('pcapkit.protocols.misc.raw', 'Raw'), - 'internet/IPv6_Opts': ('pcapkit.protocols.internet.ipv6_opts', 'IPv6_Opts'), - 'internet/IPX_in_IP': ('pcapkit.protocols.internet.ipx', 'IPX'), - 'internet/Mobility_Header': ('pcapkit.protocols.internet.mh', 'MH'), - 'internet/HIP': ('pcapkit.protocols.internet.hip', 'HIP'), - 'internet/SCTP': ('pcapkit.protocols.transport.sctp', 'SCTP'), - 'internet/OSPFIGP': ('pcapkit.protocols.application.ospf', 'OSPF'), + 'internet/HOPOPT': ('pcapkit.protocols.internet.hopopt.protocol', 'HOPOPT'), + 'internet/IPv4': ('pcapkit.protocols.internet.ipv4.protocol', 'IPv4'), + 'internet/ICMP': ('pcapkit.protocols.internet.icmpv4.protocol', 'ICMPv4'), + 'internet/TCP': ('pcapkit.protocols.transport.tcp.protocol', 'TCP'), + 'internet/UDP': ('pcapkit.protocols.transport.udp.protocol', 'UDP'), + 'internet/DCCP': ('pcapkit.protocols.transport.dccp.protocol', 'DCCP'), + 'internet/IPv6': ('pcapkit.protocols.internet.ipv6.protocol', 'IPv6'), + 'internet/IPv6_ICMP': ('pcapkit.protocols.internet.icmpv6.protocol', 'ICMPv6'), + 'internet/IPv6_Route': ('pcapkit.protocols.internet.ipv6_route.protocol', 'IPv6_Route'), + 'internet/IPv6_Frag': ('pcapkit.protocols.internet.ipv6_frag.protocol', 'IPv6_Frag'), + 'internet/GRE': ('pcapkit.protocols.link.gre.protocol', 'GRE'), + 'internet/ESP': ('pcapkit.protocols.internet.esp.protocol', 'ESP'), + 'internet/AH': ('pcapkit.protocols.internet.ah.protocol', 'AH'), + 'internet/IGMP': ('pcapkit.protocols.internet.igmp.protocol', 'IGMP'), + 'internet/IPv6_NoNxt': ('pcapkit.protocols.misc.raw.protocol', 'Raw'), + 'internet/IPv6_Opts': ('pcapkit.protocols.internet.ipv6_opts.protocol', 'IPv6_Opts'), + 'internet/IPX_in_IP': ('pcapkit.protocols.internet.ipx.protocol', 'IPX'), + 'internet/Mobility_Header': ('pcapkit.protocols.internet.mh.protocol', 'MH'), + 'internet/HIP': ('pcapkit.protocols.internet.hip.protocol', 'HIP'), + 'internet/SCTP': ('pcapkit.protocols.transport.sctp.protocol', 'SCTP'), + 'internet/OSPFIGP': ('pcapkit.protocols.application.ospf.protocol', 'OSPF'), # #904: Shim6 (140) is registered directly at IPv6_Ext, which parses # the RFC 6564 ยง4 generic layout, as Shim6 has no dedicated dissector. # Without the entry the default factory would resolve it to Raw. - 'internet/Shim6': ('pcapkit.protocols.internet.ipv6_ext', 'IPv6_Ext'), + 'internet/Shim6': ('pcapkit.protocols.internet.ipv6_ext.protocol', 'IPv6_Ext'), } diff --git a/examples/generators/dispatch_families/link.py b/examples/generators/dispatch_families/link.py index f66c651d33..3f003612e3 100644 --- a/examples/generators/dispatch_families/link.py +++ b/examples/generators/dispatch_families/link.py @@ -27,29 +27,29 @@ def _payload(code: 'int') -> 'bytes': from pcapkit.const.reg.ethertype import EtherType if code == EtherType.Address_Resolution_Protocol: - from pcapkit.protocols.link.arp import ARP + from pcapkit.protocols.link.arp.protocol import ARP return bytes(ARP(oper=1)) if code == EtherType.Reverse_Address_Resolution_Protocol: - from pcapkit.protocols.application.rarp import RARP + from pcapkit.protocols.application.rarp.protocol import RARP # ARP/RARP/InARP/DRARP all report their alias from the wire ``oper`` # field rather than from the dispatching EtherType (``ARP.read`` in - # pcapkit/protocols/link/arp.py, per #496), so ``oper`` has to land in + # pcapkit/protocols/link/arp/protocol.py, per #496), so ``oper`` has to land in # the RARP range (3, 4) or this would silently probe ARP instead while # still "passing". return bytes(RARP(oper=3)) if code == EtherType.Customer_VLAN_Tag_Type: - from pcapkit.protocols.link.c_tag import C_Tag + from pcapkit.protocols.link.c_tag.protocol import C_Tag return bytes(C_Tag(vid=200, type=0x0800, payload=generator._ip4(6, generator._tcp(9999)))) if code == EtherType.IEEE_Std_802_1Q_Service_VLAN_tag_identifier: - from pcapkit.protocols.link.s_tag import S_Tag + from pcapkit.protocols.link.s_tag.protocol import S_Tag return bytes(S_Tag(vid=100, type=0x0800, payload=generator._ip4(6, generator._tcp(9999)))) if code == EtherType.Internet_Protocol_version_4: return generator._ip4(6, generator._tcp(9999)) if code == EtherType.Internet_Protocol_version_6: return generator._ip6(6, generator._tcp(9999)) if code == 0x8137: # Novell IPX. - from pcapkit.protocols.internet.ipx import IPX + from pcapkit.protocols.internet.ipx.protocol import IPX return bytes(IPX()) raise LookupError(f'link: no payload builder for {code!r}') # pragma: no cover @@ -72,11 +72,11 @@ def _enum() -> 'Any': #: The class each case of :data:`FAMILIES` is pinned to, as #: :data:`examples.generators.dispatch.PINNED_TARGETS` describes. PINNED_TARGETS = { - 'link/Address_Resolution_Protocol': ('pcapkit.protocols.link.arp', 'ARP'), - 'link/Reverse_Address_Resolution_Protocol': ('pcapkit.protocols.application.rarp', 'RARP'), - 'link/Customer_VLAN_Tag_Type': ('pcapkit.protocols.link.c_tag', 'C_Tag'), - 'link/IEEE_Std_802_1Q_Service_VLAN_tag_identifier': ('pcapkit.protocols.link.s_tag', 'S_Tag'), - 'link/Internet_Protocol_version_4': ('pcapkit.protocols.internet.ipv4', 'IPv4'), - 'link/Internet_Protocol_version_6': ('pcapkit.protocols.internet.ipv6', 'IPv6'), - 'link/Novell_Inc_0x8137': ('pcapkit.protocols.internet.ipx', 'IPX'), + 'link/Address_Resolution_Protocol': ('pcapkit.protocols.link.arp.protocol', 'ARP'), + 'link/Reverse_Address_Resolution_Protocol': ('pcapkit.protocols.application.rarp.protocol', 'RARP'), + 'link/Customer_VLAN_Tag_Type': ('pcapkit.protocols.link.c_tag.protocol', 'C_Tag'), + 'link/IEEE_Std_802_1Q_Service_VLAN_tag_identifier': ('pcapkit.protocols.link.s_tag.protocol', 'S_Tag'), + 'link/Internet_Protocol_version_4': ('pcapkit.protocols.internet.ipv4.protocol', 'IPv4'), + 'link/Internet_Protocol_version_6': ('pcapkit.protocols.internet.ipv6.protocol', 'IPv6'), + 'link/Novell_Inc_0x8137': ('pcapkit.protocols.internet.ipx.protocol', 'IPX'), } diff --git a/examples/generators/dispatch_families/linktype.py b/examples/generators/dispatch_families/linktype.py index 743cb4bdca..2f9575fed1 100644 --- a/examples/generators/dispatch_families/linktype.py +++ b/examples/generators/dispatch_families/linktype.py @@ -21,7 +21,7 @@ def _pcap_frame_registry() -> 'Any': - from pcapkit.protocols.misc.pcap.frame import Frame + from pcapkit.protocols.misc.pcap.frame.protocol import Frame return Frame.__proto__ @@ -60,7 +60,7 @@ def _payload(code: 'Any') -> 'tuple[bytes, bool]': if code == LinkType.IEEE802_11_RADIOTAP: return _radiotap(_wlan_ack()), False if code == LinkType.FRELAY: # direct NLPID 0xCC, IPv4 - from pcapkit.protocols.link.frad import FRAD + from pcapkit.protocols.link.frad.protocol import FRAD return bytes(FRAD(nlpid=0xCC, payload=_ip4(6, _tcp(9999)))), False raise LookupError(f'linktype: no payload builder for {code!r}') # pragma: no cover @@ -69,13 +69,13 @@ def _wlan_ack() -> 'bytes': """An 802.11 Ack frame, which carries no body.""" from pcapkit.const.ieee802_11.control_subtype import ControlSubtype from pcapkit.const.ieee802_11.type import Type - from pcapkit.protocols.link.ieee802_11 import IEEE802_11 + from pcapkit.protocols.link.ieee802_11.protocol import IEEE802_11 return bytes(IEEE802_11(type=Type.Control, subtype=ControlSubtype.ACK, addr1='02:00:00:00:00:01')) def _radiotap(payload: 'bytes') -> 'bytes': """A minimal radiotap header carrying ``payload``.""" - from pcapkit.protocols.link.radiotap import Radiotap + from pcapkit.protocols.link.radiotap.protocol import Radiotap return bytes(Radiotap(payload=payload)) @@ -86,7 +86,7 @@ def _pcap_frame_build(code: 'Any') -> 'Any': def _pcapng_registry() -> 'Any': - from pcapkit.protocols.misc.pcapng import PCAPNG + from pcapkit.protocols.misc.pcapng.protocol import PCAPNG return PCAPNG.__proto__ diff --git a/examples/generators/dispatch_families/linux_sll.py b/examples/generators/dispatch_families/linux_sll.py index d118990a65..afc6c49aa6 100644 --- a/examples/generators/dispatch_families/linux_sll.py +++ b/examples/generators/dispatch_families/linux_sll.py @@ -20,14 +20,14 @@ def _registry() -> 'Any': - from pcapkit.protocols.link.linux_sll import LinuxSLL + from pcapkit.protocols.link.linux_sll.protocol import LinuxSLL return LinuxSLL.__proto__ def _build(arphrd_type: 'Any') -> 'Any': """A ``LINUX_SLL`` record on ``arphrd_type``, built through the family base.""" from pcapkit.const.reg.linktype import LinkType - from pcapkit.protocols.link.linux_sll import LinuxSLL + from pcapkit.protocols.link.linux_sll.protocol import LinuxSLL protocol_type, payload = generator._linux_sll_payload(arphrd_type) record = bytes(LinuxSLL(version=1, arphrd_type=arphrd_type, protocol_type=protocol_type, @@ -44,9 +44,9 @@ def _build(arphrd_type: 'Any') -> 'Any': #: The class each case of :data:`FAMILIES` is pinned to, as #: :data:`examples.generators.dispatch.PINNED_TARGETS` describes. PINNED_TARGETS = { - 'linux_sll/FRAD': ('pcapkit.protocols.link.frad', 'FRAD'), - 'linux_sll/IPGRE': ('pcapkit.protocols.link.gre', 'GRE'), - 'linux_sll/IEEE80211_RADIOTAP': ('pcapkit.protocols.link.radiotap', 'Radiotap'), - 'linux_sll/IP6GRE': ('pcapkit.protocols.link.gre', 'GRE'), - 'linux_sll/NETLINK': ('pcapkit.protocols.link.netlink', 'Netlink'), + 'linux_sll/FRAD': ('pcapkit.protocols.link.frad.protocol', 'FRAD'), + 'linux_sll/IPGRE': ('pcapkit.protocols.link.gre.protocol', 'GRE'), + 'linux_sll/IEEE80211_RADIOTAP': ('pcapkit.protocols.link.radiotap.protocol', 'Radiotap'), + 'linux_sll/IP6GRE': ('pcapkit.protocols.link.gre.protocol', 'GRE'), + 'linux_sll/NETLINK': ('pcapkit.protocols.link.netlink.protocol', 'Netlink'), } diff --git a/examples/generators/dispatch_families/linux_sll2.py b/examples/generators/dispatch_families/linux_sll2.py index 572bbad767..7082207968 100644 --- a/examples/generators/dispatch_families/linux_sll2.py +++ b/examples/generators/dispatch_families/linux_sll2.py @@ -20,14 +20,14 @@ def _registry() -> 'Any': - from pcapkit.protocols.link.linux_sll import LinuxSLL + from pcapkit.protocols.link.linux_sll.protocol import LinuxSLL return LinuxSLL.__proto__ def _build(arphrd_type: 'Any') -> 'Any': """A ``LINUX_SLL2`` record on ``arphrd_type``, built through the family base.""" from pcapkit.const.reg.linktype import LinkType - from pcapkit.protocols.link.linux_sll import LinuxSLL + from pcapkit.protocols.link.linux_sll.protocol import LinuxSLL protocol_type, payload = generator._linux_sll_payload(arphrd_type) record = bytes(LinuxSLL(version=2, arphrd_type=arphrd_type, protocol_type=protocol_type, @@ -44,9 +44,9 @@ def _build(arphrd_type: 'Any') -> 'Any': #: The class each case of :data:`FAMILIES` is pinned to, as #: :data:`examples.generators.dispatch.PINNED_TARGETS` describes. PINNED_TARGETS = { - 'linux_sll2/FRAD': ('pcapkit.protocols.link.frad', 'FRAD'), - 'linux_sll2/IPGRE': ('pcapkit.protocols.link.gre', 'GRE'), - 'linux_sll2/IEEE80211_RADIOTAP': ('pcapkit.protocols.link.radiotap', 'Radiotap'), - 'linux_sll2/IP6GRE': ('pcapkit.protocols.link.gre', 'GRE'), - 'linux_sll2/NETLINK': ('pcapkit.protocols.link.netlink', 'Netlink'), + 'linux_sll2/FRAD': ('pcapkit.protocols.link.frad.protocol', 'FRAD'), + 'linux_sll2/IPGRE': ('pcapkit.protocols.link.gre.protocol', 'GRE'), + 'linux_sll2/IEEE80211_RADIOTAP': ('pcapkit.protocols.link.radiotap.protocol', 'Radiotap'), + 'linux_sll2/IP6GRE': ('pcapkit.protocols.link.gre.protocol', 'GRE'), + 'linux_sll2/NETLINK': ('pcapkit.protocols.link.netlink.protocol', 'Netlink'), } diff --git a/examples/generators/dispatch_families/loopback.py b/examples/generators/dispatch_families/loopback.py index 2524d65134..64f01031c1 100644 --- a/examples/generators/dispatch_families/loopback.py +++ b/examples/generators/dispatch_families/loopback.py @@ -18,7 +18,7 @@ def _registry() -> 'Any': - from pcapkit.protocols.link.loopback import Loopback + from pcapkit.protocols.link.loopback.protocol import Loopback return Loopback.__proto__ @@ -37,8 +37,8 @@ def _build(family: 'int') -> 'Any': #: The class each case of :data:`FAMILIES` is pinned to, as #: :data:`examples.generators.dispatch.PINNED_TARGETS` describes. PINNED_TARGETS = { - 'loopback/2': ('pcapkit.protocols.internet.ipv4', 'IPv4'), - 'loopback/24': ('pcapkit.protocols.internet.ipv6', 'IPv6'), - 'loopback/28': ('pcapkit.protocols.internet.ipv6', 'IPv6'), - 'loopback/30': ('pcapkit.protocols.internet.ipv6', 'IPv6'), + 'loopback/2': ('pcapkit.protocols.internet.ipv4.protocol', 'IPv4'), + 'loopback/24': ('pcapkit.protocols.internet.ipv6.protocol', 'IPv6'), + 'loopback/28': ('pcapkit.protocols.internet.ipv6.protocol', 'IPv6'), + 'loopback/30': ('pcapkit.protocols.internet.ipv6.protocol', 'IPv6'), } diff --git a/examples/generators/dispatch_families/radiotap.py b/examples/generators/dispatch_families/radiotap.py index abb6d269a0..0080ca2318 100644 --- a/examples/generators/dispatch_families/radiotap.py +++ b/examples/generators/dispatch_families/radiotap.py @@ -18,14 +18,14 @@ def _registry() -> 'Any': - from pcapkit.protocols.link.radiotap import Radiotap + from pcapkit.protocols.link.radiotap.protocol import Radiotap return Radiotap.__proto__ def _build(code: 'Any') -> 'Any': """An 802.11 Ack behind radiotap, on a ``LINUX_SLL`` capture. - :meth:`Radiotap.read ` + :meth:`Radiotap.read ` consults ``LinkType.IEEE802_11`` alone, so that is the only code with a case. @@ -34,9 +34,9 @@ def _build(code: 'Any') -> 'Any': from pcapkit.const.ieee802_11.type import Type from pcapkit.const.linux.arphrd import ARPHRD from pcapkit.const.reg.linktype import LinkType - from pcapkit.protocols.link.ieee802_11 import IEEE802_11 - from pcapkit.protocols.link.linux_sll1 import LinuxSLL1 - from pcapkit.protocols.link.radiotap import Radiotap + from pcapkit.protocols.link.ieee802_11.protocol import IEEE802_11 + from pcapkit.protocols.link.linux_sll1.protocol import LinuxSLL1 + from pcapkit.protocols.link.radiotap.protocol import Radiotap if code != LinkType.IEEE802_11: raise ValueError(f'no radiotap case for link type {code!r}') @@ -54,5 +54,5 @@ def _build(code: 'Any') -> 'Any': #: The class each case of :data:`FAMILIES` is pinned to, as #: :data:`examples.generators.dispatch.PINNED_TARGETS` describes. PINNED_TARGETS = { - 'radiotap/IEEE802_11': ('pcapkit.protocols.link.ieee802_11', 'IEEE802_11'), + 'radiotap/IEEE802_11': ('pcapkit.protocols.link.ieee802_11.protocol', 'IEEE802_11'), } diff --git a/examples/generators/dispatch_families/sctp.py b/examples/generators/dispatch_families/sctp.py index 89fa900cc1..753bba4b87 100644 --- a/examples/generators/dispatch_families/sctp.py +++ b/examples/generators/dispatch_families/sctp.py @@ -18,13 +18,13 @@ def _registry() -> 'Any': - from pcapkit.protocols.transport.sctp import SCTP + from pcapkit.protocols.transport.sctp.protocol import SCTP return SCTP.__proto__ def _build(ppid: 'Any') -> 'Any': from pcapkit.const.sctp.chunk import Chunk - from pcapkit.protocols.transport.sctp import SCTP + from pcapkit.protocols.transport.sctp.protocol import SCTP sctp = bytes(SCTP(srcport=50000, dstport=80, vtag=0x11223344, chksum=b'\x00' * 4, chunks=[(Chunk.Payload_Data, {'ppid': ppid, 'data': b'ngap-pdu'})])) @@ -41,7 +41,7 @@ def _build(ppid: 'Any') -> 'Any': #: :data:`examples.generators.dispatch.PINNED_TARGETS` describes. PINNED_TARGETS = { 'sctp/PayloadProtocolIdentifier_3GPP_NG_Application_Protocol': - ('pcapkit.protocols.application.ngap', 'NGAP'), + ('pcapkit.protocols.application.ngap.protocol', 'NGAP'), 'sctp/PayloadProtocolIdentifier_3GPP_NGAP_over_DTLS_over_SCTP': - ('pcapkit.protocols.application.ngap', 'NGAP'), + ('pcapkit.protocols.application.ngap.protocol', 'NGAP'), } diff --git a/examples/generators/dispatch_families/tcp.py b/examples/generators/dispatch_families/tcp.py index c12f24f88a..07d01e4fe2 100644 --- a/examples/generators/dispatch_families/tcp.py +++ b/examples/generators/dispatch_families/tcp.py @@ -19,7 +19,7 @@ #: A minimal, genuine TLS record: ``application_data`` (23), legacy version #: 3.3, and a zero-length fragment -- content type and legacy version both in #: range, and the (zero) declared length fits the (zero) remaining buffer, so -#: :meth:`SSL._validate_tls_record ` +#: :meth:`SSL._validate_tls_record ` #: accepts it rather than degrading it to :class:`Raw`. _TLS_RECORD = b'\x17\x03\x03\x00\x00' @@ -34,7 +34,7 @@ def _registry() -> 'Any': - from pcapkit.protocols.transport.tcp import TCP + from pcapkit.protocols.transport.tcp.protocol import TCP return TCP.__proto__ @@ -54,11 +54,11 @@ def _build(port: 'int') -> 'Any': #: The class each case of :data:`FAMILIES` is pinned to, as #: :data:`examples.generators.dispatch.PINNED_TARGETS` describes. PINNED_TARGETS = { - 'tcp/20': ('pcapkit.protocols.application.ftp_data', 'FTP_DATA'), - 'tcp/21': ('pcapkit.protocols.application.ftp', 'FTP'), + 'tcp/20': ('pcapkit.protocols.application.ftp_data.protocol', 'FTP_DATA'), + 'tcp/21': ('pcapkit.protocols.application.ftp.protocol', 'FTP'), # The version-identifying proxy (#682), as for ``udp/80`` and ``udp/8080``; # it dispatches to HTTPv1 or HTTPv2 (#2524). - 'tcp/80': ('pcapkit.protocols.application.http', 'HTTP'), - 'tcp/443': ('pcapkit.protocols.application.tls', 'TLS'), - 'tcp/8080': ('pcapkit.protocols.application.http', 'HTTP'), + 'tcp/80': ('pcapkit.protocols.application.http.protocol', 'HTTP'), + 'tcp/443': ('pcapkit.protocols.application.tls.protocol', 'TLS'), + 'tcp/8080': ('pcapkit.protocols.application.http.protocol', 'HTTP'), } diff --git a/examples/generators/dispatch_families/udp.py b/examples/generators/dispatch_families/udp.py index c27c441b1c..1dd10a2c11 100644 --- a/examples/generators/dispatch_families/udp.py +++ b/examples/generators/dispatch_families/udp.py @@ -36,7 +36,7 @@ def _registry() -> 'Any': - from pcapkit.protocols.transport.udp import UDP + from pcapkit.protocols.transport.udp.protocol import UDP return UDP.__proto__ @@ -56,8 +56,8 @@ def _build(port: 'int') -> 'Any': #: The class each case of :data:`FAMILIES` is pinned to, as #: :data:`examples.generators.dispatch.PINNED_TARGETS` describes. PINNED_TARGETS = { - 'udp/80': ('pcapkit.protocols.application.http', 'HTTP'), - 'udp/1701': ('pcapkit.protocols.link.l2tpv2', 'L2TPv2'), - 'udp/5684': ('pcapkit.protocols.application.dtls', 'DTLS'), - 'udp/8080': ('pcapkit.protocols.application.http', 'HTTP'), + 'udp/80': ('pcapkit.protocols.application.http.protocol', 'HTTP'), + 'udp/1701': ('pcapkit.protocols.link.l2tpv2.protocol', 'L2TPv2'), + 'udp/5684': ('pcapkit.protocols.application.dtls.protocol', 'DTLS'), + 'udp/8080': ('pcapkit.protocols.application.http.protocol', 'HTTP'), } diff --git a/examples/generators/endian.py b/examples/generators/endian.py index 776d244280..b2aab1891c 100644 --- a/examples/generators/endian.py +++ b/examples/generators/endian.py @@ -18,7 +18,7 @@ swallows the rest of the file and the read that follows is handed a negative payload length, raising ``ValueError: read length must be non-negative or -1`` out of -:file:`pcapkit/protocols/schema/schema.py`. The defect is one character, and +:file:`pcapkit/protocols/schema.py`. The defect is one character, and nothing but these fixtures can tell whether it is present. =============================== ========================================== @@ -76,7 +76,7 @@ #: PCAP file magic numbers, keyed by endianness and nanosecond-resolution flag. #: The same values as -#: :data:`pcapkit.protocols.schema.misc.pcap.header.MAGIC_NUMBER`, which the +#: :data:`pcapkit.protocols.misc.pcap.header.schema.MAGIC_NUMBER`, which the #: reader these fixtures are written for dispatches on; they are repeated #: rather than imported so that a fixture stays generatable without #: :mod:`pcapkit` importing cleanly. diff --git a/examples/generators/option_families/dccp.py b/examples/generators/option_families/dccp.py index fc05d1e038..e8c3ac2704 100644 --- a/examples/generators/option_families/dccp.py +++ b/examples/generators/option_families/dccp.py @@ -30,7 +30,7 @@ def _dccp_registry() -> 'Any': - from pcapkit.protocols.transport.dccp import DCCP + from pcapkit.protocols.transport.dccp.protocol import DCCP return DCCP.__option__ @@ -59,12 +59,12 @@ def _dccp_overrides() -> 'dict[Any, dict[str, Any]]': def _dccp_build(code: 'Any', kwargs: 'dict[str, Any]') -> 'Any': - from pcapkit.protocols.transport.dccp import DCCP + from pcapkit.protocols.transport.dccp.protocol import DCCP return DCCP(options=[(code, kwargs)], **DCCP_BASE) def _dccp_parse(octets: 'bytes') -> 'Any': - from pcapkit.protocols.transport.dccp import DCCP + from pcapkit.protocols.transport.dccp.protocol import DCCP return DCCP(octets, len(octets)) @@ -73,7 +73,7 @@ def _dccp_extract(parsed: 'Any') -> 'Any': def _dccp_rebuild(options: 'Any') -> 'Any': - from pcapkit.protocols.transport.dccp import DCCP + from pcapkit.protocols.transport.dccp.protocol import DCCP return DCCP(options=options, **DCCP_BASE) diff --git a/examples/generators/option_families/hip.py b/examples/generators/option_families/hip.py index 67a47293fa..798efe8d13 100644 --- a/examples/generators/option_families/hip.py +++ b/examples/generators/option_families/hip.py @@ -60,7 +60,7 @@ def _hip_registry() -> 'Any': from pcapkit.const.hip.parameter import Parameter - from pcapkit.protocols.internet.hip import HIP + from pcapkit.protocols.internet.hip.protocol import HIP return generator._named_registry(HIP, Parameter, '_make_param_', '__parameter__') @@ -95,7 +95,7 @@ def _hip_base(code: 'Any') -> 'dict[str, Any]': def _hip_build(code: 'Any', kwargs: 'dict[str, Any]') -> 'Any': - from pcapkit.protocols.internet.hip import HIP + from pcapkit.protocols.internet.hip.protocol import HIP # ``extension=True`` is not decoration. ``HIP.alias`` reads ``self._info``, # which ``__post_init__`` only assigns after ``read`` returns, and the sole @@ -107,7 +107,7 @@ def _hip_build(code: 'Any', kwargs: 'dict[str, Any]') -> 'Any': def _hip_parse(octets: 'bytes') -> 'Any': - from pcapkit.protocols.internet.hip import HIP + from pcapkit.protocols.internet.hip.protocol import HIP return HIP(octets, len(octets), extension=True) @@ -117,7 +117,7 @@ def _hip_extract(parsed: 'Any') -> 'Any': def _hip_rebuild(parameters: 'Any') -> 'Any': - from pcapkit.protocols.internet.hip import HIP + from pcapkit.protocols.internet.hip.protocol import HIP # ``parameters`` is the parsed collection, so the version has to come off # one of its members rather than from the code being tested. diff --git a/examples/generators/option_families/httpv2.py b/examples/generators/option_families/httpv2.py index f33f99ab0a..d336fc55e6 100644 --- a/examples/generators/option_families/httpv2.py +++ b/examples/generators/option_families/httpv2.py @@ -21,7 +21,7 @@ def _httpv2_registry() -> 'Any': - from pcapkit.protocols.application.httpv2 import HTTPv2 + from pcapkit.protocols.application.httpv2.protocol import HTTPv2 return HTTPv2.__frame__ @@ -50,14 +50,14 @@ def _httpv2_overrides() -> 'dict[Any, dict[str, Any]]': def _httpv2_build(code: 'Any', kwargs: 'dict[str, Any]') -> 'Any': - from pcapkit.protocols.application.httpv2 import HTTPv2 + from pcapkit.protocols.application.httpv2.protocol import HTTPv2 sid = 0 if int(code) in HTTPV2_CONNECTION_FRAMES else HTTPV2_STREAM return HTTPv2(type=code, sid=sid, frame=dict(kwargs)) def _httpv2_parse(octets: 'bytes') -> 'Any': - from pcapkit.protocols.application.httpv2 import HTTPv2 + from pcapkit.protocols.application.httpv2.protocol import HTTPv2 return HTTPv2(octets, len(octets)) @@ -66,7 +66,7 @@ def _httpv2_extract(parsed: 'Any') -> 'Any': def _httpv2_rebuild(frame: 'Any') -> 'Any': - from pcapkit.protocols.application.httpv2 import HTTPv2 + from pcapkit.protocols.application.httpv2.protocol import HTTPv2 # ``HTTP.make`` ORs ``flags`` into the bits the ``_make_http_*`` constructor # derives from ``frame``, and that constructor knows only the flags its diff --git a/examples/generators/option_families/icmp.py b/examples/generators/option_families/icmp.py index b1f925e938..3e755f9cea 100644 --- a/examples/generators/option_families/icmp.py +++ b/examples/generators/option_families/icmp.py @@ -35,7 +35,7 @@ def _icmpv4_registry() -> 'Any': - from pcapkit.protocols.internet.icmpv4 import ICMPv4 + from pcapkit.protocols.internet.icmpv4.protocol import ICMPv4 return ICMPv4.__type__ @@ -52,7 +52,7 @@ def _icmpv4_overrides() -> 'dict[Any, dict[str, Any]]': def _icmpv4_build(code: 'Any', kwargs: 'dict[str, Any]') -> 'Any': - from pcapkit.protocols.internet.icmpv4 import ICMPv4 + from pcapkit.protocols.internet.icmpv4.protocol import ICMPv4 # ``body`` has to be a mapping for ``make`` to dispatch on ``__type__``; # a ``bytes`` body is parsed against the schema registry instead. @@ -60,7 +60,7 @@ def _icmpv4_build(code: 'Any', kwargs: 'dict[str, Any]') -> 'Any': def _icmpv4_parse(octets: 'bytes') -> 'Any': - from pcapkit.protocols.internet.icmpv4 import ICMPv4 + from pcapkit.protocols.internet.icmpv4.protocol import ICMPv4 return ICMPv4(octets, len(octets)) @@ -69,13 +69,13 @@ def _icmp_extract(parsed: 'Any') -> 'Any': def _icmpv4_rebuild(message: 'Any') -> 'Any': - from pcapkit.protocols.internet.icmpv4 import ICMPv4 + from pcapkit.protocols.internet.icmpv4.protocol import ICMPv4 return ICMPv4(type=message.type, code=message.code, checksum=message.checksum, body=message) def _icmpv6_registry() -> 'Any': - from pcapkit.protocols.internet.icmpv6 import ICMPv6 + from pcapkit.protocols.internet.icmpv6.protocol import ICMPv6 return ICMPv6.__type__ @@ -94,7 +94,7 @@ def _icmpv6_overrides() -> 'dict[Any, dict[str, Any]]': def _icmpv6_build(code: 'Any', kwargs: 'dict[str, Any]') -> 'Any': - from pcapkit.protocols.internet.icmpv6 import ICMPv6 + from pcapkit.protocols.internet.icmpv6.protocol import ICMPv6 # With no enclosing IPv6 layer to supply the pseudo-header, the checksum is # left zero, and the rebuild passes the parsed zero back. @@ -102,12 +102,12 @@ def _icmpv6_build(code: 'Any', kwargs: 'dict[str, Any]') -> 'Any': def _icmpv6_parse(octets: 'bytes') -> 'Any': - from pcapkit.protocols.internet.icmpv6 import ICMPv6 + from pcapkit.protocols.internet.icmpv6.protocol import ICMPv6 return ICMPv6(octets, len(octets)) def _icmpv6_rebuild(message: 'Any') -> 'Any': - from pcapkit.protocols.internet.icmpv6 import ICMPv6 + from pcapkit.protocols.internet.icmpv6.protocol import ICMPv6 return ICMPv6(type=message.type, code=message.code, checksum=message.checksum, body=message) diff --git a/examples/generators/option_families/ipv4.py b/examples/generators/option_families/ipv4.py index c1433b5249..da76c2a816 100644 --- a/examples/generators/option_families/ipv4.py +++ b/examples/generators/option_families/ipv4.py @@ -25,7 +25,7 @@ def _ipv4_registry() -> 'Any': from pcapkit.const.ipv4.option_number import OptionNumber - from pcapkit.protocols.internet.ipv4 import IPv4 + from pcapkit.protocols.internet.ipv4.protocol import IPv4 return generator._named_registry(IPv4, OptionNumber, '_make_opt_', '__option__') @@ -53,12 +53,12 @@ def _ipv4_overrides() -> 'dict[Any, dict[str, Any]]': def _ipv4_build(code: 'Any', kwargs: 'dict[str, Any]') -> 'Any': - from pcapkit.protocols.internet.ipv4 import IPv4 + from pcapkit.protocols.internet.ipv4.protocol import IPv4 return IPv4(options=[(code, kwargs)], **IPV4_BASE) def _ipv4_parse(octets: 'bytes') -> 'Any': - from pcapkit.protocols.internet.ipv4 import IPv4 + from pcapkit.protocols.internet.ipv4.protocol import IPv4 return IPv4(octets, len(octets)) @@ -73,7 +73,7 @@ def _ipv4_extract(parsed: 'Any') -> 'Any': def _ipv4_rebuild(options: 'Any') -> 'Any': - from pcapkit.protocols.internet.ipv4 import IPv4 + from pcapkit.protocols.internet.ipv4.protocol import IPv4 return IPv4(options=options, **IPV4_BASE) diff --git a/examples/generators/option_families/ipv6.py b/examples/generators/option_families/ipv6.py index 4e8e54bd1e..1ee9e73590 100644 --- a/examples/generators/option_families/ipv6.py +++ b/examples/generators/option_families/ipv6.py @@ -22,12 +22,12 @@ def _hopopt_registry() -> 'Any': - from pcapkit.protocols.internet.hopopt import HOPOPT + from pcapkit.protocols.internet.hopopt.protocol import HOPOPT return HOPOPT.__option__ def _ipv6_opts_registry() -> 'Any': - from pcapkit.protocols.internet.ipv6_opts import IPv6_Opts + from pcapkit.protocols.internet.ipv6_opts.protocol import IPv6_Opts return IPv6_Opts.__option__ @@ -65,12 +65,12 @@ def _hopopt_base() -> 'dict[str, Any]': def _hopopt_build(code: 'Any', kwargs: 'dict[str, Any]') -> 'Any': - from pcapkit.protocols.internet.hopopt import HOPOPT + from pcapkit.protocols.internet.hopopt.protocol import HOPOPT return HOPOPT(options=[(code, kwargs)], **_hopopt_base()) def _hopopt_parse(octets: 'bytes') -> 'Any': - from pcapkit.protocols.internet.hopopt import HOPOPT + from pcapkit.protocols.internet.hopopt.protocol import HOPOPT return HOPOPT(octets, len(octets), extension=True) @@ -80,27 +80,27 @@ def _ipv6_extract(parsed: 'Any') -> 'Any': def _hopopt_rebuild(options: 'Any') -> 'Any': - from pcapkit.protocols.internet.hopopt import HOPOPT + from pcapkit.protocols.internet.hopopt.protocol import HOPOPT return HOPOPT(options=options, **_hopopt_base()) def _ipv6_opts_build(code: 'Any', kwargs: 'dict[str, Any]') -> 'Any': - from pcapkit.protocols.internet.ipv6_opts import IPv6_Opts + from pcapkit.protocols.internet.ipv6_opts.protocol import IPv6_Opts return IPv6_Opts(options=[(code, kwargs)], **_hopopt_base()) def _ipv6_opts_parse(octets: 'bytes') -> 'Any': - from pcapkit.protocols.internet.ipv6_opts import IPv6_Opts + from pcapkit.protocols.internet.ipv6_opts.protocol import IPv6_Opts return IPv6_Opts(octets, len(octets), extension=True) def _ipv6_opts_rebuild(options: 'Any') -> 'Any': - from pcapkit.protocols.internet.ipv6_opts import IPv6_Opts + from pcapkit.protocols.internet.ipv6_opts.protocol import IPv6_Opts return IPv6_Opts(options=options, **_hopopt_base()) def _ipv6_route_registry() -> 'Any': - from pcapkit.protocols.internet.ipv6_route import IPv6_Route + from pcapkit.protocols.internet.ipv6_route.protocol import IPv6_Route return IPv6_Route.__routing__ @@ -119,12 +119,12 @@ def _ipv6_route_base() -> 'dict[str, Any]': def _ipv6_route_build(code: 'Any', kwargs: 'dict[str, Any]') -> 'Any': - from pcapkit.protocols.internet.ipv6_route import IPv6_Route + from pcapkit.protocols.internet.ipv6_route.protocol import IPv6_Route return IPv6_Route(type=code, data=dict(kwargs), **_ipv6_route_base()) def _ipv6_route_parse(octets: 'bytes') -> 'Any': - from pcapkit.protocols.internet.ipv6_route import IPv6_Route + from pcapkit.protocols.internet.ipv6_route.protocol import IPv6_Route return IPv6_Route(octets, len(octets), extension=True) @@ -135,7 +135,7 @@ def _ipv6_route_extract(parsed: 'Any') -> 'Any': def _ipv6_route_rebuild(info: 'Any') -> 'Any': - from pcapkit.protocols.internet.ipv6_route import IPv6_Route + from pcapkit.protocols.internet.ipv6_route.protocol import IPv6_Route return IPv6_Route(type=info.type, data=info, next=info.next, seg_left=info.seg_left, payload=b'') diff --git a/examples/generators/option_families/mh.py b/examples/generators/option_families/mh.py index e14cc772b0..6a09315920 100644 --- a/examples/generators/option_families/mh.py +++ b/examples/generators/option_families/mh.py @@ -26,7 +26,7 @@ def _mh_message_registry() -> 'Any': - from pcapkit.protocols.internet.mh import MH + from pcapkit.protocols.internet.mh.protocol import MH return MH.__message__ @@ -35,7 +35,7 @@ def _mh_message_overrides() -> 'dict[Any, dict[str, Any]]': def _mh_message_build(code: 'Any', kwargs: 'dict[str, Any]') -> 'Any': - from pcapkit.protocols.internet.mh import MH + from pcapkit.protocols.internet.mh.protocol import MH # ``data`` has to be a mapping for ``make`` to dispatch on the message # type; a Data object takes the other branch, which is what rebuild uses. @@ -43,7 +43,7 @@ def _mh_message_build(code: 'Any', kwargs: 'dict[str, Any]') -> 'Any': def _mh_parse(octets: 'bytes') -> 'Any': - from pcapkit.protocols.internet.mh import MH + from pcapkit.protocols.internet.mh.protocol import MH return MH(octets, len(octets), extension=True) @@ -52,12 +52,12 @@ def _mh_message_extract(parsed: 'Any') -> 'Any': def _mh_message_rebuild(message: 'Any') -> 'Any': - from pcapkit.protocols.internet.mh import MH + from pcapkit.protocols.internet.mh.protocol import MH return MH(type=message.type, data=message, **MH_BASE) def _mh_option_registry() -> 'Any': - from pcapkit.protocols.internet.mh import MH + from pcapkit.protocols.internet.mh.protocol import MH return MH.__option__ @@ -122,7 +122,7 @@ def _mh_carrier() -> 'Any': def _mh_option_build(code: 'Any', kwargs: 'dict[str, Any]') -> 'Any': - from pcapkit.protocols.internet.mh import MH + from pcapkit.protocols.internet.mh.protocol import MH return MH(type=_mh_carrier(), data={'options': [(code, dict(kwargs))]}, **MH_BASE) @@ -132,12 +132,12 @@ def _mh_option_extract(parsed: 'Any') -> 'Any': def _mh_option_rebuild(options: 'Any') -> 'Any': - from pcapkit.protocols.internet.mh import MH + from pcapkit.protocols.internet.mh.protocol import MH return MH(type=_mh_carrier(), data={'options': options}, **MH_BASE) def _mh_extension_registry() -> 'Any': - from pcapkit.protocols.internet.mh import MH + from pcapkit.protocols.internet.mh.protocol import MH return MH.__extension__ @@ -149,8 +149,8 @@ def _mh_extension_overrides() -> 'dict[Any, dict[str, Any]]': def _mh_extension_build(code: 'Any', kwargs: 'dict[str, Any]') -> 'Any': from pcapkit.const.mh.cga_type import CGAType as Enum_CGAType from pcapkit.const.mh.option import Option as Enum_Option - from pcapkit.protocols.data.internet.mh import CGAParameter as Data_CGAParameter - from pcapkit.protocols.internet.mh import MH + from pcapkit.protocols.internet.mh.data import CGAParameter as Data_CGAParameter + from pcapkit.protocols.internet.mh.protocol import MH # A CGA extension has exactly one carrier: the ``extensions`` list of a CGA # parameter, inside a CGA Parameters option. It has to be a *Data* model diff --git a/examples/generators/option_families/pcapng.py b/examples/generators/option_families/pcapng.py index a12956c1b0..831f79893c 100644 --- a/examples/generators/option_families/pcapng.py +++ b/examples/generators/option_families/pcapng.py @@ -76,7 +76,7 @@ def _pcapng_context() -> 'tuple[Any, Any]': from pcapkit.const.pcapng.block_type import BlockType as Enum_BlockType from pcapkit.const.reg.linktype import LinkType as Enum_LinkType from pcapkit.foundation.engines.pcapng import Context - from pcapkit.protocols.misc.pcapng import PCAPNG + from pcapkit.protocols.misc.pcapng.protocol import PCAPNG section = PCAPNG(num=0, sct=1, ctx=None, type=Enum_BlockType.Section_Header_Block, block={}) @@ -112,7 +112,7 @@ def _pcapng_block(code: 'Any', block: 'dict[str, Any] | Any') -> 'Any': """ from pcapkit.const.pcapng.block_type import BlockType as Enum_BlockType - from pcapkit.protocols.misc.pcapng import PCAPNG + from pcapkit.protocols.misc.pcapng.protocol import PCAPNG # A Section Header Block is what *starts* a section, so it is the one block # the engine reads with no context at all. @@ -143,14 +143,14 @@ def _pcapng_parse(octets: 'bytes') -> 'Any': The parsed block. """ - from pcapkit.protocols.misc.pcapng import PCAPNG + from pcapkit.protocols.misc.pcapng.protocol import PCAPNG context = None if octets[:4] == PCAPNG_SHB_MAGIC else _pcapng_context()[0] return PCAPNG(octets, len(octets), num=2, sct=1, ctx=context) def _pcapng_block_registry() -> 'Any': - from pcapkit.protocols.misc.pcapng import PCAPNG + from pcapkit.protocols.misc.pcapng.protocol import PCAPNG return PCAPNG.__block__ @@ -211,13 +211,13 @@ def _pcapng_block_rebuild(info: 'Any') -> 'Any': def _pcapng_option_registry() -> 'Any': - from pcapkit.protocols.misc.pcapng import PCAPNG + from pcapkit.protocols.misc.pcapng.protocol import PCAPNG return PCAPNG.__option__ def _pcapng_option_overrides() -> 'dict[Any, dict[str, Any]]': from pcapkit.const.pcapng.option_type import OptionType as Enum_OptionType - from pcapkit.protocols.misc.pcapng import _option_key + from pcapkit.protocols.misc.pcapng.protocol import _option_key return { _option_key(Enum_OptionType.opt_comment): {'comment': 'probe'}, _option_key(Enum_OptionType.opt_custom_2988): {'pen': 32473, 'data': b'\x01\x02\x03\x04'}, @@ -280,7 +280,7 @@ def _pcapng_option_enum(key: 'Any') -> 'Any': """ from pcapkit.const.pcapng.option_type import OptionType as Enum_OptionType - from pcapkit.protocols.misc.pcapng import _option_key + from pcapkit.protocols.misc.pcapng.protocol import _option_key # The enumeration is an :mod:`aenum` one, whose metaclass does not advertise # ``__iter__`` to a type checker even though it iterates perfectly well. @@ -332,7 +332,7 @@ def _pcapng_option_rebuild(info: 'Any') -> 'Any': def _pcapng_record_registry() -> 'Any': - from pcapkit.protocols.misc.pcapng import PCAPNG + from pcapkit.protocols.misc.pcapng.protocol import PCAPNG return PCAPNG.__record__ @@ -368,7 +368,7 @@ def _pcapng_record_rebuild(records: 'Any') -> 'Any': def _pcapng_secrets_registry() -> 'Any': - from pcapkit.protocols.misc.pcapng import PCAPNG + from pcapkit.protocols.misc.pcapng.protocol import PCAPNG return PCAPNG.__secrets__ @@ -376,7 +376,7 @@ def _pcapng_secrets_overrides() -> 'dict[Any, dict[str, Any]]': from pcapkit.const.pcapng.secrets_type import SecretsType as Enum_SecretsType from pcapkit.const.pcapng.tls_key_label import TLSKeyLabel as Enum_TLSKeyLabel from pcapkit.corekit.multidict import OrderedMultiDict - from pcapkit.protocols.misc.pcapng import WireGuardKeyLabel + from pcapkit.protocols.misc.pcapng.protocol import WireGuardKeyLabel return { Enum_SecretsType.TLS_Key_Log: { 'entries': {Enum_TLSKeyLabel.CLIENT_RANDOM: OrderedMultiDict( diff --git a/examples/generators/option_families/radiotap.py b/examples/generators/option_families/radiotap.py index 277158301e..ec0642113e 100644 --- a/examples/generators/option_families/radiotap.py +++ b/examples/generators/option_families/radiotap.py @@ -27,7 +27,7 @@ def _radiotap_field_registry() -> 'Any': - from pcapkit.protocols.link.radiotap import Radiotap + from pcapkit.protocols.link.radiotap.protocol import Radiotap return Radiotap.__field__ @@ -82,7 +82,7 @@ def _radiotap_field_overrides() -> 'dict[Any, dict[str, Any]]': def _radiotap_field_build(code: 'Any', kwargs: 'dict[str, Any]') -> 'Any': from pcapkit.const.radiotap.field_type import FieldType as Enum_FieldType - from pcapkit.protocols.link.radiotap import Radiotap + from pcapkit.protocols.link.radiotap.protocol import Radiotap if code < Enum_FieldType.TLV_fields_in_radiotap: return Radiotap(present=(1 << code,), fields=[(code, dict(kwargs))]) @@ -91,7 +91,7 @@ def _radiotap_field_build(code: 'Any', kwargs: 'dict[str, Any]') -> 'Any': def _radiotap_parse(octets: 'bytes') -> 'Any': - from pcapkit.protocols.link.radiotap import Radiotap + from pcapkit.protocols.link.radiotap.protocol import Radiotap return Radiotap(octets, len(octets)) @@ -100,7 +100,7 @@ def _radiotap_field_extract(parsed: 'Any') -> 'Any': def _radiotap_field_rebuild(collection: 'Any') -> 'Any': - from pcapkit.protocols.link.radiotap import Radiotap + from pcapkit.protocols.link.radiotap.protocol import Radiotap present, decoded = collection return Radiotap(present=present, fields=decoded) diff --git a/examples/generators/option_families/sctp.py b/examples/generators/option_families/sctp.py index 1cf2a8f0ad..d1eab8445d 100644 --- a/examples/generators/option_families/sctp.py +++ b/examples/generators/option_families/sctp.py @@ -30,7 +30,7 @@ def _sctp_chunk_registry() -> 'Any': - from pcapkit.protocols.transport.sctp import SCTP + from pcapkit.protocols.transport.sctp.protocol import SCTP return SCTP.__chunk__ @@ -68,12 +68,12 @@ def _sctp_chunk_overrides() -> 'dict[Any, dict[str, Any]]': def _sctp_chunk_build(code: 'Any', kwargs: 'dict[str, Any]') -> 'Any': - from pcapkit.protocols.transport.sctp import SCTP + from pcapkit.protocols.transport.sctp.protocol import SCTP return SCTP(chunks=[(code, kwargs)], **SCTP_BASE) def _sctp_parse(octets: 'bytes') -> 'Any': - from pcapkit.protocols.transport.sctp import SCTP + from pcapkit.protocols.transport.sctp.protocol import SCTP return SCTP(octets, len(octets)) @@ -82,12 +82,12 @@ def _sctp_extract(parsed: 'Any') -> 'Any': def _sctp_rebuild(chunks: 'Any') -> 'Any': - from pcapkit.protocols.transport.sctp import SCTP + from pcapkit.protocols.transport.sctp.protocol import SCTP return SCTP(chunks=chunks, **SCTP_BASE) def _sctp_param_registry() -> 'Any': - from pcapkit.protocols.transport.sctp import SCTP + from pcapkit.protocols.transport.sctp.protocol import SCTP return SCTP.__parameter__ @@ -109,7 +109,7 @@ def _sctp_param_overrides() -> 'dict[Any, dict[str, Any]]': def _sctp_param_build(code: 'Any', kwargs: 'dict[str, Any]') -> 'Any': from pcapkit.const.sctp.chunk import Chunk as Enum_Chunk - from pcapkit.protocols.transport.sctp import SCTP + from pcapkit.protocols.transport.sctp.protocol import SCTP # A parameter is not a top-level item: it travels inside a chunk, and # HEARTBEAT is the smallest chunk that carries an arbitrary one. @@ -118,7 +118,7 @@ def _sctp_param_build(code: 'Any', kwargs: 'dict[str, Any]') -> 'Any': def _sctp_cause_registry() -> 'Any': - from pcapkit.protocols.transport.sctp import SCTP + from pcapkit.protocols.transport.sctp.protocol import SCTP return SCTP.__cause__ @@ -143,7 +143,7 @@ def _sctp_cause_overrides() -> 'dict[Any, dict[str, Any]]': def _sctp_cause_build(code: 'Any', kwargs: 'dict[str, Any]') -> 'Any': from pcapkit.const.sctp.chunk import Chunk as Enum_Chunk - from pcapkit.protocols.transport.sctp import SCTP + from pcapkit.protocols.transport.sctp.protocol import SCTP # An error cause travels inside an ERROR (or ABORT) chunk, under the # keyword ``error`` rather than ``causes``. diff --git a/examples/generators/option_families/tcp.py b/examples/generators/option_families/tcp.py index 886a405009..0204a63e65 100644 --- a/examples/generators/option_families/tcp.py +++ b/examples/generators/option_families/tcp.py @@ -24,7 +24,7 @@ #: option and nothing else. #: #: Every key here has to be spelled the way :meth:`TCP.make -#: ` declares it: an undeclared +#: ` declares it: an undeclared #: keyword raises :exc:`~pcapkit.utilities.exceptions.UnsupportedCall` (#617). #: Without that check, ``make``'s ``**kwargs`` drops it silently, so a key #: spelled wrong in this table is ignored (GitHub issue #602): @@ -51,7 +51,7 @@ def _tcp_registry() -> 'Any': - from pcapkit.protocols.transport.tcp import TCP + from pcapkit.protocols.transport.tcp.protocol import TCP return TCP.__option__ @@ -68,12 +68,12 @@ def _tcp_overrides() -> 'dict[Any, dict[str, Any]]': def _tcp_build(code: 'Any', kwargs: 'dict[str, Any]') -> 'Any': - from pcapkit.protocols.transport.tcp import TCP + from pcapkit.protocols.transport.tcp.protocol import TCP return TCP(options=[(code, kwargs)], **TCP_BASE) def _tcp_parse(octets: 'bytes') -> 'Any': - from pcapkit.protocols.transport.tcp import TCP + from pcapkit.protocols.transport.tcp.protocol import TCP return TCP(octets, len(octets)) @@ -82,12 +82,12 @@ def _tcp_extract(parsed: 'Any') -> 'Any': def _tcp_rebuild(options: 'Any') -> 'Any': - from pcapkit.protocols.transport.tcp import TCP + from pcapkit.protocols.transport.tcp.protocol import TCP return TCP(options=options, **TCP_BASE) def _mptcp_registry() -> 'Any': - from pcapkit.protocols.transport.tcp import TCP + from pcapkit.protocols.transport.tcp.protocol import TCP return TCP.__mp_option__ @@ -107,7 +107,7 @@ def _mptcp_overrides() -> 'dict[Any, dict[str, Any]]': def _mptcp_build(code: 'Any', kwargs: 'dict[str, Any]') -> 'Any': from pcapkit.const.tcp.option import Option as Enum_Option - from pcapkit.protocols.transport.tcp import TCP + from pcapkit.protocols.transport.tcp.protocol import TCP # The subtype travels as an argument of the enclosing Multipath TCP option # rather than as a registry key of its own, so it is spliced in here rather diff --git a/examples/generators/option_families/tls.py b/examples/generators/option_families/tls.py index aeabe1dfb1..b7b8824057 100644 --- a/examples/generators/option_families/tls.py +++ b/examples/generators/option_families/tls.py @@ -25,13 +25,13 @@ def _tls_extension_registry() -> 'Any': - from pcapkit.protocols.application.tls import TLS + from pcapkit.protocols.application.tls.protocol import TLS return TLS.__extension__ def _tls_extension_overrides() -> 'dict[Any, dict[str, Any]]': from pcapkit.const.tls.extension_type import ExtensionType as Enum_ExtensionType - from pcapkit.protocols.data.application.tls import KeyShareEntry, ServerName + from pcapkit.protocols.application.ssl.data import KeyShareEntry, ServerName return { # Each of these defaults to an empty list. Enum_ExtensionType.server_name: { @@ -50,8 +50,8 @@ def _tls_client_hello(extensions: 'Any') -> 'Any': """A TLS record carrying one ``ClientHello`` with ``extensions``.""" from pcapkit.const.tls.content_type import ContentType as Enum_ContentType from pcapkit.const.tls.handshake_type import HandshakeType as Enum_HandshakeType - from pcapkit.protocols.application.tls import TLS - from pcapkit.protocols.data.application.tls import ClientHello, Handshake + from pcapkit.protocols.application.tls.protocol import TLS + from pcapkit.protocols.application.ssl.data import ClientHello, Handshake hello = ClientHello(version=0x0303, random=bytes(32), session_id=b'', cookie=None, cipher_suites=(0x1301,), compression_methods=(0,), extensions=extensions) @@ -64,7 +64,7 @@ def _tls_extension_build(code: 'Any', kwargs: 'dict[str, Any]') -> 'Any': def _tls_parse(octets: 'bytes') -> 'Any': - from pcapkit.protocols.application.tls import TLS + from pcapkit.protocols.application.tls.protocol import TLS return TLS(octets, len(octets)) diff --git a/examples/generators/pcap.py b/examples/generators/pcap.py index be5a267004..7c6cbd9f6c 100644 --- a/examples/generators/pcap.py +++ b/examples/generators/pcap.py @@ -18,7 +18,7 @@ A unicast ARP cache-refresh exchange on a private LAN: request from ``10.20.30.131`` to ``10.20.30.130`` and the matching reply. Both frames are padded to the 60-octet Ethernet minimum, which is what gives the ARP - payload its trailing :class:`~pcapkit.protocols.misc.raw.Raw` block. + payload its trailing :class:`~pcapkit.protocols.misc.raw.protocol.Raw` block. Pinned by ``tests/protocols/link/test_link_runtime.py``, ``tests/protocols/misc/pcap/test_frame_runtime.py`` and ``tests/integration/test_runtime_extract.py`` (frame count). @@ -35,7 +35,7 @@ Link-local IPv6 between two hosts: neighbour discovery, ICMPv6 echoes, and then a 4778-octet UDP datagram fragmented into four pieces (1448/1448/1448/434 octets, identification 110308). Exercises the ICMPv6 - fall back to :class:`~pcapkit.protocols.misc.raw.Raw` and the IPv6 + fall back to :class:`~pcapkit.protocols.misc.raw.protocol.Raw` and the IPv6 fragment extension header. Pinned by ``tests/protocols/internet/test_ip_runtime.py`` and ``tests/protocols/internet/test_ipv6_extension_runtime.py``. @@ -45,7 +45,7 @@ IPv6, beginning with the server's SYN-ACK (the client's SYN predates the excerpt). Exercises the full TCP option set -- MSS, window scale, timestamps, SACK permitted, end of option list -- and the fall back to - :class:`~pcapkit.protocols.misc.raw.Raw` for an unregistered port. + :class:`~pcapkit.protocols.misc.raw.protocol.Raw` for an unregistered port. Pinned by ``tests/protocols/transport/test_tcp_runtime.py``. ``stream.pcap`` (6 frames) @@ -61,7 +61,7 @@ A page load off ``sina.com.cn`` over HTTP/1.1: short keep-alive-then-close connections to several hosts, each a full handshake, request, response and teardown. Exercises HTTP request and response parsing (headers, gzip'd and - empty bodies) and the fall back to :class:`~pcapkit.protocols.misc.raw.Raw` + empty bodies) and the fall back to :class:`~pcapkit.protocols.misc.raw.protocol.Raw` for a continuation segment that carries no header block. Pinned by ``tests/protocols/application/test_http_runtime.py``, which indexes frames 114, 117, 393, 556, 587, 629 and 1113 directly -- hence diff --git a/examples/generators/pcapng.py b/examples/generators/pcapng.py index a01daf3b4c..2a95bcd47b 100644 --- a/examples/generators/pcapng.py +++ b/examples/generators/pcapng.py @@ -93,7 +93,7 @@ section. The fixtures also cover option-area sizing errors in -``pcapkit/protocols/schema/misc/pcapng.py``, each confirmed by bisecting one +``pcapkit/protocols/misc/pcapng/schema.py``, each confirmed by bisecting one block type at a time. They warn rather than raise, and a fixture that covers the code path is what will catch a future crash there: diff --git a/pcapkit/const/arp/__init__.py b/pcapkit/const/arp/__init__.py index 37e1d1786e..83b169d997 100644 --- a/pcapkit/const/arp/__init__.py +++ b/pcapkit/const/arp/__init__.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.link.arp.ARP` Constant Enumerations -==================================================================== +""":class:`~pcapkit.protocols.link.arp.protocol.ARP` Constant Enumerations +============================================================================= -This module contains all constant enumerations of :class:`~pcapkit.protocols.link.arp.ARP` -and :class:`~pcapkit.protocols.application.rarp.RARP` implementations. Available +This module contains all constant enumerations of :class:`~pcapkit.protocols.link.arp.protocol.ARP` +and :class:`~pcapkit.protocols.application.rarp.protocol.RARP` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/const/dccp/__init__.py b/pcapkit/const/dccp/__init__.py index 4fbdf54d3f..269dd616e6 100644 --- a/pcapkit/const/dccp/__init__.py +++ b/pcapkit/const/dccp/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.transport.dccp.DCCP` Constant Enumerations -=========================================================================== +""":class:`~pcapkit.protocols.transport.dccp.protocol.DCCP` Constant Enumerations +==================================================================================== .. module:: pcapkit.const.dccp This module contains all constant enumerations of -:class:`~pcapkit.protocols.transport.dccp.DCCP` implementations. Available +:class:`~pcapkit.protocols.transport.dccp.protocol.DCCP` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/const/esp/__init__.py b/pcapkit/const/esp/__init__.py index aaa00714ff..793a27149e 100644 --- a/pcapkit/const/esp/__init__.py +++ b/pcapkit/const/esp/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.internet.esp.ESP` Constant Enumerations -======================================================================== +""":class:`~pcapkit.protocols.internet.esp.protocol.ESP` Constant Enumerations +================================================================================= .. module:: pcapkit.const.esp This module contains all constant enumerations of -:class:`~pcapkit.protocols.internet.esp.ESP` implementations. Available +:class:`~pcapkit.protocols.internet.esp.protocol.ESP` implementations. Available enumerations include: .. list-table:: @@ -19,14 +19,14 @@ ESP has no algorithm registry of its own: an SA's algorithms are negotiated by IKEv2, so both enumerations are the corresponding IKEv2 *transform ID* sub-registries. They live here rather than under an ``ikev2`` package because -:class:`~pcapkit.protocols.internet.esp.ESP` is the only thing in +:class:`~pcapkit.protocols.internet.esp.protocol.ESP` is the only thing in :mod:`pcapkit` that consumes them. Both enumerate every transform **IANA has registered**, which is a much larger set than :mod:`pcapkit` can apply. Which of them ESP actually implements is a separate question, answered by -:data:`~pcapkit.protocols.internet.esp.CIPHER_SUITES` and -:data:`~pcapkit.protocols.internet.esp.INTEGRITY_SUITES`. +:data:`~pcapkit.protocols.internet.esp.protocol.CIPHER_SUITES` and +:data:`~pcapkit.protocols.internet.esp.protocol.INTEGRITY_SUITES`. .. [*] https://www.iana.org/assignments/ikev2-parameters/ikev2-parameters.xhtml#ikev2-parameters-5 .. [*] https://www.iana.org/assignments/ikev2-parameters/ikev2-parameters.xhtml#ikev2-parameters-7 diff --git a/pcapkit/const/ftp/__init__.py b/pcapkit/const/ftp/__init__.py index 1b2ebf51d0..8d0fc759f9 100644 --- a/pcapkit/const/ftp/__init__.py +++ b/pcapkit/const/ftp/__init__.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.application.ftp.FTP` Constant Enumerations -=========================================================================== +""":class:`~pcapkit.protocols.application.ftp.protocol.FTP` Constant Enumerations +==================================================================================== This module contains all constant enumerations of -:class:`~pcapkit.protocols.application.ftp.FTP` implementations. Available +:class:`~pcapkit.protocols.application.ftp.protocol.FTP` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/const/hip/__init__.py b/pcapkit/const/hip/__init__.py index af7aee897e..b63fb4b345 100644 --- a/pcapkit/const/hip/__init__.py +++ b/pcapkit/const/hip/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.internet.hip.HIP` Constant Enumerations -======================================================================== +""":class:`~pcapkit.protocols.internet.hip.protocol.HIP` Constant Enumerations +================================================================================= .. module:: pcapkit.const.hip This module contains all constant enumerations of -:class:`~pcapkit.protocols.internet.hip.HIP` implementations. Available +:class:`~pcapkit.protocols.internet.hip.protocol.HIP` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/const/http/__init__.py b/pcapkit/const/http/__init__.py index a322844341..97c7f8e5ab 100644 --- a/pcapkit/const/http/__init__.py +++ b/pcapkit/const/http/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -r""":class:`~pcapkit.protocols.application.http.HTTP` Constant Enumerations -============================================================================= +r""":class:`~pcapkit.protocols.application.http.protocol.HTTP` Constant Enumerations +====================================================================================== .. module:: pcapkit.const.http This module contains all constant enumerations of -:class:`~pcapkit.protocols.application.http.HTTP` implementations. Available +:class:`~pcapkit.protocols.application.http.protocol.HTTP` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/const/icmp/__init__.py b/pcapkit/const/icmp/__init__.py index a9390e1477..e3cd7b7206 100644 --- a/pcapkit/const/icmp/__init__.py +++ b/pcapkit/const/icmp/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.internet.icmpv4.ICMPv4` Constant Enumerations -============================================================================== +""":class:`~pcapkit.protocols.internet.icmpv4.protocol.ICMPv4` Constant Enumerations +======================================================================================= .. module:: pcapkit.const.icmp This module contains all constant enumerations of -:class:`~pcapkit.protocols.internet.icmpv4.ICMPv4` implementations. Available +:class:`~pcapkit.protocols.internet.icmpv4.protocol.ICMPv4` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/const/icmpv6/__init__.py b/pcapkit/const/icmpv6/__init__.py index e4329de5e4..3ffec8feee 100644 --- a/pcapkit/const/icmpv6/__init__.py +++ b/pcapkit/const/icmpv6/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.internet.icmpv6.ICMPv6` Constant Enumerations -============================================================================== +""":class:`~pcapkit.protocols.internet.icmpv6.protocol.ICMPv6` Constant Enumerations +======================================================================================= .. module:: pcapkit.const.icmpv6 This module contains all constant enumerations of -:class:`~pcapkit.protocols.internet.icmpv6.ICMPv6` implementations. Available +:class:`~pcapkit.protocols.internet.icmpv6.protocol.ICMPv6` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/const/ieee802_11/__init__.py b/pcapkit/const/ieee802_11/__init__.py index d16ab37724..f24f140dc8 100644 --- a/pcapkit/const/ieee802_11/__init__.py +++ b/pcapkit/const/ieee802_11/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.link.ieee802_11.IEEE802_11` Constant Enumerations -================================================================================== +""":class:`~pcapkit.protocols.link.ieee802_11.protocol.IEEE802_11` Constant Enumerations +=========================================================================================== .. module:: pcapkit.const.ieee802_11 This module contains all constant enumerations of -:class:`~pcapkit.protocols.link.ieee802_11.IEEE802_11` implementations, each +:class:`~pcapkit.protocols.link.ieee802_11.protocol.IEEE802_11` implementations, each from IEEE Std 802.11-2020, Table 9-1, *Valid type and subtype combinations*. Available enumerations include: diff --git a/pcapkit/const/igmp/__init__.py b/pcapkit/const/igmp/__init__.py index da35931d80..1477a564ab 100644 --- a/pcapkit/const/igmp/__init__.py +++ b/pcapkit/const/igmp/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.internet.igmp.IGMP` Constant Enumerations -========================================================================== +""":class:`~pcapkit.protocols.internet.igmp.protocol.IGMP` Constant Enumerations +=================================================================================== .. module:: pcapkit.const.igmp This module contains all constant enumerations of -:class:`~pcapkit.protocols.internet.igmp.IGMP` implementations. Available +:class:`~pcapkit.protocols.internet.igmp.protocol.IGMP` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/const/ipv4/__init__.py b/pcapkit/const/ipv4/__init__.py index 98c4a76a1c..9577b24ec0 100644 --- a/pcapkit/const/ipv4/__init__.py +++ b/pcapkit/const/ipv4/__init__.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.internet.ipv4.IPv4` Constant Enumerations -========================================================================== +""":class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4` Constant Enumerations +=================================================================================== This module contains all constant enumerations of -:class:`~pcapkit.protocols.internet.ipv4.IPv4` implementations. Available +:class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/const/ipv6/__init__.py b/pcapkit/const/ipv6/__init__.py index c5d0ba147b..fffb5a12dc 100644 --- a/pcapkit/const/ipv6/__init__.py +++ b/pcapkit/const/ipv6/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.internet.ipv6.IPv6` Constant Enumerations -========================================================================== +""":class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6` Constant Enumerations +=================================================================================== .. module:: pcapkit.const.ipv6 This module contains all constant enumerations of -:class:`~pcapkit.protocols.internet.ipv6.IPv6` implementations. Available +:class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/const/ipx/__init__.py b/pcapkit/const/ipx/__init__.py index 16d436e83e..63f2d70735 100644 --- a/pcapkit/const/ipx/__init__.py +++ b/pcapkit/const/ipx/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.internet.ipx.IPX` Constant Enumerations -======================================================================== +""":class:`~pcapkit.protocols.internet.ipx.protocol.IPX` Constant Enumerations +================================================================================= .. module:: pcapkit.const.ipx This module contains all constant enumerations of -:class:`~pcapkit.protocols.internet.ipx.IPX` implementations. Available +:class:`~pcapkit.protocols.internet.ipx.protocol.IPX` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/const/l2tp/__init__.py b/pcapkit/const/l2tp/__init__.py index e94bc726b0..4c1ff47436 100644 --- a/pcapkit/const/l2tp/__init__.py +++ b/pcapkit/const/l2tp/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.link.l2tp.L2TP` Constant Enumerations -====================================================================== +""":class:`~pcapkit.protocols.link.l2tp.protocol.L2TP` Constant Enumerations +=============================================================================== .. module:: pcapkit.const.l2tp This module contains all constant enumerations of -:class:`~pcapkit.protocols.link.l2tp.L2TP` implementations. Available +:class:`~pcapkit.protocols.link.l2tp.protocol.L2TP` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/const/linux/__init__.py b/pcapkit/const/linux/__init__.py index 625a5cfb45..fef2b61121 100644 --- a/pcapkit/const/linux/__init__.py +++ b/pcapkit/const/linux/__init__.py @@ -4,7 +4,7 @@ ====================================================== This module contains the constant enumerations of the Linux-specific -encapsulations, e.g. :class:`~pcapkit.protocols.link.linux_sll.LinuxSLL`. +encapsulations, e.g. :class:`~pcapkit.protocols.link.linux_sll.protocol.LinuxSLL`. Available enumerations include: .. list-table:: diff --git a/pcapkit/const/linux/arphrd.py b/pcapkit/const/linux/arphrd.py index 50f74a99d0..80c8e92125 100644 --- a/pcapkit/const/linux/arphrd.py +++ b/pcapkit/const/linux/arphrd.py @@ -35,7 +35,7 @@ class ARPHRD(EnumRegistry, IntEnum): #: references rather than imported, because :mod:`pcapkit.const` sits below #: :mod:`pcapkit.protocols` and importing one from here would be circular. __proto_dest__ = ( - ModuleDescriptor('pcapkit.protocols.link.linux_sll', 'LinuxSLL'), + ModuleDescriptor('pcapkit.protocols.link.linux_sll.protocol', 'LinuxSLL'), ) #: NET/ROM pseudo. diff --git a/pcapkit/const/mh/__init__.py b/pcapkit/const/mh/__init__.py index ad75a4d111..2d5bd9ae48 100644 --- a/pcapkit/const/mh/__init__.py +++ b/pcapkit/const/mh/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.internet.mh.MH` Constant Enumerations -====================================================================== +""":class:`~pcapkit.protocols.internet.mh.protocol.MH` Constant Enumerations +=============================================================================== .. module:: pcapkit.const.mh This module contains all constant enumerations of -:class:`~pcapkit.protocols.internet.mh.MH` implementations. Available +:class:`~pcapkit.protocols.internet.mh.protocol.MH` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/const/ngap/__init__.py b/pcapkit/const/ngap/__init__.py index c5466d8215..5979a05d3c 100644 --- a/pcapkit/const/ngap/__init__.py +++ b/pcapkit/const/ngap/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.application.ngap.NGAP` Constant Enumerations -============================================================================= +""":class:`~pcapkit.protocols.application.ngap.protocol.NGAP` Constant Enumerations +====================================================================================== .. module:: pcapkit.const.ngap This module contains all constant enumerations of -:class:`~pcapkit.protocols.application.ngap.NGAP` implementations. Available +:class:`~pcapkit.protocols.application.ngap.protocol.NGAP` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/const/ospf/__init__.py b/pcapkit/const/ospf/__init__.py index 7de969cd73..6b68b8f36c 100644 --- a/pcapkit/const/ospf/__init__.py +++ b/pcapkit/const/ospf/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.application.ospf.OSPF` Constant Enumerations -============================================================================= +""":class:`~pcapkit.protocols.application.ospf.protocol.OSPF` Constant Enumerations +====================================================================================== .. module:: pcapkit.const.ospf This module contains all constant enumerations of -:class:`~pcapkit.protocols.application.ospf.OSPF` implementations. Available +:class:`~pcapkit.protocols.application.ospf.protocol.OSPF` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/const/pcapng/__init__.py b/pcapkit/const/pcapng/__init__.py index 08d903c59a..7ae9e31a94 100644 --- a/pcapkit/const/pcapng/__init__.py +++ b/pcapkit/const/pcapng/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.misc.pcapng.PCAPNG` Constant Enumerations -========================================================================== +""":class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG` Constant Enumerations +=================================================================================== .. module:: pcapkit.const.pcapng This module contains all constant enumerations of -:class:`~pcapkit.protocols.misc.pcapng.PCAPNG` implementations. Available +:class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/const/pcapng/option_type.py b/pcapkit/const/pcapng/option_type.py index a9166c3a45..8a0708c699 100644 --- a/pcapkit/const/pcapng/option_type.py +++ b/pcapkit/const/pcapng/option_type.py @@ -377,7 +377,7 @@ def get(key: 'int | str', default: 'int' = -1, *, namespace: 'str' = 'opt') -> ' # permanent member as a side effect of a mere lookup -- exactly # the ``get``/``_missing_`` minting the owner's ruling forbids, # here on the wire-facing path - # (:meth:`pcapkit.protocols.misc.pcapng.PCAPNG._make_pcapng_options` + # (:meth:`pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_pcapng_options` # calls this with raw option-code bytes off the wire). # ``_unregistered_member`` never touches ``__members_ns__`` # either, so a genuinely unknown option code grows neither diff --git a/pcapkit/const/radiotap/__init__.py b/pcapkit/const/radiotap/__init__.py index e2b24a4722..a4c6772692 100644 --- a/pcapkit/const/radiotap/__init__.py +++ b/pcapkit/const/radiotap/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.link.radiotap.Radiotap` Constant Enumerations -============================================================================== +""":class:`~pcapkit.protocols.link.radiotap.protocol.Radiotap` Constant Enumerations +======================================================================================= .. module:: pcapkit.const.radiotap This module contains all constant enumerations of -:class:`~pcapkit.protocols.link.radiotap.Radiotap` implementations. Available +:class:`~pcapkit.protocols.link.radiotap.protocol.Radiotap` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/const/reg/linktype.py b/pcapkit/const/reg/linktype.py index ec3cb575fc..94c2b62bfe 100644 --- a/pcapkit/const/reg/linktype.py +++ b/pcapkit/const/reg/linktype.py @@ -35,8 +35,8 @@ class LinkType(EnumRegistry, IntEnum): #: references rather than imported, because :mod:`pcapkit.const` sits below #: :mod:`pcapkit.protocols` and importing one from here would be circular. __proto_dest__ = ( - ModuleDescriptor('pcapkit.protocols.misc.pcap.frame', 'Frame'), - ModuleDescriptor('pcapkit.protocols.misc.pcapng', 'PCAPNG'), + ModuleDescriptor('pcapkit.protocols.misc.pcap.frame.protocol', 'Frame'), + ModuleDescriptor('pcapkit.protocols.misc.pcapng.protocol', 'PCAPNG'), ) #: [``DLT_NULL``] BSD loopback encapsulation. diff --git a/pcapkit/const/sctp/__init__.py b/pcapkit/const/sctp/__init__.py index 5e6d310471..449391b43a 100644 --- a/pcapkit/const/sctp/__init__.py +++ b/pcapkit/const/sctp/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.transport.sctp.SCTP` Constant Enumerations -=========================================================================== +""":class:`~pcapkit.protocols.transport.sctp.protocol.SCTP` Constant Enumerations +==================================================================================== .. module:: pcapkit.const.sctp This module contains all constant enumerations of -:class:`~pcapkit.protocols.transport.sctp.SCTP` implementations. Available +:class:`~pcapkit.protocols.transport.sctp.protocol.SCTP` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/const/sctp/payload_protocol_identifier.py b/pcapkit/const/sctp/payload_protocol_identifier.py index f8c153f288..c0cf2e074f 100644 --- a/pcapkit/const/sctp/payload_protocol_identifier.py +++ b/pcapkit/const/sctp/payload_protocol_identifier.py @@ -35,7 +35,7 @@ class PayloadProtocolIdentifier(EnumRegistry, IntEnum): #: references rather than imported, because :mod:`pcapkit.const` sits below #: :mod:`pcapkit.protocols` and importing one from here would be circular. __proto_dest__ = ( - ModuleDescriptor('pcapkit.protocols.transport.sctp', 'SCTP'), + ModuleDescriptor('pcapkit.protocols.transport.sctp.protocol', 'SCTP'), ) #: Reserved by SCTP [:rfc:`9260`] diff --git a/pcapkit/const/sslv2/__init__.py b/pcapkit/const/sslv2/__init__.py index 1fb6b97098..49a6422fe1 100644 --- a/pcapkit/const/sslv2/__init__.py +++ b/pcapkit/const/sslv2/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -r""":class:`~pcapkit.protocols.application.sslv2.SSLv2` Constant Enumerations -=============================================================================== +r""":class:`~pcapkit.protocols.application.sslv2.protocol.SSLv2` Constant Enumerations +======================================================================================== .. module:: pcapkit.const.sslv2 This module contains all constant enumerations of -:class:`~pcapkit.protocols.application.sslv2.SSLv2` implementations. Available +:class:`~pcapkit.protocols.application.sslv2.protocol.SSLv2` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/const/tcp/__init__.py b/pcapkit/const/tcp/__init__.py index e4a15ed045..aba7b3ad6b 100644 --- a/pcapkit/const/tcp/__init__.py +++ b/pcapkit/const/tcp/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.transport.tcp.TCP` Constant Enumerations -========================================================================= +""":class:`~pcapkit.protocols.transport.tcp.protocol.TCP` Constant Enumerations +================================================================================== .. module:: pcapkit.const.tcp This module contains all constant enumerations of -:class:`~pcapkit.protocols.transport.tcp.TCP` implementations. Available +:class:`~pcapkit.protocols.transport.tcp.protocol.TCP` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/const/tls/__init__.py b/pcapkit/const/tls/__init__.py index 3cd939f778..772816eff9 100644 --- a/pcapkit/const/tls/__init__.py +++ b/pcapkit/const/tls/__init__.py @@ -1,14 +1,14 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.application.ssl.SSL` Constant Enumerations -=========================================================================== +""":class:`~pcapkit.protocols.application.ssl.protocol.SSL` Constant Enumerations +==================================================================================== .. module:: pcapkit.const.tls This module contains the constant enumerations shared by the record-layer -implementations under the :class:`~pcapkit.protocols.application.ssl.SSL` -umbrella -- :class:`~pcapkit.protocols.application.tls.TLS` (SSLv3 through -TLS 1.3) and :class:`~pcapkit.protocols.application.dtls.DTLS`. Available +implementations under the :class:`~pcapkit.protocols.application.ssl.protocol.SSL` +umbrella -- :class:`~pcapkit.protocols.application.tls.protocol.TLS` (SSLv3 through +TLS 1.3) and :class:`~pcapkit.protocols.application.dtls.protocol.DTLS`. Available enumerations include: .. list-table:: diff --git a/pcapkit/const/vlan/__init__.py b/pcapkit/const/vlan/__init__.py index 162e868fd4..8f2e73bb07 100644 --- a/pcapkit/const/vlan/__init__.py +++ b/pcapkit/const/vlan/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.link.vlan.VLAN` Constant Enumerations -====================================================================== +""":class:`~pcapkit.protocols.link.vlan.protocol.VLAN` Constant Enumerations +=============================================================================== .. module:: pcapkit.const.vlan This module contains all constant enumerations of -:class:`~pcapkit.protocols.link.vlan.VLAN` implementations. Available +:class:`~pcapkit.protocols.link.vlan.protocol.VLAN` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/corekit/checksum/internet.py b/pcapkit/corekit/checksum/internet.py index 16194a4e16..91be2f8dac 100644 --- a/pcapkit/corekit/checksum/internet.py +++ b/pcapkit/corekit/checksum/internet.py @@ -17,7 +17,7 @@ which a filter can silence alone (:issue:`2470`). A checksum over the IP pseudo-header is left to the enclosing IP layer, see -:mod:`pcapkit.protocols.misc.checksum.ip_pseudo`. A checksum over the message +:mod:`pcapkit.protocols.misc.checksum.ip_pseudo.protocol`. A checksum over the message alone, as ICMP's, IGMP's and GRE's, is verified as it is parsed, unless the IP layer it is parsed from is a fragment, see :func:`verify_message`. diff --git a/pcapkit/corekit/context.py b/pcapkit/corekit/context.py index 386ec160d1..08cc43fb4d 100644 --- a/pcapkit/corekit/context.py +++ b/pcapkit/corekit/context.py @@ -10,7 +10,7 @@ Most protocols are self describing -- every length, offset and type that :mod:`pcapkit` needs to walk a packet is present in the packet itself. A -few are not. :class:`~pcapkit.protocols.internet.esp.ESP` is the +few are not. :class:`~pcapkit.protocols.internet.esp.protocol.ESP` is the motivating example: :rfc:`4303` deliberately leaves the payload length, the position of the ``Pad Length`` / ``Next Header`` trailer and the length of the ``Integrity Check Value`` to be derived from the Security @@ -32,7 +32,7 @@ Decoding an ESP tunnel end to end:: >>> import pcapkit - >>> from pcapkit.protocols.internet.esp import (Cipher, ESPContext, + >>> from pcapkit.protocols.internet.esp.protocol import (Cipher, ESPContext, ... Integrity, SecurityAssociation) >>> sa = SecurityAssociation( ... spi=0x4321, diff --git a/pcapkit/corekit/decorators.py b/pcapkit/corekit/decorators.py index 0f212a25e4..2a7185391e 100644 --- a/pcapkit/corekit/decorators.py +++ b/pcapkit/corekit/decorators.py @@ -41,7 +41,7 @@ from typing_extensions import Concatenate, ParamSpec from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema P = ParamSpec('P') R_seekset = TypeVar('R_seekset') @@ -107,8 +107,8 @@ def beholder( This decorator calls the decorated function. Should any exception be raised, it re-parses the current layer's payload as - :class:`~pcapkit.protocols.misc.raw.Raw` -- or as - :class:`~pcapkit.protocols.misc.no_payload.NoPayload`, if the error is an + :class:`~pcapkit.protocols.misc.raw.protocol.Raw` -- or as + :class:`~pcapkit.protocols.misc.no_payload.protocol.NoPayload`, if the error is an end-of-file :exc:`~pcapkit.utilities.exceptions.StructError` -- whose ``error`` is the exception's message. @@ -196,9 +196,9 @@ def behold(*args: 'P.args', **kwargs: 'P.kwargs') -> 'R_beholder': beholding.reset(token) except Exception as exc: if isinstance(exc, StructError) and exc.eof: # pylint: disable=no-member - from pcapkit.protocols.misc.no_payload import NoPayload as protocol # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.misc.no_payload.protocol import NoPayload as protocol # isort: skip # pylint: disable=import-outside-toplevel else: - from pcapkit.protocols.misc.raw import Raw as protocol # type: ignore[assignment] # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.misc.raw.protocol import Raw as protocol # type: ignore[assignment] # isort: skip # pylint: disable=import-outside-toplevel # error = traceback.format_exc(limit=1).strip().rsplit(os.linesep, maxsplit=1)[-1] # NOTE: Keyed on the class, not on quietness: a quiet end-of-file StructError is still @@ -263,25 +263,25 @@ def prepare(func: 'Callable[Concatenate[Type[R_prepare], bytes | IO[bytes], Opti Important: This decorator function is designed for decorating the - :meth:`Schema.unpack ` + :meth:`Schema.unpack ` *class method*. This decorator will revise the parameter list provided to the original - :meth:`Schema.unpack ` method + :meth:`Schema.unpack ` method and extract necessary information based on the given parameters, then provide the revised version of parameter list to the original method. Note: The decorated function should have the following signature:: - func(cls: 'typing.Type[pcapkit.protocols.schema.schema.Schema]', + func(cls: 'typing.Type[pcapkit.protocols.schema.Schema]', data: 'bytes | typing.IO[bytes]', length: 'Optional[int]', - packet: 'Optional[dict[str, Any]]') -> 'pcapkit.protocols.schema.schema.Schema' + packet: 'Optional[dict[str, Any]]') -> 'pcapkit.protocols.schema.Schema' No further positional or keyword arguments are read from -- or forwarded to -- the decorated function. :func:`prepare` is applied only to - :meth:`Schema.unpack `, + :meth:`Schema.unpack `, whose real signature has exactly these parameters, and nothing calls it with more. Rather than discard extras silently (:issue:`454`), the wrapper raises :exc:`TypeError` for an extra positional argument or @@ -289,7 +289,7 @@ def prepare(func: 'Callable[Concatenate[Type[R_prepare], bytes | IO[bytes], Opti arguments would. See Also: - :meth:`pcapkit.protocols.schema.schema.Schema.unpack` + :meth:`pcapkit.protocols.schema.Schema.unpack` :param func: decorated function :meta decorator: @@ -371,7 +371,7 @@ def unpack(*args: 'P.args', **kwargs: 'P.kwargs') -> 'R_prepare': # the schema's own fields and therefore holding none of the enclosing # layer's, so it overwrites exactly the values ``post_process`` derived # from that context. It would discard, for one, the IPv6 source address - # that ``pcapkit.protocols.schema.internet.hopopt.MPLOption.post_process`` + # that ``pcapkit.protocols.internet.hopopt.schema.MPLOption.post_process`` # has just resolved: ``OptionField.unpack`` measures each parsed option # with ``len(data)``, which triggers the re-pack one option later. # @@ -382,7 +382,7 @@ def unpack(*args: 'P.args', **kwargs: 'P.kwargs') -> 'R_prepare': # Guarded rather than assigned outright because ``post_process`` may hand # back something other than a schema: an implementation is free to return # a nested one instead of ``self``, as - # ``pcapkit.protocols.schema.internet.hopopt._SMFDPDOption`` does, and the + # ``pcapkit.protocols.internet.hopopt.schema._SMFDPDOption`` does, and the # decorator is also applied to stand-ins in the test suite that return # the packet mapping. Only a real schema carries the flag. if hasattr(ret, '__updated__'): diff --git a/pcapkit/corekit/enum.py b/pcapkit/corekit/enum.py index dc1c47ac76..cca290acc8 100644 --- a/pcapkit/corekit/enum.py +++ b/pcapkit/corekit/enum.py @@ -196,7 +196,7 @@ def _validate_value(cls, value: 'Any') -> 'None': ruling that in-library code raises in-library exceptions -- :exc:`~pcapkit.utilities.exceptions.EnumValueError` is the fitting one and is already what the closed enumerations in - :mod:`pcapkit.protocols.internet.mh` raise. Note what that buys on the + :mod:`pcapkit.protocols.internet.mh.protocol` raise. Note what that buys on the :meth:`get` path: :exc:`~pcapkit.utilities.exceptions.EnumValueError` subclasses :exc:`ValueError`, so a rejection here is caught by :meth:`get`'s own ``except ValueError`` and falls back to ``default`` diff --git a/pcapkit/corekit/fields/collections.py b/pcapkit/corekit/fields/collections.py index 5f9fde4e2f..f1de762efc 100644 --- a/pcapkit/corekit/fields/collections.py +++ b/pcapkit/corekit/fields/collections.py @@ -23,7 +23,7 @@ from aenum import IntEnum as AenumEnum from typing_extensions import Self - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema _TL = TypeVar('_TL', 'Schema', 'FieldBase', 'bytes') _TS = TypeVar('_TS', bound='Schema') @@ -36,7 +36,7 @@ class _ShortReadTracker: file: Stream to read from. Only the ``read``, ``seek`` and ``tell`` calls that - :meth:`Schema.unpack ` and + :meth:`Schema.unpack ` and :meth:`OptionField.unpack` make are delegated. """ @@ -86,7 +86,7 @@ class ListField(FieldBase[List[_TL]], Generic[_TL]): A list whose octets hold fewer items than ``count`` ended with the data before the rest, and reports them as :attr:`shortfall`, so that - :meth:`Schema.unpack ` + :meth:`Schema.unpack ` records the cut; the items absent are not made up. .. versionchanged:: 1.6.0 @@ -180,8 +180,7 @@ def pack(self, value: 'Optional[list[_TL]]', packet: 'dict[str, Any]') -> 'bytes if self._item_type is None and isinstance(value, bytes): return value - from pcapkit.protocols.schema.schema import \ - Schema # pylint: disable=import-outside-toplevel + from pcapkit.protocols.schema import Schema # pylint: disable=import-outside-toplevel temp = [] # type: list[bytes] for item in value: @@ -250,7 +249,7 @@ def unpack(self, buffer: 'bytes | IO[bytes]', packet: 'dict[str, Any]') -> 'byte # :exc:`~pcapkit.utilities.exceptions.FieldValueError` from here instead # of :exc:`~pcapkit.utilities.exceptions.ProtocolError` from # :meth:`TCP._read_mode_sack - # `, depending on + # `, depending on # unrelated things that ran earlier in the same process. Cf. #525. # Importing at module level, once, for the life of this module object, # closes that off: ``SchemaField`` then stays whatever class this @@ -374,7 +373,7 @@ class OptionField(ListField, Generic[_TS]): 1. it is the base schema's **first** field, so that it is what sits at the front of the option; 2. it is a :class:`~pcapkit.corekit.fields.numbers.NumberField`, so that - :meth:`Schema.unpack ` + :meth:`Schema.unpack ` reads it through its ordinary per-field branch; 3. its length is a fixed integer rather than a callable, so that its width does not depend on packet data the shortcut has not read. @@ -478,7 +477,7 @@ def unpack(self, buffer: 'bytes | IO[bytes]', packet: 'dict[str, Any]') -> 'list If the option list ended before the specified size limit, :attr:`self.option_padding ` is set to the remaining length, which :meth:`Schema.unpack - ` records in + ` records in ``packet`` as ``__option_padding__`` so that the next fields can be aware of it. @@ -486,7 +485,7 @@ def unpack(self, buffer: 'bytes | IO[bytes]', packet: 'dict[str, Any]') -> 'list ends at the length the enclosing layer declares for it, so that an area the data ends inside runs past that length rather than being cut short by the capture, as - :class:`~pcapkit.protocols.internet.ipv6.IPv6` tells the extension + :class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6` tells the extension headers it walks (:issue:`2694`). Absent, the data may end at a cut. Raises: @@ -511,7 +510,7 @@ def unpack(self, buffer: 'bytes | IO[bytes]', packet: 'dict[str, Any]') -> 'list Where the data ends inside the area, as a capture cut short leaves it, the list ends with the data, and an option it ends inside is kept if its fields fit the area, so :meth:`Schema.unpack - ` records the cut as + ` records the cut as a short read rather than either error being raised (:issue:`2694`). See :meth:`_accepts_cut`, and ``__capture_cut__`` above. @@ -560,7 +559,7 @@ def unpack(self, buffer: 'bytes | IO[bytes]', packet: 'dict[str, Any]') -> 'list # ``examples/captures/profile.pcapng``. # # Reading the type field alone deliberately mirrors what - # :meth:`Schema.unpack ` + # :meth:`Schema.unpack ` # does for one field -- ``field(packet)``, read ``field.length`` octets, # then ``field.unpack(byte, packet.copy())`` -- rather than reaching for # :func:`struct.unpack`. That keeps ``code``'s enumeration type, which both @@ -709,8 +708,8 @@ def _accepts_short_read(self, option: '_TS') -> 'bool': # pylint: disable=unuse (:issue:`1325`): padding cut short may be content the option's own length declares, as a ``PadN`` option's is. A list whose items' lengths leave out their trailing padding may override this, as - :class:`~pcapkit.protocols.schema.transport.sctp.PaddedOptionField` - does; :meth:`Schema.pack ` + :class:`~pcapkit.protocols.transport.sctp.schema.PaddedOptionField` + does; :meth:`Schema.pack ` then writes back only the octets read. """ @@ -725,10 +724,10 @@ def _accepts_cut(self, option: '_TS') -> 'bool': # pylint: disable=unused-argum Returns: :data:`True`, so that :meth:`unpack` keeps the option, as the short - read :meth:`Schema.unpack ` + read :meth:`Schema.unpack ` records (:issue:`2694`). A list that keeps such an area as the octets captured instead may override this, as - :class:`~pcapkit.protocols.schema.misc.pcapng.OptionAreaField` does. + :class:`~pcapkit.protocols.misc.pcapng.schema.OptionAreaField` does. """ return True diff --git a/pcapkit/corekit/fields/field.py b/pcapkit/corekit/fields/field.py index 8b3d91b7a5..7dcb03815f 100644 --- a/pcapkit/corekit/fields/field.py +++ b/pcapkit/corekit/fields/field.py @@ -39,7 +39,7 @@ from typing_extensions import Self from pcapkit.corekit.sentinels import NoValueType - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema _T = TypeVar('_T') @@ -398,7 +398,7 @@ def __set_name__(self, owner: 'Schema', name: 'str') -> 'None': This method is to be called by the metaclass during class creation. It is used to set the field name and update the field list, i.e., - :attr:`Schema.__fields__ ` + :attr:`Schema.__fields__ ` mapping dictionary. """ diff --git a/pcapkit/corekit/fields/misc.py b/pcapkit/corekit/fields/misc.py index abf77be0a7..fe371b9d2b 100644 --- a/pcapkit/corekit/fields/misc.py +++ b/pcapkit/corekit/fields/misc.py @@ -24,7 +24,7 @@ from pcapkit.corekit.sentinels import NoValueType from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema _TC = TypeVar('_TC') _TS = TypeVar('_TS', bound='Schema') @@ -255,7 +255,7 @@ def optional(self) -> 'bool': def protocol(self) -> 'Type[_TP]': """Payload protocol.""" if self._protocol is None: - from pcapkit.protocols.misc.raw import Raw # pylint: disable=import-outside-toplevel # isort:skip + from pcapkit.protocols.misc.raw.protocol import Raw # pylint: disable=import-outside-toplevel # isort:skip return Raw return self._protocol @@ -267,7 +267,7 @@ def protocol(self, protocol: 'Type[_TP] | str') -> 'None': protocol: Payload protocol. A :obj:`str` is resolved against the :data:`pcapkit.protocols.__proto__` registry, case-insensitively, and an unresolved name leaves the payload as - :class:`~pcapkit.protocols.misc.raw.Raw`. + :class:`~pcapkit.protocols.misc.raw.protocol.Raw`. Warns: pcapkit.utilities.warnings.RegistryWarning: If ``protocol`` names a @@ -283,7 +283,7 @@ def protocol(self, protocol: 'Type[_TP] | str') -> 'None': # ``pcapkit.foundation.registry.protocols.protocol.register_protocol`` adds to # it, so a name looked up in any other case would miss every time -- # and a miss leaves ``_protocol`` as :obj:`None`, which the property - # above resolves to :class:`~pcapkit.protocols.misc.raw.Raw`. So + # above resolves to :class:`~pcapkit.protocols.misc.raw.protocol.Raw`. So # ``PayloadField(protocol='http')`` would yield a raw payload instead # of HTTP, with nothing to say so (#787). resolved = __proto__.get(protocol.upper()) @@ -291,7 +291,7 @@ def protocol(self, protocol: 'Type[_TP] | str') -> 'None': # NOTE: Warned rather than left silent, and warned rather than # raised. Unlike the registry lookups that dispatch on a code read # off the wire -- where a miss is ordinary traffic and - # :class:`~pcapkit.protocols.misc.raw.Raw` is the right answer -- + # :class:`~pcapkit.protocols.misc.raw.protocol.Raw` is the right answer -- # this branch is reached only from a caller that named a protocol in # source, so a miss is a mistake in that name rather than a property # of the captured packet, and it is otherwise indistinguishable from @@ -320,7 +320,7 @@ def __init__(self, length: 'int | Callable[[dict[str, Any]], int]' = lambda _: - # getter would hand that same string back, so # ``PayloadField(protocol='http')`` -- or ``protocol='HTTP'`` -- would # yield neither the protocol nor - # :class:`~pcapkit.protocols.misc.raw.Raw` but the string itself (#787). + # :class:`~pcapkit.protocols.misc.raw.protocol.Raw` but the string itself (#787). # The lookup the setter performs stays inside # its ``isinstance(protocol, str)`` branch, so a field declared in a # schema class body -- every in-library use, none of which names a @@ -372,8 +372,7 @@ def pack(self, value: 'Optional[_TP | Schema | bytes]', packet: 'dict[str, Any]' raise NoDefaultValue(f'Field {self.name} has no default value.') value = cast('_TP', self._default) - from pcapkit.protocols.schema.schema import \ - Schema # pylint: disable=import-outside-toplevel + from pcapkit.protocols.schema import Schema # pylint: disable=import-outside-toplevel if isinstance(value, bytes): return value if isinstance(value, Schema): @@ -570,7 +569,7 @@ def nested_packet_context(packet: 'dict[str, Any]') -> 'dict[str, Any]': outer schema specifically rather than whichever schema happens to declare a given field -- see :func:`pcapkit.corekit.schema.byteorder.packet_byteorder` and - :meth:`~pcapkit.protocols.schema.misc.pcapng.BlockType.post_process` + :meth:`~pcapkit.protocols.misc.pcapng.schema.BlockType.post_process` for why that distinction matters; both hand-roll this exact fallback themselves rather than route through this function. @@ -580,7 +579,7 @@ def nested_packet_context(packet: 'dict[str, Any]') -> 'dict[str, Any]': write ever touching the enclosing schema's own data, and without the write silently disappearing either. That matters concretely rather than hypothetically: - :class:`~pcapkit.protocols.schema.internet.mh.CGAExtension` declares + :class:`~pcapkit.protocols.internet.mh.schema.CGAExtension` declares its own ``length`` while the option enclosing it declares ``length`` too, so handing a nested schema the enclosing mapping itself would let the inner ``length`` overwrite the outer one mid-pack. @@ -601,14 +600,14 @@ def nested_packet_context(packet: 'dict[str, Any]') -> 'dict[str, Any]': :class:`~abc.ABCMeta`-based class. That also settles a suspicion, raised on :issue:`439`, that a :class:`~collections.ChainMap` here would corrupt the :class:`~abc.ABCMeta` cache :class:`Schema - ` subclasses shared on CPython + ` subclasses shared on CPython <= 3.10. The suspicion is *probably* wrong, and this code cannot test it: the cache keys on the **exact type queried**, so asking about a :class:`~collections.ChainMap` instance caches lookups for :class:`~collections.ChainMap` and not for :class:`dict`, the poisoning observed in :issue:`439` came from ordinary code asking :func:`isinstance` about a plain :class:`dict`, and :issue:`439` is - fixed directly -- every :class:`~pcapkit.protocols.schema.schema.Schema` subclass gets its own + fixed directly -- every :class:`~pcapkit.protocols.schema.Schema` subclass gets its own ``_abc_impl``. Against that, on CPython 3.10 choosing between a ``ChainMap`` and a plain literal here was observed to flip ``test_pcapng_remaining_constructor_branches_and_custom_dispatch`` @@ -723,12 +722,11 @@ def pack(self, value: 'Optional[_TS | bytes]', packet: 'dict[str, Any]') -> 'byt if isinstance(value, bytes): return value - # NOTE: :meth:`Schema.to_dict ` + # NOTE: :meth:`Schema.to_dict ` # flattens a nested schema into a plain mapping, so a schema rebuilt # through ``from_dict`` hands that mapping back here; turn it into the # declared schema before packing it. - from pcapkit.protocols.schema.schema import \ - Schema # pylint: disable=import-outside-toplevel + from pcapkit.protocols.schema import Schema # pylint: disable=import-outside-toplevel if isinstance(value, Mapping) and not isinstance(value, Schema): value = self._schema.from_dict(value) diff --git a/pcapkit/corekit/fields/numbers.py b/pcapkit/corekit/fields/numbers.py index 70ae767304..e7c554ed94 100644 --- a/pcapkit/corekit/fields/numbers.py +++ b/pcapkit/corekit/fields/numbers.py @@ -720,7 +720,7 @@ def post_process(self, value: 'int | bytes', packet: 'dict[str, Any]') -> 'Stdli It would also make the "unknown" reader the formats require unreachable for any genuinely unassigned code -- PCAP-NG's - :class:`~pcapkit.protocols.schema.misc.pcapng.UnknownBlock`, and the + :class:`~pcapkit.protocols.misc.pcapng.schema.UnknownBlock`, and the ``unassigned`` option readers of IPv4, TCP, HOPOPT, MH and HIP -- because the lookup would fail before the dispatch that selects it. PCAP-NG repeats a block's total length at both ends precisely so @@ -854,7 +854,7 @@ def _unregistered_member(namespace: 'Type[StdlibEnum] | Type[AenumEnum]', Note: Building a member this way, rather than as some other type altogether, is why :meth:`PortEnumField.post_process` and - :meth:`OptionEnumField.post_process ` + :meth:`OptionEnumField.post_process ` need this rather than :meth:`_pseudo_member`: the result answers ``isinstance(result, AppType)`` truthfully, which :meth:`PortEnumField.pre_process` tests before reading diff --git a/pcapkit/corekit/infoclass.py b/pcapkit/corekit/infoclass.py index 8d1dda7f39..5ba6c930aa 100644 --- a/pcapkit/corekit/infoclass.py +++ b/pcapkit/corekit/infoclass.py @@ -695,7 +695,7 @@ def from_dict(cls, dict_: 'Optional[Mapping[str, VT] | Iterable[tuple[str, VT]]] :class:`~pcapkit.corekit.multidict.OrderedMultiDict` value is stored as a :class:`MultiInfo` or :class:`OrderedMultiInfo` respectively, or as the subclass of either that the key's annotation names, such as - :class:`~pcapkit.protocols.data.application.httpv2.Settings`. + :class:`~pcapkit.protocols.application.httpv2.data.Settings`. The rebuild is as unchecked as the rest of this method: a mapping whose keys are not the nested class's own is accepted and becomes an instance @@ -1211,7 +1211,7 @@ def _as_info_type(hint: 'Any') -> 'Optional[Type[Info]]': value it describes is a container, and :meth:`Info.from_dict` has nothing to rebuild it from. A :class:`MultiInfo` or :class:`OrderedMultiInfo` subclass is an :class:`Info` subclass too, so that :meth:`Info.from_dict` - restores e.g. :class:`~pcapkit.protocols.data.application.httpv2.Settings` + restores e.g. :class:`~pcapkit.protocols.application.httpv2.data.Settings` from the :class:`~pcapkit.corekit.multidict.OrderedMultiDict` that :meth:`Info.to_dict` writes it as. @@ -1305,7 +1305,7 @@ def _nested_types(cls: 'Type[Info]') -> 'dict[str, Type[Info]]': :meth:`Info.from_dict` call stays one-way for the life of the process. That is accepted rather than fixed: :meth:`Info.from_dict` runs per parsed packet (see :meth:`IPv4.read - `, which builds its ToS + `, which builds its ToS field with it), and re-resolving the annotations on every call to catch a case that does not arise in this package costs far more than it saves. diff --git a/pcapkit/corekit/module.py b/pcapkit/corekit/module.py index 65e276c33e..c0ca7d2644 100644 --- a/pcapkit/corekit/module.py +++ b/pcapkit/corekit/module.py @@ -64,7 +64,7 @@ def klass(self) -> 'Type[_T]': ` deliberately writes no resolved class back, so every next layer lookup resolves its descriptor again -- the one registered for the - code, or the fallback for :class:`~pcapkit.protocols.misc.raw.Raw` + code, or the fallback for :class:`~pcapkit.protocols.misc.raw.protocol.Raw` when nobody registered it. An extraction of :file:`many_interfaces.pcapng` performs 296 resolutions, 48 of them fallbacks (:issue:`1559`). diff --git a/pcapkit/corekit/schema/__init__.py b/pcapkit/corekit/schema/__init__.py index c7abaa1047..4104b97208 100644 --- a/pcapkit/corekit/schema/__init__.py +++ b/pcapkit/corekit/schema/__init__.py @@ -8,7 +8,7 @@ the functions the field classes, the header schemas, the protocols and the capture engines all call, one module per group. It is not the header schema framework, which is :mod:`pcapkit.protocols.schema` and its -:class:`~pcapkit.protocols.schema.schema.Schema`; see :ref:`utilities-or-corekit`. +:class:`~pcapkit.protocols.schema.Schema`; see :ref:`utilities-or-corekit`. The package exports nothing itself, so that the field modules importing a helper from it load no other group: import each helper from its own module. diff --git a/pcapkit/corekit/schema/byteorder.py b/pcapkit/corekit/schema/byteorder.py index f88b41f14f..1bd54a832d 100644 --- a/pcapkit/corekit/schema/byteorder.py +++ b/pcapkit/corekit/schema/byteorder.py @@ -7,10 +7,10 @@ :mod:`pcapkit.corekit.schema.byteorder` reads the byte order a capture file or section declares out of the packet data: :func:`byteorder_callback` sets it on a :class:`~pcapkit.corekit.fields.numbers.NumberField` for the record header of a -classic PCAP file (:mod:`~pcapkit.protocols.schema.misc.pcap.frame`) and the -blocks of a PCAP-NG file (:mod:`~pcapkit.protocols.schema.misc.pcapng`), and +classic PCAP file (:mod:`~pcapkit.protocols.misc.pcap.frame.schema`) and the +blocks of a PCAP-NG file (:mod:`~pcapkit.protocols.misc.pcapng.schema`), and :func:`packet_byteorder` is what the callback and the PCAP-NG makers -(:mod:`pcapkit.protocols.misc.pcapng`) read it with. It is one of the +(:mod:`pcapkit.protocols.misc.pcapng.protocol`) read it with. It is one of the :mod:`pcapkit.corekit.schema` helpers shared across the schema layer, not part of the header schema framework in :mod:`pcapkit.protocols.schema`; see :ref:`utilities-or-corekit`. @@ -70,11 +70,11 @@ def byteorder_callback(field: 'NumberField', packet: 'dict[str, Any]') -> 'None' Notes: ``byteorder`` is the key a caller has to seed, and :func:`packet_byteorder` is what reads it. - :meth:`Frame.pack ` and - :meth:`Frame.unpack ` + :meth:`Frame.pack ` and + :meth:`Frame.unpack ` both write it from the global header's magic number. A PCAP-NG Section Header Block writes it from its own Byte-Order Magic (see - :func:`~pcapkit.protocols.schema.misc.pcapng.shb_byteorder_callback`), + :func:`~pcapkit.protocols.misc.pcapng.schema.shb_byteorder_callback`), and the blocks, options and records of that section read it, nested or not. The fallback to :data:`sys.byteorder` is for a schema packed or unpacked on its own, with no header to ask. That also means a diff --git a/pcapkit/corekit/schema/ipaddress.py b/pcapkit/corekit/schema/ipaddress.py index a29c606c19..9dd1af2676 100644 --- a/pcapkit/corekit/schema/ipaddress.py +++ b/pcapkit/corekit/schema/ipaddress.py @@ -96,7 +96,7 @@ def _reject_bool(value: 'object', description: str) -> 'None': :class:`~ipaddress.IPv4Address`'s version mismatches -- and that asymmetry is exactly what let this slip past :issue:`469`'s otherwise equivalent guard for :meth:`MH._make_opt_mn_id - ` (cf. + ` (cf. :issue:`491`). Every caller checks this *before* dispatching on the value's type, @@ -160,7 +160,7 @@ def parse_ip_address(value: 'IPv4Address | IPv6Address | bytes | int | str', Routing every one of them through here rather than giving each its own :func:`isinstance` check is the whole point: :meth:`MH._make_opt_mn_id - ` carries exactly + ` carries exactly such a check (:issue:`469`), and :issue:`491` is the same defect at every site that lacks one. A guard that has to be remembered per call site is a guard that will be forgotten at the next one. @@ -173,9 +173,9 @@ def parse_ip_address(value: 'IPv4Address | IPv6Address | bytes | int | str', :exc:`~pcapkit.utilities.exceptions.ProtocolError`, which is deliberate even though sibling guards for the same mistake -- :meth:`MH._make_opt_mn_id - ` from :issue:`469` + ` from :issue:`469` and :class:`ESP's SecurityAssociation - ` from :issue:`491` + ` from :issue:`491` -- raise the latter. The layer decides: this is a field-level conversion, so it answers with what :meth:`_IPAddressField.pre_process ` diff --git a/pcapkit/corekit/schema/shortread.py b/pcapkit/corekit/schema/shortread.py index 4bbe542e07..fbe5ffb750 100644 --- a/pcapkit/corekit/schema/shortread.py +++ b/pcapkit/corekit/schema/shortread.py @@ -28,7 +28,7 @@ from typing import Any, Optional, TypeVar from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema _PB = TypeVar('_PB', bound=ProtocolBase) @@ -42,15 +42,15 @@ def keep_short_read(protocol: 'ProtocolBase') -> 'None': protocol: Protocol instance, just parsed. Called by the layer base classes, and by the PCAP global - :class:`~pcapkit.protocols.misc.pcap.header.Header`, once a parse is done. + :class:`~pcapkit.protocols.misc.pcap.header.protocol.Header`, once a parse is done. When the data ended inside one of the header's fields, ``info`` gains the ``__short_read__`` - record :meth:`Schema.unpack ` + record :meth:`Schema.unpack ` made, so that :meth:`Protocol.from_data ` hands it to the rebuild, whose :meth:`Protocol.pack ` cuts the header back to what was captured before it is read (:issue:`1458`, :issue:`2703`). The key is listed - in :attr:`Data.__included__ `, + in :attr:`Data.__included__ `, so :meth:`Info.to_dict ` carries it and ``from_data(info.to_dict())`` cuts its rebuild back too; it is absent for a header that was captured whole. @@ -59,11 +59,11 @@ def keep_short_read(protocol: 'ProtocolBase') -> 'None': :data:`~pcapkit.utilities.contextvars.frame_length` gives its lengths, a layer whose message runs to the end of the frame records the cut too, on the field it runs to the end in, through :meth:`Schema._note_short_read - `, so its rebuild + `, so its rebuild reads as cut, as the layer did inside the frame (:issue:`2711`). A layer whose own header declares where its message ends records none, whether the cut falls at that end or past it; see :meth:`Schema._frame_end_field - `. + `. """ header = cast('Optional[Schema]', getattr(protocol, '__header__', None)) @@ -91,14 +91,14 @@ def replay_short_read(protocol: '_PB', data: 'Any') -> '_PB': ``protocol`` itself. The layer base classes and the PCAP global - :class:`~pcapkit.protocols.misc.pcap.header.Header` call it on what + :class:`~pcapkit.protocols.misc.pcap.header.protocol.Header` call it on what :meth:`Protocol.from_data ` returns, which is cut back before it gets here: ``from_data`` hands the construction the ``__short_read__`` record that :func:`keep_short_read` left in ``data``, :meth:`Protocol.pack ` cuts the header it makes back to the octets captured through :meth:`Schema._cut_short_read - `, and + `, and :meth:`Protocol.__post_init__ ` has :meth:`~pcapkit.protocols.protocol.Protocol.read` parse those octets at the diff --git a/pcapkit/dumpkit/common.py b/pcapkit/dumpkit/common.py index bda2c704a9..a514cace20 100644 --- a/pcapkit/dumpkit/common.py +++ b/pcapkit/dumpkit/common.py @@ -32,7 +32,7 @@ from pcapkit.corekit.multidict import MultiDict, OrderedMultiDict from pcapkit.corekit.sentinels import NoValueType, NullType from pcapkit.protocols.protocol import ProtocolBase -from pcapkit.protocols.schema.schema import Schema +from pcapkit.protocols.schema import Schema from pcapkit.utilities import config from pcapkit.utilities.exceptions import UnsupportedCall from pcapkit.utilities.logging import get_logger @@ -143,7 +143,7 @@ def __init_subclass__(cls, /, fmt: 'Optional[str]' = None, ``fmt`` is given. This is what lets a subclass decline registration rather than having to inherit :class:`DumperBase` to avoid it, and it matches :meth:`EnumSchema.__init_subclass__ - `, which + `, which guards on its own ``code`` keyword the same way. Note: diff --git a/pcapkit/dumpkit/pcap.py b/pcapkit/dumpkit/pcap.py index 40f9c70d39..1c4fba5b5c 100644 --- a/pcapkit/dumpkit/pcap.py +++ b/pcapkit/dumpkit/pcap.py @@ -16,9 +16,9 @@ from pcapkit.const.reg.linktype import LinkType as Enum_LinkType from pcapkit.dumpkit.common import DumperBase -from pcapkit.protocols.data.misc.pcap.header import Header as Data_Header -from pcapkit.protocols.misc.pcap.header import Header -from pcapkit.protocols.schema.misc.pcap.header import RESOLUTION +from pcapkit.protocols.misc.pcap.header.data import Header as Data_Header +from pcapkit.protocols.misc.pcap.header.protocol import Header +from pcapkit.protocols.misc.pcap.header.schema import RESOLUTION if TYPE_CHECKING: from enum import IntEnum as StdlibIntEnum @@ -28,8 +28,8 @@ from typing_extensions import Literal from pcapkit.corekit.version import VersionInfo - from pcapkit.protocols.data.misc.pcap.frame import Frame as Data_Frame - from pcapkit.protocols.data.misc.pcap.frame import FrameInfo as Data_FrameInfo + from pcapkit.protocols.misc.pcap.frame.data import Frame as Data_Frame + from pcapkit.protocols.misc.pcap.frame.data import FrameInfo as Data_FrameInfo __all__ = [ 'PCAPIO', @@ -196,7 +196,7 @@ def _dump_header(self, *, protocol: 'Enum_LinkType | StdlibIntEnum | AenumIntEnu #: struct.Struct: Packer for the record header preceding each frame, in the #: byte order of the global header just written. Taken from #: :attr:`self._ghdr <_ghdr>` rather than from the ``byteorder`` argument - #: because :class:`~pcapkit.protocols.misc.pcap.header.Header` is what + #: because :class:`~pcapkit.protocols.misc.pcap.header.protocol.Header` is what #: validates and normalises it. self._rechdr = _RECORD_HEADER[self._ghdr.magic_number.byteorder] @@ -221,7 +221,7 @@ def _append_value(self, value: 'Data_Frame', file: 'IO[bytes]', name: 'str') -> :meth:`self._make_timestamp <_make_timestamp>`), and the octets are exactly ``value.packet``. So this writes them directly, rather than handing them to - :class:`~pcapkit.protocols.misc.pcap.frame.Frame`, whose constructor + :class:`~pcapkit.protocols.misc.pcap.frame.protocol.Frame`, whose constructor packs the record and then **dissects it again** through the whole protocol stack to arrive at bytes it was given. That round trip measured about 82% of the cost of a flow-traced extraction -- ``http.pcap``, @@ -286,7 +286,7 @@ def _make_timestamp(self, frame_info: 'Data_FrameInfo', ``time_epoch`` at this file's -- microseconds times 1000, or nanoseconds divided by 1000 and **truncated** rather than rounded. That is how :func:`~pcapkit.toolkit.pcapng.block2frame` and - :meth:`Frame.make ` + :meth:`Frame.make ` reduce a timestamp to a fraction, and how libpcap scales a nanosecond file down (``sf-pcap.c``). It also keeps the second: 999,999,999 ns truncates to 999,999 us, where rounding would reach diff --git a/pcapkit/foundation/analysis/dtls.py b/pcapkit/foundation/analysis/dtls.py index ccbc7f1c11..1669347daf 100644 --- a/pcapkit/foundation/analysis/dtls.py +++ b/pcapkit/foundation/analysis/dtls.py @@ -9,20 +9,20 @@ DTLS handshake message that :class:`~pcapkit.foundation.reassembly.dtls.DTLS` reassembled (:rfc:`6347#section-4.2.3`). The decode itself is :meth:`DTLS.analyze_handshake -` (:issue:`2622`). +` (:issue:`2622`). .. versionadded:: 1.6.0 """ from typing import TYPE_CHECKING, cast -from pcapkit.protocols.application.dtls import DTLS +from pcapkit.protocols.application.dtls.protocol import DTLS if TYPE_CHECKING: from typing import Optional from pcapkit.foundation.reassembly.data.dtls import Datagram as DTLS_Datagram - from pcapkit.protocols.data.application.dtls import DTLSHandshake as Data_DTLSHandshake + from pcapkit.protocols.application.dtls.data import DTLSHandshake as Data_DTLSHandshake __all__ = ['dtls_handshake'] @@ -32,7 +32,7 @@ def dtls_handshake(datagram: 'DTLS_Datagram') -> 'Optional[Data_DTLSHandshake]': :class:`~pcapkit.foundation.reassembly.dtls.DTLS`. The message is decoded by :meth:`DTLS.analyze_handshake - `, which reads + `, which reads it as if it had arrived unfragmented, ``fragment_offset`` 0 and ``fragment_length`` its ``length`` (:rfc:`6347#section-4.2.3`). So a ``ClientHello``, ``ServerHello`` or ``EncryptedExtensions`` body decodes diff --git a/pcapkit/foundation/analysis/ip.py b/pcapkit/foundation/analysis/ip.py index a9beeee6cd..6593e849ea 100644 --- a/pcapkit/foundation/analysis/ip.py +++ b/pcapkit/foundation/analysis/ip.py @@ -16,15 +16,15 @@ from ipaddress import IPv6Address from typing import TYPE_CHECKING -from pcapkit.protocols.internet.ipv4 import IPv4 -from pcapkit.protocols.internet.ipv6 import IPv6 +from pcapkit.protocols.internet.ipv4.protocol import IPv4 +from pcapkit.protocols.internet.ipv6.protocol import IPv6 if TYPE_CHECKING: from typing import Optional, Type from pcapkit.const.reg.transtype import TransType from pcapkit.foundation.reassembly.data.ip import Datagram as IP_Datagram - from pcapkit.protocols.internet.ip import IP as IP_Protocol + from pcapkit.protocols.internet.ip.protocol import IP as IP_Protocol from pcapkit.protocols.protocol import ProtocolBase __all__ = ['ip_datagram'] @@ -39,8 +39,8 @@ def ip_datagram(datagram: 'IP_Datagram') -> 'Optional[ProtocolBase]': **Protocol** field for IPv4, the Fragment header's **Next Header** for IPv6 -- by :meth:`Protocol.analyze ` of - :class:`~pcapkit.protocols.internet.ipv4.IPv4` or - :class:`~pcapkit.protocols.internet.ipv6.IPv6`, whichever the datagram's + :class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4` or + :class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6`, whichever the datagram's addresses belong to. Args: diff --git a/pcapkit/foundation/analysis/tcp.py b/pcapkit/foundation/analysis/tcp.py index 679a9f8fd2..16932ff518 100644 --- a/pcapkit/foundation/analysis/tcp.py +++ b/pcapkit/foundation/analysis/tcp.py @@ -15,7 +15,7 @@ from typing import TYPE_CHECKING from pcapkit.const.reg.apptype import TransportProtocol as Enum_TransportProtocol -from pcapkit.protocols.transport.tcp import TCP +from pcapkit.protocols.transport.tcp.protocol import TCP if TYPE_CHECKING: from typing import Optional, Type @@ -34,7 +34,7 @@ def tcp_datagram(datagram: 'TCP_Datagram') -> 'Optional[ProtocolBase]': A reassembled datagram carries no protocol number, so its payload is dispatched on its ``(source, destination)`` ports by :meth:`Transport.analyze ` - of :class:`~pcapkit.protocols.transport.tcp.TCP`. Each port is resolved to + of :class:`~pcapkit.protocols.transport.tcp.protocol.TCP`. Each port is resolved to its :class:`~pcapkit.const.reg.apptype.tcp.TCP` member by :meth:`Transport._make_port `, as diff --git a/pcapkit/foundation/engines/dpkt.py b/pcapkit/foundation/engines/dpkt.py index e9483077c2..7547171d0d 100644 --- a/pcapkit/foundation/engines/dpkt.py +++ b/pcapkit/foundation/engines/dpkt.py @@ -17,8 +17,8 @@ from pcapkit.const.reg.linktype import LinkType as Enum_LinkType from pcapkit.foundation.engines.engine import EngineBase from pcapkit.foundation.reassembly import ReassemblyManager -from pcapkit.protocols.schema.misc.pcap.header import RESOLUTION -from pcapkit.protocols.schema.misc.pcapng import (BYTE_ORDER_MAGIC, DEFAULT_RESOLUTION, +from pcapkit.protocols.misc.pcap.header.schema import RESOLUTION +from pcapkit.protocols.misc.pcapng.schema import (BYTE_ORDER_MAGIC, DEFAULT_RESOLUTION, GENERIC_BLOCK_MINIMUM) from pcapkit.utilities.compat import localcontext from pcapkit.utilities.exceptions import FormatError, stacklevel @@ -39,12 +39,12 @@ from pcapkit.foundation.engines.pcapng import Context from pcapkit.foundation.extraction import Extractor - from pcapkit.protocols.data.misc.pcapng import IF_TSOffsetOption as Data_IF_TSOffsetOption - from pcapkit.protocols.data.misc.pcapng import IF_TSResolOption as Data_IF_TSResolOption - from pcapkit.protocols.data.misc.pcapng import \ + from pcapkit.protocols.misc.pcapng.data import IF_TSOffsetOption as Data_IF_TSOffsetOption + from pcapkit.protocols.misc.pcapng.data import IF_TSResolOption as Data_IF_TSResolOption + from pcapkit.protocols.misc.pcapng.data import \ InterfaceDescriptionBlock as Data_InterfaceDescriptionBlock - from pcapkit.protocols.data.misc.pcapng import SectionHeaderBlock as Data_SectionHeaderBlock - from pcapkit.protocols.data.misc.pcapng import SimplePacketBlock as Data_SimplePacketBlock + from pcapkit.protocols.misc.pcapng.data import SectionHeaderBlock as Data_SectionHeaderBlock + from pcapkit.protocols.misc.pcapng.data import SimplePacketBlock as Data_SimplePacketBlock Reader = Union[PCAPReader, 'PCAPNGReader'] @@ -107,7 +107,7 @@ def loopback(self) -> '_DPKTLoopbackModule': ... #: either byte order, spelled once rather than per block read. _SHB_TYPE_OCTETS = Enum_BlockType.Section_Header_Block.to_bytes(4, 'big') -#: :data:`~pcapkit.protocols.schema.misc.pcapng.BYTE_ORDER_MAGIC` as a +#: :data:`~pcapkit.protocols.misc.pcapng.schema.BYTE_ORDER_MAGIC` as a #: little-endian section writes it, spelled once rather than per block read. _LITTLE_BYTE_ORDER_OCTETS = BYTE_ORDER_MAGIC.to_bytes(4, 'little') @@ -119,7 +119,7 @@ class PCAPNGReader: Block (IDB) of a file, and applies its link type and timestamp resolution to every packet (:issue:`1379`). This reader walks the blocks itself instead: it parses each Section Header Block and IDB with :mod:`pcapkit`'s - own :class:`~pcapkit.protocols.misc.pcapng.PCAPNG`, keeps the interfaces + own :class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG`, keeps the interfaces of the current section, and resolves every packet's link type, ``if_tsresol`` and ``if_tsoffset`` from the interface it names. Packet blocks are still decoded by `DPKT`_. @@ -127,7 +127,7 @@ class PCAPNGReader: It yields Enhanced Packet Blocks, (obsolete) Packet Blocks and Simple Packet Blocks, and skips every other block. ``dpkt.pcapng.Reader`` skips the Simple Packet Block too, and `DPKT`_ has no type for one, so that block is - parsed with :class:`~pcapkit.protocols.misc.pcapng.PCAPNG` as well + parsed with :class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG` as well (:issue:`1520`). Args: @@ -160,7 +160,7 @@ def __next__(self) -> 'tuple[float, bytes]': def _read(self) -> 'Iterator[tuple[float, bytes]]': """Read blocks until the next packet block, and yield its timestamp and data.""" from pcapkit.foundation.engines.pcapng import Context - from pcapkit.protocols.misc.pcapng import PCAPNG as P_PCAPNG + from pcapkit.protocols.misc.pcapng.protocol import PCAPNG as P_PCAPNG while True: head = self._file.read(8) @@ -242,7 +242,7 @@ def _read_packet(self, buf: 'bytes', block_type: 'int', offset = 0 if tsoffset is None else tsoffset.offset # same arithmetic as :meth:`PCAPNG._read_timestamp - # ` + # ` ticks = (pkt.ts_high << 32) | pkt.ts_low with localcontext(prec=64): timestamp = decimal.Decimal(ticks) / resolution + offset @@ -255,7 +255,7 @@ def _read_simple(self, buf: 'bytes') -> 'tuple[float, bytes]': """Decode a Simple Packet Block, against the section's first interface. `DPKT`_ has no type for this block, so it is parsed by - :class:`~pcapkit.protocols.misc.pcapng.PCAPNG`: the packet data is + :class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG`: the packet data is ``min(original_len, snaplen)`` octets, with the snaplen of interface 0. Args: @@ -272,7 +272,7 @@ def _read_simple(self, buf: 'bytes') -> 'tuple[float, bytes]': PCAP-NG specification). """ - from pcapkit.protocols.misc.pcapng import PCAPNG as P_PCAPNG + from pcapkit.protocols.misc.pcapng.protocol import PCAPNG as P_PCAPNG from pcapkit.toolkit.dpkt import Timestamp # isort:skip if not self._ctx.interfaces: @@ -371,7 +371,7 @@ def _loopback_protocol(base: 'Type[DPKTPacket]', ip: 'Type[DPKTPacket]', ip6: 'T """A :class:`dpkt.loopback.Loopback` that reads the address family by link type. It reads the address family in the byte order - :func:`~pcapkit.protocols.link.loopback.family_byteorder` gives for + :func:`~pcapkit.protocols.link.loopback.protocol.family_byteorder` gives for ``linktype`` -- network byte order for ``LINKTYPE_LOOP``, inferred for ``LINKTYPE_NULL`` -- and dispatches on families 2 (IPv4) and 24, 28 and 30 (IPv6). Unlike `DPKT`_'s own, it names an IPv4 or IPv6 payload ``ip`` or @@ -394,7 +394,7 @@ def _loopback_protocol(base: 'Type[DPKTPacket]', ip: 'Type[DPKTPacket]', ip6: 'T """ import dpkt # isort:skip - from pcapkit.protocols.link.loopback import family_byteorder # isort:skip + from pcapkit.protocols.link.loopback.protocol import family_byteorder # isort:skip layers = {2: ip, 24: ip6, 28: ip6, 30: ip6} diff --git a/pcapkit/foundation/engines/engine.py b/pcapkit/foundation/engines/engine.py index b495250c3d..cbe002235f 100644 --- a/pcapkit/foundation/engines/engine.py +++ b/pcapkit/foundation/engines/engine.py @@ -58,7 +58,7 @@ def registry(cls) -> 'dict[str, ModuleDescriptor[EngineBase] | Type[EngineBase]] Note: Unlike :attr:`EnumSchema.registry - `, this is not + `, this is not a per-class mapping: every engine registration lands in the single :attr:`Extractor.__engine__ ` table, so @@ -279,7 +279,7 @@ def __init_subclass__(cls, /, engine: 'Optional[str]' = None, *args: 'Any', **kw ``engine`` is given. This is what lets a subclass decline registration rather than having to inherit :class:`EngineBase` to avoid it, and it matches :meth:`EnumSchema.__init_subclass__ - `, which + `, which guards on its own ``code`` keyword the same way. Note: diff --git a/pcapkit/foundation/engines/pcap.py b/pcapkit/foundation/engines/pcap.py index 67a18735da..55f38992df 100644 --- a/pcapkit/foundation/engines/pcap.py +++ b/pcapkit/foundation/engines/pcap.py @@ -14,10 +14,10 @@ from pcapkit.corekit.io import SeekableReader from pcapkit.foundation.engines.engine import EngineBase -from pcapkit.protocols.misc.pcap.frame import Frame -from pcapkit.protocols.misc.pcap.header import Header -from pcapkit.protocols.schema.misc.pcap.frame import RECORD_HEADER_LEN -from pcapkit.protocols.schema.misc.pcap.header import MAGIC_NUMBER as Schema_MAGIC_NUMBER +from pcapkit.protocols.misc.pcap.frame.protocol import Frame +from pcapkit.protocols.misc.pcap.frame.schema import RECORD_HEADER_LEN +from pcapkit.protocols.misc.pcap.header.protocol import Header +from pcapkit.protocols.misc.pcap.header.schema import MAGIC_NUMBER as Schema_MAGIC_NUMBER from pcapkit.utilities.logging import get_logger __all__ = ['PCAP'] @@ -50,7 +50,7 @@ class PCAP(EngineBase[Frame]): _nnsec: 'bool' #: The PCAP magic numbers this engine claims, read from their one home, - #: :data:`pcapkit.protocols.schema.misc.pcap.header.MAGIC_NUMBER` + #: :data:`pcapkit.protocols.misc.pcap.header.schema.MAGIC_NUMBER` #: (:issue:`1739`). MAGIC_NUMBER = tuple(Schema_MAGIC_NUMBER) diff --git a/pcapkit/foundation/engines/pcap_ct.py b/pcapkit/foundation/engines/pcap_ct.py index f72f7d796c..a318201d44 100644 --- a/pcapkit/foundation/engines/pcap_ct.py +++ b/pcapkit/foundation/engines/pcap_ct.py @@ -37,7 +37,7 @@ def pcap(self) -> 'Type[Handle]': ... #: A `pcap-ct`_ "frame" -- the ``(timestamp, bytes)`` pair that #: ``pcap.pcap`` iteration yields. Deliberately *not* named ``Frame``, #: so that it is not mistaken for - #: :class:`pcapkit.protocols.misc.pcap.frame.Frame`, which is what the + #: :class:`pcapkit.protocols.misc.pcap.frame.protocol.Frame`, which is what the #: built-in engines return. RawFrame = Tuple[float, bytes] diff --git a/pcapkit/foundation/engines/pcapng.py b/pcapkit/foundation/engines/pcapng.py index 921b25995d..d9a918cbb5 100644 --- a/pcapkit/foundation/engines/pcapng.py +++ b/pcapkit/foundation/engines/pcapng.py @@ -19,8 +19,8 @@ from pcapkit.corekit.schema.padding import pad_length from pcapkit.dumpkit.pcap import PCAPIO from pcapkit.foundation.engines.engine import EngineBase -from pcapkit.protocols.misc.pcapng import PCAPNG as P_PCAPNG -from pcapkit.protocols.schema.misc.pcapng import (BLOCK_MINIMUM, BYTE_ORDER_MAGIC, +from pcapkit.protocols.misc.pcapng.protocol import PCAPNG as P_PCAPNG +from pcapkit.protocols.misc.pcapng.schema import (BLOCK_MINIMUM, BYTE_ORDER_MAGIC, GENERIC_BLOCK_MINIMUM) from pcapkit.utilities.exceptions import FormatError, stacklevel from pcapkit.utilities.logging import get_logger @@ -36,19 +36,19 @@ from typing import Literal, Optional from pcapkit.foundation.extraction import Extractor - from pcapkit.protocols.data.misc.pcapng import PCAPNG as Data_PCAPNG - from pcapkit.protocols.data.misc.pcapng import CustomBlock as Data_CustomBlock - from pcapkit.protocols.data.misc.pcapng import \ + from pcapkit.protocols.misc.pcapng.data import PCAPNG as Data_PCAPNG + from pcapkit.protocols.misc.pcapng.data import CustomBlock as Data_CustomBlock + from pcapkit.protocols.misc.pcapng.data import \ DecryptionSecretsBlock as Data_DecryptionSecretsBlock - from pcapkit.protocols.data.misc.pcapng import \ + from pcapkit.protocols.misc.pcapng.data import \ InterfaceDescriptionBlock as Data_InterfaceDescriptionBlock - from pcapkit.protocols.data.misc.pcapng import \ + from pcapkit.protocols.misc.pcapng.data import \ InterfaceStatisticsBlock as Data_InterfaceStatisticsBlock - from pcapkit.protocols.data.misc.pcapng import NameResolutionBlock as Data_NameResolutionBlock - from pcapkit.protocols.data.misc.pcapng import SectionHeaderBlock as Data_SectionHeaderBlock - from pcapkit.protocols.data.misc.pcapng import \ + from pcapkit.protocols.misc.pcapng.data import NameResolutionBlock as Data_NameResolutionBlock + from pcapkit.protocols.misc.pcapng.data import SectionHeaderBlock as Data_SectionHeaderBlock + from pcapkit.protocols.misc.pcapng.data import \ SystemdJournalExportBlock as Data_SystemdJournalExportBlock - from pcapkit.protocols.data.misc.pcapng import UnknownBlock as Data_UnknownBlock + from pcapkit.protocols.misc.pcapng.data import UnknownBlock as Data_UnknownBlock @info_final @@ -118,7 +118,7 @@ class PCAPNG(EngineBase[P_PCAPNG]): #: A Section Header Block's Byte-Order Magic, as the octets read, mapped to #: the byte order it declares for its section; built from the one home of - #: the value, :data:`pcapkit.protocols.schema.misc.pcapng.BYTE_ORDER_MAGIC` + #: the value, :data:`pcapkit.protocols.misc.pcapng.schema.BYTE_ORDER_MAGIC` #: (:issue:`1739`). _BYTE_ORDER_OCTETS = { BYTE_ORDER_MAGIC.to_bytes(4, 'big'): 'big', @@ -143,7 +143,7 @@ class PCAPNG(EngineBase[P_PCAPNG]): __engine_name__ = 'PCAP-NG' #: Engine module name. - __engine_module__ = 'pcapkit.protocols.misc.pcapng' + __engine_module__ = 'pcapkit.protocols.misc.pcapng.protocol' ########################################################################## # Data models. diff --git a/pcapkit/foundation/engines/pypcap.py b/pcapkit/foundation/engines/pypcap.py index e71216233f..200b855179 100644 --- a/pcapkit/foundation/engines/pypcap.py +++ b/pcapkit/foundation/engines/pypcap.py @@ -42,7 +42,7 @@ def pcap(self) -> 'Type[Handle]': ... #: A PyPCAP "frame" -- the ``(timestamp, bytes)`` pair that ``pcap.pcap`` #: iteration yields. Deliberately *not* named ``Frame``, so that it is not - #: mistaken for :class:`pcapkit.protocols.misc.pcap.frame.Frame`, which is + #: mistaken for :class:`pcapkit.protocols.misc.pcap.frame.protocol.Frame`, which is #: what the built-in engines return. RawFrame = Tuple[float, bytes] diff --git a/pcapkit/foundation/engines/pypcapfile.py b/pcapkit/foundation/engines/pypcapfile.py index c84063dc51..4d4ee66405 100644 --- a/pcapkit/foundation/engines/pypcapfile.py +++ b/pcapkit/foundation/engines/pypcapfile.py @@ -18,7 +18,7 @@ from pcapkit.corekit.io import NamedStream from pcapkit.foundation.engines.engine import EngineBase from pcapkit.foundation.reassembly import ReassemblyManager -from pcapkit.protocols.schema.misc.pcap.frame import RECORD_HEADER_LEN +from pcapkit.protocols.misc.pcap.frame.schema import RECORD_HEADER_LEN from pcapkit.utilities.exceptions import FormatError, stacklevel from pcapkit.utilities.warnings import AttributeWarning, ProtocolWarning, warn diff --git a/pcapkit/foundation/engines/scapy.py b/pcapkit/foundation/engines/scapy.py index e71fbd18d3..cf32213c03 100644 --- a/pcapkit/foundation/engines/scapy.py +++ b/pcapkit/foundation/engines/scapy.py @@ -41,9 +41,9 @@ from pcapkit.corekit.schema.padding import pad_length from pcapkit.foundation.engines.engine import EngineBase from pcapkit.foundation.reassembly import ReassemblyManager -from pcapkit.protocols.schema.misc.pcap.frame import RECORD_HEADER_LEN -from pcapkit.protocols.schema.misc.pcap.header import RESOLUTION -from pcapkit.protocols.schema.misc.pcapng import DEFAULT_RESOLUTION +from pcapkit.protocols.misc.pcap.frame.schema import RECORD_HEADER_LEN +from pcapkit.protocols.misc.pcap.header.schema import RESOLUTION +from pcapkit.protocols.misc.pcapng.schema import DEFAULT_RESOLUTION from pcapkit.utilities.exceptions import VersionError, stacklevel from pcapkit.utilities.logging import get_logger from pcapkit.utilities.warnings import AttributeWarning, warn diff --git a/pcapkit/foundation/extraction.py b/pcapkit/foundation/extraction.py index 25048a7382..05a495dea6 100644 --- a/pcapkit/foundation/extraction.py +++ b/pcapkit/foundation/extraction.py @@ -64,8 +64,8 @@ from pcapkit.foundation.reassembly.ipv6 import IPv6 as IPv6_Reassembly from pcapkit.foundation.reassembly.tcp import TCP as TCP_Reassembly from pcapkit.foundation.traceflow.tcp import TCP as TCP_TraceFlow - from pcapkit.protocols.misc.pcap.frame import Frame - from pcapkit.protocols.misc.pcapng import PCAPNG + from pcapkit.protocols.misc.pcap.frame.protocol import Frame + from pcapkit.protocols.misc.pcapng.protocol import PCAPNG from pcapkit.protocols.protocol import ProtocolBase #: Every key registered in :attr:`Extractor.__output__` and in diff --git a/pcapkit/foundation/reassembly/data/data.py b/pcapkit/foundation/reassembly/data/data.py index 7a65ae74f6..ff4cc04da6 100644 --- a/pcapkit/foundation/reassembly/data/data.py +++ b/pcapkit/foundation/reassembly/data/data.py @@ -19,7 +19,7 @@ from pcapkit.foundation.reassembly.data.dtls import Datagram as DTLS_Datagram from pcapkit.foundation.reassembly.data.ip import Datagram as IP_Datagram from pcapkit.foundation.reassembly.data.tcp import Datagram as TCP_Datagram - from pcapkit.protocols.data.application.dtls import DTLSHandshake + from pcapkit.protocols.application.dtls.data import DTLSHandshake from pcapkit.protocols.protocol import ProtocolBase # registry key an analyser dispatches a reassembled payload on; see ``Deferred`` @@ -50,7 +50,7 @@ class Completion(EnumLookup, StrEnum): instead. It derives from :mod:`pcapkit.utilities.compat`'s ``StrEnum``, as - :class:`~pcapkit.protocols.application.httpv1.Type` does, which buys what a + :class:`~pcapkit.protocols.application.httpv1.protocol.Type` does, which buys what a plain :class:`enum.Enum` does not: the value survives :func:`json.dumps` -- a plain enumeration raises :exc:`TypeError` there, and :meth:`Datagram.to_dict ` hands this @@ -179,7 +179,7 @@ class Deferred(ReduceAsProtocol2, Generic[_KT]): header as if unfragmented (:rfc:`6347#section-4.2.3`), to the decoder :func:`~pcapkit.foundation.analysis.dtls.dtls_handshake` runs, :meth:`DTLS.analyze_handshake - `, which reads + `, which reads the body by its :class:`~pcapkit.const.tls.handshake_type.HandshakeType`. Those are the cases the type parameter is constrained to. IP's and TCP's are @@ -191,7 +191,7 @@ class Deferred(ReduceAsProtocol2, Generic[_KT]): :meth:`TCP._make_ports ` really answers with -- so what the deferred analysis dispatches on is of a piece with what the eager path dispatches on at - :attr:`TCP.src `, whichever + :attr:`TCP.src `, whichever reassembler built it. (Of a piece, not identical: for an *unassigned* port the two paths build equal members by different routes, which ``TCP.submit``'s own docstring records.) @@ -228,7 +228,7 @@ class Deferred(ReduceAsProtocol2, Generic[_KT]): .. versionchanged:: 1.6.0 Also constrained to the DTLS handshake header, and the analyser may - return a :class:`~pcapkit.protocols.data.application.dtls.DTLSHandshake` + return a :class:`~pcapkit.protocols.application.dtls.data.DTLSHandshake` (:issue:`2531`). IP's and TCP's analyser is the parse their :mod:`pcapkit.foundation.analysis` module runs, bound to the reassembly's protocol, rather than that protocol's bound ``analyze`` diff --git a/pcapkit/foundation/reassembly/data/dtls.py b/pcapkit/foundation/reassembly/data/dtls.py index 8f75f6ff80..5eb3db3f6d 100644 --- a/pcapkit/foundation/reassembly/data/dtls.py +++ b/pcapkit/foundation/reassembly/data/dtls.py @@ -20,7 +20,7 @@ from pcapkit.const.tls.handshake_type import HandshakeType as Enum_HandshakeType from pcapkit.foundation.reassembly.data.data import Completion - from pcapkit.protocols.data.application.dtls import DTLSHandshake as Data_DTLSHandshake + from pcapkit.protocols.application.dtls.data import DTLSHandshake as Data_DTLSHandshake _AT = TypeVar('_AT', 'IPv4Address', 'IPv6Address') diff --git a/pcapkit/foundation/reassembly/dtls.py b/pcapkit/foundation/reassembly/dtls.py index 3ae362f84c..0510f4d397 100644 --- a/pcapkit/foundation/reassembly/dtls.py +++ b/pcapkit/foundation/reassembly/dtls.py @@ -20,7 +20,7 @@ from pcapkit.foundation.reassembly.data.dtls import (_AT, Buffer, BufferID, Datagram, DatagramID, Fragment, HoleDescriptor, Packet) from pcapkit.foundation.reassembly.reassembly import ReassemblyBase -from pcapkit.protocols.application.dtls import DTLS as DTLS_Protocol +from pcapkit.protocols.application.dtls.protocol import DTLS as DTLS_Protocol if TYPE_CHECKING: from typing import Optional, Type @@ -53,7 +53,7 @@ class DTLS(ReassemblyBase[Packet[_AT], Datagram[_AT], BufferID, Buffer], Generic decodes what it reassembles. A complete message's :attr:`~pcapkit.foundation.reassembly.data.dtls.Datagram.packet` holds the same decode, run on first read. Both call the protocol's - :meth:`~pcapkit.protocols.application.dtls.DTLS.analyze_handshake`; the + :meth:`~pcapkit.protocols.application.dtls.protocol.DTLS.analyze_handshake`; the ``packet`` calls that of :attr:`__protocol_type__` (:issue:`2622`). Example: @@ -78,7 +78,7 @@ class DTLS(ReassemblyBase[Packet[_AT], Datagram[_AT], BufferID, Buffer], Generic #: Protocol of current reassembly object. An extension point -- a protocol #: named here need only define ``analyze_handshake``, with the signature of #: :meth:`DTLS.analyze_handshake - #: `, and is read + #: `, and is read #: for it when a message completes, so one without it raises #: :exc:`AttributeError` there. __protocol_type__ = DTLS_Protocol diff --git a/pcapkit/foundation/reassembly/ip.py b/pcapkit/foundation/reassembly/ip.py index e89d992df5..6886424a8f 100644 --- a/pcapkit/foundation/reassembly/ip.py +++ b/pcapkit/foundation/reassembly/ip.py @@ -24,14 +24,14 @@ from pcapkit.foundation.reassembly.data.ip import (_AT, Buffer, BufferID, Datagram, DatagramID, Deferred, Packet) from pcapkit.foundation.reassembly.reassembly import ReassemblyBase -from pcapkit.protocols.schema.internet.ipv6 import IP_MAX_LENGTH +from pcapkit.protocols.internet.ipv6.schema import IP_MAX_LENGTH from pcapkit.utilities.logging import get_logger if TYPE_CHECKING: from typing import Optional, Type from pcapkit.const.reg.transtype import TransType - from pcapkit.protocols.internet.ip import IP as IP_Protocol + from pcapkit.protocols.internet.ip.protocol import IP as IP_Protocol __all__ = ['IP'] @@ -363,7 +363,7 @@ def _is_complete(self, buf: 'Buffer[_AT]') -> 'bool': received. A datagram is no longer than - :data:`~pcapkit.protocols.schema.internet.ipv6.IP_MAX_LENGTH` with its header, as + :data:`~pcapkit.protocols.internet.ipv6.schema.IP_MAX_LENGTH` with its header, as :meth:`_header_overhead` counts it: IPv4's Total Length counts the whole header, and IPv6's Payload Length every header but the fixed one. A longer datagram cannot be declared, so it is never complete, and diff --git a/pcapkit/foundation/reassembly/ipv4.py b/pcapkit/foundation/reassembly/ipv4.py index 9161baae88..8a6386bdff 100644 --- a/pcapkit/foundation/reassembly/ipv4.py +++ b/pcapkit/foundation/reassembly/ipv4.py @@ -11,7 +11,7 @@ """ from pcapkit.foundation.reassembly.ip import IP -from pcapkit.protocols.internet.ipv4 import IPv4 as IPv4_Protocol +from pcapkit.protocols.internet.ipv4.protocol import IPv4 as IPv4_Protocol __all__ = ['IPv4'] diff --git a/pcapkit/foundation/reassembly/ipv6.py b/pcapkit/foundation/reassembly/ipv6.py index fc281e2cc6..a86ec86319 100644 --- a/pcapkit/foundation/reassembly/ipv6.py +++ b/pcapkit/foundation/reassembly/ipv6.py @@ -14,8 +14,8 @@ from pcapkit.const.reg.transtype import TransType as Enum_TransType from pcapkit.foundation.reassembly.ip import IP -from pcapkit.protocols.internet.ipv6 import IPV6_HEADER_LEN, IPV6_NEXT_HEADER_OFFSET -from pcapkit.protocols.internet.ipv6 import IPv6 as IPv6_Protocol +from pcapkit.protocols.internet.ipv6.protocol import IPV6_HEADER_LEN, IPV6_NEXT_HEADER_OFFSET +from pcapkit.protocols.internet.ipv6.protocol import IPv6 as IPv6_Protocol if TYPE_CHECKING: from pcapkit.const.reg.transtype import TransType diff --git a/pcapkit/foundation/reassembly/reassembly.py b/pcapkit/foundation/reassembly/reassembly.py index 68557bffa1..5d44e240e7 100644 --- a/pcapkit/foundation/reassembly/reassembly.py +++ b/pcapkit/foundation/reassembly/reassembly.py @@ -16,7 +16,7 @@ from typing import TYPE_CHECKING, Generic, Type, TypeVar, cast from pcapkit.protocols import __proto__ as protocol_registry -from pcapkit.protocols.misc.raw import Raw +from pcapkit.protocols.misc.raw.protocol import Raw from pcapkit.utilities.exceptions import FieldValueError, UnsupportedCall from pcapkit.utilities.logging import get_logger from pcapkit.utilities.pickle import ReduceAsProtocol2 @@ -87,7 +87,7 @@ def registry(cls) -> 'dict[str, ModuleDescriptor[ReassemblyBase] | Type[Reassemb Note: Unlike :attr:`EnumSchema.registry - `, this is not + `, this is not a per-class mapping: every reassembly registration lands in the single :attr:`Extractor.__reassembly__ ` table, so @@ -582,7 +582,7 @@ def __init_subclass__(cls, /, protocol: 'Optional[str]' = None, *args: 'Any', ** ``protocol`` is given. This is what lets a subclass decline registration rather than having to inherit :class:`ReassemblyBase` to avoid it, and it matches :meth:`EnumSchema.__init_subclass__ - `, which + `, which guards on its own ``code`` keyword the same way. Note: diff --git a/pcapkit/foundation/reassembly/tcp.py b/pcapkit/foundation/reassembly/tcp.py index d4096b4bbf..bee2db299d 100644 --- a/pcapkit/foundation/reassembly/tcp.py +++ b/pcapkit/foundation/reassembly/tcp.py @@ -19,7 +19,7 @@ from pcapkit.foundation.reassembly.data.tcp import (HOLE_OPEN_BOUND, Buffer, BufferID, Datagram, DatagramID, Fragment, HoleDescriptor, Packet) from pcapkit.foundation.reassembly.reassembly import ReassemblyBase -from pcapkit.protocols.transport.tcp import TCP as TCP_Protocol +from pcapkit.protocols.transport.tcp.protocol import TCP as TCP_Protocol from pcapkit.utilities import config if TYPE_CHECKING: @@ -683,8 +683,8 @@ def _make_ports(bufid: 'BufferID') -> 'tuple[AppType_TCP, AppType_TCP]': :meth:`Transport.analyze ` keeps the base in its own signature, since it is the one method - :class:`~pcapkit.protocols.transport.udp.UDP` and - :class:`~pcapkit.protocols.transport.sctp.SCTP` share, and each of + :class:`~pcapkit.protocols.transport.udp.protocol.UDP` and + :class:`~pcapkit.protocols.transport.sctp.protocol.SCTP` share, and each of them would name a different registry. Important: @@ -710,7 +710,7 @@ def _make_ports(bufid: 'BufferID') -> 'tuple[AppType_TCP, AppType_TCP]': Note: The resolution is reached through - :class:`~pcapkit.protocols.transport.tcp.TCP` rather than through + :class:`~pcapkit.protocols.transport.tcp.protocol.TCP` rather than through :attr:`self.protocol `, which is what :meth:`submit` reads the analyser itself off. That is @@ -728,7 +728,7 @@ def _make_ports(bufid: 'BufferID') -> 'tuple[AppType_TCP, AppType_TCP]': """ # NOTE: ``_make_port`` is protected, and reached from outside its own # class as :meth:`SCTP._decode_next_layer - # ` reaches + # ` reaches # ``ProtocolBase._decode_next_layer``. Duplicating it here instead would # put a second port normaliser beside the maker path's, free to drift # from it; it is idempotent, so a ``bufid`` that already holds a member @@ -765,12 +765,12 @@ def submit(self, buf: 'Buffer', *, bufid: 'BufferID', # type: ignore[override] `, so it is the one the maker path uses and cannot drift from it. See :meth:`_make_ports` for why it is reached through - :class:`~pcapkit.protocols.transport.tcp.TCP` rather than through + :class:`~pcapkit.protocols.transport.tcp.protocol.TCP` rather than through :attr:`self.protocol `. For a *registered* port that is the very member - :attr:`TCP.src ` reads off + :attr:`TCP.src ` reads off a parsed header. For an unassigned one the two are **equal but not identical**, and not even equally named: the parse path builds its member through :meth:`EnumField._unregistered_member diff --git a/pcapkit/foundation/registry/protocols/application.py b/pcapkit/foundation/registry/protocols/application.py index 9ac779fe32..64e81bb0ae 100644 --- a/pcapkit/foundation/registry/protocols/application.py +++ b/pcapkit/foundation/registry/protocols/application.py @@ -19,19 +19,21 @@ from pcapkit.const.http.frame import Frame as HTTP_Frame from pcapkit.const.tls.extension_type import ExtensionType as TLS_ExtensionType from pcapkit.foundation.registry.protocols.protocol import _check_code -from pcapkit.protocols.application.httpv2 import HTTPv2 -from pcapkit.protocols.application.ssl import SSL -from pcapkit.protocols.schema.application.httpv2 import FrameType as Schema_HTTP_FrameType +from pcapkit.protocols.application.httpv2.protocol import HTTPv2 +from pcapkit.protocols.application.httpv2.schema import FrameType as Schema_HTTP_FrameType +from pcapkit.protocols.application.ssl.protocol import SSL from pcapkit.utilities.exceptions import RegistryError from pcapkit.utilities.logging import get_logger if TYPE_CHECKING: from typing import Optional, Type - from pcapkit.protocols.application.httpv2 import FrameConstructor as HTTP_FrameConstructor - from pcapkit.protocols.application.httpv2 import FrameParser as HTTP_FrameParser - from pcapkit.protocols.application.ssl import ExtensionConstructor as TLS_ExtensionConstructor - from pcapkit.protocols.application.ssl import ExtensionParser as TLS_ExtensionParser + from pcapkit.protocols.application.httpv2.protocol import \ + FrameConstructor as HTTP_FrameConstructor + from pcapkit.protocols.application.httpv2.protocol import FrameParser as HTTP_FrameParser + from pcapkit.protocols.application.ssl.protocol import \ + ExtensionConstructor as TLS_ExtensionConstructor + from pcapkit.protocols.application.ssl.protocol import ExtensionParser as TLS_ExtensionParser __all__ = [ 'register_http_frame', @@ -48,23 +50,23 @@ ############################################################################### -# NOTE: pcapkit.protocols.application.httpv2.HTTPv2.__frame__ +# NOTE: pcapkit.protocols.application.httpv2.protocol.HTTPv2.__frame__ def register_http_frame(code: 'HTTP_Frame', meth: 'str | tuple[HTTP_FrameParser, HTTP_FrameConstructor]', *, schema: 'Optional[Type[Schema_HTTP_FrameType]]' = None) -> 'None': """Register a frame parser. The function will register the given frame parser to the - :data:`pcapkit.protocols.application.httpv2.HTTPv2.__frame__` registry. + :data:`pcapkit.protocols.application.httpv2.protocol.HTTPv2.__frame__` registry. Args: - code: :class:`HTTP/2 ` frame type + code: :class:`HTTP/2 ` frame type code as in :class:`~pcapkit.const.http.frame.Frame`. meth: Method name, or a ``(parser, constructor)`` pair of callables, to parse and construct the frame. A name names the ``_read_http_*`` and ``_make_http_*`` methods, and has to name an existing ``_read_http_*`` one. - schema: :class:`~pcapkit.protocols.schema.schema.Schema` class for the frame. - It should be a subclass of :class:`pcapkit.protocols.schema.application.httpv2.FrameType`. + schema: :class:`~pcapkit.protocols.schema.Schema` class for the frame. + It should be a subclass of :class:`pcapkit.protocols.application.httpv2.schema.FrameType`. Raises: RegistryError: If ``code`` is not a :class:`~pcapkit.const.http.frame.Frame` @@ -82,15 +84,15 @@ def register_http_frame(code: 'HTTP_Frame', meth: 'str | tuple[HTTP_FrameParser, logger.debug('registered HTTP/2 frame parser: %s', code.name) -# NOTE: pcapkit.protocols.application.ssl.SSL.__extension__ +# NOTE: pcapkit.protocols.application.ssl.protocol.SSL.__extension__ def register_tls_extension(code: 'TLS_ExtensionType', meth: 'str | tuple[TLS_ExtensionParser, TLS_ExtensionConstructor]') -> 'None': """Register an extension parser. The function will register the given extension parser to the - :data:`pcapkit.protocols.application.ssl.SSL.__extension__` registry, which - :class:`~pcapkit.protocols.application.tls.TLS` and - :class:`~pcapkit.protocols.application.dtls.DTLS` share. + :data:`pcapkit.protocols.application.ssl.protocol.SSL.__extension__` registry, which + :class:`~pcapkit.protocols.application.tls.protocol.TLS` and + :class:`~pcapkit.protocols.application.dtls.protocol.DTLS` share. Args: code: TLS/DTLS extension type as in diff --git a/pcapkit/foundation/registry/protocols/internet.py b/pcapkit/foundation/registry/protocols/internet.py index 8628ca3ad5..4df37c6fa4 100644 --- a/pcapkit/foundation/registry/protocols/internet.py +++ b/pcapkit/foundation/registry/protocols/internet.py @@ -30,25 +30,25 @@ from pcapkit.corekit.module import ModuleDescriptor from pcapkit.corekit.sentinels import NULL from pcapkit.foundation.registry.protocols.protocol import _check_code, _register_name -from pcapkit.protocols.internet.hip import HIP -from pcapkit.protocols.internet.hopopt import HOPOPT -from pcapkit.protocols.internet.icmpv4 import ICMPv4 -from pcapkit.protocols.internet.icmpv6 import ICMPv6 +from pcapkit.protocols.internet.hip.protocol import HIP +from pcapkit.protocols.internet.hip.schema import Parameter as Schema_HIP_Parameter +from pcapkit.protocols.internet.hopopt.protocol import HOPOPT +from pcapkit.protocols.internet.hopopt.schema import Option as Schema_HOPOPT_Option +from pcapkit.protocols.internet.icmpv4.protocol import ICMPv4 +from pcapkit.protocols.internet.icmpv6.protocol import ICMPv6 from pcapkit.protocols.internet.internet import Internet -from pcapkit.protocols.internet.ipv4 import IPv4 -from pcapkit.protocols.internet.ipv6_opts import IPv6_Opts -from pcapkit.protocols.internet.ipv6_route import IPv6_Route -from pcapkit.protocols.internet.ipx import IPX -from pcapkit.protocols.internet.mh import MH -from pcapkit.protocols.schema.internet.hip import Parameter as Schema_HIP_Parameter -from pcapkit.protocols.schema.internet.hopopt import Option as Schema_HOPOPT_Option -from pcapkit.protocols.schema.internet.ipv4 import Option as Schema_IPv4_Option -from pcapkit.protocols.schema.internet.ipv6_opts import Option as Schema_IPv6_Opts_Option -from pcapkit.protocols.schema.internet.ipv6_route import \ +from pcapkit.protocols.internet.ipv4.protocol import IPv4 +from pcapkit.protocols.internet.ipv4.schema import Option as Schema_IPv4_Option +from pcapkit.protocols.internet.ipv6_opts.protocol import IPv6_Opts +from pcapkit.protocols.internet.ipv6_opts.schema import Option as Schema_IPv6_Opts_Option +from pcapkit.protocols.internet.ipv6_route.protocol import IPv6_Route +from pcapkit.protocols.internet.ipv6_route.schema import \ RoutingType as Schema_IPv6_Route_RoutingType -from pcapkit.protocols.schema.internet.mh import CGAExtension as Schema_MH_CGAExtension -from pcapkit.protocols.schema.internet.mh import Option as Schema_MH_Option -from pcapkit.protocols.schema.internet.mh import Packet as Schema_MH_Packet +from pcapkit.protocols.internet.ipx.protocol import IPX +from pcapkit.protocols.internet.mh.protocol import MH +from pcapkit.protocols.internet.mh.schema import CGAExtension as Schema_MH_CGAExtension +from pcapkit.protocols.internet.mh.schema import Option as Schema_MH_Option +from pcapkit.protocols.internet.mh.schema import Packet as Schema_MH_Packet from pcapkit.utilities.exceptions import RegistryError from pcapkit.utilities.logging import get_logger @@ -57,23 +57,27 @@ from pcapkit.const.reg.transtype import TransType from pcapkit.corekit.sentinels import NullType - from pcapkit.protocols.internet.hip import ParameterConstructor as HIP_ParameterConstructor - from pcapkit.protocols.internet.hip import ParameterParser as HIP_ParameterParser - from pcapkit.protocols.internet.hopopt import OptionConstructor as HOPOPT_OptionConstructor - from pcapkit.protocols.internet.hopopt import OptionParser as HOPOPT_OptionParser - from pcapkit.protocols.internet.ipv4 import OptionConstructor as IPv4_OptionConstructor - from pcapkit.protocols.internet.ipv4 import OptionParser as IPv4_OptionParser - from pcapkit.protocols.internet.ipv6_opts import \ + from pcapkit.protocols.internet.hip.protocol import \ + ParameterConstructor as HIP_ParameterConstructor + from pcapkit.protocols.internet.hip.protocol import ParameterParser as HIP_ParameterParser + from pcapkit.protocols.internet.hopopt.protocol import \ + OptionConstructor as HOPOPT_OptionConstructor + from pcapkit.protocols.internet.hopopt.protocol import OptionParser as HOPOPT_OptionParser + from pcapkit.protocols.internet.ipv4.protocol import OptionConstructor as IPv4_OptionConstructor + from pcapkit.protocols.internet.ipv4.protocol import OptionParser as IPv4_OptionParser + from pcapkit.protocols.internet.ipv6_opts.protocol import \ OptionConstructor as IPv6_Opts_OptionConstructor - from pcapkit.protocols.internet.ipv6_opts import OptionParser as IPv6_Opts_OptionParser - from pcapkit.protocols.internet.ipv6_route import TypeConstructor as IPv6_Route_TypeConstructor - from pcapkit.protocols.internet.ipv6_route import TypeParser as IPv6_Route_TypeParser - from pcapkit.protocols.internet.mh import ExtensionConstructor as MH_ExtensionConstructor - from pcapkit.protocols.internet.mh import ExtensionParser as MH_ExtensionParser - from pcapkit.protocols.internet.mh import OptionConstructor as MH_OptionConstructor - from pcapkit.protocols.internet.mh import OptionParser as MH_OptionParser - from pcapkit.protocols.internet.mh import PacketConstructor as MH_PacketConstructor - from pcapkit.protocols.internet.mh import PacketParser as MH_PacketParser + from pcapkit.protocols.internet.ipv6_opts.protocol import OptionParser as IPv6_Opts_OptionParser + from pcapkit.protocols.internet.ipv6_route.protocol import \ + TypeConstructor as IPv6_Route_TypeConstructor + from pcapkit.protocols.internet.ipv6_route.protocol import TypeParser as IPv6_Route_TypeParser + from pcapkit.protocols.internet.mh.protocol import \ + ExtensionConstructor as MH_ExtensionConstructor + from pcapkit.protocols.internet.mh.protocol import ExtensionParser as MH_ExtensionParser + from pcapkit.protocols.internet.mh.protocol import OptionConstructor as MH_OptionConstructor + from pcapkit.protocols.internet.mh.protocol import OptionParser as MH_OptionParser + from pcapkit.protocols.internet.mh.protocol import PacketConstructor as MH_PacketConstructor + from pcapkit.protocols.internet.mh.protocol import PacketParser as MH_PacketParser from pcapkit.protocols.protocol import ProtocolBase __all__ = [ @@ -145,7 +149,7 @@ def register_ipx(code: 'int | IPX_Packet', module: 'ModuleDescriptor[ProtocolBas def register_ipx(code: 'int | IPX_Packet', module: 'str', class_: 'str') -> 'None': ... -# NOTE: pcapkit.protocols.internet.ipx.IPX.__proto__ +# NOTE: pcapkit.protocols.internet.ipx.protocol.IPX.__proto__ def register_ipx(code: 'int | IPX_Packet', module: 'str | ModuleDescriptor[ProtocolBase] | Type[ProtocolBase]', class_: 'str | NullType' = NULL) -> 'None': r"""Register a new protocol class. @@ -155,7 +159,7 @@ def register_ipx(code: 'int | IPX_Packet', module: 'str | ModuleDescriptor[Proto should be ``{module}.{class_}``. The function will register the given protocol class to the - :data:`pcapkit.protocols.internet.ipx.IPX.__proto__` registry. + :data:`pcapkit.protocols.internet.ipx.protocol.IPX.__proto__` registry. Arguments: code: IPX Packet Type, as in :class:`~pcapkit.const.ipx.packet.Packet` @@ -165,7 +169,7 @@ def register_ipx(code: 'int | IPX_Packet', module: 'str | ModuleDescriptor[Proto Important: Unlike :func:`register_transtype`, ``code`` is an IPX Packet Type, **not** - an IP protocol number: :class:`~pcapkit.protocols.internet.ipx.IPX` + an IP protocol number: :class:`~pcapkit.protocols.internet.ipx.protocol.IPX` keeps a registry of its own (:issue:`2169`). Raises: @@ -191,23 +195,23 @@ def register_ipx(code: 'int | IPX_Packet', module: 'str | ModuleDescriptor[Proto _register_name(module, (IPX, code)) -# NOTE: pcapkit.protocols.internet.ipv4.IPv4.__option__ +# NOTE: pcapkit.protocols.internet.ipv4.protocol.IPv4.__option__ def register_ipv4_option(code: 'IPv4_OptionNumber', meth: 'str | tuple[IPv4_OptionParser, IPv4_OptionConstructor]', *, schema: 'Optional[Type[Schema_IPv4_Option]]' = None) -> 'None': """Register an option parser. The function will register the given option parser to the - :data:`pcapkit.protocols.internet.ipv4.IPv4.__option__` registry. + :data:`pcapkit.protocols.internet.ipv4.protocol.IPv4.__option__` registry. Args: - code: :class:`IPv4 ` option code as + code: :class:`IPv4 ` option code as in :class:`~pcapkit.const.ipv4.option_number.OptionNumber`. meth: Method name, or a ``(parser, constructor)`` pair of callables, to parse and construct the option. A name names the ``_read_opt_*`` and ``_make_opt_*`` methods, and has to name an existing ``_read_opt_*`` one. - schema: :class:`~pcapkit.protocols.schema.schema.Schema` class for the option. - It should be a subclass of :class:`pcapkit.protocols.schema.internet.ipv4.Option`. + schema: :class:`~pcapkit.protocols.schema.Schema` class for the option. + It should be a subclass of :class:`pcapkit.protocols.internet.ipv4.schema.Option`. Raises: RegistryError: If ``code`` is not a :class:`~pcapkit.const.ipv4.option_number.OptionNumber` @@ -225,15 +229,15 @@ def register_ipv4_option(code: 'IPv4_OptionNumber', meth: 'str | tuple[IPv4_Opti logger.debug('registered IPv4 option parser: %s', code.name) -# NOTE: pcapkit.protocols.internet.icmpv4.ICMPv4.__type__, pcapkit.protocols.internet.icmpv6.ICMPv6.__type__ +# NOTE: pcapkit.protocols.internet.icmpv4.protocol.ICMPv4.__type__, pcapkit.protocols.internet.icmpv6.protocol.ICMPv6.__type__ def register_icmp_type(code: 'ICMPv4_Type | ICMPv6_Type', meth: 'str | tuple[Callable[..., Any], Callable[..., Any]]') -> 'None': """Register a message body parser. The function will register the given message body parser to the - :data:`~pcapkit.protocols.internet.icmpv4.ICMPv4.__type__` registry when + :data:`~pcapkit.protocols.internet.icmpv4.protocol.ICMPv4.__type__` registry when ``code`` is an ICMPv4 type, or to - :data:`~pcapkit.protocols.internet.icmpv6.ICMPv6.__type__` when it is an + :data:`~pcapkit.protocols.internet.icmpv6.protocol.ICMPv6.__type__` when it is an ICMPv6 type. Each registry is written by that class's own :meth:`register_type` classmethod. @@ -259,23 +263,23 @@ def register_icmp_type(code: 'ICMPv4_Type | ICMPv6_Type', logger.debug('registered ICMP type parser: %s', code.name) -# NOTE: pcapkit.protocols.internet.hip.HIP.__parameter__ +# NOTE: pcapkit.protocols.internet.hip.protocol.HIP.__parameter__ def register_hip_parameter(code: 'HIP_Parameter', meth: 'str | tuple[HIP_ParameterParser, HIP_ParameterConstructor]', *, schema: 'Optional[Type[Schema_HIP_Parameter]]' = None) -> 'None': """Register a parameter parser. The function will register the given parameter parser to the - :data:`pcapkit.protocols.internet.hip.HIP.__parameter__` registry. + :data:`pcapkit.protocols.internet.hip.protocol.HIP.__parameter__` registry. Args: - code: :class:`~pcapkit.protocols.internet.hip.HIP` parameter code as + code: :class:`~pcapkit.protocols.internet.hip.protocol.HIP` parameter code as in :class:`~pcapkit.const.hip.parameter.Parameter`. meth: Method name, or a ``(parser, constructor)`` pair of callables, to parse and construct the parameter. A name names the ``_read_param_*`` and ``_make_param_*`` methods, and has to name an existing ``_read_param_*`` one. - schema: :class:`~pcapkit.protocols.schema.schema.Schema` class for the parameter. - It should be a subclass of :class:`pcapkit.protocols.schema.internet.hip.Parameter`. + schema: :class:`~pcapkit.protocols.schema.Schema` class for the parameter. + It should be a subclass of :class:`pcapkit.protocols.internet.hip.schema.Parameter`. Raises: RegistryError: If ``code`` is not a :class:`~pcapkit.const.hip.parameter.Parameter` @@ -293,23 +297,23 @@ def register_hip_parameter(code: 'HIP_Parameter', meth: 'str | tuple[HIP_Paramet logger.debug('registered HIP parameter parser: %s', code.name) -# NOTE: pcapkit.protocols.internet.hopopt.HOPOPT.__option__ +# NOTE: pcapkit.protocols.internet.hopopt.protocol.HOPOPT.__option__ def register_hopopt_option(code: 'IPv6_Option', meth: 'str | tuple[HOPOPT_OptionParser, HOPOPT_OptionConstructor]', *, schema: 'Optional[Type[Schema_HOPOPT_Option]]' = None) -> 'None': """Register an option parser. The function will register the given option parser to the - :data:`pcapkit.protocols.internet.hopopt.HOPOPT.__option__` registry. + :data:`pcapkit.protocols.internet.hopopt.protocol.HOPOPT.__option__` registry. Args: - code: :class:`~pcapkit.protocols.internet.hopopt.HOPOPT` option code as + code: :class:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT` option code as in :class:`~pcapkit.const.ipv6.option.Option`. meth: Method name, or a ``(parser, constructor)`` pair of callables, to parse and construct the option. A name names the ``_read_opt_*`` and ``_make_opt_*`` methods, and has to name an existing ``_read_opt_*`` one. - schema: :class:`~pcapkit.protocols.schema.schema.Schema` class for the option. - It should be a subclass of :class:`pcapkit.protocols.schema.internet.hopopt.Option`. + schema: :class:`~pcapkit.protocols.schema.Schema` class for the option. + It should be a subclass of :class:`pcapkit.protocols.internet.hopopt.schema.Option`. Raises: RegistryError: If ``code`` is not a :class:`~pcapkit.const.ipv6.option.Option` @@ -327,23 +331,23 @@ def register_hopopt_option(code: 'IPv6_Option', meth: 'str | tuple[HOPOPT_Option logger.debug('registered HOPOPT option parser: %s', code.name) -# NOTE: pcapkit.protocols.internet.ipv6_opts.IPv6_Opts.__option__ +# NOTE: pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts.__option__ def register_ipv6_opts_option(code: 'IPv6_Option', meth: 'str | tuple[IPv6_Opts_OptionParser, IPv6_Opts_OptionConstructor]', *, schema: 'Optional[Type[Schema_IPv6_Opts_Option]]' = None) -> 'None': """Register an option parser. The function will register the given option parser to the - :data:`pcapkit.protocols.internet.ipv6_opts.IPv6_Opts.__option__` registry. + :data:`pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts.__option__` registry. Args: - code: :class:`IPv6-Opts ` + code: :class:`IPv6-Opts ` option code as in :class:`~pcapkit.const.ipv6.option.Option`. meth: Method name, or a ``(parser, constructor)`` pair of callables, to parse and construct the option. A name names the ``_read_opt_*`` and ``_make_opt_*`` methods, and has to name an existing ``_read_opt_*`` one. - schema: :class:`~pcapkit.protocols.schema.schema.Schema` class for the option. - It should be a subclass of :class:`pcapkit.protocols.schema.internet.ipv6_opts.Option`. + schema: :class:`~pcapkit.protocols.schema.Schema` class for the option. + It should be a subclass of :class:`pcapkit.protocols.internet.ipv6_opts.schema.Option`. Raises: RegistryError: If ``code`` is not a :class:`~pcapkit.const.ipv6.option.Option` @@ -361,23 +365,23 @@ def register_ipv6_opts_option(code: 'IPv6_Option', meth: 'str | tuple[IPv6_Opts_ logger.debug('registered IPv6-Opts option parser: %s', code.name) -# NOTE: pcapkit.protocols.internet.ipv6_route.IPv6_Route.__routing__ +# NOTE: pcapkit.protocols.internet.ipv6_route.protocol.IPv6_Route.__routing__ def register_ipv6_route_routing(code: 'IPv6_Routing', meth: 'str | tuple[IPv6_Route_TypeParser, IPv6_Route_TypeConstructor]', *, schema: 'Optional[Type[Schema_IPv6_Route_RoutingType]]' = None) -> 'None': """Register a routing data parser. The function will register the given routing data parser to the - :data:`pcapkit.protocols.internet.ipv6_route.IPv6_Route.__routing__` registry. + :data:`pcapkit.protocols.internet.ipv6_route.protocol.IPv6_Route.__routing__` registry. Args: - code: :class:`IPv6-Route ` + code: :class:`IPv6-Route ` data type code as in :class:`~pcapkit.const.ipv6.routing.Routing`. meth: Method name, or a ``(parser, constructor)`` pair of callables, to parse and construct the data. A name names the ``_read_data_type_*`` and ``_make_data_type_*`` methods, and has to name an existing ``_read_data_type_*`` one. - schema: :class:`~pcapkit.protocols.schema.schema.Schema` class for the routing data. - It should be a subclass of :class:`pcapkit.protocols.schema.internet.ipv6_route.RoutingType`. + schema: :class:`~pcapkit.protocols.schema.Schema` class for the routing data. + It should be a subclass of :class:`pcapkit.protocols.internet.ipv6_route.schema.RoutingType`. Raises: RegistryError: If ``code`` is not a :class:`~pcapkit.const.ipv6.routing.Routing` @@ -395,23 +399,23 @@ def register_ipv6_route_routing(code: 'IPv6_Routing', meth: 'str | tuple[IPv6_Ro logger.debug('registered IPv6-Route routing data parser: %s', code.name) -# NOTE: pcapkit.protocols.internet.mh.MH.__message__ +# NOTE: pcapkit.protocols.internet.mh.protocol.MH.__message__ def register_mh_message(code: 'MH_Packet', meth: 'str | tuple[MH_PacketParser, MH_PacketConstructor]', *, schema: 'Optional[Type[Schema_MH_Packet]]' = None) -> 'None': """Register an MH message type parser. The function will register the given message type parser to the - :data:`pcapkit.protocols.internet.mh.MH.__message__` registry. + :data:`pcapkit.protocols.internet.mh.protocol.MH.__message__` registry. Args: - code: :class:`~pcapkit.protocols.internet.mh.MH` + code: :class:`~pcapkit.protocols.internet.mh.protocol.MH` message type code as in :class:`~pcapkit.const.mh.packet.Packet`. meth: Method name, or a ``(parser, constructor)`` pair of callables, to parse and construct the data. A name names the ``_read_msg_*`` and ``_make_msg_*`` methods, and has to name an existing ``_read_msg_*`` one. - schema: :class:`~pcapkit.protocols.schema.schema.Schema` class for the message type. - It should be a subclass of :class:`pcapkit.protocols.schema.internet.mh.Packet`. + schema: :class:`~pcapkit.protocols.schema.Schema` class for the message type. + It should be a subclass of :class:`pcapkit.protocols.internet.mh.schema.Packet`. Raises: RegistryError: If ``code`` is not a :class:`~pcapkit.const.mh.packet.Packet` @@ -429,23 +433,23 @@ def register_mh_message(code: 'MH_Packet', meth: 'str | tuple[MH_PacketParser, M logger.debug('registered MH message type parser: %s', code.name) -# NOTE: pcapkit.protocols.internet.mh.MH.__option__ +# NOTE: pcapkit.protocols.internet.mh.protocol.MH.__option__ def register_mh_option(code: 'MH_Option', meth: 'str | tuple[MH_OptionParser, MH_OptionConstructor]', *, schema: 'Optional[Type[Schema_MH_Option]]' = None) -> 'None': """Register an MH option parser. The function will register the given option parser to the - :data:`pcapkit.protocols.internet.mh.MH.__option__` registry. + :data:`pcapkit.protocols.internet.mh.protocol.MH.__option__` registry. Args: - code: :class:`~pcapkit.protocols.internet.mh.MH` + code: :class:`~pcapkit.protocols.internet.mh.protocol.MH` option code as in :class:`~pcapkit.const.mh.option.Option`. meth: Method name, or a ``(parser, constructor)`` pair of callables, to parse and construct the data. A name names the ``_read_opt_*`` and ``_make_opt_*`` methods, and has to name an existing ``_read_opt_*`` one. - schema: :class:`~pcapkit.protocols.schema.schema.Schema` class for the option. - It should be a subclass of :class:`pcapkit.protocols.schema.internet.mh.Option`. + schema: :class:`~pcapkit.protocols.schema.Schema` class for the option. + It should be a subclass of :class:`pcapkit.protocols.internet.mh.schema.Option`. Raises: RegistryError: If ``code`` is not a :class:`~pcapkit.const.mh.option.Option` @@ -463,23 +467,23 @@ def register_mh_option(code: 'MH_Option', meth: 'str | tuple[MH_OptionParser, MH logger.debug('registered MH option parser: %s', code.name) -# NOTE: pcapkit.protocols.internet.mh.MH.__extension__ +# NOTE: pcapkit.protocols.internet.mh.protocol.MH.__extension__ def register_mh_extension(code: 'MH_CGAExtension', meth: 'str | tuple[MH_ExtensionParser, MH_ExtensionConstructor]', *, schema: 'Optional[Type[Schema_MH_CGAExtension]]' = None) -> 'None': """Register a CGA extension parser. The function will register the given CGA extension parser to the - :data:`pcapkit.protocols.internet.mh.MH.__extension__` registry. + :data:`pcapkit.protocols.internet.mh.protocol.MH.__extension__` registry. Args: - code: :class:`~pcapkit.protocols.internet.mh.MH` + code: :class:`~pcapkit.protocols.internet.mh.protocol.MH` CGA extension code as in :class:`~pcapkit.const.mh.cga_extension.CGAExtension`. meth: Method name, or a ``(parser, constructor)`` pair of callables, to parse and construct the data. A name names the ``_read_ext_*`` and ``_make_ext_*`` methods, and has to name an existing ``_read_ext_*`` one. - schema: :class:`~pcapkit.protocols.schema.schema.Schema` class for the CGA extension. - It should be a subclass of :class:`pcapkit.protocols.schema.internet.mh.CGAExtension`. + schema: :class:`~pcapkit.protocols.schema.Schema` class for the CGA extension. + It should be a subclass of :class:`pcapkit.protocols.internet.mh.schema.CGAExtension`. Raises: RegistryError: If ``code`` is not a :class:`~pcapkit.const.mh.cga_extension.CGAExtension` diff --git a/pcapkit/foundation/registry/protocols/link.py b/pcapkit/foundation/registry/protocols/link.py index ff89e446de..507d323f2a 100644 --- a/pcapkit/foundation/registry/protocols/link.py +++ b/pcapkit/foundation/registry/protocols/link.py @@ -23,13 +23,13 @@ from pcapkit.corekit.module import ModuleDescriptor from pcapkit.corekit.sentinels import NULL from pcapkit.foundation.registry.protocols.protocol import _check_code, _register_name -from pcapkit.protocols.link.frad import FRAD +from pcapkit.protocols.link.frad.protocol import FRAD from pcapkit.protocols.link.link import Link -from pcapkit.protocols.link.linux_sll import LinuxSLL -from pcapkit.protocols.link.loopback import Loopback -from pcapkit.protocols.link.netlink import Netlink -from pcapkit.protocols.link.radiotap import Radiotap -from pcapkit.protocols.schema.link.radiotap import RadiotapField as Schema_Radiotap_Field +from pcapkit.protocols.link.linux_sll.protocol import LinuxSLL +from pcapkit.protocols.link.loopback.protocol import Loopback +from pcapkit.protocols.link.netlink.protocol import Netlink +from pcapkit.protocols.link.radiotap.protocol import Radiotap +from pcapkit.protocols.link.radiotap.schema import RadiotapField as Schema_Radiotap_Field from pcapkit.utilities.exceptions import RegistryError from pcapkit.utilities.logging import get_logger @@ -38,8 +38,9 @@ from pcapkit.const.reg.ethertype import EtherType from pcapkit.corekit.sentinels import NullType - from pcapkit.protocols.link.radiotap import FieldConstructor as Radiotap_FieldConstructor - from pcapkit.protocols.link.radiotap import FieldParser as Radiotap_FieldParser + from pcapkit.protocols.link.radiotap.protocol import \ + FieldConstructor as Radiotap_FieldConstructor + from pcapkit.protocols.link.radiotap.protocol import FieldParser as Radiotap_FieldParser from pcapkit.protocols.protocol import ProtocolBase __all__ = [ @@ -109,7 +110,7 @@ def register_loopback(code: 'int', module: 'ModuleDescriptor[ProtocolBase] | Typ def register_loopback(code: 'int', module: 'str', class_: 'str') -> 'None': ... -# NOTE: pcapkit.protocols.link.loopback.Loopback.__proto__ +# NOTE: pcapkit.protocols.link.loopback.protocol.Loopback.__proto__ def register_loopback(code: 'int', module: 'str | ModuleDescriptor[ProtocolBase] | Type[ProtocolBase]', class_: 'str | NullType' = NULL) -> 'None': r"""Register a new protocol class. @@ -119,7 +120,7 @@ def register_loopback(code: 'int', module: 'str | ModuleDescriptor[ProtocolBase] should be ``{module}.{class_}``. The function will register the given protocol class to the - :data:`pcapkit.protocols.link.loopback.Loopback.__proto__` registry. + :data:`pcapkit.protocols.link.loopback.protocol.Loopback.__proto__` registry. Arguments: code: BSD address family @@ -129,7 +130,7 @@ def register_loopback(code: 'int', module: 'str | ModuleDescriptor[ProtocolBase] Important: Unlike :func:`register_ethertype`, ``code`` is an address family, - **not** an EtherType: :class:`~pcapkit.protocols.link.loopback.Loopback` + **not** an EtherType: :class:`~pcapkit.protocols.link.loopback.protocol.Loopback` keeps a registry of its own. Raises: @@ -160,7 +161,7 @@ def register_arphrd(code: 'Enum_ARPHRD', module: 'ModuleDescriptor[ProtocolBase] def register_arphrd(code: 'Enum_ARPHRD', module: 'str', class_: 'str') -> 'None': ... -# NOTE: pcapkit.protocols.link.linux_sll.LinuxSLL.__proto__ +# NOTE: pcapkit.protocols.link.linux_sll.protocol.LinuxSLL.__proto__ def register_arphrd(code: 'Enum_ARPHRD', module: 'str | ModuleDescriptor[ProtocolBase] | Type[ProtocolBase]', class_: 'str | NullType' = NULL) -> 'None': r"""Register a new protocol class. @@ -170,7 +171,7 @@ def register_arphrd(code: 'Enum_ARPHRD', module: 'str | ModuleDescriptor[Protoco should be ``{module}.{class_}``. The function will register the given protocol class to the - :data:`pcapkit.protocols.link.linux_sll.LinuxSLL.__proto__` registry, so + :data:`pcapkit.protocols.link.linux_sll.protocol.LinuxSLL.__proto__` registry, so that a Linux "cooked" capture on that ``arphrd_type`` dispatches to it instead of reading ``protocol_type`` as an EtherType. @@ -206,7 +207,7 @@ def register_frad(code: 'int', module: 'ModuleDescriptor[ProtocolBase] | Type[Pr def register_frad(code: 'int', module: 'str', class_: 'str') -> 'None': ... -# NOTE: pcapkit.protocols.link.frad.FRAD.__proto__ +# NOTE: pcapkit.protocols.link.frad.protocol.FRAD.__proto__ def register_frad(code: 'int', module: 'str | ModuleDescriptor[ProtocolBase] | Type[ProtocolBase]', class_: 'str | NullType' = NULL) -> 'None': r"""Register a new protocol class. @@ -216,7 +217,7 @@ def register_frad(code: 'int', module: 'str | ModuleDescriptor[ProtocolBase] | T should be ``{module}.{class_}``. The function will register the given protocol class to the - :data:`pcapkit.protocols.link.frad.FRAD.__proto__` registry. + :data:`pcapkit.protocols.link.frad.protocol.FRAD.__proto__` registry. Arguments: code: NLPID, after resolving the ``0x00`` pad ahead of a SNAP header @@ -248,7 +249,7 @@ def register_netlink(code: 'int', module: 'ModuleDescriptor[ProtocolBase] | Type def register_netlink(code: 'int', module: 'str', class_: 'str') -> 'None': ... -# NOTE: pcapkit.protocols.link.netlink.Netlink.__proto__ +# NOTE: pcapkit.protocols.link.netlink.protocol.Netlink.__proto__ def register_netlink(code: 'int', module: 'str | ModuleDescriptor[ProtocolBase] | Type[ProtocolBase]', class_: 'str | NullType' = NULL) -> 'None': r"""Register a new protocol class. @@ -258,7 +259,7 @@ def register_netlink(code: 'int', module: 'str | ModuleDescriptor[ProtocolBase] should be ``{module}.{class_}``. The function will register the given protocol class to the - :data:`pcapkit.protocols.link.netlink.Netlink.__proto__` registry. + :data:`pcapkit.protocols.link.netlink.protocol.Netlink.__proto__` registry. Arguments: code: ``nlmsg_type`` of the dissected message @@ -290,7 +291,7 @@ def register_radiotap(code: 'Enum_LinkType', module: 'ModuleDescriptor[ProtocolB def register_radiotap(code: 'Enum_LinkType', module: 'str', class_: 'str') -> 'None': ... -# NOTE: pcapkit.protocols.link.radiotap.Radiotap.__proto__ +# NOTE: pcapkit.protocols.link.radiotap.protocol.Radiotap.__proto__ def register_radiotap(code: 'Enum_LinkType', module: 'str | ModuleDescriptor[ProtocolBase] | Type[ProtocolBase]', class_: 'str | NullType' = NULL) -> 'None': r"""Register a new protocol class. @@ -300,9 +301,9 @@ def register_radiotap(code: 'Enum_LinkType', module: 'str | ModuleDescriptor[Pro should be ``{module}.{class_}``. The function will register the given protocol class to the - :data:`pcapkit.protocols.link.radiotap.Radiotap.__proto__` registry, keyed + :data:`pcapkit.protocols.link.radiotap.protocol.Radiotap.__proto__` registry, keyed by the link type of the frame a radiotap header precedes. Any link type is - accepted, but :meth:`Radiotap.read ` + accepted, but :meth:`Radiotap.read ` consults :attr:`LinkType.IEEE802_11 ` alone: registering that key replaces the 802.11 dissector, and an entry under any other key is stored and never reached. @@ -333,30 +334,30 @@ def register_radiotap(code: 'Enum_LinkType', module: 'str | ModuleDescriptor[Pro _register_name(module, (Radiotap, code)) -# NOTE: pcapkit.protocols.link.radiotap.Radiotap.__field__ +# NOTE: pcapkit.protocols.link.radiotap.protocol.Radiotap.__field__ def register_radiotap_field(code: 'Radiotap_FieldType', meth: 'str | tuple[Radiotap_FieldParser, Radiotap_FieldConstructor]', *, schema: 'Optional[Type[Schema_Radiotap_Field]]' = None) -> 'None': """Register a radiotap field parser. The function will register the given field parser to the - :data:`pcapkit.protocols.link.radiotap.Radiotap.__field__` registry. A + :data:`pcapkit.protocols.link.radiotap.protocol.Radiotap.__field__` registry. A field type is decoded once both it and the schema registry hold an entry for it. A presence bit 28 to 30 follows rules of its own, as does a vendor namespace TLV item, so an entry for one is stored and not reached there; a type from 32 on is reached only as a TLV item. Args: - code: :class:`~pcapkit.protocols.link.radiotap.Radiotap` field type as + code: :class:`~pcapkit.protocols.link.radiotap.protocol.Radiotap` field type as in :class:`~pcapkit.const.radiotap.field_type.FieldType`. meth: Method name, or a ``(parser, constructor)`` pair of callables, to parse and construct the field. A name names the ``_read_field_*`` and ``_make_field_*`` methods, and has to name an existing ``_read_field_*`` one. - schema: :class:`~pcapkit.protocols.schema.schema.Schema` class for the + schema: :class:`~pcapkit.protocols.schema.Schema` class for the field, whose fields are its subfields and whose ``__align__`` is its alignment. It should be a subclass of - :class:`pcapkit.protocols.schema.link.radiotap.RadiotapField`. + :class:`pcapkit.protocols.link.radiotap.schema.RadiotapField`. Raises: RegistryError: If ``code`` is not a diff --git a/pcapkit/foundation/registry/protocols/misc.py b/pcapkit/foundation/registry/protocols/misc.py index e6f8d487e6..1d31495a2b 100644 --- a/pcapkit/foundation/registry/protocols/misc.py +++ b/pcapkit/foundation/registry/protocols/misc.py @@ -26,13 +26,13 @@ from pcapkit.corekit.module import ModuleDescriptor from pcapkit.corekit.sentinels import NULL from pcapkit.foundation.registry.protocols.protocol import _check_code, _register_name -from pcapkit.protocols.misc.pcap.frame import Frame -from pcapkit.protocols.misc.pcapng import PCAPNG -from pcapkit.protocols.schema.misc.pcapng import BlockType as Schema_PCAPNG_BlockType -from pcapkit.protocols.schema.misc.pcapng import DSBSecrets as Schema_PCAPNG_DSBSecrets -from pcapkit.protocols.schema.misc.pcapng import \ +from pcapkit.protocols.misc.pcap.frame.protocol import Frame +from pcapkit.protocols.misc.pcapng.protocol import PCAPNG +from pcapkit.protocols.misc.pcapng.schema import BlockType as Schema_PCAPNG_BlockType +from pcapkit.protocols.misc.pcapng.schema import DSBSecrets as Schema_PCAPNG_DSBSecrets +from pcapkit.protocols.misc.pcapng.schema import \ NameResolutionRecord as Schema_PCAPNG_NameResolutionRecord -from pcapkit.protocols.schema.misc.pcapng import Option as Schema_PCAPNG_Option +from pcapkit.protocols.misc.pcapng.schema import Option as Schema_PCAPNG_Option from pcapkit.utilities.exceptions import RegistryError from pcapkit.utilities.logging import get_logger @@ -41,14 +41,15 @@ from pcapkit.const.reg.linktype import LinkType from pcapkit.corekit.sentinels import NullType - from pcapkit.protocols.misc.pcapng import BlockConstructor as PCAPNG_BlockConstructor - from pcapkit.protocols.misc.pcapng import BlockParser as PCAPNG_BlockParser - from pcapkit.protocols.misc.pcapng import OptionConstructor as PCAPNG_OptionConstructor - from pcapkit.protocols.misc.pcapng import OptionParser as PCAPNG_OptionParser - from pcapkit.protocols.misc.pcapng import RecordConstructor as PCAPNG_RecordConstructor - from pcapkit.protocols.misc.pcapng import RecordParser as PCAPNG_RecordParser - from pcapkit.protocols.misc.pcapng import SecretsConstructor as PCAPNG_SecretsConstructor - from pcapkit.protocols.misc.pcapng import SecretsParser as PCAPNG_SecretsParser + from pcapkit.protocols.misc.pcapng.protocol import BlockConstructor as PCAPNG_BlockConstructor + from pcapkit.protocols.misc.pcapng.protocol import BlockParser as PCAPNG_BlockParser + from pcapkit.protocols.misc.pcapng.protocol import OptionConstructor as PCAPNG_OptionConstructor + from pcapkit.protocols.misc.pcapng.protocol import OptionParser as PCAPNG_OptionParser + from pcapkit.protocols.misc.pcapng.protocol import RecordConstructor as PCAPNG_RecordConstructor + from pcapkit.protocols.misc.pcapng.protocol import RecordParser as PCAPNG_RecordParser + from pcapkit.protocols.misc.pcapng.protocol import \ + SecretsConstructor as PCAPNG_SecretsConstructor + from pcapkit.protocols.misc.pcapng.protocol import SecretsParser as PCAPNG_SecretsParser from pcapkit.protocols.protocol import ProtocolBase __all__ = [ @@ -86,8 +87,8 @@ def register_linktype(code: 'LinkType', module: 'str | ModuleDescriptor[Protocol The function will register the given protocol class to the following registries: - - :data:`pcapkit.protocols.misc.pcap.frame.Frame.__proto__` - - :data:`pcapkit.protocols.misc.pcapng.PCAPNG.__proto__` + - :data:`pcapkit.protocols.misc.pcap.frame.protocol.Frame.__proto__` + - :data:`pcapkit.protocols.misc.pcapng.protocol.PCAPNG.__proto__` Arguments: code: protocol code as in :class:`~pcapkit.const.reg.linktype.LinkType` @@ -129,7 +130,7 @@ def register_pcap(code: 'LinkType', module: 'ModuleDescriptor[ProtocolBase] | Ty def register_pcap(code: 'LinkType', module: 'str', class_: 'str') -> 'None': ... -# NOTE: pcapkit.protocols.misc.pcap.frame.Frame.__proto__ +# NOTE: pcapkit.protocols.misc.pcap.frame.protocol.Frame.__proto__ def register_pcap(code: 'LinkType', module: 'str | ModuleDescriptor[ProtocolBase] | Type[ProtocolBase]', class_: 'str | NullType' = NULL) -> 'None': r"""Register a new protocol class. @@ -139,7 +140,7 @@ def register_pcap(code: 'LinkType', module: 'str | ModuleDescriptor[ProtocolBase should be ``{module}.{class_}``. The function will register the given protocol class to the - :data:`pcapkit.protocols.misc.pcap.frame.Frame.__proto__` registry. + :data:`pcapkit.protocols.misc.pcap.frame.protocol.Frame.__proto__` registry. Arguments: code: protocol code as in :class:`~pcapkit.const.reg.linktype.LinkType` @@ -173,7 +174,7 @@ def register_pcapng(code: 'LinkType', module: 'ModuleDescriptor[ProtocolBase] | def register_pcapng(code: 'LinkType', module: 'str', class_: 'str') -> 'None': ... -# NOTE: pcapkit.protocols.misc.pcapng.PCAPNG.__proto__ +# NOTE: pcapkit.protocols.misc.pcapng.protocol.PCAPNG.__proto__ def register_pcapng(code: 'LinkType', module: 'str | ModuleDescriptor[ProtocolBase] | Type[ProtocolBase]', class_: 'str | NullType' = NULL) -> 'None': r"""Register a new protocol class. @@ -183,7 +184,7 @@ def register_pcapng(code: 'LinkType', module: 'str | ModuleDescriptor[ProtocolBa should be ``{module}.{class_}``. The function will register the given protocol class to the - :data:`pcapkit.protocols.misc.pcapng.PCAPNG.__proto__` registry. + :data:`pcapkit.protocols.misc.pcapng.protocol.PCAPNG.__proto__` registry. Arguments: code: protocol code as in :class:`~pcapkit.const.reg.linktype.LinkType` @@ -216,23 +217,23 @@ def register_pcapng(code: 'LinkType', module: 'str | ModuleDescriptor[ProtocolBa ############################################################################### -# NOTE: pcapkit.protocols.misc.pcapng.PCAPNG.__block__ +# NOTE: pcapkit.protocols.misc.pcapng.protocol.PCAPNG.__block__ def register_pcapng_block(code: 'PCAPNG_BlockType', meth: 'str | tuple[PCAPNG_BlockParser, PCAPNG_BlockConstructor]', *, schema: 'Optional[Type[Schema_PCAPNG_BlockType]]' = None) -> 'None': """Register a block parser. The function will register the given block parser to the - :data:`pcapkit.protocols.misc.pcapng.PCAPNG.__block__` registry. + :data:`pcapkit.protocols.misc.pcapng.protocol.PCAPNG.__block__` registry. Args: - code: :class:`PCAPNG ` block type + code: :class:`PCAPNG ` block type code as in :class:`~pcapkit.const.pcapng.block_type.BlockType`. meth: Method name, or a ``(parser, constructor)`` pair of callables, to parse and construct the block. A name names the ``_read_block_*`` and ``_make_block_*`` methods, and has to name an existing ``_read_block_*`` one. - schema: :class:`~pcapkit.protocols.schema.schema.Schema` class for the block. - It should be a subclass of :class:`pcapkit.protocols.schema.misc.pcapng.BlockType`. + schema: :class:`~pcapkit.protocols.schema.Schema` class for the block. + It should be a subclass of :class:`pcapkit.protocols.misc.pcapng.schema.BlockType`. Raises: RegistryError: If ``code`` is not a :class:`~pcapkit.const.pcapng.block_type.BlockType` @@ -250,23 +251,23 @@ def register_pcapng_block(code: 'PCAPNG_BlockType', meth: 'str | tuple[PCAPNG_Bl logger.debug('registered PCAP-NG block parser: %s', code.name) -# NOTE: pcapkit.protocols.misc.pcapng.PCAPNG.__option__ +# NOTE: pcapkit.protocols.misc.pcapng.protocol.PCAPNG.__option__ def register_pcapng_option(code: 'PCAPNG_OptionType', meth: 'str | tuple[PCAPNG_OptionParser, PCAPNG_OptionConstructor]', *, schema: 'Optional[Type[Schema_PCAPNG_Option]]' = None) -> 'None': """Register an option parser. The function will register the given option parser to the - :data:`pcapkit.protocols.misc.pcapng.PCAPNG.__option__` registry. + :data:`pcapkit.protocols.misc.pcapng.protocol.PCAPNG.__option__` registry. Args: - code: :class:`PCAPNG ` option type + code: :class:`PCAPNG ` option type code as in :class:`~pcapkit.const.pcapng.option_type.OptionType`. meth: Method name, or a ``(parser, constructor)`` pair of callables, to parse and construct the option. A name names the ``_read_option_*`` and ``_make_option_*`` methods, and has to name an existing ``_read_option_*`` one. - schema: :class:`~pcapkit.protocols.schema.schema.Schema` class for the option. - It should be a subclass of :class:`pcapkit.protocols.schema.misc.pcapng.Option`. + schema: :class:`~pcapkit.protocols.schema.Schema` class for the option. + It should be a subclass of :class:`pcapkit.protocols.misc.pcapng.schema.Option`. Raises: RegistryError: If ``code`` is not a :class:`~pcapkit.const.pcapng.option_type.OptionType` @@ -284,23 +285,23 @@ def register_pcapng_option(code: 'PCAPNG_OptionType', meth: 'str | tuple[PCAPNG_ logger.debug('registered PCAP-NG option parser: %s', code.name) -# NOTE: pcapkit.protocols.misc.pcapng.PCAPNG.__record__ +# NOTE: pcapkit.protocols.misc.pcapng.protocol.PCAPNG.__record__ def register_pcapng_record(code: 'PCAPNG_RecordType', meth: 'str | tuple[PCAPNG_RecordParser, PCAPNG_RecordConstructor]', *, schema: 'Optional[Type[Schema_PCAPNG_NameResolutionRecord]]' = None) -> 'None': """Register a name resolution record parser. The function will register the given name resolution record parser to the - :data:`pcapkit.protocols.misc.pcapng.PCAPNG.__record__` registry. + :data:`pcapkit.protocols.misc.pcapng.protocol.PCAPNG.__record__` registry. Args: - code: :class:`PCAPNG ` name + code: :class:`PCAPNG ` name resolution record type code as in :class:`~pcapkit.const.pcapng.record_type.RecordType`. meth: Method name, or a ``(parser, constructor)`` pair of callables, to parse and construct the name resolution record. A name names the ``_read_record_*`` and ``_make_record_*`` methods, and has to name an existing ``_read_record_*`` one. - schema: :class:`~pcapkit.protocols.schema.schema.Schema` class for the name resolution record. - It should be a subclass of :class:`pcapkit.protocols.schema.misc.pcapng.NameResolutionRecord`. + schema: :class:`~pcapkit.protocols.schema.Schema` class for the name resolution record. + It should be a subclass of :class:`pcapkit.protocols.misc.pcapng.schema.NameResolutionRecord`. Raises: RegistryError: If ``code`` is not a :class:`~pcapkit.const.pcapng.record_type.RecordType` @@ -318,23 +319,23 @@ def register_pcapng_record(code: 'PCAPNG_RecordType', meth: 'str | tuple[PCAPNG_ logger.debug('registered PCAP-NG name resolution record parser: %s', code.name) -# NOTE: pcapkit.protocols.misc.pcapng.PCAPNG.__secrets__ +# NOTE: pcapkit.protocols.misc.pcapng.protocol.PCAPNG.__secrets__ def register_pcapng_secrets(code: 'PCAPNG_SecretsType', meth: 'str | tuple[PCAPNG_SecretsParser, PCAPNG_SecretsConstructor]', *, schema: 'Optional[Type[Schema_PCAPNG_DSBSecrets]]' = None) -> 'None': """Register a decryption secrets parser. The function will register the given decryption secrets parser to the - :data:`pcapkit.protocols.misc.pcapng.PCAPNG.__secrets__` registry. + :data:`pcapkit.protocols.misc.pcapng.protocol.PCAPNG.__secrets__` registry. Args: - code: :class:`PCAPNG ` decryption + code: :class:`PCAPNG ` decryption secrets type code as in :class:`~pcapkit.const.pcapng.secrets_type.SecretsType`. meth: Method name, or a ``(parser, constructor)`` pair of callables, to parse and construct the decryption secrets. A name names the ``_read_secrets_*`` and ``_make_secrets_*`` methods, and has to name an existing ``_read_secrets_*`` one. - schema: :class:`~pcapkit.protocols.schema.schema.Schema` class for the decryption secrets. - It should be a subclass of :class:`pcapkit.protocols.schema.misc.pcapng.DSBSecrets`. + schema: :class:`~pcapkit.protocols.schema.Schema` class for the decryption secrets. + It should be a subclass of :class:`pcapkit.protocols.misc.pcapng.schema.DSBSecrets`. Raises: RegistryError: If ``code`` is not a :class:`~pcapkit.const.pcapng.secrets_type.SecretsType` diff --git a/pcapkit/foundation/registry/protocols/protocol.py b/pcapkit/foundation/registry/protocols/protocol.py index 7ed2d06cec..dcb1ffc525 100644 --- a/pcapkit/foundation/registry/protocols/protocol.py +++ b/pcapkit/foundation/registry/protocols/protocol.py @@ -92,7 +92,7 @@ class rather than supplied by a caller, and this function is the funnel name as a plain string, and the ``protocol`` properties on :class:`~pcapkit.foundation.reassembly.reassembly.ReassemblyMeta` and :class:`~pcapkit.foundation.traceflow.traceflow.TraceFlowMeta` fall back to - :class:`~pcapkit.protocols.misc.raw.Raw`. The registry redesign of + :class:`~pcapkit.protocols.misc.raw.protocol.Raw`. The registry redesign of :issue:`514` keeps this key, and its thread records the shared namespace as a risk that design does not resolve, so the collision is reported here rather than fixed. @@ -113,10 +113,10 @@ class rather than supplied by a caller, and this function is the funnel .. versionchanged:: 1.6.0 The HTTP member classes are named - :class:`~pcapkit.protocols.application.httpv1.HTTPv1` and - :class:`~pcapkit.protocols.application.httpv2.HTTPv2`, so registering + :class:`~pcapkit.protocols.application.httpv1.protocol.HTTPv1` and + :class:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2`, so registering one keeps its own key and no longer displaces - :class:`~pcapkit.protocols.application.http.HTTP` under ``'HTTP'`` + :class:`~pcapkit.protocols.application.http.protocol.HTTP` under ``'HTTP'`` (:issue:`2529`). """ @@ -382,21 +382,21 @@ def register_protocol_code(protocol: 'Type[ProtocolBase]', code: 'Any') -> 'None :class:`~pcapkit.const.reg.transtype.TransType` to :class:`~pcapkit.protocols.internet.internet.Internet`, :class:`~pcapkit.const.sctp.payload_protocol_identifier.PayloadProtocolIdentifier` - to :class:`~pcapkit.protocols.transport.sctp.SCTP`, + to :class:`~pcapkit.protocols.transport.sctp.protocol.SCTP`, :class:`~pcapkit.const.linux.arphrd.ARPHRD` to - :class:`~pcapkit.protocols.link.linux_sll.LinuxSLL`, and + :class:`~pcapkit.protocols.link.linux_sll.protocol.LinuxSLL`, and :class:`~pcapkit.const.reg.linktype.LinkType` to *both* - :class:`~pcapkit.protocols.misc.pcap.frame.Frame` **and** - :class:`~pcapkit.protocols.misc.pcapng.PCAPNG`; or + :class:`~pcapkit.protocols.misc.pcap.frame.protocol.Frame` **and** + :class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG`; or * a :class:`dict` mapping an explicit destination class to a key -- the only form accepted for a bare :class:`int`, since e.g. a port number does not say by itself whether it means - :class:`~pcapkit.protocols.transport.tcp.TCP` or - :class:`~pcapkit.protocols.transport.udp.UDP`; + :class:`~pcapkit.protocols.transport.tcp.protocol.TCP` or + :class:`~pcapkit.protocols.transport.udp.protocol.UDP`; or an iterable of either, to register ``protocol`` into several registries from one call -- e.g. a - :class:`~pcapkit.protocols.link.l2tp.L2TP` subclass reachable both by its + :class:`~pcapkit.protocols.link.l2tp.protocol.L2TP` subclass reachable both by its IP protocol number and by a UDP port: .. code-block:: python @@ -409,13 +409,13 @@ def register_protocol_code(protocol: 'Type[ProtocolBase]', code: 'Any') -> 'None Note: That example names ``L2TPv3``, which this package does not implement, - rather than :class:`~pcapkit.protocols.link.l2tpv2.L2TPv2`. It is + rather than :class:`~pcapkit.protocols.link.l2tpv2.protocol.L2TPv2`. It is v3 that is genuinely reachable both ways: :rfc:`3931` ยง4.1.1 puts it directly over IP on protocol 115 and ยง4.1.2 puts it over UDP on port - 1701. :class:`L2TPv2 ` answers on + 1701. :class:`L2TPv2 ` answers on port 1701 only, and registering *it* at :attr:`TransType.L2TP ` would point the - :rfc:`2661` parser at a v3-over-IP header -- see :class:`~pcapkit.protocols.link.l2tp.L2TP` + :rfc:`2661` parser at a v3-over-IP header -- see :class:`~pcapkit.protocols.link.l2tp.protocol.L2TP` and GitHub issue :issue:`548` for what that produced when measured. Args: @@ -449,7 +449,7 @@ def register_protocol_code(protocol: 'Type[ProtocolBase]', code: 'Any') -> 'None # NOTE: the pairing is read out of the owner's own ``vars()`` rather than # with ``getattr``, which walks the MRO and would hand a class keeping a # registry of its own its parent's pairing -- - # :attr:`Loopback.__proto__ ` + # :attr:`Loopback.__proto__ ` # is keyed by address family rather than by EtherType, so inheriting # :class:`Link`'s would reject every key it does accept. A class is # checked against the registry it owns, or not at all. diff --git a/pcapkit/foundation/registry/protocols/transport.py b/pcapkit/foundation/registry/protocols/transport.py index 09acd606d1..606ca5ee91 100644 --- a/pcapkit/foundation/registry/protocols/transport.py +++ b/pcapkit/foundation/registry/protocols/transport.py @@ -29,16 +29,16 @@ from pcapkit.corekit.module import ModuleDescriptor from pcapkit.corekit.sentinels import NULL from pcapkit.foundation.registry.protocols.protocol import _check_code, _register_name -from pcapkit.protocols.schema.transport.dccp import Option as Schema_DCCP_Option -from pcapkit.protocols.schema.transport.sctp import Chunk as Schema_SCTP_Chunk -from pcapkit.protocols.schema.transport.sctp import ErrorCause as Schema_SCTP_ErrorCause -from pcapkit.protocols.schema.transport.sctp import Parameter as Schema_SCTP_Parameter -from pcapkit.protocols.schema.transport.tcp import MPTCP as Schema_TCP_MPTCP -from pcapkit.protocols.schema.transport.tcp import Option as Schema_TCP_Option -from pcapkit.protocols.transport.dccp import DCCP -from pcapkit.protocols.transport.sctp import SCTP -from pcapkit.protocols.transport.tcp import TCP -from pcapkit.protocols.transport.udp import UDP +from pcapkit.protocols.transport.dccp.protocol import DCCP +from pcapkit.protocols.transport.dccp.schema import Option as Schema_DCCP_Option +from pcapkit.protocols.transport.sctp.protocol import SCTP +from pcapkit.protocols.transport.sctp.schema import Chunk as Schema_SCTP_Chunk +from pcapkit.protocols.transport.sctp.schema import ErrorCause as Schema_SCTP_ErrorCause +from pcapkit.protocols.transport.sctp.schema import Parameter as Schema_SCTP_Parameter +from pcapkit.protocols.transport.tcp.protocol import TCP +from pcapkit.protocols.transport.tcp.schema import MPTCP as Schema_TCP_MPTCP +from pcapkit.protocols.transport.tcp.schema import Option as Schema_TCP_Option +from pcapkit.protocols.transport.udp.protocol import UDP from pcapkit.utilities.exceptions import RegistryError from pcapkit.utilities.logging import get_logger @@ -49,18 +49,21 @@ PayloadProtocolIdentifier as SCTP_PayloadProtocolIdentifier from pcapkit.corekit.sentinels import NullType from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.transport.dccp import OptionConstructor as DCCP_OptionConstructor - from pcapkit.protocols.transport.dccp import OptionParser as DCCP_OptionParser - from pcapkit.protocols.transport.sctp import CauseConstructor as SCTP_CauseConstructor - from pcapkit.protocols.transport.sctp import CauseParser as SCTP_CauseParser - from pcapkit.protocols.transport.sctp import ChunkConstructor as SCTP_ChunkConstructor - from pcapkit.protocols.transport.sctp import ChunkParser as SCTP_ChunkParser - from pcapkit.protocols.transport.sctp import ParameterConstructor as SCTP_ParameterConstructor - from pcapkit.protocols.transport.sctp import ParameterParser as SCTP_ParameterParser - from pcapkit.protocols.transport.tcp import MPOptionConstructor as TCP_MPOptionConstructor - from pcapkit.protocols.transport.tcp import MPOptionParser as TCP_MPOptionParser - from pcapkit.protocols.transport.tcp import OptionConstructor as TCP_OptionConstructor - from pcapkit.protocols.transport.tcp import OptionParser as TCP_OptionParser + from pcapkit.protocols.transport.dccp.protocol import \ + OptionConstructor as DCCP_OptionConstructor + from pcapkit.protocols.transport.dccp.protocol import OptionParser as DCCP_OptionParser + from pcapkit.protocols.transport.sctp.protocol import CauseConstructor as SCTP_CauseConstructor + from pcapkit.protocols.transport.sctp.protocol import CauseParser as SCTP_CauseParser + from pcapkit.protocols.transport.sctp.protocol import ChunkConstructor as SCTP_ChunkConstructor + from pcapkit.protocols.transport.sctp.protocol import ChunkParser as SCTP_ChunkParser + from pcapkit.protocols.transport.sctp.protocol import \ + ParameterConstructor as SCTP_ParameterConstructor + from pcapkit.protocols.transport.sctp.protocol import ParameterParser as SCTP_ParameterParser + from pcapkit.protocols.transport.tcp.protocol import \ + MPOptionConstructor as TCP_MPOptionConstructor + from pcapkit.protocols.transport.tcp.protocol import MPOptionParser as TCP_MPOptionParser + from pcapkit.protocols.transport.tcp.protocol import OptionConstructor as TCP_OptionConstructor + from pcapkit.protocols.transport.tcp.protocol import OptionParser as TCP_OptionParser __all__ = [ 'register_apptype', @@ -100,8 +103,8 @@ def register_apptype(code: 'int | Enum_AppType', module: 'str | ModuleDescriptor should be ``{module}.{class_}``. The function will register the given protocol class to the - :data:`pcapkit.protocols.transport.tcp.TCP.__proto__` and/or - :data:`pcapkit.protocols.transport.udp.UDP.__proto__` registry. + :data:`pcapkit.protocols.transport.tcp.protocol.TCP.__proto__` and/or + :data:`pcapkit.protocols.transport.udp.protocol.UDP.__proto__` registry. Arguments: code: port number @@ -155,10 +158,10 @@ def register_apptype(code: 'int | Enum_AppType', module: 'str | ModuleDescriptor :issue:`833`. Important: - :class:`~pcapkit.protocols.transport.sctp.SCTP` is deliberately **not** + :class:`~pcapkit.protocols.transport.sctp.protocol.SCTP` is deliberately **not** one of the registries this writes to, so naming ``sctp`` here is an error rather than a no-op. Its - :data:`~pcapkit.protocols.transport.sctp.SCTP.__proto__` registry is + :data:`~pcapkit.protocols.transport.sctp.protocol.SCTP.__proto__` registry is keyed by the DATA chunk's payload protocol identifier rather than by port number, so writing a port number into it would dispatch on a number from the wrong registry. Use @@ -288,7 +291,7 @@ def register_tcp(code: 'int | Enum_AppType', module: 'ModuleDescriptor[ProtocolB def register_tcp(code: 'int | Enum_AppType', module: 'str', class_: 'str') -> 'None': ... -# NOTE: pcapkit.protocols.transport.tcp.TCP.__proto__ +# NOTE: pcapkit.protocols.transport.tcp.protocol.TCP.__proto__ def register_tcp(code: 'int | Enum_AppType', module: 'str | ModuleDescriptor[ProtocolBase] | Type[ProtocolBase]', class_: 'str | NullType' = NULL) -> 'None': r"""Register a new protocol class. @@ -298,7 +301,7 @@ def register_tcp(code: 'int | Enum_AppType', module: 'str | ModuleDescriptor[Pro should be ``{module}.{class_}``. The function will register the given protocol class to the - :data:`pcapkit.protocols.transport.tcp.TCP.__proto__` registry. + :data:`pcapkit.protocols.transport.tcp.protocol.TCP.__proto__` registry. Arguments: code: port number @@ -328,23 +331,23 @@ def register_tcp(code: 'int | Enum_AppType', module: 'str | ModuleDescriptor[Pro _register_name(module, (TCP, code)) -# NOTE: pcapkit.protocols.transport.tcp.TCP.__option__ +# NOTE: pcapkit.protocols.transport.tcp.protocol.TCP.__option__ def register_tcp_option(code: 'TCP_Option', meth: 'str | tuple[TCP_OptionParser, TCP_OptionConstructor]', *, schema: 'Optional[Type[Schema_TCP_Option]]' = None) -> 'None': """Register an option parser. The function will register the given option parser to the - :data:`pcapkit.protocols.transport.tcp.TCP.__option__` registry. + :data:`pcapkit.protocols.transport.tcp.protocol.TCP.__option__` registry. Args: - code: :class:`~pcapkit.protocols.transport.tcp.TCP` option code as in + code: :class:`~pcapkit.protocols.transport.tcp.protocol.TCP` option code as in :class:`~pcapkit.const.tcp.option.Option`. meth: Method name, or a ``(parser, constructor)`` pair of callables, to parse and construct the option. A name names the ``_read_mode_*`` and ``_make_mode_*`` methods, and has to name an existing ``_read_mode_*`` one. - schema: :class:`~pcapkit.protocols.schema.schema.Schema` class for the option. - It should be a subclass of :class:`pcapkit.protocols.schema.transport.tcp.Option`. + schema: :class:`~pcapkit.protocols.schema.Schema` class for the option. + It should be a subclass of :class:`pcapkit.protocols.transport.tcp.schema.Option`. Raises: RegistryError: If ``code`` is not a :class:`~pcapkit.const.tcp.option.Option` @@ -362,23 +365,23 @@ def register_tcp_option(code: 'TCP_Option', meth: 'str | tuple[TCP_OptionParser, logger.debug('registered TCP option parser: %s', code.name) -# NOTE: pcapkit.protocols.transport.tcp.TCP.__mp_option__ +# NOTE: pcapkit.protocols.transport.tcp.protocol.TCP.__mp_option__ def register_tcp_mp_option(code: 'TCP_MPTCPOption', meth: 'str | tuple[TCP_MPOptionParser, TCP_MPOptionConstructor]', *, schema: 'Optional[Type[Schema_TCP_MPTCP]]' = None) -> 'None': """Register an MPTCP option parser. The function will register the given option parser to the - :data:`pcapkit.protocols.transport.tcp.TCP.__mp_option__` registry. + :data:`pcapkit.protocols.transport.tcp.protocol.TCP.__mp_option__` registry. Args: - code: Multipath :class:`~pcapkit.protocols.transport.tcp.TCP` option code as in + code: Multipath :class:`~pcapkit.protocols.transport.tcp.protocol.TCP` option code as in :class:`~pcapkit.const.tcp.mp_tcp_option.MPTCPOption`. meth: Method name, or a ``(parser, constructor)`` pair of callables, to parse and construct the option. A name names the ``_read_mptcp_*`` and ``_make_mptcp_*`` methods, and has to name an existing ``_read_mptcp_*`` one. - schema: :class:`~pcapkit.protocols.schema.schema.Schema` class for the option. - It should be a subclass of :class:`pcapkit.protocols.schema.transport.tcp.MPTCP`. + schema: :class:`~pcapkit.protocols.schema.Schema` class for the option. + It should be a subclass of :class:`pcapkit.protocols.transport.tcp.schema.MPTCP`. Raises: RegistryError: If ``code`` is not a :class:`~pcapkit.const.tcp.mp_tcp_option.MPTCPOption` @@ -402,7 +405,7 @@ def register_udp(code: 'int | Enum_AppType', module: 'ModuleDescriptor[ProtocolB def register_udp(code: 'int | Enum_AppType', module: 'str', class_: 'str') -> 'None': ... -# NOTE: pcapkit.protocols.transport.udp.UDP.__proto__ +# NOTE: pcapkit.protocols.transport.udp.protocol.UDP.__proto__ def register_udp(code: 'int | Enum_AppType', module: 'str | ModuleDescriptor[ProtocolBase] | Type[ProtocolBase]', class_: 'str | NullType' = NULL) -> 'None': r"""Register a new protocol class. @@ -412,7 +415,7 @@ def register_udp(code: 'int | Enum_AppType', module: 'str | ModuleDescriptor[Pro should be ``{module}.{class_}``. The function will register the given protocol class to the - :data:`pcapkit.protocols.transport.udp.UDP.__proto__` registry. + :data:`pcapkit.protocols.transport.udp.protocol.UDP.__proto__` registry. Arguments: code: port number @@ -448,7 +451,7 @@ def register_sctp(code: 'int | SCTP_PayloadProtocolIdentifier', module: 'ModuleD def register_sctp(code: 'int | SCTP_PayloadProtocolIdentifier', module: 'str', class_: 'str') -> 'None': ... -# NOTE: pcapkit.protocols.transport.sctp.SCTP.__proto__ +# NOTE: pcapkit.protocols.transport.sctp.protocol.SCTP.__proto__ def register_sctp(code: 'int | SCTP_PayloadProtocolIdentifier', module: 'str | ModuleDescriptor[ProtocolBase] | Type[ProtocolBase]', class_: 'str | NullType' = NULL) -> 'None': r"""Register a new protocol class. @@ -458,7 +461,7 @@ def register_sctp(code: 'int | SCTP_PayloadProtocolIdentifier', module: 'str | M should be ``{module}.{class_}``. The function will register the given protocol class to the - :data:`pcapkit.protocols.transport.sctp.SCTP.__proto__` registry. + :data:`pcapkit.protocols.transport.sctp.protocol.SCTP.__proto__` registry. Arguments: code: payload protocol identifier (PPID), as in @@ -494,23 +497,23 @@ def register_sctp(code: 'int | SCTP_PayloadProtocolIdentifier', module: 'str | M _register_name(module, (SCTP, code)) -# NOTE: pcapkit.protocols.transport.sctp.SCTP.__chunk__ +# NOTE: pcapkit.protocols.transport.sctp.protocol.SCTP.__chunk__ def register_sctp_chunk(code: 'SCTP_Chunk', meth: 'str | tuple[SCTP_ChunkParser, SCTP_ChunkConstructor]', *, schema: 'Optional[Type[Schema_SCTP_Chunk]]' = None) -> 'None': """Register a chunk parser. The function will register the given chunk parser to the - :data:`pcapkit.protocols.transport.sctp.SCTP.__chunk__` registry. + :data:`pcapkit.protocols.transport.sctp.protocol.SCTP.__chunk__` registry. Args: - code: :class:`~pcapkit.protocols.transport.sctp.SCTP` chunk type as in + code: :class:`~pcapkit.protocols.transport.sctp.protocol.SCTP` chunk type as in :class:`~pcapkit.const.sctp.chunk.Chunk`. meth: Method name, or a ``(parser, constructor)`` pair of callables, to parse and construct the chunk. A name names the ``_read_chunk_*`` and ``_make_chunk_*`` methods, and has to name an existing ``_read_chunk_*`` one. - schema: :class:`~pcapkit.protocols.schema.schema.Schema` class for the chunk. - It should be a subclass of :class:`pcapkit.protocols.schema.transport.sctp.Chunk`. + schema: :class:`~pcapkit.protocols.schema.Schema` class for the chunk. + It should be a subclass of :class:`pcapkit.protocols.transport.sctp.schema.Chunk`. Raises: RegistryError: If ``code`` is not a :class:`~pcapkit.const.sctp.chunk.Chunk` @@ -530,24 +533,24 @@ def register_sctp_chunk(code: 'SCTP_Chunk', meth: 'str | tuple[SCTP_ChunkParser, logger.debug('registered SCTP chunk parser: %s', code.name) -# NOTE: pcapkit.protocols.transport.sctp.SCTP.__parameter__ +# NOTE: pcapkit.protocols.transport.sctp.protocol.SCTP.__parameter__ def register_sctp_parameter(code: 'SCTP_Parameter', meth: 'str | tuple[SCTP_ParameterParser, SCTP_ParameterConstructor]', *, schema: 'Optional[Type[Schema_SCTP_Parameter]]' = None) -> 'None': """Register a chunk parameter parser. The function will register the given chunk parameter parser to the - :data:`pcapkit.protocols.transport.sctp.SCTP.__parameter__` registry. + :data:`pcapkit.protocols.transport.sctp.protocol.SCTP.__parameter__` registry. Args: - code: :class:`~pcapkit.protocols.transport.sctp.SCTP` chunk parameter type + code: :class:`~pcapkit.protocols.transport.sctp.protocol.SCTP` chunk parameter type as in :class:`~pcapkit.const.sctp.parameter.Parameter`. meth: Method name, or a ``(parser, constructor)`` pair of callables, to parse and construct the parameter. A name names the ``_read_param_*`` and ``_make_param_*`` methods, and has to name an existing ``_read_param_*`` one. - schema: :class:`~pcapkit.protocols.schema.schema.Schema` class for the parameter. - It should be a subclass of :class:`pcapkit.protocols.schema.transport.sctp.Parameter`. + schema: :class:`~pcapkit.protocols.schema.Schema` class for the parameter. + It should be a subclass of :class:`pcapkit.protocols.transport.sctp.schema.Parameter`. Raises: RegistryError: If ``code`` is not a :class:`~pcapkit.const.sctp.parameter.Parameter` @@ -567,23 +570,23 @@ def register_sctp_parameter(code: 'SCTP_Parameter', logger.debug('registered SCTP chunk parameter parser: %s', code.name) -# NOTE: pcapkit.protocols.transport.sctp.SCTP.__cause__ +# NOTE: pcapkit.protocols.transport.sctp.protocol.SCTP.__cause__ def register_sctp_cause(code: 'SCTP_CauseCode', meth: 'str | tuple[SCTP_CauseParser, SCTP_CauseConstructor]', *, schema: 'Optional[Type[Schema_SCTP_ErrorCause]]' = None) -> 'None': """Register an error cause parser. The function will register the given error cause parser to the - :data:`pcapkit.protocols.transport.sctp.SCTP.__cause__` registry. + :data:`pcapkit.protocols.transport.sctp.protocol.SCTP.__cause__` registry. Args: - code: :class:`~pcapkit.protocols.transport.sctp.SCTP` error cause code as + code: :class:`~pcapkit.protocols.transport.sctp.protocol.SCTP` error cause code as in :class:`~pcapkit.const.sctp.cause_code.CauseCode`. meth: Method name, or a ``(parser, constructor)`` pair of callables, to parse and construct the cause. A name names the ``_read_cause_*`` and ``_make_cause_*`` methods, and has to name an existing ``_read_cause_*`` one. - schema: :class:`~pcapkit.protocols.schema.schema.Schema` class for the cause. - It should be a subclass of :class:`pcapkit.protocols.schema.transport.sctp.ErrorCause`. + schema: :class:`~pcapkit.protocols.schema.Schema` class for the cause. + It should be a subclass of :class:`pcapkit.protocols.transport.sctp.schema.ErrorCause`. Raises: RegistryError: If ``code`` is not a :class:`~pcapkit.const.sctp.cause_code.CauseCode` @@ -609,7 +612,7 @@ def register_dccp(code: 'int | Enum_AppType', module: 'ModuleDescriptor[Protocol def register_dccp(code: 'int | Enum_AppType', module: 'str', class_: 'str') -> 'None': ... -# NOTE: pcapkit.protocols.transport.dccp.DCCP.__proto__ +# NOTE: pcapkit.protocols.transport.dccp.protocol.DCCP.__proto__ def register_dccp(code: 'int | Enum_AppType', module: 'str | ModuleDescriptor[ProtocolBase] | Type[ProtocolBase]', class_: 'str | NullType' = NULL) -> 'None': r"""Register a new protocol class. @@ -619,7 +622,7 @@ def register_dccp(code: 'int | Enum_AppType', module: 'str | ModuleDescriptor[Pr should be ``{module}.{class_}``. The function will register the given protocol class to the - :data:`pcapkit.protocols.transport.dccp.DCCP.__proto__` registry. + :data:`pcapkit.protocols.transport.dccp.protocol.DCCP.__proto__` registry. Arguments: code: port number @@ -651,23 +654,23 @@ def register_dccp(code: 'int | Enum_AppType', module: 'str | ModuleDescriptor[Pr _register_name(module, (DCCP, code)) -# NOTE: pcapkit.protocols.transport.dccp.DCCP.__option__ +# NOTE: pcapkit.protocols.transport.dccp.protocol.DCCP.__option__ def register_dccp_option(code: 'DCCP_Option', meth: 'str | tuple[DCCP_OptionParser, DCCP_OptionConstructor]', *, schema: 'Optional[Type[Schema_DCCP_Option]]' = None) -> 'None': """Register an option parser. The function will register the given option parser to the - :data:`pcapkit.protocols.transport.dccp.DCCP.__option__` registry. + :data:`pcapkit.protocols.transport.dccp.protocol.DCCP.__option__` registry. Args: - code: :class:`~pcapkit.protocols.transport.dccp.DCCP` option type as in + code: :class:`~pcapkit.protocols.transport.dccp.protocol.DCCP` option type as in :class:`~pcapkit.const.dccp.option.Option`. meth: Method name, or a ``(parser, constructor)`` pair of callables, to parse and construct the option. A name names the ``_read_opt_*`` and ``_make_opt_*`` methods, and has to name an existing ``_read_opt_*`` one. - schema: :class:`~pcapkit.protocols.schema.schema.Schema` class for the option. - It should be a subclass of :class:`pcapkit.protocols.schema.transport.dccp.Option`. + schema: :class:`~pcapkit.protocols.schema.Schema` class for the option. + It should be a subclass of :class:`pcapkit.protocols.transport.dccp.schema.Option`. Raises: RegistryError: If ``code`` is not a :class:`~pcapkit.const.dccp.option.Option` diff --git a/pcapkit/foundation/traceflow/data/data.py b/pcapkit/foundation/traceflow/data/data.py index 94d19c2c62..f8363e0821 100644 --- a/pcapkit/foundation/traceflow/data/data.py +++ b/pcapkit/foundation/traceflow/data/data.py @@ -14,7 +14,7 @@ from pcapkit.foundation.reassembly.data.tcp import Datagram as TCP_Datagram from pcapkit.foundation.reassembly.tcp import TCP as TCP_Reassembly from pcapkit.foundation.traceflow.data.tcp import Index as TCP_Index - from pcapkit.protocols.data.misc.pcap.frame import FrameInfo as Data_FrameInfo + from pcapkit.protocols.misc.pcap.frame.data import FrameInfo as Data_FrameInfo class Deferred: @@ -37,7 +37,7 @@ class Deferred: reassembly and flow tracing subpackages are siblings, and the flow tracer reaches the reassembler only lazily, when ``analyse`` asks for one, so the few lines are written in each rather than one importing the other -- the - same reason their ``data/data.py`` modules mirror each other instead of + same reason their ``data.py`` modules mirror each other instead of merging. Args: diff --git a/pcapkit/foundation/traceflow/data/tcp.py b/pcapkit/foundation/traceflow/data/tcp.py index 72d96fd7e6..54f14fe734 100644 --- a/pcapkit/foundation/traceflow/data/tcp.py +++ b/pcapkit/foundation/traceflow/data/tcp.py @@ -21,7 +21,7 @@ from pcapkit.foundation.reassembly.data.tcp import Datagram as TCP_Datagram from pcapkit.foundation.reassembly.tcp import TCP as TCP_Reassembly from pcapkit.foundation.traceflow.data.data import FrameRecord - from pcapkit.protocols.data.misc.pcap.frame import Frame as Data_Frame + from pcapkit.protocols.misc.pcap.frame.data import Frame as Data_Frame _AT = TypeVar('_AT', 'IPv4Address', 'IPv6Address') diff --git a/pcapkit/foundation/traceflow/tcp.py b/pcapkit/foundation/traceflow/tcp.py index 50e366ea52..c7a8d34543 100644 --- a/pcapkit/foundation/traceflow/tcp.py +++ b/pcapkit/foundation/traceflow/tcp.py @@ -14,7 +14,7 @@ from pcapkit.foundation.traceflow.data.data import Deferred from pcapkit.foundation.traceflow.data.tcp import _AT, Buffer, BufferID, Index, Packet from pcapkit.foundation.traceflow.traceflow import TraceFlowBase -from pcapkit.protocols.transport.tcp import TCP as TCP_Protocol +from pcapkit.protocols.transport.tcp.protocol import TCP as TCP_Protocol from pcapkit.utilities.logging import get_logger __all__ = ['TCP'] diff --git a/pcapkit/foundation/traceflow/traceflow.py b/pcapkit/foundation/traceflow/traceflow.py index f433b159c0..ce839c5354 100644 --- a/pcapkit/foundation/traceflow/traceflow.py +++ b/pcapkit/foundation/traceflow/traceflow.py @@ -22,7 +22,7 @@ from pcapkit.corekit.module import ModuleDescriptor from pcapkit.dumpkit.common import make_dumper from pcapkit.protocols import __proto__ as protocol_registry -from pcapkit.protocols.misc.raw import Raw +from pcapkit.protocols.misc.raw.protocol import Raw from pcapkit.utilities.exceptions import FileExists, RegistryError, UnsupportedCall, stacklevel from pcapkit.utilities.logging import get_logger from pcapkit.utilities.warnings import FileWarning, FormatWarning, RegistryWarning, warn @@ -88,7 +88,7 @@ def registry(cls) -> 'dict[str, ModuleDescriptor[TraceFlowBase] | Type[TraceFlow Note: Unlike :attr:`EnumSchema.registry - `, this is not + `, this is not a per-class mapping: every flow tracing registration lands in the single :attr:`Extractor.__traceflow__ ` table, so @@ -565,7 +565,7 @@ def __init_subclass__(cls, /, protocol: 'Optional[str]' = None, *args: 'Any', ** ``protocol`` is given. This is what lets a subclass decline registration rather than having to inherit :class:`TraceFlowBase` to avoid it, and it matches :meth:`EnumSchema.__init_subclass__ - `, which + `, which guards on its own ``code`` keyword the same way. Note: diff --git a/pcapkit/interface/core.py b/pcapkit/interface/core.py index 967fec351d..f203a5fc8a 100644 --- a/pcapkit/interface/core.py +++ b/pcapkit/interface/core.py @@ -149,10 +149,10 @@ def extract(fin: 'Optional[str | IO[bytes]]' = None, fout: 'Optional[str]' = Non context: caller supplied parsing context for protocols that need information not carried on the wire, keyed by protocol index ID -- cf. :mod:`pcapkit.corekit.context`. The motivating case is - :class:`~pcapkit.protocols.internet.esp.ESP`, which needs the + :class:`~pcapkit.protocols.internet.esp.protocol.ESP`, which needs the Security Association to find the trailer and decrypt the payload:: - >>> from pcapkit.protocols.internet.esp import (Cipher, ESPContext, + >>> from pcapkit.protocols.internet.esp.protocol import (Cipher, ESPContext, ... SecurityAssociation) >>> sa = SecurityAssociation(spi=0x4321, encryption=Cipher.AES_CBC, ... encryption_key=key) diff --git a/pcapkit/protocols/__init__.py b/pcapkit/protocols/__init__.py index 8d6ffb4932..74a5bb82b7 100644 --- a/pcapkit/protocols/__init__.py +++ b/pcapkit/protocols/__init__.py @@ -25,11 +25,11 @@ # Protocol Data from pcapkit.protocols import data -from pcapkit.protocols.data.data import Data +from pcapkit.protocols.data import Data # Protocol Schema from pcapkit.protocols import schema -from pcapkit.protocols.schema.schema import Schema +from pcapkit.protocols.schema import Schema if TYPE_CHECKING: from typing import Type diff --git a/pcapkit/protocols/application/__init__.py b/pcapkit/protocols/application/__init__.py index 82256caaf8..e8ad98c21b 100644 --- a/pcapkit/protocols/application/__init__.py +++ b/pcapkit/protocols/application/__init__.py @@ -14,29 +14,29 @@ # SSH, TELNET, XMPP. # # NB: NGAP's decoder below is an optional -# dependency; see pcapkit.protocols.application.ngap. Importing the module +# dependency; see pcapkit.protocols.application.ngap.protocol. Importing the module # is free -- ``pycrate`` is imported inside the parse path, not here. # Base Class for Application Layer from pcapkit.protocols.application.application import Application # Utility Classes for Protocols -from pcapkit.protocols.application.ftp import FTP -from pcapkit.protocols.application.ftp_data import FTP_DATA -from pcapkit.protocols.application.httpv1 import HTTPv1 -from pcapkit.protocols.application.httpv2 import HTTPv2 -from pcapkit.protocols.application.ngap import NGAP -from pcapkit.protocols.application.ospf import OSPF -from pcapkit.protocols.application.rarp import RARP -from pcapkit.protocols.application.drarp import DRARP -from pcapkit.protocols.application.sslv2 import SSLv2 -from pcapkit.protocols.application.tls import TLS -from pcapkit.protocols.application.sslv3 import SSLv3 -from pcapkit.protocols.application.dtls import DTLS +from pcapkit.protocols.application.ftp.protocol import FTP +from pcapkit.protocols.application.ftp_data.protocol import FTP_DATA +from pcapkit.protocols.application.httpv1.protocol import HTTPv1 +from pcapkit.protocols.application.httpv2.protocol import HTTPv2 +from pcapkit.protocols.application.ngap.protocol import NGAP +from pcapkit.protocols.application.ospf.protocol import OSPF +from pcapkit.protocols.application.rarp.protocol import RARP +from pcapkit.protocols.application.drarp.protocol import DRARP +from pcapkit.protocols.application.sslv2.protocol import SSLv2 +from pcapkit.protocols.application.tls.protocol import TLS +from pcapkit.protocols.application.sslv3.protocol import SSLv3 +from pcapkit.protocols.application.dtls.protocol import DTLS # Base Classes -from pcapkit.protocols.application.http import HTTP -from pcapkit.protocols.application.ssl import SSL +from pcapkit.protocols.application.http.protocol import HTTP +from pcapkit.protocols.application.ssl.protocol import SSL # Application Layer Protocol Numbers from pcapkit.const.reg.apptype import AppType as APPTYPE diff --git a/pcapkit/protocols/application/application.py b/pcapkit/protocols/application/application.py index 48ed9e31fa..4198767627 100644 --- a/pcapkit/protocols/application/application.py +++ b/pcapkit/protocols/application/application.py @@ -7,8 +7,8 @@ :mod:`pcapkit.protocols.application.application` contains only :class:`~pcapkit.protocols.application.application.Application`, which is a base class for application layer protocols, e.g. -:class:`HTTP/1.* ` and -:class:`HTTP/2 `. +:class:`HTTP/1.* ` and +:class:`HTTP/2 `. .. versionchanged:: 1.5.0 @@ -24,7 +24,7 @@ from pcapkit.corekit.protochain import ProtoChain from pcapkit.corekit.schema.shortread import keep_short_read, replay_short_read -from pcapkit.protocols.misc.no_payload import NoPayload +from pcapkit.protocols.misc.no_payload.protocol import NoPayload from pcapkit.protocols.protocol import _PT, _ST, ProtocolBase from pcapkit.utilities.exceptions import IntError, UnsupportedCall @@ -43,13 +43,13 @@ class Application(ProtocolBase[_PT, _ST], Generic[_PT, _ST]): # pylint: disable :meth:`_decode_next_layer` and :meth:`_import_next_layer` refuse to dispatch on a protocol number. What they do permit is the ``-1`` sentinel, which asks for the rest of the packet undissected and resolves to - :class:`~pcapkit.protocols.misc.raw.Raw` -- trailing bytes are not a further + :class:`~pcapkit.protocols.misc.raw.protocol.Raw` -- trailing bytes are not a further protocol layer, unless the subclass dissects them, as - :class:`~pcapkit.protocols.application.tls.TLS`, - :class:`~pcapkit.protocols.application.sslv2.SSLv2` and - :class:`~pcapkit.protocols.application.dtls.DTLS` do for a further record and - :class:`~pcapkit.protocols.application.httpv2.HTTPv2` for a further frame -- - or to :class:`~pcapkit.protocols.misc.no_payload.NoPayload` when nothing remains. + :class:`~pcapkit.protocols.application.tls.protocol.TLS`, + :class:`~pcapkit.protocols.application.sslv2.protocol.SSLv2` and + :class:`~pcapkit.protocols.application.dtls.protocol.DTLS` do for a further record and + :class:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2` for a further frame -- + or to :class:`~pcapkit.protocols.misc.no_payload.protocol.NoPayload` when nothing remains. """ @@ -124,7 +124,7 @@ def __post_init__(self, file: 'Optional[IO[bytes] | bytes]' = None, # ``_decode_next_layer``, which already set the payload and the chain # (basis included); only a protocol that did not gets the empty default if getattr(self, '_next', None) is None: - #: pcapkit.protocols.misc.no_payload.NoPayload: Payload of current instance. + #: pcapkit.protocols.misc.no_payload.protocol.NoPayload: Payload of current instance. self._next = NoPayload() #: pcapkit.corekit.protochain.ProtoChain: Protocol chain of current instance. self._protos = ProtoChain(self.__class__, self.alias) @@ -178,8 +178,8 @@ def _import_next_layer(self, proto: 'int', length: 'Optional[int]' = None, *, # packet: packet info (passed from :meth:`self.unpack `) Returns: - Instance of :class:`~pcapkit.protocols.misc.raw.Raw`, or of - :class:`~pcapkit.protocols.misc.no_payload.NoPayload` when nothing remains. + Instance of :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, or of + :class:`~pcapkit.protocols.misc.no_payload.protocol.NoPayload` when nothing remains. Raises: UnsupportedCall: If ``proto`` is anything but ``-1``, i.e. a real diff --git a/pcapkit/protocols/application/drarp/__init__.py b/pcapkit/protocols/application/drarp/__init__.py new file mode 100644 index 0000000000..44fb253c80 --- /dev/null +++ b/pcapkit/protocols/application/drarp/__init__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +"""DRARP - Dynamic Reverse Address Resolution Protocol +========================================================= + +.. module:: pcapkit.protocols.application.drarp + +:mod:`pcapkit.protocols.application.drarp` holds the dissector, +:class:`~pcapkit.protocols.application.drarp.protocol.DRARP`, in +:mod:`~pcapkit.protocols.application.drarp.protocol`. + +""" +from pcapkit.protocols.application.drarp.protocol import DRARP + +__all__ = ['DRARP'] diff --git a/pcapkit/protocols/application/drarp.py b/pcapkit/protocols/application/drarp/protocol.py similarity index 64% rename from pcapkit/protocols/application/drarp.py rename to pcapkit/protocols/application/drarp/protocol.py index 6330e7b930..554c402fdf 100644 --- a/pcapkit/protocols/application/drarp.py +++ b/pcapkit/protocols/application/drarp/protocol.py @@ -2,32 +2,32 @@ """DRARP - Dynamic Reverse Address Resolution Protocol ========================================================= -.. module:: pcapkit.protocols.application.drarp +.. module:: pcapkit.protocols.application.drarp.protocol -:mod:`pcapkit.protocols.application.drarp` contains -:class:`~pcapkit.protocols.application.drarp.DRARP` only, +:mod:`pcapkit.protocols.application.drarp.protocol` contains +:class:`~pcapkit.protocols.application.drarp.protocol.DRARP` only, which implements an extractor for Dynamic Reverse Address Resolution Protocol (DRARP) [*]_, whose frame is the one -:mod:`pcapkit.protocols.application.rarp` describes. +:mod:`pcapkit.protocols.application.rarp.protocol` describes. -Nothing dispatches to :class:`~pcapkit.protocols.application.drarp.DRARP`: +Nothing dispatches to :class:`~pcapkit.protocols.application.drarp.protocol.DRARP`: under EtherType ``0x8035``, a DRARP operation parses as -:class:`~pcapkit.protocols.application.rarp.RARP` with alias ``DRARP``. +:class:`~pcapkit.protocols.application.rarp.protocol.RARP` with alias ``DRARP``. .. [*] https://datatracker.ietf.org/doc/html/rfc1931 .. versionadded:: 1.6.0 - Moved here from :mod:`pcapkit.protocols.application.rarp`, which keeps - :class:`~pcapkit.protocols.application.rarp.RARP` alone, since a module + Moved here from :mod:`pcapkit.protocols.application.rarp.protocol`, which keeps + :class:`~pcapkit.protocols.application.rarp.protocol.RARP` alone, since a module holds one protocol class, named after it (:issue:`2529`). """ from typing import TYPE_CHECKING -from pcapkit.protocols.application.rarp import RARP -from pcapkit.protocols.data.link.arp import ARP as Data_ARP -from pcapkit.protocols.schema.link.arp import ARP as Schema_ARP +from pcapkit.protocols.application.rarp.protocol import RARP +from pcapkit.protocols.link.arp.data import ARP as Data_ARP +from pcapkit.protocols.link.arp.schema import ARP as Schema_ARP if TYPE_CHECKING: from typing_extensions import Literal diff --git a/pcapkit/protocols/application/dtls/__init__.py b/pcapkit/protocols/application/dtls/__init__.py new file mode 100644 index 0000000000..1520e56fab --- /dev/null +++ b/pcapkit/protocols/application/dtls/__init__.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""DTLS - Datagram Transport Layer Security +============================================== + +.. module:: pcapkit.protocols.application.dtls + +:mod:`pcapkit.protocols.application.dtls` holds the dissector, +:class:`~pcapkit.protocols.application.dtls.protocol.DTLS`, in +:mod:`~pcapkit.protocols.application.dtls.protocol`, its header schema in +:mod:`~pcapkit.protocols.application.dtls.schema` and its data model in +:mod:`~pcapkit.protocols.application.dtls.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.application.dtls.protocol import DTLS + +# Header Schemas +from pcapkit.protocols.application.dtls.schema import DTLS as Schema_DTLS +from pcapkit.protocols.application.dtls.schema import DTLSCIDCiphertext as Schema_DTLSCIDCiphertext +from pcapkit.protocols.application.dtls.schema import DTLSCiphertext as Schema_DTLSCiphertext + +# Data Models +from pcapkit.protocols.application.dtls.data import DTLS as Data_DTLS +from pcapkit.protocols.application.dtls.data import DTLSCIDCiphertext as Data_DTLSCIDCiphertext +from pcapkit.protocols.application.dtls.data import DTLSCiphertext as Data_DTLSCiphertext +from pcapkit.protocols.application.dtls.data import DTLSHandshake as Data_DTLSHandshake + +__all__ = ['DTLS'] diff --git a/pcapkit/protocols/data/application/dtls.py b/pcapkit/protocols/application/dtls/data.py similarity index 89% rename from pcapkit/protocols/data/application/dtls.py rename to pcapkit/protocols/application/dtls/data.py index ca0c6ec93b..408b7ae89b 100644 --- a/pcapkit/protocols/data/application/dtls.py +++ b/pcapkit/protocols/application/dtls/data.py @@ -4,15 +4,15 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.application.tls import Handshake -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.application.ssl.data import Handshake +from pcapkit.protocols.data import Protocol if TYPE_CHECKING: from typing import Any, Optional, Union from pcapkit.const.tls.content_type import ContentType as Enum_ContentType from pcapkit.const.tls.handshake_type import HandshakeType as Enum_HandshakeType - from pcapkit.protocols.data.application.tls import ClientHello, EncryptedExtensions, ServerHello + from pcapkit.protocols.application.ssl.data import ClientHello, EncryptedExtensions, ServerHello __all__ = [ 'DTLS', @@ -29,13 +29,13 @@ class DTLSHandshake(Handshake): DTLS adds a fragment header -- ``message_seq``, ``fragment_offset`` and ``fragment_length`` -- on top of the TLS handshake header shared with - :class:`~pcapkit.protocols.data.application.tls.Handshake` + :class:`~pcapkit.protocols.application.ssl.data.Handshake` (:rfc:`6347#section-4.2.2`), so that a handshake message that does not fit in one datagram can be split across several. - :attr:`body` decodes to a :class:`~pcapkit.protocols.data.application.tls.ClientHello`, - :class:`~pcapkit.protocols.data.application.tls.ServerHello` or - :class:`~pcapkit.protocols.data.application.tls.EncryptedExtensions` when + :attr:`body` decodes to a :class:`~pcapkit.protocols.application.ssl.data.ClientHello`, + :class:`~pcapkit.protocols.application.ssl.data.ServerHello` or + :class:`~pcapkit.protocols.application.ssl.data.EncryptedExtensions` when :attr:`is_fragmented` is :data:`False`. A fragmented message's :attr:`body` is the fragment's raw octets; :func:`~pcapkit.foundation.analysis.dtls.dtls_handshake` decodes the @@ -80,11 +80,11 @@ class DTLS(Protocol): length: 'int' #: Decoded record content. For ``handshake``, ``alert``, and #: ``change_cipher_spec``, this is a tuple of :class:`DTLSHandshake`, an - #: :class:`~pcapkit.protocols.data.application.tls.Alert`, or a - #: :class:`~pcapkit.protocols.data.application.tls.ChangeCipherSpec` + #: :class:`~pcapkit.protocols.application.ssl.data.Alert`, or a + #: :class:`~pcapkit.protocols.application.ssl.data.ChangeCipherSpec` #: respectively *only when the record is cleartext*, i.e. ``epoch == 0`` #: (as decided by :meth:`SSL._tls_content_is_cleartext - #: `) -- + #: `) -- #: an encrypted record of any of those three types, which is any record #: at a later epoch, stays raw :obj:`bytes` instead, same as every other #: content type. diff --git a/pcapkit/protocols/application/dtls.py b/pcapkit/protocols/application/dtls/protocol.py similarity index 95% rename from pcapkit/protocols/application/dtls.py rename to pcapkit/protocols/application/dtls/protocol.py index 10c4e25be4..7c546e49f5 100644 --- a/pcapkit/protocols/application/dtls.py +++ b/pcapkit/protocols/application/dtls/protocol.py @@ -2,17 +2,17 @@ """DTLS - Datagram Transport Layer Security ============================================== -.. module:: pcapkit.protocols.application.dtls +.. module:: pcapkit.protocols.application.dtls.protocol -:mod:`pcapkit.protocols.application.dtls` contains -:class:`~pcapkit.protocols.application.dtls.DTLS`, which implements an +:mod:`pcapkit.protocols.application.dtls.protocol` contains +:class:`~pcapkit.protocols.application.dtls.protocol.DTLS`, which implements an extractor for the DTLS record-layer family -- DTLS 1.0 (:rfc:`4347`), DTLS 1.2 (:rfc:`6347`) and its connection-ID records (:rfc:`9146`), and DTLS 1.3's legacy-format and unified-header records (:rfc:`9147`) -- and -:class:`~pcapkit.protocols.application.dtls.DTLSContext`, which holds the +:class:`~pcapkit.protocols.application.dtls.protocol.DTLSContext`, which holds the connection IDs those records carry. -:attr:`UDP.__proto__ ` -binds it at port 5684. As with :class:`~pcapkit.protocols.application.tls.TLS`, +:attr:`UDP.__proto__ ` +binds it at port 5684. As with :class:`~pcapkit.protocols.application.tls.protocol.TLS`, :meth:`~DTLS.read` sets :attr:`~DTLS.alias` from the record's legacy version, or to ``DTLS 1.3`` for a unified-header record. @@ -31,7 +31,7 @@ :rfc:`9147#section-9.1`), and that the record's ID begins with; * the ``cid_length`` the caller gives :class:`DTLSContext`. -Without either the record stays :class:`~pcapkit.protocols.misc.raw.Raw`. +Without either the record stays :class:`~pcapkit.protocols.misc.raw.protocol.Raw`. A dissected one reports its connection ID alongside its other header fields, and keeps its encrypted content as octets. The context reaches DTLS through :mod:`pcapkit.corekit.context`: @@ -39,7 +39,7 @@ .. code-block:: python import pcapkit - from pcapkit.protocols.application.dtls import DTLSContext + from pcapkit.protocols.application.dtls.protocol import DTLSContext extraction = pcapkit.extract('dtls.pcap', context=DTLSContext(cid_length=8)) @@ -53,7 +53,7 @@ A rebuild parses each layer's octets again, so ``from_data`` takes the same ``__context__``. Without it the octets still rebuild exactly, and ``DTLS.from_data`` keeps its chain, but a record with a connection ID under a -rebuilt UDP layer reads as :class:`~pcapkit.protocols.misc.raw.Raw`. +rebuilt UDP layer reads as :class:`~pcapkit.protocols.misc.raw.protocol.Raw`. Records in One Datagram ----------------------- @@ -66,7 +66,7 @@ the last (:rfc:`9147#section-4`). The exceptions: * A whole record that fails to decode becomes - :class:`~pcapkit.protocols.misc.raw.Raw` together with everything after it. + :class:`~pcapkit.protocols.misc.raw.protocol.Raw` together with everything after it. * Octets that open no whole record stay raw, with no error: an unsupported content type, a legacy version outside ``0xFExx``, a header cut short, a length past the end of the datagram, or a connection ID whose length is @@ -82,7 +82,7 @@ **A handshake message split across DTLS records is not decoded here** (:rfc:`6347#section-4.2.3`, :issue:`2440`). Each fragment's body stays raw octets, flagged -:attr:`~pcapkit.protocols.data.application.dtls.DTLSHandshake.is_fragmented`. +:attr:`~pcapkit.protocols.application.dtls.data.DTLSHandshake.is_fragmented`. ``Extractor(reassembly=True, dtls=True)`` reassembles the message (:class:`~pcapkit.foundation.reassembly.dtls.DTLS`), and :func:`~pcapkit.foundation.analysis.dtls.dtls_handshake` decodes it with @@ -109,16 +109,16 @@ from pcapkit.const.tls.extension_type import ExtensionType as Enum_ExtensionType from pcapkit.corekit.context import ProtocolContext from pcapkit.corekit.decorators import beholder -from pcapkit.protocols.application.ssl import (_DTLS_VERSION_MAJOR, _WIRE_CONTENT_TYPES, - DTLS13_VERSION, SSL) -from pcapkit.protocols.data.application.dtls import DTLS as Data_DTLS -from pcapkit.protocols.data.application.dtls import DTLSCIDCiphertext as Data_DTLSCIDCiphertext -from pcapkit.protocols.data.application.dtls import DTLSCiphertext as Data_DTLSCiphertext -from pcapkit.protocols.data.application.dtls import DTLSHandshake as Data_DTLSHandshake -from pcapkit.protocols.data.application.tls import ConnectionId as Data_ConnectionId -from pcapkit.protocols.schema.application.dtls import DTLS as Schema_DTLS -from pcapkit.protocols.schema.application.dtls import DTLSCIDCiphertext as Schema_DTLSCIDCiphertext -from pcapkit.protocols.schema.application.dtls import DTLSCiphertext as Schema_DTLSCiphertext +from pcapkit.protocols.application.dtls.data import DTLS as Data_DTLS +from pcapkit.protocols.application.dtls.data import DTLSCIDCiphertext as Data_DTLSCIDCiphertext +from pcapkit.protocols.application.dtls.data import DTLSCiphertext as Data_DTLSCiphertext +from pcapkit.protocols.application.dtls.data import DTLSHandshake as Data_DTLSHandshake +from pcapkit.protocols.application.dtls.schema import DTLS as Schema_DTLS +from pcapkit.protocols.application.dtls.schema import DTLSCIDCiphertext as Schema_DTLSCIDCiphertext +from pcapkit.protocols.application.dtls.schema import DTLSCiphertext as Schema_DTLSCiphertext +from pcapkit.protocols.application.ssl.data import ConnectionId as Data_ConnectionId +from pcapkit.protocols.application.ssl.protocol import (_DTLS_VERSION_MAJOR, _WIRE_CONTENT_TYPES, + DTLS13_VERSION, SSL) from pcapkit.utilities.exceptions import CaughtByCaller, ProtocolError if TYPE_CHECKING: @@ -128,7 +128,7 @@ from pcapkit.const.tls.handshake_type import HandshakeType as Enum_HandshakeType from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema __all__ = ['DTLS', 'DTLSContext'] @@ -248,7 +248,7 @@ def _opens_whole_record(data: 'bytes', context: 'Optional[DTLSContext]') -> 'boo Only the record header is read. A legacy header gets the checks of :meth:`SSL._validate_tls_record - `: a content + `: a content type a genuine record carries, a ``0xFExx`` legacy version, and a fragment that ends inside ``data``. A ``tls12_cid`` header needs DTLS 1.2's version and a connection ID ``context`` knows the length of. A unified header needs @@ -426,7 +426,7 @@ class DTLS(SSL[Data_DTLS, Schema_DTLS], schema=Schema_DTLS, data=Data_DTLS): Note: The subpackage does not track the dispatch tier: DTLS is dispatched - from :attr:`UDP.__proto__ ` + from :attr:`UDP.__proto__ ` at port 5684 (``coaps``, :rfc:`7252`) only, though IANA registers other DTLS-borne services; bind more with :func:`pcapkit.foundation.registry.protocols.transport.register_udp`. @@ -476,7 +476,7 @@ def id(cls) -> 'tuple[Literal["DTLS"]]': # type: ignore[override] Returns: Index ID of the protocol. Fixed, regardless of which tier :meth:`read` identifies the record as -- see - :meth:`TLS.id ` for why. + :meth:`TLS.id ` for why. """ return ('DTLS',) @@ -523,10 +523,10 @@ def make(self, sequence_number: Sequence number within ``epoch`` (48-bit); for a unified-header record, 8 or 16 bits as ``sequence_long`` says. content: Record content: a :obj:`tuple` of - :class:`~pcapkit.protocols.data.application.dtls.DTLSHandshake` + :class:`~pcapkit.protocols.application.dtls.data.DTLSHandshake` for ``handshake``, an - :class:`~pcapkit.protocols.data.application.tls.Alert`, a - :class:`~pcapkit.protocols.data.application.tls.ChangeCipherSpec`, + :class:`~pcapkit.protocols.application.ssl.data.Alert`, a + :class:`~pcapkit.protocols.application.ssl.data.ChangeCipherSpec`, or raw :obj:`bytes`, as :meth:`read` would decode it. For a unified-header or ``tls12_cid`` record, the ciphertext as :obj:`bytes`. @@ -629,9 +629,9 @@ def unpack(self, length: 'Optional[int]' = None, **kwargs: 'Any') -> 'Data_DTLS """Unpack (parse) packet data, with the header schema its first octet selects. A unified-header record (:rfc:`9147#section-4.1`) is parsed by - :class:`~pcapkit.protocols.schema.application.dtls.DTLSCiphertext`, + :class:`~pcapkit.protocols.application.dtls.schema.DTLSCiphertext`, and a ``tls12_cid`` one (:rfc:`9146#section-4`) by - :class:`~pcapkit.protocols.schema.application.dtls.DTLSCIDCiphertext`, + :class:`~pcapkit.protocols.application.dtls.schema.DTLSCIDCiphertext`, rather than the legacy header; every other record uses the inherited behaviour. Either schema reads a connection ID with the length :class:`DTLSContext` finds. @@ -762,7 +762,7 @@ def __index__(cls) -> 'int': # type: ignore[override] port numbers: UDP port 5684, the port of :attr:`UDP.coaps ` as an :class:`int`, which - :attr:`UDP.__proto__ ` + :attr:`UDP.__proto__ ` dispatches here (:ref:`registry-protocol-index`). .. _IANA: https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml @@ -842,7 +842,7 @@ def _read_dtls_record(self, length: 'Optional[int]' = None, **kwargs: 'Any') -> The legacy version names the tier, except that DTLS 1.3 reuses ``0xFEFD`` (or ``0xFEFF`` on an initial ``ClientHello``) and is found by peeking ``supported_versions`` (:meth:`SSL._tls_negotiates - `). An unknown + `). An unknown ``0xFExx`` keeps the generic ``'DTLS'`` alias. Args: @@ -1077,7 +1077,7 @@ def _import_next_layer(self, proto: 'int', length: 'Optional[int]' = None, *, # A UDP datagram may carry several records (:rfc:`9147#section-4.3`, :issue:`2535`). So the ``-1`` remainder is dissected as this class when :func:`_opens_whole_record` finds a whole record opening it, and is - otherwise kept as :class:`~pcapkit.protocols.misc.raw.Raw`, as + otherwise kept as :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, as :meth:`Application._import_next_layer ` keeps it. @@ -1111,7 +1111,7 @@ def _import_next_record(self, proto: 'int', length: 'Optional[int]' = None, *, packet: packet info (passed from :meth:`self.unpack `) Returns: - Instance of this class, or of :class:`~pcapkit.protocols.misc.raw.Raw` + Instance of this class, or of :class:`~pcapkit.protocols.misc.raw.protocol.Raw` when :func:`~pcapkit.corekit.decorators.beholder` replaces a record that fails to parse. diff --git a/pcapkit/protocols/schema/application/dtls.py b/pcapkit/protocols/application/dtls/schema.py similarity index 96% rename from pcapkit/protocols/schema/application/dtls.py rename to pcapkit/protocols/application/dtls/schema.py index fba5012f90..d1042444d8 100644 --- a/pcapkit/protocols/schema/application/dtls.py +++ b/pcapkit/protocols/application/dtls/schema.py @@ -8,7 +8,7 @@ from pcapkit.corekit.fields.misc import ConditionalField, PayloadField, SwitchField from pcapkit.corekit.fields.numbers import EnumField, NumberField, UInt8Field, UInt16Field from pcapkit.corekit.fields.strings import BitField, BytesField -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final __all__ = ['DTLS', 'DTLSCiphertext', 'DTLSCIDCiphertext'] @@ -24,7 +24,7 @@ class DTLS(Schema): Same :class:`ContentType `, legacy-version and length fields as :class:`TLS - `'s record header, with the + `'s record header, with the explicit ``epoch``/``sequence_number`` pair DTLS inserts between the version and the length (:rfc:`9147#section-4`) -- the divergence a reliable TLS stream never needs, since DTLS runs over an unreliable, @@ -62,7 +62,7 @@ class DTLSCiphertext(Schema): connection ID, ``S`` an 8- or 16-bit sequence number, ``L`` a length field, and ``EE`` the low two bits of the epoch. The record has no content type or version octet, since both are inside the ciphertext, so - :class:`DTLS `'s legacy + :class:`DTLS `'s legacy header cannot describe it. The record does not carry its connection ID's length @@ -119,7 +119,7 @@ def __init__(self, flags: 'dict[str, int]', cid: 'bytes | None', sequence_number class DTLSCIDCiphertext(Schema): """Header schema for a DTLS 1.2 record with a connection ID (:rfc:`9146#section-4`). - :class:`DTLS `'s legacy + :class:`DTLS `'s legacy header with ``cid`` between the sequence number and the length. The record does not carry the CID's length, so the parser gives it as the ``__cid_length__`` key of the packet context; packing takes it from ``cid``. diff --git a/pcapkit/protocols/application/ftp/__init__.py b/pcapkit/protocols/application/ftp/__init__.py new file mode 100644 index 0000000000..04f7adc5dc --- /dev/null +++ b/pcapkit/protocols/application/ftp/__init__.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""FTP - File Transfer Protocol +================================== + +.. module:: pcapkit.protocols.application.ftp + +:mod:`pcapkit.protocols.application.ftp` holds the dissector, +:class:`~pcapkit.protocols.application.ftp.protocol.FTP`, in +:mod:`~pcapkit.protocols.application.ftp.protocol`, its header schema in +:mod:`~pcapkit.protocols.application.ftp.schema` and its data model in +:mod:`~pcapkit.protocols.application.ftp.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.application.ftp.protocol import FTP + +# Header Schemas +from pcapkit.protocols.application.ftp.schema import FTP as Schema_FTP + +# Data Models +from pcapkit.protocols.application.ftp.data import FTP as Data_FTP +from pcapkit.protocols.application.ftp.data import Request as Data_Request +from pcapkit.protocols.application.ftp.data import Response as Data_Response + +__all__ = ['FTP'] diff --git a/pcapkit/protocols/data/application/ftp.py b/pcapkit/protocols/application/ftp/data.py similarity index 94% rename from pcapkit/protocols/data/application/ftp.py rename to pcapkit/protocols/application/ftp/data.py index 5381a4906a..40ebf016cc 100644 --- a/pcapkit/protocols/data/application/ftp.py +++ b/pcapkit/protocols/application/ftp/data.py @@ -5,7 +5,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Protocol if TYPE_CHECKING: from typing import Optional @@ -14,7 +14,7 @@ from pcapkit.const.ftp.command import Command from pcapkit.const.ftp.return_code import ReturnCode - from pcapkit.protocols.application.ftp import Type as FTP_Type + from pcapkit.protocols.application.ftp.protocol import Type as FTP_Type __all__ = [ 'FTP', diff --git a/pcapkit/protocols/application/ftp.py b/pcapkit/protocols/application/ftp/protocol.py similarity index 96% rename from pcapkit/protocols/application/ftp.py rename to pcapkit/protocols/application/ftp/protocol.py index 6dfb55a20c..415d2f3feb 100644 --- a/pcapkit/protocols/application/ftp.py +++ b/pcapkit/protocols/application/ftp/protocol.py @@ -2,14 +2,14 @@ """FTP - File Transfer Protocol ================================== -.. module:: pcapkit.protocols.application.ftp +.. module:: pcapkit.protocols.application.ftp.protocol -:mod:`pcapkit.protocols.application.ftp` contains -:class:`~pcapkit.protocols.application.ftp.FTP`, +:mod:`pcapkit.protocols.application.ftp.protocol` contains +:class:`~pcapkit.protocols.application.ftp.protocol.FTP`, which implements an extractor for File Transfer Protocol (FTP) [*]_, the control channel; the data channel is -:class:`~pcapkit.protocols.application.ftp_data.FTP_DATA`, in -:mod:`pcapkit.protocols.application.ftp_data`. +:class:`~pcapkit.protocols.application.ftp_data.protocol.FTP_DATA`, in +:mod:`pcapkit.protocols.application.ftp_data.protocol`. .. [*] https://en.wikipedia.org/wiki/File_Transfer_Protocol @@ -24,7 +24,7 @@ .. versionremoved:: 1.5.0 ``pcapkit.protocols.application.ftp.FTP_DATA``, with no alias. The class - moved to :mod:`pcapkit.protocols.application.ftp_data`, since TCP port 20 + moved to :mod:`pcapkit.protocols.application.ftp_data.protocol`, since TCP port 20 dispatches it and port 21 the control channel -- two protocols, so two modules (:issue:`2285`). @@ -36,10 +36,10 @@ from pcapkit.const.ftp.return_code import ReturnCode as Enum_ReturnCode from pcapkit.corekit.enum import EnumLookup from pcapkit.protocols.application.application import Application -from pcapkit.protocols.data.application.ftp import FTP as Data_FTP -from pcapkit.protocols.data.application.ftp import Request as Data_Request -from pcapkit.protocols.data.application.ftp import Response as Data_Response -from pcapkit.protocols.schema.application.ftp import FTP as Schema_FTP +from pcapkit.protocols.application.ftp.data import FTP as Data_FTP +from pcapkit.protocols.application.ftp.data import Request as Data_Request +from pcapkit.protocols.application.ftp.data import Response as Data_Response +from pcapkit.protocols.application.ftp.schema import FTP as Schema_FTP from pcapkit.utilities.chardet import detect from pcapkit.utilities.compat import StrEnum, auto from pcapkit.utilities.exceptions import ProtocolError, UnsupportedCall @@ -279,7 +279,7 @@ def __index__(cls) -> 'int': # type: ignore[override] port numbers: TCP port 21, the port of :attr:`TCP.ftp ` as an :class:`int`, which - :attr:`TCP.__proto__ ` + :attr:`TCP.__proto__ ` dispatches here (:ref:`registry-protocol-index`). .. _IANA: https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml diff --git a/pcapkit/protocols/schema/application/ftp.py b/pcapkit/protocols/application/ftp/schema.py similarity index 87% rename from pcapkit/protocols/schema/application/ftp.py rename to pcapkit/protocols/application/ftp/schema.py index 890adad7ba..d4829be79a 100644 --- a/pcapkit/protocols/schema/application/ftp.py +++ b/pcapkit/protocols/application/ftp/schema.py @@ -5,7 +5,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.fields.strings import BytesField -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final __all__ = ['FTP'] diff --git a/pcapkit/protocols/application/ftp_data/__init__.py b/pcapkit/protocols/application/ftp_data/__init__.py new file mode 100644 index 0000000000..0792b04d1a --- /dev/null +++ b/pcapkit/protocols/application/ftp_data/__init__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +"""FTP_DATA - FTP Data Channel +================================= + +.. module:: pcapkit.protocols.application.ftp_data + +:mod:`pcapkit.protocols.application.ftp_data` holds the dissector, +:class:`~pcapkit.protocols.application.ftp_data.protocol.FTP_DATA`, in +:mod:`~pcapkit.protocols.application.ftp_data.protocol`. + +""" +from pcapkit.protocols.application.ftp_data.protocol import FTP_DATA + +__all__ = ['FTP_DATA'] diff --git a/pcapkit/protocols/application/ftp_data.py b/pcapkit/protocols/application/ftp_data/protocol.py similarity index 83% rename from pcapkit/protocols/application/ftp_data.py rename to pcapkit/protocols/application/ftp_data/protocol.py index e654c90b19..12dbe6b9bb 100644 --- a/pcapkit/protocols/application/ftp_data.py +++ b/pcapkit/protocols/application/ftp_data/protocol.py @@ -2,10 +2,10 @@ """FTP_DATA - FTP Data Channel ================================= -.. module:: pcapkit.protocols.application.ftp_data +.. module:: pcapkit.protocols.application.ftp_data.protocol -:mod:`pcapkit.protocols.application.ftp_data` contains -:class:`~pcapkit.protocols.application.ftp_data.FTP_DATA` only, +:mod:`pcapkit.protocols.application.ftp_data.protocol` contains +:class:`~pcapkit.protocols.application.ftp_data.protocol.FTP_DATA` only, which implements an extractor for the data channel of File Transfer Protocol (FTP) [*]_, whose octets it keeps undissected. @@ -13,8 +13,8 @@ .. versionadded:: 1.5.0 - Moved here from :mod:`pcapkit.protocols.application.ftp`, which keeps - :class:`~pcapkit.protocols.application.ftp.FTP` alone. The control and data + Moved here from :mod:`pcapkit.protocols.application.ftp.protocol`, which keeps + :class:`~pcapkit.protocols.application.ftp.protocol.FTP` alone. The control and data channels are dispatched separately -- FTP at TCP port 21, the data channel at port 20 -- so each is a protocol of its own and gets its own module (:issue:`2285`). @@ -23,7 +23,7 @@ from typing import TYPE_CHECKING from pcapkit.protocols.application.application import Application -from pcapkit.protocols.misc.raw import Raw +from pcapkit.protocols.misc.raw.protocol import Raw if TYPE_CHECKING: from typing_extensions import Literal @@ -36,13 +36,13 @@ class FTP_DATA(Application, Raw): # pylint: disable=abstract-method The layer base :class:`~pcapkit.protocols.application.application.Application` comes first, for ``layer == 'Application'``, then the parsing base - :class:`~pcapkit.protocols.misc.raw.Raw`, which keeps the channel's octets + :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, which keeps the channel's octets undissected. See :doc:`/contributing/conventions/protocol-layer-placement`. .. versionchanged:: 1.5.0 Derives from :class:`~pcapkit.protocols.application.application.Application` - as well as :class:`~pcapkit.protocols.misc.raw.Raw`, so its layer is + as well as :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, so its layer is ``'Application'``, where it was :obj:`None`, and its ``__index__`` became :meth:`Application.__index__ `, @@ -74,7 +74,7 @@ def __index__(cls) -> 'int': # type: ignore[override] port numbers: TCP port 20, the port of :attr:`TCP.ftp_data ` as an :class:`int`, which - :attr:`TCP.__proto__ ` + :attr:`TCP.__proto__ ` dispatches here (:ref:`registry-protocol-index`). .. _IANA: https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml diff --git a/pcapkit/protocols/application/http/__init__.py b/pcapkit/protocols/application/http/__init__.py new file mode 100644 index 0000000000..fcd1d66b8a --- /dev/null +++ b/pcapkit/protocols/application/http/__init__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +"""HTTP - Hypertext Transfer Protocol +======================================== + +.. module:: pcapkit.protocols.application.http + +:mod:`pcapkit.protocols.application.http` holds the dissector, +:class:`~pcapkit.protocols.application.http.protocol.HTTP`, in +:mod:`~pcapkit.protocols.application.http.protocol`. + +""" +from pcapkit.protocols.application.http.protocol import HTTP + +__all__ = ['HTTP'] diff --git a/pcapkit/protocols/application/http.py b/pcapkit/protocols/application/http/protocol.py similarity index 88% rename from pcapkit/protocols/application/http.py rename to pcapkit/protocols/application/http/protocol.py index b46b3fcf4e..be3dfda11c 100644 --- a/pcapkit/protocols/application/http.py +++ b/pcapkit/protocols/application/http/protocol.py @@ -2,15 +2,15 @@ """HTTP - Hypertext Transfer Protocol ======================================== -.. module:: pcapkit.protocols.application.http +.. module:: pcapkit.protocols.application.http.protocol -:mod:`pcapkit.protocols.application.http` contains -:class:`~pcapkit.protocols.application.http.HTTP`, +:mod:`pcapkit.protocols.application.http.protocol` contains +:class:`~pcapkit.protocols.application.http.protocol.HTTP`, which is a base class for Hypertext Transfer Protocol (HTTP) [*]_ family, e.g. -:class:`HTTP/1.* ` -and :class:`HTTP/2 `, -and :func:`~pcapkit.protocols.application.http.test_start_line`, +:class:`HTTP/1.* ` +and :class:`HTTP/2 `, +and :func:`~pcapkit.protocols.application.http.protocol.test_start_line`, which tells whether a payload opens with an HTTP/1.* start line. .. [*] https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol @@ -18,14 +18,14 @@ .. versionchanged:: 1.6.0 A payload a transport port binds to - :class:`~pcapkit.protocols.application.http.HTTP`, and constructing or + :class:`~pcapkit.protocols.application.http.protocol.HTTP`, and constructing or rebuilding that class, give - :class:`~pcapkit.protocols.application.httpv1.HTTPv1` or - :class:`~pcapkit.protocols.application.httpv2.HTTPv2` rather than an instance + :class:`~pcapkit.protocols.application.httpv1.protocol.HTTPv1` or + :class:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2` rather than an instance of it, so the data sits under ``httpv1`` or ``httpv2`` rather than ``http`` (:issue:`2524`). Building it from fields takes ``version`` and is refused without it, where it built HTTP/1.*, and its - :meth:`~pcapkit.protocols.application.http.HTTP.from_data` refuses a + :meth:`~pcapkit.protocols.application.http.protocol.HTTP.from_data` refuses a :obj:`dict`, where it read the ``receipt`` or ``sid`` key (:issue:`2628`). """ @@ -36,7 +36,7 @@ from pcapkit.corekit.protochain import ProtoChain from pcapkit.protocols.application.application import Application -from pcapkit.protocols.misc.no_payload import NoPayload +from pcapkit.protocols.misc.no_payload.protocol import NoPayload from pcapkit.protocols.protocol import _PT, _ST from pcapkit.utilities.exceptions import ProtocolError @@ -83,7 +83,7 @@ def _test_http2_frame(data: 'bytes') -> 'bool': """Test whether ``data`` opens with a frame header a conforming sender could write. This is a plausibility test for :meth:`HTTP._guess_version`'s fall-through - only. :class:`httpv2.HTTPv2 ` itself parses every frame + only. :class:`httpv2.HTTPv2 ` itself parses every frame :rfc:`9113` lets a receiver accept, which includes frames this test turns down. Args: @@ -152,7 +152,7 @@ def test_start_line(data: 'bytes') -> 'bool': This is a *classification* predicate and parses nothing: it answers "is this HTTP/1?" for :meth:`HTTP._guess_version - `. Classifying by + `. Classifying by trial-parsing every version in the family would decide a payload that is not HTTP at all by which parser happened to fail less loudly. @@ -166,11 +166,11 @@ def test_start_line(data: 'bytes') -> 'bool': Note: The acceptance rule is deliberately the *same* one :meth:`HTTP._read_http_header - ` applies + ` applies -- ``_RE_METHOD`` with ``_RE_VERSION`` for a request, ``_RE_VERSION`` with ``_RE_STATUS`` for a response -- which is why those patterns are defined beside this predicate and - :mod:`~pcapkit.protocols.application.httpv1` imports them from here. The + :mod:`~pcapkit.protocols.application.httpv1.protocol` imports them from here. The two must accept the same start lines: a predicate looser than the parser classifies payloads the parser then refuses, and one tighter than the parser hands real HTTP/1 to a later arm. @@ -184,7 +184,7 @@ def test_start_line(data: 'bytes') -> 'bool': HTTP/1.1 *request line* (:rfc:`9113#section-3.4`), so a predicate that tested only the first line would answer :data:`True` for it. Split at the header/body separator first, as :meth:`HTTP.read - ` does, and the preface's + ` does, and the preface's header is exactly ``PRI * HTTP/2.0`` (``_HTTP2_PREFACE_HEADER``), which the parser refuses by name and so does this. Any *other* header with no CRLF in it is a start line with zero field lines, which @@ -221,8 +221,8 @@ class HTTP(Application[_PT, _ST], Generic[_PT, _ST]): It dispatches on both paths: constructing it, from octets or from fields, and :meth:`from_data` give - :class:`~pcapkit.protocols.application.httpv1.HTTPv1` or - :class:`~pcapkit.protocols.application.httpv2.HTTPv2`, never an instance of + :class:`~pcapkit.protocols.application.httpv1.protocol.HTTPv1` or + :class:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2`, never an instance of this class (:issue:`2524`). ``version`` names the member; without it, octets give the one :meth:`_dispatch_version` identifies, and fields are refused, since no field picks a member (:issue:`2574`). :meth:`from_data` gives the @@ -248,8 +248,8 @@ class HTTP(Application[_PT, _ST], Generic[_PT, _ST]): #: This class is a version dispatcher rather than a protocol with a header of #: its own, so its construction keywords cannot be enumerated: :meth:`make` #: declares only ``version`` and forwards everything else to - #: :meth:`HTTPv1.make ` or - #: :meth:`HTTPv2.make ` + #: :meth:`HTTPv1.make ` or + #: :meth:`HTTPv2.make ` #: according to that value, so the correct set of names depends on an #: argument. :obj:`None` therefore opts out of the construction keyword check #: that :meth:`Protocol.__init__ @@ -290,7 +290,7 @@ def id(cls) -> 'tuple[Literal["HTTP/1"], Literal["HTTP/2"]]': """Index ID of the protocol. The family base lists its members' names alone, as - :meth:`IP.id() ` does: ``HTTP/1`` + :meth:`IP.id() ` does: ``HTTP/1`` for :rfc:`9112`'s HTTP/1.1 and the versions before it, and :rfc:`9113`'s ``HTTP/2``. A dispatched layer is the member :meth:`_dispatch_version` picks, so each name selects its own version, and the ``HTTP`` key @@ -336,9 +336,9 @@ def read(self, length: 'Optional[int]' = None, *, http = self._guess_version(length, **kwargs) else: if version == 1: - from pcapkit.protocols.application.httpv1 import HTTPv1 as protocol # isort: skip # pylint: disable=line-too-long,import-outside-toplevel + from pcapkit.protocols.application.httpv1.protocol import HTTPv1 as protocol # isort: skip # pylint: disable=line-too-long,import-outside-toplevel elif version == 2: - from pcapkit.protocols.application.httpv2 import HTTPv2 as protocol # type: ignore[assignment] # isort: skip # pylint: disable=line-too-long,import-outside-toplevel + from pcapkit.protocols.application.httpv2.protocol import HTTPv2 as protocol # type: ignore[assignment] # isort: skip # pylint: disable=line-too-long,import-outside-toplevel else: raise ProtocolError(f'HTTP: invalid version: {version!r}') @@ -451,10 +451,10 @@ def from_data(cls, data: '_PT | dict[str, Any]', **kwargs: 'Any') -> 'Self': if cls is not HTTP: return super().from_data(data, **kwargs) - from pcapkit.protocols.application.httpv1 import HTTPv1 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel - from pcapkit.protocols.application.httpv2 import HTTPv2 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel - from pcapkit.protocols.data.application.httpv1 import HTTPv1 as Data_HTTPv1 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel - from pcapkit.protocols.data.application.httpv2 import HTTPv2 as Data_HTTPv2 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel + from pcapkit.protocols.application.httpv1.protocol import HTTPv1 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel + from pcapkit.protocols.application.httpv2.protocol import HTTPv2 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel + from pcapkit.protocols.application.httpv1.data import HTTPv1 as Data_HTTPv1 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel + from pcapkit.protocols.application.httpv2.data import HTTPv2 as Data_HTTPv2 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel if isinstance(data, Data_HTTPv1): return cast('Self', HTTPv1.from_data(data, **kwargs)) @@ -475,9 +475,9 @@ def __index__(cls) -> 'int': # type: ignore[override] port numbers: TCP port 80, the port of :attr:`TCP.http ` as an :class:`int`, which - :attr:`TCP.__proto__ ` + :attr:`TCP.__proto__ ` dispatches here, as it does port 8080 and as - :attr:`UDP.__proto__ ` + :attr:`UDP.__proto__ ` does both (:ref:`registry-protocol-index`). The versioned classes inherit it. @@ -519,8 +519,8 @@ def __init__(self, file: 'Optional[IO[bytes] | bytes]' = None, if version is not None: kwargs['version'] = version else: - from pcapkit.protocols.application.httpv1 import HTTPv1 # isort: skip # pylint: disable=import-outside-toplevel - from pcapkit.protocols.application.httpv2 import HTTPv2 # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.application.httpv1.protocol import HTTPv1 # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.application.httpv2.protocol import HTTPv2 # isort: skip # pylint: disable=import-outside-toplevel if version is not None and not isinstance(self, self._member_of_version(version)): if not isinstance(self, (HTTPv1, HTTPv2)): @@ -571,7 +571,7 @@ def __new__(cls, file: 'Optional[IO[bytes] | bytes]' = None, # type: ignore[mis offset = file.tell() data = file.read(length) # type: ignore[arg-type] file.seek(offset) - from pcapkit.protocols.misc.raw import Raw # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.misc.raw.protocol import Raw # isort: skip # pylint: disable=import-outside-toplevel data = data[:length] member = cls._dispatch_version(data, len(data)) @@ -604,10 +604,10 @@ def _make_data(cls, data: '_PT') -> 'dict[str, Any]': # type: ignore[override] # HTTP/1.*'s lives in ``receipt`` as the start line's string, and HTTP/2 # has none -- so the version is the class of ``data`` that :meth:`read` # returned from the versioned parser. - from pcapkit.protocols.application.httpv1 import HTTPv1 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel - from pcapkit.protocols.application.httpv2 import HTTPv2 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel - from pcapkit.protocols.data.application.httpv1 import HTTPv1 as Data_HTTPv1 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel - from pcapkit.protocols.data.application.httpv2 import HTTPv2 as Data_HTTPv2 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel + from pcapkit.protocols.application.httpv1.protocol import HTTPv1 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel + from pcapkit.protocols.application.httpv2.protocol import HTTPv2 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel + from pcapkit.protocols.application.httpv1.data import HTTPv1 as Data_HTTPv1 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel + from pcapkit.protocols.application.httpv2.data import HTTPv2 as Data_HTTPv2 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel if isinstance(data, Data_HTTPv1): return {'version': 1, **HTTPv1._make_data(data)} @@ -673,7 +673,7 @@ def _guess_version(self, length: 'int', **kwargs: 'Any') -> 'HTTP': * **A mid-stream segment** -- a bare HTTP/2 frame header with no preface ahead of it, or an opaque HTTP/1 message body -- is genuinely undecidable from one payload, and the honest answer is - the :class:`~pcapkit.protocols.misc.raw.Raw` that an escaping + the :class:`~pcapkit.protocols.misc.raw.protocol.Raw` that an escaping :exc:`~pcapkit.utilities.exceptions.ProtocolError` becomes under :func:`~pcapkit.corekit.decorators.beholder`. The nine-octet frame header is therefore never used to *identify* HTTP/2 ahead of HTTP/1: as identification it misfires on @@ -696,7 +696,7 @@ def _guess_version(self, length: 'int', **kwargs: 'Any') -> 'HTTP': # preface must not be claimed out of octets outside this payload. preface_len = len(_HTTP2_PREFACE) if self._test_preface(length): - from pcapkit.protocols.application.httpv2 import HTTPv2 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel + from pcapkit.protocols.application.httpv2.protocol import HTTPv2 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel # The preface is not a frame -- the frames begin after it # (:rfc:`9113#section-3.4` requires a ``SETTINGS`` frame immediately @@ -733,7 +733,7 @@ def _guess_version(self, length: 'int', **kwargs: 'Any') -> 'HTTP': self._preface_length = preface_len return http - from pcapkit.protocols.application.httpv1 import HTTPv1 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel + from pcapkit.protocols.application.httpv1.protocol import HTTPv1 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel # NOTE: The second identification: an HTTP/1 ``request-line`` or # ``status-line``, tested with the very patterns ``httpv1.HTTPv1`` parses @@ -799,7 +799,7 @@ def _guess_version(self, length: 'int', **kwargs: 'Any') -> 'HTTP': if not _test_http2_frame(self._data[:length]): raise ProtocolError('HTTP: unknown version') - from pcapkit.protocols.application.httpv2 import HTTPv2 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel + from pcapkit.protocols.application.httpv2.protocol import HTTPv2 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel with contextlib.suppress(ProtocolError, struct.error): return HTTPv2(self._data, length, **kwargs) @@ -814,12 +814,12 @@ def _dispatch_version(cls, data: 'bytes', length: 'int') -> 'Type[ProtocolBase]' frame header a conforming sender could write, is HTTP/2, and an HTTP/1 start line is HTTP/1. A transport layer whose port binds this class parses its payload with the class this returns, so a dispatched layer - is :class:`~pcapkit.protocols.application.httpv1.HTTPv1` or - :class:`~pcapkit.protocols.application.httpv2.HTTPv2`, never this base + is :class:`~pcapkit.protocols.application.httpv1.protocol.HTTPv1` or + :class:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2`, never this base (:issue:`2524`). It is the counterpart of :meth:`IGMP._dispatch - `, named apart from it + `, named apart from it because, in the transport layer, ``_dispatch`` names :meth:`AppType._dispatch `, the port @@ -830,27 +830,27 @@ def _dispatch_version(cls, data: 'bytes', length: 'int') -> 'Type[ProtocolBase]' length: The HTTP message's length, in octets. Returns: - :class:`~pcapkit.protocols.application.httpv1.HTTPv1` or - :class:`~pcapkit.protocols.application.httpv2.HTTPv2` for the version - the payload identifies as; :class:`~pcapkit.protocols.misc.raw.Raw` + :class:`~pcapkit.protocols.application.httpv1.protocol.HTTPv1` or + :class:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2` for the version + the payload identifies as; :class:`~pcapkit.protocols.misc.raw.protocol.Raw` for one it does not, which then keeps its octets undissected. Note: A connection preface with no frame after it is HTTP/2, and can be real traffic, since a client may send the preface and its ``SETTINGS`` frame in separate segments. It is - :class:`~pcapkit.protocols.misc.raw.Raw` here, because the HTTP/2 + :class:`~pcapkit.protocols.misc.raw.protocol.Raw` here, because the HTTP/2 data model holds one frame per packet: the frame header's Length, Type, Flags and Stream Identifier are required fields of - :class:`~pcapkit.protocols.data.application.httpv2.HTTPv2`, so a + :class:`~pcapkit.protocols.application.httpv2.data.HTTPv2`, so a frameless segment has no form in it, and - :class:`~pcapkit.protocols.application.httpv2.HTTPv2` refuses one. + :class:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2` refuses one. So this does not pick that class for it, and the two agree. """ - from pcapkit.protocols.application.httpv1 import HTTPv1 # isort: skip # pylint: disable=import-outside-toplevel - from pcapkit.protocols.application.httpv2 import HTTPv2 # isort: skip # pylint: disable=import-outside-toplevel - from pcapkit.protocols.misc.raw import Raw # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.application.httpv1.protocol import HTTPv1 # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.application.httpv2.protocol import HTTPv2 # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.misc.raw.protocol import Raw # isort: skip # pylint: disable=import-outside-toplevel data = data[:length] if data.startswith(_HTTP2_PREFACE): @@ -869,16 +869,16 @@ def _member_of_version(version: 'Any') -> 'Type[HTTP]': version: Version of HTTP. Returns: - :class:`~pcapkit.protocols.application.httpv1.HTTPv1` or - :class:`~pcapkit.protocols.application.httpv2.HTTPv2`. + :class:`~pcapkit.protocols.application.httpv1.protocol.HTTPv1` or + :class:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2`. Raises: ProtocolError: If ``version`` is neither, or is no :obj:`int`: a :obj:`bool` or a :obj:`float` is refused even where it equals one. """ - from pcapkit.protocols.application.httpv1 import HTTPv1 # isort: skip # pylint: disable=import-outside-toplevel - from pcapkit.protocols.application.httpv2 import HTTPv2 # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.application.httpv1.protocol import HTTPv1 # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.application.httpv2.protocol import HTTPv2 # isort: skip # pylint: disable=import-outside-toplevel if isinstance(version, int) and not isinstance(version, bool): if version == 1: diff --git a/pcapkit/protocols/application/httpv1/__init__.py b/pcapkit/protocols/application/httpv1/__init__.py new file mode 100644 index 0000000000..5a5e3a625c --- /dev/null +++ b/pcapkit/protocols/application/httpv1/__init__.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""httpv1 +============ + +.. module:: pcapkit.protocols.application.httpv1 + +:mod:`pcapkit.protocols.application.httpv1` holds the dissector, +:class:`~pcapkit.protocols.application.httpv1.protocol.HTTPv1`, in +:mod:`~pcapkit.protocols.application.httpv1.protocol`, its header schema in +:mod:`~pcapkit.protocols.application.httpv1.schema` and its data model in +:mod:`~pcapkit.protocols.application.httpv1.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.application.httpv1.protocol import HTTPv1 + +# Header Schemas +from pcapkit.protocols.application.httpv1.schema import HTTPv1 as Schema_HTTPv1 + +# Data Models +from pcapkit.protocols.application.httpv1.data import Header as Data_Header +from pcapkit.protocols.application.httpv1.data import HTTPv1 as Data_HTTPv1 +from pcapkit.protocols.application.httpv1.data import RequestHeader as Data_RequestHeader +from pcapkit.protocols.application.httpv1.data import ResponseHeader as Data_ResponseHeader + +__all__ = ['HTTPv1'] diff --git a/pcapkit/protocols/data/application/httpv1.py b/pcapkit/protocols/application/httpv1/data.py similarity index 92% rename from pcapkit/protocols/data/application/httpv1.py rename to pcapkit/protocols/application/httpv1/data.py index 4061e6fe68..69b3b4af82 100644 --- a/pcapkit/protocols/data/application/httpv1.py +++ b/pcapkit/protocols/application/httpv1/data.py @@ -4,7 +4,7 @@ .. versionremoved:: 1.6.0 ``pcapkit.protocols.data.application.httpv1.HTTP``, with no alias. The - class is renamed :class:`~pcapkit.protocols.data.application.httpv1.HTTPv1`, + class is renamed :class:`~pcapkit.protocols.application.httpv1.data.HTTPv1`, after its module (:issue:`2529`). """ @@ -12,8 +12,7 @@ class is renamed :class:`~pcapkit.protocols.data.application.httpv1.HTTPv1`, from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.data import Data -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Data, Protocol if TYPE_CHECKING: from typing import Any, Optional @@ -22,7 +21,7 @@ class is renamed :class:`~pcapkit.protocols.data.application.httpv1.HTTPv1`, from pcapkit.const.http.status_code import StatusCode as Enum_StatusCode from pcapkit.corekit.infoclass import OrderedMultiInfo from pcapkit.corekit.multidict import OrderedMultiDict - from pcapkit.protocols.application.httpv1 import Type as HTTP_Type + from pcapkit.protocols.application.httpv1.protocol import Type as HTTP_Type __all__ = [ 'HTTPv1', diff --git a/pcapkit/protocols/application/httpv1.py b/pcapkit/protocols/application/httpv1/protocol.py similarity index 96% rename from pcapkit/protocols/application/httpv1.py rename to pcapkit/protocols/application/httpv1/protocol.py index 25ca29c663..10df343830 100644 --- a/pcapkit/protocols/application/httpv1.py +++ b/pcapkit/protocols/application/httpv1/protocol.py @@ -2,13 +2,13 @@ r"""HTTP/1.* - Hypertext Transfer Protocol ============================================ -.. module:: pcapkit.protocols.application.httpv1 +.. module:: pcapkit.protocols.application.httpv1.protocol -:mod:`pcapkit.protocols.application.httpv1` contains -:class:`~pcapkit.protocols.application.httpv1.HTTPv1`, +:mod:`pcapkit.protocols.application.httpv1.protocol` contains +:class:`~pcapkit.protocols.application.httpv1.protocol.HTTPv1`, which implements an extractor for Hypertext Transfer Protocol (HTTP/1.*) [*]_, and its -:class:`~pcapkit.protocols.application.httpv1.Type` enumeration. The +:class:`~pcapkit.protocols.application.httpv1.protocol.Type` enumeration. The structure of an HTTP/1.* message is described as below: .. code-block:: text @@ -37,7 +37,7 @@ .. versionremoved:: 1.6.0 ``pcapkit.protocols.application.httpv1.HTTP``, with no alias. The - class is renamed :class:`~pcapkit.protocols.application.httpv1.HTTPv1`, + class is renamed :class:`~pcapkit.protocols.application.httpv1.protocol.HTTPv1`, after its module (:issue:`2529`). """ @@ -48,13 +48,13 @@ class is renamed :class:`~pcapkit.protocols.application.httpv1.HTTPv1`, from pcapkit.const.http.status_code import StatusCode as Enum_StatusCode from pcapkit.corekit.enum import EnumLookup from pcapkit.corekit.multidict import OrderedMultiDict -from pcapkit.protocols.application.http import (_HTTP2_PREFACE_HEADER, _RE_METHOD, _RE_STATUS, - _RE_VERSION) -from pcapkit.protocols.application.http import HTTP as HTTPBase -from pcapkit.protocols.data.application.httpv1 import HTTPv1 as Data_HTTP -from pcapkit.protocols.data.application.httpv1 import RequestHeader as Data_RequestHeader -from pcapkit.protocols.data.application.httpv1 import ResponseHeader as Data_ResponseHeader -from pcapkit.protocols.schema.application.httpv1 import HTTPv1 as Schema_HTTP +from pcapkit.protocols.application.http.protocol import (_HTTP2_PREFACE_HEADER, _RE_METHOD, + _RE_STATUS, _RE_VERSION) +from pcapkit.protocols.application.http.protocol import HTTP as HTTPBase +from pcapkit.protocols.application.httpv1.data import HTTPv1 as Data_HTTP +from pcapkit.protocols.application.httpv1.data import RequestHeader as Data_RequestHeader +from pcapkit.protocols.application.httpv1.data import ResponseHeader as Data_ResponseHeader +from pcapkit.protocols.application.httpv1.schema import HTTPv1 as Schema_HTTP from pcapkit.utilities.chardet import detect from pcapkit.utilities.compat import StrEnum, auto from pcapkit.utilities.exceptions import ProtocolError @@ -64,13 +64,13 @@ class is renamed :class:`~pcapkit.protocols.application.httpv1.HTTPv1`, from typing_extensions import Literal - from pcapkit.protocols.data.application.httpv1 import Header as Data_Header + from pcapkit.protocols.application.httpv1.data import Header as Data_Header __all__ = ['HTTPv1'] # NOTE: The start-line patterns ``_RE_METHOD``, ``_RE_VERSION`` and ``_RE_STATUS``, # and ``_HTTP2_PREFACE_HEADER``, are imported from ``http.py``, where -# :func:`~pcapkit.protocols.application.http.test_start_line` classifies with +# :func:`~pcapkit.protocols.application.http.protocol.test_start_line` classifies with # them; one copy keeps that predicate and this parser in agreement. diff --git a/pcapkit/protocols/schema/application/httpv1.py b/pcapkit/protocols/application/httpv1/schema.py similarity index 80% rename from pcapkit/protocols/schema/application/httpv1.py rename to pcapkit/protocols/application/httpv1/schema.py index 148b9bbbcb..dec6606167 100644 --- a/pcapkit/protocols/schema/application/httpv1.py +++ b/pcapkit/protocols/application/httpv1/schema.py @@ -5,7 +5,7 @@ .. versionremoved:: 1.6.0 ``pcapkit.protocols.schema.application.httpv1.HTTP``, with no alias. The - class is renamed :class:`~pcapkit.protocols.schema.application.httpv1.HTTPv1`, + class is renamed :class:`~pcapkit.protocols.application.httpv1.schema.HTTPv1`, after its module (:issue:`2529`). """ @@ -13,7 +13,7 @@ class is renamed :class:`~pcapkit.protocols.schema.application.httpv1.HTTPv1`, from typing import TYPE_CHECKING from pcapkit.corekit.fields.strings import BytesField -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final __all__ = ['HTTPv1'] diff --git a/pcapkit/protocols/application/httpv2/__init__.py b/pcapkit/protocols/application/httpv2/__init__.py new file mode 100644 index 0000000000..6a7d9a56b4 --- /dev/null +++ b/pcapkit/protocols/application/httpv2/__init__.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""HTTP/2 - Hypertext Transfer Protocol +========================================== + +.. module:: pcapkit.protocols.application.httpv2 + +:mod:`pcapkit.protocols.application.httpv2` holds the dissector, +:class:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2`, in +:mod:`~pcapkit.protocols.application.httpv2.protocol`, its header schema in +:mod:`~pcapkit.protocols.application.httpv2.schema` and its data model in +:mod:`~pcapkit.protocols.application.httpv2.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.application.httpv2.protocol import HTTPv2 + +# Header Schemas +from pcapkit.protocols.application.httpv2.schema import \ + ContinuationFrame as Schema_ContinuationFrame +from pcapkit.protocols.application.httpv2.schema import DataFrame as Schema_DataFrame +from pcapkit.protocols.application.httpv2.schema import FrameType as Schema_FrameType +from pcapkit.protocols.application.httpv2.schema import GoawayFrame as Schema_GoawayFrame +from pcapkit.protocols.application.httpv2.schema import HeadersFrame as Schema_HeadersFrame +from pcapkit.protocols.application.httpv2.schema import HTTPv2 as Schema_HTTPv2 +from pcapkit.protocols.application.httpv2.schema import PingFrame as Schema_PingFrame +from pcapkit.protocols.application.httpv2.schema import PriorityFrame as Schema_PriorityFrame +from pcapkit.protocols.application.httpv2.schema import PushPromiseFrame as Schema_PushPromiseFrame +from pcapkit.protocols.application.httpv2.schema import RSTStreamFrame as Schema_RSTStreamFrame +from pcapkit.protocols.application.httpv2.schema import SettingPair as Schema_SettingPair +from pcapkit.protocols.application.httpv2.schema import SettingsFrame as Schema_SettingsFrame +from pcapkit.protocols.application.httpv2.schema import UnassignedFrame as Schema_UnassignedFrame +from pcapkit.protocols.application.httpv2.schema import \ + WindowUpdateFrame as Schema_WindowUpdateFrame + +# Data Models +from pcapkit.protocols.application.httpv2.data import ContinuationFrame as Data_ContinuationFrame +from pcapkit.protocols.application.httpv2.data import \ + ContinuationFrameFlags as Data_ContinuationFrameFlags +from pcapkit.protocols.application.httpv2.data import DataFrame as Data_DataFrame +from pcapkit.protocols.application.httpv2.data import DataFrameFlags as Data_DataFrameFlags +from pcapkit.protocols.application.httpv2.data import Flags as Data_Flags +from pcapkit.protocols.application.httpv2.data import GoawayFrame as Data_GoawayFrame +from pcapkit.protocols.application.httpv2.data import HeadersFrame as Data_HeadersFrame +from pcapkit.protocols.application.httpv2.data import HeadersFrameFlags as Data_HeadersFrameFlags +from pcapkit.protocols.application.httpv2.data import HTTPv2 as Data_HTTPv2 +from pcapkit.protocols.application.httpv2.data import PingFrame as Data_PingFrame +from pcapkit.protocols.application.httpv2.data import PingFrameFlags as Data_PingFrameFlags +from pcapkit.protocols.application.httpv2.data import PriorityFrame as Data_PriorityFrame +from pcapkit.protocols.application.httpv2.data import PushPromiseFrame as Data_PushPromiseFrame +from pcapkit.protocols.application.httpv2.data import \ + PushPromiseFrameFlags as Data_PushPromiseFrameFlags +from pcapkit.protocols.application.httpv2.data import RSTStreamFrame as Data_RSTStreamFrame +from pcapkit.protocols.application.httpv2.data import Settings as Data_Settings +from pcapkit.protocols.application.httpv2.data import SettingsFrame as Data_SettingsFrame +from pcapkit.protocols.application.httpv2.data import SettingsFrameFlags as Data_SettingsFrameFlags +from pcapkit.protocols.application.httpv2.data import UnassignedFrame as Data_UnassignedFrame +from pcapkit.protocols.application.httpv2.data import WindowUpdateFrame as Data_WindowUpdateFrame + +__all__ = ['HTTPv2'] diff --git a/pcapkit/protocols/data/application/httpv2.py b/pcapkit/protocols/application/httpv2/data.py similarity index 98% rename from pcapkit/protocols/data/application/httpv2.py rename to pcapkit/protocols/application/httpv2/data.py index ae1105d1b0..e532a5d3ea 100644 --- a/pcapkit/protocols/data/application/httpv2.py +++ b/pcapkit/protocols/application/httpv2/data.py @@ -4,7 +4,7 @@ .. versionremoved:: 1.6.0 ``pcapkit.protocols.data.application.httpv2.HTTP``, with no alias. The - class is renamed :class:`~pcapkit.protocols.data.application.httpv2.HTTPv2`, + class is renamed :class:`~pcapkit.protocols.application.httpv2.data.HTTPv2`, after its module (:issue:`2529`). """ @@ -12,8 +12,7 @@ class is renamed :class:`~pcapkit.protocols.data.application.httpv2.HTTPv2`, from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import OrderedMultiInfo, info_final -from pcapkit.protocols.data.data import Data -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Data, Protocol if TYPE_CHECKING: from typing import Iterator @@ -21,7 +20,7 @@ class is renamed :class:`~pcapkit.protocols.data.application.httpv2.HTTPv2`, from pcapkit.const.http.error_code import ErrorCode from pcapkit.const.http.frame import Frame from pcapkit.const.http.setting import Setting - from pcapkit.protocols.schema.application.httpv2 import FrameType + from pcapkit.protocols.application.httpv2.schema import FrameType __all__ = [ 'HTTPv2', diff --git a/pcapkit/protocols/application/httpv2.py b/pcapkit/protocols/application/httpv2/protocol.py similarity index 92% rename from pcapkit/protocols/application/httpv2.py rename to pcapkit/protocols/application/httpv2/protocol.py index db5fe16517..42a5fbc91f 100644 --- a/pcapkit/protocols/application/httpv2.py +++ b/pcapkit/protocols/application/httpv2/protocol.py @@ -2,10 +2,10 @@ """HTTP/2 - Hypertext Transfer Protocol ========================================== -.. module:: pcapkit.protocols.application.httpv2 +.. module:: pcapkit.protocols.application.httpv2.protocol -:mod:`pcapkit.protocols.application.httpv2` contains -:class:`~pcapkit.protocols.application.httpv2.HTTPv2` +:mod:`pcapkit.protocols.application.httpv2.protocol` contains +:class:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2` only, which implements an extractor for Hypertext Transfer Protocol (HTTP/2) [*]_, whose structure is described as below: @@ -28,12 +28,12 @@ A whole frame after the first in a TCP segment is dissected as a further :class:`HTTPv2` layer, the previous frame's payload (:issue:`2536`), as -:class:`~pcapkit.protocols.application.tls.TLS` chains records: a ``SETTINGS`` +:class:`~pcapkit.protocols.application.tls.protocol.TLS` chains records: a ``SETTINGS`` frame followed by a ``WINDOW_UPDATE`` reads ``TCP:HTTP/2:HTTP/2``. The exceptions: * A whole frame that fails to decode becomes - :class:`~pcapkit.protocols.misc.raw.Raw` together with everything after it, + :class:`~pcapkit.protocols.misc.raw.protocol.Raw` together with everything after it, with the parser's ``error``. * A frame the segment ends inside, its header or its payload cut short, stays raw, with no error. @@ -56,7 +56,7 @@ .. versionremoved:: 1.6.0 ``pcapkit.protocols.application.httpv2.HTTP``, with no alias. The - class is renamed :class:`~pcapkit.protocols.application.httpv2.HTTPv2`, + class is renamed :class:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2`, after its module (:issue:`2529`). """ @@ -68,47 +68,47 @@ class is renamed :class:`~pcapkit.protocols.application.httpv2.HTTPv2`, from pcapkit.const.http.setting import Setting as Enum_Setting from pcapkit.corekit.decorators import beholder from pcapkit.corekit.multidict import MultiDict, OrderedMultiDict -from pcapkit.protocols.application.http import _HTTP2_PREFACE -from pcapkit.protocols.application.http import HTTP as HTTPBase -from pcapkit.protocols.data.application.httpv2 import ContinuationFrame as Data_ContinuationFrame -from pcapkit.protocols.data.application.httpv2 import \ +from pcapkit.protocols.application.http.protocol import _HTTP2_PREFACE +from pcapkit.protocols.application.http.protocol import HTTP as HTTPBase +from pcapkit.protocols.application.httpv2.data import ContinuationFrame as Data_ContinuationFrame +from pcapkit.protocols.application.httpv2.data import \ ContinuationFrameFlags as Data_ContinuationFrameFlags -from pcapkit.protocols.data.application.httpv2 import DataFrame as Data_DataFrame -from pcapkit.protocols.data.application.httpv2 import DataFrameFlags as Data_DataFrameFlags -from pcapkit.protocols.data.application.httpv2 import Flags as Data_Flags -from pcapkit.protocols.data.application.httpv2 import GoawayFrame as Data_GoawayFrame -from pcapkit.protocols.data.application.httpv2 import HeadersFrame as Data_HeadersFrame -from pcapkit.protocols.data.application.httpv2 import HeadersFrameFlags as Data_HeadersFrameFlags -from pcapkit.protocols.data.application.httpv2 import HTTPv2 as Data_HTTP -from pcapkit.protocols.data.application.httpv2 import PingFrame as Data_PingFrame -from pcapkit.protocols.data.application.httpv2 import PingFrameFlags as Data_PingFrameFlags -from pcapkit.protocols.data.application.httpv2 import PriorityFrame as Data_PriorityFrame -from pcapkit.protocols.data.application.httpv2 import PushPromiseFrame as Data_PushPromiseFrame -from pcapkit.protocols.data.application.httpv2 import \ +from pcapkit.protocols.application.httpv2.data import DataFrame as Data_DataFrame +from pcapkit.protocols.application.httpv2.data import DataFrameFlags as Data_DataFrameFlags +from pcapkit.protocols.application.httpv2.data import Flags as Data_Flags +from pcapkit.protocols.application.httpv2.data import GoawayFrame as Data_GoawayFrame +from pcapkit.protocols.application.httpv2.data import HeadersFrame as Data_HeadersFrame +from pcapkit.protocols.application.httpv2.data import HeadersFrameFlags as Data_HeadersFrameFlags +from pcapkit.protocols.application.httpv2.data import HTTPv2 as Data_HTTP +from pcapkit.protocols.application.httpv2.data import PingFrame as Data_PingFrame +from pcapkit.protocols.application.httpv2.data import PingFrameFlags as Data_PingFrameFlags +from pcapkit.protocols.application.httpv2.data import PriorityFrame as Data_PriorityFrame +from pcapkit.protocols.application.httpv2.data import PushPromiseFrame as Data_PushPromiseFrame +from pcapkit.protocols.application.httpv2.data import \ PushPromiseFrameFlags as Data_PushPromiseFrameFlags -from pcapkit.protocols.data.application.httpv2 import RSTStreamFrame as Data_RSTStreamFrame -from pcapkit.protocols.data.application.httpv2 import Settings as Data_Settings -from pcapkit.protocols.data.application.httpv2 import SettingsFrame as Data_SettingsFrame -from pcapkit.protocols.data.application.httpv2 import SettingsFrameFlags as Data_SettingsFrameFlags -from pcapkit.protocols.data.application.httpv2 import UnassignedFrame as Data_UnassignedFrame -from pcapkit.protocols.data.application.httpv2 import WindowUpdateFrame as Data_WindowUpdateFrame -from pcapkit.protocols.schema.application.httpv2 import \ +from pcapkit.protocols.application.httpv2.data import RSTStreamFrame as Data_RSTStreamFrame +from pcapkit.protocols.application.httpv2.data import Settings as Data_Settings +from pcapkit.protocols.application.httpv2.data import SettingsFrame as Data_SettingsFrame +from pcapkit.protocols.application.httpv2.data import SettingsFrameFlags as Data_SettingsFrameFlags +from pcapkit.protocols.application.httpv2.data import UnassignedFrame as Data_UnassignedFrame +from pcapkit.protocols.application.httpv2.data import WindowUpdateFrame as Data_WindowUpdateFrame +from pcapkit.protocols.application.httpv2.schema import \ ContinuationFrame as Schema_ContinuationFrame -from pcapkit.protocols.schema.application.httpv2 import DataFrame as Schema_DataFrame -from pcapkit.protocols.schema.application.httpv2 import FrameType as Schema_FrameType -from pcapkit.protocols.schema.application.httpv2 import GoawayFrame as Schema_GoawayFrame -from pcapkit.protocols.schema.application.httpv2 import HeadersFrame as Schema_HeadersFrame -from pcapkit.protocols.schema.application.httpv2 import HTTPv2 as Schema_HTTP -from pcapkit.protocols.schema.application.httpv2 import PingFrame as Schema_PingFrame -from pcapkit.protocols.schema.application.httpv2 import PriorityFrame as Schema_PriorityFrame -from pcapkit.protocols.schema.application.httpv2 import PushPromiseFrame as Schema_PushPromiseFrame -from pcapkit.protocols.schema.application.httpv2 import RSTStreamFrame as Schema_RSTStreamFrame -from pcapkit.protocols.schema.application.httpv2 import SettingPair as Schema_SettingPair -from pcapkit.protocols.schema.application.httpv2 import SettingsFrame as Schema_SettingsFrame -from pcapkit.protocols.schema.application.httpv2 import UnassignedFrame as Schema_UnassignedFrame -from pcapkit.protocols.schema.application.httpv2 import \ +from pcapkit.protocols.application.httpv2.schema import DataFrame as Schema_DataFrame +from pcapkit.protocols.application.httpv2.schema import FrameType as Schema_FrameType +from pcapkit.protocols.application.httpv2.schema import GoawayFrame as Schema_GoawayFrame +from pcapkit.protocols.application.httpv2.schema import HeadersFrame as Schema_HeadersFrame +from pcapkit.protocols.application.httpv2.schema import HTTPv2 as Schema_HTTP +from pcapkit.protocols.application.httpv2.schema import PingFrame as Schema_PingFrame +from pcapkit.protocols.application.httpv2.schema import PriorityFrame as Schema_PriorityFrame +from pcapkit.protocols.application.httpv2.schema import PushPromiseFrame as Schema_PushPromiseFrame +from pcapkit.protocols.application.httpv2.schema import RSTStreamFrame as Schema_RSTStreamFrame +from pcapkit.protocols.application.httpv2.schema import SettingPair as Schema_SettingPair +from pcapkit.protocols.application.httpv2.schema import SettingsFrame as Schema_SettingsFrame +from pcapkit.protocols.application.httpv2.schema import UnassignedFrame as Schema_UnassignedFrame +from pcapkit.protocols.application.httpv2.schema import \ WindowUpdateFrame as Schema_WindowUpdateFrame -from pcapkit.protocols.schema.schema import Schema +from pcapkit.protocols.schema import Schema from pcapkit.utilities.exceptions import ProtocolError from pcapkit.utilities.warnings import ProtocolWarning, RegistryWarning, warn @@ -166,49 +166,49 @@ class HTTPv2(HTTPBase[Data_HTTP, Schema_HTTP], - Frame Parser - Frame Constructor * - :attr:`~pcapkit.const.http.frame.Frame.DATA` - - :meth:`~pcapkit.protocols.application.httpv2.HTTPv2._read_http_data` - - :meth:`~pcapkit.protocols.application.httpv2.HTTPv2._make_http_data` + - :meth:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2._read_http_data` + - :meth:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2._make_http_data` * - :attr:`~pcapkit.const.http.frame.Frame.HEADERS` - - :meth:`~pcapkit.protocols.application.httpv2.HTTPv2._read_http_headers` - - :meth:`~pcapkit.protocols.application.httpv2.HTTPv2._make_http_headers` + - :meth:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2._read_http_headers` + - :meth:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2._make_http_headers` * - :attr:`~pcapkit.const.http.frame.Frame.PRIORITY` - - :meth:`~pcapkit.protocols.application.httpv2.HTTPv2._read_http_priority` - - :meth:`~pcapkit.protocols.application.httpv2.HTTPv2._make_http_priority` + - :meth:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2._read_http_priority` + - :meth:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2._make_http_priority` * - :attr:`~pcapkit.const.http.frame.Frame.RST_STREAM` - - :meth:`~pcapkit.protocols.application.httpv2.HTTPv2._read_http_rst_stream` - - :meth:`~pcapkit.protocols.application.httpv2.HTTPv2._make_http_rst_stream` + - :meth:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2._read_http_rst_stream` + - :meth:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2._make_http_rst_stream` * - :attr:`~pcapkit.const.http.frame.Frame.SETTINGS` - - :meth:`~pcapkit.protocols.application.httpv2.HTTPv2._read_http_settings` - - :meth:`~pcapkit.protocols.application.httpv2.HTTPv2._make_http_settings` + - :meth:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2._read_http_settings` + - :meth:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2._make_http_settings` * - :attr:`~pcapkit.const.http.frame.Frame.PUSH_PROMISE` - - :meth:`~pcapkit.protocols.application.httpv2.HTTPv2._read_http_push_promise` - - :meth:`~pcapkit.protocols.application.httpv2.HTTPv2._make_http_push_promise` + - :meth:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2._read_http_push_promise` + - :meth:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2._make_http_push_promise` * - :attr:`~pcapkit.const.http.frame.Frame.PING` - - :meth:`~pcapkit.protocols.application.httpv2.HTTPv2._read_http_ping` - - :meth:`~pcapkit.protocols.application.httpv2.HTTPv2._make_http_ping` + - :meth:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2._read_http_ping` + - :meth:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2._make_http_ping` * - :attr:`~pcapkit.const.http.frame.Frame.GOAWAY` - - :meth:`~pcapkit.protocols.application.httpv2.HTTPv2._read_http_goaway` - - :meth:`~pcapkit.protocols.application.httpv2.HTTPv2._make_http_goaway` + - :meth:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2._read_http_goaway` + - :meth:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2._make_http_goaway` * - :attr:`~pcapkit.const.http.frame.Frame.WINDOW_UPDATE` - - :meth:`~pcapkit.protocols.application.httpv2.HTTPv2._read_http_window_update` - - :meth:`~pcapkit.protocols.application.httpv2.HTTPv2._make_http_window_update` + - :meth:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2._read_http_window_update` + - :meth:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2._make_http_window_update` * - :attr:`~pcapkit.const.http.frame.Frame.CONTINUATION` - - :meth:`~pcapkit.protocols.application.httpv2.HTTPv2._read_http_continuation` - - :meth:`~pcapkit.protocols.application.httpv2.HTTPv2._make_http_continuation` + - :meth:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2._read_http_continuation` + - :meth:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2._make_http_continuation` .. versionchanged:: 1.6.0 * A payload opening with the connection preface parses, with the preface kept as ``preface`` and counted in :attr:`length`, and :meth:`make` takes ``preface``, since a dispatched HTTP/2 payload reaches this class - rather than :class:`~pcapkit.protocols.application.http.HTTP` + rather than :class:`~pcapkit.protocols.application.http.protocol.HTTP` (:issue:`2524`). * A whole frame after the first in a segment is a further layer of this - class, where it was kept as :class:`~pcapkit.protocols.misc.raw.Raw` + class, where it was kept as :class:`~pcapkit.protocols.misc.raw.protocol.Raw` (:issue:`2536`). * A ``SETTINGS`` frame the capture cut inside its settings parses, with the settings past the data read as zeros, as a cut ``DATA`` frame's data is, - where it was :class:`~pcapkit.protocols.misc.raw.Raw` (:issue:`2659`, + where it was :class:`~pcapkit.protocols.misc.raw.protocol.Raw` (:issue:`2659`, :issue:`2686`). * Each enumeration field of :meth:`make` and of the frame makers takes a member or an :class:`int` code, resolved with the enumeration's @@ -293,7 +293,7 @@ def unpack(self, length: 'Optional[int]' = None, **kwargs: 'Any') -> 'Data_HTTP' Notes: This guards ahead of :meth:`Schema.unpack - ` rather than + ` rather than leaving the check to :meth:`read`, because a buffer shorter than the fixed 9-octet header cannot be parsed meaningfully. ``pkt['__length__']`` there is decremented by each field's @@ -312,7 +312,7 @@ def unpack(self, length: 'Optional[int]' = None, **kwargs: 'Any') -> 'Data_HTTP' included -- is what is forwarded to :meth:`Protocol.unpack `. Collapsing ``None`` to a concrete ``0`` would change what - :meth:`Schema.unpack `'s own + :meth:`Schema.unpack `'s own ``prepare`` decorator does with an exhausted stream: it raises :exc:`~pcapkit.utilities.exceptions.StreamEOFError` (an @@ -325,7 +325,7 @@ def unpack(self, length: 'Optional[int]' = None, **kwargs: 'Any') -> 'Data_HTTP' A payload opening with the HTTP/2 connection preface (:rfc:`9113#section-3.4`) has the frame parsed from the octets after it, as :meth:`HTTP._guess_version - ` parses it, + ` parses it, since a dispatched payload reaches this class rather than that one (:issue:`2524`); the preface counts towards :attr:`length`. A preface with no frame after it is refused, since the data model @@ -459,8 +459,8 @@ def make(self, # type: ignore[override] or code the 8-bit Type field cannot carry; or if ``frame`` is none of the forms this maker reads -- raw :obj:`bytes`, a :obj:`dict` of frame arguments, an - :class:`~pcapkit.protocols.data.application.httpv2.HTTPv2` data - model or a :class:`~pcapkit.protocols.schema.schema.Schema`. + :class:`~pcapkit.protocols.application.httpv2.data.HTTPv2` data + model or a :class:`~pcapkit.protocols.schema.Schema`. .. versionchanged:: 1.5.0 @@ -1427,7 +1427,7 @@ def _make_http_settings(self, frame: 'Optional[Data_SettingsFrame]' = None, *, Raises: ProtocolError: If ``settings`` is not :obj:`bytes`, a :obj:`dict`, a :obj:`list` or :data:`None`, or if an identifier other than - a :class:`~pcapkit.protocols.schema.application.httpv2.SettingPair`'s + a :class:`~pcapkit.protocols.application.httpv2.schema.SettingPair`'s is a name, a :obj:`bool`, or a member or code the 16-bit Identifier field cannot carry. @@ -1679,7 +1679,7 @@ def _import_next_layer(self, proto: 'int', length: 'Optional[int]' = None, *, # A TCP segment may carry several frames (:issue:`2536`). So the ``-1`` remainder is dissected as this class when :func:`_opens_whole_frame` finds a whole frame opening it, and is otherwise kept as - :class:`~pcapkit.protocols.misc.raw.Raw`, as + :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, as :meth:`Application._import_next_layer ` keeps it. A frame the segment ends inside is the reassembly limit, and @@ -1713,7 +1713,7 @@ def _import_next_frame(self, proto: 'int', length: 'Optional[int]' = None, *, # packet: packet info (passed from :meth:`self.unpack `) Returns: - Instance of this class, or of :class:`~pcapkit.protocols.misc.raw.Raw` + Instance of this class, or of :class:`~pcapkit.protocols.misc.raw.protocol.Raw` carrying the parser's ``error`` when :func:`~pcapkit.corekit.decorators.beholder` replaces a frame that fails to parse. diff --git a/pcapkit/protocols/schema/application/httpv2.py b/pcapkit/protocols/application/httpv2/schema.py similarity index 98% rename from pcapkit/protocols/schema/application/httpv2.py rename to pcapkit/protocols/application/httpv2/schema.py index dd3770e307..dc625a1ca6 100644 --- a/pcapkit/protocols/schema/application/httpv2.py +++ b/pcapkit/protocols/application/httpv2/schema.py @@ -5,7 +5,7 @@ .. versionremoved:: 1.6.0 ``pcapkit.protocols.schema.application.httpv2.HTTP``, with no alias. The - class is renamed :class:`~pcapkit.protocols.schema.application.httpv2.HTTPv2`, + class is renamed :class:`~pcapkit.protocols.application.httpv2.schema.HTTPv2`, after its module (:issue:`2529`). """ @@ -22,7 +22,7 @@ class is renamed :class:`~pcapkit.protocols.schema.application.httpv2.HTTPv2`, from pcapkit.corekit.fields.misc import ConditionalField, PayloadField, SchemaField, SwitchField from pcapkit.corekit.fields.numbers import EnumField, NumberField, UInt8Field, UInt32Field from pcapkit.corekit.fields.strings import BitField, BytesField, PaddingField -from pcapkit.protocols.schema.schema import EnumSchema, Schema, schema_final +from pcapkit.protocols.schema import EnumSchema, Schema, schema_final from pcapkit.utilities.logging import SPHINX_TYPE_CHECKING __all__ = [ @@ -88,7 +88,7 @@ def http_frame_selector(pkt: 'dict[str, Any]') -> 'Field': Returns: Returns a :class:`~pcapkit.corekit.fields.misc.SchemaField` wrapped - :class:`~pcapkit.protocols.schema.application.httpv2.FrameType` + :class:`~pcapkit.protocols.application.httpv2.schema.FrameType` instance. """ @@ -97,7 +97,7 @@ def http_frame_selector(pkt: 'dict[str, Any]') -> 'Field': # The frame payload is bounded by the declared Length, so anything after # it -- typically the next frame -- is left for :attr:`HTTPv2.payload`. It is # bounded by the buffer as well, so that a Length the buffer cannot back - # reaches :meth:`HTTPv2.read `, + # reaches :meth:`HTTPv2.read `, # which rejects it with :exc:`~pcapkit.utilities.exceptions.ProtocolError`. return SchemaField(length=min(pkt['length'], pkt['__length__']), schema=schema) diff --git a/pcapkit/protocols/application/ngap/__init__.py b/pcapkit/protocols/application/ngap/__init__.py new file mode 100644 index 0000000000..3ba30dc27f --- /dev/null +++ b/pcapkit/protocols/application/ngap/__init__.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""NGAP - NG application protocol +==================================== + +.. module:: pcapkit.protocols.application.ngap + +:mod:`pcapkit.protocols.application.ngap` holds the dissector, +:class:`~pcapkit.protocols.application.ngap.protocol.NGAP`, in +:mod:`~pcapkit.protocols.application.ngap.protocol`, its header schema in +:mod:`~pcapkit.protocols.application.ngap.schema` and its data model in +:mod:`~pcapkit.protocols.application.ngap.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.application.ngap.protocol import NGAP + +# Header Schemas +from pcapkit.protocols.application.ngap.schema import NGAP as Schema_NGAP + +# Data Models +from pcapkit.protocols.application.ngap.data import IE as Data_IE +from pcapkit.protocols.application.ngap.data import NGAP as Data_NGAP +from pcapkit.protocols.application.ngap.data import BitString as Data_BitString +from pcapkit.protocols.application.ngap.data import Choice as Data_Choice +from pcapkit.protocols.application.ngap.data import Sequence as Data_Sequence + +__all__ = ['NGAP'] diff --git a/pcapkit/protocols/data/application/ngap.py b/pcapkit/protocols/application/ngap/data.py similarity index 96% rename from pcapkit/protocols/data/application/ngap.py rename to pcapkit/protocols/application/ngap/data.py index 3cc3249cbc..b5ed066d7a 100644 --- a/pcapkit/protocols/data/application/ngap.py +++ b/pcapkit/protocols/application/ngap/data.py @@ -4,15 +4,14 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.data import Data -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Data, Protocol if TYPE_CHECKING: from typing import Any from pcapkit.const.ngap.procedure_code import ProcedureCode as Enum_ProcedureCode from pcapkit.const.ngap.protocol_ie import ProtocolIE as Enum_ProtocolIE - from pcapkit.protocols.application.ngap import Criticality, PDUKind + from pcapkit.protocols.application.ngap.protocol import Criticality, PDUKind __all__ = [ 'NGAP', diff --git a/pcapkit/protocols/application/ngap.py b/pcapkit/protocols/application/ngap/protocol.py similarity index 93% rename from pcapkit/protocols/application/ngap.py rename to pcapkit/protocols/application/ngap/protocol.py index bc2bbfc70a..911e7ee95a 100644 --- a/pcapkit/protocols/application/ngap.py +++ b/pcapkit/protocols/application/ngap/protocol.py @@ -3,10 +3,10 @@ """NGAP - NG application protocol ==================================== -.. module:: pcapkit.protocols.application.ngap +.. module:: pcapkit.protocols.application.ngap.protocol -:mod:`pcapkit.protocols.application.ngap` contains -:class:`~pcapkit.protocols.application.ngap.NGAP`, +:mod:`pcapkit.protocols.application.ngap.protocol` contains +:class:`~pcapkit.protocols.application.ngap.protocol.NGAP`, which implements an extractor for the NG Application Protocol (NGAP) [*]_, as specified in 3GPP TS 38.413, and the enumerations its decoded fields resolve to. @@ -14,7 +14,7 @@ NGAP is the control plane between a 5G RAN node (gNB or ng-eNB) and an AMF. It runs over SCTP and is named by the DATA chunk's *payload protocol identifier* rather than by a port, so :class:`NGAP` is registered on -:attr:`SCTP.__proto__ ` under +:attr:`SCTP.__proto__ ` under PPID 60 (:attr:`~pcapkit.const.sctp.payload_protocol_identifier.PayloadProtocolIdentifier.PayloadProtocolIdentifier_3GPP_NG_Application_Protocol`) and PPID 66 @@ -32,9 +32,9 @@ it; an NGAP payload simply degrades to the opaque payload path, exactly as an unregistered PPID would, because :meth:`~pcapkit.protocols.protocol.Protocol._import_next_layer`, which -:class:`~pcapkit.protocols.transport.sctp.SCTP` inherits, is wrapped in +:class:`~pcapkit.protocols.transport.sctp.protocol.SCTP` inherits, is wrapped in :func:`~pcapkit.corekit.decorators.beholder` and falls back to -:class:`~pcapkit.protocols.misc.raw.Raw`. +:class:`~pcapkit.protocols.misc.raw.protocol.Raw`. Decoder Dependency ------------------ @@ -56,10 +56,10 @@ ========================================================== ========================================================== ASN.1 / |pycrate|_ shape :mod:`pcapkit` model ========================================================== ========================================================== -``SEQUENCE`` / ``SET`` (a dict) :class:`~pcapkit.protocols.data.application.ngap.Sequence` +``SEQUENCE`` / ``SET`` (a dict) :class:`~pcapkit.protocols.application.ngap.data.Sequence` ``SEQUENCE OF`` (a list) :obj:`list` -``CHOICE`` / open type :class:`~pcapkit.protocols.data.application.ngap.Choice` -``BIT STRING`` :class:`~pcapkit.protocols.data.application.ngap.BitString` +``CHOICE`` / open type :class:`~pcapkit.protocols.application.ngap.data.Choice` +``BIT STRING`` :class:`~pcapkit.protocols.application.ngap.data.BitString` ``INTEGER``, ``OCTET STRING``, ``ENUMERATED``, ``BOOLEAN`` kept as :obj:`int`, :obj:`bytes`, :obj:`str`, :obj:`bool` ========================================================== ========================================================== @@ -70,19 +70,19 @@ :mod:`pcapkit`-specific model. The fields worth reading at a glance -- the PDU kind, procedure code, criticality, message type name and the IE list -- are surfaced as first-class fields on -:class:`~pcapkit.protocols.data.application.ngap.NGAP` regardless. +:class:`~pcapkit.protocols.application.ngap.data.NGAP` regardless. Known Limitations ----------------- * **PPID 66 payloads are not decoded.** NGAP over DTLS over SCTP wraps the ``NGAP-PDU`` in a DTLS record, and :attr:`SCTP.__proto__ - ` maps PPID 66 to - :class:`~pcapkit.protocols.application.ngap.NGAP` rather than - through :class:`~pcapkit.protocols.application.dtls.DTLS`, so the bytes + ` maps PPID 66 to + :class:`~pcapkit.protocols.application.ngap.protocol.NGAP` rather than + through :class:`~pcapkit.protocols.application.dtls.protocol.DTLS`, so the bytes reaching :meth:`NGAP.read` are not an APER encoding. The PPID is registered so that it is *named* rather than anonymous; the payload itself - degrades to :class:`~pcapkit.protocols.misc.raw.Raw`. + degrades to :class:`~pcapkit.protocols.misc.raw.protocol.Raw`. * **The specification version is that of the installed decoder, not this package's.** :class:`~pcapkit.const.ngap.procedure_code.ProcedureCode` and :class:`~pcapkit.const.ngap.protocol_ie.ProtocolIE` were generated from @@ -113,12 +113,12 @@ from pcapkit.corekit.enum import EnumLookup from pcapkit.corekit.infoclass import Info from pcapkit.protocols.application.application import Application -from pcapkit.protocols.data.application.ngap import IE as Data_IE -from pcapkit.protocols.data.application.ngap import NGAP as Data_NGAP -from pcapkit.protocols.data.application.ngap import BitString as Data_BitString -from pcapkit.protocols.data.application.ngap import Choice as Data_Choice -from pcapkit.protocols.data.application.ngap import Sequence as Data_Sequence -from pcapkit.protocols.schema.application.ngap import NGAP as Schema_NGAP +from pcapkit.protocols.application.ngap.data import IE as Data_IE +from pcapkit.protocols.application.ngap.data import NGAP as Data_NGAP +from pcapkit.protocols.application.ngap.data import BitString as Data_BitString +from pcapkit.protocols.application.ngap.data import Choice as Data_Choice +from pcapkit.protocols.application.ngap.data import Sequence as Data_Sequence +from pcapkit.protocols.application.ngap.schema import NGAP as Schema_NGAP from pcapkit.utilities.compat import StrEnum from pcapkit.utilities.exceptions import ProtocolError @@ -259,8 +259,8 @@ def _missing_(cls, value: 'int') -> 'NoReturn': value: Value to get enum item. Raises: - ValueError: Always. :class:`~pcapkit.protocols.application.ngap.Criticality` is an ``ENUMERATED`` with no - extension marker, so a fourth value cannot be encoded and a + ValueError: Always. :class:`~pcapkit.protocols.application.ngap.protocol.Criticality` is an ``ENUMERATED`` + with no extension marker, so a fourth value cannot be encoded and a lookup for one is a bug rather than a newer specification. """ @@ -282,10 +282,10 @@ def _convert(value: 'Any') -> 'Any': Returns: The same tree, with mappings as - :class:`~pcapkit.protocols.data.application.ngap.Sequence`, ``CHOICE`` - pairs as :class:`~pcapkit.protocols.data.application.ngap.Choice`, and + :class:`~pcapkit.protocols.application.ngap.data.Sequence`, ``CHOICE`` + pairs as :class:`~pcapkit.protocols.application.ngap.data.Choice`, and ``BIT STRING`` pairs as - :class:`~pcapkit.protocols.data.application.ngap.BitString`. + :class:`~pcapkit.protocols.application.ngap.data.BitString`. Notes: The 2-tuple shapes are told apart by their first element, which is @@ -321,8 +321,8 @@ def _revert(value: 'Any') -> 'Any': The same tree in the shape ``NGAP_PDU.set_val()`` expects. Notes: - :class:`~pcapkit.protocols.data.application.ngap.Choice` and - :class:`~pcapkit.protocols.data.application.ngap.BitString` are tested + :class:`~pcapkit.protocols.application.ngap.data.Choice` and + :class:`~pcapkit.protocols.application.ngap.data.BitString` are tested before :class:`~pcapkit.corekit.infoclass.Info`, since they are subclasses of it and would otherwise be reverted to mappings. @@ -494,7 +494,7 @@ def make(self, criticality: Criticality of the procedure. message: Name of the message type, e.g. ``NGSetupRequest``. value: Message body, either as - :class:`~pcapkit.protocols.data.application.ngap.Sequence` from + :class:`~pcapkit.protocols.application.ngap.data.Sequence` from a previous :meth:`read` or as the plain Python value |pycrate|_ expects. data: Pre-encoded ``NGAP-PDU``. When given, it is used verbatim and @@ -570,7 +570,7 @@ def __index__(cls) -> 'int': # type: ignore[override] port numbers: SCTP port 38412, the port of :attr:`SCTP.ng_control ` as an :class:`int`. - :attr:`SCTP.__proto__ ` + :attr:`SCTP.__proto__ ` dispatches by payload protocol identifier rather than by port, so this value keys no dispatch (:ref:`registry-protocol-index`). diff --git a/pcapkit/protocols/schema/application/ngap.py b/pcapkit/protocols/application/ngap/schema.py similarity index 92% rename from pcapkit/protocols/schema/application/ngap.py rename to pcapkit/protocols/application/ngap/schema.py index 155bc37340..978033423d 100644 --- a/pcapkit/protocols/schema/application/ngap.py +++ b/pcapkit/protocols/application/ngap/schema.py @@ -5,7 +5,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.fields.strings import BytesField -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final __all__ = ['NGAP'] diff --git a/pcapkit/protocols/application/ospf/__init__.py b/pcapkit/protocols/application/ospf/__init__.py new file mode 100644 index 0000000000..6b3426b060 --- /dev/null +++ b/pcapkit/protocols/application/ospf/__init__.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""OSPF - Open Shortest Path First +===================================== + +.. module:: pcapkit.protocols.application.ospf + +:mod:`pcapkit.protocols.application.ospf` holds the dissector, +:class:`~pcapkit.protocols.application.ospf.protocol.OSPF`, in +:mod:`~pcapkit.protocols.application.ospf.protocol`, its header schema in +:mod:`~pcapkit.protocols.application.ospf.schema` and its data model in +:mod:`~pcapkit.protocols.application.ospf.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.application.ospf.protocol import OSPF + +# Header Schemas +from pcapkit.protocols.application.ospf.schema import OSPF as Schema_OSPF +from pcapkit.protocols.application.ospf.schema import \ + CryptographicAuthentication as Schema_CryptographicAuthentication + +# Data Models +from pcapkit.protocols.application.ospf.data import OSPF as Data_OSPF +from pcapkit.protocols.application.ospf.data import \ + CryptographicAuthentication as Data_CryptographicAuthentication + +__all__ = ['OSPF'] diff --git a/pcapkit/protocols/data/application/ospf.py b/pcapkit/protocols/application/ospf/data.py similarity index 96% rename from pcapkit/protocols/data/application/ospf.py rename to pcapkit/protocols/application/ospf/data.py index c34fcafd9a..bfb33f6f1c 100644 --- a/pcapkit/protocols/data/application/ospf.py +++ b/pcapkit/protocols/application/ospf/data.py @@ -4,8 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.data import Data -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Data, Protocol if TYPE_CHECKING: from ipaddress import IPv4Address diff --git a/pcapkit/protocols/application/ospf.py b/pcapkit/protocols/application/ospf/protocol.py similarity index 95% rename from pcapkit/protocols/application/ospf.py rename to pcapkit/protocols/application/ospf/protocol.py index 896526e67b..68be4d8c3b 100644 --- a/pcapkit/protocols/application/ospf.py +++ b/pcapkit/protocols/application/ospf/protocol.py @@ -2,10 +2,10 @@ """OSPF - Open Shortest Path First ===================================== -.. module:: pcapkit.protocols.application.ospf +.. module:: pcapkit.protocols.application.ospf.protocol -:mod:`pcapkit.protocols.application.ospf` contains -:class:`~pcapkit.protocols.application.ospf.OSPF` only, +:mod:`pcapkit.protocols.application.ospf.protocol` contains +:class:`~pcapkit.protocols.application.ospf.protocol.OSPF` only, which implements an extractor for Open Shortest Path First (OSPF) [*]_, whose structure is described as below: @@ -37,7 +37,7 @@ .. versionadded:: 1.5.0 Moved here from ``pcapkit.protocols.link.ospf``, with its data model and - header schema. :class:`~pcapkit.protocols.application.ospf.OSPF` derives + header schema. :class:`~pcapkit.protocols.application.ospf.protocol.OSPF` derives from :class:`~pcapkit.protocols.application.application.Application`, so its layer is ``'Application'`` (:issue:`719`). @@ -45,27 +45,27 @@ ``pcapkit.protocols.link.ospf``, ``pcapkit.protocols.data.link.ospf`` and ``pcapkit.protocols.schema.link.ospf``, the ``OSPF`` name that - :mod:`pcapkit.protocols.link`, :mod:`pcapkit.protocols.data.link` and - :mod:`pcapkit.protocols.schema.link` each exported, and the + :mod:`pcapkit.protocols.link`, ``pcapkit.protocols.data.link`` and + ``pcapkit.protocols.schema.link`` each exported, and the ``OSPF_CrytographicAuthentication`` name that - :mod:`pcapkit.protocols.data.link` and :mod:`pcapkit.protocols.schema.link` + ``pcapkit.protocols.data.link`` and ``pcapkit.protocols.schema.link`` exported, with no alias (:issue:`719`, :issue:`1090`). .. versionchanged:: 1.5.0 A rebuild keeps the parsed Packet Length and the octets past it, where - :meth:`~pcapkit.protocols.application.ospf.OSPF.make` recomputed the + :meth:`~pcapkit.protocols.application.ospf.protocol.OSPF.make` recomputed the length from the payload and dropped those octets; it takes them as ``packet_length`` and ``trailer`` (:issue:`1249`, :issue:`1455`). .. versionchanged:: 1.6.0 The OSPFv2 checksum is computed when - :meth:`~pcapkit.protocols.application.ospf.OSPF.make` is given none, and + :meth:`~pcapkit.protocols.application.ospf.protocol.OSPF.make` is given none, and verified on read under :data:`~pcapkit.utilities.config.CHECKSUM_VERIFY` (:issue:`2475`). - :meth:`~pcapkit.protocols.application.ospf.OSPF.make` raises + :meth:`~pcapkit.protocols.application.ospf.protocol.OSPF.make` raises :exc:`~pcapkit.utilities.exceptions.ProtocolError` for a checksum, or the reserved octets of cryptographic authentication data, that is not two octets, rather than padding or cutting it (:issue:`2676`). @@ -80,13 +80,13 @@ from pcapkit.const.reg.transtype import TransType as Enum_TransType from pcapkit.corekit.schema.ipaddress import parse_ip_address from pcapkit.protocols.application.application import Application -from pcapkit.protocols.data.application.ospf import OSPF as Data_OSPF -from pcapkit.protocols.data.application.ospf import \ +from pcapkit.protocols.application.ospf.data import OSPF as Data_OSPF +from pcapkit.protocols.application.ospf.data import \ CryptographicAuthentication as Data_CryptographicAuthentication -from pcapkit.protocols.protocol import ProtocolBase -from pcapkit.protocols.schema.application.ospf import OSPF as Schema_OSPF -from pcapkit.protocols.schema.application.ospf import \ +from pcapkit.protocols.application.ospf.schema import OSPF as Schema_OSPF +from pcapkit.protocols.application.ospf.schema import \ CryptographicAuthentication as Schema_CryptographicAuthentication +from pcapkit.protocols.protocol import ProtocolBase from pcapkit.utilities import config from pcapkit.utilities.exceptions import ProtocolError @@ -96,7 +96,7 @@ from typing_extensions import Literal - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema __all__ = ['OSPF'] @@ -146,7 +146,7 @@ class OSPF(Application[Data_OSPF, Schema_OSPF], #: ` builds the #: protocol chain out of :attr:`alias` -- and ``_info`` is not assigned until #: :meth:`read` has returned. See ``ARP._acnm`` on - #: :class:`~pcapkit.protocols.link.arp.ARP`, which has the same constraint. + #: :class:`~pcapkit.protocols.link.arp.protocol.ARP`, which has the same constraint. _version: 'int' ########################################################################## @@ -470,7 +470,7 @@ def _make_id_numbers(self, id: 'IPv4Address | str | bytes | bytearray') -> 'byte def _read_encrypt_auth(self, schema: 'Schema_CryptographicAuthentication') -> 'Data_CryptographicAuthentication': """Read Authentication field when Cryptographic Authentication is employed, - i.e. :attr:`~pcapkit.protocols.data.application.ospf.OSPF.autype` is ``2``. + i.e. :attr:`~pcapkit.protocols.application.ospf.data.OSPF.autype` is ``2``. Structure of Cryptographic Authentication [:rfc:`2328`]: diff --git a/pcapkit/protocols/schema/application/ospf.py b/pcapkit/protocols/application/ospf/schema.py similarity index 94% rename from pcapkit/protocols/schema/application/ospf.py rename to pcapkit/protocols/application/ospf/schema.py index f0aba5afd3..48137b0a0d 100644 --- a/pcapkit/protocols/schema/application/ospf.py +++ b/pcapkit/protocols/application/ospf/schema.py @@ -10,7 +10,7 @@ from pcapkit.corekit.fields.misc import PayloadField, SchemaField, SwitchField from pcapkit.corekit.fields.numbers import EnumField, UInt8Field, UInt16Field, UInt32Field from pcapkit.corekit.fields.strings import BytesField, PaddingField -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final __all__ = ['OSPF', 'CryptographicAuthentication'] @@ -30,7 +30,7 @@ def ospf_auth_data_selector(pkt: 'dict[str, Any]') -> 'Field': Returns: A :class:`~pcapkit.corekit.fields.misc.SchemaField` wrapped - :class:`~pcapkit.protocols.schema.application.ospf.CryptographicAuthentication` + :class:`~pcapkit.protocols.application.ospf.schema.CryptographicAuthentication` instance if :attr:`OSPF.auth_type` is 2, and a :class:`~pcapkit.corekit.fields.strings.BytesField` instance otherwise. @@ -96,7 +96,7 @@ class OSPF(Schema): payload: 'bytes' = PayloadField(length=lambda pkt: pkt['length'] - 24) #: Octets captured past the Packet Length, such as the message digest #: that cryptographic authentication appends (:rfc:`2328#appendix-D.4.3`); - #: compare :attr:`IPv4.trailer `. + #: compare :attr:`IPv4.trailer `. trailer: 'bytes' = PayloadField(default=b'') if TYPE_CHECKING: diff --git a/pcapkit/protocols/application/rarp/__init__.py b/pcapkit/protocols/application/rarp/__init__.py new file mode 100644 index 0000000000..98a1033ad8 --- /dev/null +++ b/pcapkit/protocols/application/rarp/__init__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +"""RARP - Reverse Address Resolution Protocol +================================================ + +.. module:: pcapkit.protocols.application.rarp + +:mod:`pcapkit.protocols.application.rarp` holds the dissector, +:class:`~pcapkit.protocols.application.rarp.protocol.RARP`, in +:mod:`~pcapkit.protocols.application.rarp.protocol`. + +""" +from pcapkit.protocols.application.rarp.protocol import RARP + +__all__ = ['RARP'] diff --git a/pcapkit/protocols/application/rarp.py b/pcapkit/protocols/application/rarp/protocol.py similarity index 84% rename from pcapkit/protocols/application/rarp.py rename to pcapkit/protocols/application/rarp/protocol.py index 50203d5b91..86d8050b8e 100644 --- a/pcapkit/protocols/application/rarp.py +++ b/pcapkit/protocols/application/rarp/protocol.py @@ -2,10 +2,10 @@ """RARP - Reverse Address Resolution Protocol ================================================ -.. module:: pcapkit.protocols.application.rarp +.. module:: pcapkit.protocols.application.rarp.protocol -:mod:`pcapkit.protocols.application.rarp` contains -:class:`~pcapkit.protocols.application.rarp.RARP` only, +:mod:`pcapkit.protocols.application.rarp.protocol` contains +:class:`~pcapkit.protocols.application.rarp.protocol.RARP` only, which implements an extractor for Reverse Address Resolution Protocol (RARP) [*]_, whose structure is described as below: @@ -29,10 +29,10 @@ .. versionadded:: 1.5.0 Moved here from ``pcapkit.protocols.link.rarp``. - :class:`~pcapkit.protocols.application.rarp.RARP` and - :class:`~pcapkit.protocols.application.drarp.DRARP` derive from + :class:`~pcapkit.protocols.application.rarp.protocol.RARP` and + :class:`~pcapkit.protocols.application.drarp.protocol.DRARP` derive from :class:`~pcapkit.protocols.application.application.Application` as well as - :class:`~pcapkit.protocols.link.arp.ARP`, so their layer is + :class:`~pcapkit.protocols.link.arp.protocol.ARP`, so their layer is ``'Application'`` (:issue:`719`). .. versionremoved:: 1.5.0 @@ -43,7 +43,7 @@ .. versionremoved:: 1.6.0 ``pcapkit.protocols.application.rarp.DRARP``, with no alias. The class - moved to :mod:`pcapkit.protocols.application.drarp`, since a module holds + moved to :mod:`pcapkit.protocols.application.drarp.protocol`, since a module holds one protocol class, named after it (:issue:`2529`). """ @@ -51,9 +51,9 @@ from pcapkit.const.reg.ethertype import EtherType as Enum_EtherType from pcapkit.protocols.application.application import Application -from pcapkit.protocols.data.link.arp import ARP as Data_ARP -from pcapkit.protocols.link.arp import ARP -from pcapkit.protocols.schema.link.arp import ARP as Schema_ARP +from pcapkit.protocols.link.arp.data import ARP as Data_ARP +from pcapkit.protocols.link.arp.protocol import ARP +from pcapkit.protocols.link.arp.schema import ARP as Schema_ARP if TYPE_CHECKING: from typing_extensions import Literal @@ -71,11 +71,11 @@ class RARP(Application, ARP, schema=Schema_ARP, data=Data_ARP): # pylint: disab function alone. Hence the two bases: the layer base :class:`~pcapkit.protocols.application.application.Application` first, for ``layer == 'Application'``, then the protocol family base - :class:`~pcapkit.protocols.link.arp.ARP` for the shared parser. See + :class:`~pcapkit.protocols.link.arp.protocol.ARP` for the shared parser. See :doc:`/contributing/conventions/protocol-layer-placement`. Note: - The order is load-bearing, not stylistic. :class:`~pcapkit.protocols.link.arp.ARP`'s chain reaches + The order is load-bearing, not stylistic. :class:`~pcapkit.protocols.link.arp.protocol.ARP`'s chain reaches :class:`~pcapkit.protocols.link.link.Link`, which *owns* ``__layer__``, so ``class RARP(ARP, Application)`` would report ``'Link'``. diff --git a/pcapkit/protocols/application/ssl/__init__.py b/pcapkit/protocols/application/ssl/__init__.py new file mode 100644 index 0000000000..f89eb4106b --- /dev/null +++ b/pcapkit/protocols/application/ssl/__init__.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""SSL - Secure Sockets Layer +================================ + +.. module:: pcapkit.protocols.application.ssl + +:mod:`pcapkit.protocols.application.ssl` holds the dissector, +:class:`~pcapkit.protocols.application.ssl.protocol.SSL`, in +:mod:`~pcapkit.protocols.application.ssl.protocol` and the data models its family shares +in :mod:`~pcapkit.protocols.application.ssl.data`. + +Its data classes are importable as ``Data_*``. + +""" +from pcapkit.protocols.application.ssl.protocol import SSL + +# Data Models +from pcapkit.protocols.application.ssl.data import Alert as Data_Alert +from pcapkit.protocols.application.ssl.data import ChangeCipherSpec as Data_ChangeCipherSpec +from pcapkit.protocols.application.ssl.data import ClientHello as Data_ClientHello +from pcapkit.protocols.application.ssl.data import ConnectionId as Data_ConnectionId +from pcapkit.protocols.application.ssl.data import EncryptedExtensions as Data_EncryptedExtensions +from pcapkit.protocols.application.ssl.data import Extension as Data_Extension +from pcapkit.protocols.application.ssl.data import ExtensionData as Data_ExtensionData +from pcapkit.protocols.application.ssl.data import Handshake as Data_Handshake +from pcapkit.protocols.application.ssl.data import KeyShareClientHello as Data_KeyShareClientHello +from pcapkit.protocols.application.ssl.data import KeyShareEntry as Data_KeyShareEntry +from pcapkit.protocols.application.ssl.data import \ + KeyShareHelloRetryRequest as Data_KeyShareHelloRetryRequest +from pcapkit.protocols.application.ssl.data import KeyShareServerHello as Data_KeyShareServerHello +from pcapkit.protocols.application.ssl.data import NamedGroupList as Data_NamedGroupList +from pcapkit.protocols.application.ssl.data import ProtocolNameList as Data_ProtocolNameList +from pcapkit.protocols.application.ssl.data import ServerHello as Data_ServerHello +from pcapkit.protocols.application.ssl.data import ServerName as Data_ServerName +from pcapkit.protocols.application.ssl.data import ServerNameList as Data_ServerNameList +from pcapkit.protocols.application.ssl.data import SignatureSchemeList as Data_SignatureSchemeList +from pcapkit.protocols.application.ssl.data import \ + SupportedVersionsClientHello as Data_SupportedVersionsClientHello +from pcapkit.protocols.application.ssl.data import \ + SupportedVersionsServerHello as Data_SupportedVersionsServerHello + +__all__ = ['SSL'] diff --git a/pcapkit/protocols/data/application/tls.py b/pcapkit/protocols/application/ssl/data.py similarity index 87% rename from pcapkit/protocols/data/application/tls.py rename to pcapkit/protocols/application/ssl/data.py index dcb2db95e6..52e5523bb8 100644 --- a/pcapkit/protocols/data/application/tls.py +++ b/pcapkit/protocols/application/ssl/data.py @@ -1,30 +1,28 @@ # -*- coding: utf-8 -*- -"""data models for TLS protocol""" +"""data models the SSL family shares + +:mod:`pcapkit.protocols.application.ssl.data` holds the data models +:class:`~pcapkit.protocols.application.ssl.protocol.SSL` and its members read: +a family's shared pieces live in its base's package (:issue:`2534`). + +""" from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.data import Data -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Data if TYPE_CHECKING: - from typing import Any, Optional, Union + from typing import Optional, Union - from pcapkit.const.tls.content_type import ContentType as Enum_ContentType from pcapkit.const.tls.extension_type import ExtensionType as Enum_ExtensionType from pcapkit.const.tls.handshake_type import HandshakeType as Enum_HandshakeType __all__ = [ - 'TLS', - - 'Handshake', 'ClientHello', 'ServerHello', 'EncryptedExtensions', - - 'Extension', 'ExtensionData', - 'ServerName', 'ServerNameList', 'NamedGroupList', 'SignatureSchemeList', - 'ProtocolNameList', 'SupportedVersionsClientHello', 'SupportedVersionsServerHello', - 'KeyShareEntry', 'KeyShareClientHello', 'KeyShareHelloRetryRequest', 'KeyShareServerHello', - 'ConnectionId', - + 'Handshake', 'ClientHello', 'ServerHello', 'EncryptedExtensions', 'Extension', 'ExtensionData', + 'ServerName', 'ServerNameList', 'NamedGroupList', 'SignatureSchemeList', 'ProtocolNameList', + 'SupportedVersionsClientHello', 'SupportedVersionsServerHello', 'KeyShareEntry', + 'KeyShareClientHello', 'KeyShareHelloRetryRequest', 'KeyShareServerHello', 'ConnectionId', 'Alert', 'ChangeCipherSpec', ] @@ -44,7 +42,7 @@ class Extension(Data): """Data model for a TLS/DTLS extension list entry (:rfc:`9846#section-4.3`). :attr:`data` holds the decoded ``extension_data`` where - :attr:`SSL.__extension__ ` + :attr:`SSL.__extension__ ` registers a decoder for :attr:`type`, and the raw octets otherwise -- including a body its decoder cannot read exactly, or one in a message whose structure for it the decoder does not know. @@ -322,28 +320,3 @@ class ChangeCipherSpec(Data): if TYPE_CHECKING: def __init__(self, msg: 'int') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements - - -@info_final -class TLS(Protocol): - """Data model for TLS protocol.""" - - #: Content type. - content_type: 'Enum_ContentType' - #: Legacy record version (``major << 8 | minor``). - version: 'int' - #: Length of the record fragment. - length: 'int' - #: Decoded record content. For ``handshake``, ``alert``, and - #: ``change_cipher_spec``, this is a tuple of :class:`Handshake`, an - #: :class:`Alert`, or a :class:`ChangeCipherSpec` respectively *only when - #: the record is cleartext* (as decided by - #: :meth:`SSL._tls_content_is_cleartext - #: `) -- - #: an encrypted record of any of those three types, which is the common - #: case for TLS 1.2 post-handshake traffic, stays raw :obj:`bytes` instead, - #: same as every other content type. - content: 'Any' - - if TYPE_CHECKING: - def __init__(self, content_type: 'Enum_ContentType', version: 'int', length: 'int', content: 'Any') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long diff --git a/pcapkit/protocols/application/ssl.py b/pcapkit/protocols/application/ssl/protocol.py similarity index 94% rename from pcapkit/protocols/application/ssl.py rename to pcapkit/protocols/application/ssl/protocol.py index e2a448a02d..607765be1f 100644 --- a/pcapkit/protocols/application/ssl.py +++ b/pcapkit/protocols/application/ssl/protocol.py @@ -2,15 +2,15 @@ """SSL - Secure Sockets Layer ================================ -.. module:: pcapkit.protocols.application.ssl +.. module:: pcapkit.protocols.application.ssl.protocol -:mod:`pcapkit.protocols.application.ssl` contains -:class:`~pcapkit.protocols.application.ssl.SSL` only, +:mod:`pcapkit.protocols.application.ssl.protocol` contains +:class:`~pcapkit.protocols.application.ssl.protocol.SSL` only, which is the umbrella base class for the Secure Sockets Layer protocol family [*]_ -- the SSL versions, Transport Layer Security -(:class:`~pcapkit.protocols.application.tls.TLS`, which also covers SSLv3 -through :class:`~pcapkit.protocols.application.sslv3.SSLv3`) and Datagram TLS -(:class:`~pcapkit.protocols.application.dtls.DTLS`). +(:class:`~pcapkit.protocols.application.tls.protocol.TLS`, which also covers SSLv3 +through :class:`~pcapkit.protocols.application.sslv3.protocol.SSLv3`) and Datagram TLS +(:class:`~pcapkit.protocols.application.dtls.protocol.DTLS`). The TLS record header (:rfc:`9846#section-5.1`) is a :class:`~pcapkit.const.tls.content_type.ContentType`, a legacy record version @@ -18,9 +18,9 @@ the same fields plus an epoch and a 48-bit sequence number *between* the version and the length, and DTLS adds a fragment header to each handshake message. Each record header is declared in its subclass's own schema -(:class:`~pcapkit.protocols.schema.application.tls.TLS` and -:class:`~pcapkit.protocols.schema.application.dtls.DTLS`), and -:class:`~pcapkit.protocols.application.dtls.DTLS` reads the epoch and sequence +(:class:`~pcapkit.protocols.application.tls.schema.TLS` and +:class:`~pcapkit.protocols.application.dtls.schema.DTLS`), and +:class:`~pcapkit.protocols.application.dtls.protocol.DTLS` reads the epoch and sequence number. This base class carries the logic the two share -- content-type dispatch, handshake-message decoding and the extension registry -- parameterised by a ``dtls`` flag where the DTLS handshake fragment header has to be read or @@ -39,29 +39,29 @@ from pcapkit.const.tls.handshake_type import HandshakeType as Enum_HandshakeType from pcapkit.corekit.protochain import ProtoChain from pcapkit.protocols.application.application import Application -from pcapkit.protocols.data.application.tls import Alert as Data_Alert -from pcapkit.protocols.data.application.tls import ChangeCipherSpec as Data_ChangeCipherSpec -from pcapkit.protocols.data.application.tls import ClientHello as Data_ClientHello -from pcapkit.protocols.data.application.tls import ConnectionId as Data_ConnectionId -from pcapkit.protocols.data.application.tls import EncryptedExtensions as Data_EncryptedExtensions -from pcapkit.protocols.data.application.tls import Extension as Data_Extension -from pcapkit.protocols.data.application.tls import Handshake as Data_Handshake -from pcapkit.protocols.data.application.tls import KeyShareClientHello as Data_KeyShareClientHello -from pcapkit.protocols.data.application.tls import KeyShareEntry as Data_KeyShareEntry -from pcapkit.protocols.data.application.tls import \ +from pcapkit.protocols.application.ssl.data import Alert as Data_Alert +from pcapkit.protocols.application.ssl.data import ChangeCipherSpec as Data_ChangeCipherSpec +from pcapkit.protocols.application.ssl.data import ClientHello as Data_ClientHello +from pcapkit.protocols.application.ssl.data import ConnectionId as Data_ConnectionId +from pcapkit.protocols.application.ssl.data import EncryptedExtensions as Data_EncryptedExtensions +from pcapkit.protocols.application.ssl.data import Extension as Data_Extension +from pcapkit.protocols.application.ssl.data import Handshake as Data_Handshake +from pcapkit.protocols.application.ssl.data import KeyShareClientHello as Data_KeyShareClientHello +from pcapkit.protocols.application.ssl.data import KeyShareEntry as Data_KeyShareEntry +from pcapkit.protocols.application.ssl.data import \ KeyShareHelloRetryRequest as Data_KeyShareHelloRetryRequest -from pcapkit.protocols.data.application.tls import KeyShareServerHello as Data_KeyShareServerHello -from pcapkit.protocols.data.application.tls import NamedGroupList as Data_NamedGroupList -from pcapkit.protocols.data.application.tls import ProtocolNameList as Data_ProtocolNameList -from pcapkit.protocols.data.application.tls import ServerHello as Data_ServerHello -from pcapkit.protocols.data.application.tls import ServerName as Data_ServerName -from pcapkit.protocols.data.application.tls import ServerNameList as Data_ServerNameList -from pcapkit.protocols.data.application.tls import SignatureSchemeList as Data_SignatureSchemeList -from pcapkit.protocols.data.application.tls import \ +from pcapkit.protocols.application.ssl.data import KeyShareServerHello as Data_KeyShareServerHello +from pcapkit.protocols.application.ssl.data import NamedGroupList as Data_NamedGroupList +from pcapkit.protocols.application.ssl.data import ProtocolNameList as Data_ProtocolNameList +from pcapkit.protocols.application.ssl.data import ServerHello as Data_ServerHello +from pcapkit.protocols.application.ssl.data import ServerName as Data_ServerName +from pcapkit.protocols.application.ssl.data import ServerNameList as Data_ServerNameList +from pcapkit.protocols.application.ssl.data import SignatureSchemeList as Data_SignatureSchemeList +from pcapkit.protocols.application.ssl.data import \ SupportedVersionsClientHello as Data_SupportedVersionsClientHello -from pcapkit.protocols.data.application.tls import \ +from pcapkit.protocols.application.ssl.data import \ SupportedVersionsServerHello as Data_SupportedVersionsServerHello -from pcapkit.protocols.misc.no_payload import NoPayload +from pcapkit.protocols.misc.no_payload.protocol import NoPayload from pcapkit.protocols.protocol import _PT, _ST from pcapkit.utilities.exceptions import CaughtByCaller, ProtocolError from pcapkit.utilities.warnings import RegistryWarning, warn @@ -72,7 +72,7 @@ from mypy_extensions import DefaultArg, KwArg, NamedArg from typing_extensions import Literal - from pcapkit.protocols.data.application.tls import ExtensionData as Data_ExtensionData + from pcapkit.protocols.application.ssl.data import ExtensionData as Data_ExtensionData #: Parser of an ``extension_data`` field registered as a callable. ExtensionParser = Callable[[Enum_ExtensionType, bytes, NamedArg(Enum_HandshakeType, 'msg_type')], @@ -129,8 +129,8 @@ def _negotiated_versions(message: 'Any') -> 'tuple[int, ...]': Args: message: A decoded handshake message's body -- typically - :class:`~pcapkit.protocols.data.application.tls.ClientHello` or - :class:`~pcapkit.protocols.data.application.tls.ServerHello`. + :class:`~pcapkit.protocols.application.ssl.data.ClientHello` or + :class:`~pcapkit.protocols.application.ssl.data.ServerHello`. Any other type (raw :obj:`bytes`, or a message with no ``extensions`` attribute) yields nothing. @@ -225,11 +225,11 @@ def _tls_handshake_tiles(fragment: 'bytes') -> 'bool': class SSL(Application[_PT, _ST], Generic[_PT, _ST]): # pylint: disable=abstract-method """Umbrella base class for the SSL protocol family: the SSL versions, TLS and DTLS. - - SSL 2.0 (:class:`~pcapkit.protocols.application.sslv2.SSLv2`) [draft-hickman-netscape-ssl-00] + - SSL 2.0 (:class:`~pcapkit.protocols.application.sslv2.protocol.SSLv2`) [draft-hickman-netscape-ssl-00] - Transport Layer Security, SSLv3 through TLS 1.3 - (:class:`~pcapkit.protocols.application.tls.TLS`) [:rfc:`6101`, :rfc:`5246`, :rfc:`9846`] + (:class:`~pcapkit.protocols.application.tls.protocol.TLS`) [:rfc:`6101`, :rfc:`5246`, :rfc:`9846`] - Datagram TLS, DTLS 1.0 through DTLS 1.3 - (:class:`~pcapkit.protocols.application.dtls.DTLS`) [:rfc:`4347`, :rfc:`6347`, :rfc:`9147`] + (:class:`~pcapkit.protocols.application.dtls.protocol.DTLS`) [:rfc:`4347`, :rfc:`6347`, :rfc:`9147`] The ``extension_data`` of these extensions decodes, in ``ClientHello``, ``ServerHello``, ``HelloRetryRequest`` and ``EncryptedExtensions``: @@ -241,26 +241,26 @@ class SSL(Application[_PT, _ST], Generic[_PT, _ST]): # pylint: disable=abstract - Extension Parser - Extension Constructor * - :attr:`~pcapkit.const.tls.extension_type.ExtensionType.server_name` - - :meth:`~pcapkit.protocols.application.ssl.SSL._read_ext_server_name` - - :meth:`~pcapkit.protocols.application.ssl.SSL._make_ext_server_name` + - :meth:`~pcapkit.protocols.application.ssl.protocol.SSL._read_ext_server_name` + - :meth:`~pcapkit.protocols.application.ssl.protocol.SSL._make_ext_server_name` * - :attr:`~pcapkit.const.tls.extension_type.ExtensionType.supported_groups` - - :meth:`~pcapkit.protocols.application.ssl.SSL._read_ext_supported_groups` - - :meth:`~pcapkit.protocols.application.ssl.SSL._make_ext_supported_groups` + - :meth:`~pcapkit.protocols.application.ssl.protocol.SSL._read_ext_supported_groups` + - :meth:`~pcapkit.protocols.application.ssl.protocol.SSL._make_ext_supported_groups` * - :attr:`~pcapkit.const.tls.extension_type.ExtensionType.signature_algorithms` - - :meth:`~pcapkit.protocols.application.ssl.SSL._read_ext_signature_algorithms` - - :meth:`~pcapkit.protocols.application.ssl.SSL._make_ext_signature_algorithms` + - :meth:`~pcapkit.protocols.application.ssl.protocol.SSL._read_ext_signature_algorithms` + - :meth:`~pcapkit.protocols.application.ssl.protocol.SSL._make_ext_signature_algorithms` * - :attr:`~pcapkit.const.tls.extension_type.ExtensionType.application_layer_protocol_negotiation` - - :meth:`~pcapkit.protocols.application.ssl.SSL._read_ext_alpn` - - :meth:`~pcapkit.protocols.application.ssl.SSL._make_ext_alpn` + - :meth:`~pcapkit.protocols.application.ssl.protocol.SSL._read_ext_alpn` + - :meth:`~pcapkit.protocols.application.ssl.protocol.SSL._make_ext_alpn` * - :attr:`~pcapkit.const.tls.extension_type.ExtensionType.supported_versions` - - :meth:`~pcapkit.protocols.application.ssl.SSL._read_ext_supported_versions` - - :meth:`~pcapkit.protocols.application.ssl.SSL._make_ext_supported_versions` + - :meth:`~pcapkit.protocols.application.ssl.protocol.SSL._read_ext_supported_versions` + - :meth:`~pcapkit.protocols.application.ssl.protocol.SSL._make_ext_supported_versions` * - :attr:`~pcapkit.const.tls.extension_type.ExtensionType.key_share` - - :meth:`~pcapkit.protocols.application.ssl.SSL._read_ext_key_share` - - :meth:`~pcapkit.protocols.application.ssl.SSL._make_ext_key_share` + - :meth:`~pcapkit.protocols.application.ssl.protocol.SSL._read_ext_key_share` + - :meth:`~pcapkit.protocols.application.ssl.protocol.SSL._make_ext_key_share` * - :attr:`~pcapkit.const.tls.extension_type.ExtensionType.connection_id` - - :meth:`~pcapkit.protocols.application.ssl.SSL._read_ext_connection_id` - - :meth:`~pcapkit.protocols.application.ssl.SSL._make_ext_connection_id` + - :meth:`~pcapkit.protocols.application.ssl.protocol.SSL._read_ext_connection_id` + - :meth:`~pcapkit.protocols.application.ssl.protocol.SSL._make_ext_connection_id` """ @@ -298,7 +298,7 @@ def id(cls) -> 'tuple[Literal["SSLv2"], Literal["TLS"], Literal["DTLS"]]': Returns: Index ID of the protocol: the direct concrete members of the family. SSLv3 is not listed, as it is a subclass of - :class:`~pcapkit.protocols.application.tls.TLS`. + :class:`~pcapkit.protocols.application.tls.protocol.TLS`. """ return ('SSLv2', 'TLS', 'DTLS') @@ -875,7 +875,7 @@ def _validate_tls_record(self, schema: 'Any', *, available: 'int', dtls: 'bool') Raises: ProtocolError: If ``schema`` cannot be a genuine record, so that :func:`~pcapkit.corekit.decorators.beholder` degrades - dispatch to :class:`~pcapkit.protocols.misc.raw.Raw` instead + dispatch to :class:`~pcapkit.protocols.misc.raw.protocol.Raw` instead of accepting a fabricated one. Note: @@ -941,7 +941,7 @@ def _tls_content_is_cleartext(self, content_type: 'Enum_ContentType', fragment: ``handshake``, ``alert`` and ``change_cipher_spec`` carry ciphertext once keys are derived, and the record header does not say so. Decoding ciphertext would fabricate content, or fail and lose the - cleartext header to :class:`~pcapkit.protocols.misc.raw.Raw`. + cleartext header to :class:`~pcapkit.protocols.misc.raw.protocol.Raw`. * **DTLS**: epoch 0 is cleartext, any later epoch encrypted (:rfc:`9147#section-4.2`). @@ -987,9 +987,9 @@ def _read_tls_content(self, content_type: 'Enum_ContentType', fragment: 'bytes', Returns: A :obj:`tuple` of handshake messages for :attr:`~pcapkit.const.tls.content_type.ContentType.handshake`, an - :class:`~pcapkit.protocols.data.application.tls.Alert` for + :class:`~pcapkit.protocols.application.ssl.data.Alert` for :attr:`~pcapkit.const.tls.content_type.ContentType.alert`, a - :class:`~pcapkit.protocols.data.application.tls.ChangeCipherSpec` + :class:`~pcapkit.protocols.application.ssl.data.ChangeCipherSpec` for :attr:`~pcapkit.const.tls.content_type.ContentType.change_cipher_spec`, or ``fragment`` unchanged for every other content type -- application data, heartbeat, ACK, and any content type this @@ -1053,7 +1053,7 @@ def _read_tls_handshake_messages(self, fragment: 'bytes', *, :func:`~pcapkit.foundation.analysis.dtls.dtls_handshake` (:issue:`2440`). """ - from pcapkit.protocols.data.application.dtls import \ + from pcapkit.protocols.application.dtls.data import \ DTLSHandshake as Data_DTLSHandshake # pylint: disable=import-outside-toplevel messages = [] # type: list[Any] diff --git a/pcapkit/protocols/application/sslv2/__init__.py b/pcapkit/protocols/application/sslv2/__init__.py new file mode 100644 index 0000000000..fa93c432b5 --- /dev/null +++ b/pcapkit/protocols/application/sslv2/__init__.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""SSLv2 - Secure Sockets Layer version 2 +============================================ + +.. module:: pcapkit.protocols.application.sslv2 + +:mod:`pcapkit.protocols.application.sslv2` holds the dissector, +:class:`~pcapkit.protocols.application.sslv2.protocol.SSLv2`, in +:mod:`~pcapkit.protocols.application.sslv2.protocol`, its header schema in +:mod:`~pcapkit.protocols.application.sslv2.schema` and its data model in +:mod:`~pcapkit.protocols.application.sslv2.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.application.sslv2.protocol import SSLv2 + +# Header Schemas +from pcapkit.protocols.application.sslv2.schema import ClientHello as Schema_ClientHello +from pcapkit.protocols.application.sslv2.schema import HandshakeBody as Schema_HandshakeBody +from pcapkit.protocols.application.sslv2.schema import ServerHello as Schema_ServerHello +from pcapkit.protocols.application.sslv2.schema import SSLv2 as Schema_SSLv2 +from pcapkit.protocols.application.sslv2.schema import \ + UnknownHandshakeBody as Schema_UnknownHandshakeBody + +# Data Models +from pcapkit.protocols.application.sslv2.data import ClientHello as Data_ClientHello +from pcapkit.protocols.application.sslv2.data import ServerHello as Data_ServerHello +from pcapkit.protocols.application.sslv2.data import SSLv2 as Data_SSLv2 + +__all__ = ['SSLv2'] diff --git a/pcapkit/protocols/data/application/sslv2.py b/pcapkit/protocols/application/sslv2/data.py similarity index 97% rename from pcapkit/protocols/data/application/sslv2.py rename to pcapkit/protocols/application/sslv2/data.py index 06da81754c..5400afbadb 100644 --- a/pcapkit/protocols/data/application/sslv2.py +++ b/pcapkit/protocols/application/sslv2/data.py @@ -4,8 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.data import Data -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Data, Protocol if TYPE_CHECKING: from pcapkit.const.sslv2.handshake_type import HandshakeType diff --git a/pcapkit/protocols/application/sslv2.py b/pcapkit/protocols/application/sslv2/protocol.py similarity index 93% rename from pcapkit/protocols/application/sslv2.py rename to pcapkit/protocols/application/sslv2/protocol.py index e0d568feb1..0284059a25 100644 --- a/pcapkit/protocols/application/sslv2.py +++ b/pcapkit/protocols/application/sslv2/protocol.py @@ -2,10 +2,10 @@ """SSLv2 - Secure Sockets Layer version 2 ============================================ -.. module:: pcapkit.protocols.application.sslv2 +.. module:: pcapkit.protocols.application.sslv2.protocol -:mod:`pcapkit.protocols.application.sslv2` contains -:class:`~pcapkit.protocols.application.sslv2.SSLv2` only, +:mod:`pcapkit.protocols.application.sslv2.protocol` contains +:class:`~pcapkit.protocols.application.sslv2.protocol.SSLv2` only, which implements an extractor for Secure Sockets Layer version 2 (SSLv2) [*]_, as defined by the (long expired) Netscape draft that introduced it. @@ -14,7 +14,7 @@ content-type byte and no ``0x03xx``-style record version, its record header is 2 or 3 octets rather than a fixed 5, and its handshake message type is the first octet of the record's data rather than a separate record-layer -field. See :func:`~pcapkit.protocols.schema.application.sslv2.sslv2_record_length` +field. See :func:`~pcapkit.protocols.application.sslv2.schema.sslv2_record_length` for the header's exact shape. SSLv1 has no module here, nor does it need one: it was never publicly @@ -27,7 +27,7 @@ actually ciphertext (e.g. a replayed or malformed capture) is only partly caught. Before decoding, the body's own declared sub-field lengths are checked against the record's ``RECORD-LENGTH`` (see -:func:`~pcapkit.protocols.schema.application.sslv2.sslv2_hello_probe_is_plausible`): +:func:`~pcapkit.protocols.application.sslv2.schema.sslv2_hello_probe_is_plausible`): when they do not add up, the body is kept as raw octets instead. When they happen to add up, the ciphertext still decodes as if it were the hello's own fields, rather than failing cleanly. ``CIPHER-SPECS-DATA`` itself is kept as @@ -46,7 +46,7 @@ ``SSLv2:SSLv2``. The exceptions: * A whole record that fails to decode -- a ``RECORD-LENGTH`` of ``0``, which - leaves no ``MSG-TYPE`` -- becomes :class:`~pcapkit.protocols.misc.raw.Raw` + leaves no ``MSG-TYPE`` -- becomes :class:`~pcapkit.protocols.misc.raw.protocol.Raw` together with everything after it. * Octets that open no record -- a header cut short, or a record the segment ends inside -- stay raw, with no error. @@ -63,16 +63,16 @@ from pcapkit.const.sslv2.handshake_type import HandshakeType as Enum_HandshakeType from pcapkit.const.sslv2.version import Version as Enum_Version from pcapkit.corekit.decorators import beholder -from pcapkit.protocols.application.ssl import SSL -from pcapkit.protocols.data.application.sslv2 import ClientHello as Data_ClientHello -from pcapkit.protocols.data.application.sslv2 import ServerHello as Data_ServerHello -from pcapkit.protocols.data.application.sslv2 import SSLv2 as Data_SSLv2 -from pcapkit.protocols.schema.application.sslv2 import ClientHello as Schema_ClientHello -from pcapkit.protocols.schema.application.sslv2 import ServerHello as Schema_ServerHello -from pcapkit.protocols.schema.application.sslv2 import SSLv2 as Schema_SSLv2 -from pcapkit.protocols.schema.application.sslv2 import \ +from pcapkit.protocols.application.ssl.protocol import SSL +from pcapkit.protocols.application.sslv2.data import ClientHello as Data_ClientHello +from pcapkit.protocols.application.sslv2.data import ServerHello as Data_ServerHello +from pcapkit.protocols.application.sslv2.data import SSLv2 as Data_SSLv2 +from pcapkit.protocols.application.sslv2.schema import ClientHello as Schema_ClientHello +from pcapkit.protocols.application.sslv2.schema import ServerHello as Schema_ServerHello +from pcapkit.protocols.application.sslv2.schema import SSLv2 as Schema_SSLv2 +from pcapkit.protocols.application.sslv2.schema import \ UnknownHandshakeBody as Schema_UnknownHandshakeBody -from pcapkit.protocols.schema.application.sslv2 import sslv2_record_length +from pcapkit.protocols.application.sslv2.schema import sslv2_record_length from pcapkit.utilities.exceptions import ProtocolError if TYPE_CHECKING: @@ -81,7 +81,7 @@ from typing_extensions import Literal from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema __all__ = ['SSLv2'] @@ -114,9 +114,9 @@ class SSLv2(SSL[Data_SSLv2, Schema_SSLv2], Note: This class is not bound to TCP port 443 in - :attr:`TCP.__proto__ `: + :attr:`TCP.__proto__ `: SSLv3 and TLS reuse that port. On 443 it is reached only as - :class:`~pcapkit.protocols.application.tls.TLS`'s fallback, after + :class:`~pcapkit.protocols.application.tls.protocol.TLS`'s fallback, after TLS has rejected the record. Callers that know a stream is SSLv2 construct this class directly. @@ -262,8 +262,8 @@ def make(self, padding: The header's third, padding octet; only meaningful -- and only written -- for the 3-octet header form. body: Handshake message body. A :obj:`dict` or a - :class:`~pcapkit.protocols.data.application.sslv2.ClientHello` - /:class:`~pcapkit.protocols.data.application.sslv2.ServerHello` + :class:`~pcapkit.protocols.application.sslv2.data.ClientHello` + /:class:`~pcapkit.protocols.application.sslv2.data.ServerHello` data model builds the body according to ``msg_type``, which must then be ``CLIENT_HELLO`` or ``SERVER_HELLO`` respectively; omitting it, i.e. :data:`None`, builds an @@ -271,7 +271,7 @@ def make(self, taken as is. Raw :obj:`bytes` are written verbatim. A message type whose body this package does not parse is given its body as :obj:`bytes` or as an - :class:`~pcapkit.protocols.schema.application.sslv2.UnknownHandshakeBody`. + :class:`~pcapkit.protocols.application.sslv2.schema.UnknownHandshakeBody`. payload: Octets after the record, e.g. the next record. **kwargs: Arbitrary keyword arguments. @@ -285,8 +285,8 @@ def make(self, such a value for its 16-bit field; if ``body`` is a :obj:`dict` and ``msg_type`` is not ``CLIENT_HELLO``/``SERVER_HELLO``; if ``body`` is a - :class:`~pcapkit.protocols.data.application.sslv2.ClientHello`/ - :class:`~pcapkit.protocols.data.application.sslv2.ServerHello` + :class:`~pcapkit.protocols.application.sslv2.data.ClientHello`/ + :class:`~pcapkit.protocols.application.sslv2.data.ServerHello` data model and ``msg_type`` does not match it (``CLIENT_HELLO`` for the former, ``SERVER_HELLO`` for the latter); if ``body`` is of a type this maker does not recognise; if the @@ -503,7 +503,7 @@ def _import_next_layer(self, proto: 'int', length: 'Optional[int]' = None, *, # A TCP segment may carry several records (:issue:`2567`). So the ``-1`` remainder is dissected as this class when :func:`_opens_whole_record` finds a whole record opening it, and is otherwise kept as - :class:`~pcapkit.protocols.misc.raw.Raw`, as + :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, as :meth:`Application._import_next_layer ` keeps it. A partial record, which the segment ends inside, is the @@ -537,7 +537,7 @@ def _import_next_record(self, proto: 'int', length: 'Optional[int]' = None, *, packet: packet info (passed from :meth:`self.unpack `) Returns: - Instance of this class, or of :class:`~pcapkit.protocols.misc.raw.Raw` + Instance of this class, or of :class:`~pcapkit.protocols.misc.raw.protocol.Raw` when :func:`~pcapkit.corekit.decorators.beholder` replaces a record that fails to parse. diff --git a/pcapkit/protocols/schema/application/sslv2.py b/pcapkit/protocols/application/sslv2/schema.py similarity index 95% rename from pcapkit/protocols/schema/application/sslv2.py rename to pcapkit/protocols/application/sslv2/schema.py index 223371c150..3b8a815709 100644 --- a/pcapkit/protocols/schema/application/sslv2.py +++ b/pcapkit/protocols/application/sslv2/schema.py @@ -11,7 +11,7 @@ SchemaField, SwitchField) from pcapkit.corekit.fields.numbers import EnumField, UInt8Field, UInt16Field from pcapkit.corekit.fields.strings import BytesField -from pcapkit.protocols.schema.schema import EnumSchema, Schema, schema_final +from pcapkit.protocols.schema import EnumSchema, Schema, schema_final __all__ = [ 'SSLv2', @@ -133,7 +133,7 @@ def sslv2_body_selector(packet: 'dict[str, Any]') -> 'Field': A :class:`~pcapkit.corekit.fields.misc.SchemaField` wrapped :class:`HandshakeBody` instance, of whichever subclass :attr:`HandshakeBody.registry - ` maps + ` maps ``packet['msg_type']`` to, sized to the record's remaining declared length -- the record's own ``RECORD-LENGTH``, the one octet :attr:`SSLv2.msg_type` already consumed excluded. For ``CLIENT-HELLO``/``SERVER-HELLO``, falls back @@ -142,7 +142,7 @@ def sslv2_body_selector(packet: 'dict[str, Any]') -> 'Field': Note: A malformed ``RECORD-LENGTH = 0`` sizes the body to ``0``, not to the - rest of the buffer; :meth:`~pcapkit.protocols.application.sslv2.SSLv2.read` reports it. + rest of the buffer; :meth:`~pcapkit.protocols.application.sslv2.protocol.SSLv2.read` reports it. """ msg_type = cast('Enum_HandshakeType', packet['msg_type']) @@ -161,15 +161,15 @@ def sslv2_body_selector(packet: 'dict[str, Any]') -> 'Field': class HandshakeBody(EnumSchema[Enum_HandshakeType]): """Header schema for SSLv2 handshake message bodies. - Unlike :class:`~pcapkit.protocols.schema.transport.tcp.Option` and its + Unlike :class:`~pcapkit.protocols.transport.tcp.schema.Option` and its siblings, this base class declares no field of its own for the discriminator: :attr:`SSLv2.msg_type` already consumes that octet in the enclosing schema, before :attr:`SSLv2.body` dispatches here, so every concrete subclass's own first field starts at the body's first octet -- the same arrangement - :class:`~pcapkit.protocols.schema.application.httpv2.FrameType` uses for + :class:`~pcapkit.protocols.application.httpv2.schema.FrameType` uses for HTTP/2 frame payloads, where ``type`` is consumed by the outer - :class:`~pcapkit.protocols.schema.application.httpv2.HTTPv2` schema. + :class:`~pcapkit.protocols.application.httpv2.schema.HTTPv2` schema. """ @@ -184,7 +184,7 @@ class UnknownHandshakeBody(HandshakeBody): fails :func:`sslv2_hello_probe_is_plausible`, e.g. ciphertext. Keeping the undissected body, rather than losing the whole record, - matches :class:`~pcapkit.protocols.schema.application.httpv2.UnassignedFrame`. + matches :class:`~pcapkit.protocols.application.httpv2.schema.UnassignedFrame`. """ @@ -266,8 +266,8 @@ class SSLv2(Schema): :attr:`msg_type` is the one octet the `SSLv2 draft`_ puts at the front of every record's data rather than in the header proper, and it is read here, ahead of :attr:`body`, for the same reason - :attr:`~pcapkit.protocols.schema.application.httpv2.HTTPv2.type` is read - ahead of :attr:`~pcapkit.protocols.schema.application.httpv2.HTTPv2.frame`. + :attr:`~pcapkit.protocols.application.httpv2.schema.HTTPv2.type` is read + ahead of :attr:`~pcapkit.protocols.application.httpv2.schema.HTTPv2.frame`. .. _SSLv2 draft: https://datatracker.ietf.org/doc/html/draft-hickman-netscape-ssl-00 diff --git a/pcapkit/protocols/application/sslv3/__init__.py b/pcapkit/protocols/application/sslv3/__init__.py new file mode 100644 index 0000000000..eab5f9aaa5 --- /dev/null +++ b/pcapkit/protocols/application/sslv3/__init__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +"""SSLv3 - Secure Sockets Layer version 3 +============================================ + +.. module:: pcapkit.protocols.application.sslv3 + +:mod:`pcapkit.protocols.application.sslv3` holds the dissector, +:class:`~pcapkit.protocols.application.sslv3.protocol.SSLv3`, in +:mod:`~pcapkit.protocols.application.sslv3.protocol`. + +""" +from pcapkit.protocols.application.sslv3.protocol import SSLv3 + +__all__ = ['SSLv3'] diff --git a/pcapkit/protocols/application/sslv3.py b/pcapkit/protocols/application/sslv3/protocol.py similarity index 58% rename from pcapkit/protocols/application/sslv3.py rename to pcapkit/protocols/application/sslv3/protocol.py index b835b2383f..4e98377353 100644 --- a/pcapkit/protocols/application/sslv3.py +++ b/pcapkit/protocols/application/sslv3/protocol.py @@ -2,16 +2,16 @@ """SSLv3 - Secure Sockets Layer version 3 ============================================ -.. module:: pcapkit.protocols.application.sslv3 +.. module:: pcapkit.protocols.application.sslv3.protocol -:mod:`pcapkit.protocols.application.sslv3` contains -:class:`~pcapkit.protocols.application.sslv3.SSLv3` only, +:mod:`pcapkit.protocols.application.sslv3.protocol` contains +:class:`~pcapkit.protocols.application.sslv3.protocol.SSLv3` only, which implements an extractor for Secure Sockets Layer version 3 (SSLv3) [*]_, whose record is the one -:mod:`pcapkit.protocols.application.tls` describes. +:mod:`pcapkit.protocols.application.tls.protocol` describes. -Nothing dispatches to :class:`~pcapkit.protocols.application.sslv3.SSLv3`: -an SSLv3 record parses as :class:`~pcapkit.protocols.application.tls.TLS` +Nothing dispatches to :class:`~pcapkit.protocols.application.sslv3.protocol.SSLv3`: +an SSLv3 record parses as :class:`~pcapkit.protocols.application.tls.protocol.TLS` with alias ``SSLv3``. .. [*] https://datatracker.ietf.org/doc/html/rfc6101 @@ -21,9 +21,9 @@ """ from typing import TYPE_CHECKING -from pcapkit.protocols.application.tls import TLS -from pcapkit.protocols.data.application.tls import TLS as Data_TLS -from pcapkit.protocols.schema.application.tls import TLS as Schema_TLS +from pcapkit.protocols.application.tls.data import TLS as Data_TLS +from pcapkit.protocols.application.tls.protocol import TLS +from pcapkit.protocols.application.tls.schema import TLS as Schema_TLS if TYPE_CHECKING: from typing_extensions import Literal @@ -35,10 +35,10 @@ class SSLv3(TLS, schema=Schema_TLS, data=Data_TLS): """This class implements Secure Sockets Layer version 3. Dispatch never constructs it: an SSLv3 record parses as - :class:`~pcapkit.protocols.application.tls.TLS` with - :attr:`~pcapkit.protocols.application.tls.TLS.alias` ``'SSLv3'``. Like - :class:`~pcapkit.protocols.link.inarp.InARP` to - :class:`~pcapkit.protocols.link.arp.ARP`, it narrows :meth:`id` only. + :class:`~pcapkit.protocols.application.tls.protocol.TLS` with + :attr:`~pcapkit.protocols.application.tls.protocol.TLS.alias` ``'SSLv3'``. Like + :class:`~pcapkit.protocols.link.inarp.protocol.InARP` to + :class:`~pcapkit.protocols.link.arp.protocol.ARP`, it narrows :meth:`id` only. """ diff --git a/pcapkit/protocols/application/tls/__init__.py b/pcapkit/protocols/application/tls/__init__.py new file mode 100644 index 0000000000..3def83573b --- /dev/null +++ b/pcapkit/protocols/application/tls/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""TLS/SSL - Transport Layer Security +======================================== + +.. module:: pcapkit.protocols.application.tls + +:mod:`pcapkit.protocols.application.tls` holds the dissector, +:class:`~pcapkit.protocols.application.tls.protocol.TLS`, in +:mod:`~pcapkit.protocols.application.tls.protocol`, its header schema in +:mod:`~pcapkit.protocols.application.tls.schema` and its data model in +:mod:`~pcapkit.protocols.application.tls.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.application.tls.protocol import TLS + +# Header Schemas +from pcapkit.protocols.application.tls.schema import TLS as Schema_TLS + +# Data Models +from pcapkit.protocols.application.tls.data import TLS as Data_TLS + +__all__ = ['TLS'] diff --git a/pcapkit/protocols/application/tls/data.py b/pcapkit/protocols/application/tls/data.py new file mode 100644 index 0000000000..cee32dac83 --- /dev/null +++ b/pcapkit/protocols/application/tls/data.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +"""data models for TLS protocol""" + +from typing import TYPE_CHECKING + +from pcapkit.corekit.infoclass import info_final +from pcapkit.protocols.data import Protocol + +if TYPE_CHECKING: + from typing import Any + + from pcapkit.const.tls.content_type import ContentType as Enum_ContentType + +__all__ = [ + 'TLS', +] + + +@info_final +class TLS(Protocol): + """Data model for TLS protocol.""" + + #: Content type. + content_type: 'Enum_ContentType' + #: Legacy record version (``major << 8 | minor``). + version: 'int' + #: Length of the record fragment. + length: 'int' + #: Decoded record content. For ``handshake``, ``alert``, and + #: ``change_cipher_spec``, this is a tuple of :class:`~pcapkit.protocols.application.ssl.data.Handshake`, an + #: :class:`~pcapkit.protocols.application.ssl.data.Alert`, or a + #: :class:`~pcapkit.protocols.application.ssl.data.ChangeCipherSpec` respectively *only when the record is + #: cleartext* (as decided by + #: :meth:`SSL._tls_content_is_cleartext + #: `) -- + #: an encrypted record of any of those three types, which is the common + #: case for TLS 1.2 post-handshake traffic, stays raw :obj:`bytes` instead, + #: same as every other content type. + content: 'Any' + + if TYPE_CHECKING: + def __init__(self, content_type: 'Enum_ContentType', version: 'int', length: 'int', content: 'Any') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements,line-too-long diff --git a/pcapkit/protocols/application/tls.py b/pcapkit/protocols/application/tls/protocol.py similarity index 91% rename from pcapkit/protocols/application/tls.py rename to pcapkit/protocols/application/tls/protocol.py index 5019c77a16..c9200cec3d 100644 --- a/pcapkit/protocols/application/tls.py +++ b/pcapkit/protocols/application/tls/protocol.py @@ -2,18 +2,18 @@ """TLS/SSL - Transport Layer Security ======================================== -.. module:: pcapkit.protocols.application.tls +.. module:: pcapkit.protocols.application.tls.protocol -:mod:`pcapkit.protocols.application.tls` contains -:class:`~pcapkit.protocols.application.tls.TLS` only, +:mod:`pcapkit.protocols.application.tls.protocol` contains +:class:`~pcapkit.protocols.application.tls.protocol.TLS` only, which implements an extractor for the TLS/SSLv3+ record-layer family -- SSLv3, TLS 1.0, TLS 1.1, TLS 1.2 (:rfc:`5246`) and TLS 1.3 (:rfc:`9846`, which obsoletes :rfc:`5077`, :rfc:`5246`, :rfc:`6961`, :rfc:`7627`, :rfc:`8422` and :rfc:`8446`). :attr:`TCP.__proto__ -` binds :class:`TLS` at port +` binds :class:`TLS` at port 443. Every tier shares one record header, so :meth:`~TLS.read` sets :attr:`~TLS.alias` (and, for SSLv3, :attr:`~TLS.name`) from the record's -legacy version, as :class:`~pcapkit.protocols.link.arp.ARP` does by +legacy version, as :class:`~pcapkit.protocols.link.arp.protocol.ARP` does by operation code, rather than dispatching to per-version classes. Decoded Fields @@ -21,13 +21,13 @@ * The record header, always: it is never encrypted. * A **cleartext** ``handshake``, ``alert`` or ``change_cipher_spec`` record - (:meth:`SSL._tls_content_is_cleartext ` + (:meth:`SSL._tls_content_is_cleartext ` decides which are): * ``ClientHello``/``ServerHello`` down to their cipher suites, compression methods and extensions, and ``EncryptedExtensions`` down to its extensions; an extension's body decodes where - :attr:`SSL.__extension__ ` + :attr:`SSL.__extension__ ` registers a decoder for its type. * Every other handshake message at type and length only. * ``Alert`` and ``ChangeCipherSpec`` in full. @@ -44,7 +44,7 @@ ``TCP:TLS 1.3:TLS 1.2``. The exceptions: * A whole record that fails to decode becomes - :class:`~pcapkit.protocols.misc.raw.Raw` together with everything after it, + :class:`~pcapkit.protocols.misc.raw.protocol.Raw` together with everything after it, with no SSLv2 trial. * Octets that open no record -- an unsupported content type, a legacy version outside ``0x03xx``, or a header cut short -- stay raw, with no error. @@ -57,7 +57,7 @@ ---------------- **A record split across two TCP segments is not reassembled**, and decodes as -:class:`~pcapkit.protocols.misc.raw.Raw`, as does the partial record a segment +:class:`~pcapkit.protocols.misc.raw.protocol.Raw`, as does the partial record a segment ends inside. A record may be up to 16 KiB against a typical 1460-octet MSS, so this is routine. @@ -68,14 +68,14 @@ from pcapkit.const.tls.content_type import ContentType as Enum_ContentType from pcapkit.corekit.decorators import beholder -from pcapkit.protocols.application.ssl import (_TLS_VERSION_MAJOR, _WIRE_CONTENT_TYPES, SSL, - TLS13_VERSION) -from pcapkit.protocols.application.sslv2 import SSLv2 -from pcapkit.protocols.data.application.sslv2 import ClientHello as SSLv2_ClientHello -from pcapkit.protocols.data.application.sslv2 import ServerHello as SSLv2_ServerHello -from pcapkit.protocols.data.application.sslv2 import SSLv2 as SSLv2_Data -from pcapkit.protocols.data.application.tls import TLS as Data_TLS -from pcapkit.protocols.schema.application.tls import TLS as Schema_TLS +from pcapkit.protocols.application.ssl.protocol import (_TLS_VERSION_MAJOR, _WIRE_CONTENT_TYPES, + SSL, TLS13_VERSION) +from pcapkit.protocols.application.sslv2.data import ClientHello as SSLv2_ClientHello +from pcapkit.protocols.application.sslv2.data import ServerHello as SSLv2_ServerHello +from pcapkit.protocols.application.sslv2.data import SSLv2 as SSLv2_Data +from pcapkit.protocols.application.sslv2.protocol import SSLv2 +from pcapkit.protocols.application.tls.data import TLS as Data_TLS +from pcapkit.protocols.application.tls.schema import TLS as Schema_TLS from pcapkit.utilities.contextvars import beholding from pcapkit.utilities.exceptions import ProtocolError from pcapkit.utilities.warnings import hold_warnings @@ -86,7 +86,7 @@ from typing_extensions import Literal from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema __all__ = ['TLS'] @@ -116,7 +116,7 @@ def _opens_whole_record(data: 'bytes') -> 'bool': Only the record header is read, against the same checks as :meth:`SSL._validate_tls_record - `: a content + `: a content type a genuine record carries, a ``0x03xx`` legacy version, and a fragment that ends inside ``data``. @@ -136,7 +136,7 @@ def _opens_whole_record(data: 'bytes') -> 'bool': class TLS(SSL[Data_TLS, Schema_TLS], schema=Schema_TLS, data=Data_TLS): """This class implements all protocols in the TLS/SSLv3+ record-layer family. - - Secure Sockets Layer version 3 (:class:`~pcapkit.protocols.application.sslv3.SSLv3`) + - Secure Sockets Layer version 3 (:class:`~pcapkit.protocols.application.sslv3.protocol.SSLv3`) - Transport Layer Security 1.0 [:rfc:`2246`] - Transport Layer Security 1.1 [:rfc:`4346`] - Transport Layer Security 1.2 [:rfc:`5246`] @@ -144,7 +144,7 @@ class TLS(SSL[Data_TLS, Schema_TLS], schema=Schema_TLS, data=Data_TLS): Note: The subpackage does not track the dispatch tier: TLS is dispatched - from :attr:`TCP.__proto__ ` + from :attr:`TCP.__proto__ ` at port 443, the ``https`` service name IANA assigns there. See :func:`pcapkit.foundation.registry.protocols.transport.register_tcp`. @@ -176,7 +176,7 @@ def alias(self) -> 'Literal["TLS", "SSLv3", "TLS 1.0", "TLS 1.1", "TLS 1.2", "TL @property def length(self) -> 'int': """Header length of current protocol -- the fixed record header, - :attr:`~pcapkit.protocols.data.application.tls.TLS.length`'s fragment + :attr:`~pcapkit.protocols.application.tls.data.TLS.length`'s fragment excluded; or, once :meth:`unpack` has adopted an SSLv2 record, that record's own 2- or 3-octet header. @@ -214,7 +214,7 @@ def read(self, length: 'Optional[int]' = None, **kwargs: 'Any') -> 'Data_TLS': Raises: ProtocolError: If the payload is not a TLS record (see :meth:`_read_tls_record`), which :meth:`unpack` then offers - to :class:`~pcapkit.protocols.application.sslv2.SSLv2`. + to :class:`~pcapkit.protocols.application.sslv2.protocol.SSLv2`. """ if length is None: @@ -236,10 +236,10 @@ def make(self, ``0x0303`` for TLS 1.2 and (the legacy value TLS 1.3 keeps here) TLS 1.3. content: Record content: a :obj:`tuple` of - :class:`~pcapkit.protocols.data.application.tls.Handshake` + :class:`~pcapkit.protocols.application.ssl.data.Handshake` for ``handshake``, an - :class:`~pcapkit.protocols.data.application.tls.Alert`, a - :class:`~pcapkit.protocols.data.application.tls.ChangeCipherSpec`, + :class:`~pcapkit.protocols.application.ssl.data.Alert`, a + :class:`~pcapkit.protocols.application.ssl.data.ChangeCipherSpec`, or raw :obj:`bytes`, as :meth:`read` would decode it. data: Pre-encoded record fragment. When given, it is used verbatim in place of ``content`` and ``length`` is computed @@ -281,7 +281,7 @@ def unpack(self, length: 'Optional[int]' = None, *, chained: 'bool' = False, # TLS is tried first: the record header and :meth:`read`. Only when that trial rejects the first record of a segment is the payload offered - to :class:`~pcapkit.protocols.application.sslv2.SSLv2`, whose own header + to :class:`~pcapkit.protocols.application.sslv2.protocol.SSLv2`, whose own header checks are strict, so a genuine TLS record is never taken as SSLv2. Args: @@ -334,7 +334,7 @@ def from_data(cls, data: 'Any', **kwargs: 'Any') -> 'Any': `. Returns: - Protocol instance: an :class:`~pcapkit.protocols.application.sslv2.SSLv2` + Protocol instance: an :class:`~pcapkit.protocols.application.sslv2.protocol.SSLv2` for an SSLv2 record, otherwise a TLS instance. """ @@ -359,9 +359,9 @@ def __index__(cls) -> 'int': # type: ignore[override] port numbers: TCP port 443, the port of :attr:`TCP.https_443 ` as an :class:`int`, which - :attr:`TCP.__proto__ ` + :attr:`TCP.__proto__ ` dispatches here (:ref:`registry-protocol-index`). - :class:`~pcapkit.protocols.application.sslv3.SSLv3` inherits it. + :class:`~pcapkit.protocols.application.sslv3.protocol.SSLv3` inherits it. .. _IANA: https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml @@ -410,7 +410,7 @@ def _read_tls_record(self, length: 'Optional[int]' = None, **kwargs: 'Any') -> ' The legacy version names the tier, except that TLS 1.3 reuses ``0x0303`` (or ``0x0301`` on an initial ``ClientHello``) and is found by peeking ``supported_versions`` (:meth:`SSL._tls_negotiates - `). An unknown + `). An unknown ``0x03xx`` keeps the generic ``'TLS'`` alias. Args: @@ -460,7 +460,7 @@ def _read_sslv2_fallback(self, length: 'int', **kwargs: 'Any') -> 'Optional[Any] Only a complete CLIENT-HELLO or SERVER-HELLO is accepted: the whole record must sit in this segment, and its body must pass the hello - length probe. Anything else stays :class:`~pcapkit.protocols.misc.raw.Raw`. + length probe. Anything else stays :class:`~pcapkit.protocols.misc.raw.protocol.Raw`. Args: length: Length of packet data. @@ -508,7 +508,7 @@ def _import_next_layer(self, proto: 'int', length: 'Optional[int]' = None, *, # A TCP segment may carry several records (:issue:`2517`). So the ``-1`` remainder is dissected as this class when :func:`_opens_whole_record` finds a whole record opening it, and is otherwise kept as - :class:`~pcapkit.protocols.misc.raw.Raw`, as + :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, as :meth:`Application._import_next_layer ` keeps it. A partial record, which the segment ends inside, is the @@ -542,7 +542,7 @@ def _import_next_record(self, proto: 'int', length: 'Optional[int]' = None, *, packet: packet info (passed from :meth:`self.unpack `) Returns: - Instance of this class, or of :class:`~pcapkit.protocols.misc.raw.Raw` + Instance of this class, or of :class:`~pcapkit.protocols.misc.raw.protocol.Raw` when :func:`~pcapkit.corekit.decorators.beholder` replaces a record that fails to parse, with no SSLv2 trial (see :meth:`unpack`). diff --git a/pcapkit/protocols/schema/application/tls.py b/pcapkit/protocols/application/tls/schema.py similarity index 87% rename from pcapkit/protocols/schema/application/tls.py rename to pcapkit/protocols/application/tls/schema.py index 61feeb04a6..e1cd5dbc47 100644 --- a/pcapkit/protocols/schema/application/tls.py +++ b/pcapkit/protocols/application/tls/schema.py @@ -8,7 +8,7 @@ from pcapkit.corekit.fields.misc import PayloadField from pcapkit.corekit.fields.numbers import EnumField, UInt16Field from pcapkit.corekit.fields.strings import BytesField -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final __all__ = ['TLS'] @@ -21,9 +21,9 @@ class TLS(Schema): """Header schema for TLS record layer packet. The record header has :class:`DTLS - `'s fields minus the epoch + `'s fields minus the epoch and sequence number (:rfc:`9846#section-5.1`). :attr:`fragment` is decoded - by :class:`~pcapkit.protocols.application.ssl.SSL`, which DTLS shares. + by :class:`~pcapkit.protocols.application.ssl.protocol.SSL`, which DTLS shares. """ diff --git a/pcapkit/protocols/data/data.py b/pcapkit/protocols/data.py similarity index 79% rename from pcapkit/protocols/data/data.py rename to pcapkit/protocols/data.py index 60d10b7750..8ca80b4a01 100644 --- a/pcapkit/protocols/data/data.py +++ b/pcapkit/protocols/data.py @@ -3,9 +3,11 @@ from typing import TYPE_CHECKING -from pcapkit.corekit.infoclass import Info +from pcapkit.corekit.infoclass import Info, info_final -__all__ = ['Data'] +__all__ = [ + 'Data', 'Packet' +] if TYPE_CHECKING: from typing import Type @@ -48,3 +50,24 @@ class Data(Info): #: ``from_data(info)`` does. See #: :func:`~pcapkit.corekit.schema.shortread.keep_short_read`. __short_read__: 'tuple[str, int]' + + +class Protocol(Data): + """Root protocol.""" + + if TYPE_CHECKING: + #: Packet payload. + packet: 'bytes' + + +@info_final +class Packet(Data): + """Header and payload data.""" + + #: packet header + header: 'bytes' + #: packet payload + payload: 'bytes' + + if TYPE_CHECKING: + def __init__(self, header: 'bytes', payload: 'bytes') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements diff --git a/pcapkit/protocols/data/__init__.py b/pcapkit/protocols/data/__init__.py deleted file mode 100644 index 3dfbcc6769..0000000000 --- a/pcapkit/protocols/data/__init__.py +++ /dev/null @@ -1,341 +0,0 @@ -# -*- coding: utf-8 -*- -# pylint: disable=unused-wildcard-import -"""data models for protocols""" - -# Base Class for Data Models -from pcapkit.protocols.data.data import * - -# Base Class for Protocols -from pcapkit.protocols.data.protocol import * - -# Link Layer Protocols -from pcapkit.protocols.data.link import * - -# Internet Layer Protocols -from pcapkit.protocols.data.internet import * - -# Transport Layer Protocols -from pcapkit.protocols.data.transport import * - -# Application Layer Protocols -from pcapkit.protocols.data.application import * - -# Utility Classes for Protocols -from pcapkit.protocols.data.misc import * - -__all__ = [ - # Base class for data models - 'Data', - - # Packet data - 'Packet', - - # PCAP file headers - 'PCAP_Header', 'PCAP_MagicNumber', - 'PCAP_Frame', 'PCAP_FrameInfo', - - # PCAP-NG file format - 'PCAPNG', - 'PCAPNG_Option', 'PCAPNG_UnknownOption', - 'PCAPNG_EndOfOption', 'PCAPNG_CommentOption', 'PCAPNG_CustomOption', - 'PCAPNG_IF_NameOption', 'PCAPNG_IF_DescriptionOption', 'PCAPNG_IF_IPv4AddrOption', 'PCAPNG_IF_IPv6AddrOption', - 'PCAPNG_IF_MACAddrOption', 'PCAPNG_IF_EUIAddrOption', 'PCAPNG_IF_SpeedOption', 'PCAPNG_IF_TSResolOption', - 'PCAPNG_IF_TZoneOption', 'PCAPNG_IF_FilterOption', 'PCAPNG_IF_OSOption', 'PCAPNG_IF_FCSLenOption', - 'PCAPNG_IF_TSOffsetOption', 'PCAPNG_IF_HardwareOption', 'PCAPNG_IF_TxSpeedOption', 'PCAPNG_IF_RxSpeedOption', - 'PCAPNG_EPB_FlagsOption', 'PCAPNG_EPB_HashOption', 'PCAPNG_EPB_DropCountOption', 'PCAPNG_EPB_PacketIDOption', - 'PCAPNG_EPB_QueueOption', 'PCAPNG_EPB_VerdictOption', - 'PCAPNG_NS_DNSNameOption', 'PCAPNG_NS_DNSIP4AddrOption', 'PCAPNG_NS_DNSIP6AddrOption', - 'PCAPNG_ISB_StartTimeOption', 'PCAPNG_ISB_EndTimeOption', 'PCAPNG_ISB_IFRecvOption', 'PCAPNG_ISB_IFDropOption', - 'PCAPNG_ISB_FilterAcceptOption', 'PCAPNG_ISB_OSDropOption', 'PCAPNG_ISB_UsrDelivOption', - 'PCAPNG_PACK_FlagsOption', 'PCAPNG_PACK_HashOption', - 'PCAPNG_NameResolutionRecord', 'PCAPNG_UnknownRecord', 'PCAPNG_EndRecord', 'PCAPNG_IPv4Record', 'PCAPNG_IPv6Record', - 'PCAPNG_DSBSecrets', 'PCAPNG_UnknownSecrets', 'PCAPNG_TLSKeyLogEntries', 'PCAPNG_TLSKeyLog', - 'PCAPNG_WireGuardKeyLog', 'PCAPNG_ZigBeeNWKKey', 'PCAPNG_ZigBeeAPSKey', - 'PCAPNG_UnknownBlock', 'PCAPNG_SectionHeaderBlock', 'PCAPNG_InterfaceDescriptionBlock', - 'PCAPNG_EnhancedPacketBlock', 'PCAPNG_SimplePacketBlock', 'PCAPNG_NameResolutionBlock', - 'PCAPNG_InterfaceStatisticsBlock', 'PCAPNG_SystemdJournalExportBlock', 'PCAPNG_DecryptionSecretsBlock', - 'PCAPNG_CustomBlock', 'PCAPNG_PacketBlock', - - # Address Resolution Protocol - 'ARP', 'ARP_Address', 'ARP_Type', - - # Ethernet Protocol - 'Ethernet', - - # Frame Relay Access Device - 'FRAD', - - # Generic Routing Encapsulation - 'GRE', - - # IEEE 802.11 MAC Header - 'IEEE802_11', 'IEEE802_11_FrameControl', 'IEEE802_11_SequenceControl', - 'IEEE802_11_QoSControl', 'IEEE802_11_HTControl', - - # Layer Two Tunnelling Protocol - 'L2TP', 'L2TP_Flags', - - # Linux "Cooked" Capture Encapsulation - 'LinuxSLL1', 'LinuxSLL2', - - # BSD Loopback Encapsulation - 'Loopback', - - # Netlink Socket Framing - 'Netlink', - - # IEEE 802.11 Radiotap Header - 'Radiotap', 'Radiotap_Field', 'Radiotap_Unknown', 'Radiotap_TSFT', 'Radiotap_Flags', - 'Radiotap_Rate', 'Radiotap_Channel', 'Radiotap_FHSS', 'Radiotap_AntennaSignal', - 'Radiotap_AntennaNoise', 'Radiotap_LockQuality', 'Radiotap_TXAttenuation', - 'Radiotap_DBTXAttenuation', 'Radiotap_DBmTXPower', 'Radiotap_Antenna', - 'Radiotap_DBAntennaSignal', 'Radiotap_DBAntennaNoise', 'Radiotap_RXFlags', - 'Radiotap_TXFlags', 'Radiotap_RTSRetries', 'Radiotap_DataRetries', 'Radiotap_MCS', - 'Radiotap_MCSFlags', 'Radiotap_AMPDUStatus', 'Radiotap_VHT', - 'Radiotap_Timestamp', 'Radiotap_HE', 'Radiotap_HEData1', 'Radiotap_HEData2', 'Radiotap_HEMU', - 'Radiotap_HEMUFlags1', 'Radiotap_HEMUFlags2', 'Radiotap_HEMUOtherUser', - 'Radiotap_ZeroLengthPSDU', 'Radiotap_LSIG', 'Radiotap_TLVFields', - 'Radiotap_RadiotapNamespace', 'Radiotap_VendorNamespace', 'Radiotap_S1G', 'Radiotap_USIG', - 'Radiotap_USIGCommon', 'Radiotap_EHT', 'Radiotap_TLV', 'Radiotap_VendorTLV', - - # 802.1Q/802.1ad VLAN Tag Types - 'VLAN', 'VLAN_TCI', - - # Authentication Header - 'AH', - - # Encapsulating Security Payload - 'ESP', - - # Host Identity Protocol - 'HIP', 'HIP_Control', - 'HIP_LocatorData', 'HIP_Locator', 'HIP_HostIdentity', 'HIP_Lifetime', 'HIP_Flags', - 'HIP_UnassignedParameter', 'HIP_ESPInfoParameter', 'HIP_R1CounterParameter', - 'HIP_LocatorSetParameter', 'HIP_PuzzleParameter', 'HIP_SolutionParameter', - 'HIP_SEQParameter', 'HIP_ACKParameter', 'HIP_DHGroupListParameter', - 'HIP_DiffieHellmanParameter', 'HIP_HIPTransformParameter', 'HIP_HIPCipherParameter', - 'HIP_NATTraversalModeParameter', 'HIP_TransactionPacingParameter', 'HIP_EncryptedParameter', - 'HIP_HostIDParameter', 'HIP_HITSuiteListParameter', 'HIP_CertParameter', - 'HIP_NotificationParameter', 'HIP_EchoRequestSignedParameter', 'HIP_RegInfoParameter', - 'HIP_RegRequestParameter', 'HIP_RegResponseParameter', 'HIP_RegFailedParameter', - 'HIP_RegFromParameter', 'HIP_EchoResponseSignedParameter', 'HIP_TransportFormatListParameter', - 'HIP_ESPTransformParameter', 'HIP_SeqDataParameter', 'HIP_AckDataParameter', - 'HIP_PayloadMICParameter', 'HIP_TransactionIDParameter', 'HIP_OverlayIDParameter', - 'HIP_RouteDstParameter', 'HIP_HIPTransportModeParameter', 'HIP_HIPMACParameter', - 'HIP_HIPMAC2Parameter', 'HIP_HIPSignature2Parameter', 'HIP_HIPSignatureParameter', - 'HIP_EchoRequestUnsignedParameter', 'HIP_EchoResponseUnsignedParameter', 'HIP_RelayFromParameter', - 'HIP_RelayToParameter', 'HIP_OverlayTTLParameter', 'HIP_RouteViaParameter', - 'HIP_FromParameter', 'HIP_RVSHMACParameter', 'HIP_ViaRVSParameter', - 'HIP_RelayHMACParameter', - - # Hop-by-Hop Options - 'HOPOPT', - 'HOPOPT_RPLFlags', 'HOPOPT_MPLFlags', 'HOPOPT_DFFFlags', - 'HOPOPT_SMFDPDOption', 'HOPOPT_QuickStartOption', - 'HOPOPT_UnassignedOption', 'HOPOPT_PadOption', 'HOPOPT_TunnelEncapsulationLimitOption', - 'HOPOPT_RouterAlertOption', 'HOPOPT_CALIPSOOption', 'HOPOPT_SMFIdentificationBasedDPDOption', - 'HOPOPT_SMFHashBasedDPDOption', 'HOPOPT_PDMOption', 'HOPOPT_QuickStartRequestOption', - 'HOPOPT_QuickStartReportOption', 'HOPOPT_RPLOption', 'HOPOPT_MPLOption', 'HOPOPT_ILNPOption', - 'HOPOPT_LineIdentificationOption', 'HOPOPT_JumboPayloadOption', 'HOPOPT_HomeAddressOption', - 'HOPOPT_IPDFFOption', - - # IP Pseudo-Header - 'IP_Pseudo', - - # Internet Control Message Protocol - 'ICMPv4', - 'ICMPv4_Unknown', 'ICMPv4_Echo', 'ICMPv4_DestinationUnreachable', 'ICMPv4_TimeExceeded', - 'ICMPv4_ParameterProblem', - - # Internet Control Message Protocol for IPv6 - 'ICMPv6', - 'ICMPv6_Unknown', 'ICMPv6_DestinationUnreachable', 'ICMPv6_PacketTooBig', 'ICMPv6_TimeExceeded', - 'ICMPv6_ParameterProblem', 'ICMPv6_Echo', - - # Internet Protocol version 4 - 'IPv4', - 'IPv4_ToSField', 'IPv4_Flags', - 'IPv4_OptionType', - 'IPv4_UnassignedOption', 'IPv4_EOOLOption', 'IPv4_NOPOption', - 'IPv4_SECOption', 'IPv4_LSROption', 'IPv4_TSOption', - 'IPv4_ESECOption', 'IPv4_RROption', 'IPv4_SIDOption', - 'IPv4_SSROption', 'IPv4_MTUPOption', 'IPv4_MTUROption', - 'IPv4_TROption', 'IPv4_RTRALTOption', 'IPv4_QSOption', - 'IPv4_QuickStartRequestOption', 'IPv4_QuickStartReportOption', - - # IPv6 Fragment Header - 'IPv6_Frag', - - # IPv6 Extension Header (base + generic) - 'IPv6_Ext', - - # IPv6 Destination Options Header - 'IPv6_Opts', - 'IPv6_Opts_RPLFlags', 'IPv6_Opts_MPLFlags', 'IPv6_Opts_DFFFlags', - 'IPv6_Opts_SMFDPDOption', 'IPv6_Opts_QuickStartOption', - 'IPv6_Opts_UnassignedOption', 'IPv6_Opts_PadOption', 'IPv6_Opts_TunnelEncapsulationLimitOption', - 'IPv6_Opts_RouterAlertOption', 'IPv6_Opts_CALIPSOOption', 'IPv6_Opts_SMFIdentificationBasedDPDOption', - 'IPv6_Opts_SMFHashBasedDPDOption', 'IPv6_Opts_PDMOption', 'IPv6_Opts_QuickStartRequestOption', - 'IPv6_Opts_QuickStartReportOption', 'IPv6_Opts_RPLOption', 'IPv6_Opts_MPLOption', 'IPv6_Opts_ILNPOption', - 'IPv6_Opts_LineIdentificationOption', 'IPv6_Opts_JumboPayloadOption', 'IPv6_Opts_HomeAddressOption', - 'IPv6_Opts_IPDFFOption', - - # IPv6 Routing Header - 'IPv6_Route', - 'IPv6_Route_UnknownType', 'IPv6_Route_SourceRoute', 'IPv6_Route_Type2', 'IPv6_Route_RPL', - - # Internet Group Management Protocol - 'IGMP', 'IGMPv3', 'IGMPv3_Query', 'IGMPv3_Report', 'IGMPv3_GroupRecord', - - # Internet Protocol version 6 - 'IPv6', - - # Internetwork Packet Exchange - 'IPX', - 'IPX_Address', - - # Mobility Header - 'MH', - 'MH_UnknownMessage', 'MH_BindingRefreshRequestMessage', 'MH_HomeTestInitMessage', 'MH_CareofTestInitMessage', - 'MH_HomeTestMessage', 'MH_CareofTestMessage', 'MH_BindingUpdateMessage', 'MH_BindingAcknowledgementMessage', - 'MH_BindingErrorMessage', 'MH_FastBindingUpdateMessage', 'MH_FastBindingAcknowledgmentMessage', - 'MH_FastNeighborAdvertisementMessage', 'MH_ExperimentalMessage', 'MH_HandoverInitiateMessage', - 'MH_HandoverAcknowledgeMessage', 'MH_HeartbeatMessage', 'MH_HomeAgentSwitchMessage', 'MH_BindingRevocationMessage', - 'MH_LocalizedRoutingInitiationMessage', 'MH_LocalizedRoutingAcknowledgmentMessage', 'MH_UpdateNotificationMessage', - 'MH_UpdateNotificationAcknowledgementMessage', 'MH_FlowBindingMessage', 'MH_SubscriptionQueryMessage', - 'MH_SubscriptionResponseMessage', - 'MH_Option', - 'MH_UnassignedOption', 'MH_PadOption', 'MH_BindingRefreshAdviceOption', 'MH_AlternateCareofAddressOption', - 'MH_NonceIndicesOption', 'MH_AuthorizationDataOption', 'MH_MobileNetworkPrefixOption', 'MH_LinkLayerAddressOption', - 'MH_MNIDOption', 'MH_AuthOption', 'MH_MesgIDOption', 'MH_CGAParametersRequestOption', 'MH_CGAParametersOption', - 'MH_SignatureOption', 'MH_PermanentHomeKeygenTokenOption', 'MH_CareofTestInitOption', 'MH_CareofTestOption', - 'MH_ExperimentalMobilityOption', 'MH_BADFOption', 'MH_IPv6AddressPrefixOption', 'MH_HomeNetworkPrefixOption', - 'MH_HandoffIndicatorOption', 'MH_AccessTechnologyTypeOption', 'MH_MNLLIdentifierOption', - 'MH_LinkLocalAddressOption', 'MH_TimestampOption', 'MH_RestartCounterOption', 'MH_DNSUpdateOption', - 'MH_VendorSpecificOption', 'MH_ServiceSelectionOption', 'MH_IPv4HomeAddressOption', - 'MH_IPv4AddressAcknowledgementOption', 'MH_NATDetectionOption', 'MH_IPv4CareofAddressOption', 'MH_GREKeyOption', - 'MH_BindingIdentifierOption', 'MH_IPv4HomeAddressRequestOption', 'MH_IPv4HomeAddressReplyOption', - 'MH_IPv4DefaultRouterAddressOption', 'MH_IPv4DHCPSupportModeOption', 'MH_ContextRequestOption', - 'MH_LMAAddressOption', 'MH_MNLLAIIDOption', 'MH_TransientBindingOption', 'MH_FlowSummaryOption', - 'MH_FlowIdentificationOption', 'MH_RedirectCapabilityOption', 'MH_RedirectOption', 'MH_LoadInformationOption', - 'MH_AlternateIPv4CareofAddressOption', 'MH_MNGroupIdentifierOption', 'MH_MAGIPv6AddressOption', - 'MH_AccessNetworkIdentifierOption', 'MH_IPv4TrafficOffloadSelectorOption', 'MH_DynamicIPMulticastSelectorOption', - 'MH_DelegatedMNPOption', 'MH_ActiveMulticastSubscriptionIPv4Option', 'MH_ActiveMulticastSubscriptionIPv6Option', - 'MH_QualityOfServiceOption', 'MH_LMAUserPlaneAddressOption', 'MH_MulticastMobilityOption', - 'MH_MulticastAcknowledgementOption', 'MH_LMAControlledMAGParametersOption', 'MH_MAGMultipathBindingOption', - 'MH_MAGIdentifierOption', 'MH_AnchoredPrefixOption', 'MH_LocalPrefixOption', 'MH_PreviousMAAROption', - 'MH_ServingMAAROption', 'MH_DLIFLinkLocalAddressOption', 'MH_DLIFLinkLayerAddressOption', - 'MH_NTPTimestamp', 'MH_PMIPv6Timestamp', - 'MH_ContextRequest', - 'MH_FlowIdentificationSuboption', - 'MH_UnassignedFlowIdentificationSuboption', 'MH_PadFlowIdentificationSuboption', 'MH_BIDReferenceSuboption', - 'MH_TrafficSelectorSuboption', 'MH_FlowBindingActionSuboption', 'MH_TargetCareofAddressSuboption', - 'MH_ANISuboption', - 'MH_UnassignedANISuboption', 'MH_ANINetworkIdentifierSuboption', 'MH_ANIGeoLocationSuboption', - 'MH_ANIOperatorIdentifierSuboption', 'MH_ANICivicLocationSuboption', 'MH_ANIMAGGroupIdentifierSuboption', - 'MH_ANIUpdateTimerSuboption', - 'MH_QoSAttribute', - 'MH_UnassignedQoSAttribute', 'MH_BitRateAttribute', 'MH_PerSessionBitRateAttribute', - 'MH_AllocationRetentionPriorityAttribute', 'MH_QoSTrafficSelectorAttribute', 'MH_QoSVendorSpecificAttribute', - 'MH_LMAControlledMAGSuboption', - 'MH_UnassignedLMAControlledMAGSuboption', 'MH_BindingReregistrationControlSuboption', - 'MH_HeartbeatControlSuboption', - 'MH_CGAParameter', - 'MH_CGAExtension', - 'MH_UnknownExtension', 'MH_MultiPrefixExtension', 'MH_ExperimentalExtension', - - # Datagram Congestion Control Protocol - 'DCCP', 'DCCP_AckVectorRun', 'DCCP_DataDroppedBlock', - 'DCCP_Option', - 'DCCP_UnassignedOption', 'DCCP_Padding', 'DCCP_Mandatory', 'DCCP_SlowReceiver', 'DCCP_Change', - 'DCCP_Confirm', 'DCCP_InitCookie', 'DCCP_NDPCount', 'DCCP_AckVector', 'DCCP_DataDropped', - 'DCCP_Timestamp', 'DCCP_TimestampEcho', 'DCCP_ElapsedTime', 'DCCP_DataChecksum', - - # Transmission Control Protocol - 'TCP', - 'TCP_Flags', 'TCP_SACKBlock', - 'TCP_Option', - 'TCP_UnassignedOption', 'TCP_EndOfOptionList', 'TCP_NoOperation', 'TCP_MaximumSegmentSize', 'TCP_WindowScale', - 'TCP_SACKPermitted', 'TCP_SACK', 'TCP_Echo', 'TCP_EchoReply', 'TCP_Timestamps', 'TCP_PartialOrderConnectionPermitted', # pylint: disable=line-too-long - 'TCP_PartialOrderServiceProfile', 'TCP_CC', 'TCP_CCNew', 'TCP_CCEcho', 'TCP_AlternateChecksumRequest', - 'TCP_AlternateChecksumData', 'TCP_MD5Signature', 'TCP_QuickStartResponse', 'TCP_UserTimeout', - 'TCP_Authentication', 'TCP_FastOpenCookie', - 'TCP_MPTCPCapableFlag', - 'TCP_MPTCP', - 'TCP_MPTCPUnknown', 'TCP_MPTCPCapable', 'TCP_MPTCPDSS', 'TCP_MPTCPAddAddress', 'TCP_MPTCPRemoveAddress', - 'TCP_MPTCPPriority', 'TCP_MPTCPFallback', 'TCP_MPTCPFastclose', - 'TCP_MPTCPJoin', - 'TCP_MPTCPJoinSYN', 'TCP_MPTCPJoinSYNACK', 'TCP_MPTCPJoinACK', - - # Stream Control Transmission Protocol - 'SCTP', - 'SCTP_DATAChunkFlags', 'SCTP_TBitFlags', 'SCTP_GapAckBlock', - 'SCTP_Chunk', - 'SCTP_UnknownChunk', 'SCTP_DATAChunk', 'SCTP_INITChunk', 'SCTP_INITACKChunk', 'SCTP_SACKChunk', - 'SCTP_HeartbeatChunk', 'SCTP_HeartbeatACKChunk', 'SCTP_AbortChunk', 'SCTP_ShutdownChunk', - 'SCTP_ShutdownACKChunk', 'SCTP_ErrorChunk', 'SCTP_CookieEchoChunk', 'SCTP_CookieACKChunk', - 'SCTP_ShutdownCompleteChunk', - 'SCTP_Parameter', - 'SCTP_UnknownParameter', 'SCTP_HeartbeatInfoParameter', 'SCTP_IPv4AddressParameter', - 'SCTP_IPv6AddressParameter', 'SCTP_StateCookieParameter', 'SCTP_UnrecognizedParameter', - 'SCTP_CookiePreservativeParameter', 'SCTP_HostNameAddressParameter', - 'SCTP_SupportedAddressTypesParameter', - 'SCTP_ErrorCause', - 'SCTP_UnknownCause', 'SCTP_InvalidStreamIdentifierCause', - 'SCTP_MissingMandatoryParameterCause', 'SCTP_StaleCookieCause', 'SCTP_OutOfResourceCause', - 'SCTP_UnresolvableAddressCause', 'SCTP_UnrecognizedChunkTypeCause', - 'SCTP_InvalidMandatoryParameterCause', 'SCTP_UnrecognizedParametersCause', - 'SCTP_NoUserDataCause', 'SCTP_CookieReceivedWhileShuttingDownCause', - 'SCTP_RestartOfAnAssociationWithNewAddressesCause', 'SCTP_UserInitiatedAbortCause', - 'SCTP_ProtocolViolationCause', - - # User Datagram Protocol - 'UDP', - - # Datagram Transport Layer Security - 'DTLS', 'DTLS_Ciphertext', 'DTLS_CIDCiphertext', 'DTLS_Handshake', - - # File Transfer Protocol - 'FTP', - 'FTP_Request', 'FTP_Response', - - # NG Application Protocol - 'NGAP', - 'NGAP_IE', 'NGAP_Choice', 'NGAP_BitString', 'NGAP_Sequence', - - # Open Shortest Path First - 'OSPF', 'OSPF_CryptographicAuthentication', - - # Secure Sockets Layer version 2 - 'SSLv2', 'SSLv2_ClientHello', 'SSLv2_ServerHello', - - # Hypertext Transfer Protocol (HTTP/1.*) - 'HTTPv1', - 'HTTPv1_Header', - 'HTTPv1_RequestHeader', 'HTTPv1_ResponseHeader', - - # Hypertext Transfer Protocol (HTTP/2) - 'HTTPv2', - 'HTTPv2_Flags', 'HTTPv2_Settings', - 'HTTPv2_DataFrameFlags', 'HTTPv2_HeadersFrameFlags', 'HTTPv2_SettingsFrameFlags', - 'HTTPv2_PushPromiseFrameFlags', 'HTTPv2_PingFrameFlags', 'HTTPv2_ContinuationFrameFlags', - 'HTTPv2_UnassignedFrame', 'HTTPv2_DataFrame', 'HTTPv2_HeadersFrame', 'HTTPv2_PriorityFrame', - 'HTTPv2_RSTStreamFrame', 'HTTPv2_SettingsFrame', 'HTTPv2_PushPromiseFrame', 'HTTPv2_PingFrame', - 'HTTPv2_GoawayFrame', 'HTTPv2_WindowUpdateFrame', 'HTTPv2_ContinuationFrame', - - # Transport Layer Security - 'TLS', - 'TLS_Handshake', 'TLS_ClientHello', 'TLS_ServerHello', 'TLS_EncryptedExtensions', - 'TLS_Extension', 'TLS_ExtensionData', 'TLS_ConnectionId', - 'TLS_ServerName', 'TLS_ServerNameList', 'TLS_NamedGroupList', 'TLS_SignatureSchemeList', - 'TLS_ProtocolNameList', 'TLS_SupportedVersionsClientHello', 'TLS_SupportedVersionsServerHello', - 'TLS_KeyShareEntry', 'TLS_KeyShareClientHello', 'TLS_KeyShareHelloRetryRequest', - 'TLS_KeyShareServerHello', - 'TLS_Alert', 'TLS_ChangeCipherSpec', - - # No Payload - 'NoPayload', - - # Raw Packet - 'Raw', -] diff --git a/pcapkit/protocols/data/application/__init__.py b/pcapkit/protocols/data/application/__init__.py deleted file mode 100644 index 4b2624b122..0000000000 --- a/pcapkit/protocols/data/application/__init__.py +++ /dev/null @@ -1,130 +0,0 @@ -# -*- coding: utf-8 -*- -"""data models for application layer protocols""" - -# Datagram Transport Layer Security -from pcapkit.protocols.data.application.dtls import DTLS -from pcapkit.protocols.data.application.dtls import DTLSCIDCiphertext as DTLS_CIDCiphertext -from pcapkit.protocols.data.application.dtls import DTLSCiphertext as DTLS_Ciphertext -from pcapkit.protocols.data.application.dtls import DTLSHandshake as DTLS_Handshake - -# File Transfer Protocol -from pcapkit.protocols.data.application.ftp import FTP -from pcapkit.protocols.data.application.ftp import Request as FTP_Request -from pcapkit.protocols.data.application.ftp import Response as FTP_Response - -# Hypertext Transfer Protocol (HTTP/1.*) -from pcapkit.protocols.data.application.httpv1 import HTTPv1 -from pcapkit.protocols.data.application.httpv1 import Header as HTTPv1_Header -from pcapkit.protocols.data.application.httpv1 import RequestHeader as HTTPv1_RequestHeader -from pcapkit.protocols.data.application.httpv1 import ResponseHeader as HTTPv1_ResponseHeader - -# Hypertext Transfer Protocol (HTTP/2) -from pcapkit.protocols.data.application.httpv2 import HTTPv2 -from pcapkit.protocols.data.application.httpv2 import ContinuationFrame as HTTPv2_ContinuationFrame -from pcapkit.protocols.data.application.httpv2 import \ - ContinuationFrameFlags as HTTPv2_ContinuationFrameFlags -from pcapkit.protocols.data.application.httpv2 import DataFrame as HTTPv2_DataFrame -from pcapkit.protocols.data.application.httpv2 import DataFrameFlags as HTTPv2_DataFrameFlags -from pcapkit.protocols.data.application.httpv2 import Flags as HTTPv2_Flags -from pcapkit.protocols.data.application.httpv2 import GoawayFrame as HTTPv2_GoawayFrame -from pcapkit.protocols.data.application.httpv2 import HeadersFrame as HTTPv2_HeadersFrame -from pcapkit.protocols.data.application.httpv2 import HeadersFrameFlags as HTTPv2_HeadersFrameFlags -from pcapkit.protocols.data.application.httpv2 import PingFrame as HTTPv2_PingFrame -from pcapkit.protocols.data.application.httpv2 import PingFrameFlags as HTTPv2_PingFrameFlags -from pcapkit.protocols.data.application.httpv2 import PriorityFrame as HTTPv2_PriorityFrame -from pcapkit.protocols.data.application.httpv2 import PushPromiseFrame as HTTPv2_PushPromiseFrame -from pcapkit.protocols.data.application.httpv2 import \ - PushPromiseFrameFlags as HTTPv2_PushPromiseFrameFlags -from pcapkit.protocols.data.application.httpv2 import RSTStreamFrame as HTTPv2_RSTStreamFrame -from pcapkit.protocols.data.application.httpv2 import Settings as HTTPv2_Settings -from pcapkit.protocols.data.application.httpv2 import SettingsFrame as HTTPv2_SettingsFrame -from pcapkit.protocols.data.application.httpv2 import \ - SettingsFrameFlags as HTTPv2_SettingsFrameFlags -from pcapkit.protocols.data.application.httpv2 import UnassignedFrame as HTTPv2_UnassignedFrame -from pcapkit.protocols.data.application.httpv2 import WindowUpdateFrame as HTTPv2_WindowUpdateFrame - -# NG Application Protocol -from pcapkit.protocols.data.application.ngap import IE as NGAP_IE -from pcapkit.protocols.data.application.ngap import NGAP -from pcapkit.protocols.data.application.ngap import BitString as NGAP_BitString -from pcapkit.protocols.data.application.ngap import Choice as NGAP_Choice -from pcapkit.protocols.data.application.ngap import Sequence as NGAP_Sequence - -# Open Shortest Path First -from pcapkit.protocols.data.application.ospf import OSPF -from pcapkit.protocols.data.application.ospf import \ - CryptographicAuthentication as OSPF_CryptographicAuthentication - -# Secure Sockets Layer version 2 -from pcapkit.protocols.data.application.sslv2 import ClientHello as SSLv2_ClientHello -from pcapkit.protocols.data.application.sslv2 import ServerHello as SSLv2_ServerHello -from pcapkit.protocols.data.application.sslv2 import SSLv2 - -# Transport Layer Security -from pcapkit.protocols.data.application.tls import TLS -from pcapkit.protocols.data.application.tls import Alert as TLS_Alert -from pcapkit.protocols.data.application.tls import ChangeCipherSpec as TLS_ChangeCipherSpec -from pcapkit.protocols.data.application.tls import ClientHello as TLS_ClientHello -from pcapkit.protocols.data.application.tls import ConnectionId as TLS_ConnectionId -from pcapkit.protocols.data.application.tls import EncryptedExtensions as TLS_EncryptedExtensions -from pcapkit.protocols.data.application.tls import Extension as TLS_Extension -from pcapkit.protocols.data.application.tls import ExtensionData as TLS_ExtensionData -from pcapkit.protocols.data.application.tls import Handshake as TLS_Handshake -from pcapkit.protocols.data.application.tls import KeyShareClientHello as TLS_KeyShareClientHello -from pcapkit.protocols.data.application.tls import KeyShareEntry as TLS_KeyShareEntry -from pcapkit.protocols.data.application.tls import \ - KeyShareHelloRetryRequest as TLS_KeyShareHelloRetryRequest -from pcapkit.protocols.data.application.tls import KeyShareServerHello as TLS_KeyShareServerHello -from pcapkit.protocols.data.application.tls import NamedGroupList as TLS_NamedGroupList -from pcapkit.protocols.data.application.tls import ProtocolNameList as TLS_ProtocolNameList -from pcapkit.protocols.data.application.tls import ServerHello as TLS_ServerHello -from pcapkit.protocols.data.application.tls import ServerName as TLS_ServerName -from pcapkit.protocols.data.application.tls import ServerNameList as TLS_ServerNameList -from pcapkit.protocols.data.application.tls import SignatureSchemeList as TLS_SignatureSchemeList -from pcapkit.protocols.data.application.tls import \ - SupportedVersionsClientHello as TLS_SupportedVersionsClientHello -from pcapkit.protocols.data.application.tls import \ - SupportedVersionsServerHello as TLS_SupportedVersionsServerHello - -__all__ = [ - # Datagram Transport Layer Security - 'DTLS', 'DTLS_Ciphertext', 'DTLS_CIDCiphertext', 'DTLS_Handshake', - - # File Transfer Protocol - 'FTP', - 'FTP_Request', 'FTP_Response', - - # Hypertext Transfer Protocol (HTTP/1.*) - 'HTTPv1', - 'HTTPv1_Header', - 'HTTPv1_RequestHeader', 'HTTPv1_ResponseHeader', - - # Hypertext Transfer Protocol (HTTP/2) - 'HTTPv2', - 'HTTPv2_Flags', 'HTTPv2_Settings', - 'HTTPv2_DataFrameFlags', 'HTTPv2_HeadersFrameFlags', 'HTTPv2_SettingsFrameFlags', - 'HTTPv2_PushPromiseFrameFlags', 'HTTPv2_PingFrameFlags', 'HTTPv2_ContinuationFrameFlags', - 'HTTPv2_UnassignedFrame', 'HTTPv2_DataFrame', 'HTTPv2_HeadersFrame', 'HTTPv2_PriorityFrame', - 'HTTPv2_RSTStreamFrame', 'HTTPv2_SettingsFrame', 'HTTPv2_PushPromiseFrame', 'HTTPv2_PingFrame', - 'HTTPv2_GoawayFrame', 'HTTPv2_WindowUpdateFrame', 'HTTPv2_ContinuationFrame', - - # NG Application Protocol - 'NGAP', - 'NGAP_IE', 'NGAP_Choice', 'NGAP_BitString', 'NGAP_Sequence', - - # Open Shortest Path First - 'OSPF', 'OSPF_CryptographicAuthentication', - - # Secure Sockets Layer version 2 - 'SSLv2', 'SSLv2_ClientHello', 'SSLv2_ServerHello', - - # Transport Layer Security - 'TLS', - 'TLS_Handshake', 'TLS_ClientHello', 'TLS_ServerHello', 'TLS_EncryptedExtensions', - 'TLS_Extension', 'TLS_ExtensionData', 'TLS_ConnectionId', - 'TLS_ServerName', 'TLS_ServerNameList', 'TLS_NamedGroupList', 'TLS_SignatureSchemeList', - 'TLS_ProtocolNameList', 'TLS_SupportedVersionsClientHello', 'TLS_SupportedVersionsServerHello', - 'TLS_KeyShareEntry', 'TLS_KeyShareClientHello', 'TLS_KeyShareHelloRetryRequest', - 'TLS_KeyShareServerHello', - 'TLS_Alert', 'TLS_ChangeCipherSpec', -] diff --git a/pcapkit/protocols/data/internet/__init__.py b/pcapkit/protocols/data/internet/__init__.py deleted file mode 100644 index 8525089dca..0000000000 --- a/pcapkit/protocols/data/internet/__init__.py +++ /dev/null @@ -1,543 +0,0 @@ -# -*- coding: utf-8 -*- -"""data models for internet layer protocols""" - -# Authentication Header -from pcapkit.protocols.data.internet.ah import AH - -# Encapsulating Security Payload -from pcapkit.protocols.data.internet.esp import ESP - -# Host Identity Protocol -from pcapkit.protocols.data.internet.hip import HIP -from pcapkit.protocols.data.internet.hip import AckDataParameter as HIP_AckDataParameter -from pcapkit.protocols.data.internet.hip import ACKParameter as HIP_ACKParameter -from pcapkit.protocols.data.internet.hip import CertParameter as HIP_CertParameter -from pcapkit.protocols.data.internet.hip import Control as HIP_Control -from pcapkit.protocols.data.internet.hip import DHGroupListParameter as HIP_DHGroupListParameter -from pcapkit.protocols.data.internet.hip import DiffieHellmanParameter as HIP_DiffieHellmanParameter -from pcapkit.protocols.data.internet.hip import \ - EchoRequestSignedParameter as HIP_EchoRequestSignedParameter -from pcapkit.protocols.data.internet.hip import \ - EchoRequestUnsignedParameter as HIP_EchoRequestUnsignedParameter -from pcapkit.protocols.data.internet.hip import \ - EchoResponseSignedParameter as HIP_EchoResponseSignedParameter -from pcapkit.protocols.data.internet.hip import \ - EchoResponseUnsignedParameter as HIP_EchoResponseUnsignedParameter -from pcapkit.protocols.data.internet.hip import EncryptedParameter as HIP_EncryptedParameter -from pcapkit.protocols.data.internet.hip import ESPInfoParameter as HIP_ESPInfoParameter -from pcapkit.protocols.data.internet.hip import ESPTransformParameter as HIP_ESPTransformParameter -from pcapkit.protocols.data.internet.hip import Flags as HIP_Flags -from pcapkit.protocols.data.internet.hip import FromParameter as HIP_FromParameter -from pcapkit.protocols.data.internet.hip import HIPCipherParameter as HIP_HIPCipherParameter -from pcapkit.protocols.data.internet.hip import HIPMAC2Parameter as HIP_HIPMAC2Parameter -from pcapkit.protocols.data.internet.hip import HIPMACParameter as HIP_HIPMACParameter -from pcapkit.protocols.data.internet.hip import HIPSignature2Parameter as HIP_HIPSignature2Parameter -from pcapkit.protocols.data.internet.hip import HIPSignatureParameter as HIP_HIPSignatureParameter -from pcapkit.protocols.data.internet.hip import HIPTransformParameter as HIP_HIPTransformParameter -from pcapkit.protocols.data.internet.hip import \ - HIPTransportModeParameter as HIP_HIPTransportModeParameter -from pcapkit.protocols.data.internet.hip import HITSuiteListParameter as HIP_HITSuiteListParameter -from pcapkit.protocols.data.internet.hip import HostIdentity as HIP_HostIdentity -from pcapkit.protocols.data.internet.hip import HostIDParameter as HIP_HostIDParameter -from pcapkit.protocols.data.internet.hip import Lifetime as HIP_Lifetime -from pcapkit.protocols.data.internet.hip import Locator as HIP_Locator -from pcapkit.protocols.data.internet.hip import LocatorData as HIP_LocatorData -from pcapkit.protocols.data.internet.hip import LocatorSetParameter as HIP_LocatorSetParameter -from pcapkit.protocols.data.internet.hip import \ - NATTraversalModeParameter as HIP_NATTraversalModeParameter -from pcapkit.protocols.data.internet.hip import NotificationParameter as HIP_NotificationParameter -from pcapkit.protocols.data.internet.hip import OverlayIDParameter as HIP_OverlayIDParameter -from pcapkit.protocols.data.internet.hip import OverlayTTLParameter as HIP_OverlayTTLParameter -from pcapkit.protocols.data.internet.hip import PayloadMICParameter as HIP_PayloadMICParameter -from pcapkit.protocols.data.internet.hip import PuzzleParameter as HIP_PuzzleParameter -from pcapkit.protocols.data.internet.hip import R1CounterParameter as HIP_R1CounterParameter -from pcapkit.protocols.data.internet.hip import RegFailedParameter as HIP_RegFailedParameter -from pcapkit.protocols.data.internet.hip import RegFromParameter as HIP_RegFromParameter -from pcapkit.protocols.data.internet.hip import RegInfoParameter as HIP_RegInfoParameter -from pcapkit.protocols.data.internet.hip import RegRequestParameter as HIP_RegRequestParameter -from pcapkit.protocols.data.internet.hip import RegResponseParameter as HIP_RegResponseParameter -from pcapkit.protocols.data.internet.hip import RelayFromParameter as HIP_RelayFromParameter -from pcapkit.protocols.data.internet.hip import RelayHMACParameter as HIP_RelayHMACParameter -from pcapkit.protocols.data.internet.hip import RelayToParameter as HIP_RelayToParameter -from pcapkit.protocols.data.internet.hip import RouteDstParameter as HIP_RouteDstParameter -from pcapkit.protocols.data.internet.hip import RouteViaParameter as HIP_RouteViaParameter -from pcapkit.protocols.data.internet.hip import RVSHMACParameter as HIP_RVSHMACParameter -from pcapkit.protocols.data.internet.hip import SeqDataParameter as HIP_SeqDataParameter -from pcapkit.protocols.data.internet.hip import SEQParameter as HIP_SEQParameter -from pcapkit.protocols.data.internet.hip import SolutionParameter as HIP_SolutionParameter -from pcapkit.protocols.data.internet.hip import TransactionIDParameter as HIP_TransactionIDParameter -from pcapkit.protocols.data.internet.hip import \ - TransactionPacingParameter as HIP_TransactionPacingParameter -from pcapkit.protocols.data.internet.hip import \ - TransportFormatListParameter as HIP_TransportFormatListParameter -from pcapkit.protocols.data.internet.hip import UnassignedParameter as HIP_UnassignedParameter -from pcapkit.protocols.data.internet.hip import ViaRVSParameter as HIP_ViaRVSParameter - -# Hop-by-Hop Options -from pcapkit.protocols.data.internet.hopopt import HOPOPT -from pcapkit.protocols.data.internet.hopopt import CALIPSOOption as HOPOPT_CALIPSOOption -from pcapkit.protocols.data.internet.hopopt import DFFFlags as HOPOPT_DFFFlags -from pcapkit.protocols.data.internet.hopopt import HomeAddressOption as HOPOPT_HomeAddressOption -from pcapkit.protocols.data.internet.hopopt import ILNPOption as HOPOPT_ILNPOption -from pcapkit.protocols.data.internet.hopopt import IPDFFOption as HOPOPT_IPDFFOption -from pcapkit.protocols.data.internet.hopopt import JumboPayloadOption as HOPOPT_JumboPayloadOption -from pcapkit.protocols.data.internet.hopopt import \ - LineIdentificationOption as HOPOPT_LineIdentificationOption -from pcapkit.protocols.data.internet.hopopt import MPLFlags as HOPOPT_MPLFlags -from pcapkit.protocols.data.internet.hopopt import MPLOption as HOPOPT_MPLOption -from pcapkit.protocols.data.internet.hopopt import PadOption as HOPOPT_PadOption -from pcapkit.protocols.data.internet.hopopt import PDMOption as HOPOPT_PDMOption -from pcapkit.protocols.data.internet.hopopt import QuickStartOption as HOPOPT_QuickStartOption -from pcapkit.protocols.data.internet.hopopt import \ - QuickStartReportOption as HOPOPT_QuickStartReportOption -from pcapkit.protocols.data.internet.hopopt import \ - QuickStartRequestOption as HOPOPT_QuickStartRequestOption -from pcapkit.protocols.data.internet.hopopt import RouterAlertOption as HOPOPT_RouterAlertOption -from pcapkit.protocols.data.internet.hopopt import RPLFlags as HOPOPT_RPLFlags -from pcapkit.protocols.data.internet.hopopt import RPLOption as HOPOPT_RPLOption -from pcapkit.protocols.data.internet.hopopt import SMFDPDOption as HOPOPT_SMFDPDOption -from pcapkit.protocols.data.internet.hopopt import \ - SMFHashBasedDPDOption as HOPOPT_SMFHashBasedDPDOption -from pcapkit.protocols.data.internet.hopopt import \ - SMFIdentificationBasedDPDOption as HOPOPT_SMFIdentificationBasedDPDOption -from pcapkit.protocols.data.internet.hopopt import \ - TunnelEncapsulationLimitOption as HOPOPT_TunnelEncapsulationLimitOption -from pcapkit.protocols.data.internet.hopopt import UnassignedOption as HOPOPT_UnassignedOption - -# Internet Control Message Protocol -from pcapkit.protocols.data.internet.icmpv4 import ICMPv4 -from pcapkit.protocols.data.internet.icmpv4 import \ - DestinationUnreachable as ICMPv4_DestinationUnreachable -from pcapkit.protocols.data.internet.icmpv4 import Echo as ICMPv4_Echo -from pcapkit.protocols.data.internet.icmpv4 import ParameterProblem as ICMPv4_ParameterProblem -from pcapkit.protocols.data.internet.icmpv4 import TimeExceeded as ICMPv4_TimeExceeded -from pcapkit.protocols.data.internet.icmpv4 import Unknown as ICMPv4_Unknown - -# Internet Control Message Protocol for IPv6 -from pcapkit.protocols.data.internet.icmpv6 import ICMPv6 -from pcapkit.protocols.data.internet.icmpv6 import \ - DestinationUnreachable as ICMPv6_DestinationUnreachable -from pcapkit.protocols.data.internet.icmpv6 import Echo as ICMPv6_Echo -from pcapkit.protocols.data.internet.icmpv6 import PacketTooBig as ICMPv6_PacketTooBig -from pcapkit.protocols.data.internet.icmpv6 import ParameterProblem as ICMPv6_ParameterProblem -from pcapkit.protocols.data.internet.icmpv6 import TimeExceeded as ICMPv6_TimeExceeded -from pcapkit.protocols.data.internet.icmpv6 import Unknown as ICMPv6_Unknown - -# Internet Group Management Protocol -from pcapkit.protocols.data.internet.igmp import IGMP -from pcapkit.protocols.data.internet.igmpv3 import GroupRecord as IGMPv3_GroupRecord -from pcapkit.protocols.data.internet.igmpv3 import IGMPv3 -from pcapkit.protocols.data.internet.igmpv3 import Query as IGMPv3_Query -from pcapkit.protocols.data.internet.igmpv3 import Report as IGMPv3_Report - -# Internet Protocol version 4 -from pcapkit.protocols.data.internet.ipv4 import EOOLOption as IPv4_EOOLOption -from pcapkit.protocols.data.internet.ipv4 import ESECOption as IPv4_ESECOption -from pcapkit.protocols.data.internet.ipv4 import Flags as IPv4_Flags -from pcapkit.protocols.data.internet.ipv4 import IPv4 -from pcapkit.protocols.data.internet.ipv4 import LSROption as IPv4_LSROption -from pcapkit.protocols.data.internet.ipv4 import MTUPOption as IPv4_MTUPOption -from pcapkit.protocols.data.internet.ipv4 import MTUROption as IPv4_MTUROption -from pcapkit.protocols.data.internet.ipv4 import NOPOption as IPv4_NOPOption -from pcapkit.protocols.data.internet.ipv4 import OptionType as IPv4_OptionType -from pcapkit.protocols.data.internet.ipv4 import QSOption as IPv4_QSOption -from pcapkit.protocols.data.internet.ipv4 import \ - QuickStartReportOption as IPv4_QuickStartReportOption -from pcapkit.protocols.data.internet.ipv4 import \ - QuickStartRequestOption as IPv4_QuickStartRequestOption -from pcapkit.protocols.data.internet.ipv4 import RROption as IPv4_RROption -from pcapkit.protocols.data.internet.ipv4 import RTRALTOption as IPv4_RTRALTOption -from pcapkit.protocols.data.internet.ipv4 import SECOption as IPv4_SECOption -from pcapkit.protocols.data.internet.ipv4 import SIDOption as IPv4_SIDOption -from pcapkit.protocols.data.internet.ipv4 import SSROption as IPv4_SSROption -from pcapkit.protocols.data.internet.ipv4 import ToSField as IPv4_ToSField -from pcapkit.protocols.data.internet.ipv4 import TROption as IPv4_TROption -from pcapkit.protocols.data.internet.ipv4 import TSOption as IPv4_TSOption -from pcapkit.protocols.data.internet.ipv4 import UnassignedOption as IPv4_UnassignedOption - -# Internet Protocol version 6 -from pcapkit.protocols.data.internet.ipv6 import IPv6 - -# IPv6 Fragment Header -from pcapkit.protocols.data.internet.ipv6_frag import IPv6_Frag - -# IPv6 Extension Header (generic) -from pcapkit.protocols.data.internet.ipv6_ext import IPv6_Ext - -# IPv6 Destination Options -from pcapkit.protocols.data.internet.ipv6_opts import CALIPSOOption as IPv6_Opts_CALIPSOOption -from pcapkit.protocols.data.internet.ipv6_opts import DFFFlags as IPv6_Opts_DFFFlags -from pcapkit.protocols.data.internet.ipv6_opts import \ - HomeAddressOption as IPv6_Opts_HomeAddressOption -from pcapkit.protocols.data.internet.ipv6_opts import ILNPOption as IPv6_Opts_ILNPOption -from pcapkit.protocols.data.internet.ipv6_opts import IPDFFOption as IPv6_Opts_IPDFFOption -from pcapkit.protocols.data.internet.ipv6_opts import IPv6_Opts -from pcapkit.protocols.data.internet.ipv6_opts import \ - JumboPayloadOption as IPv6_Opts_JumboPayloadOption -from pcapkit.protocols.data.internet.ipv6_opts import \ - LineIdentificationOption as IPv6_Opts_LineIdentificationOption -from pcapkit.protocols.data.internet.ipv6_opts import MPLFlags as IPv6_Opts_MPLFlags -from pcapkit.protocols.data.internet.ipv6_opts import MPLOption as IPv6_Opts_MPLOption -from pcapkit.protocols.data.internet.ipv6_opts import PadOption as IPv6_Opts_PadOption -from pcapkit.protocols.data.internet.ipv6_opts import PDMOption as IPv6_Opts_PDMOption -from pcapkit.protocols.data.internet.ipv6_opts import QuickStartOption as IPv6_Opts_QuickStartOption -from pcapkit.protocols.data.internet.ipv6_opts import \ - QuickStartReportOption as IPv6_Opts_QuickStartReportOption -from pcapkit.protocols.data.internet.ipv6_opts import \ - QuickStartRequestOption as IPv6_Opts_QuickStartRequestOption -from pcapkit.protocols.data.internet.ipv6_opts import \ - RouterAlertOption as IPv6_Opts_RouterAlertOption -from pcapkit.protocols.data.internet.ipv6_opts import RPLFlags as IPv6_Opts_RPLFlags -from pcapkit.protocols.data.internet.ipv6_opts import RPLOption as IPv6_Opts_RPLOption -from pcapkit.protocols.data.internet.ipv6_opts import SMFDPDOption as IPv6_Opts_SMFDPDOption -from pcapkit.protocols.data.internet.ipv6_opts import \ - SMFHashBasedDPDOption as IPv6_Opts_SMFHashBasedDPDOption -from pcapkit.protocols.data.internet.ipv6_opts import \ - SMFIdentificationBasedDPDOption as IPv6_Opts_SMFIdentificationBasedDPDOption -from pcapkit.protocols.data.internet.ipv6_opts import \ - TunnelEncapsulationLimitOption as IPv6_Opts_TunnelEncapsulationLimitOption -from pcapkit.protocols.data.internet.ipv6_opts import UnassignedOption as IPv6_Opts_UnassignedOption - -# IPv6 Routing Header -from pcapkit.protocols.data.internet.ipv6_route import RPL as IPv6_Route_RPL -from pcapkit.protocols.data.internet.ipv6_route import IPv6_Route -from pcapkit.protocols.data.internet.ipv6_route import SourceRoute as IPv6_Route_SourceRoute -from pcapkit.protocols.data.internet.ipv6_route import Type2 as IPv6_Route_Type2 -from pcapkit.protocols.data.internet.ipv6_route import UnknownType as IPv6_Route_UnknownType - -# Internetwork Packet Exchange -from pcapkit.protocols.data.internet.ipx import IPX -from pcapkit.protocols.data.internet.ipx import Address as IPX_Address - -# Mobility Header -from pcapkit.protocols.data.internet.mh import MH -from pcapkit.protocols.data.internet.mh import \ - AccessNetworkIdentifierOption as MH_AccessNetworkIdentifierOption -from pcapkit.protocols.data.internet.mh import \ - AccessTechnologyTypeOption as MH_AccessTechnologyTypeOption -from pcapkit.protocols.data.internet.mh import \ - ActiveMulticastSubscriptionIPv4Option as MH_ActiveMulticastSubscriptionIPv4Option -from pcapkit.protocols.data.internet.mh import \ - ActiveMulticastSubscriptionIPv6Option as MH_ActiveMulticastSubscriptionIPv6Option -from pcapkit.protocols.data.internet.mh import \ - AllocationRetentionPriorityAttribute as MH_AllocationRetentionPriorityAttribute -from pcapkit.protocols.data.internet.mh import \ - AlternateCareofAddressOption as MH_AlternateCareofAddressOption -from pcapkit.protocols.data.internet.mh import \ - AlternateIPv4CareofAddressOption as MH_AlternateIPv4CareofAddressOption -from pcapkit.protocols.data.internet.mh import AnchoredPrefixOption as MH_AnchoredPrefixOption -from pcapkit.protocols.data.internet.mh import \ - ANICivicLocationSuboption as MH_ANICivicLocationSuboption -from pcapkit.protocols.data.internet.mh import ANIGeoLocationSuboption as MH_ANIGeoLocationSuboption -from pcapkit.protocols.data.internet.mh import \ - ANIMAGGroupIdentifierSuboption as MH_ANIMAGGroupIdentifierSuboption -from pcapkit.protocols.data.internet.mh import \ - ANINetworkIdentifierSuboption as MH_ANINetworkIdentifierSuboption -from pcapkit.protocols.data.internet.mh import \ - ANIOperatorIdentifierSuboption as MH_ANIOperatorIdentifierSuboption -from pcapkit.protocols.data.internet.mh import ANISuboption as MH_ANISuboption -from pcapkit.protocols.data.internet.mh import ANIUpdateTimerSuboption as MH_ANIUpdateTimerSuboption -from pcapkit.protocols.data.internet.mh import AuthOption as MH_AuthOption -from pcapkit.protocols.data.internet.mh import AuthorizationDataOption as MH_AuthorizationDataOption -from pcapkit.protocols.data.internet.mh import BADFOption as MH_BADFOption -from pcapkit.protocols.data.internet.mh import BIDReferenceSuboption as MH_BIDReferenceSuboption -from pcapkit.protocols.data.internet.mh import \ - BindingAcknowledgementMessage as MH_BindingAcknowledgementMessage -from pcapkit.protocols.data.internet.mh import BindingErrorMessage as MH_BindingErrorMessage -from pcapkit.protocols.data.internet.mh import BindingIdentifierOption as MH_BindingIdentifierOption -from pcapkit.protocols.data.internet.mh import \ - BindingRefreshAdviceOption as MH_BindingRefreshAdviceOption -from pcapkit.protocols.data.internet.mh import \ - BindingRefreshRequestMessage as MH_BindingRefreshRequestMessage -from pcapkit.protocols.data.internet.mh import \ - BindingReregistrationControlSuboption as MH_BindingReregistrationControlSuboption -from pcapkit.protocols.data.internet.mh import \ - BindingRevocationMessage as MH_BindingRevocationMessage -from pcapkit.protocols.data.internet.mh import BindingUpdateMessage as MH_BindingUpdateMessage -from pcapkit.protocols.data.internet.mh import BitRateAttribute as MH_BitRateAttribute -from pcapkit.protocols.data.internet.mh import CareofTestInitMessage as MH_CareofTestInitMessage -from pcapkit.protocols.data.internet.mh import CareofTestInitOption as MH_CareofTestInitOption -from pcapkit.protocols.data.internet.mh import CareofTestMessage as MH_CareofTestMessage -from pcapkit.protocols.data.internet.mh import CareofTestOption as MH_CareofTestOption -from pcapkit.protocols.data.internet.mh import CGAExtension as MH_CGAExtension -from pcapkit.protocols.data.internet.mh import CGAParameter as MH_CGAParameter -from pcapkit.protocols.data.internet.mh import CGAParametersOption as MH_CGAParametersOption -from pcapkit.protocols.data.internet.mh import \ - CGAParametersRequestOption as MH_CGAParametersRequestOption -from pcapkit.protocols.data.internet.mh import ContextRequest as MH_ContextRequest -from pcapkit.protocols.data.internet.mh import ContextRequestOption as MH_ContextRequestOption -from pcapkit.protocols.data.internet.mh import DelegatedMNPOption as MH_DelegatedMNPOption -from pcapkit.protocols.data.internet.mh import \ - DLIFLinkLayerAddressOption as MH_DLIFLinkLayerAddressOption -from pcapkit.protocols.data.internet.mh import \ - DLIFLinkLocalAddressOption as MH_DLIFLinkLocalAddressOption -from pcapkit.protocols.data.internet.mh import DNSUpdateOption as MH_DNSUpdateOption -from pcapkit.protocols.data.internet.mh import \ - DynamicIPMulticastSelectorOption as MH_DynamicIPMulticastSelectorOption -from pcapkit.protocols.data.internet.mh import ExperimentalExtension as MH_ExperimentalExtension -from pcapkit.protocols.data.internet.mh import ExperimentalMessage as MH_ExperimentalMessage -from pcapkit.protocols.data.internet.mh import \ - ExperimentalMobilityOption as MH_ExperimentalMobilityOption -from pcapkit.protocols.data.internet.mh import \ - FastBindingAcknowledgmentMessage as MH_FastBindingAcknowledgmentMessage -from pcapkit.protocols.data.internet.mh import \ - FastBindingUpdateMessage as MH_FastBindingUpdateMessage -from pcapkit.protocols.data.internet.mh import \ - FastNeighborAdvertisementMessage as MH_FastNeighborAdvertisementMessage -from pcapkit.protocols.data.internet.mh import \ - FlowBindingActionSuboption as MH_FlowBindingActionSuboption -from pcapkit.protocols.data.internet.mh import FlowBindingMessage as MH_FlowBindingMessage -from pcapkit.protocols.data.internet.mh import \ - FlowIdentificationOption as MH_FlowIdentificationOption -from pcapkit.protocols.data.internet.mh import \ - FlowIdentificationSuboption as MH_FlowIdentificationSuboption -from pcapkit.protocols.data.internet.mh import FlowSummaryOption as MH_FlowSummaryOption -from pcapkit.protocols.data.internet.mh import GREKeyOption as MH_GREKeyOption -from pcapkit.protocols.data.internet.mh import HandoffIndicatorOption as MH_HandoffIndicatorOption -from pcapkit.protocols.data.internet.mh import \ - HandoverAcknowledgeMessage as MH_HandoverAcknowledgeMessage -from pcapkit.protocols.data.internet.mh import HandoverInitiateMessage as MH_HandoverInitiateMessage -from pcapkit.protocols.data.internet.mh import \ - HeartbeatControlSuboption as MH_HeartbeatControlSuboption -from pcapkit.protocols.data.internet.mh import HeartbeatMessage as MH_HeartbeatMessage -from pcapkit.protocols.data.internet.mh import HomeAgentSwitchMessage as MH_HomeAgentSwitchMessage -from pcapkit.protocols.data.internet.mh import HomeNetworkPrefixOption as MH_HomeNetworkPrefixOption -from pcapkit.protocols.data.internet.mh import HomeTestInitMessage as MH_HomeTestInitMessage -from pcapkit.protocols.data.internet.mh import HomeTestMessage as MH_HomeTestMessage -from pcapkit.protocols.data.internet.mh import \ - IPv4AddressAcknowledgementOption as MH_IPv4AddressAcknowledgementOption -from pcapkit.protocols.data.internet.mh import IPv4CareofAddressOption as MH_IPv4CareofAddressOption -from pcapkit.protocols.data.internet.mh import \ - IPv4DefaultRouterAddressOption as MH_IPv4DefaultRouterAddressOption -from pcapkit.protocols.data.internet.mh import \ - IPv4DHCPSupportModeOption as MH_IPv4DHCPSupportModeOption -from pcapkit.protocols.data.internet.mh import IPv4HomeAddressOption as MH_IPv4HomeAddressOption -from pcapkit.protocols.data.internet.mh import \ - IPv4HomeAddressReplyOption as MH_IPv4HomeAddressReplyOption -from pcapkit.protocols.data.internet.mh import \ - IPv4HomeAddressRequestOption as MH_IPv4HomeAddressRequestOption -from pcapkit.protocols.data.internet.mh import \ - IPv4TrafficOffloadSelectorOption as MH_IPv4TrafficOffloadSelectorOption -from pcapkit.protocols.data.internet.mh import IPv6AddressPrefixOption as MH_IPv6AddressPrefixOption -from pcapkit.protocols.data.internet.mh import LinkLayerAddressOption as MH_LinkLayerAddressOption -from pcapkit.protocols.data.internet.mh import LinkLocalAddressOption as MH_LinkLocalAddressOption -from pcapkit.protocols.data.internet.mh import LMAAddressOption as MH_LMAAddressOption -from pcapkit.protocols.data.internet.mh import \ - LMAControlledMAGParametersOption as MH_LMAControlledMAGParametersOption -from pcapkit.protocols.data.internet.mh import \ - LMAControlledMAGSuboption as MH_LMAControlledMAGSuboption -from pcapkit.protocols.data.internet.mh import \ - LMAUserPlaneAddressOption as MH_LMAUserPlaneAddressOption -from pcapkit.protocols.data.internet.mh import LoadInformationOption as MH_LoadInformationOption -from pcapkit.protocols.data.internet.mh import \ - LocalizedRoutingAcknowledgmentMessage as MH_LocalizedRoutingAcknowledgmentMessage -from pcapkit.protocols.data.internet.mh import \ - LocalizedRoutingInitiationMessage as MH_LocalizedRoutingInitiationMessage -from pcapkit.protocols.data.internet.mh import LocalPrefixOption as MH_LocalPrefixOption -from pcapkit.protocols.data.internet.mh import MAGIdentifierOption as MH_MAGIdentifierOption -from pcapkit.protocols.data.internet.mh import MAGIPv6AddressOption as MH_MAGIPv6AddressOption -from pcapkit.protocols.data.internet.mh import \ - MAGMultipathBindingOption as MH_MAGMultipathBindingOption -from pcapkit.protocols.data.internet.mh import MesgIDOption as MH_MesgIDOption -from pcapkit.protocols.data.internet.mh import MNGroupIdentifierOption as MH_MNGroupIdentifierOption -from pcapkit.protocols.data.internet.mh import MNIDOption as MH_MNIDOption -from pcapkit.protocols.data.internet.mh import MNLLAIIDOption as MH_MNLLAIIDOption -from pcapkit.protocols.data.internet.mh import MNLLIdentifierOption as MH_MNLLIdentifierOption -from pcapkit.protocols.data.internet.mh import \ - MobileNetworkPrefixOption as MH_MobileNetworkPrefixOption -from pcapkit.protocols.data.internet.mh import \ - MulticastAcknowledgementOption as MH_MulticastAcknowledgementOption -from pcapkit.protocols.data.internet.mh import MulticastMobilityOption as MH_MulticastMobilityOption -from pcapkit.protocols.data.internet.mh import MultiPrefixExtension as MH_MultiPrefixExtension -from pcapkit.protocols.data.internet.mh import NATDetectionOption as MH_NATDetectionOption -from pcapkit.protocols.data.internet.mh import NonceIndicesOption as MH_NonceIndicesOption -from pcapkit.protocols.data.internet.mh import NTPTimestamp as MH_NTPTimestamp -from pcapkit.protocols.data.internet.mh import Option as MH_Option -from pcapkit.protocols.data.internet.mh import \ - PadFlowIdentificationSuboption as MH_PadFlowIdentificationSuboption -from pcapkit.protocols.data.internet.mh import PadOption as MH_PadOption -from pcapkit.protocols.data.internet.mh import \ - PermanentHomeKeygenTokenOption as MH_PermanentHomeKeygenTokenOption -from pcapkit.protocols.data.internet.mh import \ - PerSessionBitRateAttribute as MH_PerSessionBitRateAttribute -from pcapkit.protocols.data.internet.mh import PMIPv6Timestamp as MH_PMIPv6Timestamp -from pcapkit.protocols.data.internet.mh import PreviousMAAROption as MH_PreviousMAAROption -from pcapkit.protocols.data.internet.mh import QoSAttribute as MH_QoSAttribute -from pcapkit.protocols.data.internet.mh import \ - QoSTrafficSelectorAttribute as MH_QoSTrafficSelectorAttribute -from pcapkit.protocols.data.internet.mh import \ - QoSVendorSpecificAttribute as MH_QoSVendorSpecificAttribute -from pcapkit.protocols.data.internet.mh import QualityOfServiceOption as MH_QualityOfServiceOption -from pcapkit.protocols.data.internet.mh import \ - RedirectCapabilityOption as MH_RedirectCapabilityOption -from pcapkit.protocols.data.internet.mh import RedirectOption as MH_RedirectOption -from pcapkit.protocols.data.internet.mh import RestartCounterOption as MH_RestartCounterOption -from pcapkit.protocols.data.internet.mh import ServiceSelectionOption as MH_ServiceSelectionOption -from pcapkit.protocols.data.internet.mh import ServingMAAROption as MH_ServingMAAROption -from pcapkit.protocols.data.internet.mh import SignatureOption as MH_SignatureOption -from pcapkit.protocols.data.internet.mh import \ - SubscriptionQueryMessage as MH_SubscriptionQueryMessage -from pcapkit.protocols.data.internet.mh import \ - SubscriptionResponseMessage as MH_SubscriptionResponseMessage -from pcapkit.protocols.data.internet.mh import \ - TargetCareofAddressSuboption as MH_TargetCareofAddressSuboption -from pcapkit.protocols.data.internet.mh import TimestampOption as MH_TimestampOption -from pcapkit.protocols.data.internet.mh import \ - TrafficSelectorSuboption as MH_TrafficSelectorSuboption -from pcapkit.protocols.data.internet.mh import TransientBindingOption as MH_TransientBindingOption -from pcapkit.protocols.data.internet.mh import UnassignedANISuboption as MH_UnassignedANISuboption -from pcapkit.protocols.data.internet.mh import \ - UnassignedFlowIdentificationSuboption as MH_UnassignedFlowIdentificationSuboption -from pcapkit.protocols.data.internet.mh import \ - UnassignedLMAControlledMAGSuboption as MH_UnassignedLMAControlledMAGSuboption -from pcapkit.protocols.data.internet.mh import UnassignedOption as MH_UnassignedOption -from pcapkit.protocols.data.internet.mh import UnassignedQoSAttribute as MH_UnassignedQoSAttribute -from pcapkit.protocols.data.internet.mh import UnknownExtension as MH_UnknownExtension -from pcapkit.protocols.data.internet.mh import UnknownMessage as MH_UnknownMessage -from pcapkit.protocols.data.internet.mh import \ - UpdateNotificationAcknowledgementMessage as MH_UpdateNotificationAcknowledgementMessage -from pcapkit.protocols.data.internet.mh import \ - UpdateNotificationMessage as MH_UpdateNotificationMessage -from pcapkit.protocols.data.internet.mh import VendorSpecificOption as MH_VendorSpecificOption - -__all__ = [ - # Authentication Header - 'AH', - - # Encapsulating Security Payload - 'ESP', - - # Host Identity Protocol - 'HIP', 'HIP_Control', - 'HIP_LocatorData', 'HIP_Locator', 'HIP_HostIdentity', 'HIP_Lifetime', 'HIP_Flags', - 'HIP_UnassignedParameter', 'HIP_ESPInfoParameter', 'HIP_R1CounterParameter', - 'HIP_LocatorSetParameter', 'HIP_PuzzleParameter', 'HIP_SolutionParameter', - 'HIP_SEQParameter', 'HIP_ACKParameter', 'HIP_DHGroupListParameter', - 'HIP_DiffieHellmanParameter', 'HIP_HIPTransformParameter', 'HIP_HIPCipherParameter', - 'HIP_NATTraversalModeParameter', 'HIP_TransactionPacingParameter', 'HIP_EncryptedParameter', - 'HIP_HostIDParameter', 'HIP_HITSuiteListParameter', 'HIP_CertParameter', - 'HIP_NotificationParameter', 'HIP_EchoRequestSignedParameter', 'HIP_RegInfoParameter', - 'HIP_RegRequestParameter', 'HIP_RegResponseParameter', 'HIP_RegFailedParameter', - 'HIP_RegFromParameter', 'HIP_EchoResponseSignedParameter', 'HIP_TransportFormatListParameter', - 'HIP_ESPTransformParameter', 'HIP_SeqDataParameter', 'HIP_AckDataParameter', - 'HIP_PayloadMICParameter', 'HIP_TransactionIDParameter', 'HIP_OverlayIDParameter', - 'HIP_RouteDstParameter', 'HIP_HIPTransportModeParameter', 'HIP_HIPMACParameter', - 'HIP_HIPMAC2Parameter', 'HIP_HIPSignature2Parameter', 'HIP_HIPSignatureParameter', - 'HIP_EchoRequestUnsignedParameter', 'HIP_EchoResponseUnsignedParameter', 'HIP_RelayFromParameter', - 'HIP_RelayToParameter', 'HIP_OverlayTTLParameter', 'HIP_RouteViaParameter', - 'HIP_FromParameter', 'HIP_RVSHMACParameter', 'HIP_ViaRVSParameter', - 'HIP_RelayHMACParameter', - - # Hop-by-Hop Options - 'HOPOPT', - 'HOPOPT_RPLFlags', 'HOPOPT_MPLFlags', 'HOPOPT_DFFFlags', - 'HOPOPT_SMFDPDOption', 'HOPOPT_QuickStartOption', - 'HOPOPT_UnassignedOption', 'HOPOPT_PadOption', 'HOPOPT_TunnelEncapsulationLimitOption', - 'HOPOPT_RouterAlertOption', 'HOPOPT_CALIPSOOption', 'HOPOPT_SMFIdentificationBasedDPDOption', - 'HOPOPT_SMFHashBasedDPDOption', 'HOPOPT_PDMOption', 'HOPOPT_QuickStartRequestOption', - 'HOPOPT_QuickStartReportOption', 'HOPOPT_RPLOption', 'HOPOPT_MPLOption', 'HOPOPT_ILNPOption', - 'HOPOPT_LineIdentificationOption', 'HOPOPT_JumboPayloadOption', 'HOPOPT_HomeAddressOption', - 'HOPOPT_IPDFFOption', - - # Internet Control Message Protocol - 'ICMPv4', - 'ICMPv4_Unknown', 'ICMPv4_Echo', 'ICMPv4_DestinationUnreachable', 'ICMPv4_TimeExceeded', - 'ICMPv4_ParameterProblem', - - # Internet Control Message Protocol for IPv6 - 'ICMPv6', - 'ICMPv6_Unknown', 'ICMPv6_DestinationUnreachable', 'ICMPv6_PacketTooBig', 'ICMPv6_TimeExceeded', - 'ICMPv6_ParameterProblem', 'ICMPv6_Echo', - - # Internet Group Management Protocol - 'IGMP', 'IGMPv3', 'IGMPv3_Query', 'IGMPv3_Report', 'IGMPv3_GroupRecord', - - # Internet Protocol version 4 - 'IPv4', - 'IPv4_ToSField', 'IPv4_Flags', - 'IPv4_OptionType', - 'IPv4_UnassignedOption', 'IPv4_EOOLOption', 'IPv4_NOPOption', - 'IPv4_SECOption', 'IPv4_LSROption', 'IPv4_TSOption', - 'IPv4_ESECOption', 'IPv4_RROption', 'IPv4_SIDOption', - 'IPv4_SSROption', 'IPv4_MTUPOption', 'IPv4_MTUROption', - 'IPv4_TROption', 'IPv4_RTRALTOption', 'IPv4_QSOption', - 'IPv4_QuickStartRequestOption', 'IPv4_QuickStartReportOption', - - # IPv6 Fragment Header - 'IPv6_Frag', - - # IPv6 Extension Header (generic) - 'IPv6_Ext', - - # IPv6 Destination Options Header - 'IPv6_Opts', - 'IPv6_Opts_RPLFlags', 'IPv6_Opts_MPLFlags', 'IPv6_Opts_DFFFlags', - 'IPv6_Opts_SMFDPDOption', 'IPv6_Opts_QuickStartOption', - 'IPv6_Opts_UnassignedOption', 'IPv6_Opts_PadOption', 'IPv6_Opts_TunnelEncapsulationLimitOption', - 'IPv6_Opts_RouterAlertOption', 'IPv6_Opts_CALIPSOOption', 'IPv6_Opts_SMFIdentificationBasedDPDOption', - 'IPv6_Opts_SMFHashBasedDPDOption', 'IPv6_Opts_PDMOption', 'IPv6_Opts_QuickStartRequestOption', - 'IPv6_Opts_QuickStartReportOption', 'IPv6_Opts_RPLOption', 'IPv6_Opts_MPLOption', 'IPv6_Opts_ILNPOption', - 'IPv6_Opts_LineIdentificationOption', 'IPv6_Opts_JumboPayloadOption', 'IPv6_Opts_HomeAddressOption', - 'IPv6_Opts_IPDFFOption', - - # IPv6 Routing Header - 'IPv6_Route', - 'IPv6_Route_UnknownType', 'IPv6_Route_SourceRoute', 'IPv6_Route_Type2', 'IPv6_Route_RPL', - - # Internet Protocol version 6 - 'IPv6', - - # Internetwork Packet Exchange - 'IPX', - 'IPX_Address', - - # Mobility Header - 'MH', - 'MH_UnknownMessage', 'MH_BindingRefreshRequestMessage', 'MH_HomeTestInitMessage', 'MH_CareofTestInitMessage', - 'MH_HomeTestMessage', 'MH_CareofTestMessage', 'MH_BindingUpdateMessage', 'MH_BindingAcknowledgementMessage', - 'MH_BindingErrorMessage', 'MH_FastBindingUpdateMessage', 'MH_FastBindingAcknowledgmentMessage', - 'MH_FastNeighborAdvertisementMessage', 'MH_ExperimentalMessage', 'MH_HandoverInitiateMessage', - 'MH_HandoverAcknowledgeMessage', 'MH_HeartbeatMessage', 'MH_HomeAgentSwitchMessage', 'MH_BindingRevocationMessage', - 'MH_LocalizedRoutingInitiationMessage', 'MH_LocalizedRoutingAcknowledgmentMessage', 'MH_UpdateNotificationMessage', - 'MH_UpdateNotificationAcknowledgementMessage', 'MH_FlowBindingMessage', 'MH_SubscriptionQueryMessage', - 'MH_SubscriptionResponseMessage', - 'MH_Option', - 'MH_UnassignedOption', 'MH_PadOption', 'MH_BindingRefreshAdviceOption', 'MH_AlternateCareofAddressOption', - 'MH_NonceIndicesOption', 'MH_AuthorizationDataOption', 'MH_MobileNetworkPrefixOption', 'MH_LinkLayerAddressOption', - 'MH_MNIDOption', 'MH_AuthOption', 'MH_MesgIDOption', 'MH_CGAParametersRequestOption', 'MH_CGAParametersOption', - 'MH_SignatureOption', 'MH_PermanentHomeKeygenTokenOption', 'MH_CareofTestInitOption', 'MH_CareofTestOption', - 'MH_ExperimentalMobilityOption', 'MH_BADFOption', 'MH_IPv6AddressPrefixOption', 'MH_HomeNetworkPrefixOption', - 'MH_HandoffIndicatorOption', 'MH_AccessTechnologyTypeOption', 'MH_MNLLIdentifierOption', - 'MH_LinkLocalAddressOption', 'MH_TimestampOption', 'MH_RestartCounterOption', 'MH_DNSUpdateOption', - 'MH_VendorSpecificOption', 'MH_ServiceSelectionOption', 'MH_IPv4HomeAddressOption', - 'MH_IPv4AddressAcknowledgementOption', 'MH_NATDetectionOption', 'MH_IPv4CareofAddressOption', 'MH_GREKeyOption', - 'MH_BindingIdentifierOption', 'MH_IPv4HomeAddressRequestOption', 'MH_IPv4HomeAddressReplyOption', - 'MH_IPv4DefaultRouterAddressOption', 'MH_IPv4DHCPSupportModeOption', 'MH_ContextRequestOption', - 'MH_LMAAddressOption', 'MH_MNLLAIIDOption', 'MH_TransientBindingOption', 'MH_FlowSummaryOption', - 'MH_FlowIdentificationOption', 'MH_RedirectCapabilityOption', 'MH_RedirectOption', 'MH_LoadInformationOption', - 'MH_AlternateIPv4CareofAddressOption', 'MH_MNGroupIdentifierOption', 'MH_MAGIPv6AddressOption', - 'MH_AccessNetworkIdentifierOption', 'MH_IPv4TrafficOffloadSelectorOption', 'MH_DynamicIPMulticastSelectorOption', - 'MH_DelegatedMNPOption', 'MH_ActiveMulticastSubscriptionIPv4Option', 'MH_ActiveMulticastSubscriptionIPv6Option', - 'MH_QualityOfServiceOption', 'MH_LMAUserPlaneAddressOption', 'MH_MulticastMobilityOption', - 'MH_MulticastAcknowledgementOption', 'MH_LMAControlledMAGParametersOption', 'MH_MAGMultipathBindingOption', - 'MH_MAGIdentifierOption', 'MH_AnchoredPrefixOption', 'MH_LocalPrefixOption', 'MH_PreviousMAAROption', - 'MH_ServingMAAROption', 'MH_DLIFLinkLocalAddressOption', 'MH_DLIFLinkLayerAddressOption', - 'MH_NTPTimestamp', 'MH_PMIPv6Timestamp', - 'MH_ContextRequest', - 'MH_FlowIdentificationSuboption', - 'MH_UnassignedFlowIdentificationSuboption', 'MH_PadFlowIdentificationSuboption', 'MH_BIDReferenceSuboption', - 'MH_TrafficSelectorSuboption', 'MH_FlowBindingActionSuboption', 'MH_TargetCareofAddressSuboption', - 'MH_ANISuboption', - 'MH_UnassignedANISuboption', 'MH_ANINetworkIdentifierSuboption', 'MH_ANIGeoLocationSuboption', - 'MH_ANIOperatorIdentifierSuboption', 'MH_ANICivicLocationSuboption', 'MH_ANIMAGGroupIdentifierSuboption', - 'MH_ANIUpdateTimerSuboption', - 'MH_QoSAttribute', - 'MH_UnassignedQoSAttribute', 'MH_BitRateAttribute', 'MH_PerSessionBitRateAttribute', - 'MH_AllocationRetentionPriorityAttribute', 'MH_QoSTrafficSelectorAttribute', 'MH_QoSVendorSpecificAttribute', - 'MH_LMAControlledMAGSuboption', - 'MH_UnassignedLMAControlledMAGSuboption', 'MH_BindingReregistrationControlSuboption', - 'MH_HeartbeatControlSuboption', - 'MH_CGAParameter', - 'MH_CGAExtension', - 'MH_UnknownExtension', 'MH_MultiPrefixExtension', 'MH_ExperimentalExtension', -] diff --git a/pcapkit/protocols/data/link/__init__.py b/pcapkit/protocols/data/link/__init__.py deleted file mode 100644 index e71b3ea54b..0000000000 --- a/pcapkit/protocols/data/link/__init__.py +++ /dev/null @@ -1,134 +0,0 @@ -# -*- coding: utf-8 -*- -"""data models for link layer protocols""" - -# Address Resolution Protocol -from pcapkit.protocols.data.link.arp import ARP -from pcapkit.protocols.data.link.arp import Address as ARP_Address -from pcapkit.protocols.data.link.arp import Type as ARP_Type - -# Ethernet Protocol -from pcapkit.protocols.data.link.ethernet import Ethernet - -# Frame Relay Access Device -from pcapkit.protocols.data.link.frad import FRAD - -# Generic Routing Encapsulation -from pcapkit.protocols.data.link.gre import GRE - -# IEEE 802.11 MAC Header -from pcapkit.protocols.data.link.ieee802_11 import IEEE802_11 -from pcapkit.protocols.data.link.ieee802_11 import FrameControl as IEEE802_11_FrameControl -from pcapkit.protocols.data.link.ieee802_11 import HTControl as IEEE802_11_HTControl -from pcapkit.protocols.data.link.ieee802_11 import QoSControl as IEEE802_11_QoSControl -from pcapkit.protocols.data.link.ieee802_11 import SequenceControl as IEEE802_11_SequenceControl - -# Layer Two Tunnelling Protocol -from pcapkit.protocols.data.link.l2tp import L2TP -from pcapkit.protocols.data.link.l2tp import Flags as L2TP_Flags - -# Linux "Cooked" Capture Encapsulation -from pcapkit.protocols.data.link.linux_sll1 import LinuxSLL1 -from pcapkit.protocols.data.link.linux_sll2 import LinuxSLL2 - -# BSD Loopback Encapsulation -from pcapkit.protocols.data.link.loopback import Loopback - -# Netlink Socket Framing -from pcapkit.protocols.data.link.netlink import Netlink - -# IEEE 802.11 Radiotap Header -from pcapkit.protocols.data.link.radiotap import EHT as Radiotap_EHT -from pcapkit.protocols.data.link.radiotap import FHSS as Radiotap_FHSS -from pcapkit.protocols.data.link.radiotap import HE as Radiotap_HE -from pcapkit.protocols.data.link.radiotap import HEMU as Radiotap_HEMU -from pcapkit.protocols.data.link.radiotap import LSIG as Radiotap_LSIG -from pcapkit.protocols.data.link.radiotap import MCS as Radiotap_MCS -from pcapkit.protocols.data.link.radiotap import S1G as Radiotap_S1G -from pcapkit.protocols.data.link.radiotap import TLV as Radiotap_TLV -from pcapkit.protocols.data.link.radiotap import TSFT as Radiotap_TSFT -from pcapkit.protocols.data.link.radiotap import USIG as Radiotap_USIG -from pcapkit.protocols.data.link.radiotap import VHT as Radiotap_VHT -from pcapkit.protocols.data.link.radiotap import AMPDUStatus as Radiotap_AMPDUStatus -from pcapkit.protocols.data.link.radiotap import Antenna as Radiotap_Antenna -from pcapkit.protocols.data.link.radiotap import AntennaNoise as Radiotap_AntennaNoise -from pcapkit.protocols.data.link.radiotap import AntennaSignal as Radiotap_AntennaSignal -from pcapkit.protocols.data.link.radiotap import Channel as Radiotap_Channel -from pcapkit.protocols.data.link.radiotap import DataRetries as Radiotap_DataRetries -from pcapkit.protocols.data.link.radiotap import DBAntennaNoise as Radiotap_DBAntennaNoise -from pcapkit.protocols.data.link.radiotap import DBAntennaSignal as Radiotap_DBAntennaSignal -from pcapkit.protocols.data.link.radiotap import DBmTXPower as Radiotap_DBmTXPower -from pcapkit.protocols.data.link.radiotap import DBTXAttenuation as Radiotap_DBTXAttenuation -from pcapkit.protocols.data.link.radiotap import Flags as Radiotap_Flags -from pcapkit.protocols.data.link.radiotap import HEData1 as Radiotap_HEData1 -from pcapkit.protocols.data.link.radiotap import HEData2 as Radiotap_HEData2 -from pcapkit.protocols.data.link.radiotap import HEMUFlags1 as Radiotap_HEMUFlags1 -from pcapkit.protocols.data.link.radiotap import HEMUFlags2 as Radiotap_HEMUFlags2 -from pcapkit.protocols.data.link.radiotap import HEMUOtherUser as Radiotap_HEMUOtherUser -from pcapkit.protocols.data.link.radiotap import LockQuality as Radiotap_LockQuality -from pcapkit.protocols.data.link.radiotap import MCSFlags as Radiotap_MCSFlags -from pcapkit.protocols.data.link.radiotap import Radiotap -from pcapkit.protocols.data.link.radiotap import RadiotapField as Radiotap_Field -from pcapkit.protocols.data.link.radiotap import RadiotapNamespace as Radiotap_RadiotapNamespace -from pcapkit.protocols.data.link.radiotap import Rate as Radiotap_Rate -from pcapkit.protocols.data.link.radiotap import RTSRetries as Radiotap_RTSRetries -from pcapkit.protocols.data.link.radiotap import RXFlags as Radiotap_RXFlags -from pcapkit.protocols.data.link.radiotap import Timestamp as Radiotap_Timestamp -from pcapkit.protocols.data.link.radiotap import TLVFields as Radiotap_TLVFields -from pcapkit.protocols.data.link.radiotap import TXAttenuation as Radiotap_TXAttenuation -from pcapkit.protocols.data.link.radiotap import TXFlags as Radiotap_TXFlags -from pcapkit.protocols.data.link.radiotap import Unknown as Radiotap_Unknown -from pcapkit.protocols.data.link.radiotap import USIGCommon as Radiotap_USIGCommon -from pcapkit.protocols.data.link.radiotap import VendorNamespace as Radiotap_VendorNamespace -from pcapkit.protocols.data.link.radiotap import VendorTLV as Radiotap_VendorTLV -from pcapkit.protocols.data.link.radiotap import ZeroLengthPSDU as Radiotap_ZeroLengthPSDU - -# 802.1Q/802.1ad VLAN Tag Types -from pcapkit.protocols.data.link.vlan import TCI as VLAN_TCI -from pcapkit.protocols.data.link.vlan import VLAN - -__all__ = [ - # Address Resolution Protocol - 'ARP', 'ARP_Address', 'ARP_Type', - - # Ethernet Protocol - 'Ethernet', - - # Frame Relay Access Device - 'FRAD', - - # Generic Routing Encapsulation - 'GRE', - - # IEEE 802.11 MAC Header - 'IEEE802_11', 'IEEE802_11_FrameControl', 'IEEE802_11_SequenceControl', - 'IEEE802_11_QoSControl', 'IEEE802_11_HTControl', - - # Layer Two Tunnelling Protocol - 'L2TP', 'L2TP_Flags', - - # Linux "Cooked" Capture Encapsulation - 'LinuxSLL1', 'LinuxSLL2', - - # BSD Loopback Encapsulation - 'Loopback', - - # Netlink Socket Framing - 'Netlink', - - # IEEE 802.11 Radiotap Header - 'Radiotap', 'Radiotap_Field', 'Radiotap_Unknown', 'Radiotap_TSFT', 'Radiotap_Flags', - 'Radiotap_Rate', 'Radiotap_Channel', 'Radiotap_FHSS', 'Radiotap_AntennaSignal', - 'Radiotap_AntennaNoise', 'Radiotap_LockQuality', 'Radiotap_TXAttenuation', - 'Radiotap_DBTXAttenuation', 'Radiotap_DBmTXPower', 'Radiotap_Antenna', - 'Radiotap_DBAntennaSignal', 'Radiotap_DBAntennaNoise', 'Radiotap_RXFlags', - 'Radiotap_TXFlags', 'Radiotap_RTSRetries', 'Radiotap_DataRetries', 'Radiotap_MCS', - 'Radiotap_MCSFlags', 'Radiotap_AMPDUStatus', 'Radiotap_VHT', - 'Radiotap_Timestamp', 'Radiotap_HE', 'Radiotap_HEData1', 'Radiotap_HEData2', 'Radiotap_HEMU', - 'Radiotap_HEMUFlags1', 'Radiotap_HEMUFlags2', 'Radiotap_HEMUOtherUser', - 'Radiotap_ZeroLengthPSDU', 'Radiotap_LSIG', 'Radiotap_TLVFields', - 'Radiotap_RadiotapNamespace', 'Radiotap_VendorNamespace', 'Radiotap_S1G', 'Radiotap_USIG', - 'Radiotap_USIGCommon', 'Radiotap_EHT', 'Radiotap_TLV', 'Radiotap_VendorTLV', - - # 802.1Q/802.1ad VLAN Tag Types - 'VLAN', 'VLAN_TCI', -] diff --git a/pcapkit/protocols/data/misc/__init__.py b/pcapkit/protocols/data/misc/__init__.py deleted file mode 100644 index 3f5489ff05..0000000000 --- a/pcapkit/protocols/data/misc/__init__.py +++ /dev/null @@ -1,115 +0,0 @@ -# -*- coding: utf-8 -*- -"""data models for utility protocols""" - -# PCAP file headers -from pcapkit.protocols.data.misc.pcap import * - -# PCAP-NG file format -from pcapkit.protocols.data.misc.pcapng import PCAPNG -from pcapkit.protocols.data.misc.pcapng import CommentOption as PCAPNG_CommentOption -from pcapkit.protocols.data.misc.pcapng import CustomBlock as PCAPNG_CustomBlock -from pcapkit.protocols.data.misc.pcapng import CustomOption as PCAPNG_CustomOption -from pcapkit.protocols.data.misc.pcapng import \ - DecryptionSecretsBlock as PCAPNG_DecryptionSecretsBlock -from pcapkit.protocols.data.misc.pcapng import DSBSecrets as PCAPNG_DSBSecrets -from pcapkit.protocols.data.misc.pcapng import EndOfOption as PCAPNG_EndOfOption -from pcapkit.protocols.data.misc.pcapng import EndRecord as PCAPNG_EndRecord -from pcapkit.protocols.data.misc.pcapng import EnhancedPacketBlock as PCAPNG_EnhancedPacketBlock -from pcapkit.protocols.data.misc.pcapng import EPB_DropCountOption as PCAPNG_EPB_DropCountOption -from pcapkit.protocols.data.misc.pcapng import EPB_FlagsOption as PCAPNG_EPB_FlagsOption -from pcapkit.protocols.data.misc.pcapng import EPB_HashOption as PCAPNG_EPB_HashOption -from pcapkit.protocols.data.misc.pcapng import EPB_PacketIDOption as PCAPNG_EPB_PacketIDOption -from pcapkit.protocols.data.misc.pcapng import EPB_QueueOption as PCAPNG_EPB_QueueOption -from pcapkit.protocols.data.misc.pcapng import EPB_VerdictOption as PCAPNG_EPB_VerdictOption -from pcapkit.protocols.data.misc.pcapng import IF_DescriptionOption as PCAPNG_IF_DescriptionOption -from pcapkit.protocols.data.misc.pcapng import IF_EUIAddrOption as PCAPNG_IF_EUIAddrOption -from pcapkit.protocols.data.misc.pcapng import IF_FCSLenOption as PCAPNG_IF_FCSLenOption -from pcapkit.protocols.data.misc.pcapng import IF_FilterOption as PCAPNG_IF_FilterOption -from pcapkit.protocols.data.misc.pcapng import IF_HardwareOption as PCAPNG_IF_HardwareOption -from pcapkit.protocols.data.misc.pcapng import IF_IPv4AddrOption as PCAPNG_IF_IPv4AddrOption -from pcapkit.protocols.data.misc.pcapng import IF_IPv6AddrOption as PCAPNG_IF_IPv6AddrOption -from pcapkit.protocols.data.misc.pcapng import IF_MACAddrOption as PCAPNG_IF_MACAddrOption -from pcapkit.protocols.data.misc.pcapng import IF_NameOption as PCAPNG_IF_NameOption -from pcapkit.protocols.data.misc.pcapng import IF_OSOption as PCAPNG_IF_OSOption -from pcapkit.protocols.data.misc.pcapng import IF_RxSpeedOption as PCAPNG_IF_RxSpeedOption -from pcapkit.protocols.data.misc.pcapng import IF_SpeedOption as PCAPNG_IF_SpeedOption -from pcapkit.protocols.data.misc.pcapng import IF_TSOffsetOption as PCAPNG_IF_TSOffsetOption -from pcapkit.protocols.data.misc.pcapng import IF_TSResolOption as PCAPNG_IF_TSResolOption -from pcapkit.protocols.data.misc.pcapng import IF_TxSpeedOption as PCAPNG_IF_TxSpeedOption -from pcapkit.protocols.data.misc.pcapng import IF_TZoneOption as PCAPNG_IF_TZoneOption -from pcapkit.protocols.data.misc.pcapng import \ - InterfaceDescriptionBlock as PCAPNG_InterfaceDescriptionBlock -from pcapkit.protocols.data.misc.pcapng import \ - InterfaceStatisticsBlock as PCAPNG_InterfaceStatisticsBlock -from pcapkit.protocols.data.misc.pcapng import IPv4Record as PCAPNG_IPv4Record -from pcapkit.protocols.data.misc.pcapng import IPv6Record as PCAPNG_IPv6Record -from pcapkit.protocols.data.misc.pcapng import ISB_EndTimeOption as PCAPNG_ISB_EndTimeOption -from pcapkit.protocols.data.misc.pcapng import \ - ISB_FilterAcceptOption as PCAPNG_ISB_FilterAcceptOption -from pcapkit.protocols.data.misc.pcapng import ISB_IFDropOption as PCAPNG_ISB_IFDropOption -from pcapkit.protocols.data.misc.pcapng import ISB_IFRecvOption as PCAPNG_ISB_IFRecvOption -from pcapkit.protocols.data.misc.pcapng import ISB_OSDropOption as PCAPNG_ISB_OSDropOption -from pcapkit.protocols.data.misc.pcapng import ISB_StartTimeOption as PCAPNG_ISB_StartTimeOption -from pcapkit.protocols.data.misc.pcapng import ISB_UsrDelivOption as PCAPNG_ISB_UsrDelivOption -from pcapkit.protocols.data.misc.pcapng import NameResolutionBlock as PCAPNG_NameResolutionBlock -from pcapkit.protocols.data.misc.pcapng import NameResolutionRecord as PCAPNG_NameResolutionRecord -from pcapkit.protocols.data.misc.pcapng import NS_DNSIP4AddrOption as PCAPNG_NS_DNSIP4AddrOption -from pcapkit.protocols.data.misc.pcapng import NS_DNSIP6AddrOption as PCAPNG_NS_DNSIP6AddrOption -from pcapkit.protocols.data.misc.pcapng import NS_DNSNameOption as PCAPNG_NS_DNSNameOption -from pcapkit.protocols.data.misc.pcapng import Option as PCAPNG_Option -from pcapkit.protocols.data.misc.pcapng import PACK_FlagsOption as PCAPNG_PACK_FlagsOption -from pcapkit.protocols.data.misc.pcapng import PACK_HashOption as PCAPNG_PACK_HashOption -from pcapkit.protocols.data.misc.pcapng import PacketBlock as PCAPNG_PacketBlock -from pcapkit.protocols.data.misc.pcapng import SectionHeaderBlock as PCAPNG_SectionHeaderBlock -from pcapkit.protocols.data.misc.pcapng import SimplePacketBlock as PCAPNG_SimplePacketBlock -from pcapkit.protocols.data.misc.pcapng import \ - SystemdJournalExportBlock as PCAPNG_SystemdJournalExportBlock -from pcapkit.protocols.data.misc.pcapng import TLSKeyLog as PCAPNG_TLSKeyLog -from pcapkit.protocols.data.misc.pcapng import TLSKeyLogEntries as PCAPNG_TLSKeyLogEntries -from pcapkit.protocols.data.misc.pcapng import UnknownBlock as PCAPNG_UnknownBlock -from pcapkit.protocols.data.misc.pcapng import UnknownOption as PCAPNG_UnknownOption -from pcapkit.protocols.data.misc.pcapng import UnknownRecord as PCAPNG_UnknownRecord -from pcapkit.protocols.data.misc.pcapng import UnknownSecrets as PCAPNG_UnknownSecrets -from pcapkit.protocols.data.misc.pcapng import WireGuardKeyLog as PCAPNG_WireGuardKeyLog -from pcapkit.protocols.data.misc.pcapng import ZigBeeAPSKey as PCAPNG_ZigBeeAPSKey -from pcapkit.protocols.data.misc.pcapng import ZigBeeNWKKey as PCAPNG_ZigBeeNWKKey - -# misc protocols -from pcapkit.protocols.data.misc.raw import Raw -from pcapkit.protocols.data.misc.no_payload import NoPayload -from pcapkit.protocols.data.misc.checksum import IP_Pseudo - -__all__ = [ - # PCAP file headers - 'PCAP_Header', 'PCAP_MagicNumber', - 'PCAP_Frame', 'PCAP_FrameInfo', - - # PCAP-NG file format - 'PCAPNG', - 'PCAPNG_Option', 'PCAPNG_UnknownOption', - 'PCAPNG_EndOfOption', 'PCAPNG_CommentOption', 'PCAPNG_CustomOption', - 'PCAPNG_IF_NameOption', 'PCAPNG_IF_DescriptionOption', 'PCAPNG_IF_IPv4AddrOption', 'PCAPNG_IF_IPv6AddrOption', - 'PCAPNG_IF_MACAddrOption', 'PCAPNG_IF_EUIAddrOption', 'PCAPNG_IF_SpeedOption', 'PCAPNG_IF_TSResolOption', - 'PCAPNG_IF_TZoneOption', 'PCAPNG_IF_FilterOption', 'PCAPNG_IF_OSOption', 'PCAPNG_IF_FCSLenOption', - 'PCAPNG_IF_TSOffsetOption', 'PCAPNG_IF_HardwareOption', 'PCAPNG_IF_TxSpeedOption', 'PCAPNG_IF_RxSpeedOption', - 'PCAPNG_EPB_FlagsOption', 'PCAPNG_EPB_HashOption', 'PCAPNG_EPB_DropCountOption', 'PCAPNG_EPB_PacketIDOption', - 'PCAPNG_EPB_QueueOption', 'PCAPNG_EPB_VerdictOption', - 'PCAPNG_NS_DNSNameOption', 'PCAPNG_NS_DNSIP4AddrOption', 'PCAPNG_NS_DNSIP6AddrOption', - 'PCAPNG_ISB_StartTimeOption', 'PCAPNG_ISB_EndTimeOption', 'PCAPNG_ISB_IFRecvOption', 'PCAPNG_ISB_IFDropOption', - 'PCAPNG_ISB_FilterAcceptOption', 'PCAPNG_ISB_OSDropOption', 'PCAPNG_ISB_UsrDelivOption', - 'PCAPNG_PACK_FlagsOption', 'PCAPNG_PACK_HashOption', - 'PCAPNG_NameResolutionRecord', 'PCAPNG_UnknownRecord', 'PCAPNG_EndRecord', 'PCAPNG_IPv4Record', 'PCAPNG_IPv6Record', - 'PCAPNG_DSBSecrets', 'PCAPNG_UnknownSecrets', 'PCAPNG_TLSKeyLogEntries', 'PCAPNG_TLSKeyLog', - 'PCAPNG_WireGuardKeyLog', 'PCAPNG_ZigBeeNWKKey', 'PCAPNG_ZigBeeAPSKey', - 'PCAPNG_UnknownBlock', 'PCAPNG_SectionHeaderBlock', 'PCAPNG_InterfaceDescriptionBlock', - 'PCAPNG_EnhancedPacketBlock', 'PCAPNG_SimplePacketBlock', 'PCAPNG_NameResolutionBlock', - 'PCAPNG_InterfaceStatisticsBlock', 'PCAPNG_SystemdJournalExportBlock', 'PCAPNG_DecryptionSecretsBlock', - 'PCAPNG_CustomBlock', 'PCAPNG_PacketBlock', - - # No Payload - 'IP_Pseudo', - 'NoPayload', - - # Raw Packet - 'Raw', -] diff --git a/pcapkit/protocols/data/misc/checksum/__init__.py b/pcapkit/protocols/data/misc/checksum/__init__.py deleted file mode 100644 index f9ef903c3d..0000000000 --- a/pcapkit/protocols/data/misc/checksum/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- -"""data models for checksum pseudo-headers""" - -from pcapkit.protocols.data.misc.checksum.ip_pseudo import IP_Pseudo - -__all__ = ['IP_Pseudo'] diff --git a/pcapkit/protocols/data/misc/pcap/__init__.py b/pcapkit/protocols/data/misc/pcap/__init__.py deleted file mode 100644 index 00067b4b4f..0000000000 --- a/pcapkit/protocols/data/misc/pcap/__init__.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -"""data models for PCAP file headers""" - -# Global header -from pcapkit.protocols.data.misc.pcap.header import Header as PCAP_Header -from pcapkit.protocols.data.misc.pcap.header import MagicNumber as PCAP_MagicNumber - -# Frame header -from pcapkit.protocols.data.misc.pcap.frame import Frame as PCAP_Frame -from pcapkit.protocols.data.misc.pcap.frame import FrameInfo as PCAP_FrameInfo - -__all__ = [ - # Global header - 'PCAP_Header', 'PCAP_MagicNumber', - - # Frame header - 'PCAP_Frame', 'PCAP_FrameInfo', -] diff --git a/pcapkit/protocols/data/protocol.py b/pcapkit/protocols/data/protocol.py deleted file mode 100644 index 0cb65d4037..0000000000 --- a/pcapkit/protocols/data/protocol.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- -"""data models for root protocol""" - -from typing import TYPE_CHECKING - -from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.data import Data - -__all__ = [ - 'Packet', -] - - -class Protocol(Data): - """Root protocol.""" - - if TYPE_CHECKING: - #: Packet payload. - packet: 'bytes' - - -@info_final -class Packet(Data): - """Header and payload data.""" - - #: packet header - header: 'bytes' - #: packet payload - payload: 'bytes' - - if TYPE_CHECKING: - def __init__(self, header: 'bytes', payload: 'bytes') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements diff --git a/pcapkit/protocols/data/transport/__init__.py b/pcapkit/protocols/data/transport/__init__.py deleted file mode 100644 index b17e53651e..0000000000 --- a/pcapkit/protocols/data/transport/__init__.py +++ /dev/null @@ -1,185 +0,0 @@ -# -*- coding: utf-8 -*- -"""data models for transport layer protocols""" - -# Datagram Congestion Control Protocol -from pcapkit.protocols.data.transport.dccp import DCCP -from pcapkit.protocols.data.transport.dccp import AckVector as DCCP_AckVector -from pcapkit.protocols.data.transport.dccp import AckVectorRun as DCCP_AckVectorRun -from pcapkit.protocols.data.transport.dccp import Change as DCCP_Change -from pcapkit.protocols.data.transport.dccp import Confirm as DCCP_Confirm -from pcapkit.protocols.data.transport.dccp import DataChecksum as DCCP_DataChecksum -from pcapkit.protocols.data.transport.dccp import DataDropped as DCCP_DataDropped -from pcapkit.protocols.data.transport.dccp import DataDroppedBlock as DCCP_DataDroppedBlock -from pcapkit.protocols.data.transport.dccp import ElapsedTime as DCCP_ElapsedTime -from pcapkit.protocols.data.transport.dccp import InitCookie as DCCP_InitCookie -from pcapkit.protocols.data.transport.dccp import Mandatory as DCCP_Mandatory -from pcapkit.protocols.data.transport.dccp import NDPCount as DCCP_NDPCount -from pcapkit.protocols.data.transport.dccp import Option as DCCP_Option -from pcapkit.protocols.data.transport.dccp import Padding as DCCP_Padding -from pcapkit.protocols.data.transport.dccp import SlowReceiver as DCCP_SlowReceiver -from pcapkit.protocols.data.transport.dccp import Timestamp as DCCP_Timestamp -from pcapkit.protocols.data.transport.dccp import TimestampEcho as DCCP_TimestampEcho -from pcapkit.protocols.data.transport.dccp import UnassignedOption as DCCP_UnassignedOption - -# Transmission Control Protocol -from pcapkit.protocols.data.transport.tcp import CC as TCP_CC -from pcapkit.protocols.data.transport.tcp import MPTCP as TCP_MPTCP -from pcapkit.protocols.data.transport.tcp import MPTCPDSS as TCP_MPTCPDSS -from pcapkit.protocols.data.transport.tcp import SACK as TCP_SACK -from pcapkit.protocols.data.transport.tcp import TCP -from pcapkit.protocols.data.transport.tcp import AlternateChecksumData as TCP_AlternateChecksumData -from pcapkit.protocols.data.transport.tcp import \ - AlternateChecksumRequest as TCP_AlternateChecksumRequest -from pcapkit.protocols.data.transport.tcp import Authentication as TCP_Authentication -from pcapkit.protocols.data.transport.tcp import CCEcho as TCP_CCEcho -from pcapkit.protocols.data.transport.tcp import CCNew as TCP_CCNew -from pcapkit.protocols.data.transport.tcp import Echo as TCP_Echo -from pcapkit.protocols.data.transport.tcp import EchoReply as TCP_EchoReply -from pcapkit.protocols.data.transport.tcp import EndOfOptionList as TCP_EndOfOptionList -from pcapkit.protocols.data.transport.tcp import FastOpenCookie as TCP_FastOpenCookie -from pcapkit.protocols.data.transport.tcp import Flags as TCP_Flags -from pcapkit.protocols.data.transport.tcp import MaximumSegmentSize as TCP_MaximumSegmentSize -from pcapkit.protocols.data.transport.tcp import MD5Signature as TCP_MD5Signature -from pcapkit.protocols.data.transport.tcp import MPTCPAddAddress as TCP_MPTCPAddAddress -from pcapkit.protocols.data.transport.tcp import MPTCPCapable as TCP_MPTCPCapable -from pcapkit.protocols.data.transport.tcp import MPTCPCapableFlag as TCP_MPTCPCapableFlag -from pcapkit.protocols.data.transport.tcp import MPTCPFallback as TCP_MPTCPFallback -from pcapkit.protocols.data.transport.tcp import MPTCPFastclose as TCP_MPTCPFastclose -from pcapkit.protocols.data.transport.tcp import MPTCPJoin as TCP_MPTCPJoin -from pcapkit.protocols.data.transport.tcp import MPTCPJoinACK as TCP_MPTCPJoinACK -from pcapkit.protocols.data.transport.tcp import MPTCPJoinSYN as TCP_MPTCPJoinSYN -from pcapkit.protocols.data.transport.tcp import MPTCPJoinSYNACK as TCP_MPTCPJoinSYNACK -from pcapkit.protocols.data.transport.tcp import MPTCPPriority as TCP_MPTCPPriority -from pcapkit.protocols.data.transport.tcp import MPTCPRemoveAddress as TCP_MPTCPRemoveAddress -from pcapkit.protocols.data.transport.tcp import MPTCPUnknown as TCP_MPTCPUnknown -from pcapkit.protocols.data.transport.tcp import NoOperation as TCP_NoOperation -from pcapkit.protocols.data.transport.tcp import Option as TCP_Option -from pcapkit.protocols.data.transport.tcp import \ - PartialOrderConnectionPermitted as TCP_PartialOrderConnectionPermitted -from pcapkit.protocols.data.transport.tcp import \ - PartialOrderServiceProfile as TCP_PartialOrderServiceProfile -from pcapkit.protocols.data.transport.tcp import QuickStartResponse as TCP_QuickStartResponse -from pcapkit.protocols.data.transport.tcp import SACKBlock as TCP_SACKBlock -from pcapkit.protocols.data.transport.tcp import SACKPermitted as TCP_SACKPermitted -from pcapkit.protocols.data.transport.tcp import Timestamps as TCP_Timestamps -from pcapkit.protocols.data.transport.tcp import UnassignedOption as TCP_UnassignedOption -from pcapkit.protocols.data.transport.tcp import UserTimeout as TCP_UserTimeout -from pcapkit.protocols.data.transport.tcp import WindowScale as TCP_WindowScale - -# Stream Control Transmission Protocol -from pcapkit.protocols.data.transport.sctp import SCTP -from pcapkit.protocols.data.transport.sctp import AbortChunk as SCTP_AbortChunk -from pcapkit.protocols.data.transport.sctp import Chunk as SCTP_Chunk -from pcapkit.protocols.data.transport.sctp import CookieACKChunk as SCTP_CookieACKChunk -from pcapkit.protocols.data.transport.sctp import CookieEchoChunk as SCTP_CookieEchoChunk -from pcapkit.protocols.data.transport.sctp import \ - CookiePreservativeParameter as SCTP_CookiePreservativeParameter -from pcapkit.protocols.data.transport.sctp import \ - CookieReceivedWhileShuttingDownCause as SCTP_CookieReceivedWhileShuttingDownCause -from pcapkit.protocols.data.transport.sctp import DATAChunk as SCTP_DATAChunk -from pcapkit.protocols.data.transport.sctp import DATAChunkFlags as SCTP_DATAChunkFlags -from pcapkit.protocols.data.transport.sctp import ErrorCause as SCTP_ErrorCause -from pcapkit.protocols.data.transport.sctp import ErrorChunk as SCTP_ErrorChunk -from pcapkit.protocols.data.transport.sctp import GapAckBlock as SCTP_GapAckBlock -from pcapkit.protocols.data.transport.sctp import HeartbeatACKChunk as SCTP_HeartbeatACKChunk -from pcapkit.protocols.data.transport.sctp import HeartbeatChunk as SCTP_HeartbeatChunk -from pcapkit.protocols.data.transport.sctp import \ - HeartbeatInfoParameter as SCTP_HeartbeatInfoParameter -from pcapkit.protocols.data.transport.sctp import \ - HostNameAddressParameter as SCTP_HostNameAddressParameter -from pcapkit.protocols.data.transport.sctp import INITACKChunk as SCTP_INITACKChunk -from pcapkit.protocols.data.transport.sctp import INITChunk as SCTP_INITChunk -from pcapkit.protocols.data.transport.sctp import \ - InvalidMandatoryParameterCause as SCTP_InvalidMandatoryParameterCause -from pcapkit.protocols.data.transport.sctp import \ - InvalidStreamIdentifierCause as SCTP_InvalidStreamIdentifierCause -from pcapkit.protocols.data.transport.sctp import \ - IPv4AddressParameter as SCTP_IPv4AddressParameter -from pcapkit.protocols.data.transport.sctp import \ - IPv6AddressParameter as SCTP_IPv6AddressParameter -from pcapkit.protocols.data.transport.sctp import \ - MissingMandatoryParameterCause as SCTP_MissingMandatoryParameterCause -from pcapkit.protocols.data.transport.sctp import NoUserDataCause as SCTP_NoUserDataCause -from pcapkit.protocols.data.transport.sctp import OutOfResourceCause as SCTP_OutOfResourceCause -from pcapkit.protocols.data.transport.sctp import Parameter as SCTP_Parameter -from pcapkit.protocols.data.transport.sctp import \ - ProtocolViolationCause as SCTP_ProtocolViolationCause -from pcapkit.protocols.data.transport.sctp import \ - RestartOfAnAssociationWithNewAddressesCause as \ - SCTP_RestartOfAnAssociationWithNewAddressesCause -from pcapkit.protocols.data.transport.sctp import SACKChunk as SCTP_SACKChunk -from pcapkit.protocols.data.transport.sctp import ShutdownACKChunk as SCTP_ShutdownACKChunk -from pcapkit.protocols.data.transport.sctp import ShutdownChunk as SCTP_ShutdownChunk -from pcapkit.protocols.data.transport.sctp import \ - ShutdownCompleteChunk as SCTP_ShutdownCompleteChunk -from pcapkit.protocols.data.transport.sctp import StaleCookieCause as SCTP_StaleCookieCause -from pcapkit.protocols.data.transport.sctp import TBitFlags as SCTP_TBitFlags -from pcapkit.protocols.data.transport.sctp import \ - StateCookieParameter as SCTP_StateCookieParameter -from pcapkit.protocols.data.transport.sctp import \ - SupportedAddressTypesParameter as SCTP_SupportedAddressTypesParameter -from pcapkit.protocols.data.transport.sctp import UnknownCause as SCTP_UnknownCause -from pcapkit.protocols.data.transport.sctp import UnknownChunk as SCTP_UnknownChunk -from pcapkit.protocols.data.transport.sctp import UnknownParameter as SCTP_UnknownParameter -from pcapkit.protocols.data.transport.sctp import \ - UnrecognizedChunkTypeCause as SCTP_UnrecognizedChunkTypeCause -from pcapkit.protocols.data.transport.sctp import \ - UnrecognizedParameter as SCTP_UnrecognizedParameter -from pcapkit.protocols.data.transport.sctp import \ - UnrecognizedParametersCause as SCTP_UnrecognizedParametersCause -from pcapkit.protocols.data.transport.sctp import \ - UnresolvableAddressCause as SCTP_UnresolvableAddressCause -from pcapkit.protocols.data.transport.sctp import \ - UserInitiatedAbortCause as SCTP_UserInitiatedAbortCause -# User Datagram Protocol -from pcapkit.protocols.data.transport.udp import UDP - -__all__ = [ - # Datagram Congestion Control Protocol - 'DCCP', 'DCCP_AckVectorRun', 'DCCP_DataDroppedBlock', - 'DCCP_Option', - 'DCCP_UnassignedOption', 'DCCP_Padding', 'DCCP_Mandatory', 'DCCP_SlowReceiver', 'DCCP_Change', - 'DCCP_Confirm', 'DCCP_InitCookie', 'DCCP_NDPCount', 'DCCP_AckVector', 'DCCP_DataDropped', - 'DCCP_Timestamp', 'DCCP_TimestampEcho', 'DCCP_ElapsedTime', 'DCCP_DataChecksum', - - # Transmission Control Protocol - 'TCP', - 'TCP_Flags', 'TCP_SACKBlock', - 'TCP_Option', - 'TCP_UnassignedOption', 'TCP_EndOfOptionList', 'TCP_NoOperation', 'TCP_MaximumSegmentSize', 'TCP_WindowScale', - 'TCP_SACKPermitted', 'TCP_SACK', 'TCP_Echo', 'TCP_EchoReply', 'TCP_Timestamps', 'TCP_PartialOrderConnectionPermitted', # pylint: disable=line-too-long - 'TCP_PartialOrderServiceProfile', 'TCP_CC', 'TCP_CCNew', 'TCP_CCEcho', 'TCP_AlternateChecksumRequest', - 'TCP_AlternateChecksumData', 'TCP_MD5Signature', 'TCP_QuickStartResponse', 'TCP_UserTimeout', - 'TCP_Authentication', 'TCP_FastOpenCookie', - 'TCP_MPTCPCapableFlag', - 'TCP_MPTCP', - 'TCP_MPTCPUnknown', 'TCP_MPTCPCapable', 'TCP_MPTCPDSS', 'TCP_MPTCPAddAddress', 'TCP_MPTCPRemoveAddress', - 'TCP_MPTCPPriority', 'TCP_MPTCPFallback', 'TCP_MPTCPFastclose', - 'TCP_MPTCPJoin', - 'TCP_MPTCPJoinSYN', 'TCP_MPTCPJoinSYNACK', 'TCP_MPTCPJoinACK', - - # Stream Control Transmission Protocol - 'SCTP', - 'SCTP_DATAChunkFlags', 'SCTP_TBitFlags', 'SCTP_GapAckBlock', - 'SCTP_Chunk', - 'SCTP_UnknownChunk', 'SCTP_DATAChunk', 'SCTP_INITChunk', 'SCTP_INITACKChunk', 'SCTP_SACKChunk', - 'SCTP_HeartbeatChunk', 'SCTP_HeartbeatACKChunk', 'SCTP_AbortChunk', 'SCTP_ShutdownChunk', - 'SCTP_ShutdownACKChunk', 'SCTP_ErrorChunk', 'SCTP_CookieEchoChunk', 'SCTP_CookieACKChunk', - 'SCTP_ShutdownCompleteChunk', - 'SCTP_Parameter', - 'SCTP_UnknownParameter', 'SCTP_HeartbeatInfoParameter', 'SCTP_IPv4AddressParameter', - 'SCTP_IPv6AddressParameter', 'SCTP_StateCookieParameter', 'SCTP_UnrecognizedParameter', - 'SCTP_CookiePreservativeParameter', 'SCTP_HostNameAddressParameter', - 'SCTP_SupportedAddressTypesParameter', - 'SCTP_ErrorCause', - 'SCTP_UnknownCause', 'SCTP_InvalidStreamIdentifierCause', - 'SCTP_MissingMandatoryParameterCause', 'SCTP_StaleCookieCause', 'SCTP_OutOfResourceCause', - 'SCTP_UnresolvableAddressCause', 'SCTP_UnrecognizedChunkTypeCause', - 'SCTP_InvalidMandatoryParameterCause', 'SCTP_UnrecognizedParametersCause', - 'SCTP_NoUserDataCause', 'SCTP_CookieReceivedWhileShuttingDownCause', - 'SCTP_RestartOfAnAssociationWithNewAddressesCause', 'SCTP_UserInitiatedAbortCause', - 'SCTP_ProtocolViolationCause', - - # User Datagram Protocol - 'UDP', -] diff --git a/pcapkit/protocols/internet/__init__.py b/pcapkit/protocols/internet/__init__.py index 2c434fc06f..eacc2c807c 100644 --- a/pcapkit/protocols/internet/__init__.py +++ b/pcapkit/protocols/internet/__init__.py @@ -15,34 +15,34 @@ from pcapkit.protocols.internet.internet import Internet # Utility Classes for Protocols -from pcapkit.protocols.internet.ah import AH -from pcapkit.protocols.internet.esp import ESP -from pcapkit.protocols.internet.icmpv4 import ICMPv4 -from pcapkit.protocols.internet.icmpv6 import ICMPv6 -from pcapkit.protocols.internet.igmpv1 import IGMPv1 -from pcapkit.protocols.internet.igmpv2 import IGMPv2 -from pcapkit.protocols.internet.igmpv3 import IGMPv3 -from pcapkit.protocols.internet.ipv4 import IPv4 -from pcapkit.protocols.internet.ipv6 import IPv6 -from pcapkit.protocols.internet.ipx import IPX +from pcapkit.protocols.internet.ah.protocol import AH +from pcapkit.protocols.internet.esp.protocol import ESP +from pcapkit.protocols.internet.icmpv4.protocol import ICMPv4 +from pcapkit.protocols.internet.icmpv6.protocol import ICMPv6 +from pcapkit.protocols.internet.igmpv1.protocol import IGMPv1 +from pcapkit.protocols.internet.igmpv2.protocol import IGMPv2 +from pcapkit.protocols.internet.igmpv3.protocol import IGMPv3 +from pcapkit.protocols.internet.ipv4.protocol import IPv4 +from pcapkit.protocols.internet.ipv6.protocol import IPv6 +from pcapkit.protocols.internet.ipx.protocol import IPX # IPv6 Extension Headers -from pcapkit.protocols.internet.hip import HIP -from pcapkit.protocols.internet.hopopt import HOPOPT -from pcapkit.protocols.internet.ipv6_frag import IPv6_Frag -from pcapkit.protocols.internet.ipv6_ext import IPv6_Ext -from pcapkit.protocols.internet.ipv6_opts import IPv6_Opts -from pcapkit.protocols.internet.ipv6_route import IPv6_Route -from pcapkit.protocols.internet.mh import MH +from pcapkit.protocols.internet.hip.protocol import HIP +from pcapkit.protocols.internet.hopopt.protocol import HOPOPT +from pcapkit.protocols.internet.ipv6_frag.protocol import IPv6_Frag +from pcapkit.protocols.internet.ipv6_ext.protocol import IPv6_Ext +from pcapkit.protocols.internet.ipv6_opts.protocol import IPv6_Opts +from pcapkit.protocols.internet.ipv6_route.protocol import IPv6_Route +from pcapkit.protocols.internet.mh.protocol import MH # Ethertype IEEE 802 Numbers from pcapkit.const.reg.ethertype import EtherType as ETHERTYPE # Base Classes -from pcapkit.protocols.internet.icmp import ICMP -from pcapkit.protocols.internet.igmp import IGMP -from pcapkit.protocols.internet.ip import IP -from pcapkit.protocols.internet.ipsec import IPsec +from pcapkit.protocols.internet.icmp.protocol import ICMP +from pcapkit.protocols.internet.igmp.protocol import IGMP +from pcapkit.protocols.internet.ip.protocol import IP +from pcapkit.protocols.internet.ipsec.protocol import IPsec __all__ = [ 'ETHERTYPE', # Protocol Numbers diff --git a/pcapkit/protocols/internet/ah/__init__.py b/pcapkit/protocols/internet/ah/__init__.py new file mode 100644 index 0000000000..f86a5cd898 --- /dev/null +++ b/pcapkit/protocols/internet/ah/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""AH - Authentication Header +================================ + +.. module:: pcapkit.protocols.internet.ah + +:mod:`pcapkit.protocols.internet.ah` holds the dissector, +:class:`~pcapkit.protocols.internet.ah.protocol.AH`, in +:mod:`~pcapkit.protocols.internet.ah.protocol`, its header schema in +:mod:`~pcapkit.protocols.internet.ah.schema` and its data model in +:mod:`~pcapkit.protocols.internet.ah.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.internet.ah.protocol import AH + +# Header Schemas +from pcapkit.protocols.internet.ah.schema import AH as Schema_AH + +# Data Models +from pcapkit.protocols.internet.ah.data import AH as Data_AH + +__all__ = ['AH'] diff --git a/pcapkit/protocols/data/internet/ah.py b/pcapkit/protocols/internet/ah/data.py similarity index 94% rename from pcapkit/protocols/data/internet/ah.py rename to pcapkit/protocols/internet/ah/data.py index ffc942d07f..9f1bc4e627 100644 --- a/pcapkit/protocols/data/internet/ah.py +++ b/pcapkit/protocols/internet/ah/data.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Protocol if TYPE_CHECKING: from pcapkit.const.reg.transtype import TransType diff --git a/pcapkit/protocols/internet/ah.py b/pcapkit/protocols/internet/ah/protocol.py similarity index 91% rename from pcapkit/protocols/internet/ah.py rename to pcapkit/protocols/internet/ah/protocol.py index 989dda9ebd..24fc4165b7 100644 --- a/pcapkit/protocols/internet/ah.py +++ b/pcapkit/protocols/internet/ah/protocol.py @@ -2,10 +2,10 @@ """AH - Authentication Header ================================ -.. module:: pcapkit.protocols.internet.ah +.. module:: pcapkit.protocols.internet.ah.protocol -:mod:`pcapkit.protocols.internet.ah` contains -:class:`~pcapkit.protocols.internet.ah.AH` only, +:mod:`pcapkit.protocols.internet.ah.protocol` contains +:class:`~pcapkit.protocols.internet.ah.protocol.AH` only, which implements the extractor for Authentication Header (AH) [*]_, whose structure is described as below: @@ -27,12 +27,12 @@ from typing import TYPE_CHECKING, overload from pcapkit.const.reg.transtype import TransType as Enum_TransType -from pcapkit.protocols.data.internet.ah import AH as Data_AH -from pcapkit.protocols.internet.ipsec import IPsec -from pcapkit.protocols.internet.ipv6_ext import IPv6_Ext -from pcapkit.protocols.misc.no_payload import NoPayload -from pcapkit.protocols.schema.internet.ah import AH as Schema_AH -from pcapkit.protocols.schema.internet.ah import AH_HEADER_LEN +from pcapkit.protocols.internet.ah.data import AH as Data_AH +from pcapkit.protocols.internet.ah.schema import AH as Schema_AH +from pcapkit.protocols.internet.ah.schema import AH_HEADER_LEN +from pcapkit.protocols.internet.ipsec.protocol import IPsec +from pcapkit.protocols.internet.ipv6_ext.protocol import IPv6_Ext +from pcapkit.protocols.misc.no_payload.protocol import NoPayload from pcapkit.utilities.exceptions import UnsupportedCall if TYPE_CHECKING: @@ -42,7 +42,7 @@ from pcapkit.corekit.protochain import ProtoChain from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema __all__ = ['AH'] @@ -51,8 +51,8 @@ class AH(IPsec[Data_AH, Schema_AH], IPv6_Ext[Data_AH, Schema_AH], schema=Schema_AH, data=Data_AH): """This class implements Authentication Header. - Double-inherited (GitHub issue :issue:`917`): :class:`~pcapkit.protocols.internet.ah.AH` is both a member of the - IPsec family and an IPv6 extension header. IANA's *IPv6 Extension Header + Double-inherited (GitHub issue :issue:`917`): :class:`~pcapkit.protocols.internet.ah.protocol.AH` is both a member + of the IPsec family and an IPv6 extension header. IANA's *IPv6 Extension Header Types* registry lists it at 51 (:rfc:`4302#section-3.1.1` has it appear after the hop-by-hop, routing and fragmentation extension headers in the IPv6 header chain), and @@ -60,9 +60,9 @@ class AH(IPsec[Data_AH, Schema_AH], IPv6_Ext[Data_AH, Schema_AH], same section places it after the IP header and before the next-layer protocol under IPv4, so it also travels directly as an IPv4 payload, which is what qualifies it for a base besides - :class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext`. - :class:`~pcapkit.protocols.internet.ipsec.IPsec` comes first so that its - :meth:`~pcapkit.protocols.internet.ipsec.IPsec.id` takes precedence. + :class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext`. + :class:`~pcapkit.protocols.internet.ipsec.protocol.IPsec` comes first so that its + :meth:`~pcapkit.protocols.internet.ipsec.protocol.IPsec.id` takes precedence. .. versionchanged:: 1.5.0 @@ -103,12 +103,12 @@ def alias(self) -> 'Literal["AH"]': Spelled out rather than left to :attr:`Protocol.alias `'s class-name default, because - :class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext` sits between + :class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext` sits between this class and that default in the MRO and carries its own ``'IPv6-Ext'`` (GitHub issue :issue:`917`). Inheriting it would rename this header in every :class:`~pcapkit.corekit.protochain.ProtoChain` string and in :meth:`IPv6._decode_next_layer - `'s packet + `'s packet dict key. """ diff --git a/pcapkit/protocols/schema/internet/ah.py b/pcapkit/protocols/internet/ah/schema.py similarity index 96% rename from pcapkit/protocols/schema/internet/ah.py rename to pcapkit/protocols/internet/ah/schema.py index e80321ec94..241e00d126 100644 --- a/pcapkit/protocols/schema/internet/ah.py +++ b/pcapkit/protocols/internet/ah/schema.py @@ -8,7 +8,7 @@ from pcapkit.corekit.fields.misc import PayloadField from pcapkit.corekit.fields.numbers import EnumField, UInt8Field, UInt16Field, UInt32Field from pcapkit.corekit.fields.strings import BytesField -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final __all__ = ['AH'] diff --git a/pcapkit/protocols/internet/esp/__init__.py b/pcapkit/protocols/internet/esp/__init__.py new file mode 100644 index 0000000000..71766c2044 --- /dev/null +++ b/pcapkit/protocols/internet/esp/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""ESP - Encapsulating Security Payload +========================================== + +.. module:: pcapkit.protocols.internet.esp + +:mod:`pcapkit.protocols.internet.esp` holds the dissector, +:class:`~pcapkit.protocols.internet.esp.protocol.ESP`, in +:mod:`~pcapkit.protocols.internet.esp.protocol`, its header schema in +:mod:`~pcapkit.protocols.internet.esp.schema` and its data model in +:mod:`~pcapkit.protocols.internet.esp.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.internet.esp.protocol import ESP + +# Header Schemas +from pcapkit.protocols.internet.esp.schema import ESP as Schema_ESP + +# Data Models +from pcapkit.protocols.internet.esp.data import ESP as Data_ESP + +__all__ = ['ESP'] diff --git a/pcapkit/protocols/data/internet/esp.py b/pcapkit/protocols/internet/esp/data.py similarity index 96% rename from pcapkit/protocols/data/internet/esp.py rename to pcapkit/protocols/internet/esp/data.py index 3d12799771..84eb2955c3 100644 --- a/pcapkit/protocols/data/internet/esp.py +++ b/pcapkit/protocols/internet/esp/data.py @@ -4,13 +4,13 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Protocol if TYPE_CHECKING: from typing import Optional from pcapkit.const.reg.transtype import TransType - from pcapkit.protocols.internet.esp import ESPStatus + from pcapkit.protocols.internet.esp.protocol import ESPStatus __all__ = ['ESP'] diff --git a/pcapkit/protocols/internet/esp.py b/pcapkit/protocols/internet/esp/protocol.py similarity index 98% rename from pcapkit/protocols/internet/esp.py rename to pcapkit/protocols/internet/esp/protocol.py index d08a3feed7..6cf8703cee 100644 --- a/pcapkit/protocols/internet/esp.py +++ b/pcapkit/protocols/internet/esp/protocol.py @@ -2,10 +2,10 @@ """ESP - Encapsulating Security Payload ========================================== -.. module:: pcapkit.protocols.internet.esp +.. module:: pcapkit.protocols.internet.esp.protocol -:mod:`pcapkit.protocols.internet.esp` contains -:class:`~pcapkit.protocols.internet.esp.ESP`, +:mod:`pcapkit.protocols.internet.esp.protocol` contains +:class:`~pcapkit.protocols.internet.esp.protocol.ESP`, which implements the extractor for Encapsulating Security Payload (ESP) [*]_, whose structure is described as below: @@ -29,7 +29,7 @@ * **Without** SA context, :class:`ESP` parses the ``SPI`` and ``Sequence Number``, reports the remainder as an opaque encrypted payload, and says - so through :attr:`esp.status `. + so through :attr:`esp.status `. It does *not* guess at the trailer, and it does not raise. * **With** SA context, :class:`ESP` splits off the ICV, verifies integrity, decrypts, strips the padding using ``Pad Length``, and dispatches the @@ -42,7 +42,7 @@ .. code-block:: python import pcapkit - from pcapkit.protocols.internet.esp import (Cipher, ESPContext, Integrity, + from pcapkit.protocols.internet.esp.protocol import (Cipher, ESPContext, Integrity, SecurityAssociation) sa = SecurityAssociation( @@ -173,11 +173,11 @@ from pcapkit.corekit.context import ProtocolContext from pcapkit.corekit.enum import EnumLookup from pcapkit.corekit.infoclass import Info, info_final -from pcapkit.protocols.data.internet.esp import ESP as Data_ESP -from pcapkit.protocols.internet.ipsec import IPsec -from pcapkit.protocols.internet.ipv6_ext import IPv6_Ext -from pcapkit.protocols.schema.internet.esp import ESP as Schema_ESP -from pcapkit.protocols.schema.schema import Schema +from pcapkit.protocols.internet.esp.data import ESP as Data_ESP +from pcapkit.protocols.internet.esp.schema import ESP as Schema_ESP +from pcapkit.protocols.internet.ipsec.protocol import IPsec +from pcapkit.protocols.internet.ipv6_ext.protocol import IPv6_Ext +from pcapkit.protocols.schema import Schema from pcapkit.utilities.exceptions import ProtocolError, ProtocolUnbound, UnsupportedCall from pcapkit.utilities.warnings import ProtocolWarning, warn @@ -982,7 +982,7 @@ class ESP(IPsec[Data_ESP, Schema_ESP], IPv6_Ext[Data_ESP, Schema_ESP], schema=Schema_ESP, data=Data_ESP): """This class implements Encapsulating Security Payload. - Double-inherited, mirroring :class:`~pcapkit.protocols.internet.ah.AH`: + Double-inherited, mirroring :class:`~pcapkit.protocols.internet.ah.protocol.AH`: IANA's *IPv6 Extension Header Types* registry lists ``ESP`` at 50 (:rfc:`4303#section-3.1.1` has it follow the hop-by-hop, routing and fragmentation extension headers in the IPv6 header chain), and this @@ -992,12 +992,12 @@ class ESP(IPsec[Data_ESP, Schema_ESP], IPv6_Ext[Data_ESP, Schema_ESP], siblings. The same section places ESP after the IP header and before the next-layer protocol in IPv4, so it also travels directly as an IPv4 payload, which is what qualifies it for a base besides - :class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext`. - :attr:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext.payload` and - :attr:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext.protochain` come from - :class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext`; ``protocol`` is + :class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext`. + :attr:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext.payload` and + :attr:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext.protochain` come from + :class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext`; ``protocol`` is spelled out here for the reason given on - :attr:`IPv6_Ext.protocol `. + :attr:`IPv6_Ext.protocol `. Note: :rfc:`8200#section-4.5` says outright that ESP "is not considered an @@ -1040,12 +1040,12 @@ def alias(self) -> 'Literal["ESP"]': Spelled out rather than left to :attr:`Protocol.alias `'s class-name default, because - :class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext` sits + :class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext` sits between this class and that default in the MRO and carries a concrete ``'IPv6-Ext'`` of its own. Inheriting it would rename this header in every :class:`~pcapkit.corekit.protochain.ProtoChain` string and in :meth:`IPv6._decode_next_layer - `'s packet + `'s packet dict key. The value equals the class-name default. """ @@ -1410,7 +1410,7 @@ def _make_opaque(self, spi: 'int', seq: 'int', total: 'int', payload_data: 'byte warning: 'bool' = True) -> 'Data_ESP': """Report an ESP packet whose payload was not decrypted. - The payload is surfaced as :class:`~pcapkit.protocols.misc.raw.Raw` + The payload is surfaced as :class:`~pcapkit.protocols.misc.raw.protocol.Raw` -- which is what a next header of :data:`None` resolves to -- so that :attr:`self.payload ` and the protocol chain behave as they do for any other protocol, and @@ -1506,7 +1506,7 @@ def _payload_bytes(payload: 'bytes | ProtocolBase | Schema') -> 'bytes': Raises: ProtocolUnbound: If ``payload`` is of an unsupported type. This - mirrors :meth:`Schema.pack `, + mirrors :meth:`Schema.pack `, which rejects the same set. """ diff --git a/pcapkit/protocols/schema/internet/esp.py b/pcapkit/protocols/internet/esp/schema.py similarity index 95% rename from pcapkit/protocols/schema/internet/esp.py rename to pcapkit/protocols/internet/esp/schema.py index 5f3566d917..78c5d267e1 100644 --- a/pcapkit/protocols/schema/internet/esp.py +++ b/pcapkit/protocols/internet/esp/schema.py @@ -6,7 +6,7 @@ from pcapkit.corekit.fields.misc import PayloadField from pcapkit.corekit.fields.numbers import UInt32Field -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final __all__ = ['ESP'] @@ -25,7 +25,7 @@ class ESP(Schema): as an IV, the ESP trailer and the optional Integrity Check Value) is of a length that is a property of the Security Association rather than of the packet, so it is captured verbatim as :attr:`payload` - and split by :meth:`ESP.read `. + and split by :meth:`ESP.read `. This also means :attr:`payload` is **not** the next layer's data: the next layer lives inside the ciphertext, and is handed to diff --git a/pcapkit/protocols/internet/hip/__init__.py b/pcapkit/protocols/internet/hip/__init__.py new file mode 100644 index 0000000000..8874b4dc7a --- /dev/null +++ b/pcapkit/protocols/internet/hip/__init__.py @@ -0,0 +1,169 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""HIP - Host Identity Protocol +================================== + +.. module:: pcapkit.protocols.internet.hip + +:mod:`pcapkit.protocols.internet.hip` holds the dissector, +:class:`~pcapkit.protocols.internet.hip.protocol.HIP`, in +:mod:`~pcapkit.protocols.internet.hip.protocol`, its header schema in +:mod:`~pcapkit.protocols.internet.hip.schema` and its data model in +:mod:`~pcapkit.protocols.internet.hip.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.internet.hip.protocol import HIP + +# Header Schemas +from pcapkit.protocols.internet.hip.schema import HIP as Schema_HIP +from pcapkit.protocols.internet.hip.schema import AckDataParameter as Schema_AckDataParameter +from pcapkit.protocols.internet.hip.schema import ACKParameter as Schema_ACKParameter +from pcapkit.protocols.internet.hip.schema import CertParameter as Schema_CertParameter +from pcapkit.protocols.internet.hip.schema import \ + DHGroupListParameter as Schema_DHGroupListParameter +from pcapkit.protocols.internet.hip.schema import \ + DiffieHellmanParameter as Schema_DiffieHellmanParameter +from pcapkit.protocols.internet.hip.schema import \ + ECDSACurveHostIdentity as Schema_ECDSACurveHostIdentity +from pcapkit.protocols.internet.hip.schema import \ + ECDSALowCurveHostIdentity as Schema_ECDSALowCurveHostIdentity +from pcapkit.protocols.internet.hip.schema import \ + EchoRequestSignedParameter as Schema_EchoRequestSignedParameter +from pcapkit.protocols.internet.hip.schema import \ + EchoRequestUnsignedParameter as Schema_EchoRequestUnsignedParameter +from pcapkit.protocols.internet.hip.schema import \ + EchoResponseSignedParameter as Schema_EchoResponseSignedParameter +from pcapkit.protocols.internet.hip.schema import \ + EchoResponseUnsignedParameter as Schema_EchoResponseUnsignedParameter +from pcapkit.protocols.internet.hip.schema import \ + EdDSACurveHostIdentity as Schema_EdDSACurveHostIdentity +from pcapkit.protocols.internet.hip.schema import EncryptedParameter as Schema_EncryptedParameter +from pcapkit.protocols.internet.hip.schema import ESPInfoParameter as Schema_ESPInfoParameter +from pcapkit.protocols.internet.hip.schema import \ + ESPTransformParameter as Schema_ESPTransformParameter +from pcapkit.protocols.internet.hip.schema import FromParameter as Schema_FromParameter +from pcapkit.protocols.internet.hip.schema import HIPCipherParameter as Schema_HIPCipherParameter +from pcapkit.protocols.internet.hip.schema import HIPMAC2Parameter as Schema_HIPMAC2Parameter +from pcapkit.protocols.internet.hip.schema import HIPMACParameter as Schema_HIPMACParameter +from pcapkit.protocols.internet.hip.schema import \ + HIPSignature2Parameter as Schema_HIPSignature2Parameter +from pcapkit.protocols.internet.hip.schema import \ + HIPSignatureParameter as Schema_HIPSignatureParameter +from pcapkit.protocols.internet.hip.schema import \ + HIPTransformParameter as Schema_HIPTransformParameter +from pcapkit.protocols.internet.hip.schema import \ + HIPTransportModeParameter as Schema_HIPTransportModeParameter +from pcapkit.protocols.internet.hip.schema import \ + HITSuiteListParameter as Schema_HITSuiteListParameter +from pcapkit.protocols.internet.hip.schema import HostIdentity as Schema_HostIdentity +from pcapkit.protocols.internet.hip.schema import HostIDParameter as Schema_HostIDParameter +from pcapkit.protocols.internet.hip.schema import Locator as Schema_Locator +from pcapkit.protocols.internet.hip.schema import LocatorData as Schema_LocatorData +from pcapkit.protocols.internet.hip.schema import LocatorSetParameter as Schema_LocatorSetParameter +from pcapkit.protocols.internet.hip.schema import \ + NATTraversalModeParameter as Schema_NATTraversalModeParameter +from pcapkit.protocols.internet.hip.schema import \ + NotificationParameter as Schema_NotificationParameter +from pcapkit.protocols.internet.hip.schema import OverlayIDParameter as Schema_OverlayIDParameter +from pcapkit.protocols.internet.hip.schema import OverlayTTLParameter as Schema_OverlayTTLParameter +from pcapkit.protocols.internet.hip.schema import Parameter as Schema_Parameter +from pcapkit.protocols.internet.hip.schema import PayloadMICParameter as Schema_PayloadMICParameter +from pcapkit.protocols.internet.hip.schema import PuzzleParameter as Schema_PuzzleParameter +from pcapkit.protocols.internet.hip.schema import R1CounterParameter as Schema_R1CounterParameter +from pcapkit.protocols.internet.hip.schema import RegFailedParameter as Schema_RegFailedParameter +from pcapkit.protocols.internet.hip.schema import RegFromParameter as Schema_RegFromParameter +from pcapkit.protocols.internet.hip.schema import RegInfoParameter as Schema_RegInfoParameter +from pcapkit.protocols.internet.hip.schema import RegRequestParameter as Schema_RegRequestParameter +from pcapkit.protocols.internet.hip.schema import \ + RegResponseParameter as Schema_RegResponseParameter +from pcapkit.protocols.internet.hip.schema import RelayFromParameter as Schema_RelayFromParameter +from pcapkit.protocols.internet.hip.schema import RelayHMACParameter as Schema_RelayHMACParameter +from pcapkit.protocols.internet.hip.schema import RelayToParameter as Schema_RelayToParameter +from pcapkit.protocols.internet.hip.schema import RouteDstParameter as Schema_RouteDstParameter +from pcapkit.protocols.internet.hip.schema import RouteViaParameter as Schema_RouteViaParameter +from pcapkit.protocols.internet.hip.schema import RVSHMACParameter as Schema_RVSHMACParameter +from pcapkit.protocols.internet.hip.schema import SeqDataParameter as Schema_SeqDataParameter +from pcapkit.protocols.internet.hip.schema import SEQParameter as Schema_SEQParameter +from pcapkit.protocols.internet.hip.schema import SolutionParameter as Schema_SolutionParameter +from pcapkit.protocols.internet.hip.schema import \ + TransactionIDParameter as Schema_TransactionIDParameter +from pcapkit.protocols.internet.hip.schema import \ + TransactionPacingParameter as Schema_TransactionPacingParameter +from pcapkit.protocols.internet.hip.schema import \ + TransportFormatListParameter as Schema_TransportFormatListParameter +from pcapkit.protocols.internet.hip.schema import UnassignedParameter as Schema_UnassignedParameter +from pcapkit.protocols.internet.hip.schema import ViaRVSParameter as Schema_ViaRVSParameter + +# Data Models +from pcapkit.protocols.internet.hip.data import HIP as Data_HIP +from pcapkit.protocols.internet.hip.data import AckDataParameter as Data_AckDataParameter +from pcapkit.protocols.internet.hip.data import ACKParameter as Data_ACKParameter +from pcapkit.protocols.internet.hip.data import CertParameter as Data_CertParameter +from pcapkit.protocols.internet.hip.data import Control as Data_Control +from pcapkit.protocols.internet.hip.data import DHGroupListParameter as Data_DHGroupListParameter +from pcapkit.protocols.internet.hip.data import \ + DiffieHellmanParameter as Data_DiffieHellmanParameter +from pcapkit.protocols.internet.hip.data import \ + EchoRequestSignedParameter as Data_EchoRequestSignedParameter +from pcapkit.protocols.internet.hip.data import \ + EchoRequestUnsignedParameter as Data_EchoRequestUnsignedParameter +from pcapkit.protocols.internet.hip.data import \ + EchoResponseSignedParameter as Data_EchoResponseSignedParameter +from pcapkit.protocols.internet.hip.data import \ + EchoResponseUnsignedParameter as Data_EchoResponseUnsignedParameter +from pcapkit.protocols.internet.hip.data import EncryptedParameter as Data_EncryptedParameter +from pcapkit.protocols.internet.hip.data import ESPInfoParameter as Data_ESPInfoParameter +from pcapkit.protocols.internet.hip.data import ESPTransformParameter as Data_ESPTransformParameter +from pcapkit.protocols.internet.hip.data import Flags as Data_Flags +from pcapkit.protocols.internet.hip.data import FromParameter as Data_FromParameter +from pcapkit.protocols.internet.hip.data import HIPCipherParameter as Data_HIPCipherParameter +from pcapkit.protocols.internet.hip.data import HIPMAC2Parameter as Data_HIPMAC2Parameter +from pcapkit.protocols.internet.hip.data import HIPMACParameter as Data_HIPMACParameter +from pcapkit.protocols.internet.hip.data import \ + HIPSignature2Parameter as Data_HIPSignature2Parameter +from pcapkit.protocols.internet.hip.data import HIPSignatureParameter as Data_HIPSignatureParameter +from pcapkit.protocols.internet.hip.data import HIPTransformParameter as Data_HIPTransformParameter +from pcapkit.protocols.internet.hip.data import \ + HIPTransportModeParameter as Data_HIPTransportModeParameter +from pcapkit.protocols.internet.hip.data import HITSuiteListParameter as Data_HITSuiteListParameter +from pcapkit.protocols.internet.hip.data import HostIdentity as Data_HostIdentity +from pcapkit.protocols.internet.hip.data import HostIDParameter as Data_HostIDParameter +from pcapkit.protocols.internet.hip.data import Lifetime as Data_Lifetime +from pcapkit.protocols.internet.hip.data import Locator as Data_Locator +from pcapkit.protocols.internet.hip.data import LocatorData as Data_LocatorData +from pcapkit.protocols.internet.hip.data import LocatorSetParameter as Data_LocatorSetParameter +from pcapkit.protocols.internet.hip.data import \ + NATTraversalModeParameter as Data_NATTraversalModeParameter +from pcapkit.protocols.internet.hip.data import NotificationParameter as Data_NotificationParameter +from pcapkit.protocols.internet.hip.data import OverlayIDParameter as Data_OverlayIDParameter +from pcapkit.protocols.internet.hip.data import OverlayTTLParameter as Data_OverlayTTLParameter +from pcapkit.protocols.internet.hip.data import Parameter as Data_Parameter +from pcapkit.protocols.internet.hip.data import PayloadMICParameter as Data_PayloadMICParameter +from pcapkit.protocols.internet.hip.data import PuzzleParameter as Data_PuzzleParameter +from pcapkit.protocols.internet.hip.data import R1CounterParameter as Data_R1CounterParameter +from pcapkit.protocols.internet.hip.data import RegFailedParameter as Data_RegFailedParameter +from pcapkit.protocols.internet.hip.data import RegFromParameter as Data_RegFromParameter +from pcapkit.protocols.internet.hip.data import RegInfoParameter as Data_RegInfoParameter +from pcapkit.protocols.internet.hip.data import RegRequestParameter as Data_RegRequestParameter +from pcapkit.protocols.internet.hip.data import RegResponseParameter as Data_RegResponseParameter +from pcapkit.protocols.internet.hip.data import RelayFromParameter as Data_RelayFromParameter +from pcapkit.protocols.internet.hip.data import RelayHMACParameter as Data_RelayHMACParameter +from pcapkit.protocols.internet.hip.data import RelayToParameter as Data_RelayToParameter +from pcapkit.protocols.internet.hip.data import RouteDstParameter as Data_RouteDstParameter +from pcapkit.protocols.internet.hip.data import RouteViaParameter as Data_RouteViaParameter +from pcapkit.protocols.internet.hip.data import RVSHMACParameter as Data_RVSHMACParameter +from pcapkit.protocols.internet.hip.data import SeqDataParameter as Data_SeqDataParameter +from pcapkit.protocols.internet.hip.data import SEQParameter as Data_SEQParameter +from pcapkit.protocols.internet.hip.data import SolutionParameter as Data_SolutionParameter +from pcapkit.protocols.internet.hip.data import \ + TransactionIDParameter as Data_TransactionIDParameter +from pcapkit.protocols.internet.hip.data import \ + TransactionPacingParameter as Data_TransactionPacingParameter +from pcapkit.protocols.internet.hip.data import \ + TransportFormatListParameter as Data_TransportFormatListParameter +from pcapkit.protocols.internet.hip.data import UnassignedParameter as Data_UnassignedParameter +from pcapkit.protocols.internet.hip.data import ViaRVSParameter as Data_ViaRVSParameter + +__all__ = ['HIP'] diff --git a/pcapkit/protocols/data/internet/hip.py b/pcapkit/protocols/internet/hip/data.py similarity index 99% rename from pcapkit/protocols/data/internet/hip.py rename to pcapkit/protocols/internet/hip/data.py index 5170f35d3b..a6ad6f83c1 100644 --- a/pcapkit/protocols/data/internet/hip.py +++ b/pcapkit/protocols/internet/hip/data.py @@ -4,8 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.data import Data -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Data, Protocol if TYPE_CHECKING: from datetime import timedelta diff --git a/pcapkit/protocols/internet/hip.py b/pcapkit/protocols/internet/hip/protocol.py similarity index 95% rename from pcapkit/protocols/internet/hip.py rename to pcapkit/protocols/internet/hip/protocol.py index 07d75974bb..296e566d2f 100644 --- a/pcapkit/protocols/internet/hip.py +++ b/pcapkit/protocols/internet/hip/protocol.py @@ -2,10 +2,10 @@ """HIP - Host Identity Protocol ================================== -.. module:: pcapkit.protocols.internet.hip +.. module:: pcapkit.protocols.internet.hip.protocol -:mod:`pcapkit.protocols.internet.hip` contains -:class:`~pcapkit.protocols.internet.hip.HIP` only, +:mod:`pcapkit.protocols.internet.hip.protocol` contains +:class:`~pcapkit.protocols.internet.hip.protocol.HIP` only, which implements the extractor for Host Identity Protocol (HIP) [*]_, whose structure is described as below: @@ -59,156 +59,156 @@ from pcapkit.corekit.multidict import OrderedMultiDict from pcapkit.corekit.schema.ipaddress import parse_ip_address from pcapkit.corekit.schema.padding import pad_length -from pcapkit.protocols.data.internet.hip import HIP as Data_HIP -from pcapkit.protocols.data.internet.hip import AckDataParameter as Data_AckDataParameter -from pcapkit.protocols.data.internet.hip import ACKParameter as Data_ACKParameter -from pcapkit.protocols.data.internet.hip import CertParameter as Data_CertParameter -from pcapkit.protocols.data.internet.hip import Control as Data_Control -from pcapkit.protocols.data.internet.hip import DHGroupListParameter as Data_DHGroupListParameter -from pcapkit.protocols.data.internet.hip import \ +from pcapkit.protocols.internet.hip.data import HIP as Data_HIP +from pcapkit.protocols.internet.hip.data import AckDataParameter as Data_AckDataParameter +from pcapkit.protocols.internet.hip.data import ACKParameter as Data_ACKParameter +from pcapkit.protocols.internet.hip.data import CertParameter as Data_CertParameter +from pcapkit.protocols.internet.hip.data import Control as Data_Control +from pcapkit.protocols.internet.hip.data import DHGroupListParameter as Data_DHGroupListParameter +from pcapkit.protocols.internet.hip.data import \ DiffieHellmanParameter as Data_DiffieHellmanParameter -from pcapkit.protocols.data.internet.hip import \ +from pcapkit.protocols.internet.hip.data import \ EchoRequestSignedParameter as Data_EchoRequestSignedParameter -from pcapkit.protocols.data.internet.hip import \ +from pcapkit.protocols.internet.hip.data import \ EchoRequestUnsignedParameter as Data_EchoRequestUnsignedParameter -from pcapkit.protocols.data.internet.hip import \ +from pcapkit.protocols.internet.hip.data import \ EchoResponseSignedParameter as Data_EchoResponseSignedParameter -from pcapkit.protocols.data.internet.hip import \ +from pcapkit.protocols.internet.hip.data import \ EchoResponseUnsignedParameter as Data_EchoResponseUnsignedParameter -from pcapkit.protocols.data.internet.hip import EncryptedParameter as Data_EncryptedParameter -from pcapkit.protocols.data.internet.hip import ESPInfoParameter as Data_ESPInfoParameter -from pcapkit.protocols.data.internet.hip import ESPTransformParameter as Data_ESPTransformParameter -from pcapkit.protocols.data.internet.hip import Flags as Data_Flags -from pcapkit.protocols.data.internet.hip import FromParameter as Data_FromParameter -from pcapkit.protocols.data.internet.hip import HIPCipherParameter as Data_HIPCipherParameter -from pcapkit.protocols.data.internet.hip import HIPMAC2Parameter as Data_HIPMAC2Parameter -from pcapkit.protocols.data.internet.hip import HIPMACParameter as Data_HIPMACParameter -from pcapkit.protocols.data.internet.hip import \ +from pcapkit.protocols.internet.hip.data import EncryptedParameter as Data_EncryptedParameter +from pcapkit.protocols.internet.hip.data import ESPInfoParameter as Data_ESPInfoParameter +from pcapkit.protocols.internet.hip.data import ESPTransformParameter as Data_ESPTransformParameter +from pcapkit.protocols.internet.hip.data import Flags as Data_Flags +from pcapkit.protocols.internet.hip.data import FromParameter as Data_FromParameter +from pcapkit.protocols.internet.hip.data import HIPCipherParameter as Data_HIPCipherParameter +from pcapkit.protocols.internet.hip.data import HIPMAC2Parameter as Data_HIPMAC2Parameter +from pcapkit.protocols.internet.hip.data import HIPMACParameter as Data_HIPMACParameter +from pcapkit.protocols.internet.hip.data import \ HIPSignature2Parameter as Data_HIPSignature2Parameter -from pcapkit.protocols.data.internet.hip import HIPSignatureParameter as Data_HIPSignatureParameter -from pcapkit.protocols.data.internet.hip import HIPTransformParameter as Data_HIPTransformParameter -from pcapkit.protocols.data.internet.hip import \ +from pcapkit.protocols.internet.hip.data import HIPSignatureParameter as Data_HIPSignatureParameter +from pcapkit.protocols.internet.hip.data import HIPTransformParameter as Data_HIPTransformParameter +from pcapkit.protocols.internet.hip.data import \ HIPTransportModeParameter as Data_HIPTransportModeParameter -from pcapkit.protocols.data.internet.hip import HITSuiteListParameter as Data_HITSuiteListParameter -from pcapkit.protocols.data.internet.hip import HostIdentity as Data_HostIdentity -from pcapkit.protocols.data.internet.hip import HostIDParameter as Data_HostIDParameter -from pcapkit.protocols.data.internet.hip import Lifetime as Data_Lifetime -from pcapkit.protocols.data.internet.hip import Locator as Data_Locator -from pcapkit.protocols.data.internet.hip import LocatorData as Data_LocatorData -from pcapkit.protocols.data.internet.hip import LocatorSetParameter as Data_LocatorSetParameter -from pcapkit.protocols.data.internet.hip import \ +from pcapkit.protocols.internet.hip.data import HITSuiteListParameter as Data_HITSuiteListParameter +from pcapkit.protocols.internet.hip.data import HostIdentity as Data_HostIdentity +from pcapkit.protocols.internet.hip.data import HostIDParameter as Data_HostIDParameter +from pcapkit.protocols.internet.hip.data import Lifetime as Data_Lifetime +from pcapkit.protocols.internet.hip.data import Locator as Data_Locator +from pcapkit.protocols.internet.hip.data import LocatorData as Data_LocatorData +from pcapkit.protocols.internet.hip.data import LocatorSetParameter as Data_LocatorSetParameter +from pcapkit.protocols.internet.hip.data import \ NATTraversalModeParameter as Data_NATTraversalModeParameter -from pcapkit.protocols.data.internet.hip import NotificationParameter as Data_NotificationParameter -from pcapkit.protocols.data.internet.hip import OverlayIDParameter as Data_OverlayIDParameter -from pcapkit.protocols.data.internet.hip import OverlayTTLParameter as Data_OverlayTTLParameter -from pcapkit.protocols.data.internet.hip import Parameter as Data_Parameter -from pcapkit.protocols.data.internet.hip import PayloadMICParameter as Data_PayloadMICParameter -from pcapkit.protocols.data.internet.hip import PuzzleParameter as Data_PuzzleParameter -from pcapkit.protocols.data.internet.hip import R1CounterParameter as Data_R1CounterParameter -from pcapkit.protocols.data.internet.hip import RegFailedParameter as Data_RegFailedParameter -from pcapkit.protocols.data.internet.hip import RegFromParameter as Data_RegFromParameter -from pcapkit.protocols.data.internet.hip import RegInfoParameter as Data_RegInfoParameter -from pcapkit.protocols.data.internet.hip import RegRequestParameter as Data_RegRequestParameter -from pcapkit.protocols.data.internet.hip import RegResponseParameter as Data_RegResponseParameter -from pcapkit.protocols.data.internet.hip import RelayFromParameter as Data_RelayFromParameter -from pcapkit.protocols.data.internet.hip import RelayHMACParameter as Data_RelayHMACParameter -from pcapkit.protocols.data.internet.hip import RelayToParameter as Data_RelayToParameter -from pcapkit.protocols.data.internet.hip import RouteDstParameter as Data_RouteDstParameter -from pcapkit.protocols.data.internet.hip import RouteViaParameter as Data_RouteViaParameter -from pcapkit.protocols.data.internet.hip import RVSHMACParameter as Data_RVSHMACParameter -from pcapkit.protocols.data.internet.hip import SeqDataParameter as Data_SeqDataParameter -from pcapkit.protocols.data.internet.hip import SEQParameter as Data_SEQParameter -from pcapkit.protocols.data.internet.hip import SolutionParameter as Data_SolutionParameter -from pcapkit.protocols.data.internet.hip import \ +from pcapkit.protocols.internet.hip.data import NotificationParameter as Data_NotificationParameter +from pcapkit.protocols.internet.hip.data import OverlayIDParameter as Data_OverlayIDParameter +from pcapkit.protocols.internet.hip.data import OverlayTTLParameter as Data_OverlayTTLParameter +from pcapkit.protocols.internet.hip.data import Parameter as Data_Parameter +from pcapkit.protocols.internet.hip.data import PayloadMICParameter as Data_PayloadMICParameter +from pcapkit.protocols.internet.hip.data import PuzzleParameter as Data_PuzzleParameter +from pcapkit.protocols.internet.hip.data import R1CounterParameter as Data_R1CounterParameter +from pcapkit.protocols.internet.hip.data import RegFailedParameter as Data_RegFailedParameter +from pcapkit.protocols.internet.hip.data import RegFromParameter as Data_RegFromParameter +from pcapkit.protocols.internet.hip.data import RegInfoParameter as Data_RegInfoParameter +from pcapkit.protocols.internet.hip.data import RegRequestParameter as Data_RegRequestParameter +from pcapkit.protocols.internet.hip.data import RegResponseParameter as Data_RegResponseParameter +from pcapkit.protocols.internet.hip.data import RelayFromParameter as Data_RelayFromParameter +from pcapkit.protocols.internet.hip.data import RelayHMACParameter as Data_RelayHMACParameter +from pcapkit.protocols.internet.hip.data import RelayToParameter as Data_RelayToParameter +from pcapkit.protocols.internet.hip.data import RouteDstParameter as Data_RouteDstParameter +from pcapkit.protocols.internet.hip.data import RouteViaParameter as Data_RouteViaParameter +from pcapkit.protocols.internet.hip.data import RVSHMACParameter as Data_RVSHMACParameter +from pcapkit.protocols.internet.hip.data import SeqDataParameter as Data_SeqDataParameter +from pcapkit.protocols.internet.hip.data import SEQParameter as Data_SEQParameter +from pcapkit.protocols.internet.hip.data import SolutionParameter as Data_SolutionParameter +from pcapkit.protocols.internet.hip.data import \ TransactionIDParameter as Data_TransactionIDParameter -from pcapkit.protocols.data.internet.hip import \ +from pcapkit.protocols.internet.hip.data import \ TransactionPacingParameter as Data_TransactionPacingParameter -from pcapkit.protocols.data.internet.hip import \ +from pcapkit.protocols.internet.hip.data import \ TransportFormatListParameter as Data_TransportFormatListParameter -from pcapkit.protocols.data.internet.hip import UnassignedParameter as Data_UnassignedParameter -from pcapkit.protocols.data.internet.hip import ViaRVSParameter as Data_ViaRVSParameter -from pcapkit.protocols.internet.internet import Internet -from pcapkit.protocols.internet.ipv6_ext import IPv6_Ext -from pcapkit.protocols.misc.no_payload import NoPayload -from pcapkit.protocols.schema.internet.hip import HIP as Schema_HIP -from pcapkit.protocols.schema.internet.hip import AckDataParameter as Schema_AckDataParameter -from pcapkit.protocols.schema.internet.hip import ACKParameter as Schema_ACKParameter -from pcapkit.protocols.schema.internet.hip import CertParameter as Schema_CertParameter -from pcapkit.protocols.schema.internet.hip import \ +from pcapkit.protocols.internet.hip.data import UnassignedParameter as Data_UnassignedParameter +from pcapkit.protocols.internet.hip.data import ViaRVSParameter as Data_ViaRVSParameter +from pcapkit.protocols.internet.hip.schema import HIP as Schema_HIP +from pcapkit.protocols.internet.hip.schema import AckDataParameter as Schema_AckDataParameter +from pcapkit.protocols.internet.hip.schema import ACKParameter as Schema_ACKParameter +from pcapkit.protocols.internet.hip.schema import CertParameter as Schema_CertParameter +from pcapkit.protocols.internet.hip.schema import \ DHGroupListParameter as Schema_DHGroupListParameter -from pcapkit.protocols.schema.internet.hip import \ +from pcapkit.protocols.internet.hip.schema import \ DiffieHellmanParameter as Schema_DiffieHellmanParameter -from pcapkit.protocols.schema.internet.hip import \ +from pcapkit.protocols.internet.hip.schema import \ ECDSACurveHostIdentity as Schema_ECDSACurveHostIdentity -from pcapkit.protocols.schema.internet.hip import \ +from pcapkit.protocols.internet.hip.schema import \ ECDSALowCurveHostIdentity as Schema_ECDSALowCurveHostIdentity -from pcapkit.protocols.schema.internet.hip import \ +from pcapkit.protocols.internet.hip.schema import \ EchoRequestSignedParameter as Schema_EchoRequestSignedParameter -from pcapkit.protocols.schema.internet.hip import \ +from pcapkit.protocols.internet.hip.schema import \ EchoRequestUnsignedParameter as Schema_EchoRequestUnsignedParameter -from pcapkit.protocols.schema.internet.hip import \ +from pcapkit.protocols.internet.hip.schema import \ EchoResponseSignedParameter as Schema_EchoResponseSignedParameter -from pcapkit.protocols.schema.internet.hip import \ +from pcapkit.protocols.internet.hip.schema import \ EchoResponseUnsignedParameter as Schema_EchoResponseUnsignedParameter -from pcapkit.protocols.schema.internet.hip import \ +from pcapkit.protocols.internet.hip.schema import \ EdDSACurveHostIdentity as Schema_EdDSACurveHostIdentity -from pcapkit.protocols.schema.internet.hip import EncryptedParameter as Schema_EncryptedParameter -from pcapkit.protocols.schema.internet.hip import ESPInfoParameter as Schema_ESPInfoParameter -from pcapkit.protocols.schema.internet.hip import \ +from pcapkit.protocols.internet.hip.schema import EncryptedParameter as Schema_EncryptedParameter +from pcapkit.protocols.internet.hip.schema import ESPInfoParameter as Schema_ESPInfoParameter +from pcapkit.protocols.internet.hip.schema import \ ESPTransformParameter as Schema_ESPTransformParameter -from pcapkit.protocols.schema.internet.hip import FromParameter as Schema_FromParameter -from pcapkit.protocols.schema.internet.hip import HIPCipherParameter as Schema_HIPCipherParameter -from pcapkit.protocols.schema.internet.hip import HIPMAC2Parameter as Schema_HIPMAC2Parameter -from pcapkit.protocols.schema.internet.hip import HIPMACParameter as Schema_HIPMACParameter -from pcapkit.protocols.schema.internet.hip import \ +from pcapkit.protocols.internet.hip.schema import FromParameter as Schema_FromParameter +from pcapkit.protocols.internet.hip.schema import HIPCipherParameter as Schema_HIPCipherParameter +from pcapkit.protocols.internet.hip.schema import HIPMAC2Parameter as Schema_HIPMAC2Parameter +from pcapkit.protocols.internet.hip.schema import HIPMACParameter as Schema_HIPMACParameter +from pcapkit.protocols.internet.hip.schema import \ HIPSignature2Parameter as Schema_HIPSignature2Parameter -from pcapkit.protocols.schema.internet.hip import \ +from pcapkit.protocols.internet.hip.schema import \ HIPSignatureParameter as Schema_HIPSignatureParameter -from pcapkit.protocols.schema.internet.hip import \ +from pcapkit.protocols.internet.hip.schema import \ HIPTransformParameter as Schema_HIPTransformParameter -from pcapkit.protocols.schema.internet.hip import \ +from pcapkit.protocols.internet.hip.schema import \ HIPTransportModeParameter as Schema_HIPTransportModeParameter -from pcapkit.protocols.schema.internet.hip import \ +from pcapkit.protocols.internet.hip.schema import \ HITSuiteListParameter as Schema_HITSuiteListParameter -from pcapkit.protocols.schema.internet.hip import HostIdentity as Schema_HostIdentity -from pcapkit.protocols.schema.internet.hip import HostIDParameter as Schema_HostIDParameter -from pcapkit.protocols.schema.internet.hip import Locator as Schema_Locator -from pcapkit.protocols.schema.internet.hip import LocatorData as Schema_LocatorData -from pcapkit.protocols.schema.internet.hip import LocatorSetParameter as Schema_LocatorSetParameter -from pcapkit.protocols.schema.internet.hip import \ +from pcapkit.protocols.internet.hip.schema import HostIdentity as Schema_HostIdentity +from pcapkit.protocols.internet.hip.schema import HostIDParameter as Schema_HostIDParameter +from pcapkit.protocols.internet.hip.schema import Locator as Schema_Locator +from pcapkit.protocols.internet.hip.schema import LocatorData as Schema_LocatorData +from pcapkit.protocols.internet.hip.schema import LocatorSetParameter as Schema_LocatorSetParameter +from pcapkit.protocols.internet.hip.schema import \ NATTraversalModeParameter as Schema_NATTraversalModeParameter -from pcapkit.protocols.schema.internet.hip import \ +from pcapkit.protocols.internet.hip.schema import \ NotificationParameter as Schema_NotificationParameter -from pcapkit.protocols.schema.internet.hip import OverlayIDParameter as Schema_OverlayIDParameter -from pcapkit.protocols.schema.internet.hip import OverlayTTLParameter as Schema_OverlayTTLParameter -from pcapkit.protocols.schema.internet.hip import PayloadMICParameter as Schema_PayloadMICParameter -from pcapkit.protocols.schema.internet.hip import PuzzleParameter as Schema_PuzzleParameter -from pcapkit.protocols.schema.internet.hip import R1CounterParameter as Schema_R1CounterParameter -from pcapkit.protocols.schema.internet.hip import RegFailedParameter as Schema_RegFailedParameter -from pcapkit.protocols.schema.internet.hip import RegFromParameter as Schema_RegFromParameter -from pcapkit.protocols.schema.internet.hip import RegInfoParameter as Schema_RegInfoParameter -from pcapkit.protocols.schema.internet.hip import RegRequestParameter as Schema_RegRequestParameter -from pcapkit.protocols.schema.internet.hip import \ +from pcapkit.protocols.internet.hip.schema import OverlayIDParameter as Schema_OverlayIDParameter +from pcapkit.protocols.internet.hip.schema import OverlayTTLParameter as Schema_OverlayTTLParameter +from pcapkit.protocols.internet.hip.schema import PayloadMICParameter as Schema_PayloadMICParameter +from pcapkit.protocols.internet.hip.schema import PuzzleParameter as Schema_PuzzleParameter +from pcapkit.protocols.internet.hip.schema import R1CounterParameter as Schema_R1CounterParameter +from pcapkit.protocols.internet.hip.schema import RegFailedParameter as Schema_RegFailedParameter +from pcapkit.protocols.internet.hip.schema import RegFromParameter as Schema_RegFromParameter +from pcapkit.protocols.internet.hip.schema import RegInfoParameter as Schema_RegInfoParameter +from pcapkit.protocols.internet.hip.schema import RegRequestParameter as Schema_RegRequestParameter +from pcapkit.protocols.internet.hip.schema import \ RegResponseParameter as Schema_RegResponseParameter -from pcapkit.protocols.schema.internet.hip import RelayFromParameter as Schema_RelayFromParameter -from pcapkit.protocols.schema.internet.hip import RelayHMACParameter as Schema_RelayHMACParameter -from pcapkit.protocols.schema.internet.hip import RelayToParameter as Schema_RelayToParameter -from pcapkit.protocols.schema.internet.hip import RouteDstParameter as Schema_RouteDstParameter -from pcapkit.protocols.schema.internet.hip import RouteViaParameter as Schema_RouteViaParameter -from pcapkit.protocols.schema.internet.hip import RVSHMACParameter as Schema_RVSHMACParameter -from pcapkit.protocols.schema.internet.hip import SeqDataParameter as Schema_SeqDataParameter -from pcapkit.protocols.schema.internet.hip import SEQParameter as Schema_SEQParameter -from pcapkit.protocols.schema.internet.hip import SolutionParameter as Schema_SolutionParameter -from pcapkit.protocols.schema.internet.hip import \ +from pcapkit.protocols.internet.hip.schema import RelayFromParameter as Schema_RelayFromParameter +from pcapkit.protocols.internet.hip.schema import RelayHMACParameter as Schema_RelayHMACParameter +from pcapkit.protocols.internet.hip.schema import RelayToParameter as Schema_RelayToParameter +from pcapkit.protocols.internet.hip.schema import RouteDstParameter as Schema_RouteDstParameter +from pcapkit.protocols.internet.hip.schema import RouteViaParameter as Schema_RouteViaParameter +from pcapkit.protocols.internet.hip.schema import RVSHMACParameter as Schema_RVSHMACParameter +from pcapkit.protocols.internet.hip.schema import SeqDataParameter as Schema_SeqDataParameter +from pcapkit.protocols.internet.hip.schema import SEQParameter as Schema_SEQParameter +from pcapkit.protocols.internet.hip.schema import SolutionParameter as Schema_SolutionParameter +from pcapkit.protocols.internet.hip.schema import \ TransactionIDParameter as Schema_TransactionIDParameter -from pcapkit.protocols.schema.internet.hip import \ +from pcapkit.protocols.internet.hip.schema import \ TransactionPacingParameter as Schema_TransactionPacingParameter -from pcapkit.protocols.schema.internet.hip import \ +from pcapkit.protocols.internet.hip.schema import \ TransportFormatListParameter as Schema_TransportFormatListParameter -from pcapkit.protocols.schema.internet.hip import UnassignedParameter as Schema_UnassignedParameter -from pcapkit.protocols.schema.internet.hip import ViaRVSParameter as Schema_ViaRVSParameter -from pcapkit.protocols.schema.internet.hip import parameter_total_len -from pcapkit.protocols.schema.schema import Schema +from pcapkit.protocols.internet.hip.schema import UnassignedParameter as Schema_UnassignedParameter +from pcapkit.protocols.internet.hip.schema import ViaRVSParameter as Schema_ViaRVSParameter +from pcapkit.protocols.internet.hip.schema import parameter_total_len +from pcapkit.protocols.internet.internet import Internet +from pcapkit.protocols.internet.ipv6_ext.protocol import IPv6_Ext +from pcapkit.protocols.misc.no_payload.protocol import NoPayload +from pcapkit.protocols.schema import Schema from pcapkit.utilities.exceptions import ProtocolError, UnsupportedCall from pcapkit.utilities.logging import SPHINX_TYPE_CHECKING from pcapkit.utilities.warnings import ProtocolWarning, RegistryWarning, warn @@ -222,8 +222,8 @@ from typing_extensions import Literal, NotRequired from pcapkit.corekit.protochain import ProtoChain + from pcapkit.protocols.internet.hip.schema import Parameter as Schema_Parameter from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.internet.hip import Parameter as Schema_Parameter Parameter = OrderedMultiDict[Enum_Parameter, Data_Parameter] ParameterParser = Callable[[Schema_Parameter, NamedArg(int, 'version'), @@ -262,7 +262,7 @@ class HIP(IPv6_Ext[Data_HIP, Schema_HIP], Internet[Data_HIP, Schema_HIP], Double-inherited, per the convention set on :issue:`917`: a header usable *only* as an extension header inherits - :class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext` alone, while one also + :class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext` alone, while one also usable as a standalone protocol names :class:`~pcapkit.protocols.internet.internet.Internet` as well. HIP is both, on independent grounds: @@ -273,11 +273,11 @@ class HIP(IPv6_Ext[Data_HIP, Schema_HIP], Internet[Data_HIP, Schema_HIP], * :rfc:`7401#appendix-C.2`, "IPv4 HIP Packet (I1 Packet)", works a checksum for an **IPv4** header carrying ``Next Header: 139`` with ``Payload Protocol: 59``. HIP therefore travels directly as an IPv4 - payload, as do :class:`~pcapkit.protocols.internet.ah.AH` and - :class:`~pcapkit.protocols.internet.esp.ESP`. + payload, as do :class:`~pcapkit.protocols.internet.ah.protocol.AH` and + :class:`~pcapkit.protocols.internet.esp.protocol.ESP`. The IPv4 ground separates HIP from - :class:`~pcapkit.protocols.internet.mh.MH` and Shim6, which are protocols + :class:`~pcapkit.protocols.internet.mh.protocol.MH` and Shim6, which are protocols in their own right but cannot appear under IPv4: :rfc:`6275#section-6.1.1` defines the Mobility Header checksum over a pseudo-header of IPv6 header fields with no IPv4 variant, and Mobile IPv4 @@ -285,11 +285,11 @@ class HIP(IPv6_Ext[Data_HIP, Schema_HIP], Internet[Data_HIP, Schema_HIP], than as protocol 135. :class:`~pcapkit.protocols.internet.internet.Internet` is already reached transitively through - :class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext`; naming it records the classification, so + :class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext`; naming it records the classification, so a reader can tell a deliberate standalone protocol from a header that merely inherits one. This class parses the following HIP parameters, which are registered in the - :attr:`self.__parameter__ ` + :attr:`self.__parameter__ ` attribute: .. list-table:: @@ -298,103 +298,103 @@ class HIP(IPv6_Ext[Data_HIP, Schema_HIP], Internet[Data_HIP, Schema_HIP], * - Parameter Code - Parameter Parser * - :attr:`~pcapkit.const.hip.parameter.Parameter.ESP_INFO` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_esp_info` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_esp_info` * - :attr:`~pcapkit.const.hip.parameter.Parameter.R1_Counter` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_r1_counter` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_r1_counter` * - :attr:`~pcapkit.const.hip.parameter.Parameter.R1_COUNTER` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_r1_counter` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_r1_counter` * - :attr:`~pcapkit.const.hip.parameter.Parameter.LOCATOR_SET` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_locator_set` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_locator_set` * - :attr:`~pcapkit.const.hip.parameter.Parameter.PUZZLE` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_puzzle` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_puzzle` * - :attr:`~pcapkit.const.hip.parameter.Parameter.SOLUTION` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_solution` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_solution` * - :attr:`~pcapkit.const.hip.parameter.Parameter.SEQ` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_seq` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_seq` * - :attr:`~pcapkit.const.hip.parameter.Parameter.ACK` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_ack` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_ack` * - :attr:`~pcapkit.const.hip.parameter.Parameter.DH_GROUP_LIST` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_dh_group_list` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_dh_group_list` * - :attr:`~pcapkit.const.hip.parameter.Parameter.DIFFIE_HELLMAN` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_diffie_hellman` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_diffie_hellman` * - :attr:`~pcapkit.const.hip.parameter.Parameter.HIP_TRANSFORM` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_hip_transform` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_hip_transform` * - :attr:`~pcapkit.const.hip.parameter.Parameter.HIP_CIPHER` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_hip_cipher` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_hip_cipher` * - :attr:`~pcapkit.const.hip.parameter.Parameter.NAT_TRAVERSAL_MODE` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_nat_traversal_mode` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_nat_traversal_mode` * - :attr:`~pcapkit.const.hip.parameter.Parameter.TRANSACTION_PACING` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_transaction_pacing` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_transaction_pacing` * - :attr:`~pcapkit.const.hip.parameter.Parameter.ENCRYPTED` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_encrypted` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_encrypted` * - :attr:`~pcapkit.const.hip.parameter.Parameter.HOST_ID` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_host_id` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_host_id` * - :attr:`~pcapkit.const.hip.parameter.Parameter.HIT_SUITE_LIST` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_hit_suite_list` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_hit_suite_list` * - :attr:`~pcapkit.const.hip.parameter.Parameter.CERT` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_cert` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_cert` * - :attr:`~pcapkit.const.hip.parameter.Parameter.NOTIFICATION` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_notification` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_notification` * - :attr:`~pcapkit.const.hip.parameter.Parameter.ECHO_REQUEST_SIGNED` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_echo_request_signed` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_echo_request_signed` * - :attr:`~pcapkit.const.hip.parameter.Parameter.REG_INFO` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_reg_info` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_reg_info` * - :attr:`~pcapkit.const.hip.parameter.Parameter.REG_REQUEST` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_reg_request` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_reg_request` * - :attr:`~pcapkit.const.hip.parameter.Parameter.REG_RESPONSE` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_reg_response` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_reg_response` * - :attr:`~pcapkit.const.hip.parameter.Parameter.REG_FAILED` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_reg_failed` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_reg_failed` * - :attr:`~pcapkit.const.hip.parameter.Parameter.REG_FROM` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_reg_from` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_reg_from` * - :attr:`~pcapkit.const.hip.parameter.Parameter.ECHO_RESPONSE_SIGNED` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_echo_response_signed` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_echo_response_signed` * - :attr:`~pcapkit.const.hip.parameter.Parameter.TRANSPORT_FORMAT_LIST` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_transport_format_list` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_transport_format_list` * - :attr:`~pcapkit.const.hip.parameter.Parameter.ESP_TRANSFORM` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_esp_transform` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_esp_transform` * - :attr:`~pcapkit.const.hip.parameter.Parameter.SEQ_DATA` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_seq_data` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_seq_data` * - :attr:`~pcapkit.const.hip.parameter.Parameter.ACK_DATA` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_ack_data` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_ack_data` * - :attr:`~pcapkit.const.hip.parameter.Parameter.PAYLOAD_MIC` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_payload_mic` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_payload_mic` * - :attr:`~pcapkit.const.hip.parameter.Parameter.TRANSACTION_ID` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_transaction_id` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_transaction_id` * - :attr:`~pcapkit.const.hip.parameter.Parameter.OVERLAY_ID` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_overlay_id` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_overlay_id` * - :attr:`~pcapkit.const.hip.parameter.Parameter.ROUTE_DST` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_route_dst` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_route_dst` * - :attr:`~pcapkit.const.hip.parameter.Parameter.HIP_TRANSPORT_MODE` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_hip_transport_mode` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_hip_transport_mode` * - :attr:`~pcapkit.const.hip.parameter.Parameter.HIP_MAC` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_hip_mac` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_hip_mac` * - :attr:`~pcapkit.const.hip.parameter.Parameter.HIP_MAC_2` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_hip_mac_2` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_hip_mac_2` * - :attr:`~pcapkit.const.hip.parameter.Parameter.HIP_SIGNATURE_2` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_hip_signature_2` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_hip_signature_2` * - :attr:`~pcapkit.const.hip.parameter.Parameter.HIP_SIGNATURE` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_hip_signature` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_hip_signature` * - :attr:`~pcapkit.const.hip.parameter.Parameter.ECHO_REQUEST_UNSIGNED` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_echo_request_unsigned` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_echo_request_unsigned` * - :attr:`~pcapkit.const.hip.parameter.Parameter.ECHO_RESPONSE_UNSIGNED` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_echo_response_unsigned` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_echo_response_unsigned` * - :attr:`~pcapkit.const.hip.parameter.Parameter.RELAY_FROM` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_relay_from` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_relay_from` * - :attr:`~pcapkit.const.hip.parameter.Parameter.RELAY_TO` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_relay_to` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_relay_to` * - :attr:`~pcapkit.const.hip.parameter.Parameter.OVERLAY_TTL` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_overlay_ttl` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_overlay_ttl` * - :attr:`~pcapkit.const.hip.parameter.Parameter.ROUTE_VIA` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_route_via` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_route_via` * - :attr:`~pcapkit.const.hip.parameter.Parameter.FROM` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_from` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_from` * - :attr:`~pcapkit.const.hip.parameter.Parameter.RVS_HMAC` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_rvs_hmac` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_rvs_hmac` * - :attr:`~pcapkit.const.hip.parameter.Parameter.VIA_RVS` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_via_rvs` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_via_rvs` * - :attr:`~pcapkit.const.hip.parameter.Parameter.RELAY_HMAC` - - :meth:`~pcapkit.protocols.internet.hip.HIP._read_param_relay_hmac` + - :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._read_param_relay_hmac` .. versionchanged:: 1.5.0 @@ -438,7 +438,7 @@ class HIP(IPv6_Ext[Data_HIP, Schema_HIP], Internet[Data_HIP, Schema_HIP], writing a different value (:issue:`2594`). * A header constructed without ``version`` is HIP version 2, as :meth:`make` writes, rather than 6, the default IP version - :class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext` hands on under + :class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext` hands on under that name; and the ``ENCRYPTED`` maker, given an IV with a cipher other than ``AES-128-CBC`` and ``AES-256-CBC``, raises :exc:`~pcapkit.utilities.exceptions.ProtocolError`, rather than @@ -837,7 +837,7 @@ def __post_init__(self, file: 'Optional[IO[bytes] | bytes]' = None, length: 'Opt Note: ``version`` is declared here because :meth:`IPv6_Ext.__post_init__ - ` + ` defaults it to ``6``, the IP version, and hands it on to :meth:`make`, which writes it as the HIP version. Left to that default, a header constructed without one would be HIP version 6, @@ -952,7 +952,7 @@ def _make_hip_param(self, parameters: 'list[Schema_Parameter | tuple[Enum_Parame A ``(code, value)`` pair carries either a mapping of keyword arguments for the parameter's constructor, or a parsed - :class:`~pcapkit.protocols.data.internet.hip.Parameter` data model, + :class:`~pcapkit.protocols.internet.hip.data.Parameter` data model, which goes to the constructor positionally through :meth:`_make_hip_param_data` rather than expanded as keyword arguments (:issue:`2352`). @@ -1217,7 +1217,7 @@ def _read_locator(locator: 'Schema_Locator') -> 'Data_LocatorData | IPv6Address' * If ``kind`` is ``0`` and the locator is 16 octets, an :class:`~ipaddress.IPv6Address` object. * If ``kind`` is ``1`` and the locator is 20 octets, - a :class:`~pcapkit.protocols.data.internet.hip.LocatorData` object. + a :class:`~pcapkit.protocols.internet.hip.data.LocatorData` object. Raises: ProtocolError: in other cases @@ -3118,7 +3118,7 @@ def _read_param_overlay_ttl(self, schema: 'Schema_OverlayTTLParameter', *, versi length=parameter_total_len(schema.len), reserved=schema.reserved, # A hop count, not a duration -- see ``OverlayTTLParameter.ttl`` - # in :mod:`pcapkit.protocols.data.internet.hip` (#2282). + # in :mod:`pcapkit.protocols.internet.hip.data` (#2282). ttl=schema.ttl, ) return overlay_ttl @@ -3527,7 +3527,7 @@ def _make_locator(locator: 'Optional[Data_Locator]' = None, *, Raises: ProtocolError: If ``locator`` holds neither an :class:`~ipaddress.IPv6Address` nor a - :class:`~pcapkit.protocols.data.internet.hip.LocatorData`, + :class:`~pcapkit.protocols.internet.hip.data.LocatorData`, or if an explicit ``type`` contradicts ``spi``, or ``traffic``, ``type``, ``reserved``, ``lifetime`` or ``spi`` does not fit its field. @@ -3629,7 +3629,7 @@ def _make_locator(locator: 'Optional[Data_Locator]' = None, *, # where the contents are ``24n`` octets for plain IPv6 locators, # mis-declaring the record and starving the reader's ``ListField`` # -- see ``LocatorSetParameter.locators`` in - # :mod:`pcapkit.protocols.schema.internet.hip`. + # :mod:`pcapkit.protocols.internet.hip.schema`. len=sum(8 + locator['len'] * 4 for locator in locators), locators=locators, ) @@ -3858,7 +3858,7 @@ def _make_param_solution(self, code: 'Enum_Parameter', param: 'Optional[Data_Sol explicitly to override either -- notably to write the conformant zero over a non-conformant one received from a peer, which is otherwise unreachable because - :class:`~pcapkit.protocols.data.internet.hip.SolutionParameter` is + :class:`~pcapkit.protocols.internet.hip.data.SolutionParameter` is immutable opaque: opaque data random: random #I value @@ -4309,7 +4309,7 @@ def _make_param_host_id(self, code: 'Enum_Parameter', param: 'Optional[Data_Host ProtocolError: If ``hi_algorithm`` or ``di_type`` is a name or does not fit its field, if neither ``hi`` nor ``param`` is given and ``hi_curve`` is not an ECDSA, ECDSA_LOW or EdDSA curve, or if - ``hi`` is a :class:`~pcapkit.protocols.data.internet.hip.HostIdentity` + ``hi`` is a :class:`~pcapkit.protocols.internet.hip.data.HostIdentity` whose ``curve`` is none of those. """ @@ -5046,7 +5046,7 @@ def _make_identifier_width(self, code: 'Enum_Parameter', version: 'int', 1. an explicit ``id_len`` argument, which is what a parsed parameter carries on :attr:`TransactionIDParameter.id_len - `; + `; 2. failing that, the identifier's own :meth:`int.bit_length`, rounded up to whole octets. @@ -5542,7 +5542,7 @@ def _make_param_overlay_ttl(self, code: 'Enum_Parameter', param: 'Optional[Data_ ttl: overlay time-to-live (TTL), as a count of remaining overlay hops rather than a duration -- see :attr:`OverlayTTLParameter.ttl - ` + ` reserved: the two reserved octets **kwargs: arbitrary keyword arguments diff --git a/pcapkit/protocols/schema/internet/hip.py b/pcapkit/protocols/internet/hip/schema.py similarity index 98% rename from pcapkit/protocols/schema/internet/hip.py rename to pcapkit/protocols/internet/hip/schema.py index 282ee1feb2..9b6bde17eb 100644 --- a/pcapkit/protocols/schema/internet/hip.py +++ b/pcapkit/protocols/internet/hip/schema.py @@ -29,7 +29,7 @@ UInt32Field, UInt64Field) from pcapkit.corekit.fields.strings import BitField, BytesField, PaddingField from pcapkit.corekit.schema.padding import pad_length -from pcapkit.protocols.schema.schema import EnumSchema, Schema, schema_final +from pcapkit.protocols.schema import EnumSchema, Schema, schema_final from pcapkit.utilities.exceptions import FieldValueError from pcapkit.utilities.logging import SPHINX_TYPE_CHECKING from pcapkit.utilities.warnings import ProtocolWarning, warn @@ -135,7 +135,7 @@ def locator_value_selector(pkt: 'dict[str, Any]') -> 'Field': returns an :class:`~pcapkit.corekit.fields.ipaddress.IPv6AddressField` instance. * If ``type`` is ``1`` and ``len`` is ``5``, i.e. a 20-octet locator, returns a :class:`~pcapkit.corekit.fields.misc.SchemaField` wrapped - :class:`~pcapkit.protocols.schema.internet.hip.LocatorData` instance. + :class:`~pcapkit.protocols.internet.hip.schema.LocatorData` instance. Raises: FieldValueError: For any other locator type and length. @@ -162,13 +162,13 @@ def host_id_hi_selector(pkt: 'dict[str, Any]') -> 'Field': * If ``algorithm`` is ``7`` (ECDSA), returns a :class:`~pcapkit.corekit.fields.misc.SchemaField` wrapped - :class:`~pcapkit.protocols.schema.internet.hip.ECDSACurveHostIdentity` instance. + :class:`~pcapkit.protocols.internet.hip.schema.ECDSACurveHostIdentity` instance. * If ``algorithm`` is ``9`` (ECDSA_LOW), returns a :class:`~pcapkit.corekit.fields.misc.SchemaField` wrapped - :class:`~pcapkit.protocols.schema.internet.hip.ECDSALowCurveHostIdentity` instance. + :class:`~pcapkit.protocols.internet.hip.schema.ECDSALowCurveHostIdentity` instance. * If ``algorithm`` is ``13`` (EdDSA), returns a :class:`~pcapkit.corekit.fields.misc.SchemaField` wrapped - :class:`~pcapkit.protocols.schema.internet.hip.EdDSACurveHostIdentity` instance. + :class:`~pcapkit.protocols.internet.hip.schema.EdDSACurveHostIdentity` instance. * Otherwise, returns a :class:`~pcapkit.corekit.fields.strings.BytesField` instance of ``hi_len`` octets. @@ -308,7 +308,7 @@ def transport_format_list_len(pkt: 'dict[str, Any]') -> 'int': negative. This cannot happen from real wire bytes -- ``len`` is an unsigned 16-bit field -- but a caller constructing the schema directly, bypassing - :meth:`~pcapkit.protocols.internet.hip.HIP._make_param_transport_format_list`, + :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._make_param_transport_format_list`, could still pass one; this keeps that path to the same floor-and-raise discipline as :func:`two_octet_prefix_list_len`. @@ -338,7 +338,7 @@ def encrypted_data_len(pkt: 'dict[str, Any]') -> 'int': / Encrypted data / -- so both have to come off ``Length`` to leave the data, and - :meth:`~pcapkit.protocols.internet.hip.HIP._make_param_encrypted` writes + :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._make_param_encrypted` writes ``len=4 + len(iv) + len(data)`` to match. Args: @@ -452,7 +452,7 @@ def parameter_padding_len(pkt: 'dict[str, Any]') -> 'int': #: :class:`~pcapkit.corekit.fields.collections.ListField` of nested schemas, #: and a nested schema packed through one **shares the #: enclosing packet context**: :meth:`Schema.pack -#: ` opens with +#: ` opens with #: ``packet.update(self.__dict__)``, and :class:`Locator` declares a ``len`` of #: its own. So by the time ``padding`` is evaluated -- after the list, since #: fields are packed in declaration order -- ``pkt['len']`` is the *last @@ -460,7 +460,7 @@ def parameter_padding_len(pkt: 'dict[str, Any]') -> 'int': #: whatever the locator count. #: #: The shadowing is specific to the packing path. :meth:`Schema.unpack -#: ` hands each field +#: ` hands each field #: ``packet.copy()``, so nested writes do not propagate back and ``pkt['len']`` #: stays the parameter's there. Snapshotting under a key no nested schema #: declares is what makes one callback correct on both paths rather than @@ -574,7 +574,7 @@ class R1CounterParameter(Parameter, code=[Enum_Parameter.R1_Counter, layout to code 128 (``R1_Counter``) and code 129 (``R1_COUNTER``) -- one parameter under two numbers, the difference being HIP's own C-bit rather than an unrelated code -- and the field list below is that layout - exactly. :attr:`~pcapkit.protocols.internet.hip.HIP.__parameter__` carries + exactly. :attr:`~pcapkit.protocols.internet.hip.protocol.HIP.__parameter__` carries two hand-written entries -- not a name-normalisation rule; ``R1_Counter`` and ``R1_COUNTER`` differ only in case, and each needs its own line -- mapping both codes to the same ``_read_param_r1_counter``, and @@ -650,9 +650,9 @@ class LocatorSetParameter(Parameter, code=Enum_Parameter.LOCATOR_SET): #: is the *quantity* it is handed: :rfc:`7401` Section 5.2.1's ``Length`` is #: a byte count, not the 4-octet units :rfc:`8046#section-4` gives #: ``Locator Length``, and - #: :meth:`~pcapkit.protocols.internet.hip.HIP._make_param_locator_set` + #: :meth:`~pcapkit.protocols.internet.hip.protocol.HIP._make_param_locator_set` #: writes it as one. :meth:`Schema.unpack - #: ` reads exactly + #: ` reads exactly #: ``field.length`` octets off the stream and hands only those to #: :meth:`ListField.unpack #: `, so a ``Length`` @@ -927,7 +927,7 @@ def pre_unpack(cls, packet: 'dict[str, Any]') -> 'None': When ``packet`` already carries a resolved ``cipher`` -- as it does when this schema was built via :meth:`HIP._make_param_encrypted - `, which + `, which sets it as a plain attribute so ``pack()``'s own ``packet.update(self.__dict__)`` carries it in here -- that value is trusted over the ``HIP_CIPHER`` lookup below. @@ -978,7 +978,7 @@ def post_process(self, packet: 'dict[str, Any]') -> 'Schema': #: Cipher ID. Not a schema field -- set as a plain attribute, either #: by :meth:`post_process` after unpacking, or by #: :meth:`HIP._make_param_encrypted - #: ` before + #: ` before #: packing -- so it is documented here rather than accepted by #: ``__init__``. cipher: 'Enum_Cipher' diff --git a/pcapkit/protocols/internet/hopopt/__init__.py b/pcapkit/protocols/internet/hopopt/__init__.py new file mode 100644 index 0000000000..4d794a3e48 --- /dev/null +++ b/pcapkit/protocols/internet/hopopt/__init__.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""HOPOPT - IPv6 Hop-by-Hop Options +====================================== + +.. module:: pcapkit.protocols.internet.hopopt + +:mod:`pcapkit.protocols.internet.hopopt` holds the dissector, +:class:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT`, in +:mod:`~pcapkit.protocols.internet.hopopt.protocol`, its header schema in +:mod:`~pcapkit.protocols.internet.hopopt.schema` and its data model in +:mod:`~pcapkit.protocols.internet.hopopt.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.internet.hopopt.protocol import HOPOPT + +# Header Schemas +from pcapkit.protocols.internet.hopopt.schema import HOPOPT as Schema_HOPOPT +from pcapkit.protocols.internet.hopopt.schema import CALIPSOOption as Schema_CALIPSOOption +from pcapkit.protocols.internet.hopopt.schema import HomeAddressOption as Schema_HomeAddressOption +from pcapkit.protocols.internet.hopopt.schema import ILNPOption as Schema_ILNPOption +from pcapkit.protocols.internet.hopopt.schema import IPDFFOption as Schema_IPDFFOption +from pcapkit.protocols.internet.hopopt.schema import JumboPayloadOption as Schema_JumboPayloadOption +from pcapkit.protocols.internet.hopopt.schema import \ + LineIdentificationOption as Schema_LineIdentificationOption +from pcapkit.protocols.internet.hopopt.schema import MPLOption as Schema_MPLOption +from pcapkit.protocols.internet.hopopt.schema import Option as Schema_Option +from pcapkit.protocols.internet.hopopt.schema import PadOption as Schema_PadOption +from pcapkit.protocols.internet.hopopt.schema import PDMOption as Schema_PDMOption +from pcapkit.protocols.internet.hopopt.schema import QuickStartOption as Schema_QuickStartOption +from pcapkit.protocols.internet.hopopt.schema import \ + QuickStartReportOption as Schema_QuickStartReportOption +from pcapkit.protocols.internet.hopopt.schema import \ + QuickStartRequestOption as Schema_QuickStartRequestOption +from pcapkit.protocols.internet.hopopt.schema import RouterAlertOption as Schema_RouterAlertOption +from pcapkit.protocols.internet.hopopt.schema import RPLOption as Schema_RPLOption +from pcapkit.protocols.internet.hopopt.schema import SMFDPDOption as Schema_SMFDPDOption +from pcapkit.protocols.internet.hopopt.schema import \ + SMFHashBasedDPDOption as Schema_SMFHashBasedDPDOption +from pcapkit.protocols.internet.hopopt.schema import \ + SMFIdentificationBasedDPDOption as Schema_SMFIdentificationBasedDPDOption +from pcapkit.protocols.internet.hopopt.schema import \ + TunnelEncapsulationLimitOption as Schema_TunnelEncapsulationLimitOption +from pcapkit.protocols.internet.hopopt.schema import UnassignedOption as Schema_UnassignedOption + +# Data Models +from pcapkit.protocols.internet.hopopt.data import HOPOPT as Data_HOPOPT +from pcapkit.protocols.internet.hopopt.data import CALIPSOOption as Data_CALIPSOOption +from pcapkit.protocols.internet.hopopt.data import DFFFlags as Data_DFFFlags +from pcapkit.protocols.internet.hopopt.data import HomeAddressOption as Data_HomeAddressOption +from pcapkit.protocols.internet.hopopt.data import ILNPOption as Data_ILNPOption +from pcapkit.protocols.internet.hopopt.data import IPDFFOption as Data_IPDFFOption +from pcapkit.protocols.internet.hopopt.data import JumboPayloadOption as Data_JumboPayloadOption +from pcapkit.protocols.internet.hopopt.data import \ + LineIdentificationOption as Data_LineIdentificationOption +from pcapkit.protocols.internet.hopopt.data import MPLFlags as Data_MPLFlags +from pcapkit.protocols.internet.hopopt.data import MPLOption as Data_MPLOption +from pcapkit.protocols.internet.hopopt.data import Option as Data_Option +from pcapkit.protocols.internet.hopopt.data import PadOption as Data_PadOption +from pcapkit.protocols.internet.hopopt.data import PDMOption as Data_PDMOption +from pcapkit.protocols.internet.hopopt.data import QuickStartOption as Data_QuickStartOption +from pcapkit.protocols.internet.hopopt.data import \ + QuickStartReportOption as Data_QuickStartReportOption +from pcapkit.protocols.internet.hopopt.data import \ + QuickStartRequestOption as Data_QuickStartRequestOption +from pcapkit.protocols.internet.hopopt.data import RouterAlertOption as Data_RouterAlertOption +from pcapkit.protocols.internet.hopopt.data import RPLFlags as Data_RPLFlags +from pcapkit.protocols.internet.hopopt.data import RPLOption as Data_RPLOption +from pcapkit.protocols.internet.hopopt.data import SMFDPDOption as Data_SMFDPDOption +from pcapkit.protocols.internet.hopopt.data import \ + SMFHashBasedDPDOption as Data_SMFHashBasedDPDOption +from pcapkit.protocols.internet.hopopt.data import \ + SMFIdentificationBasedDPDOption as Data_SMFIdentificationBasedDPDOption +from pcapkit.protocols.internet.hopopt.data import \ + TunnelEncapsulationLimitOption as Data_TunnelEncapsulationLimitOption +from pcapkit.protocols.internet.hopopt.data import UnassignedOption as Data_UnassignedOption + +__all__ = ['HOPOPT'] diff --git a/pcapkit/protocols/data/internet/hopopt.py b/pcapkit/protocols/internet/hopopt/data.py similarity index 99% rename from pcapkit/protocols/data/internet/hopopt.py rename to pcapkit/protocols/internet/hopopt/data.py index 45ffc79f9f..e92b04e8e1 100644 --- a/pcapkit/protocols/data/internet/hopopt.py +++ b/pcapkit/protocols/internet/hopopt/data.py @@ -4,8 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.data import Data -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Data, Protocol if TYPE_CHECKING: from datetime import timedelta diff --git a/pcapkit/protocols/internet/hopopt.py b/pcapkit/protocols/internet/hopopt/protocol.py similarity index 93% rename from pcapkit/protocols/internet/hopopt.py rename to pcapkit/protocols/internet/hopopt/protocol.py index b3bd3c0717..035ad80b46 100644 --- a/pcapkit/protocols/internet/hopopt.py +++ b/pcapkit/protocols/internet/hopopt/protocol.py @@ -2,10 +2,10 @@ """HOPOPT - IPv6 Hop-by-Hop Options ====================================== -.. module:: pcapkit.protocols.internet.hopopt +.. module:: pcapkit.protocols.internet.hopopt.protocol -:mod:`pcapkit.protocols.internet.hopopt` contains -:class:`~pcapkit.protocols.internet.hopopt.HOPOPT` +:mod:`pcapkit.protocols.internet.hopopt.protocol` contains +:class:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT` only, which implements the extractor for IPv6 Hop-by-Hop Options header (HOPOPT) [*]_, whose structure is described as below: @@ -38,60 +38,60 @@ from pcapkit.corekit.multidict import OrderedMultiDict from pcapkit.corekit.schema.padding import pad_length from pcapkit.corekit.sentinels import NO_VALUE -from pcapkit.protocols.data.internet.hopopt import HOPOPT as Data_HOPOPT -from pcapkit.protocols.data.internet.hopopt import CALIPSOOption as Data_CALIPSOOption -from pcapkit.protocols.data.internet.hopopt import DFFFlags as Data_DFFFlags -from pcapkit.protocols.data.internet.hopopt import HomeAddressOption as Data_HomeAddressOption -from pcapkit.protocols.data.internet.hopopt import ILNPOption as Data_ILNPOption -from pcapkit.protocols.data.internet.hopopt import IPDFFOption as Data_IPDFFOption -from pcapkit.protocols.data.internet.hopopt import JumboPayloadOption as Data_JumboPayloadOption -from pcapkit.protocols.data.internet.hopopt import \ +from pcapkit.protocols.internet.hopopt.data import HOPOPT as Data_HOPOPT +from pcapkit.protocols.internet.hopopt.data import CALIPSOOption as Data_CALIPSOOption +from pcapkit.protocols.internet.hopopt.data import DFFFlags as Data_DFFFlags +from pcapkit.protocols.internet.hopopt.data import HomeAddressOption as Data_HomeAddressOption +from pcapkit.protocols.internet.hopopt.data import ILNPOption as Data_ILNPOption +from pcapkit.protocols.internet.hopopt.data import IPDFFOption as Data_IPDFFOption +from pcapkit.protocols.internet.hopopt.data import JumboPayloadOption as Data_JumboPayloadOption +from pcapkit.protocols.internet.hopopt.data import \ LineIdentificationOption as Data_LineIdentificationOption -from pcapkit.protocols.data.internet.hopopt import MPLFlags as Data_MPLFlags -from pcapkit.protocols.data.internet.hopopt import MPLOption as Data_MPLOption -from pcapkit.protocols.data.internet.hopopt import PadOption as Data_PadOption -from pcapkit.protocols.data.internet.hopopt import PDMOption as Data_PDMOption -from pcapkit.protocols.data.internet.hopopt import \ +from pcapkit.protocols.internet.hopopt.data import MPLFlags as Data_MPLFlags +from pcapkit.protocols.internet.hopopt.data import MPLOption as Data_MPLOption +from pcapkit.protocols.internet.hopopt.data import PadOption as Data_PadOption +from pcapkit.protocols.internet.hopopt.data import PDMOption as Data_PDMOption +from pcapkit.protocols.internet.hopopt.data import \ QuickStartReportOption as Data_QuickStartReportOption -from pcapkit.protocols.data.internet.hopopt import \ +from pcapkit.protocols.internet.hopopt.data import \ QuickStartRequestOption as Data_QuickStartRequestOption -from pcapkit.protocols.data.internet.hopopt import RouterAlertOption as Data_RouterAlertOption -from pcapkit.protocols.data.internet.hopopt import RPLFlags as Data_RPLFlags -from pcapkit.protocols.data.internet.hopopt import RPLOption as Data_RPLOption -from pcapkit.protocols.data.internet.hopopt import \ +from pcapkit.protocols.internet.hopopt.data import RouterAlertOption as Data_RouterAlertOption +from pcapkit.protocols.internet.hopopt.data import RPLFlags as Data_RPLFlags +from pcapkit.protocols.internet.hopopt.data import RPLOption as Data_RPLOption +from pcapkit.protocols.internet.hopopt.data import \ SMFHashBasedDPDOption as Data_SMFHashBasedDPDOption -from pcapkit.protocols.data.internet.hopopt import \ +from pcapkit.protocols.internet.hopopt.data import \ SMFIdentificationBasedDPDOption as Data_SMFIdentificationBasedDPDOption -from pcapkit.protocols.data.internet.hopopt import \ +from pcapkit.protocols.internet.hopopt.data import \ TunnelEncapsulationLimitOption as Data_TunnelEncapsulationLimitOption -from pcapkit.protocols.data.internet.hopopt import UnassignedOption as Data_UnassignedOption -from pcapkit.protocols.internet.ipv6_ext import IPv6_Ext -from pcapkit.protocols.misc.no_payload import NoPayload -from pcapkit.protocols.schema.internet.hopopt import HOPOPT as Schema_HOPOPT -from pcapkit.protocols.schema.internet.hopopt import CALIPSOOption as Schema_CALIPSOOption -from pcapkit.protocols.schema.internet.hopopt import HomeAddressOption as Schema_HomeAddressOption -from pcapkit.protocols.schema.internet.hopopt import ILNPOption as Schema_ILNPOption -from pcapkit.protocols.schema.internet.hopopt import IPDFFOption as Schema_IPDFFOption -from pcapkit.protocols.schema.internet.hopopt import JumboPayloadOption as Schema_JumboPayloadOption -from pcapkit.protocols.schema.internet.hopopt import \ +from pcapkit.protocols.internet.hopopt.data import UnassignedOption as Data_UnassignedOption +from pcapkit.protocols.internet.hopopt.schema import HOPOPT as Schema_HOPOPT +from pcapkit.protocols.internet.hopopt.schema import CALIPSOOption as Schema_CALIPSOOption +from pcapkit.protocols.internet.hopopt.schema import HomeAddressOption as Schema_HomeAddressOption +from pcapkit.protocols.internet.hopopt.schema import ILNPOption as Schema_ILNPOption +from pcapkit.protocols.internet.hopopt.schema import IPDFFOption as Schema_IPDFFOption +from pcapkit.protocols.internet.hopopt.schema import JumboPayloadOption as Schema_JumboPayloadOption +from pcapkit.protocols.internet.hopopt.schema import \ LineIdentificationOption as Schema_LineIdentificationOption -from pcapkit.protocols.schema.internet.hopopt import MPLOption as Schema_MPLOption -from pcapkit.protocols.schema.internet.hopopt import PadOption as Schema_PadOption -from pcapkit.protocols.schema.internet.hopopt import PDMOption as Schema_PDMOption -from pcapkit.protocols.schema.internet.hopopt import \ +from pcapkit.protocols.internet.hopopt.schema import MPLOption as Schema_MPLOption +from pcapkit.protocols.internet.hopopt.schema import PadOption as Schema_PadOption +from pcapkit.protocols.internet.hopopt.schema import PDMOption as Schema_PDMOption +from pcapkit.protocols.internet.hopopt.schema import \ QuickStartReportOption as Schema_QuickStartReportOption -from pcapkit.protocols.schema.internet.hopopt import \ +from pcapkit.protocols.internet.hopopt.schema import \ QuickStartRequestOption as Schema_QuickStartRequestOption -from pcapkit.protocols.schema.internet.hopopt import RouterAlertOption as Schema_RouterAlertOption -from pcapkit.protocols.schema.internet.hopopt import RPLOption as Schema_RPLOption -from pcapkit.protocols.schema.internet.hopopt import \ +from pcapkit.protocols.internet.hopopt.schema import RouterAlertOption as Schema_RouterAlertOption +from pcapkit.protocols.internet.hopopt.schema import RPLOption as Schema_RPLOption +from pcapkit.protocols.internet.hopopt.schema import \ SMFHashBasedDPDOption as Schema_SMFHashBasedDPDOption -from pcapkit.protocols.schema.internet.hopopt import \ +from pcapkit.protocols.internet.hopopt.schema import \ SMFIdentificationBasedDPDOption as Schema_SMFIdentificationBasedDPDOption -from pcapkit.protocols.schema.internet.hopopt import \ +from pcapkit.protocols.internet.hopopt.schema import \ TunnelEncapsulationLimitOption as Schema_TunnelEncapsulationLimitOption -from pcapkit.protocols.schema.internet.hopopt import UnassignedOption as Schema_UnassignedOption -from pcapkit.protocols.schema.schema import Schema +from pcapkit.protocols.internet.hopopt.schema import UnassignedOption as Schema_UnassignedOption +from pcapkit.protocols.internet.ipv6_ext.protocol import IPv6_Ext +from pcapkit.protocols.misc.no_payload.protocol import NoPayload +from pcapkit.protocols.schema import Schema from pcapkit.utilities.exceptions import BaseError, CaughtByCaller, ProtocolError, UnsupportedCall from pcapkit.utilities.warnings import ProtocolWarning, RegistryWarning, warn @@ -104,13 +104,13 @@ from typing_extensions import Literal from pcapkit.corekit.protochain import ProtoChain - from pcapkit.protocols.data.internet.hopopt import Option as Data_Option - from pcapkit.protocols.data.internet.hopopt import QuickStartOption as Data_QuickStartOption - from pcapkit.protocols.data.internet.hopopt import SMFDPDOption as Data_SMFDPDOption + from pcapkit.protocols.internet.hopopt.data import Option as Data_Option + from pcapkit.protocols.internet.hopopt.data import QuickStartOption as Data_QuickStartOption + from pcapkit.protocols.internet.hopopt.data import SMFDPDOption as Data_SMFDPDOption + from pcapkit.protocols.internet.hopopt.schema import Option as Schema_Option + from pcapkit.protocols.internet.hopopt.schema import QuickStartOption as Schema_QuickStartOption + from pcapkit.protocols.internet.hopopt.schema import SMFDPDOption as Schema_SMFDPDOption from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.internet.hopopt import Option as Schema_Option - from pcapkit.protocols.schema.internet.hopopt import QuickStartOption as Schema_QuickStartOption - from pcapkit.protocols.schema.internet.hopopt import SMFDPDOption as Schema_SMFDPDOption Option = OrderedMultiDict[Enum_Option, Data_Option] OptionParser = Callable[[Schema_Option, NamedArg(Option, 'options')], Data_Option] @@ -126,7 +126,7 @@ class HOPOPT(IPv6_Ext[Data_HOPOPT, Schema_HOPOPT], This class parses the following IPv6 Hop-by-Hop options, which are registered in the - :attr:`self.__option__ ` + :attr:`self.__option__ ` attribute: .. list-table:: @@ -136,53 +136,53 @@ class HOPOPT(IPv6_Ext[Data_HOPOPT, Schema_HOPOPT], - Option Parser - Option Constructor * - :attr:`~pcapkit.const.ipv6.option.Option.Pad1` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._read_opt_pad` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._make_opt_pad` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._read_opt_pad` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._make_opt_pad` * - :attr:`~pcapkit.const.ipv6.option.Option.PadN` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._read_opt_pad` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._make_opt_pad` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._read_opt_pad` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._make_opt_pad` * - :attr:`~pcapkit.const.ipv6.option.Option.Tunnel_Encapsulation_Limit` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._read_opt_tun` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._make_opt_tun` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._read_opt_tun` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._make_opt_tun` * - :attr:`~pcapkit.const.ipv6.option.Option.Router_Alert` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._read_opt_ra` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._make_opt_ra` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._read_opt_ra` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._make_opt_ra` * - :attr:`~pcapkit.const.ipv6.option.Option.CALIPSO` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._read_opt_calipso` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._make_opt_calipso` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._read_opt_calipso` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._make_opt_calipso` * - :attr:`~pcapkit.const.ipv6.option.Option.SMF_DPD` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._read_opt_smf_dpd` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._make_opt_smf_dpd` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._read_opt_smf_dpd` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._make_opt_smf_dpd` * - :attr:`~pcapkit.const.ipv6.option.Option.PDM` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._read_opt_pdm` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._make_opt_pdm` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._read_opt_pdm` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._make_opt_pdm` * - :attr:`~pcapkit.const.ipv6.option.Option.Quick_Start` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._read_opt_qs` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._make_opt_qs` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._read_opt_qs` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._make_opt_qs` * - :attr:`~pcapkit.const.ipv6.option.Option.RPL_Option_0x23` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._read_opt_rpl` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._make_opt_rpl` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._read_opt_rpl` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._make_opt_rpl` * - :attr:`~pcapkit.const.ipv6.option.Option.RPL_Option_0x63` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._read_opt_rpl` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._make_opt_rpl` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._read_opt_rpl` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._make_opt_rpl` * - :attr:`~pcapkit.const.ipv6.option.Option.MPL_Option` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._read_opt_mpl` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._make_opt_mpl` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._read_opt_mpl` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._make_opt_mpl` * - :attr:`~pcapkit.const.ipv6.option.Option.ILNP_Nonce` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._read_opt_ilnp` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._make_opt_ilnp` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._read_opt_ilnp` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._make_opt_ilnp` * - :attr:`~pcapkit.const.ipv6.option.Option.Line_Identification_Option` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._read_opt_lio` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._make_opt_lio` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._read_opt_lio` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._make_opt_lio` * - :attr:`~pcapkit.const.ipv6.option.Option.Jumbo_Payload` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._read_opt_jumbo` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._make_opt_jumbo` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._read_opt_jumbo` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._make_opt_jumbo` * - :attr:`~pcapkit.const.ipv6.option.Option.Home_Address` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._read_opt_home` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._make_opt_home` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._read_opt_home` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._make_opt_home` * - :attr:`~pcapkit.const.ipv6.option.Option.IP_DFF` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._read_opt_ip_dff` - - :meth:`~pcapkit.protocols.internet.hopopt.HOPOPT._make_opt_ip_dff` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._read_opt_ip_dff` + - :meth:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT._make_opt_ip_dff` .. versionchanged:: 1.5.0 @@ -296,12 +296,12 @@ def alias(self) -> 'Literal["HOPOPT"]': Spelled out rather than left to :attr:`Protocol.alias `'s class-name default, because - :class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext` sits between + :class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext` sits between this class and that default in the MRO and carries its own ``'IPv6-Ext'`` (GitHub issue :issue:`917`). Inheriting it would rename this header in every :class:`~pcapkit.corekit.protochain.ProtoChain` string and in :meth:`IPv6._decode_next_layer - `'s packet + `'s packet dict key. """ @@ -856,9 +856,9 @@ def _read_opt_pad(self, schema: 'Schema_PadOption', *, options: 'Option') -> 'Da Note: A ``Pad1`` option occupies a single octet and carries no ``Opt Data Len`` field, so its - :attr:`~pcapkit.protocols.data.internet.hopopt.Option.length` is + :attr:`~pcapkit.protocols.internet.hopopt.data.Option.length` is ``1`` rather than ``len + 2``. That one-octet wire shape is enforced - by :class:`~pcapkit.protocols.schema.internet.hopopt.PadOption` + by :class:`~pcapkit.protocols.internet.hopopt.schema.PadOption` itself, which sizes both the length octet and the padding data from the option type; ``clen`` is therefore always ``0`` here for a parsed ``Pad1``, and the length check this method makes only guards @@ -985,7 +985,7 @@ def _read_opt_calipso(self, schema: 'Schema_CALIPSOOption', *, options: 'Option' ``Cmpt Length`` counts 32-bit words and may be odd [:rfc:`5570#section-5.2`]; it only has to fit inside ``Opt Data Len``, which - :func:`~pcapkit.protocols.schema.internet.ipv6_option.calipso_pad_len` + :func:`~pcapkit.protocols.internet.ipv6_ext.schema.calipso_pad_len` has already checked while the option was unpacked. """ @@ -1185,8 +1185,8 @@ def _read_opt_qs(self, schema: 'Schema_QuickStartOption', *, options: 'Option') defined layout, so the schema keeps it as an unassigned option and it is parsed as one, see :meth:`_read_opt_none`. That dispatch is by the schema's own class, decided from the octets a file read - hands it; a :class:`~pcapkit.protocols.schema.internet.hopopt.QuickStartRequestOption` - or :class:`~pcapkit.protocols.schema.internet.hopopt.QuickStartReportOption` + hands it; a :class:`~pcapkit.protocols.internet.hopopt.schema.QuickStartRequestOption` + or :class:`~pcapkit.protocols.internet.hopopt.schema.QuickStartReportOption` built directly with an unassigned ``func`` reaches this method regardless, which is why it still raises below rather than returning early. @@ -1640,9 +1640,9 @@ def _make_opt_pad(self, code: 'Enum_Option', opt: 'Optional[Data_PadOption]' = N Note: :attr:`Data_PadOption.length - ` counts the + ` counts the *whole* option, whereas :attr:`Schema_PadOption.len - ` is the + ` is the ``Opt Data Len`` field: two octets fewer, and absent altogether for a ``Pad1``. ``opt`` is honoured so that re-making a parsed padding option keeps its type and size. A ``PadN`` with ``length`` ``0`` is diff --git a/pcapkit/protocols/schema/internet/hopopt.py b/pcapkit/protocols/internet/hopopt/schema.py similarity index 95% rename from pcapkit/protocols/schema/internet/hopopt.py rename to pcapkit/protocols/internet/hopopt/schema.py index 50eed88986..527a43f7af 100644 --- a/pcapkit/protocols/schema/internet/hopopt.py +++ b/pcapkit/protocols/internet/hopopt/schema.py @@ -19,9 +19,9 @@ UInt32Field) from pcapkit.corekit.fields.strings import BitField, BytesField, PaddingField from pcapkit.corekit.sentinels import NO_VALUE -from pcapkit.protocols.schema.internet import ipv6_option -from pcapkit.protocols.schema.internet.ipv6_option import pad_opt_data_len, rpl_opt_sub_tlv_len -from pcapkit.protocols.schema.schema import EnumSchema, Schema, schema_final +from pcapkit.protocols.internet.ipv6_ext import schema as ipv6_option +from pcapkit.protocols.internet.ipv6_ext.schema import pad_opt_data_len, rpl_opt_sub_tlv_len +from pcapkit.protocols.schema import EnumSchema, Schema, schema_final from pcapkit.utilities.logging import SPHINX_TYPE_CHECKING __all__ = [ @@ -130,7 +130,7 @@ class QSNonce(TypedDict): # NOTE: The option helpers are shared with IPv6-Opts and live in -# :mod:`pcapkit.protocols.schema.internet.ipv6_option`. The functions below bind +# :mod:`pcapkit.protocols.internet.ipv6_ext.schema`. The functions below bind # what differs between the two headers: the ``HOPOPT`` error prefix, and the # option schemas of this module. @@ -138,7 +138,7 @@ class QSNonce(TypedDict): def mpl_opt_seed_id_len(pkt: 'dict[str, Any]') -> 'int': """Return MPL Seed-ID length. - See :func:`pcapkit.protocols.schema.internet.ipv6_option.mpl_opt_seed_id_len`; + See :func:`pcapkit.protocols.internet.ipv6_ext.schema.mpl_opt_seed_id_len`; errors are reported as ``HOPOPT``. """ @@ -148,7 +148,7 @@ def mpl_opt_seed_id_len(pkt: 'dict[str, Any]') -> 'int': def smf_i_dpd_id_len(pkt: 'dict[str, Any]') -> 'int': """Return SMF I-DPD identifier length. - See :func:`pcapkit.protocols.schema.internet.ipv6_option.smf_i_dpd_id_len`; + See :func:`pcapkit.protocols.internet.ipv6_ext.schema.smf_i_dpd_id_len`; errors are reported as ``HOPOPT``. """ @@ -158,7 +158,7 @@ def smf_i_dpd_id_len(pkt: 'dict[str, Any]') -> 'int': def smf_dpd_data_selector(pkt: 'dict[str, Any]') -> 'Field': """Selector function for :attr:`_SMFDPDOption.data` field. - See :func:`pcapkit.protocols.schema.internet.ipv6_option.smf_dpd_data_selector`, + See :func:`pcapkit.protocols.internet.ipv6_ext.schema.smf_dpd_data_selector`, choosing among the schemas registered with :class:`SMFDPDOption`; errors are reported as ``HOPOPT``. @@ -169,7 +169,7 @@ def smf_dpd_data_selector(pkt: 'dict[str, Any]') -> 'Field': def smf_i_dpd_tid_selector(pkt: 'dict[str, Any]') -> 'Field': """Selector function for :attr:`SMFIdentificationBasedDPDOption.tid` field. - See :func:`pcapkit.protocols.schema.internet.ipv6_option.smf_i_dpd_tid_selector`; + See :func:`pcapkit.protocols.internet.ipv6_ext.schema.smf_i_dpd_tid_selector`; errors are reported as ``HOPOPT``. """ @@ -179,7 +179,7 @@ def smf_i_dpd_tid_selector(pkt: 'dict[str, Any]') -> 'Field': def quick_start_data_selector(pkt: 'dict[str, Any]') -> 'Field': """Selector function for :attr:`_QuickStartOption.data` field. - See :func:`pcapkit.protocols.schema.internet.ipv6_option.quick_start_data_selector`, + See :func:`pcapkit.protocols.internet.ipv6_ext.schema.quick_start_data_selector`, choosing among the schemas registered with :class:`QuickStartOption`, and :class:`UnassignedOption` for an unassigned QS function. @@ -191,7 +191,7 @@ def quick_start_data_selector(pkt: 'dict[str, Any]') -> 'Field': def calipso_pad_len(pkt: 'dict[str, Any]') -> 'int': """Return CALIPSO option padding length. - See :func:`pcapkit.protocols.schema.internet.ipv6_option.calipso_pad_len`; + See :func:`pcapkit.protocols.internet.ipv6_ext.schema.calipso_pad_len`; errors are reported as ``HOPOPT``. """ @@ -201,7 +201,7 @@ def calipso_pad_len(pkt: 'dict[str, Any]') -> 'int': def mpl_opt_pad_len(pkt: 'dict[str, Any]') -> 'int': """Return MPL option padding length. - See :func:`pcapkit.protocols.schema.internet.ipv6_option.mpl_opt_pad_len`; + See :func:`pcapkit.protocols.internet.ipv6_ext.schema.mpl_opt_pad_len`; errors are reported as ``HOPOPT``. """ diff --git a/pcapkit/protocols/internet/icmp/__init__.py b/pcapkit/protocols/internet/icmp/__init__.py new file mode 100644 index 0000000000..0bf54f9e51 --- /dev/null +++ b/pcapkit/protocols/internet/icmp/__init__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +"""ICMP - Internet Control Message Protocol +============================================== + +.. module:: pcapkit.protocols.internet.icmp + +:mod:`pcapkit.protocols.internet.icmp` holds the dissector, +:class:`~pcapkit.protocols.internet.icmp.protocol.ICMP`, in +:mod:`~pcapkit.protocols.internet.icmp.protocol`. + +""" +from pcapkit.protocols.internet.icmp.protocol import ICMP + +__all__ = ['ICMP'] diff --git a/pcapkit/protocols/internet/icmp.py b/pcapkit/protocols/internet/icmp/protocol.py similarity index 82% rename from pcapkit/protocols/internet/icmp.py rename to pcapkit/protocols/internet/icmp/protocol.py index f0d8121824..0d6a9a2fab 100644 --- a/pcapkit/protocols/internet/icmp.py +++ b/pcapkit/protocols/internet/icmp/protocol.py @@ -2,17 +2,17 @@ """ICMP - Internet Control Message Protocol ============================================== -.. module:: pcapkit.protocols.internet.icmp +.. module:: pcapkit.protocols.internet.icmp.protocol -:mod:`pcapkit.protocols.internet.icmp` contains -:class:`~pcapkit.protocols.internet.icmp.ICMP` only, +:mod:`pcapkit.protocols.internet.icmp.protocol` contains +:class:`~pcapkit.protocols.internet.icmp.protocol.ICMP` only, which is a base class for Internet Control Message Protocol (ICMP) protocol family [*]_, e.g. -:class:`~pcapkit.protocols.internet.icmpv4.ICMPv4` and -:class:`~pcapkit.protocols.internet.icmpv6.ICMPv6`. Constructing the base gives the +:class:`~pcapkit.protocols.internet.icmpv4.protocol.ICMPv4` and +:class:`~pcapkit.protocols.internet.icmpv6.protocol.ICMPv6`. Constructing the base gives the one its ``version`` keyword names, from octets or from fields, and is refused without it, since an ICMP message carries no version of its own. Its -:meth:`~pcapkit.protocols.internet.icmp.ICMP.from_data` gives the one whose data +:meth:`~pcapkit.protocols.internet.icmp.protocol.ICMP.from_data` gives the one whose data model it is handed (:issue:`2574`). .. [*] https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol @@ -35,8 +35,9 @@ class ICMP(Internet[_PT, _ST], Generic[_PT, _ST]): # pylint: disable=abstract-method """Abstract base class for ICMP protocol family. - - Internet Control Message Protocol (:class:`~pcapkit.protocols.internet.icmpv4.ICMPv4`) [:rfc:`792`] - - Internet Control Message Protocol for IPv6 (:class:`~pcapkit.protocols.internet.icmpv6.ICMPv6`) [:rfc:`4443`] + - Internet Control Message Protocol (:class:`~pcapkit.protocols.internet.icmpv4.protocol.ICMPv4`) [:rfc:`792`] + - Internet Control Message Protocol for IPv6 (:class:`~pcapkit.protocols.internet.icmpv6.protocol.ICMPv6`) + [:rfc:`4443`] It dispatches where the version is known, never giving an instance of this class (:issue:`2574`). ``version`` names the member, from octets or from @@ -83,10 +84,10 @@ def from_data(cls, data: '_PT | dict[str, Any]', **kwargs: 'Any') -> 'Self': if cls is not ICMP: return super().from_data(data, **kwargs) - from pcapkit.protocols.data.internet.icmpv4 import ICMPv4 as Data_ICMPv4 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel - from pcapkit.protocols.data.internet.icmpv6 import ICMPv6 as Data_ICMPv6 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel - from pcapkit.protocols.internet.icmpv4 import ICMPv4 # isort: skip # pylint: disable=import-outside-toplevel - from pcapkit.protocols.internet.icmpv6 import ICMPv6 # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.internet.icmpv4.data import ICMPv4 as Data_ICMPv4 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel + from pcapkit.protocols.internet.icmpv6.data import ICMPv6 as Data_ICMPv6 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel + from pcapkit.protocols.internet.icmpv4.protocol import ICMPv4 # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.internet.icmpv6.protocol import ICMPv6 # isort: skip # pylint: disable=import-outside-toplevel if isinstance(data, Data_ICMPv4): return cast('Self', ICMPv4.from_data(data, **kwargs)) @@ -124,8 +125,8 @@ def __init__(self, file: 'Optional[IO[bytes] | bytes]' = None, if version is not None: kwargs['version'] = version elif version is not None and not isinstance(self, self._member_of_version(version)): - from pcapkit.protocols.internet.icmpv4 import ICMPv4 # isort: skip # pylint: disable=import-outside-toplevel - from pcapkit.protocols.internet.icmpv6 import ICMPv6 # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.internet.icmpv4.protocol import ICMPv4 # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.internet.icmpv6.protocol import ICMPv6 # isort: skip # pylint: disable=import-outside-toplevel if not isinstance(self, (ICMPv4, ICMPv6)): raise ProtocolError(f'{type(self).__name__}: no version of its own to match ' @@ -179,16 +180,16 @@ def _member_of_version(version: 'Any') -> 'Type[ICMP]': version: Version of ICMP. Returns: - :class:`~pcapkit.protocols.internet.icmpv4.ICMPv4` or - :class:`~pcapkit.protocols.internet.icmpv6.ICMPv6`. + :class:`~pcapkit.protocols.internet.icmpv4.protocol.ICMPv4` or + :class:`~pcapkit.protocols.internet.icmpv6.protocol.ICMPv6`. Raises: ProtocolError: If ``version`` is neither, or is no :obj:`int`: a :obj:`bool` or a :obj:`float` is refused even where it equals one. """ - from pcapkit.protocols.internet.icmpv4 import ICMPv4 # isort: skip # pylint: disable=import-outside-toplevel - from pcapkit.protocols.internet.icmpv6 import ICMPv6 # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.internet.icmpv4.protocol import ICMPv4 # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.internet.icmpv6.protocol import ICMPv6 # isort: skip # pylint: disable=import-outside-toplevel if isinstance(version, int) and not isinstance(version, bool): if version == 4: diff --git a/pcapkit/protocols/internet/icmpv4/__init__.py b/pcapkit/protocols/internet/icmpv4/__init__.py new file mode 100644 index 0000000000..2a32dea232 --- /dev/null +++ b/pcapkit/protocols/internet/icmpv4/__init__.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""ICMPv4 - Internet Control Message Protocol +================================================ + +.. module:: pcapkit.protocols.internet.icmpv4 + +:mod:`pcapkit.protocols.internet.icmpv4` holds the dissector, +:class:`~pcapkit.protocols.internet.icmpv4.protocol.ICMPv4`, in +:mod:`~pcapkit.protocols.internet.icmpv4.protocol`, its header schema in +:mod:`~pcapkit.protocols.internet.icmpv4.schema` and its data model in +:mod:`~pcapkit.protocols.internet.icmpv4.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.internet.icmpv4.protocol import ICMPv4 + +# Header Schemas +from pcapkit.protocols.internet.icmpv4.schema import \ + DestinationUnreachable as Schema_DestinationUnreachable +from pcapkit.protocols.internet.icmpv4.schema import Echo as Schema_Echo +from pcapkit.protocols.internet.icmpv4.schema import ICMPv4 as Schema_ICMPv4 +from pcapkit.protocols.internet.icmpv4.schema import ICMPv4Type as Schema_ICMPv4Type +from pcapkit.protocols.internet.icmpv4.schema import ParameterProblem as Schema_ParameterProblem +from pcapkit.protocols.internet.icmpv4.schema import TimeExceeded as Schema_TimeExceeded +from pcapkit.protocols.internet.icmpv4.schema import Unknown as Schema_Unknown + +# Data Models +from pcapkit.protocols.internet.icmpv4.data import \ + DestinationUnreachable as Data_DestinationUnreachable +from pcapkit.protocols.internet.icmpv4.data import Echo as Data_Echo +from pcapkit.protocols.internet.icmpv4.data import ICMPv4 as Data_ICMPv4 +from pcapkit.protocols.internet.icmpv4.data import ParameterProblem as Data_ParameterProblem +from pcapkit.protocols.internet.icmpv4.data import TimeExceeded as Data_TimeExceeded +from pcapkit.protocols.internet.icmpv4.data import Unknown as Data_Unknown + +__all__ = ['ICMPv4'] diff --git a/pcapkit/protocols/data/internet/icmpv4.py b/pcapkit/protocols/internet/icmpv4/data.py similarity index 97% rename from pcapkit/protocols/data/internet/icmpv4.py rename to pcapkit/protocols/internet/icmpv4/data.py index 84e3418e65..c99a68fc5b 100644 --- a/pcapkit/protocols/data/internet/icmpv4.py +++ b/pcapkit/protocols/internet/icmpv4/data.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Protocol if TYPE_CHECKING: from pcapkit.const.icmp.type import Type as Enum_Type @@ -37,7 +37,7 @@ class ICMPv4(Protocol): checksum: 'bytes' #: Message length, in octets, header included. ICMP messages carry no #: length field of their own -- this is simply how many octets - #: :meth:`ICMPv4.read ` was + #: :meth:`ICMPv4.read ` was #: handed, kept here so the whole message can be told apart from a #: truncated capture. length: 'int' diff --git a/pcapkit/protocols/internet/icmpv4.py b/pcapkit/protocols/internet/icmpv4/protocol.py similarity index 92% rename from pcapkit/protocols/internet/icmpv4.py rename to pcapkit/protocols/internet/icmpv4/protocol.py index 3545a50ce5..b410b325c9 100644 --- a/pcapkit/protocols/internet/icmpv4.py +++ b/pcapkit/protocols/internet/icmpv4/protocol.py @@ -2,10 +2,10 @@ """ICMPv4 - Internet Control Message Protocol ================================================ -.. module:: pcapkit.protocols.internet.icmpv4 +.. module:: pcapkit.protocols.internet.icmpv4.protocol -:mod:`pcapkit.protocols.internet.icmpv4` contains -:class:`~pcapkit.protocols.internet.icmpv4.ICMPv4` only, +:mod:`pcapkit.protocols.internet.icmpv4.protocol` contains +:class:`~pcapkit.protocols.internet.icmpv4.protocol.ICMPv4` only, which implements extractor for Internet Control Message Protocol (ICMP) [*]_, whose structure is described as below: @@ -28,23 +28,23 @@ from pcapkit.const.icmp.type import Type as Enum_Type from pcapkit.const.reg.transtype import TransType as Enum_TransType from pcapkit.corekit.protochain import ProtoChain -from pcapkit.protocols.data.internet.icmpv4 import \ +from pcapkit.protocols.internet.icmp.protocol import ICMP +from pcapkit.protocols.internet.icmpv4.data import \ DestinationUnreachable as Data_DestinationUnreachable -from pcapkit.protocols.data.internet.icmpv4 import Echo as Data_Echo -from pcapkit.protocols.data.internet.icmpv4 import ICMPv4 as Data_ICMPv4 -from pcapkit.protocols.data.internet.icmpv4 import ParameterProblem as Data_ParameterProblem -from pcapkit.protocols.data.internet.icmpv4 import TimeExceeded as Data_TimeExceeded -from pcapkit.protocols.data.internet.icmpv4 import Unknown as Data_Unknown -from pcapkit.protocols.internet.icmp import ICMP -from pcapkit.protocols.misc.no_payload import NoPayload -from pcapkit.protocols.schema.internet.icmpv4 import \ +from pcapkit.protocols.internet.icmpv4.data import Echo as Data_Echo +from pcapkit.protocols.internet.icmpv4.data import ICMPv4 as Data_ICMPv4 +from pcapkit.protocols.internet.icmpv4.data import ParameterProblem as Data_ParameterProblem +from pcapkit.protocols.internet.icmpv4.data import TimeExceeded as Data_TimeExceeded +from pcapkit.protocols.internet.icmpv4.data import Unknown as Data_Unknown +from pcapkit.protocols.internet.icmpv4.schema import \ DestinationUnreachable as Schema_DestinationUnreachable -from pcapkit.protocols.schema.internet.icmpv4 import Echo as Schema_Echo -from pcapkit.protocols.schema.internet.icmpv4 import ICMPv4 as Schema_ICMPv4 -from pcapkit.protocols.schema.internet.icmpv4 import ICMPv4Type as Schema_ICMPv4Type -from pcapkit.protocols.schema.internet.icmpv4 import ParameterProblem as Schema_ParameterProblem -from pcapkit.protocols.schema.internet.icmpv4 import TimeExceeded as Schema_TimeExceeded -from pcapkit.protocols.schema.internet.icmpv4 import Unknown as Schema_Unknown +from pcapkit.protocols.internet.icmpv4.schema import Echo as Schema_Echo +from pcapkit.protocols.internet.icmpv4.schema import ICMPv4 as Schema_ICMPv4 +from pcapkit.protocols.internet.icmpv4.schema import ICMPv4Type as Schema_ICMPv4Type +from pcapkit.protocols.internet.icmpv4.schema import ParameterProblem as Schema_ParameterProblem +from pcapkit.protocols.internet.icmpv4.schema import TimeExceeded as Schema_TimeExceeded +from pcapkit.protocols.internet.icmpv4.schema import Unknown as Schema_Unknown +from pcapkit.protocols.misc.no_payload.protocol import NoPayload from pcapkit.utilities import config from pcapkit.utilities.exceptions import ProtocolError from pcapkit.utilities.warnings import RegistryWarning, warn @@ -68,7 +68,7 @@ class ICMPv4(ICMP[Data_ICMPv4, Schema_ICMPv4], This class parses the following ICMP message types, which are registered in the - :attr:`self.__type__ ` + :attr:`self.__type__ ` attribute: .. list-table:: @@ -78,17 +78,17 @@ class ICMPv4(ICMP[Data_ICMPv4, Schema_ICMPv4], - Data Parser - Data Constructor * - Echo Reply / Echo Request - - :meth:`~pcapkit.protocols.internet.icmpv4.ICMPv4._read_data_type_echo` - - :meth:`~pcapkit.protocols.internet.icmpv4.ICMPv4._make_data_type_echo` + - :meth:`~pcapkit.protocols.internet.icmpv4.protocol.ICMPv4._read_data_type_echo` + - :meth:`~pcapkit.protocols.internet.icmpv4.protocol.ICMPv4._make_data_type_echo` * - Destination Unreachable - - :meth:`~pcapkit.protocols.internet.icmpv4.ICMPv4._read_data_type_destination_unreachable` - - :meth:`~pcapkit.protocols.internet.icmpv4.ICMPv4._make_data_type_destination_unreachable` + - :meth:`~pcapkit.protocols.internet.icmpv4.protocol.ICMPv4._read_data_type_destination_unreachable` + - :meth:`~pcapkit.protocols.internet.icmpv4.protocol.ICMPv4._make_data_type_destination_unreachable` * - Time Exceeded - - :meth:`~pcapkit.protocols.internet.icmpv4.ICMPv4._read_data_type_time_exceeded` - - :meth:`~pcapkit.protocols.internet.icmpv4.ICMPv4._make_data_type_time_exceeded` + - :meth:`~pcapkit.protocols.internet.icmpv4.protocol.ICMPv4._read_data_type_time_exceeded` + - :meth:`~pcapkit.protocols.internet.icmpv4.protocol.ICMPv4._make_data_type_time_exceeded` * - Parameter Problem - - :meth:`~pcapkit.protocols.internet.icmpv4.ICMPv4._read_data_type_parameter_problem` - - :meth:`~pcapkit.protocols.internet.icmpv4.ICMPv4._make_data_type_parameter_problem` + - :meth:`~pcapkit.protocols.internet.icmpv4.protocol.ICMPv4._read_data_type_parameter_problem` + - :meth:`~pcapkit.protocols.internet.icmpv4.protocol.ICMPv4._make_data_type_parameter_problem` Any other type is kept as its raw message body, see :meth:`_read_data_type_none` and :meth:`_make_data_type_none`. @@ -239,10 +239,10 @@ def make(self, (:rfc:`792`) when :data:`~pcapkit.utilities.config.CHECKSUM_COMPUTE` is on, zero when it is off. body: Message body. :obj:`bytes` is parsed against ``type``'s own - schema; a :obj:`dict` or a :class:`~pcapkit.protocols.data.internet.icmpv4.ICMPv4` + schema; a :obj:`dict` or a :class:`~pcapkit.protocols.internet.icmpv4.data.ICMPv4` data model is handed to that type's own constructor method (see :attr:`__type__`); any other - :class:`~pcapkit.protocols.schema.internet.icmpv4.ICMPv4Type` is + :class:`~pcapkit.protocols.internet.icmpv4.schema.ICMPv4Type` is used as is. **kwargs: Arbitrary keyword arguments. diff --git a/pcapkit/protocols/schema/internet/icmpv4.py b/pcapkit/protocols/internet/icmpv4/schema.py similarity index 94% rename from pcapkit/protocols/schema/internet/icmpv4.py rename to pcapkit/protocols/internet/icmpv4/schema.py index a7d82a322f..7fc6dd6e6e 100644 --- a/pcapkit/protocols/schema/internet/icmpv4.py +++ b/pcapkit/protocols/internet/icmpv4/schema.py @@ -8,7 +8,7 @@ from pcapkit.corekit.fields.misc import SchemaField, SwitchField from pcapkit.corekit.fields.numbers import EnumField, UInt8Field, UInt16Field from pcapkit.corekit.fields.strings import BytesField, PaddingField -from pcapkit.protocols.schema.schema import EnumSchema, Schema, schema_final +from pcapkit.protocols.schema import EnumSchema, Schema, schema_final __all__ = [ 'ICMPv4', @@ -30,8 +30,8 @@ def icmpv4_data_selector(pkt: 'dict[str, Any]') -> 'Field': Returns: A :class:`~pcapkit.corekit.fields.misc.SchemaField` wrapped - :class:`~pcapkit.protocols.schema.internet.icmpv4.ICMPv4Type` instance - based on :attr:`ICMPv4.type `. + :class:`~pcapkit.protocols.internet.icmpv4.schema.ICMPv4Type` instance + based on :attr:`ICMPv4.type `. """ type = cast('Enum_Type', pkt['type']) diff --git a/pcapkit/protocols/internet/icmpv6/__init__.py b/pcapkit/protocols/internet/icmpv6/__init__.py new file mode 100644 index 0000000000..da01074309 --- /dev/null +++ b/pcapkit/protocols/internet/icmpv6/__init__.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""ICMPv6 - Internet Control Message Protocol for IPv6 +========================================================= + +.. module:: pcapkit.protocols.internet.icmpv6 + +:mod:`pcapkit.protocols.internet.icmpv6` holds the dissector, +:class:`~pcapkit.protocols.internet.icmpv6.protocol.ICMPv6`, in +:mod:`~pcapkit.protocols.internet.icmpv6.protocol`, its header schema in +:mod:`~pcapkit.protocols.internet.icmpv6.schema` and its data model in +:mod:`~pcapkit.protocols.internet.icmpv6.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.internet.icmpv6.protocol import ICMPv6 + +# Header Schemas +from pcapkit.protocols.internet.icmpv6.schema import \ + DestinationUnreachable as Schema_DestinationUnreachable +from pcapkit.protocols.internet.icmpv6.schema import Echo as Schema_Echo +from pcapkit.protocols.internet.icmpv6.schema import ICMPv6 as Schema_ICMPv6 +from pcapkit.protocols.internet.icmpv6.schema import ICMPv6Type as Schema_ICMPv6Type +from pcapkit.protocols.internet.icmpv6.schema import PacketTooBig as Schema_PacketTooBig +from pcapkit.protocols.internet.icmpv6.schema import ParameterProblem as Schema_ParameterProblem +from pcapkit.protocols.internet.icmpv6.schema import TimeExceeded as Schema_TimeExceeded +from pcapkit.protocols.internet.icmpv6.schema import Unknown as Schema_Unknown + +# Data Models +from pcapkit.protocols.internet.icmpv6.data import \ + DestinationUnreachable as Data_DestinationUnreachable +from pcapkit.protocols.internet.icmpv6.data import Echo as Data_Echo +from pcapkit.protocols.internet.icmpv6.data import ICMPv6 as Data_ICMPv6 +from pcapkit.protocols.internet.icmpv6.data import PacketTooBig as Data_PacketTooBig +from pcapkit.protocols.internet.icmpv6.data import ParameterProblem as Data_ParameterProblem +from pcapkit.protocols.internet.icmpv6.data import TimeExceeded as Data_TimeExceeded +from pcapkit.protocols.internet.icmpv6.data import Unknown as Data_Unknown + +__all__ = ['ICMPv6'] diff --git a/pcapkit/protocols/data/internet/icmpv6.py b/pcapkit/protocols/internet/icmpv6/data.py similarity index 97% rename from pcapkit/protocols/data/internet/icmpv6.py rename to pcapkit/protocols/internet/icmpv6/data.py index 3b94f3ed52..84534929b4 100644 --- a/pcapkit/protocols/data/internet/icmpv6.py +++ b/pcapkit/protocols/internet/icmpv6/data.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Protocol if TYPE_CHECKING: from pcapkit.const.icmpv6.type import Type as Enum_Type @@ -39,7 +39,7 @@ class ICMPv6(Protocol): checksum: 'bytes' #: Message length, in octets, header included. ICMPv6 messages carry no #: length field of their own -- this is simply how many octets - #: :meth:`ICMPv6.read ` + #: :meth:`ICMPv6.read ` #: was handed, kept here so the whole message can be told apart from a #: truncated capture. length: 'int' diff --git a/pcapkit/protocols/internet/icmpv6.py b/pcapkit/protocols/internet/icmpv6/protocol.py similarity index 90% rename from pcapkit/protocols/internet/icmpv6.py rename to pcapkit/protocols/internet/icmpv6/protocol.py index 97485d4c00..37599a5476 100644 --- a/pcapkit/protocols/internet/icmpv6.py +++ b/pcapkit/protocols/internet/icmpv6/protocol.py @@ -2,10 +2,10 @@ """ICMPv6 - Internet Control Message Protocol for IPv6 ========================================================= -.. module:: pcapkit.protocols.internet.icmpv6 +.. module:: pcapkit.protocols.internet.icmpv6.protocol -:mod:`pcapkit.protocols.internet.icmpv6` contains -:class:`~pcapkit.protocols.internet.icmpv6.ICMPv6` only, +:mod:`pcapkit.protocols.internet.icmpv6.protocol` contains +:class:`~pcapkit.protocols.internet.icmpv6.protocol.ICMPv6` only, which implements extractor for Internet Control Message Protocol for IPv6 (ICMPv6) [*]_, whose structure is described as below: @@ -28,25 +28,25 @@ from pcapkit.const.icmpv6.type import Type as Enum_Type from pcapkit.const.reg.transtype import TransType as Enum_TransType from pcapkit.corekit.protochain import ProtoChain -from pcapkit.protocols.data.internet.icmpv6 import \ +from pcapkit.protocols.internet.icmp.protocol import ICMP +from pcapkit.protocols.internet.icmpv6.data import \ DestinationUnreachable as Data_DestinationUnreachable -from pcapkit.protocols.data.internet.icmpv6 import Echo as Data_Echo -from pcapkit.protocols.data.internet.icmpv6 import ICMPv6 as Data_ICMPv6 -from pcapkit.protocols.data.internet.icmpv6 import PacketTooBig as Data_PacketTooBig -from pcapkit.protocols.data.internet.icmpv6 import ParameterProblem as Data_ParameterProblem -from pcapkit.protocols.data.internet.icmpv6 import TimeExceeded as Data_TimeExceeded -from pcapkit.protocols.data.internet.icmpv6 import Unknown as Data_Unknown -from pcapkit.protocols.internet.icmp import ICMP -from pcapkit.protocols.misc.no_payload import NoPayload -from pcapkit.protocols.schema.internet.icmpv6 import \ +from pcapkit.protocols.internet.icmpv6.data import Echo as Data_Echo +from pcapkit.protocols.internet.icmpv6.data import ICMPv6 as Data_ICMPv6 +from pcapkit.protocols.internet.icmpv6.data import PacketTooBig as Data_PacketTooBig +from pcapkit.protocols.internet.icmpv6.data import ParameterProblem as Data_ParameterProblem +from pcapkit.protocols.internet.icmpv6.data import TimeExceeded as Data_TimeExceeded +from pcapkit.protocols.internet.icmpv6.data import Unknown as Data_Unknown +from pcapkit.protocols.internet.icmpv6.schema import \ DestinationUnreachable as Schema_DestinationUnreachable -from pcapkit.protocols.schema.internet.icmpv6 import Echo as Schema_Echo -from pcapkit.protocols.schema.internet.icmpv6 import ICMPv6 as Schema_ICMPv6 -from pcapkit.protocols.schema.internet.icmpv6 import ICMPv6Type as Schema_ICMPv6Type -from pcapkit.protocols.schema.internet.icmpv6 import PacketTooBig as Schema_PacketTooBig -from pcapkit.protocols.schema.internet.icmpv6 import ParameterProblem as Schema_ParameterProblem -from pcapkit.protocols.schema.internet.icmpv6 import TimeExceeded as Schema_TimeExceeded -from pcapkit.protocols.schema.internet.icmpv6 import Unknown as Schema_Unknown +from pcapkit.protocols.internet.icmpv6.schema import Echo as Schema_Echo +from pcapkit.protocols.internet.icmpv6.schema import ICMPv6 as Schema_ICMPv6 +from pcapkit.protocols.internet.icmpv6.schema import ICMPv6Type as Schema_ICMPv6Type +from pcapkit.protocols.internet.icmpv6.schema import PacketTooBig as Schema_PacketTooBig +from pcapkit.protocols.internet.icmpv6.schema import ParameterProblem as Schema_ParameterProblem +from pcapkit.protocols.internet.icmpv6.schema import TimeExceeded as Schema_TimeExceeded +from pcapkit.protocols.internet.icmpv6.schema import Unknown as Schema_Unknown +from pcapkit.protocols.misc.no_payload.protocol import NoPayload from pcapkit.utilities import config from pcapkit.utilities.exceptions import ProtocolError from pcapkit.utilities.warnings import RegistryWarning, warn @@ -57,7 +57,7 @@ from mypy_extensions import DefaultArg, KwArg, NamedArg from typing_extensions import Literal - from pcapkit.protocols.misc.checksum.ip_pseudo import IP_Pseudo + from pcapkit.protocols.misc.checksum.ip_pseudo.protocol import IP_Pseudo TypeParser = Callable[[Schema_ICMPv6Type, NamedArg(Schema_ICMPv6, 'header'), NamedArg(int, 'length')], Data_ICMPv6] @@ -72,7 +72,7 @@ class ICMPv6(ICMP[Data_ICMPv6, Schema_ICMPv6], This class parses the following ICMPv6 message types, which are registered in the - :attr:`self.__type__ ` + :attr:`self.__type__ ` attribute: .. list-table:: @@ -82,20 +82,20 @@ class ICMPv6(ICMP[Data_ICMPv6, Schema_ICMPv6], - Data Parser - Data Constructor * - Destination Unreachable - - :meth:`~pcapkit.protocols.internet.icmpv6.ICMPv6._read_data_type_destination_unreachable` - - :meth:`~pcapkit.protocols.internet.icmpv6.ICMPv6._make_data_type_destination_unreachable` + - :meth:`~pcapkit.protocols.internet.icmpv6.protocol.ICMPv6._read_data_type_destination_unreachable` + - :meth:`~pcapkit.protocols.internet.icmpv6.protocol.ICMPv6._make_data_type_destination_unreachable` * - Packet Too Big - - :meth:`~pcapkit.protocols.internet.icmpv6.ICMPv6._read_data_type_packet_too_big` - - :meth:`~pcapkit.protocols.internet.icmpv6.ICMPv6._make_data_type_packet_too_big` + - :meth:`~pcapkit.protocols.internet.icmpv6.protocol.ICMPv6._read_data_type_packet_too_big` + - :meth:`~pcapkit.protocols.internet.icmpv6.protocol.ICMPv6._make_data_type_packet_too_big` * - Time Exceeded - - :meth:`~pcapkit.protocols.internet.icmpv6.ICMPv6._read_data_type_time_exceeded` - - :meth:`~pcapkit.protocols.internet.icmpv6.ICMPv6._make_data_type_time_exceeded` + - :meth:`~pcapkit.protocols.internet.icmpv6.protocol.ICMPv6._read_data_type_time_exceeded` + - :meth:`~pcapkit.protocols.internet.icmpv6.protocol.ICMPv6._make_data_type_time_exceeded` * - Parameter Problem - - :meth:`~pcapkit.protocols.internet.icmpv6.ICMPv6._read_data_type_parameter_problem` - - :meth:`~pcapkit.protocols.internet.icmpv6.ICMPv6._make_data_type_parameter_problem` + - :meth:`~pcapkit.protocols.internet.icmpv6.protocol.ICMPv6._read_data_type_parameter_problem` + - :meth:`~pcapkit.protocols.internet.icmpv6.protocol.ICMPv6._make_data_type_parameter_problem` * - Echo Request / Echo Reply - - :meth:`~pcapkit.protocols.internet.icmpv6.ICMPv6._read_data_type_echo` - - :meth:`~pcapkit.protocols.internet.icmpv6.ICMPv6._make_data_type_echo` + - :meth:`~pcapkit.protocols.internet.icmpv6.protocol.ICMPv6._read_data_type_echo` + - :meth:`~pcapkit.protocols.internet.icmpv6.protocol.ICMPv6._make_data_type_echo` Any other type, including Neighbor Discovery (:rfc:`4861`) and Multicast Listener Discovery (:rfc:`9777`), is kept as its raw message body, see @@ -132,7 +132,7 @@ class ICMPv6(ICMP[Data_ICMPv6, Schema_ICMPv6], ) # type: DefaultDict[Enum_Type | int, str | tuple[TypeParser, TypeConstructor]] #: Whether :meth:`make` left the checksum for the enclosing IP layer to - #: compute, see :mod:`pcapkit.protocols.misc.checksum.ip_pseudo`. + #: compute, see :mod:`pcapkit.protocols.misc.checksum.ip_pseudo.protocol`. _checksum_pending = False ########################################################################## @@ -232,10 +232,10 @@ def make(self, an IPv6 layer this message is the payload of; zero otherwise. body: Message body. :obj:`bytes` is parsed against ``type``'s own schema; a :obj:`dict` or a - :class:`~pcapkit.protocols.data.internet.icmpv6.ICMPv6` data + :class:`~pcapkit.protocols.internet.icmpv6.data.ICMPv6` data model is handed to that type's own constructor method (see :attr:`__type__`); any other - :class:`~pcapkit.protocols.schema.internet.icmpv6.ICMPv6Type` + :class:`~pcapkit.protocols.internet.icmpv6.schema.ICMPv6Type` is used as is. pseudo: Pseudo-header of the enclosing IPv6 layer; its length is replaced by this message's own. @@ -292,7 +292,7 @@ def make(self, self._checksum_pending = True else: from pcapkit.corekit.checksum.internet import compute_checksum # isort: skip # pylint: disable=import-outside-toplevel - from pcapkit.protocols.misc.checksum.ip_pseudo import pseudo_header # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.misc.checksum.ip_pseudo.protocol import pseudo_header # isort: skip # pylint: disable=import-outside-toplevel octets = schema.pack() schema.checksum = compute_checksum(octets, prefix=pseudo_header(pseudo, len(octets))) return schema @@ -365,7 +365,7 @@ def _verify_pseudo_checksum(self, pseudo: 'Optional[IP_Pseudo]') -> 'None': """Verify the checksum over the pseudo-header of the enclosing IP layer. That layer calls this once parsed, see - :func:`~pcapkit.protocols.misc.checksum.ip_pseudo.verify_upper`. + :func:`~pcapkit.protocols.misc.checksum.ip_pseudo.protocol.verify_upper`. Args: pseudo: Pseudo-header, or :data:`None` if the IP layer gives none. diff --git a/pcapkit/protocols/schema/internet/icmpv6.py b/pcapkit/protocols/internet/icmpv6/schema.py similarity index 95% rename from pcapkit/protocols/schema/internet/icmpv6.py rename to pcapkit/protocols/internet/icmpv6/schema.py index 9405fa8750..e24d58a567 100644 --- a/pcapkit/protocols/schema/internet/icmpv6.py +++ b/pcapkit/protocols/internet/icmpv6/schema.py @@ -8,7 +8,7 @@ from pcapkit.corekit.fields.misc import SchemaField, SwitchField from pcapkit.corekit.fields.numbers import EnumField, UInt8Field, UInt16Field, UInt32Field from pcapkit.corekit.fields.strings import BytesField, PaddingField -from pcapkit.protocols.schema.schema import EnumSchema, Schema, schema_final +from pcapkit.protocols.schema import EnumSchema, Schema, schema_final __all__ = [ 'ICMPv6', @@ -31,8 +31,8 @@ def icmpv6_data_selector(pkt: 'dict[str, Any]') -> 'Field': Returns: A :class:`~pcapkit.corekit.fields.misc.SchemaField` wrapped - :class:`~pcapkit.protocols.schema.internet.icmpv6.ICMPv6Type` instance - based on :attr:`ICMPv6.type `. + :class:`~pcapkit.protocols.internet.icmpv6.schema.ICMPv6Type` instance + based on :attr:`ICMPv6.type `. """ type = cast('Enum_Type', pkt['type']) diff --git a/pcapkit/protocols/internet/igmp/__init__.py b/pcapkit/protocols/internet/igmp/__init__.py new file mode 100644 index 0000000000..b7f29ad187 --- /dev/null +++ b/pcapkit/protocols/internet/igmp/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""IGMP - Internet Group Management Protocol +=============================================== + +.. module:: pcapkit.protocols.internet.igmp + +:mod:`pcapkit.protocols.internet.igmp` holds the dissector, +:class:`~pcapkit.protocols.internet.igmp.protocol.IGMP`, in +:mod:`~pcapkit.protocols.internet.igmp.protocol`, its header schema in +:mod:`~pcapkit.protocols.internet.igmp.schema` and its data model in +:mod:`~pcapkit.protocols.internet.igmp.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.internet.igmp.protocol import IGMP + +# Header Schemas +from pcapkit.protocols.internet.igmp.schema import IGMP as Schema_IGMP + +# Data Models +from pcapkit.protocols.internet.igmp.data import IGMP as Data_IGMP + +__all__ = ['IGMP'] diff --git a/pcapkit/protocols/data/internet/igmp.py b/pcapkit/protocols/internet/igmp/data.py similarity index 87% rename from pcapkit/protocols/data/internet/igmp.py rename to pcapkit/protocols/internet/igmp/data.py index 92aef28d25..47f64b03e7 100644 --- a/pcapkit/protocols/data/internet/igmp.py +++ b/pcapkit/protocols/internet/igmp/data.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Protocol if TYPE_CHECKING: from ipaddress import IPv4Address @@ -26,15 +26,15 @@ class IGMP(Protocol): v2's, with ``max_resp_time`` reserved at zero and fewer :attr:`type` values defined (:issue:`2439`). IGMPv3 (:rfc:`3376`) adds a group-record-list body of a materially different shape and is out of - scope here -- see :mod:`pcapkit.protocols.data.internet.igmpv3`. + scope here -- see :mod:`pcapkit.protocols.internet.igmpv3.data`. """ #: Version of IGMP the message was read as, ``1`` or ``2`` -- the - #: :attr:`~pcapkit.protocols.internet.igmp.IGMP.version` of the class that + #: :attr:`~pcapkit.protocols.internet.igmp.protocol.IGMP.version` of the class that #: read or built it. It is on no octet, since the versions share this #: layout, and :meth:`IGMP.from_data - #: ` dispatches on it + #: ` dispatches on it #: (:issue:`2574`). version: 'Literal[1, 2]' #: Message type. diff --git a/pcapkit/protocols/internet/igmp.py b/pcapkit/protocols/internet/igmp/protocol.py similarity index 90% rename from pcapkit/protocols/internet/igmp.py rename to pcapkit/protocols/internet/igmp/protocol.py index 53d1c74b3f..47e4ae2989 100644 --- a/pcapkit/protocols/internet/igmp.py +++ b/pcapkit/protocols/internet/igmp/protocol.py @@ -2,22 +2,22 @@ """IGMP - Internet Group Management Protocol =============================================== -.. module:: pcapkit.protocols.internet.igmp +.. module:: pcapkit.protocols.internet.igmp.protocol -:mod:`pcapkit.protocols.internet.igmp` contains -:class:`~pcapkit.protocols.internet.igmp.IGMP`, the abstract base of +:mod:`pcapkit.protocols.internet.igmp.protocol` contains +:class:`~pcapkit.protocols.internet.igmp.protocol.IGMP`, the abstract base of IGMPv1 (:rfc:`1112`), IGMPv2 (:rfc:`2236`) and IGMPv3 (:rfc:`3376`) messages. IGMPv1 and IGMPv2 share one 8-octet layout, so the base holds that shared -schema, data model and read path. :class:`~pcapkit.protocols.internet.igmpv1.IGMPv1`, -:class:`~pcapkit.protocols.internet.igmpv2.IGMPv2` and -:class:`~pcapkit.protocols.internet.igmpv3.IGMPv3` set :attr:`version`; IGMPv3's +schema, data model and read path. :class:`~pcapkit.protocols.internet.igmpv1.protocol.IGMPv1`, +:class:`~pcapkit.protocols.internet.igmpv2.protocol.IGMPv2` and +:class:`~pcapkit.protocols.internet.igmpv3.protocol.IGMPv3` set :attr:`version`; IGMPv3's wire format differs materially (a Query's source-list extension, a Report's group-record list), so it carries its own schema and data model instead. The registry entry for IP protocol 2 is this base, and :meth:`IGMP._dispatch -` picks the version class. +` picks the version class. Constructing the base gives the class its ``version`` keyword names; without it, octets give the class ``_dispatch`` picks, and fields are refused. -:meth:`~pcapkit.protocols.internet.igmp.IGMP.from_data` gives the class the +:meth:`~pcapkit.protocols.internet.igmp.protocol.IGMP.from_data` gives the class the ``version`` of its data names, which each data model carries and no octet does (:issue:`2574`). Every version's checksum covers the whole message, with no pseudo-header, so the base verifies it for each of them (:issue:`2618`). @@ -31,10 +31,10 @@ from pcapkit.const.igmp.type import Type as Enum_Type from pcapkit.const.reg.transtype import TransType as Enum_TransType -from pcapkit.protocols.data.internet.igmp import IGMP as Data_IGMP +from pcapkit.protocols.internet.igmp.data import IGMP as Data_IGMP +from pcapkit.protocols.internet.igmp.schema import IGMP as Schema_IGMP from pcapkit.protocols.internet.internet import Internet from pcapkit.protocols.protocol import _PT, _ST -from pcapkit.protocols.schema.internet.igmp import IGMP as Schema_IGMP from pcapkit.utilities import config from pcapkit.utilities.exceptions import ProtocolError @@ -44,9 +44,9 @@ from typing_extensions import Self - from pcapkit.protocols.misc.raw import Raw + from pcapkit.protocols.misc.raw.protocol import Raw from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema __all__ = ['IGMP'] @@ -109,7 +109,7 @@ def id(cls) -> 'tuple[Literal["IGMP"], Literal["IGMPv2"], Literal["IGMPv3"]]': """Index ID of the protocol. :rfc:`1112` names the protocol ``IGMP``, without a version, the same - shape :class:`~pcapkit.protocols.internet.icmp.ICMP` takes for + shape :class:`~pcapkit.protocols.internet.icmp.protocol.ICMP` takes for :rfc:`792` -- so the family base's own name doubles as IGMPv1's canonical name. :rfc:`2236` and :rfc:`3376` name IGMPv2 and IGMPv3 with their own versions. @@ -326,7 +326,7 @@ def __new__(cls, file: 'Optional[IO[bytes] | bytes]' = None, offset = file.tell() data = file.read(length) # type: ignore[arg-type] file.seek(offset) - from pcapkit.protocols.misc.raw import Raw # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.misc.raw.protocol import Raw # isort: skip # pylint: disable=import-outside-toplevel picked = cls._dispatch(data, len(data)) if picked is Raw: @@ -440,14 +440,14 @@ def _dispatch(cls, data: 'bytes', length: 'int') -> 'Type[ProtocolBase] | Type[R length: The IGMP message's length, in octets. Returns: - :class:`~pcapkit.protocols.internet.igmpv1.IGMPv1`, - :class:`~pcapkit.protocols.internet.igmpv2.IGMPv2` or - :class:`~pcapkit.protocols.internet.igmpv3.IGMPv3` for the version - the message classifies as; :class:`~pcapkit.protocols.misc.raw.Raw` + :class:`~pcapkit.protocols.internet.igmpv1.protocol.IGMPv1`, + :class:`~pcapkit.protocols.internet.igmpv2.protocol.IGMPv2` or + :class:`~pcapkit.protocols.internet.igmpv3.protocol.IGMPv3` for the version + the message classifies as; :class:`~pcapkit.protocols.misc.raw.protocol.Raw` for any other message, which then keeps its octets undissected. """ - from pcapkit.protocols.misc.raw import Raw # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.misc.raw.protocol import Raw # isort: skip # pylint: disable=import-outside-toplevel if len(data) < 2: return Raw @@ -463,9 +463,9 @@ def _member_of_version(version: 'Any') -> 'Type[IGMP]': ``version`` keyword gives it. Returns: - :class:`~pcapkit.protocols.internet.igmpv1.IGMPv1`, - :class:`~pcapkit.protocols.internet.igmpv2.IGMPv2` or - :class:`~pcapkit.protocols.internet.igmpv3.IGMPv3`. + :class:`~pcapkit.protocols.internet.igmpv1.protocol.IGMPv1`, + :class:`~pcapkit.protocols.internet.igmpv2.protocol.IGMPv2` or + :class:`~pcapkit.protocols.internet.igmpv3.protocol.IGMPv3`. Raises: ProtocolError: If ``version`` names none of them, or is no @@ -473,9 +473,9 @@ def _member_of_version(version: 'Any') -> 'Type[IGMP]': where it equals one. """ - from pcapkit.protocols.internet.igmpv1 import IGMPv1 # isort: skip # pylint: disable=import-outside-toplevel - from pcapkit.protocols.internet.igmpv2 import IGMPv2 # isort: skip # pylint: disable=import-outside-toplevel - from pcapkit.protocols.internet.igmpv3 import IGMPv3 # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.internet.igmpv1.protocol import IGMPv1 # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.internet.igmpv2.protocol import IGMPv2 # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.internet.igmpv3.protocol import IGMPv3 # isort: skip # pylint: disable=import-outside-toplevel if isinstance(version, int) and not isinstance(version, bool): for number, member in ((1, IGMPv1), (2, IGMPv2), (3, IGMPv3)): diff --git a/pcapkit/protocols/schema/internet/igmp.py b/pcapkit/protocols/internet/igmp/schema.py similarity index 97% rename from pcapkit/protocols/schema/internet/igmp.py rename to pcapkit/protocols/internet/igmp/schema.py index 37a1d0ba5c..12562cfa34 100644 --- a/pcapkit/protocols/schema/internet/igmp.py +++ b/pcapkit/protocols/internet/igmp/schema.py @@ -9,7 +9,7 @@ from pcapkit.corekit.fields.misc import PayloadField from pcapkit.corekit.fields.numbers import EnumField, UInt8Field from pcapkit.corekit.fields.strings import BytesField -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final __all__ = ['IGMP'] diff --git a/pcapkit/protocols/internet/igmpv1/__init__.py b/pcapkit/protocols/internet/igmpv1/__init__.py new file mode 100644 index 0000000000..727ea36d0d --- /dev/null +++ b/pcapkit/protocols/internet/igmpv1/__init__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +"""IGMPv1 - Internet Group Management Protocol version 1 +=========================================================== + +.. module:: pcapkit.protocols.internet.igmpv1 + +:mod:`pcapkit.protocols.internet.igmpv1` holds the dissector, +:class:`~pcapkit.protocols.internet.igmpv1.protocol.IGMPv1`, in +:mod:`~pcapkit.protocols.internet.igmpv1.protocol`. + +""" +from pcapkit.protocols.internet.igmpv1.protocol import IGMPv1 + +__all__ = ['IGMPv1'] diff --git a/pcapkit/protocols/internet/igmpv1.py b/pcapkit/protocols/internet/igmpv1/protocol.py similarity index 81% rename from pcapkit/protocols/internet/igmpv1.py rename to pcapkit/protocols/internet/igmpv1/protocol.py index e21c2c39a9..77fb278c3d 100644 --- a/pcapkit/protocols/internet/igmpv1.py +++ b/pcapkit/protocols/internet/igmpv1/protocol.py @@ -2,10 +2,10 @@ """IGMPv1 - Internet Group Management Protocol version 1 =========================================================== -.. module:: pcapkit.protocols.internet.igmpv1 +.. module:: pcapkit.protocols.internet.igmpv1.protocol -:mod:`pcapkit.protocols.internet.igmpv1` contains -:class:`~pcapkit.protocols.internet.igmpv1.IGMPv1`, which implements an +:mod:`pcapkit.protocols.internet.igmpv1.protocol` contains +:class:`~pcapkit.protocols.internet.igmpv1.protocol.IGMPv1`, which implements an extractor for Internet Group Management Protocol version 1 (IGMPv1) [:rfc:`1112`]. It refuses a message of any other version, and a Membership Query with a non-zero ``max_resp_time`` is IGMPv2, not IGMPv1. @@ -15,9 +15,9 @@ """ from typing import TYPE_CHECKING -from pcapkit.protocols.data.internet.igmp import IGMP as Data_IGMP -from pcapkit.protocols.internet.igmp import IGMP as IGMPBase -from pcapkit.protocols.schema.internet.igmp import IGMP as Schema_IGMP +from pcapkit.protocols.internet.igmp.data import IGMP as Data_IGMP +from pcapkit.protocols.internet.igmp.protocol import IGMP as IGMPBase +from pcapkit.protocols.internet.igmp.schema import IGMP as Schema_IGMP if TYPE_CHECKING: from typing import Literal diff --git a/pcapkit/protocols/internet/igmpv2/__init__.py b/pcapkit/protocols/internet/igmpv2/__init__.py new file mode 100644 index 0000000000..956c5b3ef7 --- /dev/null +++ b/pcapkit/protocols/internet/igmpv2/__init__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +"""IGMPv2 - Internet Group Management Protocol version 2 +=========================================================== + +.. module:: pcapkit.protocols.internet.igmpv2 + +:mod:`pcapkit.protocols.internet.igmpv2` holds the dissector, +:class:`~pcapkit.protocols.internet.igmpv2.protocol.IGMPv2`, in +:mod:`~pcapkit.protocols.internet.igmpv2.protocol`. + +""" +from pcapkit.protocols.internet.igmpv2.protocol import IGMPv2 + +__all__ = ['IGMPv2'] diff --git a/pcapkit/protocols/internet/igmpv2.py b/pcapkit/protocols/internet/igmpv2/protocol.py similarity index 82% rename from pcapkit/protocols/internet/igmpv2.py rename to pcapkit/protocols/internet/igmpv2/protocol.py index 8c9d4c56d9..361c743223 100644 --- a/pcapkit/protocols/internet/igmpv2.py +++ b/pcapkit/protocols/internet/igmpv2/protocol.py @@ -2,10 +2,10 @@ """IGMPv2 - Internet Group Management Protocol version 2 =========================================================== -.. module:: pcapkit.protocols.internet.igmpv2 +.. module:: pcapkit.protocols.internet.igmpv2.protocol -:mod:`pcapkit.protocols.internet.igmpv2` contains -:class:`~pcapkit.protocols.internet.igmpv2.IGMPv2`, which implements an +:mod:`pcapkit.protocols.internet.igmpv2.protocol` contains +:class:`~pcapkit.protocols.internet.igmpv2.protocol.IGMPv2`, which implements an extractor for Internet Group Management Protocol version 2 (IGMPv2) [:rfc:`2236`]. It refuses a message of any other version; a Membership Query with a zero ``max_resp_time`` is IGMPv1, not IGMPv2. @@ -15,9 +15,9 @@ """ from typing import TYPE_CHECKING -from pcapkit.protocols.data.internet.igmp import IGMP as Data_IGMP -from pcapkit.protocols.internet.igmp import IGMP as IGMPBase -from pcapkit.protocols.schema.internet.igmp import IGMP as Schema_IGMP +from pcapkit.protocols.internet.igmp.data import IGMP as Data_IGMP +from pcapkit.protocols.internet.igmp.protocol import IGMP as IGMPBase +from pcapkit.protocols.internet.igmp.schema import IGMP as Schema_IGMP if TYPE_CHECKING: from typing import Literal diff --git a/pcapkit/protocols/internet/igmpv3/__init__.py b/pcapkit/protocols/internet/igmpv3/__init__.py new file mode 100644 index 0000000000..3e8f22e9ef --- /dev/null +++ b/pcapkit/protocols/internet/igmpv3/__init__.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""IGMPv3 - Internet Group Management Protocol version 3 +=========================================================== + +.. module:: pcapkit.protocols.internet.igmpv3 + +:mod:`pcapkit.protocols.internet.igmpv3` holds the dissector, +:class:`~pcapkit.protocols.internet.igmpv3.protocol.IGMPv3`, in +:mod:`~pcapkit.protocols.internet.igmpv3.protocol`, its header schema in +:mod:`~pcapkit.protocols.internet.igmpv3.schema` and its data model in +:mod:`~pcapkit.protocols.internet.igmpv3.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.internet.igmpv3.protocol import IGMPv3 + +# Header Schemas +from pcapkit.protocols.internet.igmpv3.schema import GroupRecord as Schema_GroupRecord +from pcapkit.protocols.internet.igmpv3.schema import IGMPv3 as Schema_IGMPv3 +from pcapkit.protocols.internet.igmpv3.schema import Query as Schema_Query +from pcapkit.protocols.internet.igmpv3.schema import QueryExtension as Schema_QueryExtension +from pcapkit.protocols.internet.igmpv3.schema import Report as Schema_Report + +# Data Models +from pcapkit.protocols.internet.igmpv3.data import GroupRecord as Data_GroupRecord +from pcapkit.protocols.internet.igmpv3.data import IGMPv3 as Data_IGMPv3 +from pcapkit.protocols.internet.igmpv3.data import Query as Data_Query +from pcapkit.protocols.internet.igmpv3.data import Report as Data_Report + +__all__ = ['IGMPv3'] diff --git a/pcapkit/protocols/data/internet/igmpv3.py b/pcapkit/protocols/internet/igmpv3/data.py similarity index 94% rename from pcapkit/protocols/data/internet/igmpv3.py rename to pcapkit/protocols/internet/igmpv3/data.py index 74fa0f9a89..3ae0aad2f1 100644 --- a/pcapkit/protocols/data/internet/igmpv3.py +++ b/pcapkit/protocols/internet/igmpv3/data.py @@ -4,8 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.data import Data -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Data, Protocol if TYPE_CHECKING: from ipaddress import IPv4Address @@ -32,16 +31,16 @@ class IGMPv3(Protocol): #: Version of IGMP, always ``3``. It is on no octet; it names the class #: that read or built the message, as on the IGMPv1/v2 data model, and - #: :meth:`IGMP.from_data ` + #: :meth:`IGMP.from_data ` #: dispatches on it (:issue:`2574`). version: 'Literal[3]' #: Message type. type: 'Enum_Type' #: Header length, in octets. IGMP has no header field of its own that - #: states this -- unlike :class:`~pcapkit.protocols.internet.ah.AH`, it + #: states this -- unlike :class:`~pcapkit.protocols.internet.ah.protocol.AH`, it #: is computed from what :meth:`IGMPv3.read - #: ` actually consumed, the - #: same way :attr:`~pcapkit.protocols.data.internet.esp.ESP.length` is. + #: ` actually consumed, the + #: same way :attr:`~pcapkit.protocols.internet.esp.data.ESP.length` is. length: 'int' if TYPE_CHECKING: @@ -54,7 +53,7 @@ class IGMPv3(Protocol): class Query(IGMPv3): """Data model for an IGMPv3 Membership Query (:rfc:`3376#section-4.1`). - Reached only once :meth:`IGMPv3.read ` + Reached only once :meth:`IGMPv3.read ` has confirmed the message classifies as IGMPv3 (at least 12 octets), so the source-list extension fields below are always populated -- never :data:`None`, unlike the single-class design IGMPv1/v2 predate this one diff --git a/pcapkit/protocols/internet/igmpv3.py b/pcapkit/protocols/internet/igmpv3/protocol.py similarity index 92% rename from pcapkit/protocols/internet/igmpv3.py rename to pcapkit/protocols/internet/igmpv3/protocol.py index 23506bd401..b2240879e7 100644 --- a/pcapkit/protocols/internet/igmpv3.py +++ b/pcapkit/protocols/internet/igmpv3/protocol.py @@ -2,10 +2,10 @@ """IGMPv3 - Internet Group Management Protocol version 3 =========================================================== -.. module:: pcapkit.protocols.internet.igmpv3 +.. module:: pcapkit.protocols.internet.igmpv3.protocol -:mod:`pcapkit.protocols.internet.igmpv3` contains -:class:`~pcapkit.protocols.internet.igmpv3.IGMPv3`, which implements an +:mod:`pcapkit.protocols.internet.igmpv3.protocol` contains +:class:`~pcapkit.protocols.internet.igmpv3.protocol.IGMPv3`, which implements an extractor for Internet Group Management Protocol version 3 (IGMPv3) [:rfc:`3376`]. Unlike IGMPv1/v2, IGMPv3 defines two message shapes of its own, both handled by this one class: @@ -43,8 +43,8 @@ 8 64 ``igmpv3.records`` Group Record [1..M] ======= ========= ================================== =================================== -:meth:`~pcapkit.protocols.internet.igmp.IGMP._classify` is what keeps an -IGMPv1/v2 message out of this class; :attr:`~pcapkit.protocols.internet.igmp.IGMP.version` +:meth:`~pcapkit.protocols.internet.igmp.protocol.IGMP._classify` is what keeps an +IGMPv1/v2 message out of this class; :attr:`~pcapkit.protocols.internet.igmp.protocol.IGMP.version` and :meth:`id` are this class's own. .. versionadded:: 1.6.0 @@ -54,16 +54,16 @@ from pcapkit.const.igmp.record_type import RecordType as Enum_RecordType from pcapkit.const.igmp.type import Type as Enum_Type -from pcapkit.protocols.data.internet.igmpv3 import GroupRecord as Data_GroupRecord -from pcapkit.protocols.data.internet.igmpv3 import IGMPv3 as Data_IGMPv3 -from pcapkit.protocols.data.internet.igmpv3 import Query as Data_Query -from pcapkit.protocols.data.internet.igmpv3 import Report as Data_Report -from pcapkit.protocols.internet.igmp import IGMP as IGMPBase -from pcapkit.protocols.schema.internet.igmpv3 import GroupRecord as Schema_GroupRecord -from pcapkit.protocols.schema.internet.igmpv3 import IGMPv3 as Schema_IGMPv3 -from pcapkit.protocols.schema.internet.igmpv3 import Query as Schema_Query -from pcapkit.protocols.schema.internet.igmpv3 import QueryExtension as Schema_QueryExtension -from pcapkit.protocols.schema.internet.igmpv3 import Report as Schema_Report +from pcapkit.protocols.internet.igmp.protocol import IGMP as IGMPBase +from pcapkit.protocols.internet.igmpv3.data import GroupRecord as Data_GroupRecord +from pcapkit.protocols.internet.igmpv3.data import IGMPv3 as Data_IGMPv3 +from pcapkit.protocols.internet.igmpv3.data import Query as Data_Query +from pcapkit.protocols.internet.igmpv3.data import Report as Data_Report +from pcapkit.protocols.internet.igmpv3.schema import GroupRecord as Schema_GroupRecord +from pcapkit.protocols.internet.igmpv3.schema import IGMPv3 as Schema_IGMPv3 +from pcapkit.protocols.internet.igmpv3.schema import Query as Schema_Query +from pcapkit.protocols.internet.igmpv3.schema import QueryExtension as Schema_QueryExtension +from pcapkit.protocols.internet.igmpv3.schema import Report as Schema_Report from pcapkit.utilities import config from pcapkit.utilities.exceptions import ProtocolError @@ -74,7 +74,7 @@ from typing_extensions import Literal from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema __all__ = ['IGMPv3'] @@ -82,8 +82,8 @@ def _decode_resp_code(code: 'int') -> 'int': """Decode a Max Resp Code/QQIC octet into its real value. - Per :rfc:`3376#section-4.1.1` (:attr:`~pcapkit.protocols.data.internet.igmpv3.Query.max_resp_time`) - and :rfc:`3376#section-4.1.7` (:attr:`~pcapkit.protocols.data.internet.igmpv3.Query.qqi`) + Per :rfc:`3376#section-4.1.1` (:attr:`~pcapkit.protocols.internet.igmpv3.data.Query.max_resp_time`) + and :rfc:`3376#section-4.1.7` (:attr:`~pcapkit.protocols.internet.igmpv3.data.Query.qqi`) alike: * if ``code < 128``, the value is ``code`` itself; @@ -113,7 +113,7 @@ def _encode_resp_code(value: 'int') -> 'int': represent and otherwise floors to the nearest one it can (the same lossy-above-127 trade-off :rfc:`3376#section-4.1.1` itself makes) -- mirroring how :meth:`HIP._make_puzzle_lifetime - ` encodes its + ` encodes its own exponential field. Args: @@ -166,8 +166,8 @@ class IGMPv3(IGMPBase[Data_IGMPv3, Schema_IGMPv3], schema=Schema_IGMPv3, data=Data_IGMPv3): """This class implements Internet Group Management Protocol version 3. - Unlike :class:`~pcapkit.protocols.internet.igmpv1.IGMPv1` and - :class:`~pcapkit.protocols.internet.igmpv2.IGMPv2`, which share the base's + Unlike :class:`~pcapkit.protocols.internet.igmpv1.protocol.IGMPv1` and + :class:`~pcapkit.protocols.internet.igmpv2.protocol.IGMPv2`, which share the base's own 8-octet schema and data model, IGMPv3's wire format differs materially by message -- a Query's source-list extension, a Report's group-record list -- so this class carries its own (:issue:`2439`, @@ -196,9 +196,9 @@ def length(self) -> 'int': Every message starts with an 8-octet header. A Query may carry the source-list extension, and a Report's group-record list has no fixed size, so this is taken during :meth:`read` from the octets consumed - (see :attr:`~pcapkit.protocols.data.internet.igmpv3.IGMPv3.length`) + (see :attr:`~pcapkit.protocols.internet.igmpv3.data.IGMPv3.length`) rather than returned as a constant, unlike the base's own - :attr:`~pcapkit.protocols.internet.igmp.IGMP.length`. + :attr:`~pcapkit.protocols.internet.igmp.protocol.IGMP.length`. """ return self._info.length @@ -328,7 +328,7 @@ def make(self, Building a Query (the default) always writes the source-list extension: this class is specifically IGMPv3, unlike the base's own - :meth:`~pcapkit.protocols.internet.igmp.IGMP.make`, which writes the + :meth:`~pcapkit.protocols.internet.igmp.protocol.IGMP.make`, which writes the extension only when asked, since there a plain 8-octet message is the more natural default. @@ -373,7 +373,7 @@ def make(self, a Report. A count above the length of ``records`` is written as given, as on a Report the capture cut short. records: Group records (:rfc:`3376#section-4.2.4`), each either - a :class:`~pcapkit.protocols.data.internet.igmpv3.GroupRecord` + a :class:`~pcapkit.protocols.internet.igmpv3.data.GroupRecord` or a :obj:`dict` of the keyword arguments :meth:`_make_group_record` takes; only meaningful for a Report. @@ -521,7 +521,7 @@ def _make_group_record(self, record: 'Optional[Data_GroupRecord]' = None, *, record: An already-built group record, taking precedence over the keyword arguments below (mirrors :meth:`HIP._make_param_locator_set - `'s + `'s ``param``/keyword split). record_type: Record type. aux_data_len: Auxiliary data length, in 32-bit words; derived diff --git a/pcapkit/protocols/schema/internet/igmpv3.py b/pcapkit/protocols/internet/igmpv3/schema.py similarity index 94% rename from pcapkit/protocols/schema/internet/igmpv3.py rename to pcapkit/protocols/internet/igmpv3/schema.py index c2c007cdf1..dcf690e1ad 100644 --- a/pcapkit/protocols/schema/internet/igmpv3.py +++ b/pcapkit/protocols/internet/igmpv3/schema.py @@ -11,8 +11,8 @@ from pcapkit.corekit.fields.misc import ConditionalField, PayloadField, SchemaField, SwitchField from pcapkit.corekit.fields.numbers import EnumField, UInt8Field, UInt16Field from pcapkit.corekit.fields.strings import BitField, BytesField -from pcapkit.protocols.schema.internet.ipv6 import IP_MAX_LENGTH -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.internet.ipv6.schema import IP_MAX_LENGTH +from pcapkit.protocols.schema import Schema, schema_final from pcapkit.utilities.contextvars import frame_depth from pcapkit.utilities.exceptions import ProtocolError @@ -50,10 +50,10 @@ def igmpv3_body_selector(pkt: 'dict[str, Any]') -> 'SchemaField': Raises: ProtocolError: If :attr:`IGMPv3.type` is neither the Membership Query nor the IGMPv3 Membership Report. :meth:`IGMP._classify - ` is what keeps a + ` is what keeps a genuine IGMPv1/v2 message (an 8-octet Query, or a Report/Leave type) from ever reaching this class in the first place; this is - only reached when :class:`~pcapkit.protocols.internet.igmpv3.IGMPv3` + only reached when :class:`~pcapkit.protocols.internet.igmpv3.protocol.IGMPv3` is instantiated directly on a message of neither shape. """ @@ -109,13 +109,13 @@ def report_record_count(pkt: 'dict[str, Any]') -> 'int': tells a cut from the end of the message, so the count does: records it counts past the data are a cut, however the cut falls, on a field boundary too, and :meth:`Schema.unpack - ` records it, the records + ` records it, the records present alone being read (:issue:`2711`). Raises: ProtocolError: If the records counted, at the 8 fixed octets of each, behind the 8 octets ahead of them, reach past the - :data:`~pcapkit.protocols.schema.internet.ipv6.IP_MAX_LENGTH` octets + :data:`~pcapkit.protocols.internet.ipv6.schema.IP_MAX_LENGTH` octets an IP payload can hold, so the count is no cut but one the message cannot carry (:issue:`2711`). @@ -145,7 +145,7 @@ class QueryExtension(Schema): 'qrv': (5, 3), }) #: Querier's Query Interval Code, as received on the wire; decoded into - #: seconds by :meth:`IGMPv3.read ` + #: seconds by :meth:`IGMPv3.read ` #: per :rfc:`3376#section-4.1.7`. qqic: 'int' = UInt8Field() #: Number of source addresses. @@ -159,7 +159,7 @@ class QueryExtension(Schema): #: list that a received Query may carry and that must be kept (to verify #: the checksum) but not otherwise acted on. Empty for a #: standards-conformant Query, since :meth:`IGMPv3.make - #: ` never writes any. + #: ` never writes any. payload: 'bytes' = PayloadField() if TYPE_CHECKING: @@ -173,17 +173,17 @@ class Query(Schema): """Header schema for an IGMPv3 Membership Query (:rfc:`3376#section-4.1`). The first 8 octets are the same shape IGMPv1/v2 share - (:class:`~pcapkit.protocols.schema.internet.igmp.IGMP`); the extension is + (:class:`~pcapkit.protocols.internet.igmp.schema.IGMP`); the extension is present only on a Query of 12 or more octets overall -- see :func:`query_extension_present`. An 8-octet Query, which this schema unpacks too (with :attr:`ext` :data:`None`), is not actually IGMPv3; - :meth:`IGMPv3.read ` is what + :meth:`IGMPv3.read ` is what refuses it. """ #: Max response code; the raw octet - #: :meth:`IGMPv3.read ` decodes per + #: :meth:`IGMPv3.read ` decodes per #: :rfc:`3376#section-4.1.1`. max_resp_code: 'int' = UInt8Field() #: Checksum. The 16-bit one's complement of the one's complement sum of @@ -211,7 +211,7 @@ def get_payload(self, name: 'Optional[str]' = None) -> 'bytes': Args: name: Unused; kept for signature compatibility with - :meth:`Schema.get_payload `. + :meth:`Schema.get_payload `. Returns: :attr:`ext`'s own payload when :attr:`ext` is not :data:`None` @@ -266,7 +266,7 @@ class Report(Schema): Note: :attr:`records` is first read with the whole remaining length, since the declared count cannot size it in octets (cf. - :class:`~pcapkit.protocols.schema.internet.hip.LocatorSetParameter`). + :class:`~pcapkit.protocols.internet.hip.schema.LocatorSetParameter`). :meth:`post_process` keeps only the first :attr:`num_group_records` records and gives the rest to :attr:`payload`, which is :rfc:`3376#section-4.2.11`'s "Additional Data". Where the data ends @@ -358,7 +358,7 @@ def get_payload(self, name: 'Optional[str]' = None) -> 'bytes': # pylint: disab Args: name: Unused; kept for signature compatibility with - :meth:`Schema.get_payload `. + :meth:`Schema.get_payload `. Returns: Trailing octets of :attr:`body` -- see the class :class:`Note ` diff --git a/pcapkit/protocols/internet/internet.py b/pcapkit/protocols/internet/internet.py index ec8d52607b..9f06d69148 100644 --- a/pcapkit/protocols/internet/internet.py +++ b/pcapkit/protocols/internet/internet.py @@ -6,9 +6,9 @@ .. module:: pcapkit.protocols.internet.internet :mod:`pcapkit.protocols.internet.internet` contains :class:`~pcapkit.protocols.internet.internet.Internet`, -which is a base class for internet layer protocols, e.g. :class:`~pcapkit.protocols.internet.ah.AH`, -:class:`~pcapkit.protocols.internet.ipsec.IPsec`, :class:`~pcapkit.protocols.internet.ipv4.IPv4`, -:class:`~pcapkit.protocols.internet.ipv6.IPv6` and :class:`~pcapkit.protocols.internet.ipx.IPX`. +which is a base class for internet layer protocols, e.g. :class:`~pcapkit.protocols.internet.ah.protocol.AH`, +:class:`~pcapkit.protocols.internet.ipsec.protocol.IPsec`, :class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4`, +:class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6` and :class:`~pcapkit.protocols.internet.ipx.protocol.IPX`. """ import collections @@ -34,7 +34,7 @@ from typing_extensions import Literal, Self from pcapkit.corekit.enum import EnumRegistry - from pcapkit.protocols.data.data import Data + from pcapkit.protocols.data import Data __all__ = ['Internet'] @@ -58,52 +58,52 @@ class Internet(ProtocolBase[_PT, _ST], Generic[_PT, _ST]): # pylint: disable=ab * - Index - Protocol * - :attr:`~pcapkit.const.reg.transtype.TransType.HOPOPT` - - :class:`pcapkit.protocols.internet.hopopt.HOPOPT` + - :class:`pcapkit.protocols.internet.hopopt.protocol.HOPOPT` * - :attr:`~pcapkit.const.reg.transtype.TransType.IPv4` - - :class:`pcapkit.protocols.internet.ipv4.IPv4` + - :class:`pcapkit.protocols.internet.ipv4.protocol.IPv4` * - :attr:`~pcapkit.const.reg.transtype.TransType.ICMP` - - :class:`pcapkit.protocols.internet.icmpv4.ICMPv4` + - :class:`pcapkit.protocols.internet.icmpv4.protocol.ICMPv4` * - :attr:`~pcapkit.const.reg.transtype.TransType.TCP` - - :class:`pcapkit.protocols.transport.tcp.TCP` + - :class:`pcapkit.protocols.transport.tcp.protocol.TCP` * - :attr:`~pcapkit.const.reg.transtype.TransType.UDP` - - :class:`pcapkit.protocols.transport.udp.UDP` + - :class:`pcapkit.protocols.transport.udp.protocol.UDP` * - :attr:`~pcapkit.const.reg.transtype.TransType.DCCP` - - :class:`pcapkit.protocols.transport.dccp.DCCP` + - :class:`pcapkit.protocols.transport.dccp.protocol.DCCP` * - :attr:`~pcapkit.const.reg.transtype.TransType.IPv6` - - :class:`pcapkit.protocols.internet.ipv6.IPv6` + - :class:`pcapkit.protocols.internet.ipv6.protocol.IPv6` * - :attr:`~pcapkit.const.reg.transtype.TransType.IPv6_ICMP` - - :class:`pcapkit.protocols.internet.icmpv6.ICMPv6` + - :class:`pcapkit.protocols.internet.icmpv6.protocol.ICMPv6` * - :attr:`~pcapkit.const.reg.transtype.TransType.IPv6_Route` - - :class:`pcapkit.protocols.internet.ipv6_route.IPv6_Route` + - :class:`pcapkit.protocols.internet.ipv6_route.protocol.IPv6_Route` * - :attr:`~pcapkit.const.reg.transtype.TransType.IPv6_Frag` - - :class:`pcapkit.protocols.internet.ipv6_frag.IPv6_Frag` + - :class:`pcapkit.protocols.internet.ipv6_frag.protocol.IPv6_Frag` * - :attr:`~pcapkit.const.reg.transtype.TransType.GRE` - - :class:`pcapkit.protocols.link.gre.GRE` + - :class:`pcapkit.protocols.link.gre.protocol.GRE` * - :attr:`~pcapkit.const.reg.transtype.TransType.ESP` - - :class:`pcapkit.protocols.internet.esp.ESP` + - :class:`pcapkit.protocols.internet.esp.protocol.ESP` * - :attr:`~pcapkit.const.reg.transtype.TransType.AH` - - :class:`pcapkit.protocols.internet.ah.AH` + - :class:`pcapkit.protocols.internet.ah.protocol.AH` * - :attr:`~pcapkit.const.reg.transtype.TransType.IGMP` - - :class:`pcapkit.protocols.internet.igmp.IGMP`, which dispatches to - :class:`pcapkit.protocols.internet.igmpv1.IGMPv1`, - :class:`pcapkit.protocols.internet.igmpv2.IGMPv2` or - :class:`pcapkit.protocols.internet.igmpv3.IGMPv3` + - :class:`pcapkit.protocols.internet.igmp.protocol.IGMP`, which dispatches to + :class:`pcapkit.protocols.internet.igmpv1.protocol.IGMPv1`, + :class:`pcapkit.protocols.internet.igmpv2.protocol.IGMPv2` or + :class:`pcapkit.protocols.internet.igmpv3.protocol.IGMPv3` * - :attr:`~pcapkit.const.reg.transtype.TransType.IPv6_NoNxt` - - :class:`pcapkit.protocols.misc.raw.Raw` + - :class:`pcapkit.protocols.misc.raw.protocol.Raw` * - :attr:`~pcapkit.const.reg.transtype.TransType.IPv6_Opts` - - :class:`pcapkit.protocols.internet.ipv6_opts.IPv6_Opts` + - :class:`pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts` * - :attr:`~pcapkit.const.reg.transtype.TransType.IPX_in_IP` - - :class:`pcapkit.protocols.internet.ipx.IPX` + - :class:`pcapkit.protocols.internet.ipx.protocol.IPX` * - :attr:`~pcapkit.const.reg.transtype.TransType.Mobility_Header` - - :class:`pcapkit.protocols.internet.mh.MH` + - :class:`pcapkit.protocols.internet.mh.protocol.MH` * - :attr:`~pcapkit.const.reg.transtype.TransType.HIP` - - :class:`pcapkit.protocols.internet.hip.HIP` + - :class:`pcapkit.protocols.internet.hip.protocol.HIP` * - :attr:`~pcapkit.const.reg.transtype.TransType.Shim6` - - :class:`pcapkit.protocols.internet.ipv6_ext.IPv6_Ext` + - :class:`pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext` * - :attr:`~pcapkit.const.reg.transtype.TransType.SCTP` - - :class:`pcapkit.protocols.transport.sctp.SCTP` + - :class:`pcapkit.protocols.transport.sctp.protocol.SCTP` * - :attr:`~pcapkit.const.reg.transtype.TransType.OSPFIGP` - - :class:`pcapkit.protocols.application.ospf.OSPF` + - :class:`pcapkit.protocols.application.ospf.protocol.OSPF` .. versionchanged:: 1.5.0 @@ -124,30 +124,30 @@ class Internet(ProtocolBase[_PT, _ST], Generic[_PT, _ST]): # pylint: disable=ab #: see :meth:`self._decode_next_layer ` #: & :meth:`self._import_next_layer `. __proto__ = collections.defaultdict( - lambda: ModuleDescriptor('pcapkit.protocols.misc.raw', 'Raw'), + lambda: ModuleDescriptor('pcapkit.protocols.misc.raw.protocol', 'Raw'), { - Enum_TransType.HOPOPT: ModuleDescriptor('pcapkit.protocols.internet.hopopt', 'HOPOPT'), - Enum_TransType.IPv4: ModuleDescriptor('pcapkit.protocols.internet.ipv4', 'IPv4'), - Enum_TransType.ICMP: ModuleDescriptor('pcapkit.protocols.internet.icmpv4', 'ICMPv4'), - Enum_TransType.TCP: ModuleDescriptor('pcapkit.protocols.transport.tcp', 'TCP'), - Enum_TransType.UDP: ModuleDescriptor('pcapkit.protocols.transport.udp', 'UDP'), - Enum_TransType.DCCP: ModuleDescriptor('pcapkit.protocols.transport.dccp', 'DCCP'), - Enum_TransType.IPv6: ModuleDescriptor('pcapkit.protocols.internet.ipv6', 'IPv6'), - Enum_TransType.IPv6_ICMP: ModuleDescriptor('pcapkit.protocols.internet.icmpv6', 'ICMPv6'), - Enum_TransType.IPv6_Route: ModuleDescriptor('pcapkit.protocols.internet.ipv6_route', 'IPv6_Route'), - Enum_TransType.IPv6_Frag: ModuleDescriptor('pcapkit.protocols.internet.ipv6_frag', 'IPv6_Frag'), + Enum_TransType.HOPOPT: ModuleDescriptor('pcapkit.protocols.internet.hopopt.protocol', 'HOPOPT'), + Enum_TransType.IPv4: ModuleDescriptor('pcapkit.protocols.internet.ipv4.protocol', 'IPv4'), + Enum_TransType.ICMP: ModuleDescriptor('pcapkit.protocols.internet.icmpv4.protocol', 'ICMPv4'), + Enum_TransType.TCP: ModuleDescriptor('pcapkit.protocols.transport.tcp.protocol', 'TCP'), + Enum_TransType.UDP: ModuleDescriptor('pcapkit.protocols.transport.udp.protocol', 'UDP'), + Enum_TransType.DCCP: ModuleDescriptor('pcapkit.protocols.transport.dccp.protocol', 'DCCP'), + Enum_TransType.IPv6: ModuleDescriptor('pcapkit.protocols.internet.ipv6.protocol', 'IPv6'), + Enum_TransType.IPv6_ICMP: ModuleDescriptor('pcapkit.protocols.internet.icmpv6.protocol', 'ICMPv6'), + Enum_TransType.IPv6_Route: ModuleDescriptor('pcapkit.protocols.internet.ipv6_route.protocol', 'IPv6_Route'), + Enum_TransType.IPv6_Frag: ModuleDescriptor('pcapkit.protocols.internet.ipv6_frag.protocol', 'IPv6_Frag'), # NOTE: a tunnel is placed by its payload, so GRE lives under ``protocols.link``; # see :doc:`/contributing/conventions/protocol-layer-placement`. - Enum_TransType.GRE: ModuleDescriptor('pcapkit.protocols.link.gre', 'GRE'), - Enum_TransType.ESP: ModuleDescriptor('pcapkit.protocols.internet.esp', 'ESP'), - Enum_TransType.AH: ModuleDescriptor('pcapkit.protocols.internet.ah', 'AH'), - Enum_TransType.IGMP: ModuleDescriptor('pcapkit.protocols.internet.igmp', 'IGMP'), - Enum_TransType.IPv6_NoNxt: ModuleDescriptor('pcapkit.protocols.misc.raw', 'Raw'), - Enum_TransType.IPv6_Opts: ModuleDescriptor('pcapkit.protocols.internet.ipv6_opts', 'IPv6_Opts'), - Enum_TransType.IPX_in_IP: ModuleDescriptor('pcapkit.protocols.internet.ipx', 'IPX'), - Enum_TransType.Mobility_Header: ModuleDescriptor('pcapkit.protocols.internet.mh', 'MH'), - Enum_TransType.HIP: ModuleDescriptor('pcapkit.protocols.internet.hip', 'HIP'), - Enum_TransType.SCTP: ModuleDescriptor('pcapkit.protocols.transport.sctp', 'SCTP'), + Enum_TransType.GRE: ModuleDescriptor('pcapkit.protocols.link.gre.protocol', 'GRE'), + Enum_TransType.ESP: ModuleDescriptor('pcapkit.protocols.internet.esp.protocol', 'ESP'), + Enum_TransType.AH: ModuleDescriptor('pcapkit.protocols.internet.ah.protocol', 'AH'), + Enum_TransType.IGMP: ModuleDescriptor('pcapkit.protocols.internet.igmp.protocol', 'IGMP'), + Enum_TransType.IPv6_NoNxt: ModuleDescriptor('pcapkit.protocols.misc.raw.protocol', 'Raw'), + Enum_TransType.IPv6_Opts: ModuleDescriptor('pcapkit.protocols.internet.ipv6_opts.protocol', 'IPv6_Opts'), + Enum_TransType.IPX_in_IP: ModuleDescriptor('pcapkit.protocols.internet.ipx.protocol', 'IPX'), + Enum_TransType.Mobility_Header: ModuleDescriptor('pcapkit.protocols.internet.mh.protocol', 'MH'), + Enum_TransType.HIP: ModuleDescriptor('pcapkit.protocols.internet.hip.protocol', 'HIP'), + Enum_TransType.SCTP: ModuleDescriptor('pcapkit.protocols.transport.sctp.protocol', 'SCTP'), # OSPF rides directly on IP, so IANA protocol number 89 is its only # dispatch point. The dissector nonetheless lives under @@ -156,7 +156,7 @@ class Internet(ProtocolBase[_PT, _ST], Generic[_PT, _ST]): # pylint: disable=ab # than forwarding packets -- the dispatch tier and the subpackage are # deliberately decoupled, see # :doc:`/contributing/conventions/protocol-layer-placement`. - Enum_TransType.OSPFIGP: ModuleDescriptor('pcapkit.protocols.application.ospf', 'OSPF'), + Enum_TransType.OSPFIGP: ModuleDescriptor('pcapkit.protocols.application.ospf.protocol', 'OSPF'), }, ) @@ -168,13 +168,13 @@ class Internet(ProtocolBase[_PT, _ST], Generic[_PT, _ST]): # pylint: disable=ab #: :func:`~pcapkit.foundation.registry.protocols.internet.register_transtype` checks #: its own -- a subclass sharing this registry is therefore checked as #: :class:`Internet` is (:issue:`2268`), while - #: :class:`~pcapkit.protocols.internet.ipx.IPX`, which keeps one of its own, + #: :class:`~pcapkit.protocols.internet.ipx.protocol.IPX`, which keeps one of its own, #: declares its own pairing (:issue:`2511`). __proto_key__: 'ClassVar[tuple[Type[EnumRegistry], bool]]' = (Enum_TransType, False) #: int: How many IPv6 extension headers in a row the next layer follows: #: this layer's place in such a chain, or how many headers - #: :class:`~pcapkit.protocols.internet.ipv6.IPv6` walked, else ``0``, see + #: :class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6` walked, else ``0``, see #: :data:`~pcapkit.utilities.config.EXTENSION_HEADER_LIMIT` and :meth:`_next_exthdr_depth`. _exthdr_depth = 0 @@ -275,7 +275,7 @@ def __post_init__(self, file: 'Optional[IO[bytes] | bytes]' = None, Notes: An IPv6 extension header is handed the rest of the datagram, but parses only itself: its :attr:`info` holds no payload, and - :class:`~pcapkit.protocols.internet.ipv6.IPv6` decodes what follows. + :class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6` decodes what follows. So :attr:`data` is cut down to the header's own :attr:`length`, and ``from_data(info).data`` rebuilds it exactly (:issue:`1446`). @@ -320,9 +320,9 @@ def _next_exthdr_depth(self, proto: 'Optional[int]', extension: 'bool' = False) Arguments: proto: next layer protocol index extension: if the next layer is parsed as an extension header by - :class:`~pcapkit.protocols.internet.ipv6.IPv6`'s walk, which + :class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6`'s walk, which counts the chain itself, see :meth:`IPv6._decode_next_layer - ` + ` Returns: One more than :attr:`_exthdr_depth` if ``proto`` names an IPv6 @@ -352,12 +352,12 @@ def _rebuilt_exthdr_depth(cls) -> 'int': Note: The parse tells an extension header by the protocol number naming it, which a rebuild does not have, so this tells one by its class: - :class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext` is the base + :class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext` is the base of every :class:`Internet` layer :attr:`__proto__` registers under such a number. """ - from pcapkit.protocols.internet.ipv6_ext import IPv6_Ext # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.internet.ipv6_ext.protocol import IPv6_Ext # isort: skip # pylint: disable=import-outside-toplevel return _exthdr_rebuilt.get() if issubclass(cls, IPv6_Ext) else 0 @classmethod @@ -400,8 +400,8 @@ def _next_layer_class(self, proto: 'Optional[int]', file_: 'bytes', length: 'int extension: if is extension header, see :meth:`_next_exthdr_depth` Returns: - :class:`~pcapkit.protocols.misc.no_payload.NoPayload` if there is - nothing to parse; :class:`~pcapkit.protocols.misc.raw.Raw` if the + :class:`~pcapkit.protocols.misc.no_payload.protocol.NoPayload` if there is + nothing to parse; :class:`~pcapkit.protocols.misc.raw.protocol.Raw` if the parse stops at this layer, or the next layer is an IPv6 extension header past :data:`~pcapkit.utilities.config.EXTENSION_HEADER_LIMIT` in a row; otherwise the class registered for ``proto``. Paired with it, the keywords that @@ -416,16 +416,16 @@ class registered for ``proto``. Paired with it, the keywords that """ if min(length, len(file_)) == 0: - from pcapkit.protocols.misc.no_payload import NoPayload # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.misc.no_payload.protocol import NoPayload # isort: skip # pylint: disable=import-outside-toplevel return NoPayload, {} if self._sigterm: - from pcapkit.protocols.misc.raw import Raw # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.misc.raw.protocol import Raw # isort: skip # pylint: disable=import-outside-toplevel return Raw, {} depth = self._next_exthdr_depth(proto, extension) limit = config.EXTENSION_HEADER_LIMIT if limit != -1 and depth > limit: - from pcapkit.protocols.misc.raw import Raw # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.misc.raw.protocol import Raw # isort: skip # pylint: disable=import-outside-toplevel message = (f'{self.alias}: a chain of IPv6 extension headers reached the limit of ' f'{limit} headers; the rest of the packet, from Next ' @@ -437,7 +437,7 @@ class registered for ``proto``. Paired with it, the keywords that warn(message, ProtocolWarning, stacklevel=stacklevel()) return Raw, {'error': message} - from pcapkit.protocols.internet.igmp import IGMP as IGMPBase # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.internet.igmp.protocol import IGMP as IGMPBase # isort: skip # pylint: disable=import-outside-toplevel protocol = self._lookup_next_layer(self.__proto__, cast('int', proto)) if protocol is IGMPBase: @@ -460,7 +460,7 @@ def _decode_next_layer(self, dict_: '_PT', proto: 'Optional[int]' = None, # pyl version: IP version ipv6_exthdr: protocol chain of IPv6 extension headers payload: payload from packet. If not provided, will extract from - :meth:`self.__header__.get_payload ` + :meth:`self.__header__.get_payload ` declared: whether this layer declares the length of its payload Returns: @@ -525,7 +525,7 @@ def _import_next_layer(self, proto: 'int', length: 'Optional[int]' = None, *, # version: IP protocol version extension: if is extension header payload: payload from packet. If not provided, will extract from - :meth:`self.__header__.get_payload ` + :meth:`self.__header__.get_payload ` Returns: Instance of next layer. @@ -533,7 +533,7 @@ def _import_next_layer(self, proto: 'int', length: 'Optional[int]' = None, *, # Notes: An IPv6 extension header past :data:`~pcapkit.utilities.config.EXTENSION_HEADER_LIMIT` in a row is not dissected: it and the rest of the packet are kept as - :class:`~pcapkit.protocols.misc.raw.Raw`, with one + :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, with one :exc:`~pcapkit.utilities.warnings.ProtocolWarning` (:issue:`1604`). Each header dissects the next one from here, so the chain's depth is handed to the next layer, see :meth:`_next_layer_class`. diff --git a/pcapkit/protocols/internet/ip/__init__.py b/pcapkit/protocols/internet/ip/__init__.py new file mode 100644 index 0000000000..8b061a0ca9 --- /dev/null +++ b/pcapkit/protocols/internet/ip/__init__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +"""IP - Internet Protocol +============================ + +.. module:: pcapkit.protocols.internet.ip + +:mod:`pcapkit.protocols.internet.ip` holds the dissector, +:class:`~pcapkit.protocols.internet.ip.protocol.IP`, in +:mod:`~pcapkit.protocols.internet.ip.protocol`. + +""" +from pcapkit.protocols.internet.ip.protocol import IP + +__all__ = ['IP'] diff --git a/pcapkit/protocols/internet/ip.py b/pcapkit/protocols/internet/ip/protocol.py similarity index 83% rename from pcapkit/protocols/internet/ip.py rename to pcapkit/protocols/internet/ip/protocol.py index 712efd06a8..64e2903a85 100644 --- a/pcapkit/protocols/internet/ip.py +++ b/pcapkit/protocols/internet/ip/protocol.py @@ -2,23 +2,23 @@ """IP - Internet Protocol ============================ -.. module:: pcapkit.protocols.internet.ip +.. module:: pcapkit.protocols.internet.ip.protocol -:mod:`pcapkit.protocols.internet.ip` contains -:class:`~pcapkit.protocols.internet.ip.IP` only, +:mod:`pcapkit.protocols.internet.ip.protocol` contains +:class:`~pcapkit.protocols.internet.ip.protocol.IP` only, which is a base class for Internet Protocol (IP) protocol family [*]_, e.g. -:class:`~pcapkit.protocols.internet.ipv4.IPv4` and -:class:`~pcapkit.protocols.internet.ipv6.IPv6`. +:class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4` and +:class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6`. .. [*] https://en.wikipedia.org/wiki/Internet_Protocol .. versionchanged:: 1.6.0 - Constructing :class:`~pcapkit.protocols.internet.ip.IP` and its - :meth:`~pcapkit.protocols.internet.ip.IP.from_data` give - :class:`~pcapkit.protocols.internet.ipv4.IPv4` or - :class:`~pcapkit.protocols.internet.ipv6.IPv6`, where they raised + Constructing :class:`~pcapkit.protocols.internet.ip.protocol.IP` and its + :meth:`~pcapkit.protocols.internet.ip.protocol.IP.from_data` give + :class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4` or + :class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6`, where they raised :exc:`TypeError`. The ``version`` keyword names the member; without it, octets give the one their Version field names, and fields are refused (:issue:`2574`). @@ -41,12 +41,12 @@ class IP(Internet[_PT, _ST], Generic[_PT, _ST]): # pylint: disable=abstract-method """Base class for the IP protocol family. - - Internet Protocol version 4 (:class:`~pcapkit.protocols.internet.ipv4.IPv4`) [:rfc:`791`] - - Internet Protocol version 6 (:class:`~pcapkit.protocols.internet.ipv6.IPv6`) [:rfc:`8200`] + - Internet Protocol version 4 (:class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4`) [:rfc:`791`] + - Internet Protocol version 6 (:class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6`) [:rfc:`8200`] - The IPsec protocols (:class:`~pcapkit.protocols.internet.ah.AH` and - :class:`~pcapkit.protocols.internet.esp.ESP`) derive from - :class:`~pcapkit.protocols.internet.ipsec.IPsec` instead. + The IPsec protocols (:class:`~pcapkit.protocols.internet.ah.protocol.AH` and + :class:`~pcapkit.protocols.internet.esp.protocol.ESP`) derive from + :class:`~pcapkit.protocols.internet.ipsec.protocol.IPsec` instead. It dispatches on both paths, never giving an instance of this class (:issue:`2574`). ``version`` names the member; without it, octets give the @@ -123,8 +123,8 @@ def __init__(self, file: 'Optional[IO[bytes] | bytes]' = None, if version is not None: kwargs['version'] = version elif version is not None and not isinstance(self, self._member_of_version(version)): - from pcapkit.protocols.internet.ipv4 import IPv4 # isort: skip # pylint: disable=import-outside-toplevel - from pcapkit.protocols.internet.ipv6 import IPv6 # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.internet.ipv4.protocol import IPv4 # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.internet.ipv6.protocol import IPv6 # isort: skip # pylint: disable=import-outside-toplevel if not isinstance(self, (IPv4, IPv6)): raise ProtocolError(f'{type(self).__name__}: no version of its own to match ' @@ -186,16 +186,16 @@ def _member_of_version(version: 'Any') -> 'Type[IP]': version: Version of IP. Returns: - :class:`~pcapkit.protocols.internet.ipv4.IPv4` or - :class:`~pcapkit.protocols.internet.ipv6.IPv6`. + :class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4` or + :class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6`. Raises: ProtocolError: If ``version`` is neither, or is no :obj:`int`: a :obj:`bool` or a :obj:`float` is refused even where it equals one. """ - from pcapkit.protocols.internet.ipv4 import IPv4 # isort: skip # pylint: disable=import-outside-toplevel - from pcapkit.protocols.internet.ipv6 import IPv6 # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.internet.ipv4.protocol import IPv4 # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.internet.ipv6.protocol import IPv6 # isort: skip # pylint: disable=import-outside-toplevel if isinstance(version, int) and not isinstance(version, bool): if version == 4: diff --git a/pcapkit/protocols/internet/ipsec/__init__.py b/pcapkit/protocols/internet/ipsec/__init__.py new file mode 100644 index 0000000000..4cd82740a2 --- /dev/null +++ b/pcapkit/protocols/internet/ipsec/__init__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +"""IPsec - Internet Protocol Security +======================================== + +.. module:: pcapkit.protocols.internet.ipsec + +:mod:`pcapkit.protocols.internet.ipsec` holds the dissector, +:class:`~pcapkit.protocols.internet.ipsec.protocol.IPsec`, in +:mod:`~pcapkit.protocols.internet.ipsec.protocol`. + +""" +from pcapkit.protocols.internet.ipsec.protocol import IPsec + +__all__ = ['IPsec'] diff --git a/pcapkit/protocols/internet/ipsec.py b/pcapkit/protocols/internet/ipsec/protocol.py similarity index 76% rename from pcapkit/protocols/internet/ipsec.py rename to pcapkit/protocols/internet/ipsec/protocol.py index aa80d77148..5275f69b5b 100644 --- a/pcapkit/protocols/internet/ipsec.py +++ b/pcapkit/protocols/internet/ipsec/protocol.py @@ -2,14 +2,14 @@ """IPsec - Internet Protocol Security ======================================== -.. module:: pcapkit.protocols.internet.ipsec +.. module:: pcapkit.protocols.internet.ipsec.protocol -:mod:`pcapkit.protocols.internet.ipsec` contains -:class:`~pcapkit.protocols.internet.ipsec.IPsec` +:mod:`pcapkit.protocols.internet.ipsec.protocol` contains +:class:`~pcapkit.protocols.internet.ipsec.protocol.IPsec` only, which is a base class for Internet Protocol Security (IPsec) protocol family [*]_, e.g. -:class:`~pcapkit.protocols.internet.ah.AH` and -:class:`~pcapkit.protocols.internet.esp.ESP`. +:class:`~pcapkit.protocols.internet.ah.protocol.AH` and +:class:`~pcapkit.protocols.internet.esp.protocol.ESP`. .. [*] https://en.wikipedia.org/wiki/IPsec @@ -28,8 +28,8 @@ class IPsec(Internet[_PT, _ST], Generic[_PT, _ST]): # pylint: disable=abstract-method """Abstract base class for IPsec protocol family. - - Authentication Header (:class:`~pcapkit.protocols.internet.ah.AH`) [:rfc:`4302`] - - Encapsulating Security Payload (:class:`~pcapkit.protocols.internet.esp.ESP`) [:rfc:`4303`] + - Authentication Header (:class:`~pcapkit.protocols.internet.ah.protocol.AH`) [:rfc:`4302`] + - Encapsulating Security Payload (:class:`~pcapkit.protocols.internet.esp.protocol.ESP`) [:rfc:`4303`] """ diff --git a/pcapkit/protocols/internet/ipv4/__init__.py b/pcapkit/protocols/internet/ipv4/__init__.py new file mode 100644 index 0000000000..0b331f9c71 --- /dev/null +++ b/pcapkit/protocols/internet/ipv4/__init__.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""IPv4 - Internet Protocol version 4 +======================================== + +.. module:: pcapkit.protocols.internet.ipv4 + +:mod:`pcapkit.protocols.internet.ipv4` holds the dissector, +:class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4`, in +:mod:`~pcapkit.protocols.internet.ipv4.protocol`, its header schema in +:mod:`~pcapkit.protocols.internet.ipv4.schema` and its data model in +:mod:`~pcapkit.protocols.internet.ipv4.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.internet.ipv4.protocol import IPv4 + +# Header Schemas +from pcapkit.protocols.internet.ipv4.schema import EOOLOption as Schema_EOOLOption +from pcapkit.protocols.internet.ipv4.schema import ESECOption as Schema_ESECOption +from pcapkit.protocols.internet.ipv4.schema import IPv4 as Schema_IPv4 +from pcapkit.protocols.internet.ipv4.schema import LSROption as Schema_LSROption +from pcapkit.protocols.internet.ipv4.schema import MTUPOption as Schema_MTUPOption +from pcapkit.protocols.internet.ipv4.schema import MTUROption as Schema_MTUROption +from pcapkit.protocols.internet.ipv4.schema import NOPOption as Schema_NOPOption +from pcapkit.protocols.internet.ipv4.schema import Option as Schema_Option +from pcapkit.protocols.internet.ipv4.schema import QSOption as Schema_QSOption +from pcapkit.protocols.internet.ipv4.schema import \ + QuickStartReportOption as Schema_QuickStartReportOption +from pcapkit.protocols.internet.ipv4.schema import \ + QuickStartRequestOption as Schema_QuickStartRequestOption +from pcapkit.protocols.internet.ipv4.schema import RROption as Schema_RROption +from pcapkit.protocols.internet.ipv4.schema import RTRALTOption as Schema_RTRALTOption +from pcapkit.protocols.internet.ipv4.schema import SECOption as Schema_SECOption +from pcapkit.protocols.internet.ipv4.schema import SIDOption as Schema_SIDOption +from pcapkit.protocols.internet.ipv4.schema import SSROption as Schema_SSROption +from pcapkit.protocols.internet.ipv4.schema import TROption as Schema_TROption +from pcapkit.protocols.internet.ipv4.schema import TSOption as Schema_TSOption +from pcapkit.protocols.internet.ipv4.schema import UnassignedOption as Schema_UnassignedOption + +# Data Models +from pcapkit.protocols.internet.ipv4.data import EOOLOption as Data_EOOLOption +from pcapkit.protocols.internet.ipv4.data import ESECOption as Data_ESECOption +from pcapkit.protocols.internet.ipv4.data import Flags as Data_Flags +from pcapkit.protocols.internet.ipv4.data import IPv4 as Data_IPv4 +from pcapkit.protocols.internet.ipv4.data import LSROption as Data_LSROption +from pcapkit.protocols.internet.ipv4.data import MTUPOption as Data_MTUPOption +from pcapkit.protocols.internet.ipv4.data import MTUROption as Data_MTUROption +from pcapkit.protocols.internet.ipv4.data import NOPOption as Data_NOPOption +from pcapkit.protocols.internet.ipv4.data import Option as Data_Option +from pcapkit.protocols.internet.ipv4.data import OptionType as Data_OptionType +from pcapkit.protocols.internet.ipv4.data import QSOption as Data_QSOption +from pcapkit.protocols.internet.ipv4.data import \ + QuickStartReportOption as Data_QuickStartReportOption +from pcapkit.protocols.internet.ipv4.data import \ + QuickStartRequestOption as Data_QuickStartRequestOption +from pcapkit.protocols.internet.ipv4.data import RROption as Data_RROption +from pcapkit.protocols.internet.ipv4.data import RTRALTOption as Data_RTRALTOption +from pcapkit.protocols.internet.ipv4.data import SECOption as Data_SECOption +from pcapkit.protocols.internet.ipv4.data import SIDOption as Data_SIDOption +from pcapkit.protocols.internet.ipv4.data import SSROption as Data_SSROption +from pcapkit.protocols.internet.ipv4.data import ToSField as Data_ToSField +from pcapkit.protocols.internet.ipv4.data import TROption as Data_TROption +from pcapkit.protocols.internet.ipv4.data import TSOption as Data_TSOption +from pcapkit.protocols.internet.ipv4.data import UnassignedOption as Data_UnassignedOption + +__all__ = ['IPv4'] diff --git a/pcapkit/protocols/data/internet/ipv4.py b/pcapkit/protocols/internet/ipv4/data.py similarity index 99% rename from pcapkit/protocols/data/internet/ipv4.py rename to pcapkit/protocols/internet/ipv4/data.py index 6c18fa6f28..e902ef9902 100644 --- a/pcapkit/protocols/data/internet/ipv4.py +++ b/pcapkit/protocols/internet/ipv4/data.py @@ -6,8 +6,7 @@ from pcapkit.const.ipv4.option_class import OptionClass from pcapkit.const.ipv4.tos_del import ToSDelay from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.data import Data -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Data, Protocol if TYPE_CHECKING: from datetime import timedelta diff --git a/pcapkit/protocols/internet/ipv4.py b/pcapkit/protocols/internet/ipv4/protocol.py similarity index 94% rename from pcapkit/protocols/internet/ipv4.py rename to pcapkit/protocols/internet/ipv4/protocol.py index a6c455548a..a02a247d8a 100644 --- a/pcapkit/protocols/internet/ipv4.py +++ b/pcapkit/protocols/internet/ipv4/protocol.py @@ -2,10 +2,10 @@ """IPv4 - Internet Protocol version 4 ======================================== -.. module:: pcapkit.protocols.internet.ipv4 +.. module:: pcapkit.protocols.internet.ipv4.protocol -:mod:`pcapkit.protocols.internet.ipv4` contains -:class:`~pcapkit.protocols.internet.ipv4.IPv4` only, +:mod:`pcapkit.protocols.internet.ipv4.protocol` contains +:class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4` only, which implements the extractor for Internet Protocol version 4 (IPv4) [*]_, whose structure is described as below: @@ -59,52 +59,52 @@ from pcapkit.corekit.multidict import OrderedMultiDict from pcapkit.corekit.schema.ipaddress import parse_ip_address from pcapkit.corekit.schema.padding import pad_length -from pcapkit.protocols.data.internet.ipv4 import EOOLOption as Data_EOOLOption -from pcapkit.protocols.data.internet.ipv4 import ESECOption as Data_ESECOption -from pcapkit.protocols.data.internet.ipv4 import Flags as Data_Flags -from pcapkit.protocols.data.internet.ipv4 import IPv4 as Data_IPv4 -from pcapkit.protocols.data.internet.ipv4 import LSROption as Data_LSROption -from pcapkit.protocols.data.internet.ipv4 import MTUPOption as Data_MTUPOption -from pcapkit.protocols.data.internet.ipv4 import MTUROption as Data_MTUROption -from pcapkit.protocols.data.internet.ipv4 import NOPOption as Data_NOPOption -from pcapkit.protocols.data.internet.ipv4 import OptionType as Data_OptionType -from pcapkit.protocols.data.internet.ipv4 import QSOption as Data_QSOption -from pcapkit.protocols.data.internet.ipv4 import \ +from pcapkit.protocols.internet.ip.protocol import IP +from pcapkit.protocols.internet.ipv4.data import EOOLOption as Data_EOOLOption +from pcapkit.protocols.internet.ipv4.data import ESECOption as Data_ESECOption +from pcapkit.protocols.internet.ipv4.data import Flags as Data_Flags +from pcapkit.protocols.internet.ipv4.data import IPv4 as Data_IPv4 +from pcapkit.protocols.internet.ipv4.data import LSROption as Data_LSROption +from pcapkit.protocols.internet.ipv4.data import MTUPOption as Data_MTUPOption +from pcapkit.protocols.internet.ipv4.data import MTUROption as Data_MTUROption +from pcapkit.protocols.internet.ipv4.data import NOPOption as Data_NOPOption +from pcapkit.protocols.internet.ipv4.data import OptionType as Data_OptionType +from pcapkit.protocols.internet.ipv4.data import QSOption as Data_QSOption +from pcapkit.protocols.internet.ipv4.data import \ QuickStartReportOption as Data_QuickStartReportOption -from pcapkit.protocols.data.internet.ipv4 import \ +from pcapkit.protocols.internet.ipv4.data import \ QuickStartRequestOption as Data_QuickStartRequestOption -from pcapkit.protocols.data.internet.ipv4 import RROption as Data_RROption -from pcapkit.protocols.data.internet.ipv4 import RTRALTOption as Data_RTRALTOption -from pcapkit.protocols.data.internet.ipv4 import SECOption as Data_SECOption -from pcapkit.protocols.data.internet.ipv4 import SIDOption as Data_SIDOption -from pcapkit.protocols.data.internet.ipv4 import SSROption as Data_SSROption -from pcapkit.protocols.data.internet.ipv4 import ToSField as Data_ToSField -from pcapkit.protocols.data.internet.ipv4 import TROption as Data_TROption -from pcapkit.protocols.data.internet.ipv4 import TSOption as Data_TSOption -from pcapkit.protocols.data.internet.ipv4 import UnassignedOption as Data_UnassignedOption -from pcapkit.protocols.internet.ip import IP -from pcapkit.protocols.schema.internet.ipv4 import IPV4_HEADER_LEN -from pcapkit.protocols.schema.internet.ipv4 import EOOLOption as Schema_EOOLOption -from pcapkit.protocols.schema.internet.ipv4 import ESECOption as Schema_ESECOption -from pcapkit.protocols.schema.internet.ipv4 import IPv4 as Schema_IPv4 -from pcapkit.protocols.schema.internet.ipv4 import LSROption as Schema_LSROption -from pcapkit.protocols.schema.internet.ipv4 import MTUPOption as Schema_MTUPOption -from pcapkit.protocols.schema.internet.ipv4 import MTUROption as Schema_MTUROption -from pcapkit.protocols.schema.internet.ipv4 import NOPOption as Schema_NOPOption -from pcapkit.protocols.schema.internet.ipv4 import QSOption as Schema_QSOption -from pcapkit.protocols.schema.internet.ipv4 import \ +from pcapkit.protocols.internet.ipv4.data import RROption as Data_RROption +from pcapkit.protocols.internet.ipv4.data import RTRALTOption as Data_RTRALTOption +from pcapkit.protocols.internet.ipv4.data import SECOption as Data_SECOption +from pcapkit.protocols.internet.ipv4.data import SIDOption as Data_SIDOption +from pcapkit.protocols.internet.ipv4.data import SSROption as Data_SSROption +from pcapkit.protocols.internet.ipv4.data import ToSField as Data_ToSField +from pcapkit.protocols.internet.ipv4.data import TROption as Data_TROption +from pcapkit.protocols.internet.ipv4.data import TSOption as Data_TSOption +from pcapkit.protocols.internet.ipv4.data import UnassignedOption as Data_UnassignedOption +from pcapkit.protocols.internet.ipv4.schema import IPV4_HEADER_LEN +from pcapkit.protocols.internet.ipv4.schema import EOOLOption as Schema_EOOLOption +from pcapkit.protocols.internet.ipv4.schema import ESECOption as Schema_ESECOption +from pcapkit.protocols.internet.ipv4.schema import IPv4 as Schema_IPv4 +from pcapkit.protocols.internet.ipv4.schema import LSROption as Schema_LSROption +from pcapkit.protocols.internet.ipv4.schema import MTUPOption as Schema_MTUPOption +from pcapkit.protocols.internet.ipv4.schema import MTUROption as Schema_MTUROption +from pcapkit.protocols.internet.ipv4.schema import NOPOption as Schema_NOPOption +from pcapkit.protocols.internet.ipv4.schema import QSOption as Schema_QSOption +from pcapkit.protocols.internet.ipv4.schema import \ QuickStartReportOption as Schema_QuickStartReportOption -from pcapkit.protocols.schema.internet.ipv4 import \ +from pcapkit.protocols.internet.ipv4.schema import \ QuickStartRequestOption as Schema_QuickStartRequestOption -from pcapkit.protocols.schema.internet.ipv4 import RROption as Schema_RROption -from pcapkit.protocols.schema.internet.ipv4 import RTRALTOption as Schema_RTRALTOption -from pcapkit.protocols.schema.internet.ipv4 import SECOption as Schema_SECOption -from pcapkit.protocols.schema.internet.ipv4 import SIDOption as Schema_SIDOption -from pcapkit.protocols.schema.internet.ipv4 import SSROption as Schema_SSROption -from pcapkit.protocols.schema.internet.ipv4 import TROption as Schema_TROption -from pcapkit.protocols.schema.internet.ipv4 import TSOption as Schema_TSOption -from pcapkit.protocols.schema.internet.ipv4 import UnassignedOption as Schema_UnassignedOption -from pcapkit.protocols.schema.schema import Schema +from pcapkit.protocols.internet.ipv4.schema import RROption as Schema_RROption +from pcapkit.protocols.internet.ipv4.schema import RTRALTOption as Schema_RTRALTOption +from pcapkit.protocols.internet.ipv4.schema import SECOption as Schema_SECOption +from pcapkit.protocols.internet.ipv4.schema import SIDOption as Schema_SIDOption +from pcapkit.protocols.internet.ipv4.schema import SSROption as Schema_SSROption +from pcapkit.protocols.internet.ipv4.schema import TROption as Schema_TROption +from pcapkit.protocols.internet.ipv4.schema import TSOption as Schema_TSOption +from pcapkit.protocols.internet.ipv4.schema import UnassignedOption as Schema_UnassignedOption +from pcapkit.protocols.schema import Schema from pcapkit.utilities import config from pcapkit.utilities.contextvars import rebuilding from pcapkit.utilities.exceptions import ProtocolError @@ -118,9 +118,9 @@ from mypy_extensions import DefaultArg, KwArg, NamedArg from typing_extensions import Literal - from pcapkit.protocols.data.internet.ipv4 import Option as Data_Option + from pcapkit.protocols.internet.ipv4.data import Option as Data_Option + from pcapkit.protocols.internet.ipv4.schema import Option as Schema_Option from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.internet.ipv4 import Option as Schema_Option Option = OrderedMultiDict[Enum_OptionNumber, Data_Option] OptionParser = Callable[[Schema_Option, NamedArg(Option, 'options')], Data_Option] @@ -135,7 +135,7 @@ class IPv4(IP[Data_IPv4, Schema_IPv4], """This class implements Internet Protocol version 4. This class parses the following IPv4 options, which are registered in the - :attr:`self.__option__ ` + :attr:`self.__option__ ` attribute: .. list-table:: @@ -145,47 +145,47 @@ class IPv4(IP[Data_IPv4, Schema_IPv4], - Option Parser - Option Constructor * - :attr:`~pcapkit.const.ipv4.option_number.OptionNumber.EOOL` - - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._read_opt_eool` - - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._make_opt_eool` + - :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._read_opt_eool` + - :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._make_opt_eool` * - :attr:`~pcapkit.const.ipv4.option_number.OptionNumber.NOP` - - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._read_opt_nop` - - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._make_opt_nop` + - :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._read_opt_nop` + - :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._make_opt_nop` * - :attr:`~pcapkit.const.ipv4.option_number.OptionNumber.SEC` - - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._read_opt_sec` - - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._make_opt_sec` + - :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._read_opt_sec` + - :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._make_opt_sec` * - :attr:`~pcapkit.const.ipv4.option_number.OptionNumber.LSR` - - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._read_opt_lsr` - - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._make_opt_lsr` + - :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._read_opt_lsr` + - :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._make_opt_lsr` * - :attr:`~pcapkit.const.ipv4.option_number.OptionNumber.TS` - - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._read_opt_ts` - - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._make_opt_ts` + - :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._read_opt_ts` + - :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._make_opt_ts` * - :attr:`~pcapkit.const.ipv4.option_number.OptionNumber.E_SEC` - - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._read_opt_e_sec` - - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._make_opt_e_sec` + - :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._read_opt_e_sec` + - :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._make_opt_e_sec` * - :attr:`~pcapkit.const.ipv4.option_number.OptionNumber.RR` - - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._read_opt_rr` - - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._make_opt_rr` + - :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._read_opt_rr` + - :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._make_opt_rr` * - :attr:`~pcapkit.const.ipv4.option_number.OptionNumber.SID` - - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._read_opt_sid` - - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._make_opt_sid` + - :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._read_opt_sid` + - :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._make_opt_sid` * - :attr:`~pcapkit.const.ipv4.option_number.OptionNumber.SSR` - - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._read_opt_ssr` - - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._make_opt_ssr` + - :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._read_opt_ssr` + - :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._make_opt_ssr` * - :attr:`~pcapkit.const.ipv4.option_number.OptionNumber.MTUP` - - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._read_opt_mtup` - - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._make_opt_mtup` + - :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._read_opt_mtup` + - :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._make_opt_mtup` * - :attr:`~pcapkit.const.ipv4.option_number.OptionNumber.MTUR` - - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._read_opt_mtur` - - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._make_opt_mtur` + - :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._read_opt_mtur` + - :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._make_opt_mtur` * - :attr:`~pcapkit.const.ipv4.option_number.OptionNumber.TR` - - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._read_opt_tr` - - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._make_opt_tr` + - :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._read_opt_tr` + - :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._make_opt_tr` * - :attr:`~pcapkit.const.ipv4.option_number.OptionNumber.RTRALT` - - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._read_opt_rtralt` - - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._make_opt_rtralt` + - :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._read_opt_rtralt` + - :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._make_opt_rtralt` * - :attr:`~pcapkit.const.ipv4.option_number.OptionNumber.QS` - - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._read_opt_qs` - - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._make_opt_qs` + - :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._read_opt_qs` + - :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._make_opt_qs` .. versionchanged:: 1.5.0 @@ -197,7 +197,7 @@ class IPv4(IP[Data_IPv4, Schema_IPv4], :meth:`~pcapkit.protocols.internet.internet.Internet.from_data` keeps the Total Length a truncated capture declares (:issue:`1155`), and the octets past it as - :attr:`~pcapkit.protocols.schema.internet.ipv4.IPv4.trailer` + :attr:`~pcapkit.protocols.internet.ipv4.schema.IPv4.trailer` (:issue:`1209`). * A header length declared past the data raises :exc:`~pcapkit.utilities.exceptions.ProtocolError` on read @@ -461,7 +461,7 @@ def read(self, length: 'Optional[int]' = None, *, # pylint: disable=unused-argu # starts with no upper-layer header (:rfc:`791#section-3.2`), though # ``protocol`` above still names the one the first fragment carries. No # code is dispatched on, so the registry's fallback leaves the octets as - # :class:`~pcapkit.protocols.misc.raw.Raw` with no protocol to alias it + # :class:`~pcapkit.protocols.misc.raw.protocol.Raw` with no protocol to alias it # as, and ``'UDP' in frame`` does not hold of a slice of UDP payload # (#1553). Reassembly takes ``packet.payload``, the octets as # captured, which this leaves as they were. @@ -617,7 +617,7 @@ def make(self, # pseudo-header, unless a fragment, whose checksum covers the datagram (#2471). if (config.CHECKSUM_COMPUTE and getattr(payload, '_checksum_pending', False) and cast('ProtocolBase', payload).__index__() == proto and not (offset or mf)): - from pcapkit.protocols.misc.checksum.ip_pseudo import IP_Pseudo # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.misc.checksum.ip_pseudo.protocol import IP_Pseudo # isort: skip # pylint: disable=import-outside-toplevel # NOTE: The header is parsed back for a source route's destination, # quietly, as this layer parses it again (cf. rebuilding). @@ -717,7 +717,7 @@ def __post_init__(self, file: 'Optional[IO[bytes] | bytes]' = None, Once parsed, the checksum of the upper layer is verified over this layer's pseudo-header if :data:`~pcapkit.utilities.config.CHECKSUM_VERIFY` - is on, see :func:`~pcapkit.protocols.misc.checksum.ip_pseudo.verify_upper`. + is on, see :func:`~pcapkit.protocols.misc.checksum.ip_pseudo.protocol.verify_upper`. Args: file: Source packet stream. @@ -730,7 +730,7 @@ def __post_init__(self, file: 'Optional[IO[bytes] | bytes]' = None, """ super().__post_init__(file, length, **kwargs) if config.CHECKSUM_VERIFY: - from pcapkit.protocols.misc.checksum.ip_pseudo import verify_upper # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.misc.checksum.ip_pseudo.protocol import verify_upper # isort: skip # pylint: disable=import-outside-toplevel verify_upper(self) ########################################################################## @@ -751,7 +751,7 @@ def _make_data(cls, data: 'Data_IPv4') -> 'dict[str, Any]': # type: ignore[over # NOTE: ``make`` takes ``offset`` in on-wire 8-octet units, while # ``data.offset`` is in octets (see :meth:`read`), so scale back down to # keep the data-to-schema round trip exact, mirroring - # :meth:`pcapkit.protocols.internet.ipv6_frag.IPv6_Frag._make_data`. + # :meth:`pcapkit.protocols.internet.ipv6_frag.protocol.IPv6_Frag._make_data`. return { 'tos_pre': data.tos.pre, 'tos_del': data.tos['del'], @@ -1550,8 +1550,8 @@ def _read_opt_qs(self, schema: 'Schema_QSOption', *, options: 'Option') -> 'Data it is parsed as one, see :meth:`_read_opt_unassigned`. That dispatch is by the schema's own class, decided from the octets a file read hands it; a - :class:`~pcapkit.protocols.schema.internet.ipv4.QuickStartRequestOption` - or :class:`~pcapkit.protocols.schema.internet.ipv4.QuickStartReportOption` + :class:`~pcapkit.protocols.internet.ipv4.schema.QuickStartRequestOption` + or :class:`~pcapkit.protocols.internet.ipv4.schema.QuickStartReportOption` built directly with an unassigned ``func`` reaches this method regardless, which is why it still raises below rather than returning early. @@ -1935,10 +1935,10 @@ def _make_opt_ts(self, kind: 'Enum_OptionNumber', option: 'Optional[Data_TSOptio ts_list += [0] * (slots - len(ts_list)) # NOTE: ``ts_data`` is the field on - # :class:`~pcapkit.protocols.schema.internet.ipv4.TSOption`; ``data`` is + # :class:`~pcapkit.protocols.internet.ipv4.schema.TSOption`; ``data`` is # the attribute its ``post_process`` *derives* from ``ts_data``. Passing # ``data`` would drop every timestamp, since :meth:`Schema.__update__ - # ` only warns + # ` only warns # ``UnknownFieldWarning`` for an unknown name, leaving ``ts_data`` bound # to its class-level ``ListField`` for ``post_process`` to iterate. return Schema_TSOption( diff --git a/pcapkit/protocols/schema/internet/ipv4.py b/pcapkit/protocols/internet/ipv4/schema.py similarity index 96% rename from pcapkit/protocols/schema/internet/ipv4.py rename to pcapkit/protocols/internet/ipv4/schema.py index 93b8f3c89d..1bd30b82f3 100644 --- a/pcapkit/protocols/schema/internet/ipv4.py +++ b/pcapkit/protocols/internet/ipv4/schema.py @@ -20,7 +20,7 @@ from pcapkit.corekit.fields.strings import BitField, BytesField, PaddingField from pcapkit.corekit.multidict import OrderedMultiDict from pcapkit.corekit.schema.ipaddress import parse_ip_address -from pcapkit.protocols.schema.schema import EnumSchema, Schema, schema_final +from pcapkit.protocols.schema import EnumSchema, Schema, schema_final from pcapkit.utilities.exceptions import EnumValueError, FieldValueError from pcapkit.utilities.logging import SPHINX_TYPE_CHECKING from pcapkit.utilities.warnings import ProtocolWarning, warn @@ -132,12 +132,12 @@ def quick_start_option_length(schema: 'Type[QSOption]') -> 'int': are: *"The second byte contains the length field, indicating an option length of eight bytes"*, and *"For a Report of Approved Rate, the fourth byte of the Quick-Start Option is not used"*. And - :meth:`~pcapkit.protocols.internet.ipv4.IPv4._read_opt_qs` rejects any other + :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._read_opt_qs` rejects any other value in the ``length`` field outright. It is summed from the resolved schema's own fields rather than written as that literal, because the registry is open -- :class:`QSOption` is an - :class:`~pcapkit.protocols.schema.schema.EnumSchema`, so a caller may + :class:`~pcapkit.protocols.schema.EnumSchema`, so a caller may register a further function code with a schema of its own width -- and a number written here would have to be kept in step by hand with every field the suboptions declare. @@ -162,8 +162,8 @@ def quick_start_option_length(schema: 'Type[QSOption]') -> 'int': for name, field in schema.__fields__.items(): # NOTE: A forward match consumes nothing and contributes no octets to # ``bytes(schema)`` either, see the ``ForwardMatchField`` branches of - # :meth:`Schema.pack ` and - # :meth:`Schema.unpack `. + # :meth:`Schema.pack ` and + # :meth:`Schema.unpack `. if isinstance(field, ForwardMatchField): continue @@ -206,13 +206,13 @@ def quick_start_data_selector(pkt: 'dict[str, Any]') -> 'Field': The field for the option data, chosen by the QS function. * If ``func`` is ``0``, returns a :class:`~pcapkit.corekit.fields.misc.SchemaField` - wrapped :class:`~pcapkit.protocols.schema.internet.ipv4.QuickStartRequestOption` + wrapped :class:`~pcapkit.protocols.internet.ipv4.schema.QuickStartRequestOption` instance. * If ``func`` is ``8``, returns a :class:`~pcapkit.corekit.fields.misc.SchemaField` - wrapped :class:`~pcapkit.protocols.schema.internet.ipv4.QuickStartReportOption` + wrapped :class:`~pcapkit.protocols.internet.ipv4.schema.QuickStartReportOption` instance. * Otherwise, returns a :class:`~pcapkit.corekit.fields.misc.SchemaField` - wrapped :class:`~pcapkit.protocols.schema.internet.ipv4.UnassignedOption` + wrapped :class:`~pcapkit.protocols.internet.ipv4.schema.UnassignedOption` instance, sized by the option's own ``length`` octet. Notes: @@ -377,14 +377,14 @@ def post_process(self, packet: 'dict[str, Any]') -> 'Schema': Notes: This runs on the **packing** path as well as the unpacking one -- - :meth:`Schema.pack ` + :meth:`Schema.pack ` calls it once the buffer is filled -- so the ``ts_data`` entries it converts below are whatever the caller passed to the constructor, not octets read off the wire. That is why those conversions go through :func:`~pcapkit.corekit.schema.ipaddress.parse_ip_address` rather than :func:`ipaddress.ip_address`: this schema is reachable from public :meth:`IPv4.make - `, which accepts a + `, which accepts a caller-built option schema and packs it, and :attr:`ts_data`'s :class:`~pcapkit.corekit.fields.numbers.UInt32Field` item type takes a :obj:`bool` as the :class:`int` it is a subclass @@ -474,7 +474,7 @@ def post_process(self, packet: 'dict[str, Any]') -> 'Schema': # writes and is declared just above; passing it as a constructor # argument would drop the timestamps in silence, because # :meth:`Schema.__update__ - # ` answers an unknown + # ` answers an unknown # field name with an # :class:`~pcapkit.utilities.warnings.UnknownFieldWarning` rather than an # error. @@ -680,9 +680,9 @@ class QuickStartReportOption(QSOption, code=Enum_QSFunction.Report_of_Approved_R #: functions, and figure 4 gives this option as ``Length=8`` like figure 3 #: gives its sibling. Without this field the schema would be seven octets #: wide against the eight - #: :meth:`~pcapkit.protocols.internet.ipv4.IPv4._make_opt_qs` writes into + #: :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._make_opt_qs` writes into #: ``length`` and the eight - #: :meth:`~pcapkit.protocols.internet.ipv4.IPv4._read_opt_qs` demands of it, + #: :meth:`~pcapkit.protocols.internet.ipv4.protocol.IPv4._read_opt_qs` demands of it, #: and the ``nonce`` would decode one octet early. Kept as an integer rather #: than as padding, so that whatever the sender put there is written back. reserved: 'int' = UInt8Field() diff --git a/pcapkit/protocols/internet/ipv6/__init__.py b/pcapkit/protocols/internet/ipv6/__init__.py new file mode 100644 index 0000000000..bac6c7362d --- /dev/null +++ b/pcapkit/protocols/internet/ipv6/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""IPv6 - Internet Protocol version 6 +======================================== + +.. module:: pcapkit.protocols.internet.ipv6 + +:mod:`pcapkit.protocols.internet.ipv6` holds the dissector, +:class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6`, in +:mod:`~pcapkit.protocols.internet.ipv6.protocol`, its header schema in +:mod:`~pcapkit.protocols.internet.ipv6.schema` and its data model in +:mod:`~pcapkit.protocols.internet.ipv6.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.internet.ipv6.protocol import IPv6 + +# Header Schemas +from pcapkit.protocols.internet.ipv6.schema import IPv6 as Schema_IPv6 + +# Data Models +from pcapkit.protocols.internet.ipv6.data import IPv6 as Data_IPv6 + +__all__ = ['IPv6'] diff --git a/pcapkit/protocols/data/internet/ipv6.py b/pcapkit/protocols/internet/ipv6/data.py similarity index 94% rename from pcapkit/protocols/data/internet/ipv6.py rename to pcapkit/protocols/internet/ipv6/data.py index 370c785b20..649f341a93 100644 --- a/pcapkit/protocols/data/internet/ipv6.py +++ b/pcapkit/protocols/internet/ipv6/data.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Protocol if TYPE_CHECKING: from ipaddress import IPv6Address @@ -13,8 +13,7 @@ from typing_extensions import Literal from pcapkit.const.reg.transtype import TransType - from pcapkit.protocols.data.data import Data - from pcapkit.protocols.data.protocol import Packet + from pcapkit.protocols.data import Data, Packet from pcapkit.protocols.protocol import ProtocolBase __all__ = [ diff --git a/pcapkit/protocols/internet/ipv6.py b/pcapkit/protocols/internet/ipv6/protocol.py similarity index 94% rename from pcapkit/protocols/internet/ipv6.py rename to pcapkit/protocols/internet/ipv6/protocol.py index b3f1a418c2..837b646d7d 100644 --- a/pcapkit/protocols/internet/ipv6.py +++ b/pcapkit/protocols/internet/ipv6/protocol.py @@ -2,10 +2,10 @@ """IPv6 - Internet Protocol version 6 ======================================== -.. module:: pcapkit.protocols.internet.ipv6 +.. module:: pcapkit.protocols.internet.ipv6.protocol -:mod:`pcapkit.protocols.internet.ipv6` contains -:class:`~pcapkit.protocols.internet.ipv6.IPv6` only, +:mod:`pcapkit.protocols.internet.ipv6.protocol` contains +:class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6` only, which implements the extractor for Internet Protocol version 6 (IPv6) [*]_, whose structure is described as below: @@ -36,11 +36,11 @@ from pcapkit.corekit.multidict import OrderedMultiDict from pcapkit.corekit.protochain import ProtoChain from pcapkit.corekit.schema.jumbogram import jumbo_payload_length -from pcapkit.protocols.data.internet.ipv6 import IPv6 as Data_IPv6 -from pcapkit.protocols.internet.ip import IP -from pcapkit.protocols.schema.internet.ipv6 import IP_MAX_LENGTH -from pcapkit.protocols.schema.internet.ipv6 import IPv6 as Schema_IPv6 -from pcapkit.protocols.schema.internet.ipv6 import jumbogram_error +from pcapkit.protocols.internet.ip.protocol import IP +from pcapkit.protocols.internet.ipv6.data import IPv6 as Data_IPv6 +from pcapkit.protocols.internet.ipv6.schema import IP_MAX_LENGTH +from pcapkit.protocols.internet.ipv6.schema import IPv6 as Schema_IPv6 +from pcapkit.protocols.internet.ipv6.schema import jumbogram_error from pcapkit.utilities import config from pcapkit.utilities.contextvars import frame_depth from pcapkit.utilities.exceptions import ProtocolError @@ -52,7 +52,7 @@ from typing_extensions import Literal from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema __all__ = ['IPv6'] @@ -78,13 +78,13 @@ class IPv6(IP[Data_IPv6, Schema_IPv6], * A Shim6 header, which has no dedicated parser, and an extension header other than ESP whose dedicated parser raises are parsed by - :class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext`, so the rest + :class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext`, so the rest of the chain is still walked (:issue:`891`). * A rebuild from :meth:`~pcapkit.protocols.internet.internet.Internet.from_data` keeps the Payload Length a truncated capture declares (:issue:`1155`), and the octets past it as - :attr:`~pcapkit.protocols.schema.internet.ipv6.IPv6.trailer` + :attr:`~pcapkit.protocols.internet.ipv6.schema.IPv6.trailer` (:issue:`1209`). * Next Header codes 253 and 254 are parsed and rebuilt once (:issue:`1231`), and a cut extension header chain rebuilds byte for @@ -93,7 +93,7 @@ class IPv6(IP[Data_IPv6, Schema_IPv6], .. versionchanged:: 1.6.0 * An extension header whose dedicated parser raises is the upper - layer, parsed once as :class:`~pcapkit.protocols.misc.raw.Raw`, and + layer, parsed once as :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, and the chain walk stops there, as :rfc:`8200#section-4` has a node discard such a packet (:issue:`2477`). * ``next`` of :meth:`make` takes a member or an :class:`int` code, @@ -107,7 +107,7 @@ class IPv6(IP[Data_IPv6, Schema_IPv6], * ``__generic_ext_codes__``, the extension headers whose dedicated parser raising fell back to - :class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext` + :class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext` (:issue:`2477`). * The ``next_default``, ``next_namespace`` and ``next_reversed`` arguments of :meth:`make`; resolve a name with @@ -202,7 +202,7 @@ def read(self, length: 'Optional[int]' = None, *, Raises: ProtocolError: If the version is not 6, or if the packet is one of the errors :rfc:`2675#section-3` has a receiver detect (see - :func:`~pcapkit.protocols.schema.internet.ipv6.jumbogram_error`). + :func:`~pcapkit.protocols.internet.ipv6.schema.jumbogram_error`). """ if length is None: @@ -210,14 +210,14 @@ def read(self, length: 'Optional[int]' = None, *, schema = self.__header__ # NOTE: This class reads IPv6 only, as :meth:`IPv4.read - # ` reads IPv4 only; telling + # ` reads IPv4 only; telling # the two apart by the Version is left to the dispatchers (#1680). if schema.hextet['version'] != 6: raise ProtocolError(f"[IPv6] invalid version: {schema.hextet['version']}") # NOTE: A receiver treats each of these as an error (#1687), so # the frame stops here, see :meth:`IPv4.read - # `. A Fragment header beside + # `. A Fragment header beside # the Jumbo Payload option is caught on the walk, see # :meth:`_decode_next_layer`. rest = schema.get_payload() + schema.trailer @@ -237,7 +237,7 @@ def read(self, length: 'Optional[int]' = None, *, }) # type: Data_IPv6 # NOTE: Octets captured past the Payload Length are kept as captured, - # see :meth:`IPv4.read ` + # see :meth:`IPv4.read ` # (#1209). if schema.trailer: ipv6.__update__({ @@ -246,7 +246,7 @@ def read(self, length: 'Optional[int]' = None, *, # NOTE: A jumbogram's extent is its Jumbo Payload Length, not the zero # Payload Length, see :meth:`Schema_IPv6.post_process - # ` + # ` # (#1434); the check above leaves a zero one beside it. jumbo = jumbo_payload_length(schema.next, rest) extent = schema.length if jumbo is None else jumbo @@ -335,10 +335,10 @@ def make(self, ) # NOTE: A payload that left its checksum out gets it over this header's - # pseudo-header; see pcapkit.protocols.misc.checksum.ip_pseudo (#2471). + # pseudo-header; see pcapkit.protocols.misc.checksum.ip_pseudo.protocol (#2471). if (config.CHECKSUM_COMPUTE and getattr(payload, '_checksum_pending', False) and cast('ProtocolBase', payload).__index__() == next_val): - from pcapkit.protocols.misc.checksum.ip_pseudo import IP_Pseudo # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.misc.checksum.ip_pseudo.protocol import IP_Pseudo # isort: skip # pylint: disable=import-outside-toplevel # NOTE: The payload follows this header directly, so no extension # header moves an address; it puts its own length in the pseudo-header. @@ -407,7 +407,7 @@ def __post_init__(self, file: 'Optional[IO[bytes] | bytes]' = None, Once parsed, the checksum of the upper layer is verified over this layer's pseudo-header if :data:`~pcapkit.utilities.config.CHECKSUM_VERIFY` - is on, see :func:`~pcapkit.protocols.misc.checksum.ip_pseudo.verify_upper`. + is on, see :func:`~pcapkit.protocols.misc.checksum.ip_pseudo.protocol.verify_upper`. Args: file: Source packet stream. @@ -420,7 +420,7 @@ def __post_init__(self, file: 'Optional[IO[bytes] | bytes]' = None, """ super().__post_init__(file, length, **kwargs) if config.CHECKSUM_VERIFY: - from pcapkit.protocols.misc.checksum.ip_pseudo import verify_upper # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.misc.checksum.ip_pseudo.protocol import verify_upper # isort: skip # pylint: disable=import-outside-toplevel verify_upper(self) ########################################################################## @@ -604,7 +604,7 @@ def _decode_next_layer(self, ipv6: 'Data_IPv6', proto: 'Optional[int]' = None, # It is not recorded as an extension header. # A Raw is reused as the upper layer, so the header is not parsed again. if not hasattr(info, 'next'): - from pcapkit.protocols.misc.raw import Raw # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.misc.raw.protocol import Raw # isort: skip # pylint: disable=import-outside-toplevel # Exact type on purpose: Raw subclasses exist, so isinstance would over-match. if type(next_) is Raw: # pylint: disable=unidiomatic-typecheck self._walk_upper = next_ @@ -680,7 +680,7 @@ def _decode_next_layer(self, ipv6: 'Data_IPv6', proto: 'Optional[int]' = None, # NOTE: Nor does a later fragment's slice start with the upper-layer # header, though ``protocol`` above still names the one the first # fragment carries. No code is dispatched on, so the registry's - # fallback leaves the octets as :class:`~pcapkit.protocols.misc.raw.Raw` + # fallback leaves the octets as :class:`~pcapkit.protocols.misc.raw.protocol.Raw` # with no protocol to alias it as, and ``'UDP' in frame`` does not hold # of a slice of UDP payload (#1545). Reassembly takes # ``fragment`` above, which this leaves as it was. @@ -714,7 +714,7 @@ def _import_next_layer(self, proto: 'int', length: 'Optional[int]' = None, *, # version: IP protocol version extension: if is extension header payload: payload from packet. If not provided, will extract from - :meth:`self.__header__.get_payload ` + :meth:`self.__header__.get_payload ` Returns: Instance of next layer. @@ -723,15 +723,15 @@ def _import_next_layer(self, proto: 'int', length: 'Optional[int]' = None, *, # A header whose dedicated parser raises reaches the :func:`~pcapkit.corekit.decorators.beholder` decorating this method, which substitutes plain - :class:`~pcapkit.protocols.misc.raw.Raw`. That carries no ``next``, + :class:`~pcapkit.protocols.misc.raw.protocol.Raw`. That carries no ``next``, so :meth:`_decode_next_layer`'s walk stops there, as :rfc:`8200#section-4` has a node discard such a packet (:issue:`2477`). ``253`` and ``254`` have no dedicated parser and - reach plain :class:`~pcapkit.protocols.misc.raw.Raw` with no + reach plain :class:`~pcapkit.protocols.misc.raw.protocol.Raw` with no exception involved, which stops the walk the same way. A ``Raw`` the walk stopped on is then returned as the upper layer, not parsed again. - :class:`~pcapkit.protocols.internet.esp.ESP`'s info always carries + :class:`~pcapkit.protocols.internet.esp.protocol.ESP`'s info always carries a ``next``, :data:`None` unless its payload was decrypted, since :rfc:`4303` encrypts the real value, so the walk ends after it. diff --git a/pcapkit/protocols/schema/internet/ipv6.py b/pcapkit/protocols/internet/ipv6/schema.py similarity index 97% rename from pcapkit/protocols/schema/internet/ipv6.py rename to pcapkit/protocols/internet/ipv6/schema.py index 5ace47cf0f..78a7125686 100644 --- a/pcapkit/protocols/schema/internet/ipv6.py +++ b/pcapkit/protocols/internet/ipv6/schema.py @@ -17,7 +17,7 @@ from pcapkit.corekit.fields.numbers import EnumField, UInt8Field, UInt16Field from pcapkit.corekit.fields.strings import BitField from pcapkit.corekit.schema.jumbogram import jumbo_payload_length -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final from pcapkit.utilities.logging import SPHINX_TYPE_CHECKING __all__ = ['IPv6'] @@ -92,7 +92,7 @@ class IPv6(Schema): payload: 'bytes' = PayloadField(length=lambda pkt: pkt['length']) #: Octets captured past the Payload Length (or a jumbogram's Jumbo Payload #: Length, see :meth:`post_process`), such as Ethernet minimum-frame - #: padding, see :attr:`IPv4.trailer `. + #: padding, see :attr:`IPv4.trailer `. trailer: 'bytes' = PayloadField(default=b'') def post_process(self, packet: 'dict[str, Any]') -> 'Schema': diff --git a/pcapkit/protocols/internet/ipv6_ext/__init__.py b/pcapkit/protocols/internet/ipv6_ext/__init__.py new file mode 100644 index 0000000000..627e36b141 --- /dev/null +++ b/pcapkit/protocols/internet/ipv6_ext/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""IPv6-Ext - IPv6 Extension Header +====================================== + +.. module:: pcapkit.protocols.internet.ipv6_ext + +:mod:`pcapkit.protocols.internet.ipv6_ext` holds the dissector, +:class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext`, in +:mod:`~pcapkit.protocols.internet.ipv6_ext.protocol`, its header schema in +:mod:`~pcapkit.protocols.internet.ipv6_ext.schema` and its data model in +:mod:`~pcapkit.protocols.internet.ipv6_ext.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.internet.ipv6_ext.protocol import IPv6_Ext + +# Header Schemas +from pcapkit.protocols.internet.ipv6_ext.schema import IPv6_Ext as Schema_IPv6_Ext + +# Data Models +from pcapkit.protocols.internet.ipv6_ext.data import IPv6_Ext as Data_IPv6_Ext + +__all__ = ['IPv6_Ext'] diff --git a/pcapkit/protocols/data/internet/ipv6_ext.py b/pcapkit/protocols/internet/ipv6_ext/data.py similarity index 82% rename from pcapkit/protocols/data/internet/ipv6_ext.py rename to pcapkit/protocols/internet/ipv6_ext/data.py index ff9a33f39f..71b37c7d9f 100644 --- a/pcapkit/protocols/data/internet/ipv6_ext.py +++ b/pcapkit/protocols/internet/ipv6_ext/data.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Protocol if TYPE_CHECKING: from typing import Optional @@ -19,7 +19,7 @@ class IPv6_Ext(Protocol): """Data model for a generically-parsed IPv6 extension header. - See :class:`pcapkit.protocols.internet.ipv6_ext.IPv6_Ext` + See :class:`pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext` for how each field below is derived. """ @@ -28,9 +28,9 @@ class IPv6_Ext(Protocol): #: the caller dispatched on, resolved to its #: :class:`~pcapkit.const.ipv6.extension_header.ExtensionHeader` member. #: :data:`None` when ``alias`` was not given or named no such member - #: (:meth:`read ` + #: (:meth:`read ` #: sets it so in both cases, and the class property at - #: :attr:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext.protocol` + #: :attr:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext.protocol` #: is typed to match). protocol: 'Optional[ExtensionHeader]' #: Next header, parsed off the wire. :data:`None` when the declared @@ -48,5 +48,5 @@ class IPv6_Ext(Protocol): #: Header-specific content after the two fixed octets, as consumed. data: 'bytes' #: Parsing error a caller passed to - #: :meth:`read `, if any. + #: :meth:`read `, if any. error: 'Optional[Exception]' diff --git a/pcapkit/protocols/internet/ipv6_ext.py b/pcapkit/protocols/internet/ipv6_ext/protocol.py similarity index 90% rename from pcapkit/protocols/internet/ipv6_ext.py rename to pcapkit/protocols/internet/ipv6_ext/protocol.py index 79aec595b4..f22b687933 100644 --- a/pcapkit/protocols/internet/ipv6_ext.py +++ b/pcapkit/protocols/internet/ipv6_ext/protocol.py @@ -2,10 +2,10 @@ """IPv6-Ext - IPv6 Extension Header ====================================== -.. module:: pcapkit.protocols.internet.ipv6_ext +.. module:: pcapkit.protocols.internet.ipv6_ext.protocol -:mod:`pcapkit.protocols.internet.ipv6_ext` contains -:class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext` +:mod:`pcapkit.protocols.internet.ipv6_ext.protocol` contains +:class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext` only, which is both (GitHub issue :issue:`917`) the shared **base class** of every IPv6 extension header in this package and a **generic** extractor for a header with no dedicated parser. The class docstring separates these roles. @@ -49,7 +49,7 @@ counts in 4-octet units with a bias of 2, not :rfc:`6564`'s 8-octet units and bias of 1 ``ESP`` terminal -- has a dedicated, registered parser - (:class:`~pcapkit.protocols.internet.esp.ESP`), + (:class:`~pcapkit.protocols.internet.esp.protocol.ESP`), but its Next Header byte is inside the encrypted trailer (:rfc:`4303`), so the walk cannot step past it on the wire @@ -71,16 +71,16 @@ field in the cleartext part. 253 and 254 are reserved for private experimentation (:rfc:`3692`) with no wire format at all. None of them is reachable through this class, by construction; see -:meth:`pcapkit.protocols.internet.ipv6.IPv6._import_next_layer`. Each still +:meth:`pcapkit.protocols.internet.ipv6.protocol.IPv6._import_next_layer`. Each still enters :meth:`IPv6._decode_next_layer -`'s walk, being a +`'s walk, being a real :class:`~pcapkit.const.ipv6.extension_header.ExtensionHeader` member, but they part ways there. ``ESP`` resolves to its own dedicated parser, which decodes any plaintext it recovers itself and whose info carries a ``next`` of :data:`None` whenever the payload stays opaque, so the walk ends the ordinary way with ``ExtensionHeader(None)`` failing at the top of the next iteration. ``253`` and ``254`` have no dedicated parser and resolve to plain -:class:`~pcapkit.protocols.misc.raw.Raw`, whose info has no ``next`` +:class:`~pcapkit.protocols.misc.raw.protocol.Raw`, whose info has no ``next`` *attribute*. For these two, and any future IANA code without an implementation, the walk stops on a *structural* check (does the parsed layer carry a ``next`` at all?) rather than on a list of codes. @@ -92,9 +92,9 @@ :class:`~pcapkit.const.ipv6.extension_header.ExtensionHeader.Shim6` is a real IANA extension header (:rfc:`5533`) with no dedicated parser, so :meth:`Internet._lookup_next_layer ` -would default it to plain :class:`~pcapkit.protocols.misc.raw.Raw`, whose +would default it to plain :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, whose missing ``next`` field would end the walk in -:meth:`IPv6._decode_next_layer ` +:meth:`IPv6._decode_next_layer ` there (GitHub issue :issue:`891`). This module registers this class for that code instead (see the bottom of the module), so dispatch reaches a working generic parser directly. The registration is global, shared by every @@ -104,7 +104,7 @@ A header with a dedicated class whose parser raises does not reach this class. :func:`~pcapkit.corekit.decorators.beholder` makes it plain -:class:`~pcapkit.protocols.misc.raw.Raw`, and the walk stops there, as +:class:`~pcapkit.protocols.misc.raw.protocol.Raw`, and the walk stops there, as :rfc:`8200#section-4` has a node discard such a packet (GitHub issue :issue:`2477`). @@ -114,12 +114,12 @@ The house convention for a declared length that does not fit what remains is warn-and-clip: emit a warning naming what was declared against what is left, then read only what is left. See -:func:`pcapkit.protocols.schema.misc.pcapng.bounded_area` and -:meth:`pcapkit.protocols.misc.pcapng.PCAPNG.read`. +:func:`pcapkit.protocols.misc.pcapng.schema.bounded_area` and +:meth:`pcapkit.protocols.misc.pcapng.protocol.PCAPNG.read`. This class follows that convention's *warning* -- a :class:`~pcapkit.utilities.warnings.SchemaWarning`, as -:func:`~pcapkit.protocols.schema.misc.pcapng.bounded_area` emits -- and +:func:`~pcapkit.protocols.misc.pcapng.schema.bounded_area` emits -- and deliberately diverges on the *action*. Clipping is right when the declared length only governs how much of the current object to read, since there is always a well-defined "what is left" to fall back to. Here the declared length @@ -128,7 +128,7 @@ would fabricate a layer and record a false entry in :class:`~pcapkit.corekit.protochain.ProtoChain`, which reads as a parsed fact rather than a guess. So :meth:`read` warns in the same form as -:func:`~pcapkit.protocols.schema.misc.pcapng.bounded_area`, then **stops the +:func:`~pcapkit.protocols.misc.pcapng.schema.bounded_area`, then **stops the walk**: this instance absorbs every remaining octet and reports :data:`None` for ``next``, which the caller's loop already reads as "no more extension headers". The chain ends honestly at the bad header instead of inventing what @@ -139,12 +139,12 @@ from pcapkit.const.ipv6.extension_header import ExtensionHeader as Enum_ExtensionHeader from pcapkit.const.reg.transtype import TransType as Enum_TransType -from pcapkit.protocols.data.internet.ipv6_ext import IPv6_Ext as Data_IPv6_Ext from pcapkit.protocols.internet.internet import Internet -from pcapkit.protocols.misc.no_payload import NoPayload +from pcapkit.protocols.internet.ipv6_ext.data import IPv6_Ext as Data_IPv6_Ext +from pcapkit.protocols.internet.ipv6_ext.schema import IPv6_Ext as Schema_IPv6_Ext +from pcapkit.protocols.misc.no_payload.protocol import NoPayload from pcapkit.protocols.protocol import _PT, _ST, ProtocolBase -from pcapkit.protocols.schema.internet.ipv6_ext import IPv6_Ext as Schema_IPv6_Ext -from pcapkit.protocols.schema.schema import Schema +from pcapkit.protocols.schema import Schema from pcapkit.utilities.exceptions import ProtocolError, UnsupportedCall, stacklevel from pcapkit.utilities.warnings import SchemaWarning, warn @@ -163,11 +163,11 @@ class _NextHeaderData(Protocol): records its own Next Header under this name, ESP from its decrypted trailer -- which is what lets :attr:`IPv6_Ext.next` be a *shared* member rather than a fallback-role-only one. Narrower than - :class:`~pcapkit.protocols.data.internet.ipv6_ext.IPv6_Ext` on + :class:`~pcapkit.protocols.internet.ipv6_ext.data.IPv6_Ext` on purpose: ``length`` is deliberately absent, because - :class:`~pcapkit.protocols.data.internet.ipv6_frag.IPv6_Frag` has no + :class:`~pcapkit.protocols.internet.ipv6_frag.data.IPv6_Frag` has no such field (its length is the constant 8, and its own - :attr:`~pcapkit.protocols.internet.ipv6_frag.IPv6_Frag.length` + :attr:`~pcapkit.protocols.internet.ipv6_frag.protocol.IPv6_Frag.length` property supplies it). """ @@ -197,22 +197,22 @@ class IPv6_Ext(Internet[_PT, _ST], Generic[_PT, _ST], :meth:`make`, :attr:`name`, :attr:`alias` and the ``schema=``/``data=`` class keywords implement it. 2. **The base class** of the implemented extension headers - (:class:`~pcapkit.protocols.internet.hopopt.HOPOPT`, - :class:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route`, - :class:`~pcapkit.protocols.internet.ipv6_frag.IPv6_Frag`, - :class:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts`, - :class:`~pcapkit.protocols.internet.hip.HIP`, - :class:`~pcapkit.protocols.internet.mh.MH`, - :class:`~pcapkit.protocols.internet.ah.AH` and - :class:`~pcapkit.protocols.internet.esp.ESP`), which is what the + (:class:`~pcapkit.protocols.internet.hopopt.protocol.HOPOPT`, + :class:`~pcapkit.protocols.internet.ipv6_route.protocol.IPv6_Route`, + :class:`~pcapkit.protocols.internet.ipv6_frag.protocol.IPv6_Frag`, + :class:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts`, + :class:`~pcapkit.protocols.internet.hip.protocol.HIP`, + :class:`~pcapkit.protocols.internet.mh.protocol.MH`, + :class:`~pcapkit.protocols.internet.ah.protocol.AH` and + :class:`~pcapkit.protocols.internet.esp.protocol.ESP`), which is what the ``_extf`` guards on :attr:`payload` and :attr:`protochain`, and each subclass's own on ``protocol``, are for. It is generic in its data and schema types, like - :class:`~pcapkit.protocols.internet.ipsec.IPsec`, another base in this + :class:`~pcapkit.protocols.internet.ipsec.protocol.IPsec`, another base in this package, so that a subclass keeps its *own* ``_PT``/``_ST`` instead of - inheriting this class's. :class:`~pcapkit.protocols.internet.ah.AH` and - :class:`~pcapkit.protocols.internet.esp.ESP` therefore double-inherit two + inheriting this class's. :class:`~pcapkit.protocols.internet.ah.protocol.AH` and + :class:`~pcapkit.protocols.internet.esp.protocol.ESP` therefore double-inherit two identically-parameterised generic bases, ``IPsec[โ€ฆ]`` and ``IPv6_Ext[โ€ฆ]``. Warning: @@ -232,9 +232,9 @@ class keywords implement it. .. versionchanged:: 1.6.0 * The library does not pass ``error`` to :meth:`read`, so - :attr:`Data_IPv6_Ext.error ` + :attr:`Data_IPv6_Ext.error ` is :data:`None` unless a caller passes one. A header whose dedicated - parser raises is :class:`~pcapkit.protocols.misc.raw.Raw`, whose + parser raises is :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, whose ``info.error`` holds the error (:issue:`2477`). * ``next`` of :meth:`make` takes a member or an :class:`int` code, resolved with the enumeration's ``get``; a name, a :obj:`bool`, or a @@ -274,10 +274,10 @@ def alias(self) -> 'str': :attr:`name`. Hyphenated, like :attr:`IPv6_Frag.alias - ` and - :attr:`IPv6_Opts.alias `, + ` and + :attr:`IPv6_Opts.alias `, for the same reason: :meth:`IPv6._decode_next_layer - ` keys the + ` keys the packet dict through ``IPv6._exthdr_key``, which is ``alias.lstrip('IPv6-').lower()``, and :meth:`str.lstrip` strips a character *set*, not a prefix. The default @@ -294,7 +294,7 @@ def length(self) -> 'int': Fallback-role member: it reads this module's *own* data model, so a subclass whose data model records its length elsewhere, or not at all - (as :class:`~pcapkit.protocols.data.internet.ipv6_frag.IPv6_Frag`), must + (as :class:`~pcapkit.protocols.internet.ipv6_frag.data.IPv6_Frag`), must override it. Every implemented header does, and ``tests/protocols/internet/test_ipv6_ext_unit.py`` holds them to it. @@ -314,7 +314,7 @@ def protocol(self) -> 'Optional[Enum_ExtensionHeader] | Optional[str]': for this class is only :attr:`~pcapkit.const.ipv6.extension_header.ExtensionHeader.Shim6`. The identity is resolved per instance from the numeric code handed to the constructor (``alias``), which - :meth:`pcapkit.protocols.internet.ipv6.IPv6._decode_next_layer` already + :meth:`pcapkit.protocols.internet.ipv6.protocol.IPv6._decode_next_layer` already holds before it dispatches. See :meth:`__index__` for why the *class-level* identity cannot work the same way. It is deliberately *not* ``_extf``-guarded in this role: that same call passes @@ -397,7 +397,7 @@ def id(cls) -> 'tuple[Literal["HOPOPT"], Literal["IPv6_Route"], Literal["IPv6_Fr Note: ``== 'IPv6_Ext'`` is :data:`False`, as ``== 'IP'`` is on - :class:`~pcapkit.protocols.internet.ipv4.IPv4`; ``== IPv6_Ext`` is :data:`True`. + :class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4`; ``== IPv6_Ext`` is :data:`True`. """ return ('HOPOPT', 'IPv6_Route', 'IPv6_Frag', 'ESP', 'AH', 'IPv6_Opts', 'MH', 'HIP') @@ -415,7 +415,7 @@ def read(self, length: 'Optional[int]' = None, *, # pylint: disable=arguments-d * ``alias`` -- the numeric code of the extension header this instance parses, ``140`` for ``Shim6`` (the only code registered to this class), supplied by :meth:`IPv6._import_next_layer - `. + `. * ``error`` -- a parsing error to record in the result, if any, which the library does not pass. @@ -546,8 +546,8 @@ def make(self, *, They are keyword-*only* because this class is also a base and each subclass's ``make`` puts different names in the same positions. As positional parameters they draw pylint ``arguments-renamed`` - warnings (:meth:`ESP.make ` has ``spi``, ``seq`` and ``next`` where - these have ``next``, ``len`` and ``data``) and mypy + warnings (:meth:`ESP.make ` has ``spi``, ``seq`` and + ``next`` where these have ``next``, ``len`` and ``data``) and mypy ``[override]`` errors. With no positional parameters there is no position to disagree about, and the allowlist is unaffected because :func:`~pcapkit.protocols.protocol._declared_keywords` collects ``KEYWORD_ONLY`` @@ -609,8 +609,8 @@ def __post_init__(self, file: 'Optional[IO[bytes] | bytes]' = None, length: 'Opt The version gate is scoped to the fallback role by the same ``__data__`` discriminator :attr:`protocol` uses. Applying it to subclasses would break those that are *not* IPv6-only: - :class:`~pcapkit.protocols.internet.ah.AH` and - :class:`~pcapkit.protocols.internet.esp.ESP` both default to + :class:`~pcapkit.protocols.internet.ah.protocol.AH` and + :class:`~pcapkit.protocols.internet.esp.protocol.ESP` both default to ``version=4`` and are valid under IPv4, so an unconditional gate would reject them (``ProtocolError: ESP: invalid version: must be 6, not 4``). @@ -619,18 +619,18 @@ def __post_init__(self, file: 'Optional[IO[bytes] | bytes]' = None, length: 'Opt :attr:`Internet.__proto__ `, which *every* :class:`~pcapkit.protocols.internet.internet.Internet` - subclass shares, :class:`~pcapkit.protocols.internet.ipv4.IPv4` + subclass shares, :class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4` included, so that :attr:`~pcapkit.const.ipv6.extension_header.ExtensionHeader.Shim6` resolves to a working parser instead of - :class:`~pcapkit.protocols.misc.raw.Raw`. Without it, an IPv4 + :class:`~pcapkit.protocols.misc.raw.protocol.Raw`. Without it, an IPv4 packet whose protocol byte is 140 would reach this class and walk an IPv6-style extension-header chain out of an IPv4 payload, reading ``IPv4:IPv6-Ext:...`` instead of the ``IPv4:Shim6`` that a - plain, non-continuing :class:`~pcapkit.protocols.misc.raw.Raw` gives. Rejecting here sends + plain, non-continuing :class:`~pcapkit.protocols.misc.raw.protocol.Raw` gives. Rejecting here sends construction back through :func:`~pcapkit.corekit.decorators.beholder` at the *caller's* - layer, which substitutes that same :class:`~pcapkit.protocols.misc.raw.Raw`: the version-agnostic + layer, which substitutes that same :class:`~pcapkit.protocols.misc.raw.protocol.Raw`: the version-agnostic behaviour, with no IPv4-specific code. """ @@ -664,8 +664,8 @@ def __index__(cls) -> 'NoReturn': Raises: UnsupportedCall: This protocol has no *class-level* registry entry. Unlike :meth:`Raw.__index__ - `, which raises - because :class:`~pcapkit.protocols.misc.raw.Raw` has no + `, which raises + because :class:`~pcapkit.protocols.misc.raw.protocol.Raw` has no identity to report at all, this class *does* have one -- see :attr:`protocol` -- but it is resolved per instance, not per class: one :class:`IPv6_Ext` parses diff --git a/pcapkit/protocols/schema/internet/ipv6_option.py b/pcapkit/protocols/internet/ipv6_ext/schema.py similarity index 87% rename from pcapkit/protocols/schema/internet/ipv6_option.py rename to pcapkit/protocols/internet/ipv6_ext/schema.py index ac851a5bb9..b64e0b767f 100644 --- a/pcapkit/protocols/schema/internet/ipv6_option.py +++ b/pcapkit/protocols/internet/ipv6_ext/schema.py @@ -1,11 +1,12 @@ # -*- coding: utf-8 -*- -"""helpers shared by the IPv6 option schemas +# mypy: disable-error-code=assignment +"""header schema for generically-parsed IPv6 extension headers -:mod:`pcapkit.protocols.schema.internet.ipv6_option` holds the field callbacks +:mod:`pcapkit.protocols.internet.ipv6_ext.schema` holds the field callbacks that size and select the IPv6 options [:rfc:`8200#section-4.2`] carried by both the Hop-by-Hop Options header -(:mod:`~pcapkit.protocols.schema.internet.hopopt`) and the Destination Options -header (:mod:`~pcapkit.protocols.schema.internet.ipv6_opts`). +(:mod:`~pcapkit.protocols.internet.hopopt.schema`) and the Destination Options +header (:mod:`~pcapkit.protocols.internet.ipv6_opts.schema`). Each of those modules declares its own option schemas, so the helpers take what differs between them as parameters: ``prefix`` is the name of the header, @@ -20,22 +21,53 @@ from pcapkit.const.ipv6.qs_function import QSFunction as Enum_QSFunction from pcapkit.const.ipv6.smf_dpd_mode import SMFDPDMode as Enum_SMFDPDMode from pcapkit.const.ipv6.tagger_id import TaggerID as Enum_TaggerID +from pcapkit.const.reg.transtype import TransType as Enum_TransType from pcapkit.corekit.fields.ipaddress import IPv4AddressField, IPv6AddressField -from pcapkit.corekit.fields.misc import NoValueField, SchemaField +from pcapkit.corekit.fields.misc import NoValueField, PayloadField, SchemaField +from pcapkit.corekit.fields.numbers import EnumField, UInt8Field from pcapkit.corekit.fields.strings import BytesField +from pcapkit.protocols.schema import Schema, schema_final from pcapkit.utilities.exceptions import FieldValueError, ProtocolError __all__ = [ - 'rpl_opt_sub_tlv_len', 'mpl_opt_seed_id_len', 'smf_i_dpd_id_len', + 'IPv6_Ext', 'rpl_opt_sub_tlv_len', 'mpl_opt_seed_id_len', 'smf_i_dpd_id_len', 'smf_dpd_data_selector', 'smf_i_dpd_tid_selector', 'quick_start_data_selector', - 'pad_opt_data_len', 'calipso_pad_len', 'mpl_opt_pad_len', + 'pad_opt_data_len', 'calipso_pad_len', 'mpl_opt_pad_len' ] if TYPE_CHECKING: from typing import Any, Optional, Type from pcapkit.corekit.fields.field import FieldBase as Field - from pcapkit.protocols.schema.schema import EnumMeta, Schema + from pcapkit.protocols.protocol import ProtocolBase + from pcapkit.protocols.schema import EnumMeta + + +@schema_final +class IPv6_Ext(Schema): + """Header schema for a generically-parsed IPv6 extension header. + + Only the two octets :rfc:`6564#section-4` guarantees are parsed at this + layer -- ``next`` and the raw ``Hdr Ext Len`` octet. Combining them into + an actual skip distance is per protocol (a constant for ``IPv6-Frag``, + 4-octet units for ``AH``, 8-octet units for the rest), so that part is + done in :meth:`pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext.read`, + which knows which protocol this instance stands in for; this schema does + not. + + """ + + #: Next header. + next: 'Enum_TransType' = EnumField(length=1, namespace=Enum_TransType) + #: Raw ``Hdr Ext Len`` octet -- see the class docstring for why its + #: interpretation is not fixed here. + len: 'int' = UInt8Field() + #: Everything after the two fixed octets; opaque at this layer. + payload: 'bytes' = PayloadField() + + if TYPE_CHECKING: + def __init__(self, next: 'Enum_TransType | int', len: 'int', + payload: 'bytes | ProtocolBase | Schema') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements def _opt_data_len_cut(pkt: 'dict[str, Any]') -> 'bool': @@ -46,7 +78,7 @@ def _opt_data_len_cut(pkt: 'dict[str, Any]') -> 'bool': Returns: Whether the field :meth:`Schema.unpack - ` gives as the one the + ` gives as the one the data ends inside is ``len``, so that its value is the zero a capture cut leaves rather than a length read (:issue:`2727`). diff --git a/pcapkit/protocols/internet/ipv6_frag/__init__.py b/pcapkit/protocols/internet/ipv6_frag/__init__.py new file mode 100644 index 0000000000..6c9a3c2387 --- /dev/null +++ b/pcapkit/protocols/internet/ipv6_frag/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""IPv6-Frag - Fragment Header for IPv6 +========================================== + +.. module:: pcapkit.protocols.internet.ipv6_frag + +:mod:`pcapkit.protocols.internet.ipv6_frag` holds the dissector, +:class:`~pcapkit.protocols.internet.ipv6_frag.protocol.IPv6_Frag`, in +:mod:`~pcapkit.protocols.internet.ipv6_frag.protocol`, its header schema in +:mod:`~pcapkit.protocols.internet.ipv6_frag.schema` and its data model in +:mod:`~pcapkit.protocols.internet.ipv6_frag.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.internet.ipv6_frag.protocol import IPv6_Frag + +# Header Schemas +from pcapkit.protocols.internet.ipv6_frag.schema import IPv6_Frag as Schema_IPv6_Frag + +# Data Models +from pcapkit.protocols.internet.ipv6_frag.data import IPv6_Frag as Data_IPv6_Frag + +__all__ = ['IPv6_Frag'] diff --git a/pcapkit/protocols/data/internet/ipv6_frag.py b/pcapkit/protocols/internet/ipv6_frag/data.py similarity index 95% rename from pcapkit/protocols/data/internet/ipv6_frag.py rename to pcapkit/protocols/internet/ipv6_frag/data.py index 8a1826fb9e..2831350a99 100644 --- a/pcapkit/protocols/data/internet/ipv6_frag.py +++ b/pcapkit/protocols/internet/ipv6_frag/data.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Protocol if TYPE_CHECKING: from pcapkit.const.reg.transtype import TransType diff --git a/pcapkit/protocols/internet/ipv6_frag.py b/pcapkit/protocols/internet/ipv6_frag/protocol.py similarity index 94% rename from pcapkit/protocols/internet/ipv6_frag.py rename to pcapkit/protocols/internet/ipv6_frag/protocol.py index 2fbcb047f2..ef0cc93e33 100644 --- a/pcapkit/protocols/internet/ipv6_frag.py +++ b/pcapkit/protocols/internet/ipv6_frag/protocol.py @@ -2,10 +2,10 @@ """IPv6-Frag - Fragment Header for IPv6 ========================================== -.. module:: pcapkit.protocols.internet.ipv6_frag +.. module:: pcapkit.protocols.internet.ipv6_frag.protocol -:mod:`pcapkit.protocols.internet.ipv6_frag` contains -:class:`~pcapkit.protocols.internet.ipv6_frag.IPv6_Frag` +:mod:`pcapkit.protocols.internet.ipv6_frag.protocol` contains +:class:`~pcapkit.protocols.internet.ipv6_frag.protocol.IPv6_Frag` only, which implements the extractor for Fragment Header for IPv6 (IPv6-Frag) [*]_, whose structure is described as below: @@ -27,10 +27,10 @@ from typing import TYPE_CHECKING, overload from pcapkit.const.reg.transtype import TransType as Enum_TransType -from pcapkit.protocols.data.internet.ipv6_frag import IPv6_Frag as Data_IPv6_Frag -from pcapkit.protocols.internet.ipv6_ext import IPv6_Ext -from pcapkit.protocols.misc.no_payload import NoPayload -from pcapkit.protocols.schema.internet.ipv6_frag import IPv6_Frag as Schema_IPv6_Frag +from pcapkit.protocols.internet.ipv6_ext.protocol import IPv6_Ext +from pcapkit.protocols.internet.ipv6_frag.data import IPv6_Frag as Data_IPv6_Frag +from pcapkit.protocols.internet.ipv6_frag.schema import IPv6_Frag as Schema_IPv6_Frag +from pcapkit.protocols.misc.no_payload.protocol import NoPayload from pcapkit.utilities.exceptions import UnsupportedCall if TYPE_CHECKING: @@ -40,7 +40,7 @@ from pcapkit.corekit.protochain import ProtoChain from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema __all__ = ['IPv6_Frag'] @@ -166,7 +166,7 @@ def read(self, length: 'Optional[int]' = None, *, extension: 'bool' = False, # # so that it matches ``Data_IPv4.offset`` and can be handed straight to # the reassembly machinery, which indexes the datagram buffer with it # (:meth:`pcapkit.foundation.reassembly.ip.IP.reassembly`). Scale here, - # exactly as :meth:`pcapkit.protocols.internet.ipv4.IPv4.read` does. + # exactly as :meth:`pcapkit.protocols.internet.ipv4.protocol.IPv4.read` does. ipv6_frag = Data_IPv6_Frag( next=schema.next, reserved_octet=schema.reserved, @@ -199,7 +199,7 @@ def make(self, reserved_octet: The reserved octet after the next header. offset: Fragment offset, in on-wire 8-octet units (:rfc:`8200#section-4.5`). Note that the data model's :attr:`offset - ` is in + ` is in octets, so it must be divided by 8 before being passed here. reserved: Reserved bits (``Res``) between the offset and the M flag. mf: More fragments flag. diff --git a/pcapkit/protocols/schema/internet/ipv6_frag.py b/pcapkit/protocols/internet/ipv6_frag/schema.py similarity index 95% rename from pcapkit/protocols/schema/internet/ipv6_frag.py rename to pcapkit/protocols/internet/ipv6_frag/schema.py index d2db3232b9..5259662be2 100644 --- a/pcapkit/protocols/schema/internet/ipv6_frag.py +++ b/pcapkit/protocols/internet/ipv6_frag/schema.py @@ -8,7 +8,7 @@ from pcapkit.corekit.fields.misc import PayloadField from pcapkit.corekit.fields.numbers import EnumField, UInt32Field from pcapkit.corekit.fields.strings import BitField, PaddingField -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final __all__ = ['IPv6_Frag'] diff --git a/pcapkit/protocols/internet/ipv6_opts/__init__.py b/pcapkit/protocols/internet/ipv6_opts/__init__.py new file mode 100644 index 0000000000..559003226d --- /dev/null +++ b/pcapkit/protocols/internet/ipv6_opts/__init__.py @@ -0,0 +1,83 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""IPv6-Opts - Destination Options for IPv6 +============================================== + +.. module:: pcapkit.protocols.internet.ipv6_opts + +:mod:`pcapkit.protocols.internet.ipv6_opts` holds the dissector, +:class:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts`, in +:mod:`~pcapkit.protocols.internet.ipv6_opts.protocol`, its header schema in +:mod:`~pcapkit.protocols.internet.ipv6_opts.schema` and its data model in +:mod:`~pcapkit.protocols.internet.ipv6_opts.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.internet.ipv6_opts.protocol import IPv6_Opts + +# Header Schemas +from pcapkit.protocols.internet.ipv6_opts.schema import CALIPSOOption as Schema_CALIPSOOption +from pcapkit.protocols.internet.ipv6_opts.schema import \ + HomeAddressOption as Schema_HomeAddressOption +from pcapkit.protocols.internet.ipv6_opts.schema import ILNPOption as Schema_ILNPOption +from pcapkit.protocols.internet.ipv6_opts.schema import IPDFFOption as Schema_IPDFFOption +from pcapkit.protocols.internet.ipv6_opts.schema import IPv6_Opts as Schema_IPv6_Opts +from pcapkit.protocols.internet.ipv6_opts.schema import \ + JumboPayloadOption as Schema_JumboPayloadOption +from pcapkit.protocols.internet.ipv6_opts.schema import \ + LineIdentificationOption as Schema_LineIdentificationOption +from pcapkit.protocols.internet.ipv6_opts.schema import MPLOption as Schema_MPLOption +from pcapkit.protocols.internet.ipv6_opts.schema import Option as Schema_Option +from pcapkit.protocols.internet.ipv6_opts.schema import PadOption as Schema_PadOption +from pcapkit.protocols.internet.ipv6_opts.schema import PDMOption as Schema_PDMOption +from pcapkit.protocols.internet.ipv6_opts.schema import QuickStartOption as Schema_QuickStartOption +from pcapkit.protocols.internet.ipv6_opts.schema import \ + QuickStartReportOption as Schema_QuickStartReportOption +from pcapkit.protocols.internet.ipv6_opts.schema import \ + QuickStartRequestOption as Schema_QuickStartRequestOption +from pcapkit.protocols.internet.ipv6_opts.schema import \ + RouterAlertOption as Schema_RouterAlertOption +from pcapkit.protocols.internet.ipv6_opts.schema import RPLOption as Schema_RPLOption +from pcapkit.protocols.internet.ipv6_opts.schema import SMFDPDOption as Schema_SMFDPDOption +from pcapkit.protocols.internet.ipv6_opts.schema import \ + SMFHashBasedDPDOption as Schema_SMFHashBasedDPDOption +from pcapkit.protocols.internet.ipv6_opts.schema import \ + SMFIdentificationBasedDPDOption as Schema_SMFIdentificationBasedDPDOption +from pcapkit.protocols.internet.ipv6_opts.schema import \ + TunnelEncapsulationLimitOption as Schema_TunnelEncapsulationLimitOption +from pcapkit.protocols.internet.ipv6_opts.schema import UnassignedOption as Schema_UnassignedOption + +# Data Models +from pcapkit.protocols.internet.ipv6_opts.data import CALIPSOOption as Data_CALIPSOOption +from pcapkit.protocols.internet.ipv6_opts.data import DFFFlags as Data_DFFFlags +from pcapkit.protocols.internet.ipv6_opts.data import HomeAddressOption as Data_HomeAddressOption +from pcapkit.protocols.internet.ipv6_opts.data import ILNPOption as Data_ILNPOption +from pcapkit.protocols.internet.ipv6_opts.data import IPDFFOption as Data_IPDFFOption +from pcapkit.protocols.internet.ipv6_opts.data import IPv6_Opts as Data_IPv6_Opts +from pcapkit.protocols.internet.ipv6_opts.data import JumboPayloadOption as Data_JumboPayloadOption +from pcapkit.protocols.internet.ipv6_opts.data import \ + LineIdentificationOption as Data_LineIdentificationOption +from pcapkit.protocols.internet.ipv6_opts.data import MPLFlags as Data_MPLFlags +from pcapkit.protocols.internet.ipv6_opts.data import MPLOption as Data_MPLOption +from pcapkit.protocols.internet.ipv6_opts.data import Option as Data_Option +from pcapkit.protocols.internet.ipv6_opts.data import PadOption as Data_PadOption +from pcapkit.protocols.internet.ipv6_opts.data import PDMOption as Data_PDMOption +from pcapkit.protocols.internet.ipv6_opts.data import QuickStartOption as Data_QuickStartOption +from pcapkit.protocols.internet.ipv6_opts.data import \ + QuickStartReportOption as Data_QuickStartReportOption +from pcapkit.protocols.internet.ipv6_opts.data import \ + QuickStartRequestOption as Data_QuickStartRequestOption +from pcapkit.protocols.internet.ipv6_opts.data import RouterAlertOption as Data_RouterAlertOption +from pcapkit.protocols.internet.ipv6_opts.data import RPLFlags as Data_RPLFlags +from pcapkit.protocols.internet.ipv6_opts.data import RPLOption as Data_RPLOption +from pcapkit.protocols.internet.ipv6_opts.data import SMFDPDOption as Data_SMFDPDOption +from pcapkit.protocols.internet.ipv6_opts.data import \ + SMFHashBasedDPDOption as Data_SMFHashBasedDPDOption +from pcapkit.protocols.internet.ipv6_opts.data import \ + SMFIdentificationBasedDPDOption as Data_SMFIdentificationBasedDPDOption +from pcapkit.protocols.internet.ipv6_opts.data import \ + TunnelEncapsulationLimitOption as Data_TunnelEncapsulationLimitOption +from pcapkit.protocols.internet.ipv6_opts.data import UnassignedOption as Data_UnassignedOption + +__all__ = ['IPv6_Opts'] diff --git a/pcapkit/protocols/data/internet/ipv6_opts.py b/pcapkit/protocols/internet/ipv6_opts/data.py similarity index 99% rename from pcapkit/protocols/data/internet/ipv6_opts.py rename to pcapkit/protocols/internet/ipv6_opts/data.py index e7480fc70e..c33ac80b7a 100644 --- a/pcapkit/protocols/data/internet/ipv6_opts.py +++ b/pcapkit/protocols/internet/ipv6_opts/data.py @@ -4,8 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.data import Data -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Data, Protocol if TYPE_CHECKING: from datetime import timedelta diff --git a/pcapkit/protocols/internet/ipv6_opts.py b/pcapkit/protocols/internet/ipv6_opts/protocol.py similarity index 93% rename from pcapkit/protocols/internet/ipv6_opts.py rename to pcapkit/protocols/internet/ipv6_opts/protocol.py index 3c2bd4f90d..bbe5222c54 100644 --- a/pcapkit/protocols/internet/ipv6_opts.py +++ b/pcapkit/protocols/internet/ipv6_opts/protocol.py @@ -2,10 +2,10 @@ """IPv6-Opts - Destination Options for IPv6 ============================================== -.. module:: pcapkit.protocols.internet.ipv6_opts +.. module:: pcapkit.protocols.internet.ipv6_opts.protocol -:mod:`pcapkit.protocols.internet.ipv6_opts` contains -:class:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts` +:mod:`pcapkit.protocols.internet.ipv6_opts.protocol` contains +:class:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts` only, which implements the extractor for Destination Options for IPv6 (IPv6-Opts) [*]_, whose structure is described as below: @@ -38,63 +38,63 @@ from pcapkit.corekit.multidict import OrderedMultiDict from pcapkit.corekit.schema.padding import pad_length from pcapkit.corekit.sentinels import NO_VALUE -from pcapkit.protocols.data.internet.ipv6_opts import CALIPSOOption as Data_CALIPSOOption -from pcapkit.protocols.data.internet.ipv6_opts import DFFFlags as Data_DFFFlags -from pcapkit.protocols.data.internet.ipv6_opts import HomeAddressOption as Data_HomeAddressOption -from pcapkit.protocols.data.internet.ipv6_opts import ILNPOption as Data_ILNPOption -from pcapkit.protocols.data.internet.ipv6_opts import IPDFFOption as Data_IPDFFOption -from pcapkit.protocols.data.internet.ipv6_opts import IPv6_Opts as Data_IPv6_Opts -from pcapkit.protocols.data.internet.ipv6_opts import JumboPayloadOption as Data_JumboPayloadOption -from pcapkit.protocols.data.internet.ipv6_opts import \ +from pcapkit.protocols.internet.ipv6_ext.protocol import IPv6_Ext +from pcapkit.protocols.internet.ipv6_opts.data import CALIPSOOption as Data_CALIPSOOption +from pcapkit.protocols.internet.ipv6_opts.data import DFFFlags as Data_DFFFlags +from pcapkit.protocols.internet.ipv6_opts.data import HomeAddressOption as Data_HomeAddressOption +from pcapkit.protocols.internet.ipv6_opts.data import ILNPOption as Data_ILNPOption +from pcapkit.protocols.internet.ipv6_opts.data import IPDFFOption as Data_IPDFFOption +from pcapkit.protocols.internet.ipv6_opts.data import IPv6_Opts as Data_IPv6_Opts +from pcapkit.protocols.internet.ipv6_opts.data import JumboPayloadOption as Data_JumboPayloadOption +from pcapkit.protocols.internet.ipv6_opts.data import \ LineIdentificationOption as Data_LineIdentificationOption -from pcapkit.protocols.data.internet.ipv6_opts import MPLFlags as Data_MPLFlags -from pcapkit.protocols.data.internet.ipv6_opts import MPLOption as Data_MPLOption -from pcapkit.protocols.data.internet.ipv6_opts import PadOption as Data_PadOption -from pcapkit.protocols.data.internet.ipv6_opts import PDMOption as Data_PDMOption -from pcapkit.protocols.data.internet.ipv6_opts import \ +from pcapkit.protocols.internet.ipv6_opts.data import MPLFlags as Data_MPLFlags +from pcapkit.protocols.internet.ipv6_opts.data import MPLOption as Data_MPLOption +from pcapkit.protocols.internet.ipv6_opts.data import PadOption as Data_PadOption +from pcapkit.protocols.internet.ipv6_opts.data import PDMOption as Data_PDMOption +from pcapkit.protocols.internet.ipv6_opts.data import \ QuickStartReportOption as Data_QuickStartReportOption -from pcapkit.protocols.data.internet.ipv6_opts import \ +from pcapkit.protocols.internet.ipv6_opts.data import \ QuickStartRequestOption as Data_QuickStartRequestOption -from pcapkit.protocols.data.internet.ipv6_opts import RouterAlertOption as Data_RouterAlertOption -from pcapkit.protocols.data.internet.ipv6_opts import RPLFlags as Data_RPLFlags -from pcapkit.protocols.data.internet.ipv6_opts import RPLOption as Data_RPLOption -from pcapkit.protocols.data.internet.ipv6_opts import \ +from pcapkit.protocols.internet.ipv6_opts.data import RouterAlertOption as Data_RouterAlertOption +from pcapkit.protocols.internet.ipv6_opts.data import RPLFlags as Data_RPLFlags +from pcapkit.protocols.internet.ipv6_opts.data import RPLOption as Data_RPLOption +from pcapkit.protocols.internet.ipv6_opts.data import \ SMFHashBasedDPDOption as Data_SMFHashBasedDPDOption -from pcapkit.protocols.data.internet.ipv6_opts import \ +from pcapkit.protocols.internet.ipv6_opts.data import \ SMFIdentificationBasedDPDOption as Data_SMFIdentificationBasedDPDOption -from pcapkit.protocols.data.internet.ipv6_opts import \ +from pcapkit.protocols.internet.ipv6_opts.data import \ TunnelEncapsulationLimitOption as Data_TunnelEncapsulationLimitOption -from pcapkit.protocols.data.internet.ipv6_opts import UnassignedOption as Data_UnassignedOption -from pcapkit.protocols.internet.ipv6_ext import IPv6_Ext -from pcapkit.protocols.misc.no_payload import NoPayload -from pcapkit.protocols.schema.internet.ipv6_opts import CALIPSOOption as Schema_CALIPSOOption -from pcapkit.protocols.schema.internet.ipv6_opts import \ +from pcapkit.protocols.internet.ipv6_opts.data import UnassignedOption as Data_UnassignedOption +from pcapkit.protocols.internet.ipv6_opts.schema import CALIPSOOption as Schema_CALIPSOOption +from pcapkit.protocols.internet.ipv6_opts.schema import \ HomeAddressOption as Schema_HomeAddressOption -from pcapkit.protocols.schema.internet.ipv6_opts import ILNPOption as Schema_ILNPOption -from pcapkit.protocols.schema.internet.ipv6_opts import IPDFFOption as Schema_IPDFFOption -from pcapkit.protocols.schema.internet.ipv6_opts import IPv6_Opts as Schema_IPv6_Opts -from pcapkit.protocols.schema.internet.ipv6_opts import \ +from pcapkit.protocols.internet.ipv6_opts.schema import ILNPOption as Schema_ILNPOption +from pcapkit.protocols.internet.ipv6_opts.schema import IPDFFOption as Schema_IPDFFOption +from pcapkit.protocols.internet.ipv6_opts.schema import IPv6_Opts as Schema_IPv6_Opts +from pcapkit.protocols.internet.ipv6_opts.schema import \ JumboPayloadOption as Schema_JumboPayloadOption -from pcapkit.protocols.schema.internet.ipv6_opts import \ +from pcapkit.protocols.internet.ipv6_opts.schema import \ LineIdentificationOption as Schema_LineIdentificationOption -from pcapkit.protocols.schema.internet.ipv6_opts import MPLOption as Schema_MPLOption -from pcapkit.protocols.schema.internet.ipv6_opts import PadOption as Schema_PadOption -from pcapkit.protocols.schema.internet.ipv6_opts import PDMOption as Schema_PDMOption -from pcapkit.protocols.schema.internet.ipv6_opts import \ +from pcapkit.protocols.internet.ipv6_opts.schema import MPLOption as Schema_MPLOption +from pcapkit.protocols.internet.ipv6_opts.schema import PadOption as Schema_PadOption +from pcapkit.protocols.internet.ipv6_opts.schema import PDMOption as Schema_PDMOption +from pcapkit.protocols.internet.ipv6_opts.schema import \ QuickStartReportOption as Schema_QuickStartReportOption -from pcapkit.protocols.schema.internet.ipv6_opts import \ +from pcapkit.protocols.internet.ipv6_opts.schema import \ QuickStartRequestOption as Schema_QuickStartRequestOption -from pcapkit.protocols.schema.internet.ipv6_opts import \ +from pcapkit.protocols.internet.ipv6_opts.schema import \ RouterAlertOption as Schema_RouterAlertOption -from pcapkit.protocols.schema.internet.ipv6_opts import RPLOption as Schema_RPLOption -from pcapkit.protocols.schema.internet.ipv6_opts import \ +from pcapkit.protocols.internet.ipv6_opts.schema import RPLOption as Schema_RPLOption +from pcapkit.protocols.internet.ipv6_opts.schema import \ SMFHashBasedDPDOption as Schema_SMFHashBasedDPDOption -from pcapkit.protocols.schema.internet.ipv6_opts import \ +from pcapkit.protocols.internet.ipv6_opts.schema import \ SMFIdentificationBasedDPDOption as Schema_SMFIdentificationBasedDPDOption -from pcapkit.protocols.schema.internet.ipv6_opts import \ +from pcapkit.protocols.internet.ipv6_opts.schema import \ TunnelEncapsulationLimitOption as Schema_TunnelEncapsulationLimitOption -from pcapkit.protocols.schema.internet.ipv6_opts import UnassignedOption as Schema_UnassignedOption -from pcapkit.protocols.schema.schema import Schema +from pcapkit.protocols.internet.ipv6_opts.schema import UnassignedOption as Schema_UnassignedOption +from pcapkit.protocols.misc.no_payload.protocol import NoPayload +from pcapkit.protocols.schema import Schema from pcapkit.utilities.exceptions import BaseError, CaughtByCaller, ProtocolError, UnsupportedCall from pcapkit.utilities.warnings import ProtocolWarning, RegistryWarning, warn @@ -107,14 +107,14 @@ from typing_extensions import Literal from pcapkit.corekit.protochain import ProtoChain - from pcapkit.protocols.data.internet.ipv6_opts import Option as Data_Option - from pcapkit.protocols.data.internet.ipv6_opts import QuickStartOption as Data_QuickStartOption - from pcapkit.protocols.data.internet.ipv6_opts import SMFDPDOption as Data_SMFDPDOption - from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.internet.ipv6_opts import Option as Schema_Option - from pcapkit.protocols.schema.internet.ipv6_opts import \ + from pcapkit.protocols.internet.ipv6_opts.data import Option as Data_Option + from pcapkit.protocols.internet.ipv6_opts.data import QuickStartOption as Data_QuickStartOption + from pcapkit.protocols.internet.ipv6_opts.data import SMFDPDOption as Data_SMFDPDOption + from pcapkit.protocols.internet.ipv6_opts.schema import Option as Schema_Option + from pcapkit.protocols.internet.ipv6_opts.schema import \ QuickStartOption as Schema_QuickStartOption - from pcapkit.protocols.schema.internet.ipv6_opts import SMFDPDOption as Schema_SMFDPDOption + from pcapkit.protocols.internet.ipv6_opts.schema import SMFDPDOption as Schema_SMFDPDOption + from pcapkit.protocols.protocol import ProtocolBase Option = OrderedMultiDict[Enum_Option, Data_Option] OptionParser = Callable[[Schema_Option, NamedArg(Option, 'options')], Data_Option] @@ -130,7 +130,7 @@ class IPv6_Opts(IPv6_Ext[Data_IPv6_Opts, Schema_IPv6_Opts], This class parses the following IPv6 destination options, which are registered in the - :attr:`self.__option__ ` + :attr:`self.__option__ ` attribute: .. list-table:: @@ -140,53 +140,53 @@ class IPv6_Opts(IPv6_Ext[Data_IPv6_Opts, Schema_IPv6_Opts], - Option Parser - Option Constructor * - :attr:`~pcapkit.const.ipv6.option.Option.Pad1` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._read_opt_pad` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._make_opt_pad` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._read_opt_pad` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._make_opt_pad` * - :attr:`~pcapkit.const.ipv6.option.Option.PadN` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._read_opt_pad` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._make_opt_pad` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._read_opt_pad` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._make_opt_pad` * - :attr:`~pcapkit.const.ipv6.option.Option.Tunnel_Encapsulation_Limit` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._read_opt_tun` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._make_opt_tun` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._read_opt_tun` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._make_opt_tun` * - :attr:`~pcapkit.const.ipv6.option.Option.Router_Alert` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._read_opt_ra` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._make_opt_ra` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._read_opt_ra` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._make_opt_ra` * - :attr:`~pcapkit.const.ipv6.option.Option.CALIPSO` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._read_opt_calipso` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._make_opt_calipso` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._read_opt_calipso` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._make_opt_calipso` * - :attr:`~pcapkit.const.ipv6.option.Option.SMF_DPD` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._read_opt_smf_dpd` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._make_opt_smf_dpd` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._read_opt_smf_dpd` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._make_opt_smf_dpd` * - :attr:`~pcapkit.const.ipv6.option.Option.PDM` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._read_opt_pdm` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._make_opt_pdm` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._read_opt_pdm` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._make_opt_pdm` * - :attr:`~pcapkit.const.ipv6.option.Option.Quick_Start` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._read_opt_qs` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._make_opt_qs` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._read_opt_qs` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._make_opt_qs` * - :attr:`~pcapkit.const.ipv6.option.Option.RPL_Option_0x23` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._read_opt_rpl` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._make_opt_rpl` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._read_opt_rpl` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._make_opt_rpl` * - :attr:`~pcapkit.const.ipv6.option.Option.RPL_Option_0x63` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._read_opt_rpl` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._make_opt_rpl` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._read_opt_rpl` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._make_opt_rpl` * - :attr:`~pcapkit.const.ipv6.option.Option.MPL_Option` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._read_opt_mpl` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._make_opt_mpl` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._read_opt_mpl` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._make_opt_mpl` * - :attr:`~pcapkit.const.ipv6.option.Option.ILNP_Nonce` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._read_opt_ilnp` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._make_opt_ilnp` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._read_opt_ilnp` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._make_opt_ilnp` * - :attr:`~pcapkit.const.ipv6.option.Option.Line_Identification_Option` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._read_opt_lio` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._make_opt_lio` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._read_opt_lio` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._make_opt_lio` * - :attr:`~pcapkit.const.ipv6.option.Option.Jumbo_Payload` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._read_opt_jumbo` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._make_opt_jumbo` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._read_opt_jumbo` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._make_opt_jumbo` * - :attr:`~pcapkit.const.ipv6.option.Option.Home_Address` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._read_opt_home` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._make_opt_home` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._read_opt_home` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._make_opt_home` * - :attr:`~pcapkit.const.ipv6.option.Option.IP_DFF` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._read_opt_ip_dff` - - :meth:`~pcapkit.protocols.internet.ipv6_opts.IPv6_Opts._make_opt_ip_dff` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._read_opt_ip_dff` + - :meth:`~pcapkit.protocols.internet.ipv6_opts.protocol.IPv6_Opts._make_opt_ip_dff` .. versionchanged:: 1.5.0 @@ -844,9 +844,9 @@ def _read_opt_pad(self, schema: 'Schema_PadOption', *, options: 'Option') -> 'Da Note: A ``Pad1`` option occupies a single octet and carries no ``Opt Data Len`` field, so its - :attr:`~pcapkit.protocols.data.internet.ipv6_opts.Option.length` is + :attr:`~pcapkit.protocols.internet.ipv6_opts.data.Option.length` is ``1`` rather than ``len + 2``. That one-octet wire shape is enforced - by :class:`~pcapkit.protocols.schema.internet.ipv6_opts.PadOption` + by :class:`~pcapkit.protocols.internet.ipv6_opts.schema.PadOption` itself, which sizes both the length octet and the padding data from the option type; ``clen`` is therefore always ``0`` here for a parsed ``Pad1``, and the length check this method makes only guards @@ -973,7 +973,7 @@ def _read_opt_calipso(self, schema: 'Schema_CALIPSOOption', *, options: 'Option' ``Cmpt Length`` counts 32-bit words and may be odd [:rfc:`5570#section-5.2`]; it only has to fit inside ``Opt Data Len``, which - :func:`~pcapkit.protocols.schema.internet.ipv6_option.calipso_pad_len` + :func:`~pcapkit.protocols.internet.ipv6_ext.schema.calipso_pad_len` has already checked while the option was unpacked. """ @@ -1173,8 +1173,8 @@ def _read_opt_qs(self, schema: 'Schema_QuickStartOption', *, options: 'Option') defined layout, so the schema keeps it as an unassigned option and it is parsed as one, see :meth:`_read_opt_none`. That dispatch is by the schema's own class, decided from the octets a file read - hands it; a :class:`~pcapkit.protocols.schema.internet.ipv6_opts.QuickStartRequestOption` - or :class:`~pcapkit.protocols.schema.internet.ipv6_opts.QuickStartReportOption` + hands it; a :class:`~pcapkit.protocols.internet.ipv6_opts.schema.QuickStartRequestOption` + or :class:`~pcapkit.protocols.internet.ipv6_opts.schema.QuickStartReportOption` built directly with an unassigned ``func`` reaches this method regardless, which is why it still raises below rather than returning early. @@ -1628,9 +1628,9 @@ def _make_opt_pad(self, code: 'Enum_Option', opt: 'Optional[Data_PadOption]' = N Note: :attr:`Data_PadOption.length - ` counts + ` counts the *whole* option, whereas :attr:`Schema_PadOption.len - ` is the + ` is the ``Opt Data Len`` field: two octets fewer, and absent altogether for a ``Pad1``. ``opt`` is honoured so that re-making a parsed padding option keeps its type and size. A ``PadN`` with ``length`` ``0`` is diff --git a/pcapkit/protocols/schema/internet/ipv6_opts.py b/pcapkit/protocols/internet/ipv6_opts/schema.py similarity index 96% rename from pcapkit/protocols/schema/internet/ipv6_opts.py rename to pcapkit/protocols/internet/ipv6_opts/schema.py index 4c0c6f30c9..87df93c1c5 100644 --- a/pcapkit/protocols/schema/internet/ipv6_opts.py +++ b/pcapkit/protocols/internet/ipv6_opts/schema.py @@ -19,9 +19,9 @@ UInt32Field) from pcapkit.corekit.fields.strings import BitField, BytesField, PaddingField from pcapkit.corekit.sentinels import NO_VALUE -from pcapkit.protocols.schema.internet import ipv6_option -from pcapkit.protocols.schema.internet.ipv6_option import pad_opt_data_len, rpl_opt_sub_tlv_len -from pcapkit.protocols.schema.schema import EnumSchema, Schema, schema_final +from pcapkit.protocols.internet.ipv6_ext import schema as ipv6_option +from pcapkit.protocols.internet.ipv6_ext.schema import pad_opt_data_len, rpl_opt_sub_tlv_len +from pcapkit.protocols.schema import EnumSchema, Schema, schema_final from pcapkit.utilities.logging import SPHINX_TYPE_CHECKING __all__ = [ @@ -130,7 +130,7 @@ class QSNonce(TypedDict): # NOTE: The option helpers are shared with HOPOPT and live in -# :mod:`pcapkit.protocols.schema.internet.ipv6_option`. The functions below bind +# :mod:`pcapkit.protocols.internet.ipv6_ext.schema`. The functions below bind # what differs between the two headers: the ``IPv6-Opts`` error prefix, and the # option schemas of this module. @@ -138,7 +138,7 @@ class QSNonce(TypedDict): def mpl_opt_seed_id_len(pkt: 'dict[str, Any]') -> 'int': """Return MPL Seed-ID length. - See :func:`pcapkit.protocols.schema.internet.ipv6_option.mpl_opt_seed_id_len`; + See :func:`pcapkit.protocols.internet.ipv6_ext.schema.mpl_opt_seed_id_len`; errors are reported as ``IPv6-Opts``. """ @@ -148,7 +148,7 @@ def mpl_opt_seed_id_len(pkt: 'dict[str, Any]') -> 'int': def smf_i_dpd_id_len(pkt: 'dict[str, Any]') -> 'int': """Return SMF I-DPD identifier length. - See :func:`pcapkit.protocols.schema.internet.ipv6_option.smf_i_dpd_id_len`; + See :func:`pcapkit.protocols.internet.ipv6_ext.schema.smf_i_dpd_id_len`; errors are reported as ``IPv6-Opts``. """ @@ -158,7 +158,7 @@ def smf_i_dpd_id_len(pkt: 'dict[str, Any]') -> 'int': def smf_dpd_data_selector(pkt: 'dict[str, Any]') -> 'Field': """Selector function for :attr:`_SMFDPDOption.data` field. - See :func:`pcapkit.protocols.schema.internet.ipv6_option.smf_dpd_data_selector`, + See :func:`pcapkit.protocols.internet.ipv6_ext.schema.smf_dpd_data_selector`, choosing among the schemas registered with :class:`SMFDPDOption`; errors are reported as ``IPv6-Opts``. @@ -169,7 +169,7 @@ def smf_dpd_data_selector(pkt: 'dict[str, Any]') -> 'Field': def smf_i_dpd_tid_selector(pkt: 'dict[str, Any]') -> 'Field': """Selector function for :attr:`SMFIdentificationBasedDPDOption.tid` field. - See :func:`pcapkit.protocols.schema.internet.ipv6_option.smf_i_dpd_tid_selector`; + See :func:`pcapkit.protocols.internet.ipv6_ext.schema.smf_i_dpd_tid_selector`; errors are reported as ``IPv6-Opts``. """ @@ -179,7 +179,7 @@ def smf_i_dpd_tid_selector(pkt: 'dict[str, Any]') -> 'Field': def quick_start_data_selector(pkt: 'dict[str, Any]') -> 'Field': """Selector function for :attr:`_QuickStartOption.data` field. - See :func:`pcapkit.protocols.schema.internet.ipv6_option.quick_start_data_selector`, + See :func:`pcapkit.protocols.internet.ipv6_ext.schema.quick_start_data_selector`, choosing among the schemas registered with :class:`QuickStartOption`, and :class:`UnassignedOption` for an unassigned QS function. @@ -191,7 +191,7 @@ def quick_start_data_selector(pkt: 'dict[str, Any]') -> 'Field': def calipso_pad_len(pkt: 'dict[str, Any]') -> 'int': """Return CALIPSO option padding length. - See :func:`pcapkit.protocols.schema.internet.ipv6_option.calipso_pad_len`; + See :func:`pcapkit.protocols.internet.ipv6_ext.schema.calipso_pad_len`; errors are reported as ``IPv6-Opts``. """ @@ -201,7 +201,7 @@ def calipso_pad_len(pkt: 'dict[str, Any]') -> 'int': def mpl_opt_pad_len(pkt: 'dict[str, Any]') -> 'int': """Return MPL option padding length. - See :func:`pcapkit.protocols.schema.internet.ipv6_option.mpl_opt_pad_len`; + See :func:`pcapkit.protocols.internet.ipv6_ext.schema.mpl_opt_pad_len`; errors are reported as ``IPv6-Opts``. """ diff --git a/pcapkit/protocols/internet/ipv6_route/__init__.py b/pcapkit/protocols/internet/ipv6_route/__init__.py new file mode 100644 index 0000000000..6a870a952b --- /dev/null +++ b/pcapkit/protocols/internet/ipv6_route/__init__.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""IPv6-Route - Routing Header for IPv6 +========================================== + +.. module:: pcapkit.protocols.internet.ipv6_route + +:mod:`pcapkit.protocols.internet.ipv6_route` holds the dissector, +:class:`~pcapkit.protocols.internet.ipv6_route.protocol.IPv6_Route`, in +:mod:`~pcapkit.protocols.internet.ipv6_route.protocol`, its header schema in +:mod:`~pcapkit.protocols.internet.ipv6_route.schema` and its data model in +:mod:`~pcapkit.protocols.internet.ipv6_route.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.internet.ipv6_route.protocol import IPv6_Route + +# Header Schemas +from pcapkit.protocols.internet.ipv6_route.schema import RPL as Schema_RPL +from pcapkit.protocols.internet.ipv6_route.schema import IPv6_Route as Schema_IPv6_Route +from pcapkit.protocols.internet.ipv6_route.schema import RoutingType as Schema_RoutingType +from pcapkit.protocols.internet.ipv6_route.schema import SourceRoute as Schema_SourceRoute +from pcapkit.protocols.internet.ipv6_route.schema import Type2 as Schema_Type2 +from pcapkit.protocols.internet.ipv6_route.schema import UnknownType as Schema_UnknownType + +# Data Models +from pcapkit.protocols.internet.ipv6_route.data import RPL as Data_RPL +from pcapkit.protocols.internet.ipv6_route.data import IPv6_Route as Data_IPv6_Route +from pcapkit.protocols.internet.ipv6_route.data import SourceRoute as Data_SourceRoute +from pcapkit.protocols.internet.ipv6_route.data import Type2 as Data_Type2 +from pcapkit.protocols.internet.ipv6_route.data import UnknownType as Data_UnknownType + +__all__ = ['IPv6_Route'] diff --git a/pcapkit/protocols/data/internet/ipv6_route.py b/pcapkit/protocols/internet/ipv6_route/data.py similarity index 98% rename from pcapkit/protocols/data/internet/ipv6_route.py rename to pcapkit/protocols/internet/ipv6_route/data.py index 5c173b514e..4035d5dcfa 100644 --- a/pcapkit/protocols/data/internet/ipv6_route.py +++ b/pcapkit/protocols/internet/ipv6_route/data.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Protocol if TYPE_CHECKING: from ipaddress import IPv6Address diff --git a/pcapkit/protocols/internet/ipv6_route.py b/pcapkit/protocols/internet/ipv6_route/protocol.py similarity index 95% rename from pcapkit/protocols/internet/ipv6_route.py rename to pcapkit/protocols/internet/ipv6_route/protocol.py index 833c05236a..6b9d048ace 100644 --- a/pcapkit/protocols/internet/ipv6_route.py +++ b/pcapkit/protocols/internet/ipv6_route/protocol.py @@ -2,10 +2,10 @@ """IPv6-Route - Routing Header for IPv6 ========================================== -.. module:: pcapkit.protocols.internet.ipv6_route +.. module:: pcapkit.protocols.internet.ipv6_route.protocol -:mod:`pcapkit.protocols.internet.ipv6_route` contains -:class:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route` +:mod:`pcapkit.protocols.internet.ipv6_route.protocol` contains +:class:`~pcapkit.protocols.internet.ipv6_route.protocol.IPv6_Route` only, which implements the extractor for Routing Header for IPv6 (IPv6-Route) [*]_, whose structure is described as below: @@ -31,22 +31,22 @@ from pcapkit.const.reg.transtype import TransType as Enum_TransType from pcapkit.corekit.schema.ipaddress import parse_ip_address from pcapkit.corekit.schema.padding import pad_length -from pcapkit.protocols.data.internet.ipv6_route import RPL as Data_RPL -from pcapkit.protocols.data.internet.ipv6_route import IPv6_Route as Data_IPv6_Route -from pcapkit.protocols.data.internet.ipv6_route import SourceRoute as Data_SourceRoute -from pcapkit.protocols.data.internet.ipv6_route import Type2 as Data_Type2 -from pcapkit.protocols.data.internet.ipv6_route import UnknownType as Data_UnknownType -from pcapkit.protocols.internet.ipv6_ext import IPv6_Ext -from pcapkit.protocols.misc.no_payload import NoPayload -from pcapkit.protocols.schema.internet.ipv6_route import RPL as Schema_RPL -from pcapkit.protocols.schema.internet.ipv6_route import IPv6_Route as Schema_IPv6_Route -from pcapkit.protocols.schema.internet.ipv6_route import RoutingType as Schema_RoutingType -from pcapkit.protocols.schema.internet.ipv6_route import SourceRoute as Schema_SourceRoute -from pcapkit.protocols.schema.internet.ipv6_route import Type2 as Schema_Type2 -from pcapkit.protocols.schema.internet.ipv6_route import UnknownType as Schema_UnknownType -from pcapkit.protocols.schema.internet.ipv6_route import (ipv6_route_data_length, +from pcapkit.protocols.internet.ipv6_ext.protocol import IPv6_Ext +from pcapkit.protocols.internet.ipv6_route.data import RPL as Data_RPL +from pcapkit.protocols.internet.ipv6_route.data import IPv6_Route as Data_IPv6_Route +from pcapkit.protocols.internet.ipv6_route.data import SourceRoute as Data_SourceRoute +from pcapkit.protocols.internet.ipv6_route.data import Type2 as Data_Type2 +from pcapkit.protocols.internet.ipv6_route.data import UnknownType as Data_UnknownType +from pcapkit.protocols.internet.ipv6_route.schema import RPL as Schema_RPL +from pcapkit.protocols.internet.ipv6_route.schema import IPv6_Route as Schema_IPv6_Route +from pcapkit.protocols.internet.ipv6_route.schema import RoutingType as Schema_RoutingType +from pcapkit.protocols.internet.ipv6_route.schema import SourceRoute as Schema_SourceRoute +from pcapkit.protocols.internet.ipv6_route.schema import Type2 as Schema_Type2 +from pcapkit.protocols.internet.ipv6_route.schema import UnknownType as Schema_UnknownType +from pcapkit.protocols.internet.ipv6_route.schema import (ipv6_route_data_length, ipv6_route_header_length) -from pcapkit.protocols.schema.schema import Schema +from pcapkit.protocols.misc.no_payload.protocol import NoPayload +from pcapkit.protocols.schema import Schema from pcapkit.utilities.exceptions import ProtocolError, UnsupportedCall from pcapkit.utilities.warnings import RegistryWarning, warn @@ -73,7 +73,7 @@ class IPv6_Route(IPv6_Ext[Data_IPv6_Route, Schema_IPv6_Route], This class parses the following Routing Header for IPv6 routing data types, which are registered in the - :attr:`self.__routing__ ` + :attr:`self.__routing__ ` attribute: .. list-table:: @@ -83,14 +83,14 @@ class IPv6_Route(IPv6_Ext[Data_IPv6_Route, Schema_IPv6_Route], - Data Parser - Data Constructor * - :attr:`~pcapkit.const.ipv6.routing.Routing.Source_Route` - - :meth:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route._read_data_type_src` - - :meth:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route._make_data_type_src` + - :meth:`~pcapkit.protocols.internet.ipv6_route.protocol.IPv6_Route._read_data_type_src` + - :meth:`~pcapkit.protocols.internet.ipv6_route.protocol.IPv6_Route._make_data_type_src` * - :attr:`~pcapkit.const.ipv6.routing.Routing.Type_2_Routing_Header` - - :meth:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route._read_data_type_2` - - :meth:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route._make_data_type_2` + - :meth:`~pcapkit.protocols.internet.ipv6_route.protocol.IPv6_Route._read_data_type_2` + - :meth:`~pcapkit.protocols.internet.ipv6_route.protocol.IPv6_Route._make_data_type_2` * - :attr:`~pcapkit.const.ipv6.routing.Routing.RPL_Source_Route_Header` - - :meth:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route._read_data_type_rpl` - - :meth:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route._make_data_type_rpl` + - :meth:`~pcapkit.protocols.internet.ipv6_route.protocol.IPv6_Route._read_data_type_rpl` + - :meth:`~pcapkit.protocols.internet.ipv6_route.protocol.IPv6_Route._make_data_type_rpl` .. versionchanged:: 1.3.4 @@ -504,7 +504,7 @@ def _make_hdr_ext_len(data_length: 'int') -> 'int': fixed part (``next``/``length``/``type``/``seg_left``) is 4 octets, so the on-the-wire header is ``4 + data_length`` octets; equating that to ``8 + 8 * hdr_ext_len`` gives ``hdr_ext_len = (data_length - 4) / 8``. - :func:`~pcapkit.protocols.schema.internet.ipv6_route.ipv6_route_data_length` + :func:`~pcapkit.protocols.internet.ipv6_route.schema.ipv6_route_data_length` is the inverse, used on the read side. This is the *only* place ``Hdr Ext Len`` is computed on the write side: @@ -516,7 +516,7 @@ def _make_hdr_ext_len(data_length: 'int') -> 'int': Args: data_length: packed length, in octets, of the type-specific data (i.e. ``len(data_val.pack())`` for a - :class:`~pcapkit.protocols.schema.schema.Schema`-based payload, or the padded raw + :class:`~pcapkit.protocols.schema.Schema`-based payload, or the padded raw :obj:`bytes` length for the unknown/raw-bytes case). Returns: diff --git a/pcapkit/protocols/schema/internet/ipv6_route.py b/pcapkit/protocols/internet/ipv6_route/schema.py similarity index 91% rename from pcapkit/protocols/schema/internet/ipv6_route.py rename to pcapkit/protocols/internet/ipv6_route/schema.py index d22fc6e1f8..fc883fefe4 100644 --- a/pcapkit/protocols/schema/internet/ipv6_route.py +++ b/pcapkit/protocols/internet/ipv6_route/schema.py @@ -12,7 +12,7 @@ from pcapkit.corekit.fields.misc import PayloadField, SchemaField, SwitchField from pcapkit.corekit.fields.numbers import EnumField, UInt8Field from pcapkit.corekit.fields.strings import BitField, BytesField, PaddingField -from pcapkit.protocols.schema.schema import EnumSchema, Schema, schema_final +from pcapkit.protocols.schema import EnumSchema, Schema, schema_final from pcapkit.utilities.logging import SPHINX_TYPE_CHECKING __all__ = [ @@ -54,9 +54,9 @@ def ipv6_route_data_length(hdr_ext_len: 'int') -> 'int': that, the 4 octets of ``next``/``length``/``type``/``seg_left`` are not part of the type-specific data, so the data itself -- what :func:`ipv6_route_data_selector` hands to the nested - :class:`~pcapkit.protocols.schema.internet.ipv6_route.RoutingType` schema -- is ``4 + 8 * + :class:`~pcapkit.protocols.internet.ipv6_route.schema.RoutingType` schema -- is ``4 + 8 * hdr_ext_len`` octets. This is the single place that arithmetic is done on the read side; see - :meth:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route._make_hdr_ext_len` for its inverse on + :meth:`~pcapkit.protocols.internet.ipv6_route.protocol.IPv6_Route._make_hdr_ext_len` for its inverse on the write side. Dropping the ``4 +`` would leave the data length 4 octets short. Args: @@ -78,14 +78,14 @@ def ipv6_route_header_length(hdr_ext_len: 'int') -> 'int': :func:`ipv6_route_data_length` itself (``8 + 8 * hdr_ext_len`` here vs. ``4 + 8 * hdr_ext_len`` there), not a duplicate of it. It is what each ``_read_data_type_*`` in - :mod:`pcapkit.protocols.internet.ipv6_route` reports back as the parsed + :mod:`pcapkit.protocols.internet.ipv6_route.protocol` reports back as the parsed route data's own ``.length``, which - :meth:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route.read` then + :meth:`~pcapkit.protocols.internet.ipv6_route.protocol.IPv6_Route.read` then subtracts from the outer packet length to find the next layer's length. Its inverse is the ``(length - 8) // 8`` that - :meth:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route._make_data` + :meth:`~pcapkit.protocols.internet.ipv6_route.protocol.IPv6_Route._make_data` passes back as ``hdr_ext_len``; - :meth:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route._make_hdr_ext_len` + :meth:`~pcapkit.protocols.internet.ipv6_route.protocol.IPv6_Route._make_hdr_ext_len` inverts :func:`ipv6_route_data_length` instead. Args: @@ -106,8 +106,8 @@ def ipv6_route_data_selector(pkt: 'dict[str, Any]') -> 'Field': Returns: A :class:`~pcapkit.corekit.fields.misc.SchemaField` wrapped - :class:`~pcapkit.protocols.schema.internet.ipv6_route.RoutingType` - instance based on :attr:`IPv6_Route.type `. + :class:`~pcapkit.protocols.internet.ipv6_route.schema.RoutingType` + instance based on :attr:`IPv6_Route.type `. """ type = cast('Enum_Routing', pkt['type']) @@ -205,7 +205,7 @@ class RPL(RoutingType, code=Enum_Routing.RPL_Source_Route_Header): #: (4 bits) plus ``Reserved`` (20 bits) -- this is the one 32-bit word the #: diagram in :rfc:`6554#section-3` draws, and the same word #: :meth:`IPv6_Route._read_data_type_rpl - #: `'s + #: `'s #: own docstring draws. The split between the two fields falls on the octet #: boundary between ``CmprE`` and ``Pad``, so neither straddles an octet. cmpr: 'CmprInfo' = BitField(length=1, namespace={ @@ -257,11 +257,11 @@ def post_process(self, packet: 'dict[str, Any]') -> 'Schema': # NOTE: ``self.addresses`` is still a ``list[bytes]`` -- one # already-compressed address per item -- when this schema was # built via ``make`` (see - # :meth:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route._make_data_type_rpl`) + # :meth:`~pcapkit.protocols.internet.ipv6_route.protocol.IPv6_Route._make_data_type_rpl`) # rather than parsed off the wire. There is nothing to decode in # that case: the caller supplied each address already # compressed, and :meth:`Schema.pack - # `'s own + # `'s own # :class:`~pcapkit.corekit.fields.collections.ListField` handling # packs that list directly. The SRH prefix-decompression below # only makes sense against the raw octets a real parse hands @@ -271,8 +271,8 @@ def post_process(self, packet: 'dict[str, Any]') -> 'Schema': # left alone. :meth:`Protocol.__post_init__ # ` packs and # then unpacks, and :meth:`IPv6_Route.read - # ` hands - # :meth:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route._read_data_type_rpl` + # ` hands + # :meth:`~pcapkit.protocols.internet.ipv6_route.protocol.IPv6_Route._read_data_type_rpl` # *this* schema on that path, not a re-parsed one -- so returning # early without ``ip`` would raise a bare ``AttributeError`` from # the reader. Each item is one whole element of @@ -306,7 +306,7 @@ def post_process(self, packet: 'dict[str, Any]') -> 'Schema': # ``length`` callback asked for -- ``pad_len`` already subtracted, the # trailing padding octets being read by :attr:`padding` -- and a # malformed one (no whole number of addresses) is rejected by - # :meth:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route._read_data_type_rpl`, + # :meth:`~pcapkit.protocols.internet.ipv6_route.protocol.IPv6_Route._read_data_type_rpl`, # so it is only clamped here. declared = packet.get('__rpl_length__', len(buffer) + 4 + self.pad['pad_len']) area = max(declared - 4 - self.pad['pad_len'], 0) diff --git a/pcapkit/protocols/internet/ipx/__init__.py b/pcapkit/protocols/internet/ipx/__init__.py new file mode 100644 index 0000000000..ca8aba95ad --- /dev/null +++ b/pcapkit/protocols/internet/ipx/__init__.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""IPX - Internetwork Packet Exchange +======================================== + +.. module:: pcapkit.protocols.internet.ipx + +:mod:`pcapkit.protocols.internet.ipx` holds the dissector, +:class:`~pcapkit.protocols.internet.ipx.protocol.IPX`, in +:mod:`~pcapkit.protocols.internet.ipx.protocol`, its header schema in +:mod:`~pcapkit.protocols.internet.ipx.schema` and its data model in +:mod:`~pcapkit.protocols.internet.ipx.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.internet.ipx.protocol import IPX + +# Header Schemas +from pcapkit.protocols.internet.ipx.schema import IPX as Schema_IPX + +# Data Models +from pcapkit.protocols.internet.ipx.data import IPX as Data_IPX +from pcapkit.protocols.internet.ipx.data import Address as Data_Address + +__all__ = ['IPX'] diff --git a/pcapkit/protocols/data/internet/ipx.py b/pcapkit/protocols/internet/ipx/data.py similarity index 94% rename from pcapkit/protocols/data/internet/ipx.py rename to pcapkit/protocols/internet/ipx/data.py index 3fcca470f0..94d2a2d8bc 100644 --- a/pcapkit/protocols/data/internet/ipx.py +++ b/pcapkit/protocols/internet/ipx/data.py @@ -4,8 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.data import Data -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Data, Protocol if TYPE_CHECKING: from pcapkit.const.ipx.packet import Packet diff --git a/pcapkit/protocols/internet/ipx.py b/pcapkit/protocols/internet/ipx/protocol.py similarity index 95% rename from pcapkit/protocols/internet/ipx.py rename to pcapkit/protocols/internet/ipx/protocol.py index 4cee4c8571..7eb0179f19 100644 --- a/pcapkit/protocols/internet/ipx.py +++ b/pcapkit/protocols/internet/ipx/protocol.py @@ -2,10 +2,10 @@ """IPX - Internetwork Packet Exchange ======================================== -.. module:: pcapkit.protocols.internet.ipx +.. module:: pcapkit.protocols.internet.ipx.protocol -:mod:`pcapkit.protocols.internet.ipx` contains -:class:`~pcapkit.protocols.internet.ipx.IPX` only, +:mod:`pcapkit.protocols.internet.ipx.protocol` contains +:class:`~pcapkit.protocols.internet.ipx.protocol.IPX` only, which implements the extractor for Internetwork Packet Exchange (IPX) [*]_, whose structure is described as below: @@ -32,10 +32,10 @@ from pcapkit.const.ipx.socket import Socket as Enum_Socket from pcapkit.const.reg.transtype import TransType as Enum_TransType from pcapkit.corekit.module import ModuleDescriptor -from pcapkit.protocols.data.internet.ipx import IPX as Data_IPX -from pcapkit.protocols.data.internet.ipx import Address as Data_Address from pcapkit.protocols.internet.internet import Internet -from pcapkit.protocols.schema.internet.ipx import IPX as Schema_IPX +from pcapkit.protocols.internet.ipx.data import IPX as Data_IPX +from pcapkit.protocols.internet.ipx.data import Address as Data_Address +from pcapkit.protocols.internet.ipx.schema import IPX as Schema_IPX from pcapkit.utilities.warnings import RegistryWarning, warn if TYPE_CHECKING: @@ -45,7 +45,7 @@ from pcapkit.corekit.enum import EnumRegistry from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema __all__ = ['IPX'] @@ -60,7 +60,7 @@ class IPX(Internet[Data_IPX, Schema_IPX], rebuilds a parsed packet rather than raising :exc:`struct.error` (:issue:`1315`), and the octets past the IPX Length field are kept as - :attr:`~pcapkit.protocols.schema.internet.ipx.IPX.trailer` + :attr:`~pcapkit.protocols.internet.ipx.schema.IPX.trailer` (:issue:`1433`). The payload is dissected by IPX Packet Type from a registry of its own, @@ -103,10 +103,10 @@ class IPX(Internet[Data_IPX, Schema_IPX], #: instead of sharing :attr:`Internet.__proto__ #: ` (:issue:`2169`). #: No IPX-native protocol is shipped, so the payload is - #: :class:`~pcapkit.protocols.misc.raw.Raw` unless one is registered with + #: :class:`~pcapkit.protocols.misc.raw.protocol.Raw` unless one is registered with #: :func:`~pcapkit.foundation.registry.protocols.internet.register_ipx`. __proto__ = collections.defaultdict( - lambda: ModuleDescriptor('pcapkit.protocols.misc.raw', 'Raw'), + lambda: ModuleDescriptor('pcapkit.protocols.misc.raw.protocol', 'Raw'), ) # type: DefaultDict[int, ModuleDescriptor[ProtocolBase] | Type[ProtocolBase]] #: What :attr:`__proto__` is keyed by, declared as diff --git a/pcapkit/protocols/schema/internet/ipx.py b/pcapkit/protocols/internet/ipx/schema.py similarity index 96% rename from pcapkit/protocols/schema/internet/ipx.py rename to pcapkit/protocols/internet/ipx/schema.py index 0d69a3de57..2b39eeaaa8 100644 --- a/pcapkit/protocols/schema/internet/ipx.py +++ b/pcapkit/protocols/internet/ipx/schema.py @@ -8,7 +8,7 @@ from pcapkit.corekit.fields.misc import PayloadField from pcapkit.corekit.fields.numbers import EnumField, UInt8Field, UInt16Field from pcapkit.corekit.fields.strings import BytesField -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final __all__ = ['IPX'] diff --git a/pcapkit/protocols/internet/mh/__init__.py b/pcapkit/protocols/internet/mh/__init__.py new file mode 100644 index 0000000000..68569de832 --- /dev/null +++ b/pcapkit/protocols/internet/mh/__init__.py @@ -0,0 +1,433 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""mh +======== + +.. module:: pcapkit.protocols.internet.mh + +:mod:`pcapkit.protocols.internet.mh` holds the dissector, +:class:`~pcapkit.protocols.internet.mh.protocol.MH`, in +:mod:`~pcapkit.protocols.internet.mh.protocol`, its header schema in +:mod:`~pcapkit.protocols.internet.mh.schema` and its data model in +:mod:`~pcapkit.protocols.internet.mh.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.internet.mh.protocol import MH + +# Header Schemas +from pcapkit.protocols.internet.mh.schema import MH as Schema_MH +from pcapkit.protocols.internet.mh.schema import \ + AccessNetworkIdentifierOption as Schema_AccessNetworkIdentifierOption +from pcapkit.protocols.internet.mh.schema import \ + AccessTechnologyTypeOption as Schema_AccessTechnologyTypeOption +from pcapkit.protocols.internet.mh.schema import \ + ActiveMulticastSubscriptionIPv4Option as Schema_ActiveMulticastSubscriptionIPv4Option +from pcapkit.protocols.internet.mh.schema import \ + ActiveMulticastSubscriptionIPv6Option as Schema_ActiveMulticastSubscriptionIPv6Option +from pcapkit.protocols.internet.mh.schema import \ + AllocationRetentionPriorityAttribute as Schema_AllocationRetentionPriorityAttribute +from pcapkit.protocols.internet.mh.schema import \ + AlternateCareofAddressOption as Schema_AlternateCareofAddressOption +from pcapkit.protocols.internet.mh.schema import \ + AlternateIPv4CareofAddressOption as Schema_AlternateIPv4CareofAddressOption +from pcapkit.protocols.internet.mh.schema import AnchoredPrefixOption as Schema_AnchoredPrefixOption +from pcapkit.protocols.internet.mh.schema import \ + ANICivicLocationSuboption as Schema_ANICivicLocationSuboption +from pcapkit.protocols.internet.mh.schema import \ + ANIGeoLocationSuboption as Schema_ANIGeoLocationSuboption +from pcapkit.protocols.internet.mh.schema import \ + ANIMAGGroupIdentifierSuboption as Schema_ANIMAGGroupIdentifierSuboption +from pcapkit.protocols.internet.mh.schema import \ + ANINetworkIdentifierSuboption as Schema_ANINetworkIdentifierSuboption +from pcapkit.protocols.internet.mh.schema import \ + ANIOperatorIdentifierSuboption as Schema_ANIOperatorIdentifierSuboption +from pcapkit.protocols.internet.mh.schema import ANISuboption as Schema_ANISuboption +from pcapkit.protocols.internet.mh.schema import \ + ANIUpdateTimerSuboption as Schema_ANIUpdateTimerSuboption +from pcapkit.protocols.internet.mh.schema import AuthOption as Schema_AuthOption +from pcapkit.protocols.internet.mh.schema import \ + AuthorizationDataOption as Schema_AuthorizationDataOption +from pcapkit.protocols.internet.mh.schema import BADFOption as Schema_BADFOption +from pcapkit.protocols.internet.mh.schema import \ + BIDReferenceSuboption as Schema_BIDReferenceSuboption +from pcapkit.protocols.internet.mh.schema import \ + BindingAcknowledgementMessage as Schema_BindingAcknowledgementMessage +from pcapkit.protocols.internet.mh.schema import BindingErrorMessage as Schema_BindingErrorMessage +from pcapkit.protocols.internet.mh.schema import \ + BindingIdentifierOption as Schema_BindingIdentifierOption +from pcapkit.protocols.internet.mh.schema import \ + BindingRefreshAdviceOption as Schema_BindingRefreshAdviceOption +from pcapkit.protocols.internet.mh.schema import \ + BindingRefreshRequestMessage as Schema_BindingRefreshRequestMessage +from pcapkit.protocols.internet.mh.schema import \ + BindingReregistrationControlSuboption as Schema_BindingReregistrationControlSuboption +from pcapkit.protocols.internet.mh.schema import \ + BindingRevocationMessage as Schema_BindingRevocationMessage +from pcapkit.protocols.internet.mh.schema import BindingUpdateMessage as Schema_BindingUpdateMessage +from pcapkit.protocols.internet.mh.schema import BitRateAttribute as Schema_BitRateAttribute +from pcapkit.protocols.internet.mh.schema import \ + CareofTestInitMessage as Schema_CareofTestInitMessage +from pcapkit.protocols.internet.mh.schema import CareofTestInitOption as Schema_CareofTestInitOption +from pcapkit.protocols.internet.mh.schema import CareofTestMessage as Schema_CareofTestMessage +from pcapkit.protocols.internet.mh.schema import CareofTestOption as Schema_CareofTestOption +from pcapkit.protocols.internet.mh.schema import CGAExtension as Schema_CGAExtension +from pcapkit.protocols.internet.mh.schema import CGAParameter as Schema_CGAParameter +from pcapkit.protocols.internet.mh.schema import CGAParametersOption as Schema_CGAParametersOption +from pcapkit.protocols.internet.mh.schema import \ + CGAParametersRequestOption as Schema_CGAParametersRequestOption +from pcapkit.protocols.internet.mh.schema import ContextRequestOption as Schema_ContextRequestOption +from pcapkit.protocols.internet.mh.schema import DelegatedMNPOption as Schema_DelegatedMNPOption +from pcapkit.protocols.internet.mh.schema import \ + DLIFLinkLayerAddressOption as Schema_DLIFLinkLayerAddressOption +from pcapkit.protocols.internet.mh.schema import \ + DLIFLinkLocalAddressOption as Schema_DLIFLinkLocalAddressOption +from pcapkit.protocols.internet.mh.schema import DNSUpdateOption as Schema_DNSUpdateOption +from pcapkit.protocols.internet.mh.schema import \ + DynamicIPMulticastSelectorOption as Schema_DynamicIPMulticastSelectorOption +from pcapkit.protocols.internet.mh.schema import \ + ExperimentalExtension as Schema_ExperimentalExtension +from pcapkit.protocols.internet.mh.schema import ExperimentalMessage as Schema_ExperimentalMessage +from pcapkit.protocols.internet.mh.schema import \ + ExperimentalMobilityOption as Schema_ExperimentalMobilityOption +from pcapkit.protocols.internet.mh.schema import \ + FastBindingAcknowledgmentMessage as Schema_FastBindingAcknowledgmentMessage +from pcapkit.protocols.internet.mh.schema import \ + FastBindingUpdateMessage as Schema_FastBindingUpdateMessage +from pcapkit.protocols.internet.mh.schema import \ + FastNeighborAdvertisementMessage as Schema_FastNeighborAdvertisementMessage +from pcapkit.protocols.internet.mh.schema import \ + FlowBindingActionSuboption as Schema_FlowBindingActionSuboption +from pcapkit.protocols.internet.mh.schema import FlowBindingMessage as Schema_FlowBindingMessage +from pcapkit.protocols.internet.mh.schema import \ + FlowIdentificationOption as Schema_FlowIdentificationOption +from pcapkit.protocols.internet.mh.schema import \ + FlowIdentificationSuboption as Schema_FlowIdentificationSuboption +from pcapkit.protocols.internet.mh.schema import FlowSummaryOption as Schema_FlowSummaryOption +from pcapkit.protocols.internet.mh.schema import GREKeyOption as Schema_GREKeyOption +from pcapkit.protocols.internet.mh.schema import \ + HandoffIndicatorOption as Schema_HandoffIndicatorOption +from pcapkit.protocols.internet.mh.schema import \ + HandoverAcknowledgeMessage as Schema_HandoverAcknowledgeMessage +from pcapkit.protocols.internet.mh.schema import \ + HandoverInitiateMessage as Schema_HandoverInitiateMessage +from pcapkit.protocols.internet.mh.schema import \ + HeartbeatControlSuboption as Schema_HeartbeatControlSuboption +from pcapkit.protocols.internet.mh.schema import HeartbeatMessage as Schema_HeartbeatMessage +from pcapkit.protocols.internet.mh.schema import \ + HomeAgentSwitchMessage as Schema_HomeAgentSwitchMessage +from pcapkit.protocols.internet.mh.schema import \ + HomeNetworkPrefixOption as Schema_HomeNetworkPrefixOption +from pcapkit.protocols.internet.mh.schema import HomeTestInitMessage as Schema_HomeTestInitMessage +from pcapkit.protocols.internet.mh.schema import HomeTestMessage as Schema_HomeTestMessage +from pcapkit.protocols.internet.mh.schema import \ + IPv4AddressAcknowledgementOption as Schema_IPv4AddressAcknowledgementOption +from pcapkit.protocols.internet.mh.schema import \ + IPv4CareofAddressOption as Schema_IPv4CareofAddressOption +from pcapkit.protocols.internet.mh.schema import \ + IPv4DefaultRouterAddressOption as Schema_IPv4DefaultRouterAddressOption +from pcapkit.protocols.internet.mh.schema import \ + IPv4DHCPSupportModeOption as Schema_IPv4DHCPSupportModeOption +from pcapkit.protocols.internet.mh.schema import \ + IPv4HomeAddressOption as Schema_IPv4HomeAddressOption +from pcapkit.protocols.internet.mh.schema import \ + IPv4HomeAddressReplyOption as Schema_IPv4HomeAddressReplyOption +from pcapkit.protocols.internet.mh.schema import \ + IPv4HomeAddressRequestOption as Schema_IPv4HomeAddressRequestOption +from pcapkit.protocols.internet.mh.schema import \ + IPv4TrafficOffloadSelectorOption as Schema_IPv4TrafficOffloadSelectorOption +from pcapkit.protocols.internet.mh.schema import \ + IPv6AddressPrefixOption as Schema_IPv6AddressPrefixOption +from pcapkit.protocols.internet.mh.schema import \ + LinkLayerAddressOption as Schema_LinkLayerAddressOption +from pcapkit.protocols.internet.mh.schema import \ + LinkLocalAddressOption as Schema_LinkLocalAddressOption +from pcapkit.protocols.internet.mh.schema import LMAAddressOption as Schema_LMAAddressOption +from pcapkit.protocols.internet.mh.schema import \ + LMAControlledMAGParametersOption as Schema_LMAControlledMAGParametersOption +from pcapkit.protocols.internet.mh.schema import \ + LMAControlledMAGSuboption as Schema_LMAControlledMAGSuboption +from pcapkit.protocols.internet.mh.schema import \ + LMAUserPlaneAddressOption as Schema_LMAUserPlaneAddressOption +from pcapkit.protocols.internet.mh.schema import \ + LoadInformationOption as Schema_LoadInformationOption +from pcapkit.protocols.internet.mh.schema import \ + LocalizedRoutingAcknowledgmentMessage as Schema_LocalizedRoutingAcknowledgmentMessage +from pcapkit.protocols.internet.mh.schema import \ + LocalizedRoutingInitiationMessage as Schema_LocalizedRoutingInitiationMessage +from pcapkit.protocols.internet.mh.schema import LocalPrefixOption as Schema_LocalPrefixOption +from pcapkit.protocols.internet.mh.schema import MAGIdentifierOption as Schema_MAGIdentifierOption +from pcapkit.protocols.internet.mh.schema import MAGIPv6AddressOption as Schema_MAGIPv6AddressOption +from pcapkit.protocols.internet.mh.schema import \ + MAGMultipathBindingOption as Schema_MAGMultipathBindingOption +from pcapkit.protocols.internet.mh.schema import MesgIDOption as Schema_MesgIDOption +from pcapkit.protocols.internet.mh.schema import \ + MNGroupIdentifierOption as Schema_MNGroupIdentifierOption +from pcapkit.protocols.internet.mh.schema import MNIDOption as Schema_MNIDOption +from pcapkit.protocols.internet.mh.schema import MNLLAIIDOption as Schema_MNLLAIIDOption +from pcapkit.protocols.internet.mh.schema import MNLLIdentifierOption as Schema_MNLLIdentifierOption +from pcapkit.protocols.internet.mh.schema import \ + MobileNetworkPrefixOption as Schema_MobileNetworkPrefixOption +from pcapkit.protocols.internet.mh.schema import \ + MulticastAcknowledgementOption as Schema_MulticastAcknowledgementOption +from pcapkit.protocols.internet.mh.schema import \ + MulticastMobilityOption as Schema_MulticastMobilityOption +from pcapkit.protocols.internet.mh.schema import MultiPrefixExtension as Schema_MultiPrefixExtension +from pcapkit.protocols.internet.mh.schema import NATDetectionOption as Schema_NATDetectionOption +from pcapkit.protocols.internet.mh.schema import NonceIndicesOption as Schema_NonceIndicesOption +from pcapkit.protocols.internet.mh.schema import Option as Schema_Option +from pcapkit.protocols.internet.mh.schema import Packet as Schema_Packet +from pcapkit.protocols.internet.mh.schema import \ + PadFlowIdentificationSuboption as Schema_PadFlowIdentificationSuboption +from pcapkit.protocols.internet.mh.schema import PadOption as Schema_PadOption +from pcapkit.protocols.internet.mh.schema import \ + PermanentHomeKeygenTokenOption as Schema_PermanentHomeKeygenTokenOption +from pcapkit.protocols.internet.mh.schema import \ + PerSessionBitRateAttribute as Schema_PerSessionBitRateAttribute +from pcapkit.protocols.internet.mh.schema import PreviousMAAROption as Schema_PreviousMAAROption +from pcapkit.protocols.internet.mh.schema import QoSAttribute as Schema_QoSAttribute +from pcapkit.protocols.internet.mh.schema import \ + QoSTrafficSelectorAttribute as Schema_QoSTrafficSelectorAttribute +from pcapkit.protocols.internet.mh.schema import \ + QoSVendorSpecificAttribute as Schema_QoSVendorSpecificAttribute +from pcapkit.protocols.internet.mh.schema import \ + QualityOfServiceOption as Schema_QualityOfServiceOption +from pcapkit.protocols.internet.mh.schema import \ + RedirectCapabilityOption as Schema_RedirectCapabilityOption +from pcapkit.protocols.internet.mh.schema import RedirectOption as Schema_RedirectOption +from pcapkit.protocols.internet.mh.schema import RestartCounterOption as Schema_RestartCounterOption +from pcapkit.protocols.internet.mh.schema import \ + ServiceSelectionOption as Schema_ServiceSelectionOption +from pcapkit.protocols.internet.mh.schema import ServingMAAROption as Schema_ServingMAAROption +from pcapkit.protocols.internet.mh.schema import SignatureOption as Schema_SignatureOption +from pcapkit.protocols.internet.mh.schema import \ + SubscriptionQueryMessage as Schema_SubscriptionQueryMessage +from pcapkit.protocols.internet.mh.schema import \ + SubscriptionResponseMessage as Schema_SubscriptionResponseMessage +from pcapkit.protocols.internet.mh.schema import \ + TargetCareofAddressSuboption as Schema_TargetCareofAddressSuboption +from pcapkit.protocols.internet.mh.schema import TimestampOption as Schema_TimestampOption +from pcapkit.protocols.internet.mh.schema import \ + TrafficSelectorSuboption as Schema_TrafficSelectorSuboption +from pcapkit.protocols.internet.mh.schema import \ + TransientBindingOption as Schema_TransientBindingOption +from pcapkit.protocols.internet.mh.schema import \ + UnassignedANISuboption as Schema_UnassignedANISuboption +from pcapkit.protocols.internet.mh.schema import \ + UnassignedFlowIdentificationSuboption as Schema_UnassignedFlowIdentificationSuboption +from pcapkit.protocols.internet.mh.schema import \ + UnassignedLMAControlledMAGSuboption as Schema_UnassignedLMAControlledMAGSuboption +from pcapkit.protocols.internet.mh.schema import UnassignedOption as Schema_UnassignedOption +from pcapkit.protocols.internet.mh.schema import \ + UnassignedQoSAttribute as Schema_UnassignedQoSAttribute +from pcapkit.protocols.internet.mh.schema import UnknownExtension as Schema_UnknownExtension +from pcapkit.protocols.internet.mh.schema import UnknownMessage as Schema_UnknownMessage +from pcapkit.protocols.internet.mh.schema import \ + UpdateNotificationAcknowledgementMessage as Schema_UpdateNotificationAcknowledgementMessage +from pcapkit.protocols.internet.mh.schema import \ + UpdateNotificationMessage as Schema_UpdateNotificationMessage +from pcapkit.protocols.internet.mh.schema import VendorSpecificOption as Schema_VendorSpecificOption + +# Data Models +from pcapkit.protocols.internet.mh.data import MH as Data_MH +from pcapkit.protocols.internet.mh.data import \ + AccessNetworkIdentifierOption as Data_AccessNetworkIdentifierOption +from pcapkit.protocols.internet.mh.data import \ + AccessTechnologyTypeOption as Data_AccessTechnologyTypeOption +from pcapkit.protocols.internet.mh.data import \ + ActiveMulticastSubscriptionIPv4Option as Data_ActiveMulticastSubscriptionIPv4Option +from pcapkit.protocols.internet.mh.data import \ + ActiveMulticastSubscriptionIPv6Option as Data_ActiveMulticastSubscriptionIPv6Option +from pcapkit.protocols.internet.mh.data import \ + AllocationRetentionPriorityAttribute as Data_AllocationRetentionPriorityAttribute +from pcapkit.protocols.internet.mh.data import \ + AlternateCareofAddressOption as Data_AlternateCareofAddressOption +from pcapkit.protocols.internet.mh.data import \ + AlternateIPv4CareofAddressOption as Data_AlternateIPv4CareofAddressOption +from pcapkit.protocols.internet.mh.data import AnchoredPrefixOption as Data_AnchoredPrefixOption +from pcapkit.protocols.internet.mh.data import \ + ANICivicLocationSuboption as Data_ANICivicLocationSuboption +from pcapkit.protocols.internet.mh.data import \ + ANIGeoLocationSuboption as Data_ANIGeoLocationSuboption +from pcapkit.protocols.internet.mh.data import \ + ANIMAGGroupIdentifierSuboption as Data_ANIMAGGroupIdentifierSuboption +from pcapkit.protocols.internet.mh.data import \ + ANINetworkIdentifierSuboption as Data_ANINetworkIdentifierSuboption +from pcapkit.protocols.internet.mh.data import \ + ANIOperatorIdentifierSuboption as Data_ANIOperatorIdentifierSuboption +from pcapkit.protocols.internet.mh.data import ANISuboption as Data_ANISuboption +from pcapkit.protocols.internet.mh.data import \ + ANIUpdateTimerSuboption as Data_ANIUpdateTimerSuboption +from pcapkit.protocols.internet.mh.data import AuthOption as Data_AuthOption +from pcapkit.protocols.internet.mh.data import \ + AuthorizationDataOption as Data_AuthorizationDataOption +from pcapkit.protocols.internet.mh.data import BADFOption as Data_BADFOption +from pcapkit.protocols.internet.mh.data import BIDReferenceSuboption as Data_BIDReferenceSuboption +from pcapkit.protocols.internet.mh.data import \ + BindingAcknowledgementMessage as Data_BindingAcknowledgementMessage +from pcapkit.protocols.internet.mh.data import BindingErrorMessage as Data_BindingErrorMessage +from pcapkit.protocols.internet.mh.data import \ + BindingIdentifierOption as Data_BindingIdentifierOption +from pcapkit.protocols.internet.mh.data import \ + BindingRefreshAdviceOption as Data_BindingRefreshAdviceOption +from pcapkit.protocols.internet.mh.data import \ + BindingRefreshRequestMessage as Data_BindingRefreshRequestMessage +from pcapkit.protocols.internet.mh.data import \ + BindingReregistrationControlSuboption as Data_BindingReregistrationControlSuboption +from pcapkit.protocols.internet.mh.data import \ + BindingRevocationMessage as Data_BindingRevocationMessage +from pcapkit.protocols.internet.mh.data import BindingUpdateMessage as Data_BindingUpdateMessage +from pcapkit.protocols.internet.mh.data import BitRateAttribute as Data_BitRateAttribute +from pcapkit.protocols.internet.mh.data import CareofTestInitMessage as Data_CareofTestInitMessage +from pcapkit.protocols.internet.mh.data import CareofTestInitOption as Data_CareofTestInitOption +from pcapkit.protocols.internet.mh.data import CareofTestMessage as Data_CareofTestMessage +from pcapkit.protocols.internet.mh.data import CareofTestOption as Data_CareofTestOption +from pcapkit.protocols.internet.mh.data import CGAExtension as Data_CGAExtension +from pcapkit.protocols.internet.mh.data import CGAParameter as Data_CGAParameter +from pcapkit.protocols.internet.mh.data import CGAParametersOption as Data_CGAParametersOption +from pcapkit.protocols.internet.mh.data import \ + CGAParametersRequestOption as Data_CGAParametersRequestOption +from pcapkit.protocols.internet.mh.data import ContextRequest as Data_ContextRequest +from pcapkit.protocols.internet.mh.data import ContextRequestOption as Data_ContextRequestOption +from pcapkit.protocols.internet.mh.data import DelegatedMNPOption as Data_DelegatedMNPOption +from pcapkit.protocols.internet.mh.data import \ + DLIFLinkLayerAddressOption as Data_DLIFLinkLayerAddressOption +from pcapkit.protocols.internet.mh.data import \ + DLIFLinkLocalAddressOption as Data_DLIFLinkLocalAddressOption +from pcapkit.protocols.internet.mh.data import DNSUpdateOption as Data_DNSUpdateOption +from pcapkit.protocols.internet.mh.data import \ + DynamicIPMulticastSelectorOption as Data_DynamicIPMulticastSelectorOption +from pcapkit.protocols.internet.mh.data import ExperimentalExtension as Data_ExperimentalExtension +from pcapkit.protocols.internet.mh.data import ExperimentalMessage as Data_ExperimentalMessage +from pcapkit.protocols.internet.mh.data import \ + ExperimentalMobilityOption as Data_ExperimentalMobilityOption +from pcapkit.protocols.internet.mh.data import \ + FastBindingAcknowledgmentMessage as Data_FastBindingAcknowledgmentMessage +from pcapkit.protocols.internet.mh.data import \ + FastBindingUpdateMessage as Data_FastBindingUpdateMessage +from pcapkit.protocols.internet.mh.data import \ + FastNeighborAdvertisementMessage as Data_FastNeighborAdvertisementMessage +from pcapkit.protocols.internet.mh.data import \ + FlowBindingActionSuboption as Data_FlowBindingActionSuboption +from pcapkit.protocols.internet.mh.data import FlowBindingMessage as Data_FlowBindingMessage +from pcapkit.protocols.internet.mh.data import \ + FlowIdentificationOption as Data_FlowIdentificationOption +from pcapkit.protocols.internet.mh.data import \ + FlowIdentificationSuboption as Data_FlowIdentificationSuboption +from pcapkit.protocols.internet.mh.data import FlowSummaryOption as Data_FlowSummaryOption +from pcapkit.protocols.internet.mh.data import GREKeyOption as Data_GREKeyOption +from pcapkit.protocols.internet.mh.data import HandoffIndicatorOption as Data_HandoffIndicatorOption +from pcapkit.protocols.internet.mh.data import \ + HandoverAcknowledgeMessage as Data_HandoverAcknowledgeMessage +from pcapkit.protocols.internet.mh.data import \ + HandoverInitiateMessage as Data_HandoverInitiateMessage +from pcapkit.protocols.internet.mh.data import \ + HeartbeatControlSuboption as Data_HeartbeatControlSuboption +from pcapkit.protocols.internet.mh.data import HeartbeatMessage as Data_HeartbeatMessage +from pcapkit.protocols.internet.mh.data import HomeAgentSwitchMessage as Data_HomeAgentSwitchMessage +from pcapkit.protocols.internet.mh.data import \ + HomeNetworkPrefixOption as Data_HomeNetworkPrefixOption +from pcapkit.protocols.internet.mh.data import HomeTestInitMessage as Data_HomeTestInitMessage +from pcapkit.protocols.internet.mh.data import HomeTestMessage as Data_HomeTestMessage +from pcapkit.protocols.internet.mh.data import \ + IPv4AddressAcknowledgementOption as Data_IPv4AddressAcknowledgementOption +from pcapkit.protocols.internet.mh.data import \ + IPv4CareofAddressOption as Data_IPv4CareofAddressOption +from pcapkit.protocols.internet.mh.data import \ + IPv4DefaultRouterAddressOption as Data_IPv4DefaultRouterAddressOption +from pcapkit.protocols.internet.mh.data import \ + IPv4DHCPSupportModeOption as Data_IPv4DHCPSupportModeOption +from pcapkit.protocols.internet.mh.data import IPv4HomeAddressOption as Data_IPv4HomeAddressOption +from pcapkit.protocols.internet.mh.data import \ + IPv4HomeAddressReplyOption as Data_IPv4HomeAddressReplyOption +from pcapkit.protocols.internet.mh.data import \ + IPv4HomeAddressRequestOption as Data_IPv4HomeAddressRequestOption +from pcapkit.protocols.internet.mh.data import \ + IPv4TrafficOffloadSelectorOption as Data_IPv4TrafficOffloadSelectorOption +from pcapkit.protocols.internet.mh.data import \ + IPv6AddressPrefixOption as Data_IPv6AddressPrefixOption +from pcapkit.protocols.internet.mh.data import LinkLayerAddressOption as Data_LinkLayerAddressOption +from pcapkit.protocols.internet.mh.data import LinkLocalAddressOption as Data_LinkLocalAddressOption +from pcapkit.protocols.internet.mh.data import LMAAddressOption as Data_LMAAddressOption +from pcapkit.protocols.internet.mh.data import \ + LMAControlledMAGParametersOption as Data_LMAControlledMAGParametersOption +from pcapkit.protocols.internet.mh.data import \ + LMAControlledMAGSuboption as Data_LMAControlledMAGSuboption +from pcapkit.protocols.internet.mh.data import \ + LMAUserPlaneAddressOption as Data_LMAUserPlaneAddressOption +from pcapkit.protocols.internet.mh.data import LoadInformationOption as Data_LoadInformationOption +from pcapkit.protocols.internet.mh.data import \ + LocalizedRoutingAcknowledgmentMessage as Data_LocalizedRoutingAcknowledgmentMessage +from pcapkit.protocols.internet.mh.data import \ + LocalizedRoutingInitiationMessage as Data_LocalizedRoutingInitiationMessage +from pcapkit.protocols.internet.mh.data import LocalPrefixOption as Data_LocalPrefixOption +from pcapkit.protocols.internet.mh.data import MAGIdentifierOption as Data_MAGIdentifierOption +from pcapkit.protocols.internet.mh.data import MAGIPv6AddressOption as Data_MAGIPv6AddressOption +from pcapkit.protocols.internet.mh.data import \ + MAGMultipathBindingOption as Data_MAGMultipathBindingOption +from pcapkit.protocols.internet.mh.data import MesgIDOption as Data_MesgIDOption +from pcapkit.protocols.internet.mh.data import \ + MNGroupIdentifierOption as Data_MNGroupIdentifierOption +from pcapkit.protocols.internet.mh.data import MNIDOption as Data_MNIDOption +from pcapkit.protocols.internet.mh.data import MNLLAIIDOption as Data_MNLLAIIDOption +from pcapkit.protocols.internet.mh.data import MNLLIdentifierOption as Data_MNLLIdentifierOption +from pcapkit.protocols.internet.mh.data import \ + MobileNetworkPrefixOption as Data_MobileNetworkPrefixOption +from pcapkit.protocols.internet.mh.data import \ + MulticastAcknowledgementOption as Data_MulticastAcknowledgementOption +from pcapkit.protocols.internet.mh.data import \ + MulticastMobilityOption as Data_MulticastMobilityOption +from pcapkit.protocols.internet.mh.data import MultiPrefixExtension as Data_MultiPrefixExtension +from pcapkit.protocols.internet.mh.data import NATDetectionOption as Data_NATDetectionOption +from pcapkit.protocols.internet.mh.data import NonceIndicesOption as Data_NonceIndicesOption +from pcapkit.protocols.internet.mh.data import NTPTimestamp as Data_NTPTimestamp +from pcapkit.protocols.internet.mh.data import Option as Data_Option +from pcapkit.protocols.internet.mh.data import \ + PadFlowIdentificationSuboption as Data_PadFlowIdentificationSuboption +from pcapkit.protocols.internet.mh.data import PadOption as Data_PadOption +from pcapkit.protocols.internet.mh.data import \ + PermanentHomeKeygenTokenOption as Data_PermanentHomeKeygenTokenOption +from pcapkit.protocols.internet.mh.data import \ + PerSessionBitRateAttribute as Data_PerSessionBitRateAttribute +from pcapkit.protocols.internet.mh.data import PMIPv6Timestamp as Data_PMIPv6Timestamp +from pcapkit.protocols.internet.mh.data import PreviousMAAROption as Data_PreviousMAAROption +from pcapkit.protocols.internet.mh.data import QoSAttribute as Data_QoSAttribute +from pcapkit.protocols.internet.mh.data import \ + QoSTrafficSelectorAttribute as Data_QoSTrafficSelectorAttribute +from pcapkit.protocols.internet.mh.data import \ + QoSVendorSpecificAttribute as Data_QoSVendorSpecificAttribute +from pcapkit.protocols.internet.mh.data import QualityOfServiceOption as Data_QualityOfServiceOption +from pcapkit.protocols.internet.mh.data import \ + RedirectCapabilityOption as Data_RedirectCapabilityOption +from pcapkit.protocols.internet.mh.data import RedirectOption as Data_RedirectOption +from pcapkit.protocols.internet.mh.data import RestartCounterOption as Data_RestartCounterOption +from pcapkit.protocols.internet.mh.data import ServiceSelectionOption as Data_ServiceSelectionOption +from pcapkit.protocols.internet.mh.data import ServingMAAROption as Data_ServingMAAROption +from pcapkit.protocols.internet.mh.data import SignatureOption as Data_SignatureOption +from pcapkit.protocols.internet.mh.data import \ + SubscriptionQueryMessage as Data_SubscriptionQueryMessage +from pcapkit.protocols.internet.mh.data import \ + SubscriptionResponseMessage as Data_SubscriptionResponseMessage +from pcapkit.protocols.internet.mh.data import \ + TargetCareofAddressSuboption as Data_TargetCareofAddressSuboption +from pcapkit.protocols.internet.mh.data import TimestampOption as Data_TimestampOption +from pcapkit.protocols.internet.mh.data import \ + TrafficSelectorSuboption as Data_TrafficSelectorSuboption +from pcapkit.protocols.internet.mh.data import TransientBindingOption as Data_TransientBindingOption +from pcapkit.protocols.internet.mh.data import UnassignedANISuboption as Data_UnassignedANISuboption +from pcapkit.protocols.internet.mh.data import \ + UnassignedFlowIdentificationSuboption as Data_UnassignedFlowIdentificationSuboption +from pcapkit.protocols.internet.mh.data import \ + UnassignedLMAControlledMAGSuboption as Data_UnassignedLMAControlledMAGSuboption +from pcapkit.protocols.internet.mh.data import UnassignedOption as Data_UnassignedOption +from pcapkit.protocols.internet.mh.data import UnassignedQoSAttribute as Data_UnassignedQoSAttribute +from pcapkit.protocols.internet.mh.data import UnknownExtension as Data_UnknownExtension +from pcapkit.protocols.internet.mh.data import UnknownMessage as Data_UnknownMessage +from pcapkit.protocols.internet.mh.data import \ + UpdateNotificationAcknowledgementMessage as Data_UpdateNotificationAcknowledgementMessage +from pcapkit.protocols.internet.mh.data import \ + UpdateNotificationMessage as Data_UpdateNotificationMessage +from pcapkit.protocols.internet.mh.data import VendorSpecificOption as Data_VendorSpecificOption + +__all__ = ['MH'] diff --git a/pcapkit/protocols/data/internet/mh.py b/pcapkit/protocols/internet/mh/data.py similarity index 99% rename from pcapkit/protocols/data/internet/mh.py rename to pcapkit/protocols/internet/mh/data.py index 8cdd45009d..0bc24387ca 100644 --- a/pcapkit/protocols/data/internet/mh.py +++ b/pcapkit/protocols/internet/mh/data.py @@ -4,8 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.data import Data -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Data, Protocol if TYPE_CHECKING: from datetime import datetime as dt_type @@ -66,9 +65,9 @@ from pcapkit.const.reg.transtype import TransType from pcapkit.corekit.infoclass import OrderedMultiInfo from pcapkit.corekit.multidict import OrderedMultiDict - from pcapkit.protocols.internet.mh import (FastBindingAcknowledgmentStatus, - IPv6AddressPrefixCode, LMAAddressCode, - LocalizedRoutingStatus) + from pcapkit.protocols.internet.mh.protocol import (FastBindingAcknowledgmentStatus, + IPv6AddressPrefixCode, LMAAddressCode, + LocalizedRoutingStatus) __all__ = [ 'MH', @@ -472,7 +471,7 @@ class FastBindingAcknowledgmentMessage(MH): #: Status. :rfc:`5568#section-6.2.3` defines the FBack status values inline #: rather than drawing them from the IANA *Status Codes* registry, so this #: field carries the module-local - #: :class:`~pcapkit.protocols.internet.mh.FastBindingAcknowledgmentStatus` + #: :class:`~pcapkit.protocols.internet.mh.protocol.FastBindingAcknowledgmentStatus` #: instead of :class:`~pcapkit.const.mh.status_code.StatusCode`. status: 'FastBindingAcknowledgmentStatus' #: Key management mobility capability flag. @@ -688,7 +687,7 @@ class LocalizedRoutingAcknowledgmentMessage(MH): flags_reserved: 'int' #: Status. :rfc:`6705#section-10.2` defines its values inline with no IANA #: registry behind them, so this field carries the module-local - #: :class:`~pcapkit.protocols.internet.mh.LocalizedRoutingStatus` rather than + #: :class:`~pcapkit.protocols.internet.mh.protocol.LocalizedRoutingStatus` rather than #: :class:`~pcapkit.const.mh.status_code.StatusCode`. status: 'LocalizedRoutingStatus' #: Lifetime, in seconds. @@ -1004,7 +1003,7 @@ class NTPTimestamp(Data): .. versionchanged:: 1.5.0 An :class:`~pcapkit.corekit.infoclass.Info` data model in this module, - rather than a named tuple in :mod:`pcapkit.protocols.internet.mh`, which + rather than a named tuple in :mod:`pcapkit.protocols.internet.mh.protocol`, which no longer binds the name (:issue:`1886`). This breaks 1.4.x code that treats it as a tuple: it no longer indexes, unpacks, hashes, orders, compares equal to a :obj:`tuple`, or has ``_replace`` and ``_asdict``. @@ -1215,7 +1214,7 @@ class IPv6AddressPrefixOption(Option): #: Option code, see :rfc:`5568#section-6.4.2`. The codes are defined inline #: by the RFC with no IANA registry behind them, so this field carries the #: module-local - #: :class:`~pcapkit.protocols.internet.mh.IPv6AddressPrefixCode`. + #: :class:`~pcapkit.protocols.internet.mh.protocol.IPv6AddressPrefixCode`. code: 'IPv6AddressPrefixCode' #: Prefix length. prefix_length: 'int' @@ -1614,7 +1613,7 @@ class LMAAddressOption(Option): #: Option code, see :rfc:`5949#section-6.2.2`. The codes are defined inline #: by the RFC with no IANA registry behind them, so this field carries the - #: module-local :class:`~pcapkit.protocols.internet.mh.LMAAddressCode`. + #: module-local :class:`~pcapkit.protocols.internet.mh.protocol.LMAAddressCode`. code: 'LMAAddressCode' #: The reserved octet, as captured. reserved: 'bytes' diff --git a/pcapkit/protocols/internet/mh.py b/pcapkit/protocols/internet/mh/protocol.py similarity index 93% rename from pcapkit/protocols/internet/mh.py rename to pcapkit/protocols/internet/mh/protocol.py index 16685a6c1b..11532c2100 100644 --- a/pcapkit/protocols/internet/mh.py +++ b/pcapkit/protocols/internet/mh/protocol.py @@ -2,8 +2,8 @@ # pylint: disable=fixme """Mobility Header -:mod:`pcapkit.protocols.internet.mh` contains -:class:`~pcapkit.protocols.internet.mh.MH`, +:mod:`pcapkit.protocols.internet.mh.protocol` contains +:class:`~pcapkit.protocols.internet.mh.protocol.MH`, which implements the extractor for Mobility Header (MH) [*]_, whose structure is described as below: @@ -23,7 +23,7 @@ .. versionremoved:: 1.5.0 ``pcapkit.protocols.internet.mh.NTPTimestamp``, with no alias; use - :class:`pcapkit.protocols.data.internet.mh.NTPTimestamp` instead + :class:`pcapkit.protocols.internet.mh.data.NTPTimestamp` instead (:issue:`1886`). """ @@ -87,417 +87,417 @@ from pcapkit.corekit.multidict import OrderedMultiDict from pcapkit.corekit.schema.ipaddress import parse_ip_address from pcapkit.corekit.schema.padding import pad_length -from pcapkit.protocols.data.internet.mh import MH as Data_MH -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.ipv6_ext.protocol import IPv6_Ext +from pcapkit.protocols.internet.mh.data import MH as Data_MH +from pcapkit.protocols.internet.mh.data import \ AccessNetworkIdentifierOption as Data_AccessNetworkIdentifierOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ AccessTechnologyTypeOption as Data_AccessTechnologyTypeOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ ActiveMulticastSubscriptionIPv4Option as Data_ActiveMulticastSubscriptionIPv4Option -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ ActiveMulticastSubscriptionIPv6Option as Data_ActiveMulticastSubscriptionIPv6Option -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ AllocationRetentionPriorityAttribute as Data_AllocationRetentionPriorityAttribute -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ AlternateCareofAddressOption as Data_AlternateCareofAddressOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ AlternateIPv4CareofAddressOption as Data_AlternateIPv4CareofAddressOption -from pcapkit.protocols.data.internet.mh import AnchoredPrefixOption as Data_AnchoredPrefixOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import AnchoredPrefixOption as Data_AnchoredPrefixOption +from pcapkit.protocols.internet.mh.data import \ ANICivicLocationSuboption as Data_ANICivicLocationSuboption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ ANIGeoLocationSuboption as Data_ANIGeoLocationSuboption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ ANIMAGGroupIdentifierSuboption as Data_ANIMAGGroupIdentifierSuboption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ ANINetworkIdentifierSuboption as Data_ANINetworkIdentifierSuboption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ ANIOperatorIdentifierSuboption as Data_ANIOperatorIdentifierSuboption -from pcapkit.protocols.data.internet.mh import ANISuboption as Data_ANISuboption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import ANISuboption as Data_ANISuboption +from pcapkit.protocols.internet.mh.data import \ ANIUpdateTimerSuboption as Data_ANIUpdateTimerSuboption -from pcapkit.protocols.data.internet.mh import AuthOption as Data_AuthOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import AuthOption as Data_AuthOption +from pcapkit.protocols.internet.mh.data import \ AuthorizationDataOption as Data_AuthorizationDataOption -from pcapkit.protocols.data.internet.mh import BADFOption as Data_BADFOption -from pcapkit.protocols.data.internet.mh import BIDReferenceSuboption as Data_BIDReferenceSuboption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import BADFOption as Data_BADFOption +from pcapkit.protocols.internet.mh.data import BIDReferenceSuboption as Data_BIDReferenceSuboption +from pcapkit.protocols.internet.mh.data import \ BindingAcknowledgementMessage as Data_BindingAcknowledgementMessage -from pcapkit.protocols.data.internet.mh import BindingErrorMessage as Data_BindingErrorMessage -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import BindingErrorMessage as Data_BindingErrorMessage +from pcapkit.protocols.internet.mh.data import \ BindingIdentifierOption as Data_BindingIdentifierOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ BindingRefreshAdviceOption as Data_BindingRefreshAdviceOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ BindingRefreshRequestMessage as Data_BindingRefreshRequestMessage -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ BindingReregistrationControlSuboption as Data_BindingReregistrationControlSuboption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ BindingRevocationMessage as Data_BindingRevocationMessage -from pcapkit.protocols.data.internet.mh import BindingUpdateMessage as Data_BindingUpdateMessage -from pcapkit.protocols.data.internet.mh import BitRateAttribute as Data_BitRateAttribute -from pcapkit.protocols.data.internet.mh import CareofTestInitMessage as Data_CareofTestInitMessage -from pcapkit.protocols.data.internet.mh import CareofTestInitOption as Data_CareofTestInitOption -from pcapkit.protocols.data.internet.mh import CareofTestMessage as Data_CareofTestMessage -from pcapkit.protocols.data.internet.mh import CareofTestOption as Data_CareofTestOption -from pcapkit.protocols.data.internet.mh import CGAExtension as Data_CGAExtension -from pcapkit.protocols.data.internet.mh import CGAParameter as Data_CGAParameter -from pcapkit.protocols.data.internet.mh import CGAParametersOption as Data_CGAParametersOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import BindingUpdateMessage as Data_BindingUpdateMessage +from pcapkit.protocols.internet.mh.data import BitRateAttribute as Data_BitRateAttribute +from pcapkit.protocols.internet.mh.data import CareofTestInitMessage as Data_CareofTestInitMessage +from pcapkit.protocols.internet.mh.data import CareofTestInitOption as Data_CareofTestInitOption +from pcapkit.protocols.internet.mh.data import CareofTestMessage as Data_CareofTestMessage +from pcapkit.protocols.internet.mh.data import CareofTestOption as Data_CareofTestOption +from pcapkit.protocols.internet.mh.data import CGAExtension as Data_CGAExtension +from pcapkit.protocols.internet.mh.data import CGAParameter as Data_CGAParameter +from pcapkit.protocols.internet.mh.data import CGAParametersOption as Data_CGAParametersOption +from pcapkit.protocols.internet.mh.data import \ CGAParametersRequestOption as Data_CGAParametersRequestOption -from pcapkit.protocols.data.internet.mh import ContextRequest as Data_ContextRequest -from pcapkit.protocols.data.internet.mh import ContextRequestOption as Data_ContextRequestOption -from pcapkit.protocols.data.internet.mh import DelegatedMNPOption as Data_DelegatedMNPOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import ContextRequest as Data_ContextRequest +from pcapkit.protocols.internet.mh.data import ContextRequestOption as Data_ContextRequestOption +from pcapkit.protocols.internet.mh.data import DelegatedMNPOption as Data_DelegatedMNPOption +from pcapkit.protocols.internet.mh.data import \ DLIFLinkLayerAddressOption as Data_DLIFLinkLayerAddressOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ DLIFLinkLocalAddressOption as Data_DLIFLinkLocalAddressOption -from pcapkit.protocols.data.internet.mh import DNSUpdateOption as Data_DNSUpdateOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import DNSUpdateOption as Data_DNSUpdateOption +from pcapkit.protocols.internet.mh.data import \ DynamicIPMulticastSelectorOption as Data_DynamicIPMulticastSelectorOption -from pcapkit.protocols.data.internet.mh import ExperimentalExtension as Data_ExperimentalExtension -from pcapkit.protocols.data.internet.mh import ExperimentalMessage as Data_ExperimentalMessage -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import ExperimentalExtension as Data_ExperimentalExtension +from pcapkit.protocols.internet.mh.data import ExperimentalMessage as Data_ExperimentalMessage +from pcapkit.protocols.internet.mh.data import \ ExperimentalMobilityOption as Data_ExperimentalMobilityOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ FastBindingAcknowledgmentMessage as Data_FastBindingAcknowledgmentMessage -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ FastBindingUpdateMessage as Data_FastBindingUpdateMessage -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ FastNeighborAdvertisementMessage as Data_FastNeighborAdvertisementMessage -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ FlowBindingActionSuboption as Data_FlowBindingActionSuboption -from pcapkit.protocols.data.internet.mh import FlowBindingMessage as Data_FlowBindingMessage -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import FlowBindingMessage as Data_FlowBindingMessage +from pcapkit.protocols.internet.mh.data import \ FlowIdentificationOption as Data_FlowIdentificationOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ FlowIdentificationSuboption as Data_FlowIdentificationSuboption -from pcapkit.protocols.data.internet.mh import FlowSummaryOption as Data_FlowSummaryOption -from pcapkit.protocols.data.internet.mh import GREKeyOption as Data_GREKeyOption -from pcapkit.protocols.data.internet.mh import HandoffIndicatorOption as Data_HandoffIndicatorOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import FlowSummaryOption as Data_FlowSummaryOption +from pcapkit.protocols.internet.mh.data import GREKeyOption as Data_GREKeyOption +from pcapkit.protocols.internet.mh.data import HandoffIndicatorOption as Data_HandoffIndicatorOption +from pcapkit.protocols.internet.mh.data import \ HandoverAcknowledgeMessage as Data_HandoverAcknowledgeMessage -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ HandoverInitiateMessage as Data_HandoverInitiateMessage -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ HeartbeatControlSuboption as Data_HeartbeatControlSuboption -from pcapkit.protocols.data.internet.mh import HeartbeatMessage as Data_HeartbeatMessage -from pcapkit.protocols.data.internet.mh import HomeAgentSwitchMessage as Data_HomeAgentSwitchMessage -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import HeartbeatMessage as Data_HeartbeatMessage +from pcapkit.protocols.internet.mh.data import HomeAgentSwitchMessage as Data_HomeAgentSwitchMessage +from pcapkit.protocols.internet.mh.data import \ HomeNetworkPrefixOption as Data_HomeNetworkPrefixOption -from pcapkit.protocols.data.internet.mh import HomeTestInitMessage as Data_HomeTestInitMessage -from pcapkit.protocols.data.internet.mh import HomeTestMessage as Data_HomeTestMessage -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import HomeTestInitMessage as Data_HomeTestInitMessage +from pcapkit.protocols.internet.mh.data import HomeTestMessage as Data_HomeTestMessage +from pcapkit.protocols.internet.mh.data import \ IPv4AddressAcknowledgementOption as Data_IPv4AddressAcknowledgementOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ IPv4CareofAddressOption as Data_IPv4CareofAddressOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ IPv4DefaultRouterAddressOption as Data_IPv4DefaultRouterAddressOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ IPv4DHCPSupportModeOption as Data_IPv4DHCPSupportModeOption -from pcapkit.protocols.data.internet.mh import IPv4HomeAddressOption as Data_IPv4HomeAddressOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import IPv4HomeAddressOption as Data_IPv4HomeAddressOption +from pcapkit.protocols.internet.mh.data import \ IPv4HomeAddressReplyOption as Data_IPv4HomeAddressReplyOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ IPv4HomeAddressRequestOption as Data_IPv4HomeAddressRequestOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ IPv4TrafficOffloadSelectorOption as Data_IPv4TrafficOffloadSelectorOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ IPv6AddressPrefixOption as Data_IPv6AddressPrefixOption -from pcapkit.protocols.data.internet.mh import LinkLayerAddressOption as Data_LinkLayerAddressOption -from pcapkit.protocols.data.internet.mh import LinkLocalAddressOption as Data_LinkLocalAddressOption -from pcapkit.protocols.data.internet.mh import LMAAddressOption as Data_LMAAddressOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import LinkLayerAddressOption as Data_LinkLayerAddressOption +from pcapkit.protocols.internet.mh.data import LinkLocalAddressOption as Data_LinkLocalAddressOption +from pcapkit.protocols.internet.mh.data import LMAAddressOption as Data_LMAAddressOption +from pcapkit.protocols.internet.mh.data import \ LMAControlledMAGParametersOption as Data_LMAControlledMAGParametersOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ LMAControlledMAGSuboption as Data_LMAControlledMAGSuboption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ LMAUserPlaneAddressOption as Data_LMAUserPlaneAddressOption -from pcapkit.protocols.data.internet.mh import LoadInformationOption as Data_LoadInformationOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import LoadInformationOption as Data_LoadInformationOption +from pcapkit.protocols.internet.mh.data import \ LocalizedRoutingAcknowledgmentMessage as Data_LocalizedRoutingAcknowledgmentMessage -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ LocalizedRoutingInitiationMessage as Data_LocalizedRoutingInitiationMessage -from pcapkit.protocols.data.internet.mh import LocalPrefixOption as Data_LocalPrefixOption -from pcapkit.protocols.data.internet.mh import MAGIdentifierOption as Data_MAGIdentifierOption -from pcapkit.protocols.data.internet.mh import MAGIPv6AddressOption as Data_MAGIPv6AddressOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import LocalPrefixOption as Data_LocalPrefixOption +from pcapkit.protocols.internet.mh.data import MAGIdentifierOption as Data_MAGIdentifierOption +from pcapkit.protocols.internet.mh.data import MAGIPv6AddressOption as Data_MAGIPv6AddressOption +from pcapkit.protocols.internet.mh.data import \ MAGMultipathBindingOption as Data_MAGMultipathBindingOption -from pcapkit.protocols.data.internet.mh import MesgIDOption as Data_MesgIDOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import MesgIDOption as Data_MesgIDOption +from pcapkit.protocols.internet.mh.data import \ MNGroupIdentifierOption as Data_MNGroupIdentifierOption -from pcapkit.protocols.data.internet.mh import MNIDOption as Data_MNIDOption -from pcapkit.protocols.data.internet.mh import MNLLAIIDOption as Data_MNLLAIIDOption -from pcapkit.protocols.data.internet.mh import MNLLIdentifierOption as Data_MNLLIdentifierOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import MNIDOption as Data_MNIDOption +from pcapkit.protocols.internet.mh.data import MNLLAIIDOption as Data_MNLLAIIDOption +from pcapkit.protocols.internet.mh.data import MNLLIdentifierOption as Data_MNLLIdentifierOption +from pcapkit.protocols.internet.mh.data import \ MobileNetworkPrefixOption as Data_MobileNetworkPrefixOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ MulticastAcknowledgementOption as Data_MulticastAcknowledgementOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ MulticastMobilityOption as Data_MulticastMobilityOption -from pcapkit.protocols.data.internet.mh import MultiPrefixExtension as Data_MultiPrefixExtension -from pcapkit.protocols.data.internet.mh import NATDetectionOption as Data_NATDetectionOption -from pcapkit.protocols.data.internet.mh import NonceIndicesOption as Data_NonceIndicesOption -from pcapkit.protocols.data.internet.mh import NTPTimestamp as Data_NTPTimestamp -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import MultiPrefixExtension as Data_MultiPrefixExtension +from pcapkit.protocols.internet.mh.data import NATDetectionOption as Data_NATDetectionOption +from pcapkit.protocols.internet.mh.data import NonceIndicesOption as Data_NonceIndicesOption +from pcapkit.protocols.internet.mh.data import NTPTimestamp as Data_NTPTimestamp +from pcapkit.protocols.internet.mh.data import \ PadFlowIdentificationSuboption as Data_PadFlowIdentificationSuboption -from pcapkit.protocols.data.internet.mh import PadOption as Data_PadOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import PadOption as Data_PadOption +from pcapkit.protocols.internet.mh.data import \ PermanentHomeKeygenTokenOption as Data_PermanentHomeKeygenTokenOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ PerSessionBitRateAttribute as Data_PerSessionBitRateAttribute -from pcapkit.protocols.data.internet.mh import PMIPv6Timestamp as Data_PMIPv6Timestamp -from pcapkit.protocols.data.internet.mh import PreviousMAAROption as Data_PreviousMAAROption -from pcapkit.protocols.data.internet.mh import QoSAttribute as Data_QoSAttribute -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import PMIPv6Timestamp as Data_PMIPv6Timestamp +from pcapkit.protocols.internet.mh.data import PreviousMAAROption as Data_PreviousMAAROption +from pcapkit.protocols.internet.mh.data import QoSAttribute as Data_QoSAttribute +from pcapkit.protocols.internet.mh.data import \ QoSTrafficSelectorAttribute as Data_QoSTrafficSelectorAttribute -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ QoSVendorSpecificAttribute as Data_QoSVendorSpecificAttribute -from pcapkit.protocols.data.internet.mh import QualityOfServiceOption as Data_QualityOfServiceOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import QualityOfServiceOption as Data_QualityOfServiceOption +from pcapkit.protocols.internet.mh.data import \ RedirectCapabilityOption as Data_RedirectCapabilityOption -from pcapkit.protocols.data.internet.mh import RedirectOption as Data_RedirectOption -from pcapkit.protocols.data.internet.mh import RestartCounterOption as Data_RestartCounterOption -from pcapkit.protocols.data.internet.mh import ServiceSelectionOption as Data_ServiceSelectionOption -from pcapkit.protocols.data.internet.mh import ServingMAAROption as Data_ServingMAAROption -from pcapkit.protocols.data.internet.mh import SignatureOption as Data_SignatureOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import RedirectOption as Data_RedirectOption +from pcapkit.protocols.internet.mh.data import RestartCounterOption as Data_RestartCounterOption +from pcapkit.protocols.internet.mh.data import ServiceSelectionOption as Data_ServiceSelectionOption +from pcapkit.protocols.internet.mh.data import ServingMAAROption as Data_ServingMAAROption +from pcapkit.protocols.internet.mh.data import SignatureOption as Data_SignatureOption +from pcapkit.protocols.internet.mh.data import \ SubscriptionQueryMessage as Data_SubscriptionQueryMessage -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ SubscriptionResponseMessage as Data_SubscriptionResponseMessage -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ TargetCareofAddressSuboption as Data_TargetCareofAddressSuboption -from pcapkit.protocols.data.internet.mh import TimestampOption as Data_TimestampOption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import TimestampOption as Data_TimestampOption +from pcapkit.protocols.internet.mh.data import \ TrafficSelectorSuboption as Data_TrafficSelectorSuboption -from pcapkit.protocols.data.internet.mh import TransientBindingOption as Data_TransientBindingOption -from pcapkit.protocols.data.internet.mh import UnassignedANISuboption as Data_UnassignedANISuboption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import TransientBindingOption as Data_TransientBindingOption +from pcapkit.protocols.internet.mh.data import UnassignedANISuboption as Data_UnassignedANISuboption +from pcapkit.protocols.internet.mh.data import \ UnassignedFlowIdentificationSuboption as Data_UnassignedFlowIdentificationSuboption -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ UnassignedLMAControlledMAGSuboption as Data_UnassignedLMAControlledMAGSuboption -from pcapkit.protocols.data.internet.mh import UnassignedOption as Data_UnassignedOption -from pcapkit.protocols.data.internet.mh import UnassignedQoSAttribute as Data_UnassignedQoSAttribute -from pcapkit.protocols.data.internet.mh import UnknownExtension as Data_UnknownExtension -from pcapkit.protocols.data.internet.mh import UnknownMessage as Data_UnknownMessage -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import UnassignedOption as Data_UnassignedOption +from pcapkit.protocols.internet.mh.data import UnassignedQoSAttribute as Data_UnassignedQoSAttribute +from pcapkit.protocols.internet.mh.data import UnknownExtension as Data_UnknownExtension +from pcapkit.protocols.internet.mh.data import UnknownMessage as Data_UnknownMessage +from pcapkit.protocols.internet.mh.data import \ UpdateNotificationAcknowledgementMessage as Data_UpdateNotificationAcknowledgementMessage -from pcapkit.protocols.data.internet.mh import \ +from pcapkit.protocols.internet.mh.data import \ UpdateNotificationMessage as Data_UpdateNotificationMessage -from pcapkit.protocols.data.internet.mh import VendorSpecificOption as Data_VendorSpecificOption -from pcapkit.protocols.internet.ipv6_ext import IPv6_Ext -from pcapkit.protocols.misc.no_payload import NoPayload -from pcapkit.protocols.schema.internet.mh import MH as Schema_MH -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.data import VendorSpecificOption as Data_VendorSpecificOption +from pcapkit.protocols.internet.mh.schema import MH as Schema_MH +from pcapkit.protocols.internet.mh.schema import \ AccessNetworkIdentifierOption as Schema_AccessNetworkIdentifierOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ AccessTechnologyTypeOption as Schema_AccessTechnologyTypeOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ ActiveMulticastSubscriptionIPv4Option as Schema_ActiveMulticastSubscriptionIPv4Option -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ ActiveMulticastSubscriptionIPv6Option as Schema_ActiveMulticastSubscriptionIPv6Option -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ AllocationRetentionPriorityAttribute as Schema_AllocationRetentionPriorityAttribute -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ AlternateCareofAddressOption as Schema_AlternateCareofAddressOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ AlternateIPv4CareofAddressOption as Schema_AlternateIPv4CareofAddressOption -from pcapkit.protocols.schema.internet.mh import AnchoredPrefixOption as Schema_AnchoredPrefixOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import AnchoredPrefixOption as Schema_AnchoredPrefixOption +from pcapkit.protocols.internet.mh.schema import \ ANICivicLocationSuboption as Schema_ANICivicLocationSuboption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ ANIGeoLocationSuboption as Schema_ANIGeoLocationSuboption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ ANIMAGGroupIdentifierSuboption as Schema_ANIMAGGroupIdentifierSuboption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ ANINetworkIdentifierSuboption as Schema_ANINetworkIdentifierSuboption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ ANIOperatorIdentifierSuboption as Schema_ANIOperatorIdentifierSuboption -from pcapkit.protocols.schema.internet.mh import ANISuboption as Schema_ANISuboption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import ANISuboption as Schema_ANISuboption +from pcapkit.protocols.internet.mh.schema import \ ANIUpdateTimerSuboption as Schema_ANIUpdateTimerSuboption -from pcapkit.protocols.schema.internet.mh import AuthOption as Schema_AuthOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import AuthOption as Schema_AuthOption +from pcapkit.protocols.internet.mh.schema import \ AuthorizationDataOption as Schema_AuthorizationDataOption -from pcapkit.protocols.schema.internet.mh import BADFOption as Schema_BADFOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import BADFOption as Schema_BADFOption +from pcapkit.protocols.internet.mh.schema import \ BIDReferenceSuboption as Schema_BIDReferenceSuboption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ BindingAcknowledgementMessage as Schema_BindingAcknowledgementMessage -from pcapkit.protocols.schema.internet.mh import BindingErrorMessage as Schema_BindingErrorMessage -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import BindingErrorMessage as Schema_BindingErrorMessage +from pcapkit.protocols.internet.mh.schema import \ BindingIdentifierOption as Schema_BindingIdentifierOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ BindingRefreshAdviceOption as Schema_BindingRefreshAdviceOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ BindingRefreshRequestMessage as Schema_BindingRefreshRequestMessage -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ BindingReregistrationControlSuboption as Schema_BindingReregistrationControlSuboption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ BindingRevocationMessage as Schema_BindingRevocationMessage -from pcapkit.protocols.schema.internet.mh import BindingUpdateMessage as Schema_BindingUpdateMessage -from pcapkit.protocols.schema.internet.mh import BitRateAttribute as Schema_BitRateAttribute -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import BindingUpdateMessage as Schema_BindingUpdateMessage +from pcapkit.protocols.internet.mh.schema import BitRateAttribute as Schema_BitRateAttribute +from pcapkit.protocols.internet.mh.schema import \ CareofTestInitMessage as Schema_CareofTestInitMessage -from pcapkit.protocols.schema.internet.mh import CareofTestInitOption as Schema_CareofTestInitOption -from pcapkit.protocols.schema.internet.mh import CareofTestMessage as Schema_CareofTestMessage -from pcapkit.protocols.schema.internet.mh import CareofTestOption as Schema_CareofTestOption -from pcapkit.protocols.schema.internet.mh import CGAExtension as Schema_CGAExtension -from pcapkit.protocols.schema.internet.mh import CGAParameter as Schema_CGAParameter -from pcapkit.protocols.schema.internet.mh import CGAParametersOption as Schema_CGAParametersOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import CareofTestInitOption as Schema_CareofTestInitOption +from pcapkit.protocols.internet.mh.schema import CareofTestMessage as Schema_CareofTestMessage +from pcapkit.protocols.internet.mh.schema import CareofTestOption as Schema_CareofTestOption +from pcapkit.protocols.internet.mh.schema import CGAExtension as Schema_CGAExtension +from pcapkit.protocols.internet.mh.schema import CGAParameter as Schema_CGAParameter +from pcapkit.protocols.internet.mh.schema import CGAParametersOption as Schema_CGAParametersOption +from pcapkit.protocols.internet.mh.schema import \ CGAParametersRequestOption as Schema_CGAParametersRequestOption -from pcapkit.protocols.schema.internet.mh import ContextRequestOption as Schema_ContextRequestOption -from pcapkit.protocols.schema.internet.mh import DelegatedMNPOption as Schema_DelegatedMNPOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import ContextRequestOption as Schema_ContextRequestOption +from pcapkit.protocols.internet.mh.schema import DelegatedMNPOption as Schema_DelegatedMNPOption +from pcapkit.protocols.internet.mh.schema import \ DLIFLinkLayerAddressOption as Schema_DLIFLinkLayerAddressOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ DLIFLinkLocalAddressOption as Schema_DLIFLinkLocalAddressOption -from pcapkit.protocols.schema.internet.mh import DNSUpdateOption as Schema_DNSUpdateOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import DNSUpdateOption as Schema_DNSUpdateOption +from pcapkit.protocols.internet.mh.schema import \ DynamicIPMulticastSelectorOption as Schema_DynamicIPMulticastSelectorOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ ExperimentalExtension as Schema_ExperimentalExtension -from pcapkit.protocols.schema.internet.mh import ExperimentalMessage as Schema_ExperimentalMessage -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import ExperimentalMessage as Schema_ExperimentalMessage +from pcapkit.protocols.internet.mh.schema import \ ExperimentalMobilityOption as Schema_ExperimentalMobilityOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ FastBindingAcknowledgmentMessage as Schema_FastBindingAcknowledgmentMessage -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ FastBindingUpdateMessage as Schema_FastBindingUpdateMessage -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ FastNeighborAdvertisementMessage as Schema_FastNeighborAdvertisementMessage -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ FlowBindingActionSuboption as Schema_FlowBindingActionSuboption -from pcapkit.protocols.schema.internet.mh import FlowBindingMessage as Schema_FlowBindingMessage -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import FlowBindingMessage as Schema_FlowBindingMessage +from pcapkit.protocols.internet.mh.schema import \ FlowIdentificationOption as Schema_FlowIdentificationOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ FlowIdentificationSuboption as Schema_FlowIdentificationSuboption -from pcapkit.protocols.schema.internet.mh import FlowSummaryOption as Schema_FlowSummaryOption -from pcapkit.protocols.schema.internet.mh import GREKeyOption as Schema_GREKeyOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import FlowSummaryOption as Schema_FlowSummaryOption +from pcapkit.protocols.internet.mh.schema import GREKeyOption as Schema_GREKeyOption +from pcapkit.protocols.internet.mh.schema import \ HandoffIndicatorOption as Schema_HandoffIndicatorOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ HandoverAcknowledgeMessage as Schema_HandoverAcknowledgeMessage -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ HandoverInitiateMessage as Schema_HandoverInitiateMessage -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ HeartbeatControlSuboption as Schema_HeartbeatControlSuboption -from pcapkit.protocols.schema.internet.mh import HeartbeatMessage as Schema_HeartbeatMessage -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import HeartbeatMessage as Schema_HeartbeatMessage +from pcapkit.protocols.internet.mh.schema import \ HomeAgentSwitchMessage as Schema_HomeAgentSwitchMessage -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ HomeNetworkPrefixOption as Schema_HomeNetworkPrefixOption -from pcapkit.protocols.schema.internet.mh import HomeTestInitMessage as Schema_HomeTestInitMessage -from pcapkit.protocols.schema.internet.mh import HomeTestMessage as Schema_HomeTestMessage -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import HomeTestInitMessage as Schema_HomeTestInitMessage +from pcapkit.protocols.internet.mh.schema import HomeTestMessage as Schema_HomeTestMessage +from pcapkit.protocols.internet.mh.schema import \ IPv4AddressAcknowledgementOption as Schema_IPv4AddressAcknowledgementOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ IPv4CareofAddressOption as Schema_IPv4CareofAddressOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ IPv4DefaultRouterAddressOption as Schema_IPv4DefaultRouterAddressOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ IPv4DHCPSupportModeOption as Schema_IPv4DHCPSupportModeOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ IPv4HomeAddressOption as Schema_IPv4HomeAddressOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ IPv4HomeAddressReplyOption as Schema_IPv4HomeAddressReplyOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ IPv4HomeAddressRequestOption as Schema_IPv4HomeAddressRequestOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ IPv4TrafficOffloadSelectorOption as Schema_IPv4TrafficOffloadSelectorOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ IPv6AddressPrefixOption as Schema_IPv6AddressPrefixOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ LinkLayerAddressOption as Schema_LinkLayerAddressOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ LinkLocalAddressOption as Schema_LinkLocalAddressOption -from pcapkit.protocols.schema.internet.mh import LMAAddressOption as Schema_LMAAddressOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import LMAAddressOption as Schema_LMAAddressOption +from pcapkit.protocols.internet.mh.schema import \ LMAControlledMAGParametersOption as Schema_LMAControlledMAGParametersOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ LMAControlledMAGSuboption as Schema_LMAControlledMAGSuboption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ LMAUserPlaneAddressOption as Schema_LMAUserPlaneAddressOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ LoadInformationOption as Schema_LoadInformationOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ LocalizedRoutingAcknowledgmentMessage as Schema_LocalizedRoutingAcknowledgmentMessage -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ LocalizedRoutingInitiationMessage as Schema_LocalizedRoutingInitiationMessage -from pcapkit.protocols.schema.internet.mh import LocalPrefixOption as Schema_LocalPrefixOption -from pcapkit.protocols.schema.internet.mh import MAGIdentifierOption as Schema_MAGIdentifierOption -from pcapkit.protocols.schema.internet.mh import MAGIPv6AddressOption as Schema_MAGIPv6AddressOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import LocalPrefixOption as Schema_LocalPrefixOption +from pcapkit.protocols.internet.mh.schema import MAGIdentifierOption as Schema_MAGIdentifierOption +from pcapkit.protocols.internet.mh.schema import MAGIPv6AddressOption as Schema_MAGIPv6AddressOption +from pcapkit.protocols.internet.mh.schema import \ MAGMultipathBindingOption as Schema_MAGMultipathBindingOption -from pcapkit.protocols.schema.internet.mh import MesgIDOption as Schema_MesgIDOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import MesgIDOption as Schema_MesgIDOption +from pcapkit.protocols.internet.mh.schema import \ MNGroupIdentifierOption as Schema_MNGroupIdentifierOption -from pcapkit.protocols.schema.internet.mh import MNIDOption as Schema_MNIDOption -from pcapkit.protocols.schema.internet.mh import MNLLAIIDOption as Schema_MNLLAIIDOption -from pcapkit.protocols.schema.internet.mh import MNLLIdentifierOption as Schema_MNLLIdentifierOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import MNIDOption as Schema_MNIDOption +from pcapkit.protocols.internet.mh.schema import MNLLAIIDOption as Schema_MNLLAIIDOption +from pcapkit.protocols.internet.mh.schema import MNLLIdentifierOption as Schema_MNLLIdentifierOption +from pcapkit.protocols.internet.mh.schema import \ MobileNetworkPrefixOption as Schema_MobileNetworkPrefixOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ MulticastAcknowledgementOption as Schema_MulticastAcknowledgementOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ MulticastMobilityOption as Schema_MulticastMobilityOption -from pcapkit.protocols.schema.internet.mh import MultiPrefixExtension as Schema_MultiPrefixExtension -from pcapkit.protocols.schema.internet.mh import NATDetectionOption as Schema_NATDetectionOption -from pcapkit.protocols.schema.internet.mh import NonceIndicesOption as Schema_NonceIndicesOption -from pcapkit.protocols.schema.internet.mh import Packet as Schema_Packet -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import MultiPrefixExtension as Schema_MultiPrefixExtension +from pcapkit.protocols.internet.mh.schema import NATDetectionOption as Schema_NATDetectionOption +from pcapkit.protocols.internet.mh.schema import NonceIndicesOption as Schema_NonceIndicesOption +from pcapkit.protocols.internet.mh.schema import Packet as Schema_Packet +from pcapkit.protocols.internet.mh.schema import \ PadFlowIdentificationSuboption as Schema_PadFlowIdentificationSuboption -from pcapkit.protocols.schema.internet.mh import PadOption as Schema_PadOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import PadOption as Schema_PadOption +from pcapkit.protocols.internet.mh.schema import \ PermanentHomeKeygenTokenOption as Schema_PermanentHomeKeygenTokenOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ PerSessionBitRateAttribute as Schema_PerSessionBitRateAttribute -from pcapkit.protocols.schema.internet.mh import PreviousMAAROption as Schema_PreviousMAAROption -from pcapkit.protocols.schema.internet.mh import QoSAttribute as Schema_QoSAttribute -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import PreviousMAAROption as Schema_PreviousMAAROption +from pcapkit.protocols.internet.mh.schema import QoSAttribute as Schema_QoSAttribute +from pcapkit.protocols.internet.mh.schema import \ QoSTrafficSelectorAttribute as Schema_QoSTrafficSelectorAttribute -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ QoSVendorSpecificAttribute as Schema_QoSVendorSpecificAttribute -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ QualityOfServiceOption as Schema_QualityOfServiceOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ RedirectCapabilityOption as Schema_RedirectCapabilityOption -from pcapkit.protocols.schema.internet.mh import RedirectOption as Schema_RedirectOption -from pcapkit.protocols.schema.internet.mh import RestartCounterOption as Schema_RestartCounterOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import RedirectOption as Schema_RedirectOption +from pcapkit.protocols.internet.mh.schema import RestartCounterOption as Schema_RestartCounterOption +from pcapkit.protocols.internet.mh.schema import \ ServiceSelectionOption as Schema_ServiceSelectionOption -from pcapkit.protocols.schema.internet.mh import ServingMAAROption as Schema_ServingMAAROption -from pcapkit.protocols.schema.internet.mh import SignatureOption as Schema_SignatureOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import ServingMAAROption as Schema_ServingMAAROption +from pcapkit.protocols.internet.mh.schema import SignatureOption as Schema_SignatureOption +from pcapkit.protocols.internet.mh.schema import \ SubscriptionQueryMessage as Schema_SubscriptionQueryMessage -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ SubscriptionResponseMessage as Schema_SubscriptionResponseMessage -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ TargetCareofAddressSuboption as Schema_TargetCareofAddressSuboption -from pcapkit.protocols.schema.internet.mh import TimestampOption as Schema_TimestampOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import TimestampOption as Schema_TimestampOption +from pcapkit.protocols.internet.mh.schema import \ TrafficSelectorSuboption as Schema_TrafficSelectorSuboption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ TransientBindingOption as Schema_TransientBindingOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ UnassignedANISuboption as Schema_UnassignedANISuboption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ UnassignedFlowIdentificationSuboption as Schema_UnassignedFlowIdentificationSuboption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ UnassignedLMAControlledMAGSuboption as Schema_UnassignedLMAControlledMAGSuboption -from pcapkit.protocols.schema.internet.mh import UnassignedOption as Schema_UnassignedOption -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import UnassignedOption as Schema_UnassignedOption +from pcapkit.protocols.internet.mh.schema import \ UnassignedQoSAttribute as Schema_UnassignedQoSAttribute -from pcapkit.protocols.schema.internet.mh import UnknownExtension as Schema_UnknownExtension -from pcapkit.protocols.schema.internet.mh import UnknownMessage as Schema_UnknownMessage -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import UnknownExtension as Schema_UnknownExtension +from pcapkit.protocols.internet.mh.schema import UnknownMessage as Schema_UnknownMessage +from pcapkit.protocols.internet.mh.schema import \ UpdateNotificationAcknowledgementMessage as Schema_UpdateNotificationAcknowledgementMessage -from pcapkit.protocols.schema.internet.mh import \ +from pcapkit.protocols.internet.mh.schema import \ UpdateNotificationMessage as Schema_UpdateNotificationMessage -from pcapkit.protocols.schema.internet.mh import VendorSpecificOption as Schema_VendorSpecificOption -from pcapkit.protocols.schema.schema import Schema +from pcapkit.protocols.internet.mh.schema import VendorSpecificOption as Schema_VendorSpecificOption +from pcapkit.protocols.misc.no_payload.protocol import NoPayload +from pcapkit.protocols.schema import Schema from pcapkit.utilities.datetime import fromtimestamp, totimestamp from pcapkit.utilities.exceptions import (BaseError, CaughtByCaller, EnumValueError, ProtocolError, UnsupportedCall) @@ -514,11 +514,11 @@ from pcapkit.corekit.multidict import OrderedMultiDict from pcapkit.corekit.protochain import ProtoChain - from pcapkit.protocols.data.internet.mh import Option as Data_Option + from pcapkit.protocols.internet.mh.data import Option as Data_Option + from pcapkit.protocols.internet.mh.schema import Option as Schema_Option + from pcapkit.protocols.internet.mh.schema import Packet as Schema_Packet from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.internet.mh import Option as Schema_Option - from pcapkit.protocols.schema.internet.mh import Packet as Schema_Packet - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema Option = OrderedMultiDict[Enum_Option, Data_Option] Extension = OrderedMultiDict[Enum_CGAExtension, Data_CGAExtension] @@ -568,7 +568,7 @@ class FastBindingAcknowledgmentStatus(EnumLookup, IntEnum): from :meth:`_missing_` instead of minting an ``Unassigned_N`` member, because this RFC-inline value set stays immutable (decided on :issue:`877`). Within an IPv6 chain the Mobility Header and everything - after it are then :class:`~pcapkit.protocols.misc.raw.Raw`, as + after it are then :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, as :rfc:`8200#section-4` has a node discard such a packet (:issue:`2477`). The class defines no ``get`` of its own: ``get``/``get_all`` come from @@ -638,7 +638,7 @@ class IPv6AddressPrefixCode(EnumLookup, IntEnum): from :meth:`_missing_` instead of minting an ``Unassigned_N`` member, because this RFC-inline value set stays immutable (decided on :issue:`877`). Within an IPv6 chain the Mobility Header and everything - after it are then :class:`~pcapkit.protocols.misc.raw.Raw`, as + after it are then :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, as :rfc:`8200#section-4` has a node discard such a packet (:issue:`2477`). The class defines no ``get`` of its own: ``get``/``get_all`` come from @@ -703,7 +703,7 @@ class LocalizedRoutingStatus(EnumLookup, IntEnum): from :meth:`_missing_` instead of minting an ``Unassigned_N`` member, because this RFC-inline value set stays immutable (decided on :issue:`877`). Within an IPv6 chain the Mobility Header and everything - after it are then :class:`~pcapkit.protocols.misc.raw.Raw`, as + after it are then :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, as :rfc:`8200#section-4` has a node discard such a packet (:issue:`2477`). The class defines no ``get`` of its own: ``get``/``get_all`` come from @@ -757,7 +757,7 @@ class LMAAddressCode(EnumLookup, IntEnum): from :meth:`_missing_` instead of minting an ``Unassigned_N`` member, because this RFC-inline value set stays immutable (decided on :issue:`877`). Within an IPv6 chain the Mobility Header and everything - after it are then :class:`~pcapkit.protocols.misc.raw.Raw`, as + after it are then :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, as :rfc:`8200#section-4` has a node discard such a packet (:issue:`2477`). The class defines no ``get`` of its own: ``get``/``get_all`` come from @@ -800,7 +800,7 @@ class MH(IPv6_Ext[Data_MH, Schema_MH], """This class implements Mobility Header. This class supports parsing of the following MH message types, - which are registered in the :attr:`self.__message__ ` + which are registered in the :attr:`self.__message__ ` attribute: .. list-table:: @@ -810,80 +810,80 @@ class MH(IPv6_Ext[Data_MH, Schema_MH], - Message Parser - Message Constructor * - :attr:`~pcapkit.const.mh.packet.Packet.Binding_Refresh_Request` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_msg_brr` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_msg_brr` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_msg_brr` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_msg_brr` * - :attr:`~pcapkit.const.mh.packet.Packet.Home_Test_Init` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_msg_hoti` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_msg_hoti` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_msg_hoti` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_msg_hoti` * - :attr:`~pcapkit.const.mh.packet.Packet.Care_of_Test_Init` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_msg_coti` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_msg_coti` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_msg_coti` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_msg_coti` * - :attr:`~pcapkit.const.mh.packet.Packet.Home_Test` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_msg_hot` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_msg_hot` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_msg_hot` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_msg_hot` * - :attr:`~pcapkit.const.mh.packet.Packet.Care_of_Test` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_msg_cot` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_msg_cot` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_msg_cot` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_msg_cot` * - :attr:`~pcapkit.const.mh.packet.Packet.Binding_Update` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_msg_bu` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_msg_bu` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_msg_bu` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_msg_bu` * - :attr:`~pcapkit.const.mh.packet.Packet.Binding_Acknowledgement` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_msg_ba` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_msg_ba` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_msg_ba` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_msg_ba` * - :attr:`~pcapkit.const.mh.packet.Packet.Binding_Error` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_msg_be` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_msg_be` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_msg_be` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_msg_be` * - :attr:`~pcapkit.const.mh.packet.Packet.Fast_Binding_Update` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_msg_fbu` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_msg_fbu` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_msg_fbu` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_msg_fbu` * - :attr:`~pcapkit.const.mh.packet.Packet.Fast_Binding_Acknowledgment` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_msg_fback` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_msg_fback` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_msg_fback` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_msg_fback` * - :attr:`~pcapkit.const.mh.packet.Packet.Fast_Neighbor_Advertisement` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_msg_fna` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_msg_fna` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_msg_fna` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_msg_fna` * - :attr:`~pcapkit.const.mh.packet.Packet.Experimental_Mobility_Header` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_msg_emh` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_msg_emh` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_msg_emh` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_msg_emh` * - :attr:`~pcapkit.const.mh.packet.Packet.Home_Agent_Switch_Message` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_msg_has` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_msg_has` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_msg_has` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_msg_has` * - :attr:`~pcapkit.const.mh.packet.Packet.Heartbeat_Message` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_msg_hb` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_msg_hb` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_msg_hb` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_msg_hb` * - :attr:`~pcapkit.const.mh.packet.Packet.Handover_Initiate_Message` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_msg_hi` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_msg_hi` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_msg_hi` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_msg_hi` * - :attr:`~pcapkit.const.mh.packet.Packet.Handover_Acknowledge_Message` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_msg_hack` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_msg_hack` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_msg_hack` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_msg_hack` * - :attr:`~pcapkit.const.mh.packet.Packet.Binding_Revocation_Message` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_msg_brm` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_msg_brm` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_msg_brm` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_msg_brm` * - :attr:`~pcapkit.const.mh.packet.Packet.Localized_Routing_Initiation` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_msg_lri` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_msg_lri` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_msg_lri` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_msg_lri` * - :attr:`~pcapkit.const.mh.packet.Packet.Localized_Routing_Acknowledgment` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_msg_lra` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_msg_lra` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_msg_lra` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_msg_lra` * - :attr:`~pcapkit.const.mh.packet.Packet.Update_Notification` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_msg_upn` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_msg_upn` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_msg_upn` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_msg_upn` * - :attr:`~pcapkit.const.mh.packet.Packet.Update_Notification_Acknowledgement` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_msg_upa` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_msg_upa` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_msg_upa` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_msg_upa` * - :attr:`~pcapkit.const.mh.packet.Packet.Flow_Binding_Message` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_msg_fbm` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_msg_fbm` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_msg_fbm` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_msg_fbm` * - :attr:`~pcapkit.const.mh.packet.Packet.Subscription_Query` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_msg_sq` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_msg_sq` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_msg_sq` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_msg_sq` * - :attr:`~pcapkit.const.mh.packet.Packet.Subscription_Response` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_msg_sr` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_msg_sr` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_msg_sr` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_msg_sr` This class supports parsing the following MH options, which are - registered in the :attr:`self.__option__ ` + registered in the :attr:`self.__option__ ` attribute: .. list-table:: @@ -893,221 +893,221 @@ class MH(IPv6_Ext[Data_MH, Schema_MH], - Option Parser - Option Constructor * - :attr:`~pcapkit.const.mh.option.Option.Pad1` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_pad` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_pad` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_pad` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_pad` * - :attr:`~pcapkit.const.mh.option.Option.PadN` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_pad` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_pad` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_pad` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_pad` * - :attr:`~pcapkit.const.mh.option.Option.Binding_Refresh_Advice` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_bra` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_bra` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_bra` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_bra` * - :attr:`~pcapkit.const.mh.option.Option.Alternate_Care_of_Address` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_aca` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_aca` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_aca` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_aca` * - :attr:`~pcapkit.const.mh.option.Option.Nonce_Indices` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_ni` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_ni` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_ni` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_ni` * - :attr:`~pcapkit.const.mh.option.Option.Authorization_Data` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_bad` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_bad` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_bad` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_bad` * - :attr:`~pcapkit.const.mh.option.Option.Mobile_Network_Prefix_Option` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_mnp` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_mnp` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_mnp` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_mnp` * - :attr:`~pcapkit.const.mh.option.Option.Mobility_Header_Link_Layer_Address_option` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_lla` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_lla` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_lla` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_lla` * - :attr:`~pcapkit.const.mh.option.Option.MN_ID_OPTION_TYPE` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_mn_id` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_mn_id` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_mn_id` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_mn_id` * - :attr:`~pcapkit.const.mh.option.Option.AUTH_OPTION_TYPE` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_auth` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_auth` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_auth` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_auth` * - :attr:`~pcapkit.const.mh.option.Option.MESG_ID_OPTION_TYPE` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_mesg_id` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_mesg_id` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_mesg_id` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_mesg_id` * - :attr:`~pcapkit.const.mh.option.Option.CGA_Parameters_Request` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_cga_pr` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_cga_pr` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_cga_pr` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_cga_pr` * - :attr:`~pcapkit.const.mh.option.Option.CGA_Parameters` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_cga_param` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_cga_param` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_cga_param` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_cga_param` * - :attr:`~pcapkit.const.mh.option.Option.Signature` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_signature` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_signature` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_signature` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_signature` * - :attr:`~pcapkit.const.mh.option.Option.Permanent_Home_Keygen_Token` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_phkt` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_phkt` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_phkt` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_phkt` * - :attr:`~pcapkit.const.mh.option.Option.Care_of_Test_Init` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_ct_init` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_ct_init` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_ct_init` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_ct_init` * - :attr:`~pcapkit.const.mh.option.Option.Care_of_Test` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_ct` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_ct` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_ct` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_ct` * - :attr:`~pcapkit.const.mh.option.Option.DNS_UPDATE_TYPE` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_dns` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_dns` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_dns` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_dns` * - :attr:`~pcapkit.const.mh.option.Option.Experimental_Mobility_Option` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_exp` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_exp` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_exp` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_exp` * - :attr:`~pcapkit.const.mh.option.Option.Vendor_Specific_Mobility_Option` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_vendor` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_vendor` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_vendor` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_vendor` * - :attr:`~pcapkit.const.mh.option.Option.Service_Selection_Mobility_Option` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_service` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_service` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_service` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_service` * - :attr:`~pcapkit.const.mh.option.Option.Binding_Authorization_Data_for_FMIPv6` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_badf` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_badf` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_badf` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_badf` * - :attr:`~pcapkit.const.mh.option.Option.Home_Network_Prefix_Option` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_hnp` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_hnp` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_hnp` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_hnp` * - :attr:`~pcapkit.const.mh.option.Option.Handoff_Indicator_Option` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_hi` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_hi` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_hi` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_hi` * - :attr:`~pcapkit.const.mh.option.Option.Access_Technology_Type_Option` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_att` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_att` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_att` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_att` * - :attr:`~pcapkit.const.mh.option.Option.Mobile_Node_Link_layer_Identifier_Option` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_mn_lli` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_mn_lli` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_mn_lli` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_mn_lli` * - :attr:`~pcapkit.const.mh.option.Option.Link_local_Address_Option` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_lla_addr` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_lla_addr` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_lla_addr` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_lla_addr` * - :attr:`~pcapkit.const.mh.option.Option.Timestamp_Option` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_timestamp` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_timestamp` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_timestamp` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_timestamp` * - :attr:`~pcapkit.const.mh.option.Option.Restart_Counter` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_restart` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_restart` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_restart` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_restart` * - :attr:`~pcapkit.const.mh.option.Option.IPv4_Home_Address` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_ipv4_hoa` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_ipv4_hoa` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_ipv4_hoa` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_ipv4_hoa` * - :attr:`~pcapkit.const.mh.option.Option.IPv4_Address_Acknowledgement` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_ipv4_ack` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_ipv4_ack` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_ipv4_ack` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_ipv4_ack` * - :attr:`~pcapkit.const.mh.option.Option.NAT_Detection` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_nat` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_nat` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_nat` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_nat` * - :attr:`~pcapkit.const.mh.option.Option.IPv4_Care_of_Address` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_ipv4_coa` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_ipv4_coa` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_ipv4_coa` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_ipv4_coa` * - :attr:`~pcapkit.const.mh.option.Option.GRE_Key_Option` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_gre` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_gre` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_gre` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_gre` * - :attr:`~pcapkit.const.mh.option.Option.Mobility_Header_IPv6_Address_Prefix` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_ipv6_ap` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_ipv6_ap` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_ipv6_ap` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_ipv6_ap` * - :attr:`~pcapkit.const.mh.option.Option.Binding_Identifier` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_bid` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_bid` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_bid` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_bid` * - :attr:`~pcapkit.const.mh.option.Option.IPv4_Home_Address_Request` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_ipv4_hoa_req` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_ipv4_hoa_req` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_ipv4_hoa_req` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_ipv4_hoa_req` * - :attr:`~pcapkit.const.mh.option.Option.IPv4_Home_Address_Reply` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_ipv4_hoa_rep` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_ipv4_hoa_rep` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_ipv4_hoa_rep` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_ipv4_hoa_rep` * - :attr:`~pcapkit.const.mh.option.Option.IPv4_Default_Router_Address` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_ipv4_router` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_ipv4_router` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_ipv4_router` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_ipv4_router` * - :attr:`~pcapkit.const.mh.option.Option.IPv4_DHCP_Support_Mode` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_ipv4_dhcp` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_ipv4_dhcp` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_ipv4_dhcp` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_ipv4_dhcp` * - :attr:`~pcapkit.const.mh.option.Option.Context_Request_Option` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_cr` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_cr` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_cr` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_cr` * - :attr:`~pcapkit.const.mh.option.Option.Local_Mobility_Anchor_Address_Option` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_lmaa` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_lmaa` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_lmaa` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_lmaa` * - :attr:`~pcapkit.const.mh.option.Option.Mobile_Node_Link_local_Address_Interface_Identifier_Option` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_mn_lla_iid` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_mn_lla_iid` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_mn_lla_iid` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_mn_lla_iid` * - :attr:`~pcapkit.const.mh.option.Option.Transient_Binding` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_transient` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_transient` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_transient` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_transient` * - :attr:`~pcapkit.const.mh.option.Option.Flow_Summary_Mobility_Option` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_fs` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_fs` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_fs` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_fs` * - :attr:`~pcapkit.const.mh.option.Option.Flow_Identification_Mobility_Option` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_fid` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_fid` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_fid` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_fid` * - :attr:`~pcapkit.const.mh.option.Option.Redirect_Capability_Mobility_Option` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_rc` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_rc` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_rc` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_rc` * - :attr:`~pcapkit.const.mh.option.Option.Redirect_Mobility_Option` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_redirect` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_redirect` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_redirect` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_redirect` * - :attr:`~pcapkit.const.mh.option.Option.Load_Information_Mobility_Option` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_load` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_load` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_load` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_load` * - :attr:`~pcapkit.const.mh.option.Option.Alternate_IPv4_Care_of_Address` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_alt_ipv4_coa` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_alt_ipv4_coa` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_alt_ipv4_coa` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_alt_ipv4_coa` * - :attr:`~pcapkit.const.mh.option.Option.Mobile_Node_Group_Identifier` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_mn_group` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_mn_group` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_mn_group` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_mn_group` * - :attr:`~pcapkit.const.mh.option.Option.MAG_IPv6_Address` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_mag_addr` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_mag_addr` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_mag_addr` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_mag_addr` * - :attr:`~pcapkit.const.mh.option.Option.Access_Network_Identifier` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_ani` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_ani` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_ani` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_ani` * - :attr:`~pcapkit.const.mh.option.Option.IPv4_Traffic_Offload_Selector` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_offload` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_offload` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_offload` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_offload` * - :attr:`~pcapkit.const.mh.option.Option.Dynamic_IP_Multicast_Selector` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_mcast_sel` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_mcast_sel` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_mcast_sel` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_mcast_sel` * - :attr:`~pcapkit.const.mh.option.Option.Delegated_Mobile_Network_Prefix` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_dmnp` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_dmnp` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_dmnp` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_dmnp` * - :attr:`~pcapkit.const.mh.option.Option.Active_Multicast_Subscription_IPv4` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_ams4` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_ams4` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_ams4` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_ams4` * - :attr:`~pcapkit.const.mh.option.Option.Active_Multicast_Subscription_IPv6` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_ams6` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_ams6` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_ams6` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_ams6` * - :attr:`~pcapkit.const.mh.option.Option.Quality_of_Service` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_qos` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_qos` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_qos` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_qos` * - :attr:`~pcapkit.const.mh.option.Option.LMA_User_Plane_Address` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_lma_up` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_lma_up` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_lma_up` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_lma_up` * - :attr:`~pcapkit.const.mh.option.Option.Multicast_Mobility_Option` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_mcast` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_mcast` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_mcast` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_mcast` * - :attr:`~pcapkit.const.mh.option.Option.Multicast_Acknowledgement_Option` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_mcast_ack` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_mcast_ack` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_mcast_ack` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_mcast_ack` * - :attr:`~pcapkit.const.mh.option.Option.LMA_Controlled_MAG_Parameters` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_lcmp` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_lcmp` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_lcmp` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_lcmp` * - :attr:`~pcapkit.const.mh.option.Option.MAG_Multipath_Binding` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_mag_mp` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_mag_mp` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_mag_mp` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_mag_mp` * - :attr:`~pcapkit.const.mh.option.Option.MAG_Identifier` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_mag_id` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_mag_id` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_mag_id` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_mag_id` * - :attr:`~pcapkit.const.mh.option.Option.Anchored_Prefix` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_anchored` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_anchored` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_anchored` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_anchored` * - :attr:`~pcapkit.const.mh.option.Option.Local_Prefix` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_local_prefix` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_local_prefix` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_local_prefix` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_local_prefix` * - :attr:`~pcapkit.const.mh.option.Option.Previous_MAAR` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_prev_maar` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_prev_maar` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_prev_maar` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_prev_maar` * - :attr:`~pcapkit.const.mh.option.Option.Serving_MAAR` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_serv_maar` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_serv_maar` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_serv_maar` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_serv_maar` * - :attr:`~pcapkit.const.mh.option.Option.DLIF_Link_Local_Address` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_dlif_lla` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_dlif_lla` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_dlif_lla` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_dlif_lla` * - :attr:`~pcapkit.const.mh.option.Option.DLIF_Link_Layer_Address` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_dlif_lladdr` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_opt_dlif_lladdr` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_dlif_lladdr` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_opt_dlif_lladdr` This class supports parsing of the following MH CGA extensions, - which are registered in the :attr:`self.__extension__ ` + which are registered in the :attr:`self.__extension__ ` attribute: .. list-table:: @@ -1117,17 +1117,17 @@ class MH(IPv6_Ext[Data_MH, Schema_MH], - CGA Extension Parser - CGA Extension Constructor * - :attr:`~pcapkit.const.mh.cga_extension.CGAExtension.Multi_Prefix` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_ext_multiprefix` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_ext_multiprefix` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_ext_multiprefix` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_ext_multiprefix` * - :attr:`~pcapkit.const.mh.cga_extension.CGAExtension.Exp_FFFD` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_ext_exp` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_ext_exp` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_ext_exp` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_ext_exp` * - :attr:`~pcapkit.const.mh.cga_extension.CGAExtension.Exp_FFFE` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_ext_exp` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_ext_exp` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_ext_exp` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_ext_exp` * - :attr:`~pcapkit.const.mh.cga_extension.CGAExtension.Exp_FFFF` - - :meth:`~pcapkit.protocols.internet.mh.MH._read_ext_exp` - - :meth:`~pcapkit.protocols.internet.mh.MH._make_ext_exp` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_ext_exp` + - :meth:`~pcapkit.protocols.internet.mh.protocol.MH._make_ext_exp` .. versionchanged:: 1.5.0 @@ -1338,13 +1338,13 @@ def alias(self) -> 'Literal["MH"]': Spelled out rather than left to :attr:`Protocol.alias `'s class-name default, because - :class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext` sits + :class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext` sits between this class and that default in the MRO and carries a concrete ``'IPv6-Ext'`` of its own. Inheriting it would rename this header in every :class:`~pcapkit.corekit.protochain.ProtoChain` string and in :meth:`IPv6._decode_next_layer - `'s packet + `'s packet dict key. The value equals the class-name default. """ @@ -1487,8 +1487,8 @@ def make(self, Raises: ProtocolError: If ``data`` is none of the forms this maker reads -- raw :obj:`bytes`, a :obj:`dict` of message arguments, an - :class:`~pcapkit.protocols.data.internet.mh.MH` data model or a - :class:`~pcapkit.protocols.schema.internet.mh.Packet` schema; + :class:`~pcapkit.protocols.internet.mh.data.MH` data model or a + :class:`~pcapkit.protocols.internet.mh.schema.Packet` schema; or if ``reserved``, or the header length of the message, does not fit in one octet; if ``chksum`` is not two octets; or if ``next`` or ``type`` is a name, a :obj:`bool` or a code its @@ -1717,7 +1717,7 @@ def _mh_message_length(header_len: 'int') -> 'int': octets"* -- i.e. the total header is ``8 + 8 * header_len`` octets, or equivalently ``(header_len + 1) * 8``. Every ``_read_msg_*`` below reports this value as the parsed message's own ``.length``, - which :meth:`~pcapkit.protocols.internet.mh.MH.read` subtracts from the + which :meth:`~pcapkit.protocols.internet.mh.protocol.MH.read` subtracts from the outer packet length to find the next layer's length. It is the inverse of :meth:`make`'s ``(len(data_val) + 6) // 8 - 1``. Do NOT drop the ``+ 1``: the units either side of it differ (octets vs. 8-octet @@ -1745,8 +1745,8 @@ def _pad_mh_message(self, data: 'Schema_Packet | bytes') -> 'Schema_Packet | byt The padding goes into the message's mobility options, which is where :rfc:`6275#section-6.1.1` puts it. A message whose body is opaque has nowhere to put it -- - :class:`~pcapkit.protocols.schema.internet.mh.UnknownMessage` and - :class:`~pcapkit.protocols.schema.internet.mh.ExperimentalMessage` + :class:`~pcapkit.protocols.internet.mh.schema.UnknownMessage` and + :class:`~pcapkit.protocols.internet.mh.schema.ExperimentalMessage` carry raw bytes and no options, as does a ``data`` argument given directly as :obj:`bytes` -- so for those the padding is appended to the message body itself and a @@ -2267,7 +2267,7 @@ def _read_msg_fback(self, schema: 'Schema_FastBindingAcknowledgmentMessage', *, instead of drawing them from the IANA *Status Codes* registry, whose values ``1`` and ``131`` mean something else entirely. The status is therefore reported as a - :class:`~pcapkit.protocols.internet.mh.FastBindingAcknowledgmentStatus`, + :class:`~pcapkit.protocols.internet.mh.protocol.FastBindingAcknowledgmentStatus`, which is local to this module, rather than being mislabelled as a :class:`~pcapkit.const.mh.status_code.StatusCode`. @@ -2638,7 +2638,7 @@ def _read_msg_brm(self, schema: 'Schema_BindingRevocationMessage', *, meaning differs is the octet after it -- a revocation trigger in an indication and a status code in an acknowledgement, drawn from two different registries -- so a single data model carries both, with - :attr:`~pcapkit.protocols.data.internet.mh.BindingRevocationMessage.br_type` + :attr:`~pcapkit.protocols.internet.mh.data.BindingRevocationMessage.br_type` saying which it is. Args: @@ -2735,7 +2735,7 @@ def _read_msg_lra(self, schema: 'Schema_LocalizedRoutingAcknowledgmentMessage', +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ The status codes are enumerated in - :class:`~pcapkit.protocols.internet.mh.LocalizedRoutingStatus`, which is + :class:`~pcapkit.protocols.internet.mh.protocol.LocalizedRoutingStatus`, which is local to this module because :rfc:`6705` defines them inline and IANA registers them nowhere -- not even in the general *Status Codes* registry. @@ -3177,9 +3177,9 @@ def _read_opt_pad(self, schema: 'Schema_PadOption', *, Note: A ``Pad1`` option occupies a single octet and carries no ``Option Length`` field, so its - :attr:`~pcapkit.protocols.data.internet.mh.Option.length` is ``1`` + :attr:`~pcapkit.protocols.internet.mh.data.Option.length` is ``1`` rather than ``length + 2``. That one-octet wire shape is enforced - by :class:`~pcapkit.protocols.schema.internet.mh.PadOption` itself, + by :class:`~pcapkit.protocols.internet.mh.schema.PadOption` itself, which sizes both the length octet and the padding data from the option type [:rfc:`6275#section-6.2.2`]; ``clen`` is therefore always ``0`` here for a parsed ``Pad1``, and the length check this @@ -3822,7 +3822,7 @@ def _read_opt_badf(self, schema: 'Schema_BADFOption', *, requires this option to be the **last** mobility option present, the discrepancy never has to be resolved in order to find the following option, so the literal reading is used here and the reported - :attr:`~pcapkit.protocols.data.internet.mh.Option.length` accounts + :attr:`~pcapkit.protocols.internet.mh.data.Option.length` accounts for the extra 4 bytes. Args: @@ -3868,7 +3868,7 @@ def _read_opt_ipv6_ap(self, schema: 'Schema_IPv6AddressPrefixOption', *, +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ The option code identifies which address the option carries, see - :class:`~pcapkit.protocols.internet.mh.IPv6AddressPrefixCode`. It, too, + :class:`~pcapkit.protocols.internet.mh.protocol.IPv6AddressPrefixCode`. It, too, is defined inline by :rfc:`5568#section-6.4.2` with no IANA registry behind it, hence the enumeration is local to this module. @@ -4266,7 +4266,7 @@ def _read_opt_timestamp(self, schema: 'Schema_TimestampOption', *, 1900 one, and splits the 64 bits 48/16 rather than 32/32. Reading it as an NTP timestamp would be wrong in both the epoch and the field widths, which is why it gets its own - :class:`~pcapkit.protocols.data.internet.mh.PMIPv6Timestamp`. + :class:`~pcapkit.protocols.internet.mh.data.PMIPv6Timestamp`. Args: schema: Parsed option schema. @@ -4855,7 +4855,7 @@ def _read_opt_lmaa(self, schema: 'Schema_LMAAddressOption', *, +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ The option codes are enumerated in - :class:`~pcapkit.protocols.internet.mh.LMAAddressCode`, which is local to + :class:`~pcapkit.protocols.internet.mh.protocol.LMAAddressCode`, which is local to this module because :rfc:`5949` defines them inline with no IANA registry behind them. @@ -5022,7 +5022,7 @@ def _read_fid_suboptions( ``isinstance`` of the schema class: the code is on the wire and the registry keys on it, so it is the cheaper discriminator. A class test would also be sound, since every - :class:`~pcapkit.protocols.schema.schema.Schema` subclass carries its + :class:`~pcapkit.protocols.schema.Schema` subclass carries its own :class:`abc.ABCMeta` cache (:issue:`439`). The same reasoning applies to :meth:`_read_ani_suboptions`, :meth:`_read_qos_attributes`, :meth:`_read_lcmp_suboptions` and their @@ -5646,7 +5646,7 @@ def _read_opt_mcast_sel(self, schema: 'Schema_DynamicIPMulticastSelectorOption', rather than to the mobility header, and each is self-describing through its own auxiliary-data length and source count, so they are recorded opaquely here rather than half-decoded. - :attr:`~pcapkit.protocols.data.internet.mh.DynamicIPMulticastSelectorOption.protocol` + :attr:`~pcapkit.protocols.internet.mh.data.DynamicIPMulticastSelectorOption.protocol` says which of the two they are: ``143`` for MLDv2 and ``131`` for MLDv1, or ``0x12``, ``0x16`` and ``0x22`` for IGMPv1 to IGMPv3 [:rfc:`7028#section-8`]. @@ -5750,7 +5750,7 @@ def _read_opt_ams4(self, schema: 'Schema_ActiveMulticastSubscriptionIPv4Option', :rfc:`2236`) or an IGMPv3 group record (:rfc:`3376#section-4.2`), which belong to IGMP rather than to the mobility header, so they are recorded opaquely. - :attr:`~pcapkit.protocols.data.internet.mh.ActiveMulticastSubscriptionIPv4Option.igmp_type` + :attr:`~pcapkit.protocols.internet.mh.data.ActiveMulticastSubscriptionIPv4Option.igmp_type` says which: ``0x12`` IGMPv1, ``0x16`` IGMPv2, ``0x22`` IGMPv3. @@ -5797,7 +5797,7 @@ def _read_opt_ams6(self, schema: 'Schema_ActiveMulticastSubscriptionIPv6Option', record; for MLDv1 it is a reserved word followed by a multicast address [:rfc:`7161#section-4.1.3`]. Both belong to MLD, so the context is recorded opaquely and - :attr:`~pcapkit.protocols.data.internet.mh.ActiveMulticastSubscriptionIPv6Option.mld_type` + :attr:`~pcapkit.protocols.internet.mh.data.ActiveMulticastSubscriptionIPv6Option.mld_type` says which form it is in. Args: @@ -6060,7 +6060,7 @@ def _read_opt_mcast(self, schema: 'Schema_MulticastMobilityOption', *, ``length + 2``. The option-collection machinery advances by the octets the schema actually consumed rather than by the declared length, so the unusual unit does not misframe the options that follow -- but it does - mean :attr:`~pcapkit.protocols.data.internet.mh.Option.length` here is + mean :attr:`~pcapkit.protocols.internet.mh.data.Option.length` here is the true octet count, computed rather than copied. Args: @@ -7304,7 +7304,7 @@ def _make_msg_fback(self, message: 'Optional[Data_FastBindingAcknowledgmentMessa Args: message: Message data model. status: Status code, see - :class:`~pcapkit.protocols.internet.mh.FastBindingAcknowledgmentStatus`. + :class:`~pcapkit.protocols.internet.mh.protocol.FastBindingAcknowledgmentStatus`. key_mngt: Key management mobility option flag. seq: Sequence number. lifetime: Lifetime, in seconds or as a @@ -7724,7 +7724,7 @@ def _make_msg_lra(self, message: 'Optional[Data_LocalizedRoutingAcknowledgmentMe seq: Sequence number. unsolicited: Unsolicited flag. status: Status, see - :class:`~pcapkit.protocols.internet.mh.LocalizedRoutingStatus`. + :class:`~pcapkit.protocols.internet.mh.protocol.LocalizedRoutingStatus`. lifetime: Lifetime, in seconds or as a :class:`~datetime.timedelta`. options: Mobility options. @@ -8010,7 +8010,7 @@ def _make_pad_options(self, offset: 'int') -> 'tuple[list[Schema_PadOption], int Note: The Mobility Header is a multiple of 8 octets and - :attr:`~pcapkit.protocols.schema.internet.mh.MH.length` counts those + :attr:`~pcapkit.protocols.internet.mh.schema.MH.length` counts those units less one [:rfc:`6275#section-6.1.1`]. Its fixed part is **six** octets, not the two of an IPv6 options header, so it is ``len(data) + 6`` that has to be aligned -- which means the message @@ -8148,9 +8148,9 @@ def _make_opt_pad(self, type: 'Enum_Option', option: 'Optional[Data_PadOption]' Note: :attr:`Data_PadOption.length - ` counts the + ` counts the *whole* option, whereas :attr:`Schema_PadOption.length - ` is the + ` is the ``Option Length`` field -- two octets fewer, and absent altogether for a ``Pad1``. Copying one into the other unconverted would make a re-made parsed ``PadN`` come back two octets too long. @@ -8951,7 +8951,7 @@ def _make_opt_ipv6_ap(self, type: 'Enum_Option', option: 'Optional[Data_IPv6Addr type: Option type. option: Option data model. code: Option code, see - :class:`~pcapkit.protocols.internet.mh.IPv6AddressPrefixCode`. + :class:`~pcapkit.protocols.internet.mh.protocol.IPv6AddressPrefixCode`. prefix_length: Prefix length. address: IPv6 address/prefix. **kwargs: Arbitrary keyword arguments. @@ -9304,9 +9304,9 @@ def _make_opt_timestamp(self, type: 'Enum_Option', option: 'Optional[Data_Timest Note: The fixed-point pair is taken from - :attr:`~pcapkit.protocols.data.internet.mh.TimestampOption.pmip_timestamp` + :attr:`~pcapkit.protocols.internet.mh.data.TimestampOption.pmip_timestamp` rather than recomputed from - :attr:`~pcapkit.protocols.data.internet.mh.TimestampOption.timestamp`, + :attr:`~pcapkit.protocols.internet.mh.data.TimestampOption.timestamp`, since a :class:`~datetime.datetime` holds microseconds and the wire format holds 1/65536ths -- converting between them does not round-trip. @@ -9874,7 +9874,7 @@ def _make_opt_lmaa(self, type: 'Enum_Option', option: 'Optional[Data_LMAAddressO type: Option type. option: Option data model. code: Option code, see - :class:`~pcapkit.protocols.internet.mh.LMAAddressCode`. If not + :class:`~pcapkit.protocols.internet.mh.protocol.LMAAddressCode`. If not given, the code of the address family of ``address``. address: Local mobility anchor address. reserved: The reserved octet as captured. @@ -11837,7 +11837,7 @@ def _make_ext_multiprefix(self, type: 'Enum_CGAExtension', option: 'Optional[Dat type=type, # NOTE: The extension data is the 4-octet flags word followed by one # **8**-octet prefix apiece, since - # :attr:`~pcapkit.protocols.schema.internet.mh.MultiPrefixExtension.prefixes` + # :attr:`~pcapkit.protocols.internet.mh.schema.MultiPrefixExtension.prefixes` # is a list of :class:`~pcapkit.corekit.fields.numbers.UInt64Field`. # Counting 16 octets per prefix would declare more octets than are # emitted, so a re-parse would run off the end of the extension. diff --git a/pcapkit/protocols/schema/internet/mh.py b/pcapkit/protocols/internet/mh/schema.py similarity index 98% rename from pcapkit/protocols/schema/internet/mh.py rename to pcapkit/protocols/internet/mh/schema.py index f500f03504..b0e6f4ff52 100644 --- a/pcapkit/protocols/schema/internet/mh.py +++ b/pcapkit/protocols/internet/mh/schema.py @@ -60,7 +60,7 @@ from pcapkit.corekit.fields.numbers import (EnumField, UInt8Field, UInt16Field, UInt32Field, UInt64Field) from pcapkit.corekit.fields.strings import BitField, BytesField, PaddingField, StringField -from pcapkit.protocols.schema.schema import EnumSchema, Schema, schema_final +from pcapkit.protocols.schema import EnumSchema, Schema, schema_final from pcapkit.utilities.datetime import fromtimestamp from pcapkit.utilities.exceptions import ProtocolError from pcapkit.utilities.logging import SPHINX_TYPE_CHECKING @@ -379,7 +379,7 @@ def mh_data_selector(pkt: 'dict[str, Any]') -> 'Field': Returns: Returns a :class:`~pcapkit.corekit.fields.misc.SchemaField` - wrapped :class:`~pcapkit.protocols.schema.internet.mh.Packet` + wrapped :class:`~pcapkit.protocols.internet.mh.schema.Packet` subclass instance. """ @@ -626,9 +626,9 @@ def cga_public_key_length(pkt: 'dict[str, Any]') -> 'int': Note: The check is skipped when ``__length__`` is absent or negative, which is - what :meth:`Schema.pack ` + what :meth:`Schema.pack ` leaves it as. A key test set by - :meth:`MH._make_opt_cga_param ` + :meth:`MH._make_opt_cga_param ` carries no ``long``, and its ``len`` is the key's length less two. """ @@ -876,7 +876,7 @@ class MNIDOption(Option, code=Enum_Option.MN_ID_OPTION_TYPE): if TYPE_CHECKING: # NOTE: No ``int`` here, and deliberately so even though - # :meth:`MH._make_opt_mn_id ` + # :meth:`MH._make_opt_mn_id ` # *does* accept one. The two annotations describe different boundaries: # the maker's is what a **caller** may pass, while this one is what the # schema can **hold**, and the maker converts between them before ever @@ -1177,19 +1177,19 @@ class IPv6AddressPrefixOption(Option, code=Enum_Option.Mobility_Header_IPv6_Addr Note: The option codes of :rfc:`5568#section-6.4.2` are defined inline by the RFC with no IANA registry behind them, so their enumeration lives in - :class:`pcapkit.protocols.internet.mh.IPv6AddressPrefixCode` rather than + :class:`pcapkit.protocols.internet.mh.protocol.IPv6AddressPrefixCode` rather than in :mod:`pcapkit.const.mh`. Being module-local, it cannot be imported here without a circular import, so :attr:`code` carries the raw wire integer and the enumeration is applied when - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_ipv6_ap` builds the + :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_ipv6_ap` builds the data model -- the same split as - :class:`pcapkit.protocols.misc.pcapng.PacketDirection` and the + :class:`pcapkit.protocols.misc.pcapng.protocol.PacketDirection` and the ``epb_flags`` option schema. """ #: Option code, see - #: :class:`pcapkit.protocols.internet.mh.IPv6AddressPrefixCode`. + #: :class:`pcapkit.protocols.internet.mh.protocol.IPv6AddressPrefixCode`. code: 'int' = UInt8Field() #: Prefix length. prefix_length: 'int' = UInt8Field() @@ -1326,7 +1326,7 @@ class TimestampOption(Option, code=Enum_Option.Timestamp_Option): integer part occupies the leading **48** bits and whose fractional part occupies the trailing **16**, each unit of the latter being 1/65536 of a second. NTP splits its 64 bits 32/32 from a different epoch, so reusing - :class:`~pcapkit.protocols.data.internet.mh.NTPTimestamp` here would + :class:`~pcapkit.protocols.internet.mh.data.NTPTimestamp` here would misread both halves. """ @@ -1559,7 +1559,7 @@ class ContextRequestOption(Option, code=Enum_Option.Context_Request_Option): Note: The request entries are carried as one opaque run here and walked by - :meth:`~pcapkit.protocols.internet.mh.MH._read_opt_cr`, rather than as a + :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_opt_cr`, rather than as a :class:`~pcapkit.corekit.fields.collections.ListField` of a nested schema. Each entry is self-describing -- a type octet, a length octet and that many octets of value [:rfc:`5949#section-6.2.1`] -- so a nested schema would need @@ -1592,7 +1592,7 @@ class LMAAddressOption(Option, code=Enum_Option.Local_Mobility_Anchor_Address_Op :attr:`code` says whether an IPv6 (``1``) or an IPv4 (``2``) address follows [:rfc:`5949#section-6.2.2`]. Those codes are defined inline by the RFC with no IANA registry behind them, so their enumeration lives in - :class:`pcapkit.protocols.internet.mh.LMAAddressCode` rather than in + :class:`pcapkit.protocols.internet.mh.protocol.LMAAddressCode` rather than in :mod:`pcapkit.const.mh`, and :attr:`code` carries the raw wire integer. The address field is nonetheless sized from :attr:`Option.length`, which is the authoritative width on the wire. @@ -1600,7 +1600,7 @@ class LMAAddressOption(Option, code=Enum_Option.Local_Mobility_Anchor_Address_Op """ #: Option code, see - #: :class:`pcapkit.protocols.internet.mh.LMAAddressCode`. + #: :class:`pcapkit.protocols.internet.mh.protocol.LMAAddressCode`. code: 'int' = UInt8Field() #: Reserved. reserved: 'bytes' = PaddingField(length=1) @@ -1989,7 +1989,7 @@ class ANIGeoLocationSuboption(ANISuboption, code=Enum_ANISuboption.Geo_Location) with 9 integer bits [:rfc:`6757#section-3.1.2`]. A :class:`~pcapkit.corekit.fields.strings.BitField` reads them unsigned, so the sign is applied when - :meth:`~pcapkit.protocols.internet.mh.MH._read_ani_suboptions` builds the data + :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_ani_suboptions` builds the data model. """ @@ -2938,17 +2938,17 @@ class FastBindingAcknowledgmentMessage(Packet, code=Enum_Packet.Fast_Binding_Ack The status values of :rfc:`5568#section-6.2.3` are defined inline by the RFC and are absent from the IANA *Status Codes* registry, so their enumeration lives in - :class:`pcapkit.protocols.internet.mh.FastBindingAcknowledgmentStatus` + :class:`pcapkit.protocols.internet.mh.protocol.FastBindingAcknowledgmentStatus` rather than in :mod:`pcapkit.const.mh`. Being module-local, it cannot be imported here without a circular import, so :attr:`status` carries the raw wire integer and the enumeration is applied when - :meth:`~pcapkit.protocols.internet.mh.MH._read_msg_fback` builds the data + :meth:`~pcapkit.protocols.internet.mh.protocol.MH._read_msg_fback` builds the data model. """ #: Status, see - #: :class:`pcapkit.protocols.internet.mh.FastBindingAcknowledgmentStatus`. + #: :class:`pcapkit.protocols.internet.mh.protocol.FastBindingAcknowledgmentStatus`. status: 'int' = UInt8Field() #: Flags. flags: 'FastBindingAcknowledgmentMessageFlags' = BitField(length=1, namespace={ @@ -3195,7 +3195,7 @@ class LocalizedRoutingAcknowledgmentMessage( inline and IANA keeps no registry for them -- they are neither in the general *Status Codes* registry nor in one of their own -- so their enumeration lives in - :class:`pcapkit.protocols.internet.mh.LocalizedRoutingStatus` rather than + :class:`pcapkit.protocols.internet.mh.protocol.LocalizedRoutingStatus` rather than in :mod:`pcapkit.const.mh`. Being module-local, it cannot be imported here without a circular import, so :attr:`status` carries the raw wire integer. @@ -3210,7 +3210,7 @@ class LocalizedRoutingAcknowledgmentMessage( 'reserved': (1, 7), }) #: Status, see - #: :class:`pcapkit.protocols.internet.mh.LocalizedRoutingStatus`. + #: :class:`pcapkit.protocols.internet.mh.protocol.LocalizedRoutingStatus`. status: 'int' = UInt8Field() #: Lifetime, in seconds. lifetime: 'int' = UInt16Field() diff --git a/pcapkit/protocols/link/__init__.py b/pcapkit/protocols/link/__init__.py index fb3c1db735..3c37634d12 100644 --- a/pcapkit/protocols/link/__init__.py +++ b/pcapkit/protocols/link/__init__.py @@ -15,29 +15,29 @@ from pcapkit.protocols.link.link import Link # Link Layer Protocols -from pcapkit.protocols.link.arp import ARP -from pcapkit.protocols.link.inarp import InARP -from pcapkit.protocols.link.ethernet import Ethernet -from pcapkit.protocols.link.frad import FRAD -from pcapkit.protocols.link.gre import GRE -from pcapkit.protocols.link.ieee802_11 import IEEE802_11 -from pcapkit.protocols.link.loopback import Loopback -from pcapkit.protocols.link.netlink import Netlink -from pcapkit.protocols.link.radiotap import Radiotap +from pcapkit.protocols.link.arp.protocol import ARP +from pcapkit.protocols.link.inarp.protocol import InARP +from pcapkit.protocols.link.ethernet.protocol import Ethernet +from pcapkit.protocols.link.frad.protocol import FRAD +from pcapkit.protocols.link.gre.protocol import GRE +from pcapkit.protocols.link.ieee802_11.protocol import IEEE802_11 +from pcapkit.protocols.link.loopback.protocol import Loopback +from pcapkit.protocols.link.netlink.protocol import Netlink +from pcapkit.protocols.link.radiotap.protocol import Radiotap # Linux "Cooked" Capture Encapsulation Family -from pcapkit.protocols.link.linux_sll import LinuxSLL -from pcapkit.protocols.link.linux_sll1 import LinuxSLL1 -from pcapkit.protocols.link.linux_sll2 import LinuxSLL2 +from pcapkit.protocols.link.linux_sll.protocol import LinuxSLL +from pcapkit.protocols.link.linux_sll1.protocol import LinuxSLL1 +from pcapkit.protocols.link.linux_sll2.protocol import LinuxSLL2 # VLAN Tag Family -from pcapkit.protocols.link.vlan import VLAN -from pcapkit.protocols.link.c_tag import C_Tag -from pcapkit.protocols.link.s_tag import S_Tag +from pcapkit.protocols.link.vlan.protocol import VLAN +from pcapkit.protocols.link.c_tag.protocol import C_Tag +from pcapkit.protocols.link.s_tag.protocol import S_Tag # L2TP Family -from pcapkit.protocols.link.l2tp import L2TP -from pcapkit.protocols.link.l2tpv2 import L2TPv2 +from pcapkit.protocols.link.l2tp.protocol import L2TP +from pcapkit.protocols.link.l2tpv2.protocol import L2TPv2 # Link-Layer Header Type Values from pcapkit.const.reg.linktype import LinkType as LINKTYPE diff --git a/pcapkit/protocols/link/arp/__init__.py b/pcapkit/protocols/link/arp/__init__.py new file mode 100644 index 0000000000..b232d7b0c7 --- /dev/null +++ b/pcapkit/protocols/link/arp/__init__.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""ARP - Address Resolution Protocol +======================================= + +.. module:: pcapkit.protocols.link.arp + +:mod:`pcapkit.protocols.link.arp` holds the dissector, +:class:`~pcapkit.protocols.link.arp.protocol.ARP`, in +:mod:`~pcapkit.protocols.link.arp.protocol`, its header schema in +:mod:`~pcapkit.protocols.link.arp.schema` and its data model in +:mod:`~pcapkit.protocols.link.arp.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.link.arp.protocol import ARP + +# Header Schemas +from pcapkit.protocols.link.arp.schema import ARP as Schema_ARP + +# Data Models +from pcapkit.protocols.link.arp.data import ARP as Data_ARP +from pcapkit.protocols.link.arp.data import Address as Data_Address +from pcapkit.protocols.link.arp.data import Type as Data_Type + +__all__ = ['ARP'] diff --git a/pcapkit/protocols/data/link/arp.py b/pcapkit/protocols/link/arp/data.py similarity index 95% rename from pcapkit/protocols/data/link/arp.py rename to pcapkit/protocols/link/arp/data.py index 2132fb2b7f..c19d78354b 100644 --- a/pcapkit/protocols/data/link/arp.py +++ b/pcapkit/protocols/link/arp/data.py @@ -4,8 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.data import Data -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Data, Protocol if TYPE_CHECKING: from ipaddress import IPv4Address, IPv6Address diff --git a/pcapkit/protocols/link/arp.py b/pcapkit/protocols/link/arp/protocol.py similarity index 96% rename from pcapkit/protocols/link/arp.py rename to pcapkit/protocols/link/arp/protocol.py index 3e746a81f8..3f2d66568c 100644 --- a/pcapkit/protocols/link/arp.py +++ b/pcapkit/protocols/link/arp/protocol.py @@ -2,10 +2,10 @@ """ARP - Address Resolution Protocol ======================================= -.. module:: pcapkit.protocols.link.arp +.. module:: pcapkit.protocols.link.arp.protocol -:mod:`pcapkit.protocols.link.arp` contains -:class:`~pcapkit.protocols.link.arp.ARP` only, +:mod:`pcapkit.protocols.link.arp.protocol` contains +:class:`~pcapkit.protocols.link.arp.protocol.ARP` only, which implements an extractor for Address Resolution Protocol (ARP) [*]_, whose structure is described as below: @@ -39,7 +39,7 @@ .. versionremoved:: 1.6.0 ``pcapkit.protocols.link.arp.InARP``, with no alias. The class moved to - :mod:`pcapkit.protocols.link.inarp`, since a module holds one protocol + :mod:`pcapkit.protocols.link.inarp.protocol`, since a module holds one protocol class, named after it (:issue:`2529`). """ @@ -50,11 +50,11 @@ from pcapkit.const.arp.operation import Operation as Enum_Operation from pcapkit.const.reg.ethertype import EtherType as Enum_EtherType from pcapkit.corekit.schema.ipaddress import parse_ip_address -from pcapkit.protocols.data.link.arp import ARP as Data_ARP -from pcapkit.protocols.data.link.arp import Address as Data_Address -from pcapkit.protocols.data.link.arp import Type as Data_Type +from pcapkit.protocols.link.arp.data import ARP as Data_ARP +from pcapkit.protocols.link.arp.data import Address as Data_Address +from pcapkit.protocols.link.arp.data import Type as Data_Type +from pcapkit.protocols.link.arp.schema import ARP as Schema_ARP from pcapkit.protocols.link.link import Link -from pcapkit.protocols.schema.link.arp import ARP as Schema_ARP from pcapkit.utilities.compat import cached_property from pcapkit.utilities.exceptions import FieldValueError, ProtocolError @@ -65,7 +65,7 @@ from typing_extensions import Literal from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema __all__ = ['ARP'] @@ -74,10 +74,11 @@ class ARP(Link[Data_ARP, Schema_ARP], schema=Schema_ARP, data=Data_ARP): """This class implements all protocols in ARP family. - - Address Resolution Protocol (:class:`~pcapkit.protocols.link.arp.ARP`) [:rfc:`826`] - - Reverse Address Resolution Protocol (:class:`~pcapkit.protocols.application.rarp.RARP`) [:rfc:`903`] - - Dynamic Reverse Address Resolution Protocol (:class:`~pcapkit.protocols.application.drarp.DRARP`) [:rfc:`1931`] - - Inverse Address Resolution Protocol (:class:`~pcapkit.protocols.link.inarp.InARP`) [:rfc:`2390`] + - Address Resolution Protocol (:class:`~pcapkit.protocols.link.arp.protocol.ARP`) [:rfc:`826`] + - Reverse Address Resolution Protocol (:class:`~pcapkit.protocols.application.rarp.protocol.RARP`) [:rfc:`903`] + - Dynamic Reverse Address Resolution Protocol (:class:`~pcapkit.protocols.application.drarp.protocol.DRARP`) + [:rfc:`1931`] + - Inverse Address Resolution Protocol (:class:`~pcapkit.protocols.link.inarp.protocol.InARP`) [:rfc:`2390`] .. versionchanged:: 1.5.0 diff --git a/pcapkit/protocols/schema/link/arp.py b/pcapkit/protocols/link/arp/schema.py similarity index 96% rename from pcapkit/protocols/schema/link/arp.py rename to pcapkit/protocols/link/arp/schema.py index a166e40449..2bfbcd122e 100644 --- a/pcapkit/protocols/schema/link/arp.py +++ b/pcapkit/protocols/link/arp/schema.py @@ -10,7 +10,7 @@ from pcapkit.corekit.fields.misc import PayloadField from pcapkit.corekit.fields.numbers import EnumField, UInt8Field from pcapkit.corekit.fields.strings import BytesField -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final __all__ = ['ARP'] diff --git a/pcapkit/protocols/link/c_tag/__init__.py b/pcapkit/protocols/link/c_tag/__init__.py new file mode 100644 index 0000000000..d240f45c22 --- /dev/null +++ b/pcapkit/protocols/link/c_tag/__init__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +"""C_Tag - 802.1Q Customer VLAN Tag Type +=========================================== + +.. module:: pcapkit.protocols.link.c_tag + +:mod:`pcapkit.protocols.link.c_tag` holds the dissector, +:class:`~pcapkit.protocols.link.c_tag.protocol.C_Tag`, in +:mod:`~pcapkit.protocols.link.c_tag.protocol`. + +""" +from pcapkit.protocols.link.c_tag.protocol import C_Tag + +__all__ = ['C_Tag'] diff --git a/pcapkit/protocols/link/c_tag.py b/pcapkit/protocols/link/c_tag/protocol.py similarity index 82% rename from pcapkit/protocols/link/c_tag.py rename to pcapkit/protocols/link/c_tag/protocol.py index fcf0842f9e..02eac0262c 100644 --- a/pcapkit/protocols/link/c_tag.py +++ b/pcapkit/protocols/link/c_tag/protocol.py @@ -2,17 +2,17 @@ """C_Tag - 802.1Q Customer VLAN Tag Type =========================================== -.. module:: pcapkit.protocols.link.c_tag +.. module:: pcapkit.protocols.link.c_tag.protocol -:mod:`pcapkit.protocols.link.c_tag` contains -:class:`~pcapkit.protocols.link.c_tag.C_Tag` only, which implements the extractor for +:mod:`pcapkit.protocols.link.c_tag.protocol` contains +:class:`~pcapkit.protocols.link.c_tag.protocol.C_Tag` only, which implements the extractor for the 802.1Q Customer VLAN Tag Type (C-Tag, formerly the Q-Tag) [*]_, EtherType ``0x8100``. Its structure, and all of its parsing and construction, come from -:class:`~pcapkit.protocols.link.vlan.VLAN`; this class adds only the tag's own +:class:`~pcapkit.protocols.link.vlan.protocol.VLAN`; this class adds only the tag's own identity and its registry index. -It lives in a module of its own rather than beside -:class:`~pcapkit.protocols.link.s_tag.S_Tag`, since a module holds one protocol +It lives in a package of its own rather than beside +:class:`~pcapkit.protocols.link.s_tag.protocol.S_Tag`, since a package holds one protocol class, named after it, with only the framework bases in :mod:`pcapkit.protocols.protocol` exempt (:issue:`2529`). The two tags are reached through different registry indices, ``0x8100`` against ``0x88A8``. @@ -23,9 +23,9 @@ from typing import TYPE_CHECKING from pcapkit.const.reg.ethertype import EtherType as Enum_EtherType -from pcapkit.protocols.data.link.vlan import VLAN as Data_VLAN -from pcapkit.protocols.link.vlan import VLAN -from pcapkit.protocols.schema.link.vlan import VLAN as Schema_VLAN +from pcapkit.protocols.link.vlan.data import VLAN as Data_VLAN +from pcapkit.protocols.link.vlan.protocol import VLAN +from pcapkit.protocols.link.vlan.schema import VLAN as Schema_VLAN if TYPE_CHECKING: from typing_extensions import Literal @@ -39,14 +39,14 @@ # resolves an omitted schema by looking the *subclass name* up in # :mod:`pcapkit.protocols.schema`, and assigns unconditionally -- so leaving them # off would silently bind ``Schema_Raw``/``Data_Raw`` rather than falling back to -# the base class's pair. See :class:`~pcapkit.protocols.application.rarp.RARP`, which +# the base class's pair. See :class:`~pcapkit.protocols.application.rarp.protocol.RARP`, which # restates them for the same reason. class C_Tag(VLAN, schema=Schema_VLAN, data=Data_VLAN): """This class implements 802.1Q Customer VLAN Tag Type. .. versionadded:: 1.5.0 - Takes over the customer tag from :class:`~pcapkit.protocols.link.vlan.VLAN`. + Takes over the customer tag from :class:`~pcapkit.protocols.link.vlan.protocol.VLAN`. """ @@ -84,7 +84,7 @@ def id(cls) -> 'tuple[Literal["C_Tag"], Literal["VLAN"]]': # type: ignore[overr Index ID of the protocol. ``VLAN`` is retained alongside the class's own name so that selecting VLAN tags by that name, e.g. ``pcapkit.extract(..., protocol='VLAN')``, matches the customer - tag; :class:`~pcapkit.protocols.link.s_tag.S_Tag` carries the same + tag; :class:`~pcapkit.protocols.link.s_tag.protocol.S_Tag` carries the same alias. """ diff --git a/pcapkit/protocols/link/ethernet/__init__.py b/pcapkit/protocols/link/ethernet/__init__.py new file mode 100644 index 0000000000..f587226b33 --- /dev/null +++ b/pcapkit/protocols/link/ethernet/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""Ethernet Protocol +======================= + +.. module:: pcapkit.protocols.link.ethernet + +:mod:`pcapkit.protocols.link.ethernet` holds the dissector, +:class:`~pcapkit.protocols.link.ethernet.protocol.Ethernet`, in +:mod:`~pcapkit.protocols.link.ethernet.protocol`, its header schema in +:mod:`~pcapkit.protocols.link.ethernet.schema` and its data model in +:mod:`~pcapkit.protocols.link.ethernet.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.link.ethernet.protocol import Ethernet + +# Header Schemas +from pcapkit.protocols.link.ethernet.schema import Ethernet as Schema_Ethernet + +# Data Models +from pcapkit.protocols.link.ethernet.data import Ethernet as Data_Ethernet + +__all__ = ['Ethernet'] diff --git a/pcapkit/protocols/data/link/ethernet.py b/pcapkit/protocols/link/ethernet/data.py similarity index 87% rename from pcapkit/protocols/data/link/ethernet.py rename to pcapkit/protocols/link/ethernet/data.py index bafea54c38..3da3b78632 100644 --- a/pcapkit/protocols/data/link/ethernet.py +++ b/pcapkit/protocols/link/ethernet/data.py @@ -4,8 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.data import Data -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Data, Protocol if TYPE_CHECKING: from pcapkit.const.reg.ethertype import EtherType diff --git a/pcapkit/protocols/link/ethernet.py b/pcapkit/protocols/link/ethernet/protocol.py similarity index 95% rename from pcapkit/protocols/link/ethernet.py rename to pcapkit/protocols/link/ethernet/protocol.py index dd700ce7dc..675ac0e4e4 100644 --- a/pcapkit/protocols/link/ethernet.py +++ b/pcapkit/protocols/link/ethernet/protocol.py @@ -2,10 +2,10 @@ """Ethernet Protocol ======================= -.. module:: pcapkit.protocols.link.ethernet +.. module:: pcapkit.protocols.link.ethernet.protocol -:mod:`pcapkit.protocols.link.ethernet` contains -:class:`~pcapkit.protocols.link.ethernet.Ethernet` +:mod:`pcapkit.protocols.link.ethernet.protocol` contains +:class:`~pcapkit.protocols.link.ethernet.protocol.Ethernet` only, which implements the extractor for Ethernet Protocol [*]_, whose structure is described as below: @@ -29,9 +29,9 @@ from pcapkit.const.reg.ethertype import EtherType as Enum_EtherType from pcapkit.const.reg.linktype import LinkType as Enum_LinkType -from pcapkit.protocols.data.link.ethernet import Ethernet as Data_Ethernet +from pcapkit.protocols.link.ethernet.data import Ethernet as Data_Ethernet +from pcapkit.protocols.link.ethernet.schema import Ethernet as Schema_Ethernet from pcapkit.protocols.link.link import Link -from pcapkit.protocols.schema.link.ethernet import Ethernet as Schema_Ethernet if TYPE_CHECKING: from typing import Any, Optional @@ -39,7 +39,7 @@ from typing_extensions import Literal from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema __all__ = ['Ethernet'] diff --git a/pcapkit/protocols/schema/link/ethernet.py b/pcapkit/protocols/link/ethernet/schema.py similarity index 93% rename from pcapkit/protocols/schema/link/ethernet.py rename to pcapkit/protocols/link/ethernet/schema.py index a99871c8f7..ecafaad473 100644 --- a/pcapkit/protocols/schema/link/ethernet.py +++ b/pcapkit/protocols/link/ethernet/schema.py @@ -8,7 +8,7 @@ from pcapkit.corekit.fields.misc import PayloadField from pcapkit.corekit.fields.numbers import EnumField from pcapkit.corekit.fields.strings import BytesField -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final __all__ = ['Ethernet'] @@ -44,7 +44,8 @@ def callback_payload(self: 'PayloadField', packet: 'dict[str, Any]') -> 'None': class back, so the registry is left as registered (:issue:`1559`). """ - from pcapkit.protocols.link.ethernet import Ethernet # pylint: disable=import-outside-toplevel + from pcapkit.protocols.link.ethernet.protocol import \ + Ethernet # pylint: disable=import-outside-toplevel self.protocol = Ethernet._lookup_next_layer( # pylint: disable=protected-access Ethernet.__proto__, packet['type']) diff --git a/pcapkit/protocols/link/frad/__init__.py b/pcapkit/protocols/link/frad/__init__.py new file mode 100644 index 0000000000..5f804617a1 --- /dev/null +++ b/pcapkit/protocols/link/frad/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""FRAD - Frame Relay Access Device +====================================== + +.. module:: pcapkit.protocols.link.frad + +:mod:`pcapkit.protocols.link.frad` holds the dissector, +:class:`~pcapkit.protocols.link.frad.protocol.FRAD`, in +:mod:`~pcapkit.protocols.link.frad.protocol`, its header schema in +:mod:`~pcapkit.protocols.link.frad.schema` and its data model in +:mod:`~pcapkit.protocols.link.frad.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.link.frad.protocol import FRAD + +# Header Schemas +from pcapkit.protocols.link.frad.schema import FRAD as Schema_FRAD + +# Data Models +from pcapkit.protocols.link.frad.data import FRAD as Data_FRAD + +__all__ = ['FRAD'] diff --git a/pcapkit/protocols/data/link/frad.py b/pcapkit/protocols/link/frad/data.py similarity index 97% rename from pcapkit/protocols/data/link/frad.py rename to pcapkit/protocols/link/frad/data.py index 876e748858..1cb7c009f0 100644 --- a/pcapkit/protocols/data/link/frad.py +++ b/pcapkit/protocols/link/frad/data.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Protocol if TYPE_CHECKING: from typing import Optional diff --git a/pcapkit/protocols/link/frad.py b/pcapkit/protocols/link/frad/protocol.py similarity index 91% rename from pcapkit/protocols/link/frad.py rename to pcapkit/protocols/link/frad/protocol.py index 1b43c9d30b..ebdfaba931 100644 --- a/pcapkit/protocols/link/frad.py +++ b/pcapkit/protocols/link/frad/protocol.py @@ -2,24 +2,24 @@ """FRAD - Frame Relay Access Device ====================================== -.. module:: pcapkit.protocols.link.frad +.. module:: pcapkit.protocols.link.frad.protocol -:mod:`pcapkit.protocols.link.frad` contains -:class:`~pcapkit.protocols.link.frad.FRAD` only, which implements the +:mod:`pcapkit.protocols.link.frad.protocol` contains +:class:`~pcapkit.protocols.link.frad.protocol.FRAD` only, which implements the extractor for Frame Relay's multiprotocol encapsulation [*]_, as seen on a ``LINKTYPE_FRELAY`` capture, or on a ``LINKTYPE_LINUX_SLL``/``LINKTYPE_LINUX_SLL2`` capture whose ``arphrd_type`` -is ``ARPHRD_FRAD`` -- :class:`~pcapkit.protocols.link.linux_sll.LinuxSLL` +is ``ARPHRD_FRAD`` -- :class:`~pcapkit.protocols.link.linux_sll.protocol.LinuxSLL` dispatches here instead of falling back to -:class:`~pcapkit.protocols.misc.raw.Raw` for that one case; see -:attr:`LinuxSLL.__proto__ `. Its +:class:`~pcapkit.protocols.misc.raw.protocol.Raw` for that one case; see +:attr:`LinuxSLL.__proto__ `. Its structure is the Q.922 LAPF address onward, with no trailing FCS: a 2-octet ``frad.addr``, a 1-octet ``frad.control`` (``0x03``, UI, for ordinary data traffic), then a 1-octet ``frad.nlpid``, which a ``0x00`` pad octet may precede. RFC 2427 writes the pad ahead of a SNAP header: the NLPID ``0x80``, then a 5-octet OUI and PID. See -:meth:`FRAD.read ` for the full byte -diagram and :mod:`pcapkit.protocols.schema.link.frad` for the field-by-field +:meth:`FRAD.read ` for the full byte +diagram and :mod:`pcapkit.protocols.link.frad.schema` for the field-by-field schema. .. [*] :rfc:`2427` (obsoleting :rfc:`1490`) @@ -33,9 +33,9 @@ from pcapkit.const.reg.linktype import LinkType as Enum_LinkType from pcapkit.corekit.decorators import beholder from pcapkit.corekit.module import ModuleDescriptor -from pcapkit.protocols.data.link.frad import FRAD as Data_FRAD +from pcapkit.protocols.link.frad.data import FRAD as Data_FRAD +from pcapkit.protocols.link.frad.schema import FRAD as Schema_FRAD from pcapkit.protocols.link.link import Link -from pcapkit.protocols.schema.link.frad import FRAD as Schema_FRAD from pcapkit.utilities.exceptions import ProtocolError from pcapkit.utilities.warnings import RegistryWarning, warn @@ -45,7 +45,7 @@ from typing_extensions import Literal from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema __all__ = ['FRAD'] @@ -56,9 +56,9 @@ class FRAD(Link[Data_FRAD, Schema_FRAD], A frame whose NLPID (after resolving any ``0x00`` pad ahead of it) is ``0xCC`` or ``0x8E`` dispatches to - :class:`~pcapkit.protocols.internet.ipv4.IPv4` or - :class:`~pcapkit.protocols.internet.ipv6.IPv6` respectively, registered - in the :attr:`self.__proto__ ` + :class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4` or + :class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6` respectively, registered + in the :attr:`self.__proto__ ` attribute. A SNAP header whose OUI is ``00-00-00`` carries an EtherType in its PID, resolved instead through the family registry every Ethernet/VLAN/LinuxSLL frame shares, @@ -67,13 +67,13 @@ class FRAD(Link[Data_FRAD, Schema_FRAD], Every other NLPID (Q.933 signalling, ISO CLNP/ES-IS/IS-IS, FRF.9/FRF.12 compression and fragmentation, PPP-in-Frame-Relay, and a SNAP header whose OUI names a bridged medium rather than an EtherType) is kept as - :class:`~pcapkit.protocols.misc.raw.Raw`, exactly as every ``arphrd_type`` + :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, exactly as every ``arphrd_type`` this module's docstring lists already was before this class existed. A frame whose Q.922 address is not the 2-octet form is refused: :meth:`read` raises :exc:`~pcapkit.utilities.exceptions.ProtocolError`. - It becomes :class:`~pcapkit.protocols.misc.raw.Raw` only behind a caller + It becomes :class:`~pcapkit.protocols.misc.raw.protocol.Raw` only behind a caller that catches the error, such as - :class:`~pcapkit.protocols.link.linux_sll.LinuxSLL` or a + :class:`~pcapkit.protocols.link.linux_sll.protocol.LinuxSLL` or a ``LINKTYPE_FRELAY`` capture. """ @@ -86,12 +86,12 @@ class FRAD(Link[Data_FRAD, Schema_FRAD], #: NLPID rather than by EtherType, so this class keeps a registry of its #: own instead of sharing :attr:`Link.__proto__ #: ` -- the same reason - #: :class:`~pcapkit.protocols.link.loopback.Loopback` keeps one of its own. + #: :class:`~pcapkit.protocols.link.loopback.protocol.Loopback` keeps one of its own. __proto__ = collections.defaultdict( - lambda: ModuleDescriptor('pcapkit.protocols.misc.raw', 'Raw'), + lambda: ModuleDescriptor('pcapkit.protocols.misc.raw.protocol', 'Raw'), { - 0xCC: ModuleDescriptor('pcapkit.protocols.internet.ipv4', 'IPv4'), - 0x8E: ModuleDescriptor('pcapkit.protocols.internet.ipv6', 'IPv6'), + 0xCC: ModuleDescriptor('pcapkit.protocols.internet.ipv4.protocol', 'IPv4'), + 0x8E: ModuleDescriptor('pcapkit.protocols.internet.ipv6.protocol', 'IPv6'), }, ) # type: DefaultDict[int, ModuleDescriptor[ProtocolBase] | Type[ProtocolBase]] @@ -147,7 +147,7 @@ def read(self, length: 'Optional[int]' = None, **kwargs: 'Any') -> 'Data_FRAD': in place of the single NLPID octet above, followed by a 3-octet OUI and a 2-octet PID (:rfc:`2427#section-4.1`). The pad may precede any NLPID, or be left out ahead of ``0x80`` (:rfc:`2427#section-3`), and - :attr:`~pcapkit.protocols.data.link.frad.FRAD.pad` records whether + :attr:`~pcapkit.protocols.link.frad.data.FRAD.pad` records whether it is there. Args: @@ -372,7 +372,7 @@ def __length_hint__(self) -> 'Literal[10]': The longest form -- a SNAP-encapsulated header, 10 octets -- per the reason :meth:`L2TPv2.__length_hint__ - ` gives for a + ` gives for a variable-length header: the shortest form would reject a fully captured longer header as too short. @@ -387,7 +387,7 @@ def __index__(cls) -> 'Enum_LinkType': # pylint: disable=invalid-index-returned Numeral registry index of the protocol in `tcpdump`_ link-layer header types, ``LINKTYPE_FRELAY``: a Q.922 LAPF frame from the address field on, with no FCS. - :attr:`LinuxSLL.__proto__ ` + :attr:`LinuxSLL.__proto__ ` names its own key for this class, ``ARPHRD_FRAD`` (:ref:`registry-protocol-index`). @@ -441,7 +441,7 @@ def _import_next_layer(self, proto: 'int', length: 'Optional[int]' = None, *, # Instance of next layer. A SNAP header whose OUI is ``00-00-00`` is dispatched through :attr:`Link.__proto__ ` instead of - :attr:`self.__proto__ `, + :attr:`self.__proto__ `, keyed by the PID as an EtherType -- see :meth:`read`, which records it as ``self._snap_ethertype``. @@ -457,10 +457,10 @@ def _import_next_layer(self, proto: 'int', length: 'Optional[int]' = None, *, # if TYPE_CHECKING: protocol: 'Type[ProtocolBase]' if not min(length, len(file_)): - from pcapkit.protocols.misc.no_payload import \ + from pcapkit.protocols.misc.no_payload.protocol import \ NoPayload as protocol # isort: skip # pylint: disable=import-outside-toplevel elif self._sigterm: - from pcapkit.protocols.misc.raw import \ + from pcapkit.protocols.misc.raw.protocol import \ Raw as protocol # isort: skip # pylint: disable=import-outside-toplevel else: protocol = self._lookup_next_layer(Link.__proto__, ethertype) diff --git a/pcapkit/protocols/schema/link/frad.py b/pcapkit/protocols/link/frad/schema.py similarity index 94% rename from pcapkit/protocols/schema/link/frad.py rename to pcapkit/protocols/link/frad/schema.py index 22d8796d83..1bb1f03b37 100644 --- a/pcapkit/protocols/schema/link/frad.py +++ b/pcapkit/protocols/link/frad/schema.py @@ -7,7 +7,7 @@ from pcapkit.corekit.fields.misc import ConditionalField, PayloadField from pcapkit.corekit.fields.numbers import UInt8Field, UInt16Field from pcapkit.corekit.fields.strings import BitField, BytesField -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final from pcapkit.utilities.logging import SPHINX_TYPE_CHECKING __all__ = ['FRAD'] @@ -46,8 +46,8 @@ def _effective_nlpid(packet: 'dict[str, Any]') -> 'int': Args: packet: Packet data, built incrementally by :meth:`Schema.unpack - ` or supplied whole - by :meth:`FRAD.make `. + ` or supplied whole + by :meth:`FRAD.make `. Returns: :attr:`~FRAD.ext_nlpid` when :attr:`~FRAD.nlpid` is the ``0x00`` pad diff --git a/pcapkit/protocols/link/gre/__init__.py b/pcapkit/protocols/link/gre/__init__.py new file mode 100644 index 0000000000..17913291b2 --- /dev/null +++ b/pcapkit/protocols/link/gre/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""GRE - Generic Routing Encapsulation +========================================= + +.. module:: pcapkit.protocols.link.gre + +:mod:`pcapkit.protocols.link.gre` holds the dissector, +:class:`~pcapkit.protocols.link.gre.protocol.GRE`, in +:mod:`~pcapkit.protocols.link.gre.protocol`, its header schema in +:mod:`~pcapkit.protocols.link.gre.schema` and its data model in +:mod:`~pcapkit.protocols.link.gre.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.link.gre.protocol import GRE + +# Header Schemas +from pcapkit.protocols.link.gre.schema import GRE as Schema_GRE + +# Data Models +from pcapkit.protocols.link.gre.data import GRE as Data_GRE + +__all__ = ['GRE'] diff --git a/pcapkit/protocols/data/link/gre.py b/pcapkit/protocols/link/gre/data.py similarity index 98% rename from pcapkit/protocols/data/link/gre.py rename to pcapkit/protocols/link/gre/data.py index a98ef70c83..2f0e5b5071 100644 --- a/pcapkit/protocols/data/link/gre.py +++ b/pcapkit/protocols/link/gre/data.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Protocol if TYPE_CHECKING: from typing import Optional diff --git a/pcapkit/protocols/link/gre.py b/pcapkit/protocols/link/gre/protocol.py similarity index 93% rename from pcapkit/protocols/link/gre.py rename to pcapkit/protocols/link/gre/protocol.py index 50bdb78a9d..755105e69c 100644 --- a/pcapkit/protocols/link/gre.py +++ b/pcapkit/protocols/link/gre/protocol.py @@ -2,10 +2,10 @@ """GRE - Generic Routing Encapsulation ========================================= -.. module:: pcapkit.protocols.link.gre +.. module:: pcapkit.protocols.link.gre.protocol -:mod:`pcapkit.protocols.link.gre` contains -:class:`~pcapkit.protocols.link.gre.GRE` only, which implements the extractor +:mod:`pcapkit.protocols.link.gre.protocol` contains +:class:`~pcapkit.protocols.link.gre.protocol.GRE` only, which implements the extractor for the Generic Routing Encapsulation base header [:rfc:`2784`] plus the optional Key and Sequence Number extensions [:rfc:`2890`]. It is reached through IP protocol number 47 behind any layer sharing @@ -14,9 +14,9 @@ ``LINKTYPE_LINUX_SLL``/``LINKTYPE_LINUX_SLL2`` capture whose ``arphrd_type`` is ``ARPHRD_IPGRE`` or ``ARPHRD_IP6GRE`` -- ``ARPHRD_IPGRE`` and ``ARPHRD_IP6GRE`` both land on this one class: -:class:`~pcapkit.protocols.link.linux_sll.LinuxSLL` dispatches here instead -of falling back to :class:`~pcapkit.protocols.misc.raw.Raw` for either case; -see :attr:`LinuxSLL.__proto__ `. The +:class:`~pcapkit.protocols.link.linux_sll.protocol.LinuxSLL` dispatches here instead +of falling back to :class:`~pcapkit.protocols.misc.raw.protocol.Raw` for either case; +see :attr:`LinuxSLL.__proto__ `. The "IP"/"IP6" distinction in the two ``arphrd_type`` names is about which IP version the tunnel carries on its *outer* layer -- i.e. which ``arphrd_type`` fired -- not a different GRE header shape; the GRE framing itself is @@ -48,7 +48,7 @@ EtherType selecting the encapsulated payload -- resolved through :attr:`Link.__proto__ `, the same family registry Ethernet, VLAN and LinuxSLL already share, exactly as -:class:`~pcapkit.protocols.link.vlan.VLAN` resolves its own ``type`` field. +:class:`~pcapkit.protocols.link.vlan.protocol.VLAN` resolves its own ``type`` field. This class therefore keeps no registry of its own. Scope @@ -59,8 +59,8 @@ where in its sequence) is a matter for the tunnel endpoints, not something a passive dissector can resolve from the header alone. The Checksum, when ``C`` is set, covers the header and the payload with no pseudo-header -(:rfc:`2784#section-2.5`); :meth:`~pcapkit.protocols.link.gre.GRE.read` -verifies it and :meth:`~pcapkit.protocols.link.gre.GRE.make` computes it +(:rfc:`2784#section-2.5`); :meth:`~pcapkit.protocols.link.gre.protocol.GRE.read` +verifies it and :meth:`~pcapkit.protocols.link.gre.protocol.GRE.make` computes it (:issue:`2618`). RFC 2637's Enhanced GRE (version 1, used by PPTP) has a different, incompatible layout from this point on -- a Key field split into Payload Length and Call ID, and an optional @@ -74,9 +74,9 @@ from pcapkit.const.reg.ethertype import EtherType as Enum_EtherType from pcapkit.const.reg.transtype import TransType as Enum_TransType -from pcapkit.protocols.data.link.gre import GRE as Data_GRE +from pcapkit.protocols.link.gre.data import GRE as Data_GRE +from pcapkit.protocols.link.gre.schema import GRE as Schema_GRE from pcapkit.protocols.link.link import Link -from pcapkit.protocols.schema.link.gre import GRE as Schema_GRE from pcapkit.utilities import config from pcapkit.utilities.exceptions import ProtocolError @@ -86,7 +86,7 @@ from typing_extensions import Literal from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema __all__ = ['GRE'] @@ -97,9 +97,9 @@ class GRE(Link[Data_GRE, Schema_GRE], The Protocol Type field is dispatched as an EtherType through :attr:`Link.__proto__ `, - exactly as :class:`~pcapkit.protocols.link.vlan.VLAN` resolves its own + exactly as :class:`~pcapkit.protocols.link.vlan.protocol.VLAN` resolves its own ``type`` field -- so, unlike - :class:`~pcapkit.protocols.link.frad.FRAD`, this class declares no + :class:`~pcapkit.protocols.link.frad.protocol.FRAD`, this class declares no registry of its own. The checksum, present when ``C`` is set, is verified on read under @@ -251,7 +251,7 @@ def make(self, The presence of each optional field is inferred from whether its value is given, as :meth:`L2TPv2.make - ` infers ``S`` from + ` infers ``S`` from whether ``ns``/``nr`` are given: passing ``checksum`` sets ``C``, ``key`` sets ``K``, and ``sequence_number`` sets ``S``. ``C`` can be set without a ``checksum`` too, through ``checksum_present``, as @@ -353,7 +353,7 @@ def __length_hint__(self) -> 'Literal[16]': The longest form -- every optional field present, 16 octets -- per the reason :meth:`L2TPv2.__length_hint__ - ` gives for a + ` gives for a variable-length header: the shortest form would reject a fully captured longer header as too short. @@ -369,7 +369,7 @@ def __index__(cls) -> 'Enum_TransType': # pylint: disable=invalid-index-returne numbers, which :attr:`Internet.__proto__ ` is keyed by. - :attr:`LinuxSLL.__proto__ ` + :attr:`LinuxSLL.__proto__ ` names its own keys for this class, :attr:`~pcapkit.const.linux.arphrd.ARPHRD.IPGRE` and :attr:`~pcapkit.const.linux.arphrd.ARPHRD.IP6GRE` diff --git a/pcapkit/protocols/schema/link/gre.py b/pcapkit/protocols/link/gre/schema.py similarity index 98% rename from pcapkit/protocols/schema/link/gre.py rename to pcapkit/protocols/link/gre/schema.py index 6c0f4ef1f6..2d6ae824ea 100644 --- a/pcapkit/protocols/schema/link/gre.py +++ b/pcapkit/protocols/link/gre/schema.py @@ -8,7 +8,7 @@ from pcapkit.corekit.fields.misc import ConditionalField, PayloadField from pcapkit.corekit.fields.numbers import EnumField, UInt16Field, UInt32Field from pcapkit.corekit.fields.strings import BitField -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final from pcapkit.utilities.logging import SPHINX_TYPE_CHECKING __all__ = ['GRE'] diff --git a/pcapkit/protocols/link/ieee802_11/__init__.py b/pcapkit/protocols/link/ieee802_11/__init__.py new file mode 100644 index 0000000000..d31715cd41 --- /dev/null +++ b/pcapkit/protocols/link/ieee802_11/__init__.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""IEEE 802.11 - Wireless LAN MAC Header +=========================================== + +.. module:: pcapkit.protocols.link.ieee802_11 + +:mod:`pcapkit.protocols.link.ieee802_11` holds the dissector, +:class:`~pcapkit.protocols.link.ieee802_11.protocol.IEEE802_11`, in +:mod:`~pcapkit.protocols.link.ieee802_11.protocol`, its header schema in +:mod:`~pcapkit.protocols.link.ieee802_11.schema` and its data model in +:mod:`~pcapkit.protocols.link.ieee802_11.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.link.ieee802_11.protocol import IEEE802_11 + +# Header Schemas +from pcapkit.protocols.link.ieee802_11.schema import IEEE802_11 as Schema_IEEE802_11 +from pcapkit.protocols.link.ieee802_11.schema import Layout as Schema_Layout + +# Data Models +from pcapkit.protocols.link.ieee802_11.data import IEEE802_11 as Data_IEEE802_11 +from pcapkit.protocols.link.ieee802_11.data import FrameControl as Data_FrameControl +from pcapkit.protocols.link.ieee802_11.data import HTControl as Data_HTControl +from pcapkit.protocols.link.ieee802_11.data import QoSControl as Data_QoSControl +from pcapkit.protocols.link.ieee802_11.data import SequenceControl as Data_SequenceControl + +__all__ = ['IEEE802_11'] diff --git a/pcapkit/protocols/data/link/ieee802_11.py b/pcapkit/protocols/link/ieee802_11/data.py similarity index 97% rename from pcapkit/protocols/data/link/ieee802_11.py rename to pcapkit/protocols/link/ieee802_11/data.py index 15ea4a8efe..5d90260fcb 100644 --- a/pcapkit/protocols/data/link/ieee802_11.py +++ b/pcapkit/protocols/link/ieee802_11/data.py @@ -6,8 +6,7 @@ from typing import TYPE_CHECKING, Optional # pylint: disable=unused-import from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.data import Data -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Data, Protocol if TYPE_CHECKING: from typing_extensions import Literal @@ -141,7 +140,7 @@ class IEEE802_11(Protocol): """Data model for an IEEE 802.11 MAC header (IEEE Std 802.11-2020 ยง9.2). A field the header does not carry is :obj:`None`; see - :func:`~pcapkit.protocols.schema.link.ieee802_11.layout`. + :func:`~pcapkit.protocols.link.ieee802_11.schema.layout`. """ diff --git a/pcapkit/protocols/link/ieee802_11.py b/pcapkit/protocols/link/ieee802_11/protocol.py similarity index 95% rename from pcapkit/protocols/link/ieee802_11.py rename to pcapkit/protocols/link/ieee802_11/protocol.py index ddc1a2d299..1e63f2cc62 100644 --- a/pcapkit/protocols/link/ieee802_11.py +++ b/pcapkit/protocols/link/ieee802_11/protocol.py @@ -2,13 +2,13 @@ """IEEE 802.11 - Wireless LAN MAC Header =========================================== -.. module:: pcapkit.protocols.link.ieee802_11 +.. module:: pcapkit.protocols.link.ieee802_11.protocol -:mod:`pcapkit.protocols.link.ieee802_11` contains -:class:`~pcapkit.protocols.link.ieee802_11.IEEE802_11` only, which implements +:mod:`pcapkit.protocols.link.ieee802_11.protocol` contains +:class:`~pcapkit.protocols.link.ieee802_11.protocol.IEEE802_11` only, which implements the extractor for the IEEE 802.11 MAC header [*]_ of a protocol version 0 frame, as a ``LINKTYPE_IEEE802_11`` capture carries it or -:class:`~pcapkit.protocols.link.radiotap.Radiotap` hands it on. Its fields, in +:class:`~pcapkit.protocols.link.radiotap.protocol.Radiotap` hands it on. Its fields, in the order they appear, numeric ones little-endian: .. table:: @@ -30,18 +30,18 @@ with +HTC/Order set (ยง9.2.4.6) ======================= ======= ============================================ -:func:`~pcapkit.protocols.schema.link.ieee802_11.layout` gives the rule per +:func:`~pcapkit.protocols.link.ieee802_11.schema.layout` gives the rule per frame type. A Control frame of a subtype whose layout this class does not model, and an Extension frame, are read as the minimal frame format of ยง9.2.3: the first three fields only. A Control Frame Extension frame and an S1G Beacon lay out B8-B15 of Frame Control differently; see -:class:`~pcapkit.protocols.data.link.ieee802_11.FrameControl`. +:class:`~pcapkit.protocols.link.ieee802_11.data.FrameControl`. The frame body (ยง9.2.4.7) follows the header and is kept as -:class:`~pcapkit.protocols.misc.raw.Raw`, protected or not. The FCS +:class:`~pcapkit.protocols.misc.raw.protocol.Raw`, protected or not. The FCS (ยง9.2.4.8), where one was captured, stays at the end of the body: this class does not decide whether a capture carries one, which behind radiotap is a -Flags bit :class:`~pcapkit.protocols.link.radiotap.Radiotap` decodes but does +Flags bit :class:`~pcapkit.protocols.link.radiotap.protocol.Radiotap` decodes but does not pass on. For the same reason, the pad octets that radiotap's data-pad flag says follow the header stay at the start of the body. @@ -64,14 +64,14 @@ from pcapkit.const.ieee802_11.management_subtype import ManagementSubtype as Enum_ManagementSubtype from pcapkit.const.ieee802_11.type import Type as Enum_Type from pcapkit.const.reg.linktype import LinkType as Enum_LinkType -from pcapkit.protocols.data.link.ieee802_11 import IEEE802_11 as Data_IEEE802_11 -from pcapkit.protocols.data.link.ieee802_11 import FrameControl as Data_FrameControl -from pcapkit.protocols.data.link.ieee802_11 import HTControl as Data_HTControl -from pcapkit.protocols.data.link.ieee802_11 import QoSControl as Data_QoSControl -from pcapkit.protocols.data.link.ieee802_11 import SequenceControl as Data_SequenceControl +from pcapkit.protocols.link.ieee802_11.data import IEEE802_11 as Data_IEEE802_11 +from pcapkit.protocols.link.ieee802_11.data import FrameControl as Data_FrameControl +from pcapkit.protocols.link.ieee802_11.data import HTControl as Data_HTControl +from pcapkit.protocols.link.ieee802_11.data import QoSControl as Data_QoSControl +from pcapkit.protocols.link.ieee802_11.data import SequenceControl as Data_SequenceControl +from pcapkit.protocols.link.ieee802_11.schema import IEEE802_11 as Schema_IEEE802_11 +from pcapkit.protocols.link.ieee802_11.schema import Layout, layout from pcapkit.protocols.link.link import Link -from pcapkit.protocols.schema.link.ieee802_11 import IEEE802_11 as Schema_IEEE802_11 -from pcapkit.protocols.schema.link.ieee802_11 import Layout, layout from pcapkit.utilities.exceptions import ProtocolError if TYPE_CHECKING: @@ -80,7 +80,7 @@ from typing_extensions import Literal from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema Subtype = Union[Enum_ManagementSubtype, Enum_ControlSubtype, Enum_DataSubtype, Enum_ExtensionSubtype] @@ -105,7 +105,7 @@ class IEEE802_11(Link[Data_IEEE802_11, Schema_IEEE802_11], schema=Schema_IEEE802_11, data=Data_IEEE802_11): """This class implements the IEEE 802.11 MAC header. - The frame body is kept as :class:`~pcapkit.protocols.misc.raw.Raw`; see + The frame body is kept as :class:`~pcapkit.protocols.misc.raw.protocol.Raw`; see the module docstring. """ @@ -220,7 +220,7 @@ def make(self, """Make (construct) packet data. The Frame Control subfields decide which fields the header carries, - as :func:`~pcapkit.protocols.schema.link.ieee802_11.layout` reads them. + as :func:`~pcapkit.protocols.link.ieee802_11.schema.layout` reads them. A field the header carries and the caller leaves out is written as zeros; a field the header does not carry must be left out. @@ -250,7 +250,7 @@ def make(self, ``sequence_number``. addr4: Address 4. qos_control: QoS Control, a mapping of the keys - :class:`~pcapkit.protocols.data.link.ieee802_11.QoSControl` + :class:`~pcapkit.protocols.link.ieee802_11.data.QoSControl` has. ht_control: HT Control, the whole field as an integer. payload: Payload data: the frame body, and the FCS if any. @@ -319,7 +319,7 @@ def __index__(cls) -> 'Enum_LinkType': # pylint: disable=invalid-index-returned Returns: Numeral registry index of the protocol in `tcpdump`_ link-layer header types, which - :attr:`Radiotap.__proto__ ` + :attr:`Radiotap.__proto__ ` is keyed by too. .. _tcpdump: https://www.tcpdump.org/linktypes.html diff --git a/pcapkit/protocols/schema/link/ieee802_11.py b/pcapkit/protocols/link/ieee802_11/schema.py similarity index 99% rename from pcapkit/protocols/schema/link/ieee802_11.py rename to pcapkit/protocols/link/ieee802_11/schema.py index 833d42bf83..a88648d40b 100644 --- a/pcapkit/protocols/schema/link/ieee802_11.py +++ b/pcapkit/protocols/link/ieee802_11/schema.py @@ -17,7 +17,7 @@ from pcapkit.corekit.fields.misc import ConditionalField, PayloadField from pcapkit.corekit.fields.numbers import UInt16Field, UInt32Field from pcapkit.corekit.fields.strings import BytesField -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final __all__ = ['IEEE802_11'] diff --git a/pcapkit/protocols/link/inarp/__init__.py b/pcapkit/protocols/link/inarp/__init__.py new file mode 100644 index 0000000000..fcc11338ea --- /dev/null +++ b/pcapkit/protocols/link/inarp/__init__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +"""InARP - Inverse Address Resolution Protocol +================================================= + +.. module:: pcapkit.protocols.link.inarp + +:mod:`pcapkit.protocols.link.inarp` holds the dissector, +:class:`~pcapkit.protocols.link.inarp.protocol.InARP`, in +:mod:`~pcapkit.protocols.link.inarp.protocol`. + +""" +from pcapkit.protocols.link.inarp.protocol import InARP + +__all__ = ['InARP'] diff --git a/pcapkit/protocols/link/inarp.py b/pcapkit/protocols/link/inarp/protocol.py similarity index 61% rename from pcapkit/protocols/link/inarp.py rename to pcapkit/protocols/link/inarp/protocol.py index fa2f622da0..0c871acdac 100644 --- a/pcapkit/protocols/link/inarp.py +++ b/pcapkit/protocols/link/inarp/protocol.py @@ -2,32 +2,32 @@ """InARP - Inverse Address Resolution Protocol ================================================= -.. module:: pcapkit.protocols.link.inarp +.. module:: pcapkit.protocols.link.inarp.protocol -:mod:`pcapkit.protocols.link.inarp` contains -:class:`~pcapkit.protocols.link.inarp.InARP` only, +:mod:`pcapkit.protocols.link.inarp.protocol` contains +:class:`~pcapkit.protocols.link.inarp.protocol.InARP` only, which implements an extractor for Inverse Address Resolution Protocol (InARP) [*]_, whose frame is the one -:mod:`pcapkit.protocols.link.arp` describes. +:mod:`pcapkit.protocols.link.arp.protocol` describes. -Nothing dispatches to :class:`~pcapkit.protocols.link.inarp.InARP`: +Nothing dispatches to :class:`~pcapkit.protocols.link.inarp.protocol.InARP`: under EtherType ``0x0806``, an InARP operation parses as -:class:`~pcapkit.protocols.link.arp.ARP` with alias ``InARP``. +:class:`~pcapkit.protocols.link.arp.protocol.ARP` with alias ``InARP``. .. [*] https://datatracker.ietf.org/doc/html/rfc2390 .. versionadded:: 1.6.0 - Moved here from :mod:`pcapkit.protocols.link.arp`, which keeps - :class:`~pcapkit.protocols.link.arp.ARP` alone, since a module holds one + Moved here from :mod:`pcapkit.protocols.link.arp.protocol`, which keeps + :class:`~pcapkit.protocols.link.arp.protocol.ARP` alone, since a module holds one protocol class, named after it (:issue:`2529`). """ from typing import TYPE_CHECKING -from pcapkit.protocols.data.link.arp import ARP as Data_ARP -from pcapkit.protocols.link.arp import ARP -from pcapkit.protocols.schema.link.arp import ARP as Schema_ARP +from pcapkit.protocols.link.arp.data import ARP as Data_ARP +from pcapkit.protocols.link.arp.protocol import ARP +from pcapkit.protocols.link.arp.schema import ARP as Schema_ARP if TYPE_CHECKING: from typing_extensions import Literal diff --git a/pcapkit/protocols/link/l2tp/__init__.py b/pcapkit/protocols/link/l2tp/__init__.py new file mode 100644 index 0000000000..fcfb3aee30 --- /dev/null +++ b/pcapkit/protocols/link/l2tp/__init__.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""L2TP - Layer Two Tunnelling Protocol +========================================== + +.. module:: pcapkit.protocols.link.l2tp + +:mod:`pcapkit.protocols.link.l2tp` holds the dissector, +:class:`~pcapkit.protocols.link.l2tp.protocol.L2TP`, in +:mod:`~pcapkit.protocols.link.l2tp.protocol`, its header schema in +:mod:`~pcapkit.protocols.link.l2tp.schema` and its data model in +:mod:`~pcapkit.protocols.link.l2tp.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.link.l2tp.protocol import L2TP + +# Header Schemas +from pcapkit.protocols.link.l2tp.schema import L2TP as Schema_L2TP + +# Data Models +from pcapkit.protocols.link.l2tp.data import L2TP as Data_L2TP +from pcapkit.protocols.link.l2tp.data import Flags as Data_Flags + +__all__ = ['L2TP'] diff --git a/pcapkit/protocols/data/link/l2tp.py b/pcapkit/protocols/link/l2tp/data.py similarity index 95% rename from pcapkit/protocols/data/link/l2tp.py rename to pcapkit/protocols/link/l2tp/data.py index 10ce2f415d..e9cecf1e3e 100644 --- a/pcapkit/protocols/data/link/l2tp.py +++ b/pcapkit/protocols/link/l2tp/data.py @@ -4,8 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.data import Data -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Data, Protocol if TYPE_CHECKING: from typing import Optional diff --git a/pcapkit/protocols/link/l2tp.py b/pcapkit/protocols/link/l2tp/protocol.py similarity index 86% rename from pcapkit/protocols/link/l2tp.py rename to pcapkit/protocols/link/l2tp/protocol.py index 6f6db46ca7..48458c6978 100644 --- a/pcapkit/protocols/link/l2tp.py +++ b/pcapkit/protocols/link/l2tp/protocol.py @@ -2,10 +2,10 @@ """L2TP - Layer Two Tunnelling Protocol ========================================== -.. module:: pcapkit.protocols.link.l2tp +.. module:: pcapkit.protocols.link.l2tp.protocol -:mod:`pcapkit.protocols.link.l2tp` contains -:class:`~pcapkit.protocols.link.l2tp.L2TP` only, an abstract base class for the +:mod:`pcapkit.protocols.link.l2tp.protocol` contains +:class:`~pcapkit.protocols.link.l2tp.protocol.L2TP` only, an abstract base class for the Layer Two Tunnelling Protocol family [*]_. The concrete versions live in modules of their own: @@ -16,14 +16,14 @@ - Class - Specification * - L2TPv2 - - :class:`~pcapkit.protocols.link.l2tpv2.L2TPv2` + - :class:`~pcapkit.protocols.link.l2tpv2.protocol.L2TPv2` - :rfc:`2661` Only L2TPv2 is implemented. What the family is expected to grow is set out below, so that the base's shape is not guessed at later. The base deliberately carries **no header parsing at all**, in the way -:class:`~pcapkit.protocols.internet.ip.IP` carries none for its family. That is +:class:`~pcapkit.protocols.internet.ip.protocol.IP` carries none for its family. That is not tidiness: the versions genuinely do not share a header. All that is common across them is the *first 16-bit word carrying a version nibble at bits 12-15*; everything after it differs, so a base that parsed further would be assuming one @@ -42,13 +42,13 @@ different framing decision. It also means 115 names v3 alone: v2's :meth:`~pcapkit.protocols.protocol.Protocol.__index__` is its UDP port. -Binding :class:`~pcapkit.protocols.link.l2tpv2.L2TPv2` at 115 instead does not +Binding :class:`~pcapkit.protocols.link.l2tpv2.protocol.L2TPv2` at 115 instead does not work (:issue:`548`), and is recorded so it is not proposed again. Over IP the v3 session header is, in :rfc:`3931` ยง4.1.1.1's own words, *"free of any restrictions imposed by coexistence with L2TPv2 and L2F"* -- a data message opens with the raw 32-bit Session ID and carries **no version nibble at all**, so there is nothing a v2 parser could test to recognise that the datagram is not its own. Without the -version check in :meth:`L2TPv2.read `, +version check in :meth:`L2TPv2.read `, that binding reports ``version=4``, ``tunnelid=0x5678`` and ``sessionid=0xff03`` for a v3-over-IP datagram: a complete header assembled out of a Session ID and the first two octets of the PPP frame behind it. The check refuses that datagram @@ -63,7 +63,7 @@ with L2TP packets". L2F is a separate protocol with its own header. It is therefore to be implemented as ``L2F``, the canonical name, carrying ``L2TPv1`` only as an alias in its :meth:`~pcapkit.protocols.protocol.Protocol.id`. See -:meth:`L2TPv2.id ` for how a +:meth:`L2TPv2.id ` for how a version-flavoured alias is spelled: canonical name first, alias second, since callers take element zero as canonical. @@ -73,23 +73,23 @@ Constructing the base gives the member its ``version`` field names, from octets or from fields; without it, octets give the one their version nibble names, and fields are refused, since no field picks a member (:issue:`2574`). -:meth:`L2TP._member_of_version ` -maps ``2`` to :class:`~pcapkit.protocols.link.l2tpv2.L2TPv2` and refuses any +:meth:`L2TP._member_of_version ` +maps ``2`` to :class:`~pcapkit.protocols.link.l2tpv2.protocol.L2TPv2` and refuses any other version, for that field, for the nibble and for the data -:meth:`L2TP.from_data ` is handed. -:meth:`L2TPv2.read ` **checks** the +:meth:`L2TP.from_data ` is handed. +:meth:`L2TPv2.read ` **checks** the nibble as well and refuses anything other than ``2``. That keeps v3 traffic on port 1701 (:rfc:`3931` ยง4.7.2 shares the port, so this is ordinary capture traffic rather than a corner case) from being reported as v2 with a tunnel and session ID read out of v3's Control Connection ID. UDP port 1701 binds L2TPv2 itself, the only member. -:meth:`~pcapkit.protocols.link.l2tp.L2TP._member_of_version` is where a further +:meth:`~pcapkit.protocols.link.l2tp.protocol.L2TP._member_of_version` is where a further member goes, and binding the port to this base through a hook making the same -switch, as :meth:`IGMP._dispatch ` +switch, as :meth:`IGMP._dispatch ` does for IP protocol 2, needs no new registry. L2TP is the easier case beside -:class:`~pcapkit.protocols.application.http.HTTP`, whose -:meth:`~pcapkit.protocols.application.http.HTTP._guess_version` has to *infer* +:class:`~pcapkit.protocols.application.http.protocol.HTTP`, whose +:meth:`~pcapkit.protocols.application.http.protocol.HTTP._guess_version` has to *infer* the version because HTTP's wire format carries no version field, whereas L2TP states its version explicitly in those four bits. The switch belongs on the **UDP** path only: over IP protocol 115 there is no nibble to switch on, per the @@ -116,10 +116,10 @@ class L2TP(Link[_PT, _ST], Generic[_PT, _ST]): # pylint: disable=abstract-metho """This class implements all protocols in L2TP family. - Layer Two Tunnelling Protocol version 2 - (:class:`~pcapkit.protocols.link.l2tpv2.L2TPv2`) [:rfc:`2661`] + (:class:`~pcapkit.protocols.link.l2tpv2.protocol.L2TPv2`) [:rfc:`2661`] It is abstract for the same mechanical reason - :class:`~pcapkit.protocols.internet.ip.IP` is: + :class:`~pcapkit.protocols.internet.ip.protocol.IP` is: :attr:`~pcapkit.protocols.protocol.Protocol.name` and :meth:`~pcapkit.protocols.protocol.Protocol.read` are both declared abstract by :class:`~pcapkit.protocols.protocol.ProtocolBase` and neither is @@ -133,12 +133,12 @@ class L2TP(Link[_PT, _ST], Generic[_PT, _ST]): # pylint: disable=abstract-metho .. versionchanged:: 1.5.0 Became an abstract base for the family; its version-2 parsing moved to - :class:`~pcapkit.protocols.link.l2tpv2.L2TPv2`. + :class:`~pcapkit.protocols.link.l2tpv2.protocol.L2TPv2`. .. versionchanged:: 1.6.0 Constructing it and :meth:`from_data` give - :class:`~pcapkit.protocols.link.l2tpv2.L2TPv2`, where they raised + :class:`~pcapkit.protocols.link.l2tpv2.protocol.L2TPv2`, where they raised :exc:`TypeError`. The ``version`` field names the member; without it, octets give the one their version nibble names, and fields are refused (:issue:`2574`). @@ -170,7 +170,7 @@ def id(cls) -> 'tuple[Literal["L2TP"], Literal["L2TPv2"]]': Returns: Index ID of the protocol -- the family name, then every version in - it, as :meth:`VLAN.id ` + it, as :meth:`VLAN.id ` does for its own family. ``L2F`` and ``L2TPv3`` join this tuple when they are implemented. @@ -271,7 +271,7 @@ def _member_of_version(version: 'Any') -> 'Type[L2TP]': version: Version of L2TP. Returns: - :class:`~pcapkit.protocols.link.l2tpv2.L2TPv2` for ``2``. + :class:`~pcapkit.protocols.link.l2tpv2.protocol.L2TPv2` for ``2``. Raises: ProtocolError: For any other ``version``, or one that is no @@ -280,7 +280,7 @@ def _member_of_version(version: 'Any') -> 'Type[L2TP]': implemented. """ - from pcapkit.protocols.link.l2tpv2 import L2TPv2 # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.link.l2tpv2.protocol import L2TPv2 # isort: skip # pylint: disable=import-outside-toplevel if isinstance(version, int) and not isinstance(version, bool) and version == 2: return cast('Type[L2TP]', L2TPv2) diff --git a/pcapkit/protocols/schema/link/l2tp.py b/pcapkit/protocols/link/l2tp/schema.py similarity index 96% rename from pcapkit/protocols/schema/link/l2tp.py rename to pcapkit/protocols/link/l2tp/schema.py index 4aa0e465fd..62983b214f 100644 --- a/pcapkit/protocols/schema/link/l2tp.py +++ b/pcapkit/protocols/link/l2tp/schema.py @@ -7,7 +7,7 @@ from pcapkit.corekit.fields.misc import ConditionalField, PayloadField from pcapkit.corekit.fields.numbers import UInt16Field from pcapkit.corekit.fields.strings import BitField, PaddingField -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final from pcapkit.utilities.logging import SPHINX_TYPE_CHECKING __all__ = ['L2TP'] @@ -109,7 +109,7 @@ class L2TP(Schema): #: Payload of L2TP packet. payload: 'bytes' = PayloadField(length=l2tp_payload_length) #: Octets captured past the Length field, see - #: :attr:`IPv4.trailer `. + #: :attr:`IPv4.trailer `. #: Always empty when the ``L`` flag is clear, since the payload then takes #: the rest of the datagram. trailer: 'bytes' = PayloadField(default=b'') diff --git a/pcapkit/protocols/link/l2tpv2/__init__.py b/pcapkit/protocols/link/l2tpv2/__init__.py new file mode 100644 index 0000000000..3e4caa7aca --- /dev/null +++ b/pcapkit/protocols/link/l2tpv2/__init__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +"""L2TPv2 - Layer Two Tunnelling Protocol version 2 +====================================================== + +.. module:: pcapkit.protocols.link.l2tpv2 + +:mod:`pcapkit.protocols.link.l2tpv2` holds the dissector, +:class:`~pcapkit.protocols.link.l2tpv2.protocol.L2TPv2`, in +:mod:`~pcapkit.protocols.link.l2tpv2.protocol`. + +""" +from pcapkit.protocols.link.l2tpv2.protocol import L2TPv2 + +__all__ = ['L2TPv2'] diff --git a/pcapkit/protocols/link/l2tpv2.py b/pcapkit/protocols/link/l2tpv2/protocol.py similarity index 95% rename from pcapkit/protocols/link/l2tpv2.py rename to pcapkit/protocols/link/l2tpv2/protocol.py index 8ba910f435..f911c8dc4a 100644 --- a/pcapkit/protocols/link/l2tpv2.py +++ b/pcapkit/protocols/link/l2tpv2/protocol.py @@ -2,10 +2,10 @@ """L2TPv2 - Layer Two Tunnelling Protocol version 2 ====================================================== -.. module:: pcapkit.protocols.link.l2tpv2 +.. module:: pcapkit.protocols.link.l2tpv2.protocol -:mod:`pcapkit.protocols.link.l2tpv2` contains -:class:`~pcapkit.protocols.link.l2tpv2.L2TPv2` only, which implements the extractor +:mod:`pcapkit.protocols.link.l2tpv2.protocol` contains +:class:`~pcapkit.protocols.link.l2tpv2.protocol.L2TPv2` only, which implements the extractor for the Layer Two Tunnelling Protocol version 2 (L2TPv2) [*]_ as specified by :rfc:`2661` -- a 16-bit tunnel ID and a 16-bit session ID, with the version nibble reading ``2``. Its structure is described as below: @@ -54,10 +54,10 @@ from typing import TYPE_CHECKING from pcapkit.const.l2tp.type import Type as Enum_Type -from pcapkit.protocols.data.link.l2tp import L2TP as Data_L2TP -from pcapkit.protocols.data.link.l2tp import Flags as Data_Flags -from pcapkit.protocols.link.l2tp import L2TP -from pcapkit.protocols.schema.link.l2tp import L2TP as Schema_L2TP +from pcapkit.protocols.link.l2tp.data import L2TP as Data_L2TP +from pcapkit.protocols.link.l2tp.data import Flags as Data_Flags +from pcapkit.protocols.link.l2tp.protocol import L2TP +from pcapkit.protocols.link.l2tp.schema import L2TP as Schema_L2TP from pcapkit.utilities.exceptions import ProtocolError if TYPE_CHECKING: @@ -66,13 +66,13 @@ from typing_extensions import Literal from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema __all__ = ['L2TPv2'] # NOTE: ``schema`` and ``data`` are stated here rather than inherited from -# :class:`~pcapkit.protocols.link.l2tp.L2TP`, which declares none: the base is +# :class:`~pcapkit.protocols.link.l2tp.protocol.L2TP`, which declares none: the base is # version-agnostic and the header schema is not. They must be passed explicitly # in any case, since # :meth:`ProtocolBase.__init_subclass__ ` @@ -84,17 +84,17 @@ class L2TPv2(L2TP[Data_L2TP, Schema_L2TP], """This class implements Layer Two Tunnelling Protocol version 2. The protocol is dispatched from :attr:`UDP.__proto__ - ` at port 1701. + ` at port 1701. Only the :rfc:`2661` framing is read: :meth:`read` refuses a datagram whose version nibble is not ``2``, so a v3 datagram arriving on port 1701 (:rfc:`3931` ยง4.7.2 shares the port) degrades to - :class:`~pcapkit.protocols.misc.raw.Raw` instead of being reported as v2. + :class:`~pcapkit.protocols.misc.raw.protocol.Raw` instead of being reported as v2. .. versionadded:: 1.5.0 Takes over the version-2 parsing that - :class:`~pcapkit.protocols.link.l2tp.L2TP` carried, and refuses a version + :class:`~pcapkit.protocols.link.l2tp.protocol.L2TP` carried, and refuses a version nibble other than ``2`` (:issue:`548`). .. versionchanged:: 1.6.0 @@ -120,7 +120,7 @@ class L2TPv2(L2TP[Data_L2TP, Schema_L2TP], ``L2TPv3`` class rather than on this one. Binding *this* class there does not work (:issue:`548`): over IP the v3 session header carries no version nibble at all, so this class cannot recognise that the datagram - is not its own. See :mod:`pcapkit.protocols.link.l2tp` for the + is not its own. See :mod:`pcapkit.protocols.link.l2tp.protocol` for the versions not implemented. The class subclasses :class:`~pcapkit.protocols.link.link.Link` and so @@ -149,12 +149,12 @@ def version(self) -> 'Literal[2]': Always ``2``: :rfc:`2661` fixes the version nibble, and a datagram carrying any other value is a different protocol reached through a - different class. See :class:`~pcapkit.protocols.link.l2tp.L2TP`. + different class. See :class:`~pcapkit.protocols.link.l2tp.protocol.L2TP`. This is enforced rather than merely asserted -- :meth:`read` refuses a datagram whose nibble is not ``2``, so this hard-coded answer cannot disagree with - :attr:`info.version ` + :attr:`info.version ` on the same octets. """ @@ -400,7 +400,7 @@ def __index__(cls) -> 'int': # type: ignore[override] port numbers: UDP port 1701, the port of :attr:`UDP.l2tp ` as an :class:`int`, which - :attr:`UDP.__proto__ ` + :attr:`UDP.__proto__ ` dispatches here (:ref:`registry-protocol-index`). :class:`~pcapkit.const.reg.transtype.TransType` 115 names L2TPv3 over IP instead. diff --git a/pcapkit/protocols/link/link.py b/pcapkit/protocols/link/link.py index 04ed2f1db8..42a61c1dab 100644 --- a/pcapkit/protocols/link/link.py +++ b/pcapkit/protocols/link/link.py @@ -8,14 +8,14 @@ :mod:`pcapkit.protocols.link.link` contains :class:`~pcapkit.protocols.link.link.Link`, which is a base class for link layer protocols, e.g. -:class:`~pcapkit.protocols.link.arp.ARP`/:class:`~pcapkit.protocols.link.inarp.InARP`, -:class:`~pcapkit.protocols.link.ethernet.Ethernet`, -:class:`~pcapkit.protocols.link.frad.FRAD`, -:class:`~pcapkit.protocols.link.ieee802_11.IEEE802_11`, -:class:`~pcapkit.protocols.link.l2tp.L2TP`, -:class:`~pcapkit.protocols.link.loopback.Loopback`, -:class:`~pcapkit.protocols.link.radiotap.Radiotap` and -:class:`~pcapkit.protocols.link.vlan.VLAN`. +:class:`~pcapkit.protocols.link.arp.protocol.ARP`/:class:`~pcapkit.protocols.link.inarp.protocol.InARP`, +:class:`~pcapkit.protocols.link.ethernet.protocol.Ethernet`, +:class:`~pcapkit.protocols.link.frad.protocol.FRAD`, +:class:`~pcapkit.protocols.link.ieee802_11.protocol.IEEE802_11`, +:class:`~pcapkit.protocols.link.l2tp.protocol.L2TP`, +:class:`~pcapkit.protocols.link.loopback.protocol.Loopback`, +:class:`~pcapkit.protocols.link.radiotap.protocol.Radiotap` and +:class:`~pcapkit.protocols.link.vlan.protocol.VLAN`. """ import collections @@ -50,19 +50,19 @@ class Link(ProtocolBase[_PT, _ST], Generic[_PT, _ST]): # pylint: disable=abstra * - Index - Protocol * - :attr:`~pcapkit.const.reg.ethertype.EtherType.Address_Resolution_Protocol` - - :class:`pcapkit.protocols.link.arp.ARP` + - :class:`pcapkit.protocols.link.arp.protocol.ARP` * - :attr:`~pcapkit.const.reg.ethertype.EtherType.Reverse_Address_Resolution_Protocol` - - :class:`pcapkit.protocols.application.rarp.RARP` + - :class:`pcapkit.protocols.application.rarp.protocol.RARP` * - :attr:`~pcapkit.const.reg.ethertype.EtherType.Customer_VLAN_Tag_Type` - - :class:`pcapkit.protocols.link.c_tag.C_Tag` + - :class:`pcapkit.protocols.link.c_tag.protocol.C_Tag` * - :attr:`~pcapkit.const.reg.ethertype.EtherType.IEEE_Std_802_1Q_Service_VLAN_tag_identifier` - - :class:`pcapkit.protocols.link.s_tag.S_Tag` + - :class:`pcapkit.protocols.link.s_tag.protocol.S_Tag` * - :attr:`~pcapkit.const.reg.ethertype.EtherType.Internet_Protocol_version_4` - - :class:`pcapkit.protocols.internet.ipv4.IPv4` + - :class:`pcapkit.protocols.internet.ipv4.protocol.IPv4` * - :attr:`~pcapkit.const.reg.ethertype.EtherType.Internet_Protocol_version_6` - - :class:`pcapkit.protocols.internet.ipv6.IPv6` + - :class:`pcapkit.protocols.internet.ipv6.protocol.IPv6` * - 0x8137 - - :class:`pcapkit.protocols.internet.ipx.IPX` + - :class:`pcapkit.protocols.internet.ipx.protocol.IPX` """ @@ -79,28 +79,28 @@ class Link(ProtocolBase[_PT, _ST], Generic[_PT, _ST]): # pylint: disable=abstra #: :meth:`self._import_next_layer #: `. __proto__ = collections.defaultdict( - lambda: ModuleDescriptor('pcapkit.protocols.misc.raw', 'Raw'), + lambda: ModuleDescriptor('pcapkit.protocols.misc.raw.protocol', 'Raw'), { - Enum_EtherType.Address_Resolution_Protocol: ModuleDescriptor('pcapkit.protocols.link.arp', 'ARP'), + Enum_EtherType.Address_Resolution_Protocol: ModuleDescriptor('pcapkit.protocols.link.arp.protocol', 'ARP'), Enum_EtherType.Reverse_Address_Resolution_Protocol: - ModuleDescriptor('pcapkit.protocols.application.rarp', 'RARP'), + ModuleDescriptor('pcapkit.protocols.application.rarp.protocol', 'RARP'), # The 802.1Q customer tag and the 802.1ad service tag. Q-in-Q stacks # them -- the service tag's own next-EtherType is what selects the # customer tag -- so the two coexist in one frame rather than # competing. They are separate classes only to keep their # ``info_name`` apart in the parsed output; the tag layout itself is # identical, and both share the code in - # :class:`~pcapkit.protocols.link.vlan.VLAN`. + # :class:`~pcapkit.protocols.link.vlan.protocol.VLAN`. Enum_EtherType.Customer_VLAN_Tag_Type: - ModuleDescriptor('pcapkit.protocols.link.c_tag', 'C_Tag'), + ModuleDescriptor('pcapkit.protocols.link.c_tag.protocol', 'C_Tag'), Enum_EtherType.IEEE_Std_802_1Q_Service_VLAN_tag_identifier: - ModuleDescriptor('pcapkit.protocols.link.s_tag', 'S_Tag'), + ModuleDescriptor('pcapkit.protocols.link.s_tag.protocol', 'S_Tag'), - Enum_EtherType.Internet_Protocol_version_4: ModuleDescriptor('pcapkit.protocols.internet.ipv4', 'IPv4'), - Enum_EtherType.Internet_Protocol_version_6: ModuleDescriptor('pcapkit.protocols.internet.ipv6', 'IPv6'), + Enum_EtherType.Internet_Protocol_version_4: ModuleDescriptor('pcapkit.protocols.internet.ipv4.protocol', 'IPv4'), + Enum_EtherType.Internet_Protocol_version_6: ModuleDescriptor('pcapkit.protocols.internet.ipv6.protocol', 'IPv6'), # see https://en.wikipedia.org/wiki/EtherType#Values - 0x8137: ModuleDescriptor('pcapkit.protocols.internet.ipx', 'IPX'), + 0x8137: ModuleDescriptor('pcapkit.protocols.internet.ipx.protocol', 'IPX'), }, ) # type: DefaultDict[int | Enum_EtherType, ModuleDescriptor[ProtocolBase] | Type[ProtocolBase]] @@ -110,9 +110,9 @@ class Link(ProtocolBase[_PT, _ST], Generic[_PT, _ST]): # pylint: disable=abstra #: :func:`~pcapkit.foundation.registry.protocols.protocol.register_protocol_code` so a #: ``code=`` key is checked exactly as #: :func:`~pcapkit.foundation.registry.protocols.link.register_ethertype` checks - #: its own -- :class:`~pcapkit.protocols.link.ethernet.Ethernet`, which shares + #: its own -- :class:`~pcapkit.protocols.link.ethernet.protocol.Ethernet`, which shares #: this registry, is therefore checked as :class:`Link` is, while - #: :class:`~pcapkit.protocols.link.loopback.Loopback`, which keeps one of its + #: :class:`~pcapkit.protocols.link.loopback.protocol.Loopback`, which keeps one of its #: own, declares its own pairing or none at all (:issue:`2268`). __proto_key__: 'ClassVar[tuple[Type[EnumRegistry], bool]]' = (Enum_EtherType, False) diff --git a/pcapkit/protocols/link/linux_sll/__init__.py b/pcapkit/protocols/link/linux_sll/__init__.py new file mode 100644 index 0000000000..969ee5f24a --- /dev/null +++ b/pcapkit/protocols/link/linux_sll/__init__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +"""LINUX_SLL - Linux "Cooked" Capture Encapsulation Family +============================================================= + +.. module:: pcapkit.protocols.link.linux_sll + +:mod:`pcapkit.protocols.link.linux_sll` holds the dissector, +:class:`~pcapkit.protocols.link.linux_sll.protocol.LinuxSLL`, in +:mod:`~pcapkit.protocols.link.linux_sll.protocol`. + +""" +from pcapkit.protocols.link.linux_sll.protocol import LinuxSLL + +__all__ = ['LinuxSLL'] diff --git a/pcapkit/protocols/link/linux_sll.py b/pcapkit/protocols/link/linux_sll/protocol.py similarity index 87% rename from pcapkit/protocols/link/linux_sll.py rename to pcapkit/protocols/link/linux_sll/protocol.py index 6bd8d19ed5..4fde98bd66 100644 --- a/pcapkit/protocols/link/linux_sll.py +++ b/pcapkit/protocols/link/linux_sll/protocol.py @@ -2,15 +2,15 @@ """LINUX_SLL - Linux "Cooked" Capture Encapsulation Family ============================================================= -.. module:: pcapkit.protocols.link.linux_sll +.. module:: pcapkit.protocols.link.linux_sll.protocol -:mod:`pcapkit.protocols.link.linux_sll` contains -:class:`~pcapkit.protocols.link.linux_sll.LinuxSLL` only, the base class of -:class:`~pcapkit.protocols.link.linux_sll1.LinuxSLL1` and -:class:`~pcapkit.protocols.link.linux_sll2.LinuxSLL2`. Constructing the base +:mod:`pcapkit.protocols.link.linux_sll.protocol` contains +:class:`~pcapkit.protocols.link.linux_sll.protocol.LinuxSLL` only, the base class of +:class:`~pcapkit.protocols.link.linux_sll1.protocol.LinuxSLL1` and +:class:`~pcapkit.protocols.link.linux_sll2.protocol.LinuxSLL2`. Constructing the base gives the one its ``version`` keyword names, from octets or from fields, and is refused without it, since the link type rather than the header names the -version. Its :meth:`~pcapkit.protocols.link.linux_sll.LinuxSLL.from_data` gives +version. Its :meth:`~pcapkit.protocols.link.linux_sll.protocol.LinuxSLL.from_data` gives the one whose data model it is handed (:issue:`2574`). """ @@ -38,7 +38,7 @@ __all__ = ['LinuxSLL'] #: Resolves ``protocol_type`` exactly as -#: :class:`~pcapkit.protocols.schema.link.ethernet.Ethernet` resolves its ``type``. +#: :class:`~pcapkit.protocols.link.ethernet.schema.Ethernet` resolves its ``type``. _ETHERTYPE_FIELD = EnumField(length=2, namespace=Enum_EtherType) @@ -48,13 +48,13 @@ def _resolve_next_layer_proto(registry: 'DefaultDict[int, Any]', arphrd_type: 'i Args: registry: The ``arphrd_type`` registry, i.e. :attr:`LinuxSLL.__proto__ - `. + `. arphrd_type: ARP hardware type of the interface the packet was seen on. protocol_type: Protocol (internet layer), as parsed off the wire. Returns: ``protocol_type`` itself if ``arphrd_type`` is a key of ``registry``; - otherwise the value :class:`~pcapkit.protocols.link.ethernet.Ethernet` + otherwise the value :class:`~pcapkit.protocols.link.ethernet.protocol.Ethernet` stores for the same ``type``. """ @@ -104,7 +104,7 @@ class LinuxSLL(Link[_PT, _ST], Generic[_PT, _ST]): # pylint: disable=abstract-m This class supports parsing of the following protocols, which are registered in the :attr:`self.__proto__ - ` attribute, keyed by + ` attribute, keyed by ``arphrd_type``: .. list-table:: @@ -113,15 +113,15 @@ class LinuxSLL(Link[_PT, _ST], Generic[_PT, _ST]): # pylint: disable=abstract-m * - Index - Protocol * - :attr:`~pcapkit.const.linux.arphrd.ARPHRD.FRAD` - - :class:`pcapkit.protocols.link.frad.FRAD` + - :class:`pcapkit.protocols.link.frad.protocol.FRAD` * - :attr:`~pcapkit.const.linux.arphrd.ARPHRD.IPGRE` - - :class:`pcapkit.protocols.link.gre.GRE` + - :class:`pcapkit.protocols.link.gre.protocol.GRE` * - :attr:`~pcapkit.const.linux.arphrd.ARPHRD.IEEE80211_RADIOTAP` - - :class:`pcapkit.protocols.link.radiotap.Radiotap` + - :class:`pcapkit.protocols.link.radiotap.protocol.Radiotap` * - :attr:`~pcapkit.const.linux.arphrd.ARPHRD.IP6GRE` - - :class:`pcapkit.protocols.link.gre.GRE` + - :class:`pcapkit.protocols.link.gre.protocol.GRE` * - :attr:`~pcapkit.const.linux.arphrd.ARPHRD.NETLINK` - - :class:`pcapkit.protocols.link.netlink.Netlink` + - :class:`pcapkit.protocols.link.netlink.protocol.Netlink` Every other ``arphrd_type`` reads ``protocol_type`` as an EtherType and dispatches it through :attr:`Link.__proto__ @@ -144,13 +144,13 @@ class (:issue:`2574`). ``version`` names the member, from octets or from #: ``arphrd_type`` values whose ``protocol_type`` is not an EtherType, per #: tcpdump.org's LINUX_SLL and LINUX_SLL2 pages. __proto__ = collections.defaultdict( - lambda: ModuleDescriptor('pcapkit.protocols.misc.raw', 'Raw'), + lambda: ModuleDescriptor('pcapkit.protocols.misc.raw.protocol', 'Raw'), { - Enum_ARPHRD.FRAD: ModuleDescriptor('pcapkit.protocols.link.frad', 'FRAD'), - Enum_ARPHRD.IPGRE: ModuleDescriptor('pcapkit.protocols.link.gre', 'GRE'), - Enum_ARPHRD.IEEE80211_RADIOTAP: ModuleDescriptor('pcapkit.protocols.link.radiotap', 'Radiotap'), - Enum_ARPHRD.IP6GRE: ModuleDescriptor('pcapkit.protocols.link.gre', 'GRE'), - Enum_ARPHRD.NETLINK: ModuleDescriptor('pcapkit.protocols.link.netlink', 'Netlink'), + Enum_ARPHRD.FRAD: ModuleDescriptor('pcapkit.protocols.link.frad.protocol', 'FRAD'), + Enum_ARPHRD.IPGRE: ModuleDescriptor('pcapkit.protocols.link.gre.protocol', 'GRE'), + Enum_ARPHRD.IEEE80211_RADIOTAP: ModuleDescriptor('pcapkit.protocols.link.radiotap.protocol', 'Radiotap'), + Enum_ARPHRD.IP6GRE: ModuleDescriptor('pcapkit.protocols.link.gre.protocol', 'GRE'), + Enum_ARPHRD.NETLINK: ModuleDescriptor('pcapkit.protocols.link.netlink.protocol', 'Netlink'), }, ) # type: DefaultDict[int | Enum_ARPHRD, ModuleDescriptor[ProtocolBase] | Type[ProtocolBase]] @@ -236,10 +236,10 @@ def from_data(cls, data: '_PT | dict[str, Any]', **kwargs: 'Any') -> 'Self': if cls is not LinuxSLL: return super().from_data(data, **kwargs) - from pcapkit.protocols.data.link.linux_sll1 import LinuxSLL1 as Data_LinuxSLL1 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel - from pcapkit.protocols.data.link.linux_sll2 import LinuxSLL2 as Data_LinuxSLL2 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel - from pcapkit.protocols.link.linux_sll1 import LinuxSLL1 # isort: skip # pylint: disable=import-outside-toplevel - from pcapkit.protocols.link.linux_sll2 import LinuxSLL2 # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.link.linux_sll1.data import LinuxSLL1 as Data_LinuxSLL1 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel + from pcapkit.protocols.link.linux_sll2.data import LinuxSLL2 as Data_LinuxSLL2 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel + from pcapkit.protocols.link.linux_sll1.protocol import LinuxSLL1 # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.link.linux_sll2.protocol import LinuxSLL2 # isort: skip # pylint: disable=import-outside-toplevel if isinstance(data, Data_LinuxSLL1): return cast('Self', LinuxSLL1.from_data(data, **kwargs)) @@ -348,8 +348,8 @@ def _import_next_layer(self, proto: 'int', length: 'Optional[int]' = None, *, # for it, and otherwise the class :attr:`Link.__proto__ ` registers for ``proto`` as an EtherType. Where parsing stops at this layer, either path - keeps the payload :class:`~pcapkit.protocols.misc.raw.Raw`, and a - :class:`~pcapkit.protocols.misc.raw.Raw` records ``proto`` either way. + keeps the payload :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, and a + :class:`~pcapkit.protocols.misc.raw.protocol.Raw` records ``proto`` either way. Note: :attr:`self.__proto__ ` holds the @@ -357,7 +357,7 @@ def _import_next_layer(self, proto: 'int', length: 'Optional[int]' = None, *, # :attr:`Link.__proto__ ` itself rather than reaching it through ``super()``, as :meth:`FRAD._import_next_layer - ` does for a + ` does for a SNAP EtherType. """ @@ -369,10 +369,10 @@ def _import_next_layer(self, proto: 'int', length: 'Optional[int]' = None, *, # if TYPE_CHECKING: protocol: 'Type[ProtocolBase]' if not min(length, len(file_)): - from pcapkit.protocols.misc.no_payload import \ + from pcapkit.protocols.misc.no_payload.protocol import \ NoPayload as protocol # isort: skip # pylint: disable=import-outside-toplevel elif self._sigterm: - from pcapkit.protocols.misc.raw import \ + from pcapkit.protocols.misc.raw.protocol import \ Raw as protocol # isort: skip # pylint: disable=import-outside-toplevel elif arphrd_type in self.__proto__: protocol = self._lookup_next_layer(self.__proto__, arphrd_type) @@ -391,16 +391,16 @@ def _member_of_version(version: 'Any') -> 'Type[LinuxSLL]': version: Version of the header. Returns: - :class:`~pcapkit.protocols.link.linux_sll1.LinuxSLL1` or - :class:`~pcapkit.protocols.link.linux_sll2.LinuxSLL2`. + :class:`~pcapkit.protocols.link.linux_sll1.protocol.LinuxSLL1` or + :class:`~pcapkit.protocols.link.linux_sll2.protocol.LinuxSLL2`. Raises: ProtocolError: If ``version`` is neither, or is no :obj:`int`: a :obj:`bool` or a :obj:`float` is refused even where it equals one. """ - from pcapkit.protocols.link.linux_sll1 import LinuxSLL1 # isort: skip # pylint: disable=import-outside-toplevel - from pcapkit.protocols.link.linux_sll2 import LinuxSLL2 # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.link.linux_sll1.protocol import LinuxSLL1 # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.link.linux_sll2.protocol import LinuxSLL2 # isort: skip # pylint: disable=import-outside-toplevel if isinstance(version, int) and not isinstance(version, bool): if version == 1: diff --git a/pcapkit/protocols/link/linux_sll1/__init__.py b/pcapkit/protocols/link/linux_sll1/__init__.py new file mode 100644 index 0000000000..4bde740cca --- /dev/null +++ b/pcapkit/protocols/link/linux_sll1/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""Linux "Cooked" Capture Encapsulation +========================================== + +.. module:: pcapkit.protocols.link.linux_sll1 + +:mod:`pcapkit.protocols.link.linux_sll1` holds the dissector, +:class:`~pcapkit.protocols.link.linux_sll1.protocol.LinuxSLL1`, in +:mod:`~pcapkit.protocols.link.linux_sll1.protocol`, its header schema in +:mod:`~pcapkit.protocols.link.linux_sll1.schema` and its data model in +:mod:`~pcapkit.protocols.link.linux_sll1.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.link.linux_sll1.protocol import LinuxSLL1 + +# Header Schemas +from pcapkit.protocols.link.linux_sll1.schema import LinuxSLL1 as Schema_LinuxSLL1 + +# Data Models +from pcapkit.protocols.link.linux_sll1.data import LinuxSLL1 as Data_LinuxSLL1 + +__all__ = ['LinuxSLL1'] diff --git a/pcapkit/protocols/data/link/linux_sll1.py b/pcapkit/protocols/link/linux_sll1/data.py similarity index 92% rename from pcapkit/protocols/data/link/linux_sll1.py rename to pcapkit/protocols/link/linux_sll1/data.py index bdc32cb5fc..f8c4627ac3 100644 --- a/pcapkit/protocols/data/link/linux_sll1.py +++ b/pcapkit/protocols/link/linux_sll1/data.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Protocol if TYPE_CHECKING: from pcapkit.const.arp.hardware import Hardware @@ -18,7 +18,7 @@ class LinuxSLL1(Protocol): ``protocol_type`` is an :class:`~pcapkit.const.reg.ethertype.EtherType` for every :attr:`arphrd_type` except a few -- see - :class:`~pcapkit.protocols.link.linux_sll1.LinuxSLL1`; it is kept as its + :class:`~pcapkit.protocols.link.linux_sll1.protocol.LinuxSLL1`; it is kept as its raw wire value here regardless. """ diff --git a/pcapkit/protocols/link/linux_sll1.py b/pcapkit/protocols/link/linux_sll1/protocol.py similarity index 91% rename from pcapkit/protocols/link/linux_sll1.py rename to pcapkit/protocols/link/linux_sll1/protocol.py index e247a07112..17ee8c811c 100644 --- a/pcapkit/protocols/link/linux_sll1.py +++ b/pcapkit/protocols/link/linux_sll1/protocol.py @@ -3,10 +3,10 @@ """Linux "Cooked" Capture Encapsulation ========================================== -.. module:: pcapkit.protocols.link.linux_sll1 +.. module:: pcapkit.protocols.link.linux_sll1.protocol -:mod:`pcapkit.protocols.link.linux_sll1` contains -:class:`~pcapkit.protocols.link.linux_sll1.LinuxSLL1` only: the Linux "cooked" +:mod:`pcapkit.protocols.link.linux_sll1.protocol` contains +:class:`~pcapkit.protocols.link.linux_sll1.protocol.LinuxSLL1` only: the Linux "cooked" capture encapsulation [*]_ of ``LINKTYPE_LINUX_SLL``, the header of every ``tcpdump -i any`` capture on Linux. Its structure: @@ -34,10 +34,10 @@ from pcapkit.const.arp.hardware import Hardware as Enum_Hardware from pcapkit.const.reg.ethertype import EtherType as Enum_EtherType from pcapkit.const.reg.linktype import LinkType as Enum_LinkType -from pcapkit.protocols.data.link.linux_sll1 import LinuxSLL1 as Data_LinuxSLL1 -from pcapkit.protocols.link.linux_sll import (LinuxSLL, _resolve_next_layer_proto, - _validate_link_addr) -from pcapkit.protocols.schema.link.linux_sll1 import LinuxSLL1 as Schema_LinuxSLL1 +from pcapkit.protocols.link.linux_sll1.data import LinuxSLL1 as Data_LinuxSLL1 +from pcapkit.protocols.link.linux_sll1.schema import LinuxSLL1 as Schema_LinuxSLL1 +from pcapkit.protocols.link.linux_sll.protocol import (LinuxSLL, _resolve_next_layer_proto, + _validate_link_addr) if TYPE_CHECKING: from typing import Any, Optional @@ -45,7 +45,7 @@ from typing_extensions import Literal from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema __all__ = ['LinuxSLL1'] @@ -56,9 +56,9 @@ class LinuxSLL1(LinuxSLL[Data_LinuxSLL1, Schema_LinuxSLL1], ``protocol_type`` is dispatched as an EtherType, unless ``arphrd_type`` is a key of :attr:`LinuxSLL.__proto__ - `, which dispatches + `, which dispatches it instead; with no dissector registered either way, the payload is - :class:`~pcapkit.protocols.misc.raw.Raw`. + :class:`~pcapkit.protocols.misc.raw.protocol.Raw`. """ @@ -77,7 +77,7 @@ def alias(self) -> 'Literal["LINUX_SLL1"]': return 'LINUX_SLL1' #: NOTE: ``linux_sll``, not the default ``linuxsll``; see - #: :class:`~pcapkit.protocols.link.linux_sll2.LinuxSLL2`. + #: :class:`~pcapkit.protocols.link.linux_sll2.protocol.LinuxSLL2`. @property def info_name(self) -> 'Literal["linux_sll"]': """Key name of the :attr:`~pcapkit.protocols.protocol.Protocol.info` dict.""" @@ -170,7 +170,7 @@ def make(self, default ``len(link_addr)``; may exceed 8, up to ``0xFFFF``. protocol_type: Protocol (internet layer); an EtherType unless ``arphrd_type`` is a key of :attr:`LinuxSLL.__proto__ - `. + `. payload: Payload data. **kwargs: Arbitrary keyword arguments. diff --git a/pcapkit/protocols/schema/link/linux_sll1.py b/pcapkit/protocols/link/linux_sll1/schema.py similarity index 93% rename from pcapkit/protocols/schema/link/linux_sll1.py rename to pcapkit/protocols/link/linux_sll1/schema.py index 10ce9dcd9d..a560a5afd7 100644 --- a/pcapkit/protocols/schema/link/linux_sll1.py +++ b/pcapkit/protocols/link/linux_sll1/schema.py @@ -8,7 +8,7 @@ from pcapkit.corekit.fields.misc import PayloadField from pcapkit.corekit.fields.numbers import EnumField, UInt16Field from pcapkit.corekit.fields.strings import BytesField -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final __all__ = ['LinuxSLL1'] @@ -22,7 +22,7 @@ class LinuxSLL1(Schema): ``protocol_type`` is kept as its raw 2 octets here; whether it is an :class:`~pcapkit.const.reg.ethertype.EtherType` depends on ``arphrd_type``, - see :class:`~pcapkit.protocols.link.linux_sll1.LinuxSLL1`. + see :class:`~pcapkit.protocols.link.linux_sll1.protocol.LinuxSLL1`. """ diff --git a/pcapkit/protocols/link/linux_sll2/__init__.py b/pcapkit/protocols/link/linux_sll2/__init__.py new file mode 100644 index 0000000000..d53826d04f --- /dev/null +++ b/pcapkit/protocols/link/linux_sll2/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""Linux "Cooked" Capture Encapsulation v2 +============================================= + +.. module:: pcapkit.protocols.link.linux_sll2 + +:mod:`pcapkit.protocols.link.linux_sll2` holds the dissector, +:class:`~pcapkit.protocols.link.linux_sll2.protocol.LinuxSLL2`, in +:mod:`~pcapkit.protocols.link.linux_sll2.protocol`, its header schema in +:mod:`~pcapkit.protocols.link.linux_sll2.schema` and its data model in +:mod:`~pcapkit.protocols.link.linux_sll2.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.link.linux_sll2.protocol import LinuxSLL2 + +# Header Schemas +from pcapkit.protocols.link.linux_sll2.schema import LinuxSLL2 as Schema_LinuxSLL2 + +# Data Models +from pcapkit.protocols.link.linux_sll2.data import LinuxSLL2 as Data_LinuxSLL2 + +__all__ = ['LinuxSLL2'] diff --git a/pcapkit/protocols/data/link/linux_sll2.py b/pcapkit/protocols/link/linux_sll2/data.py similarity index 93% rename from pcapkit/protocols/data/link/linux_sll2.py rename to pcapkit/protocols/link/linux_sll2/data.py index 0f5e175b60..d030b19e70 100644 --- a/pcapkit/protocols/data/link/linux_sll2.py +++ b/pcapkit/protocols/link/linux_sll2/data.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Protocol if TYPE_CHECKING: from pcapkit.const.arp.hardware import Hardware @@ -18,7 +18,7 @@ class LinuxSLL2(Protocol): ``protocol_type`` is an :class:`~pcapkit.const.reg.ethertype.EtherType` for every :attr:`arphrd_type` except a few -- see - :class:`~pcapkit.protocols.link.linux_sll2.LinuxSLL2`; it is kept as its + :class:`~pcapkit.protocols.link.linux_sll2.protocol.LinuxSLL2`; it is kept as its raw wire value here regardless. """ diff --git a/pcapkit/protocols/link/linux_sll2.py b/pcapkit/protocols/link/linux_sll2/protocol.py similarity index 92% rename from pcapkit/protocols/link/linux_sll2.py rename to pcapkit/protocols/link/linux_sll2/protocol.py index bc0a9a9034..dedfbf8d0e 100644 --- a/pcapkit/protocols/link/linux_sll2.py +++ b/pcapkit/protocols/link/linux_sll2/protocol.py @@ -3,10 +3,10 @@ """Linux "Cooked" Capture Encapsulation v2 ============================================= -.. module:: pcapkit.protocols.link.linux_sll2 +.. module:: pcapkit.protocols.link.linux_sll2.protocol -:mod:`pcapkit.protocols.link.linux_sll2` contains -:class:`~pcapkit.protocols.link.linux_sll2.LinuxSLL2` only: the Linux "cooked" +:mod:`pcapkit.protocols.link.linux_sll2.protocol` contains +:class:`~pcapkit.protocols.link.linux_sll2.protocol.LinuxSLL2` only: the Linux "cooked" capture encapsulation v2 [*]_ of ``LINKTYPE_LINUX_SLL2``. Its structure: .. table:: @@ -37,10 +37,10 @@ from pcapkit.const.arp.hardware import Hardware as Enum_Hardware from pcapkit.const.reg.ethertype import EtherType as Enum_EtherType from pcapkit.const.reg.linktype import LinkType as Enum_LinkType -from pcapkit.protocols.data.link.linux_sll2 import LinuxSLL2 as Data_LinuxSLL2 -from pcapkit.protocols.link.linux_sll import (LinuxSLL, _resolve_next_layer_proto, - _validate_link_addr) -from pcapkit.protocols.schema.link.linux_sll2 import LinuxSLL2 as Schema_LinuxSLL2 +from pcapkit.protocols.link.linux_sll2.data import LinuxSLL2 as Data_LinuxSLL2 +from pcapkit.protocols.link.linux_sll2.schema import LinuxSLL2 as Schema_LinuxSLL2 +from pcapkit.protocols.link.linux_sll.protocol import (LinuxSLL, _resolve_next_layer_proto, + _validate_link_addr) if TYPE_CHECKING: from typing import Any, Optional @@ -48,7 +48,7 @@ from typing_extensions import Literal from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema __all__ = ['LinuxSLL2'] @@ -57,7 +57,7 @@ class LinuxSLL2(LinuxSLL[Data_LinuxSLL2, Schema_LinuxSLL2], schema=Schema_LinuxSLL2, data=Data_LinuxSLL2): """Linux "cooked" capture encapsulation v2 (``LINUX_SLL2``). - Next-layer dispatch is that of :class:`~pcapkit.protocols.link.linux_sll1.LinuxSLL1`. + Next-layer dispatch is that of :class:`~pcapkit.protocols.link.linux_sll1.protocol.LinuxSLL1`. """ @@ -76,7 +76,7 @@ def alias(self) -> 'Literal["LINUX_SLL2"]': return 'LINUX_SLL2' #: NOTE: see :attr:`LinuxSLL1.info_name - #: `. + #: `. @property def info_name(self) -> 'Literal["linux_sll2"]': """Key name of the :attr:`~pcapkit.protocols.protocol.Protocol.info` dict.""" @@ -166,7 +166,7 @@ def make(self, Args: protocol_type: Protocol (internet layer); an EtherType unless ``arphrd_type`` is a key of :attr:`LinuxSLL.__proto__ - `. + `. reserved: Reserved, must be zero. interface_index: Index, in the capturing host's own numbering, of the interface the packet was seen on. diff --git a/pcapkit/protocols/schema/link/linux_sll2.py b/pcapkit/protocols/link/linux_sll2/schema.py similarity index 94% rename from pcapkit/protocols/schema/link/linux_sll2.py rename to pcapkit/protocols/link/linux_sll2/schema.py index 45c094ea55..33ba79486d 100644 --- a/pcapkit/protocols/schema/link/linux_sll2.py +++ b/pcapkit/protocols/link/linux_sll2/schema.py @@ -8,7 +8,7 @@ from pcapkit.corekit.fields.misc import PayloadField from pcapkit.corekit.fields.numbers import EnumField, UInt8Field, UInt16Field, UInt32Field from pcapkit.corekit.fields.strings import BytesField -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final __all__ = ['LinuxSLL2'] @@ -23,7 +23,7 @@ class LinuxSLL2(Schema): The field order and widths differ from v1 -- ``protocol_type`` moves to the front, ``interface_index`` is new, and ``packet_type`` / ``link_addr_length`` shrink from 2 octets to 1 -- see - :class:`~pcapkit.protocols.schema.link.linux_sll1.LinuxSLL1` for v1. + :class:`~pcapkit.protocols.link.linux_sll1.schema.LinuxSLL1` for v1. """ diff --git a/pcapkit/protocols/link/loopback/__init__.py b/pcapkit/protocols/link/loopback/__init__.py new file mode 100644 index 0000000000..d493ef1987 --- /dev/null +++ b/pcapkit/protocols/link/loopback/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""BSD Loopback Encapsulation +================================ + +.. module:: pcapkit.protocols.link.loopback + +:mod:`pcapkit.protocols.link.loopback` holds the dissector, +:class:`~pcapkit.protocols.link.loopback.protocol.Loopback`, in +:mod:`~pcapkit.protocols.link.loopback.protocol`, its header schema in +:mod:`~pcapkit.protocols.link.loopback.schema` and its data model in +:mod:`~pcapkit.protocols.link.loopback.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.link.loopback.protocol import Loopback + +# Header Schemas +from pcapkit.protocols.link.loopback.schema import Loopback as Schema_Loopback + +# Data Models +from pcapkit.protocols.link.loopback.data import Loopback as Data_Loopback + +__all__ = ['Loopback'] diff --git a/pcapkit/protocols/data/link/loopback.py b/pcapkit/protocols/link/loopback/data.py similarity index 92% rename from pcapkit/protocols/data/link/loopback.py rename to pcapkit/protocols/link/loopback/data.py index 1728c7b3dd..3dc64f338a 100644 --- a/pcapkit/protocols/data/link/loopback.py +++ b/pcapkit/protocols/link/loopback/data.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Protocol if TYPE_CHECKING: from typing_extensions import Literal diff --git a/pcapkit/protocols/link/loopback.py b/pcapkit/protocols/link/loopback/protocol.py similarity index 92% rename from pcapkit/protocols/link/loopback.py rename to pcapkit/protocols/link/loopback/protocol.py index 7b940cddc8..936748e6f1 100644 --- a/pcapkit/protocols/link/loopback.py +++ b/pcapkit/protocols/link/loopback/protocol.py @@ -3,10 +3,10 @@ """BSD Loopback Encapsulation ================================ -.. module:: pcapkit.protocols.link.loopback +.. module:: pcapkit.protocols.link.loopback.protocol -:mod:`pcapkit.protocols.link.loopback` contains -:class:`~pcapkit.protocols.link.loopback.Loopback` +:mod:`pcapkit.protocols.link.loopback.protocol` contains +:class:`~pcapkit.protocols.link.loopback.protocol.Loopback` only, which implements the extractor for the BSD loopback encapsulation [*]_ of ``LINKTYPE_NULL`` and ``LINKTYPE_LOOP``, whose structure is described as below: @@ -28,9 +28,9 @@ from pcapkit.const.reg.linktype import LinkType as Enum_LinkType from pcapkit.corekit.module import ModuleDescriptor -from pcapkit.protocols.data.link.loopback import Loopback as Data_Loopback from pcapkit.protocols.link.link import Link -from pcapkit.protocols.schema.link.loopback import Loopback as Schema_Loopback +from pcapkit.protocols.link.loopback.data import Loopback as Data_Loopback +from pcapkit.protocols.link.loopback.schema import Loopback as Schema_Loopback from pcapkit.utilities.exceptions import ProtocolError from pcapkit.utilities.warnings import RegistryWarning, warn @@ -40,7 +40,7 @@ from typing_extensions import Literal from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema __all__ = ['Loopback', 'family_byteorder'] @@ -93,7 +93,7 @@ class Loopback(Link[Data_Loopback, Schema_Loopback], The address families are those of the BSD socket API, whose ``AF_INET6`` differs between the BSDs, so each of its values is read as IPv6. This class supports parsing of the following protocols, which are registered in the - :attr:`self.__proto__ ` + :attr:`self.__proto__ ` attribute: .. list-table:: @@ -102,15 +102,15 @@ class Loopback(Link[Data_Loopback, Schema_Loopback], * - Index - Protocol * - 2 - - :class:`pcapkit.protocols.internet.ipv4.IPv4` + - :class:`pcapkit.protocols.internet.ipv4.protocol.IPv4` * - 24 - - :class:`pcapkit.protocols.internet.ipv6.IPv6` + - :class:`pcapkit.protocols.internet.ipv6.protocol.IPv6` * - 28 - - :class:`pcapkit.protocols.internet.ipv6.IPv6` + - :class:`pcapkit.protocols.internet.ipv6.protocol.IPv6` * - 30 - - :class:`pcapkit.protocols.internet.ipv6.IPv6` + - :class:`pcapkit.protocols.internet.ipv6.protocol.IPv6` - Any other family is kept as :class:`~pcapkit.protocols.misc.raw.Raw`. + Any other family is kept as :class:`~pcapkit.protocols.misc.raw.protocol.Raw`. """ @@ -128,12 +128,12 @@ class Loopback(Link[Data_Loopback, Schema_Loopback], #: `; an entry is registered with #: :func:`~pcapkit.foundation.registry.protocols.link.register_loopback`. __proto__ = collections.defaultdict( - lambda: ModuleDescriptor('pcapkit.protocols.misc.raw', 'Raw'), + lambda: ModuleDescriptor('pcapkit.protocols.misc.raw.protocol', 'Raw'), { - 2: ModuleDescriptor('pcapkit.protocols.internet.ipv4', 'IPv4'), - 24: ModuleDescriptor('pcapkit.protocols.internet.ipv6', 'IPv6'), - 28: ModuleDescriptor('pcapkit.protocols.internet.ipv6', 'IPv6'), - 30: ModuleDescriptor('pcapkit.protocols.internet.ipv6', 'IPv6'), + 2: ModuleDescriptor('pcapkit.protocols.internet.ipv4.protocol', 'IPv4'), + 24: ModuleDescriptor('pcapkit.protocols.internet.ipv6.protocol', 'IPv6'), + 28: ModuleDescriptor('pcapkit.protocols.internet.ipv6.protocol', 'IPv6'), + 30: ModuleDescriptor('pcapkit.protocols.internet.ipv6.protocol', 'IPv6'), }, ) # type: DefaultDict[int, ModuleDescriptor[ProtocolBase] | Type[ProtocolBase]] @@ -178,8 +178,8 @@ def read(self, length: 'Optional[int]' = None, *, alias: 'Optional[int]' = None, Args: length: Length of packet data. alias: Link type the frame was dispatched under, as - :class:`~pcapkit.protocols.misc.pcap.frame.Frame` and - :class:`~pcapkit.protocols.misc.pcapng.PCAPNG` pass it; + :class:`~pcapkit.protocols.misc.pcap.frame.protocol.Frame` and + :class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG` pass it; ``LINKTYPE_LOOP`` reads the family in network byte order, and anything else as ``LINKTYPE_NULL``. byteorder: Byte order to read the family in, ahead of ``alias``. diff --git a/pcapkit/protocols/schema/link/loopback.py b/pcapkit/protocols/link/loopback/schema.py similarity index 87% rename from pcapkit/protocols/schema/link/loopback.py rename to pcapkit/protocols/link/loopback/schema.py index 312be62314..ac38c15eb7 100644 --- a/pcapkit/protocols/schema/link/loopback.py +++ b/pcapkit/protocols/link/loopback/schema.py @@ -6,7 +6,7 @@ from pcapkit.corekit.fields.misc import PayloadField from pcapkit.corekit.fields.strings import BytesField -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final __all__ = ['Loopback'] @@ -20,7 +20,7 @@ class Loopback(Schema): The address family is kept as its 4 octets, since their byte order depends on the link type the frame was captured under; see - :func:`~pcapkit.protocols.link.loopback.family_byteorder`. + :func:`~pcapkit.protocols.link.loopback.protocol.family_byteorder`. """ diff --git a/pcapkit/protocols/link/netlink/__init__.py b/pcapkit/protocols/link/netlink/__init__.py new file mode 100644 index 0000000000..fd84785865 --- /dev/null +++ b/pcapkit/protocols/link/netlink/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""Netlink - Linux Netlink Socket Framing +============================================ + +.. module:: pcapkit.protocols.link.netlink + +:mod:`pcapkit.protocols.link.netlink` holds the dissector, +:class:`~pcapkit.protocols.link.netlink.protocol.Netlink`, in +:mod:`~pcapkit.protocols.link.netlink.protocol`, its header schema in +:mod:`~pcapkit.protocols.link.netlink.schema` and its data model in +:mod:`~pcapkit.protocols.link.netlink.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.link.netlink.protocol import Netlink + +# Header Schemas +from pcapkit.protocols.link.netlink.schema import Netlink as Schema_Netlink + +# Data Models +from pcapkit.protocols.link.netlink.data import Netlink as Data_Netlink + +__all__ = ['Netlink'] diff --git a/pcapkit/protocols/data/link/netlink.py b/pcapkit/protocols/link/netlink/data.py similarity index 96% rename from pcapkit/protocols/data/link/netlink.py rename to pcapkit/protocols/link/netlink/data.py index aa9d1db13c..a3355f24d6 100644 --- a/pcapkit/protocols/data/link/netlink.py +++ b/pcapkit/protocols/link/netlink/data.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Protocol if TYPE_CHECKING: from typing_extensions import Literal diff --git a/pcapkit/protocols/link/netlink.py b/pcapkit/protocols/link/netlink/protocol.py similarity index 92% rename from pcapkit/protocols/link/netlink.py rename to pcapkit/protocols/link/netlink/protocol.py index 2fac89db93..11067867f7 100644 --- a/pcapkit/protocols/link/netlink.py +++ b/pcapkit/protocols/link/netlink/protocol.py @@ -2,21 +2,21 @@ """Netlink - Linux Netlink Socket Framing ============================================ -.. module:: pcapkit.protocols.link.netlink +.. module:: pcapkit.protocols.link.netlink.protocol -:mod:`pcapkit.protocols.link.netlink` contains -:class:`~pcapkit.protocols.link.netlink.Netlink` only, which implements the +:mod:`pcapkit.protocols.link.netlink.protocol` contains +:class:`~pcapkit.protocols.link.netlink.protocol.Netlink` only, which implements the extractor for the ``struct nlmsghdr`` framing [*]_ of Linux's own kernel/user IPC transport, as seen on a ``LINKTYPE_LINUX_SLL``/``LINKTYPE_LINUX_SLL2`` capture whose ``arphrd_type`` is ``ARPHRD_NETLINK`` (an ``nlmon`` interface) --- :class:`~pcapkit.protocols.link.linux_sll.LinuxSLL` dispatches here -instead of falling back to :class:`~pcapkit.protocols.misc.raw.Raw` for that -one case; see :attr:`LinuxSLL.__proto__ `. +-- :class:`~pcapkit.protocols.link.linux_sll.protocol.LinuxSLL` dispatches here +instead of falling back to :class:`~pcapkit.protocols.misc.raw.protocol.Raw` for that +one case; see :attr:`LinuxSLL.__proto__ `. Netlink is the kernel's own IPC mechanism (routing table dumps, interface notifications and the like), not a "next protocol over this link" the way every other ``arphrd_type`` exception is -- its next-layer registry ships empty, so every message's payload is kept as -:class:`~pcapkit.protocols.misc.raw.Raw` unless its ``nlmsg_type`` is registered. +:class:`~pcapkit.protocols.misc.raw.protocol.Raw` unless its ``nlmsg_type`` is registered. .. table:: @@ -43,7 +43,7 @@ (``NETLINK_ROUTE``, ``NETLINK_GENERIC``, ...) and is a large surface of its own -- routing table entries, link attributes (``rtattr``/``nlattr`` TLV chains), and so on. The payload is kept as - :class:`~pcapkit.protocols.misc.raw.Raw` unless its ``nlmsg_type`` is registered. + :class:`~pcapkit.protocols.misc.raw.protocol.Raw` unless its ``nlmsg_type`` is registered. * **Multiple messages packed into one read.** The kernel's own netlink(7) page documents that a single read from a netlink socket, and so a single captured frame, commonly carries more than one ``nlmsghdr`` message back to @@ -52,7 +52,7 @@ is :manpage:`netlink(7)`'s). This class dissects only the *first* message's header; everything after it -- that message's own payload, and any sibling messages the frame may carry -- is kept together as the undissected - :class:`~pcapkit.protocols.misc.raw.Raw` payload, exactly as if it were one + :class:`~pcapkit.protocols.misc.raw.protocol.Raw` payload, exactly as if it were one larger opaque blob. Splitting the frame on every ``nlmsg_len`` boundary is future work, tracked on :issue:`2460`. @@ -69,7 +69,7 @@ guess."*): decode ``nlmsg_len`` both ways and keep whichever reading comes closer to the number of octets actually available, since a genuine message length is normally well under the size either misreading would imply. See -:func:`~pcapkit.protocols.link.loopback.family_byteorder` for the same +:func:`~pcapkit.protocols.link.loopback.protocol.family_byteorder` for the same problem solved the same way for ``LINKTYPE_NULL``. .. [*] :manpage:`netlink(7)`; :rfc:`3549#section-2.3.2` @@ -85,9 +85,9 @@ from pcapkit.const.linux.arphrd import ARPHRD as Enum_ARPHRD from pcapkit.corekit.module import ModuleDescriptor -from pcapkit.protocols.data.link.netlink import Netlink as Data_Netlink from pcapkit.protocols.link.link import Link -from pcapkit.protocols.schema.link.netlink import Netlink as Schema_Netlink +from pcapkit.protocols.link.netlink.data import Netlink as Data_Netlink +from pcapkit.protocols.link.netlink.schema import Netlink as Schema_Netlink from pcapkit.utilities.exceptions import ProtocolError from pcapkit.utilities.warnings import RegistryWarning, warn @@ -97,7 +97,7 @@ from typing_extensions import Literal from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema __all__ = ['Netlink', 'nlmsg_byteorder'] @@ -138,9 +138,9 @@ class Netlink(Link[Data_Netlink, Schema_Netlink], """This class implements Linux Netlink socket framing. Every message's payload is kept as - :class:`~pcapkit.protocols.misc.raw.Raw` unless its ``nlmsg_type`` is + :class:`~pcapkit.protocols.misc.raw.protocol.Raw` unless its ``nlmsg_type`` is registered -- see the module docstring's *Scope* section for why. - :attr:`self.__proto__ ` + :attr:`self.__proto__ ` ships empty, so that :meth:`register` works the same way every other :class:`~pcapkit.protocols.link.link.Link` subclass's does. @@ -153,9 +153,9 @@ class Netlink(Link[Data_Netlink, Schema_Netlink], #: Protocol index mapping for decoding next layer, keyed by ``nlmsg_type``. #: Deliberately empty -- see the class docstring -- so every unregistered #: key resolves through the :class:`~collections.defaultdict` fallback to - #: :class:`~pcapkit.protocols.misc.raw.Raw`. + #: :class:`~pcapkit.protocols.misc.raw.protocol.Raw`. __proto__ = collections.defaultdict( - lambda: ModuleDescriptor('pcapkit.protocols.misc.raw', 'Raw'), + lambda: ModuleDescriptor('pcapkit.protocols.misc.raw.protocol', 'Raw'), ) # type: DefaultDict[int, ModuleDescriptor[ProtocolBase] | Type[ProtocolBase]] ########################################################################## @@ -364,7 +364,7 @@ def __index__(cls) -> 'Enum_ARPHRD': # pylint: disable=invalid-index-returned Returns: Numeral registry index of the protocol in Linux ARP hardware types, the ``arphrd_type`` that - :attr:`LinuxSLL.__proto__ ` + :attr:`LinuxSLL.__proto__ ` dispatches here. """ diff --git a/pcapkit/protocols/schema/link/netlink.py b/pcapkit/protocols/link/netlink/schema.py similarity index 92% rename from pcapkit/protocols/schema/link/netlink.py rename to pcapkit/protocols/link/netlink/schema.py index 909beefdff..22ed7a2c6d 100644 --- a/pcapkit/protocols/schema/link/netlink.py +++ b/pcapkit/protocols/link/netlink/schema.py @@ -4,7 +4,7 @@ Every field of ``nlmsghdr`` is kept as raw octets rather than unpacked by a fixed byte order -- the byte order itself is ambiguous (see -:func:`~pcapkit.protocols.link.netlink.nlmsg_byteorder`) and has to be +:func:`~pcapkit.protocols.link.netlink.protocol.nlmsg_byteorder`) and has to be resolved before any of the fields can be read as integers. """ @@ -13,7 +13,7 @@ from pcapkit.corekit.fields.misc import PayloadField from pcapkit.corekit.fields.strings import BytesField -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final __all__ = ['Netlink'] diff --git a/pcapkit/protocols/link/radiotap/__init__.py b/pcapkit/protocols/link/radiotap/__init__.py new file mode 100644 index 0000000000..3c7fba3b2a --- /dev/null +++ b/pcapkit/protocols/link/radiotap/__init__.py @@ -0,0 +1,103 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""Radiotap - IEEE 802.11 Radiotap Header +============================================ + +.. module:: pcapkit.protocols.link.radiotap + +:mod:`pcapkit.protocols.link.radiotap` holds the dissector, +:class:`~pcapkit.protocols.link.radiotap.protocol.Radiotap`, in +:mod:`~pcapkit.protocols.link.radiotap.protocol`, its header schema in +:mod:`~pcapkit.protocols.link.radiotap.schema` and its data model in +:mod:`~pcapkit.protocols.link.radiotap.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.link.radiotap.protocol import Radiotap + +# Header Schemas +from pcapkit.protocols.link.radiotap.schema import EHT as Schema_EHT +from pcapkit.protocols.link.radiotap.schema import FHSS as Schema_FHSS +from pcapkit.protocols.link.radiotap.schema import HE as Schema_HE +from pcapkit.protocols.link.radiotap.schema import HEMU as Schema_HEMU +from pcapkit.protocols.link.radiotap.schema import LSIG as Schema_LSIG +from pcapkit.protocols.link.radiotap.schema import MCS as Schema_MCS +from pcapkit.protocols.link.radiotap.schema import S1G as Schema_S1G +from pcapkit.protocols.link.radiotap.schema import TLV as Schema_TLV +from pcapkit.protocols.link.radiotap.schema import TSFT as Schema_TSFT +from pcapkit.protocols.link.radiotap.schema import USIG as Schema_USIG +from pcapkit.protocols.link.radiotap.schema import VHT as Schema_VHT +from pcapkit.protocols.link.radiotap.schema import AMPDUStatus as Schema_AMPDUStatus +from pcapkit.protocols.link.radiotap.schema import Antenna as Schema_Antenna +from pcapkit.protocols.link.radiotap.schema import AntennaNoise as Schema_AntennaNoise +from pcapkit.protocols.link.radiotap.schema import AntennaSignal as Schema_AntennaSignal +from pcapkit.protocols.link.radiotap.schema import Channel as Schema_Channel +from pcapkit.protocols.link.radiotap.schema import DataRetries as Schema_DataRetries +from pcapkit.protocols.link.radiotap.schema import DBAntennaNoise as Schema_DBAntennaNoise +from pcapkit.protocols.link.radiotap.schema import DBAntennaSignal as Schema_DBAntennaSignal +from pcapkit.protocols.link.radiotap.schema import DBmTXPower as Schema_DBmTXPower +from pcapkit.protocols.link.radiotap.schema import DBTXAttenuation as Schema_DBTXAttenuation +from pcapkit.protocols.link.radiotap.schema import Flags as Schema_Flags +from pcapkit.protocols.link.radiotap.schema import HEMUOtherUser as Schema_HEMUOtherUser +from pcapkit.protocols.link.radiotap.schema import LockQuality as Schema_LockQuality +from pcapkit.protocols.link.radiotap.schema import Radiotap as Schema_Radiotap +from pcapkit.protocols.link.radiotap.schema import RadiotapField as Schema_RadiotapField +from pcapkit.protocols.link.radiotap.schema import Rate as Schema_Rate +from pcapkit.protocols.link.radiotap.schema import RTSRetries as Schema_RTSRetries +from pcapkit.protocols.link.radiotap.schema import RXFlags as Schema_RXFlags +from pcapkit.protocols.link.radiotap.schema import Timestamp as Schema_Timestamp +from pcapkit.protocols.link.radiotap.schema import TXAttenuation as Schema_TXAttenuation +from pcapkit.protocols.link.radiotap.schema import TXFlags as Schema_TXFlags +from pcapkit.protocols.link.radiotap.schema import Unknown as Schema_Unknown +from pcapkit.protocols.link.radiotap.schema import VendorNamespace as Schema_VendorNamespace +from pcapkit.protocols.link.radiotap.schema import VendorTLV as Schema_VendorTLV +from pcapkit.protocols.link.radiotap.schema import ZeroLengthPSDU as Schema_ZeroLengthPSDU + +# Data Models +from pcapkit.protocols.link.radiotap.data import EHT as Data_EHT +from pcapkit.protocols.link.radiotap.data import FHSS as Data_FHSS +from pcapkit.protocols.link.radiotap.data import HE as Data_HE +from pcapkit.protocols.link.radiotap.data import HEMU as Data_HEMU +from pcapkit.protocols.link.radiotap.data import LSIG as Data_LSIG +from pcapkit.protocols.link.radiotap.data import MCS as Data_MCS +from pcapkit.protocols.link.radiotap.data import S1G as Data_S1G +from pcapkit.protocols.link.radiotap.data import TLV as Data_TLV +from pcapkit.protocols.link.radiotap.data import TSFT as Data_TSFT +from pcapkit.protocols.link.radiotap.data import USIG as Data_USIG +from pcapkit.protocols.link.radiotap.data import VHT as Data_VHT +from pcapkit.protocols.link.radiotap.data import AMPDUStatus as Data_AMPDUStatus +from pcapkit.protocols.link.radiotap.data import Antenna as Data_Antenna +from pcapkit.protocols.link.radiotap.data import AntennaNoise as Data_AntennaNoise +from pcapkit.protocols.link.radiotap.data import AntennaSignal as Data_AntennaSignal +from pcapkit.protocols.link.radiotap.data import Channel as Data_Channel +from pcapkit.protocols.link.radiotap.data import DataRetries as Data_DataRetries +from pcapkit.protocols.link.radiotap.data import DBAntennaNoise as Data_DBAntennaNoise +from pcapkit.protocols.link.radiotap.data import DBAntennaSignal as Data_DBAntennaSignal +from pcapkit.protocols.link.radiotap.data import DBmTXPower as Data_DBmTXPower +from pcapkit.protocols.link.radiotap.data import DBTXAttenuation as Data_DBTXAttenuation +from pcapkit.protocols.link.radiotap.data import Flags as Data_Flags +from pcapkit.protocols.link.radiotap.data import HEData1 as Data_HEData1 +from pcapkit.protocols.link.radiotap.data import HEData2 as Data_HEData2 +from pcapkit.protocols.link.radiotap.data import HEMUFlags1 as Data_HEMUFlags1 +from pcapkit.protocols.link.radiotap.data import HEMUFlags2 as Data_HEMUFlags2 +from pcapkit.protocols.link.radiotap.data import HEMUOtherUser as Data_HEMUOtherUser +from pcapkit.protocols.link.radiotap.data import LockQuality as Data_LockQuality +from pcapkit.protocols.link.radiotap.data import MCSFlags as Data_MCSFlags +from pcapkit.protocols.link.radiotap.data import Radiotap as Data_Radiotap +from pcapkit.protocols.link.radiotap.data import RadiotapField as Data_RadiotapField +from pcapkit.protocols.link.radiotap.data import RadiotapNamespace as Data_RadiotapNamespace +from pcapkit.protocols.link.radiotap.data import Rate as Data_Rate +from pcapkit.protocols.link.radiotap.data import RTSRetries as Data_RTSRetries +from pcapkit.protocols.link.radiotap.data import RXFlags as Data_RXFlags +from pcapkit.protocols.link.radiotap.data import Timestamp as Data_Timestamp +from pcapkit.protocols.link.radiotap.data import TLVFields as Data_TLVFields +from pcapkit.protocols.link.radiotap.data import TXAttenuation as Data_TXAttenuation +from pcapkit.protocols.link.radiotap.data import TXFlags as Data_TXFlags +from pcapkit.protocols.link.radiotap.data import Unknown as Data_Unknown +from pcapkit.protocols.link.radiotap.data import USIGCommon as Data_USIGCommon +from pcapkit.protocols.link.radiotap.data import VendorNamespace as Data_VendorNamespace +from pcapkit.protocols.link.radiotap.data import VendorTLV as Data_VendorTLV +from pcapkit.protocols.link.radiotap.data import ZeroLengthPSDU as Data_ZeroLengthPSDU + +__all__ = ['Radiotap'] diff --git a/pcapkit/protocols/data/link/radiotap.py b/pcapkit/protocols/link/radiotap/data.py similarity index 99% rename from pcapkit/protocols/data/link/radiotap.py rename to pcapkit/protocols/link/radiotap/data.py index bb86533870..c24f126db2 100644 --- a/pcapkit/protocols/data/link/radiotap.py +++ b/pcapkit/protocols/link/radiotap/data.py @@ -4,8 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.data import Data -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Data, Protocol if TYPE_CHECKING: from pcapkit.const.radiotap.ampdu_flags import AMPDUFlags @@ -76,7 +75,7 @@ class Unknown(RadiotapField): data: 'bytes' #: The reason the walk stopped here, that the field type has no layout or #: that the field runs past the field-data region. :meth:`Radiotap.make - #: ` does not read it. + #: ` does not read it. reason: 'str' if TYPE_CHECKING: @@ -734,7 +733,7 @@ class Radiotap(Protocol): The fixed 8-octet start and the present-flags chain are decoded field by field; the optional-field region is kept whole as :attr:`fields`, which is what a rebuild writes, and decoded as :attr:`decoded`. See the module - docstring's *Scope* section on :mod:`pcapkit.protocols.link.radiotap`. + docstring's *Scope* section on :mod:`pcapkit.protocols.link.radiotap.protocol`. """ @@ -760,7 +759,7 @@ class Radiotap(Protocol): #: The fields of :attr:`fields`, decoded in wire order, keyed by type: #: one per bit of :attr:`present` that selects data in the radiotap #: namespace or switches namespace. See :meth:`Radiotap.read - #: `. + #: `. decoded: 'OrderedMultiInfo[FieldType, RadiotapField]' if TYPE_CHECKING: diff --git a/pcapkit/protocols/link/radiotap.py b/pcapkit/protocols/link/radiotap/protocol.py similarity index 92% rename from pcapkit/protocols/link/radiotap.py rename to pcapkit/protocols/link/radiotap/protocol.py index bd09db9e8b..617daa1e32 100644 --- a/pcapkit/protocols/link/radiotap.py +++ b/pcapkit/protocols/link/radiotap/protocol.py @@ -2,21 +2,21 @@ """Radiotap - IEEE 802.11 Radiotap Header ============================================ -.. module:: pcapkit.protocols.link.radiotap +.. module:: pcapkit.protocols.link.radiotap.protocol -:mod:`pcapkit.protocols.link.radiotap` contains -:class:`~pcapkit.protocols.link.radiotap.Radiotap` only, which implements the +:mod:`pcapkit.protocols.link.radiotap.protocol` contains +:class:`~pcapkit.protocols.link.radiotap.protocol.Radiotap` only, which implements the extractor for the radiotap header [*]_ capture tools prepend to an 802.11 frame, as seen on a ``LINKTYPE_IEEE802_11_RADIOTAP`` capture, or on a ``LINKTYPE_LINUX_SLL``/``LINKTYPE_LINUX_SLL2`` capture whose ``arphrd_type`` is ``ARPHRD_IEEE80211_RADIOTAP``. -:class:`~pcapkit.protocols.misc.pcap.frame.Frame` and -:class:`~pcapkit.protocols.misc.pcapng.PCAPNG` bind +:class:`~pcapkit.protocols.misc.pcap.frame.protocol.Frame` and +:class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG` bind :attr:`LinkType.IEEE802_11_RADIOTAP ` -here, and :class:`~pcapkit.protocols.link.linux_sll.LinuxSLL` dispatches here +here, and :class:`~pcapkit.protocols.link.linux_sll.protocol.LinuxSLL` dispatches here for that one ``arphrd_type`` instead of falling back to -:class:`~pcapkit.protocols.misc.raw.Raw`; see -:attr:`LinuxSLL.__proto__ `. +:class:`~pcapkit.protocols.misc.raw.protocol.Raw`; see +:attr:`LinuxSLL.__proto__ `. Radiotap is not part of the 802.11 standard itself: it is a prefix *in front of* the raw 802.11 MAC frame, written by the capturing tool rather than by the radio. Its structure is a fixed 8-octet start, all little-endian: @@ -44,18 +44,18 @@ * **Decodes** the fixed 8-octet start -- ``it_version``, ``it_pad``, ``it_len`` -- and walks the present-flags chain, recording every word as - :attr:`~pcapkit.protocols.data.link.radiotap.Radiotap.present`. + :attr:`~pcapkit.protocols.link.radiotap.data.Radiotap.present`. * **Keeps** the optional-field region those bits select whole, as - :attr:`~pcapkit.protocols.data.link.radiotap.Radiotap.fields`, which is + :attr:`~pcapkit.protocols.link.radiotap.data.Radiotap.fields`, which is what a rebuild from the data model writes, and **decodes** it as - :attr:`~pcapkit.protocols.data.link.radiotap.Radiotap.decoded`, by the + :attr:`~pcapkit.protocols.link.radiotap.data.Radiotap.decoded`, by the rules below. * **Hands** everything from ``it_len`` on, the 802.11 MAC frame, to - :class:`~pcapkit.protocols.link.ieee802_11.IEEE802_11` - (:class:`~pcapkit.protocols.misc.no_payload.NoPayload` when nothing follows). + :class:`~pcapkit.protocols.link.ieee802_11.protocol.IEEE802_11` + (:class:`~pcapkit.protocols.misc.no_payload.protocol.NoPayload` when nothing follows). The header names no next protocol, since an 802.11 frame always follows it, so the frame is looked up in - :attr:`Radiotap.__proto__ ` + :attr:`Radiotap.__proto__ ` under :attr:`LinkType.IEEE802_11 `. Field Decoding @@ -64,9 +64,9 @@ The bits are walked in order, word by word, and the fields they select follow one another in the same order, each aligned to its own boundary counted from the start of the header. A field type is read and made by the methods -:attr:`Radiotap.__field__ ` +:attr:`Radiotap.__field__ ` names for it, through the schema the -:class:`~pcapkit.protocols.schema.link.radiotap.RadiotapField` registry holds +:class:`~pcapkit.protocols.link.radiotap.schema.RadiotapField` registry holds for it: the schema's fields are the subfields of the type's page on radiotap.org, their total is its size, and its ``__align__`` its alignment, which match the tables of the Linux kernel, Wireshark and radiotap.org's own @@ -98,14 +98,14 @@ data. radiotap.org lets a producer leave out the octets that end an item, which are then zeros, so an item short of its schema, or of the vendor header, is decoded as though they were there. Its decoded data records the cut as - ``__short_read__``, as :meth:`Schema.unpack ` - does, so :meth:`Radiotap.make ` + ``__short_read__``, as :meth:`Schema.unpack ` + does, so :meth:`Radiotap.make ` writes the octets that were captured. * **What is not decoded.** A radiotap-namespace bit no field is defined for -- 18, FreeBSD's XChannel, which radiotap.org lists as unofficial, and every one numbered 32 or more, the TLV-only types included -- or a field that runs past the region, ends the walk, since nothing after it can be located: an - :class:`~pcapkit.protocols.data.link.radiotap.Unknown` entry keeps every + :class:`~pcapkit.protocols.link.radiotap.data.Unknown` entry keeps every octet from there on, and its ``reason`` says which of the two it was. .. [*] , its field pages and its @@ -129,88 +129,88 @@ from pcapkit.corekit.module import ModuleDescriptor from pcapkit.corekit.multidict import OrderedMultiDict from pcapkit.corekit.schema.padding import pad_length -from pcapkit.protocols.data.link.radiotap import EHT as Data_EHT -from pcapkit.protocols.data.link.radiotap import FHSS as Data_FHSS -from pcapkit.protocols.data.link.radiotap import HE as Data_HE -from pcapkit.protocols.data.link.radiotap import HEMU as Data_HEMU -from pcapkit.protocols.data.link.radiotap import LSIG as Data_LSIG -from pcapkit.protocols.data.link.radiotap import MCS as Data_MCS -from pcapkit.protocols.data.link.radiotap import S1G as Data_S1G -from pcapkit.protocols.data.link.radiotap import TLV as Data_TLV -from pcapkit.protocols.data.link.radiotap import TSFT as Data_TSFT -from pcapkit.protocols.data.link.radiotap import USIG as Data_USIG -from pcapkit.protocols.data.link.radiotap import VHT as Data_VHT -from pcapkit.protocols.data.link.radiotap import AMPDUStatus as Data_AMPDUStatus -from pcapkit.protocols.data.link.radiotap import Antenna as Data_Antenna -from pcapkit.protocols.data.link.radiotap import AntennaNoise as Data_AntennaNoise -from pcapkit.protocols.data.link.radiotap import AntennaSignal as Data_AntennaSignal -from pcapkit.protocols.data.link.radiotap import Channel as Data_Channel -from pcapkit.protocols.data.link.radiotap import DataRetries as Data_DataRetries -from pcapkit.protocols.data.link.radiotap import DBAntennaNoise as Data_DBAntennaNoise -from pcapkit.protocols.data.link.radiotap import DBAntennaSignal as Data_DBAntennaSignal -from pcapkit.protocols.data.link.radiotap import DBmTXPower as Data_DBmTXPower -from pcapkit.protocols.data.link.radiotap import DBTXAttenuation as Data_DBTXAttenuation -from pcapkit.protocols.data.link.radiotap import Flags as Data_Flags -from pcapkit.protocols.data.link.radiotap import HEData1 as Data_HEData1 -from pcapkit.protocols.data.link.radiotap import HEData2 as Data_HEData2 -from pcapkit.protocols.data.link.radiotap import HEMUFlags1 as Data_HEMUFlags1 -from pcapkit.protocols.data.link.radiotap import HEMUFlags2 as Data_HEMUFlags2 -from pcapkit.protocols.data.link.radiotap import HEMUOtherUser as Data_HEMUOtherUser -from pcapkit.protocols.data.link.radiotap import LockQuality as Data_LockQuality -from pcapkit.protocols.data.link.radiotap import MCSFlags as Data_MCSFlags -from pcapkit.protocols.data.link.radiotap import Radiotap as Data_Radiotap -from pcapkit.protocols.data.link.radiotap import RadiotapNamespace as Data_RadiotapNamespace -from pcapkit.protocols.data.link.radiotap import Rate as Data_Rate -from pcapkit.protocols.data.link.radiotap import RTSRetries as Data_RTSRetries -from pcapkit.protocols.data.link.radiotap import RXFlags as Data_RXFlags -from pcapkit.protocols.data.link.radiotap import Timestamp as Data_Timestamp -from pcapkit.protocols.data.link.radiotap import TLVFields as Data_TLVFields -from pcapkit.protocols.data.link.radiotap import TXAttenuation as Data_TXAttenuation -from pcapkit.protocols.data.link.radiotap import TXFlags as Data_TXFlags -from pcapkit.protocols.data.link.radiotap import Unknown as Data_Unknown -from pcapkit.protocols.data.link.radiotap import USIGCommon as Data_USIGCommon -from pcapkit.protocols.data.link.radiotap import VendorNamespace as Data_VendorNamespace -from pcapkit.protocols.data.link.radiotap import VendorTLV as Data_VendorTLV -from pcapkit.protocols.data.link.radiotap import ZeroLengthPSDU as Data_ZeroLengthPSDU from pcapkit.protocols.link.link import Link +from pcapkit.protocols.link.radiotap.data import EHT as Data_EHT +from pcapkit.protocols.link.radiotap.data import FHSS as Data_FHSS +from pcapkit.protocols.link.radiotap.data import HE as Data_HE +from pcapkit.protocols.link.radiotap.data import HEMU as Data_HEMU +from pcapkit.protocols.link.radiotap.data import LSIG as Data_LSIG +from pcapkit.protocols.link.radiotap.data import MCS as Data_MCS +from pcapkit.protocols.link.radiotap.data import S1G as Data_S1G +from pcapkit.protocols.link.radiotap.data import TLV as Data_TLV +from pcapkit.protocols.link.radiotap.data import TSFT as Data_TSFT +from pcapkit.protocols.link.radiotap.data import USIG as Data_USIG +from pcapkit.protocols.link.radiotap.data import VHT as Data_VHT +from pcapkit.protocols.link.radiotap.data import AMPDUStatus as Data_AMPDUStatus +from pcapkit.protocols.link.radiotap.data import Antenna as Data_Antenna +from pcapkit.protocols.link.radiotap.data import AntennaNoise as Data_AntennaNoise +from pcapkit.protocols.link.radiotap.data import AntennaSignal as Data_AntennaSignal +from pcapkit.protocols.link.radiotap.data import Channel as Data_Channel +from pcapkit.protocols.link.radiotap.data import DataRetries as Data_DataRetries +from pcapkit.protocols.link.radiotap.data import DBAntennaNoise as Data_DBAntennaNoise +from pcapkit.protocols.link.radiotap.data import DBAntennaSignal as Data_DBAntennaSignal +from pcapkit.protocols.link.radiotap.data import DBmTXPower as Data_DBmTXPower +from pcapkit.protocols.link.radiotap.data import DBTXAttenuation as Data_DBTXAttenuation +from pcapkit.protocols.link.radiotap.data import Flags as Data_Flags +from pcapkit.protocols.link.radiotap.data import HEData1 as Data_HEData1 +from pcapkit.protocols.link.radiotap.data import HEData2 as Data_HEData2 +from pcapkit.protocols.link.radiotap.data import HEMUFlags1 as Data_HEMUFlags1 +from pcapkit.protocols.link.radiotap.data import HEMUFlags2 as Data_HEMUFlags2 +from pcapkit.protocols.link.radiotap.data import HEMUOtherUser as Data_HEMUOtherUser +from pcapkit.protocols.link.radiotap.data import LockQuality as Data_LockQuality +from pcapkit.protocols.link.radiotap.data import MCSFlags as Data_MCSFlags +from pcapkit.protocols.link.radiotap.data import Radiotap as Data_Radiotap +from pcapkit.protocols.link.radiotap.data import RadiotapNamespace as Data_RadiotapNamespace +from pcapkit.protocols.link.radiotap.data import Rate as Data_Rate +from pcapkit.protocols.link.radiotap.data import RTSRetries as Data_RTSRetries +from pcapkit.protocols.link.radiotap.data import RXFlags as Data_RXFlags +from pcapkit.protocols.link.radiotap.data import Timestamp as Data_Timestamp +from pcapkit.protocols.link.radiotap.data import TLVFields as Data_TLVFields +from pcapkit.protocols.link.radiotap.data import TXAttenuation as Data_TXAttenuation +from pcapkit.protocols.link.radiotap.data import TXFlags as Data_TXFlags +from pcapkit.protocols.link.radiotap.data import Unknown as Data_Unknown +from pcapkit.protocols.link.radiotap.data import USIGCommon as Data_USIGCommon +from pcapkit.protocols.link.radiotap.data import VendorNamespace as Data_VendorNamespace +from pcapkit.protocols.link.radiotap.data import VendorTLV as Data_VendorTLV +from pcapkit.protocols.link.radiotap.data import ZeroLengthPSDU as Data_ZeroLengthPSDU +from pcapkit.protocols.link.radiotap.schema import EHT as Schema_EHT +from pcapkit.protocols.link.radiotap.schema import FHSS as Schema_FHSS +from pcapkit.protocols.link.radiotap.schema import HE as Schema_HE +from pcapkit.protocols.link.radiotap.schema import HEMU as Schema_HEMU +from pcapkit.protocols.link.radiotap.schema import LSIG as Schema_LSIG +from pcapkit.protocols.link.radiotap.schema import MCS as Schema_MCS +from pcapkit.protocols.link.radiotap.schema import S1G as Schema_S1G +from pcapkit.protocols.link.radiotap.schema import TLV as Schema_TLV +from pcapkit.protocols.link.radiotap.schema import TSFT as Schema_TSFT +from pcapkit.protocols.link.radiotap.schema import USIG as Schema_USIG +from pcapkit.protocols.link.radiotap.schema import VHT as Schema_VHT +from pcapkit.protocols.link.radiotap.schema import AMPDUStatus as Schema_AMPDUStatus +from pcapkit.protocols.link.radiotap.schema import Antenna as Schema_Antenna +from pcapkit.protocols.link.radiotap.schema import AntennaNoise as Schema_AntennaNoise +from pcapkit.protocols.link.radiotap.schema import AntennaSignal as Schema_AntennaSignal +from pcapkit.protocols.link.radiotap.schema import Channel as Schema_Channel +from pcapkit.protocols.link.radiotap.schema import DataRetries as Schema_DataRetries +from pcapkit.protocols.link.radiotap.schema import DBAntennaNoise as Schema_DBAntennaNoise +from pcapkit.protocols.link.radiotap.schema import DBAntennaSignal as Schema_DBAntennaSignal +from pcapkit.protocols.link.radiotap.schema import DBmTXPower as Schema_DBmTXPower +from pcapkit.protocols.link.radiotap.schema import DBTXAttenuation as Schema_DBTXAttenuation +from pcapkit.protocols.link.radiotap.schema import Flags as Schema_Flags +from pcapkit.protocols.link.radiotap.schema import HEMUOtherUser as Schema_HEMUOtherUser +from pcapkit.protocols.link.radiotap.schema import LockQuality as Schema_LockQuality +from pcapkit.protocols.link.radiotap.schema import Radiotap as Schema_Radiotap +from pcapkit.protocols.link.radiotap.schema import RadiotapField as Schema_Field +from pcapkit.protocols.link.radiotap.schema import Rate as Schema_Rate +from pcapkit.protocols.link.radiotap.schema import RTSRetries as Schema_RTSRetries +from pcapkit.protocols.link.radiotap.schema import RXFlags as Schema_RXFlags +from pcapkit.protocols.link.radiotap.schema import Timestamp as Schema_Timestamp +from pcapkit.protocols.link.radiotap.schema import TXAttenuation as Schema_TXAttenuation +from pcapkit.protocols.link.radiotap.schema import TXFlags as Schema_TXFlags +from pcapkit.protocols.link.radiotap.schema import Unknown as Schema_Unknown +from pcapkit.protocols.link.radiotap.schema import VendorNamespace as Schema_VendorNamespace +from pcapkit.protocols.link.radiotap.schema import VendorTLV as Schema_VendorTLV +from pcapkit.protocols.link.radiotap.schema import ZeroLengthPSDU as Schema_ZeroLengthPSDU from pcapkit.protocols.protocol import ProtocolBase -from pcapkit.protocols.schema.link.radiotap import EHT as Schema_EHT -from pcapkit.protocols.schema.link.radiotap import FHSS as Schema_FHSS -from pcapkit.protocols.schema.link.radiotap import HE as Schema_HE -from pcapkit.protocols.schema.link.radiotap import HEMU as Schema_HEMU -from pcapkit.protocols.schema.link.radiotap import LSIG as Schema_LSIG -from pcapkit.protocols.schema.link.radiotap import MCS as Schema_MCS -from pcapkit.protocols.schema.link.radiotap import S1G as Schema_S1G -from pcapkit.protocols.schema.link.radiotap import TLV as Schema_TLV -from pcapkit.protocols.schema.link.radiotap import TSFT as Schema_TSFT -from pcapkit.protocols.schema.link.radiotap import USIG as Schema_USIG -from pcapkit.protocols.schema.link.radiotap import VHT as Schema_VHT -from pcapkit.protocols.schema.link.radiotap import AMPDUStatus as Schema_AMPDUStatus -from pcapkit.protocols.schema.link.radiotap import Antenna as Schema_Antenna -from pcapkit.protocols.schema.link.radiotap import AntennaNoise as Schema_AntennaNoise -from pcapkit.protocols.schema.link.radiotap import AntennaSignal as Schema_AntennaSignal -from pcapkit.protocols.schema.link.radiotap import Channel as Schema_Channel -from pcapkit.protocols.schema.link.radiotap import DataRetries as Schema_DataRetries -from pcapkit.protocols.schema.link.radiotap import DBAntennaNoise as Schema_DBAntennaNoise -from pcapkit.protocols.schema.link.radiotap import DBAntennaSignal as Schema_DBAntennaSignal -from pcapkit.protocols.schema.link.radiotap import DBmTXPower as Schema_DBmTXPower -from pcapkit.protocols.schema.link.radiotap import DBTXAttenuation as Schema_DBTXAttenuation -from pcapkit.protocols.schema.link.radiotap import Flags as Schema_Flags -from pcapkit.protocols.schema.link.radiotap import HEMUOtherUser as Schema_HEMUOtherUser -from pcapkit.protocols.schema.link.radiotap import LockQuality as Schema_LockQuality -from pcapkit.protocols.schema.link.radiotap import Radiotap as Schema_Radiotap -from pcapkit.protocols.schema.link.radiotap import RadiotapField as Schema_Field -from pcapkit.protocols.schema.link.radiotap import Rate as Schema_Rate -from pcapkit.protocols.schema.link.radiotap import RTSRetries as Schema_RTSRetries -from pcapkit.protocols.schema.link.radiotap import RXFlags as Schema_RXFlags -from pcapkit.protocols.schema.link.radiotap import Timestamp as Schema_Timestamp -from pcapkit.protocols.schema.link.radiotap import TXAttenuation as Schema_TXAttenuation -from pcapkit.protocols.schema.link.radiotap import TXFlags as Schema_TXFlags -from pcapkit.protocols.schema.link.radiotap import Unknown as Schema_Unknown -from pcapkit.protocols.schema.link.radiotap import VendorNamespace as Schema_VendorNamespace -from pcapkit.protocols.schema.link.radiotap import VendorTLV as Schema_VendorTLV -from pcapkit.protocols.schema.link.radiotap import ZeroLengthPSDU as Schema_ZeroLengthPSDU -from pcapkit.protocols.schema.schema import Schema +from pcapkit.protocols.schema import Schema from pcapkit.utilities.exceptions import CaughtByCaller, FieldValueError, ProtocolError from pcapkit.utilities.warnings import RegistryWarning, warn @@ -222,7 +222,7 @@ from pcapkit.corekit.enum import EnumRegistry from pcapkit.corekit.fields.numbers import BitmapField - from pcapkit.protocols.data.link.radiotap import RadiotapField as Data_Field + from pcapkit.protocols.link.radiotap.data import RadiotapField as Data_Field #: A field given to :meth:`Radiotap.make` -- a data model, or a ``(type, mapping)`` pair. FieldEntry = Union[Data_Field, Tuple[Union[Enum_FieldType, int], Mapping[str, Any]]] @@ -253,7 +253,7 @@ #: it ends the walk, see :meth:`Radiotap._walk_present`. _FIELD_TYPE_MAX = (1 << 8 * Schema_TLV.__fields__['type'].length) - 1 -#: Why an :class:`~pcapkit.protocols.data.link.radiotap.Unknown` entry ended +#: Why an :class:`~pcapkit.protocols.link.radiotap.data.Unknown` entry ended #: the walk, as its ``reason`` says. _REASON_NO_LAYOUT = 'no layout is defined for the field type' _REASON_PAST_REGION = 'the field runs past the field-data region' @@ -272,7 +272,7 @@ class Radiotap(Link[Data_Radiotap, Schema_Radiotap], * - Index - Protocol * - :attr:`~pcapkit.const.reg.linktype.LinkType.IEEE802_11` - - :class:`pcapkit.protocols.link.ieee802_11.IEEE802_11` + - :class:`pcapkit.protocols.link.ieee802_11.protocol.IEEE802_11` and each field of the field-data region through :attr:`__field__`, keyed by its :class:`~pcapkit.const.radiotap.field_type.FieldType`. See the @@ -289,9 +289,9 @@ class Radiotap(Link[Data_Radiotap, Schema_Radiotap], #: of the frame the header precedes; :meth:`read` always looks up #: :attr:`LinkType.IEEE802_11 `. __proto__ = collections.defaultdict( - lambda: ModuleDescriptor('pcapkit.protocols.misc.raw', 'Raw'), + lambda: ModuleDescriptor('pcapkit.protocols.misc.raw.protocol', 'Raw'), { - Enum_LinkType.IEEE802_11: ModuleDescriptor('pcapkit.protocols.link.ieee802_11', 'IEEE802_11'), + Enum_LinkType.IEEE802_11: ModuleDescriptor('pcapkit.protocols.link.ieee802_11.protocol', 'IEEE802_11'), }, ) # type: DefaultDict[int | Enum_LinkType, ModuleDescriptor[ProtocolBase] | Type[ProtocolBase]] @@ -303,7 +303,7 @@ class Radiotap(Link[Data_Radiotap, Schema_Radiotap], #: :meth:`_make_radiotap_fields`. A :obj:`str` value names the methods #: ``_read_field_${name}`` and ``_make_field_${name}``, any other value is a #: ``(parser, constructor)`` pair; either works on the type's schema in the - #: :class:`~pcapkit.protocols.schema.link.radiotap.RadiotapField` registry. A + #: :class:`~pcapkit.protocols.link.radiotap.schema.RadiotapField` registry. A #: type missing from either has no layout and is kept raw. Presence bits 28 to #: 30 and vendor namespace TLV items follow rules of their own, see the module #: docstring; a type from 32 on is reached as a TLV item only. @@ -361,10 +361,10 @@ def alias(self) -> 'Literal["Radiotap"]': def length(self) -> 'int': """Header length of current protocol. - This is :attr:`self._info.it_len ` + This is :attr:`self._info.it_len ` exactly as captured, even when it disagrees with - :attr:`~pcapkit.protocols.data.link.radiotap.Radiotap.present` and - :attr:`~pcapkit.protocols.data.link.radiotap.Radiotap.fields` -- see + :attr:`~pcapkit.protocols.link.radiotap.data.Radiotap.present` and + :attr:`~pcapkit.protocols.link.radiotap.data.Radiotap.fields` -- see :meth:`read`. """ @@ -399,16 +399,16 @@ def read(self, length: 'Optional[int]' = None, **kwargs: 'Any') -> 'Data_Radiota select, then by the 802.11 MAC frame at offset ``it_len``. The region is decoded into - :attr:`~pcapkit.protocols.data.link.radiotap.Radiotap.decoded` as the + :attr:`~pcapkit.protocols.link.radiotap.data.Radiotap.decoded` as the module docstring's *Field Decoding* section describes: one entry per bit that selects radiotap-namespace data or switches namespace, keyed by its :class:`~pcapkit.const.radiotap.field_type.FieldType`. A bit in a vendor namespace has no entry of its own, since its data is in the - :class:`~pcapkit.protocols.data.link.radiotap.VendorNamespace` entry, + :class:`~pcapkit.protocols.link.radiotap.data.VendorNamespace` entry, and nothing after the TLV fields or an - :class:`~pcapkit.protocols.data.link.radiotap.Unknown` entry has one. + :class:`~pcapkit.protocols.link.radiotap.data.Unknown` entry has one. Octets after the last field stay in - :attr:`~pcapkit.protocols.data.link.radiotap.Radiotap.fields` alone. + :attr:`~pcapkit.protocols.link.radiotap.data.Radiotap.fields` alone. Args: length: Length of packet data. @@ -485,18 +485,18 @@ def make(self, but the last conventionally has bit 31 set (not enforced for raw ``fields``, so a capture that read short of its own chain replays exactly: see the ``Note`` on - :meth:`FRAD.make ` + :meth:`FRAD.make ` for the same tolerance). fields: The optional-field region ``present`` selects: the raw octets, written as they are, or its fields, which are encoded with zero padding. Fields are given as - :attr:`~pcapkit.protocols.data.link.radiotap.Radiotap.decoded` + :attr:`~pcapkit.protocols.link.radiotap.data.Radiotap.decoded` holds them, or as a sequence of data models or ``(type, mapping)`` pairs, a type being a :class:`~pcapkit.const.radiotap.field_type.FieldType` or an :class:`int`. There is one per bit :meth:`read` gives an entry for, in the same order, and an - :class:`~pcapkit.protocols.data.link.radiotap.Unknown` one, or + :class:`~pcapkit.protocols.link.radiotap.data.Unknown` one, or one of a type no field is defined for, is written raw and ends the region. it_len: Total header length, header included; computed from @@ -641,7 +641,7 @@ def __length_hint__(self) -> 'Literal[8]': The fixed start alone, ``8`` -- the shortest a radiotap header can structurally be (an empty present-flags word, no extended words, no field data). A capture shorter than this is not a radiotap header at - all, so it is kept as :class:`~pcapkit.protocols.misc.raw.Raw` + all, so it is kept as :class:`~pcapkit.protocols.misc.raw.protocol.Raw` rather than parsed; see :meth:`Protocol._parse_next_layer `. @@ -655,7 +655,7 @@ def __index__(cls) -> 'Enum_LinkType': # pylint: disable=invalid-index-returned Returns: Numeral registry index of the protocol in `tcpdump`_ link-layer header types. - :attr:`LinuxSLL.__proto__ ` + :attr:`LinuxSLL.__proto__ ` names its own key for this class, ``ARPHRD_IEEE80211_RADIOTAP`` (:ref:`registry-protocol-index`). @@ -673,10 +673,10 @@ def _make_data(cls, data: 'Data_Radiotap') -> 'dict[str, Any]': # type: ignore[ """Create key-value pairs from ``data`` for protocol construction. The field-data region is rebuilt from - :attr:`~pcapkit.protocols.data.link.radiotap.Radiotap.fields`, the + :attr:`~pcapkit.protocols.link.radiotap.data.Radiotap.fields`, the octets as captured, so padding, trailing octets and fields that were not decoded come back exactly; an edit to - :attr:`~pcapkit.protocols.data.link.radiotap.Radiotap.decoded` takes + :attr:`~pcapkit.protocols.link.radiotap.data.Radiotap.decoded` takes a :meth:`make` call that passes it as ``fields``. Args: @@ -1750,7 +1750,7 @@ def _get_payload(self) -> 'bytes': region it selects; those belong to this header, and the frame starts ``self._mac_offset`` octets in, as :meth:`read` records it. Both :meth:`Protocol._import_next_layer ` - and the :class:`~pcapkit.protocols.misc.raw.Raw` that + and the :class:`~pcapkit.protocols.misc.raw.protocol.Raw` that :func:`~pcapkit.corekit.decorators.beholder` falls back to on a refused frame read from here. @@ -1805,7 +1805,7 @@ def _lookup_field(self, field_type: 'Enum_FieldType') -> 'Optional[tuple[FieldPa Returns: What :attr:`__field__` and the - :class:`~pcapkit.protocols.schema.link.radiotap.RadiotapField` + :class:`~pcapkit.protocols.link.radiotap.schema.RadiotapField` registry hold for ``field_type``; :obj:`None` if either has no entry for it, or if :attr:`__field__` names a method the class does not have, since the type then has no layout. @@ -1856,7 +1856,7 @@ def _read_present_field(self, field_type: 'Enum_FieldType', fields: 'bytes', pos Returns: The field, and the offset in ``fields`` just past it; an - :class:`~pcapkit.protocols.data.link.radiotap.Unknown` entry of the + :class:`~pcapkit.protocols.link.radiotap.data.Unknown` entry of the rest of ``fields`` for a type with no layout, or one that only a TLV carries; :obj:`None` if the field runs past ``fields``. diff --git a/pcapkit/protocols/schema/link/radiotap.py b/pcapkit/protocols/link/radiotap/schema.py similarity index 99% rename from pcapkit/protocols/schema/link/radiotap.py rename to pcapkit/protocols/link/radiotap/schema.py index 8c9afc98e2..b995f293ef 100644 --- a/pcapkit/protocols/schema/link/radiotap.py +++ b/pcapkit/protocols/link/radiotap/schema.py @@ -30,7 +30,7 @@ from pcapkit.corekit.fields.numbers import (BitmapField, EnumField, Int8Field, UInt8Field, UInt16Field, UInt32Field, UInt64Field) from pcapkit.corekit.fields.strings import BytesField -from pcapkit.protocols.schema.schema import EnumSchema, Schema, schema_final +from pcapkit.protocols.schema import EnumSchema, Schema, schema_final __all__ = [ 'Radiotap', @@ -63,7 +63,7 @@ class Radiotap(Schema): 802.11 MAC frame behind it -- is captured together as :attr:`payload`, since where one ends and the next begins is only known once the present-flags chain itself has been walked; see :meth:`Radiotap.read - `. Each field in the + `. Each field in the region is a :class:`RadiotapField` of its own. """ diff --git a/pcapkit/protocols/link/s_tag/__init__.py b/pcapkit/protocols/link/s_tag/__init__.py new file mode 100644 index 0000000000..4446cc5faf --- /dev/null +++ b/pcapkit/protocols/link/s_tag/__init__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +"""S_Tag - 802.1ad Service VLAN Tag Type +=========================================== + +.. module:: pcapkit.protocols.link.s_tag + +:mod:`pcapkit.protocols.link.s_tag` holds the dissector, +:class:`~pcapkit.protocols.link.s_tag.protocol.S_Tag`, in +:mod:`~pcapkit.protocols.link.s_tag.protocol`. + +""" +from pcapkit.protocols.link.s_tag.protocol import S_Tag + +__all__ = ['S_Tag'] diff --git a/pcapkit/protocols/link/s_tag.py b/pcapkit/protocols/link/s_tag/protocol.py similarity index 80% rename from pcapkit/protocols/link/s_tag.py rename to pcapkit/protocols/link/s_tag/protocol.py index 7b74e39726..1190d4ba1e 100644 --- a/pcapkit/protocols/link/s_tag.py +++ b/pcapkit/protocols/link/s_tag/protocol.py @@ -2,17 +2,17 @@ """S_Tag - 802.1ad Service VLAN Tag Type =========================================== -.. module:: pcapkit.protocols.link.s_tag +.. module:: pcapkit.protocols.link.s_tag.protocol -:mod:`pcapkit.protocols.link.s_tag` contains -:class:`~pcapkit.protocols.link.s_tag.S_Tag` only, which implements the extractor for +:mod:`pcapkit.protocols.link.s_tag.protocol` contains +:class:`~pcapkit.protocols.link.s_tag.protocol.S_Tag` only, which implements the extractor for the 802.1ad Service VLAN Tag Type (S-Tag) [*]_, EtherType ``0x88A8``. Its structure, and all of its parsing and construction, come from -:class:`~pcapkit.protocols.link.vlan.VLAN`; this class adds only the tag's own +:class:`~pcapkit.protocols.link.vlan.protocol.VLAN`; this class adds only the tag's own identity and its registry index. -It lives in a module of its own rather than beside -:class:`~pcapkit.protocols.link.c_tag.C_Tag`, since a module holds one protocol +It lives in a package of its own rather than beside +:class:`~pcapkit.protocols.link.c_tag.protocol.C_Tag`, since a package holds one protocol class, named after it, with only the framework bases in :mod:`pcapkit.protocols.protocol` exempt (:issue:`2529`). The two tags are reached through different registry indices, ``0x88A8`` against ``0x8100``. @@ -23,9 +23,9 @@ from typing import TYPE_CHECKING from pcapkit.const.reg.ethertype import EtherType as Enum_EtherType -from pcapkit.protocols.data.link.vlan import VLAN as Data_VLAN -from pcapkit.protocols.link.vlan import VLAN -from pcapkit.protocols.schema.link.vlan import VLAN as Schema_VLAN +from pcapkit.protocols.link.vlan.data import VLAN as Data_VLAN +from pcapkit.protocols.link.vlan.protocol import VLAN +from pcapkit.protocols.link.vlan.schema import VLAN as Schema_VLAN if TYPE_CHECKING: from typing_extensions import Literal @@ -34,7 +34,7 @@ # NOTE: ``schema`` and ``data`` are restated here for the reason given in -# :mod:`pcapkit.protocols.link.c_tag` -- they are resolved by subclass *name*, +# :mod:`pcapkit.protocols.link.c_tag.protocol` -- they are resolved by subclass *name*, # not inherited, so omitting them would silently bind the Raw pair. class S_Tag(VLAN, schema=Schema_VLAN, data=Data_VLAN): """This class implements 802.1ad Service VLAN Tag Type. @@ -44,7 +44,7 @@ class S_Tag(VLAN, schema=Schema_VLAN, data=Data_VLAN): specified by 802.1Q. The ``802.1ad`` name is kept because it is what the provider-bridging tag is universally called, and because it is the only thing distinguishing this class from - :class:`~pcapkit.protocols.link.c_tag.C_Tag` by name. + :class:`~pcapkit.protocols.link.c_tag.protocol.C_Tag` by name. .. versionadded:: 1.5.0 @@ -64,7 +64,7 @@ def alias(self) -> 'Literal["802.1ad"]': """Acronym of corresponding protocol.""" return '802.1ad' - #: NOTE: see :attr:`C_Tag.info_name ` + #: NOTE: see :attr:`C_Tag.info_name ` #: -- spelled out deliberately, since it is what keeps a stacked service tag #: and customer tag apart in the parsed info dict. @property diff --git a/pcapkit/protocols/link/vlan/__init__.py b/pcapkit/protocols/link/vlan/__init__.py new file mode 100644 index 0000000000..c763ff4255 --- /dev/null +++ b/pcapkit/protocols/link/vlan/__init__.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""VLAN - 802.1Q/802.1ad VLAN Tag Types +========================================== + +.. module:: pcapkit.protocols.link.vlan + +:mod:`pcapkit.protocols.link.vlan` holds the dissector, +:class:`~pcapkit.protocols.link.vlan.protocol.VLAN`, in +:mod:`~pcapkit.protocols.link.vlan.protocol`, its header schema in +:mod:`~pcapkit.protocols.link.vlan.schema` and its data model in +:mod:`~pcapkit.protocols.link.vlan.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.link.vlan.protocol import VLAN + +# Header Schemas +from pcapkit.protocols.link.vlan.schema import TCI as Schema_TCI +from pcapkit.protocols.link.vlan.schema import VLAN as Schema_VLAN + +# Data Models +from pcapkit.protocols.link.vlan.data import TCI as Data_TCI +from pcapkit.protocols.link.vlan.data import VLAN as Data_VLAN + +__all__ = ['VLAN'] diff --git a/pcapkit/protocols/data/link/vlan.py b/pcapkit/protocols/link/vlan/data.py similarity index 83% rename from pcapkit/protocols/data/link/vlan.py rename to pcapkit/protocols/link/vlan/data.py index 0bd2f9fac0..9a514d7bca 100644 --- a/pcapkit/protocols/data/link/vlan.py +++ b/pcapkit/protocols/link/vlan/data.py @@ -2,16 +2,15 @@ """data models for 802.1Q/802.1ad VLAN tag types The customer tag (802.1Q) and the service tag (802.1ad) carry an identical -layout, so :class:`~pcapkit.protocols.link.c_tag.C_Tag` and -:class:`~pcapkit.protocols.link.s_tag.S_Tag` share the data model below. +layout, so :class:`~pcapkit.protocols.link.c_tag.protocol.C_Tag` and +:class:`~pcapkit.protocols.link.s_tag.protocol.S_Tag` share the data model below. """ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.data import Data -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Data, Protocol if TYPE_CHECKING: from pcapkit.const.reg.ethertype import EtherType diff --git a/pcapkit/protocols/link/vlan.py b/pcapkit/protocols/link/vlan/protocol.py similarity index 90% rename from pcapkit/protocols/link/vlan.py rename to pcapkit/protocols/link/vlan/protocol.py index 5b834f3b7d..0d3feecfdd 100644 --- a/pcapkit/protocols/link/vlan.py +++ b/pcapkit/protocols/link/vlan/protocol.py @@ -2,13 +2,13 @@ """VLAN - 802.1Q/802.1ad VLAN Tag Types ========================================== -.. module:: pcapkit.protocols.link.vlan +.. module:: pcapkit.protocols.link.vlan.protocol -:mod:`pcapkit.protocols.link.vlan` contains -:class:`~pcapkit.protocols.link.vlan.VLAN` only, an abstract base class holding +:mod:`pcapkit.protocols.link.vlan.protocol` contains +:class:`~pcapkit.protocols.link.vlan.protocol.VLAN` only, an abstract base class holding the tag layout shared by every VLAN tag [*]_. The concrete tags live in -modules of their own: :class:`~pcapkit.protocols.link.c_tag.C_Tag` for the -802.1Q customer tag (``0x8100``) and :class:`~pcapkit.protocols.link.s_tag.S_Tag` +packages of their own: :class:`~pcapkit.protocols.link.c_tag.protocol.C_Tag` for the +802.1Q customer tag (``0x8100``) and :class:`~pcapkit.protocols.link.s_tag.protocol.S_Tag` for the 802.1ad service tag (``0x88A8``). The tag structure is described as below, keyed as for a customer tag; a service tag's keys start ``s_tag`` instead: @@ -38,7 +38,7 @@ would nest one ``c_tag`` inside another, leaving nothing in the output to say which of the two was the service tag. -Each tag has a module of its own because a module holds one protocol class, +Each tag has a package of its own because a package holds one protocol class, named after it, with only the framework bases in :mod:`pcapkit.protocols.protocol` exempt (:issue:`2529`). This base declares no :meth:`~pcapkit.protocols.protocol.Protocol.__index__` of its own -- it is @@ -51,11 +51,11 @@ from pcapkit.const.reg.ethertype import EtherType as Enum_EtherType from pcapkit.const.vlan.priority_level import PriorityLevel as Enum_PriorityLevel -from pcapkit.protocols.data.link.vlan import TCI as Data_TCI -from pcapkit.protocols.data.link.vlan import VLAN as Data_VLAN from pcapkit.protocols.link.link import Link -from pcapkit.protocols.schema.link.vlan import TCI as Schema_TCI -from pcapkit.protocols.schema.link.vlan import VLAN as Schema_VLAN +from pcapkit.protocols.link.vlan.data import TCI as Data_TCI +from pcapkit.protocols.link.vlan.data import VLAN as Data_VLAN +from pcapkit.protocols.link.vlan.schema import TCI as Schema_TCI +from pcapkit.protocols.link.vlan.schema import VLAN as Schema_VLAN from pcapkit.utilities.exceptions import UnsupportedCall if TYPE_CHECKING: @@ -63,9 +63,9 @@ from typing_extensions import Literal + from pcapkit.protocols.link.vlan.schema import TCIType from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.link.vlan import TCIType - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema __all__ = ['VLAN'] @@ -81,18 +81,18 @@ class VLAN(Link[Data_VLAN, Schema_VLAN], # pylint: disable=abstract-method :attr:`~pcapkit.protocols.protocol.Protocol.alias` and :attr:`~pcapkit.protocols.protocol.Protocol.info_name`. - It is abstract for the same reason :class:`~pcapkit.protocols.internet.ip.IP` + It is abstract for the same reason :class:`~pcapkit.protocols.internet.ip.protocol.IP` is: :attr:`~pcapkit.protocols.protocol.Protocol.name` is declared abstract by :class:`~pcapkit.protocols.protocol.ProtocolBase` and is not defined here, so the class cannot be instantiated. Bind - :class:`~pcapkit.protocols.link.c_tag.C_Tag` or - :class:`~pcapkit.protocols.link.s_tag.S_Tag`, never this class. + :class:`~pcapkit.protocols.link.c_tag.protocol.C_Tag` or + :class:`~pcapkit.protocols.link.s_tag.protocol.S_Tag`, never this class. .. versionchanged:: 1.5.0 Became an abstract base. The 802.1Q customer tag it implemented, with its ``name``, ``alias`` and ``info_name``, moved to - :class:`~pcapkit.protocols.link.c_tag.C_Tag`. + :class:`~pcapkit.protocols.link.c_tag.protocol.C_Tag`. .. versionchanged:: 1.6.0 @@ -137,7 +137,7 @@ def id(cls) -> 'tuple[Literal["VLAN"], Literal["C_Tag"], Literal["S_Tag"]]': Returns: Index ID of the protocol -- the family name, then every tag in it, as - :meth:`L2TP.id ` does for + :meth:`L2TP.id ` does for its own family. Note that unlike L2TP's versions, the two tags are *distinct protocols* rather than flavours of one, so each is its own canonical name; they carry ``VLAN`` only as a secondary alias. diff --git a/pcapkit/protocols/schema/link/vlan.py b/pcapkit/protocols/link/vlan/schema.py similarity index 91% rename from pcapkit/protocols/schema/link/vlan.py rename to pcapkit/protocols/link/vlan/schema.py index 7a27e4bb1f..ed7153a18d 100644 --- a/pcapkit/protocols/schema/link/vlan.py +++ b/pcapkit/protocols/link/vlan/schema.py @@ -4,8 +4,8 @@ The customer tag (802.1Q, TPID ``0x8100``) and the service tag (802.1ad, TPID ``0x88A8``) carry an identical layout, so -:class:`~pcapkit.protocols.link.c_tag.C_Tag` and -:class:`~pcapkit.protocols.link.s_tag.S_Tag` share the schema below. The TPID that +:class:`~pcapkit.protocols.link.c_tag.protocol.C_Tag` and +:class:`~pcapkit.protocols.link.s_tag.protocol.S_Tag` share the schema below. The TPID that told them apart belongs to the encapsulating header, not to the tag. """ @@ -17,7 +17,7 @@ from pcapkit.corekit.fields.misc import PayloadField from pcapkit.corekit.fields.numbers import EnumField, UInt8Field, UInt16Field from pcapkit.corekit.fields.strings import BitField -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final from pcapkit.utilities.logging import SPHINX_TYPE_CHECKING __all__ = ['VLAN', 'TCI'] diff --git a/pcapkit/protocols/misc/__init__.py b/pcapkit/protocols/misc/__init__.py index 36f52a96af..53dd70f996 100644 --- a/pcapkit/protocols/misc/__init__.py +++ b/pcapkit/protocols/misc/__init__.py @@ -6,8 +6,8 @@ .. module:: pcapkit.protocols.misc :mod:`pcapkit.protocols.misc` contains the auxiliary protocol implementations. -These include the :class:`~pcapkit.protocols.misc.raw.Raw` class for not-supported -protocols, the :class:`~pcapkit.protocols.misc.no_payload.NoPayload` class for +These include the :class:`~pcapkit.protocols.misc.raw.protocol.Raw` class for not-supported +protocols, the :class:`~pcapkit.protocols.misc.no_payload.protocol.NoPayload` class for indication of empty payload, the PCAP and PCAP-NG file format classes, and the checksum pseudo-headers in :mod:`pcapkit.protocols.misc.checksum`. @@ -17,11 +17,11 @@ from pcapkit.protocols.misc.pcap import * # PCAPNG Format -from pcapkit.protocols.misc.pcapng import * +from pcapkit.protocols.misc.pcapng.protocol import * # Miscellaneous Classes for Protocols -from pcapkit.protocols.misc.raw import Raw -from pcapkit.protocols.misc.no_payload import NoPayload +from pcapkit.protocols.misc.raw.protocol import Raw +from pcapkit.protocols.misc.no_payload.protocol import NoPayload # Checksum Pseudo-Headers from pcapkit.protocols.misc.checksum import IP_Pseudo diff --git a/pcapkit/protocols/misc/checksum/__init__.py b/pcapkit/protocols/misc/checksum/__init__.py index f9e250788a..a768681c09 100644 --- a/pcapkit/protocols/misc/checksum/__init__.py +++ b/pcapkit/protocols/misc/checksum/__init__.py @@ -6,10 +6,10 @@ :mod:`pcapkit.protocols.misc.checksum` contains the pseudo-header that upper-layer checksums cover, -:class:`~pcapkit.protocols.misc.checksum.ip_pseudo.IP_Pseudo`. The checksum +:class:`~pcapkit.protocols.misc.checksum.ip_pseudo.protocol.IP_Pseudo`. The checksum itself is in :mod:`pcapkit.corekit.checksum`. """ -from pcapkit.protocols.misc.checksum.ip_pseudo import IP_Pseudo +from pcapkit.protocols.misc.checksum.ip_pseudo.protocol import IP_Pseudo __all__ = ['IP_Pseudo'] diff --git a/pcapkit/protocols/misc/checksum/ip_pseudo/__init__.py b/pcapkit/protocols/misc/checksum/ip_pseudo/__init__.py new file mode 100644 index 0000000000..beaa8a1083 --- /dev/null +++ b/pcapkit/protocols/misc/checksum/ip_pseudo/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""IP Pseudo-Header +====================== + +.. module:: pcapkit.protocols.misc.checksum.ip_pseudo + +:mod:`pcapkit.protocols.misc.checksum.ip_pseudo` holds the dissector, +:class:`~pcapkit.protocols.misc.checksum.ip_pseudo.protocol.IP_Pseudo`, in +:mod:`~pcapkit.protocols.misc.checksum.ip_pseudo.protocol`, its header schema in +:mod:`~pcapkit.protocols.misc.checksum.ip_pseudo.schema` and its data model in +:mod:`~pcapkit.protocols.misc.checksum.ip_pseudo.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.misc.checksum.ip_pseudo.protocol import IP_Pseudo + +# Header Schemas +from pcapkit.protocols.misc.checksum.ip_pseudo.schema import IP_Pseudo as Schema_IP_Pseudo + +# Data Models +from pcapkit.protocols.misc.checksum.ip_pseudo.data import IP_Pseudo as Data_IP_Pseudo + +__all__ = ['IP_Pseudo'] diff --git a/pcapkit/protocols/data/misc/checksum/ip_pseudo.py b/pcapkit/protocols/misc/checksum/ip_pseudo/data.py similarity index 95% rename from pcapkit/protocols/data/misc/checksum/ip_pseudo.py rename to pcapkit/protocols/misc/checksum/ip_pseudo/data.py index 1c05e23cc7..ecb5a449c9 100644 --- a/pcapkit/protocols/data/misc/checksum/ip_pseudo.py +++ b/pcapkit/protocols/misc/checksum/ip_pseudo/data.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Protocol if TYPE_CHECKING: from ipaddress import IPv4Address, IPv6Address diff --git a/pcapkit/protocols/misc/checksum/ip_pseudo.py b/pcapkit/protocols/misc/checksum/ip_pseudo/protocol.py similarity index 96% rename from pcapkit/protocols/misc/checksum/ip_pseudo.py rename to pcapkit/protocols/misc/checksum/ip_pseudo/protocol.py index f022a3d178..32cddb59ce 100644 --- a/pcapkit/protocols/misc/checksum/ip_pseudo.py +++ b/pcapkit/protocols/misc/checksum/ip_pseudo/protocol.py @@ -2,10 +2,10 @@ """IP Pseudo-Header ====================== -.. module:: pcapkit.protocols.misc.checksum.ip_pseudo +.. module:: pcapkit.protocols.misc.checksum.ip_pseudo.protocol -:mod:`pcapkit.protocols.misc.checksum.ip_pseudo` contains -:class:`~pcapkit.protocols.misc.checksum.ip_pseudo.IP_Pseudo`, +:mod:`pcapkit.protocols.misc.checksum.ip_pseudo.protocol` contains +:class:`~pcapkit.protocols.misc.checksum.ip_pseudo.protocol.IP_Pseudo`, which implements the pseudo-header of the IP protocol family that the upper-layer checksums cover, and :func:`pseudo_header` and :func:`verify_upper`, through which the IP layers use it. The @@ -37,7 +37,7 @@ A checksum over the IP pseudo-header is left to the enclosing IP layer, which alone knows the pseudo-header, and builds it as an -:class:`~pcapkit.protocols.misc.checksum.ip_pseudo.IP_Pseudo`, rather than the +:class:`~pcapkit.protocols.misc.checksum.ip_pseudo.protocol.IP_Pseudo`, rather than the upper layer reaching back to its parent. The upper layer takes part through these members: @@ -64,14 +64,14 @@ from pcapkit.corekit.protochain import ProtoChain from pcapkit.corekit.schema.ipaddress import parse_ip_address from pcapkit.corekit.schema.jumbogram import jumbo_payload_length -from pcapkit.protocols.data.misc.checksum.ip_pseudo import IP_Pseudo as Data_IP_Pseudo -from pcapkit.protocols.internet.ipv4 import IPv4 -from pcapkit.protocols.internet.ipv6 import IPV6_HEADER_LEN, IPv6 -from pcapkit.protocols.misc.no_payload import NoPayload +from pcapkit.protocols.internet.ipv4.protocol import IPv4 +from pcapkit.protocols.internet.ipv6.protocol import IPV6_HEADER_LEN, IPv6 +from pcapkit.protocols.internet.ipv6.schema import IP_MAX_LENGTH +from pcapkit.protocols.misc.checksum.ip_pseudo.data import IP_Pseudo as Data_IP_Pseudo +from pcapkit.protocols.misc.checksum.ip_pseudo.schema import IPV4_PSEUDO_LEN, IPV6_PSEUDO_LEN +from pcapkit.protocols.misc.checksum.ip_pseudo.schema import IP_Pseudo as Schema_IP_Pseudo +from pcapkit.protocols.misc.no_payload.protocol import NoPayload from pcapkit.protocols.protocol import ProtocolBase -from pcapkit.protocols.schema.internet.ipv6 import IP_MAX_LENGTH -from pcapkit.protocols.schema.misc.checksum.ip_pseudo import IPV4_PSEUDO_LEN, IPV6_PSEUDO_LEN -from pcapkit.protocols.schema.misc.checksum.ip_pseudo import IP_Pseudo as Schema_IP_Pseudo from pcapkit.utilities.exceptions import FieldValueError, ProtocolError, UnsupportedCall if TYPE_CHECKING: @@ -92,8 +92,8 @@ class IP_Pseudo(ProtocolBase[Data_IP_Pseudo, Schema_IP_Pseudo], """This class implements the IP pseudo-header. It is not a layer on the wire: it is built from the enclosing - :class:`~pcapkit.protocols.internet.ipv4.IPv4` or - :class:`~pcapkit.protocols.internet.ipv6.IPv6` layer, or from explicit + :class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4` or + :class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6` layer, or from explicit values, and its :attr:`data` is the octets an upper-layer checksum covers ahead of that layer's own. The layout follows the IP version of the source address, or the length of the octets parsed. @@ -330,7 +330,7 @@ def __post_init__(self, file: 'Optional[IO[bytes] | bytes]' = None, f'expected {IPV4_PSEUDO_LEN} or {IPV6_PSEUDO_LEN}') super().__post_init__(file, length, **kwargs) # type: ignore[arg-type] - #: pcapkit.protocols.misc.no_payload.NoPayload: Next layer (no payload). + #: pcapkit.protocols.misc.no_payload.protocol.NoPayload: Next layer (no payload). self._next = NoPayload() #: pcapkit.corekit.protochain.ProtoChain: Protocol chain from current layer. self._protos = ProtoChain(self.__class__, self.alias) @@ -659,14 +659,14 @@ def verify_upper(ip: 'IPv4 | IPv6') -> 'None': The upper layer is the payload of ``ip``, past any Authentication Header of IPv4. It is verified if it defines ``_verify_pseudo_checksum``, against - the :class:`~pcapkit.protocols.misc.checksum.ip_pseudo.IP_Pseudo` of ``ip``, + the :class:`~pcapkit.protocols.misc.checksum.ip_pseudo.protocol.IP_Pseudo` of ``ip``, or against :data:`None` if that cannot be derived or names another protocol. Args: ip: Parsed IPv4 or IPv6 layer. """ - from pcapkit.protocols.internet.ah import AH # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.internet.ah.protocol import AH # isort: skip # pylint: disable=import-outside-toplevel upper = ip.payload # NOTE: IPv6 walks an AH as an extension header; IPv4 carries it as its payload. diff --git a/pcapkit/protocols/schema/misc/checksum/ip_pseudo.py b/pcapkit/protocols/misc/checksum/ip_pseudo/schema.py similarity index 98% rename from pcapkit/protocols/schema/misc/checksum/ip_pseudo.py rename to pcapkit/protocols/misc/checksum/ip_pseudo/schema.py index 8588b3dc28..284eb79eb9 100644 --- a/pcapkit/protocols/schema/misc/checksum/ip_pseudo.py +++ b/pcapkit/protocols/misc/checksum/ip_pseudo/schema.py @@ -10,7 +10,7 @@ from pcapkit.corekit.fields.misc import ConditionalField, SwitchField from pcapkit.corekit.fields.numbers import EnumField, UInt16Field, UInt32Field from pcapkit.corekit.fields.strings import PaddingField -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final __all__ = ['IP_Pseudo'] diff --git a/pcapkit/protocols/misc/no_payload/__init__.py b/pcapkit/protocols/misc/no_payload/__init__.py new file mode 100644 index 0000000000..956eebf22d --- /dev/null +++ b/pcapkit/protocols/misc/no_payload/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""No-Payload Packet +======================= + +.. module:: pcapkit.protocols.misc.no_payload + +:mod:`pcapkit.protocols.misc.no_payload` holds the dissector, +:class:`~pcapkit.protocols.misc.no_payload.protocol.NoPayload`, in +:mod:`~pcapkit.protocols.misc.no_payload.protocol`, its header schema in +:mod:`~pcapkit.protocols.misc.no_payload.schema` and its data model in +:mod:`~pcapkit.protocols.misc.no_payload.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.misc.no_payload.protocol import NoPayload + +# Header Schemas +from pcapkit.protocols.misc.no_payload.schema import NoPayload as Schema_NoPayload + +# Data Models +from pcapkit.protocols.misc.no_payload.data import NoPayload as Data_NoPayload + +__all__ = ['NoPayload'] diff --git a/pcapkit/protocols/data/misc/no_payload.py b/pcapkit/protocols/misc/no_payload/data.py similarity index 91% rename from pcapkit/protocols/data/misc/no_payload.py rename to pcapkit/protocols/misc/no_payload/data.py index 7e4a860959..edb54d5499 100644 --- a/pcapkit/protocols/data/misc/no_payload.py +++ b/pcapkit/protocols/misc/no_payload/data.py @@ -2,7 +2,7 @@ """data models for no-payload packet""" from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Protocol __all__ = ['NoPayload'] diff --git a/pcapkit/protocols/misc/no_payload.py b/pcapkit/protocols/misc/no_payload/protocol.py similarity index 90% rename from pcapkit/protocols/misc/no_payload.py rename to pcapkit/protocols/misc/no_payload/protocol.py index b770d1bffc..675c08d5e4 100644 --- a/pcapkit/protocols/misc/no_payload.py +++ b/pcapkit/protocols/misc/no_payload/protocol.py @@ -2,13 +2,13 @@ """No-Payload Packet ======================= -.. module:: pcapkit.protocols.misc.no_payload +.. module:: pcapkit.protocols.misc.no_payload.protocol -:mod:`pcapkit.protocols.misc.no_payload` contains -:class:`~pcapkit.protocols.misc.no_payload.NoPayload` only, which +:mod:`pcapkit.protocols.misc.no_payload.protocol` contains +:class:`~pcapkit.protocols.misc.no_payload.protocol.NoPayload` only, which implements a :class:`~pcapkit.protocols.protocol.Protocol` like object whose payload is -:class:`~pcapkit.protocols.misc.no_payload.NoPayload` itself. +:class:`~pcapkit.protocols.misc.no_payload.protocol.NoPayload` itself. .. versionadded:: 1.6.0 @@ -25,9 +25,9 @@ import io from typing import TYPE_CHECKING, overload -from pcapkit.protocols.data.misc.no_payload import NoPayload as Data_NoPayload +from pcapkit.protocols.misc.no_payload.data import NoPayload as Data_NoPayload +from pcapkit.protocols.misc.no_payload.schema import NoPayload as Schema_NoPayload from pcapkit.protocols.protocol import ProtocolBase -from pcapkit.protocols.schema.misc.no_payload import NoPayload as Schema_NoPayload from pcapkit.utilities.exceptions import UnsupportedCall if TYPE_CHECKING: @@ -144,10 +144,10 @@ def __post_init__(self, file: 'Optional[IO[bytes] | bytes]' = None, # pylint: d self._data = b'' #: io.BytesIO: Source data stream. self._file = io.BytesIO() - #: pcapkit.protocols.data.misc.no_payload.NoPayload: Data model of current instance. + #: pcapkit.protocols.misc.no_payload.data.NoPayload: Data model of current instance. self._info = Data_NoPayload() - #: pcapkit.protocols.misc.no_payload.NoPayload: Payload of current instance. + #: pcapkit.protocols.misc.no_payload.protocol.NoPayload: Payload of current instance. self._next = self #: None: Protocol chain of current instance, which an empty payload #: does not have. diff --git a/pcapkit/protocols/schema/misc/no_payload.py b/pcapkit/protocols/misc/no_payload/schema.py similarity index 89% rename from pcapkit/protocols/schema/misc/no_payload.py rename to pcapkit/protocols/misc/no_payload/schema.py index bbedb9d055..67999fc130 100644 --- a/pcapkit/protocols/schema/misc/no_payload.py +++ b/pcapkit/protocols/misc/no_payload/schema.py @@ -2,7 +2,7 @@ # mypy: disable-error-code=assignment """header schema for empty payload""" -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final __all__ = ['NoPayload'] diff --git a/pcapkit/protocols/misc/pcap/__init__.py b/pcapkit/protocols/misc/pcap/__init__.py index a43e96f41d..67717312ac 100644 --- a/pcapkit/protocols/misc/pcap/__init__.py +++ b/pcapkit/protocols/misc/pcap/__init__.py @@ -7,11 +7,11 @@ :mod:`pcapkit.protocols.misc.pcap` contains header descriptions for PCAP files, including global header -(:class:`~pcapkit.protocols.misc.pcap.header.Header`) and frame header -(:class:`~pcapkit.protocols.misc.pcap.frame.Frame`). +(:class:`~pcapkit.protocols.misc.pcap.header.protocol.Header`) and frame header +(:class:`~pcapkit.protocols.misc.pcap.frame.protocol.Frame`). """ -from pcapkit.protocols.misc.pcap.frame import Frame -from pcapkit.protocols.misc.pcap.header import Header +from pcapkit.protocols.misc.pcap.frame.protocol import Frame +from pcapkit.protocols.misc.pcap.header.protocol import Header __all__ = ['Frame', 'Header'] diff --git a/pcapkit/protocols/misc/pcap/frame/__init__.py b/pcapkit/protocols/misc/pcap/frame/__init__.py new file mode 100644 index 0000000000..877bae6fa6 --- /dev/null +++ b/pcapkit/protocols/misc/pcap/frame/__init__.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""Frame Header +================== + +.. module:: pcapkit.protocols.misc.pcap.frame + +:mod:`pcapkit.protocols.misc.pcap.frame` holds the dissector, +:class:`~pcapkit.protocols.misc.pcap.frame.protocol.Frame`, in +:mod:`~pcapkit.protocols.misc.pcap.frame.protocol`, its header schema in +:mod:`~pcapkit.protocols.misc.pcap.frame.schema` and its data model in +:mod:`~pcapkit.protocols.misc.pcap.frame.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.misc.pcap.frame.protocol import Frame + +# Header Schemas +from pcapkit.protocols.misc.pcap.frame.schema import Frame as Schema_Frame + +# Data Models +from pcapkit.protocols.misc.pcap.frame.data import Frame as Data_Frame +from pcapkit.protocols.misc.pcap.frame.data import FrameInfo as Data_FrameInfo + +__all__ = ['Frame'] diff --git a/pcapkit/protocols/data/misc/pcap/frame.py b/pcapkit/protocols/misc/pcap/frame/data.py similarity index 92% rename from pcapkit/protocols/data/misc/pcap/frame.py rename to pcapkit/protocols/misc/pcap/frame/data.py index 18ded196a8..cde985c04f 100644 --- a/pcapkit/protocols/data/misc/pcap/frame.py +++ b/pcapkit/protocols/misc/pcap/frame/data.py @@ -4,8 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.data import Data -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Data, Protocol if TYPE_CHECKING: from datetime import datetime @@ -50,7 +49,7 @@ class Frame(Protocol): len: 'int' #: Number of octets of packet data actually captured and saved in the file, #: i.e. the record header's ``incl_len``, and so the number of octets - #: :attr:`~pcapkit.protocols.data.protocol.Protocol.packet` holds. Named + #: :attr:`~pcapkit.protocols.data.Protocol.packet` holds. Named #: after Wireshark's ``frame.cap_len``, registered as "Frame length stored #: into the capture file". cap_len: 'int' diff --git a/pcapkit/protocols/misc/pcap/frame.py b/pcapkit/protocols/misc/pcap/frame/protocol.py similarity index 94% rename from pcapkit/protocols/misc/pcap/frame.py rename to pcapkit/protocols/misc/pcap/frame/protocol.py index 2c9add896b..c7b27b9ecb 100644 --- a/pcapkit/protocols/misc/pcap/frame.py +++ b/pcapkit/protocols/misc/pcap/frame/protocol.py @@ -3,10 +3,10 @@ """Frame Header ================== -.. module:: pcapkit.protocols.misc.pcap.frame +.. module:: pcapkit.protocols.misc.pcap.frame.protocol -:mod:`pcapkit.protocols.misc.pcap.frame` contains -:class:`~pcapkit.protocols.misc.pcap.frame.Frame` only, +:mod:`pcapkit.protocols.misc.pcap.frame.protocol` contains +:class:`~pcapkit.protocols.misc.pcap.frame.protocol.Frame` only, which implements an extractor for frame headers [*]_ of PCAP, whose structure is described as below: @@ -41,12 +41,12 @@ from pcapkit.const.reg.linktype import LinkType as Enum_LinkType from pcapkit.corekit.io import advance from pcapkit.corekit.module import ModuleDescriptor -from pcapkit.protocols.data.misc.pcap.frame import Frame as Data_Frame -from pcapkit.protocols.data.misc.pcap.frame import FrameInfo as Data_FrameInfo +from pcapkit.protocols.misc.pcap.frame.data import Frame as Data_Frame +from pcapkit.protocols.misc.pcap.frame.data import FrameInfo as Data_FrameInfo +from pcapkit.protocols.misc.pcap.frame.schema import RECORD_HEADER_LEN +from pcapkit.protocols.misc.pcap.frame.schema import Frame as Schema_Frame +from pcapkit.protocols.misc.pcap.header.schema import RESOLUTION from pcapkit.protocols.protocol import ProtocolBase -from pcapkit.protocols.schema.misc.pcap.frame import RECORD_HEADER_LEN -from pcapkit.protocols.schema.misc.pcap.frame import Frame as Schema_Frame -from pcapkit.protocols.schema.misc.pcap.header import RESOLUTION from pcapkit.utilities.compat import localcontext from pcapkit.utilities.contextvars import frame_length from pcapkit.utilities.datetime import fromtimestamp, totimestamp @@ -61,8 +61,8 @@ from typing_extensions import Literal from pcapkit.corekit.enum import EnumRegistry - from pcapkit.protocols.data.misc.pcap.header import Header as Data_Header - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.misc.pcap.header.data import Header as Data_Header + from pcapkit.protocols.schema import Schema __all__ = ['Frame'] @@ -72,7 +72,7 @@ class Frame(ProtocolBase[Data_Frame, Schema_Frame], """Per packet frame header extractor. This class supports parsing of the following protocols, which are - registered in the :attr:`self.__proto__ ` + registered in the :attr:`self.__proto__ ` attribute: .. list-table:: @@ -81,25 +81,25 @@ class Frame(ProtocolBase[Data_Frame, Schema_Frame], * - Index - Protocol * - :attr:`pcapkit.const.reg.linktype.LinkType.NULL` - - :class:`pcapkit.protocols.link.loopback.Loopback` + - :class:`pcapkit.protocols.link.loopback.protocol.Loopback` * - :attr:`pcapkit.const.reg.linktype.LinkType.ETHERNET` - - :class:`pcapkit.protocols.link.ethernet.Ethernet` + - :class:`pcapkit.protocols.link.ethernet.protocol.Ethernet` * - :attr:`pcapkit.const.reg.linktype.LinkType.IEEE802_11` - - :class:`pcapkit.protocols.link.ieee802_11.IEEE802_11` + - :class:`pcapkit.protocols.link.ieee802_11.protocol.IEEE802_11` * - :attr:`pcapkit.const.reg.linktype.LinkType.FRELAY` - - :class:`pcapkit.protocols.link.frad.FRAD` + - :class:`pcapkit.protocols.link.frad.protocol.FRAD` * - :attr:`pcapkit.const.reg.linktype.LinkType.LOOP` - - :class:`pcapkit.protocols.link.loopback.Loopback` + - :class:`pcapkit.protocols.link.loopback.protocol.Loopback` * - :attr:`pcapkit.const.reg.linktype.LinkType.LINUX_SLL` - - :class:`pcapkit.protocols.link.linux_sll1.LinuxSLL1` + - :class:`pcapkit.protocols.link.linux_sll1.protocol.LinuxSLL1` * - :attr:`pcapkit.const.reg.linktype.LinkType.IEEE802_11_RADIOTAP` - - :class:`pcapkit.protocols.link.radiotap.Radiotap` + - :class:`pcapkit.protocols.link.radiotap.protocol.Radiotap` * - :attr:`pcapkit.const.reg.linktype.LinkType.IPV4` - - :class:`pcapkit.protocols.internet.ipv4.IPv4` + - :class:`pcapkit.protocols.internet.ipv4.protocol.IPv4` * - :attr:`pcapkit.const.reg.linktype.LinkType.IPV6` - - :class:`pcapkit.protocols.internet.ipv6.IPv6` + - :class:`pcapkit.protocols.internet.ipv6.protocol.IPv6` * - :attr:`pcapkit.const.reg.linktype.LinkType.LINUX_SLL2` - - :class:`pcapkit.protocols.link.linux_sll2.LinuxSLL2` + - :class:`pcapkit.protocols.link.linux_sll2.protocol.LinuxSLL2` :attr:`pcapkit.const.reg.linktype.LinkType.RAW` has no entry of its own: its data is dispatched as ``IPV4`` or ``IPV6`` by the version nibble of @@ -117,7 +117,7 @@ class Frame(ProtocolBase[Data_Frame, Schema_Frame], #: Each value is a :class:`~pcapkit.corekit.module.ModuleDescriptor` naming the #: module and class, or a :class:`~pcapkit.protocols.protocol.ProtocolBase` subclass. __proto__ = collections.defaultdict( - lambda: ModuleDescriptor('pcapkit.protocols.misc.raw', 'Raw'), + lambda: ModuleDescriptor('pcapkit.protocols.misc.raw.protocol', 'Raw'), { Enum_LinkType.NULL: ModuleDescriptor('pcapkit.protocols.link', 'Loopback'), Enum_LinkType.ETHERNET: ModuleDescriptor('pcapkit.protocols.link', 'Ethernet'), @@ -138,7 +138,7 @@ class Frame(ProtocolBase[Data_Frame, Schema_Frame], #: :func:`~pcapkit.foundation.registry.protocols.protocol.register_protocol_code` so a #: ``code=`` key is checked exactly as #: :func:`~pcapkit.foundation.registry.protocols.misc.register_pcap` checks its own -- - #: :class:`~pcapkit.protocols.misc.pcapng.PCAPNG` keeps a registry of its own, + #: :class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG` keeps a registry of its own, #: keyed by the same enum, and so declares the same pairing rather than #: sharing this one (:issue:`2268`). __proto_key__: 'ClassVar[tuple[Type[EnumRegistry], bool]]' = (Enum_LinkType, False) @@ -315,7 +315,7 @@ def read(self, length: 'Optional[int]' = None, *, _read: 'bool' = True, # against an aware datetime. The ``except`` branch below returns an # aware UTC datetime too, and so does the PCAP-NG reader, which fills # the same - # :attr:`Data_Frame.time ` + # :attr:`Data_Frame.time ` # field through :func:`pcapkit.toolkit.pcapng.block2frame`. Converted # without the C library, as the PCAP-NG reader does (#2099). _time = fromtimestamp(_irat[0] / _irat[1], datetime.timezone.utc) @@ -363,7 +363,7 @@ def read(self, length: 'Optional[int]' = None, *, _read: 'bool' = True, # So the start is recorded before the unpack, in # :meth:`self.__post_init__ <__post_init__>`, and seeked to # absolutely, as the PCAP-NG reader does; see - # :meth:`pcapkit.protocols.misc.pcapng.PCAPNG.read`. + # :meth:`pcapkit.protocols.misc.pcapng.protocol.PCAPNG.read`. seek_cur = _seek_set + self.length + _ilen # move backward to the beginning of the frame @@ -508,7 +508,7 @@ def __post_init__(self, file: 'Optional[IO[bytes] | bytes]' = None, length: 'Opt """ #: int: frame index number self._fnum = num - #: pcapkit.protocols.data.misc.pcap.header.Header: Global header of the PCAP file. + #: pcapkit.protocols.misc.pcap.header.data.Header: Global header of the PCAP file. self._ghdr = header #: pcapkit.const.reg.linktype.LinkType: next layer protocol index @@ -718,9 +718,9 @@ def _dispatch_linktype(self, proto: 'Optional[int]', length: 'Optional[int]' = N ``IPV4`` or ``IPV6``, it reaches whatever those link types are registered against. An entry registered under ``RAW`` itself is used as it stands, and data of any other version is kept as - :class:`~pcapkit.protocols.misc.raw.Raw`. + :class:`~pcapkit.protocols.misc.raw.protocol.Raw`. :meth:`PCAPNG._dispatch_linktype - ` does the + ` does the same for PCAP-NG. """ diff --git a/pcapkit/protocols/schema/misc/pcap/frame.py b/pcapkit/protocols/misc/pcap/frame/schema.py similarity index 96% rename from pcapkit/protocols/schema/misc/pcap/frame.py rename to pcapkit/protocols/misc/pcap/frame/schema.py index 31b0c836b8..f824547153 100644 --- a/pcapkit/protocols/schema/misc/pcap/frame.py +++ b/pcapkit/protocols/misc/pcap/frame/schema.py @@ -8,7 +8,7 @@ from pcapkit.corekit.fields.misc import PayloadField from pcapkit.corekit.fields.numbers import UInt32Field from pcapkit.corekit.schema.byteorder import byteorder_callback -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final __all__ = ['Frame'] diff --git a/pcapkit/protocols/misc/pcap/header/__init__.py b/pcapkit/protocols/misc/pcap/header/__init__.py new file mode 100644 index 0000000000..b09d86d313 --- /dev/null +++ b/pcapkit/protocols/misc/pcap/header/__init__.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""Global Header +=================== + +.. module:: pcapkit.protocols.misc.pcap.header + +:mod:`pcapkit.protocols.misc.pcap.header` holds the dissector, +:class:`~pcapkit.protocols.misc.pcap.header.protocol.Header`, in +:mod:`~pcapkit.protocols.misc.pcap.header.protocol`, its header schema in +:mod:`~pcapkit.protocols.misc.pcap.header.schema` and its data model in +:mod:`~pcapkit.protocols.misc.pcap.header.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.misc.pcap.header.protocol import Header + +# Header Schemas +from pcapkit.protocols.misc.pcap.header.schema import Header as Schema_Header + +# Data Models +from pcapkit.protocols.misc.pcap.header.data import Header as Data_Header +from pcapkit.protocols.misc.pcap.header.data import MagicNumber as Data_MagicNumber + +__all__ = ['Header'] diff --git a/pcapkit/protocols/data/misc/pcap/header.py b/pcapkit/protocols/misc/pcap/header/data.py similarity index 94% rename from pcapkit/protocols/data/misc/pcap/header.py rename to pcapkit/protocols/misc/pcap/header/data.py index 15e5e9faf1..393d00b4ad 100644 --- a/pcapkit/protocols/data/misc/pcap/header.py +++ b/pcapkit/protocols/misc/pcap/header/data.py @@ -4,8 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.data import Data -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Data, Protocol if TYPE_CHECKING: from typing_extensions import Literal diff --git a/pcapkit/protocols/misc/pcap/header.py b/pcapkit/protocols/misc/pcap/header/protocol.py similarity index 95% rename from pcapkit/protocols/misc/pcap/header.py rename to pcapkit/protocols/misc/pcap/header/protocol.py index 23ade47c04..07ce4b55ea 100644 --- a/pcapkit/protocols/misc/pcap/header.py +++ b/pcapkit/protocols/misc/pcap/header/protocol.py @@ -2,10 +2,10 @@ """Global Header =================== -.. module:: pcapkit.protocols.misc.pcap.header +.. module:: pcapkit.protocols.misc.pcap.header.protocol -:mod:`pcapkit.protocols.misc.pcap.header` contains -:class:`~pcapkit.protocols.misc.pcap.header.Header` only, +:mod:`pcapkit.protocols.misc.pcap.header.protocol` contains +:class:`~pcapkit.protocols.misc.pcap.header.protocol.Header` only, which implements an extractor for global headers [*]_ of PCAP, whose structure is described as below: @@ -37,11 +37,11 @@ from pcapkit.const.reg.linktype import LinkType as Enum_LinkType from pcapkit.corekit.schema.shortread import keep_short_read, replay_short_read from pcapkit.corekit.version import VersionInfo -from pcapkit.protocols.data.misc.pcap.header import Header as Data_Header -from pcapkit.protocols.data.misc.pcap.header import MagicNumber as Data_MagicNumber +from pcapkit.protocols.misc.pcap.header.data import Header as Data_Header +from pcapkit.protocols.misc.pcap.header.data import MagicNumber as Data_MagicNumber +from pcapkit.protocols.misc.pcap.header.schema import GLOBAL_HEADER_LEN, MAGIC_NUMBER +from pcapkit.protocols.misc.pcap.header.schema import Header as Schema_Header from pcapkit.protocols.protocol import ProtocolBase -from pcapkit.protocols.schema.misc.pcap.header import GLOBAL_HEADER_LEN, MAGIC_NUMBER -from pcapkit.protocols.schema.misc.pcap.header import Header as Schema_Header from pcapkit.utilities.exceptions import EndianError, UnsupportedCall if TYPE_CHECKING: @@ -52,7 +52,7 @@ __all__ = ['Header'] #: The PCAP magic number for each byte order and nanosecond flag, the reverse of -#: :data:`~pcapkit.protocols.schema.misc.pcap.header.MAGIC_NUMBER`, so that +#: :data:`~pcapkit.protocols.misc.pcap.header.schema.MAGIC_NUMBER`, so that #: :meth:`Header._make_magic` looks one up rather than searching for it -- an #: undeclared pair raises :exc:`KeyError`. _DECLARED_MAGIC = {declared: magic for magic, declared in MAGIC_NUMBER.items()} @@ -159,7 +159,7 @@ def read(self, length: 'Optional[int]' = None, **kwargs: 'Any') -> 'Data_Header' Raises: ProtocolError: If the magic number is invalid. Parsing does not get this far with one: the schema's - :func:`~pcapkit.protocols.schema.misc.pcap.header.magic_number_callback` + :func:`~pcapkit.protocols.misc.pcap.header.schema.magic_number_callback` raises it while the header is unpacked. """ diff --git a/pcapkit/protocols/schema/misc/pcap/header.py b/pcapkit/protocols/misc/pcap/header/schema.py similarity index 98% rename from pcapkit/protocols/schema/misc/pcap/header.py rename to pcapkit/protocols/misc/pcap/header/schema.py index 07a774d4ad..31cca6df11 100644 --- a/pcapkit/protocols/schema/misc/pcap/header.py +++ b/pcapkit/protocols/misc/pcap/header/schema.py @@ -7,7 +7,7 @@ from pcapkit.const.reg.linktype import LinkType as Enum_LinkType from pcapkit.corekit.fields.numbers import EnumField, Int32Field, UInt16Field, UInt32Field from pcapkit.corekit.fields.strings import BytesField -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final from pcapkit.utilities.exceptions import ProtocolError __all__ = ['Header'] diff --git a/pcapkit/protocols/misc/pcapng/__init__.py b/pcapkit/protocols/misc/pcapng/__init__.py new file mode 100644 index 0000000000..a2fbb05447 --- /dev/null +++ b/pcapkit/protocols/misc/pcapng/__init__.py @@ -0,0 +1,160 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""PCAP-NG File Format +========================= + +.. module:: pcapkit.protocols.misc.pcapng + +:mod:`pcapkit.protocols.misc.pcapng` holds the dissector, +:class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG`, in +:mod:`~pcapkit.protocols.misc.pcapng.protocol`, its header schema in +:mod:`~pcapkit.protocols.misc.pcapng.schema` and its data model in +:mod:`~pcapkit.protocols.misc.pcapng.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.misc.pcapng.protocol import PCAPNG + +# Header Schemas +from pcapkit.protocols.misc.pcapng.schema import PCAPNG as Schema_PCAPNG +from pcapkit.protocols.misc.pcapng.schema import BlockType as Schema_BlockType +from pcapkit.protocols.misc.pcapng.schema import CommentOption as Schema_CommentOption +from pcapkit.protocols.misc.pcapng.schema import CustomBlock as Schema_CustomBlock +from pcapkit.protocols.misc.pcapng.schema import CustomOption as Schema_CustomOption +from pcapkit.protocols.misc.pcapng.schema import \ + DecryptionSecretsBlock as Schema_DecryptionSecretsBlock +from pcapkit.protocols.misc.pcapng.schema import DSBSecrets as Schema_DSBSecrets +from pcapkit.protocols.misc.pcapng.schema import EndOfOption as Schema_EndOfOption +from pcapkit.protocols.misc.pcapng.schema import EndRecord as Schema_EndRecord +from pcapkit.protocols.misc.pcapng.schema import EnhancedPacketBlock as Schema_EnhancedPacketBlock +from pcapkit.protocols.misc.pcapng.schema import EPB_DropCountOption as Schema_EPB_DropCountOption +from pcapkit.protocols.misc.pcapng.schema import EPB_FlagsOption as Schema_EPB_FlagsOption +from pcapkit.protocols.misc.pcapng.schema import EPB_HashOption as Schema_EPB_HashOption +from pcapkit.protocols.misc.pcapng.schema import EPB_PacketIDOption as Schema_EPB_PacketIDOption +from pcapkit.protocols.misc.pcapng.schema import EPB_QueueOption as Schema_EPB_QueueOption +from pcapkit.protocols.misc.pcapng.schema import EPB_VerdictOption as Schema_EPB_VerdictOption +from pcapkit.protocols.misc.pcapng.schema import FlagsField as Schema_FlagsField +from pcapkit.protocols.misc.pcapng.schema import IF_DescriptionOption as Schema_IF_DescriptionOption +from pcapkit.protocols.misc.pcapng.schema import IF_EUIAddrOption as Schema_IF_EUIAddrOption +from pcapkit.protocols.misc.pcapng.schema import IF_FCSLenOption as Schema_IF_FCSLenOption +from pcapkit.protocols.misc.pcapng.schema import IF_FilterOption as Schema_IF_FilterOption +from pcapkit.protocols.misc.pcapng.schema import IF_HardwareOption as Schema_IF_HardwareOption +from pcapkit.protocols.misc.pcapng.schema import IF_IPv4AddrOption as Schema_IF_IPv4AddrOption +from pcapkit.protocols.misc.pcapng.schema import IF_IPv6AddrOption as Schema_IF_IPv6AddrOption +from pcapkit.protocols.misc.pcapng.schema import IF_MACAddrOption as Schema_IF_MACAddrOption +from pcapkit.protocols.misc.pcapng.schema import IF_NameOption as Schema_IF_NameOption +from pcapkit.protocols.misc.pcapng.schema import IF_OSOption as Schema_IF_OSOption +from pcapkit.protocols.misc.pcapng.schema import IF_RxSpeedOption as Schema_IF_RxSpeedOption +from pcapkit.protocols.misc.pcapng.schema import IF_SpeedOption as Schema_IF_SpeedOption +from pcapkit.protocols.misc.pcapng.schema import IF_TSOffsetOption as Schema_IF_TSOffsetOption +from pcapkit.protocols.misc.pcapng.schema import IF_TSResolOption as Schema_IF_TSResolOption +from pcapkit.protocols.misc.pcapng.schema import IF_TxSpeedOption as Schema_IF_TxSpeedOption +from pcapkit.protocols.misc.pcapng.schema import IF_TZoneOption as Schema_IF_TZoneOption +from pcapkit.protocols.misc.pcapng.schema import \ + InterfaceDescriptionBlock as Schema_InterfaceDescriptionBlock +from pcapkit.protocols.misc.pcapng.schema import \ + InterfaceStatisticsBlock as Schema_InterfaceStatisticsBlock +from pcapkit.protocols.misc.pcapng.schema import IPv4Record as Schema_IPv4Record +from pcapkit.protocols.misc.pcapng.schema import IPv6Record as Schema_IPv6Record +from pcapkit.protocols.misc.pcapng.schema import ISB_EndTimeOption as Schema_ISB_EndTimeOption +from pcapkit.protocols.misc.pcapng.schema import \ + ISB_FilterAcceptOption as Schema_ISB_FilterAcceptOption +from pcapkit.protocols.misc.pcapng.schema import ISB_IFDropOption as Schema_ISB_IFDropOption +from pcapkit.protocols.misc.pcapng.schema import ISB_IFRecvOption as Schema_ISB_IFRecvOption +from pcapkit.protocols.misc.pcapng.schema import ISB_OSDropOption as Schema_ISB_OSDropOption +from pcapkit.protocols.misc.pcapng.schema import ISB_StartTimeOption as Schema_ISB_StartTimeOption +from pcapkit.protocols.misc.pcapng.schema import ISB_UsrDelivOption as Schema_ISB_UsrDelivOption +from pcapkit.protocols.misc.pcapng.schema import NameResolutionBlock as Schema_NameResolutionBlock +from pcapkit.protocols.misc.pcapng.schema import NameResolutionRecord as Schema_NameResolutionRecord +from pcapkit.protocols.misc.pcapng.schema import NS_DNSIP4AddrOption as Schema_NS_DNSIP4AddrOption +from pcapkit.protocols.misc.pcapng.schema import NS_DNSIP6AddrOption as Schema_NS_DNSIP6AddrOption +from pcapkit.protocols.misc.pcapng.schema import NS_DNSNameOption as Schema_NS_DNSNameOption +from pcapkit.protocols.misc.pcapng.schema import Option as Schema_Option +from pcapkit.protocols.misc.pcapng.schema import OptionAreaField as Schema_OptionAreaField +from pcapkit.protocols.misc.pcapng.schema import OptionEnumField as Schema_OptionEnumField +from pcapkit.protocols.misc.pcapng.schema import PACK_FlagsOption as Schema_PACK_FlagsOption +from pcapkit.protocols.misc.pcapng.schema import PACK_HashOption as Schema_PACK_HashOption +from pcapkit.protocols.misc.pcapng.schema import PacketBlock as Schema_PacketBlock +from pcapkit.protocols.misc.pcapng.schema import SectionHeaderBlock as Schema_SectionHeaderBlock +from pcapkit.protocols.misc.pcapng.schema import SimplePacketBlock as Schema_SimplePacketBlock +from pcapkit.protocols.misc.pcapng.schema import \ + SystemdJournalExportBlock as Schema_SystemdJournalExportBlock +from pcapkit.protocols.misc.pcapng.schema import TLSKeyLog as Schema_TLSKeyLog +from pcapkit.protocols.misc.pcapng.schema import UnknownBlock as Schema_UnknownBlock +from pcapkit.protocols.misc.pcapng.schema import UnknownOption as Schema_UnknownOption +from pcapkit.protocols.misc.pcapng.schema import UnknownRecord as Schema_UnknownRecord +from pcapkit.protocols.misc.pcapng.schema import UnknownSecrets as Schema_UnknownSecrets +from pcapkit.protocols.misc.pcapng.schema import WireGuardKeyLog as Schema_WireGuardKeyLog +from pcapkit.protocols.misc.pcapng.schema import ZigBeeAPSKey as Schema_ZigBeeAPSKey +from pcapkit.protocols.misc.pcapng.schema import ZigBeeNWKKey as Schema_ZigBeeNWKKey + +# Data Models +from pcapkit.protocols.misc.pcapng.data import PCAPNG as Data_PCAPNG +from pcapkit.protocols.misc.pcapng.data import CommentOption as Data_CommentOption +from pcapkit.protocols.misc.pcapng.data import CustomBlock as Data_CustomBlock +from pcapkit.protocols.misc.pcapng.data import CustomOption as Data_CustomOption +from pcapkit.protocols.misc.pcapng.data import DecryptionSecretsBlock as Data_DecryptionSecretsBlock +from pcapkit.protocols.misc.pcapng.data import DSBSecrets as Data_DSBSecrets +from pcapkit.protocols.misc.pcapng.data import EndOfOption as Data_EndOfOption +from pcapkit.protocols.misc.pcapng.data import EndRecord as Data_EndRecord +from pcapkit.protocols.misc.pcapng.data import EnhancedPacketBlock as Data_EnhancedPacketBlock +from pcapkit.protocols.misc.pcapng.data import EPB_DropCountOption as Data_EPB_DropCountOption +from pcapkit.protocols.misc.pcapng.data import EPB_FlagsOption as Data_EPB_FlagsOption +from pcapkit.protocols.misc.pcapng.data import EPB_HashOption as Data_EPB_HashOption +from pcapkit.protocols.misc.pcapng.data import EPB_PacketIDOption as Data_EPB_PacketIDOption +from pcapkit.protocols.misc.pcapng.data import EPB_QueueOption as Data_EPB_QueueOption +from pcapkit.protocols.misc.pcapng.data import EPB_VerdictOption as Data_EPB_VerdictOption +from pcapkit.protocols.misc.pcapng.data import IF_DescriptionOption as Data_IF_DescriptionOption +from pcapkit.protocols.misc.pcapng.data import IF_EUIAddrOption as Data_IF_EUIAddrOption +from pcapkit.protocols.misc.pcapng.data import IF_FCSLenOption as Data_IF_FCSLenOption +from pcapkit.protocols.misc.pcapng.data import IF_FilterOption as Data_IF_FilterOption +from pcapkit.protocols.misc.pcapng.data import IF_HardwareOption as Data_IF_HardwareOption +from pcapkit.protocols.misc.pcapng.data import IF_IPv4AddrOption as Data_IF_IPv4AddrOption +from pcapkit.protocols.misc.pcapng.data import IF_IPv6AddrOption as Data_IF_IPv6AddrOption +from pcapkit.protocols.misc.pcapng.data import IF_MACAddrOption as Data_IF_MACAddrOption +from pcapkit.protocols.misc.pcapng.data import IF_NameOption as Data_IF_NameOption +from pcapkit.protocols.misc.pcapng.data import IF_OSOption as Data_IF_OSOption +from pcapkit.protocols.misc.pcapng.data import IF_RxSpeedOption as Data_IF_RxSpeedOption +from pcapkit.protocols.misc.pcapng.data import IF_SpeedOption as Data_IF_SpeedOption +from pcapkit.protocols.misc.pcapng.data import IF_TSOffsetOption as Data_IF_TSOffsetOption +from pcapkit.protocols.misc.pcapng.data import IF_TSResolOption as Data_IF_TSResolOption +from pcapkit.protocols.misc.pcapng.data import IF_TxSpeedOption as Data_IF_TxSpeedOption +from pcapkit.protocols.misc.pcapng.data import IF_TZoneOption as Data_IF_TZoneOption +from pcapkit.protocols.misc.pcapng.data import \ + InterfaceDescriptionBlock as Data_InterfaceDescriptionBlock +from pcapkit.protocols.misc.pcapng.data import \ + InterfaceStatisticsBlock as Data_InterfaceStatisticsBlock +from pcapkit.protocols.misc.pcapng.data import IPv4Record as Data_IPv4Record +from pcapkit.protocols.misc.pcapng.data import IPv6Record as Data_IPv6Record +from pcapkit.protocols.misc.pcapng.data import ISB_EndTimeOption as Data_ISB_EndTimeOption +from pcapkit.protocols.misc.pcapng.data import ISB_FilterAcceptOption as Data_ISB_FilterAcceptOption +from pcapkit.protocols.misc.pcapng.data import ISB_IFDropOption as Data_ISB_IFDropOption +from pcapkit.protocols.misc.pcapng.data import ISB_IFRecvOption as Data_ISB_IFRecvOption +from pcapkit.protocols.misc.pcapng.data import ISB_OSDropOption as Data_ISB_OSDropOption +from pcapkit.protocols.misc.pcapng.data import ISB_StartTimeOption as Data_ISB_StartTimeOption +from pcapkit.protocols.misc.pcapng.data import ISB_UsrDelivOption as Data_ISB_UsrDelivOption +from pcapkit.protocols.misc.pcapng.data import NameResolutionBlock as Data_NameResolutionBlock +from pcapkit.protocols.misc.pcapng.data import NameResolutionRecord as Data_NameResolutionRecord +from pcapkit.protocols.misc.pcapng.data import NS_DNSIP4AddrOption as Data_NS_DNSIP4AddrOption +from pcapkit.protocols.misc.pcapng.data import NS_DNSIP6AddrOption as Data_NS_DNSIP6AddrOption +from pcapkit.protocols.misc.pcapng.data import NS_DNSNameOption as Data_NS_DNSNameOption +from pcapkit.protocols.misc.pcapng.data import Option as Data_Option +from pcapkit.protocols.misc.pcapng.data import PACK_FlagsOption as Data_PACK_FlagsOption +from pcapkit.protocols.misc.pcapng.data import PACK_HashOption as Data_PACK_HashOption +from pcapkit.protocols.misc.pcapng.data import PacketBlock as Data_PacketBlock +from pcapkit.protocols.misc.pcapng.data import SectionHeaderBlock as Data_SectionHeaderBlock +from pcapkit.protocols.misc.pcapng.data import SimplePacketBlock as Data_SimplePacketBlock +from pcapkit.protocols.misc.pcapng.data import \ + SystemdJournalExportBlock as Data_SystemdJournalExportBlock +from pcapkit.protocols.misc.pcapng.data import TLSKeyLog as Data_TLSKeyLog +from pcapkit.protocols.misc.pcapng.data import TLSKeyLogEntries as Data_TLSKeyLogEntries +from pcapkit.protocols.misc.pcapng.data import UnknownBlock as Data_UnknownBlock +from pcapkit.protocols.misc.pcapng.data import UnknownOption as Data_UnknownOption +from pcapkit.protocols.misc.pcapng.data import UnknownRecord as Data_UnknownRecord +from pcapkit.protocols.misc.pcapng.data import UnknownSecrets as Data_UnknownSecrets +from pcapkit.protocols.misc.pcapng.data import WireGuardKeyLog as Data_WireGuardKeyLog +from pcapkit.protocols.misc.pcapng.data import ZigBeeAPSKey as Data_ZigBeeAPSKey +from pcapkit.protocols.misc.pcapng.data import ZigBeeNWKKey as Data_ZigBeeNWKKey + +__all__ = ['PCAPNG'] diff --git a/pcapkit/protocols/data/misc/pcapng.py b/pcapkit/protocols/misc/pcapng/data.py similarity index 99% rename from pcapkit/protocols/data/misc/pcapng.py rename to pcapkit/protocols/misc/pcapng/data.py index 8137911dff..021d67bbd4 100644 --- a/pcapkit/protocols/data/misc/pcapng.py +++ b/pcapkit/protocols/misc/pcapng/data.py @@ -8,8 +8,7 @@ from pcapkit.corekit.infoclass import info_final from pcapkit.corekit.multidict import MultiDict -from pcapkit.protocols.data.data import Data -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Data, Protocol from pcapkit.utilities.compat import localcontext __all__ = [ @@ -61,7 +60,8 @@ from pcapkit.corekit.infoclass import MultiInfo, OrderedMultiInfo from pcapkit.corekit.multidict import OrderedMultiDict from pcapkit.corekit.version import VersionInfo - from pcapkit.protocols.misc.pcapng import PacketDirection, PacketReception, WireGuardKeyLabel + from pcapkit.protocols.misc.pcapng.protocol import (PacketDirection, PacketReception, + WireGuardKeyLabel) class PCAPNG(Protocol): diff --git a/pcapkit/protocols/misc/pcapng.py b/pcapkit/protocols/misc/pcapng/protocol.py similarity index 93% rename from pcapkit/protocols/misc/pcapng.py rename to pcapkit/protocols/misc/pcapng/protocol.py index 45c6536630..e9feb7e599 100644 --- a/pcapkit/protocols/misc/pcapng.py +++ b/pcapkit/protocols/misc/pcapng/protocol.py @@ -3,14 +3,14 @@ """PCAP-NG File Format ========================= -.. module:: pcapkit.protocols.misc.pcapng +.. module:: pcapkit.protocols.misc.pcapng.protocol -:mod:`pcapkit.protocols.misc.pcapng` contains -:class:`~pcapkit.protocols.misc.pcapng.PCAPNG`, +:mod:`pcapkit.protocols.misc.pcapng.protocol` contains +:class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG`, which implements an extractor for PCAP-NG file format [*]_, and the -:class:`~pcapkit.protocols.misc.pcapng.PacketDirection`, -:class:`~pcapkit.protocols.misc.pcapng.PacketReception` and -:class:`~pcapkit.protocols.misc.pcapng.WireGuardKeyLabel` enumerations. +:class:`~pcapkit.protocols.misc.pcapng.protocol.PacketDirection`, +:class:`~pcapkit.protocols.misc.pcapng.protocol.PacketReception` and +:class:`~pcapkit.protocols.misc.pcapng.protocol.WireGuardKeyLabel` enumerations. .. [*] https://www.ietf.org/archive/id/draft-tuexen-opsawg-pcapng-03.html @@ -71,146 +71,146 @@ from pcapkit.corekit.schema.byteorder import packet_byteorder from pcapkit.corekit.schema.padding import pad_length from pcapkit.corekit.version import VersionInfo -from pcapkit.protocols.data.misc.pcapng import PCAPNG as Data_PCAPNG -from pcapkit.protocols.data.misc.pcapng import CommentOption as Data_CommentOption -from pcapkit.protocols.data.misc.pcapng import CustomBlock as Data_CustomBlock -from pcapkit.protocols.data.misc.pcapng import CustomOption as Data_CustomOption -from pcapkit.protocols.data.misc.pcapng import DecryptionSecretsBlock as Data_DecryptionSecretsBlock -from pcapkit.protocols.data.misc.pcapng import DSBSecrets as Data_DSBSecrets -from pcapkit.protocols.data.misc.pcapng import EndOfOption as Data_EndOfOption -from pcapkit.protocols.data.misc.pcapng import EndRecord as Data_EndRecord -from pcapkit.protocols.data.misc.pcapng import EnhancedPacketBlock as Data_EnhancedPacketBlock -from pcapkit.protocols.data.misc.pcapng import EPB_DropCountOption as Data_EPB_DropCountOption -from pcapkit.protocols.data.misc.pcapng import EPB_FlagsOption as Data_EPB_FlagsOption -from pcapkit.protocols.data.misc.pcapng import EPB_HashOption as Data_EPB_HashOption -from pcapkit.protocols.data.misc.pcapng import EPB_PacketIDOption as Data_EPB_PacketIDOption -from pcapkit.protocols.data.misc.pcapng import EPB_QueueOption as Data_EPB_QueueOption -from pcapkit.protocols.data.misc.pcapng import EPB_VerdictOption as Data_EPB_VerdictOption -from pcapkit.protocols.data.misc.pcapng import IF_DescriptionOption as Data_IF_DescriptionOption -from pcapkit.protocols.data.misc.pcapng import IF_EUIAddrOption as Data_IF_EUIAddrOption -from pcapkit.protocols.data.misc.pcapng import IF_FCSLenOption as Data_IF_FCSLenOption -from pcapkit.protocols.data.misc.pcapng import IF_FilterOption as Data_IF_FilterOption -from pcapkit.protocols.data.misc.pcapng import IF_HardwareOption as Data_IF_HardwareOption -from pcapkit.protocols.data.misc.pcapng import IF_IPv4AddrOption as Data_IF_IPv4AddrOption -from pcapkit.protocols.data.misc.pcapng import IF_IPv6AddrOption as Data_IF_IPv6AddrOption -from pcapkit.protocols.data.misc.pcapng import IF_MACAddrOption as Data_IF_MACAddrOption -from pcapkit.protocols.data.misc.pcapng import IF_NameOption as Data_IF_NameOption -from pcapkit.protocols.data.misc.pcapng import IF_OSOption as Data_IF_OSOption -from pcapkit.protocols.data.misc.pcapng import IF_RxSpeedOption as Data_IF_RxSpeedOption -from pcapkit.protocols.data.misc.pcapng import IF_SpeedOption as Data_IF_SpeedOption -from pcapkit.protocols.data.misc.pcapng import IF_TSOffsetOption as Data_IF_TSOffsetOption -from pcapkit.protocols.data.misc.pcapng import IF_TSResolOption as Data_IF_TSResolOption -from pcapkit.protocols.data.misc.pcapng import IF_TxSpeedOption as Data_IF_TxSpeedOption -from pcapkit.protocols.data.misc.pcapng import IF_TZoneOption as Data_IF_TZoneOption -from pcapkit.protocols.data.misc.pcapng import \ +from pcapkit.protocols.data import Packet as Data_Packet +from pcapkit.protocols.misc.pcap.header.schema import RESOLUTION +from pcapkit.protocols.misc.pcapng.data import PCAPNG as Data_PCAPNG +from pcapkit.protocols.misc.pcapng.data import CommentOption as Data_CommentOption +from pcapkit.protocols.misc.pcapng.data import CustomBlock as Data_CustomBlock +from pcapkit.protocols.misc.pcapng.data import CustomOption as Data_CustomOption +from pcapkit.protocols.misc.pcapng.data import DecryptionSecretsBlock as Data_DecryptionSecretsBlock +from pcapkit.protocols.misc.pcapng.data import DSBSecrets as Data_DSBSecrets +from pcapkit.protocols.misc.pcapng.data import EndOfOption as Data_EndOfOption +from pcapkit.protocols.misc.pcapng.data import EndRecord as Data_EndRecord +from pcapkit.protocols.misc.pcapng.data import EnhancedPacketBlock as Data_EnhancedPacketBlock +from pcapkit.protocols.misc.pcapng.data import EPB_DropCountOption as Data_EPB_DropCountOption +from pcapkit.protocols.misc.pcapng.data import EPB_FlagsOption as Data_EPB_FlagsOption +from pcapkit.protocols.misc.pcapng.data import EPB_HashOption as Data_EPB_HashOption +from pcapkit.protocols.misc.pcapng.data import EPB_PacketIDOption as Data_EPB_PacketIDOption +from pcapkit.protocols.misc.pcapng.data import EPB_QueueOption as Data_EPB_QueueOption +from pcapkit.protocols.misc.pcapng.data import EPB_VerdictOption as Data_EPB_VerdictOption +from pcapkit.protocols.misc.pcapng.data import IF_DescriptionOption as Data_IF_DescriptionOption +from pcapkit.protocols.misc.pcapng.data import IF_EUIAddrOption as Data_IF_EUIAddrOption +from pcapkit.protocols.misc.pcapng.data import IF_FCSLenOption as Data_IF_FCSLenOption +from pcapkit.protocols.misc.pcapng.data import IF_FilterOption as Data_IF_FilterOption +from pcapkit.protocols.misc.pcapng.data import IF_HardwareOption as Data_IF_HardwareOption +from pcapkit.protocols.misc.pcapng.data import IF_IPv4AddrOption as Data_IF_IPv4AddrOption +from pcapkit.protocols.misc.pcapng.data import IF_IPv6AddrOption as Data_IF_IPv6AddrOption +from pcapkit.protocols.misc.pcapng.data import IF_MACAddrOption as Data_IF_MACAddrOption +from pcapkit.protocols.misc.pcapng.data import IF_NameOption as Data_IF_NameOption +from pcapkit.protocols.misc.pcapng.data import IF_OSOption as Data_IF_OSOption +from pcapkit.protocols.misc.pcapng.data import IF_RxSpeedOption as Data_IF_RxSpeedOption +from pcapkit.protocols.misc.pcapng.data import IF_SpeedOption as Data_IF_SpeedOption +from pcapkit.protocols.misc.pcapng.data import IF_TSOffsetOption as Data_IF_TSOffsetOption +from pcapkit.protocols.misc.pcapng.data import IF_TSResolOption as Data_IF_TSResolOption +from pcapkit.protocols.misc.pcapng.data import IF_TxSpeedOption as Data_IF_TxSpeedOption +from pcapkit.protocols.misc.pcapng.data import IF_TZoneOption as Data_IF_TZoneOption +from pcapkit.protocols.misc.pcapng.data import \ InterfaceDescriptionBlock as Data_InterfaceDescriptionBlock -from pcapkit.protocols.data.misc.pcapng import \ +from pcapkit.protocols.misc.pcapng.data import \ InterfaceStatisticsBlock as Data_InterfaceStatisticsBlock -from pcapkit.protocols.data.misc.pcapng import IPv4Record as Data_IPv4Record -from pcapkit.protocols.data.misc.pcapng import IPv6Record as Data_IPv6Record -from pcapkit.protocols.data.misc.pcapng import ISB_EndTimeOption as Data_ISB_EndTimeOption -from pcapkit.protocols.data.misc.pcapng import ISB_FilterAcceptOption as Data_ISB_FilterAcceptOption -from pcapkit.protocols.data.misc.pcapng import ISB_IFDropOption as Data_ISB_IFDropOption -from pcapkit.protocols.data.misc.pcapng import ISB_IFRecvOption as Data_ISB_IFRecvOption -from pcapkit.protocols.data.misc.pcapng import ISB_OSDropOption as Data_ISB_OSDropOption -from pcapkit.protocols.data.misc.pcapng import ISB_StartTimeOption as Data_ISB_StartTimeOption -from pcapkit.protocols.data.misc.pcapng import ISB_UsrDelivOption as Data_ISB_UsrDelivOption -from pcapkit.protocols.data.misc.pcapng import NameResolutionBlock as Data_NameResolutionBlock -from pcapkit.protocols.data.misc.pcapng import NameResolutionRecord as Data_NameResolutionRecord -from pcapkit.protocols.data.misc.pcapng import NS_DNSIP4AddrOption as Data_NS_DNSIP4AddrOption -from pcapkit.protocols.data.misc.pcapng import NS_DNSIP6AddrOption as Data_NS_DNSIP6AddrOption -from pcapkit.protocols.data.misc.pcapng import NS_DNSNameOption as Data_NS_DNSNameOption -from pcapkit.protocols.data.misc.pcapng import Option as Data_Option -from pcapkit.protocols.data.misc.pcapng import PACK_FlagsOption as Data_PACK_FlagsOption -from pcapkit.protocols.data.misc.pcapng import PACK_HashOption as Data_PACK_HashOption -from pcapkit.protocols.data.misc.pcapng import PacketBlock as Data_PacketBlock -from pcapkit.protocols.data.misc.pcapng import SectionHeaderBlock as Data_SectionHeaderBlock -from pcapkit.protocols.data.misc.pcapng import SimplePacketBlock as Data_SimplePacketBlock -from pcapkit.protocols.data.misc.pcapng import \ +from pcapkit.protocols.misc.pcapng.data import IPv4Record as Data_IPv4Record +from pcapkit.protocols.misc.pcapng.data import IPv6Record as Data_IPv6Record +from pcapkit.protocols.misc.pcapng.data import ISB_EndTimeOption as Data_ISB_EndTimeOption +from pcapkit.protocols.misc.pcapng.data import ISB_FilterAcceptOption as Data_ISB_FilterAcceptOption +from pcapkit.protocols.misc.pcapng.data import ISB_IFDropOption as Data_ISB_IFDropOption +from pcapkit.protocols.misc.pcapng.data import ISB_IFRecvOption as Data_ISB_IFRecvOption +from pcapkit.protocols.misc.pcapng.data import ISB_OSDropOption as Data_ISB_OSDropOption +from pcapkit.protocols.misc.pcapng.data import ISB_StartTimeOption as Data_ISB_StartTimeOption +from pcapkit.protocols.misc.pcapng.data import ISB_UsrDelivOption as Data_ISB_UsrDelivOption +from pcapkit.protocols.misc.pcapng.data import NameResolutionBlock as Data_NameResolutionBlock +from pcapkit.protocols.misc.pcapng.data import NameResolutionRecord as Data_NameResolutionRecord +from pcapkit.protocols.misc.pcapng.data import NS_DNSIP4AddrOption as Data_NS_DNSIP4AddrOption +from pcapkit.protocols.misc.pcapng.data import NS_DNSIP6AddrOption as Data_NS_DNSIP6AddrOption +from pcapkit.protocols.misc.pcapng.data import NS_DNSNameOption as Data_NS_DNSNameOption +from pcapkit.protocols.misc.pcapng.data import Option as Data_Option +from pcapkit.protocols.misc.pcapng.data import PACK_FlagsOption as Data_PACK_FlagsOption +from pcapkit.protocols.misc.pcapng.data import PACK_HashOption as Data_PACK_HashOption +from pcapkit.protocols.misc.pcapng.data import PacketBlock as Data_PacketBlock +from pcapkit.protocols.misc.pcapng.data import SectionHeaderBlock as Data_SectionHeaderBlock +from pcapkit.protocols.misc.pcapng.data import SimplePacketBlock as Data_SimplePacketBlock +from pcapkit.protocols.misc.pcapng.data import \ SystemdJournalExportBlock as Data_SystemdJournalExportBlock -from pcapkit.protocols.data.misc.pcapng import TLSKeyLog as Data_TLSKeyLog -from pcapkit.protocols.data.misc.pcapng import TLSKeyLogEntries as Data_TLSKeyLogEntries -from pcapkit.protocols.data.misc.pcapng import UnknownBlock as Data_UnknownBlock -from pcapkit.protocols.data.misc.pcapng import UnknownOption as Data_UnknownOption -from pcapkit.protocols.data.misc.pcapng import UnknownRecord as Data_UnknownRecord -from pcapkit.protocols.data.misc.pcapng import UnknownSecrets as Data_UnknownSecrets -from pcapkit.protocols.data.misc.pcapng import WireGuardKeyLog as Data_WireGuardKeyLog -from pcapkit.protocols.data.misc.pcapng import ZigBeeAPSKey as Data_ZigBeeAPSKey -from pcapkit.protocols.data.misc.pcapng import ZigBeeNWKKey as Data_ZigBeeNWKKey -from pcapkit.protocols.data.protocol import Packet as Data_Packet -from pcapkit.protocols.protocol import ProtocolBase -from pcapkit.protocols.schema.misc.pcap.header import RESOLUTION -from pcapkit.protocols.schema.misc.pcapng import (BLOCK_MINIMUM, BYTE_ORDER_MAGIC, +from pcapkit.protocols.misc.pcapng.data import TLSKeyLog as Data_TLSKeyLog +from pcapkit.protocols.misc.pcapng.data import TLSKeyLogEntries as Data_TLSKeyLogEntries +from pcapkit.protocols.misc.pcapng.data import UnknownBlock as Data_UnknownBlock +from pcapkit.protocols.misc.pcapng.data import UnknownOption as Data_UnknownOption +from pcapkit.protocols.misc.pcapng.data import UnknownRecord as Data_UnknownRecord +from pcapkit.protocols.misc.pcapng.data import UnknownSecrets as Data_UnknownSecrets +from pcapkit.protocols.misc.pcapng.data import WireGuardKeyLog as Data_WireGuardKeyLog +from pcapkit.protocols.misc.pcapng.data import ZigBeeAPSKey as Data_ZigBeeAPSKey +from pcapkit.protocols.misc.pcapng.data import ZigBeeNWKKey as Data_ZigBeeNWKKey +from pcapkit.protocols.misc.pcapng.schema import (BLOCK_MINIMUM, BYTE_ORDER_MAGIC, DEFAULT_RESOLUTION, GENERIC_BLOCK_MINIMUM) -from pcapkit.protocols.schema.misc.pcapng import PCAPNG as Schema_PCAPNG -from pcapkit.protocols.schema.misc.pcapng import BlockType as Schema_BlockType -from pcapkit.protocols.schema.misc.pcapng import CommentOption as Schema_CommentOption -from pcapkit.protocols.schema.misc.pcapng import CustomBlock as Schema_CustomBlock -from pcapkit.protocols.schema.misc.pcapng import CustomOption as Schema_CustomOption -from pcapkit.protocols.schema.misc.pcapng import \ +from pcapkit.protocols.misc.pcapng.schema import PCAPNG as Schema_PCAPNG +from pcapkit.protocols.misc.pcapng.schema import BlockType as Schema_BlockType +from pcapkit.protocols.misc.pcapng.schema import CommentOption as Schema_CommentOption +from pcapkit.protocols.misc.pcapng.schema import CustomBlock as Schema_CustomBlock +from pcapkit.protocols.misc.pcapng.schema import CustomOption as Schema_CustomOption +from pcapkit.protocols.misc.pcapng.schema import \ DecryptionSecretsBlock as Schema_DecryptionSecretsBlock -from pcapkit.protocols.schema.misc.pcapng import DSBSecrets as Schema_DSBSecrets -from pcapkit.protocols.schema.misc.pcapng import EndOfOption as Schema_EndOfOption -from pcapkit.protocols.schema.misc.pcapng import EndRecord as Schema_EndRecord -from pcapkit.protocols.schema.misc.pcapng import EnhancedPacketBlock as Schema_EnhancedPacketBlock -from pcapkit.protocols.schema.misc.pcapng import EPB_DropCountOption as Schema_EPB_DropCountOption -from pcapkit.protocols.schema.misc.pcapng import EPB_FlagsOption as Schema_EPB_FlagsOption -from pcapkit.protocols.schema.misc.pcapng import EPB_HashOption as Schema_EPB_HashOption -from pcapkit.protocols.schema.misc.pcapng import EPB_PacketIDOption as Schema_EPB_PacketIDOption -from pcapkit.protocols.schema.misc.pcapng import EPB_QueueOption as Schema_EPB_QueueOption -from pcapkit.protocols.schema.misc.pcapng import EPB_VerdictOption as Schema_EPB_VerdictOption -from pcapkit.protocols.schema.misc.pcapng import IF_DescriptionOption as Schema_IF_DescriptionOption -from pcapkit.protocols.schema.misc.pcapng import IF_EUIAddrOption as Schema_IF_EUIAddrOption -from pcapkit.protocols.schema.misc.pcapng import IF_FCSLenOption as Schema_IF_FCSLenOption -from pcapkit.protocols.schema.misc.pcapng import IF_FilterOption as Schema_IF_FilterOption -from pcapkit.protocols.schema.misc.pcapng import IF_HardwareOption as Schema_IF_HardwareOption -from pcapkit.protocols.schema.misc.pcapng import IF_IPv4AddrOption as Schema_IF_IPv4AddrOption -from pcapkit.protocols.schema.misc.pcapng import IF_IPv6AddrOption as Schema_IF_IPv6AddrOption -from pcapkit.protocols.schema.misc.pcapng import IF_MACAddrOption as Schema_IF_MACAddrOption -from pcapkit.protocols.schema.misc.pcapng import IF_NameOption as Schema_IF_NameOption -from pcapkit.protocols.schema.misc.pcapng import IF_OSOption as Schema_IF_OSOption -from pcapkit.protocols.schema.misc.pcapng import IF_RxSpeedOption as Schema_IF_RxSpeedOption -from pcapkit.protocols.schema.misc.pcapng import IF_SpeedOption as Schema_IF_SpeedOption -from pcapkit.protocols.schema.misc.pcapng import IF_TSOffsetOption as Schema_IF_TSOffsetOption -from pcapkit.protocols.schema.misc.pcapng import IF_TSResolOption as Schema_IF_TSResolOption -from pcapkit.protocols.schema.misc.pcapng import IF_TxSpeedOption as Schema_IF_TxSpeedOption -from pcapkit.protocols.schema.misc.pcapng import IF_TZoneOption as Schema_IF_TZoneOption -from pcapkit.protocols.schema.misc.pcapng import \ +from pcapkit.protocols.misc.pcapng.schema import DSBSecrets as Schema_DSBSecrets +from pcapkit.protocols.misc.pcapng.schema import EndOfOption as Schema_EndOfOption +from pcapkit.protocols.misc.pcapng.schema import EndRecord as Schema_EndRecord +from pcapkit.protocols.misc.pcapng.schema import EnhancedPacketBlock as Schema_EnhancedPacketBlock +from pcapkit.protocols.misc.pcapng.schema import EPB_DropCountOption as Schema_EPB_DropCountOption +from pcapkit.protocols.misc.pcapng.schema import EPB_FlagsOption as Schema_EPB_FlagsOption +from pcapkit.protocols.misc.pcapng.schema import EPB_HashOption as Schema_EPB_HashOption +from pcapkit.protocols.misc.pcapng.schema import EPB_PacketIDOption as Schema_EPB_PacketIDOption +from pcapkit.protocols.misc.pcapng.schema import EPB_QueueOption as Schema_EPB_QueueOption +from pcapkit.protocols.misc.pcapng.schema import EPB_VerdictOption as Schema_EPB_VerdictOption +from pcapkit.protocols.misc.pcapng.schema import IF_DescriptionOption as Schema_IF_DescriptionOption +from pcapkit.protocols.misc.pcapng.schema import IF_EUIAddrOption as Schema_IF_EUIAddrOption +from pcapkit.protocols.misc.pcapng.schema import IF_FCSLenOption as Schema_IF_FCSLenOption +from pcapkit.protocols.misc.pcapng.schema import IF_FilterOption as Schema_IF_FilterOption +from pcapkit.protocols.misc.pcapng.schema import IF_HardwareOption as Schema_IF_HardwareOption +from pcapkit.protocols.misc.pcapng.schema import IF_IPv4AddrOption as Schema_IF_IPv4AddrOption +from pcapkit.protocols.misc.pcapng.schema import IF_IPv6AddrOption as Schema_IF_IPv6AddrOption +from pcapkit.protocols.misc.pcapng.schema import IF_MACAddrOption as Schema_IF_MACAddrOption +from pcapkit.protocols.misc.pcapng.schema import IF_NameOption as Schema_IF_NameOption +from pcapkit.protocols.misc.pcapng.schema import IF_OSOption as Schema_IF_OSOption +from pcapkit.protocols.misc.pcapng.schema import IF_RxSpeedOption as Schema_IF_RxSpeedOption +from pcapkit.protocols.misc.pcapng.schema import IF_SpeedOption as Schema_IF_SpeedOption +from pcapkit.protocols.misc.pcapng.schema import IF_TSOffsetOption as Schema_IF_TSOffsetOption +from pcapkit.protocols.misc.pcapng.schema import IF_TSResolOption as Schema_IF_TSResolOption +from pcapkit.protocols.misc.pcapng.schema import IF_TxSpeedOption as Schema_IF_TxSpeedOption +from pcapkit.protocols.misc.pcapng.schema import IF_TZoneOption as Schema_IF_TZoneOption +from pcapkit.protocols.misc.pcapng.schema import \ InterfaceDescriptionBlock as Schema_InterfaceDescriptionBlock -from pcapkit.protocols.schema.misc.pcapng import \ +from pcapkit.protocols.misc.pcapng.schema import \ InterfaceStatisticsBlock as Schema_InterfaceStatisticsBlock -from pcapkit.protocols.schema.misc.pcapng import IPv4Record as Schema_IPv4Record -from pcapkit.protocols.schema.misc.pcapng import IPv6Record as Schema_IPv6Record -from pcapkit.protocols.schema.misc.pcapng import ISB_EndTimeOption as Schema_ISB_EndTimeOption -from pcapkit.protocols.schema.misc.pcapng import \ +from pcapkit.protocols.misc.pcapng.schema import IPv4Record as Schema_IPv4Record +from pcapkit.protocols.misc.pcapng.schema import IPv6Record as Schema_IPv6Record +from pcapkit.protocols.misc.pcapng.schema import ISB_EndTimeOption as Schema_ISB_EndTimeOption +from pcapkit.protocols.misc.pcapng.schema import \ ISB_FilterAcceptOption as Schema_ISB_FilterAcceptOption -from pcapkit.protocols.schema.misc.pcapng import ISB_IFDropOption as Schema_ISB_IFDropOption -from pcapkit.protocols.schema.misc.pcapng import ISB_IFRecvOption as Schema_ISB_IFRecvOption -from pcapkit.protocols.schema.misc.pcapng import ISB_OSDropOption as Schema_ISB_OSDropOption -from pcapkit.protocols.schema.misc.pcapng import ISB_StartTimeOption as Schema_ISB_StartTimeOption -from pcapkit.protocols.schema.misc.pcapng import ISB_UsrDelivOption as Schema_ISB_UsrDelivOption -from pcapkit.protocols.schema.misc.pcapng import NameResolutionBlock as Schema_NameResolutionBlock -from pcapkit.protocols.schema.misc.pcapng import NameResolutionRecord as Schema_NameResolutionRecord -from pcapkit.protocols.schema.misc.pcapng import NS_DNSIP4AddrOption as Schema_NS_DNSIP4AddrOption -from pcapkit.protocols.schema.misc.pcapng import NS_DNSIP6AddrOption as Schema_NS_DNSIP6AddrOption -from pcapkit.protocols.schema.misc.pcapng import NS_DNSNameOption as Schema_NS_DNSNameOption -from pcapkit.protocols.schema.misc.pcapng import PACK_FlagsOption as Schema_PACK_FlagsOption -from pcapkit.protocols.schema.misc.pcapng import PACK_HashOption as Schema_PACK_HashOption -from pcapkit.protocols.schema.misc.pcapng import PacketBlock as Schema_PacketBlock -from pcapkit.protocols.schema.misc.pcapng import SectionHeaderBlock as Schema_SectionHeaderBlock -from pcapkit.protocols.schema.misc.pcapng import SimplePacketBlock as Schema_SimplePacketBlock -from pcapkit.protocols.schema.misc.pcapng import \ +from pcapkit.protocols.misc.pcapng.schema import ISB_IFDropOption as Schema_ISB_IFDropOption +from pcapkit.protocols.misc.pcapng.schema import ISB_IFRecvOption as Schema_ISB_IFRecvOption +from pcapkit.protocols.misc.pcapng.schema import ISB_OSDropOption as Schema_ISB_OSDropOption +from pcapkit.protocols.misc.pcapng.schema import ISB_StartTimeOption as Schema_ISB_StartTimeOption +from pcapkit.protocols.misc.pcapng.schema import ISB_UsrDelivOption as Schema_ISB_UsrDelivOption +from pcapkit.protocols.misc.pcapng.schema import NameResolutionBlock as Schema_NameResolutionBlock +from pcapkit.protocols.misc.pcapng.schema import NameResolutionRecord as Schema_NameResolutionRecord +from pcapkit.protocols.misc.pcapng.schema import NS_DNSIP4AddrOption as Schema_NS_DNSIP4AddrOption +from pcapkit.protocols.misc.pcapng.schema import NS_DNSIP6AddrOption as Schema_NS_DNSIP6AddrOption +from pcapkit.protocols.misc.pcapng.schema import NS_DNSNameOption as Schema_NS_DNSNameOption +from pcapkit.protocols.misc.pcapng.schema import PACK_FlagsOption as Schema_PACK_FlagsOption +from pcapkit.protocols.misc.pcapng.schema import PACK_HashOption as Schema_PACK_HashOption +from pcapkit.protocols.misc.pcapng.schema import PacketBlock as Schema_PacketBlock +from pcapkit.protocols.misc.pcapng.schema import SectionHeaderBlock as Schema_SectionHeaderBlock +from pcapkit.protocols.misc.pcapng.schema import SimplePacketBlock as Schema_SimplePacketBlock +from pcapkit.protocols.misc.pcapng.schema import \ SystemdJournalExportBlock as Schema_SystemdJournalExportBlock -from pcapkit.protocols.schema.misc.pcapng import TLSKeyLog as Schema_TLSKeyLog -from pcapkit.protocols.schema.misc.pcapng import UnknownBlock as Schema_UnknownBlock -from pcapkit.protocols.schema.misc.pcapng import UnknownOption as Schema_UnknownOption -from pcapkit.protocols.schema.misc.pcapng import UnknownRecord as Schema_UnknownRecord -from pcapkit.protocols.schema.misc.pcapng import UnknownSecrets as Schema_UnknownSecrets -from pcapkit.protocols.schema.misc.pcapng import WireGuardKeyLog as Schema_WireGuardKeyLog -from pcapkit.protocols.schema.misc.pcapng import ZigBeeAPSKey as Schema_ZigBeeAPSKey -from pcapkit.protocols.schema.misc.pcapng import ZigBeeNWKKey as Schema_ZigBeeNWKKey -from pcapkit.protocols.schema.misc.pcapng import zigbee_key_held -from pcapkit.protocols.schema.schema import Schema +from pcapkit.protocols.misc.pcapng.schema import TLSKeyLog as Schema_TLSKeyLog +from pcapkit.protocols.misc.pcapng.schema import UnknownBlock as Schema_UnknownBlock +from pcapkit.protocols.misc.pcapng.schema import UnknownOption as Schema_UnknownOption +from pcapkit.protocols.misc.pcapng.schema import UnknownRecord as Schema_UnknownRecord +from pcapkit.protocols.misc.pcapng.schema import UnknownSecrets as Schema_UnknownSecrets +from pcapkit.protocols.misc.pcapng.schema import WireGuardKeyLog as Schema_WireGuardKeyLog +from pcapkit.protocols.misc.pcapng.schema import ZigBeeAPSKey as Schema_ZigBeeAPSKey +from pcapkit.protocols.misc.pcapng.schema import ZigBeeNWKKey as Schema_ZigBeeNWKKey +from pcapkit.protocols.misc.pcapng.schema import zigbee_key_held +from pcapkit.protocols.protocol import ProtocolBase +from pcapkit.protocols.schema import Schema from pcapkit.utilities.compat import StrEnum, localcontext from pcapkit.utilities.contextvars import frame_length from pcapkit.utilities.datetime import fromtimestamp, totimestamp @@ -234,8 +234,8 @@ from pcapkit.corekit.enum import EnumRegistry from pcapkit.foundation.engines.pcapng import Context - from pcapkit.protocols.schema.misc.pcapng import Option as Schema_Option - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.misc.pcapng.schema import Option as Schema_Option + from pcapkit.protocols.schema import Schema Packet = Union[Data_EnhancedPacketBlock, Data_SimplePacketBlock, Data_PacketBlock] Option = OrderedMultiDict[Enum_OptionType, Data_Option] @@ -346,7 +346,7 @@ def _block_type_name(block_type: 'Enum_BlockType | int') -> 'str': ``block_type`` is looked up rather than having its :attr:`~enum.Enum.name` read directly, because :attr:`PCAPNG._type ` is not always a member on the make path (:issue:`2301`). - :meth:`PCAPNG.make ` assigns + :meth:`PCAPNG.make ` assigns what :meth:`~pcapkit.protocols.protocol.Protocol._make_index` resolves the code to: its member, or the plain :obj:`int` for a code in range that no member holds (:issue:`2594`). @@ -469,7 +469,7 @@ class PCAPNG(ProtocolBase[Data_PCAPNG, Schema_PCAPNG], """PCAP-NG file block extractor. The class supports parsing of the following protocols, which are - registered in the :attr:`self.__proto__ ` + registered in the :attr:`self.__proto__ ` attribute: .. list-table:: @@ -478,32 +478,32 @@ class PCAPNG(ProtocolBase[Data_PCAPNG, Schema_PCAPNG], * - Index - Protocol * - :attr:`pcapkit.const.reg.linktype.LinkType.NULL` - - :class:`pcapkit.protocols.link.loopback.Loopback` + - :class:`pcapkit.protocols.link.loopback.protocol.Loopback` * - :attr:`pcapkit.const.reg.linktype.LinkType.ETHERNET` - - :class:`pcapkit.protocols.link.ethernet.Ethernet` + - :class:`pcapkit.protocols.link.ethernet.protocol.Ethernet` * - :attr:`pcapkit.const.reg.linktype.LinkType.IEEE802_11` - - :class:`pcapkit.protocols.link.ieee802_11.IEEE802_11` + - :class:`pcapkit.protocols.link.ieee802_11.protocol.IEEE802_11` * - :attr:`pcapkit.const.reg.linktype.LinkType.FRELAY` - - :class:`pcapkit.protocols.link.frad.FRAD` + - :class:`pcapkit.protocols.link.frad.protocol.FRAD` * - :attr:`pcapkit.const.reg.linktype.LinkType.LOOP` - - :class:`pcapkit.protocols.link.loopback.Loopback` + - :class:`pcapkit.protocols.link.loopback.protocol.Loopback` * - :attr:`pcapkit.const.reg.linktype.LinkType.LINUX_SLL` - - :class:`pcapkit.protocols.link.linux_sll1.LinuxSLL1` + - :class:`pcapkit.protocols.link.linux_sll1.protocol.LinuxSLL1` * - :attr:`pcapkit.const.reg.linktype.LinkType.IEEE802_11_RADIOTAP` - - :class:`pcapkit.protocols.link.radiotap.Radiotap` + - :class:`pcapkit.protocols.link.radiotap.protocol.Radiotap` * - :attr:`pcapkit.const.reg.linktype.LinkType.IPV4` - - :class:`pcapkit.protocols.internet.ipv4.IPv4` + - :class:`pcapkit.protocols.internet.ipv4.protocol.IPv4` * - :attr:`pcapkit.const.reg.linktype.LinkType.IPV6` - - :class:`pcapkit.protocols.internet.ipv6.IPv6` + - :class:`pcapkit.protocols.internet.ipv6.protocol.IPv6` * - :attr:`pcapkit.const.reg.linktype.LinkType.LINUX_SLL2` - - :class:`pcapkit.protocols.link.linux_sll2.LinuxSLL2` + - :class:`pcapkit.protocols.link.linux_sll2.protocol.LinuxSLL2` :attr:`pcapkit.const.reg.linktype.LinkType.RAW` has no entry of its own: its data is dispatched as ``IPV4`` or ``IPV6`` by the version nibble of its first octet, see :meth:`_dispatch_linktype`. The class supports parsing of the following block types, which - are registered in the :attr:`self.__block__ ` + are registered in the :attr:`self.__block__ ` attribute: .. list-table:: @@ -513,41 +513,41 @@ class PCAPNG(ProtocolBase[Data_PCAPNG, Schema_PCAPNG], - Block Parser - Block Constructor * - :attr:`~pcapkit.const.pcapng.block_type.BlockType.Section_Header_Block` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_block_shb` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_block_shb` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_block_shb` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_block_shb` * - :attr:`~pcapkit.const.pcapng.block_type.BlockType.Interface_Description_Block` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_block_idb` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_block_idb` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_block_idb` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_block_idb` * - :attr:`~pcapkit.const.pcapng.block_type.BlockType.Enhanced_Packet_Block` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_block_epb` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_block_epb` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_block_epb` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_block_epb` * - :attr:`~pcapkit.const.pcapng.block_type.BlockType.Simple_Packet_Block` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_block_spb` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_block_spb` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_block_spb` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_block_spb` * - :attr:`~pcapkit.const.pcapng.block_type.BlockType.Name_Resolution_Block` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_block_nrb` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_block_nrb` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_block_nrb` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_block_nrb` * - :attr:`~pcapkit.const.pcapng.block_type.BlockType.Interface_Statistics_Block` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_block_isb` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_block_isb` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_block_isb` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_block_isb` * - :attr:`~pcapkit.const.pcapng.block_type.BlockType.systemd_Journal_Export_Block` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_block_systemd` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_block_systemd` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_block_systemd` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_block_systemd` * - :attr:`~pcapkit.const.pcapng.block_type.BlockType.Decryption_Secrets_Block` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_block_dsb` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_block_dsb` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_block_dsb` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_block_dsb` * - :attr:`~pcapkit.const.pcapng.block_type.BlockType.Custom_Block_that_rewriters_can_copy_into_new_files` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_block_cb` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_block_cb` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_block_cb` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_block_cb` * - :attr:`~pcapkit.const.pcapng.block_type.BlockType.Custom_Block_that_rewriters_should_not_copy_into_new_files` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_block_cb` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_block_cb` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_block_cb` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_block_cb` * - :attr:`~pcapkit.const.pcapng.block_type.BlockType.Packet_Block` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_block_packet` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_block_packet` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_block_packet` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_block_packet` The class supports parsing of the following option types, which - are registered in the :attr:`self.__option__ ` + are registered in the :attr:`self.__option__ ` attribute: .. list-table:: @@ -557,123 +557,123 @@ class PCAPNG(ProtocolBase[Data_PCAPNG, Schema_PCAPNG], - Option Parser - Option Constructor * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.opt_endofopt` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_endofopt` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_endofopt` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_endofopt` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_endofopt` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.opt_comment` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_comment` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_comment` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_comment` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_comment` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.opt_custom_2988`, :attr:`~pcapkit.const.pcapng.option_type.OptionType.opt_custom_2989`, :attr:`~pcapkit.const.pcapng.option_type.OptionType.opt_custom_19372`, :attr:`~pcapkit.const.pcapng.option_type.OptionType.opt_custom_19373` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_custom` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_custom` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_custom` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_custom` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.if_name` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_if_name` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_if_name` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_if_name` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_if_name` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.if_description` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_if_description` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_if_description` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_if_description` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_if_description` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.if_IPv4addr` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_if_ipv4` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_if_ipv4` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_if_ipv4` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_if_ipv4` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.if_IPv6addr` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_if_ipv6` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_if_ipv6` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_if_ipv6` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_if_ipv6` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.if_MACaddr` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_if_mac` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_if_mac` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_if_mac` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_if_mac` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.if_EUIaddr` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_if_eui` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_if_eui` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_if_eui` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_if_eui` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.if_speed` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_if_speed` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_if_speed` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_if_speed` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_if_speed` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.if_tsresol` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_if_tsresol` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_if_tsresol` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_if_tsresol` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_if_tsresol` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.if_tzone` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_if_tzone` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_if_tzone` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_if_tzone` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_if_tzone` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.if_filter` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_if_filter` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_if_filter` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_if_filter` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_if_filter` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.if_os` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_if_os` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_if_os` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_if_os` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_if_os` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.if_fcslen` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_if_fcslen` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_if_fcslen` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_if_fcslen` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_if_fcslen` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.if_tsoffset` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_if_tsoffset` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_if_tsoffset` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_if_tsoffset` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_if_tsoffset` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.if_hardware` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_if_hardware` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_if_hardware` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_if_hardware` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_if_hardware` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.if_txspeed` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_if_txspeed` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_if_txspeed` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_if_txspeed` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_if_txspeed` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.if_rxspeed` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_if_rxspeed` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_if_rxspeed` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_if_rxspeed` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_if_rxspeed` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.epb_flags` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_epb_flags` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_epb_flags` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_epb_flags` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_epb_flags` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.epb_hash` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_epb_hash` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_epb_hash` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_epb_hash` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_epb_hash` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.epb_dropcount` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_epb_dropcount` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_epb_dropcount` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_epb_dropcount` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_epb_dropcount` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.epb_packetid` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_epb_packetid` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_epb_packetid` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_epb_packetid` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_epb_packetid` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.epb_queue` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_epb_queue` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_epb_queue` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_epb_queue` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_epb_queue` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.epb_verdict` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_epb_verdict` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_epb_verdict` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_epb_verdict` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_epb_verdict` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.ns_dnsname` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_ns_dnsname` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_ns_dnsname` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_ns_dnsname` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_ns_dnsname` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.ns_dnsIP4addr` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_ns_dnsipv4` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_ns_dnsipv4` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_ns_dnsipv4` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_ns_dnsipv4` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.ns_dnsIP6addr` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_ns_dnsipv6` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_ns_dnsipv6` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_ns_dnsipv6` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_ns_dnsipv6` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.isb_starttime` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_isb_starttime` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_isb_starttime` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_isb_starttime` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_isb_starttime` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.isb_endtime` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_isb_endtime` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_isb_endtime` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_isb_endtime` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_isb_endtime` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.isb_ifrecv` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_isb_ifrecv` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_isb_ifrecv` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_isb_ifrecv` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_isb_ifrecv` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.isb_ifdrop` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_isb_ifdrop` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_isb_ifdrop` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_isb_ifdrop` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_isb_ifdrop` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.isb_filteraccept` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_isb_filteraccept` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_isb_filteraccept` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_isb_filteraccept` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_isb_filteraccept` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.isb_osdrop` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_isb_osdrop` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_isb_osdrop` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_isb_osdrop` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_isb_osdrop` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.isb_usrdeliv` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_isb_usrdeliv` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_isb_usrdeliv` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_isb_usrdeliv` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_isb_usrdeliv` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.pack_flags` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_pack_flags` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_pack_flags` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_pack_flags` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_pack_flags` * - :attr:`~pcapkit.const.pcapng.option_type.OptionType.pack_hash` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_option_pack_hash` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_option_pack_hash` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_option_pack_hash` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_option_pack_hash` The class supports parsing of the following name resolution - record types, which are registered in the :attr:`self.__record__ ` - attribute: + record types, which are registered in the :attr:`self.__record__ + ` attribute: .. list-table:: :header-rows: 1 @@ -682,18 +682,18 @@ class PCAPNG(ProtocolBase[Data_PCAPNG, Schema_PCAPNG], - Record Parser - Record Constructor * - :attr:`~pcapkit.const.pcapng.record_type.RecordType.nrb_record_end` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_record_end` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_record_end` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_record_end` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_record_end` * - :attr:`~pcapkit.const.pcapng.record_type.RecordType.nrb_record_ipv4` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_record_ipv4` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_record_ipv4` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_record_ipv4` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_record_ipv4` * - :attr:`~pcapkit.const.pcapng.record_type.RecordType.nrb_record_ipv6` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_record_ipv6` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_record_ipv6` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_record_ipv6` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_record_ipv6` The class supports parsing of the following decryption secrets - types, which are registered in the :attr:`self.__secrets__ ` - attribute: + types, which are registered in the :attr:`self.__secrets__ + ` attribute: .. list-table:: :header-rows: 1 @@ -702,17 +702,17 @@ class PCAPNG(ProtocolBase[Data_PCAPNG, Schema_PCAPNG], - Secrets Parser - Secrets Constructor * - :attr:`~pcapkit.const.pcapng.secrets_type.SecretsType.TLS_Key_Log` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_secrets_tls` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_secrets_tls` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_secrets_tls` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_secrets_tls` * - :attr:`~pcapkit.const.pcapng.secrets_type.SecretsType.WireGuard_Key_Log` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_secrets_wireguard` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_secrets_wireguard` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_secrets_wireguard` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_secrets_wireguard` * - :attr:`~pcapkit.const.pcapng.secrets_type.SecretsType.ZigBee_NWK_Key` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_secrets_zigbee_nwk` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_secrets_zigbee_nwk` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_secrets_zigbee_nwk` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_secrets_zigbee_nwk` * - :attr:`~pcapkit.const.pcapng.secrets_type.SecretsType.ZigBee_APS_Key` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._read_secrets_zigbee_aps` - - :meth:`~pcapkit.protocols.misc.pcapng.PCAPNG._make_secrets_zigbee_aps` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._read_secrets_zigbee_aps` + - :meth:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_secrets_zigbee_aps` .. versionchanged:: 1.5.0 @@ -774,7 +774,7 @@ class PCAPNG(ProtocolBase[Data_PCAPNG, Schema_PCAPNG], #: Header blocks mapped to the octets their fixed fields span, so that a #: shorter Block Total Length is kept as captured (see #: :meth:`_read_block_short_header`). The lengths are read from their one - #: home, :data:`pcapkit.protocols.schema.misc.pcapng.BLOCK_MINIMUM` + #: home, :data:`pcapkit.protocols.misc.pcapng.schema.BLOCK_MINIMUM` #: (:issue:`1739`). SHORT_HEADER_TYPES = { block: BLOCK_MINIMUM[block] for block in (Enum_BlockType.Section_Header_Block, @@ -802,7 +802,7 @@ class PCAPNG(ProtocolBase[Data_PCAPNG, Schema_PCAPNG], #: Each value is a :class:`~pcapkit.corekit.module.ModuleDescriptor` naming the #: module and class, or a :class:`~pcapkit.protocols.protocol.ProtocolBase` subclass. __proto__ = collections.defaultdict( - lambda: ModuleDescriptor('pcapkit.protocols.misc.raw', 'Raw'), + lambda: ModuleDescriptor('pcapkit.protocols.misc.raw.protocol', 'Raw'), { Enum_LinkType.NULL: ModuleDescriptor('pcapkit.protocols.link', 'Loopback'), Enum_LinkType.ETHERNET: ModuleDescriptor('pcapkit.protocols.link', 'Ethernet'), @@ -823,7 +823,7 @@ class PCAPNG(ProtocolBase[Data_PCAPNG, Schema_PCAPNG], #: :func:`~pcapkit.foundation.registry.protocols.protocol.register_protocol_code` so a #: ``code=`` key is checked exactly as #: :func:`~pcapkit.foundation.registry.protocols.misc.register_pcapng` checks its own -- - #: :class:`~pcapkit.protocols.misc.pcap.frame.Frame` keeps a registry of its own, + #: :class:`~pcapkit.protocols.misc.pcap.frame.protocol.Frame` keeps a registry of its own, #: keyed by the same enum, and so declares the same pairing rather than #: sharing this one (:issue:`2268`). __proto_key__: 'ClassVar[tuple[Type[EnumRegistry], bool]]' = (Enum_LinkType, False) @@ -988,7 +988,7 @@ def packet(self) -> 'Data_Packet': ``packet`` would be ``b''`` while ``captured_len`` declared the octets. The payload is therefore the block schema's - :attr:`~pcapkit.protocols.schema.schema.Schema.__payload__` field, which + :attr:`~pcapkit.protocols.schema.Schema.__payload__` field, which is where the schema layer put the captured octets, and the header is the block octets ahead of it. The block types that carry captured octets -- ``PACKET_TYPES``, i.e. the Enhanced @@ -1440,7 +1440,7 @@ def read(self, length: 'Optional[int]' = None, *, _read: 'bool' = True, # NOTE: An option or record area holding a malformed entry is kept as # the octets captured, as one :obj:`bytes` item (see - # :class:`~pcapkit.protocols.schema.misc.pcapng.OptionAreaField`), and + # :class:`~pcapkit.protocols.misc.pcapng.schema.OptionAreaField`), and # parses as no options. The octets are kept on the block as # ``options_raw`` or ``records_raw``, which the block's ``make`` writes # back verbatim (#1325). @@ -1531,8 +1531,8 @@ def make(self, or code the 32-bit Block Type field cannot carry; or if ``block`` is none of the forms this maker reads -- raw :obj:`bytes`, a :obj:`dict` of block arguments, a - :class:`~pcapkit.protocols.data.misc.pcapng.PCAPNG` data model - or a :class:`~pcapkit.protocols.schema.schema.Schema`. + :class:`~pcapkit.protocols.misc.pcapng.data.PCAPNG` data model + or a :class:`~pcapkit.protocols.schema.Schema`. """ type_val = self._make_index(type, Enum_BlockType, bits=32, name='block type', alias='PCAP-NG') @@ -1552,7 +1552,7 @@ def make(self, # # ``or {}`` rather than a ``get`` default because ``__packet__`` may be # handed over explicitly as :data:`None`, which is what - # :meth:`Schema.pack ` + # :meth:`Schema.pack ` # takes for "no packet data" as well. if self._ctx is not None: self._byte = self._ctx.section.byteorder @@ -1717,9 +1717,9 @@ def _check_block_floor(self, length: 'Optional[int]') -> 'None': block, so parsing one out of it can only invent fields from :meth:`FieldBase.unpack `'s zero padding, and once the four octets of :attr:`PCAPNG.type - ` have been padded out + ` have been padded out of nothing ``__length__`` is negative -- which - :func:`~pcapkit.protocols.schema.misc.pcapng.pcapng_block_selector` hands + :func:`~pcapkit.protocols.misc.pcapng.schema.pcapng_block_selector` hands to :class:`~pcapkit.corekit.fields.misc.SchemaField`, where :meth:`io.RawIOBase.read` raises the bare ``ValueError`` of :issue:`678`. @@ -1770,7 +1770,7 @@ def _read_block_short(self, schema: 'Schema_EnhancedPacketBlock | Schema_PacketB Args: schema: Parsed block schema, or on the construction path the - :class:`~pcapkit.protocols.schema.misc.pcapng.UnknownBlock` that + :class:`~pcapkit.protocols.misc.pcapng.schema.UnknownBlock` that :meth:`_make_block_short` built. header: Parsed PCAP-NG header schema. @@ -1854,7 +1854,7 @@ def _read_block_short_header( Args: schema: Parsed block schema, or on the construction path the - :class:`~pcapkit.protocols.schema.misc.pcapng.UnknownBlock` that + :class:`~pcapkit.protocols.misc.pcapng.schema.UnknownBlock` that :meth:`_make_block_short` built. header: Parsed PCAP-NG header schema. @@ -1867,7 +1867,7 @@ def _read_block_short_header( A section header keeps the byte order its Byte-Order Magic declares. One of 12 octets has no room for the magic, and takes the byte order in which its Block Total Length reads as 12 (see - :class:`~pcapkit.protocols.schema.misc.pcapng.SectionHeaderBlock`). + :class:`~pcapkit.protocols.misc.pcapng.schema.SectionHeaderBlock`). """ if isinstance(schema, Schema_UnknownBlock): @@ -1971,7 +1971,7 @@ def _get_payload(self) -> 'bytes': Payload of :attr:`self.__header__ ` as :obj:`bytes`. See Also: - This is a wrapper function for :meth:`pcapkit.protocols.schema.schema.Schema.get_payload`. + This is a wrapper function for :meth:`pcapkit.protocols.schema.Schema.get_payload`. Note: A packet block kept as captured has no payload (see @@ -2288,7 +2288,7 @@ def _make_packet_data(cls, block: 'Data_PCAPNG') -> 'bytes | ProtocolBase': Returns: The captured packet octets the block was parsed from, as - :attr:`~pcapkit.protocols.data.protocol.Protocol.packet` holds them, + :attr:`~pcapkit.protocols.data.Protocol.packet` holds them, cut to the block's ``captured_len``; or, for a data model that carries none, the payload rebuilt from its decoded next layer. @@ -2445,11 +2445,11 @@ def _dispatch_linktype(self, proto: 'Optional[int]', length: 'Optional[int]' = N Note: As :meth:`Frame._dispatch_linktype - ` does + ` does for PCAP: ``LINKTYPE_RAW`` (101) data is IPv4 or IPv6 by its version nibble, an entry registered under ``RAW`` itself is used as it stands, and data of any other version is kept as - :class:`~pcapkit.protocols.misc.raw.Raw` (:issue:`1502`). + :class:`~pcapkit.protocols.misc.raw.protocol.Raw` (:issue:`1502`). """ if proto != Enum_LinkType.RAW or Enum_LinkType.RAW in self.__proto__: @@ -4916,8 +4916,8 @@ def _make_block_dsb(self, block: 'Optional[Data_DecryptionSecretsBlock]' = None, member or code the 32-bit Secrets Type field cannot carry; or if ``secrets_data`` is none of the forms this maker reads -- raw :obj:`bytes`, a :obj:`dict` of secrets arguments, a - :class:`~pcapkit.protocols.data.misc.pcapng.DSBSecrets` data - model or a :class:`~pcapkit.protocols.schema.schema.Schema`. + :class:`~pcapkit.protocols.misc.pcapng.data.DSBSecrets` data + model or a :class:`~pcapkit.protocols.schema.Schema`. """ declared = None # type: Optional[int] @@ -4931,7 +4931,7 @@ def _make_block_dsb(self, block: 'Optional[Data_DecryptionSecretsBlock]' = None, name='[DSB] secrets_type', alias='PCAP-NG') if isinstance(secrets_data, bytes): - from pcapkit.protocols.schema.misc.pcapng import dsb_secrets_selector + from pcapkit.protocols.misc.pcapng.schema import dsb_secrets_selector # NOTE: Read through the schema the parse side selects, as the # block's Secrets Data is read, since :meth:`read` consumes a @@ -4977,7 +4977,7 @@ def _make_block_dsb(self, block: 'Optional[Data_DecryptionSecretsBlock]' = None, # Only a true overrun is kept -- the one the parse side bounds and # warns on, measured by ``secrets_area`` -- so a length that fits the # block, or one an edit has outdated, follows the secrets written. - from pcapkit.protocols.schema.misc.pcapng import secrets_area + from pcapkit.protocols.misc.pcapng.schema import secrets_area if block is not None and declared is not None and declared > secrets_area({ 'length': block.length, 'secrets_length': declared, @@ -5026,7 +5026,7 @@ def _make_block_cb(self, block: 'Optional[Data_CustomBlock]' = None, *, # NOTE: Unlike every other block that carries options, a custom block # has no ``OptionField`` to name an option registry: - # :class:`~pcapkit.protocols.schema.misc.pcapng.CustomBlock` + # :class:`~pcapkit.protocols.misc.pcapng.schema.CustomBlock` # spans the custom data, its padding and the options as one opaque blob, # since only the owner of the private enterprise number knows where the # custom data ends. Its options are therefore resolved in the generic diff --git a/pcapkit/protocols/schema/misc/pcapng.py b/pcapkit/protocols/misc/pcapng/schema.py similarity index 98% rename from pcapkit/protocols/schema/misc/pcapng.py rename to pcapkit/protocols/misc/pcapng/schema.py index a0f94830fb..224d833a0c 100644 --- a/pcapkit/protocols/schema/misc/pcapng.py +++ b/pcapkit/protocols/misc/pcapng/schema.py @@ -29,7 +29,7 @@ from pcapkit.corekit.multidict import MultiDict, OrderedMultiDict from pcapkit.corekit.schema.byteorder import byteorder_callback, packet_byteorder from pcapkit.corekit.schema.padding import pad_length -from pcapkit.protocols.schema.schema import EnumSchema, Schema, schema_final +from pcapkit.protocols.schema import EnumSchema, Schema, schema_final from pcapkit.utilities.exceptions import FieldValueError, ProtocolError, stacklevel from pcapkit.utilities.logging import SPHINX_TYPE_CHECKING from pcapkit.utilities.warnings import (ProtocolWarning, RegistryWarning, SchemaWarning, @@ -71,7 +71,7 @@ from pcapkit.const.pcapng.tls_key_label import TLSKeyLabel as Enum_TLSKeyLabel from pcapkit.corekit.fields.field import FieldBase as Field - from pcapkit.protocols.misc.pcapng import WireGuardKeyLabel + from pcapkit.protocols.misc.pcapng.protocol import WireGuardKeyLabel from pcapkit.protocols.protocol import ProtocolBase _ZigBeeKey = TypeVar('_ZigBeeKey', 'ZigBeeNWKKey', 'ZigBeeAPSKey') @@ -297,7 +297,7 @@ def nonnegative(length: 'Callable[[dict[str, Any]], int]') -> 'Callable[[dict[st whole extraction rather than one block, and a capture cut short by its snapshot length must keep parsing. The end of the file is the one case that is *not* a floor, since there no block is being read at all -- see :meth:`PCAPNG._check_block_floor - `, which reports it + `, which reports it as the :exc:`~pcapkit.utilities.exceptions.StreamEOFError` the frame loop catches. @@ -313,7 +313,7 @@ def nonnegative(length: 'Callable[[dict[str, Any]], int]') -> 'Callable[[dict[st :attr:`UnknownSecrets.data`, :attr:`TLSKeyLog.data` and :attr:`WireGuardKeyLog.data` -- out of this. They read ``__length__`` *whole* rather than subtracting from it, and - :meth:`Schema.pack ` leaves it at ``-1`` for + :meth:`Schema.pack ` leaves it at ``-1`` for "unknown", so flooring them packs nothing at all. On the parsing path their ``__length__`` is the length the enclosing :class:`~pcapkit.corekit.fields.misc.SchemaField` declared from a 32-bit ``secrets_length``, which cannot be negative, so there is nothing there to floor. @@ -350,18 +350,18 @@ def held_body(framing: 'int') -> 'Callable[[dict[str, Any]], int]': :meth:`FieldBase.unpack ` raises :exc:`~pcapkit.utilities.exceptions.FieldValueError` from inside the block's schema, where :meth:`PCAPNG.read - ` cannot keep the block as + ` cannot keep the block as captured, so the whole extraction ends (:issue:`1984`). The other block types read their bodies field by field, so none of them declares that much in one field. Bounded, the body is the octets the file actually holds, whatever the block declares, and :meth:`PCAPNG.read - ` reports the truncation as it + ` reports the truncation as it does for every other block type. On a well-formed block the stream holds the body and the trailing Block Total Length, so this is a no-op; on the packing path :meth:`Schema.pack - ` leaves ``__length__`` at + ` leaves ``__length__`` at ``-1`` for "unknown", and the declared span is kept. """ @@ -400,7 +400,7 @@ def bounded_option(length: 'Callable[[dict[str, Any]], int]') -> 'Callable[[dict Note: The check is skipped when ``__length__`` is absent or negative, which is - what :meth:`Schema.pack ` + what :meth:`Schema.pack ` leaves it as when no length is known. The nominal length still goes through :func:`nonnegative` first, on both paths, since an option declaring less payload than the part of itself it describes makes the @@ -487,7 +487,7 @@ def bounded_area(length: 'Callable[[dict[str, Any]], int]') -> 'Callable[[dict[s :func:`bounded_option` refuses a payload that runs past the area, and the area is sized from the block's declared Block Total Length. Nothing checks that length against the file: - :meth:`BlockType.post_process ` + :meth:`BlockType.post_process ` compares ``length`` only against its own trailing copy. A block declaring 1,000,000 octets while holding 36 would therefore size its option area at 999,964, read the trailing Block Total Length into it, and leave that field to be zero-filled. Clamping the area to ``__length__`` keeps the @@ -684,9 +684,9 @@ def zigbee_key_held(schema: 'Type[_ZigBeeKey]', data: 'bytes') -> '_ZigBeeKey': ``data`` is unpacked as the block's Secrets Data is, with any octets past the fixed fields kept as the schema's ``trailing`` octets. A ``data`` short of the fixed width is a short read, which :meth:`Schema.unpack - ` records for + ` records for :meth:`Schema._cut_short_read - `. A key shorter + `. A key shorter than its fixed width, or a Secrets Length longer than it, then rebuilds byte for byte (:issue:`1986`). The length is declared, so an empty ``data`` is an empty key rather than the end of the stream. The short read's @@ -713,12 +713,12 @@ def pcapng_block_selector(packet: 'dict[str, Any]') -> 'Field': Returns: A :class:`~pcapkit.corekit.fields.misc.SchemaField` wrapped - :class:`~pcapkit.protocols.schema.misc.pcapng.BlockType` subclass + :class:`~pcapkit.protocols.misc.pcapng.schema.BlockType` subclass instance. See Also: * :class:`pcapkit.const.pcapng.block_type.BlockType` - * :class:`pcapkit.protocols.schema.misc.pcapng.BlockType` + * :class:`pcapkit.protocols.misc.pcapng.schema.BlockType` Note: ``__length__`` is what is left of the *stream*, not what the block @@ -730,9 +730,9 @@ def pcapng_block_selector(packet: 'dict[str, Any]') -> 'Field': :meth:`SchemaField.unpack ` would read as no declared length, sizing the block by whatever is left of the stream. The floor is a backstop: :meth:`PCAPNG._check_block_floor - ` reports that + ` reports that tail as end-of-stream before it gets here, and on the packing path - :meth:`Schema.pack ` seeds + :meth:`Schema.pack ` seeds ``__length__`` as ``-1`` for "unknown", which :meth:`SchemaField.pack ` does not read at all. @@ -756,7 +756,7 @@ def _cut_last_line(schema: 'Schema', index: 'int', lines: 'list[str]', Returns: Whether ``lines[index]`` is the last line of a key log the data ended inside, which :meth:`Schema.unpack - ` records as + ` records as ``__short_read__``, or that the enclosing block ended inside, as :func:`secrets_area` bounds it (:issue:`1980`). Such a line is only the first octets of an entry, and the log text, kept verbatim, still @@ -804,15 +804,15 @@ def dsb_secrets_selector(packet: 'dict[str, Any]') -> 'Field': Returns: A :class:`~pcapkit.corekit.fields.misc.SchemaField` wrapped instance of - the :class:`~pcapkit.protocols.schema.misc.pcapng.DSBSecrets` subclass + the :class:`~pcapkit.protocols.misc.pcapng.schema.DSBSecrets` subclass registered for ``secrets_type``, or of - :class:`~pcapkit.protocols.schema.misc.pcapng.UnknownSecrets` if none is, + :class:`~pcapkit.protocols.misc.pcapng.schema.UnknownSecrets` if none is, spanning the octets of ``secrets_length`` that the block holds (see :func:`secrets_area`). See Also: * :class:`pcapkit.const.pcapng.secrets_type.SecretsType` - * :class:`pcapkit.protocols.schema.misc.pcapng.DSBSecrets` + * :class:`pcapkit.protocols.misc.pcapng.schema.DSBSecrets` """ secrets_type = packet['secrets_type'] # type: int @@ -1138,7 +1138,7 @@ def register(code: 'Enum_OptionType', cls: 'Type[Option]', ns: 'Optional[str]' = Membership is tested with ``.get()``, never by subscripting. The per-namespace registries are :class:`collections.defaultdict`\\ s -- only the outer one is the miss-safe - :class:`~pcapkit.protocols.schema.schema._EnumRegistry` -- so reading + :class:`~pcapkit.protocols.schema._EnumRegistry` -- so reading ``Option.registry[key][code]`` to see whether it is there would *insert* :class:`UnknownOption` for a code nobody registered. @@ -1189,7 +1189,7 @@ def __init_subclass__(cls, /, code: 'Optional[Enum_OptionType | Iterable[Enum_Op .. code-block:: python from pcapkit.const.pcapng.option_type import OptionType as Enum_OptionType - from pcapkit.protocols.schema.misc.pcapng import Option + from pcapkit.protocols.misc.pcapng.schema import Option class NewOption(Option, ns='opt', code=Enum_OptionType.opt_new): ... @@ -1369,7 +1369,7 @@ def post_process(self, packet: 'dict[str, Any]') -> 'SectionHeaderBlock': A Block Total Length below the 28 octets of the fixed fields reads the trailing copy past the block, so the two are not compared here; :meth:`PCAPNG._read_block_short_header - ` keeps + ` keeps the block as captured and compares them itself (:issue:`1422`). A block of 12 octets has no Byte-Order Magic and takes its byte order from its Block Total Length (see :func:`shb_byteorder_callback`). @@ -1681,7 +1681,7 @@ def post_process(self, packet: 'dict[str, Any]') -> 'Schema': A Block Total Length below the 20 octets of the fixed fields reads the trailing copy past the block, so the two are not compared here; :meth:`PCAPNG._read_block_short_header - ` keeps + ` keeps the block as captured and compares them itself (:issue:`1422`). """ @@ -1838,7 +1838,7 @@ def post_process(self, packet: 'dict[str, Any]') -> 'Schema': A Block Total Length below the 32 octets of the fixed fields reads the trailing copy past the block, so the two are not compared here; :meth:`PCAPNG._read_block_short - ` keeps the block + ` keeps the block as captured and compares them itself (:issue:`1414`). """ @@ -2545,7 +2545,7 @@ def post_process(self, packet: 'dict[str, Any]') -> 'Schema': describes (:issue:`1985`). """ - from pcapkit.protocols.misc.pcapng import WireGuardKeyLabel + from pcapkit.protocols.misc.pcapng.protocol import WireGuardKeyLabel entries = OrderedMultiDict() # type: OrderedMultiDict[WireGuardKeyLabel, bytes] lines = self.data.splitlines() @@ -2686,7 +2686,7 @@ def post_process(self, packet: 'dict[str, Any]') -> 'Schema': The report is made on the unpacking path only, where ``__length__`` is what is left of the stream. :meth:`Schema.pack - ` seeds it as ``-1``, and + ` seeds it as ``-1``, and rebuilding a block already reported is no new overrun. The lengths are read from the schema rather than from ``packet``, since packing the option area rebinds ``packet['length']`` to each option's own length. @@ -2827,7 +2827,7 @@ def post_process(self, packet: 'dict[str, Any]') -> 'Schema': A Block Total Length below the 32 octets of the fixed fields reads the trailing copy past the block, so the two are not compared here; :meth:`PCAPNG._read_block_short - ` keeps the block + ` keeps the block as captured and compares them itself (:issue:`1414`). """ diff --git a/pcapkit/protocols/misc/raw/__init__.py b/pcapkit/protocols/misc/raw/__init__.py new file mode 100644 index 0000000000..9051b79958 --- /dev/null +++ b/pcapkit/protocols/misc/raw/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""Raw Packet Data +===================== + +.. module:: pcapkit.protocols.misc.raw + +:mod:`pcapkit.protocols.misc.raw` holds the dissector, +:class:`~pcapkit.protocols.misc.raw.protocol.Raw`, in +:mod:`~pcapkit.protocols.misc.raw.protocol`, its header schema in +:mod:`~pcapkit.protocols.misc.raw.schema` and its data model in +:mod:`~pcapkit.protocols.misc.raw.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.misc.raw.protocol import Raw + +# Header Schemas +from pcapkit.protocols.misc.raw.schema import Raw as Schema_Raw + +# Data Models +from pcapkit.protocols.misc.raw.data import Raw as Data_Raw + +__all__ = ['Raw'] diff --git a/pcapkit/protocols/data/misc/raw.py b/pcapkit/protocols/misc/raw/data.py similarity index 95% rename from pcapkit/protocols/data/misc/raw.py rename to pcapkit/protocols/misc/raw/data.py index ae6a2fac23..5b42c5b6e6 100644 --- a/pcapkit/protocols/data/misc/raw.py +++ b/pcapkit/protocols/misc/raw/data.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Protocol if TYPE_CHECKING: from typing import Optional diff --git a/pcapkit/protocols/misc/raw.py b/pcapkit/protocols/misc/raw/protocol.py similarity index 92% rename from pcapkit/protocols/misc/raw.py rename to pcapkit/protocols/misc/raw/protocol.py index c4221e2fd7..9ba6599732 100644 --- a/pcapkit/protocols/misc/raw.py +++ b/pcapkit/protocols/misc/raw/protocol.py @@ -2,10 +2,10 @@ """Raw Packet Data ===================== -.. module:: pcapkit.protocols.misc.raw +.. module:: pcapkit.protocols.misc.raw.protocol -:mod:`pcapkit.protocols.misc.raw` contains -:class:`~pcapkit.protocols.misc.raw.Raw` only, which implements +:mod:`pcapkit.protocols.misc.raw.protocol` contains +:class:`~pcapkit.protocols.misc.raw.protocol.Raw` only, which implements an extractor for unknown protocols, and constructs a :class:`~pcapkit.protocols.protocol.Protocol` like object. @@ -14,10 +14,10 @@ from typing import TYPE_CHECKING, overload from pcapkit.corekit.protochain import ProtoChain -from pcapkit.protocols.data.misc.raw import Raw as Data_Raw -from pcapkit.protocols.misc.no_payload import NoPayload +from pcapkit.protocols.misc.no_payload.protocol import NoPayload +from pcapkit.protocols.misc.raw.data import Raw as Data_Raw +from pcapkit.protocols.misc.raw.schema import Raw as Schema_Raw from pcapkit.protocols.protocol import ProtocolBase -from pcapkit.protocols.schema.misc.raw import Raw as Schema_Raw from pcapkit.utilities.exceptions import UnsupportedCall if TYPE_CHECKING: @@ -147,7 +147,7 @@ def __post_init__(self, file: 'Optional[IO[bytes] | bytes]' = None, if length is None: length = len(self._data) - #: pcapkit.protocols.data.misc.raw.Raw: Parsed packet data. + #: pcapkit.protocols.misc.raw.data.Raw: Parsed packet data. self._info = self.unpack(length, **kwargs) if self._info.protocol is not None and hasattr(self._info.protocol, 'name'): @@ -155,7 +155,7 @@ def __post_init__(self, file: 'Optional[IO[bytes] | bytes]' = None, else: alias = self.alias - #: pcapkit.protocols.misc.no_payload.NoPayload: Next layer (no payload). + #: pcapkit.protocols.misc.no_payload.protocol.NoPayload: Next layer (no payload). self._next = NoPayload() #: pcapkit.corekit.protochain.ProtoChain: Protocol chain from current layer. self._protos = ProtoChain(self.__class__, alias) diff --git a/pcapkit/protocols/schema/misc/raw.py b/pcapkit/protocols/misc/raw/schema.py similarity index 90% rename from pcapkit/protocols/schema/misc/raw.py rename to pcapkit/protocols/misc/raw/schema.py index 3f1637bb74..f507ab8e0c 100644 --- a/pcapkit/protocols/schema/misc/raw.py +++ b/pcapkit/protocols/misc/raw/schema.py @@ -5,7 +5,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.fields.misc import PayloadField -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final __all__ = ['Raw'] diff --git a/pcapkit/protocols/protocol.py b/pcapkit/protocols/protocol.py index 8df4ed4473..33b39b0d53 100644 --- a/pcapkit/protocols/protocol.py +++ b/pcapkit/protocols/protocol.py @@ -16,7 +16,7 @@ Constructing a protocol with a keyword that none of its signatures declares raises :exc:`~pcapkit.utilities.exceptions.UnsupportedCall`, where it was discarded (:issue:`617`). A next layer captured shorter than - its header is kept as :class:`~pcapkit.protocols.misc.raw.Raw`, where it + its header is kept as :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, where it was parsed with zero-filled fields (:issue:`1170`). """ @@ -28,6 +28,7 @@ import difflib import enum import functools +import importlib import inspect import io import os @@ -49,13 +50,9 @@ from pcapkit.corekit.multidict import MultiDict from pcapkit.corekit.protochain import ProtoChain from pcapkit.corekit.sentinels import ABSENT -from pcapkit.protocols import data as data_module -from pcapkit.protocols import schema as schema_module -from pcapkit.protocols.data.data import Data -from pcapkit.protocols.data.misc.raw import Raw as Data_Raw -from pcapkit.protocols.data.protocol import Packet as Data_Packet -from pcapkit.protocols.schema.misc.raw import Raw as Schema_Raw -from pcapkit.protocols.schema.schema import Schema +from pcapkit.protocols.data import Data +from pcapkit.protocols.data import Packet as Data_Packet +from pcapkit.protocols.schema import Schema from pcapkit.utilities import config from pcapkit.utilities.chardet import detect from pcapkit.utilities.compat import cached_property @@ -99,7 +96,7 @@ def _passes_raw(value: 'Any', nested: 'bool' = False) -> 'bool': Returns: :data:`True` if :obj:`bytes` sits anywhere inside a :obj:`list`, :obj:`tuple`, :obj:`dict` or data model among ``value``, or a - :class:`~pcapkit.protocols.schema.schema.Schema` does anywhere. A + :class:`~pcapkit.protocols.schema.Schema` does anywhere. A top-level :obj:`bytes` keyword (e.g. a payload) does not count. A data model is looked into as a :obj:`dict` is, since a maker builds from its fields as given, and a multi-mapping through every value of each key @@ -177,7 +174,7 @@ def _raw_where_parsed(made: 'Any', parsed: 'Any') -> 'bool': Returns: :data:`True` if, at some position both share, ``made`` holds - :obj:`bytes` and ``parsed`` a :class:`~pcapkit.protocols.schema.schema.Schema`. + :obj:`bytes` and ``parsed`` a :class:`~pcapkit.protocols.schema.Schema`. """ if isinstance(made, bytes): @@ -205,9 +202,9 @@ def _raw_where_parsed(made: 'Any', parsed: 'Any') -> 'bool': #: ` reconstructs from. #: Refusing it would make ``from_data`` fail on any protocol whose ``make`` does #: not declare a ``packet``, starting with -#: :class:`~pcapkit.protocols.misc.no_payload.NoPayload`, the innermost layer of every +#: :class:`~pcapkit.protocols.misc.no_payload.protocol.NoPayload`, the innermost layer of every #: packet. It is also a real field name for some protocols -- -#: :meth:`HIP.make ` takes the HIP +#: :meth:`HIP.make ` takes the HIP #: packet *type* under it -- and listing it here does not change how it binds, #: only that it is never refused. OUT_OF_BAND_KEYWORDS = frozenset({'_layer', '_protocol', '__context__', @@ -252,11 +249,11 @@ def _declared_keywords(cls: 'type') -> 'Optional[frozenset[str]]': ` hands one ``**kwargs`` to both the construction and the parse of the packet it has just constructed, so a keyword declared by ``read`` travels through ``make`` too. - :class:`~pcapkit.protocols.internet.hip.HIP` is the live example: - :meth:`HIP.read ` declares - ``extension``, :meth:`HIP.make ` + :class:`~pcapkit.protocols.internet.hip.protocol.HIP` is the live example: + :meth:`HIP.read ` declares + ``extension``, :meth:`HIP.make ` does not, and :meth:`HIP.__post_init__ - ` forwards it to both. + ` forwards it to both. The walk covers the whole MRO rather than the most derived override of each method, so that a subclass declaring its own keyword and forwarding the rest @@ -287,10 +284,10 @@ def _declared_keywords(cls: 'type') -> 'Optional[frozenset[str]]': # NOTE: The :obj:`None` opt-out is *not* inherited, unlike a set, # which is unioned down the MRO. It describes how the class that # declares it dispatches, not a property its subclasses share: - # :class:`~pcapkit.protocols.application.http.HTTP` cannot enumerate + # :class:`~pcapkit.protocols.application.http.protocol.HTTP` cannot enumerate # its keywords because it forwards them to whichever of - # :class:`HTTPv1 ` and - # :class:`HTTPv2 ` the + # :class:`HTTPv1 ` and + # :class:`HTTPv2 ` the # ``version`` names, but each of those declares its own in full, and # inheriting the opt-out would exempt the very classes that can be # checked. A subclass that dispatches in turn says so itself. @@ -397,7 +394,7 @@ def _check_construction_keywords(cls: 'type', kwargs: 'dict[str, Any]', # :mod:`pcapkit`, which is the ``from_data`` call the reader wants to be # pointed at, and it stays right if the frames between change, where a # hardcoded count would not. It is also what :meth:`Schema.__update__ - # ` passes for the + # ` passes for the # warning this one is the counterpart of. warn(f'{cls.__name__}._make_data returned keyword(s) that no signature of ' f'{cls.__name__} declares, so they are discarded: {listed}', @@ -413,7 +410,7 @@ def _short_of_hint(klass: 'Type[ProtocolBase]', captured: 'int') -> 'bool': Returns: Whether a next layer of ``klass`` parsed from ``captured`` octets may be - replaced with :class:`~pcapkit.protocols.misc.raw.Raw` by + replaced with :class:`~pcapkit.protocols.misc.raw.protocol.Raw` by :meth:`Protocol._parse_next_layer `, and so has its warnings held. @@ -431,6 +428,43 @@ def _short_of_hint(klass: 'Type[ProtocolBase]', captured: 'int') -> 'bool': return hint is not None and captured < hint +def _sibling_model(cls: 'Type[ProtocolBase]', role: 'str') -> 'Any': + """The ``role`` class for a protocol class defined without one (:issue:`2534`). + + Args: + cls: The protocol class being defined. + role: ``'schema'`` or ``'data'``, the module to look in. + + Returns: + The class named after ``cls`` in the ``role`` module of the package whose + ``protocol`` module defines ``cls``, if there is one; otherwise + :class:`~pcapkit.protocols.misc.raw.schema.Raw` or + :class:`~pcapkit.protocols.misc.raw.data.Raw`. + + """ + package, _, name = cls.__module__.rpartition('.') + if name == 'protocol' and package != __name__.rpartition('.')[0]: + sibling = f'{package}.{role}' + try: + module = importlib.import_module(sibling) + except ModuleNotFoundError as exc: + if exc.name != sibling: + raise + else: + found = getattr(module, cls.__name__, None) + if isinstance(found, type): + return found + # NOTE: imported here rather than at the top: Raw's package is under + # pcapkit.protocols.misc, whose modules import this one (#2534). + if role == 'schema': + from pcapkit.protocols.misc.raw.schema import \ + Raw as Schema_Raw # pylint: disable=import-outside-toplevel + return Schema_Raw + from pcapkit.protocols.misc.raw.data import \ + Raw as Data_Raw # pylint: disable=import-outside-toplevel + return Data_Raw + + class ProtocolMeta(abc.ABCMeta): """Metaclass of :class:`ProtocolBase`, and so of every protocol class. @@ -487,9 +521,9 @@ class ProtocolBase(Generic[_PT, _ST], metaclass=ProtocolMeta): #: Layer of protocol, can be one of ``Link``, ``Internet``, ``Transport`` #: and ``Application``. For example, the layer of - #: :class:`~pcapkit.protocols.link.ethernet.Ethernet` is ``Link``. However, + #: :class:`~pcapkit.protocols.link.ethernet.protocol.Ethernet` is ``Link``. However, #: certain protocols are not in any layer, such as - #: :class:`~pcapkit.protocols.misc.raw.Raw`, and thus its layer is :obj:`None`. + #: :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, and thus its layer is :obj:`None`. __layer__: 'Optional[Literal["Link", "Internet", "Transport", "Application"]]' = None #: Protocol index mapping for decoding the next layer; see @@ -498,7 +532,7 @@ class ProtocolBase(Generic[_PT, _ST], metaclass=ProtocolMeta): #: Each value is a :class:`~pcapkit.corekit.module.ModuleDescriptor` naming the #: module and class, or a :class:`ProtocolBase` subclass. __proto__: 'DefaultDict[int, ModuleDescriptor[ProtocolBase] | Type[ProtocolBase]]' = collections.defaultdict( - lambda: ModuleDescriptor('pcapkit.protocols.misc.raw', 'Raw'), + lambda: ModuleDescriptor('pcapkit.protocols.misc.raw.protocol', 'Raw'), ) #: Read-only copy of :attr:`__proto__` as the class defining it shipped it, @@ -510,7 +544,7 @@ class ProtocolBase(Generic[_PT, _ST], metaclass=ProtocolMeta): #: Construction keywords this protocol consumes out of ``**kwargs`` instead #: of declaring as a parameter, e.g. with ``kwargs.get('spam')`` in - #: :meth:`read` -- as :meth:`ESP.read ` + #: :meth:`read` -- as :meth:`ESP.read ` #: does with ``packet``. #: :func:`_declared_keywords` finds keywords by #: reading signatures, which cannot see such a name, so a protocol that @@ -527,10 +561,10 @@ class ProtocolBase(Generic[_PT, _ST], metaclass=ProtocolMeta): #: :obj:`None` means the keywords cannot be enumerated and the check is #: skipped for this protocol. That is for a *dispatcher*, whose real signature #: belongs to a class chosen at call time: - #: :meth:`HTTP.make ` declares + #: :meth:`HTTP.make ` declares #: only ``version`` and forwards everything else to - #: :meth:`HTTPv1.make ` or - #: :meth:`HTTPv2.make ` + #: :meth:`HTTPv1.make ` or + #: :meth:`HTTPv2.make ` #: depending on that value, so no set of names is right for it. Use it only #: for that shape, since a protocol that skips the check silently discards an #: unknown keyword. Unlike a set, the :obj:`None` is **not** inherited: a @@ -546,7 +580,7 @@ class ProtocolBase(Generic[_PT, _ST], metaclass=ProtocolMeta): #: that overrides ``make`` and forwards the rest to its parent keeps the #: parent's keywords. A base whose subclasses override ``make`` *without* #: forwarding sets this, so that its keywords are refused for them rather than - #: accepted and dropped -- :class:`~pcapkit.protocols.internet.ipv6_ext.IPv6_Ext` + #: accepted and dropped -- :class:`~pcapkit.protocols.internet.ipv6_ext.protocol.IPv6_Ext` #: does, for ``len`` and ``data`` (:issue:`2286`). Read from the defining #: class alone, so it is not inherited, and it leaves :attr:`__keywords__` #: and the other construction methods unaffected. @@ -582,7 +616,7 @@ class ProtocolBase(Generic[_PT, _ST], metaclass=ProtocolMeta): _exctx: 'Optional[ContextRegistry]' = None #: Whether this layer is past :data:`~pcapkit.utilities.config.FRAME_LAYER_LIMIT`, and so was kept as - #: :class:`~pcapkit.protocols.misc.raw.Raw` by :meth:`_parse_next_layer` + #: :class:`~pcapkit.protocols.misc.raw.protocol.Raw` by :meth:`_parse_next_layer` #: without being parsed. Such a layer carries an ``error`` as one that #: failed to parse does, so this is what tells the two apart: what follows #: the limit is not to be read on (:issue:`1610`). @@ -648,7 +682,7 @@ def protochain(self) -> 'ProtoChain': """Protocol chain of current instance. Note: - :class:`~pcapkit.protocols.misc.no_payload.NoPayload` has no chain and + :class:`~pcapkit.protocols.misc.no_payload.protocol.NoPayload` has no chain and narrows this to :obj:`None`; :meth:`_decode_next_layer` passes it on as ``basis``, which :class:`~pcapkit.corekit.protochain.ProtoChain` accepts. @@ -670,8 +704,8 @@ def packet(self) -> 'Data_Packet': A protocol laid out otherwise has to override this: one whose :attr:`~length` counts something else, or one carrying a *trailer* after the payload, gets a header that eats the payload and a payload - of ``b''``. :class:`~pcapkit.protocols.misc.pcapng.PCAPNG` is the - example -- its :attr:`~pcapkit.protocols.misc.pcapng.PCAPNG.length` + of ``b''``. :class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG` is the + example -- its :attr:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG.length` is the wire's Block Total Length and the captured octets sit ahead of the option list and the trailing length field. The payload matters because :meth:`Protocol.__init__` injects it into every parsed @@ -768,7 +802,7 @@ def make(self, **kwargs: 'Any') -> '_ST': ``SomeProtocol.make(...)`` on an instance obtained some other way -- ``object.__new__(cls).make(**kwargs)`` is the idiom, used by this package's own tests and by :meth:`HTTP.make - ` to reach its versioned + ` to reach its versioned implementation. Covering it would mean interposing on every ``make`` in the tree rather than on the one place their keywords converge, so it is deliberately not done. Construct through the constructor to get @@ -799,7 +833,7 @@ def pack(self, **kwargs: 'Any') -> 'bytes': constructed, the header is made on a shallow copy of it (see :meth:`_packing_target`), so :attr:`schema`, :attr:`info` and anything :meth:`make` sets along the way, such as - :attr:`TCP.connection `, + :attr:`TCP.connection `, still describe that packet. Only the call that :meth:`__post_init__` makes to construct the instance keeps the header made here, as the one :meth:`unpack` reads back. @@ -807,7 +841,7 @@ def pack(self, **kwargs: 'Any') -> 'bytes': That call, when :meth:`from_data` rebuilds a header the capture cut short, cuts the header back to the octets captured, through its own ``__short_read__`` and :meth:`Schema._cut_short_read - `, and + `, and returns only those (:issue:`2703`). .. versionchanged:: 1.5.0 @@ -956,7 +990,7 @@ def resolve_index(name: 'str | int | StdlibEnum | AenumEnum', default: 'Optional be passed on:: >>> from pcapkit.const.reg.ethertype import EtherType - >>> from pcapkit.protocols.link.ethernet import Ethernet + >>> from pcapkit.protocols.link.ethernet.protocol import Ethernet >>> code = Ethernet.resolve_index('Address_Resolution_Protocol', ... namespace=EtherType) >>> Ethernet(type=code).info.type @@ -1056,9 +1090,9 @@ def analyze(cls, proto: 'int', payload: 'bytes', **kwargs: 'Any') -> 'ProtocolBa report = protocol(payload_io, len(payload), **kwargs) # type: ignore[abstract] except Exception as exc: if isinstance(exc, StructError) and exc.eof: # pylint: disable=no-member - from pcapkit.protocols.misc.no_payload import NoPayload as protocol # pylint: disable=import-outside-toplevel # isort: skip + from pcapkit.protocols.misc.no_payload.protocol import NoPayload as protocol # pylint: disable=import-outside-toplevel # isort: skip else: - from pcapkit.protocols.misc.raw import Raw as protocol # pylint: disable=import-outside-toplevel # isort: skip + from pcapkit.protocols.misc.raw.protocol import Raw as protocol # pylint: disable=import-outside-toplevel # isort: skip # error = traceback.format_exc(limit=1).strip().rsplit(os.linesep, maxsplit=1)[-1] # log error @@ -1151,7 +1185,7 @@ def from_data(cls, data: '_PT | dict[str, Any]', **kwargs: 'Any') -> 'Self': ` returns, which carries the metadata the rebuild reads: ``__next_name__`` and ``__next_type__``, which the payload is dispatched on, ``__short_read__``, and, for - :class:`~pcapkit.protocols.internet.ipv6.IPv6`, the extension header + :class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6`, the extension header chain under ``__exthdr__``. A hand-written :obj:`dict` must carry them too, or no payload (nor IPv6 extension header) is rebuilt and no short read is cut back, see :meth:`_make_payload`; nothing is guessed from @@ -1166,9 +1200,9 @@ def from_data(cls, data: '_PT | dict[str, Any]', **kwargs: 'Any') -> 'Self': data: Protocol data. **kwargs: Construction keywords that ``data`` does not carry, such as the ``num`` and ``header`` of - :class:`~pcapkit.protocols.misc.pcap.frame.Frame`, or the + :class:`~pcapkit.protocols.misc.pcap.frame.protocol.Frame`, or the ``num``, ``sct`` and ``ctx`` of - :class:`~pcapkit.protocols.misc.pcapng.PCAPNG`. They take + :class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG`. They take precedence over the keywords :meth:`_make_data` returns. Returns: @@ -1385,7 +1419,7 @@ def __init__(self, file: 'Optional[IO[bytes] | bytes]' = None, length: 'Optional # keep its default -- ``TCP_BASE`` asking for ``seq=1``, which # ``TCP.make`` spells ``seq_no``, would yield ``seq = 0`` with no warning # (#617). The schema layer is not that permissive: :meth:`Schema.__update__ - # ` warns + # ` warns # :exc:`~pcapkit.utilities.warnings.UnknownFieldWarning` for a field it # does not know, and this closes the asymmetry from the other end. # @@ -1447,7 +1481,7 @@ def __post_init__(self, file: 'Optional[IO[bytes] | bytes]' = None, #: io.BytesIO: Source packet stream. self._file = io.BytesIO(self._data) if not rebuilding.get(): - #: pcapkit.protocols.data.data.Data: Parsed packet data. + #: pcapkit.protocols.data.Data: Parsed packet data. self._info = self.unpack(length, **kwargs) return @@ -1487,12 +1521,15 @@ def __init_subclass__(cls, /, schema: 'Optional[Type[_ST]]' = None, `. Notes: - When ``schema`` and/or ``data`` is not specified, the method will first - try to find the corresponding class in the - :mod:`~pcapkit.protocols.schema` and :mod:`~pcapkit.protocols.data` - modules respectively. If the class is not found, the default - :class:`~pcapkit.protocols.schema.misc.raw.Raw` and - :class:`~pcapkit.protocols.data.misc.raw.Raw` classes will be used. + When ``schema`` and/or ``data`` is not specified, the method looks + for the class of the subclass's own name in the ``schema`` and + ``data`` modules beside the ``protocol`` module that defines it, as + :class:`~pcapkit.protocols.link.l2tp.protocol.L2TP` finds + :class:`~pcapkit.protocols.link.l2tp.schema.L2TP` + (:issue:`2534`). If there is none, the default + :class:`~pcapkit.protocols.misc.raw.schema.Raw` and + :class:`~pcapkit.protocols.misc.raw.data.Raw` classes will be used. + An explicit ``schema`` or ``data`` keyword is used as given. Dispatch registration is **opt-in**, like the ``engine=``/``protocol=``/ ``fmt=`` keywords of :class:`~pcapkit.foundation.engines.engine.Engine`, @@ -1513,17 +1550,17 @@ def __init_subclass__(cls, /, schema: 'Optional[Type[_ST]]' = None, :class:`~pcapkit.const.reg.ethertype.EtherType` member always means :class:`~pcapkit.protocols.link.link.Link`, and any :class:`~pcapkit.const.reg.linktype.LinkType` member means *both* - :class:`~pcapkit.protocols.misc.pcap.frame.Frame` **and** - :class:`~pcapkit.protocols.misc.pcapng.PCAPNG`; + :class:`~pcapkit.protocols.misc.pcap.frame.protocol.Frame` **and** + :class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG`; * a :class:`dict` mapping a destination class to a key, for a key that cannot name its own destination -- a raw :class:`int` port, for instance, is ambiguous between - :class:`~pcapkit.protocols.transport.tcp.TCP` and - :class:`~pcapkit.protocols.transport.udp.UDP`, and *must* use this + :class:`~pcapkit.protocols.transport.tcp.protocol.TCP` and + :class:`~pcapkit.protocols.transport.udp.protocol.UDP`, and *must* use this form; * an iterable mixing either of the above, to register the same class into several registries from a single declaration -- e.g. a - :class:`~pcapkit.protocols.link.l2tp.L2TP` subclass reachable both + :class:`~pcapkit.protocols.link.l2tp.protocol.L2TP` subclass reachable both by its IP protocol number and by a UDP port. The explicit mapping form is accepted even for a key whose type could @@ -1546,9 +1583,9 @@ def __init_subclass__(cls, /, schema: 'Optional[Type[_ST]]' = None, super().__init_subclass__() if schema is None: - schema = cast('Type[_ST]', getattr(schema_module, cls.__name__, Schema_Raw)) + schema = cast('Type[_ST]', _sibling_model(cls, 'schema')) if data is None: - data = cast('Type[_PT]', getattr(data_module, cls.__name__, Data_Raw)) + data = cast('Type[_PT]', _sibling_model(cls, 'data')) cls.__schema__ = schema cls.__data__ = data @@ -1671,7 +1708,7 @@ def __getitem__(self, key: 'str | Protocol | Type[Protocol]') -> 'ProtocolBase': return self # then check recursively - from pcapkit.protocols.misc.no_payload import \ + from pcapkit.protocols.misc.no_payload.protocol import \ NoPayload # pylint: disable=import-outside-toplevel payload = self._next @@ -1704,7 +1741,7 @@ def __contains__(self, name: 'str | Protocol | Type[Protocol]') -> 'bool': return True # then check recursively - from pcapkit.protocols.misc.no_payload import \ + from pcapkit.protocols.misc.no_payload.protocol import \ NoPayload # pylint: disable=import-outside-toplevel payload = self._next @@ -1773,8 +1810,8 @@ def _packing_target(self) -> 'Self': Note: A :meth:`pack` override that does not call this one has to build on this target too, as :meth:`Frame.pack - ` and - :meth:`PCAPNG.pack ` do. + ` and + :meth:`PCAPNG.pack ` do. The copy is shallow, so a :meth:`make` that mutates a container in place still reaches the instance's. @@ -1868,7 +1905,7 @@ def _get_payload(self) -> 'bytes': Payload of :attr:`self.__header__ ` as :obj:`bytes`. See Also: - This is a wrapper function for :meth:`pcapkit.protocols.schema.schema.Schema.get_payload`. + This is a wrapper function for :meth:`pcapkit.protocols.schema.Schema.get_payload`. """ return self.__header__.get_payload() @@ -2192,7 +2229,7 @@ def _read_packet(self, length: 'Optional[int]' = None, *, header: 'Optional[int] * If ``discard`` is set as :data:`True`, returns the packet body (in :obj:`bytes`) only. * Otherwise, returns the header and payload data as - :class:`~pcapkit.protocols.data.protocol.Packet` object. + :class:`~pcapkit.protocols.data.Packet` object. """ if header is not None: @@ -2564,7 +2601,7 @@ def _make_payload(cls, data: 'Data') -> 'ProtocolBase': This method uses ``__next_type__`` and ``__next_name__`` to determine the payload type and name. If either of them is missing or :data:`None`, or ``data`` holds nothing under ``__next_name__``, a - :class:`~pcapkit.protocols.misc.no_payload.NoPayload` instance will be + :class:`~pcapkit.protocols.misc.no_payload.protocol.NoPayload` instance will be returned, exactly as for a protocol with no next layer. Otherwise, the payload will be constructed by :meth:`Protocol.from_data `. @@ -2596,7 +2633,7 @@ def _make_payload(cls, data: 'Data') -> 'ProtocolBase': name = cast('Optional[str]', data.get('__next_name__')) if (proto is None or not (isinstance(proto, type) and issubclass(proto, ProtocolBase)) or name is None or name not in data): - from pcapkit.protocols.misc.no_payload import \ + from pcapkit.protocols.misc.no_payload.protocol import \ NoPayload # pylint: disable=import-outside-toplevel return NoPayload() @@ -2657,7 +2694,7 @@ def _lookup_next_layer(registry: 'DefaultDict[int, ModuleDescriptor[ProtocolBase Returns: The class registered for ``proto``, or the fallback ``registry`` - declares -- normally :class:`~pcapkit.protocols.misc.raw.Raw` -- when + declares -- normally :class:`~pcapkit.protocols.misc.raw.protocol.Raw` -- when ``proto`` is not registered. Important: @@ -2752,9 +2789,9 @@ def _import_next_layer(self, proto: 'int', length: 'Optional[int]' = None, *, length = len(file_) if min(length, len(file_)) == 0: - from pcapkit.protocols.misc.no_payload import NoPayload as protocol # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.misc.no_payload.protocol import NoPayload as protocol # isort: skip # pylint: disable=import-outside-toplevel elif self._sigterm: - from pcapkit.protocols.misc.raw import Raw as protocol # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.misc.raw.protocol import Raw as protocol # isort: skip # pylint: disable=import-outside-toplevel else: protocol = self._lookup_next_layer(self.__proto__, proto) @@ -2774,16 +2811,16 @@ def _parse_next_layer(klass: 'Type[ProtocolBase]', file_: 'bytes', length: 'int' **kwargs: keyword arguments for the next layer's constructor Returns: - Instance of ``klass``, or of :class:`~pcapkit.protocols.misc.raw.Raw` + Instance of ``klass``, or of :class:`~pcapkit.protocols.misc.raw.protocol.Raw` when fewer octets were captured than its header needs, or when it is past :data:`~pcapkit.utilities.config.FRAME_LAYER_LIMIT`. Note: - :meth:`Schema.unpack ` + :meth:`Schema.unpack ` zero-fills a field the stream ends inside, so a header parsed from too few octets is filled with values that were never on the wire, and :meth:`from_data ` rebuilds them (:issue:`1170`). - Such a payload is kept as :class:`~pcapkit.protocols.misc.raw.Raw` + Such a payload is kept as :class:`~pcapkit.protocols.misc.raw.protocol.Raw` instead, as an unparseable one is. The captured octets are the first ``length`` of ``file_``, or all of @@ -2794,7 +2831,7 @@ def _parse_next_layer(klass: 'Type[ProtocolBase]', file_: 'bytes', length: 'int' header it parsed, :attr:`length ` octets long, fits in them anyway: for a variable-length header such as - :class:`~pcapkit.protocols.link.l2tpv2.L2TPv2` the hint is the longest + :class:`~pcapkit.protocols.link.l2tpv2.protocol.L2TPv2` the hint is the longest form rather than the shortest. A next layer that reports no hint is kept as parsed. @@ -2818,7 +2855,7 @@ def _parse_next_layer(klass: 'Type[ProtocolBase]', file_: 'bytes', length: 'int' A layer past :data:`~pcapkit.utilities.config.FRAME_LAYER_LIMIT` in its frame is not parsed: it and the rest of the frame are kept as - :class:`~pcapkit.protocols.misc.raw.Raw`, marked + :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, marked :attr:`_past_layer_limit`, with one :exc:`~pcapkit.utilities.warnings.ProtocolWarning` (:issue:`1610`). @@ -2829,8 +2866,8 @@ def _parse_next_layer(klass: 'Type[ProtocolBase]', file_: 'bytes', length: 'int' depth = frame_depth.get() + 1 limit = config.FRAME_LAYER_LIMIT if limit != -1 and depth > limit: - from pcapkit.protocols.misc.no_payload import NoPayload # isort: skip # pylint: disable=import-outside-toplevel - from pcapkit.protocols.misc.raw import Raw # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.misc.no_payload.protocol import NoPayload # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.misc.raw.protocol import Raw # isort: skip # pylint: disable=import-outside-toplevel # NOTE: Nothing is lost if the next layer is raw already, or empty. if klass is not Raw and klass is not NoPayload: @@ -2865,7 +2902,7 @@ def _parse_next_layer(klass: 'Type[ProtocolBase]', file_: 'bytes', length: 'int' finally: frame_depth.reset(token) if held.discard: - from pcapkit.protocols.misc.raw import Raw # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.misc.raw.protocol import Raw # isort: skip # pylint: disable=import-outside-toplevel next_ = Raw(file_, length, **kwargs) return next_ @@ -2977,12 +3014,15 @@ def __init_subclass__(cls, /, schema: 'Optional[Type[_ST]]' = None, attributes of the subclass. Notes: - When ``schema`` and/or ``data`` is not specified, the method will first - try to find the corresponding class in the - :mod:`~pcapkit.protocols.schema` and :mod:`~pcapkit.protocols.data` - modules respectively. If the class is not found, the default - :class:`~pcapkit.protocols.schema.misc.raw.Raw` and - :class:`~pcapkit.protocols.data.misc.raw.Raw` classes will be used. + When ``schema`` and/or ``data`` is not specified, the method looks + for the class of the subclass's own name in the ``schema`` and + ``data`` modules beside the ``protocol`` module that defines it, as + :class:`~pcapkit.protocols.link.l2tp.protocol.L2TP` finds + :class:`~pcapkit.protocols.link.l2tp.schema.L2TP` + (:issue:`2534`). If there is none, the default + :class:`~pcapkit.protocols.misc.raw.schema.Raw` and + :class:`~pcapkit.protocols.misc.raw.data.Raw` classes will be used. + An explicit ``schema`` or ``data`` keyword is used as given. This method also registers the subclass to the protocol registry, i.e., :attr:`pcapkit.protocols.__proto__`. That registration is diff --git a/pcapkit/protocols/schema/schema.py b/pcapkit/protocols/schema.py similarity index 98% rename from pcapkit/protocols/schema/schema.py rename to pcapkit/protocols/schema.py index 7b03f81a45..2ece409a3b 100644 --- a/pcapkit/protocols/schema/schema.py +++ b/pcapkit/protocols/schema.py @@ -138,7 +138,7 @@ class marked with a user's own ``from typing import final`` on 3.10 is # place of the omitted values, so that it could not be packed at all and # failed with an error naming a field class rather than a field. # - # :class:`~pcapkit.protocols.schema.misc.no_payload.NoPayload` is what the test + # :class:`~pcapkit.protocols.misc.no_payload.schema.NoPayload` is what the test # protects: it declares an argument-less ``__init__`` of its own so that no # generated one displaces it. if '__init__' not in cls.__dict__: @@ -291,7 +291,7 @@ def __prepare__(cls, name: 'str', bases: 'tuple[type, ...]', /, **kwds: 'Any') - #: **kwargs)``), so a class keyword spelled the same as any of them binds #: that parameter twice: ``TypeError: ABCMeta.__new__() got multiple #: values for argument '...'``. ``namespace`` collides this way, which is why - #: :mod:`pcapkit.protocols.schema.misc.pcapng`'s :class:`~pcapkit.protocols.schema.misc.pcapng.Option` subclasses + #: :mod:`pcapkit.protocols.misc.pcapng.schema`'s :class:`~pcapkit.protocols.misc.pcapng.schema.Option` subclasses #: spell it ``ns=`` instead. #: #: ``cls`` collides one level *later*: every ``__init_subclass__`` is an @@ -533,7 +533,7 @@ class will consider negative value as a placeholder. packet.update(self.__dict__) # NOTE: ``pre_unpack`` is called here as well as from the unpacking path # since a schema may seed ``packet`` keys that both paths need, as - # ``pcapkit.protocols.schema.internet.hip.EncryptedParameter`` does. + # ``pcapkit.protocols.internet.hip.schema.EncryptedParameter`` does. # ``pre_pack`` is what carries the packing-only preparation, such as the # PCAP-NG section header block's byte order magic, which no field of the # schema holds and which therefore cannot be recovered from @@ -593,8 +593,8 @@ class will consider negative value as a placeholder. elif isinstance(data, (list, tuple)): # NOTE: a data model may declare a field ``tuple[...]`` # rather than ``list[...]`` -- e.g. HIP's ``group_id: - # 'tuple[Group, ...]'`` in pcapkit/protocols/data/internet/ - # hip.py -- and ``_read_*`` then hands one straight back + # 'tuple[Group, ...]'`` in + # pcapkit/protocols/internet/hip/data.py -- and ``_read_*`` then hands one straight back # here on reconstruction. ``ListField.pack`` only ever # iterates its argument, so it accepts either, and # rejecting the tuple would break parse-then-reconstruct for @@ -1201,7 +1201,7 @@ def __iter__(self) -> 'Iterator[str]': def __getitem__(self, name: 'str') -> '_VT': # NOTE: Serves every key :meth:`__iter__` yields, not only the declared # fields: a ``post_process`` may store derived values on the instance, - # as :class:`~pcapkit.protocols.schema.internet.ipv4.TSOption` does, and + # as :class:`~pcapkit.protocols.internet.ipv4.schema.TSOption` does, and # iteration reports them, so ``dict(schema)`` must be able to read them # back (#1291). A mangled key is reachable only under the name # it was mangled from, as in iteration. @@ -1280,7 +1280,7 @@ def _frame_end_field(self) -> 'Optional[str]': Returns: The last field sized by what is left of the length the layer was - given, as :class:`~pcapkit.protocols.schema.link.gre.GRE`'s payload + given, as :class:`~pcapkit.protocols.link.gre.schema.GRE`'s payload is: the message runs on in it to the end of whatever holds it. :data:`None` where the last field is instead fixed or sized by the header, as UDP's payload is by its Length and an HTTP/2 frame's by @@ -1322,7 +1322,7 @@ class _EnumRegistry(collections.defaultdict): :attr:`EnumSchema.registry` (and its class-level twin, :attr:`EnumMeta.registry - `) is read with a bare + `) is read with a bare ``registry[code]`` at many call sites across the schema layer, e.g. ``Option.registry[type]``. A plain :class:`collections.defaultdict` inserts whatever @@ -1454,11 +1454,11 @@ def registry(self) -> 'DefaultDict[_ET, Type[Self]]': Note: This property answers on an instance; on the class, the same - mapping is served by :attr:`EnumMeta.registry `. + mapping is served by :attr:`EnumMeta.registry `. Important: See :attr:`EnumMeta.registry - `: the + `: the returned mapping is a :class:`_EnumRegistry`, so looking up an unregistered ``code`` returns the default schema without recording ``code`` as if it @@ -1484,7 +1484,7 @@ def register(cls, code: '_ET', schema: 'Type[Self]') -> 'None': :mod:`pcapkit.foundation.registry.protocols` that accepts a ``schema`` registers two halves of one binding -- a parser class through e.g. :meth:`IPv4.register_option - `, and a + `, and a schema class through this method. Both warn on an overwrite, so one ``register_ipv4_option`` call replacing a built-in reports the schema it displaced as well as the parser. @@ -1502,7 +1502,7 @@ def register(cls, code: '_ET', schema: 'Type[Self]') -> 'None': registration for that code warn about an entry no caller ever asked for. - :class:`pcapkit.protocols.schema.misc.pcapng.Option` overrides this + :class:`pcapkit.protocols.misc.pcapng.schema.Option` overrides this method with a namespaced registry of its own and does not delegate here, so it is guarded separately. @@ -1545,7 +1545,7 @@ def __init_subclass__(cls, /, code: 'Optional[_ET | Iterable[_ET]]' = None, *arg define :attr:`__enum__` manually. Such a manual definition may use a plain :class:`collections.defaultdict` -- e.g. to seed a namespaced or nested mapping such as - :class:`pcapkit.protocols.schema.misc.pcapng.Option`'s -- so it is + :class:`pcapkit.protocols.misc.pcapng.schema.Option`'s -- so it is swapped for the retention-safe :class:`_EnumRegistry` below, before anything else can hold a reference to the original object. @@ -1576,7 +1576,7 @@ def __init_subclass__(cls, /, code: 'Optional[_ET | Iterable[_ET]]' = None, *arg if code is not None: # One loop over both shapes, so the overwrite guard below is written # once rather than once per branch. ``register`` cannot be delegated - # to here: :class:`pcapkit.protocols.schema.misc.pcapng.Option` + # to here: :class:`pcapkit.protocols.misc.pcapng.schema.Option` # overrides it with an incompatible signature, so ``cls.register`` # does not mean the same thing for every subclass. codes = code if isinstance(code, collections.abc.Iterable) else (code,) diff --git a/pcapkit/protocols/schema/__init__.py b/pcapkit/protocols/schema/__init__.py deleted file mode 100644 index b7a1ad579f..0000000000 --- a/pcapkit/protocols/schema/__init__.py +++ /dev/null @@ -1,251 +0,0 @@ -# -*- coding: utf-8 -*- -# pylint: disable=unused-wildcard-import -"""header schema for protocols""" - -# Base Class for Header Schema -from pcapkit.protocols.schema.schema import * - -# Link Layer Protocols -from pcapkit.protocols.schema.link import * - -# Internet Layer Protocols -from pcapkit.protocols.schema.internet import * - -# Transport Layer Protocols -from pcapkit.protocols.schema.transport import * - -# Application Layer Protocols -from pcapkit.protocols.schema.application import * - -# Utility Classes for Protocols -from pcapkit.protocols.schema.misc import * - -__all__ = [ - # Base classes for header schemas - 'Schema', 'EnumSchema', 'schema_final', - - # Link Layer Protocols - 'ARP', - 'Ethernet', - 'FRAD', - 'GRE', - 'IEEE802_11', - 'L2TP', - 'LinuxSLL1', 'LinuxSLL2', - 'Loopback', - 'Netlink', - 'Radiotap', - 'Radiotap_Field', 'Radiotap_Unknown', 'Radiotap_TSFT', 'Radiotap_Flags', 'Radiotap_Rate', - 'Radiotap_Channel', 'Radiotap_FHSS', 'Radiotap_AntennaSignal', 'Radiotap_AntennaNoise', - 'Radiotap_LockQuality', 'Radiotap_TXAttenuation', 'Radiotap_DBTXAttenuation', - 'Radiotap_DBmTXPower', 'Radiotap_Antenna', 'Radiotap_DBAntennaSignal', - 'Radiotap_DBAntennaNoise', 'Radiotap_RXFlags', 'Radiotap_TXFlags', 'Radiotap_RTSRetries', - 'Radiotap_DataRetries', 'Radiotap_MCS', 'Radiotap_AMPDUStatus', 'Radiotap_VHT', - 'Radiotap_Timestamp', 'Radiotap_HE', 'Radiotap_HEMU', 'Radiotap_HEMUOtherUser', - 'Radiotap_ZeroLengthPSDU', 'Radiotap_LSIG', 'Radiotap_VendorNamespace', 'Radiotap_S1G', - 'Radiotap_USIG', 'Radiotap_EHT', 'Radiotap_TLV', 'Radiotap_VendorTLV', - 'VLAN', 'VLAN_TCI', - - # Internet Layer Protocols - 'AH', - 'ESP', - 'HIP', - 'HIP_LocatorData', 'HIP_Locator', 'HIP_ECDSACurveHostIdentity', 'HIP_ECDSALowCurveHostIdentity', - 'HIP_EdDSACurveHostIdentity', 'HIP_HostIdentity', - 'HIP_UnassignedParameter', 'HIP_ESPInfoParameter', 'HIP_R1CounterParameter', - 'HIP_LocatorSetParameter', 'HIP_PuzzleParameter', 'HIP_SolutionParameter', - 'HIP_SEQParameter', 'HIP_ACKParameter', 'HIP_DHGroupListParameter', - 'HIP_DiffieHellmanParameter', 'HIP_HIPTransformParameter', 'HIP_HIPCipherParameter', - 'HIP_NATTraversalModeParameter', 'HIP_TransactionPacingParameter', 'HIP_EncryptedParameter', - 'HIP_HostIDParameter', 'HIP_HITSuiteListParameter', 'HIP_CertParameter', - 'HIP_NotificationParameter', 'HIP_EchoRequestSignedParameter', 'HIP_RegInfoParameter', - 'HIP_RegRequestParameter', 'HIP_RegResponseParameter', 'HIP_RegFailedParameter', - 'HIP_RegFromParameter', 'HIP_EchoResponseSignedParameter', 'HIP_TransportFormatListParameter', - 'HIP_ESPTransformParameter', 'HIP_SeqDataParameter', 'HIP_AckDataParameter', - 'HIP_PayloadMICParameter', 'HIP_TransactionIDParameter', 'HIP_OverlayIDParameter', - 'HIP_RouteDstParameter', 'HIP_HIPTransportModeParameter', 'HIP_HIPMACParameter', - 'HIP_HIPMAC2Parameter', 'HIP_HIPSignature2Parameter', 'HIP_HIPSignatureParameter', - 'HIP_EchoRequestUnsignedParameter', 'HIP_EchoResponseUnsignedParameter', 'HIP_RelayFromParameter', - 'HIP_RelayToParameter', 'HIP_OverlayTTLParameter', 'HIP_RouteViaParameter', - 'HIP_FromParameter', 'HIP_RVSHMACParameter', 'HIP_ViaRVSParameter', - 'HIP_RelayHMACParameter', - 'HOPOPT', - 'HOPOPT_SMFDPDOption', 'HOPOPT_QuickStartOption', - 'HOPOPT_UnassignedOption', 'HOPOPT_PadOption', 'HOPOPT_TunnelEncapsulationLimitOption', - 'HOPOPT_RouterAlertOption', 'HOPOPT_CALIPSOOption', 'HOPOPT_SMFIdentificationBasedDPDOption', - 'HOPOPT_SMFHashBasedDPDOption', 'HOPOPT_PDMOption', 'HOPOPT_QuickStartRequestOption', - 'HOPOPT_QuickStartReportOption', 'HOPOPT_RPLOption', 'HOPOPT_MPLOption', 'HOPOPT_ILNPOption', - 'HOPOPT_LineIdentificationOption', 'HOPOPT_JumboPayloadOption', 'HOPOPT_HomeAddressOption', - 'HOPOPT_IPDFFOption', - 'IP_Pseudo', - - 'ICMPv4', - 'ICMPv4_ICMPv4Type', - 'ICMPv4_Unknown', 'ICMPv4_Echo', 'ICMPv4_DestinationUnreachable', 'ICMPv4_TimeExceeded', - 'ICMPv4_ParameterProblem', - 'ICMPv6', - 'ICMPv6_ICMPv6Type', - 'ICMPv6_Unknown', 'ICMPv6_DestinationUnreachable', 'ICMPv6_PacketTooBig', 'ICMPv6_TimeExceeded', - 'ICMPv6_ParameterProblem', 'ICMPv6_Echo', - 'IPv4', - 'IPv4_Option', - 'IPv4_UnassignedOption', 'IPv4_EOOLOption', 'IPv4_NOPOption', - 'IPv4_SECOption', 'IPv4_LSROption', 'IPv4_TSOption', - 'IPv4_ESECOption', 'IPv4_RROption', 'IPv4_SIDOption', - 'IPv4_SSROption', 'IPv4_MTUPOption', 'IPv4_MTUROption', - 'IPv4_TROption', 'IPv4_RTRALTOption', 'IPv4_QSOption', - 'IPv4_QuickStartRequestOption', 'IPv4_QuickStartReportOption', - 'IPv6_Frag', - 'IPv6_Ext', - 'IPv6_Opts', - 'IPv6_Opts_SMFDPDOption', 'IPv6_Opts_QuickStartOption', - 'IPv6_Opts_UnassignedOption', 'IPv6_Opts_PadOption', 'IPv6_Opts_TunnelEncapsulationLimitOption', - 'IPv6_Opts_RouterAlertOption', 'IPv6_Opts_CALIPSOOption', 'IPv6_Opts_SMFIdentificationBasedDPDOption', - 'IPv6_Opts_SMFHashBasedDPDOption', 'IPv6_Opts_PDMOption', 'IPv6_Opts_QuickStartRequestOption', - 'IPv6_Opts_QuickStartReportOption', 'IPv6_Opts_RPLOption', 'IPv6_Opts_MPLOption', 'IPv6_Opts_ILNPOption', - 'IPv6_Opts_LineIdentificationOption', 'IPv6_Opts_JumboPayloadOption', 'IPv6_Opts_HomeAddressOption', - 'IPv6_Opts_IPDFFOption', - 'IPv6_Route', - 'IPv6_Route_RoutingType', - 'IPv6_Route_UnknownType', 'IPv6_Route_SourceRoute', 'IPv6_Route_Type2', 'IPv6_Route_RPL', - 'IGMP', 'IGMPv3', 'IGMPv3_Query', 'IGMPv3_QueryExtension', 'IGMPv3_Report', - 'IGMPv3_GroupRecord', - 'IPv6', - 'IPX', - 'MH', - 'MH_Packet', - 'MH_UnknownMessage', 'MH_BindingRefreshRequestMessage', 'MH_HomeTestInitMessage', 'MH_CareofTestInitMessage', - 'MH_HomeTestMessage', 'MH_CareofTestMessage', 'MH_BindingUpdateMessage', 'MH_BindingAcknowledgementMessage', - 'MH_BindingErrorMessage', 'MH_FastBindingUpdateMessage', 'MH_FastBindingAcknowledgmentMessage', - 'MH_FastNeighborAdvertisementMessage', 'MH_ExperimentalMessage', 'MH_HandoverInitiateMessage', - 'MH_HandoverAcknowledgeMessage', 'MH_HeartbeatMessage', 'MH_HomeAgentSwitchMessage', 'MH_BindingRevocationMessage', - 'MH_LocalizedRoutingInitiationMessage', 'MH_LocalizedRoutingAcknowledgmentMessage', 'MH_UpdateNotificationMessage', - 'MH_UpdateNotificationAcknowledgementMessage', 'MH_FlowBindingMessage', 'MH_SubscriptionQueryMessage', - 'MH_SubscriptionResponseMessage', - 'MH_Option', - 'MH_UnassignedOption', 'MH_PadOption', 'MH_BindingRefreshAdviceOption', 'MH_AlternateCareofAddressOption', - 'MH_NonceIndicesOption', 'MH_AuthorizationDataOption', 'MH_MobileNetworkPrefixOption', 'MH_LinkLayerAddressOption', - 'MH_MNIDOption', 'MH_AuthOption', 'MH_MesgIDOption', 'MH_CGAParametersRequestOption', 'MH_CGAParametersOption', - 'MH_SignatureOption', 'MH_PermanentHomeKeygenTokenOption', 'MH_CareofTestInitOption', 'MH_CareofTestOption', - 'MH_ExperimentalMobilityOption', 'MH_BADFOption', 'MH_IPv6AddressPrefixOption', 'MH_HomeNetworkPrefixOption', - 'MH_HandoffIndicatorOption', 'MH_AccessTechnologyTypeOption', 'MH_MNLLIdentifierOption', - 'MH_LinkLocalAddressOption', 'MH_TimestampOption', 'MH_RestartCounterOption', 'MH_DNSUpdateOption', - 'MH_VendorSpecificOption', 'MH_ServiceSelectionOption', 'MH_IPv4HomeAddressOption', - 'MH_IPv4AddressAcknowledgementOption', 'MH_NATDetectionOption', 'MH_IPv4CareofAddressOption', 'MH_GREKeyOption', - 'MH_BindingIdentifierOption', 'MH_IPv4HomeAddressRequestOption', 'MH_IPv4HomeAddressReplyOption', - 'MH_IPv4DefaultRouterAddressOption', 'MH_IPv4DHCPSupportModeOption', 'MH_ContextRequestOption', - 'MH_LMAAddressOption', 'MH_MNLLAIIDOption', 'MH_TransientBindingOption', 'MH_FlowSummaryOption', - 'MH_FlowIdentificationOption', 'MH_RedirectCapabilityOption', 'MH_RedirectOption', 'MH_LoadInformationOption', - 'MH_AlternateIPv4CareofAddressOption', 'MH_MNGroupIdentifierOption', 'MH_MAGIPv6AddressOption', - 'MH_AccessNetworkIdentifierOption', 'MH_IPv4TrafficOffloadSelectorOption', 'MH_DynamicIPMulticastSelectorOption', - 'MH_DelegatedMNPOption', 'MH_ActiveMulticastSubscriptionIPv4Option', 'MH_ActiveMulticastSubscriptionIPv6Option', - 'MH_QualityOfServiceOption', 'MH_LMAUserPlaneAddressOption', 'MH_MulticastMobilityOption', - 'MH_MulticastAcknowledgementOption', 'MH_LMAControlledMAGParametersOption', 'MH_MAGMultipathBindingOption', - 'MH_MAGIdentifierOption', 'MH_AnchoredPrefixOption', 'MH_LocalPrefixOption', 'MH_PreviousMAAROption', - 'MH_ServingMAAROption', 'MH_DLIFLinkLocalAddressOption', 'MH_DLIFLinkLayerAddressOption', - 'MH_FlowIdentificationSuboption', - 'MH_UnassignedFlowIdentificationSuboption', 'MH_PadFlowIdentificationSuboption', 'MH_BIDReferenceSuboption', - 'MH_TrafficSelectorSuboption', 'MH_FlowBindingActionSuboption', 'MH_TargetCareofAddressSuboption', - 'MH_ANISuboption', - 'MH_UnassignedANISuboption', 'MH_ANINetworkIdentifierSuboption', 'MH_ANIGeoLocationSuboption', - 'MH_ANIOperatorIdentifierSuboption', 'MH_ANICivicLocationSuboption', 'MH_ANIMAGGroupIdentifierSuboption', - 'MH_ANIUpdateTimerSuboption', - 'MH_QoSAttribute', - 'MH_UnassignedQoSAttribute', 'MH_BitRateAttribute', 'MH_PerSessionBitRateAttribute', - 'MH_AllocationRetentionPriorityAttribute', 'MH_QoSTrafficSelectorAttribute', 'MH_QoSVendorSpecificAttribute', - 'MH_LMAControlledMAGSuboption', - 'MH_UnassignedLMAControlledMAGSuboption', 'MH_BindingReregistrationControlSuboption', - 'MH_HeartbeatControlSuboption', - 'MH_CGAParameter', - 'MH_CGAExtension', - 'MH_UnknownExtension', 'MH_MultiPrefixExtension', 'MH_ExperimentalExtension', - - # Transport Layer Protocols - 'DCCP', - 'DCCP_Option', - 'DCCP_UnassignedOption', 'DCCP_Padding', 'DCCP_Mandatory', 'DCCP_SlowReceiver', 'DCCP_Change', - 'DCCP_Confirm', 'DCCP_InitCookie', 'DCCP_NDPCount', 'DCCP_AckVector', 'DCCP_DataDropped', - 'DCCP_Timestamp', 'DCCP_TimestampEcho', 'DCCP_ElapsedTime', 'DCCP_DataChecksum', - 'TCP', - 'TCP_SACKBlock', - 'TCP_Option', - 'TCP_UnassignedOption', 'TCP_EndOfOptionList', 'TCP_NoOperation', 'TCP_MaximumSegmentSize', 'TCP_WindowScale', - 'TCP_SACKPermitted', 'TCP_SACK', 'TCP_Echo', 'TCP_EchoReply', 'TCP_Timestamps', 'TCP_PartialOrderConnectionPermitted', # pylint: disable=line-too-long - 'TCP_PartialOrderServiceProfile', 'TCP_CC', 'TCP_CCNew', 'TCP_CCEcho', 'TCP_AlternateChecksumRequest', - 'TCP_AlternateChecksumData', 'TCP_MD5Signature', 'TCP_QuickStartResponse', 'TCP_UserTimeout', - 'TCP_Authentication', 'TCP_FastOpenCookie', - 'TCP_MPTCP', - 'TCP_MPTCPUnknown', 'TCP_MPTCPCapable', 'TCP_MPTCPDSS', 'TCP_MPTCPAddAddress', 'TCP_MPTCPRemoveAddress', - 'TCP_MPTCPPriority', 'TCP_MPTCPFallback', 'TCP_MPTCPFastclose', - 'TCP_MPTCPJoin', - 'TCP_MPTCPJoinSYN', 'TCP_MPTCPJoinSYNACK', 'TCP_MPTCPJoinACK', - 'UDP', - - # Stream Control Transmission Protocol - 'SCTP', - 'SCTP_GapAckBlock', - 'SCTP_Chunk', - 'SCTP_UnknownChunk', 'SCTP_DATAChunk', 'SCTP_INITChunk', 'SCTP_INITACKChunk', 'SCTP_SACKChunk', - 'SCTP_HeartbeatChunk', 'SCTP_HeartbeatACKChunk', 'SCTP_AbortChunk', 'SCTP_ShutdownChunk', - 'SCTP_ShutdownACKChunk', 'SCTP_ErrorChunk', 'SCTP_CookieEchoChunk', 'SCTP_CookieACKChunk', - 'SCTP_ShutdownCompleteChunk', - 'SCTP_Parameter', - 'SCTP_UnknownParameter', 'SCTP_HeartbeatInfoParameter', 'SCTP_IPv4AddressParameter', - 'SCTP_IPv6AddressParameter', 'SCTP_StateCookieParameter', 'SCTP_UnrecognizedParameter', - 'SCTP_CookiePreservativeParameter', 'SCTP_HostNameAddressParameter', - 'SCTP_SupportedAddressTypesParameter', - 'SCTP_ErrorCause', - 'SCTP_UnknownCause', 'SCTP_InvalidStreamIdentifierCause', - 'SCTP_MissingMandatoryParameterCause', 'SCTP_StaleCookieCause', 'SCTP_OutOfResourceCause', - 'SCTP_UnresolvableAddressCause', 'SCTP_UnrecognizedChunkTypeCause', - 'SCTP_InvalidMandatoryParameterCause', 'SCTP_UnrecognizedParametersCause', - 'SCTP_NoUserDataCause', 'SCTP_CookieReceivedWhileShuttingDownCause', - 'SCTP_RestartOfAnAssociationWithNewAddressesCause', 'SCTP_UserInitiatedAbortCause', - 'SCTP_ProtocolViolationCause', - - # Application Layer Protocols - 'DTLS', 'DTLS_Ciphertext', 'DTLS_CIDCiphertext', - 'FTP', - 'NGAP', - 'OSPF', 'OSPF_CryptographicAuthentication', - 'SSLv2', 'SSLv2_HandshakeBody', 'SSLv2_UnknownHandshakeBody', - 'SSLv2_ClientHello', 'SSLv2_ServerHello', - 'HTTPv1', - 'HTTPv2', - 'HTTPv2_FrameType', - 'HTTPv2_UnassignedFrame', 'HTTPv2_DataFrame', 'HTTPv2_HeadersFrame', 'HTTPv2_PriorityFrame', - 'HTTPv2_RSTStreamFrame', 'HTTPv2_SettingsFrame', 'HTTPv2_PushPromiseFrame', 'HTTPv2_PingFrame', - 'HTTPv2_GoawayFrame', 'HTTPv2_WindowUpdateFrame', 'HTTPv2_ContinuationFrame', - 'TLS', - - # PCAP file format - 'Header', - 'Frame', - - # PCAP-NG file format - 'PCAPNG', - 'PCAPNG_Option', 'PCAPNG_UnknownOption', - 'PCAPNG_EndOfOption', 'PCAPNG_CommentOption', 'PCAPNG_CustomOption', - 'PCAPNG_IF_NameOption', 'PCAPNG_IF_DescriptionOption', 'PCAPNG_IF_IPv4AddrOption', 'PCAPNG_IF_IPv6AddrOption', - 'PCAPNG_IF_MACAddrOption', 'PCAPNG_IF_EUIAddrOption', 'PCAPNG_IF_SpeedOption', 'PCAPNG_IF_TSResolOption', - 'PCAPNG_IF_TZoneOption', 'PCAPNG_IF_FilterOption', 'PCAPNG_IF_OSOption', 'PCAPNG_IF_FCSLenOption', - 'PCAPNG_IF_TSOffsetOption', 'PCAPNG_IF_HardwareOption', 'PCAPNG_IF_TxSpeedOption', 'PCAPNG_IF_RxSpeedOption', - 'PCAPNG_EPB_FlagsOption', 'PCAPNG_EPB_HashOption', 'PCAPNG_EPB_DropCountOption', 'PCAPNG_EPB_PacketIDOption', - 'PCAPNG_EPB_QueueOption', 'PCAPNG_EPB_VerdictOption', - 'PCAPNG_NS_DNSNameOption', 'PCAPNG_NS_DNSIP4AddrOption', 'PCAPNG_NS_DNSIP6AddrOption', - 'PCAPNG_ISB_StartTimeOption', 'PCAPNG_ISB_EndTimeOption', 'PCAPNG_ISB_IFRecvOption', 'PCAPNG_ISB_IFDropOption', - 'PCAPNG_ISB_FilterAcceptOption', 'PCAPNG_ISB_OSDropOption', 'PCAPNG_ISB_UsrDelivOption', - 'PCAPNG_PACK_FlagsOption', 'PCAPNG_PACK_HashOption', - 'PCAPNG_NameResolutionRecord', 'PCAPNG_UnknownRecord', 'PCAPNG_EndRecord', 'PCAPNG_IPv4Record', 'PCAPNG_IPv6Record', - 'PCAPNG_DSBSecrets', 'PCAPNG_UnknownSecrets', 'PCAPNG_TLSKeyLog', 'PCAPNG_WireGuardKeyLog', 'PCAPNG_ZigBeeNWKKey', - 'PCAPNG_ZigBeeAPSKey', - 'PCAPNG_BlockType', - 'PCAPNG_UnknownBlock', 'PCAPNG_SectionHeaderBlock', 'PCAPNG_InterfaceDescriptionBlock', - 'PCAPNG_EnhancedPacketBlock', 'PCAPNG_SimplePacketBlock', 'PCAPNG_NameResolutionBlock', - 'PCAPNG_InterfaceStatisticsBlock', 'PCAPNG_SystemdJournalExportBlock', 'PCAPNG_DecryptionSecretsBlock', - 'PCAPNG_CustomBlock', 'PCAPNG_PacketBlock', - - # misc protocols - 'NoPayload', - 'Raw', -] diff --git a/pcapkit/protocols/schema/application/__init__.py b/pcapkit/protocols/schema/application/__init__.py deleted file mode 100644 index f0f4785526..0000000000 --- a/pcapkit/protocols/schema/application/__init__.py +++ /dev/null @@ -1,80 +0,0 @@ -# -*- coding: utf-8 -*- -"""header schema for application layer protocols""" - -# Datagram Transport Layer Security -from pcapkit.protocols.schema.application.dtls import DTLS -from pcapkit.protocols.schema.application.dtls import DTLSCIDCiphertext as DTLS_CIDCiphertext -from pcapkit.protocols.schema.application.dtls import DTLSCiphertext as DTLS_Ciphertext - -# File Transfer Protocol -from pcapkit.protocols.schema.application.ftp import FTP - -# Hypertext Transfer Protocol (HTTP/1.*) -from pcapkit.protocols.schema.application.httpv1 import HTTPv1 - -# Hypertext Transfer Protocol (HTTP/2) -from pcapkit.protocols.schema.application.httpv2 import HTTPv2 -from pcapkit.protocols.schema.application.httpv2 import \ - ContinuationFrame as HTTPv2_ContinuationFrame -from pcapkit.protocols.schema.application.httpv2 import DataFrame as HTTPv2_DataFrame -from pcapkit.protocols.schema.application.httpv2 import FrameType as HTTPv2_FrameType -from pcapkit.protocols.schema.application.httpv2 import GoawayFrame as HTTPv2_GoawayFrame -from pcapkit.protocols.schema.application.httpv2 import HeadersFrame as HTTPv2_HeadersFrame -from pcapkit.protocols.schema.application.httpv2 import PingFrame as HTTPv2_PingFrame -from pcapkit.protocols.schema.application.httpv2 import PriorityFrame as HTTPv2_PriorityFrame -from pcapkit.protocols.schema.application.httpv2 import PushPromiseFrame as HTTPv2_PushPromiseFrame -from pcapkit.protocols.schema.application.httpv2 import RSTStreamFrame as HTTPv2_RSTStreamFrame -from pcapkit.protocols.schema.application.httpv2 import SettingsFrame as HTTPv2_SettingsFrame -from pcapkit.protocols.schema.application.httpv2 import UnassignedFrame as HTTPv2_UnassignedFrame -from pcapkit.protocols.schema.application.httpv2 import \ - WindowUpdateFrame as HTTPv2_WindowUpdateFrame - -# NG Application Protocol -from pcapkit.protocols.schema.application.ngap import NGAP - -# Open Shortest Path First -from pcapkit.protocols.schema.application.ospf import OSPF -from pcapkit.protocols.schema.application.ospf import \ - CryptographicAuthentication as OSPF_CryptographicAuthentication - -# Secure Sockets Layer version 2 -from pcapkit.protocols.schema.application.sslv2 import ClientHello as SSLv2_ClientHello -from pcapkit.protocols.schema.application.sslv2 import HandshakeBody as SSLv2_HandshakeBody -from pcapkit.protocols.schema.application.sslv2 import ServerHello as SSLv2_ServerHello -from pcapkit.protocols.schema.application.sslv2 import SSLv2 -from pcapkit.protocols.schema.application.sslv2 import \ - UnknownHandshakeBody as SSLv2_UnknownHandshakeBody - -# Transport Layer Security -from pcapkit.protocols.schema.application.tls import TLS - -__all__ = [ - # Datagram Transport Layer Security - 'DTLS', 'DTLS_Ciphertext', 'DTLS_CIDCiphertext', - - # File Transfer Protocol - 'FTP', - - # Hypertext Transfer Protocol (HTTP/1.*) - 'HTTPv1', - - # Hypertext Transfer Protocol (HTTP/2) - 'HTTPv2', - 'HTTPv2_FrameType', - 'HTTPv2_UnassignedFrame', 'HTTPv2_DataFrame', 'HTTPv2_HeadersFrame', 'HTTPv2_PriorityFrame', - 'HTTPv2_RSTStreamFrame', 'HTTPv2_SettingsFrame', 'HTTPv2_PushPromiseFrame', 'HTTPv2_PingFrame', - 'HTTPv2_GoawayFrame', 'HTTPv2_WindowUpdateFrame', 'HTTPv2_ContinuationFrame', - - # NG Application Protocol - 'NGAP', - - # Open Shortest Path First - 'OSPF', 'OSPF_CryptographicAuthentication', - - # Secure Sockets Layer version 2 - 'SSLv2', 'SSLv2_HandshakeBody', 'SSLv2_UnknownHandshakeBody', - 'SSLv2_ClientHello', 'SSLv2_ServerHello', - - # Transport Layer Security - 'TLS', -] diff --git a/pcapkit/protocols/schema/internet/__init__.py b/pcapkit/protocols/schema/internet/__init__.py deleted file mode 100644 index d167ab0a3d..0000000000 --- a/pcapkit/protocols/schema/internet/__init__.py +++ /dev/null @@ -1,554 +0,0 @@ -# -*- coding: utf-8 -*- -"""header schema for internet layer protocols""" - -# Authentication Header -from pcapkit.protocols.schema.internet.ah import AH - -# Encapsulating Security Payload -from pcapkit.protocols.schema.internet.esp import ESP - -# Host Identity Protocol -from pcapkit.protocols.schema.internet.hip import HIP -from pcapkit.protocols.schema.internet.hip import AckDataParameter as HIP_AckDataParameter -from pcapkit.protocols.schema.internet.hip import ACKParameter as HIP_ACKParameter -from pcapkit.protocols.schema.internet.hip import CertParameter as HIP_CertParameter -from pcapkit.protocols.schema.internet.hip import DHGroupListParameter as HIP_DHGroupListParameter -from pcapkit.protocols.schema.internet.hip import \ - DiffieHellmanParameter as HIP_DiffieHellmanParameter -from pcapkit.protocols.schema.internet.hip import \ - ECDSACurveHostIdentity as HIP_ECDSACurveHostIdentity -from pcapkit.protocols.schema.internet.hip import \ - ECDSALowCurveHostIdentity as HIP_ECDSALowCurveHostIdentity -from pcapkit.protocols.schema.internet.hip import \ - EchoRequestSignedParameter as HIP_EchoRequestSignedParameter -from pcapkit.protocols.schema.internet.hip import \ - EchoRequestUnsignedParameter as HIP_EchoRequestUnsignedParameter -from pcapkit.protocols.schema.internet.hip import \ - EchoResponseSignedParameter as HIP_EchoResponseSignedParameter -from pcapkit.protocols.schema.internet.hip import \ - EchoResponseUnsignedParameter as HIP_EchoResponseUnsignedParameter -from pcapkit.protocols.schema.internet.hip import \ - EdDSACurveHostIdentity as HIP_EdDSACurveHostIdentity -from pcapkit.protocols.schema.internet.hip import EncryptedParameter as HIP_EncryptedParameter -from pcapkit.protocols.schema.internet.hip import ESPInfoParameter as HIP_ESPInfoParameter -from pcapkit.protocols.schema.internet.hip import ESPTransformParameter as HIP_ESPTransformParameter -from pcapkit.protocols.schema.internet.hip import FromParameter as HIP_FromParameter -from pcapkit.protocols.schema.internet.hip import HIPCipherParameter as HIP_HIPCipherParameter -from pcapkit.protocols.schema.internet.hip import HIPMAC2Parameter as HIP_HIPMAC2Parameter -from pcapkit.protocols.schema.internet.hip import HIPMACParameter as HIP_HIPMACParameter -from pcapkit.protocols.schema.internet.hip import \ - HIPSignature2Parameter as HIP_HIPSignature2Parameter -from pcapkit.protocols.schema.internet.hip import HIPSignatureParameter as HIP_HIPSignatureParameter -from pcapkit.protocols.schema.internet.hip import HIPTransformParameter as HIP_HIPTransformParameter -from pcapkit.protocols.schema.internet.hip import \ - HIPTransportModeParameter as HIP_HIPTransportModeParameter -from pcapkit.protocols.schema.internet.hip import HITSuiteListParameter as HIP_HITSuiteListParameter -from pcapkit.protocols.schema.internet.hip import HostIdentity as HIP_HostIdentity -from pcapkit.protocols.schema.internet.hip import HostIDParameter as HIP_HostIDParameter -from pcapkit.protocols.schema.internet.hip import Locator as HIP_Locator -from pcapkit.protocols.schema.internet.hip import LocatorData as HIP_LocatorData -from pcapkit.protocols.schema.internet.hip import LocatorSetParameter as HIP_LocatorSetParameter -from pcapkit.protocols.schema.internet.hip import \ - NATTraversalModeParameter as HIP_NATTraversalModeParameter -from pcapkit.protocols.schema.internet.hip import NotificationParameter as HIP_NotificationParameter -from pcapkit.protocols.schema.internet.hip import OverlayIDParameter as HIP_OverlayIDParameter -from pcapkit.protocols.schema.internet.hip import OverlayTTLParameter as HIP_OverlayTTLParameter -from pcapkit.protocols.schema.internet.hip import PayloadMICParameter as HIP_PayloadMICParameter -from pcapkit.protocols.schema.internet.hip import PuzzleParameter as HIP_PuzzleParameter -from pcapkit.protocols.schema.internet.hip import R1CounterParameter as HIP_R1CounterParameter -from pcapkit.protocols.schema.internet.hip import RegFailedParameter as HIP_RegFailedParameter -from pcapkit.protocols.schema.internet.hip import RegFromParameter as HIP_RegFromParameter -from pcapkit.protocols.schema.internet.hip import RegInfoParameter as HIP_RegInfoParameter -from pcapkit.protocols.schema.internet.hip import RegRequestParameter as HIP_RegRequestParameter -from pcapkit.protocols.schema.internet.hip import RegResponseParameter as HIP_RegResponseParameter -from pcapkit.protocols.schema.internet.hip import RelayFromParameter as HIP_RelayFromParameter -from pcapkit.protocols.schema.internet.hip import RelayHMACParameter as HIP_RelayHMACParameter -from pcapkit.protocols.schema.internet.hip import RelayToParameter as HIP_RelayToParameter -from pcapkit.protocols.schema.internet.hip import RouteDstParameter as HIP_RouteDstParameter -from pcapkit.protocols.schema.internet.hip import RouteViaParameter as HIP_RouteViaParameter -from pcapkit.protocols.schema.internet.hip import RVSHMACParameter as HIP_RVSHMACParameter -from pcapkit.protocols.schema.internet.hip import SeqDataParameter as HIP_SeqDataParameter -from pcapkit.protocols.schema.internet.hip import SEQParameter as HIP_SEQParameter -from pcapkit.protocols.schema.internet.hip import SolutionParameter as HIP_SolutionParameter -from pcapkit.protocols.schema.internet.hip import \ - TransactionIDParameter as HIP_TransactionIDParameter -from pcapkit.protocols.schema.internet.hip import \ - TransactionPacingParameter as HIP_TransactionPacingParameter -from pcapkit.protocols.schema.internet.hip import \ - TransportFormatListParameter as HIP_TransportFormatListParameter -from pcapkit.protocols.schema.internet.hip import UnassignedParameter as HIP_UnassignedParameter -from pcapkit.protocols.schema.internet.hip import ViaRVSParameter as HIP_ViaRVSParameter - -# Hop-by-Hop Options -from pcapkit.protocols.schema.internet.hopopt import HOPOPT -from pcapkit.protocols.schema.internet.hopopt import CALIPSOOption as HOPOPT_CALIPSOOption -from pcapkit.protocols.schema.internet.hopopt import HomeAddressOption as HOPOPT_HomeAddressOption -from pcapkit.protocols.schema.internet.hopopt import ILNPOption as HOPOPT_ILNPOption -from pcapkit.protocols.schema.internet.hopopt import IPDFFOption as HOPOPT_IPDFFOption -from pcapkit.protocols.schema.internet.hopopt import JumboPayloadOption as HOPOPT_JumboPayloadOption -from pcapkit.protocols.schema.internet.hopopt import \ - LineIdentificationOption as HOPOPT_LineIdentificationOption -from pcapkit.protocols.schema.internet.hopopt import MPLOption as HOPOPT_MPLOption -from pcapkit.protocols.schema.internet.hopopt import PadOption as HOPOPT_PadOption -from pcapkit.protocols.schema.internet.hopopt import PDMOption as HOPOPT_PDMOption -from pcapkit.protocols.schema.internet.hopopt import QuickStartOption as HOPOPT_QuickStartOption -from pcapkit.protocols.schema.internet.hopopt import \ - QuickStartReportOption as HOPOPT_QuickStartReportOption -from pcapkit.protocols.schema.internet.hopopt import \ - QuickStartRequestOption as HOPOPT_QuickStartRequestOption -from pcapkit.protocols.schema.internet.hopopt import RouterAlertOption as HOPOPT_RouterAlertOption -from pcapkit.protocols.schema.internet.hopopt import RPLOption as HOPOPT_RPLOption -from pcapkit.protocols.schema.internet.hopopt import SMFDPDOption as HOPOPT_SMFDPDOption -from pcapkit.protocols.schema.internet.hopopt import \ - SMFHashBasedDPDOption as HOPOPT_SMFHashBasedDPDOption -from pcapkit.protocols.schema.internet.hopopt import \ - SMFIdentificationBasedDPDOption as HOPOPT_SMFIdentificationBasedDPDOption -from pcapkit.protocols.schema.internet.hopopt import \ - TunnelEncapsulationLimitOption as HOPOPT_TunnelEncapsulationLimitOption -from pcapkit.protocols.schema.internet.hopopt import UnassignedOption as HOPOPT_UnassignedOption - -# Internet Control Message Protocol -from pcapkit.protocols.schema.internet.icmpv4 import ICMPv4 -from pcapkit.protocols.schema.internet.icmpv4 import \ - DestinationUnreachable as ICMPv4_DestinationUnreachable -from pcapkit.protocols.schema.internet.icmpv4 import Echo as ICMPv4_Echo -from pcapkit.protocols.schema.internet.icmpv4 import ICMPv4Type as ICMPv4_ICMPv4Type -from pcapkit.protocols.schema.internet.icmpv4 import ParameterProblem as ICMPv4_ParameterProblem -from pcapkit.protocols.schema.internet.icmpv4 import TimeExceeded as ICMPv4_TimeExceeded -from pcapkit.protocols.schema.internet.icmpv4 import Unknown as ICMPv4_Unknown - -# Internet Control Message Protocol for IPv6 -from pcapkit.protocols.schema.internet.icmpv6 import ICMPv6 -from pcapkit.protocols.schema.internet.icmpv6 import \ - DestinationUnreachable as ICMPv6_DestinationUnreachable -from pcapkit.protocols.schema.internet.icmpv6 import Echo as ICMPv6_Echo -from pcapkit.protocols.schema.internet.icmpv6 import ICMPv6Type as ICMPv6_ICMPv6Type -from pcapkit.protocols.schema.internet.icmpv6 import PacketTooBig as ICMPv6_PacketTooBig -from pcapkit.protocols.schema.internet.icmpv6 import ParameterProblem as ICMPv6_ParameterProblem -from pcapkit.protocols.schema.internet.icmpv6 import TimeExceeded as ICMPv6_TimeExceeded -from pcapkit.protocols.schema.internet.icmpv6 import Unknown as ICMPv6_Unknown - -# Internet Group Management Protocol -from pcapkit.protocols.schema.internet.igmp import IGMP -from pcapkit.protocols.schema.internet.igmpv3 import GroupRecord as IGMPv3_GroupRecord -from pcapkit.protocols.schema.internet.igmpv3 import IGMPv3 -from pcapkit.protocols.schema.internet.igmpv3 import Query as IGMPv3_Query -from pcapkit.protocols.schema.internet.igmpv3 import QueryExtension as IGMPv3_QueryExtension -from pcapkit.protocols.schema.internet.igmpv3 import Report as IGMPv3_Report - -# Internet Protocol version 4 -from pcapkit.protocols.schema.internet.ipv4 import EOOLOption as IPv4_EOOLOption -from pcapkit.protocols.schema.internet.ipv4 import ESECOption as IPv4_ESECOption -from pcapkit.protocols.schema.internet.ipv4 import IPv4 -from pcapkit.protocols.schema.internet.ipv4 import LSROption as IPv4_LSROption -from pcapkit.protocols.schema.internet.ipv4 import MTUPOption as IPv4_MTUPOption -from pcapkit.protocols.schema.internet.ipv4 import MTUROption as IPv4_MTUROption -from pcapkit.protocols.schema.internet.ipv4 import NOPOption as IPv4_NOPOption -from pcapkit.protocols.schema.internet.ipv4 import Option as IPv4_Option -from pcapkit.protocols.schema.internet.ipv4 import QSOption as IPv4_QSOption -from pcapkit.protocols.schema.internet.ipv4 import \ - QuickStartReportOption as IPv4_QuickStartReportOption -from pcapkit.protocols.schema.internet.ipv4 import \ - QuickStartRequestOption as IPv4_QuickStartRequestOption -from pcapkit.protocols.schema.internet.ipv4 import RROption as IPv4_RROption -from pcapkit.protocols.schema.internet.ipv4 import RTRALTOption as IPv4_RTRALTOption -from pcapkit.protocols.schema.internet.ipv4 import SECOption as IPv4_SECOption -from pcapkit.protocols.schema.internet.ipv4 import SIDOption as IPv4_SIDOption -from pcapkit.protocols.schema.internet.ipv4 import SSROption as IPv4_SSROption -from pcapkit.protocols.schema.internet.ipv4 import TROption as IPv4_TROption -from pcapkit.protocols.schema.internet.ipv4 import TSOption as IPv4_TSOption -from pcapkit.protocols.schema.internet.ipv4 import UnassignedOption as IPv4_UnassignedOption - -# Internet Protocol version 6 -from pcapkit.protocols.schema.internet.ipv6 import IPv6 - -# IPv6 Fragment Header -from pcapkit.protocols.schema.internet.ipv6_frag import IPv6_Frag - -# IPv6 Extension Header (generic) -from pcapkit.protocols.schema.internet.ipv6_ext import IPv6_Ext - -# IPv6 Destination Options -from pcapkit.protocols.schema.internet.ipv6_opts import CALIPSOOption as IPv6_Opts_CALIPSOOption -from pcapkit.protocols.schema.internet.ipv6_opts import \ - HomeAddressOption as IPv6_Opts_HomeAddressOption -from pcapkit.protocols.schema.internet.ipv6_opts import ILNPOption as IPv6_Opts_ILNPOption -from pcapkit.protocols.schema.internet.ipv6_opts import IPDFFOption as IPv6_Opts_IPDFFOption -from pcapkit.protocols.schema.internet.ipv6_opts import IPv6_Opts -from pcapkit.protocols.schema.internet.ipv6_opts import \ - JumboPayloadOption as IPv6_Opts_JumboPayloadOption -from pcapkit.protocols.schema.internet.ipv6_opts import \ - LineIdentificationOption as IPv6_Opts_LineIdentificationOption -from pcapkit.protocols.schema.internet.ipv6_opts import MPLOption as IPv6_Opts_MPLOption -from pcapkit.protocols.schema.internet.ipv6_opts import PadOption as IPv6_Opts_PadOption -from pcapkit.protocols.schema.internet.ipv6_opts import PDMOption as IPv6_Opts_PDMOption -from pcapkit.protocols.schema.internet.ipv6_opts import \ - QuickStartOption as IPv6_Opts_QuickStartOption -from pcapkit.protocols.schema.internet.ipv6_opts import \ - QuickStartReportOption as IPv6_Opts_QuickStartReportOption -from pcapkit.protocols.schema.internet.ipv6_opts import \ - QuickStartRequestOption as IPv6_Opts_QuickStartRequestOption -from pcapkit.protocols.schema.internet.ipv6_opts import \ - RouterAlertOption as IPv6_Opts_RouterAlertOption -from pcapkit.protocols.schema.internet.ipv6_opts import RPLOption as IPv6_Opts_RPLOption -from pcapkit.protocols.schema.internet.ipv6_opts import SMFDPDOption as IPv6_Opts_SMFDPDOption -from pcapkit.protocols.schema.internet.ipv6_opts import \ - SMFHashBasedDPDOption as IPv6_Opts_SMFHashBasedDPDOption -from pcapkit.protocols.schema.internet.ipv6_opts import \ - SMFIdentificationBasedDPDOption as IPv6_Opts_SMFIdentificationBasedDPDOption -from pcapkit.protocols.schema.internet.ipv6_opts import \ - TunnelEncapsulationLimitOption as IPv6_Opts_TunnelEncapsulationLimitOption -from pcapkit.protocols.schema.internet.ipv6_opts import \ - UnassignedOption as IPv6_Opts_UnassignedOption - -# IPv6 Routing Header -from pcapkit.protocols.schema.internet.ipv6_route import RPL as IPv6_Route_RPL -from pcapkit.protocols.schema.internet.ipv6_route import IPv6_Route -from pcapkit.protocols.schema.internet.ipv6_route import RoutingType as IPv6_Route_RoutingType -from pcapkit.protocols.schema.internet.ipv6_route import SourceRoute as IPv6_Route_SourceRoute -from pcapkit.protocols.schema.internet.ipv6_route import Type2 as IPv6_Route_Type2 -from pcapkit.protocols.schema.internet.ipv6_route import UnknownType as IPv6_Route_UnknownType - -# Internetwork Packet Exchange -from pcapkit.protocols.schema.internet.ipx import IPX - -# Mobility Header -from pcapkit.protocols.schema.internet.mh import MH -from pcapkit.protocols.schema.internet.mh import \ - AccessNetworkIdentifierOption as MH_AccessNetworkIdentifierOption -from pcapkit.protocols.schema.internet.mh import \ - AccessTechnologyTypeOption as MH_AccessTechnologyTypeOption -from pcapkit.protocols.schema.internet.mh import \ - ActiveMulticastSubscriptionIPv4Option as MH_ActiveMulticastSubscriptionIPv4Option -from pcapkit.protocols.schema.internet.mh import \ - ActiveMulticastSubscriptionIPv6Option as MH_ActiveMulticastSubscriptionIPv6Option -from pcapkit.protocols.schema.internet.mh import \ - AllocationRetentionPriorityAttribute as MH_AllocationRetentionPriorityAttribute -from pcapkit.protocols.schema.internet.mh import \ - AlternateCareofAddressOption as MH_AlternateCareofAddressOption -from pcapkit.protocols.schema.internet.mh import \ - AlternateIPv4CareofAddressOption as MH_AlternateIPv4CareofAddressOption -from pcapkit.protocols.schema.internet.mh import AnchoredPrefixOption as MH_AnchoredPrefixOption -from pcapkit.protocols.schema.internet.mh import \ - ANICivicLocationSuboption as MH_ANICivicLocationSuboption -from pcapkit.protocols.schema.internet.mh import \ - ANIGeoLocationSuboption as MH_ANIGeoLocationSuboption -from pcapkit.protocols.schema.internet.mh import \ - ANIMAGGroupIdentifierSuboption as MH_ANIMAGGroupIdentifierSuboption -from pcapkit.protocols.schema.internet.mh import \ - ANINetworkIdentifierSuboption as MH_ANINetworkIdentifierSuboption -from pcapkit.protocols.schema.internet.mh import \ - ANIOperatorIdentifierSuboption as MH_ANIOperatorIdentifierSuboption -from pcapkit.protocols.schema.internet.mh import ANISuboption as MH_ANISuboption -from pcapkit.protocols.schema.internet.mh import \ - ANIUpdateTimerSuboption as MH_ANIUpdateTimerSuboption -from pcapkit.protocols.schema.internet.mh import AuthOption as MH_AuthOption -from pcapkit.protocols.schema.internet.mh import \ - AuthorizationDataOption as MH_AuthorizationDataOption -from pcapkit.protocols.schema.internet.mh import BADFOption as MH_BADFOption -from pcapkit.protocols.schema.internet.mh import BIDReferenceSuboption as MH_BIDReferenceSuboption -from pcapkit.protocols.schema.internet.mh import \ - BindingAcknowledgementMessage as MH_BindingAcknowledgementMessage -from pcapkit.protocols.schema.internet.mh import BindingErrorMessage as MH_BindingErrorMessage -from pcapkit.protocols.schema.internet.mh import \ - BindingIdentifierOption as MH_BindingIdentifierOption -from pcapkit.protocols.schema.internet.mh import \ - BindingRefreshAdviceOption as MH_BindingRefreshAdviceOption -from pcapkit.protocols.schema.internet.mh import \ - BindingRefreshRequestMessage as MH_BindingRefreshRequestMessage -from pcapkit.protocols.schema.internet.mh import \ - BindingReregistrationControlSuboption as MH_BindingReregistrationControlSuboption -from pcapkit.protocols.schema.internet.mh import \ - BindingRevocationMessage as MH_BindingRevocationMessage -from pcapkit.protocols.schema.internet.mh import BindingUpdateMessage as MH_BindingUpdateMessage -from pcapkit.protocols.schema.internet.mh import BitRateAttribute as MH_BitRateAttribute -from pcapkit.protocols.schema.internet.mh import CareofTestInitMessage as MH_CareofTestInitMessage -from pcapkit.protocols.schema.internet.mh import CareofTestInitOption as MH_CareofTestInitOption -from pcapkit.protocols.schema.internet.mh import CareofTestMessage as MH_CareofTestMessage -from pcapkit.protocols.schema.internet.mh import CareofTestOption as MH_CareofTestOption -from pcapkit.protocols.schema.internet.mh import CGAExtension as MH_CGAExtension -from pcapkit.protocols.schema.internet.mh import CGAParameter as MH_CGAParameter -from pcapkit.protocols.schema.internet.mh import CGAParametersOption as MH_CGAParametersOption -from pcapkit.protocols.schema.internet.mh import \ - CGAParametersRequestOption as MH_CGAParametersRequestOption -from pcapkit.protocols.schema.internet.mh import ContextRequestOption as MH_ContextRequestOption -from pcapkit.protocols.schema.internet.mh import DelegatedMNPOption as MH_DelegatedMNPOption -from pcapkit.protocols.schema.internet.mh import \ - DLIFLinkLayerAddressOption as MH_DLIFLinkLayerAddressOption -from pcapkit.protocols.schema.internet.mh import \ - DLIFLinkLocalAddressOption as MH_DLIFLinkLocalAddressOption -from pcapkit.protocols.schema.internet.mh import DNSUpdateOption as MH_DNSUpdateOption -from pcapkit.protocols.schema.internet.mh import \ - DynamicIPMulticastSelectorOption as MH_DynamicIPMulticastSelectorOption -from pcapkit.protocols.schema.internet.mh import ExperimentalExtension as MH_ExperimentalExtension -from pcapkit.protocols.schema.internet.mh import ExperimentalMessage as MH_ExperimentalMessage -from pcapkit.protocols.schema.internet.mh import \ - ExperimentalMobilityOption as MH_ExperimentalMobilityOption -from pcapkit.protocols.schema.internet.mh import \ - FastBindingAcknowledgmentMessage as MH_FastBindingAcknowledgmentMessage -from pcapkit.protocols.schema.internet.mh import \ - FastBindingUpdateMessage as MH_FastBindingUpdateMessage -from pcapkit.protocols.schema.internet.mh import \ - FastNeighborAdvertisementMessage as MH_FastNeighborAdvertisementMessage -from pcapkit.protocols.schema.internet.mh import \ - FlowBindingActionSuboption as MH_FlowBindingActionSuboption -from pcapkit.protocols.schema.internet.mh import FlowBindingMessage as MH_FlowBindingMessage -from pcapkit.protocols.schema.internet.mh import \ - FlowIdentificationOption as MH_FlowIdentificationOption -from pcapkit.protocols.schema.internet.mh import \ - FlowIdentificationSuboption as MH_FlowIdentificationSuboption -from pcapkit.protocols.schema.internet.mh import FlowSummaryOption as MH_FlowSummaryOption -from pcapkit.protocols.schema.internet.mh import GREKeyOption as MH_GREKeyOption -from pcapkit.protocols.schema.internet.mh import HandoffIndicatorOption as MH_HandoffIndicatorOption -from pcapkit.protocols.schema.internet.mh import \ - HandoverAcknowledgeMessage as MH_HandoverAcknowledgeMessage -from pcapkit.protocols.schema.internet.mh import \ - HandoverInitiateMessage as MH_HandoverInitiateMessage -from pcapkit.protocols.schema.internet.mh import \ - HeartbeatControlSuboption as MH_HeartbeatControlSuboption -from pcapkit.protocols.schema.internet.mh import HeartbeatMessage as MH_HeartbeatMessage -from pcapkit.protocols.schema.internet.mh import HomeAgentSwitchMessage as MH_HomeAgentSwitchMessage -from pcapkit.protocols.schema.internet.mh import \ - HomeNetworkPrefixOption as MH_HomeNetworkPrefixOption -from pcapkit.protocols.schema.internet.mh import HomeTestInitMessage as MH_HomeTestInitMessage -from pcapkit.protocols.schema.internet.mh import HomeTestMessage as MH_HomeTestMessage -from pcapkit.protocols.schema.internet.mh import \ - IPv4AddressAcknowledgementOption as MH_IPv4AddressAcknowledgementOption -from pcapkit.protocols.schema.internet.mh import \ - IPv4CareofAddressOption as MH_IPv4CareofAddressOption -from pcapkit.protocols.schema.internet.mh import \ - IPv4DefaultRouterAddressOption as MH_IPv4DefaultRouterAddressOption -from pcapkit.protocols.schema.internet.mh import \ - IPv4DHCPSupportModeOption as MH_IPv4DHCPSupportModeOption -from pcapkit.protocols.schema.internet.mh import IPv4HomeAddressOption as MH_IPv4HomeAddressOption -from pcapkit.protocols.schema.internet.mh import \ - IPv4HomeAddressReplyOption as MH_IPv4HomeAddressReplyOption -from pcapkit.protocols.schema.internet.mh import \ - IPv4HomeAddressRequestOption as MH_IPv4HomeAddressRequestOption -from pcapkit.protocols.schema.internet.mh import \ - IPv4TrafficOffloadSelectorOption as MH_IPv4TrafficOffloadSelectorOption -from pcapkit.protocols.schema.internet.mh import \ - IPv6AddressPrefixOption as MH_IPv6AddressPrefixOption -from pcapkit.protocols.schema.internet.mh import LinkLayerAddressOption as MH_LinkLayerAddressOption -from pcapkit.protocols.schema.internet.mh import LinkLocalAddressOption as MH_LinkLocalAddressOption -from pcapkit.protocols.schema.internet.mh import LMAAddressOption as MH_LMAAddressOption -from pcapkit.protocols.schema.internet.mh import \ - LMAControlledMAGParametersOption as MH_LMAControlledMAGParametersOption -from pcapkit.protocols.schema.internet.mh import \ - LMAControlledMAGSuboption as MH_LMAControlledMAGSuboption -from pcapkit.protocols.schema.internet.mh import \ - LMAUserPlaneAddressOption as MH_LMAUserPlaneAddressOption -from pcapkit.protocols.schema.internet.mh import LoadInformationOption as MH_LoadInformationOption -from pcapkit.protocols.schema.internet.mh import \ - LocalizedRoutingAcknowledgmentMessage as MH_LocalizedRoutingAcknowledgmentMessage -from pcapkit.protocols.schema.internet.mh import \ - LocalizedRoutingInitiationMessage as MH_LocalizedRoutingInitiationMessage -from pcapkit.protocols.schema.internet.mh import LocalPrefixOption as MH_LocalPrefixOption -from pcapkit.protocols.schema.internet.mh import MAGIdentifierOption as MH_MAGIdentifierOption -from pcapkit.protocols.schema.internet.mh import MAGIPv6AddressOption as MH_MAGIPv6AddressOption -from pcapkit.protocols.schema.internet.mh import \ - MAGMultipathBindingOption as MH_MAGMultipathBindingOption -from pcapkit.protocols.schema.internet.mh import MesgIDOption as MH_MesgIDOption -from pcapkit.protocols.schema.internet.mh import \ - MNGroupIdentifierOption as MH_MNGroupIdentifierOption -from pcapkit.protocols.schema.internet.mh import MNIDOption as MH_MNIDOption -from pcapkit.protocols.schema.internet.mh import MNLLAIIDOption as MH_MNLLAIIDOption -from pcapkit.protocols.schema.internet.mh import MNLLIdentifierOption as MH_MNLLIdentifierOption -from pcapkit.protocols.schema.internet.mh import \ - MobileNetworkPrefixOption as MH_MobileNetworkPrefixOption -from pcapkit.protocols.schema.internet.mh import \ - MulticastAcknowledgementOption as MH_MulticastAcknowledgementOption -from pcapkit.protocols.schema.internet.mh import \ - MulticastMobilityOption as MH_MulticastMobilityOption -from pcapkit.protocols.schema.internet.mh import MultiPrefixExtension as MH_MultiPrefixExtension -from pcapkit.protocols.schema.internet.mh import NATDetectionOption as MH_NATDetectionOption -from pcapkit.protocols.schema.internet.mh import NonceIndicesOption as MH_NonceIndicesOption -from pcapkit.protocols.schema.internet.mh import Option as MH_Option -from pcapkit.protocols.schema.internet.mh import Packet as MH_Packet -from pcapkit.protocols.schema.internet.mh import \ - PadFlowIdentificationSuboption as MH_PadFlowIdentificationSuboption -from pcapkit.protocols.schema.internet.mh import PadOption as MH_PadOption -from pcapkit.protocols.schema.internet.mh import \ - PermanentHomeKeygenTokenOption as MH_PermanentHomeKeygenTokenOption -from pcapkit.protocols.schema.internet.mh import \ - PerSessionBitRateAttribute as MH_PerSessionBitRateAttribute -from pcapkit.protocols.schema.internet.mh import PreviousMAAROption as MH_PreviousMAAROption -from pcapkit.protocols.schema.internet.mh import QoSAttribute as MH_QoSAttribute -from pcapkit.protocols.schema.internet.mh import \ - QoSTrafficSelectorAttribute as MH_QoSTrafficSelectorAttribute -from pcapkit.protocols.schema.internet.mh import \ - QoSVendorSpecificAttribute as MH_QoSVendorSpecificAttribute -from pcapkit.protocols.schema.internet.mh import QualityOfServiceOption as MH_QualityOfServiceOption -from pcapkit.protocols.schema.internet.mh import \ - RedirectCapabilityOption as MH_RedirectCapabilityOption -from pcapkit.protocols.schema.internet.mh import RedirectOption as MH_RedirectOption -from pcapkit.protocols.schema.internet.mh import RestartCounterOption as MH_RestartCounterOption -from pcapkit.protocols.schema.internet.mh import ServiceSelectionOption as MH_ServiceSelectionOption -from pcapkit.protocols.schema.internet.mh import ServingMAAROption as MH_ServingMAAROption -from pcapkit.protocols.schema.internet.mh import SignatureOption as MH_SignatureOption -from pcapkit.protocols.schema.internet.mh import \ - SubscriptionQueryMessage as MH_SubscriptionQueryMessage -from pcapkit.protocols.schema.internet.mh import \ - SubscriptionResponseMessage as MH_SubscriptionResponseMessage -from pcapkit.protocols.schema.internet.mh import \ - TargetCareofAddressSuboption as MH_TargetCareofAddressSuboption -from pcapkit.protocols.schema.internet.mh import TimestampOption as MH_TimestampOption -from pcapkit.protocols.schema.internet.mh import \ - TrafficSelectorSuboption as MH_TrafficSelectorSuboption -from pcapkit.protocols.schema.internet.mh import TransientBindingOption as MH_TransientBindingOption -from pcapkit.protocols.schema.internet.mh import UnassignedANISuboption as MH_UnassignedANISuboption -from pcapkit.protocols.schema.internet.mh import \ - UnassignedFlowIdentificationSuboption as MH_UnassignedFlowIdentificationSuboption -from pcapkit.protocols.schema.internet.mh import \ - UnassignedLMAControlledMAGSuboption as MH_UnassignedLMAControlledMAGSuboption -from pcapkit.protocols.schema.internet.mh import UnassignedOption as MH_UnassignedOption -from pcapkit.protocols.schema.internet.mh import UnassignedQoSAttribute as MH_UnassignedQoSAttribute -from pcapkit.protocols.schema.internet.mh import UnknownExtension as MH_UnknownExtension -from pcapkit.protocols.schema.internet.mh import UnknownMessage as MH_UnknownMessage -from pcapkit.protocols.schema.internet.mh import \ - UpdateNotificationAcknowledgementMessage as MH_UpdateNotificationAcknowledgementMessage -from pcapkit.protocols.schema.internet.mh import \ - UpdateNotificationMessage as MH_UpdateNotificationMessage -from pcapkit.protocols.schema.internet.mh import VendorSpecificOption as MH_VendorSpecificOption - -__all__ = [ - # Authentication Header - 'AH', - - # Encapsulating Security Payload - 'ESP', - - # Host Identity Protocol - 'HIP', - 'HIP_LocatorData', 'HIP_Locator', 'HIP_ECDSACurveHostIdentity', 'HIP_ECDSALowCurveHostIdentity', - 'HIP_EdDSACurveHostIdentity', 'HIP_HostIdentity', - 'HIP_UnassignedParameter', 'HIP_ESPInfoParameter', 'HIP_R1CounterParameter', - 'HIP_LocatorSetParameter', 'HIP_PuzzleParameter', 'HIP_SolutionParameter', - 'HIP_SEQParameter', 'HIP_ACKParameter', 'HIP_DHGroupListParameter', - 'HIP_DiffieHellmanParameter', 'HIP_HIPTransformParameter', 'HIP_HIPCipherParameter', - 'HIP_NATTraversalModeParameter', 'HIP_TransactionPacingParameter', 'HIP_EncryptedParameter', - 'HIP_HostIDParameter', 'HIP_HITSuiteListParameter', 'HIP_CertParameter', - 'HIP_NotificationParameter', 'HIP_EchoRequestSignedParameter', 'HIP_RegInfoParameter', - 'HIP_RegRequestParameter', 'HIP_RegResponseParameter', 'HIP_RegFailedParameter', - 'HIP_RegFromParameter', 'HIP_EchoResponseSignedParameter', 'HIP_TransportFormatListParameter', - 'HIP_ESPTransformParameter', 'HIP_SeqDataParameter', 'HIP_AckDataParameter', - 'HIP_PayloadMICParameter', 'HIP_TransactionIDParameter', 'HIP_OverlayIDParameter', - 'HIP_RouteDstParameter', 'HIP_HIPTransportModeParameter', 'HIP_HIPMACParameter', - 'HIP_HIPMAC2Parameter', 'HIP_HIPSignature2Parameter', 'HIP_HIPSignatureParameter', - 'HIP_EchoRequestUnsignedParameter', 'HIP_EchoResponseUnsignedParameter', 'HIP_RelayFromParameter', - 'HIP_RelayToParameter', 'HIP_OverlayTTLParameter', 'HIP_RouteViaParameter', - 'HIP_FromParameter', 'HIP_RVSHMACParameter', 'HIP_ViaRVSParameter', - 'HIP_RelayHMACParameter', - - # Hop-by-Hop Options - 'HOPOPT', - 'HOPOPT_SMFDPDOption', 'HOPOPT_QuickStartOption', - 'HOPOPT_UnassignedOption', 'HOPOPT_PadOption', 'HOPOPT_TunnelEncapsulationLimitOption', - 'HOPOPT_RouterAlertOption', 'HOPOPT_CALIPSOOption', 'HOPOPT_SMFIdentificationBasedDPDOption', - 'HOPOPT_SMFHashBasedDPDOption', 'HOPOPT_PDMOption', 'HOPOPT_QuickStartRequestOption', - 'HOPOPT_QuickStartReportOption', 'HOPOPT_RPLOption', 'HOPOPT_MPLOption', 'HOPOPT_ILNPOption', - 'HOPOPT_LineIdentificationOption', 'HOPOPT_JumboPayloadOption', 'HOPOPT_HomeAddressOption', - 'HOPOPT_IPDFFOption', - - # Internet Control Message Protocol - 'ICMPv4', - 'ICMPv4_ICMPv4Type', - 'ICMPv4_Unknown', 'ICMPv4_Echo', 'ICMPv4_DestinationUnreachable', 'ICMPv4_TimeExceeded', - 'ICMPv4_ParameterProblem', - - # Internet Control Message Protocol for IPv6 - 'ICMPv6', - 'ICMPv6_ICMPv6Type', - 'ICMPv6_Unknown', 'ICMPv6_DestinationUnreachable', 'ICMPv6_PacketTooBig', 'ICMPv6_TimeExceeded', - 'ICMPv6_ParameterProblem', 'ICMPv6_Echo', - - # Internet Group Management Protocol - 'IGMP', 'IGMPv3', 'IGMPv3_Query', 'IGMPv3_QueryExtension', 'IGMPv3_Report', - 'IGMPv3_GroupRecord', - - # Internet Protocol version 4 - 'IPv4', - 'IPv4_Option', - 'IPv4_UnassignedOption', 'IPv4_EOOLOption', 'IPv4_NOPOption', - 'IPv4_SECOption', 'IPv4_LSROption', 'IPv4_TSOption', - 'IPv4_ESECOption', 'IPv4_RROption', 'IPv4_SIDOption', - 'IPv4_SSROption', 'IPv4_MTUPOption', 'IPv4_MTUROption', - 'IPv4_TROption', 'IPv4_RTRALTOption', 'IPv4_QSOption', - 'IPv4_QuickStartRequestOption', 'IPv4_QuickStartReportOption', - - # IPv6 Fragment Header - 'IPv6_Frag', - - # IPv6 Extension Header (generic) - 'IPv6_Ext', - - # IPv6 Destination Options - 'IPv6_Opts', - 'IPv6_Opts_SMFDPDOption', 'IPv6_Opts_QuickStartOption', - 'IPv6_Opts_UnassignedOption', 'IPv6_Opts_PadOption', 'IPv6_Opts_TunnelEncapsulationLimitOption', - 'IPv6_Opts_RouterAlertOption', 'IPv6_Opts_CALIPSOOption', 'IPv6_Opts_SMFIdentificationBasedDPDOption', - 'IPv6_Opts_SMFHashBasedDPDOption', 'IPv6_Opts_PDMOption', 'IPv6_Opts_QuickStartRequestOption', - 'IPv6_Opts_QuickStartReportOption', 'IPv6_Opts_RPLOption', 'IPv6_Opts_MPLOption', 'IPv6_Opts_ILNPOption', - 'IPv6_Opts_LineIdentificationOption', 'IPv6_Opts_JumboPayloadOption', 'IPv6_Opts_HomeAddressOption', - 'IPv6_Opts_IPDFFOption', - - # IPv6 Routing Header - 'IPv6_Route', - 'IPv6_Route_RoutingType', - 'IPv6_Route_UnknownType', 'IPv6_Route_SourceRoute', 'IPv6_Route_Type2', 'IPv6_Route_RPL', - - # IPv6 - 'IPv6', - - # IPX - 'IPX', - - # Mobility Header - 'MH', - 'MH_Packet', - 'MH_UnknownMessage', 'MH_BindingRefreshRequestMessage', 'MH_HomeTestInitMessage', 'MH_CareofTestInitMessage', - 'MH_HomeTestMessage', 'MH_CareofTestMessage', 'MH_BindingUpdateMessage', 'MH_BindingAcknowledgementMessage', - 'MH_BindingErrorMessage', 'MH_FastBindingUpdateMessage', 'MH_FastBindingAcknowledgmentMessage', - 'MH_FastNeighborAdvertisementMessage', 'MH_ExperimentalMessage', 'MH_HandoverInitiateMessage', - 'MH_HandoverAcknowledgeMessage', 'MH_HeartbeatMessage', 'MH_HomeAgentSwitchMessage', 'MH_BindingRevocationMessage', - 'MH_LocalizedRoutingInitiationMessage', 'MH_LocalizedRoutingAcknowledgmentMessage', 'MH_UpdateNotificationMessage', - 'MH_UpdateNotificationAcknowledgementMessage', 'MH_FlowBindingMessage', 'MH_SubscriptionQueryMessage', - 'MH_SubscriptionResponseMessage', - 'MH_Option', - 'MH_UnassignedOption', 'MH_PadOption', 'MH_BindingRefreshAdviceOption', 'MH_AlternateCareofAddressOption', - 'MH_NonceIndicesOption', 'MH_AuthorizationDataOption', 'MH_MobileNetworkPrefixOption', 'MH_LinkLayerAddressOption', - 'MH_MNIDOption', 'MH_AuthOption', 'MH_MesgIDOption', 'MH_CGAParametersRequestOption', 'MH_CGAParametersOption', - 'MH_SignatureOption', 'MH_PermanentHomeKeygenTokenOption', 'MH_CareofTestInitOption', 'MH_CareofTestOption', - 'MH_ExperimentalMobilityOption', 'MH_BADFOption', 'MH_IPv6AddressPrefixOption', 'MH_HomeNetworkPrefixOption', - 'MH_HandoffIndicatorOption', 'MH_AccessTechnologyTypeOption', 'MH_MNLLIdentifierOption', - 'MH_LinkLocalAddressOption', 'MH_TimestampOption', 'MH_RestartCounterOption', 'MH_DNSUpdateOption', - 'MH_VendorSpecificOption', 'MH_ServiceSelectionOption', 'MH_IPv4HomeAddressOption', - 'MH_IPv4AddressAcknowledgementOption', 'MH_NATDetectionOption', 'MH_IPv4CareofAddressOption', 'MH_GREKeyOption', - 'MH_BindingIdentifierOption', 'MH_IPv4HomeAddressRequestOption', 'MH_IPv4HomeAddressReplyOption', - 'MH_IPv4DefaultRouterAddressOption', 'MH_IPv4DHCPSupportModeOption', 'MH_ContextRequestOption', - 'MH_LMAAddressOption', 'MH_MNLLAIIDOption', 'MH_TransientBindingOption', 'MH_FlowSummaryOption', - 'MH_FlowIdentificationOption', 'MH_RedirectCapabilityOption', 'MH_RedirectOption', 'MH_LoadInformationOption', - 'MH_AlternateIPv4CareofAddressOption', 'MH_MNGroupIdentifierOption', 'MH_MAGIPv6AddressOption', - 'MH_AccessNetworkIdentifierOption', 'MH_IPv4TrafficOffloadSelectorOption', 'MH_DynamicIPMulticastSelectorOption', - 'MH_DelegatedMNPOption', 'MH_ActiveMulticastSubscriptionIPv4Option', 'MH_ActiveMulticastSubscriptionIPv6Option', - 'MH_QualityOfServiceOption', 'MH_LMAUserPlaneAddressOption', 'MH_MulticastMobilityOption', - 'MH_MulticastAcknowledgementOption', 'MH_LMAControlledMAGParametersOption', 'MH_MAGMultipathBindingOption', - 'MH_MAGIdentifierOption', 'MH_AnchoredPrefixOption', 'MH_LocalPrefixOption', 'MH_PreviousMAAROption', - 'MH_ServingMAAROption', 'MH_DLIFLinkLocalAddressOption', 'MH_DLIFLinkLayerAddressOption', - 'MH_FlowIdentificationSuboption', - 'MH_UnassignedFlowIdentificationSuboption', 'MH_PadFlowIdentificationSuboption', 'MH_BIDReferenceSuboption', - 'MH_TrafficSelectorSuboption', 'MH_FlowBindingActionSuboption', 'MH_TargetCareofAddressSuboption', - 'MH_ANISuboption', - 'MH_UnassignedANISuboption', 'MH_ANINetworkIdentifierSuboption', 'MH_ANIGeoLocationSuboption', - 'MH_ANIOperatorIdentifierSuboption', 'MH_ANICivicLocationSuboption', 'MH_ANIMAGGroupIdentifierSuboption', - 'MH_ANIUpdateTimerSuboption', - 'MH_QoSAttribute', - 'MH_UnassignedQoSAttribute', 'MH_BitRateAttribute', 'MH_PerSessionBitRateAttribute', - 'MH_AllocationRetentionPriorityAttribute', 'MH_QoSTrafficSelectorAttribute', 'MH_QoSVendorSpecificAttribute', - 'MH_LMAControlledMAGSuboption', - 'MH_UnassignedLMAControlledMAGSuboption', 'MH_BindingReregistrationControlSuboption', - 'MH_HeartbeatControlSuboption', - 'MH_CGAParameter', - 'MH_CGAExtension', - 'MH_UnknownExtension', 'MH_MultiPrefixExtension', 'MH_ExperimentalExtension', -] diff --git a/pcapkit/protocols/schema/internet/ipv6_ext.py b/pcapkit/protocols/schema/internet/ipv6_ext.py deleted file mode 100644 index 406972cb35..0000000000 --- a/pcapkit/protocols/schema/internet/ipv6_ext.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- coding: utf-8 -*- -# mypy: disable-error-code=assignment -"""header schema for generically-parsed IPv6 extension headers""" - -from typing import TYPE_CHECKING - -from pcapkit.const.reg.transtype import TransType as Enum_TransType -from pcapkit.corekit.fields.misc import PayloadField -from pcapkit.corekit.fields.numbers import EnumField, UInt8Field -from pcapkit.protocols.schema.schema import Schema, schema_final - -__all__ = ['IPv6_Ext'] - -if TYPE_CHECKING: - from pcapkit.protocols.protocol import ProtocolBase - - -@schema_final -class IPv6_Ext(Schema): - """Header schema for a generically-parsed IPv6 extension header. - - Only the two octets :rfc:`6564#section-4` guarantees are parsed at this - layer -- ``next`` and the raw ``Hdr Ext Len`` octet. Combining them into - an actual skip distance is per protocol (a constant for ``IPv6-Frag``, - 4-octet units for ``AH``, 8-octet units for the rest), so that part is - done in :meth:`pcapkit.protocols.internet.ipv6_ext.IPv6_Ext.read`, - which knows which protocol this instance stands in for; this schema does - not. - - """ - - #: Next header. - next: 'Enum_TransType' = EnumField(length=1, namespace=Enum_TransType) - #: Raw ``Hdr Ext Len`` octet -- see the class docstring for why its - #: interpretation is not fixed here. - len: 'int' = UInt8Field() - #: Everything after the two fixed octets; opaque at this layer. - payload: 'bytes' = PayloadField() - - if TYPE_CHECKING: - def __init__(self, next: 'Enum_TransType | int', len: 'int', - payload: 'bytes | ProtocolBase | Schema') -> 'None': ... # pylint: disable=unused-argument,super-init-not-called,multiple-statements diff --git a/pcapkit/protocols/schema/link/__init__.py b/pcapkit/protocols/schema/link/__init__.py deleted file mode 100644 index 1e058d0800..0000000000 --- a/pcapkit/protocols/schema/link/__init__.py +++ /dev/null @@ -1,74 +0,0 @@ -# -*- coding: utf-8 -*- -"""header schema for data link layer protocols""" - -from pcapkit.protocols.schema.link.arp import ARP -from pcapkit.protocols.schema.link.ethernet import Ethernet -from pcapkit.protocols.schema.link.frad import FRAD -from pcapkit.protocols.schema.link.gre import GRE -from pcapkit.protocols.schema.link.ieee802_11 import IEEE802_11 -from pcapkit.protocols.schema.link.l2tp import L2TP -from pcapkit.protocols.schema.link.linux_sll1 import LinuxSLL1 -from pcapkit.protocols.schema.link.linux_sll2 import LinuxSLL2 -from pcapkit.protocols.schema.link.loopback import Loopback -from pcapkit.protocols.schema.link.netlink import Netlink -from pcapkit.protocols.schema.link.radiotap import EHT as Radiotap_EHT -from pcapkit.protocols.schema.link.radiotap import FHSS as Radiotap_FHSS -from pcapkit.protocols.schema.link.radiotap import HE as Radiotap_HE -from pcapkit.protocols.schema.link.radiotap import HEMU as Radiotap_HEMU -from pcapkit.protocols.schema.link.radiotap import LSIG as Radiotap_LSIG -from pcapkit.protocols.schema.link.radiotap import MCS as Radiotap_MCS -from pcapkit.protocols.schema.link.radiotap import S1G as Radiotap_S1G -from pcapkit.protocols.schema.link.radiotap import TLV as Radiotap_TLV -from pcapkit.protocols.schema.link.radiotap import TSFT as Radiotap_TSFT -from pcapkit.protocols.schema.link.radiotap import USIG as Radiotap_USIG -from pcapkit.protocols.schema.link.radiotap import VHT as Radiotap_VHT -from pcapkit.protocols.schema.link.radiotap import AMPDUStatus as Radiotap_AMPDUStatus -from pcapkit.protocols.schema.link.radiotap import Antenna as Radiotap_Antenna -from pcapkit.protocols.schema.link.radiotap import AntennaNoise as Radiotap_AntennaNoise -from pcapkit.protocols.schema.link.radiotap import AntennaSignal as Radiotap_AntennaSignal -from pcapkit.protocols.schema.link.radiotap import Channel as Radiotap_Channel -from pcapkit.protocols.schema.link.radiotap import DataRetries as Radiotap_DataRetries -from pcapkit.protocols.schema.link.radiotap import DBAntennaNoise as Radiotap_DBAntennaNoise -from pcapkit.protocols.schema.link.radiotap import DBAntennaSignal as Radiotap_DBAntennaSignal -from pcapkit.protocols.schema.link.radiotap import DBmTXPower as Radiotap_DBmTXPower -from pcapkit.protocols.schema.link.radiotap import DBTXAttenuation as Radiotap_DBTXAttenuation -from pcapkit.protocols.schema.link.radiotap import Flags as Radiotap_Flags -from pcapkit.protocols.schema.link.radiotap import HEMUOtherUser as Radiotap_HEMUOtherUser -from pcapkit.protocols.schema.link.radiotap import LockQuality as Radiotap_LockQuality -from pcapkit.protocols.schema.link.radiotap import Radiotap -from pcapkit.protocols.schema.link.radiotap import RadiotapField as Radiotap_Field -from pcapkit.protocols.schema.link.radiotap import Rate as Radiotap_Rate -from pcapkit.protocols.schema.link.radiotap import RTSRetries as Radiotap_RTSRetries -from pcapkit.protocols.schema.link.radiotap import RXFlags as Radiotap_RXFlags -from pcapkit.protocols.schema.link.radiotap import Timestamp as Radiotap_Timestamp -from pcapkit.protocols.schema.link.radiotap import TXAttenuation as Radiotap_TXAttenuation -from pcapkit.protocols.schema.link.radiotap import TXFlags as Radiotap_TXFlags -from pcapkit.protocols.schema.link.radiotap import Unknown as Radiotap_Unknown -from pcapkit.protocols.schema.link.radiotap import VendorNamespace as Radiotap_VendorNamespace -from pcapkit.protocols.schema.link.radiotap import VendorTLV as Radiotap_VendorTLV -from pcapkit.protocols.schema.link.radiotap import ZeroLengthPSDU as Radiotap_ZeroLengthPSDU -from pcapkit.protocols.schema.link.vlan import TCI as VLAN_TCI -from pcapkit.protocols.schema.link.vlan import VLAN - -__all__ = [ - 'ARP', - 'Ethernet', - 'FRAD', - 'GRE', - 'IEEE802_11', - 'L2TP', - 'LinuxSLL1', 'LinuxSLL2', - 'Loopback', - 'Netlink', - 'Radiotap', - 'Radiotap_Field', 'Radiotap_Unknown', 'Radiotap_TSFT', 'Radiotap_Flags', 'Radiotap_Rate', - 'Radiotap_Channel', 'Radiotap_FHSS', 'Radiotap_AntennaSignal', 'Radiotap_AntennaNoise', - 'Radiotap_LockQuality', 'Radiotap_TXAttenuation', 'Radiotap_DBTXAttenuation', - 'Radiotap_DBmTXPower', 'Radiotap_Antenna', 'Radiotap_DBAntennaSignal', - 'Radiotap_DBAntennaNoise', 'Radiotap_RXFlags', 'Radiotap_TXFlags', 'Radiotap_RTSRetries', - 'Radiotap_DataRetries', 'Radiotap_MCS', 'Radiotap_AMPDUStatus', 'Radiotap_VHT', - 'Radiotap_Timestamp', 'Radiotap_HE', 'Radiotap_HEMU', 'Radiotap_HEMUOtherUser', - 'Radiotap_ZeroLengthPSDU', 'Radiotap_LSIG', 'Radiotap_VendorNamespace', 'Radiotap_S1G', - 'Radiotap_USIG', 'Radiotap_EHT', 'Radiotap_TLV', 'Radiotap_VendorTLV', - 'VLAN', 'VLAN_TCI', -] diff --git a/pcapkit/protocols/schema/misc/__init__.py b/pcapkit/protocols/schema/misc/__init__.py deleted file mode 100644 index 9965aedb6c..0000000000 --- a/pcapkit/protocols/schema/misc/__init__.py +++ /dev/null @@ -1,114 +0,0 @@ -# -*- coding: utf-8 -*- -"""header schema for utility protocols""" - -# PCAP file format -from pcapkit.protocols.schema.misc.pcap import * - -# PCAP-NG file format -from pcapkit.protocols.schema.misc.pcapng import PCAPNG -from pcapkit.protocols.schema.misc.pcapng import BlockType as PCAPNG_BlockType -from pcapkit.protocols.schema.misc.pcapng import CommentOption as PCAPNG_CommentOption -from pcapkit.protocols.schema.misc.pcapng import CustomBlock as PCAPNG_CustomBlock -from pcapkit.protocols.schema.misc.pcapng import CustomOption as PCAPNG_CustomOption -from pcapkit.protocols.schema.misc.pcapng import \ - DecryptionSecretsBlock as PCAPNG_DecryptionSecretsBlock -from pcapkit.protocols.schema.misc.pcapng import DSBSecrets as PCAPNG_DSBSecrets -from pcapkit.protocols.schema.misc.pcapng import EndOfOption as PCAPNG_EndOfOption -from pcapkit.protocols.schema.misc.pcapng import EndRecord as PCAPNG_EndRecord -from pcapkit.protocols.schema.misc.pcapng import EnhancedPacketBlock as PCAPNG_EnhancedPacketBlock -from pcapkit.protocols.schema.misc.pcapng import EPB_DropCountOption as PCAPNG_EPB_DropCountOption -from pcapkit.protocols.schema.misc.pcapng import EPB_FlagsOption as PCAPNG_EPB_FlagsOption -from pcapkit.protocols.schema.misc.pcapng import EPB_HashOption as PCAPNG_EPB_HashOption -from pcapkit.protocols.schema.misc.pcapng import EPB_PacketIDOption as PCAPNG_EPB_PacketIDOption -from pcapkit.protocols.schema.misc.pcapng import EPB_QueueOption as PCAPNG_EPB_QueueOption -from pcapkit.protocols.schema.misc.pcapng import EPB_VerdictOption as PCAPNG_EPB_VerdictOption -from pcapkit.protocols.schema.misc.pcapng import IF_DescriptionOption as PCAPNG_IF_DescriptionOption -from pcapkit.protocols.schema.misc.pcapng import IF_EUIAddrOption as PCAPNG_IF_EUIAddrOption -from pcapkit.protocols.schema.misc.pcapng import IF_FCSLenOption as PCAPNG_IF_FCSLenOption -from pcapkit.protocols.schema.misc.pcapng import IF_FilterOption as PCAPNG_IF_FilterOption -from pcapkit.protocols.schema.misc.pcapng import IF_HardwareOption as PCAPNG_IF_HardwareOption -from pcapkit.protocols.schema.misc.pcapng import IF_IPv4AddrOption as PCAPNG_IF_IPv4AddrOption -from pcapkit.protocols.schema.misc.pcapng import IF_IPv6AddrOption as PCAPNG_IF_IPv6AddrOption -from pcapkit.protocols.schema.misc.pcapng import IF_MACAddrOption as PCAPNG_IF_MACAddrOption -from pcapkit.protocols.schema.misc.pcapng import IF_NameOption as PCAPNG_IF_NameOption -from pcapkit.protocols.schema.misc.pcapng import IF_OSOption as PCAPNG_IF_OSOption -from pcapkit.protocols.schema.misc.pcapng import IF_RxSpeedOption as PCAPNG_IF_RxSpeedOption -from pcapkit.protocols.schema.misc.pcapng import IF_SpeedOption as PCAPNG_IF_SpeedOption -from pcapkit.protocols.schema.misc.pcapng import IF_TSOffsetOption as PCAPNG_IF_TSOffsetOption -from pcapkit.protocols.schema.misc.pcapng import IF_TSResolOption as PCAPNG_IF_TSResolOption -from pcapkit.protocols.schema.misc.pcapng import IF_TxSpeedOption as PCAPNG_IF_TxSpeedOption -from pcapkit.protocols.schema.misc.pcapng import IF_TZoneOption as PCAPNG_IF_TZoneOption -from pcapkit.protocols.schema.misc.pcapng import \ - InterfaceDescriptionBlock as PCAPNG_InterfaceDescriptionBlock -from pcapkit.protocols.schema.misc.pcapng import \ - InterfaceStatisticsBlock as PCAPNG_InterfaceStatisticsBlock -from pcapkit.protocols.schema.misc.pcapng import IPv4Record as PCAPNG_IPv4Record -from pcapkit.protocols.schema.misc.pcapng import IPv6Record as PCAPNG_IPv6Record -from pcapkit.protocols.schema.misc.pcapng import ISB_EndTimeOption as PCAPNG_ISB_EndTimeOption -from pcapkit.protocols.schema.misc.pcapng import \ - ISB_FilterAcceptOption as PCAPNG_ISB_FilterAcceptOption -from pcapkit.protocols.schema.misc.pcapng import ISB_IFDropOption as PCAPNG_ISB_IFDropOption -from pcapkit.protocols.schema.misc.pcapng import ISB_IFRecvOption as PCAPNG_ISB_IFRecvOption -from pcapkit.protocols.schema.misc.pcapng import ISB_OSDropOption as PCAPNG_ISB_OSDropOption -from pcapkit.protocols.schema.misc.pcapng import ISB_StartTimeOption as PCAPNG_ISB_StartTimeOption -from pcapkit.protocols.schema.misc.pcapng import ISB_UsrDelivOption as PCAPNG_ISB_UsrDelivOption -from pcapkit.protocols.schema.misc.pcapng import NameResolutionBlock as PCAPNG_NameResolutionBlock -from pcapkit.protocols.schema.misc.pcapng import NameResolutionRecord as PCAPNG_NameResolutionRecord -from pcapkit.protocols.schema.misc.pcapng import NS_DNSIP4AddrOption as PCAPNG_NS_DNSIP4AddrOption -from pcapkit.protocols.schema.misc.pcapng import NS_DNSIP6AddrOption as PCAPNG_NS_DNSIP6AddrOption -from pcapkit.protocols.schema.misc.pcapng import NS_DNSNameOption as PCAPNG_NS_DNSNameOption -from pcapkit.protocols.schema.misc.pcapng import Option as PCAPNG_Option -from pcapkit.protocols.schema.misc.pcapng import PACK_FlagsOption as PCAPNG_PACK_FlagsOption -from pcapkit.protocols.schema.misc.pcapng import PACK_HashOption as PCAPNG_PACK_HashOption -from pcapkit.protocols.schema.misc.pcapng import PacketBlock as PCAPNG_PacketBlock -from pcapkit.protocols.schema.misc.pcapng import SectionHeaderBlock as PCAPNG_SectionHeaderBlock -from pcapkit.protocols.schema.misc.pcapng import SimplePacketBlock as PCAPNG_SimplePacketBlock -from pcapkit.protocols.schema.misc.pcapng import \ - SystemdJournalExportBlock as PCAPNG_SystemdJournalExportBlock -from pcapkit.protocols.schema.misc.pcapng import TLSKeyLog as PCAPNG_TLSKeyLog -from pcapkit.protocols.schema.misc.pcapng import UnknownBlock as PCAPNG_UnknownBlock -from pcapkit.protocols.schema.misc.pcapng import UnknownOption as PCAPNG_UnknownOption -from pcapkit.protocols.schema.misc.pcapng import UnknownRecord as PCAPNG_UnknownRecord -from pcapkit.protocols.schema.misc.pcapng import UnknownSecrets as PCAPNG_UnknownSecrets -from pcapkit.protocols.schema.misc.pcapng import WireGuardKeyLog as PCAPNG_WireGuardKeyLog -from pcapkit.protocols.schema.misc.pcapng import ZigBeeAPSKey as PCAPNG_ZigBeeAPSKey -from pcapkit.protocols.schema.misc.pcapng import ZigBeeNWKKey as PCAPNG_ZigBeeNWKKey - -# misc protocols -from pcapkit.protocols.schema.misc.raw import Raw -from pcapkit.protocols.schema.misc.no_payload import NoPayload -from pcapkit.protocols.schema.misc.checksum import IP_Pseudo - -__all__ = [ - # PCAP file format - 'Header', - 'Frame', - - # PCAP-NG file format - 'PCAPNG', - 'PCAPNG_Option', 'PCAPNG_UnknownOption', - 'PCAPNG_EndOfOption', 'PCAPNG_CommentOption', 'PCAPNG_CustomOption', - 'PCAPNG_IF_NameOption', 'PCAPNG_IF_DescriptionOption', 'PCAPNG_IF_IPv4AddrOption', 'PCAPNG_IF_IPv6AddrOption', - 'PCAPNG_IF_MACAddrOption', 'PCAPNG_IF_EUIAddrOption', 'PCAPNG_IF_SpeedOption', 'PCAPNG_IF_TSResolOption', - 'PCAPNG_IF_TZoneOption', 'PCAPNG_IF_FilterOption', 'PCAPNG_IF_OSOption', 'PCAPNG_IF_FCSLenOption', - 'PCAPNG_IF_TSOffsetOption', 'PCAPNG_IF_HardwareOption', 'PCAPNG_IF_TxSpeedOption', 'PCAPNG_IF_RxSpeedOption', - 'PCAPNG_EPB_FlagsOption', 'PCAPNG_EPB_HashOption', 'PCAPNG_EPB_DropCountOption', 'PCAPNG_EPB_PacketIDOption', - 'PCAPNG_EPB_QueueOption', 'PCAPNG_EPB_VerdictOption', - 'PCAPNG_NS_DNSNameOption', 'PCAPNG_NS_DNSIP4AddrOption', 'PCAPNG_NS_DNSIP6AddrOption', - 'PCAPNG_ISB_StartTimeOption', 'PCAPNG_ISB_EndTimeOption', 'PCAPNG_ISB_IFRecvOption', 'PCAPNG_ISB_IFDropOption', - 'PCAPNG_ISB_FilterAcceptOption', 'PCAPNG_ISB_OSDropOption', 'PCAPNG_ISB_UsrDelivOption', - 'PCAPNG_PACK_FlagsOption', 'PCAPNG_PACK_HashOption', - 'PCAPNG_NameResolutionRecord', 'PCAPNG_UnknownRecord', 'PCAPNG_EndRecord', 'PCAPNG_IPv4Record', 'PCAPNG_IPv6Record', - 'PCAPNG_DSBSecrets', 'PCAPNG_UnknownSecrets', 'PCAPNG_TLSKeyLog', 'PCAPNG_WireGuardKeyLog', 'PCAPNG_ZigBeeNWKKey', - 'PCAPNG_ZigBeeAPSKey', - 'PCAPNG_BlockType', - 'PCAPNG_UnknownBlock', 'PCAPNG_SectionHeaderBlock', 'PCAPNG_InterfaceDescriptionBlock', - 'PCAPNG_EnhancedPacketBlock', 'PCAPNG_SimplePacketBlock', 'PCAPNG_NameResolutionBlock', - 'PCAPNG_InterfaceStatisticsBlock', 'PCAPNG_SystemdJournalExportBlock', 'PCAPNG_DecryptionSecretsBlock', - 'PCAPNG_CustomBlock', 'PCAPNG_PacketBlock', - - # misc protocols - 'IP_Pseudo', - 'NoPayload', - 'Raw', -] diff --git a/pcapkit/protocols/schema/misc/checksum/__init__.py b/pcapkit/protocols/schema/misc/checksum/__init__.py deleted file mode 100644 index 11bb658816..0000000000 --- a/pcapkit/protocols/schema/misc/checksum/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- -"""header schema for checksum pseudo-headers""" - -from pcapkit.protocols.schema.misc.checksum.ip_pseudo import IP_Pseudo - -__all__ = ['IP_Pseudo'] diff --git a/pcapkit/protocols/schema/misc/pcap/__init__.py b/pcapkit/protocols/schema/misc/pcap/__init__.py deleted file mode 100644 index 7435551bd0..0000000000 --- a/pcapkit/protocols/schema/misc/pcap/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- -"""header schema for PCAP file format""" - -from pcapkit.protocols.schema.misc.pcap.header import Header -from pcapkit.protocols.schema.misc.pcap.frame import Frame - -__all__ = [ - 'Header', - 'Frame', -] diff --git a/pcapkit/protocols/schema/transport/__init__.py b/pcapkit/protocols/schema/transport/__init__.py deleted file mode 100644 index 654bab4572..0000000000 --- a/pcapkit/protocols/schema/transport/__init__.py +++ /dev/null @@ -1,179 +0,0 @@ -# -*- coding: utf-8 -*- -"""header schema for transport layer protocols""" - -# Datagram Congestion Control Protocol -from pcapkit.protocols.schema.transport.dccp import DCCP -from pcapkit.protocols.schema.transport.dccp import AckVector as DCCP_AckVector -from pcapkit.protocols.schema.transport.dccp import Change as DCCP_Change -from pcapkit.protocols.schema.transport.dccp import Confirm as DCCP_Confirm -from pcapkit.protocols.schema.transport.dccp import DataChecksum as DCCP_DataChecksum -from pcapkit.protocols.schema.transport.dccp import DataDropped as DCCP_DataDropped -from pcapkit.protocols.schema.transport.dccp import ElapsedTime as DCCP_ElapsedTime -from pcapkit.protocols.schema.transport.dccp import InitCookie as DCCP_InitCookie -from pcapkit.protocols.schema.transport.dccp import Mandatory as DCCP_Mandatory -from pcapkit.protocols.schema.transport.dccp import NDPCount as DCCP_NDPCount -from pcapkit.protocols.schema.transport.dccp import Option as DCCP_Option -from pcapkit.protocols.schema.transport.dccp import Padding as DCCP_Padding -from pcapkit.protocols.schema.transport.dccp import SlowReceiver as DCCP_SlowReceiver -from pcapkit.protocols.schema.transport.dccp import Timestamp as DCCP_Timestamp -from pcapkit.protocols.schema.transport.dccp import TimestampEcho as DCCP_TimestampEcho -from pcapkit.protocols.schema.transport.dccp import UnassignedOption as DCCP_UnassignedOption - -# Transmission Control Protocol -from pcapkit.protocols.schema.transport.tcp import CC as TCP_CC -from pcapkit.protocols.schema.transport.tcp import MPTCP as TCP_MPTCP -from pcapkit.protocols.schema.transport.tcp import MPTCPDSS as TCP_MPTCPDSS -from pcapkit.protocols.schema.transport.tcp import SACK as TCP_SACK -from pcapkit.protocols.schema.transport.tcp import TCP -from pcapkit.protocols.schema.transport.tcp import \ - AlternateChecksumData as TCP_AlternateChecksumData -from pcapkit.protocols.schema.transport.tcp import \ - AlternateChecksumRequest as TCP_AlternateChecksumRequest -from pcapkit.protocols.schema.transport.tcp import Authentication as TCP_Authentication -from pcapkit.protocols.schema.transport.tcp import CCEcho as TCP_CCEcho -from pcapkit.protocols.schema.transport.tcp import CCNew as TCP_CCNew -from pcapkit.protocols.schema.transport.tcp import Echo as TCP_Echo -from pcapkit.protocols.schema.transport.tcp import EchoReply as TCP_EchoReply -from pcapkit.protocols.schema.transport.tcp import EndOfOptionList as TCP_EndOfOptionList -from pcapkit.protocols.schema.transport.tcp import FastOpenCookie as TCP_FastOpenCookie -from pcapkit.protocols.schema.transport.tcp import MaximumSegmentSize as TCP_MaximumSegmentSize -from pcapkit.protocols.schema.transport.tcp import MD5Signature as TCP_MD5Signature -from pcapkit.protocols.schema.transport.tcp import MPTCPAddAddress as TCP_MPTCPAddAddress -from pcapkit.protocols.schema.transport.tcp import MPTCPCapable as TCP_MPTCPCapable -from pcapkit.protocols.schema.transport.tcp import MPTCPFallback as TCP_MPTCPFallback -from pcapkit.protocols.schema.transport.tcp import MPTCPFastclose as TCP_MPTCPFastclose -from pcapkit.protocols.schema.transport.tcp import MPTCPJoin as TCP_MPTCPJoin -from pcapkit.protocols.schema.transport.tcp import MPTCPJoinACK as TCP_MPTCPJoinACK -from pcapkit.protocols.schema.transport.tcp import MPTCPJoinSYN as TCP_MPTCPJoinSYN -from pcapkit.protocols.schema.transport.tcp import MPTCPJoinSYNACK as TCP_MPTCPJoinSYNACK -from pcapkit.protocols.schema.transport.tcp import MPTCPPriority as TCP_MPTCPPriority -from pcapkit.protocols.schema.transport.tcp import MPTCPRemoveAddress as TCP_MPTCPRemoveAddress -from pcapkit.protocols.schema.transport.tcp import MPTCPUnknown as TCP_MPTCPUnknown -from pcapkit.protocols.schema.transport.tcp import NoOperation as TCP_NoOperation -from pcapkit.protocols.schema.transport.tcp import Option as TCP_Option -from pcapkit.protocols.schema.transport.tcp import \ - PartialOrderConnectionPermitted as TCP_PartialOrderConnectionPermitted -from pcapkit.protocols.schema.transport.tcp import \ - PartialOrderServiceProfile as TCP_PartialOrderServiceProfile -from pcapkit.protocols.schema.transport.tcp import QuickStartResponse as TCP_QuickStartResponse -from pcapkit.protocols.schema.transport.tcp import SACKBlock as TCP_SACKBlock -from pcapkit.protocols.schema.transport.tcp import SACKPermitted as TCP_SACKPermitted -from pcapkit.protocols.schema.transport.tcp import Timestamps as TCP_Timestamps -from pcapkit.protocols.schema.transport.tcp import UnassignedOption as TCP_UnassignedOption -from pcapkit.protocols.schema.transport.tcp import UserTimeout as TCP_UserTimeout -from pcapkit.protocols.schema.transport.tcp import WindowScale as TCP_WindowScale - -# Stream Control Transmission Protocol -from pcapkit.protocols.schema.transport.sctp import SCTP -from pcapkit.protocols.schema.transport.sctp import AbortChunk as SCTP_AbortChunk -from pcapkit.protocols.schema.transport.sctp import Chunk as SCTP_Chunk -from pcapkit.protocols.schema.transport.sctp import CookieACKChunk as SCTP_CookieACKChunk -from pcapkit.protocols.schema.transport.sctp import CookieEchoChunk as SCTP_CookieEchoChunk -from pcapkit.protocols.schema.transport.sctp import \ - CookiePreservativeParameter as SCTP_CookiePreservativeParameter -from pcapkit.protocols.schema.transport.sctp import \ - CookieReceivedWhileShuttingDownCause as SCTP_CookieReceivedWhileShuttingDownCause -from pcapkit.protocols.schema.transport.sctp import DATAChunk as SCTP_DATAChunk -from pcapkit.protocols.schema.transport.sctp import ErrorCause as SCTP_ErrorCause -from pcapkit.protocols.schema.transport.sctp import ErrorChunk as SCTP_ErrorChunk -from pcapkit.protocols.schema.transport.sctp import GapAckBlock as SCTP_GapAckBlock -from pcapkit.protocols.schema.transport.sctp import HeartbeatACKChunk as SCTP_HeartbeatACKChunk -from pcapkit.protocols.schema.transport.sctp import HeartbeatChunk as SCTP_HeartbeatChunk -from pcapkit.protocols.schema.transport.sctp import \ - HeartbeatInfoParameter as SCTP_HeartbeatInfoParameter -from pcapkit.protocols.schema.transport.sctp import \ - HostNameAddressParameter as SCTP_HostNameAddressParameter -from pcapkit.protocols.schema.transport.sctp import INITACKChunk as SCTP_INITACKChunk -from pcapkit.protocols.schema.transport.sctp import INITChunk as SCTP_INITChunk -from pcapkit.protocols.schema.transport.sctp import \ - InvalidMandatoryParameterCause as SCTP_InvalidMandatoryParameterCause -from pcapkit.protocols.schema.transport.sctp import \ - InvalidStreamIdentifierCause as SCTP_InvalidStreamIdentifierCause -from pcapkit.protocols.schema.transport.sctp import \ - IPv4AddressParameter as SCTP_IPv4AddressParameter -from pcapkit.protocols.schema.transport.sctp import \ - IPv6AddressParameter as SCTP_IPv6AddressParameter -from pcapkit.protocols.schema.transport.sctp import \ - MissingMandatoryParameterCause as SCTP_MissingMandatoryParameterCause -from pcapkit.protocols.schema.transport.sctp import NoUserDataCause as SCTP_NoUserDataCause -from pcapkit.protocols.schema.transport.sctp import OutOfResourceCause as SCTP_OutOfResourceCause -from pcapkit.protocols.schema.transport.sctp import Parameter as SCTP_Parameter -from pcapkit.protocols.schema.transport.sctp import \ - ProtocolViolationCause as SCTP_ProtocolViolationCause -from pcapkit.protocols.schema.transport.sctp import \ - RestartOfAnAssociationWithNewAddressesCause as \ - SCTP_RestartOfAnAssociationWithNewAddressesCause -from pcapkit.protocols.schema.transport.sctp import SACKChunk as SCTP_SACKChunk -from pcapkit.protocols.schema.transport.sctp import ShutdownACKChunk as SCTP_ShutdownACKChunk -from pcapkit.protocols.schema.transport.sctp import ShutdownChunk as SCTP_ShutdownChunk -from pcapkit.protocols.schema.transport.sctp import \ - ShutdownCompleteChunk as SCTP_ShutdownCompleteChunk -from pcapkit.protocols.schema.transport.sctp import StaleCookieCause as SCTP_StaleCookieCause -from pcapkit.protocols.schema.transport.sctp import \ - StateCookieParameter as SCTP_StateCookieParameter -from pcapkit.protocols.schema.transport.sctp import \ - SupportedAddressTypesParameter as SCTP_SupportedAddressTypesParameter -from pcapkit.protocols.schema.transport.sctp import UnknownCause as SCTP_UnknownCause -from pcapkit.protocols.schema.transport.sctp import UnknownChunk as SCTP_UnknownChunk -from pcapkit.protocols.schema.transport.sctp import UnknownParameter as SCTP_UnknownParameter -from pcapkit.protocols.schema.transport.sctp import \ - UnrecognizedChunkTypeCause as SCTP_UnrecognizedChunkTypeCause -from pcapkit.protocols.schema.transport.sctp import \ - UnrecognizedParameter as SCTP_UnrecognizedParameter -from pcapkit.protocols.schema.transport.sctp import \ - UnrecognizedParametersCause as SCTP_UnrecognizedParametersCause -from pcapkit.protocols.schema.transport.sctp import \ - UnresolvableAddressCause as SCTP_UnresolvableAddressCause -from pcapkit.protocols.schema.transport.sctp import \ - UserInitiatedAbortCause as SCTP_UserInitiatedAbortCause -# User Datagram Protocol -from pcapkit.protocols.schema.transport.udp import UDP - -__all__ = [ - # Datagram Congestion Control Protocol - 'DCCP', - 'DCCP_Option', - 'DCCP_UnassignedOption', 'DCCP_Padding', 'DCCP_Mandatory', 'DCCP_SlowReceiver', 'DCCP_Change', - 'DCCP_Confirm', 'DCCP_InitCookie', 'DCCP_NDPCount', 'DCCP_AckVector', 'DCCP_DataDropped', - 'DCCP_Timestamp', 'DCCP_TimestampEcho', 'DCCP_ElapsedTime', 'DCCP_DataChecksum', - - # Transmission Control Protocol - 'TCP', - 'TCP_SACKBlock', - 'TCP_Option', - 'TCP_UnassignedOption', 'TCP_EndOfOptionList', 'TCP_NoOperation', 'TCP_MaximumSegmentSize', 'TCP_WindowScale', - 'TCP_SACKPermitted', 'TCP_SACK', 'TCP_Echo', 'TCP_EchoReply', 'TCP_Timestamps', 'TCP_PartialOrderConnectionPermitted', # pylint: disable=line-too-long - 'TCP_PartialOrderServiceProfile', 'TCP_CC', 'TCP_CCNew', 'TCP_CCEcho', 'TCP_AlternateChecksumRequest', - 'TCP_AlternateChecksumData', 'TCP_MD5Signature', 'TCP_QuickStartResponse', 'TCP_UserTimeout', - 'TCP_Authentication', 'TCP_FastOpenCookie', - 'TCP_MPTCP', - 'TCP_MPTCPUnknown', 'TCP_MPTCPCapable', 'TCP_MPTCPDSS', 'TCP_MPTCPAddAddress', 'TCP_MPTCPRemoveAddress', - 'TCP_MPTCPPriority', 'TCP_MPTCPFallback', 'TCP_MPTCPFastclose', - 'TCP_MPTCPJoin', - 'TCP_MPTCPJoinSYN', 'TCP_MPTCPJoinSYNACK', 'TCP_MPTCPJoinACK', - - # Stream Control Transmission Protocol - 'SCTP', - 'SCTP_GapAckBlock', - 'SCTP_Chunk', - 'SCTP_UnknownChunk', 'SCTP_DATAChunk', 'SCTP_INITChunk', 'SCTP_INITACKChunk', 'SCTP_SACKChunk', - 'SCTP_HeartbeatChunk', 'SCTP_HeartbeatACKChunk', 'SCTP_AbortChunk', 'SCTP_ShutdownChunk', - 'SCTP_ShutdownACKChunk', 'SCTP_ErrorChunk', 'SCTP_CookieEchoChunk', 'SCTP_CookieACKChunk', - 'SCTP_ShutdownCompleteChunk', - 'SCTP_Parameter', - 'SCTP_UnknownParameter', 'SCTP_HeartbeatInfoParameter', 'SCTP_IPv4AddressParameter', - 'SCTP_IPv6AddressParameter', 'SCTP_StateCookieParameter', 'SCTP_UnrecognizedParameter', - 'SCTP_CookiePreservativeParameter', 'SCTP_HostNameAddressParameter', - 'SCTP_SupportedAddressTypesParameter', - 'SCTP_ErrorCause', - 'SCTP_UnknownCause', 'SCTP_InvalidStreamIdentifierCause', - 'SCTP_MissingMandatoryParameterCause', 'SCTP_StaleCookieCause', 'SCTP_OutOfResourceCause', - 'SCTP_UnresolvableAddressCause', 'SCTP_UnrecognizedChunkTypeCause', - 'SCTP_InvalidMandatoryParameterCause', 'SCTP_UnrecognizedParametersCause', - 'SCTP_NoUserDataCause', 'SCTP_CookieReceivedWhileShuttingDownCause', - 'SCTP_RestartOfAnAssociationWithNewAddressesCause', 'SCTP_UserInitiatedAbortCause', - 'SCTP_ProtocolViolationCause', - - # User Datagram Protocol - 'UDP', -] diff --git a/pcapkit/protocols/transport/__init__.py b/pcapkit/protocols/transport/__init__.py index f71009ba3b..8047a0c866 100644 --- a/pcapkit/protocols/transport/__init__.py +++ b/pcapkit/protocols/transport/__init__.py @@ -15,10 +15,10 @@ from pcapkit.protocols.transport.transport import Transport # Transport Layer Protocols -from pcapkit.protocols.transport.dccp import DCCP -from pcapkit.protocols.transport.sctp import SCTP -from pcapkit.protocols.transport.tcp import TCP -from pcapkit.protocols.transport.udp import UDP +from pcapkit.protocols.transport.dccp.protocol import DCCP +from pcapkit.protocols.transport.sctp.protocol import SCTP +from pcapkit.protocols.transport.tcp.protocol import TCP +from pcapkit.protocols.transport.udp.protocol import UDP # Transport Layer Protocol Numbers from pcapkit.const.reg.transtype import TransType as TRANSTYPE diff --git a/pcapkit/protocols/transport/dccp/__init__.py b/pcapkit/protocols/transport/dccp/__init__.py new file mode 100644 index 0000000000..18fc3f3575 --- /dev/null +++ b/pcapkit/protocols/transport/dccp/__init__.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""DCCP - Datagram Congestion Control Protocol +================================================= + +.. module:: pcapkit.protocols.transport.dccp + +:mod:`pcapkit.protocols.transport.dccp` holds the dissector, +:class:`~pcapkit.protocols.transport.dccp.protocol.DCCP`, in +:mod:`~pcapkit.protocols.transport.dccp.protocol`, its header schema in +:mod:`~pcapkit.protocols.transport.dccp.schema` and its data model in +:mod:`~pcapkit.protocols.transport.dccp.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.transport.dccp.protocol import DCCP + +# Header Schemas +from pcapkit.protocols.transport.dccp.schema import DCCP as Schema_DCCP +from pcapkit.protocols.transport.dccp.schema import AckVector as Schema_AckVector +from pcapkit.protocols.transport.dccp.schema import Change as Schema_Change +from pcapkit.protocols.transport.dccp.schema import Confirm as Schema_Confirm +from pcapkit.protocols.transport.dccp.schema import DataChecksum as Schema_DataChecksum +from pcapkit.protocols.transport.dccp.schema import DataDropped as Schema_DataDropped +from pcapkit.protocols.transport.dccp.schema import ElapsedTime as Schema_ElapsedTime +from pcapkit.protocols.transport.dccp.schema import InitCookie as Schema_InitCookie +from pcapkit.protocols.transport.dccp.schema import Mandatory as Schema_Mandatory +from pcapkit.protocols.transport.dccp.schema import NDPCount as Schema_NDPCount +from pcapkit.protocols.transport.dccp.schema import Option as Schema_Option +from pcapkit.protocols.transport.dccp.schema import Padding as Schema_Padding +from pcapkit.protocols.transport.dccp.schema import SlowReceiver as Schema_SlowReceiver +from pcapkit.protocols.transport.dccp.schema import Timestamp as Schema_Timestamp +from pcapkit.protocols.transport.dccp.schema import TimestampEcho as Schema_TimestampEcho +from pcapkit.protocols.transport.dccp.schema import UnassignedOption as Schema_UnassignedOption + +# Data Models +from pcapkit.protocols.transport.dccp.data import DCCP as Data_DCCP +from pcapkit.protocols.transport.dccp.data import AckVector as Data_AckVector +from pcapkit.protocols.transport.dccp.data import AckVectorRun as Data_AckVectorRun +from pcapkit.protocols.transport.dccp.data import Change as Data_Change +from pcapkit.protocols.transport.dccp.data import Confirm as Data_Confirm +from pcapkit.protocols.transport.dccp.data import DataChecksum as Data_DataChecksum +from pcapkit.protocols.transport.dccp.data import DataDropped as Data_DataDropped +from pcapkit.protocols.transport.dccp.data import DataDroppedBlock as Data_DataDroppedBlock +from pcapkit.protocols.transport.dccp.data import ElapsedTime as Data_ElapsedTime +from pcapkit.protocols.transport.dccp.data import InitCookie as Data_InitCookie +from pcapkit.protocols.transport.dccp.data import Mandatory as Data_Mandatory +from pcapkit.protocols.transport.dccp.data import NDPCount as Data_NDPCount +from pcapkit.protocols.transport.dccp.data import Option as Data_Option +from pcapkit.protocols.transport.dccp.data import Padding as Data_Padding +from pcapkit.protocols.transport.dccp.data import SlowReceiver as Data_SlowReceiver +from pcapkit.protocols.transport.dccp.data import Timestamp as Data_Timestamp +from pcapkit.protocols.transport.dccp.data import TimestampEcho as Data_TimestampEcho +from pcapkit.protocols.transport.dccp.data import UnassignedOption as Data_UnassignedOption + +__all__ = ['DCCP'] diff --git a/pcapkit/protocols/data/transport/dccp.py b/pcapkit/protocols/transport/dccp/data.py similarity index 99% rename from pcapkit/protocols/data/transport/dccp.py rename to pcapkit/protocols/transport/dccp/data.py index e10f225c27..1f42a2e3da 100644 --- a/pcapkit/protocols/data/transport/dccp.py +++ b/pcapkit/protocols/transport/dccp/data.py @@ -4,8 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.data import Data -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Data, Protocol if TYPE_CHECKING: from typing import Optional diff --git a/pcapkit/protocols/transport/dccp.py b/pcapkit/protocols/transport/dccp/protocol.py similarity index 90% rename from pcapkit/protocols/transport/dccp.py rename to pcapkit/protocols/transport/dccp/protocol.py index 2a571e05a3..244a37afdf 100644 --- a/pcapkit/protocols/transport/dccp.py +++ b/pcapkit/protocols/transport/dccp/protocol.py @@ -3,10 +3,10 @@ """DCCP - Datagram Congestion Control Protocol ================================================= -.. module:: pcapkit.protocols.transport.dccp +.. module:: pcapkit.protocols.transport.dccp.protocol -:mod:`pcapkit.protocols.transport.dccp` contains -:class:`~pcapkit.protocols.transport.dccp.DCCP` only, +:mod:`pcapkit.protocols.transport.dccp.protocol` contains +:class:`~pcapkit.protocols.transport.dccp.protocol.DCCP` only, which implements the extractor for Datagram Congestion Control Protocol (DCCP) [*]_, whose generic header is described as below: @@ -50,44 +50,44 @@ from pcapkit.corekit.module import ModuleDescriptor from pcapkit.corekit.multidict import OrderedMultiDict from pcapkit.corekit.schema.padding import pad_length -from pcapkit.protocols.data.transport.dccp import DCCP as Data_DCCP -from pcapkit.protocols.data.transport.dccp import AckVector as Data_AckVector -from pcapkit.protocols.data.transport.dccp import AckVectorRun as Data_AckVectorRun -from pcapkit.protocols.data.transport.dccp import Change as Data_Change -from pcapkit.protocols.data.transport.dccp import Confirm as Data_Confirm -from pcapkit.protocols.data.transport.dccp import DataChecksum as Data_DataChecksum -from pcapkit.protocols.data.transport.dccp import DataDropped as Data_DataDropped -from pcapkit.protocols.data.transport.dccp import DataDroppedBlock as Data_DataDroppedBlock -from pcapkit.protocols.data.transport.dccp import ElapsedTime as Data_ElapsedTime -from pcapkit.protocols.data.transport.dccp import InitCookie as Data_InitCookie -from pcapkit.protocols.data.transport.dccp import Mandatory as Data_Mandatory -from pcapkit.protocols.data.transport.dccp import NDPCount as Data_NDPCount -from pcapkit.protocols.data.transport.dccp import Padding as Data_Padding -from pcapkit.protocols.data.transport.dccp import SlowReceiver as Data_SlowReceiver -from pcapkit.protocols.data.transport.dccp import Timestamp as Data_Timestamp -from pcapkit.protocols.data.transport.dccp import TimestampEcho as Data_TimestampEcho -from pcapkit.protocols.data.transport.dccp import UnassignedOption as Data_UnassignedOption -from pcapkit.protocols.schema.schema import Schema -from pcapkit.protocols.schema.transport.dccp import ACK_TYPES -from pcapkit.protocols.schema.transport.dccp import DCCP as Schema_DCCP -from pcapkit.protocols.schema.transport.dccp import (DCCP_MIN_HEADER_LEN, +from pcapkit.protocols.schema import Schema +from pcapkit.protocols.transport.dccp.data import DCCP as Data_DCCP +from pcapkit.protocols.transport.dccp.data import AckVector as Data_AckVector +from pcapkit.protocols.transport.dccp.data import AckVectorRun as Data_AckVectorRun +from pcapkit.protocols.transport.dccp.data import Change as Data_Change +from pcapkit.protocols.transport.dccp.data import Confirm as Data_Confirm +from pcapkit.protocols.transport.dccp.data import DataChecksum as Data_DataChecksum +from pcapkit.protocols.transport.dccp.data import DataDropped as Data_DataDropped +from pcapkit.protocols.transport.dccp.data import DataDroppedBlock as Data_DataDroppedBlock +from pcapkit.protocols.transport.dccp.data import ElapsedTime as Data_ElapsedTime +from pcapkit.protocols.transport.dccp.data import InitCookie as Data_InitCookie +from pcapkit.protocols.transport.dccp.data import Mandatory as Data_Mandatory +from pcapkit.protocols.transport.dccp.data import NDPCount as Data_NDPCount +from pcapkit.protocols.transport.dccp.data import Padding as Data_Padding +from pcapkit.protocols.transport.dccp.data import SlowReceiver as Data_SlowReceiver +from pcapkit.protocols.transport.dccp.data import Timestamp as Data_Timestamp +from pcapkit.protocols.transport.dccp.data import TimestampEcho as Data_TimestampEcho +from pcapkit.protocols.transport.dccp.data import UnassignedOption as Data_UnassignedOption +from pcapkit.protocols.transport.dccp.schema import ACK_TYPES +from pcapkit.protocols.transport.dccp.schema import DCCP as Schema_DCCP +from pcapkit.protocols.transport.dccp.schema import (DCCP_MIN_HEADER_LEN, DCCP_SINGLE_OCTET_OPTION_MAX, RESET_TYPE, SERVICE_TYPES) -from pcapkit.protocols.schema.transport.dccp import AckVector as Schema_AckVector -from pcapkit.protocols.schema.transport.dccp import Change as Schema_Change -from pcapkit.protocols.schema.transport.dccp import Confirm as Schema_Confirm -from pcapkit.protocols.schema.transport.dccp import DataChecksum as Schema_DataChecksum -from pcapkit.protocols.schema.transport.dccp import DataDropped as Schema_DataDropped -from pcapkit.protocols.schema.transport.dccp import ElapsedTime as Schema_ElapsedTime -from pcapkit.protocols.schema.transport.dccp import InitCookie as Schema_InitCookie -from pcapkit.protocols.schema.transport.dccp import Mandatory as Schema_Mandatory -from pcapkit.protocols.schema.transport.dccp import NDPCount as Schema_NDPCount -from pcapkit.protocols.schema.transport.dccp import Padding as Schema_Padding -from pcapkit.protocols.schema.transport.dccp import SlowReceiver as Schema_SlowReceiver -from pcapkit.protocols.schema.transport.dccp import Timestamp as Schema_Timestamp -from pcapkit.protocols.schema.transport.dccp import TimestampEcho as Schema_TimestampEcho -from pcapkit.protocols.schema.transport.dccp import UnassignedOption as Schema_UnassignedOption -from pcapkit.protocols.schema.transport.dccp import header_length +from pcapkit.protocols.transport.dccp.schema import AckVector as Schema_AckVector +from pcapkit.protocols.transport.dccp.schema import Change as Schema_Change +from pcapkit.protocols.transport.dccp.schema import Confirm as Schema_Confirm +from pcapkit.protocols.transport.dccp.schema import DataChecksum as Schema_DataChecksum +from pcapkit.protocols.transport.dccp.schema import DataDropped as Schema_DataDropped +from pcapkit.protocols.transport.dccp.schema import ElapsedTime as Schema_ElapsedTime +from pcapkit.protocols.transport.dccp.schema import InitCookie as Schema_InitCookie +from pcapkit.protocols.transport.dccp.schema import Mandatory as Schema_Mandatory +from pcapkit.protocols.transport.dccp.schema import NDPCount as Schema_NDPCount +from pcapkit.protocols.transport.dccp.schema import Padding as Schema_Padding +from pcapkit.protocols.transport.dccp.schema import SlowReceiver as Schema_SlowReceiver +from pcapkit.protocols.transport.dccp.schema import Timestamp as Schema_Timestamp +from pcapkit.protocols.transport.dccp.schema import TimestampEcho as Schema_TimestampEcho +from pcapkit.protocols.transport.dccp.schema import UnassignedOption as Schema_UnassignedOption +from pcapkit.protocols.transport.dccp.schema import header_length from pcapkit.protocols.transport.transport import Transport from pcapkit.utilities import config from pcapkit.utilities.exceptions import ProtocolError @@ -100,11 +100,11 @@ from typing_extensions import Literal from pcapkit.corekit.enum import EnumRegistry - from pcapkit.protocols.data.transport.dccp import Option as Data_Option - from pcapkit.protocols.misc.checksum.ip_pseudo import IP_Pseudo + from pcapkit.protocols.misc.checksum.ip_pseudo.protocol import IP_Pseudo from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.transport.dccp import Option as Schema_Option - from pcapkit.protocols.schema.transport.dccp import TypeField as Schema_TypeField + from pcapkit.protocols.transport.dccp.data import Option as Data_Option + from pcapkit.protocols.transport.dccp.schema import Option as Schema_Option + from pcapkit.protocols.transport.dccp.schema import TypeField as Schema_TypeField Option = OrderedMultiDict[Enum_Option, Data_Option] OptionParser = Callable[[Schema_Option, NamedArg(Option, 'options')], Data_Option] @@ -122,8 +122,8 @@ class DCCP(Transport[Data_DCCP, Schema_DCCP], """This class implements Datagram Congestion Control Protocol. No application protocol is registered in :attr:`self.__proto__ - `, so the application data - area is :class:`~pcapkit.protocols.misc.raw.Raw` unless one is. + `, so the application data + area is :class:`~pcapkit.protocols.misc.raw.protocol.Raw` unless one is. This class supports parsing of the following DCCP options, which are directly mapped to the :class:`pcapkit.const.dccp.option.Option` @@ -136,53 +136,53 @@ class DCCP(Transport[Data_DCCP, Schema_DCCP], - Option Parser - Option Constructor * - :attr:`~pcapkit.const.dccp.option.Option.Padding` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._read_opt_padding` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._make_opt_padding` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._read_opt_padding` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._make_opt_padding` * - :attr:`~pcapkit.const.dccp.option.Option.Mandatory` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._read_opt_mandatory` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._make_opt_mandatory` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._read_opt_mandatory` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._make_opt_mandatory` * - :attr:`~pcapkit.const.dccp.option.Option.Slow_Receiver` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._read_opt_slow_receiver` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._make_opt_slow_receiver` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._read_opt_slow_receiver` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._make_opt_slow_receiver` * - :attr:`~pcapkit.const.dccp.option.Option.Change_L` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._read_opt_change` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._make_opt_change` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._read_opt_change` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._make_opt_change` * - :attr:`~pcapkit.const.dccp.option.Option.Confirm_L` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._read_opt_confirm` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._make_opt_confirm` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._read_opt_confirm` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._make_opt_confirm` * - :attr:`~pcapkit.const.dccp.option.Option.Change_R` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._read_opt_change` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._make_opt_change` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._read_opt_change` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._make_opt_change` * - :attr:`~pcapkit.const.dccp.option.Option.Confirm_R` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._read_opt_confirm` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._make_opt_confirm` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._read_opt_confirm` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._make_opt_confirm` * - :attr:`~pcapkit.const.dccp.option.Option.Init_Cookie` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._read_opt_init_cookie` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._make_opt_init_cookie` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._read_opt_init_cookie` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._make_opt_init_cookie` * - :attr:`~pcapkit.const.dccp.option.Option.NDP_Count` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._read_opt_ndp_count` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._make_opt_ndp_count` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._read_opt_ndp_count` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._make_opt_ndp_count` * - :attr:`~pcapkit.const.dccp.option.Option.Ack_Vector_Nonce_0` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._read_opt_ack_vector` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._make_opt_ack_vector` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._read_opt_ack_vector` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._make_opt_ack_vector` * - :attr:`~pcapkit.const.dccp.option.Option.Ack_Vector_Nonce_1` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._read_opt_ack_vector` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._make_opt_ack_vector` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._read_opt_ack_vector` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._make_opt_ack_vector` * - :attr:`~pcapkit.const.dccp.option.Option.Data_Dropped` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._read_opt_data_dropped` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._make_opt_data_dropped` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._read_opt_data_dropped` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._make_opt_data_dropped` * - :attr:`~pcapkit.const.dccp.option.Option.Timestamp` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._read_opt_timestamp` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._make_opt_timestamp` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._read_opt_timestamp` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._make_opt_timestamp` * - :attr:`~pcapkit.const.dccp.option.Option.Timestamp_Echo` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._read_opt_timestamp_echo` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._make_opt_timestamp_echo` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._read_opt_timestamp_echo` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._make_opt_timestamp_echo` * - :attr:`~pcapkit.const.dccp.option.Option.Elapsed_Time` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._read_opt_elapsed_time` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._make_opt_elapsed_time` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._read_opt_elapsed_time` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._make_opt_elapsed_time` * - :attr:`~pcapkit.const.dccp.option.Option.Data_Checksum` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._read_opt_data_checksum` - - :meth:`~pcapkit.protocols.transport.dccp.DCCP._make_opt_data_checksum` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._read_opt_data_checksum` + - :meth:`~pcapkit.protocols.transport.dccp.protocol.DCCP._make_opt_data_checksum` Any other option is kept as its type, length and data, through :meth:`_read_opt_unassigned` and :meth:`_make_opt_unassigned`. @@ -205,12 +205,12 @@ class DCCP(Transport[Data_DCCP, Schema_DCCP], #: `. Keyed by #: port number, and empty until a protocol is registered. __proto__ = collections.defaultdict( - lambda: ModuleDescriptor('pcapkit.protocols.misc.raw', 'Raw'), + lambda: ModuleDescriptor('pcapkit.protocols.misc.raw.protocol', 'Raw'), ) # type: DefaultDict[int, ModuleDescriptor[ProtocolBase] | Type[ProtocolBase]] #: What :attr:`__proto__` is keyed by -- the enum a key must be a member of, #: and whether a bare :class:`int` is a valid key there too, as for - #: :attr:`TCP.__proto_key__ `. + #: :attr:`TCP.__proto_key__ `. __proto_key__: 'ClassVar[tuple[Type[EnumRegistry], bool]]' = (Enum_AppType, True) #: Option type to method mapping, see :meth:`_read_dccp_options` and @@ -242,7 +242,7 @@ class DCCP(Transport[Data_DCCP, Schema_DCCP], ) # type: DefaultDict[int, str | tuple[OptionParser, OptionConstructor]] #: Whether :meth:`make` left the checksum for the enclosing IP layer to - #: compute, see :mod:`pcapkit.protocols.misc.checksum.ip_pseudo`. + #: compute, see :mod:`pcapkit.protocols.misc.checksum.ip_pseudo.protocol`. _checksum_pending = False ########################################################################## @@ -465,7 +465,7 @@ def make(self, self._checksum_pending = True else: from pcapkit.corekit.checksum.internet import compute_checksum # isort: skip # pylint: disable=import-outside-toplevel - from pcapkit.protocols.misc.checksum.ip_pseudo import pseudo_header # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.misc.checksum.ip_pseudo.protocol import pseudo_header # isort: skip # pylint: disable=import-outside-toplevel octets = schema.pack() coverage = self._checksum_coverage(cscov, hdr_len, len(octets)) @@ -1253,7 +1253,7 @@ def _make_opt_ack_vector(self, code: 'Enum_Option', opt: 'Optional[Data_AckVecto Args: code: option type, whose nonce the option carries opt: option data - vector: runs, each a :class:`~pcapkit.protocols.data.transport.dccp.AckVectorRun` + vector: runs, each a :class:`~pcapkit.protocols.transport.dccp.data.AckVectorRun` or a ``(state, run_length)`` pair **kwargs: arbitrary keyword arguments @@ -1293,7 +1293,7 @@ def _make_opt_data_dropped(self, code: 'Enum_Option', opt: 'Optional[Data_DataDr code: option type opt: option data vector: blocks, each a - :class:`~pcapkit.protocols.data.transport.dccp.DataDroppedBlock` + :class:`~pcapkit.protocols.transport.dccp.data.DataDroppedBlock` or a ``(code, run_length)`` pair, ``code`` being :data:`None` for a normal block **kwargs: arbitrary keyword arguments @@ -1457,7 +1457,7 @@ def _verify_pseudo_checksum(self, pseudo: 'Optional[IP_Pseudo]') -> 'None': """Verify the checksum over the pseudo-header of the enclosing IP layer. That layer calls this once parsed, see - :func:`~pcapkit.protocols.misc.checksum.ip_pseudo.verify_upper`. The + :func:`~pcapkit.protocols.misc.checksum.ip_pseudo.protocol.verify_upper`. The checksum covers what the Checksum Coverage gives; one covering past the end of the packet is invalid (:rfc:`4340#section-9.2`). diff --git a/pcapkit/protocols/schema/transport/dccp.py b/pcapkit/protocols/transport/dccp/schema.py similarity index 98% rename from pcapkit/protocols/schema/transport/dccp.py rename to pcapkit/protocols/transport/dccp/schema.py index 37acf1779c..46b898d26d 100644 --- a/pcapkit/protocols/schema/transport/dccp.py +++ b/pcapkit/protocols/transport/dccp/schema.py @@ -15,7 +15,7 @@ from pcapkit.corekit.fields.numbers import (EnumField, NumberField, PortEnumField, UInt8Field, UInt32Field) from pcapkit.corekit.fields.strings import BitField, BytesField -from pcapkit.protocols.schema.schema import EnumSchema, Schema, schema_final +from pcapkit.protocols.schema import EnumSchema, Schema, schema_final from pcapkit.utilities.logging import SPHINX_TYPE_CHECKING __all__ = [ @@ -361,7 +361,7 @@ class DCCP(Schema): lambda pkt: pkt['type']['type'] == RESET_TYPE, ) #: Options, cut short where the data is; - #: :meth:`DCCP.read ` refuses such a header. + #: :meth:`DCCP.read ` refuses such a header. options: 'list[Option]' = OptionField( length=lambda pkt: max(min(pkt['offset'] * 4 - header_length(pkt['type']), pkt['__length__']), 0), base_schema=Option, diff --git a/pcapkit/protocols/transport/sctp/__init__.py b/pcapkit/protocols/transport/sctp/__init__.py new file mode 100644 index 0000000000..8d816e57fc --- /dev/null +++ b/pcapkit/protocols/transport/sctp/__init__.py @@ -0,0 +1,147 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""SCTP - Stream Control Transmission Protocol +================================================= + +.. module:: pcapkit.protocols.transport.sctp + +:mod:`pcapkit.protocols.transport.sctp` holds the dissector, +:class:`~pcapkit.protocols.transport.sctp.protocol.SCTP`, in +:mod:`~pcapkit.protocols.transport.sctp.protocol`, its header schema in +:mod:`~pcapkit.protocols.transport.sctp.schema` and its data model in +:mod:`~pcapkit.protocols.transport.sctp.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.transport.sctp.protocol import SCTP + +# Header Schemas +from pcapkit.protocols.transport.sctp.schema import SCTP as Schema_SCTP +from pcapkit.protocols.transport.sctp.schema import AbortChunk as Schema_AbortChunk +from pcapkit.protocols.transport.sctp.schema import Chunk as Schema_Chunk +from pcapkit.protocols.transport.sctp.schema import ChunkListField as Schema_ChunkListField +from pcapkit.protocols.transport.sctp.schema import CookieACKChunk as Schema_CookieACKChunk +from pcapkit.protocols.transport.sctp.schema import CookieEchoChunk as Schema_CookieEchoChunk +from pcapkit.protocols.transport.sctp.schema import \ + CookiePreservativeParameter as Schema_CookiePreservativeParameter +from pcapkit.protocols.transport.sctp.schema import \ + CookieReceivedWhileShuttingDownCause as Schema_CookieReceivedWhileShuttingDownCause +from pcapkit.protocols.transport.sctp.schema import DATAChunk as Schema_DATAChunk +from pcapkit.protocols.transport.sctp.schema import ErrorCause as Schema_ErrorCause +from pcapkit.protocols.transport.sctp.schema import ErrorChunk as Schema_ErrorChunk +from pcapkit.protocols.transport.sctp.schema import GapAckBlock as Schema_GapAckBlock +from pcapkit.protocols.transport.sctp.schema import HeartbeatACKChunk as Schema_HeartbeatACKChunk +from pcapkit.protocols.transport.sctp.schema import HeartbeatChunk as Schema_HeartbeatChunk +from pcapkit.protocols.transport.sctp.schema import \ + HeartbeatInfoParameter as Schema_HeartbeatInfoParameter +from pcapkit.protocols.transport.sctp.schema import \ + HostNameAddressParameter as Schema_HostNameAddressParameter +from pcapkit.protocols.transport.sctp.schema import INITACKChunk as Schema_INITACKChunk +from pcapkit.protocols.transport.sctp.schema import INITChunk as Schema_INITChunk +from pcapkit.protocols.transport.sctp.schema import \ + InvalidMandatoryParameterCause as Schema_InvalidMandatoryParameterCause +from pcapkit.protocols.transport.sctp.schema import \ + InvalidStreamIdentifierCause as Schema_InvalidStreamIdentifierCause +from pcapkit.protocols.transport.sctp.schema import \ + IPv4AddressParameter as Schema_IPv4AddressParameter +from pcapkit.protocols.transport.sctp.schema import \ + IPv6AddressParameter as Schema_IPv6AddressParameter +from pcapkit.protocols.transport.sctp.schema import \ + MissingMandatoryParameterCause as Schema_MissingMandatoryParameterCause +from pcapkit.protocols.transport.sctp.schema import NoUserDataCause as Schema_NoUserDataCause +from pcapkit.protocols.transport.sctp.schema import OutOfResourceCause as Schema_OutOfResourceCause +from pcapkit.protocols.transport.sctp.schema import PaddedOptionField as Schema_PaddedOptionField +from pcapkit.protocols.transport.sctp.schema import Parameter as Schema_Parameter +from pcapkit.protocols.transport.sctp.schema import \ + ProtocolViolationCause as Schema_ProtocolViolationCause +from pcapkit.protocols.transport.sctp.schema import \ + RestartOfAnAssociationWithNewAddressesCause as \ + Schema_RestartOfAnAssociationWithNewAddressesCause +from pcapkit.protocols.transport.sctp.schema import SACKChunk as Schema_SACKChunk +from pcapkit.protocols.transport.sctp.schema import ShutdownACKChunk as Schema_ShutdownACKChunk +from pcapkit.protocols.transport.sctp.schema import ShutdownChunk as Schema_ShutdownChunk +from pcapkit.protocols.transport.sctp.schema import \ + ShutdownCompleteChunk as Schema_ShutdownCompleteChunk +from pcapkit.protocols.transport.sctp.schema import StaleCookieCause as Schema_StaleCookieCause +from pcapkit.protocols.transport.sctp.schema import \ + StateCookieParameter as Schema_StateCookieParameter +from pcapkit.protocols.transport.sctp.schema import \ + SupportedAddressTypesParameter as Schema_SupportedAddressTypesParameter +from pcapkit.protocols.transport.sctp.schema import UnknownCause as Schema_UnknownCause +from pcapkit.protocols.transport.sctp.schema import UnknownChunk as Schema_UnknownChunk +from pcapkit.protocols.transport.sctp.schema import UnknownParameter as Schema_UnknownParameter +from pcapkit.protocols.transport.sctp.schema import \ + UnrecognizedChunkTypeCause as Schema_UnrecognizedChunkTypeCause +from pcapkit.protocols.transport.sctp.schema import \ + UnrecognizedParameter as Schema_UnrecognizedParameter +from pcapkit.protocols.transport.sctp.schema import \ + UnrecognizedParametersCause as Schema_UnrecognizedParametersCause +from pcapkit.protocols.transport.sctp.schema import \ + UnresolvableAddressCause as Schema_UnresolvableAddressCause +from pcapkit.protocols.transport.sctp.schema import \ + UserInitiatedAbortCause as Schema_UserInitiatedAbortCause + +# Data Models +from pcapkit.protocols.transport.sctp.data import SCTP as Data_SCTP +from pcapkit.protocols.transport.sctp.data import AbortChunk as Data_AbortChunk +from pcapkit.protocols.transport.sctp.data import Chunk as Data_Chunk +from pcapkit.protocols.transport.sctp.data import CookieACKChunk as Data_CookieACKChunk +from pcapkit.protocols.transport.sctp.data import CookieEchoChunk as Data_CookieEchoChunk +from pcapkit.protocols.transport.sctp.data import \ + CookiePreservativeParameter as Data_CookiePreservativeParameter +from pcapkit.protocols.transport.sctp.data import \ + CookieReceivedWhileShuttingDownCause as Data_CookieReceivedWhileShuttingDownCause +from pcapkit.protocols.transport.sctp.data import DATAChunk as Data_DATAChunk +from pcapkit.protocols.transport.sctp.data import DATAChunkFlags as Data_DATAChunkFlags +from pcapkit.protocols.transport.sctp.data import ErrorCause as Data_ErrorCause +from pcapkit.protocols.transport.sctp.data import ErrorChunk as Data_ErrorChunk +from pcapkit.protocols.transport.sctp.data import GapAckBlock as Data_GapAckBlock +from pcapkit.protocols.transport.sctp.data import HeartbeatACKChunk as Data_HeartbeatACKChunk +from pcapkit.protocols.transport.sctp.data import HeartbeatChunk as Data_HeartbeatChunk +from pcapkit.protocols.transport.sctp.data import \ + HeartbeatInfoParameter as Data_HeartbeatInfoParameter +from pcapkit.protocols.transport.sctp.data import \ + HostNameAddressParameter as Data_HostNameAddressParameter +from pcapkit.protocols.transport.sctp.data import INITACKChunk as Data_INITACKChunk +from pcapkit.protocols.transport.sctp.data import INITChunk as Data_INITChunk +from pcapkit.protocols.transport.sctp.data import \ + InvalidMandatoryParameterCause as Data_InvalidMandatoryParameterCause +from pcapkit.protocols.transport.sctp.data import \ + InvalidStreamIdentifierCause as Data_InvalidStreamIdentifierCause +from pcapkit.protocols.transport.sctp.data import IPv4AddressParameter as Data_IPv4AddressParameter +from pcapkit.protocols.transport.sctp.data import IPv6AddressParameter as Data_IPv6AddressParameter +from pcapkit.protocols.transport.sctp.data import \ + MissingMandatoryParameterCause as Data_MissingMandatoryParameterCause +from pcapkit.protocols.transport.sctp.data import NoUserDataCause as Data_NoUserDataCause +from pcapkit.protocols.transport.sctp.data import OutOfResourceCause as Data_OutOfResourceCause +from pcapkit.protocols.transport.sctp.data import Parameter as Data_Parameter +from pcapkit.protocols.transport.sctp.data import \ + ProtocolViolationCause as Data_ProtocolViolationCause +from pcapkit.protocols.transport.sctp.data import \ + RestartOfAnAssociationWithNewAddressesCause as Data_RestartOfAnAssociationWithNewAddressesCause +from pcapkit.protocols.transport.sctp.data import SACKChunk as Data_SACKChunk +from pcapkit.protocols.transport.sctp.data import ShutdownACKChunk as Data_ShutdownACKChunk +from pcapkit.protocols.transport.sctp.data import ShutdownChunk as Data_ShutdownChunk +from pcapkit.protocols.transport.sctp.data import \ + ShutdownCompleteChunk as Data_ShutdownCompleteChunk +from pcapkit.protocols.transport.sctp.data import StaleCookieCause as Data_StaleCookieCause +from pcapkit.protocols.transport.sctp.data import StateCookieParameter as Data_StateCookieParameter +from pcapkit.protocols.transport.sctp.data import \ + SupportedAddressTypesParameter as Data_SupportedAddressTypesParameter +from pcapkit.protocols.transport.sctp.data import TBitFlags as Data_TBitFlags +from pcapkit.protocols.transport.sctp.data import UnknownCause as Data_UnknownCause +from pcapkit.protocols.transport.sctp.data import UnknownChunk as Data_UnknownChunk +from pcapkit.protocols.transport.sctp.data import UnknownParameter as Data_UnknownParameter +from pcapkit.protocols.transport.sctp.data import \ + UnrecognizedChunkTypeCause as Data_UnrecognizedChunkTypeCause +from pcapkit.protocols.transport.sctp.data import \ + UnrecognizedParameter as Data_UnrecognizedParameter +from pcapkit.protocols.transport.sctp.data import \ + UnrecognizedParametersCause as Data_UnrecognizedParametersCause +from pcapkit.protocols.transport.sctp.data import \ + UnresolvableAddressCause as Data_UnresolvableAddressCause +from pcapkit.protocols.transport.sctp.data import \ + UserInitiatedAbortCause as Data_UserInitiatedAbortCause + +__all__ = ['SCTP'] diff --git a/pcapkit/protocols/data/transport/sctp.py b/pcapkit/protocols/transport/sctp/data.py similarity index 99% rename from pcapkit/protocols/data/transport/sctp.py rename to pcapkit/protocols/transport/sctp/data.py index 34a758b361..7a9f0cb5be 100644 --- a/pcapkit/protocols/data/transport/sctp.py +++ b/pcapkit/protocols/transport/sctp/data.py @@ -4,8 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.data import Data -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Data, Protocol if TYPE_CHECKING: from ipaddress import IPv4Address, IPv6Address diff --git a/pcapkit/protocols/transport/sctp.py b/pcapkit/protocols/transport/sctp/protocol.py similarity index 93% rename from pcapkit/protocols/transport/sctp.py rename to pcapkit/protocols/transport/sctp/protocol.py index 4f934ee4a2..af33ee17ed 100644 --- a/pcapkit/protocols/transport/sctp.py +++ b/pcapkit/protocols/transport/sctp/protocol.py @@ -3,10 +3,10 @@ """SCTP - Stream Control Transmission Protocol ================================================= -.. module:: pcapkit.protocols.transport.sctp +.. module:: pcapkit.protocols.transport.sctp.protocol -:mod:`pcapkit.protocols.transport.sctp` contains -:class:`~pcapkit.protocols.transport.sctp.SCTP` only, +:mod:`pcapkit.protocols.transport.sctp.protocol` contains +:class:`~pcapkit.protocols.transport.sctp.protocol.SCTP` only, which implements the extractor for Stream Control Transmission Protocol (SCTP) [*]_, whose structure is described as below: @@ -38,123 +38,123 @@ from pcapkit.corekit.module import ModuleDescriptor from pcapkit.corekit.multidict import OrderedMultiDict from pcapkit.corekit.schema.padding import pad_length -from pcapkit.protocols.data.transport.sctp import SCTP as Data_SCTP -from pcapkit.protocols.data.transport.sctp import AbortChunk as Data_AbortChunk -from pcapkit.protocols.data.transport.sctp import CookieACKChunk as Data_CookieACKChunk -from pcapkit.protocols.data.transport.sctp import CookieEchoChunk as Data_CookieEchoChunk -from pcapkit.protocols.data.transport.sctp import \ +from pcapkit.protocols.protocol import ProtocolBase +from pcapkit.protocols.schema import Schema +from pcapkit.protocols.transport.sctp.data import SCTP as Data_SCTP +from pcapkit.protocols.transport.sctp.data import AbortChunk as Data_AbortChunk +from pcapkit.protocols.transport.sctp.data import CookieACKChunk as Data_CookieACKChunk +from pcapkit.protocols.transport.sctp.data import CookieEchoChunk as Data_CookieEchoChunk +from pcapkit.protocols.transport.sctp.data import \ CookiePreservativeParameter as Data_CookiePreservativeParameter -from pcapkit.protocols.data.transport.sctp import \ +from pcapkit.protocols.transport.sctp.data import \ CookieReceivedWhileShuttingDownCause as Data_CookieReceivedWhileShuttingDownCause -from pcapkit.protocols.data.transport.sctp import DATAChunk as Data_DATAChunk -from pcapkit.protocols.data.transport.sctp import DATAChunkFlags as Data_DATAChunkFlags -from pcapkit.protocols.data.transport.sctp import ErrorChunk as Data_ErrorChunk -from pcapkit.protocols.data.transport.sctp import GapAckBlock as Data_GapAckBlock -from pcapkit.protocols.data.transport.sctp import HeartbeatACKChunk as Data_HeartbeatACKChunk -from pcapkit.protocols.data.transport.sctp import HeartbeatChunk as Data_HeartbeatChunk -from pcapkit.protocols.data.transport.sctp import \ +from pcapkit.protocols.transport.sctp.data import DATAChunk as Data_DATAChunk +from pcapkit.protocols.transport.sctp.data import DATAChunkFlags as Data_DATAChunkFlags +from pcapkit.protocols.transport.sctp.data import ErrorChunk as Data_ErrorChunk +from pcapkit.protocols.transport.sctp.data import GapAckBlock as Data_GapAckBlock +from pcapkit.protocols.transport.sctp.data import HeartbeatACKChunk as Data_HeartbeatACKChunk +from pcapkit.protocols.transport.sctp.data import HeartbeatChunk as Data_HeartbeatChunk +from pcapkit.protocols.transport.sctp.data import \ HeartbeatInfoParameter as Data_HeartbeatInfoParameter -from pcapkit.protocols.data.transport.sctp import \ +from pcapkit.protocols.transport.sctp.data import \ HostNameAddressParameter as Data_HostNameAddressParameter -from pcapkit.protocols.data.transport.sctp import INITACKChunk as Data_INITACKChunk -from pcapkit.protocols.data.transport.sctp import INITChunk as Data_INITChunk -from pcapkit.protocols.data.transport.sctp import \ +from pcapkit.protocols.transport.sctp.data import INITACKChunk as Data_INITACKChunk +from pcapkit.protocols.transport.sctp.data import INITChunk as Data_INITChunk +from pcapkit.protocols.transport.sctp.data import \ InvalidMandatoryParameterCause as Data_InvalidMandatoryParameterCause -from pcapkit.protocols.data.transport.sctp import \ +from pcapkit.protocols.transport.sctp.data import \ InvalidStreamIdentifierCause as Data_InvalidStreamIdentifierCause -from pcapkit.protocols.data.transport.sctp import IPv4AddressParameter as Data_IPv4AddressParameter -from pcapkit.protocols.data.transport.sctp import IPv6AddressParameter as Data_IPv6AddressParameter -from pcapkit.protocols.data.transport.sctp import \ +from pcapkit.protocols.transport.sctp.data import IPv4AddressParameter as Data_IPv4AddressParameter +from pcapkit.protocols.transport.sctp.data import IPv6AddressParameter as Data_IPv6AddressParameter +from pcapkit.protocols.transport.sctp.data import \ MissingMandatoryParameterCause as Data_MissingMandatoryParameterCause -from pcapkit.protocols.data.transport.sctp import NoUserDataCause as Data_NoUserDataCause -from pcapkit.protocols.data.transport.sctp import OutOfResourceCause as Data_OutOfResourceCause -from pcapkit.protocols.data.transport.sctp import \ +from pcapkit.protocols.transport.sctp.data import NoUserDataCause as Data_NoUserDataCause +from pcapkit.protocols.transport.sctp.data import OutOfResourceCause as Data_OutOfResourceCause +from pcapkit.protocols.transport.sctp.data import \ ProtocolViolationCause as Data_ProtocolViolationCause -from pcapkit.protocols.data.transport.sctp import \ +from pcapkit.protocols.transport.sctp.data import \ RestartOfAnAssociationWithNewAddressesCause as Data_RestartOfAnAssociationWithNewAddressesCause -from pcapkit.protocols.data.transport.sctp import SACKChunk as Data_SACKChunk -from pcapkit.protocols.data.transport.sctp import ShutdownACKChunk as Data_ShutdownACKChunk -from pcapkit.protocols.data.transport.sctp import ShutdownChunk as Data_ShutdownChunk -from pcapkit.protocols.data.transport.sctp import \ +from pcapkit.protocols.transport.sctp.data import SACKChunk as Data_SACKChunk +from pcapkit.protocols.transport.sctp.data import ShutdownACKChunk as Data_ShutdownACKChunk +from pcapkit.protocols.transport.sctp.data import ShutdownChunk as Data_ShutdownChunk +from pcapkit.protocols.transport.sctp.data import \ ShutdownCompleteChunk as Data_ShutdownCompleteChunk -from pcapkit.protocols.data.transport.sctp import StaleCookieCause as Data_StaleCookieCause -from pcapkit.protocols.data.transport.sctp import StateCookieParameter as Data_StateCookieParameter -from pcapkit.protocols.data.transport.sctp import \ +from pcapkit.protocols.transport.sctp.data import StaleCookieCause as Data_StaleCookieCause +from pcapkit.protocols.transport.sctp.data import StateCookieParameter as Data_StateCookieParameter +from pcapkit.protocols.transport.sctp.data import \ SupportedAddressTypesParameter as Data_SupportedAddressTypesParameter -from pcapkit.protocols.data.transport.sctp import TBitFlags as Data_TBitFlags -from pcapkit.protocols.data.transport.sctp import UnknownCause as Data_UnknownCause -from pcapkit.protocols.data.transport.sctp import UnknownChunk as Data_UnknownChunk -from pcapkit.protocols.data.transport.sctp import UnknownParameter as Data_UnknownParameter -from pcapkit.protocols.data.transport.sctp import \ +from pcapkit.protocols.transport.sctp.data import TBitFlags as Data_TBitFlags +from pcapkit.protocols.transport.sctp.data import UnknownCause as Data_UnknownCause +from pcapkit.protocols.transport.sctp.data import UnknownChunk as Data_UnknownChunk +from pcapkit.protocols.transport.sctp.data import UnknownParameter as Data_UnknownParameter +from pcapkit.protocols.transport.sctp.data import \ UnrecognizedChunkTypeCause as Data_UnrecognizedChunkTypeCause -from pcapkit.protocols.data.transport.sctp import \ +from pcapkit.protocols.transport.sctp.data import \ UnrecognizedParameter as Data_UnrecognizedParameter -from pcapkit.protocols.data.transport.sctp import \ +from pcapkit.protocols.transport.sctp.data import \ UnrecognizedParametersCause as Data_UnrecognizedParametersCause -from pcapkit.protocols.data.transport.sctp import \ +from pcapkit.protocols.transport.sctp.data import \ UnresolvableAddressCause as Data_UnresolvableAddressCause -from pcapkit.protocols.data.transport.sctp import \ +from pcapkit.protocols.transport.sctp.data import \ UserInitiatedAbortCause as Data_UserInitiatedAbortCause -from pcapkit.protocols.protocol import ProtocolBase -from pcapkit.protocols.schema.schema import Schema -from pcapkit.protocols.schema.transport.sctp import SCTP as Schema_SCTP -from pcapkit.protocols.schema.transport.sctp import AbortChunk as Schema_AbortChunk -from pcapkit.protocols.schema.transport.sctp import CookieACKChunk as Schema_CookieACKChunk -from pcapkit.protocols.schema.transport.sctp import CookieEchoChunk as Schema_CookieEchoChunk -from pcapkit.protocols.schema.transport.sctp import \ +from pcapkit.protocols.transport.sctp.schema import SCTP as Schema_SCTP +from pcapkit.protocols.transport.sctp.schema import AbortChunk as Schema_AbortChunk +from pcapkit.protocols.transport.sctp.schema import CookieACKChunk as Schema_CookieACKChunk +from pcapkit.protocols.transport.sctp.schema import CookieEchoChunk as Schema_CookieEchoChunk +from pcapkit.protocols.transport.sctp.schema import \ CookiePreservativeParameter as Schema_CookiePreservativeParameter -from pcapkit.protocols.schema.transport.sctp import \ +from pcapkit.protocols.transport.sctp.schema import \ CookieReceivedWhileShuttingDownCause as Schema_CookieReceivedWhileShuttingDownCause -from pcapkit.protocols.schema.transport.sctp import DATAChunk as Schema_DATAChunk -from pcapkit.protocols.schema.transport.sctp import ErrorChunk as Schema_ErrorChunk -from pcapkit.protocols.schema.transport.sctp import GapAckBlock as Schema_GapAckBlock -from pcapkit.protocols.schema.transport.sctp import HeartbeatACKChunk as Schema_HeartbeatACKChunk -from pcapkit.protocols.schema.transport.sctp import HeartbeatChunk as Schema_HeartbeatChunk -from pcapkit.protocols.schema.transport.sctp import \ +from pcapkit.protocols.transport.sctp.schema import DATAChunk as Schema_DATAChunk +from pcapkit.protocols.transport.sctp.schema import ErrorChunk as Schema_ErrorChunk +from pcapkit.protocols.transport.sctp.schema import GapAckBlock as Schema_GapAckBlock +from pcapkit.protocols.transport.sctp.schema import HeartbeatACKChunk as Schema_HeartbeatACKChunk +from pcapkit.protocols.transport.sctp.schema import HeartbeatChunk as Schema_HeartbeatChunk +from pcapkit.protocols.transport.sctp.schema import \ HeartbeatInfoParameter as Schema_HeartbeatInfoParameter -from pcapkit.protocols.schema.transport.sctp import \ +from pcapkit.protocols.transport.sctp.schema import \ HostNameAddressParameter as Schema_HostNameAddressParameter -from pcapkit.protocols.schema.transport.sctp import INITACKChunk as Schema_INITACKChunk -from pcapkit.protocols.schema.transport.sctp import INITChunk as Schema_INITChunk -from pcapkit.protocols.schema.transport.sctp import \ +from pcapkit.protocols.transport.sctp.schema import INITACKChunk as Schema_INITACKChunk +from pcapkit.protocols.transport.sctp.schema import INITChunk as Schema_INITChunk +from pcapkit.protocols.transport.sctp.schema import \ InvalidMandatoryParameterCause as Schema_InvalidMandatoryParameterCause -from pcapkit.protocols.schema.transport.sctp import \ +from pcapkit.protocols.transport.sctp.schema import \ InvalidStreamIdentifierCause as Schema_InvalidStreamIdentifierCause -from pcapkit.protocols.schema.transport.sctp import \ +from pcapkit.protocols.transport.sctp.schema import \ IPv4AddressParameter as Schema_IPv4AddressParameter -from pcapkit.protocols.schema.transport.sctp import \ +from pcapkit.protocols.transport.sctp.schema import \ IPv6AddressParameter as Schema_IPv6AddressParameter -from pcapkit.protocols.schema.transport.sctp import \ +from pcapkit.protocols.transport.sctp.schema import \ MissingMandatoryParameterCause as Schema_MissingMandatoryParameterCause -from pcapkit.protocols.schema.transport.sctp import NoUserDataCause as Schema_NoUserDataCause -from pcapkit.protocols.schema.transport.sctp import OutOfResourceCause as Schema_OutOfResourceCause -from pcapkit.protocols.schema.transport.sctp import \ +from pcapkit.protocols.transport.sctp.schema import NoUserDataCause as Schema_NoUserDataCause +from pcapkit.protocols.transport.sctp.schema import OutOfResourceCause as Schema_OutOfResourceCause +from pcapkit.protocols.transport.sctp.schema import \ ProtocolViolationCause as Schema_ProtocolViolationCause -from pcapkit.protocols.schema.transport.sctp import \ +from pcapkit.protocols.transport.sctp.schema import \ RestartOfAnAssociationWithNewAddressesCause as \ Schema_RestartOfAnAssociationWithNewAddressesCause -from pcapkit.protocols.schema.transport.sctp import SACKChunk as Schema_SACKChunk -from pcapkit.protocols.schema.transport.sctp import ShutdownACKChunk as Schema_ShutdownACKChunk -from pcapkit.protocols.schema.transport.sctp import ShutdownChunk as Schema_ShutdownChunk -from pcapkit.protocols.schema.transport.sctp import \ +from pcapkit.protocols.transport.sctp.schema import SACKChunk as Schema_SACKChunk +from pcapkit.protocols.transport.sctp.schema import ShutdownACKChunk as Schema_ShutdownACKChunk +from pcapkit.protocols.transport.sctp.schema import ShutdownChunk as Schema_ShutdownChunk +from pcapkit.protocols.transport.sctp.schema import \ ShutdownCompleteChunk as Schema_ShutdownCompleteChunk -from pcapkit.protocols.schema.transport.sctp import StaleCookieCause as Schema_StaleCookieCause -from pcapkit.protocols.schema.transport.sctp import \ +from pcapkit.protocols.transport.sctp.schema import StaleCookieCause as Schema_StaleCookieCause +from pcapkit.protocols.transport.sctp.schema import \ StateCookieParameter as Schema_StateCookieParameter -from pcapkit.protocols.schema.transport.sctp import \ +from pcapkit.protocols.transport.sctp.schema import \ SupportedAddressTypesParameter as Schema_SupportedAddressTypesParameter -from pcapkit.protocols.schema.transport.sctp import UnknownCause as Schema_UnknownCause -from pcapkit.protocols.schema.transport.sctp import UnknownChunk as Schema_UnknownChunk -from pcapkit.protocols.schema.transport.sctp import UnknownParameter as Schema_UnknownParameter -from pcapkit.protocols.schema.transport.sctp import \ +from pcapkit.protocols.transport.sctp.schema import UnknownCause as Schema_UnknownCause +from pcapkit.protocols.transport.sctp.schema import UnknownChunk as Schema_UnknownChunk +from pcapkit.protocols.transport.sctp.schema import UnknownParameter as Schema_UnknownParameter +from pcapkit.protocols.transport.sctp.schema import \ UnrecognizedChunkTypeCause as Schema_UnrecognizedChunkTypeCause -from pcapkit.protocols.schema.transport.sctp import \ +from pcapkit.protocols.transport.sctp.schema import \ UnrecognizedParameter as Schema_UnrecognizedParameter -from pcapkit.protocols.schema.transport.sctp import \ +from pcapkit.protocols.transport.sctp.schema import \ UnrecognizedParametersCause as Schema_UnrecognizedParametersCause -from pcapkit.protocols.schema.transport.sctp import \ +from pcapkit.protocols.transport.sctp.schema import \ UnresolvableAddressCause as Schema_UnresolvableAddressCause -from pcapkit.protocols.schema.transport.sctp import \ +from pcapkit.protocols.transport.sctp.schema import \ UserInitiatedAbortCause as Schema_UserInitiatedAbortCause from pcapkit.protocols.transport.transport import Transport from pcapkit.utilities.exceptions import ProtocolError @@ -169,14 +169,14 @@ from pcapkit.const.reg.apptype import AppType as Enum_AppType from pcapkit.corekit.enum import EnumRegistry - from pcapkit.protocols.data.data import Data - from pcapkit.protocols.data.transport.sctp import Chunk as Data_Chunk - from pcapkit.protocols.data.transport.sctp import ErrorCause as Data_ErrorCause - from pcapkit.protocols.data.transport.sctp import Parameter as Data_Parameter + from pcapkit.protocols.data import Data from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.transport.sctp import Chunk as Schema_Chunk - from pcapkit.protocols.schema.transport.sctp import ErrorCause as Schema_ErrorCause - from pcapkit.protocols.schema.transport.sctp import Parameter as Schema_Parameter + from pcapkit.protocols.transport.sctp.data import Chunk as Data_Chunk + from pcapkit.protocols.transport.sctp.data import ErrorCause as Data_ErrorCause + from pcapkit.protocols.transport.sctp.data import Parameter as Data_Parameter + from pcapkit.protocols.transport.sctp.schema import Chunk as Schema_Chunk + from pcapkit.protocols.transport.sctp.schema import ErrorCause as Schema_ErrorCause + from pcapkit.protocols.transport.sctp.schema import Parameter as Schema_Parameter Chunks = OrderedMultiDict[Enum_Chunk, Data_Chunk] Parameters = OrderedMultiDict[Enum_Parameter, Data_Parameter] @@ -259,7 +259,7 @@ def _restore_padding(data: 'Optional[Data]', schema: 'Schema_T') -> 'Schema_T': Returns: ``schema``, with its padding set from ``data``. Padding kept shorter than ``length`` calls for also sets the schema's ``__padding__`` to its - width, which :func:`~pcapkit.protocols.schema.transport.sctp.padding_length` + width, which :func:`~pcapkit.protocols.transport.sctp.schema.padding_length` packs to rather than zero-filling the octets that were never captured (:issue:`1474`). @@ -315,8 +315,8 @@ class SCTP(Transport[Data_SCTP, Schema_SCTP], schema=Schema_SCTP, data=Data_SCTP): """This class implements Stream Control Transmission Protocol. - Unlike :class:`~pcapkit.protocols.transport.tcp.TCP` and - :class:`~pcapkit.protocols.transport.udp.UDP`, SCTP does **not** dispatch + Unlike :class:`~pcapkit.protocols.transport.tcp.protocol.TCP` and + :class:`~pcapkit.protocols.transport.udp.protocol.UDP`, SCTP does **not** dispatch the next layer on port numbers: user data travels inside DATA chunks, and each DATA chunk names its upper layer through its *payload protocol identifier* (PPID). The :attr:`self.__proto__ ` registry is @@ -330,15 +330,15 @@ class SCTP(Transport[Data_SCTP, Schema_SCTP], By default, PPIDs 60 (``PayloadProtocolIdentifier_3GPP_NG_Application_Protocol``) and 66 (``PayloadProtocolIdentifier_3GPP_NGAP_over_DTLS_over_SCTP``) are registered to - :class:`~pcapkit.protocols.application.ngap.NGAP`, and every other PPID - resolves to :class:`~pcapkit.protocols.misc.raw.Raw`. + :class:`~pcapkit.protocols.application.ngap.protocol.NGAP`, and every other PPID + resolves to :class:`~pcapkit.protocols.misc.raw.protocol.Raw`. Only PPID 60 actually decodes. A PPID 66 payload is an NGAP PDU wrapped in a DTLS record, and this registry maps it straight to - :class:`~pcapkit.protocols.application.ngap.NGAP` rather than through - :class:`~pcapkit.protocols.application.dtls.DTLS`, so the bytes are not + :class:`~pcapkit.protocols.application.ngap.protocol.NGAP` rather than through + :class:`~pcapkit.protocols.application.dtls.protocol.DTLS`, so the bytes are not aligned PER and the parse always degrades to - :class:`~pcapkit.protocols.misc.raw.Raw`. It is registered so that the + :class:`~pcapkit.protocols.misc.raw.protocol.Raw`. It is registered so that the PPID is *named* in the protochain rather than reported as an unassigned number. @@ -353,48 +353,48 @@ class SCTP(Transport[Data_SCTP, Schema_SCTP], - Chunk Parser - Chunk Constructor * - :attr:`~pcapkit.const.sctp.chunk.Chunk.Payload_Data` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._read_chunk_data` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._make_chunk_data` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._read_chunk_data` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._make_chunk_data` * - :attr:`~pcapkit.const.sctp.chunk.Chunk.Initiation` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._read_chunk_init` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._make_chunk_init` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._read_chunk_init` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._make_chunk_init` * - :attr:`~pcapkit.const.sctp.chunk.Chunk.Initiation_Acknowledgement` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._read_chunk_init_ack` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._make_chunk_init_ack` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._read_chunk_init_ack` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._make_chunk_init_ack` * - :attr:`~pcapkit.const.sctp.chunk.Chunk.Selective_Acknowledgement` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._read_chunk_sack` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._make_chunk_sack` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._read_chunk_sack` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._make_chunk_sack` * - :attr:`~pcapkit.const.sctp.chunk.Chunk.Heartbeat_Request` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._read_chunk_heartbeat` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._make_chunk_heartbeat` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._read_chunk_heartbeat` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._make_chunk_heartbeat` * - :attr:`~pcapkit.const.sctp.chunk.Chunk.Heartbeat_Acknowledgement` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._read_chunk_heartbeat_ack` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._make_chunk_heartbeat_ack` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._read_chunk_heartbeat_ack` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._make_chunk_heartbeat_ack` * - :attr:`~pcapkit.const.sctp.chunk.Chunk.Abort` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._read_chunk_abort` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._make_chunk_abort` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._read_chunk_abort` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._make_chunk_abort` * - :attr:`~pcapkit.const.sctp.chunk.Chunk.Shutdown` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._read_chunk_shutdown` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._make_chunk_shutdown` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._read_chunk_shutdown` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._make_chunk_shutdown` * - :attr:`~pcapkit.const.sctp.chunk.Chunk.Shutdown_Acknowledgement` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._read_chunk_shutdown_ack` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._make_chunk_shutdown_ack` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._read_chunk_shutdown_ack` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._make_chunk_shutdown_ack` * - :attr:`~pcapkit.const.sctp.chunk.Chunk.Operation_Error` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._read_chunk_error` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._make_chunk_error` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._read_chunk_error` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._make_chunk_error` * - :attr:`~pcapkit.const.sctp.chunk.Chunk.State_Cookie` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._read_chunk_cookie_echo` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._make_chunk_cookie_echo` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._read_chunk_cookie_echo` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._make_chunk_cookie_echo` * - :attr:`~pcapkit.const.sctp.chunk.Chunk.Cookie_Acknowledgement` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._read_chunk_cookie_ack` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._make_chunk_cookie_ack` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._read_chunk_cookie_ack` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._make_chunk_cookie_ack` * - :attr:`~pcapkit.const.sctp.chunk.Chunk.Shutdown_Complete` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._read_chunk_shutdown_complete` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._make_chunk_shutdown_complete` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._read_chunk_shutdown_complete` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._make_chunk_shutdown_complete` Any other chunk type -- unassigned, reserved, or defined by an SCTP extension that :mod:`pcapkit` does not implement -- falls through to - :meth:`~pcapkit.protocols.transport.sctp.SCTP._read_chunk_donone`, which + :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._read_chunk_donone`, which records the chunk's raw flags and value verbatim rather than raising. This class supports parsing of the following chunk parameters, @@ -408,36 +408,36 @@ class SCTP(Transport[Data_SCTP, Schema_SCTP], - Parameter Parser - Parameter Constructor * - :attr:`~pcapkit.const.sctp.parameter.Parameter.Heartbeat_Info` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._read_param_hbinfo` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._make_param_hbinfo` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._read_param_hbinfo` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._make_param_hbinfo` * - :attr:`~pcapkit.const.sctp.parameter.Parameter.IPv4_Address` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._read_param_ipv4` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._make_param_ipv4` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._read_param_ipv4` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._make_param_ipv4` * - :attr:`~pcapkit.const.sctp.parameter.Parameter.IPv6_Address` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._read_param_ipv6` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._make_param_ipv6` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._read_param_ipv6` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._make_param_ipv6` * - :attr:`~pcapkit.const.sctp.parameter.Parameter.State_Cookie` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._read_param_cookie` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._make_param_cookie` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._read_param_cookie` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._make_param_cookie` * - :attr:`~pcapkit.const.sctp.parameter.Parameter.Unrecognized_Parameter` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._read_param_unrecognized` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._make_param_unrecognized` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._read_param_unrecognized` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._make_param_unrecognized` * - :attr:`~pcapkit.const.sctp.parameter.Parameter.Cookie_Preservative` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._read_param_preservative` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._make_param_preservative` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._read_param_preservative` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._make_param_preservative` * - :attr:`~pcapkit.const.sctp.parameter.Parameter.Host_Name_Address` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._read_param_hostname` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._make_param_hostname` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._read_param_hostname` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._make_param_hostname` * - :attr:`~pcapkit.const.sctp.parameter.Parameter.Supported_Address_Types` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._read_param_addrtypes` - - :meth:`~pcapkit.protocols.transport.sctp.SCTP._make_param_addrtypes` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._read_param_addrtypes` + - :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._make_param_addrtypes` This class supports parsing of every error cause defined by :rfc:`9260#section-3.3.10`, which are directly mapped to the :class:`pcapkit.const.sctp.cause_code.CauseCode` enumeration; see :attr:`self.__cause__ ` for the mapping. Unknown cause codes fall through to - :meth:`~pcapkit.protocols.transport.sctp.SCTP._read_cause_donone`. + :meth:`~pcapkit.protocols.transport.sctp.protocol.SCTP._read_cause_donone`. .. versionadded:: 1.5.0 @@ -485,24 +485,24 @@ class SCTP(Transport[Data_SCTP, Schema_SCTP], #: Protocol index mapping for decoding next layer, see #: :meth:`self._decode_next_layer - #: ` & + #: ` & #: :meth:`self._import_next_layer #: `. #: #: Important: #: Keyed by the DATA chunk's *payload protocol identifier* (PPID), **not** - #: by port number as in :class:`~pcapkit.protocols.transport.tcp.TCP` and - #: :class:`~pcapkit.protocols.transport.udp.UDP`. + #: by port number as in :class:`~pcapkit.protocols.transport.tcp.protocol.TCP` and + #: :class:`~pcapkit.protocols.transport.udp.protocol.UDP`. __proto__ = collections.defaultdict( - lambda: ModuleDescriptor('pcapkit.protocols.misc.raw', 'Raw'), + lambda: ModuleDescriptor('pcapkit.protocols.misc.raw.protocol', 'Raw'), { # PPID 66 is NGAP wrapped in a DTLS record rather than a bare # NGAP-PDU, and this table maps it to NGAP rather than through # DTLS. It is registered so that the PPID is # *named*: the payload fails in NGAP's own decoder and # `beholder` degrades it to Raw, as an unregistered PPID would. - Enum_PayloadProtocolIdentifier.PayloadProtocolIdentifier_3GPP_NG_Application_Protocol: ModuleDescriptor('pcapkit.protocols.application.ngap', 'NGAP'), # NGAP - Enum_PayloadProtocolIdentifier.PayloadProtocolIdentifier_3GPP_NGAP_over_DTLS_over_SCTP: ModuleDescriptor('pcapkit.protocols.application.ngap', 'NGAP'), # NGAP over DTLS + Enum_PayloadProtocolIdentifier.PayloadProtocolIdentifier_3GPP_NG_Application_Protocol: ModuleDescriptor('pcapkit.protocols.application.ngap.protocol', 'NGAP'), # NGAP + Enum_PayloadProtocolIdentifier.PayloadProtocolIdentifier_3GPP_NGAP_over_DTLS_over_SCTP: ModuleDescriptor('pcapkit.protocols.application.ngap.protocol', 'NGAP'), # NGAP over DTLS }, ) # type: DefaultDict[int, ModuleDescriptor[ProtocolBase] | Type[ProtocolBase]] @@ -1001,7 +1001,7 @@ def _get_payload(self) -> 'bytes': whose payload protocol identifier selects the next layer. Should the packet carry no DATA chunk, an empty :obj:`bytes` is returned and the next layer resolves to - :class:`~pcapkit.protocols.misc.no_payload.NoPayload`. + :class:`~pcapkit.protocols.misc.no_payload.protocol.NoPayload`. Returns: Payload of the packet as :obj:`bytes`. @@ -1052,13 +1052,13 @@ def _make_sctp_chunks(self, chunks: 'list[Schema_Chunk | tuple[Enum_Chunk | int, Note: No alignment fix-up happens here, unlike :meth:`TCP._make_tcp_options - `: every + `: every chunk pads itself to the four-byte boundary required by :rfc:`9260#section-3.2`. A chunk without a nested list carries its own trailing :class:`~pcapkit.corekit.fields.strings.PaddingField`, computed from the chunk's own ``length``; one with a nested parameter or error cause list folds its padding into that list, see - :func:`~pcapkit.protocols.schema.transport.sctp.nested_length`. + :func:`~pcapkit.protocols.transport.sctp.schema.nested_length`. """ chunks_list = [] # type: list[Schema_Chunk | bytes] @@ -1106,7 +1106,7 @@ def _decode_next_layer(self, dict_: 'Data_SCTP', proto: 'Optional[int]' = None, arrived with, as :meth:`Internet._import_next_layer ` does for an unregistered transport type. Resolving it to - :class:`~pcapkit.protocols.misc.raw.Raw` is + :class:`~pcapkit.protocols.misc.raw.protocol.Raw` is :meth:`Protocol._import_next_layer `'s job, through :meth:`Protocol._lookup_next_layer @@ -1857,7 +1857,7 @@ def _read_chunk_cookie_echo(self, schema: 'Schema_CookieEchoChunk', *, chunks: ' A COOKIE ECHO chunk carries the *contents* of the state cookie parameter rather than the parameter itself, so the cookie is a plain :obj:`bytes` here rather than a - :class:`~pcapkit.protocols.data.transport.sctp.StateCookieParameter`. + :class:`~pcapkit.protocols.transport.sctp.data.StateCookieParameter`. """ if schema.length < 4: diff --git a/pcapkit/protocols/schema/transport/sctp.py b/pcapkit/protocols/transport/sctp/schema.py similarity index 97% rename from pcapkit/protocols/schema/transport/sctp.py rename to pcapkit/protocols/transport/sctp/schema.py index 19644bf6d8..7295bdfa8b 100644 --- a/pcapkit/protocols/schema/transport/sctp.py +++ b/pcapkit/protocols/transport/sctp/schema.py @@ -18,7 +18,7 @@ from pcapkit.corekit.fields.numbers import EnumField, PortEnumField, UInt16Field, UInt32Field from pcapkit.corekit.fields.strings import BitField, BytesField, PaddingField from pcapkit.corekit.schema.padding import pad_length -from pcapkit.protocols.schema.schema import EnumSchema, Schema, schema_final +from pcapkit.protocols.schema import EnumSchema, Schema, schema_final from pcapkit.utilities.logging import SPHINX_TYPE_CHECKING __all__ = [ @@ -97,8 +97,8 @@ def padding_length(pkt: 'dict[str, Any]') -> 'int': Number of padding bytes the ``length`` calls for. A final chunk captured without (all of) its padding, although :rfc:`9260#section-3.2` has the sender pad every chunk, reads short, which :meth:`Schema.unpack - ` records so that - :meth:`Schema.pack ` writes + ` records so that + :meth:`Schema.pack ` writes back only the octets read, and :class:`PaddedOptionField` lets it parse (:issue:`2680`). When packing, it is clamped to the ``__padding__`` width :func:`pre_pack_padding` hands over, so such a chunk rebuilt from @@ -124,10 +124,10 @@ def pre_pack_padding(schema: 'Schema', packet: 'dict[str, Any]') -> 'None': A schema whose padding was captured short -- only the last chunk of a packet can be -- carries the width as captured under ``__padding__`` in its ``__dict__``, set by ``_restore_padding`` in - :mod:`pcapkit.protocols.transport.sctp` from the chunk's ``padding`` as + :mod:`pcapkit.protocols.transport.sctp.protocol` from the chunk's ``padding`` as parsed (:issue:`1474`). The key is written to ``packet`` for *every* schema, ``None`` when there is no record, since - :meth:`Schema.pack ` shares one + :meth:`Schema.pack ` shares one ``packet`` mapping across siblings and a record left behind by one would otherwise shorten the padding of the next. @@ -194,7 +194,7 @@ def nested_length(base: 'int') -> 'Callable[[dict[str, Any]], int]': padding that is there (:issue:`1479`), recording the cut (:issue:`2680`). * On construction, a separate padding field could not compute its own size: - :meth:`Schema.pack ` passes + :meth:`Schema.pack ` passes one shared ``packet`` mapping down into the nested schemas, and each nested parameter overwrites ``packet['length']`` with *its* length, so a trailing field would size itself from the last parameter rather than from @@ -235,7 +235,7 @@ def _accepts_short_read(self, option: 'Schema') -> 'bool': Returns: Whether the short read :meth:`Schema.unpack - ` recorded is of the + ` recorded is of the item's ``padding``. """ @@ -927,7 +927,7 @@ class ChunkListField(PaddedOptionField): fewer than a chunk header, or a chunk whose ``length`` runs past the data -- cannot be told apart from a chunk cut short. They are not parsed but reported as option padding, which :meth:`Schema.unpack - ` hands back to the stream for + ` hands back to the stream for :attr:`SCTP.trailer` to keep as captured (:issue:`1468`). The padding is the rest of the area declared, as for any :class:`~pcapkit.corekit.fields.collections.OptionField`, so an area the data @@ -970,11 +970,11 @@ class SCTP(Schema): """Header schema for SCTP packets. Note: - Unlike :class:`~pcapkit.protocols.schema.transport.tcp.TCP` and - :class:`~pcapkit.protocols.schema.transport.udp.UDP`, there is **no** + Unlike :class:`~pcapkit.protocols.transport.tcp.schema.TCP` and + :class:`~pcapkit.protocols.transport.udp.schema.UDP`, there is **no** payload field, since SCTP carries its user data inside DATA chunks rather than after the common header. See - :meth:`SCTP._get_payload ` + :meth:`SCTP._get_payload ` for how the next layer is located. """ @@ -997,7 +997,7 @@ class SCTP(Schema): registry=Chunk.registry, ) #: Octets captured after the last whole chunk, see :class:`ChunkListField` - #: and :attr:`IPv4.trailer `. + #: and :attr:`IPv4.trailer `. trailer: 'bytes' = PayloadField(default=b'') if TYPE_CHECKING: diff --git a/pcapkit/protocols/transport/tcp/__init__.py b/pcapkit/protocols/transport/tcp/__init__.py new file mode 100644 index 0000000000..c49f7b1345 --- /dev/null +++ b/pcapkit/protocols/transport/tcp/__init__.py @@ -0,0 +1,108 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""TCP - Transmission Control Protocol +========================================= + +.. module:: pcapkit.protocols.transport.tcp + +:mod:`pcapkit.protocols.transport.tcp` holds the dissector, +:class:`~pcapkit.protocols.transport.tcp.protocol.TCP`, in +:mod:`~pcapkit.protocols.transport.tcp.protocol`, its header schema in +:mod:`~pcapkit.protocols.transport.tcp.schema` and its data model in +:mod:`~pcapkit.protocols.transport.tcp.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.transport.tcp.protocol import TCP + +# Header Schemas +from pcapkit.protocols.transport.tcp.schema import CC as Schema_CC +from pcapkit.protocols.transport.tcp.schema import MPTCP as Schema_MPTCP +from pcapkit.protocols.transport.tcp.schema import MPTCPDSS as Schema_MPTCPDSS +from pcapkit.protocols.transport.tcp.schema import SACK as Schema_SACK +from pcapkit.protocols.transport.tcp.schema import TCP as Schema_TCP +from pcapkit.protocols.transport.tcp.schema import \ + AlternateChecksumData as Schema_AlternateChecksumData +from pcapkit.protocols.transport.tcp.schema import \ + AlternateChecksumRequest as Schema_AlternateChecksumRequest +from pcapkit.protocols.transport.tcp.schema import Authentication as Schema_Authentication +from pcapkit.protocols.transport.tcp.schema import CCEcho as Schema_CCEcho +from pcapkit.protocols.transport.tcp.schema import CCNew as Schema_CCNew +from pcapkit.protocols.transport.tcp.schema import Echo as Schema_Echo +from pcapkit.protocols.transport.tcp.schema import EchoReply as Schema_EchoReply +from pcapkit.protocols.transport.tcp.schema import EndOfOptionList as Schema_EndOfOptionList +from pcapkit.protocols.transport.tcp.schema import FastOpenCookie as Schema_FastOpenCookie +from pcapkit.protocols.transport.tcp.schema import MaximumSegmentSize as Schema_MaximumSegmentSize +from pcapkit.protocols.transport.tcp.schema import MD5Signature as Schema_MD5Signature +from pcapkit.protocols.transport.tcp.schema import MPTCPAddAddress as Schema_MPTCPAddAddress +from pcapkit.protocols.transport.tcp.schema import MPTCPCapable as Schema_MPTCPCapable +from pcapkit.protocols.transport.tcp.schema import MPTCPFallback as Schema_MPTCPFallback +from pcapkit.protocols.transport.tcp.schema import MPTCPFastclose as Schema_MPTCPFastclose +from pcapkit.protocols.transport.tcp.schema import MPTCPJoin as Schema_MPTCPJoin +from pcapkit.protocols.transport.tcp.schema import MPTCPJoinACK as Schema_MPTCPJoinACK +from pcapkit.protocols.transport.tcp.schema import MPTCPJoinSYN as Schema_MPTCPJoinSYN +from pcapkit.protocols.transport.tcp.schema import MPTCPJoinSYNACK as Schema_MPTCPJoinSYNACK +from pcapkit.protocols.transport.tcp.schema import MPTCPPriority as Schema_MPTCPPriority +from pcapkit.protocols.transport.tcp.schema import MPTCPRemoveAddress as Schema_MPTCPRemoveAddress +from pcapkit.protocols.transport.tcp.schema import MPTCPUnknown as Schema_MPTCPUnknown +from pcapkit.protocols.transport.tcp.schema import NoOperation as Schema_NoOperation +from pcapkit.protocols.transport.tcp.schema import Option as Schema_Option +from pcapkit.protocols.transport.tcp.schema import \ + PartialOrderConnectionPermitted as Schema_PartialOrderConnectionPermitted +from pcapkit.protocols.transport.tcp.schema import \ + PartialOrderServiceProfile as Schema_PartialOrderServiceProfile +from pcapkit.protocols.transport.tcp.schema import QuickStartResponse as Schema_QuickStartResponse +from pcapkit.protocols.transport.tcp.schema import SACKBlock as Schema_SACKBlock +from pcapkit.protocols.transport.tcp.schema import SACKPermitted as Schema_SACKPermitted +from pcapkit.protocols.transport.tcp.schema import Timestamps as Schema_Timestamps +from pcapkit.protocols.transport.tcp.schema import UnassignedOption as Schema_UnassignedOption +from pcapkit.protocols.transport.tcp.schema import UserTimeout as Schema_UserTimeout +from pcapkit.protocols.transport.tcp.schema import WindowScale as Schema_WindowScale + +# Data Models +from pcapkit.protocols.transport.tcp.data import CC as Data_CC +from pcapkit.protocols.transport.tcp.data import MPTCP as Data_MPTCP +from pcapkit.protocols.transport.tcp.data import MPTCPDSS as Data_MPTCPDSS +from pcapkit.protocols.transport.tcp.data import SACK as Data_SACK +from pcapkit.protocols.transport.tcp.data import TCP as Data_TCP +from pcapkit.protocols.transport.tcp.data import AlternateChecksumData as Data_AlternateChecksumData +from pcapkit.protocols.transport.tcp.data import \ + AlternateChecksumRequest as Data_AlternateChecksumRequest +from pcapkit.protocols.transport.tcp.data import Authentication as Data_Authentication +from pcapkit.protocols.transport.tcp.data import CCEcho as Data_CCEcho +from pcapkit.protocols.transport.tcp.data import CCNew as Data_CCNew +from pcapkit.protocols.transport.tcp.data import Echo as Data_Echo +from pcapkit.protocols.transport.tcp.data import EchoReply as Data_EchoReply +from pcapkit.protocols.transport.tcp.data import EndOfOptionList as Data_EndOfOptionList +from pcapkit.protocols.transport.tcp.data import FastOpenCookie as Data_FastOpenCookie +from pcapkit.protocols.transport.tcp.data import Flags as Data_Flags +from pcapkit.protocols.transport.tcp.data import MaximumSegmentSize as Data_MaximumSegmentSize +from pcapkit.protocols.transport.tcp.data import MD5Signature as Data_MD5Signature +from pcapkit.protocols.transport.tcp.data import MPTCPAddAddress as Data_MPTCPAddAddress +from pcapkit.protocols.transport.tcp.data import MPTCPCapable as Data_MPTCPCapable +from pcapkit.protocols.transport.tcp.data import MPTCPCapableFlag as Data_MPTCPCapableFlag +from pcapkit.protocols.transport.tcp.data import MPTCPFallback as Data_MPTCPFallback +from pcapkit.protocols.transport.tcp.data import MPTCPFastclose as Data_MPTCPFastclose +from pcapkit.protocols.transport.tcp.data import MPTCPJoin as Data_MPTCPJoin +from pcapkit.protocols.transport.tcp.data import MPTCPJoinACK as Data_MPTCPJoinACK +from pcapkit.protocols.transport.tcp.data import MPTCPJoinSYN as Data_MPTCPJoinSYN +from pcapkit.protocols.transport.tcp.data import MPTCPJoinSYNACK as Data_MPTCPJoinSYNACK +from pcapkit.protocols.transport.tcp.data import MPTCPPriority as Data_MPTCPPriority +from pcapkit.protocols.transport.tcp.data import MPTCPRemoveAddress as Data_MPTCPRemoveAddress +from pcapkit.protocols.transport.tcp.data import MPTCPUnknown as Data_MPTCPUnknown +from pcapkit.protocols.transport.tcp.data import NoOperation as Data_NoOperation +from pcapkit.protocols.transport.tcp.data import Option as Data_Option +from pcapkit.protocols.transport.tcp.data import \ + PartialOrderConnectionPermitted as Data_PartialOrderConnectionPermitted +from pcapkit.protocols.transport.tcp.data import \ + PartialOrderServiceProfile as Data_PartialOrderServiceProfile +from pcapkit.protocols.transport.tcp.data import QuickStartResponse as Data_QuickStartResponse +from pcapkit.protocols.transport.tcp.data import SACKBlock as Data_SACKBlock +from pcapkit.protocols.transport.tcp.data import SACKPermitted as Data_SACKPermitted +from pcapkit.protocols.transport.tcp.data import Timestamps as Data_Timestamps +from pcapkit.protocols.transport.tcp.data import UnassignedOption as Data_UnassignedOption +from pcapkit.protocols.transport.tcp.data import UserTimeout as Data_UserTimeout +from pcapkit.protocols.transport.tcp.data import WindowScale as Data_WindowScale + +__all__ = ['TCP'] diff --git a/pcapkit/protocols/data/transport/tcp.py b/pcapkit/protocols/transport/tcp/data.py similarity index 99% rename from pcapkit/protocols/data/transport/tcp.py rename to pcapkit/protocols/transport/tcp/data.py index 3bbcb1d73e..fc6fa00020 100644 --- a/pcapkit/protocols/data/transport/tcp.py +++ b/pcapkit/protocols/transport/tcp/data.py @@ -4,8 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.data import Data -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Data, Protocol if TYPE_CHECKING: from datetime import timedelta diff --git a/pcapkit/protocols/transport/tcp.py b/pcapkit/protocols/transport/tcp/protocol.py similarity index 92% rename from pcapkit/protocols/transport/tcp.py rename to pcapkit/protocols/transport/tcp/protocol.py index 4b47d0eb88..77dd4220ed 100644 --- a/pcapkit/protocols/transport/tcp.py +++ b/pcapkit/protocols/transport/tcp/protocol.py @@ -3,10 +3,10 @@ """TCP - Transmission Control Protocol ========================================= -.. module:: pcapkit.protocols.transport.tcp +.. module:: pcapkit.protocols.transport.tcp.protocol -:mod:`pcapkit.protocols.transport.tcp` contains -:class:`~pcapkit.protocols.transport.tcp.TCP` only, +:mod:`pcapkit.protocols.transport.tcp.protocol` contains +:class:`~pcapkit.protocols.transport.tcp.protocol.TCP` only, which implements the extractor for Transmission Control Protocol (TCP) [*]_, whose structure is described as below: @@ -54,87 +54,87 @@ from pcapkit.corekit.multidict import OrderedMultiDict from pcapkit.corekit.schema.ipaddress import parse_ip_address from pcapkit.corekit.schema.padding import pad_length -from pcapkit.protocols.data.transport.tcp import CC as Data_CC -from pcapkit.protocols.data.transport.tcp import MPTCPDSS as Data_MPTCPDSS -from pcapkit.protocols.data.transport.tcp import SACK as Data_SACK -from pcapkit.protocols.data.transport.tcp import TCP as Data_TCP -from pcapkit.protocols.data.transport.tcp import AlternateChecksumData as Data_AlternateChecksumData -from pcapkit.protocols.data.transport.tcp import \ +from pcapkit.protocols.schema import Schema +from pcapkit.protocols.transport.tcp.data import CC as Data_CC +from pcapkit.protocols.transport.tcp.data import MPTCPDSS as Data_MPTCPDSS +from pcapkit.protocols.transport.tcp.data import SACK as Data_SACK +from pcapkit.protocols.transport.tcp.data import TCP as Data_TCP +from pcapkit.protocols.transport.tcp.data import AlternateChecksumData as Data_AlternateChecksumData +from pcapkit.protocols.transport.tcp.data import \ AlternateChecksumRequest as Data_AlternateChecksumRequest -from pcapkit.protocols.data.transport.tcp import Authentication as Data_Authentication -from pcapkit.protocols.data.transport.tcp import CCEcho as Data_CCEcho -from pcapkit.protocols.data.transport.tcp import CCNew as Data_CCNew -from pcapkit.protocols.data.transport.tcp import Echo as Data_Echo -from pcapkit.protocols.data.transport.tcp import EchoReply as Data_EchoReply -from pcapkit.protocols.data.transport.tcp import EndOfOptionList as Data_EndOfOptionList -from pcapkit.protocols.data.transport.tcp import FastOpenCookie as Data_FastOpenCookie -from pcapkit.protocols.data.transport.tcp import Flags as Data_Flags -from pcapkit.protocols.data.transport.tcp import MaximumSegmentSize as Data_MaximumSegmentSize -from pcapkit.protocols.data.transport.tcp import MD5Signature as Data_MD5Signature -from pcapkit.protocols.data.transport.tcp import MPTCPAddAddress as Data_MPTCPAddAddress -from pcapkit.protocols.data.transport.tcp import MPTCPCapable as Data_MPTCPCapable -from pcapkit.protocols.data.transport.tcp import MPTCPCapableFlag as Data_MPTCPCapableFlag -from pcapkit.protocols.data.transport.tcp import MPTCPFallback as Data_MPTCPFallback -from pcapkit.protocols.data.transport.tcp import MPTCPFastclose as Data_MPTCPFastclose -from pcapkit.protocols.data.transport.tcp import MPTCPJoinACK as Data_MPTCPJoinACK -from pcapkit.protocols.data.transport.tcp import MPTCPJoinSYN as Data_MPTCPJoinSYN -from pcapkit.protocols.data.transport.tcp import MPTCPJoinSYNACK as Data_MPTCPJoinSYNACK -from pcapkit.protocols.data.transport.tcp import MPTCPPriority as Data_MPTCPPriority -from pcapkit.protocols.data.transport.tcp import MPTCPRemoveAddress as Data_MPTCPRemoveAddress -from pcapkit.protocols.data.transport.tcp import MPTCPUnknown as Data_MPTCPUnknown -from pcapkit.protocols.data.transport.tcp import NoOperation as Data_NoOperation -from pcapkit.protocols.data.transport.tcp import \ +from pcapkit.protocols.transport.tcp.data import Authentication as Data_Authentication +from pcapkit.protocols.transport.tcp.data import CCEcho as Data_CCEcho +from pcapkit.protocols.transport.tcp.data import CCNew as Data_CCNew +from pcapkit.protocols.transport.tcp.data import Echo as Data_Echo +from pcapkit.protocols.transport.tcp.data import EchoReply as Data_EchoReply +from pcapkit.protocols.transport.tcp.data import EndOfOptionList as Data_EndOfOptionList +from pcapkit.protocols.transport.tcp.data import FastOpenCookie as Data_FastOpenCookie +from pcapkit.protocols.transport.tcp.data import Flags as Data_Flags +from pcapkit.protocols.transport.tcp.data import MaximumSegmentSize as Data_MaximumSegmentSize +from pcapkit.protocols.transport.tcp.data import MD5Signature as Data_MD5Signature +from pcapkit.protocols.transport.tcp.data import MPTCPAddAddress as Data_MPTCPAddAddress +from pcapkit.protocols.transport.tcp.data import MPTCPCapable as Data_MPTCPCapable +from pcapkit.protocols.transport.tcp.data import MPTCPCapableFlag as Data_MPTCPCapableFlag +from pcapkit.protocols.transport.tcp.data import MPTCPFallback as Data_MPTCPFallback +from pcapkit.protocols.transport.tcp.data import MPTCPFastclose as Data_MPTCPFastclose +from pcapkit.protocols.transport.tcp.data import MPTCPJoinACK as Data_MPTCPJoinACK +from pcapkit.protocols.transport.tcp.data import MPTCPJoinSYN as Data_MPTCPJoinSYN +from pcapkit.protocols.transport.tcp.data import MPTCPJoinSYNACK as Data_MPTCPJoinSYNACK +from pcapkit.protocols.transport.tcp.data import MPTCPPriority as Data_MPTCPPriority +from pcapkit.protocols.transport.tcp.data import MPTCPRemoveAddress as Data_MPTCPRemoveAddress +from pcapkit.protocols.transport.tcp.data import MPTCPUnknown as Data_MPTCPUnknown +from pcapkit.protocols.transport.tcp.data import NoOperation as Data_NoOperation +from pcapkit.protocols.transport.tcp.data import \ PartialOrderConnectionPermitted as Data_PartialOrderConnectionPermitted -from pcapkit.protocols.data.transport.tcp import \ +from pcapkit.protocols.transport.tcp.data import \ PartialOrderServiceProfile as Data_PartialOrderServiceProfile -from pcapkit.protocols.data.transport.tcp import QuickStartResponse as Data_QuickStartResponse -from pcapkit.protocols.data.transport.tcp import SACKBlock as Data_SACKBlock -from pcapkit.protocols.data.transport.tcp import SACKPermitted as Data_SACKPermitted -from pcapkit.protocols.data.transport.tcp import Timestamps as Data_Timestamps -from pcapkit.protocols.data.transport.tcp import UnassignedOption as Data_UnassignedOption -from pcapkit.protocols.data.transport.tcp import UserTimeout as Data_UserTimeout -from pcapkit.protocols.data.transport.tcp import WindowScale as Data_WindowScale -from pcapkit.protocols.schema.schema import Schema -from pcapkit.protocols.schema.transport.tcp import CC as Schema_CC -from pcapkit.protocols.schema.transport.tcp import MPTCPDSS as Schema_MPTCPDSS -from pcapkit.protocols.schema.transport.tcp import SACK as Schema_SACK -from pcapkit.protocols.schema.transport.tcp import TCP as Schema_TCP -from pcapkit.protocols.schema.transport.tcp import TCP_MIN_HEADER_LEN -from pcapkit.protocols.schema.transport.tcp import \ +from pcapkit.protocols.transport.tcp.data import QuickStartResponse as Data_QuickStartResponse +from pcapkit.protocols.transport.tcp.data import SACKBlock as Data_SACKBlock +from pcapkit.protocols.transport.tcp.data import SACKPermitted as Data_SACKPermitted +from pcapkit.protocols.transport.tcp.data import Timestamps as Data_Timestamps +from pcapkit.protocols.transport.tcp.data import UnassignedOption as Data_UnassignedOption +from pcapkit.protocols.transport.tcp.data import UserTimeout as Data_UserTimeout +from pcapkit.protocols.transport.tcp.data import WindowScale as Data_WindowScale +from pcapkit.protocols.transport.tcp.schema import CC as Schema_CC +from pcapkit.protocols.transport.tcp.schema import MPTCPDSS as Schema_MPTCPDSS +from pcapkit.protocols.transport.tcp.schema import SACK as Schema_SACK +from pcapkit.protocols.transport.tcp.schema import TCP as Schema_TCP +from pcapkit.protocols.transport.tcp.schema import TCP_MIN_HEADER_LEN +from pcapkit.protocols.transport.tcp.schema import \ AlternateChecksumData as Schema_AlternateChecksumData -from pcapkit.protocols.schema.transport.tcp import \ +from pcapkit.protocols.transport.tcp.schema import \ AlternateChecksumRequest as Schema_AlternateChecksumRequest -from pcapkit.protocols.schema.transport.tcp import Authentication as Schema_Authentication -from pcapkit.protocols.schema.transport.tcp import CCEcho as Schema_CCEcho -from pcapkit.protocols.schema.transport.tcp import CCNew as Schema_CCNew -from pcapkit.protocols.schema.transport.tcp import Echo as Schema_Echo -from pcapkit.protocols.schema.transport.tcp import EchoReply as Schema_EchoReply -from pcapkit.protocols.schema.transport.tcp import EndOfOptionList as Schema_EndOfOptionList -from pcapkit.protocols.schema.transport.tcp import FastOpenCookie as Schema_FastOpenCookie -from pcapkit.protocols.schema.transport.tcp import MaximumSegmentSize as Schema_MaximumSegmentSize -from pcapkit.protocols.schema.transport.tcp import MD5Signature as Schema_MD5Signature -from pcapkit.protocols.schema.transport.tcp import MPTCPAddAddress as Schema_MPTCPAddAddress -from pcapkit.protocols.schema.transport.tcp import MPTCPCapable as Schema_MPTCPCapable -from pcapkit.protocols.schema.transport.tcp import MPTCPFallback as Schema_MPTCPFallback -from pcapkit.protocols.schema.transport.tcp import MPTCPFastclose as Schema_MPTCPFastclose -from pcapkit.protocols.schema.transport.tcp import MPTCPJoinACK as Schema_MPTCPJoinACK -from pcapkit.protocols.schema.transport.tcp import MPTCPJoinSYN as Schema_MPTCPJoinSYN -from pcapkit.protocols.schema.transport.tcp import MPTCPJoinSYNACK as Schema_MPTCPJoinSYNACK -from pcapkit.protocols.schema.transport.tcp import MPTCPPriority as Schema_MPTCPPriority -from pcapkit.protocols.schema.transport.tcp import MPTCPRemoveAddress as Schema_MPTCPRemoveAddress -from pcapkit.protocols.schema.transport.tcp import MPTCPUnknown as Schema_MPTCPUnknown -from pcapkit.protocols.schema.transport.tcp import NoOperation as Schema_NoOperation -from pcapkit.protocols.schema.transport.tcp import \ +from pcapkit.protocols.transport.tcp.schema import Authentication as Schema_Authentication +from pcapkit.protocols.transport.tcp.schema import CCEcho as Schema_CCEcho +from pcapkit.protocols.transport.tcp.schema import CCNew as Schema_CCNew +from pcapkit.protocols.transport.tcp.schema import Echo as Schema_Echo +from pcapkit.protocols.transport.tcp.schema import EchoReply as Schema_EchoReply +from pcapkit.protocols.transport.tcp.schema import EndOfOptionList as Schema_EndOfOptionList +from pcapkit.protocols.transport.tcp.schema import FastOpenCookie as Schema_FastOpenCookie +from pcapkit.protocols.transport.tcp.schema import MaximumSegmentSize as Schema_MaximumSegmentSize +from pcapkit.protocols.transport.tcp.schema import MD5Signature as Schema_MD5Signature +from pcapkit.protocols.transport.tcp.schema import MPTCPAddAddress as Schema_MPTCPAddAddress +from pcapkit.protocols.transport.tcp.schema import MPTCPCapable as Schema_MPTCPCapable +from pcapkit.protocols.transport.tcp.schema import MPTCPFallback as Schema_MPTCPFallback +from pcapkit.protocols.transport.tcp.schema import MPTCPFastclose as Schema_MPTCPFastclose +from pcapkit.protocols.transport.tcp.schema import MPTCPJoinACK as Schema_MPTCPJoinACK +from pcapkit.protocols.transport.tcp.schema import MPTCPJoinSYN as Schema_MPTCPJoinSYN +from pcapkit.protocols.transport.tcp.schema import MPTCPJoinSYNACK as Schema_MPTCPJoinSYNACK +from pcapkit.protocols.transport.tcp.schema import MPTCPPriority as Schema_MPTCPPriority +from pcapkit.protocols.transport.tcp.schema import MPTCPRemoveAddress as Schema_MPTCPRemoveAddress +from pcapkit.protocols.transport.tcp.schema import MPTCPUnknown as Schema_MPTCPUnknown +from pcapkit.protocols.transport.tcp.schema import NoOperation as Schema_NoOperation +from pcapkit.protocols.transport.tcp.schema import \ PartialOrderConnectionPermitted as Schema_PartialOrderConnectionPermitted -from pcapkit.protocols.schema.transport.tcp import \ +from pcapkit.protocols.transport.tcp.schema import \ PartialOrderServiceProfile as Schema_PartialOrderServiceProfile -from pcapkit.protocols.schema.transport.tcp import QuickStartResponse as Schema_QuickStartResponse -from pcapkit.protocols.schema.transport.tcp import SACKBlock as Schema_SACKBlock -from pcapkit.protocols.schema.transport.tcp import SACKPermitted as Schema_SACKPermitted -from pcapkit.protocols.schema.transport.tcp import Timestamps as Schema_Timestamps -from pcapkit.protocols.schema.transport.tcp import UnassignedOption as Schema_UnassignedOption -from pcapkit.protocols.schema.transport.tcp import UserTimeout as Schema_UserTimeout -from pcapkit.protocols.schema.transport.tcp import WindowScale as Schema_WindowScale +from pcapkit.protocols.transport.tcp.schema import QuickStartResponse as Schema_QuickStartResponse +from pcapkit.protocols.transport.tcp.schema import SACKBlock as Schema_SACKBlock +from pcapkit.protocols.transport.tcp.schema import SACKPermitted as Schema_SACKPermitted +from pcapkit.protocols.transport.tcp.schema import Timestamps as Schema_Timestamps +from pcapkit.protocols.transport.tcp.schema import UnassignedOption as Schema_UnassignedOption +from pcapkit.protocols.transport.tcp.schema import UserTimeout as Schema_UserTimeout +from pcapkit.protocols.transport.tcp.schema import WindowScale as Schema_WindowScale from pcapkit.protocols.transport.transport import Transport from pcapkit.utilities import config from pcapkit.utilities.exceptions import ProtocolError @@ -149,15 +149,15 @@ from typing_extensions import Literal from pcapkit.corekit.enum import EnumRegistry - from pcapkit.protocols.data.transport.tcp import MPTCP as Data_MPTCP - from pcapkit.protocols.data.transport.tcp import MPTCPJoin as Data_MPTCPJoin - from pcapkit.protocols.data.transport.tcp import Option as Data_Option - from pcapkit.protocols.misc.checksum.ip_pseudo import IP_Pseudo + from pcapkit.protocols.misc.checksum.ip_pseudo.protocol import IP_Pseudo from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.transport.tcp import MPTCP as Schema_MPTCP - from pcapkit.protocols.schema.transport.tcp import Flags as Schema_Flags - from pcapkit.protocols.schema.transport.tcp import MPTCPJoin as Schema_MPTCPJoin - from pcapkit.protocols.schema.transport.tcp import Option as Schema_Option + from pcapkit.protocols.transport.tcp.data import MPTCP as Data_MPTCP + from pcapkit.protocols.transport.tcp.data import MPTCPJoin as Data_MPTCPJoin + from pcapkit.protocols.transport.tcp.data import Option as Data_Option + from pcapkit.protocols.transport.tcp.schema import MPTCP as Schema_MPTCP + from pcapkit.protocols.transport.tcp.schema import Flags as Schema_Flags + from pcapkit.protocols.transport.tcp.schema import MPTCPJoin as Schema_MPTCPJoin + from pcapkit.protocols.transport.tcp.schema import Option as Schema_Option Option = OrderedMultiDict[Enum_Option, Data_Option] OptionParser = Callable[[Schema_Option, NamedArg(Option, 'options')], Data_Option] @@ -175,7 +175,7 @@ class TCP(Transport[Data_TCP, Schema_TCP], """This class implements Transmission Control Protocol. This class supports parsing of the following protocols, which are - registered in the :attr:`self.__proto__ ` + registered in the :attr:`self.__proto__ ` attribute: .. list-table:: @@ -184,13 +184,13 @@ class TCP(Transport[Data_TCP, Schema_TCP], * - Port Number - Protocol * - 20 - - :class:`pcapkit.protocols.application.ftp_data.FTP_DATA` + - :class:`pcapkit.protocols.application.ftp_data.protocol.FTP_DATA` * - 21 - - :class:`pcapkit.protocols.application.ftp.FTP` + - :class:`pcapkit.protocols.application.ftp.protocol.FTP` * - 80 - - :class:`pcapkit.protocols.application.http.HTTP` + - :class:`pcapkit.protocols.application.http.protocol.HTTP` * - 8080 - - :class:`pcapkit.protocols.application.http.HTTP` + - :class:`pcapkit.protocols.application.http.protocol.HTTP` This class supports parsing of the following TCP options, which are directly mapped to the :class:`pcapkit.const.tcp.option.Option` @@ -203,71 +203,71 @@ class TCP(Transport[Data_TCP, Schema_TCP], - Option Parser - Option Constructor * - :attr:`~pcapkit.const.tcp.option.Option.End_of_Option_List` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mode_eool` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mode_eool` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mode_eool` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mode_eool` * - :attr:`~pcapkit.const.tcp.option.Option.No_Operation` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mode_nop` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mode_nop` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mode_nop` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mode_nop` * - :attr:`~pcapkit.const.tcp.option.Option.Maximum_Segment_Size` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mode_mss` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mode_mss` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mode_mss` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mode_mss` * - :attr:`~pcapkit.const.tcp.option.Option.Window_Scale` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mode_ws` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mode_ws` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mode_ws` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mode_ws` * - :attr:`~pcapkit.const.tcp.option.Option.SACK_Permitted` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mode_sackpmt` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mode_sackpmt` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mode_sackpmt` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mode_sackpmt` * - :attr:`~pcapkit.const.tcp.option.Option.SACK` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mode_sack` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mode_sack` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mode_sack` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mode_sack` * - :attr:`~pcapkit.const.tcp.option.Option.Echo` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mode_echo` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mode_echo` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mode_echo` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mode_echo` * - :attr:`~pcapkit.const.tcp.option.Option.Echo_Reply` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mode_echore` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mode_echore` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mode_echore` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mode_echore` * - :attr:`~pcapkit.const.tcp.option.Option.Timestamps` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mode_ts` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mode_ts` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mode_ts` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mode_ts` * - :attr:`~pcapkit.const.tcp.option.Option.Partial_Order_Connection_Permitted` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mode_poc` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mode_poc` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mode_poc` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mode_poc` * - :attr:`~pcapkit.const.tcp.option.Option.Partial_Order_Service_Profile` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mode_pocsp` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mode_pocsp` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mode_pocsp` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mode_pocsp` * - :attr:`~pcapkit.const.tcp.option.Option.CC` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mode_cc` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mode_cc` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mode_cc` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mode_cc` * - :attr:`~pcapkit.const.tcp.option.Option.CC_NEW` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mode_ccnew` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mode_ccnew` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mode_ccnew` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mode_ccnew` * - :attr:`~pcapkit.const.tcp.option.Option.CC_ECHO` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mode_ccecho` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mode_ccecho` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mode_ccecho` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mode_ccecho` * - :attr:`~pcapkit.const.tcp.option.Option.TCP_Alternate_Checksum_Request` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mode_chkreq` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mode_chkreq` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mode_chkreq` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mode_chkreq` * - :attr:`~pcapkit.const.tcp.option.Option.TCP_Alternate_Checksum_Data` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mode_chksum` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mode_chksum` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mode_chksum` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mode_chksum` * - :attr:`~pcapkit.const.tcp.option.Option.MD5_Signature_Option` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mode_sig` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mode_sig` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mode_sig` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mode_sig` * - :attr:`~pcapkit.const.tcp.option.Option.Quick_Start_Response` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mode_qs` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mode_qs` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mode_qs` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mode_qs` * - :attr:`~pcapkit.const.tcp.option.Option.User_Timeout_Option` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mode_timeout` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mode_timeout` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mode_timeout` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mode_timeout` * - :attr:`~pcapkit.const.tcp.option.Option.TCP_Authentication_Option` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mode_ao` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mode_ao` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mode_ao` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mode_ao` * - :attr:`~pcapkit.const.tcp.option.Option.Multipath_TCP` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mode_mp` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mode_mp` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mode_mp` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mode_mp` * - :attr:`~pcapkit.const.tcp.option.Option.TCP_Fast_Open_Cookie` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mode_fastopen` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mode_fastopen` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mode_fastopen` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mode_fastopen` This class supports parsing of the following Multipath TCP options, which are directly mapped to the :class:`pcapkit.const.tcp.mp_tcp_option.MPTCPOption` @@ -280,29 +280,29 @@ class TCP(Transport[Data_TCP, Schema_TCP], - Option Parser - Option Constructor * - :attr:`~pcapkit.const.tcp.mp_tcp_option.MPTCPOption.MP_CAPABLE` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mptcp_capable` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mptcp_capable` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mptcp_capable` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mptcp_capable` * - :attr:`~pcapkit.const.tcp.mp_tcp_option.MPTCPOption.MP_JOIN` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mptcp_join` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mptcp_join` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mptcp_join` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mptcp_join` * - :attr:`~pcapkit.const.tcp.mp_tcp_option.MPTCPOption.DSS` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mptcp_dss` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mptcp_dss` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mptcp_dss` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mptcp_dss` * - :attr:`~pcapkit.const.tcp.mp_tcp_option.MPTCPOption.ADD_ADDR` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mptcp_addaddr` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mptcp_addaddr` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mptcp_addaddr` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mptcp_addaddr` * - :attr:`~pcapkit.const.tcp.mp_tcp_option.MPTCPOption.REMOVE_ADDR` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mptcp_remove` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mptcp_remove` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mptcp_remove` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mptcp_remove` * - :attr:`~pcapkit.const.tcp.mp_tcp_option.MPTCPOption.MP_PRIO` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mptcp_prio` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mptcp_prio` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mptcp_prio` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mptcp_prio` * - :attr:`~pcapkit.const.tcp.mp_tcp_option.MPTCPOption.MP_FAIL` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mptcp_fail` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mptcp_fail` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mptcp_fail` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mptcp_fail` * - :attr:`~pcapkit.const.tcp.mp_tcp_option.MPTCPOption.MP_FASTCLOSE` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._read_mptcp_fastclose` - - :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mptcp_fastclose` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._read_mptcp_fastclose` + - :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mptcp_fastclose` .. versionchanged:: 1.5.0 @@ -391,7 +391,7 @@ class TCP(Transport[Data_TCP, Schema_TCP], #: :meth:`self._import_next_layer #: `. __proto__ = collections.defaultdict( - lambda: ModuleDescriptor('pcapkit.protocols.misc.raw', 'Raw'), + lambda: ModuleDescriptor('pcapkit.protocols.misc.raw.protocol', 'Raw'), { # Ports are IANA service-name registry assignments, quoting that # registry's own service name and description: @@ -407,7 +407,7 @@ class TCP(Transport[Data_TCP, Schema_TCP], # names it. # # The HTTP ports bind the version-dispatching - # :class:`pcapkit.protocols.application.http.HTTP` rather than + # :class:`pcapkit.protocols.application.http.protocol.HTTP` rather than # ``httpv1.HTTPv1``, because HTTP/1 and HTTP/2 share these ports on the # wire -- RFC 9113 calls the cleartext form ``http`` and keeps it on # 80 -- so the port cannot decide the version and the payload has to. @@ -415,11 +415,11 @@ class TCP(Transport[Data_TCP, Schema_TCP], # connection preface, an HTTP/1 start line, then a plausible HTTP/2 # frame header) and the layer is ``HTTPv1`` or ``HTTPv2`` (#2524). # UDP's table binds the same class for the same ports. - 20: ModuleDescriptor('pcapkit.protocols.application.ftp_data', 'FTP_DATA'), - 21: ModuleDescriptor('pcapkit.protocols.application.ftp', 'FTP'), - 80: ModuleDescriptor('pcapkit.protocols.application.http', 'HTTP'), - 443: ModuleDescriptor('pcapkit.protocols.application.tls', 'TLS'), - 8080: ModuleDescriptor('pcapkit.protocols.application.http', 'HTTP'), + 20: ModuleDescriptor('pcapkit.protocols.application.ftp_data.protocol', 'FTP_DATA'), + 21: ModuleDescriptor('pcapkit.protocols.application.ftp.protocol', 'FTP'), + 80: ModuleDescriptor('pcapkit.protocols.application.http.protocol', 'HTTP'), + 443: ModuleDescriptor('pcapkit.protocols.application.tls.protocol', 'TLS'), + 8080: ModuleDescriptor('pcapkit.protocols.application.http.protocol', 'HTTP'), }, ) @@ -489,7 +489,7 @@ class TCP(Transport[Data_TCP, Schema_TCP], ) # type: DefaultDict[int, str | tuple[MPOptionParser, MPOptionConstructor]] #: Whether :meth:`make` left the checksum for the enclosing IP layer to - #: compute, see :mod:`pcapkit.protocols.misc.checksum.ip_pseudo`. + #: compute, see :mod:`pcapkit.protocols.misc.checksum.ip_pseudo.protocol`. _checksum_pending = False ########################################################################## @@ -769,7 +769,7 @@ def make(self, self._checksum_pending = True else: from pcapkit.corekit.checksum.internet import compute_checksum # isort: skip # pylint: disable=import-outside-toplevel - from pcapkit.protocols.misc.checksum.ip_pseudo import pseudo_header # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.misc.checksum.ip_pseudo.protocol import pseudo_header # isort: skip # pylint: disable=import-outside-toplevel octets = schema.pack() schema.checksum = compute_checksum(octets, prefix=pseudo_header(pseudo, len(octets))) return schema @@ -886,7 +886,7 @@ def _verify_pseudo_checksum(self, pseudo: 'Optional[IP_Pseudo]') -> 'None': """Verify the checksum over the pseudo-header of the enclosing IP layer. That layer calls this once parsed, see - :func:`~pcapkit.protocols.misc.checksum.ip_pseudo.verify_upper`. A zero + :func:`~pcapkit.protocols.misc.checksum.ip_pseudo.protocol.verify_upper`. A zero checksum, or the pseudo-header's sum alone, is what checksum offload leaves on the sending host, and is :attr:`~pcapkit.corekit.checksum.internet.ChecksumStatus.NOT_COMPUTED`. @@ -1958,7 +1958,7 @@ def _read_join_synack(self, schema: 'Schema_MPTCPJoinSYNACK', options: 'Option') Note: The accepted length is ``16``, as in the figure above (:rfc:`8684` section 3.2 figure 6) and in what - :class:`~pcapkit.protocols.schema.transport.tcp.MPTCPJoinSYNACK` + :class:`~pcapkit.protocols.transport.tcp.schema.MPTCPJoinSYNACK` packs and unpacks: ``Kind`` (1) + ``Length`` (1) + subtype/flags (1) + ``Address ID`` (1) + the truncated HMAC (8) + the random number (4). @@ -2175,7 +2175,7 @@ def _read_mptcp_remove(self, schema: 'Schema_MPTCPRemoveAddress', *, options: 'O ``Length = 3 + n``, per the figure above: the 3 is ``Kind`` (1) + ``Length`` (1) + subtype-and-reserved (1), and each of the *n* Address IDs is one further octet. - :attr:`~pcapkit.protocols.schema.transport.tcp.MPTCPRemoveAddress.addr_id` + :attr:`~pcapkit.protocols.transport.tcp.schema.MPTCPRemoveAddress.addr_id` sizes its list as ``pkt['length'] - 3`` from exactly this, so the declared length governs the parse as well as the pack. @@ -2233,7 +2233,7 @@ def _read_mptcp_prio(self, schema: 'Schema_MPTCPPriority', *, options: 'Option') permissive so that traffic carrying it still parses. On the construction side, - :class:`~pcapkit.protocols.schema.transport.tcp.MPTCPPriority`'s + :class:`~pcapkit.protocols.transport.tcp.schema.MPTCPPriority`'s ``addr_id`` is conditional on ``length`` being 4, so ``length`` has to follow whether the caller supplied an Address ID. @@ -3026,10 +3026,10 @@ def _make_mode_mp(self, code: 'Enum_Option', opt: 'Optional[Data_MPTCP]' = None, schema = meth(subtype_val, opt, **kwargs) # NOTE: ``Schema_MPTCP.subtype`` is not a packable field (see the - # comment on :class:`~pcapkit.protocols.schema.transport.tcp.MPTCP`), so + # comment on :class:`~pcapkit.protocols.transport.tcp.schema.MPTCP`), so # the makers above only put ``subtype`` into ``test``, the bitfield they # actually pack. Unpacking sets it from - # :meth:`~pcapkit.protocols.schema.transport.tcp._MPTCP.post_process`; + # :meth:`~pcapkit.protocols.transport.tcp.schema._MPTCP.post_process`; # this is the same assignment for the construction path, so a schema # built via ``TCP(options=[(Enum_Option.Multipath_TCP, ...)])`` has # ``.subtype`` set just like one built by parsing bytes. diff --git a/pcapkit/protocols/schema/transport/tcp.py b/pcapkit/protocols/transport/tcp/schema.py similarity index 98% rename from pcapkit/protocols/schema/transport/tcp.py rename to pcapkit/protocols/transport/tcp/schema.py index 9cb7f26b8c..2e78a9ff26 100644 --- a/pcapkit/protocols/schema/transport/tcp.py +++ b/pcapkit/protocols/transport/tcp/schema.py @@ -17,7 +17,7 @@ from pcapkit.corekit.fields.numbers import (EnumField, PortEnumField, UInt8Field, UInt16Field, UInt32Field, UInt64Field) from pcapkit.corekit.fields.strings import BitField, BytesField, PaddingField -from pcapkit.protocols.schema.schema import EnumSchema, Schema, schema_final +from pcapkit.protocols.schema import EnumSchema, Schema, schema_final from pcapkit.utilities.exceptions import FieldError from pcapkit.utilities.logging import SPHINX_TYPE_CHECKING @@ -231,7 +231,7 @@ def mptcp_data_selector(pkt: 'dict[str, Any]') -> 'Field': Returns: A :class:`~pcapkit.corekit.fields.misc.SchemaField` wrapped - :class:`~pcapkit.protocols.schema.transport.tcp.MPTCP` subclass + :class:`~pcapkit.protocols.transport.tcp.schema.MPTCP` subclass instance. Raises: @@ -347,7 +347,7 @@ def mptcp_dss_ack_selector(pkt: 'dict[str, Any]') -> 'Field': then still unresolved, at its ``-1`` placeholder -- raises ``struct.error: bad char in struct format``. Nothing here meets that only because :class:`Schema - `'s ``pack`` and ``unpack`` + `'s ``pack`` and ``unpack`` special-case :class:`~pcapkit.corekit.fields.misc.ConditionalField` by type and skip the wrapped field outright before any ``length`` is read. A :class:`~pcapkit.corekit.fields.misc.SwitchField` needs no such special case: its selector always hands back an already-concrete field, @@ -702,7 +702,7 @@ class _MPTCP(Schema): #: #: The forward match is anchored at the option's first octet, not after the #: option header: this schema is what :attr:`Option.registry - #: ` dispatches to + #: ` dispatches to #: for ``kind == Multipath_TCP`` and, unlike the other option schemas, it #: does not inherit :class:`Option` and so consumes ``kind`` and ``length`` #: itself. :rfc:`8684` section 3 therefore puts ``kind`` in bits 0-7, @@ -755,10 +755,10 @@ class MPTCP(EnumSchema[Enum_MPTCPOption]): .. versionchanged:: 1.1.0 - An :class:`~pcapkit.protocols.schema.schema.EnumSchema` keyed on + An :class:`~pcapkit.protocols.schema.EnumSchema` keyed on :class:`~pcapkit.const.tcp.mp_tcp_option.MPTCPOption` rather than a - subclass of :class:`~pcapkit.protocols.schema.transport.tcp.Option`, - which registers :class:`~pcapkit.protocols.schema.transport.tcp._MPTCP` + subclass of :class:`~pcapkit.protocols.transport.tcp.schema.Option`, + which registers :class:`~pcapkit.protocols.transport.tcp.schema._MPTCP` under ``Multipath_TCP`` instead. """ @@ -801,7 +801,7 @@ class MPTCP(EnumSchema[Enum_MPTCPOption]): # same 4 bits twice under two names, or need a "derive, don't pack" kind # of field that this library's :mod:`~pcapkit.corekit.fields` does not # have. So this attribute is populated by the *construction* path instead - # -- :meth:`~pcapkit.protocols.transport.tcp.TCP._make_mode_mp` sets it + # -- :meth:`~pcapkit.protocols.transport.tcp.protocol.TCP._make_mode_mp` sets it # right after building the subtype-specific schema, mirroring exactly what # :meth:`_MPTCP.post_process` already does for real unpacking. if TYPE_CHECKING: diff --git a/pcapkit/protocols/transport/transport.py b/pcapkit/protocols/transport/transport.py index 5690254c30..27ed9e86f6 100644 --- a/pcapkit/protocols/transport/transport.py +++ b/pcapkit/protocols/transport/transport.py @@ -7,9 +7,9 @@ :mod:`pcapkit.protocols.transport.transport` contains :class:`~pcapkit.protocols.transport.transport.Transport`, which is a base class for transport layer protocols, e.g. -:class:`~pcapkit.protocols.transport.tcp.TCP`, -:class:`~pcapkit.protocols.transport.udp.UDP` and -:class:`~pcapkit.protocols.transport.sctp.SCTP`. +:class:`~pcapkit.protocols.transport.tcp.protocol.TCP`, +:class:`~pcapkit.protocols.transport.udp.protocol.UDP` and +:class:`~pcapkit.protocols.transport.sctp.protocol.SCTP`. """ import io @@ -104,8 +104,8 @@ def register(cls, code: 'int', protocol: 'ModuleDescriptor[ProtocolBase] | Type[ shipped descriptor that a restore puts back (:issue:`1504`). Note: - :class:`~pcapkit.protocols.transport.tcp.TCP` and - :class:`~pcapkit.protocols.transport.udp.UDP` each define their own + :class:`~pcapkit.protocols.transport.tcp.protocol.TCP` and + :class:`~pcapkit.protocols.transport.udp.protocol.UDP` each define their own ``__proto__`` rather than sharing one on :class:`Transport`. ``register_apptype`` reaches this method once per transport protocol, each time on that protocol's own registry, so it cannot @@ -138,8 +138,8 @@ def analyze(cls, ports: 'tuple[Enum_AppType, Enum_AppType]', payload: 'bytes', * Args: ports: Source & destination ports, as the application types :meth:`_make_port` resolves them to -- what - :attr:`TCP.src ` and - :attr:`TCP.dst ` read + :attr:`TCP.src ` and + :attr:`TCP.dst ` read off a parsed header, resolved the same way. payload: Packet payload. **kwargs: Arbitrary keyword arguments. @@ -151,9 +151,9 @@ def analyze(cls, ports: 'tuple[Enum_AppType, Enum_AppType]', payload: 'bytes', * Important: The annotation names the **base** registry rather than one transport's own, because this is the single method - :class:`~pcapkit.protocols.transport.tcp.TCP`, - :class:`~pcapkit.protocols.transport.udp.UDP` and - :class:`~pcapkit.protocols.transport.sctp.SCTP` share, and each + :class:`~pcapkit.protocols.transport.tcp.protocol.TCP`, + :class:`~pcapkit.protocols.transport.udp.protocol.UDP` and + :class:`~pcapkit.protocols.transport.sctp.protocol.SCTP` share, and each resolves its ports in a different one -- :class:`~pcapkit.const.reg.apptype.tcp.TCP` for the first, and so on. A caller that knows which transport it has gets the narrower @@ -180,7 +180,7 @@ def analyze(cls, ports: 'tuple[Enum_AppType, Enum_AppType]', payload: 'bytes', * :exc:`AttributeError`, and unwrapping unconditionally would have changed what anything *else* does here: :func:`int` of :obj:`None` raises where the lookup falls back to - :class:`~pcapkit.protocols.misc.raw.Raw`, and :func:`int` of + :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, and :func:`int` of ``'80'`` would dispatch a :class:`str` nobody registered. Nothing is written back on a miss either way, so a payload on an @@ -208,9 +208,9 @@ def analyze(cls, ports: 'tuple[Enum_AppType, Enum_AppType]', payload: 'bytes', * report = protocol(payload_io, len(payload), **kwargs) # type: ignore[abstract] except Exception as exc: if isinstance(exc, StructError) and exc.eof: # pylint: disable=no-member - from pcapkit.protocols.misc.no_payload import NoPayload as protocol # pylint: disable=import-outside-toplevel # isort:skip + from pcapkit.protocols.misc.no_payload.protocol import NoPayload as protocol # pylint: disable=import-outside-toplevel # isort:skip else: - from pcapkit.protocols.misc.raw import Raw as protocol # pylint: disable=import-outside-toplevel # isort:skip + from pcapkit.protocols.misc.raw.protocol import Raw as protocol # pylint: disable=import-outside-toplevel # isort:skip # error = traceback.format_exc(limit=1).strip().rsplit(os.linesep, maxsplit=1)[-1] # log error @@ -267,13 +267,13 @@ def _dispatch_family(klass: 'Type[ProtocolBase]', file_: 'bytes', r"""Resolve a family base the registry binds to the member that parses ``file_``. The HTTP ports bind the family base - :class:`~pcapkit.protocols.application.http.HTTP`, whose - :meth:`~pcapkit.protocols.application.http.HTTP._dispatch_version` picks - :class:`~pcapkit.protocols.application.httpv1.HTTPv1` or - :class:`~pcapkit.protocols.application.httpv2.HTTPv2` from the payload, + :class:`~pcapkit.protocols.application.http.protocol.HTTP`, whose + :meth:`~pcapkit.protocols.application.http.protocol.HTTP._dispatch_version` picks + :class:`~pcapkit.protocols.application.httpv1.protocol.HTTPv1` or + :class:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2` from the payload, as :meth:`Internet._import_next_layer ` does - for :class:`~pcapkit.protocols.internet.igmp.IGMP` (:issue:`2524`). + for :class:`~pcapkit.protocols.internet.igmp.protocol.IGMP` (:issue:`2524`). Arguments: klass: next layer protocol class, as the registry binds it @@ -284,7 +284,7 @@ def _dispatch_family(klass: 'Type[ProtocolBase]', file_: 'bytes', The member for a family base, otherwise ``klass`` itself. """ - from pcapkit.protocols.application.http import HTTP as HTTPBase # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.application.http.protocol import HTTP as HTTPBase # isort: skip # pylint: disable=import-outside-toplevel if klass is HTTPBase: return HTTPBase._dispatch_version(file_, length) @@ -379,14 +379,14 @@ def _decode_next_layer(self, dict_: '_PT', ports: 'tuple[int, int]', length: 'Op The port is forwarded **whether or not it is registered**: :meth:`Protocol._import_next_layer ` passes - it on as ``alias`` and :class:`~pcapkit.protocols.misc.raw.Raw` + it on as ``alias`` and :class:`~pcapkit.protocols.misc.raw.protocol.Raw` records it as :attr:`Data_Raw.protocol - `. Dropping it would + `. Dropping it would make a payload on a port we do not decode indistinguishable from one on port 22. The lower port is the one carried, for the same reason it is the primary lookup key. :meth:`SCTP._decode_next_layer - ` and + ` and :meth:`Internet._import_next_layer ` behave the same way for an unregistered PPID and transport type. diff --git a/pcapkit/protocols/transport/udp/__init__.py b/pcapkit/protocols/transport/udp/__init__.py new file mode 100644 index 0000000000..35a78ce1b6 --- /dev/null +++ b/pcapkit/protocols/transport/udp/__init__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# pylint: disable=unused-import +"""UDP - User Datagram Protocol +================================== + +.. module:: pcapkit.protocols.transport.udp + +:mod:`pcapkit.protocols.transport.udp` holds the dissector, +:class:`~pcapkit.protocols.transport.udp.protocol.UDP`, in +:mod:`~pcapkit.protocols.transport.udp.protocol`, its header schema in +:mod:`~pcapkit.protocols.transport.udp.schema` and its data model in +:mod:`~pcapkit.protocols.transport.udp.data`. + +Its schema and data classes are importable as ``Schema_*`` and ``Data_*``. + +""" +from pcapkit.protocols.transport.udp.protocol import UDP + +# Header Schemas +from pcapkit.protocols.transport.udp.schema import UDP as Schema_UDP + +# Data Models +from pcapkit.protocols.transport.udp.data import UDP as Data_UDP + +__all__ = ['UDP'] diff --git a/pcapkit/protocols/data/transport/udp.py b/pcapkit/protocols/transport/udp/data.py similarity index 95% rename from pcapkit/protocols/data/transport/udp.py rename to pcapkit/protocols/transport/udp/data.py index 10fa795fbd..d90a1bd78e 100644 --- a/pcapkit/protocols/data/transport/udp.py +++ b/pcapkit/protocols/transport/udp/data.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING from pcapkit.corekit.infoclass import info_final -from pcapkit.protocols.data.protocol import Protocol +from pcapkit.protocols.data import Protocol if TYPE_CHECKING: from pcapkit.const.reg.apptype import AppType diff --git a/pcapkit/protocols/transport/udp.py b/pcapkit/protocols/transport/udp/protocol.py similarity index 89% rename from pcapkit/protocols/transport/udp.py rename to pcapkit/protocols/transport/udp/protocol.py index 0eec33e816..f8bb4674ab 100644 --- a/pcapkit/protocols/transport/udp.py +++ b/pcapkit/protocols/transport/udp/protocol.py @@ -3,10 +3,10 @@ """UDP - User Datagram Protocol ================================== -.. module:: pcapkit.protocols.transport.udp +.. module:: pcapkit.protocols.transport.udp.protocol -:mod:`pcapkit.protocols.transport.udp` contains -:class:`~pcapkit.protocols.transport.udp.UDP` only, +:mod:`pcapkit.protocols.transport.udp.protocol` contains +:class:`~pcapkit.protocols.transport.udp.protocol.UDP` only, which implements the extractor for User Datagram Protocol (UDP) [*]_, whose structure is described as below: @@ -29,9 +29,9 @@ from pcapkit.const.reg.apptype import TransportProtocol as Enum_TransportProtocol from pcapkit.const.reg.transtype import TransType as Enum_TransType from pcapkit.corekit.module import ModuleDescriptor -from pcapkit.protocols.data.transport.udp import UDP as Data_UDP -from pcapkit.protocols.schema.transport.udp import UDP as Schema_UDP from pcapkit.protocols.transport.transport import Transport +from pcapkit.protocols.transport.udp.data import UDP as Data_UDP +from pcapkit.protocols.transport.udp.schema import UDP as Schema_UDP from pcapkit.utilities import config if TYPE_CHECKING: @@ -40,9 +40,9 @@ from typing_extensions import Literal from pcapkit.corekit.enum import EnumRegistry - from pcapkit.protocols.misc.checksum.ip_pseudo import IP_Pseudo + from pcapkit.protocols.misc.checksum.ip_pseudo.protocol import IP_Pseudo from pcapkit.protocols.protocol import ProtocolBase - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema __all__ = ['UDP'] @@ -52,7 +52,7 @@ class UDP(Transport[Data_UDP, Schema_UDP], """This class implements User Datagram Protocol. This class supports parsing of the following protocols, which are - registered in the :attr:`self.__proto__ ` + registered in the :attr:`self.__proto__ ` attribute: .. list-table:: @@ -61,19 +61,19 @@ class UDP(Transport[Data_UDP, Schema_UDP], * - Port Number - Protocol * - 80 - - :class:`pcapkit.protocols.application.http.HTTP` + - :class:`pcapkit.protocols.application.http.protocol.HTTP` * - 1701 - - :class:`pcapkit.protocols.link.l2tpv2.L2TPv2` + - :class:`pcapkit.protocols.link.l2tpv2.protocol.L2TPv2` * - 8080 - - :class:`pcapkit.protocols.application.http.HTTP` + - :class:`pcapkit.protocols.application.http.protocol.HTTP` Note: The HTTP ports resolve to - :class:`pcapkit.protocols.application.http.HTTP`, whose - :meth:`~pcapkit.protocols.application.http.HTTP._dispatch_version` picks - :class:`~pcapkit.protocols.application.httpv1.HTTPv1` or - :class:`~pcapkit.protocols.application.httpv2.HTTPv2` from the payload. - :attr:`TCP.__proto__ ` + :class:`pcapkit.protocols.application.http.protocol.HTTP`, whose + :meth:`~pcapkit.protocols.application.http.protocol.HTTP._dispatch_version` picks + :class:`~pcapkit.protocols.application.httpv1.protocol.HTTPv1` or + :class:`~pcapkit.protocols.application.httpv2.protocol.HTTPv2` from the payload. + :attr:`TCP.__proto__ ` binds the same class for its HTTP ports. .. versionchanged:: 1.5.0 @@ -107,7 +107,7 @@ class UDP(Transport[Data_UDP, Schema_UDP], #: :meth:`self._import_next_layer #: `. __proto__ = collections.defaultdict( - lambda: ModuleDescriptor('pcapkit.protocols.misc.raw', 'Raw'), + lambda: ModuleDescriptor('pcapkit.protocols.misc.raw.protocol', 'Raw'), { # Ports are IANA service-name registry assignments, quoting that # registry's own service name and description: @@ -118,10 +118,10 @@ class UDP(Transport[Data_UDP, Schema_UDP], # 8080 http-alt HTTP Alternate (see port 80) # # The HTTP entries bind the version-dispatching - # :class:`pcapkit.protocols.application.http.HTTP`, as TCP's table + # :class:`pcapkit.protocols.application.http.protocol.HTTP`, as TCP's table # does. See the note in the class docstring. - 80: ModuleDescriptor('pcapkit.protocols.application.http', 'HTTP'), - 8080: ModuleDescriptor('pcapkit.protocols.application.http', 'HTTP'), + 80: ModuleDescriptor('pcapkit.protocols.application.http.protocol', 'HTTP'), + 8080: ModuleDescriptor('pcapkit.protocols.application.http.protocol', 'HTTP'), # CoAP over DTLS (RFC 7252) is bound here, but it is not the only # fixed port a DTLS-borne protocol is registered at -- IANA also @@ -129,16 +129,16 @@ class UDP(Transport[Data_UDP, Schema_UDP], # (stuns/turns), 6514 (syslog-tls) and 10161/10162 (snmpdtls), # among others -- and plenty of deployments negotiate DTLS on a # dynamic port no registry can name. See - # pcapkit.protocols.application.dtls. - 5684: ModuleDescriptor('pcapkit.protocols.application.dtls', 'DTLS'), + # pcapkit.protocols.application.dtls.protocol. + 5684: ModuleDescriptor('pcapkit.protocols.application.dtls.protocol', 'DTLS'), # L2TPv2 (RFC 2661) is UDP-borne, and v2 is the only version # implemented, so the concrete class is bound rather than the # abstract L2TP base. IANA protocol number 115 (L2TPv3, RFC 3931) # stays unbound because that version has no class; once it has, # it takes 115 and this entry becomes a version switch on the Ver - # nibble. See pcapkit.protocols.link.l2tp. - 1701: ModuleDescriptor('pcapkit.protocols.link.l2tpv2', 'L2TPv2'), + # nibble. See pcapkit.protocols.link.l2tp.protocol. + 1701: ModuleDescriptor('pcapkit.protocols.link.l2tpv2.protocol', 'L2TPv2'), }, ) @@ -154,7 +154,7 @@ class UDP(Transport[Data_UDP, Schema_UDP], __proto_key__: 'ClassVar[tuple[Type[EnumRegistry], bool]]' = (Enum_AppType, True) #: Whether :meth:`make` left the checksum for the enclosing IP layer to - #: compute, see :mod:`pcapkit.protocols.misc.checksum.ip_pseudo`. + #: compute, see :mod:`pcapkit.protocols.misc.checksum.ip_pseudo.protocol`. _checksum_pending = False ########################################################################## @@ -302,7 +302,7 @@ def make(self, self._checksum_pending = True else: from pcapkit.corekit.checksum.internet import compute_checksum # isort: skip # pylint: disable=import-outside-toplevel - from pcapkit.protocols.misc.checksum.ip_pseudo import pseudo_header # isort: skip # pylint: disable=import-outside-toplevel + from pcapkit.protocols.misc.checksum.ip_pseudo.protocol import pseudo_header # isort: skip # pylint: disable=import-outside-toplevel # NOTE: Over the datagram the Length field gives, or all but the trailer # for a jumbogram's zero one (RFC 2675); a computed zero is all ones. @@ -364,7 +364,7 @@ def _verify_pseudo_checksum(self, pseudo: 'Optional[IP_Pseudo]') -> 'None': """Verify the checksum over the pseudo-header of the enclosing IP layer. That layer calls this once parsed, see - :func:`~pcapkit.protocols.misc.checksum.ip_pseudo.verify_upper`. A zero + :func:`~pcapkit.protocols.misc.checksum.ip_pseudo.protocol.verify_upper`. A zero checksum over IPv4, which means none (:rfc:`768`), and the pseudo-header's sum alone, which checksum offload leaves on the sending host, are diff --git a/pcapkit/protocols/schema/transport/udp.py b/pcapkit/protocols/transport/udp/schema.py similarity index 91% rename from pcapkit/protocols/schema/transport/udp.py rename to pcapkit/protocols/transport/udp/schema.py index 6d0a795a7b..3127bd38b0 100644 --- a/pcapkit/protocols/schema/transport/udp.py +++ b/pcapkit/protocols/transport/udp/schema.py @@ -9,7 +9,7 @@ from pcapkit.corekit.fields.misc import PayloadField from pcapkit.corekit.fields.numbers import PortEnumField, UInt16Field from pcapkit.corekit.fields.strings import BytesField -from pcapkit.protocols.schema.schema import Schema, schema_final +from pcapkit.protocols.schema import Schema, schema_final __all__ = ['UDP'] @@ -35,7 +35,7 @@ class UDP(Schema): #: negative, which takes the rest of the datagram. payload: 'bytes' = PayloadField(length=lambda pkt: pkt['len'] - 8) #: Octets captured past the Length field, see - #: :attr:`IPv4.trailer `. + #: :attr:`IPv4.trailer `. trailer: 'bytes' = PayloadField(default=b'') if TYPE_CHECKING: diff --git a/pcapkit/toolkit/dpkt.py b/pcapkit/toolkit/dpkt.py index 272f8adf47..cbc9587953 100644 --- a/pcapkit/toolkit/dpkt.py +++ b/pcapkit/toolkit/dpkt.py @@ -20,8 +20,8 @@ from pcapkit.foundation.reassembly.data.tcp import Packet as TCP_Packet from pcapkit.foundation.traceflow.data.data import FrameRecord from pcapkit.foundation.traceflow.data.tcp import Packet as TF_TCP_Packet -from pcapkit.protocols.data.misc.pcap.frame import FrameInfo as Data_FrameInfo -from pcapkit.protocols.schema.misc.pcap.header import RESOLUTION, RESOLUTION_PLACES +from pcapkit.protocols.misc.pcap.frame.data import FrameInfo as Data_FrameInfo +from pcapkit.protocols.misc.pcap.header.schema import RESOLUTION, RESOLUTION_PLACES from pcapkit.utilities.exceptions import UnsupportedCall if TYPE_CHECKING: diff --git a/pcapkit/toolkit/pcap.py b/pcapkit/toolkit/pcap.py index aa746625ad..3b81eff776 100644 --- a/pcapkit/toolkit/pcap.py +++ b/pcapkit/toolkit/pcap.py @@ -22,27 +22,27 @@ from pcapkit.foundation.reassembly.data.ip import Packet as IP_Packet from pcapkit.foundation.reassembly.data.tcp import Packet as TCP_Packet from pcapkit.foundation.traceflow.data.tcp import Packet as TF_TCP_Packet -from pcapkit.protocols.application.dtls import DTLS -from pcapkit.protocols.data.application.dtls import DTLS as Data_DTLS -from pcapkit.protocols.data.application.dtls import DTLSHandshake as Data_DTLSHandshake -from pcapkit.protocols.internet.ip import IP as Protocol_IP -from pcapkit.protocols.internet.ipv4 import IPv4 -from pcapkit.protocols.internet.ipv6 import IPv6 -from pcapkit.protocols.misc.no_payload import NoPayload -from pcapkit.protocols.misc.raw import Raw +from pcapkit.protocols.application.dtls.data import DTLS as Data_DTLS +from pcapkit.protocols.application.dtls.data import DTLSHandshake as Data_DTLSHandshake +from pcapkit.protocols.application.dtls.protocol import DTLS +from pcapkit.protocols.internet.ip.protocol import IP as Protocol_IP +from pcapkit.protocols.internet.ipv4.protocol import IPv4 +from pcapkit.protocols.internet.ipv6.protocol import IPv6 +from pcapkit.protocols.misc.no_payload.protocol import NoPayload +from pcapkit.protocols.misc.raw.protocol import Raw from pcapkit.protocols.protocol import ProtocolBase -from pcapkit.protocols.schema.transport.tcp import TCP_DATA_OFFSET_OCTET, TCP_MIN_HEADER_LEN -from pcapkit.protocols.transport.tcp import TCP -from pcapkit.protocols.transport.udp import UDP +from pcapkit.protocols.transport.tcp.protocol import TCP +from pcapkit.protocols.transport.tcp.schema import TCP_DATA_OFFSET_OCTET, TCP_MIN_HEADER_LEN +from pcapkit.protocols.transport.udp.protocol import UDP if TYPE_CHECKING: from ipaddress import IPv4Address, IPv6Address from typing import Optional from pcapkit.const.reg.linktype import LinkType - from pcapkit.protocols.data.internet.ipv4 import IPv4 as Data_IPv4 - from pcapkit.protocols.data.internet.ipv6 import IPv6 as Data_IPv6 - from pcapkit.protocols.internet.ipv6_frag import IPv6_Frag + from pcapkit.protocols.internet.ipv4.data import IPv4 as Data_IPv4 + from pcapkit.protocols.internet.ipv6.data import IPv6 as Data_IPv6 + from pcapkit.protocols.internet.ipv6_frag.protocol import IPv6_Frag from pcapkit.protocols.misc.pcap import Frame __all__ = ['ipv4_reassembly', 'ipv6_reassembly', 'tcp_reassembly', 'dtls_reassembly', @@ -124,7 +124,7 @@ def tcp_segment(frame: 'ProtocolBase') -> 'Optional[TCPSegment]': the IP layer that carries it -- in a tunnel, the innermost (:issue:`1581`). Otherwise, the fields of the fixed 20-octet TCP header (:rfc:`9293#section-3.1`) if the payload of the innermost IP layer is a - :class:`~pcapkit.protocols.misc.raw.Raw` the TCP parser rejected, of + :class:`~pcapkit.protocols.misc.raw.protocol.Raw` the TCP parser rejected, of protocol TCP, from a datagram that is not a later fragment, with at least those 20 octets captured; else :data:`None`. A segment past :data:`~pcapkit.utilities.config.FRAME_LAYER_LIMIT` is kept raw @@ -134,7 +134,7 @@ def tcp_segment(frame: 'ProtocolBase') -> 'Optional[TCPSegment]': A capture snapped inside the TCP header leaves a Data Offset that runs past the captured octets, and the TCP parser rejects such a header by design (:issue:`1404`), so the segment arrives as - :class:`~pcapkit.protocols.misc.raw.Raw`. The ports, numbers and flags + :class:`~pcapkit.protocols.misc.raw.protocol.Raw`. The ports, numbers and flags are all in the fixed header, so the segment still belongs to its flow, as it does for |dpkt|_, :mod:`scapy` and Wireshark (:issue:`1518`). The header and payload are then the captured octets either side of the @@ -205,8 +205,8 @@ def _fragment(frame: 'ProtocolBase', version: 'type[IPv4 | IPv6]') -> 'Optional[ Args: frame: PCAP frame or PCAP-NG block. - version: :class:`~pcapkit.protocols.internet.ipv4.IPv4` or - :class:`~pcapkit.protocols.internet.ipv6.IPv6`, the layer to fetch. + version: :class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4` or + :class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6`, the layer to fetch. Returns: The first ``version`` layer, from the outside in, that is a fragment -- @@ -241,8 +241,8 @@ def ipv4_reassembly(frame: 'Frame') -> 'IP_Packet[IPv4Address] | None': """Make data for IPv4 reassembly. A frame can be reassembled if it contains an IPv4 layer - (:class:`~pcapkit.protocols.internet.ipv4.IPv4`) and the **DF** - (:attr:`IPv4.flags.df `) flag is + (:class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4`) and the **DF** + (:attr:`IPv4.flags.df `) flag is :data:`False`. In an IP-in-IP tunnel, the layer is the first that is a fragment (see :func:`_fragment`). @@ -286,9 +286,9 @@ def ipv6_reassembly(frame: 'Frame') -> 'IP_Packet[IPv6Address] | None': """Make data for IPv6 reassembly. A frame can be reassembled if it contains an IPv6 layer - (:class:`~pcapkit.protocols.internet.ipv6.IPv6`) and an IPv6 Fragment header + (:class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6`) and an IPv6 Fragment header (:rfc:`2460#section-4.5`, i.e., - :class:`~pcapkit.protocols.internet.ipv6_frag.IPv6_Frag`). In an IP-in-IP tunnel, + :class:`~pcapkit.protocols.internet.ipv6_frag.protocol.IPv6_Frag`). In an IP-in-IP tunnel, the layer is the first that has one (see :func:`_fragment`). Args: @@ -311,7 +311,7 @@ def ipv6_reassembly(frame: 'Frame') -> 'IP_Packet[IPv6Address] | None': ipv6_frag_info = cast('IPv6_Frag', ipv6_frag).info # NOTE: ``Data_IPv6.hdr_len`` counts the Fragment header, since - # :meth:`IPv6._decode_next_layer ` + # :meth:`IPv6._decode_next_layer ` # adds each extension header's length before the Fragment-header check # breaks its loop. That is correct for a header length, but the # reassembled packet carries no Fragment header at all @@ -349,7 +349,7 @@ def tcp_reassembly(frame: 'Frame') -> 'TCP_Packet | None': """Make data for TCP reassembly. A frame can be reassembled if it contains a TCP layer - (:class:`~pcapkit.protocols.transport.tcp.TCP`), or a TCP segment whose header the + (:class:`~pcapkit.protocols.transport.tcp.protocol.TCP`), or a TCP segment whose header the TCP parser rejected, as it does one the snapshot length cut short (:issue:`1518`). Args: @@ -403,7 +403,7 @@ def _dtls_fragments(frame: 'ProtocolBase', *, num: 'int', Returns: One record per fragmented handshake message in the frame's first - :class:`~pcapkit.protocols.application.dtls.DTLS` layer, if UDP carries + :class:`~pcapkit.protocols.application.dtls.protocol.DTLS` layer, if UDP carries it and it is a cleartext ``handshake`` record holding one; otherwise :data:`None`. The buffer ID is the IP and UDP endpoints nearest above the record, with its epoch (:rfc:`6347#section-4.1`). @@ -455,10 +455,10 @@ def dtls_reassembly(frame: 'Frame') -> 'Optional[tuple[DTLS_Packet, ...]]': """Make data for DTLS handshake-message reassembly. A frame can be reassembled if UDP carries a DTLS layer - (:class:`~pcapkit.protocols.application.dtls.DTLS`) whose cleartext + (:class:`~pcapkit.protocols.application.dtls.protocol.DTLS`) whose cleartext ``handshake`` record holds a fragmented message (:attr:`DTLSHandshake.is_fragmented - `, + `, :rfc:`6347#section-4.2.3`). Only the frame's first record is read. Args: @@ -479,7 +479,7 @@ def tcp_traceflow(frame: 'Frame', *, data_link: 'LinkType') -> 'TF_TCP_Packet | """Trace packet flow for TCP. A frame can be traced if it contains a TCP layer - (:class:`~pcapkit.protocols.transport.tcp.TCP`), or a TCP segment whose header the + (:class:`~pcapkit.protocols.transport.tcp.protocol.TCP`), or a TCP segment whose header the TCP parser rejected, as it does one the snapshot length cut short (:issue:`1518`). Args: diff --git a/pcapkit/toolkit/pcapng.py b/pcapkit/toolkit/pcapng.py index 96ac9c974f..c5bfebb7d5 100644 --- a/pcapkit/toolkit/pcapng.py +++ b/pcapkit/toolkit/pcapng.py @@ -16,11 +16,11 @@ from pcapkit.foundation.reassembly.data.ip import Packet as IP_Packet from pcapkit.foundation.reassembly.data.tcp import Packet as TCP_Packet from pcapkit.foundation.traceflow.data.tcp import Packet as TF_TCP_Packet -from pcapkit.protocols.data.misc.pcap.frame import Frame as Data_Frame -from pcapkit.protocols.data.misc.pcap.frame import FrameInfo as Data_FrameInfo -from pcapkit.protocols.internet.ipv4 import IPv4 -from pcapkit.protocols.internet.ipv6 import IPv6 -from pcapkit.protocols.schema.misc.pcap.header import RESOLUTION +from pcapkit.protocols.internet.ipv4.protocol import IPv4 +from pcapkit.protocols.internet.ipv6.protocol import IPv6 +from pcapkit.protocols.misc.pcap.frame.data import Frame as Data_Frame +from pcapkit.protocols.misc.pcap.frame.data import FrameInfo as Data_FrameInfo +from pcapkit.protocols.misc.pcap.header.schema import RESOLUTION from pcapkit.toolkit.pcap import _dtls_fragments, _fragment, tcp_segment if TYPE_CHECKING: @@ -28,8 +28,8 @@ from typing import Optional from pcapkit.foundation.reassembly.data.dtls import Packet as DTLS_Packet - from pcapkit.protocols.internet.ipv6_frag import IPv6_Frag - from pcapkit.protocols.misc.pcapng import PCAPNG, Packet + from pcapkit.protocols.internet.ipv6_frag.protocol import IPv6_Frag + from pcapkit.protocols.misc.pcapng.protocol import PCAPNG, Packet __all__ = ['ipv4_reassembly', 'ipv6_reassembly', 'tcp_reassembly', 'dtls_reassembly', 'tcp_traceflow', 'block2frame'] @@ -39,8 +39,8 @@ def ipv4_reassembly(frame: 'PCAPNG') -> 'IP_Packet[IPv4Address] | None': """Make data for IPv4 reassembly. A frame can be reassembled if it contains an IPv4 layer - (:class:`~pcapkit.protocols.internet.ipv4.IPv4`) and the **DF** - (:attr:`IPv4.flags.df `) flag is + (:class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4`) and the **DF** + (:attr:`IPv4.flags.df `) flag is :data:`False`. In an IP-in-IP tunnel, the layer is the first that is a fragment (see :func:`pcapkit.toolkit.pcap._fragment`). @@ -85,9 +85,9 @@ def ipv6_reassembly(frame: 'PCAPNG') -> 'IP_Packet[IPv6Address] | None': """Make data for IPv6 reassembly. A frame can be reassembled if it contains an IPv6 layer - (:class:`~pcapkit.protocols.internet.ipv6.IPv6`) and an IPv6 Fragment header + (:class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6`) and an IPv6 Fragment header (:rfc:`2460#section-4.5`, i.e., - :class:`~pcapkit.protocols.internet.ipv6_frag.IPv6_Frag`). In an IP-in-IP tunnel, + :class:`~pcapkit.protocols.internet.ipv6_frag.protocol.IPv6_Frag`). In an IP-in-IP tunnel, the layer is the first that has one (see :func:`pcapkit.toolkit.pcap._fragment`). Args: @@ -110,7 +110,7 @@ def ipv6_reassembly(frame: 'PCAPNG') -> 'IP_Packet[IPv6Address] | None': ipv6_frag_info = cast('IPv6_Frag', ipv6_frag).info # NOTE: ``Data_IPv6.hdr_len`` counts the Fragment header, since - # :meth:`IPv6._decode_next_layer ` + # :meth:`IPv6._decode_next_layer ` # adds each extension header's length before the Fragment-header check # breaks its loop. That is correct for a header length, but the # reassembled packet carries no Fragment header at all @@ -149,7 +149,7 @@ def tcp_reassembly(frame: 'PCAPNG') -> 'TCP_Packet | None': """Make data for TCP reassembly. A frame can be reassembled if it contains a TCP layer - (:class:`~pcapkit.protocols.transport.tcp.TCP`), or a TCP segment whose header the + (:class:`~pcapkit.protocols.transport.tcp.protocol.TCP`), or a TCP segment whose header the TCP parser rejected, as it does one the snapshot length cut short (:issue:`1518`). Args: @@ -195,10 +195,10 @@ def dtls_reassembly(frame: 'PCAPNG') -> 'Optional[tuple[DTLS_Packet, ...]]': """Make data for DTLS handshake-message reassembly. A frame can be reassembled if UDP carries a DTLS layer - (:class:`~pcapkit.protocols.application.dtls.DTLS`) whose cleartext + (:class:`~pcapkit.protocols.application.dtls.protocol.DTLS`) whose cleartext ``handshake`` record holds a fragmented message (:attr:`DTLSHandshake.is_fragmented - `, + `, :rfc:`6347#section-4.2.3`). Only the frame's first record is read (see :func:`pcapkit.toolkit.pcap._dtls_fragments`). @@ -221,7 +221,7 @@ def tcp_traceflow(frame: 'PCAPNG', *, nanosecond: 'bool' = False) -> 'TF_TCP_Pac """Trace packet flow for TCP. A frame can be traced if it contains a TCP layer - (:class:`~pcapkit.protocols.transport.tcp.TCP`), or a TCP segment whose header the + (:class:`~pcapkit.protocols.transport.tcp.protocol.TCP`), or a TCP segment whose header the TCP parser rejected, as it does one the snapshot length cut short (:issue:`1518`). Args: @@ -288,7 +288,7 @@ def block2frame(block: 'Packet', *, nanosecond: 'bool' = False) -> 'Data_Frame': # which is the way round Wireshark's ``packet-frame.c`` registers the two # field names this pair borrows. Do not swap them to match some other # reader: this is the reference, and the PCAP reader in - # :mod:`pcapkit.protocols.misc.pcap.frame` follows it (#618), on the + # :mod:`pcapkit.protocols.misc.pcap.frame.protocol` follows it (#618), on the # strength of those registered names. len=block.original_len, cap_len=block.captured_len, diff --git a/pcapkit/toolkit/pypcapfile.py b/pcapkit/toolkit/pypcapfile.py index c7f8b54113..c6365e70ed 100644 --- a/pcapkit/toolkit/pypcapfile.py +++ b/pcapkit/toolkit/pypcapfile.py @@ -52,13 +52,13 @@ from pcapkit.foundation.reassembly.data.ip import Packet as IP_Packet from pcapkit.foundation.reassembly.data.tcp import Packet as TCP_Packet from pcapkit.foundation.traceflow.data.tcp import Packet as TF_TCP_Packet -from pcapkit.protocols.internet import ipv6 as Module_IPv6 -from pcapkit.protocols.internet.ipv4 import IPv4 as Protocol_IPv4 -from pcapkit.protocols.schema.internet import ah as Schema_AH_Module -from pcapkit.protocols.schema.internet import ipv4 as Schema_IPv4_Module -from pcapkit.protocols.schema.misc.pcap.header import RESOLUTION -from pcapkit.protocols.schema.transport import tcp as Schema_TCP_Module -from pcapkit.protocols.transport.tcp import TCP as Protocol_TCP +from pcapkit.protocols.internet.ah import schema as Schema_AH_Module +from pcapkit.protocols.internet.ipv4 import schema as Schema_IPv4_Module +from pcapkit.protocols.internet.ipv4.protocol import IPv4 as Protocol_IPv4 +from pcapkit.protocols.internet.ipv6 import protocol as Module_IPv6 +from pcapkit.protocols.misc.pcap.header.schema import RESOLUTION +from pcapkit.protocols.transport.tcp import schema as Schema_TCP_Module +from pcapkit.protocols.transport.tcp.protocol import TCP as Protocol_TCP from pcapkit.utilities import config from pcapkit.utilities.contextvars import beholding from pcapkit.utilities.exceptions import ProtocolError, UnsupportedCall, stacklevel @@ -555,7 +555,7 @@ def _walk_extension_headers(protocol: 'int', data: 'bytes') -> 'Optional[tuple[i :data:`~pcapkit.utilities.config.EXTENSION_HEADER_LIMIT` follow in a row. An AH is ``(Payload Length + 2) * 4`` octets long (:rfc:`4302#section-2.2`), and no shorter than - :data:`~pcapkit.protocols.schema.internet.ah.AH_HEADER_LEN`. Any other + :data:`~pcapkit.protocols.internet.ah.schema.AH_HEADER_LEN`. Any other is stepped over by the length :func:`_default_extension_header` gives, so one it keeps though cut short leaves no octets after it (:issue:`2695`). diff --git a/pcapkit/toolkit/scapy.py b/pcapkit/toolkit/scapy.py index 267a0573a8..323c4d1f57 100644 --- a/pcapkit/toolkit/scapy.py +++ b/pcapkit/toolkit/scapy.py @@ -45,11 +45,11 @@ from pcapkit.foundation.reassembly.data.tcp import Packet as TCP_Packet from pcapkit.foundation.traceflow.data.data import FrameRecord from pcapkit.foundation.traceflow.data.tcp import Packet as TF_TCP_Packet -from pcapkit.protocols.data.misc.pcap.frame import FrameInfo as Data_FrameInfo -from pcapkit.protocols.internet.ipv6 import IPV6_HEADER_LEN -from pcapkit.protocols.schema.internet.ipv4 import IPV4_HEADER_LEN -from pcapkit.protocols.schema.misc.pcap.header import RESOLUTION, RESOLUTION_PLACES -from pcapkit.protocols.schema.transport.tcp import TCP_DATA_OFFSET_OCTET, TCP_MIN_HEADER_LEN +from pcapkit.protocols.internet.ipv4.schema import IPV4_HEADER_LEN +from pcapkit.protocols.internet.ipv6.protocol import IPV6_HEADER_LEN +from pcapkit.protocols.misc.pcap.frame.data import FrameInfo as Data_FrameInfo +from pcapkit.protocols.misc.pcap.header.schema import RESOLUTION, RESOLUTION_PLACES +from pcapkit.protocols.transport.tcp.schema import TCP_DATA_OFFSET_OCTET, TCP_MIN_HEADER_LEN from pcapkit.toolkit.pypcapfile import (IP_TUNNELS, IPV4_EXTENSION_HEADERS, _default_accepts, _walk_extension_headers) from pcapkit.utilities.compat import ModuleNotFoundError # pylint: disable=redefined-builtin @@ -361,7 +361,7 @@ def _tcp_behind_extension_headers(segment: 'bytes') -> 'tuple[bytes, bytes] | No Returns: The header, as many octets as the Data Offset counts, and the payload after it; or :data:`None` if there are fewer than - :data:`TCP_MIN_HEADER_LEN ` + :data:`TCP_MIN_HEADER_LEN ` octets, the Data Offset counts fewer or more than were captured, or pcapkit's own TCP parser rejects the options (see :func:`~pcapkit.toolkit.pypcapfile._default_accepts`). diff --git a/pcapkit/utilities/compat.py b/pcapkit/utilities/compat.py index b2b76c093d..4ff02d2400 100644 --- a/pcapkit/utilities/compat.py +++ b/pcapkit/utilities/compat.py @@ -105,7 +105,7 @@ def unquote(string: 'str | bytes', encoding: 'str' = 'utf-8', errors: 'str' = 'r # decorated object, and before that it is a pure annotation for the type checker # leaving no runtime trace at all. That dunder is *read* -- # :meth:`pcapkit.corekit.infoclass.Info.__init_subclass__` and -# :meth:`pcapkit.protocols.schema.schema.Schema.__init_subclass__` refuse to +# :meth:`pcapkit.protocols.schema.Schema.__init_subclass__` refuse to # derive from a class carrying it in its own ``__dict__`` -- so on 3.8 to 3.10, # all in the CI matrix, keying the guard on 3.8 would leave the runtime check # reading an attribute nothing had set: a silent no-op on those interpreters and diff --git a/pcapkit/utilities/config.py b/pcapkit/utilities/config.py index ecbbde0e31..39cd48722a 100644 --- a/pcapkit/utilities/config.py +++ b/pcapkit/utilities/config.py @@ -157,9 +157,9 @@ def read_flag(name: 'str', default: 'bool' = False) -> 'bool': #: layer the frame record carries, usually its link layer; a protocol #: constructed from its own octets is not counted itself, so the count starts at #: the first layer it dissects. IPv6 extension headers are layers like any -#: other, whether :class:`~pcapkit.protocols.internet.ipv6.IPv6` walks them or +#: other, whether :class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6` walks them or #: each dissects the next. What follows the last layer is kept as -#: :class:`~pcapkit.protocols.misc.raw.Raw`, with one +#: :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, with one #: :exc:`~pcapkit.utilities.warnings.ProtocolWarning`, unless it would have been #: left raw anyway or there is nothing left. #: @@ -180,11 +180,11 @@ def read_flag(name: 'str', default: 'bool' = False) -> 'bool': #: :envvar:`PCAPKIT_EXTENSION_HEADER_LIMIT`. #: #: The walk stops there, and what follows the last of them is kept as -#: :class:`~pcapkit.protocols.misc.raw.Raw`, with one +#: :class:`~pcapkit.protocols.misc.raw.protocol.Raw`, with one #: :exc:`~pcapkit.utilities.warnings.ProtocolWarning`. That holds whether the #: chain follows IPv6, which walks it in a loop #: (:meth:`IPv6._decode_next_layer -#: `), or another +#: `), or another #: layer such as IPv4, where each header dissects the next one itself #: (:meth:`Internet._import_next_layer #: `). Behind @@ -295,7 +295,7 @@ def read_flag(name: 'str', default: 'bool' = False) -> 'bool': #: itself treats a capture's declared snapshot length as corrupt or #: byte-order-swapped rather than real -- and it is the same figure this #: package's own PCAP writer defaults ``snaplen`` to -#: (:meth:`pcapkit.protocols.misc.pcap.header.Header.make`). No single field +#: (:meth:`pcapkit.protocols.misc.pcap.header.protocol.Header.make`). No single field #: within one captured packet is legitimately larger than the largest packet #: libpcap itself is willing to believe, so nothing this library parses #: should ever declare a length past it. @@ -336,8 +336,8 @@ def read_flag(name: 'str', default: 'bool' = False) -> 'bool': #: ceiling is honoured however often it is declared. Measured for :issue:`573`, 200 #: minimal PCAP-NG Decryption Secrets Blocks -- 4,800 wire octets, each block #: declaring ``secrets_length`` of 262,142 against two supplied octets through -#: :attr:`UnknownSecrets.data ` -#: (``pcapkit/protocols/schema/misc/pcapng.py``) -- retained 50.0 MiB, an amplification of 10,922x +#: :attr:`UnknownSecrets.data ` +#: (``pcapkit/protocols/misc/pcapng/schema.py``) -- retained 50.0 MiB, an amplification of 10,922x #: per block. Every individual field was under the ceiling, so nothing refused any of them. #: #: The sum therefore wants a budget, and this is the figure that makes one diff --git a/pcapkit/utilities/contextvars.py b/pcapkit/utilities/contextvars.py index f17dffda34..4e54c27b25 100644 --- a/pcapkit/utilities/contextvars.py +++ b/pcapkit/utilities/contextvars.py @@ -40,9 +40,9 @@ #: packet block states them; :data:`None` outside a frame, and inside the payload #: of an :class:`~pcapkit.protocols.internet.internet.Internet` layer that #: bounds it, which neither an IPv4 Total Length of 0 nor -#: :class:`~pcapkit.protocols.internet.ah.AH` does (:issue:`2689`). A frame +#: :class:`~pcapkit.protocols.internet.ah.protocol.AH` does (:issue:`2689`). A frame #: the capture cut short holds fewer octets than were on the wire, which a layer -#: stating no length of its own, as :class:`~pcapkit.protocols.link.gre.GRE`, +#: stating no length of its own, as :class:`~pcapkit.protocols.link.gre.protocol.GRE`, #: cannot tell from the octets it is handed (:issue:`2653`). frame_length = contextvars.ContextVar( 'pcapkit.utilities.contextvars.frame_length', default=None, diff --git a/pcapkit/utilities/exceptions.py b/pcapkit/utilities/exceptions.py index d02dd71fd6..6dae7f12bd 100644 --- a/pcapkit/utilities/exceptions.py +++ b/pcapkit/utilities/exceptions.py @@ -760,8 +760,8 @@ class StreamEOFError(BaseError, EOFError): A *declared* zero length -- a nested schema legitimately sized to have nothing to read -- is a different situation and does not raise this. - :class:`~pcapkit.protocols.misc.pcap.frame.Frame` and - :class:`~pcapkit.protocols.misc.pcapng.PCAPNG` raise it too, quietly, when + :class:`~pcapkit.protocols.misc.pcap.frame.protocol.Frame` and + :class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG` raise it too, quietly, when fewer octets are left than a record header or a block needs. Note: diff --git a/pcapkit/utilities/pickle.py b/pcapkit/utilities/pickle.py index 1b10b4a69a..268dacf64a 100644 --- a/pcapkit/utilities/pickle.py +++ b/pcapkit/utilities/pickle.py @@ -54,7 +54,7 @@ class ReduceAsProtocol2: It goes before :class:`~typing.Generic` among the bases, as on :class:`~pcapkit.corekit.infoclass.Info`, - :class:`~pcapkit.protocols.schema.schema.Schema`, + :class:`~pcapkit.protocols.schema.Schema`, :class:`~pcapkit.foundation.reassembly.reassembly.ReassemblyBase` and :class:`~pcapkit.foundation.reassembly.data.data.Deferred`. diff --git a/pcapkit/utilities/warnings.py b/pcapkit/utilities/warnings.py index a065063af1..c9ac45bfcc 100644 --- a/pcapkit/utilities/warnings.py +++ b/pcapkit/utilities/warnings.py @@ -254,7 +254,7 @@ class hold_warnings: # pylint: disable=invalid-name :meth:`Protocol._parse_next_layer ` uses this for the - trial parse it replaces with :class:`~pcapkit.protocols.misc.raw.Raw` when the + trial parse it replaces with :class:`~pcapkit.protocols.misc.raw.protocol.Raw` when the header was not captured, or that :func:`~pcapkit.corekit.decorators.beholder` replaces when it raises: the warnings describe a layer the result does not have (:issue:`1580`, :issue:`2308`). diff --git a/pcapkit/vendor/arp/__init__.py b/pcapkit/vendor/arp/__init__.py index 8056a83c1d..d55220cd1c 100644 --- a/pcapkit/vendor/arp/__init__.py +++ b/pcapkit/vendor/arp/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.link.arp.ARP` Vendor Crawlers -============================================================== +""":class:`~pcapkit.protocols.link.arp.protocol.ARP` Vendor Crawlers +======================================================================= .. module:: pcapkit.vendor.arp -This module contains all vendor crawlers of :class:`~pcapkit.protocols.link.arp.ARP` -and :class:`~pcapkit.protocols.application.rarp.RARP` implementations. Available +This module contains all vendor crawlers of :class:`~pcapkit.protocols.link.arp.protocol.ARP` +and :class:`~pcapkit.protocols.application.rarp.protocol.RARP` implementations. Available vendor crawlers include: .. list-table:: diff --git a/pcapkit/vendor/dccp/__init__.py b/pcapkit/vendor/dccp/__init__.py index 1ce7dcd117..ff859b702c 100644 --- a/pcapkit/vendor/dccp/__init__.py +++ b/pcapkit/vendor/dccp/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.transport.dccp.DCCP` Vendor Crawlers -===================================================================== +""":class:`~pcapkit.protocols.transport.dccp.protocol.DCCP` Vendor Crawlers +============================================================================== .. module:: pcapkit.vendor.dccp This module contains all vendor crawlers of -:class:`~pcapkit.protocols.transport.dccp.DCCP` implementations. Available +:class:`~pcapkit.protocols.transport.dccp.protocol.DCCP` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/vendor/esp/__init__.py b/pcapkit/vendor/esp/__init__.py index d89a5b25c0..f16b44cdf6 100644 --- a/pcapkit/vendor/esp/__init__.py +++ b/pcapkit/vendor/esp/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.internet.esp.ESP` Vendor Crawlers -================================================================== +""":class:`~pcapkit.protocols.internet.esp.protocol.ESP` Vendor Crawlers +=========================================================================== .. module:: pcapkit.vendor.esp This module contains all vendor crawlers of -:class:`~pcapkit.protocols.internet.esp.ESP` implementations. Available +:class:`~pcapkit.protocols.internet.esp.protocol.ESP` implementations. Available vendor crawlers include: .. list-table:: diff --git a/pcapkit/vendor/ftp/__init__.py b/pcapkit/vendor/ftp/__init__.py index bf36f0e167..afec0ab440 100644 --- a/pcapkit/vendor/ftp/__init__.py +++ b/pcapkit/vendor/ftp/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.application.ftp.FTP` Vendor Crawler -==================================================================== +""":class:`~pcapkit.protocols.application.ftp.protocol.FTP` Vendor Crawler +============================================================================= .. module:: pcapkit.vendor.ftp This module contains all vendor crawlers of -:class:`~pcapkit.protocols.application.ftp.FTP` implementations. Available +:class:`~pcapkit.protocols.application.ftp.protocol.FTP` implementations. Available crawlers include: .. list-table:: diff --git a/pcapkit/vendor/hip/__init__.py b/pcapkit/vendor/hip/__init__.py index a9cb64b54e..014dd8131c 100644 --- a/pcapkit/vendor/hip/__init__.py +++ b/pcapkit/vendor/hip/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.internet.hip.HIP` Vendor crawlers -================================================================== +""":class:`~pcapkit.protocols.internet.hip.protocol.HIP` Vendor crawlers +=========================================================================== .. module:: pcapkit.vendor.hip This module contains all vendor crawlers of -:class:`~pcapkit.protocols.internet.hip.HIP` implementations. Available +:class:`~pcapkit.protocols.internet.hip.protocol.HIP` implementations. Available crawlers include: .. list-table:: diff --git a/pcapkit/vendor/http/__init__.py b/pcapkit/vendor/http/__init__.py index 2996fde9ba..0f7e2c9b78 100644 --- a/pcapkit/vendor/http/__init__.py +++ b/pcapkit/vendor/http/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -r""":class:`~pcapkit.protocols.application.http.HTTP` Vendor Crawlers -======================================================================= +r""":class:`~pcapkit.protocols.application.http.protocol.HTTP` Vendor Crawlers +================================================================================ .. module:: pcapkit.vendor.http This module contains all vendor crawlers of -:class:`~pcapkit.protocols.application.http.HTTP` implementations. Available +:class:`~pcapkit.protocols.application.http.protocol.HTTP` implementations. Available crawlers include: .. list-table:: diff --git a/pcapkit/vendor/icmp/__init__.py b/pcapkit/vendor/icmp/__init__.py index aefdab1ca8..cf2e05efb0 100644 --- a/pcapkit/vendor/icmp/__init__.py +++ b/pcapkit/vendor/icmp/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.internet.icmpv4.ICMPv4` Vendor Crawlers -======================================================================== +""":class:`~pcapkit.protocols.internet.icmpv4.protocol.ICMPv4` Vendor Crawlers +================================================================================= .. module:: pcapkit.vendor.icmp This module contains all vendor crawlers of -:class:`~pcapkit.protocols.internet.icmpv4.ICMPv4` implementations. Available +:class:`~pcapkit.protocols.internet.icmpv4.protocol.ICMPv4` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/vendor/icmpv6/__init__.py b/pcapkit/vendor/icmpv6/__init__.py index 9e4d689bb2..95b64438a1 100644 --- a/pcapkit/vendor/icmpv6/__init__.py +++ b/pcapkit/vendor/icmpv6/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.internet.icmpv6.ICMPv6` Vendor Crawlers -======================================================================== +""":class:`~pcapkit.protocols.internet.icmpv6.protocol.ICMPv6` Vendor Crawlers +================================================================================= .. module:: pcapkit.vendor.icmpv6 This module contains all vendor crawlers of -:class:`~pcapkit.protocols.internet.icmpv6.ICMPv6` implementations. Available +:class:`~pcapkit.protocols.internet.icmpv6.protocol.ICMPv6` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/vendor/ieee802_11/__init__.py b/pcapkit/vendor/ieee802_11/__init__.py index 0d94a158a7..7f01c1aa5c 100644 --- a/pcapkit/vendor/ieee802_11/__init__.py +++ b/pcapkit/vendor/ieee802_11/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.link.ieee802_11.IEEE802_11` Vendor Crawlers -============================================================================ +""":class:`~pcapkit.protocols.link.ieee802_11.protocol.IEEE802_11` Vendor Crawlers +===================================================================================== .. module:: pcapkit.vendor.ieee802_11 This module contains all vendor crawlers of -:class:`~pcapkit.protocols.link.ieee802_11.IEEE802_11` implementations. +:class:`~pcapkit.protocols.link.ieee802_11.protocol.IEEE802_11` implementations. Available vendor crawlers include: .. list-table:: diff --git a/pcapkit/vendor/igmp/__init__.py b/pcapkit/vendor/igmp/__init__.py index 4991656de5..9c14501028 100644 --- a/pcapkit/vendor/igmp/__init__.py +++ b/pcapkit/vendor/igmp/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import, wrong-import-position -""":class:`~pcapkit.protocols.internet.igmp.IGMP` Vendor Crawlers -==================================================================== +""":class:`~pcapkit.protocols.internet.igmp.protocol.IGMP` Vendor Crawlers +============================================================================= .. module:: pcapkit.vendor.igmp This module contains all vendor crawlers of -:class:`~pcapkit.protocols.internet.igmp.IGMP` implementations. Available +:class:`~pcapkit.protocols.internet.igmp.protocol.IGMP` implementations. Available crawlers include: .. list-table:: diff --git a/pcapkit/vendor/ipv4/__init__.py b/pcapkit/vendor/ipv4/__init__.py index 3b3cfbf6da..50cd01a524 100644 --- a/pcapkit/vendor/ipv4/__init__.py +++ b/pcapkit/vendor/ipv4/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.internet.ipv4.IPv4` Vendor Crawlers -==================================================================== +""":class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4` Vendor Crawlers +============================================================================= .. module:: pcapkit.vendor.ipv4 This module contains all vendor crawlers of -:class:`~pcapkit.protocols.internet.ipv4.IPv4` implementations. Available +:class:`~pcapkit.protocols.internet.ipv4.protocol.IPv4` implementations. Available crawlers include: .. list-table:: diff --git a/pcapkit/vendor/ipv6/__init__.py b/pcapkit/vendor/ipv6/__init__.py index 14d39af341..5836550e69 100644 --- a/pcapkit/vendor/ipv6/__init__.py +++ b/pcapkit/vendor/ipv6/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.internet.ipv6.IPv6` Vendor Crawlers -==================================================================== +""":class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6` Vendor Crawlers +============================================================================= .. module:: pcapkit.vendor.ipv6 This module contains all vendor crawlers of -:class:`~pcapkit.protocols.internet.ipv6.IPv6` implementations. Available +:class:`~pcapkit.protocols.internet.ipv6.protocol.IPv6` implementations. Available crawlers include: .. list-table:: diff --git a/pcapkit/vendor/ipv6/extension_header.py b/pcapkit/vendor/ipv6/extension_header.py index 56dd926f73..1f9f7479b6 100644 --- a/pcapkit/vendor/ipv6/extension_header.py +++ b/pcapkit/vendor/ipv6/extension_header.py @@ -123,7 +123,7 @@ class ExtensionHeader(Vendor): #: intentional rather than an erratum. So #: :class:`~pcapkit.const.ipv6.extension_header.ExtensionHeader` has no #: ``BIT_EMU``, and the walk in :meth:`IPv6._decode_next_layer - #: ` does not + #: ` does not #: depend on ``ExtensionHeader(147)`` resolving: its test #: (``tests.protocols.internet.test_ipv6_ext_unit.IPv6ExtUnitTests #: .test_unimplemented_terminal_code_stops_the_walk_not_the_packet``) diff --git a/pcapkit/vendor/ipx/__init__.py b/pcapkit/vendor/ipx/__init__.py index e42b64e352..1ef23c3dcb 100644 --- a/pcapkit/vendor/ipx/__init__.py +++ b/pcapkit/vendor/ipx/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import, wrong-import-position -""":class:`~pcapkit.protocols.internet.ipx.IPX` Vendor Crawlers -================================================================== +""":class:`~pcapkit.protocols.internet.ipx.protocol.IPX` Vendor Crawlers +=========================================================================== .. module:: pcapkit.vendor.ipx This module contains all vendor crawlers of -:class:`~pcapkit.protocols.internet.ipx.IPX` implementations. Available +:class:`~pcapkit.protocols.internet.ipx.protocol.IPX` implementations. Available crawlers include: .. list-table:: diff --git a/pcapkit/vendor/l2tp/__init__.py b/pcapkit/vendor/l2tp/__init__.py index 7fe8ceeecf..2397d145f6 100644 --- a/pcapkit/vendor/l2tp/__init__.py +++ b/pcapkit/vendor/l2tp/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.link.l2tp.L2TP` Vendor Crawlers -================================================================ +""":class:`~pcapkit.protocols.link.l2tp.protocol.L2TP` Vendor Crawlers +========================================================================= .. module:: pcapkit.vendor.l2tp This module contains all vendor crawlers of -:class:`~pcapkit.protocols.link.l2tp.L2TP` implementations. Available +:class:`~pcapkit.protocols.link.l2tp.protocol.L2TP` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/vendor/linux/__init__.py b/pcapkit/vendor/linux/__init__.py index 7c97180b0d..105c989ecb 100644 --- a/pcapkit/vendor/linux/__init__.py +++ b/pcapkit/vendor/linux/__init__.py @@ -6,7 +6,7 @@ .. module:: pcapkit.vendor.linux This module contains all vendor crawlers of the Linux-specific encapsulations, -e.g. :class:`~pcapkit.protocols.link.linux_sll.LinuxSLL`. Available crawlers +e.g. :class:`~pcapkit.protocols.link.linux_sll.protocol.LinuxSLL`. Available crawlers include: .. list-table:: diff --git a/pcapkit/vendor/linux/arphrd.py b/pcapkit/vendor/linux/arphrd.py index 8c59f6d854..74876df604 100644 --- a/pcapkit/vendor/linux/arphrd.py +++ b/pcapkit/vendor/linux/arphrd.py @@ -31,7 +31,7 @@ # :mod:`pcapkit.vendor.ipx.packet` and :mod:`pcapkit.vendor.ipx.socket`. # # pcapkit names only the ``ARPHRD_*`` values its Linux "cooked" capture -# dissector (:class:`~pcapkit.protocols.link.linux_sll.LinuxSLL`) actually +# dissector (:class:`~pcapkit.protocols.link.linux_sll.protocol.LinuxSLL`) actually # matches on, not every value the header defines. The rest of the ARP # hardware-type numbering is IANA's own # (:class:`~pcapkit.const.arp.hardware.Hardware`), which differs for most @@ -62,7 +62,7 @@ class ARPHRD(Vendor): #: Destination of a bare ``ARPHRD`` member; see #: :attr:`~pcapkit.vendor.default.Vendor.PROTO_DEST`. - PROTO_DEST = (ModuleDescriptor('pcapkit.protocols.link.linux_sll', 'LinuxSLL'),) + PROTO_DEST = (ModuleDescriptor('pcapkit.protocols.link.linux_sll.protocol', 'LinuxSLL'),) def request(self) -> 'dict[int, tuple[str, str]]': # type: ignore[override] # pylint: disable=arguments-differ """Fetch registry data. diff --git a/pcapkit/vendor/mh/__init__.py b/pcapkit/vendor/mh/__init__.py index 9c0cef34b5..1935ff1ade 100644 --- a/pcapkit/vendor/mh/__init__.py +++ b/pcapkit/vendor/mh/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.internet.mh.MH` Vendor Crawlers -================================================================ +""":class:`~pcapkit.protocols.internet.mh.protocol.MH` Vendor Crawlers +========================================================================= .. module:: pcapkit.vendor.mh This module contains all vendor crawlers of -:class:`~pcapkit.protocols.internet.mh.MH` implementations. Available +:class:`~pcapkit.protocols.internet.mh.protocol.MH` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/vendor/ngap/__init__.py b/pcapkit/vendor/ngap/__init__.py index c637183000..e210940d34 100644 --- a/pcapkit/vendor/ngap/__init__.py +++ b/pcapkit/vendor/ngap/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.application.ngap.NGAP` Vendor Crawlers -======================================================================= +""":class:`~pcapkit.protocols.application.ngap.protocol.NGAP` Vendor Crawlers +================================================================================ .. module:: pcapkit.vendor.ngap This module contains all vendor crawlers of -:class:`~pcapkit.protocols.application.ngap.NGAP` implementations. Available +:class:`~pcapkit.protocols.application.ngap.protocol.NGAP` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/vendor/ngap/procedure_code.py b/pcapkit/vendor/ngap/procedure_code.py index ce52e7cdac..a7340537df 100644 --- a/pcapkit/vendor/ngap/procedure_code.py +++ b/pcapkit/vendor/ngap/procedure_code.py @@ -15,7 +15,7 @@ compiled ASN.1, at ``pycrate_asn1dir/NGAP.py``'s ``NGAP_Constants`` class (one ``INT`` value object per ``id-`` constant, tagged with the ``ProcedureCode`` or ``ProtocolIE-ID`` open type it belongs to) -- and it is the very same -dependency :mod:`pcapkit.protocols.application.ngap` already needs installed to +dependency :mod:`pcapkit.protocols.application.ngap.protocol` already needs installed to decode NGAP at all. So this crawler reads that already-installed package directly instead of fetching anything over the network: it leaves :attr:`~pcapkit.vendor.default.Vendor.LINK` at its :obj:`None` default, and @@ -26,7 +26,7 @@ :class:`~pcapkit.const.ngap.procedure_code.ProcedureCode` is a genuinely open registry -- 3GPP keeps assigning new elementary procedures to TS 38.413 -- so, -unlike the closed :mod:`pcapkit.protocols.internet.mh` enums GitHub issue :issue:`877` +unlike the closed :mod:`pcapkit.protocols.internet.mh.protocol` enums GitHub issue :issue:`877` ruled on, an in-range value this crawler has not (yet) seen is not a bug to raise on: :meth:`~pcapkit.const.ngap.procedure_code.ProcedureCode._missing_` answers it with a throwaway, non-registering member instead (see diff --git a/pcapkit/vendor/ospf/__init__.py b/pcapkit/vendor/ospf/__init__.py index 26daff8924..5b2230b97a 100644 --- a/pcapkit/vendor/ospf/__init__.py +++ b/pcapkit/vendor/ospf/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.application.ospf.OSPF` Vendor Crawlers -======================================================================= +""":class:`~pcapkit.protocols.application.ospf.protocol.OSPF` Vendor Crawlers +================================================================================ .. module:: pcapkit.vendor.ospf This module contains all vendor crawlers of -:class:`~pcapkit.protocols.application.ospf.OSPF` implementations. Available +:class:`~pcapkit.protocols.application.ospf.protocol.OSPF` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/vendor/pcapng/__init__.py b/pcapkit/vendor/pcapng/__init__.py index 7f768232bd..a75eb023e0 100644 --- a/pcapkit/vendor/pcapng/__init__.py +++ b/pcapkit/vendor/pcapng/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.misc.pcapng.PCAPNG` Vendor Crawler -=================================================================== +""":class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG` Vendor Crawler +============================================================================ .. module:: pcapkit.vendor.pcapng This module contains all vendor crawlers of -:class:`~pcapkit.protocols.misc.pcapng.PCAPNG` implementations. Available +:class:`~pcapkit.protocols.misc.pcapng.protocol.PCAPNG` implementations. Available crawlers include: .. list-table:: diff --git a/pcapkit/vendor/pcapng/option_type.py b/pcapkit/vendor/pcapng/option_type.py index c195906213..1a402ca26d 100644 --- a/pcapkit/vendor/pcapng/option_type.py +++ b/pcapkit/vendor/pcapng/option_type.py @@ -287,7 +287,7 @@ def get(key: 'int | str', default: 'int' = -1, *, namespace: 'str' = 'opt') -> ' # permanent member as a side effect of a mere lookup -- exactly # the ``get``/``_missing_`` minting the owner's ruling forbids, # here on the wire-facing path - # (:meth:`pcapkit.protocols.misc.pcapng.PCAPNG._make_pcapng_options` + # (:meth:`pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_pcapng_options` # calls this with raw option-code bytes off the wire). # ``_unregistered_member`` never touches ``__members_ns__`` # either, so a genuinely unknown option code grows neither diff --git a/pcapkit/vendor/pcapng/tls_key_label.py b/pcapkit/vendor/pcapng/tls_key_label.py index 008c8dfb01..029ec6d480 100644 --- a/pcapkit/vendor/pcapng/tls_key_label.py +++ b/pcapkit/vendor/pcapng/tls_key_label.py @@ -25,7 +25,7 @@ #: Hand-carried comment for the ``RSA`` member, copied verbatim from the text #: GitHub issue :issue:`882` gave it in -#: the hand-written ``pcapkit.protocols.misc.pcapng.TLSKeyLabel`` -- ``RSA`` has no row in +#: the hand-written ``pcapkit.protocols.misc.pcapng.protocol.TLSKeyLabel`` -- ``RSA`` has no row in #: :attr:`TLSKeyLabel.LINK`'s registry to generate a comment from (``grep -c #: RSA`` on the fetched CSV is 0), so it is carried across rather than #: derived, per GitHub issue :issue:`886`'s first constraint. The embedded @@ -165,7 +165,7 @@ def process(self, data: 'list[str]') -> 'tuple[list[str], list[str]]': pref = f"{renm} = '{label}'" # NOTE: mirrors the ``nosec B105`` bandit suppression every # such member carried in the hand-written - # ``pcapkit.protocols.misc.pcapng.TLSKeyLabel`` (#882) -- + # ``pcapkit.protocols.misc.pcapng.protocol.TLSKeyLabel`` (#882) -- # bandit's B105 (hardcoded password string) flags a string # constant assigned to a name containing ``SECRET``, which most # of these labels' names do. diff --git a/pcapkit/vendor/radiotap/__init__.py b/pcapkit/vendor/radiotap/__init__.py index 87c4bd5464..ac34a08f36 100644 --- a/pcapkit/vendor/radiotap/__init__.py +++ b/pcapkit/vendor/radiotap/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.link.radiotap.Radiotap` Vendor Crawlers -======================================================================== +""":class:`~pcapkit.protocols.link.radiotap.protocol.Radiotap` Vendor Crawlers +================================================================================= .. module:: pcapkit.vendor.radiotap This module contains all vendor crawlers of -:class:`~pcapkit.protocols.link.radiotap.Radiotap` implementations. +:class:`~pcapkit.protocols.link.radiotap.protocol.Radiotap` implementations. Available vendor crawlers include: .. list-table:: diff --git a/pcapkit/vendor/reg/linktype.py b/pcapkit/vendor/reg/linktype.py index 1756dbd448..05d6515ae7 100644 --- a/pcapkit/vendor/reg/linktype.py +++ b/pcapkit/vendor/reg/linktype.py @@ -41,8 +41,8 @@ class LinkType(Vendor): #: each, and :func:`~pcapkit.foundation.registry.protocols.misc.register_linktype` #: already registers into every one of them by hand. PROTO_DEST = ( - ModuleDescriptor('pcapkit.protocols.misc.pcap.frame', 'Frame'), - ModuleDescriptor('pcapkit.protocols.misc.pcapng', 'PCAPNG'), + ModuleDescriptor('pcapkit.protocols.misc.pcap.frame.protocol', 'Frame'), + ModuleDescriptor('pcapkit.protocols.misc.pcapng.protocol', 'PCAPNG'), ) def count(self, data: 'list[str]') -> 'Counter[str]': diff --git a/pcapkit/vendor/sctp/__init__.py b/pcapkit/vendor/sctp/__init__.py index 1561c676ce..ab372754d0 100644 --- a/pcapkit/vendor/sctp/__init__.py +++ b/pcapkit/vendor/sctp/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.transport.sctp.SCTP` Vendor Crawlers -===================================================================== +""":class:`~pcapkit.protocols.transport.sctp.protocol.SCTP` Vendor Crawlers +============================================================================== .. module:: pcapkit.vendor.sctp This module contains all vendor crawlers of -:class:`~pcapkit.protocols.transport.sctp.SCTP` implementations. Available +:class:`~pcapkit.protocols.transport.sctp.protocol.SCTP` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/vendor/sctp/payload_protocol_identifier.py b/pcapkit/vendor/sctp/payload_protocol_identifier.py index c755c24996..d5938ec614 100644 --- a/pcapkit/vendor/sctp/payload_protocol_identifier.py +++ b/pcapkit/vendor/sctp/payload_protocol_identifier.py @@ -27,7 +27,7 @@ class PayloadProtocolIdentifier(Vendor): #: Destination of a bare ``PayloadProtocolIdentifier`` member; see #: :attr:`~pcapkit.vendor.default.Vendor.PROTO_DEST`. - PROTO_DEST = (ModuleDescriptor('pcapkit.protocols.transport.sctp', 'SCTP'),) + PROTO_DEST = (ModuleDescriptor('pcapkit.protocols.transport.sctp.protocol', 'SCTP'),) if __name__ == '__main__': diff --git a/pcapkit/vendor/sslv2/__init__.py b/pcapkit/vendor/sslv2/__init__.py index 8b33154905..c42374eadc 100644 --- a/pcapkit/vendor/sslv2/__init__.py +++ b/pcapkit/vendor/sslv2/__init__.py @@ -6,7 +6,7 @@ .. module:: pcapkit.vendor.sslv2 This module contains all vendor crawlers of -:class:`~pcapkit.protocols.application.sslv2.SSLv2` implementations. +:class:`~pcapkit.protocols.application.sslv2.protocol.SSLv2` implementations. Available crawlers include: .. list-table:: diff --git a/pcapkit/vendor/tcp/__init__.py b/pcapkit/vendor/tcp/__init__.py index b2b7f489a4..a48621d820 100644 --- a/pcapkit/vendor/tcp/__init__.py +++ b/pcapkit/vendor/tcp/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.transport.tcp.TCP` Vendor Crawlers -=================================================================== +""":class:`~pcapkit.protocols.transport.tcp.protocol.TCP` Vendor Crawlers +============================================================================ .. module:: pcapkit.vendor.tcp This module contains all vendor crawlers of -:class:`~pcapkit.protocols.transport.tcp.TCP` implementations. Available +:class:`~pcapkit.protocols.transport.tcp.protocol.TCP` implementations. Available enumerations include: .. list-table:: diff --git a/pcapkit/vendor/vlan/__init__.py b/pcapkit/vendor/vlan/__init__.py index c3dbc16108..b232d5c441 100644 --- a/pcapkit/vendor/vlan/__init__.py +++ b/pcapkit/vendor/vlan/__init__.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- # pylint: disable=unused-import -""":class:`~pcapkit.protocols.link.vlan.VLAN` Vendor Crawlers -================================================================ +""":class:`~pcapkit.protocols.link.vlan.protocol.VLAN` Vendor Crawlers +========================================================================= .. module:: pcapkit.vendor.vlan This module contains all vendor crawlers of -:class:`~pcapkit.protocols.link.vlan.VLAN` implementations. Available +:class:`~pcapkit.protocols.link.vlan.protocol.VLAN` implementations. Available enumerations include: .. list-table:: diff --git a/pyproject.toml b/pyproject.toml index 46f310e08a..eed9c9b4d4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -96,7 +96,7 @@ pcapkit-vendor = "pcapkit.vendor.__main__:main" [project.optional-dependencies] # for CLI display cli = [ "emoji" ] -# for ESP payload decryption, c.f. pcapkit.protocols.internet.esp +# for ESP payload decryption, c.f. pcapkit.protocols.internet.esp.protocol # # Capped below 46 on PyPy older than 3.11 (#2040), and nowhere else, which the # complementary marker on the first line keeps. 45.0.7 is the newest release @@ -109,7 +109,7 @@ crypto = [ "cryptography>=3.4; platform_python_implementation != 'PyPy' or python_version >= '3.11'", "cryptography>=3.4,<46; platform_python_implementation == 'PyPy' and python_version < '3.11'", ] -# for NGAP decoding, c.f. pcapkit.protocols.application.ngap. Counted among +# for NGAP decoding, c.f. pcapkit.protocols.application.ngap.protocol. Counted among # ``all``'s *core addons* by the owner's ruling on #910 -- everything needed for # the library itself to work at full functionality -- even though the # ``pycrate`` this needs is not a free addition: @@ -438,3 +438,11 @@ branch = true [tool.coverage.report] show_missing = true + +[tool.isort] +# The protocol package __init__ files keep their imports in role blocks under +# headings, which isort would merge (#2534). make isort passes its own flags. +extend_skip_glob = [ + "pcapkit/protocols/*/*/__init__.py", +] +filter_files = true diff --git a/tests/_support.py b/tests/_support.py index 38e7c7d0d0..bf1d5686fd 100644 --- a/tests/_support.py +++ b/tests/_support.py @@ -554,9 +554,9 @@ def install_fake_payload_protocols(test: 'unittest.TestCase', raw_cls: type, :func:`install_fake_protocol_module` -- these two names are on the import path of most of the package, so leaving stand-ins bound to them poisons every later test that imports :mod:`pcapkit`. - raw_cls: Stand-in to bind as ``pcapkit.protocols.misc.raw.Raw``. + raw_cls: Stand-in to bind as ``pcapkit.protocols.misc.raw.protocol.Raw``. null_cls: Stand-in to bind as - ``pcapkit.protocols.misc.no_payload.NoPayload``. + ``pcapkit.protocols.misc.no_payload.protocol.NoPayload``. Raises: RuntimeError: If ``test`` is not under :func:`isolate_modules`. @@ -566,13 +566,13 @@ def install_fake_payload_protocols(test: 'unittest.TestCase', raw_cls: type, ensure_package('pcapkit.protocols.misc', ROOT / 'pcapkit' / 'protocols' / 'misc') - raw_module = types.ModuleType('pcapkit.protocols.misc.raw') + raw_module = types.ModuleType('pcapkit.protocols.misc.raw.protocol') raw_module.Raw = raw_cls - sys.modules['pcapkit.protocols.misc.raw'] = raw_module + sys.modules['pcapkit.protocols.misc.raw.protocol'] = raw_module - null_module = types.ModuleType('pcapkit.protocols.misc.no_payload') + null_module = types.ModuleType('pcapkit.protocols.misc.no_payload.protocol') null_module.NoPayload = null_cls - sys.modules['pcapkit.protocols.misc.no_payload'] = null_module + sys.modules['pcapkit.protocols.misc.no_payload.protocol'] = null_module def _reset_abc_caches() -> None: diff --git a/tests/conftest.py b/tests/conftest.py index 52790c2259..c4f5fe7393 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -261,7 +261,7 @@ def restore_module_table() -> 'Iterator[None]': :class:`~typing.Generic` stayed bound after the test that installed it, and the next test to import :mod:`pcapkit` died on ``TypeError: type 'ProtocolBase' is not subscriptable`` at the :class:`Frame` class statement - in :mod:`pcapkit.protocols.misc.pcap.frame` -- a run of tests in + in :mod:`pcapkit.protocols.misc.pcap.frame.protocol` -- a run of tests in :mod:`tests.project`, and only when the polluting file happened to be collected first. Several files turned out to leak this way, one of which -- :mod:`tests.cli.test_main` -- did not import :mod:`tests._support` diff --git a/tests/const/test_const_apptype_lazy_1538_unit.py b/tests/const/test_const_apptype_lazy_1538_unit.py index 8472086b10..54efcb09be 100644 --- a/tests/const/test_const_apptype_lazy_1538_unit.py +++ b/tests/const/test_const_apptype_lazy_1538_unit.py @@ -17,7 +17,7 @@ cold import leaves in :data:`sys.modules` and this process has long since imported everything. :data:`PRELUDE` imports :mod:`pcapkit`, whose protocol modules import the const modules they name at module level -- -:mod:`pcapkit.protocols.application.ngap` imports SCTP's registry, for one, which +:mod:`pcapkit.protocols.application.ngap.protocol` imports SCTP's registry, for one, which #2730 is to move -- so a check of the const packages themselves runs on :data:`BARE`, which binds :mod:`pcapkit` as a bare package and so runs none of :file:`pcapkit/__init__.py`. Each check fails on an eager tree at its first @@ -154,7 +154,7 @@ class LazyAppTypeImportTests(unittest.TestCase): """What a cold import loads, and what loads each registry afterwards.""" def test_import_pcapkit_leaves_the_registries_unimported(self) -> 'None': - # NOTE: SCTP's is left out: pcapkit.protocols.application.ngap imports it + # NOTE: SCTP's is left out: pcapkit.protocols.application.ngap.protocol imports it # at module level, which LazyConstImportTests accounts for (#2730). out = run_child(''' emit(loaded=loaded('tcp', 'udp', 'dccp'), @@ -316,12 +316,12 @@ def test_member_pickled_eagerly_unpickles_after_a_lazy_import(self) -> 'None': def test_port_registered_before_first_use_dispatches_the_same(self) -> 'None': code = ''' from pcapkit.foundation.registry import register_tcp - from pcapkit.protocols.transport.tcp import TCP + from pcapkit.protocols.transport.tcp.protocol import TCP if {lookup_first}: import pcapkit.const.reg.apptype pcapkit.const.reg.apptype.TCP at_register = loaded('tcp', 'udp') - register_tcp(54321, 'pcapkit.protocols.application.ftp', 'FTP') + register_tcp(54321, 'pcapkit.protocols.application.ftp.protocol', 'FTP') raw = TCP(srcport=40000, dstport=54321, payload=b'USER anonymous\\r\\n').data parsed = TCP(raw, len(raw)) emit(at_register=at_register, raw=raw.hex(), chain=str(parsed.protochain), @@ -583,7 +583,7 @@ def setUp(self) -> 'None': def test_hooks(self) -> 'None': import pcapkit.const.reg.apptype as pkg - # NOTE: TCP, UDP and DCCP, since pcapkit.protocols.application.ngap + # NOTE: TCP, UDP and DCCP, since pcapkit.protocols.application.ngap.protocol # imports SCTP's submodule at module level (#2730). for name in ('TCP', 'UDP', 'DCCP'): self.assertNotIn(name, vars(pkg)) diff --git a/tests/const/test_const_apptype_split_unit.py b/tests/const/test_const_apptype_split_unit.py index de0e8473d3..fa02e5e2ba 100644 --- a/tests/const/test_const_apptype_split_unit.py +++ b/tests/const/test_const_apptype_split_unit.py @@ -1111,12 +1111,12 @@ def test_no_lookup_call_site_in_the_library_builds_a_composite_proto(self) -> No callers = [ 'pcapkit/protocols/transport/transport.py', - 'pcapkit/protocols/transport/tcp.py', - 'pcapkit/protocols/transport/udp.py', - 'pcapkit/protocols/transport/sctp.py', - 'pcapkit/protocols/schema/transport/tcp.py', - 'pcapkit/protocols/schema/transport/udp.py', - 'pcapkit/protocols/schema/transport/sctp.py', + 'pcapkit/protocols/transport/tcp/protocol.py', + 'pcapkit/protocols/transport/udp/protocol.py', + 'pcapkit/protocols/transport/sctp/protocol.py', + 'pcapkit/protocols/transport/tcp/schema.py', + 'pcapkit/protocols/transport/udp/schema.py', + 'pcapkit/protocols/transport/sctp/schema.py', 'pcapkit/foundation/registry/protocols/transport.py', 'pcapkit/corekit/fields/numbers.py', ] @@ -1195,19 +1195,19 @@ def test_no_lookup_call_site_in_the_library_builds_a_composite_proto(self) -> No 'pcapkit/corekit/fields/numbers.py _dispatch(proto=proto)', 'pcapkit/corekit/fields/numbers.py get(proto=proto)', 'pcapkit/corekit/fields/numbers.py get(proto=proto)', - 'pcapkit/protocols/schema/transport/sctp.py PortEnumField(proto=Enum_TransportProtocol.sctp)', - 'pcapkit/protocols/schema/transport/sctp.py PortEnumField(proto=Enum_TransportProtocol.sctp)', - 'pcapkit/protocols/schema/transport/tcp.py PortEnumField(proto=Enum_TransportProtocol.tcp)', - 'pcapkit/protocols/schema/transport/tcp.py PortEnumField(proto=Enum_TransportProtocol.tcp)', - 'pcapkit/protocols/schema/transport/udp.py PortEnumField(proto=Enum_TransportProtocol.udp)', - 'pcapkit/protocols/schema/transport/udp.py PortEnumField(proto=Enum_TransportProtocol.udp)', - 'pcapkit/protocols/transport/sctp.py _make_port(proto=Enum_TransportProtocol.sctp)', - 'pcapkit/protocols/transport/sctp.py _make_port(proto=Enum_TransportProtocol.sctp)', - 'pcapkit/protocols/transport/tcp.py _make_port(proto=Enum_TransportProtocol.tcp)', - 'pcapkit/protocols/transport/tcp.py _make_port(proto=Enum_TransportProtocol.tcp)', + 'pcapkit/protocols/transport/sctp/protocol.py _make_port(proto=Enum_TransportProtocol.sctp)', + 'pcapkit/protocols/transport/sctp/protocol.py _make_port(proto=Enum_TransportProtocol.sctp)', + 'pcapkit/protocols/transport/sctp/schema.py PortEnumField(proto=Enum_TransportProtocol.sctp)', + 'pcapkit/protocols/transport/sctp/schema.py PortEnumField(proto=Enum_TransportProtocol.sctp)', + 'pcapkit/protocols/transport/tcp/protocol.py _make_port(proto=Enum_TransportProtocol.tcp)', + 'pcapkit/protocols/transport/tcp/protocol.py _make_port(proto=Enum_TransportProtocol.tcp)', + 'pcapkit/protocols/transport/tcp/schema.py PortEnumField(proto=Enum_TransportProtocol.tcp)', + 'pcapkit/protocols/transport/tcp/schema.py PortEnumField(proto=Enum_TransportProtocol.tcp)', 'pcapkit/protocols/transport/transport.py get(proto=proto)', - 'pcapkit/protocols/transport/udp.py _make_port(proto=Enum_TransportProtocol.udp)', - 'pcapkit/protocols/transport/udp.py _make_port(proto=Enum_TransportProtocol.udp)', + 'pcapkit/protocols/transport/udp/protocol.py _make_port(proto=Enum_TransportProtocol.udp)', + 'pcapkit/protocols/transport/udp/protocol.py _make_port(proto=Enum_TransportProtocol.udp)', + 'pcapkit/protocols/transport/udp/schema.py PortEnumField(proto=Enum_TransportProtocol.udp)', + 'pcapkit/protocols/transport/udp/schema.py PortEnumField(proto=Enum_TransportProtocol.udp)', ]) # ``register_apptype`` takes the transports one at a time and resolves each @@ -1258,7 +1258,7 @@ def test_no_lookup_call_site_in_the_library_builds_a_composite_proto(self) -> No from pcapkit.foundation.registry.protocols import protocol as reg_protocol from pcapkit.foundation.registry.protocols import transport as reg_transport - from pcapkit.protocols.misc.raw import Raw + from pcapkit.protocols.misc.raw.protocol import Raw missing = object() previous = reg_transport.UDP.__proto__.get(65210, missing) diff --git a/tests/const/test_const_enum_get.py b/tests/const/test_const_enum_get.py index d40e52003d..b63065b08e 100644 --- a/tests/const/test_const_enum_get.py +++ b/tests/const/test_const_enum_get.py @@ -124,7 +124,7 @@ #: :class:`~pcapkit.const.pcapng.filter_type.FilterType` declares *no* static #: members at all -- every one of its 256 codes reaches ``_missing_``. -#: Importing :mod:`pcapkit.protocols.misc.pcapng` evaluates +#: Importing :mod:`pcapkit.protocols.misc.pcapng.protocol` evaluates #: ``Enum_FilterType(0)`` as a default argument at class-definition time, but #: FilterType's bare ``Unassigned`` label resolves to an unregistered member #: (the #775/#847 ruling), so that import mints nothing -- a minting label @@ -297,7 +297,7 @@ def test_the_sweep_matches_the_census(self) -> None: # sweep is the census's 'int' and 'flag' registries (#2615). GitHub # issue #880's ngap.ProcedureCode and ngap.ProtocolIE are on # EnumRegistry rather than hand-rolled IntEnum classes in - # pcapkit.protocols.application.ngap; neither needs an exception-set + # pcapkit.protocols.application.ngap.protocol; neither needs an exception-set # entry, since both take the base's own get(key, default). names = {_qualname(obj) for obj in self.enums} self.assertEqual(census.compare(map(_qualname, self.enums), census.names('int', 'flag')), diff --git a/tests/const/test_const_enum_lookup.py b/tests/const/test_const_enum_lookup.py index 2eea0fdc5f..0799f9750a 100644 --- a/tests/const/test_const_enum_lookup.py +++ b/tests/const/test_const_enum_lookup.py @@ -448,10 +448,10 @@ def setUp(self) -> None: reimport_once_per_class(self) def test_parses_igmp_over_router_alert_zero(self) -> None: - from pcapkit.protocols.internet.ipv4 import IPv4 + from pcapkit.protocols.internet.ipv4.protocol import IPv4 from pcapkit.const.ipv4.option_number import OptionNumber from pcapkit.const.ipv4.router_alert import RouterAlert - from pcapkit.protocols.data.internet.ipv4 import RTRALTOption + from pcapkit.protocols.internet.ipv4.data import RTRALTOption # IPv4 header, 28 bytes, carrying a Router Alert option (type 148, # length 4, value 0) ahead of an IGMP payload -- the packet from diff --git a/tests/const/test_const_enum_no_mint.py b/tests/const/test_const_enum_no_mint.py index 7880511b41..352a8169a0 100644 --- a/tests/const/test_const_enum_no_mint.py +++ b/tests/const/test_const_enum_no_mint.py @@ -1757,7 +1757,7 @@ def test_optiontype_get_int_path_does_not_mint(self) -> None: """Guards against :meth:`OptionType.get` minting directly on a miss (bypassing ``_missing_`` entirely) -- a second, independent mint site, on the wire-facing path - (:meth:`pcapkit.protocols.misc.pcapng.PCAPNG._make_pcapng_options` + (:meth:`pcapkit.protocols.misc.pcapng.protocol.PCAPNG._make_pcapng_options` calls ``get()`` with raw option-code bytes). The owner's ruling names ``get`` explicitly -- the same reason :class:`~pcapkit.const.ftp.command.Command`/:class:`~pcapkit.const. @@ -2116,8 +2116,8 @@ class BespokeGetReplacementTests(unittest.TestCase): Measured when the hand-written form was replaced, so that no caller in :mod:`pcapkit` or :mod:`tests` depends on it: ``grep`` found exactly one - production call site each (:mod:`pcapkit.protocols.application.httpv1` - and :mod:`pcapkit.protocols.application.ftp`), neither passing a + production call site each (:mod:`pcapkit.protocols.application.httpv1.protocol` + and :mod:`pcapkit.protocols.application.ftp.protocol`), neither passing a ``default`` or a ``str`` key -- both call ``get()`` with no default, which raises identically either way on an unresolvable key. The hand-written ``str``-key branch (look up-or-mint *by name*, keyed on diff --git a/tests/const/test_const_ipv6_extension_header_925_unit.py b/tests/const/test_const_ipv6_extension_header_925_unit.py index 69400c1837..a5d2336c24 100644 --- a/tests/const/test_const_ipv6_extension_header_925_unit.py +++ b/tests/const/test_const_ipv6_extension_header_925_unit.py @@ -12,7 +12,7 @@ file is exactly what the crawler produces from the fixture the issue's own investigation fetched. -:meth:`pcapkit.protocols.internet.ipv6.IPv6._decode_next_layer` resolves +:meth:`pcapkit.protocols.internet.ipv6.protocol.IPv6._decode_next_layer` resolves ``Enum_ExtensionHeader(proto)`` at the top of its extension-header walk loop, wrapped in ``try/except ValueError: break``. ``tests.protocols.internet .test_ipv6_ext_unit.IPv6ExtUnitTests @@ -89,8 +89,8 @@ def test_ipv6_walk_stops_cleanly_on_next_header_147(self) -> None: # packet ends up dispatched by TransType instead of being walked as # an extension-header chain, and still parses without error. from pcapkit.const.reg.transtype import TransType - from pcapkit.protocols.internet.ipv6 import IPv6 - from pcapkit.protocols.misc.raw import Raw + from pcapkit.protocols.internet.ipv6.protocol import IPv6 + from pcapkit.protocols.misc.raw.protocol import Raw raw = _ipv6_bytes(int(TransType.BIT_EMU), b'\x11\x01' + b'\x00' * 14) ipv6 = IPv6(io.BytesIO(raw), len(raw)) diff --git a/tests/const/test_const_method_value_lookup_908_unit.py b/tests/const/test_const_method_value_lookup_908_unit.py index 09b62a96db..cf628198ac 100644 --- a/tests/const/test_const_method_value_lookup_908_unit.py +++ b/tests/const/test_const_method_value_lookup_908_unit.py @@ -15,7 +15,7 @@ (:meth:`~pcapkit.const.http.method.Method._missing_`, which the override does not touch). -**Why a capture reaches it.** ``pcapkit/protocols/application/http.py``'s +**Why a capture reaches it.** ``pcapkit/protocols/application/http/protocol.py``'s ``_RE_METHOD = re.compile(rb"(?P[A-Z][A-Z-]*)\\Z")``, which ``httpv1.py`` imports, admits a hyphen, so a request line carrying ``BASELINE-CONTROL`` matches, reaches ``Enum_Method.get(...)`` in @@ -197,7 +197,7 @@ def test_a_baseline_control_request_line_reports_the_registrys_idempotent_flag( otherwise succeeds silently. Pins the whole path, not only the direct ``Method.get`` call above.""" from pcapkit.const.http.method import Method - from pcapkit.protocols.application.httpv1 import HTTPv1 + from pcapkit.protocols.application.httpv1.protocol import HTTPv1 proto = object.__new__(HTTPv1) header, _ = proto._read_http_header( @@ -212,7 +212,7 @@ def test_a_version_control_request_line_reports_the_registrys_idempotent_flag( self) -> None: """The issue's second repro, through the same end-to-end path.""" from pcapkit.const.http.method import Method - from pcapkit.protocols.application.httpv1 import HTTPv1 + from pcapkit.protocols.application.httpv1.protocol import HTTPv1 proto = object.__new__(HTTPv1) header, _ = proto._read_http_header( @@ -270,7 +270,7 @@ def test_a_bytes_key_raises_instead_of_returning_a_bytes_valued_member(self) -> Without #908's fix this hands back a member whose ``name`` and ``value`` are both ``b'GET'``. ``bytes`` is the plausible mistake here, since - ``_RE_METHOD`` (in ``pcapkit/protocols/application/http.py``) is a + ``_RE_METHOD`` (in ``pcapkit/protocols/application/http/protocol.py``) is a bytes pattern and ``httpv1`` is bytes throughout -- the live call in ``httpv1.HTTPv1._read_start_line`` is safe only because it wraps the match in ``self.decode(...)``. diff --git a/tests/const/test_const_mp_tcp_option_rfc_2330_unit.py b/tests/const/test_const_mp_tcp_option_rfc_2330_unit.py index 1fabd861d2..de673fef5d 100644 --- a/tests/const/test_const_mp_tcp_option_rfc_2330_unit.py +++ b/tests/const/test_const_mp_tcp_option_rfc_2330_unit.py @@ -43,7 +43,7 @@ :meth:`MPTCPOptionCitationTests.test_the_generic_mptcp_figure_cites_the_registrys_rfc`), for the reason the next paragraph gives. -:mod:`pcapkit.protocols.transport.tcp` carried the same defect, corrected +:mod:`pcapkit.protocols.transport.tcp.protocol` carried the same defect, corrected alongside the table: the option-kind map's comment against ``Option.Multipath_TCP``, which attributes the kind rather than any subtype's layout, and the ``Structure of MP-TCP`` figure in ``TCP._read_mode_mp``, which @@ -93,7 +93,7 @@ VENDOR = ROOT / 'pcapkit' / 'vendor' / 'tcp' / 'mp_tcp_option.py' #: The parser that dispatches on these subtypes. -TRANSPORT = ROOT / 'pcapkit' / 'protocols' / 'transport' / 'tcp.py' +TRANSPORT = ROOT / 'pcapkit' / 'protocols' / 'transport' / 'tcp' / 'protocol.py' #: The RFC the registry gives as its reference: MPTCP v1, which obsoletes RFC 6824's v0. REGISTRY_RFC = '8684' diff --git a/tests/const/test_const_str_payload_870_unit.py b/tests/const/test_const_str_payload_870_unit.py index 367c259b7a..20804b9950 100644 --- a/tests/const/test_const_str_payload_870_unit.py +++ b/tests/const/test_const_str_payload_870_unit.py @@ -29,11 +29,11 @@ :data:`False`). Nothing under :mod:`pcapkit.protocols` compares a member this way (the one caller of :meth:`~pcapkit.const.http.method.Method.get`, -:meth:`pcapkit.protocols.application.httpv1.HTTPv1._read_start_line`, reached -through :meth:`~pcapkit.protocols.application.httpv1.HTTPv1._read_http_header` -and :meth:`~pcapkit.protocols.application.httpv1.HTTPv1.make`, only builds a +:meth:`pcapkit.protocols.application.httpv1.protocol.HTTPv1._read_start_line`, reached +through :meth:`~pcapkit.protocols.application.httpv1.protocol.HTTPv1._read_http_header` +and :meth:`~pcapkit.protocols.application.httpv1.protocol.HTTPv1.make`, only builds a member from the wire string, and -:meth:`~pcapkit.protocols.application.httpv1.HTTPv1._make_start_line` reads +:meth:`~pcapkit.protocols.application.httpv1.protocol.HTTPv1._make_start_line` reads ``.value``; neither calls ``str()`` or ``==`` on the member itself), so the fix is observable only to external callers and to this module's own dunders (``__repr__`` reads ``_value_`` and is unaffected). diff --git a/tests/const/test_const_tcp_flags_wire_masks_2310_unit.py b/tests/const/test_const_tcp_flags_wire_masks_2310_unit.py index ee3b1ab67f..2b007462ac 100644 --- a/tests/const/test_const_tcp_flags_wire_masks_2310_unit.py +++ b/tests/const/test_const_tcp_flags_wire_masks_2310_unit.py @@ -78,7 +78,7 @@ def test_the_guard_is_the_twelve_bit_flags_field(self) -> None: def test_a_parsed_syn_ack_reports_its_header_bits(self) -> None: from pcapkit.const.tcp.flags import Flags - from pcapkit.protocols.transport.tcp import TCP + from pcapkit.protocols.transport.tcp.protocol import TCP tcp = TCP(SYN_ACK, len(SYN_ACK)) word = struct.unpack('!H', SYN_ACK[12:14])[0] @@ -93,7 +93,7 @@ def test_a_parsed_syn_ack_reports_its_header_bits(self) -> None: def test_every_flags_octet_reads_back_as_its_value(self) -> None: """The eight flags the parser reports, each combination, as the octet they came from.""" - from pcapkit.protocols.transport.tcp import TCP + from pcapkit.protocols.transport.tcp.protocol import TCP for octet in range(0x100): with self.subTest(octet=hex(octet)): @@ -103,7 +103,7 @@ def test_every_flags_octet_reads_back_as_its_value(self) -> None: self.assertEqual(TCP.from_data(tcp.info).data, raw) def test_make_builds_the_header_bits_its_connection_names(self) -> None: - from pcapkit.protocols.transport.tcp import TCP + from pcapkit.protocols.transport.tcp.protocol import TCP made = TCP(srcport=1, dstport=2, syn=True, ack=True) self.assertEqual(int(made.connection), 0x012) diff --git a/tests/corekit/test_bitfield_unnamed_bits_1487_unit.py b/tests/corekit/test_bitfield_unnamed_bits_1487_unit.py index 72409995af..14301b04c9 100644 --- a/tests/corekit/test_bitfield_unnamed_bits_1487_unit.py +++ b/tests/corekit/test_bitfield_unnamed_bits_1487_unit.py @@ -67,7 +67,7 @@ def test_a_non_int_record_is_rejected(self) -> None: def test_schema_to_dict_from_dict_keeps_the_unnamed_bits(self) -> None: from pcapkit.corekit.fields.strings import BitField - from pcapkit.protocols.schema.schema import Schema, schema_final + from pcapkit.protocols.schema import Schema, schema_final @schema_final class Flags(Schema): diff --git a/tests/corekit/test_checksum_import_boundary_2580_unit.py b/tests/corekit/test_checksum_import_boundary_2580_unit.py index 9d116539bc..671cf20335 100644 --- a/tests/corekit/test_checksum_import_boundary_2580_unit.py +++ b/tests/corekit/test_checksum_import_boundary_2580_unit.py @@ -71,9 +71,9 @@ def test_what_the_move_took_out_would_cross(self) -> None: 'from pcapkit.utilities.warnings import ChecksumWarning, warn', # 3 'from pcapkit.protocols.protocol import _rebuilding', # 4 'if TYPE_CHECKING:', # 5 - ' from pcapkit.protocols.misc.checksum.ip_pseudo import IP_Pseudo', # 6 + ' from pcapkit.protocols.misc.checksum.ip_pseudo.protocol import IP_Pseudo', # 6 'def verify_upper(ip):', # 7 - ' from pcapkit.protocols.internet.ah import AH', # 8 + ' from pcapkit.protocols.internet.ah.protocol import AH', # 8 ' from pcapkit import foundation', # 9 ]) crossing = [(line, name) @@ -82,10 +82,10 @@ def test_what_the_move_took_out_would_cross(self) -> None: self.assertEqual(crossing, [ (4, 'pcapkit.protocols.protocol'), (4, 'pcapkit.protocols.protocol._rebuilding'), - (6, 'pcapkit.protocols.misc.checksum.ip_pseudo'), - (6, 'pcapkit.protocols.misc.checksum.ip_pseudo.IP_Pseudo'), - (8, 'pcapkit.protocols.internet.ah'), - (8, 'pcapkit.protocols.internet.ah.AH'), + (6, 'pcapkit.protocols.misc.checksum.ip_pseudo.protocol'), + (6, 'pcapkit.protocols.misc.checksum.ip_pseudo.protocol.IP_Pseudo'), + (8, 'pcapkit.protocols.internet.ah.protocol'), + (8, 'pcapkit.protocols.internet.ah.protocol.AH'), (9, 'pcapkit.foundation'), ]) diff --git a/tests/corekit/test_decorators.py b/tests/corekit/test_decorators.py index 205a7cc838..0e311cb3da 100644 --- a/tests/corekit/test_decorators.py +++ b/tests/corekit/test_decorators.py @@ -369,7 +369,7 @@ def test_prepare_tolerates_a_post_process_that_returns_no_schema(self) -> None: """``post_process`` need not return a schema, so the flag reset is guarded. An implementation may hand back a nested schema instead of ``self`` -- - ``pcapkit.protocols.schema.internet.hopopt._SMFDPDOption`` returns + ``pcapkit.protocols.internet.hopopt.schema._SMFDPDOption`` returns ``self.data`` -- and the stand-ins above return the packet mapping. Neither may raise from the reset. diff --git a/tests/corekit/test_decorators_path_1735_unit.py b/tests/corekit/test_decorators_path_1735_unit.py index d91219dcf7..18ad33fea4 100644 --- a/tests/corekit/test_decorators_path_1735_unit.py +++ b/tests/corekit/test_decorators_path_1735_unit.py @@ -35,8 +35,8 @@ ('pcapkit.protocols.protocol', 'seekset'), ('pcapkit.protocols.protocol', 'beholder'), ('pcapkit.protocols.internet.internet', 'beholder'), - ('pcapkit.protocols.internet.ipv6', 'beholder'), - ('pcapkit.protocols.schema.schema', 'prepare'), + ('pcapkit.protocols.internet.ipv6.protocol', 'beholder'), + ('pcapkit.protocols.schema', 'prepare'), ) diff --git a/tests/corekit/test_enum_get_exception_provenance_923_unit.py b/tests/corekit/test_enum_get_exception_provenance_923_unit.py index b0060ce9f6..124feebf35 100644 --- a/tests/corekit/test_enum_get_exception_provenance_923_unit.py +++ b/tests/corekit/test_enum_get_exception_provenance_923_unit.py @@ -19,8 +19,8 @@ Deriving :exc:`~pcapkit.utilities.exceptions.EnumKeyError` from :exc:`KeyError` is what keeps the blast radius at nothing for the in-library sites that catch the base's name miss -- in :meth:`~pcapkit.const.http.method.Method.get`, -:mod:`pcapkit.toolkit.scapy`, :mod:`pcapkit.protocols.internet.hopopt` and -:mod:`pcapkit.protocols.internet.ipv6_opts` -- and ``Method.get`` catches it to +:mod:`pcapkit.toolkit.scapy`, :mod:`pcapkit.protocols.internet.hopopt.protocol` and +:mod:`pcapkit.protocols.internet.ipv6_opts.protocol` -- and ``Method.get`` catches it to return an unregistered member, which mints nothing, so for that one a name miss is part of a *successful* call. :class:`MethodUnregisteredMemberMintsNothingTests` pins that one directly. @@ -33,8 +33,8 @@ :class:`TransportProtocolCaseFoldingTests`. * ``Criticality.get`` does not exist, since its body would be a pure pass-through -- :class:`CriticalityGetDeletionTests`. -* :class:`~pcapkit.protocols.internet.mh.FastBindingAcknowledgmentStatus` and - :class:`~pcapkit.protocols.internet.mh.IPv6AddressPrefixCode` raise from +* :class:`~pcapkit.protocols.internet.mh.protocol.FastBindingAcknowledgmentStatus` and + :class:`~pcapkit.protocols.internet.mh.protocol.IPv6AddressPrefixCode` raise from :mod:`pcapkit.utilities.exceptions` on a *name* miss as ``EnumKeyError``, not as ``EnumValueError`` -- the right provenance in the wrong shape -- :class:`MobilityHeaderNameMissTests`. @@ -435,14 +435,14 @@ class CriticalityGetDeletionTests(unittest.TestCase): """ def test_the_override_is_gone(self) -> 'None': - from pcapkit.protocols.application.ngap import Criticality + from pcapkit.protocols.application.ngap.protocol import Criticality self.assertNotIn('get', Criticality.__dict__) def test_names_and_values_resolve_through_the_inherited_get(self) -> 'None': """Invariants rather than repros -- they pass without the #923 fix too, and are what relying on the inherited ``get`` has to preserve.""" - from pcapkit.protocols.application.ngap import Criticality + from pcapkit.protocols.application.ngap.protocol import Criticality self.assertIs(Criticality.get('reject'), Criticality.reject) self.assertIs(Criticality.get('ignore'), Criticality.ignore) @@ -452,7 +452,7 @@ def test_names_and_values_resolve_through_the_inherited_get(self) -> 'None': self.assertIs(Criticality.get(Criticality.reject), Criticality.reject) def test_a_name_miss_reports_in_the_stdlib_shape(self) -> 'None': - from pcapkit.protocols.application.ngap import Criticality + from pcapkit.protocols.application.ngap.protocol import Criticality from pcapkit.utilities.exceptions import EnumKeyError with self.assertRaises(EnumKeyError) as caught: @@ -462,7 +462,7 @@ def test_a_name_miss_reports_in_the_stdlib_shape(self) -> 'None': self.assertIn('nosuch', str(caught.exception)) def test_a_member_valued_default_is_honoured(self) -> 'None': - from pcapkit.protocols.application.ngap import Criticality + from pcapkit.protocols.application.ngap.protocol import Criticality self.assertIs(Criticality.get('nosuch', Criticality.reject), Criticality.reject) self.assertIs(Criticality.get('nosuch', Criticality.notify), Criticality.notify) @@ -472,7 +472,7 @@ def test_a_default_naming_no_member_is_not_honoured(self) -> 'None': ASN.1 ``ENUMERATED``: a default resolves through ``_value2member_map_`` and never through the constructor, so no path here can mint a fourth value.""" - from pcapkit.protocols.application.ngap import Criticality + from pcapkit.protocols.application.ngap.protocol import Criticality from pcapkit.utilities.exceptions import EnumKeyError before = len(Criticality.__members__) @@ -481,7 +481,7 @@ def test_a_default_naming_no_member_is_not_honoured(self) -> 'None': self.assertEqual(len(Criticality.__members__), before) def test_a_value_miss_still_goes_through_missing(self) -> 'None': - from pcapkit.protocols.application.ngap import Criticality + from pcapkit.protocols.application.ngap.protocol import Criticality from pcapkit.utilities.exceptions import EnumValueError with self.assertRaises(EnumValueError) as caught: @@ -502,7 +502,7 @@ class MobilityHeaderNameMissTests(unittest.TestCase): """ def test_a_name_miss_is_key_shaped(self) -> 'None': - from pcapkit.protocols.internet.mh import (FastBindingAcknowledgmentStatus, + from pcapkit.protocols.internet.mh.protocol import (FastBindingAcknowledgmentStatus, IPv6AddressPrefixCode) from pcapkit.utilities.exceptions import EnumKeyError @@ -516,7 +516,7 @@ def test_a_name_miss_is_key_shaped(self) -> 'None': self.assertIn(enum_cls.__name__, str(caught.exception)) def test_a_value_miss_stays_value_shaped(self) -> 'None': - from pcapkit.protocols.internet.mh import (FastBindingAcknowledgmentStatus, + from pcapkit.protocols.internet.mh.protocol import (FastBindingAcknowledgmentStatus, IPv6AddressPrefixCode) from pcapkit.utilities.exceptions import EnumValueError @@ -529,7 +529,7 @@ def test_a_value_miss_stays_value_shaped(self) -> 'None': self.assertNotIsInstance(caught.exception, KeyError) def test_a_declared_name_and_value_still_resolve(self) -> 'None': - from pcapkit.protocols.internet.mh import (FastBindingAcknowledgmentStatus, + from pcapkit.protocols.internet.mh.protocol import (FastBindingAcknowledgmentStatus, IPv6AddressPrefixCode) self.assertIs(FastBindingAcknowledgmentStatus.get('Insufficient_resources'), @@ -541,7 +541,7 @@ def test_a_declared_name_and_value_still_resolve(self) -> 'None': self.assertIs(IPv6AddressPrefixCode.get(4), IPv6AddressPrefixCode.NAR_Prefix) def test_neither_class_grows(self) -> 'None': - from pcapkit.protocols.internet.mh import (FastBindingAcknowledgmentStatus, + from pcapkit.protocols.internet.mh.protocol import (FastBindingAcknowledgmentStatus, IPv6AddressPrefixCode) from pcapkit.utilities.exceptions import EnumKeyError diff --git a/tests/corekit/test_enum_lookup_reparent_877_unit.py b/tests/corekit/test_enum_lookup_reparent_877_unit.py index 8a9febd3e3..f37ed27870 100644 --- a/tests/corekit/test_enum_lookup_reparent_877_unit.py +++ b/tests/corekit/test_enum_lookup_reparent_877_unit.py @@ -12,15 +12,15 @@ `, :class:`FinalisedState `, :class:`Completion `, -:class:`ftp.Type `, -:class:`httpv1.Type `, -:class:`Criticality `, -:class:`PDUKind `, -:class:`PacketDirection `, -:class:`PacketReception `, -:class:`WireGuardKeyLabel `, +:class:`ftp.Type `, +:class:`httpv1.Type `, +:class:`Criticality `, +:class:`PDUKind `, +:class:`PacketDirection `, +:class:`PacketReception `, +:class:`WireGuardKeyLabel `, and :class:`FrameType.Flags -` plus its +` plus its concrete per-frame subclasses. :class:`TransportProtocol` defines its own ``get``, as a :class:`classmethod` @@ -99,7 +99,7 @@ def test_completion(self) -> None: def test_ftp_type(self) -> None: from pcapkit.corekit.enum import EnumLookup - from pcapkit.protocols.application.ftp import Type as FTPType + from pcapkit.protocols.application.ftp.protocol import Type as FTPType from pcapkit.utilities.compat import StrEnum self.assertEqual(FTPType.__bases__, (EnumLookup, StrEnum)) @@ -107,7 +107,7 @@ def test_ftp_type(self) -> None: def test_httpv1_type(self) -> None: from pcapkit.corekit.enum import EnumLookup - from pcapkit.protocols.application.httpv1 import Type as HTTPv1Type + from pcapkit.protocols.application.httpv1.protocol import Type as HTTPv1Type from pcapkit.utilities.compat import StrEnum self.assertEqual(HTTPv1Type.__bases__, (EnumLookup, StrEnum)) @@ -117,14 +117,14 @@ def test_criticality(self) -> None: from aenum import IntEnum from pcapkit.corekit.enum import EnumLookup - from pcapkit.protocols.application.ngap import Criticality + from pcapkit.protocols.application.ngap.protocol import Criticality self.assertEqual(Criticality.__bases__, (EnumLookup, IntEnum)) self.assertIn(EnumLookup, Criticality.__mro__) def test_pdu_kind(self) -> None: from pcapkit.corekit.enum import EnumLookup - from pcapkit.protocols.application.ngap import PDUKind + from pcapkit.protocols.application.ngap.protocol import PDUKind from pcapkit.utilities.compat import StrEnum self.assertEqual(PDUKind.__bases__, (EnumLookup, StrEnum)) @@ -134,7 +134,7 @@ def test_packet_direction(self) -> None: import enum from pcapkit.corekit.enum import EnumLookup - from pcapkit.protocols.misc.pcapng import PacketDirection + from pcapkit.protocols.misc.pcapng.protocol import PacketDirection self.assertEqual(PacketDirection.__bases__, (EnumLookup, enum.IntEnum)) self.assertIn(EnumLookup, PacketDirection.__mro__) @@ -143,14 +143,14 @@ def test_packet_reception(self) -> None: import enum from pcapkit.corekit.enum import EnumLookup - from pcapkit.protocols.misc.pcapng import PacketReception + from pcapkit.protocols.misc.pcapng.protocol import PacketReception self.assertEqual(PacketReception.__bases__, (EnumLookup, enum.IntEnum)) self.assertIn(EnumLookup, PacketReception.__mro__) def test_wireguard_key_label(self) -> None: from pcapkit.corekit.enum import EnumLookup - from pcapkit.protocols.misc.pcapng import WireGuardKeyLabel + from pcapkit.protocols.misc.pcapng.protocol import WireGuardKeyLabel from pcapkit.utilities.compat import StrEnum self.assertEqual(WireGuardKeyLabel.__bases__, (EnumLookup, StrEnum)) @@ -162,8 +162,8 @@ class HttpV2FlagsHierarchyTests(unittest.TestCase): hierarchy, re-parented at the root only. Each concrete subclass declares ``class Flags(FrameType.Flags):`` with no - base list of its own (see :mod:`pcapkit.protocols.schema.application. - httpv2`), so the root's base carries to every subclass without each being + base list of its own (see + :mod:`pcapkit.protocols.application.httpv2.schema`), so the root's base carries to every subclass without each being re-parented individually. Verified here at runtime rather than assumed from Python's MRO rules. """ @@ -172,14 +172,14 @@ def test_frame_type_flags_itself(self) -> None: import enum from pcapkit.corekit.enum import EnumLookup - from pcapkit.protocols.schema.application.httpv2 import FrameType + from pcapkit.protocols.application.httpv2.schema import FrameType self.assertEqual(FrameType.Flags.__bases__, (EnumLookup, enum.IntFlag)) self.assertIn(EnumLookup, FrameType.Flags.__mro__) def test_every_concrete_subclass_carries_it_transitively(self) -> None: from pcapkit.corekit.enum import EnumLookup - from pcapkit.protocols.schema.application.httpv2 import (ContinuationFrame, DataFrame, + from pcapkit.protocols.application.httpv2.schema import (ContinuationFrame, DataFrame, FrameType, HeadersFrame, PingFrame, PushPromiseFrame, SettingsFrame) @@ -221,35 +221,35 @@ def test_completion_get(self) -> None: self.assertIs(Completion.get('timeout'), Completion.TIMEOUT) def test_ftp_type_get(self) -> None: - from pcapkit.protocols.application.ftp import Type as FTPType + from pcapkit.protocols.application.ftp.protocol import Type as FTPType self.assertIs(FTPType.get('request'), FTPType.REQUEST) self.assertIs(FTPType.get('response'), FTPType.RESPONSE) def test_httpv1_type_get(self) -> None: - from pcapkit.protocols.application.httpv1 import Type as HTTPv1Type + from pcapkit.protocols.application.httpv1.protocol import Type as HTTPv1Type self.assertIs(HTTPv1Type.get('request'), HTTPv1Type.REQUEST) self.assertIs(HTTPv1Type.get('response'), HTTPv1Type.RESPONSE) def test_pdu_kind_get(self) -> None: - from pcapkit.protocols.application.ngap import PDUKind + from pcapkit.protocols.application.ngap.protocol import PDUKind self.assertIs(PDUKind.get('initiatingMessage'), PDUKind.INITIATING_MESSAGE) def test_packet_direction_get(self) -> None: - from pcapkit.protocols.misc.pcapng import PacketDirection + from pcapkit.protocols.misc.pcapng.protocol import PacketDirection self.assertIs(PacketDirection.get('INBOUND'), PacketDirection.INBOUND) self.assertIs(PacketDirection.get(0b10), PacketDirection.OUTBOUND) def test_packet_reception_get(self) -> None: - from pcapkit.protocols.misc.pcapng import PacketReception + from pcapkit.protocols.misc.pcapng.protocol import PacketReception self.assertIs(PacketReception.get('PROMISCUOUS'), PacketReception.PROMISCUOUS) def test_wireguard_key_label_get(self) -> None: - from pcapkit.protocols.misc.pcapng import WireGuardKeyLabel + from pcapkit.protocols.misc.pcapng.protocol import WireGuardKeyLabel self.assertIs(WireGuardKeyLabel.get('PRESHARED_KEY'), WireGuardKeyLabel.PRESHARED_KEY) @@ -331,7 +331,7 @@ def test_default_falls_back_to_a_registered_member(self) -> None: class CriticalityGetTests(unittest.TestCase): - """:class:`~pcapkit.protocols.application.ngap.Criticality` has no ``get`` + """:class:`~pcapkit.protocols.application.ngap.protocol.Criticality` has no ``get`` of its own (GitHub issue #923): an override would only convert the base's name-miss :exc:`KeyError` into a :exc:`ValueError`, a conversion #923's ruling retired. Every behaviour below is therefore the *inherited* @@ -345,7 +345,7 @@ def test_get_is_inherited_rather_than_overridden(self) -> None: :meth:`~pcapkit.corekit.enum.EnumLookup.get` itself, which is what the rest of this class exercises.""" from pcapkit.corekit.enum import EnumLookup - from pcapkit.protocols.application.ngap import Criticality + from pcapkit.protocols.application.ngap.protocol import Criticality self.assertNotIn('get', Criticality.__dict__) self.assertIsInstance(inspect.getattr_static(Criticality, 'get'), classmethod) @@ -353,14 +353,14 @@ def test_get_is_inherited_rather_than_overridden(self) -> None: inspect.getattr_static(EnumLookup, 'get')) def test_name_lookup(self) -> None: - from pcapkit.protocols.application.ngap import Criticality + from pcapkit.protocols.application.ngap.protocol import Criticality self.assertIs(Criticality.get('reject'), Criticality.reject) self.assertIs(Criticality.get('ignore'), Criticality.ignore) self.assertIs(Criticality.get('notify'), Criticality.notify) def test_value_lookup(self) -> None: - from pcapkit.protocols.application.ngap import Criticality + from pcapkit.protocols.application.ngap.protocol import Criticality self.assertIs(Criticality.get(2), Criticality.notify) @@ -369,7 +369,7 @@ def test_a_criticality_instance_resolves_to_itself(self) -> None: needed: the base's own ``cls(key)`` call covers it -- a ``Criticality`` is also an :class:`int` (it is an :class:`~aenum.IntEnum`), so the non-``str`` path hands back the identical canonical member.""" - from pcapkit.protocols.application.ngap import Criticality + from pcapkit.protocols.application.ngap.protocol import Criticality self.assertIs(Criticality.get(Criticality.reject), Criticality.reject) @@ -377,7 +377,7 @@ def test_case_sensitivity_is_unlike_transport_protocol(self) -> None: """Deliberately the opposite of ``TransportProtocol.get`` -- nothing here lower-cases, so an upper-cased spelling must be refused rather than folded. :exc:`KeyError`-shaped, per GitHub issue #923.""" - from pcapkit.protocols.application.ngap import Criticality + from pcapkit.protocols.application.ngap.protocol import Criticality with self.assertRaises(KeyError) as caught: Criticality.get('REJECT') @@ -395,7 +395,7 @@ def test_unresolved_name_raises_key_error_not_value_error(self) -> None: :mod:`pcapkit.utilities.exceptions`.""" from pcapkit.utilities.exceptions import EnumKeyError - from pcapkit.protocols.application.ngap import Criticality + from pcapkit.protocols.application.ngap.protocol import Criticality with self.assertRaises(EnumKeyError) as caught: Criticality.get('NoSuchMember') @@ -410,7 +410,7 @@ def test_unresolved_value_still_raises_via_missing(self) -> None: issue #923's "no builtin exceptions" half.""" from pcapkit.utilities.exceptions import EnumValueError - from pcapkit.protocols.application.ngap import Criticality + from pcapkit.protocols.application.ngap.protocol import Criticality with self.assertRaises(EnumValueError) as caught: Criticality.get(3) @@ -423,7 +423,7 @@ def test_default_is_honoured_by_the_inherited_base(self) -> None: ``default`` verbatim, so the base has to answer identically: a member-valued default resolves, and one naming no registered value is not honoured.""" - from pcapkit.protocols.application.ngap import Criticality + from pcapkit.protocols.application.ngap.protocol import Criticality self.assertIs(Criticality.get('NoSuchMember', default=Criticality.ignore), Criticality.ignore) @@ -476,7 +476,7 @@ def test_transport_protocol_does_not_grow(self) -> None: def test_criticality_does_not_grow(self) -> None: before_names, before_values, after_names, after_values = self._sizes_before_and_after( - 'from pcapkit.protocols.application.ngap import Criticality', + 'from pcapkit.protocols.application.ngap.protocol import Criticality', 'Criticality', "cls.get('reject')", ) diff --git a/tests/corekit/test_enum_lookup_reparent_930_unit.py b/tests/corekit/test_enum_lookup_reparent_930_unit.py index 5d47096113..cc16f6e5f7 100644 --- a/tests/corekit/test_enum_lookup_reparent_930_unit.py +++ b/tests/corekit/test_enum_lookup_reparent_930_unit.py @@ -5,8 +5,8 @@ GitHub pull request #921 re-parented every other non-registry enumeration and left these alone, because the files holding them were open under other pull requests: :mod:`pcapkit.const.ftp.command` (``CommandType``, ``ConformanceRequirement``) under #913, -and :mod:`pcapkit.protocols.internet.esp` (``ESPStatus``) plus -:mod:`pcapkit.protocols.internet.mh` (``FastBindingAcknowledgmentStatus``, +and :mod:`pcapkit.protocols.internet.esp.protocol` (``ESPStatus``) plus +:mod:`pcapkit.protocols.internet.mh.protocol` (``FastBindingAcknowledgmentStatus``, ``IPv6AddressPrefixCode``, ``LMAAddressCode``, ``LocalizedRoutingStatus``) under #904. This module pins that they derive from the base, so that every non-registry enumeration is inside the hierarchy and none is outside it. @@ -131,7 +131,7 @@ def test_esp_status(self) -> None: import enum from pcapkit.corekit.enum import EnumLookup - from pcapkit.protocols.internet.esp import ESPStatus + from pcapkit.protocols.internet.esp.protocol import ESPStatus self.assertEqual(ESPStatus.__bases__, (EnumLookup, enum.IntEnum)) self.assertIn(EnumLookup, ESPStatus.__mro__) @@ -145,7 +145,7 @@ def test_fast_binding_acknowledgment_status(self) -> None: from aenum import IntEnum from pcapkit.corekit.enum import EnumLookup - from pcapkit.protocols.internet.mh import FastBindingAcknowledgmentStatus + from pcapkit.protocols.internet.mh.protocol import FastBindingAcknowledgmentStatus self.assertEqual(FastBindingAcknowledgmentStatus.__bases__, (EnumLookup, IntEnum)) self.assertIn(EnumLookup, FastBindingAcknowledgmentStatus.__mro__) @@ -157,7 +157,7 @@ def test_ipv6_address_prefix_code(self) -> None: from aenum import IntEnum from pcapkit.corekit.enum import EnumLookup - from pcapkit.protocols.internet.mh import IPv6AddressPrefixCode + from pcapkit.protocols.internet.mh.protocol import IPv6AddressPrefixCode self.assertEqual(IPv6AddressPrefixCode.__bases__, (EnumLookup, IntEnum)) self.assertIn(EnumLookup, IPv6AddressPrefixCode.__mro__) @@ -168,7 +168,7 @@ def test_localized_routing_status(self) -> None: from aenum import IntEnum from pcapkit.corekit.enum import EnumLookup - from pcapkit.protocols.internet.mh import LocalizedRoutingStatus + from pcapkit.protocols.internet.mh.protocol import LocalizedRoutingStatus self.assertEqual(LocalizedRoutingStatus.__bases__, (EnumLookup, IntEnum)) self.assertIn(EnumLookup, LocalizedRoutingStatus.__mro__) @@ -179,7 +179,7 @@ def test_lma_address_code(self) -> None: from aenum import IntEnum from pcapkit.corekit.enum import EnumLookup - from pcapkit.protocols.internet.mh import LMAAddressCode + from pcapkit.protocols.internet.mh.protocol import LMAAddressCode self.assertEqual(LMAAddressCode.__bases__, (EnumLookup, IntEnum)) self.assertIn(EnumLookup, LMAAddressCode.__mro__) @@ -204,8 +204,8 @@ def test_a_battery_of_lookups_grows_no_registry(self) -> None: mistake for growth. """ from pcapkit.const.ftp.command import CommandType, ConformanceRequirement - from pcapkit.protocols.internet.esp import ESPStatus - from pcapkit.protocols.internet.mh import (FastBindingAcknowledgmentStatus, + from pcapkit.protocols.internet.esp.protocol import ESPStatus + from pcapkit.protocols.internet.mh.protocol import (FastBindingAcknowledgmentStatus, IPv6AddressPrefixCode, LMAAddressCode, LocalizedRoutingStatus) @@ -249,7 +249,7 @@ def test_conformance_requirement(self) -> None: self.assertIs(ConformanceRequirement.get(1), ConformanceRequirement.M) def test_esp_status(self) -> None: - from pcapkit.protocols.internet.esp import ESPStatus + from pcapkit.protocols.internet.esp.protocol import ESPStatus self.assertIs(ESPStatus.get('DECRYPTED'), ESPStatus.DECRYPTED) self.assertIs(ESPStatus.get(0), ESPStatus.DECRYPTED) @@ -257,7 +257,7 @@ def test_esp_status(self) -> None: self.assertIs(ESPStatus.get(5), ESPStatus.UNSUPPORTED) def test_fast_binding_acknowledgment_status(self) -> None: - from pcapkit.protocols.internet.mh import FastBindingAcknowledgmentStatus + from pcapkit.protocols.internet.mh.protocol import FastBindingAcknowledgmentStatus self.assertIs( FastBindingAcknowledgmentStatus.get('Fast_Binding_Update_accepted'), @@ -266,20 +266,20 @@ def test_fast_binding_acknowledgment_status(self) -> None: FastBindingAcknowledgmentStatus.Fast_Binding_Update_accepted) def test_ipv6_address_prefix_code(self) -> None: - from pcapkit.protocols.internet.mh import IPv6AddressPrefixCode + from pcapkit.protocols.internet.mh.protocol import IPv6AddressPrefixCode self.assertIs(IPv6AddressPrefixCode.get('Old_Care_of_Address'), IPv6AddressPrefixCode.Old_Care_of_Address) self.assertIs(IPv6AddressPrefixCode.get(1), IPv6AddressPrefixCode.Old_Care_of_Address) def test_localized_routing_status(self) -> None: - from pcapkit.protocols.internet.mh import LocalizedRoutingStatus + from pcapkit.protocols.internet.mh.protocol import LocalizedRoutingStatus self.assertIs(LocalizedRoutingStatus.get('Success'), LocalizedRoutingStatus.Success) self.assertIs(LocalizedRoutingStatus.get(0), LocalizedRoutingStatus.Success) def test_lma_address_code(self) -> None: - from pcapkit.protocols.internet.mh import LMAAddressCode + from pcapkit.protocols.internet.mh.protocol import LMAAddressCode self.assertIs(LMAAddressCode.get('Reserved'), LMAAddressCode.Reserved) self.assertIs(LMAAddressCode.get(0), LMAAddressCode.Reserved) @@ -318,7 +318,7 @@ def test_conformance_requirement(self) -> None: self.assertIsInstance(value_miss.exception, EnumValueError) def test_esp_status(self) -> None: - from pcapkit.protocols.internet.esp import ESPStatus + from pcapkit.protocols.internet.esp.protocol import ESPStatus from pcapkit.utilities.exceptions import EnumKeyError, EnumValueError with self.assertRaises(KeyError) as name_miss: @@ -333,7 +333,7 @@ def test_fast_binding_acknowledgment_status(self) -> None: """Resolves through the base's own ``get`` (GitHub issue #935) -- the same mechanism :meth:`test_localized_routing_status` below exercises.""" - from pcapkit.protocols.internet.mh import FastBindingAcknowledgmentStatus + from pcapkit.protocols.internet.mh.protocol import FastBindingAcknowledgmentStatus from pcapkit.utilities.exceptions import EnumKeyError, EnumValueError with self.assertRaises(KeyError) as name_miss: @@ -345,7 +345,7 @@ def test_fast_binding_acknowledgment_status(self) -> None: self.assertIsInstance(value_miss.exception, EnumValueError) def test_ipv6_address_prefix_code(self) -> None: - from pcapkit.protocols.internet.mh import IPv6AddressPrefixCode + from pcapkit.protocols.internet.mh.protocol import IPv6AddressPrefixCode from pcapkit.utilities.exceptions import EnumKeyError, EnumValueError with self.assertRaises(KeyError) as name_miss: @@ -361,7 +361,7 @@ def test_localized_routing_status(self) -> None: :exc:`EnumValueError` directly -- the base's ``get`` re-raises it unchanged rather than wrapping it, since it is already a :exc:`~pcapkit.utilities.exceptions.BaseError`.""" - from pcapkit.protocols.internet.mh import LocalizedRoutingStatus + from pcapkit.protocols.internet.mh.protocol import LocalizedRoutingStatus from pcapkit.utilities.exceptions import EnumKeyError, EnumValueError with self.assertRaises(KeyError) as name_miss: @@ -373,7 +373,7 @@ def test_localized_routing_status(self) -> None: self.assertIsInstance(value_miss.exception, EnumValueError) def test_lma_address_code(self) -> None: - from pcapkit.protocols.internet.mh import LMAAddressCode + from pcapkit.protocols.internet.mh.protocol import LMAAddressCode from pcapkit.utilities.exceptions import EnumKeyError, EnumValueError with self.assertRaises(KeyError) as name_miss: @@ -419,7 +419,7 @@ def test_get_is_quiet_on_both_classes(self) -> None: """The behaviour GitHub issue #930 pins: ``get`` is quiet, matching the base, where without the fix it is loud (see the class docstring).""" - from pcapkit.protocols.internet.mh import (FastBindingAcknowledgmentStatus, + from pcapkit.protocols.internet.mh.protocol import (FastBindingAcknowledgmentStatus, IPv6AddressPrefixCode) from pcapkit.utilities.exceptions import EnumKeyError @@ -436,7 +436,7 @@ def test_get_is_quiet_on_both_classes(self) -> None: def test_get_all_is_new_and_quiet_too(self) -> None: """``get_all`` exists on both classes, and the miss it reaches through this same ``get`` is quiet for the same reason ``get`` itself is.""" - from pcapkit.protocols.internet.mh import (FastBindingAcknowledgmentStatus, + from pcapkit.protocols.internet.mh.protocol import (FastBindingAcknowledgmentStatus, IPv6AddressPrefixCode) from pcapkit.utilities.exceptions import EnumKeyError @@ -466,7 +466,7 @@ def test_get_with_unusable_default_is_quiet_too(self) -> None: ``TypeError`` on the second positional argument instead (GitHub issue #935). """ - from pcapkit.protocols.internet.mh import (FastBindingAcknowledgmentStatus, + from pcapkit.protocols.internet.mh.protocol import (FastBindingAcknowledgmentStatus, IPv6AddressPrefixCode) from pcapkit.utilities.exceptions import EnumKeyError @@ -501,8 +501,8 @@ class EachInheritsTheBareClassmethodTests(unittest.TestCase): def test_each_inherits_the_bare_classmethod(self) -> None: from pcapkit.const.ftp.command import CommandType, ConformanceRequirement - from pcapkit.protocols.internet.esp import ESPStatus - from pcapkit.protocols.internet.mh import (FastBindingAcknowledgmentStatus, + from pcapkit.protocols.internet.esp.protocol import ESPStatus + from pcapkit.protocols.internet.mh.protocol import (FastBindingAcknowledgmentStatus, IPv6AddressPrefixCode, LMAAddressCode, LocalizedRoutingStatus) @@ -544,8 +544,8 @@ class NonCanonicalKeyConvergenceTests(unittest.TestCase): def test_none_and_float_keys_all_raise_enumvalueerror(self) -> None: from pcapkit.const.ftp.command import CommandType, ConformanceRequirement - from pcapkit.protocols.internet.esp import ESPStatus - from pcapkit.protocols.internet.mh import (FastBindingAcknowledgmentStatus, + from pcapkit.protocols.internet.esp.protocol import ESPStatus + from pcapkit.protocols.internet.mh.protocol import (FastBindingAcknowledgmentStatus, IPv6AddressPrefixCode, LMAAddressCode, LocalizedRoutingStatus) from pcapkit.utilities.exceptions import EnumValueError diff --git a/tests/corekit/test_field_roundtrip_unit.py b/tests/corekit/test_field_roundtrip_unit.py index bee384538d..bc4a46a412 100644 --- a/tests/corekit/test_field_roundtrip_unit.py +++ b/tests/corekit/test_field_roundtrip_unit.py @@ -127,8 +127,8 @@ def field_cases() -> 'tuple[FieldCase, ...]': # pylint: disable=too-many-locals from pcapkit.corekit.fields import misc as fmisc from pcapkit.corekit.fields import numbers as fnum from pcapkit.corekit.fields import strings as fstr - from pcapkit.protocols.misc.raw import Raw - from pcapkit.protocols.schema.schema import Schema, schema_final + from pcapkit.protocols.misc.raw.protocol import Raw + from pcapkit.protocols.schema import Schema, schema_final cases = [] # type: list[FieldCase] @@ -390,7 +390,7 @@ def schema_cases() -> 'tuple[SchemaCase, ...]': from pcapkit.corekit.fields import misc as fmisc from pcapkit.corekit.fields import numbers as fnum from pcapkit.corekit.fields import strings as fstr - from pcapkit.protocols.schema.schema import Schema, schema_final + from pcapkit.protocols.schema import Schema, schema_final def forward() -> 'Any': @schema_final @@ -633,13 +633,15 @@ def test_every_schema_bitfield_covers_every_bit(self) -> None: import importlib import pkgutil - import pcapkit.protocols.schema as package + import pcapkit.protocols as package from pcapkit.corekit.fields.misc import ConditionalField, ForwardMatchField from pcapkit.corekit.fields.strings import BitField - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema total, uncovered = 0, [] for info in pkgutil.walk_packages(package.__path__, f'{package.__name__}.'): + if not info.name.endswith('.schema'): + continue module = importlib.import_module(info.name) for obj in vars(module).values(): if not (inspect.isclass(obj) and issubclass(obj, Schema) and obj.__module__ == module.__name__): diff --git a/tests/corekit/test_fields_byteorder_1519_unit.py b/tests/corekit/test_fields_byteorder_1519_unit.py index c52edf83a5..5dc9fa7c85 100644 --- a/tests/corekit/test_fields_byteorder_1519_unit.py +++ b/tests/corekit/test_fields_byteorder_1519_unit.py @@ -6,8 +6,8 @@ ``__packet__``: a superset that gives the frame header the same answer on every packet the library hands it, since :meth:`Frame.pack -` and :meth:`Frame.unpack -` always seed ``byteorder``. +` and :meth:`Frame.unpack +` always seed ``byteorder``. This pins the helper, its ``__packet__`` fallback, and that both schemas use it. GitHub issue #1711 moved the helper out of the schemas, with no re-export at @@ -81,8 +81,8 @@ def test_callback_sets_the_field_byte_order(self) -> None: self.assertEqual(field._byteorder, expected) # pylint: disable=protected-access def test_frame_and_pcapng_use_the_shared_helper(self) -> None: - frame = importlib.import_module('pcapkit.protocols.schema.misc.pcap.frame') - pcapng = importlib.import_module('pcapkit.protocols.schema.misc.pcapng') + frame = importlib.import_module('pcapkit.protocols.misc.pcap.frame.schema') + pcapng = importlib.import_module('pcapkit.protocols.misc.pcapng.schema') shared = self._shared() self.assertIs(frame.byteorder_callback, shared.byteorder_callback) @@ -94,7 +94,7 @@ def test_frame_and_pcapng_use_the_shared_helper(self) -> None: shared.byteorder_callback) def test_frame_header_reads_the_byte_order_it_is_given(self) -> None: - frame = importlib.import_module('pcapkit.protocols.schema.misc.pcap.frame') + frame = importlib.import_module('pcapkit.protocols.misc.pcap.frame.schema') raw = struct.pack('>IIII' if OTHER == 'big' else ' None: def test_the_schema_misc_byteorder_path_does_not_import(self) -> None: """#1711: the move leaves no re-export at ``pcapkit.protocols.schema.misc.byteorder``.""" + # The schema tree the path sat in went as well (#2534), so the import + # fails at its first missing package. with self.assertRaises(ModuleNotFoundError) as ctx: importlib.import_module(OLD_PATH) - self.assertEqual(ctx.exception.name, OLD_PATH) - - package = importlib.import_module(OLD_PATH.rpartition('.')[0]) - self.assertFalse(hasattr(package, 'byteorder')) + self.assertTrue(f'{OLD_PATH}.'.startswith(f'{ctx.exception.name}.'), ctx.exception.name) def test_the_module_imports_nothing_from_foundation_or_protocols(self) -> None: """``corekit`` sits below both, so the helper may not reach up to either.""" diff --git a/tests/corekit/test_fields_call_new_self_2173_unit.py b/tests/corekit/test_fields_call_new_self_2173_unit.py index 7364146c20..4789154111 100644 --- a/tests/corekit/test_fields_call_new_self_2173_unit.py +++ b/tests/corekit/test_fields_call_new_self_2173_unit.py @@ -17,7 +17,7 @@ from pcapkit.corekit.fields.collections import ListField from pcapkit.corekit.fields.misc import SchemaField from pcapkit.corekit.fields.numbers import UInt8Field, UInt16Field -from pcapkit.protocols.schema.schema import Schema +from pcapkit.protocols.schema import Schema if TYPE_CHECKING: from typing import Any diff --git a/tests/corekit/test_fields_collections.py b/tests/corekit/test_fields_collections.py index 98e4369e7a..5e21047220 100644 --- a/tests/corekit/test_fields_collections.py +++ b/tests/corekit/test_fields_collections.py @@ -27,7 +27,7 @@ def setUp(self) -> None: from pcapkit.corekit.fields.collections import OptionField from pcapkit.corekit.fields.numbers import UInt16Field from pcapkit.corekit.fields.strings import BytesField, PaddingField - from pcapkit.protocols.schema.schema import Schema, schema_final + from pcapkit.protocols.schema import Schema, schema_final #: Every schema unpacked while parsing an option list, in order. self.unpacked = [] # type: list[str] @@ -150,7 +150,7 @@ def _options_for(self, base: 'Any', body: 'Any', end: 'Any') -> 'Any': """ from pcapkit.corekit.fields.collections import OptionField from pcapkit.corekit.fields.strings import PaddingField - from pcapkit.protocols.schema.schema import Schema, schema_final + from pcapkit.protocols.schema import Schema, schema_final registry = collections.defaultdict(lambda: body, {1: body, 0: end}) @@ -170,7 +170,7 @@ def _type_second(self) -> 'Any': """A base schema whose type field is its *second* field.""" from pcapkit.corekit.fields.numbers import UInt16Field from pcapkit.corekit.fields.strings import BytesField - from pcapkit.protocols.schema.schema import Schema, schema_final + from pcapkit.protocols.schema import Schema, schema_final unpacked = self.unpacked @@ -207,7 +207,7 @@ def _type_first(self, callable_length: 'bool' = False) -> 'Any': """ from pcapkit.corekit.fields.numbers import UInt16Field from pcapkit.corekit.fields.strings import BytesField - from pcapkit.protocols.schema.schema import Schema, schema_final + from pcapkit.protocols.schema import Schema, schema_final unpacked = self.unpacked kind_field = UInt16Field(length=lambda pkt: 2) if callable_length else UInt16Field() @@ -291,7 +291,7 @@ def setUp(self) -> None: def test_no_declaration_in_the_package_falls_back(self) -> None: import pcapkit.all # noqa: F401 (realises every schema declaration) from pcapkit.corekit.fields.collections import OptionField - from pcapkit.protocols.schema.schema import Schema + from pcapkit.protocols.schema import Schema def subclasses(cls: 'Any') -> 'Any': for sub in cls.__subclasses__(): @@ -352,7 +352,7 @@ def test_a_length_callback_is_honoured(self) -> None: from pcapkit.corekit.fields.collections import ListField from pcapkit.corekit.fields.misc import SchemaField from pcapkit.corekit.fields.numbers import UInt8Field - from pcapkit.protocols.schema.schema import Schema, schema_final + from pcapkit.protocols.schema import Schema, schema_final recorded = [] # type: list[int] @@ -390,7 +390,7 @@ def test_a_callback_is_honoured(self) -> None: from pcapkit.corekit.fields.collections import ListField from pcapkit.corekit.fields.misc import SchemaField from pcapkit.corekit.fields.numbers import UInt8Field - from pcapkit.protocols.schema.schema import Schema, schema_final + from pcapkit.protocols.schema import Schema, schema_final seen = [] # type: list[str] diff --git a/tests/corekit/test_fields_collections_default_name_1491_unit.py b/tests/corekit/test_fields_collections_default_name_1491_unit.py index dfd9b6e6ea..845872c9e7 100644 --- a/tests/corekit/test_fields_collections_default_name_1491_unit.py +++ b/tests/corekit/test_fields_collections_default_name_1491_unit.py @@ -34,7 +34,7 @@ def test_list_field(self) -> None: def test_option_field_subclasses(self) -> None: from pcapkit.corekit.fields.collections import OptionField - from pcapkit.protocols.schema.transport.sctp import ChunkListField, Parameter + from pcapkit.protocols.transport.sctp.schema import ChunkListField, Parameter for cls, name in ((OptionField, '