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.
- pcapkit/__init__.py +1 -1
- pcapkit/const/pcapng/option_type.py +25 -1
- pcapkit/const/reg/apptype.py +25 -1
- pcapkit/corekit/fields/collections.py +4 -5
- pcapkit/corekit/fields/field.py +33 -8
- pcapkit/corekit/fields/ipaddress.py +0 -1
- pcapkit/corekit/fields/misc.py +14 -19
- pcapkit/corekit/fields/numbers.py +2 -3
- pcapkit/corekit/fields/strings.py +2 -3
- pcapkit/corekit/infoclass.py +59 -6
- pcapkit/corekit/protochain.py +8 -1
- pcapkit/foundation/registry/protocols.py +30 -51
- pcapkit/protocols/data/__init__.py +4 -4
- pcapkit/protocols/data/internet/__init__.py +4 -4
- pcapkit/protocols/data/internet/mh.py +4 -4
- pcapkit/protocols/data/transport/__init__.py +4 -4
- pcapkit/protocols/data/transport/tcp.py +4 -4
- pcapkit/protocols/internet/mh.py +20 -20
- pcapkit/protocols/protocol.py +3 -2
- pcapkit/protocols/schema/__init__.py +4 -4
- pcapkit/protocols/schema/application/httpv2.py +16 -29
- pcapkit/protocols/schema/internet/__init__.py +4 -4
- pcapkit/protocols/schema/internet/hip.py +62 -111
- pcapkit/protocols/schema/internet/hopopt.py +46 -48
- pcapkit/protocols/schema/internet/ipv4.py +36 -41
- pcapkit/protocols/schema/internet/ipv6_opts.py +48 -52
- pcapkit/protocols/schema/internet/ipv6_route.py +9 -20
- pcapkit/protocols/schema/internet/mh.py +49 -84
- pcapkit/protocols/schema/misc/pcapng.py +178 -195
- pcapkit/protocols/schema/schema.py +252 -53
- pcapkit/protocols/schema/transport/__init__.py +4 -4
- pcapkit/protocols/schema/transport/tcp.py +52 -83
- pcapkit/protocols/transport/tcp.py +14 -14
- pcapkit/vendor/pcapng/option_type.py +25 -1
- pcapkit/vendor/reg/apptype.py +25 -1
- {pypcapkit-1.0.3.post3.dist-info → pypcapkit-1.1.0.post1.dist-info}/METADATA +1 -1
- {pypcapkit-1.0.3.post3.dist-info → pypcapkit-1.1.0.post1.dist-info}/RECORD +41 -41
- {pypcapkit-1.0.3.post3.dist-info → pypcapkit-1.1.0.post1.dist-info}/LICENSE +0 -0
- {pypcapkit-1.0.3.post3.dist-info → pypcapkit-1.1.0.post1.dist-info}/WHEEL +0 -0
- {pypcapkit-1.0.3.post3.dist-info → pypcapkit-1.1.0.post1.dist-info}/entry_points.txt +0 -0
- {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.
|
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.
|
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
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
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.
|
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.
|
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
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
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(
|
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
|
-
|
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
|
-
|
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=
|
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,
|
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 =
|
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(
|
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]]
|