Source code for pcapkit.protocols.transport.udp

# -*- coding: utf-8 -*-
"""user datagram protocol

:mod:`pcapkit.protocols.transport.udp` contains
:class:`~pcapkit.protocols.transport.udp.UDP` only,
which implements extractor for User Datagram Protocol
(UDP) [*]_, whose structure is described as below:

======= ========= ===================== ===============================
Octets      Bits        Name                    Description
======= ========= ===================== ===============================
  0           0   ``udp.srcport``             Source Port
  2          16   ``udp.dstport``             Destination Port
  4          32   ``udp.len``                 Length (header includes)
  6          48   ``udp.checksum``            Checksum
======= ========= ===================== ===============================

.. [*] https://en.wikipedia.org/wiki/User_Datagram_Protocol

"""
from pcapkit.const.reg.transtype import TransType
from pcapkit.protocols.transport.transport import Transport

__all__ = ['UDP']


[docs]class UDP(Transport): """This class implements User Datagram Protocol.""" ########################################################################## # Properties. ########################################################################## @property def name(self): """Name of current protocol. :rtype: Literal['User Datagram Protocol'] """ return 'User Datagram Protocol' @property def length(self): """Header length of current protocol. :rtype: Literal[8] """ return 8 @property def src(self): """Source port. :rtype: int """ return self._info.src # pylint: disable=E1101 @property def dst(self): """Destination port. :rtype: int """ return self._info.dst # pylint: disable=E1101 ########################################################################## # Methods. ##########################################################################
[docs] def read(self, length=None, **kwargs): # pylint: disable=unused-argument """Read User Datagram Protocol (UDP). Structure of UDP header [:rfc:`768`]:: 0 7 8 15 16 23 24 31 +--------+--------+--------+--------+ | Source | Destination | | Port | Port | +--------+--------+--------+--------+ | | | | Length | Checksum | +--------+--------+--------+--------+ | | data octets ... +---------------- ... Args: length (Optional[int]): Length of packet data. Keyword Args: **kwargs: Arbitrary keyword arguments. Returns: DataType_UDP: Parsed packet data. """ if length is None: length = len(self) _srcp = self._read_unpack(2) _dstp = self._read_unpack(2) _tlen = self._read_unpack(2) _csum = self._read_fileng(2) udp = dict( srcport=_srcp, dstport=_dstp, len=_tlen, checksum=_csum, ) length = udp['len'] - 8 udp['packet'] = self._read_packet(header=8, payload=length) return self._decode_next_layer(udp, None, length)
[docs] def make(self, **kwargs): """Make (construct) packet data. Keyword Args: **kwargs: Arbitrary keyword arguments. Returns: bytes: Constructed packet data. """ raise NotImplementedError
########################################################################## # Data models. ##########################################################################
[docs] def __length_hint__(self): """Return an estimated length for the object. :rtype: Literal[8] """ return 8
[docs] @classmethod def __index__(cls): # pylint: disable=invalid-index-returned """Numeral registry index of the protocol. Returns: pcapkit.const.reg.transtype.TransType: Numeral registry index of the protocol in `IANA`_. .. _IANA: https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml """ return TransType(17)