pypcapkit 1.1.0.post1__cp311-none-any.whl → 1.1.1__cp311-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
pcapkit/__init__.py CHANGED
@@ -123,4 +123,4 @@ __all__ = [
123
123
  ]
124
124
 
125
125
  #: version number
126
- __version__ = '1.1.0.post1'
126
+ __version__ = '1.1.1'
@@ -93,28 +93,28 @@ class AppType(StrEnum):
93
93
  return '%s [%d - %s]' % (self.svc, self.port, self.proto.name)
94
94
 
95
95
  def __int__(self) -> 'int':
96
- return self.opt_value
96
+ return self.port
97
97
 
98
98
  def __lt__(self, other: 'AppType') -> 'bool':
99
- return self.opt_value < other
99
+ return self.port < other
100
100
 
101
101
  def __gt__(self, other: 'AppType') -> 'bool':
102
- return self.opt_value > other
102
+ return self.port > other
103
103
 
104
104
  def __le__(self, other: 'AppType') -> 'bool':
105
- return self.opt_value <= other
105
+ return self.port <= other
106
106
 
107
107
  def __ge__(self, other: 'AppType') -> 'bool':
108
- return self.opt_value >= other
108
+ return self.port >= other
109
109
 
110
110
  def __eq__(self, other: 'Any') -> 'bool':
111
- return self.opt_value == other
111
+ return self.port == other
112
112
 
113
113
  def __ne__(self, other: 'Any') -> 'bool':
114
- return self.opt_value != other
114
+ return self.port != other
115
115
 
116
116
  def __hash__(self) -> 'int':
117
- return hash(self.opt_value)
117
+ return hash(self.port)
118
118
 
119
119
  #: - [TCP] Reserved
120
120
  #: - [UDP] Reserved
@@ -22916,6 +22916,15 @@ class AppType(StrEnum):
22916
22916
  #: [UDP] Port for copy discovery
22917
22917
  copy_disc: 'AppType' = 8445, 'copy-disc', TransportProtocol.get('udp')
22918
22918
 
22919
+ #: [TCP] Matrix Federation Protocol
22920
+ matrix_fed: 'AppType' = 8448, 'matrix-fed', TransportProtocol.get('tcp')
22921
+
22922
+ #: [UDP] Reserved
22923
+ reserved_8448: 'AppType' = 8448, 'reserved', TransportProtocol.get('udp')
22924
+
22925
+ #: [N/A] Unassigned
22926
+ unassigned_8449: 'AppType' = 8449, 'unassigned', TransportProtocol.get('undefined')
22927
+
22919
22928
  #: - [TCP] npmp
22920
22929
  #: - [UDP] npmp
22921
22930
  npmp: 'AppType' = 8450, 'npmp', TransportProtocol.get('tcp') | TransportProtocol.get('udp')
@@ -28679,8 +28688,9 @@ class AppType(StrEnum):
28679
28688
  #: [TCP] Topology Discovery
28680
28689
  kiwin: 'AppType' = -1, 'kiwin', TransportProtocol.get('tcp')
28681
28690
 
28682
- #: [UDP] Discovery in KNX IoT Point API
28683
- knx: 'AppType' = -1, 'knx', TransportProtocol.get('udp')
28691
+ #: - [TCP] KNX Discovery Protocol
28692
+ #: - [UDP] Discovery in KNX IoT Point API
28693
+ knx: 'AppType' = -1, 'knx', TransportProtocol.get('tcp') | TransportProtocol.get('udp')
28684
28694
 
28685
28695
  #: [N/A] Kabira Transaction Platform
28686
28696
  ktp: 'AppType' = -1, 'ktp', TransportProtocol.get('undefined')
@@ -28866,6 +28876,9 @@ class AppType(StrEnum):
28866
28876
  #: [N/A] Mental Ray for Maya
28867
28877
  mi_raysat: 'AppType' = -1, 'mi-raysat', TransportProtocol.get('undefined')
28868
28878
 
28879
+ #: [TCP] A protocol for controlling a microscope
28880
+ microdeep: 'AppType' = -1, 'microdeep', TransportProtocol.get('tcp')
28881
+
28869
28882
  #: [TCP] Protocol for connected accessories
28870
28883
  mieleacs: 'AppType' = -1, 'mieleacs', TransportProtocol.get('tcp')
28871
28884
 
@@ -31312,7 +31325,7 @@ class AppType(StrEnum):
31312
31325
  if 8434 <= value <= 8441:
31313
31326
  #: [N/A] Unassigned
31314
31327
  return extend_enum(cls, 'unassigned_%d' % value, value, 'unassigned', TransportProtocol.get('undefined'))
31315
- if 8446 <= value <= 8449:
31328
+ if 8446 <= value <= 8447:
31316
31329
  #: [N/A] Unassigned
31317
31330
  return extend_enum(cls, 'unassigned_%d' % value, value, 'unassigned', TransportProtocol.get('undefined'))
31318
31331
  if 8451 <= value <= 8456:
@@ -115,7 +115,7 @@ class ListField(_Field[List[_TL]], Generic[_TL]):
115
115
  raise FieldValueError(f'Field {self.name} has invalid value.')
116
116
  return b''.join(temp)
117
117
 
118
- def unpack(self, buffer: 'bytes | IO[bytes]', packet: 'dict[str, Any]') -> 'bytes | list[_TL]': # type: ignore[override]
118
+ def unpack(self, buffer: 'bytes | IO[bytes]', packet: 'dict[str, Any]') -> 'bytes | list[_TL]':
119
119
  """Unpack field value from :obj:`bytes`.
120
120
 
121
121
  Args:
@@ -318,7 +318,7 @@ class Info(Mapping[str, VT], Generic[VT], metaclass=InfoMeta):
318
318
  else:
319
319
  temp.append(f'{out_key}={value!r}')
320
320
  args = ', '.join(temp)
321
- return f'{type(self).__name__}({args})'
321
+ return f'<{type(self).__name__} {args}>'
322
322
 
323
323
  def __len__(self) -> 'int':
324
324
  return len(self.__dict__)
pcapkit/dumpkit/common.py CHANGED
@@ -21,6 +21,7 @@ import aenum
21
21
 
22
22
  from pcapkit.corekit.infoclass import Info
23
23
  from pcapkit.corekit.multidict import MultiDict, OrderedMultiDict
24
+ from pcapkit.protocols.schema.schema import Schema
24
25
  from pcapkit.utilities.logging import logger
25
26
 
26
27
  __all__ = ['make_dumper']
@@ -60,7 +61,7 @@ def make_dumper(output: 'Type[Dumper]') -> 'Type[Dumper]':
60
61
  return str(o)
61
62
  if isinstance(o, datetime.timedelta):
62
63
  return o.total_seconds()
63
- if isinstance(o, Info):
64
+ if isinstance(o, (Info, Schema)):
64
65
  return o.to_dict()
65
66
  if isinstance(o, (ipaddress.IPv4Address, ipaddress.IPv6Address)):
66
67
  return str(o)
@@ -24,9 +24,12 @@ from pcapkit.dumpkit.common import make_dumper
24
24
  from pcapkit.foundation.engines.pcap import PCAP as PCAP_Engine
25
25
  from pcapkit.foundation.engines.pcapng import PCAPNG as PCAPNG_Engine
26
26
  from pcapkit.foundation.reassembly import ReassemblyManager
27
+ from pcapkit.foundation.reassembly.data import ReassemblyData
27
28
  from pcapkit.foundation.traceflow import TraceFlowManager
29
+ from pcapkit.foundation.traceflow.data import TraceFlowData
28
30
  from pcapkit.utilities.exceptions import (CallableError, FileNotFound, FormatError, IterableError,
29
31
  UnsupportedCall, stacklevel)
32
+ from pcapkit.utilities.logging import logger
30
33
  from pcapkit.utilities.warnings import EngineWarning, FormatWarning, warn
31
34
 
32
35
  if TYPE_CHECKING:
@@ -40,8 +43,6 @@ if TYPE_CHECKING:
40
43
  from typing_extensions import Literal
41
44
 
42
45
  from pcapkit.foundation.engines.engine import Engine
43
- from pcapkit.foundation.reassembly.data import ReassemblyData
44
- from pcapkit.foundation.traceflow.data import TraceFlowData
45
46
  from pcapkit.protocols.misc.pcap.frame import Frame
46
47
  from pcapkit.protocols.misc.pcapng import PCAPNG
47
48
  from pcapkit.protocols.protocol import Protocol
@@ -208,7 +209,7 @@ class Extractor(Generic[P]):
208
209
 
209
210
  Raises:
210
211
  UnsupportedCall: If :attr:`self._flag_d <pcapkit.foundation.extraction.Extractor._flag_d>`
211
- is :data:`True`, as storing frame data is disabled.
212
+ is :data:`False`, as storing frame data is disabled.
212
213
 
213
214
  """
214
215
  if self._flag_d:
@@ -219,25 +220,41 @@ class Extractor(Generic[P]):
219
220
  def reassembly(self) -> 'ReassemblyData':
220
221
  """Frame record for reassembly.
221
222
 
222
- * ``ipv4`` -- tuple of TCP payload fragment (:term:`reasm.ipv4.datagram`)
223
- * ``ipv6`` -- tuple of TCP payload fragment (:term:`reasm.ipv6.datagram`)
223
+ * ``ipv4`` -- tuple of IPv4 payload fragment (:term:`reasm.ipv4.datagram`)
224
+ * ``ipv6`` -- tuple of IPv6 payload fragment (:term:`reasm.ipv6.datagram`)
224
225
  * ``tcp`` -- tuple of TCP payload fragment (:term:`reasm.tcp.datagram`)
225
226
 
227
+ Raises:
228
+ UnsupportedCall: If :attr:`self._flag_r <pcapkit.foundation.extraction.Extractor._flag_r>`
229
+ is :data:`False`, as reassembly is disabled.
230
+
226
231
  """
227
- data = ReassemblyData(
228
- ipv4=tuple(self._reasm.ipv4.datagram) if self._ipv4 else None,
229
- ipv6=tuple(self._reasm.ipv6.datagram) if self._ipv6 else None,
230
- tcp=tuple(self._reasm.tcp.datagram) if self._tcp else None,
231
- )
232
- return data
232
+ if self._flag_r:
233
+ data = ReassemblyData(
234
+ ipv4=tuple(self._reasm.ipv4.datagram) if self._ipv4 else None,
235
+ ipv6=tuple(self._reasm.ipv6.datagram) if self._ipv6 else None,
236
+ tcp=tuple(self._reasm.tcp.datagram) if self._tcp else None,
237
+ )
238
+ return data
239
+ raise UnsupportedCall("'Extractor(reassembly=False)' object has no attribute 'reassembly'")
233
240
 
234
241
  @property
235
242
  def trace(self) -> 'TraceFlowData':
236
- """Index table for traced flow."""
237
- data = TraceFlowData(
238
- tcp=tuple(self._trace.tcp.index) if self._tcp else None,
239
- )
240
- return data
243
+ """Index table for traced flow.
244
+
245
+ * ``tcp`` -- tuple of TCP flows (:term:`trace.tcp.index`)
246
+
247
+ Raises:
248
+ UnsupportedCall: If :attr:`self._flag_t <pcapkit.foundation.extraction.Extractor._flag_t>`
249
+ is :data:`False`, as flow tracing is disabled.
250
+
251
+ """
252
+ if self._flag_t:
253
+ data = TraceFlowData(
254
+ tcp=tuple(self._trace.tcp.index) if self._tcp else None,
255
+ )
256
+ return data
257
+ raise UnsupportedCall("'Extractor(trace=False)' object has no attribute 'trace'")
241
258
 
242
259
  @property
243
260
  def engine(self) -> 'Engine':
@@ -536,10 +553,11 @@ class Extractor(Generic[P]):
536
553
  trace_byteorder: output file byte order
537
554
  trace_nanosecond: output nanosecond-resolution file flag
538
555
 
539
- ip: if record data for IPv4 & IPv6 reassembly
540
- ipv4: if perform IPv4 reassembly
541
- ipv6: if perform IPv6 reassembly
556
+ ip: if record data for IPv4 & IPv6 reassembly (must be used with ``reassembly=True``)
557
+ ipv4: if perform IPv4 reassembly (must be used with ``reassembly=True``)
558
+ ipv6: if perform IPv6 reassembly (must be used with ``reassembly=True``)
542
559
  tcp: if perform TCP reassembly and/or flow tracing
560
+ (must be used with ``reassembly=True`` or ``trace=True``)
543
561
 
544
562
  Warns:
545
563
  FormatWarning: Warns under following circumstances:
@@ -599,6 +617,13 @@ class Extractor(Generic[P]):
599
617
  from pcapkit.foundation.reassembly.ipv6 import IPv6 as IPv6_Reassembly
600
618
  from pcapkit.foundation.reassembly.tcp import TCP as TCP_Reassembly
601
619
 
620
+ if self._ipv4:
621
+ logger.info('IPv4 reassembly enabled')
622
+ if self._ipv6:
623
+ logger.info('IPv6 reassembly enabled')
624
+ if self._tcp:
625
+ logger.info('TCP reassembly enabled')
626
+
602
627
  self._reasm = ReassemblyManager(
603
628
  ipv4=IPv4_Reassembly(strict=strict) if self._ipv4 else None,
604
629
  ipv6=IPv6_Reassembly(strict=strict) if self._ipv6 else None,
@@ -613,6 +638,9 @@ class Extractor(Generic[P]):
613
638
  "using 'trace_format=None' instead", FormatWarning, stacklevel=stacklevel())
614
639
  trace_format = None
615
640
 
641
+ if self._tcp:
642
+ logger.info('TCP flow tracing enabled')
643
+
616
644
  self._trace = TraceFlowManager(
617
645
  tcp=TCP_TraceFlow(fout=trace_fout, format=trace_format, byteorder=trace_byteorder,
618
646
  nanosecond=trace_nanosecond) if self._tcp else None,
@@ -14,7 +14,7 @@ if TYPE_CHECKING:
14
14
  from ipaddress import IPv4Address, IPv6Address
15
15
  from typing import Optional, overload
16
16
 
17
- from typing_extensions import Literal
17
+ from typing_extensions import Literal, TypeAlias
18
18
 
19
19
  from pcapkit.const.reg.transtype import TransType
20
20
  from pcapkit.protocols.protocol import Protocol
@@ -22,7 +22,7 @@ if TYPE_CHECKING:
22
22
  AT = TypeVar('AT', 'IPv4Address', 'IPv6Address')
23
23
 
24
24
  #: Buffer ID.
25
- BufferID = Tuple[AT, AT, int, 'TransType']
25
+ BufferID: 'TypeAlias' = Tuple[AT, AT, int, 'TransType']
26
26
 
27
27
 
28
28
  @info_final
@@ -15,14 +15,14 @@ if TYPE_CHECKING:
15
15
  from ipaddress import IPv4Address, IPv6Address
16
16
  from typing import Optional, overload
17
17
 
18
- from typing_extensions import Literal
18
+ from typing_extensions import Literal, TypeAlias
19
19
 
20
20
  from pcapkit.protocols.protocol import Protocol
21
21
 
22
22
  IPAddress = TypeVar('IPAddress', 'IPv4Address', 'IPv6Address')
23
23
 
24
24
  #: Buffer ID.
25
- BufferID = Tuple[IPAddress, int, IPAddress, int]
25
+ BufferID: 'TypeAlias' = Tuple[IPAddress, int, IPAddress, int]
26
26
 
27
27
 
28
28
  @info_final
@@ -13,6 +13,7 @@ if TYPE_CHECKING:
13
13
  from typing import Any, Optional
14
14
 
15
15
  from dictdumper.dumper import Dumper
16
+ from typing_extensions import TypeAlias
16
17
 
17
18
  from pcapkit.const.reg.linktype import LinkType as Enum_LinkType
18
19
  from pcapkit.protocols.data.misc.pcap.frame import Frame as Data_Frame
@@ -20,7 +21,7 @@ if TYPE_CHECKING:
20
21
  IPAddress = TypeVar('IPAddress', 'IPv4Address', 'IPv6Address')
21
22
 
22
23
  #: Buffer ID.
23
- BufferID = Tuple[IPAddress, int, IPAddress, int]
24
+ BufferID: 'TypeAlias' = Tuple[IPAddress, int, IPAddress, int]
24
25
 
25
26
 
26
27
  @info_final
@@ -111,7 +111,10 @@ class TCP(TraceFlow[BufferID, Buffer, Index, Packet[IPAddress]], Generic[IPAddre
111
111
 
112
112
  # initialise buffer with BUFID
113
113
  if BUFID not in self._buffer:
114
- label = f'{packet.src}_{packet.srcport}-{packet.dst}_{packet.dstport}-{packet.timestamp}'
114
+ if packet.src.version == 4:
115
+ label = f'{packet.src}_{packet.srcport}-{packet.dst}_{packet.dstport}-{packet.timestamp}'
116
+ else:
117
+ label = f'{packet.src}_{packet.srcport}-{packet.dst}_{packet.dstport}-{packet.timestamp}'.replace(':', '.')
115
118
  self._buffer[BUFID] = Buffer(
116
119
  fpout=self._foutio(fname=f'{self._fproot}/{label}{self._fdpext or ""}', protocol=packet.protocol,
117
120
  byteorder=self._endian, nanosecond=self._nnsecd),
pcapkit/interface/core.py CHANGED
@@ -21,20 +21,13 @@ from pcapkit.protocols.protocol import Protocol
21
21
  from pcapkit.utilities.exceptions import FormatError
22
22
 
23
23
  if TYPE_CHECKING:
24
- from typing import Any, Callable, Optional, Type, Union
24
+ from typing import Optional, Type
25
25
 
26
26
  from typing_extensions import Literal
27
27
 
28
+ from pcapkit.foundation.extraction import Engines, Formats, Layers, Protocols, VerboseHandler
28
29
  from pcapkit.foundation.reassembly.reassembly import Reassembly
29
30
  from pcapkit.foundation.traceflow.traceflow import TraceFlow
30
- from pcapkit.protocols.misc.pcap.frame import Frame
31
-
32
- Formats = Literal['pcap', 'json', 'tree', 'plist']
33
- Engines = Literal['default', 'pcapkit', 'dpkt', 'scapy', 'pyshark']
34
- Layers = Literal['link', 'internet', 'transport', 'application', 'none']
35
-
36
- Protocols = Union[str, Protocol, Type[Protocol]]
37
- VerboseHandler = Callable[['Extractor', Frame], Any]
38
31
 
39
32
  __all__ = [
40
33
  'extract', 'reassemble', 'trace', # interface functions
@@ -96,7 +96,7 @@ class HTTP(Application[PT, ST], Generic[PT, ST]):
96
96
  if version == 1:
97
97
  from pcapkit.protocols.application.httpv1 import HTTP as protocol # isort: skip # pylint: disable=line-too-long,import-outside-toplevel
98
98
  elif version == 2:
99
- from pcapkit.protocols.application.httpv2 import HTTP as protocol # type: ignore[no-redef] # isort: skip # pylint: disable=line-too-long,import-outside-toplevel
99
+ from pcapkit.protocols.application.httpv2 import HTTP as protocol # type: ignore[assignment] # isort: skip # pylint: disable=line-too-long,import-outside-toplevel
100
100
  else:
101
101
  raise ProtocolError(f"invalid HTTP version: {version}")
102
102
 
@@ -123,7 +123,7 @@ class HTTP(Application[PT, ST], Generic[PT, ST]):
123
123
  if version == 1:
124
124
  from pcapkit.protocols.application.httpv1 import HTTP as protocol # isort: skip # pylint: disable=line-too-long,import-outside-toplevel
125
125
  elif version == 2:
126
- from pcapkit.protocols.application.httpv2 import HTTP as protocol # type: ignore[no-redef] # isort: skip # pylint: disable=line-too-long,import-outside-toplevel
126
+ from pcapkit.protocols.application.httpv2 import HTTP as protocol # type: ignore[assignment] # isort: skip # pylint: disable=line-too-long,import-outside-toplevel
127
127
  else:
128
128
  raise ProtocolError(f"invalid HTTP version: {version}")
129
129
  return protocol.make(**kwargs) # type: ignore[return-value]
@@ -147,7 +147,7 @@ class HTTP(Application[PT, ST], Generic[PT, ST]):
147
147
  if version == 1:
148
148
  from pcapkit.protocols.application.httpv1 import HTTP as protocol
149
149
  elif version == 2:
150
- from pcapkit.protocols.application.httpv2 import HTTP as protocol # type: ignore[no-redef] # isort: skip
150
+ from pcapkit.protocols.application.httpv2 import HTTP as protocol # type: ignore[assignment] # isort: skip
151
151
  else:
152
152
  raise ProtocolError(f"invalid HTTP version: {version}")
153
153
  return protocol._make_data(data) # type: ignore[arg-type]
@@ -282,14 +282,14 @@ class HTTP(HTTPBase[Data_HTTP, Schema_HTTP],
282
282
  match4 = re.match(_RE_STATUS, para2)
283
283
  if match1 and match2:
284
284
  header_line = Data_RequestHeader(
285
- type=Type.REQUEST, # type: ignore[arg-type]
285
+ type=Type.REQUEST,
286
286
  method=Enum_Method.get(self.decode(para1)),
287
287
  uri=self.decode(para2),
288
288
  version=self.decode(match2.group('version')),
289
289
  )
290
290
  elif match3 and match4:
291
291
  header_line = Data_ResponseHeader(
292
- type=Type.RESPONSE, # type: ignore[arg-type]
292
+ type=Type.RESPONSE,
293
293
  version=self.decode(match3.group('version')),
294
294
  status=Enum_StatusCode.get(int(para2)),
295
295
  message=self.decode(para3),
@@ -571,17 +571,8 @@ class Protocol(Generic[PT, ST], metaclass=abc.ABCMeta):
571
571
  if (cached := self.__cached__.get('__repr__')) is not None:
572
572
  return cached
573
573
 
574
- name = type(self).__name__
575
- temp = [] # type: list[str]
576
- for (key, value) in self._info.items():
577
- if isinstance(value, Info):
578
- temp.append(f'{key}=...')
579
- else:
580
- temp.append(f'{key}={value!r}')
581
- args = ', '.join(temp)
582
-
583
574
  # cache and return
584
- repr_ = f'<{name} alias={self.alias!r} {self.info_name}=({args})>'
575
+ repr_ = f'<{self.alias} {self.info_name}={self._info!r}>'
585
576
 
586
577
  self.__cached__['__repr__'] = repr_
587
578
  return repr_
@@ -678,7 +678,7 @@ class Schema(Mapping[str, VT], Generic[VT], metaclass=SchemaMeta):
678
678
  return self
679
679
 
680
680
 
681
- class EnumMeta(SchemaMeta):
681
+ class EnumMeta(SchemaMeta, Generic[ET]):
682
682
  """Meta class to add dynamic support for :class:`EnumSchema`.
683
683
 
684
684
  This meta class is used to generate necessary attributes for the
@@ -687,7 +687,7 @@ class EnumMeta(SchemaMeta):
687
687
 
688
688
  * :attr:`~EnumSchema.registry` is added to subclasses as an *immutable*
689
689
  proxy (similar to :class:`property`, but on class variables) to the
690
- :attr:`~EnumSchema.__enum__` mapping.
690
+ :attr:`__enum__` mapping.
691
691
 
692
692
  Args:
693
693
  name: Schema class name.
@@ -697,10 +697,14 @@ class EnumMeta(SchemaMeta):
697
697
 
698
698
  """
699
699
 
700
+ if TYPE_CHECKING:
701
+ #: Mapping of enumeration numbers to schemas (**internal use only**).
702
+ __enum__: 'DefaultDict[ET, Type[EnumSchema]]'
703
+
700
704
  @property
701
705
  def registry(cls) -> 'DefaultDict[ET, Type[EnumSchema]]':
702
706
  """Mapping of enumeration numbers to schemas."""
703
- return cls.__enum__ # type: ignore[attr-defined]
707
+ return cls.__enum__
704
708
 
705
709
 
706
710
  class EnumSchema(Schema, Generic[ET], metaclass=EnumMeta):
@@ -753,10 +757,9 @@ class EnumSchema(Schema, Generic[ET], metaclass=EnumMeta):
753
757
  __default__: 'Callable[[], Type[Self]]' = lambda: None # type: ignore[assignment,return-value]
754
758
 
755
759
  if TYPE_CHECKING:
756
- #: Mapping of enumeration numbers to schemas (**internal use only**).
757
- __enum__: 'DefaultDict[ET, Type[Self]]'
758
760
  #: Mapping of enumeration numbers to schemas.
759
761
  registry: 'DefaultDict[ET, Type[Self]]'
762
+ __enum__: 'DefaultDict[ET, Type[Self]]'
760
763
 
761
764
  def __init_subclass__(cls, /, code: 'Optional[ET | Iterable[ET]]' = None, *args: 'Any', **kwargs: 'Any') -> 'None':
762
765
  """Register enumeration to :attr:`registry` mapping.
@@ -772,13 +775,13 @@ class EnumSchema(Schema, Generic[ET], metaclass=EnumMeta):
772
775
  not given, the subclass will not be registered.
773
776
 
774
777
  Notes:
775
- If :attr:`__enum__` is not yet defined at function call, it will
776
- automatically be defined as a :class:`collections.defaultdict`
778
+ If :attr:`~EnumMeta.__enum__` is not yet defined at function call,
779
+ it will automatically be defined as a :class:`collections.defaultdict`
777
780
  object, with the default value set to :attr:`__default__`.
778
781
 
779
- If intended to customise the :attr:`__enum__` mapping, it is
780
- possible to override the :meth:`__init_subclass__` method and
781
- define :attr:`__enum__` manually.
782
+ If intended to customise the :attr:`~EnumMeta.__enum__` mapping,
783
+ it is possible to override the :meth:`__init_subclass__` method and
784
+ define :attr:`~EnumMeta.__enum__` manually.
782
785
 
783
786
  """
784
787
  if not hasattr(cls, '__enum__'):
@@ -787,9 +790,9 @@ class EnumSchema(Schema, Generic[ET], metaclass=EnumMeta):
787
790
  if code is not None:
788
791
  if isinstance(code, collections.abc.Iterable):
789
792
  for _code in code:
790
- cls.__enum__[_code] = cls
793
+ cls.__enum__[_code] = (cls) # type: ignore[index]
791
794
  else:
792
- cls.__enum__[code] = cls
795
+ cls.__enum__[code] = (cls) # type: ignore[index]
793
796
  super().__init_subclass__()
794
797
 
795
798
  @classmethod
@@ -801,4 +804,4 @@ class EnumSchema(Schema, Generic[ET], metaclass=EnumMeta):
801
804
  schema: Enumetaion schema.
802
805
 
803
806
  """
804
- cls.__enum__[code] = schema
807
+ cls.__enum__[code] = schema # type: ignore[index]
@@ -593,7 +593,11 @@ class _MPTCP(Schema):
593
593
 
594
594
  """
595
595
  ret = self.data
596
+
597
+ ret.option = Enum_Option.Multipath_TCP
598
+ ret.length = self.test['length']
596
599
  ret.subtype = Enum_MPTCPOption.get(packet['test']['subtype'])
600
+
597
601
  return ret
598
602
 
599
603
 
@@ -607,6 +611,10 @@ class MPTCP(EnumSchema[Enum_MPTCPOption]):
607
611
  __enum__: 'DefaultDict[Enum_MPTCPOption, Type[MPTCP]]' = collections.defaultdict(lambda: MPTCPUnknown)
608
612
 
609
613
  if TYPE_CHECKING:
614
+ #: Option kind.
615
+ kind: 'Enum_Option'
616
+ #: MPTCP length.
617
+ length: 'int'
610
618
  #: MPTCP subtype.
611
619
  subtype: 'Enum_MPTCPOption'
612
620
 
pcapkit/toolkit/pcap.py CHANGED
@@ -151,9 +151,9 @@ def tcp_reassembly(frame: 'Frame') -> 'TCP_Packet | None':
151
151
  data = TCP_Packet(
152
152
  bufid=(
153
153
  ip_info.src, # source IP address
154
- tcp_info.srcport, # source port
154
+ tcp_info.srcport.port, # source port
155
155
  ip_info.dst, # destination IP address
156
- tcp_info.dstport, # destination port
156
+ tcp_info.dstport.port, # destination port
157
157
  ),
158
158
  num=frame.info.number, # original packet range number
159
159
  ack=tcp_info.ack, # acknowledgement
@@ -204,8 +204,8 @@ def tcp_traceflow(frame: 'Frame', *, data_link: 'LinkType') -> 'TF_TCP_Packet |
204
204
  fin=tcp_info.flags.fin, # TCP finish (FIN) flag
205
205
  src=ip_info.src, # source IP
206
206
  dst=ip_info.dst, # destination IP
207
- srcport=tcp_info.srcport, # TCP source port
208
- dstport=tcp_info.dstport, # TCP destination port
207
+ srcport=tcp_info.srcport.port, # TCP source port
208
+ dstport=tcp_info.dstport.port, # TCP destination port
209
209
  timestamp=float(frame.info.time_epoch), # frame timestamp
210
210
  )
211
211
  return data
pcapkit/toolkit/pcapng.py CHANGED
@@ -158,9 +158,9 @@ def tcp_reassembly(frame: 'PCAPNG') -> 'TCP_Packet | None':
158
158
  data = TCP_Packet(
159
159
  bufid=(
160
160
  ip_info.src, # source IP address
161
- tcp_info.srcport, # source port
161
+ tcp_info.srcport.port, # source port
162
162
  ip_info.dst, # destination IP address
163
- tcp_info.dstport, # destination port
163
+ tcp_info.dstport.port, # destination port
164
164
  ),
165
165
  num=frame_info.number, # original packet range number
166
166
  ack=tcp_info.ack, # acknowledgement
@@ -213,8 +213,8 @@ def tcp_traceflow(frame: 'PCAPNG', *, nanosecond: 'bool' = False) -> 'TF_TCP_Pac
213
213
  fin=tcp_info.flags.fin, # TCP finish (FIN) flag
214
214
  src=ip_info.src, # source IP
215
215
  dst=ip_info.dst, # destination IP
216
- srcport=tcp_info.srcport, # TCP source port
217
- dstport=tcp_info.dstport, # TCP destination port
216
+ srcport=tcp_info.srcport.port, # TCP source port
217
+ dstport=tcp_info.dstport.port, # TCP destination port
218
218
  timestamp=float(frame_info.timestamp_epoch), # frame timestamp
219
219
  )
220
220
  return data
@@ -15,11 +15,13 @@ __all__ = [
15
15
 
16
16
  # classes
17
17
  'Collection', 'cached_property',
18
- 'Mapping', 'Tuple', 'List', 'Dict',
19
18
  'StrEnum',
20
19
 
21
20
  # modules
22
21
  'pathlib',
22
+
23
+ # typing
24
+ 'Mapping', 'Tuple', 'List', 'Dict', 'TypeAlias',
23
25
  ]
24
26
 
25
27
  if sys.version_info < (3, 6):
@@ -125,9 +127,9 @@ if sys.version_info < (3, 9):
125
127
  else:
126
128
  from collections.abc import Mapping
127
129
 
128
- Tuple = tuple
129
- List = list
130
- Dict = dict
130
+ Tuple: 'TypeAlias' = tuple
131
+ List: 'TypeAlias' = list
132
+ Dict: 'TypeAlias' = dict
131
133
 
132
134
  if sys.version_info < (3, 11):
133
135
  from aenum import StrEnum
@@ -187,3 +189,8 @@ if sys.version_info < (3, 11):
187
189
  return list(_iter_bits_lsb(value))
188
190
  else:
189
191
  from enum import show_flag_values # type: ignore[attr-defined]
192
+
193
+ if sys.version_info < (3, 10):
194
+ from typing_extensions import TypeAlias
195
+ else:
196
+ from typing import TypeAlias
@@ -120,28 +120,28 @@ class {NAME}(StrEnum):
120
120
  return '%s [%d - %s]' % (self.svc, self.port, self.proto.name)
121
121
 
122
122
  def __int__(self) -> 'int':
123
- return self.opt_value
123
+ return self.port
124
124
 
125
125
  def __lt__(self, other: '{NAME}') -> 'bool':
126
- return self.opt_value < other
126
+ return self.port < other
127
127
 
128
128
  def __gt__(self, other: '{NAME}') -> 'bool':
129
- return self.opt_value > other
129
+ return self.port > other
130
130
 
131
131
  def __le__(self, other: '{NAME}') -> 'bool':
132
- return self.opt_value <= other
132
+ return self.port <= other
133
133
 
134
134
  def __ge__(self, other: '{NAME}') -> 'bool':
135
- return self.opt_value >= other
135
+ return self.port >= other
136
136
 
137
137
  def __eq__(self, other: 'Any') -> 'bool':
138
- return self.opt_value == other
138
+ return self.port == other
139
139
 
140
140
  def __ne__(self, other: 'Any') -> 'bool':
141
- return self.opt_value != other
141
+ return self.port != other
142
142
 
143
143
  def __hash__(self) -> 'int':
144
- return hash(self.opt_value)
144
+ return hash(self.port)
145
145
 
146
146
  {ENUM}
147
147
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pypcapkit
3
- Version: 1.1.0.post1
3
+ Version: 1.1.1
4
4
  Summary: PyPCAPKit: comprehensive network packet analysis library
5
5
  Author-email: Jarry Shaw <jarryshaw@icloud.com>
6
6
  Maintainer: Jarry Shaw
@@ -39,15 +39,15 @@ Classifier: Typing :: Typed
39
39
  Requires-Python: <4,>=3.6
40
40
  Description-Content-Type: text/x-rst
41
41
  License-File: LICENSE
42
- Requires-Dist: dictdumper (~=0.8.0)
42
+ Requires-Dist: dictdumper ~=0.8.0
43
43
  Requires-Dist: chardet
44
44
  Requires-Dist: aenum
45
- Requires-Dist: tbtrim (>=0.2.1)
45
+ Requires-Dist: tbtrim >=0.2.1
46
+ Requires-Dist: typing-extensions ; python_version < "3.11"
46
47
  Requires-Dist: bpc-f2format ; python_version < "3.6"
47
48
  Requires-Dist: bpc-poseur ; python_version < "3.8"
48
49
  Requires-Dist: bpc-walrus ; python_version < "3.8"
49
- Requires-Dist: typing-extensions ; python_version < "3.8"
50
- Requires-Dist: pathlib2 (>=2.3.2) ; python_version == "3.4"
50
+ Requires-Dist: pathlib2 >=2.3.2 ; python_version == "3.4"
51
51
  Provides-Extra: dpkt
52
52
  Requires-Dist: dpkt ; extra == 'dpkt'
53
53
  Provides-Extra: pyshark
@@ -64,7 +64,7 @@ Requires-Dist: beautifulsoup4[html5lib] ; extra == 'all'
64
64
  Provides-Extra: cli
65
65
  Requires-Dist: emoji ; extra == 'cli'
66
66
  Provides-Extra: docs
67
- Requires-Dist: Sphinx (>=6.1.3) ; extra == 'docs'
67
+ Requires-Dist: Sphinx >=6.1.3 ; extra == 'docs'
68
68
  Requires-Dist: furo ; extra == 'docs'
69
69
  Requires-Dist: sphinx-autodoc-typehints ; extra == 'docs'
70
70
  Requires-Dist: sphinx-opengraph ; extra == 'docs'
@@ -163,7 +163,7 @@ Test Environment
163
163
  .. list-table::
164
164
 
165
165
  * - Operating System
166
- - macOS Ventura 13.4 Beta (22F5037d)
166
+ - macOS Ventura 13.4.1
167
167
  * - Chip
168
168
  - Apple M2 Pro
169
169
  * - Memory
@@ -175,10 +175,10 @@ Test Results
175
175
  ============= ===========================
176
176
  Engine Performance (ms per packet)
177
177
  ============= ===========================
178
- ``dpkt`` 0.010694_027361
179
- ``scapy`` 0.093399_399399
180
- ``pcapkit`` 0.199796_296296
181
- ``pyshark`` 25.066692_025359
178
+ ``dpkt`` 0.010390_056723
179
+ ``scapy`` 0.091690_233567
180
+ ``pcapkit`` 0.200390_390390
181
+ ``pyshark`` 24.682185_018351
182
182
  ============= ===========================
183
183
 
184
184
  ------------
@@ -1,4 +1,4 @@
1
- pcapkit/__init__.py,sha256=JbIEnv7UFnQh-5Wck0vIyepIOEjNyKkSkMeu2Sfgdrg,4097
1
+ pcapkit/__init__.py,sha256=4aoXOHBzsFC4QoQU4O78nX8QNLqFpwioKigK4mRsG7g,4091
2
2
  pcapkit/__main__.py,sha256=K_XEsZHJqDUdRfext2dN7jlnno5ub3bqjklwmWrZ8KQ,5581
3
3
  pcapkit/all.py,sha256=vQvbo8IeDW9nzW7dkCnakhgljO8t1lH5OgW0F-iTDwI,6598
4
4
  pcapkit/const/__init__.py,sha256=XpEr66hXmBpBofS5aHiTZXTG8VZlxU7xy0BNXBKCi1Q,3266
@@ -116,7 +116,7 @@ pcapkit/const/pcapng/record_type.py,sha256=4rZytbhhF6u5SPvQ8ew3jx4OhN_rwDQG3I4Jl
116
116
  pcapkit/const/pcapng/secrets_type.py,sha256=n_662aowLtqA25ilbdG6BWb2rYmrdBJt79_SISzfJkw,1578
117
117
  pcapkit/const/pcapng/verdict_type.py,sha256=_jEkN0g6CX-DGshAj-lUiZjiwdK7Fqou2pnzgZ-WyIk,1476
118
118
  pcapkit/const/reg/__init__.py,sha256=xKABPHwDQ0diN2sFA7hkw42FNsb6tx294XemEjTs2g8,1469
119
- pcapkit/const/reg/apptype.py,sha256=GQ9iWv3i6hTBNc2QbtGz7tGBjbJGPrGQRO2xkFaR9N8,1426355
119
+ pcapkit/const/reg/apptype.py,sha256=9e9DIaRsHrY6h4b-DQkhrxW_Dqs2SSR6nQpGxyBDnv4,1426845
120
120
  pcapkit/const/reg/ethertype.py,sha256=MlESESKA5yOSppkNXLkiqTEXUEJI7uTq_8_RSduDK5Q,25954
121
121
  pcapkit/const/reg/linktype.py,sha256=gYGIKpI21d4dpfO5ZAU8efqz1eBLVUiQnSLA1anKits,37247
122
122
  pcapkit/const/reg/transtype.py,sha256=7ZQOWFNGP8toBNRko0NuNih-sh3oo5RgIWBIKFb9bRQ,12872
@@ -128,23 +128,23 @@ pcapkit/const/tcp/option.py,sha256=wbKmXwUTan7ICLkIqVBiM6esQNsuRY5keTE9_e2_7HQ,5
128
128
  pcapkit/const/vlan/__init__.py,sha256=e58kBqVyx-aNe10uWkfI1grb1gI5t-VxyYnmP4qT2bM,690
129
129
  pcapkit/const/vlan/priority_level.py,sha256=lditGE8zcRNmCnPW7lTM45R5Q9RQ-CqBRkqGGDSByJw,1936
130
130
  pcapkit/corekit/__init__.py,sha256=9dBR8nKuymYe14vO9Gtt45AOznrAK9strSmO9CK6QoI,1508
131
- pcapkit/corekit/infoclass.py,sha256=uSJmUm96ECOGuZZvv9OKM0WL80yTeI2haItLjLzwRZA,14422
131
+ pcapkit/corekit/infoclass.py,sha256=5PCrqBYfDy8y1pilHl7aCkPdiLQlQhIW9e5dgQKRE9E,14423
132
132
  pcapkit/corekit/multidict.py,sha256=VuB9-DFZYpl_Z0z07YAhykoj9_ccHCp1RDG3uCceC1s,22015
133
133
  pcapkit/corekit/protochain.py,sha256=bTEK327E_iQp8e7s5en7zbVDCGIKFHxoTmA6V-3-j9g,7687
134
134
  pcapkit/corekit/version.py,sha256=jI8VDmBTmwdj8tx-JJ4YB7p1xL62-mQ8W-C0NzvsF-Y,470
135
135
  pcapkit/corekit/fields/__init__.py,sha256=MVsU-XQbmB3Ut0xrs17lsyVHMyzwyWO0g2sNCrkeaE4,1552
136
- pcapkit/corekit/fields/collections.py,sha256=MqA5vTZWjd8guUYQLF8orMz_QHM5-gzyXtIphBuxscU,9404
136
+ pcapkit/corekit/fields/collections.py,sha256=utcPi6mUisRpUHa1VAyO-GiwL1KadsBHoXnvkpfINUU,9378
137
137
  pcapkit/corekit/fields/field.py,sha256=lMqwE8MAs-BXins1T_-XM_HOpdoHy7I3h91TpoaR71Y,7431
138
138
  pcapkit/corekit/fields/ipaddress.py,sha256=MZlV_B3QGt0w_q3NTIYF8GZjEtEnNuVYenkzB428vyg,8370
139
139
  pcapkit/corekit/fields/misc.py,sha256=kyn2Wk3YxV1csC_16pMEd-WY6aTF5NvNdyJEomJw1a8,20756
140
140
  pcapkit/corekit/fields/numbers.py,sha256=3kgnePxwPNgL38ujcd2SkTMkke4wfk4rPbt_GCHSF50,11775
141
141
  pcapkit/corekit/fields/strings.py,sha256=MunIs1K9wlBxzYSDvowwTHX2AadZqYsYTqGN5xrfVdc,8814
142
142
  pcapkit/dumpkit/__init__.py,sha256=Q8eZXOAxPqMojnGfE3ypqxRQOv8wuQfinAabe2W3P6E,370
143
- pcapkit/dumpkit/common.py,sha256=j_651_aLmgvHnzIfY0qkml4vygAJ9Z3vHyrvTVz1Hjw,4462
143
+ pcapkit/dumpkit/common.py,sha256=CPq775MrotgmaTjGQ4_9v9vsAbySOeNvF6LsUlZFpR0,4523
144
144
  pcapkit/dumpkit/null.py,sha256=wL94KoKWtozmXPHbH63K9aH71XOKgFLLf5WechyEBCc,2243
145
145
  pcapkit/dumpkit/pcap.py,sha256=hPNvwFBumhQI0sq2CyxXQj20Lg-cI8re-CdTYL6NK4g,4165
146
146
  pcapkit/foundation/__init__.py,sha256=wwTcVaNs1CPsZiYXucOl4TDw8VJ_OKdgxfQ22dSfG44,1488
147
- pcapkit/foundation/extraction.py,sha256=P7aozM--4iliNvRQ61BTGb4JZRBrxf37OZau_u0l-PA,27578
147
+ pcapkit/foundation/extraction.py,sha256=Lbc8ReQDt-wkIFZO2YBF9P40JDe8lz2GHv7cJGPZc-s,28861
148
148
  pcapkit/foundation/engines/__init__.py,sha256=7Qskb6OE8xzGO50Yrk2BrcU5ZAnP5TX8n5tee_FVnaQ,858
149
149
  pcapkit/foundation/engines/dpkt.py,sha256=GgG72MkDjs5NPQf61KbHIvOiliFrxFtyGFVuRUBNz5o,7575
150
150
  pcapkit/foundation/engines/engine.py,sha256=pQEZtIDSFwE5RexkgkEtCs9AOGyh8Tdw3W8RhBF2H4Y,2496
@@ -159,26 +159,26 @@ pcapkit/foundation/reassembly/ipv6.py,sha256=MkJbR8x9yCQA6Wsh8E3oCD6p-jFqsco7lqC
159
159
  pcapkit/foundation/reassembly/reassembly.py,sha256=hjwyXC4C7iIIts_GlxGLyG03jeptvLs3OC1iIgYC6I8,6448
160
160
  pcapkit/foundation/reassembly/tcp.py,sha256=ld-lpYG3yepAyZSJy41uxUTLQ1uuL3U_w1JHyztoVBs,9922
161
161
  pcapkit/foundation/reassembly/data/__init__.py,sha256=A3epDzztgAZDjxqt_ss9K1c9SPDSn3-2u8qWPAjqhiQ,1924
162
- pcapkit/foundation/reassembly/data/ip.py,sha256=kuDVRKj62QWRtuIGhwbCY1k6qnFbmY7V4O4rSOl_4bs,4172
163
- pcapkit/foundation/reassembly/data/tcp.py,sha256=tr2IOZdcI1zggpzUYHvHNDIB1wzjK_Uu3LnL6TUu2N4,5145
162
+ pcapkit/foundation/reassembly/data/ip.py,sha256=JfZFNuWQpYWJaavVNEPu-MVa2_j7C03J3dRUrmtWgMU,4196
163
+ pcapkit/foundation/reassembly/data/tcp.py,sha256=MHPOJGYLSY7K6bl5i2hbfF4ah3ya2gFxawGRY-BYIEk,5169
164
164
  pcapkit/foundation/registry/__init__.py,sha256=VLAzpJ4dEYGEcxFXdPnrsLtW8l-eeoCsxIv-XGpYV3c,1089
165
165
  pcapkit/foundation/registry/foundation.py,sha256=Rgowvnz_qqpiRKPuEyW6A12wbTeIxwPkjOir_NVv5Jo,4822
166
166
  pcapkit/foundation/registry/protocols.py,sha256=InVwwTE5xHH5j4sU4P9o1XF72Ion5d38mdc9RWlyu4Y,35228
167
167
  pcapkit/foundation/traceflow/__init__.py,sha256=Sk6mrQ51EGTcfV5s6FdIoRVM002t1LlN2rLIe-kfLy4,999
168
- pcapkit/foundation/traceflow/tcp.py,sha256=_xpszi1PIF3aocQMnyXs1OuYO02fTgOWeVn25GE3nAM,5520
168
+ pcapkit/foundation/traceflow/tcp.py,sha256=v7mHp5HJNzaLmOT5mm09ierPzJ9qHJdsmsxQFWNbXGI,5706
169
169
  pcapkit/foundation/traceflow/traceflow.py,sha256=ZfHkfMdhvTFsHvxWzcUJD-fTX-hO-HA2PJLrmIn6Mgs,8280
170
170
  pcapkit/foundation/traceflow/data/__init__.py,sha256=1qHFuYkGvimhmNuLFHI-FXa2gsSKguzWPqCOxeN_UUw,919
171
- pcapkit/foundation/traceflow/data/tcp.py,sha256=3TCSpQL5bL3w8DZ_tf1v2M_5ZHGrDkI2vFbev6CUQXc,3002
171
+ pcapkit/foundation/traceflow/data/tcp.py,sha256=3pWg03OmMJzWjovH48F49LcAcWbCt2cjo7N4B47XncY,3059
172
172
  pcapkit/interface/__init__.py,sha256=UnQ1wjAWjP4iTA8HGRNonYDegDzCps4f7oWt7GK4kUE,809
173
- pcapkit/interface/core.py,sha256=X_jgHHVDk93UxYAMO7Ggvsn3lbZDW5_mxHj-CJqDh5s,7499
173
+ pcapkit/interface/core.py,sha256=qI8zz5TNgpz-7qs7qPvNyezS9Tuq9YG-T8lsYJFNqHM,7203
174
174
  pcapkit/interface/misc.py,sha256=CRirlQQe4XQJzwakJv8c2xZeOJlqlfsMFlrvyQxsio8,4802
175
175
  pcapkit/protocols/__init__.py,sha256=MzPJGg_hkGmPMxe8B2AznOU6p2HHRV4GrS6Odb9u7uQ,1745
176
- pcapkit/protocols/protocol.py,sha256=LALd7ZCVyd36UOwoKmmUy522Zcf4lwstW0fKmFSPeGw,43888
176
+ pcapkit/protocols/protocol.py,sha256=lXQCkPDOKDtbqKlq-iAZHoWIjH5ppuyz-wZB0FRKNtE,43579
177
177
  pcapkit/protocols/application/__init__.py,sha256=nInVbuUoyQiLGATLiCyxkyEfWyXVJMYVOr7ddrh7LDg,1044
178
178
  pcapkit/protocols/application/application.py,sha256=TDyWuSLhRL8-MuUXcwn5dM55Tm7CjspApfHYOmnZZew,4302
179
179
  pcapkit/protocols/application/ftp.py,sha256=FdNVpBKKYzNV5Cj8Gqm5VqK2O0x9S7SupsL-JgGmdpw,6532
180
- pcapkit/protocols/application/http.py,sha256=MvW1Qw5nTGJuatlATTVjB0srqZZ4qm97ha0AW_eelAk,6268
181
- pcapkit/protocols/application/httpv1.py,sha256=aBU11Tb5L5CU0cIry6E8gWr3yo3Z-uCskgzpNZI06xQ,11638
180
+ pcapkit/protocols/application/http.py,sha256=dfXkb38E_ZAyFDWay_Pm3WCJS_lZeQHheXAVsh68uqU,6274
181
+ pcapkit/protocols/application/httpv1.py,sha256=xZyUWouMM9BhvqQtnvezDrMq_QGWnyPuijWn5SAjd5k,11586
182
182
  pcapkit/protocols/application/httpv2.py,sha256=1Nz4gQdLx15BFmdJqFV4I37WpomYHHMMLlZI8HV2yIs,49569
183
183
  pcapkit/protocols/application/NotImplemented/bgp.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
184
184
  pcapkit/protocols/application/NotImplemented/dhcp.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -276,7 +276,7 @@ pcapkit/protocols/misc/pcap/__init__.py,sha256=-uxoPg3k-8NteBUUxLdgysbpwHbV_uyHy
276
276
  pcapkit/protocols/misc/pcap/frame.py,sha256=pUScBj8DRQq0AIKR6Eq5i7qUTgnpsmFmuKO9VF59f3I,17448
277
277
  pcapkit/protocols/misc/pcap/header.py,sha256=4gDu-24VcPNG_16tYeKb0T0myERbWwlh4AJST2wEiBo,12665
278
278
  pcapkit/protocols/schema/__init__.py,sha256=h5GqPMdMYNM7089UA8wLP8E17wEAIZCGoSoySFss6Dg,7306
279
- pcapkit/protocols/schema/schema.py,sha256=1x5fJvFNR_z06WKpi6wp8tC1xXtWGbr4UCElGT62I-Q,29169
279
+ pcapkit/protocols/schema/schema.py,sha256=FnBT7sJHNMXZcw6tdy47xnCQedP92O99EBv_4JbEeSI,29320
280
280
  pcapkit/protocols/schema/application/__init__.py,sha256=5Cug38rdq8thUWMol0ICGIPP7FW3nBeBnFWPbnU0sbA,1997
281
281
  pcapkit/protocols/schema/application/ftp.py,sha256=uZm2D5Za3GJCjATk76dJOwNsO8GuFDMNVtqy2qzSmiI,520
282
282
  pcapkit/protocols/schema/application/httpv1.py,sha256=hJ9mvWfhbXUSpWvgLGAfSu0_MhXqxkJnxuv3PbUYDaE,523
@@ -306,7 +306,7 @@ pcapkit/protocols/schema/misc/pcap/__init__.py,sha256=hM9-xbwwO2ZQsX4k2FsAHGEbxS
306
306
  pcapkit/protocols/schema/misc/pcap/frame.py,sha256=H1WxunVvypLHYVp8RT7B4r8eI_sICXfMgHaBP2f386w,1557
307
307
  pcapkit/protocols/schema/misc/pcap/header.py,sha256=bxi1MDnc6wvIQcE-uxrqi8t3_YnZDl94j36oJ6BYoGo,2327
308
308
  pcapkit/protocols/schema/transport/__init__.py,sha256=e2Z308ZrFrCVUiABvQyb_9N_jGeMlxIwF2vDHLjB7Vc,4371
309
- pcapkit/protocols/schema/transport/tcp.py,sha256=a15XG8Si3gfr33JsKCLuaIOLYj44idM_2MdAFE985Po,27759
309
+ pcapkit/protocols/schema/transport/tcp.py,sha256=oGcodchFgjwfcEvoFowSXjwERaD70vk7gxOTI4Xn_cA,27948
310
310
  pcapkit/protocols/schema/transport/udp.py,sha256=DQXks3Jo5Pp3jzdGR6xngZPpCMujRCT4WAtRgLl1KH0,2992
311
311
  pcapkit/protocols/transport/__init__.py,sha256=15zwQlVMcPJeG-s1DZCOU4bA_fPfY52-VRQEO7-TWqw,780
312
312
  pcapkit/protocols/transport/tcp.py,sha256=8ZgUhvY4HDMIhsowdVlqijswIq2pCRURz_tcGx_yy5c,113643
@@ -317,12 +317,12 @@ pcapkit/protocols/transport/NotImplemented/rsvp.py,sha256=47DEQpj8HBSa-_TImW-5JC
317
317
  pcapkit/protocols/transport/NotImplemented/sctp.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
318
318
  pcapkit/toolkit/__init__.py,sha256=pidjgoJjQxW8z--lY9eR6k_ANc2kF6U0Rgv99S3QeEs,2623
319
319
  pcapkit/toolkit/dpkt.py,sha256=c4B8NT60_jQMk9Fh-VdJG_4NzxE-RofiNna2a6vXDts,12433
320
- pcapkit/toolkit/pcap.py,sha256=tBl51CNYD22ijV6ZYAJSBG42bEkQDQh338D_8XDaKJI,9132
321
- pcapkit/toolkit/pcapng.py,sha256=xOnw3NZpspG8tTiREjTR2lLxnDKoK9FwvAPrTclx5tc,10420
320
+ pcapkit/toolkit/pcap.py,sha256=GVWg_LX4Pu_qldLmBGUIwl4C_1tKCpNr0mkSfI98qdg,9132
321
+ pcapkit/toolkit/pcapng.py,sha256=16ibqo6lsN3QAwTWsFf76P8mE-FlkqJhTgTzjzltrQ8,10420
322
322
  pcapkit/toolkit/pyshark.py,sha256=UwvzNkwplVBQZFggXvOsOTkJeUdZsE5tIe6DTMp7irA,3388
323
323
  pcapkit/toolkit/scapy.py,sha256=8zEyWbbXHWyIcJ5qWKIzED6CUgBbDZrYMzTJJr8gqgI,11435
324
324
  pcapkit/utilities/__init__.py,sha256=nd_SO3k9zXgi-Vesa1bhBiAgu55x2BeRMclLsdz9RWg,692
325
- pcapkit/utilities/compat.py,sha256=VUeKMWdRohSj1ZlTNNcRcZNFU3bayeNMWpDTiEiswsY,6352
325
+ pcapkit/utilities/compat.py,sha256=fq16iG0leV4cyglNn2GeXdIIwUVzwMXGtdPigrejrgo,6533
326
326
  pcapkit/utilities/decorators.py,sha256=7UTb4DjXWjMeEfxX2z7jvkbkBUhZngDraFp1LSVn1As,6506
327
327
  pcapkit/utilities/exceptions.py,sha256=Ht2eX8IWMizp04OQaOwkg85vE7ZxybVt3u2CPb2qsnQ,10541
328
328
  pcapkit/utilities/logging.py,sha256=W0QbD16F_lLbvKzruZ9g7kho-gFRFCUIhdE_ub4xzh4,1918
@@ -444,7 +444,7 @@ pcapkit/vendor/pcapng/record_type.py,sha256=cqiRPWETwl-MItPhGqJrLd9dDh3ivM3Ed3I6
444
444
  pcapkit/vendor/pcapng/secrets_type.py,sha256=hTEstMPuri04ac_q26Nt9bM1VRSyvdbanPYJrU5H3DQ,2165
445
445
  pcapkit/vendor/pcapng/verdict_type.py,sha256=rVGrJOIS0ikiSu0X23lfjANTiy2IeII31GCXkGtSPRg,1977
446
446
  pcapkit/vendor/reg/__init__.py,sha256=OryPFPYmNYAIkm_rvUAIcNn69ymfDJiFNL2DFbZXkto,1411
447
- pcapkit/vendor/reg/apptype.py,sha256=_Sd1NH2UjdND4_BEH3kuXTxqdHRPJnedf0-EPiZTvIo,10350
447
+ pcapkit/vendor/reg/apptype.py,sha256=z-OQJcGKq4gnfigpEe4V_9bPWQtJLpSmgA3yaPtVoKU,10310
448
448
  pcapkit/vendor/reg/ethertype.py,sha256=FI64Kk3_048CporpQOAwGi-Po9net5HwZnO0mJBSQTo,3752
449
449
  pcapkit/vendor/reg/linktype.py,sha256=i4A7Zmk9So2AaBP1KlsE_7rv5g8QWDaWJ4giRyXtT6E,3284
450
450
  pcapkit/vendor/reg/transtype.py,sha256=7UqVA4evH6luliMpDRhzKcYoIKm8FiogqzI8ovoQyqc,3365
@@ -455,9 +455,9 @@ pcapkit/vendor/tcp/mp_tcp_option.py,sha256=fLtttA2-p3qXRcP-1kI3gA-08F0bhCCgVQTLi
455
455
  pcapkit/vendor/tcp/option.py,sha256=8-0kq6GTKFCjHjxnDU3T-IUvjp5XA7MiCr2BN_aDonI,2958
456
456
  pcapkit/vendor/vlan/__init__.py,sha256=qvLktJ0yuoZokas6-_ZGwMJOzbujSCM8pZHQ9jjTegU,674
457
457
  pcapkit/vendor/vlan/priority_level.py,sha256=xVu6M-Ys4pft5I-qPCCxM-KfnMAUnZppD2qPO9gPkVE,2961
458
- pypcapkit-1.1.0.post1.dist-info/LICENSE,sha256=KkKND5E2e1Z6CQvSLPc1lRBy4xPRed41AG6q1txotWk,1516
459
- pypcapkit-1.1.0.post1.dist-info/METADATA,sha256=OyPOdGpKuFfNY-8NBDP1nNRRK6I_GZ_mH6UY3TFkh3k,7692
460
- pypcapkit-1.1.0.post1.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
461
- pypcapkit-1.1.0.post1.dist-info/entry_points.txt,sha256=8tVaZ-N0S2t19ELoTEGq_OlC8-dSmd7dvNn-kMV3afY,100
462
- pypcapkit-1.1.0.post1.dist-info/top_level.txt,sha256=KEssKRhG9ln3EOfGH-yi98HgI-MM9hOHy09QQP-fvk8,8
463
- pypcapkit-1.1.0.post1.dist-info/RECORD,,
458
+ pypcapkit-1.1.1.dist-info/LICENSE,sha256=KkKND5E2e1Z6CQvSLPc1lRBy4xPRed41AG6q1txotWk,1516
459
+ pypcapkit-1.1.1.dist-info/METADATA,sha256=Np_WIVd0XLdvTn06u3lUepTVp1fwK511g8DixPrbL2c,7665
460
+ pypcapkit-1.1.1.dist-info/WHEEL,sha256=5sUXSg9e4bi7lTLOHcm6QEYwO5TIF1TNbTSVFVjcJcc,92
461
+ pypcapkit-1.1.1.dist-info/entry_points.txt,sha256=8tVaZ-N0S2t19ELoTEGq_OlC8-dSmd7dvNn-kMV3afY,100
462
+ pypcapkit-1.1.1.dist-info/top_level.txt,sha256=KEssKRhG9ln3EOfGH-yi98HgI-MM9hOHy09QQP-fvk8,8
463
+ pypcapkit-1.1.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.40.0)
2
+ Generator: bdist_wheel (0.41.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5