pypcapkit 1.0.3.post3__pp39-none-any.whl → 1.1.0.post1__pp39-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.
Files changed (41) hide show
  1. pcapkit/__init__.py +1 -1
  2. pcapkit/const/pcapng/option_type.py +25 -1
  3. pcapkit/const/reg/apptype.py +25 -1
  4. pcapkit/corekit/fields/collections.py +4 -5
  5. pcapkit/corekit/fields/field.py +33 -8
  6. pcapkit/corekit/fields/ipaddress.py +0 -1
  7. pcapkit/corekit/fields/misc.py +14 -19
  8. pcapkit/corekit/fields/numbers.py +2 -3
  9. pcapkit/corekit/fields/strings.py +2 -3
  10. pcapkit/corekit/infoclass.py +59 -6
  11. pcapkit/corekit/protochain.py +8 -1
  12. pcapkit/foundation/registry/protocols.py +30 -51
  13. pcapkit/protocols/data/__init__.py +4 -4
  14. pcapkit/protocols/data/internet/__init__.py +4 -4
  15. pcapkit/protocols/data/internet/mh.py +4 -4
  16. pcapkit/protocols/data/transport/__init__.py +4 -4
  17. pcapkit/protocols/data/transport/tcp.py +4 -4
  18. pcapkit/protocols/internet/mh.py +20 -20
  19. pcapkit/protocols/protocol.py +3 -2
  20. pcapkit/protocols/schema/__init__.py +4 -4
  21. pcapkit/protocols/schema/application/httpv2.py +16 -29
  22. pcapkit/protocols/schema/internet/__init__.py +4 -4
  23. pcapkit/protocols/schema/internet/hip.py +62 -111
  24. pcapkit/protocols/schema/internet/hopopt.py +46 -48
  25. pcapkit/protocols/schema/internet/ipv4.py +36 -41
  26. pcapkit/protocols/schema/internet/ipv6_opts.py +48 -52
  27. pcapkit/protocols/schema/internet/ipv6_route.py +9 -20
  28. pcapkit/protocols/schema/internet/mh.py +49 -84
  29. pcapkit/protocols/schema/misc/pcapng.py +178 -195
  30. pcapkit/protocols/schema/schema.py +252 -53
  31. pcapkit/protocols/schema/transport/__init__.py +4 -4
  32. pcapkit/protocols/schema/transport/tcp.py +52 -83
  33. pcapkit/protocols/transport/tcp.py +14 -14
  34. pcapkit/vendor/pcapng/option_type.py +25 -1
  35. pcapkit/vendor/reg/apptype.py +25 -1
  36. {pypcapkit-1.0.3.post3.dist-info → pypcapkit-1.1.0.post1.dist-info}/METADATA +1 -1
  37. {pypcapkit-1.0.3.post3.dist-info → pypcapkit-1.1.0.post1.dist-info}/RECORD +41 -41
  38. {pypcapkit-1.0.3.post3.dist-info → pypcapkit-1.1.0.post1.dist-info}/LICENSE +0 -0
  39. {pypcapkit-1.0.3.post3.dist-info → pypcapkit-1.1.0.post1.dist-info}/WHEEL +0 -0
  40. {pypcapkit-1.0.3.post3.dist-info → pypcapkit-1.1.0.post1.dist-info}/entry_points.txt +0 -0
  41. {pypcapkit-1.0.3.post3.dist-info → pypcapkit-1.1.0.post1.dist-info}/top_level.txt +0 -0
@@ -20,7 +20,7 @@ from pcapkit.corekit.fields.misc import (ConditionalField, ForwardMatchField, No
20
20
  from pcapkit.corekit.fields.numbers import (EnumField, NumberField, UInt8Field, UInt16Field,
21
21
  UInt32Field)
22
22
  from pcapkit.corekit.fields.strings import BitField, BytesField, PaddingField
23
- from pcapkit.protocols.schema.schema import Schema, schema_final
23
+ from pcapkit.protocols.schema.schema import EnumSchema, Schema, schema_final
24
24
  from pcapkit.utilities.exceptions import FieldValueError
25
25
  from pcapkit.utilities.logging import SPHINX_TYPE_CHECKING
26
26
 
@@ -38,7 +38,7 @@ __all__ = [
38
38
 
39
39
  if TYPE_CHECKING:
40
40
  from ipaddress import IPv4Address, IPv6Address
41
- from typing import Any, Optional
41
+ from typing import Any, DefaultDict, Optional, Type
42
42
 
43
43
  from pcapkit.corekit.fields.field import _Field as Field
44
44
  from pcapkit.protocols.protocol import Protocol
@@ -149,19 +149,18 @@ def smf_dpd_data_selector(pkt: 'dict[str, Any]') -> 'Field':
149
149
 
150
150
  Returns:
151
151
  * If ``mode`` is ``0``, returns a :class:`~pcapkit.corekit.fields.misc.SchemaField`
152
- wrapped :class:`~pcapkit.protocols.schema.internet.hopopt.SMFIdentificationBasedDPDOption`
152
+ wrapped :class:`~pcapkit.protocols.schema.internet.ipv6_opts.SMFIdentificationBasedDPDOption`
153
153
  instance.
154
154
  * If ``mode`` is ``1``, returns a :class:`~pcapkit.corekit.fields.misc.SchemaField`
155
- wrapped :class:`~pcapkit.protocols.schema.internet.hopopt.SMFHashBasedDPDOption`
155
+ wrapped :class:`~pcapkit.protocols.schema.internet.ipv6_opts.SMFHashBasedDPDOption`
156
156
  instance.
157
157
 
158
158
  """
159
159
  mode = Enum_SMFDPDMode.get(pkt['test']['mode'])
160
- if mode == Enum_SMFDPDMode.I_DPD:
161
- return SchemaField(length=pkt['test']['len'], schema=SMFIdentificationBasedDPDOption)
162
- if mode == Enum_SMFDPDMode.H_DPD:
163
- return SchemaField(length=pkt['test']['len'], schema=SMFHashBasedDPDOption)
164
- raise FieldValueError(f'IPv6-Opts: invalid SMF DPD mode: {mode}')
160
+ schema = SMFDPDOption.registry[mode]
161
+ if schema is None:
162
+ raise FieldValueError(f'IPv6-Opts: invalid SMF DPD mode: {mode}')
163
+ return SchemaField(length=pkt['test']['len'], schema=schema)
165
164
 
166
165
 
167
166
  def smf_i_dpd_tid_selector(pkt: 'dict[str, Any]') -> 'Field':
@@ -209,26 +208,27 @@ def quick_start_data_selector(pkt: 'dict[str, Any]') -> 'Field':
209
208
 
210
209
  Returns:
211
210
  * If ``func`` is ``0``, returns a :class:`~pcapkit.corekit.fields.misc.SchemaField`
212
- wrapped :class:`~pcapkit.protocols.schema.internet.hopopt.QuickStartRequestOption`
211
+ wrapped :class:`~pcapkit.protocols.schema.internet.ipv6_opts.QuickStartRequestOption`
213
212
  instance.
214
213
  * If ``func`` is ``8``, returns a :class:`~pcapkit.corekit.fields.misc.SchemaField`
215
- wrapped :class:`~pcapkit.protocols.schema.internet.hopopt.QuickStartReportOption`
214
+ wrapped :class:`~pcapkit.protocols.schema.internet.ipv6_opts.QuickStartReportOption`
216
215
  instance.
217
216
 
218
217
  """
219
218
  func = Enum_QSFunction.get(pkt['flags']['func'])
220
219
  pkt['flags']['func'] = func
221
220
 
222
- if func == Enum_QSFunction.Quick_Start_Request:
223
- return SchemaField(length=5, schema=QuickStartRequestOption)
224
- if func == Enum_QSFunction.Report_of_Approved_Rate:
225
- return SchemaField(length=5, schema=QuickStartReportOption)
226
- raise FieldValueError(f'IPv6-Opts: invalid QS function: {func}')
221
+ schema = QuickStartOption.registry[func]
222
+ if schema is None:
223
+ raise FieldValueError(f'IPv6-Opts: invalid QS function: {func}')
224
+ return SchemaField(length=5, schema=schema)
227
225
 
228
226
 
229
- class Option(Schema):
227
+ class Option(EnumSchema[Enum_Option]):
230
228
  """Header schema for IPv6-Opts options."""
231
229
 
230
+ __default__ = lambda: UnassignedOption
231
+
232
232
  #: Option type.
233
233
  type: 'Enum_Option' = EnumField(length=1, namespace=Enum_Option)
234
234
  #: Option length (conditional in case of ``Pad1`` option).
@@ -265,7 +265,8 @@ class UnassignedOption(Option):
265
265
 
266
266
 
267
267
  @schema_final
268
- class PadOption(Option):
268
+ class PadOption(Option, code=[Enum_Option.Pad1,
269
+ Enum_Option.PadN]):
269
270
  """Header schema for IPv6-Opts padding options."""
270
271
 
271
272
  #: Padding.
@@ -276,7 +277,7 @@ class PadOption(Option):
276
277
 
277
278
 
278
279
  @schema_final
279
- class TunnelEncapsulationLimitOption(Option):
280
+ class TunnelEncapsulationLimitOption(Option, code=Enum_Option.Tunnel_Encapsulation_Limit):
280
281
  """Header schema for IPv6-Opts tunnel encapsulation limit options."""
281
282
 
282
283
  #: Tunnel encapsulation limit.
@@ -287,7 +288,7 @@ class TunnelEncapsulationLimitOption(Option):
287
288
 
288
289
 
289
290
  @schema_final
290
- class RouterAlertOption(Option):
291
+ class RouterAlertOption(Option, code=Enum_Option.Router_Alert):
291
292
  """Header schema for IPv6-Opts router alert options."""
292
293
 
293
294
  #: Router alert.
@@ -298,7 +299,7 @@ class RouterAlertOption(Option):
298
299
 
299
300
 
300
301
  @schema_final
301
- class CALIPSOOption(Option):
302
+ class CALIPSOOption(Option, code=Enum_Option.CALIPSO):
302
303
  """Header schema for IPv6-Opts common architecture label IPv6 security options."""
303
304
 
304
305
  #: CALIPSO domain of interpretation.
@@ -350,16 +351,22 @@ class _SMFDPDOption(Schema):
350
351
  return ret
351
352
 
352
353
 
353
- class SMFDPDOption(Option):
354
+ # register ``_SMFDPDOption`` as ``SMF_DPD`` option
355
+ Option.register(Enum_Option.SMF_DPD, _SMFDPDOption)
356
+
357
+
358
+ class SMFDPDOption(Option, EnumSchema[Enum_SMFDPDMode]):
354
359
  """Header schema for IPv6-Opts simplified multicast forwarding duplicate packet
355
360
  detection (``SMF_DPD``) options."""
356
361
 
362
+ __enum__: 'DefaultDict[Enum_SMFDPDMode, Type[SMFDPDOption]]' = collections.defaultdict(lambda: None) # type: ignore[arg-type,return-value]
363
+
357
364
  if TYPE_CHECKING:
358
365
  mode: 'Enum_SMFDPDMode'
359
366
 
360
367
 
361
368
  @schema_final
362
- class SMFIdentificationBasedDPDOption(SMFDPDOption):
369
+ class SMFIdentificationBasedDPDOption(SMFDPDOption, code=Enum_SMFDPDMode.I_DPD):
363
370
  """Header schema for IPv6-Opts SMF identification-based DPD options."""
364
371
 
365
372
  test: 'SMFDPDTestFlag' = ForwardMatchField(BitField(length=1, namespace={
@@ -401,7 +408,7 @@ class SMFIdentificationBasedDPDOption(SMFDPDOption):
401
408
 
402
409
 
403
410
  @schema_final
404
- class SMFHashBasedDPDOption(SMFDPDOption):
411
+ class SMFHashBasedDPDOption(SMFDPDOption, code=Enum_SMFDPDMode.H_DPD):
405
412
  """Header schema for IPv6-Opts SMF hash-based DPD options."""
406
413
 
407
414
  #: Hash assist value (HAV).
@@ -426,7 +433,7 @@ class SMFHashBasedDPDOption(SMFDPDOption):
426
433
 
427
434
 
428
435
  @schema_final
429
- class PDMOption(Option):
436
+ class PDMOption(Option, code=Enum_Option.PDM):
430
437
  """Header schema for IPv6-Opts performance and diagnostic metrics (PDM) options."""
431
438
 
432
439
  #: Scale delta time last received (DTLR).
@@ -475,7 +482,11 @@ class _QuickStartOption(Schema):
475
482
  return ret
476
483
 
477
484
 
478
- class QuickStartOption(Option):
485
+ # register ``_QuickStartOption`` as ``Quick_Start`` option
486
+ Option.register(Enum_Option.Quick_Start, _QuickStartOption)
487
+
488
+
489
+ class QuickStartOption(Option, EnumSchema[Enum_QSFunction]):
479
490
  """Header schema for IPv6-Opts quick start options."""
480
491
 
481
492
  #: Flags.
@@ -489,7 +500,7 @@ class QuickStartOption(Option):
489
500
 
490
501
 
491
502
  @schema_final
492
- class QuickStartRequestOption(QuickStartOption):
503
+ class QuickStartRequestOption(QuickStartOption, code=Enum_QSFunction.Quick_Start_Request):
493
504
  """Header schema for IPv6-Opts quick start request options."""
494
505
 
495
506
  #: QS time-to-live (TTL).
@@ -505,7 +516,7 @@ class QuickStartRequestOption(QuickStartOption):
505
516
 
506
517
 
507
518
  @schema_final
508
- class QuickStartReportOption(QuickStartOption):
519
+ class QuickStartReportOption(QuickStartOption, code=Enum_QSFunction.Report_of_Approved_Rate):
509
520
  """Header schema for IPv6-Opts quick start report of approved rate options."""
510
521
 
511
522
  #: Reserved.
@@ -521,7 +532,8 @@ class QuickStartReportOption(QuickStartOption):
521
532
 
522
533
 
523
534
  @schema_final
524
- class RPLOption(Option):
535
+ class RPLOption(Option, code=[Enum_Option.RPL_Option_0x23,
536
+ Enum_Option.RPL_Option_0x63]):
525
537
  """Header schema for IPv6-Opts routing protocol for low-power and lossy networks (RPL) options."""
526
538
 
527
539
  #: Flags.
@@ -541,7 +553,7 @@ class RPLOption(Option):
541
553
 
542
554
 
543
555
  @schema_final
544
- class MPLOption(Option):
556
+ class MPLOption(Option, code=Enum_Option.MPL_Option):
545
557
  """Header schema for IPv6-Opts multicast protocol for low-power and lossy networks (MPL) options."""
546
558
 
547
559
  #: Flags.
@@ -582,7 +594,7 @@ class MPLOption(Option):
582
594
 
583
595
 
584
596
  @schema_final
585
- class ILNPOption(Option):
597
+ class ILNPOption(Option, code=Enum_Option.ILNP_Nonce):
586
598
  """Header schema for IPv6-Opts identifier-locator network protocol (ILNP) options."""
587
599
 
588
600
  #: Nonce value.
@@ -593,7 +605,7 @@ class ILNPOption(Option):
593
605
 
594
606
 
595
607
  @schema_final
596
- class LineIdentificationOption(Option):
608
+ class LineIdentificationOption(Option, code=Enum_Option.Line_Identification_Option):
597
609
  """Header schema for IPv6-Opts line-identification options."""
598
610
 
599
611
  #: Line ID length.
@@ -606,7 +618,7 @@ class LineIdentificationOption(Option):
606
618
 
607
619
 
608
620
  @schema_final
609
- class JumboPayloadOption(Option):
621
+ class JumboPayloadOption(Option, code=Enum_Option.Jumbo_Payload):
610
622
  """Header schema for IPv6-Opts jumbo payload options."""
611
623
 
612
624
  #: Jumbo payload length.
@@ -617,7 +629,7 @@ class JumboPayloadOption(Option):
617
629
 
618
630
 
619
631
  @schema_final
620
- class HomeAddressOption(Option):
632
+ class HomeAddressOption(Option, code=Enum_Option.Home_Address):
621
633
  """Header schema for IPv6-Opts home address options."""
622
634
 
623
635
  #: Home address.
@@ -628,7 +640,7 @@ class HomeAddressOption(Option):
628
640
 
629
641
 
630
642
  @schema_final
631
- class IPDFFOption(Option):
643
+ class IPDFFOption(Option, code=Enum_Option.IP_DFF):
632
644
  """Header schema for IPv6-Opts depth-first forwarding (``IP_DFF``) options."""
633
645
 
634
646
  #: Flags.
@@ -657,23 +669,7 @@ class IPv6_Opts(Schema):
657
669
  length=lambda pkt: pkt['len'] * 8 + 6,
658
670
  base_schema=Option,
659
671
  type_name='type',
660
- registry=collections.defaultdict(lambda: UnassignedOption, {
661
- Enum_Option.Pad1: PadOption,
662
- Enum_Option.PadN: PadOption,
663
- Enum_Option.Tunnel_Encapsulation_Limit: TunnelEncapsulationLimitOption,
664
- Enum_Option.Router_Alert: RouterAlertOption,
665
- Enum_Option.CALIPSO: CALIPSOOption,
666
- Enum_Option.SMF_DPD: _SMFDPDOption,
667
- Enum_Option.PDM: PDMOption,
668
- Enum_Option.Quick_Start: _QuickStartOption,
669
- Enum_Option.RPL_Option_0x63: RPLOption,
670
- Enum_Option.MPL_Option: MPLOption,
671
- Enum_Option.ILNP_Nonce: ILNPOption,
672
- Enum_Option.Line_Identification_Option: LineIdentificationOption,
673
- Enum_Option.Jumbo_Payload: JumboPayloadOption,
674
- Enum_Option.Home_Address: HomeAddressOption,
675
- Enum_Option.IP_DFF: IPDFFOption,
676
- })
672
+ registry=Option.registry,
677
673
  )
678
674
  #: Payload.
679
675
  payload: 'bytes' = PayloadField()
@@ -2,7 +2,6 @@
2
2
  # mypy: disable-error-code=assignment
3
3
  """header schema for IPv6 Routing Header"""
4
4
 
5
- import collections
6
5
  import ipaddress
7
6
  from typing import TYPE_CHECKING, cast
8
7
 
@@ -13,7 +12,7 @@ from pcapkit.corekit.fields.ipaddress import IPv6AddressField
13
12
  from pcapkit.corekit.fields.misc import PayloadField, SchemaField, SwitchField
14
13
  from pcapkit.corekit.fields.numbers import EnumField, UInt8Field
15
14
  from pcapkit.corekit.fields.strings import BitField, BytesField, PaddingField
16
- from pcapkit.protocols.schema.schema import Schema, schema_final
15
+ from pcapkit.protocols.schema.schema import EnumSchema, Schema, schema_final
17
16
  from pcapkit.utilities.logging import SPHINX_TYPE_CHECKING
18
17
 
19
18
  __all__ = [
@@ -25,7 +24,7 @@ __all__ = [
25
24
 
26
25
  if TYPE_CHECKING:
27
26
  from ipaddress import IPv6Address
28
- from typing import Any, DefaultDict, Optional, Type
27
+ from typing import Any, Optional
29
28
 
30
29
  from pcapkit.corekit.fields.field import _Field as Field
31
30
  from pcapkit.protocols.protocol import Protocol
@@ -50,13 +49,9 @@ def ipv6_route_data_selector(pkt: 'dict[str, Any]') -> 'Field':
50
49
  :class:`~pcapkit.protocols.schema.internet.ipv6_route.RoutingType`
51
50
  instance based on :attr:`IPv6_Route.type <pcapkit.protocols.schema.internet.ipv6_route.IPv6_Route.type>`.
52
51
 
53
- See Also:
54
- * :class:`pcapkit.const.ipv6.routing.Routing`
55
- * :data:`pcapkit.protocols.schema.internet.ipv6_route.MAP_IPV6_ROUTE_DATA`
56
-
57
52
  """
58
53
  type = cast('Enum_Routing', pkt['type'])
59
- schema = MAP_IPV6_ROUTE_DATA[type]
54
+ schema = RoutingType.registry[type]
60
55
  return SchemaField(length=pkt['length'] * 8 - 4, schema=schema)
61
56
 
62
57
 
@@ -84,9 +79,11 @@ class IPv6_Route(Schema):
84
79
  seg_left: 'int', data: 'bytes | RoutingType', payload: 'Protocol | Schema | bytes') -> 'None': ...
85
80
 
86
81
 
87
- class RoutingType(Schema):
82
+ class RoutingType(EnumSchema[Enum_Routing]):
88
83
  """Header schema for IPv6-Route type-specific routing data."""
89
84
 
85
+ __default__ = lambda: UnknownType
86
+
90
87
 
91
88
  @schema_final
92
89
  class UnknownType(RoutingType):
@@ -100,7 +97,7 @@ class UnknownType(RoutingType):
100
97
 
101
98
 
102
99
  @schema_final
103
- class SourceRoute(RoutingType):
100
+ class SourceRoute(RoutingType, code=Enum_Routing.Source_Route):
104
101
  """Header schema for IPv6-Route source route routing data."""
105
102
 
106
103
  #: Reserved.
@@ -116,7 +113,7 @@ class SourceRoute(RoutingType):
116
113
 
117
114
 
118
115
  @schema_final
119
- class Type2(RoutingType):
116
+ class Type2(RoutingType, code=Enum_Routing.Type_2_Routing_Header):
120
117
  """Header schema for IPv6-Route type 2 routing data."""
121
118
 
122
119
  #: Reserved.
@@ -129,7 +126,7 @@ class Type2(RoutingType):
129
126
 
130
127
 
131
128
  @schema_final
132
- class RPL(RoutingType):
129
+ class RPL(RoutingType, code=Enum_Routing.RPL_Source_Route_Header):
133
130
  """Header schema for IPv6-Route RPL routing data."""
134
131
 
135
132
  #: CmprI.
@@ -199,11 +196,3 @@ class RPL(RoutingType):
199
196
 
200
197
  def __init__(self, cmpr_i: 'int', cmpr_e: 'int', pad: 'PadInfo',
201
198
  addresses: 'list[bytes]') -> 'None': ...
202
-
203
-
204
- #: DefaultDict[Enum_Routing, Type[RoutingType]]: Mapping of IPv6-Route routing type numbers to schemas.
205
- MAP_IPV6_ROUTE_DATA = collections.defaultdict(lambda: UnknownType, {
206
- Enum_Routing.Source_Route: SourceRoute,
207
- Enum_Routing.Type_2_Routing_Header: Type2,
208
- Enum_Routing.RPL_Source_Route_Header: RPL,
209
- }) # type: DefaultDict[Enum_Routing | int, Type[RoutingType]]