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
|
@@ -157,11 +157,10 @@ def smf_dpd_data_selector(pkt: 'dict[str, Any]') -> 'Field':
|
|
157
157
|
|
158
158
|
"""
|
159
159
|
mode = Enum_SMFDPDMode.get(pkt['test']['mode'])
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
raise FieldValueError(f'HOPOPT: invalid SMF DPD mode: {mode}')
|
160
|
+
schema = SMFDPDOption.registry[mode]
|
161
|
+
if schema is None:
|
162
|
+
raise FieldValueError(f'HOPOPT: 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':
|
@@ -219,16 +218,17 @@ def quick_start_data_selector(pkt: 'dict[str, Any]') -> 'Field':
|
|
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'HOPOPT: invalid QS function: {func}')
|
221
|
+
schema = QuickStartOption.registry[func]
|
222
|
+
if schema is None:
|
223
|
+
raise FieldValueError(f'HOPOPT: 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 HOPOPT 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 HOPOPT 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 HOPOPT 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 HOPOPT 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 HOPOPT 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 HOPOPT 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 HOPOPT SMF identification-based DPD options."""
|
364
371
|
|
365
372
|
#: TaggerID information.
|
@@ -398,7 +405,7 @@ class SMFIdentificationBasedDPDOption(SMFDPDOption):
|
|
398
405
|
|
399
406
|
|
400
407
|
@schema_final
|
401
|
-
class SMFHashBasedDPDOption(SMFDPDOption):
|
408
|
+
class SMFHashBasedDPDOption(SMFDPDOption, code=Enum_SMFDPDMode.H_DPD):
|
402
409
|
"""Header schema for HOPOPT SMF hash-based DPD options."""
|
403
410
|
|
404
411
|
#: Hash assist value (HAV).
|
@@ -423,7 +430,7 @@ class SMFHashBasedDPDOption(SMFDPDOption):
|
|
423
430
|
|
424
431
|
|
425
432
|
@schema_final
|
426
|
-
class PDMOption(Option):
|
433
|
+
class PDMOption(Option, code=Enum_Option.PDM):
|
427
434
|
"""Header schema for HOPOPT performance and diagnostic metrics (PDM) options."""
|
428
435
|
|
429
436
|
#: Scale delta time last received (DTLR).
|
@@ -472,9 +479,15 @@ class _QuickStartOption(Schema):
|
|
472
479
|
return ret
|
473
480
|
|
474
481
|
|
475
|
-
|
482
|
+
# register ``_QuickStartOption`` as ``Quick_Start`` option
|
483
|
+
Option.register(Enum_Option.Quick_Start, _QuickStartOption)
|
484
|
+
|
485
|
+
|
486
|
+
class QuickStartOption(Option, EnumSchema[Enum_QSFunction]):
|
476
487
|
"""Header schema for HOPOPT quick start options."""
|
477
488
|
|
489
|
+
__enum__: 'DefaultDict[Enum_QSFunction, Type[QuickStartOption]]' = collections.defaultdict(lambda: None) # type: ignore[arg-type,return-value]
|
490
|
+
|
478
491
|
#: Flags.
|
479
492
|
flags: 'QuickStartFlags' = BitField(length=1, namespace={
|
480
493
|
'func': (0, 4),
|
@@ -486,7 +499,7 @@ class QuickStartOption(Option):
|
|
486
499
|
|
487
500
|
|
488
501
|
@schema_final
|
489
|
-
class QuickStartRequestOption(QuickStartOption):
|
502
|
+
class QuickStartRequestOption(QuickStartOption, code=Enum_QSFunction.Quick_Start_Request):
|
490
503
|
"""Header schema for HOPOPT quick start request options."""
|
491
504
|
|
492
505
|
#: QS time-to-live (TTL).
|
@@ -502,7 +515,7 @@ class QuickStartRequestOption(QuickStartOption):
|
|
502
515
|
|
503
516
|
|
504
517
|
@schema_final
|
505
|
-
class QuickStartReportOption(QuickStartOption):
|
518
|
+
class QuickStartReportOption(QuickStartOption, code=Enum_QSFunction.Report_of_Approved_Rate):
|
506
519
|
"""Header schema for HOPOPT quick start report of approved rate options."""
|
507
520
|
|
508
521
|
#: Reserved.
|
@@ -518,7 +531,8 @@ class QuickStartReportOption(QuickStartOption):
|
|
518
531
|
|
519
532
|
|
520
533
|
@schema_final
|
521
|
-
class RPLOption(Option
|
534
|
+
class RPLOption(Option, code=[Enum_Option.RPL_Option_0x23,
|
535
|
+
Enum_Option.RPL_Option_0x63]):
|
522
536
|
"""Header schema for HOPOPT routing protocol for low-power and lossy networks (RPL) options."""
|
523
537
|
|
524
538
|
#: Flags.
|
@@ -538,7 +552,7 @@ class RPLOption(Option):
|
|
538
552
|
|
539
553
|
|
540
554
|
@schema_final
|
541
|
-
class MPLOption(Option):
|
555
|
+
class MPLOption(Option, code=Enum_Option.MPL_Option):
|
542
556
|
"""Header schema for HOPOPT multicast protocol for low-power and lossy networks (MPL) options."""
|
543
557
|
|
544
558
|
#: Flags.
|
@@ -579,7 +593,7 @@ class MPLOption(Option):
|
|
579
593
|
|
580
594
|
|
581
595
|
@schema_final
|
582
|
-
class ILNPOption(Option):
|
596
|
+
class ILNPOption(Option, code=Enum_Option.ILNP_Nonce):
|
583
597
|
"""Header schema for HOPOPT identifier-locator network protocol (ILNP) options."""
|
584
598
|
|
585
599
|
#: Nonce value.
|
@@ -590,7 +604,7 @@ class ILNPOption(Option):
|
|
590
604
|
|
591
605
|
|
592
606
|
@schema_final
|
593
|
-
class LineIdentificationOption(Option):
|
607
|
+
class LineIdentificationOption(Option, code=Enum_Option.Line_Identification_Option):
|
594
608
|
"""Header schema for HOPOPT line-identification options."""
|
595
609
|
|
596
610
|
#: Line ID length.
|
@@ -603,7 +617,7 @@ class LineIdentificationOption(Option):
|
|
603
617
|
|
604
618
|
|
605
619
|
@schema_final
|
606
|
-
class JumboPayloadOption(Option):
|
620
|
+
class JumboPayloadOption(Option, code=Enum_Option.Jumbo_Payload):
|
607
621
|
"""Header schema for HOPOPT jumbo payload options."""
|
608
622
|
|
609
623
|
#: Jumbo payload length.
|
@@ -614,7 +628,7 @@ class JumboPayloadOption(Option):
|
|
614
628
|
|
615
629
|
|
616
630
|
@schema_final
|
617
|
-
class HomeAddressOption(Option):
|
631
|
+
class HomeAddressOption(Option, code=Enum_Option.Home_Address):
|
618
632
|
"""Header schema for HOPOPT home address options."""
|
619
633
|
|
620
634
|
#: Home address.
|
@@ -625,7 +639,7 @@ class HomeAddressOption(Option):
|
|
625
639
|
|
626
640
|
|
627
641
|
@schema_final
|
628
|
-
class IPDFFOption(Option):
|
642
|
+
class IPDFFOption(Option, code=Enum_Option.IP_DFF):
|
629
643
|
"""Header schema for HOPOPT depth-first forwarding (``IP_DFF``) options."""
|
630
644
|
|
631
645
|
#: Flags.
|
@@ -654,23 +668,7 @@ class HOPOPT(Schema):
|
|
654
668
|
length=lambda pkt: pkt['len'] * 8 + 6,
|
655
669
|
base_schema=Option,
|
656
670
|
type_name='type',
|
657
|
-
registry=
|
658
|
-
Enum_Option.Pad1: PadOption,
|
659
|
-
Enum_Option.PadN: PadOption,
|
660
|
-
Enum_Option.Tunnel_Encapsulation_Limit: TunnelEncapsulationLimitOption,
|
661
|
-
Enum_Option.Router_Alert: RouterAlertOption,
|
662
|
-
Enum_Option.CALIPSO: CALIPSOOption,
|
663
|
-
Enum_Option.SMF_DPD: _SMFDPDOption,
|
664
|
-
Enum_Option.PDM: PDMOption,
|
665
|
-
Enum_Option.Quick_Start: _QuickStartOption,
|
666
|
-
Enum_Option.RPL_Option_0x63: RPLOption,
|
667
|
-
Enum_Option.MPL_Option: MPLOption,
|
668
|
-
Enum_Option.ILNP_Nonce: ILNPOption,
|
669
|
-
Enum_Option.Line_Identification_Option: LineIdentificationOption,
|
670
|
-
Enum_Option.Jumbo_Payload: JumboPayloadOption,
|
671
|
-
Enum_Option.Home_Address: HomeAddressOption,
|
672
|
-
Enum_Option.IP_DFF: IPDFFOption,
|
673
|
-
})
|
671
|
+
registry=Option.registry,
|
674
672
|
)
|
675
673
|
#: Payload.
|
676
674
|
payload: 'bytes' = PayloadField()
|
@@ -19,7 +19,7 @@ from pcapkit.corekit.fields.misc import (ConditionalField, ForwardMatchField, Pa
|
|
19
19
|
SchemaField, SwitchField)
|
20
20
|
from pcapkit.corekit.fields.numbers import EnumField, UInt8Field, UInt16Field, UInt32Field
|
21
21
|
from pcapkit.corekit.fields.strings import BitField, BytesField, PaddingField
|
22
|
-
from pcapkit.protocols.schema.schema import Schema, schema_final
|
22
|
+
from pcapkit.protocols.schema.schema import EnumSchema, Schema, schema_final
|
23
23
|
from pcapkit.utilities.exceptions import FieldValueError
|
24
24
|
from pcapkit.utilities.logging import SPHINX_TYPE_CHECKING
|
25
25
|
from pcapkit.utilities.warnings import ProtocolWarning, warn
|
@@ -39,7 +39,7 @@ __all__ = [
|
|
39
39
|
if TYPE_CHECKING:
|
40
40
|
from datetime import timedelta
|
41
41
|
from ipaddress import IPv4Address
|
42
|
-
from typing import Any, Optional
|
42
|
+
from typing import Any, DefaultDict, Optional, Type
|
43
43
|
|
44
44
|
from pcapkit.corekit.fields.field import _Field as Field
|
45
45
|
from pcapkit.corekit.multidict import OrderedMultiDict
|
@@ -112,26 +112,27 @@ def quick_start_data_selector(pkt: 'dict[str, Any]') -> 'Field':
|
|
112
112
|
|
113
113
|
Returns:
|
114
114
|
* If ``func`` is ``0``, returns a :class:`~pcapkit.corekit.fields.misc.SchemaField`
|
115
|
-
wrapped :class:`~pcapkit.protocols.schema.internet.
|
115
|
+
wrapped :class:`~pcapkit.protocols.schema.internet.ipv4.QuickStartRequestOption`
|
116
116
|
instance.
|
117
117
|
* If ``func`` is ``8``, returns a :class:`~pcapkit.corekit.fields.misc.SchemaField`
|
118
|
-
wrapped :class:`~pcapkit.protocols.schema.internet.
|
118
|
+
wrapped :class:`~pcapkit.protocols.schema.internet.ipv4.QuickStartReportOption`
|
119
119
|
instance.
|
120
120
|
|
121
121
|
"""
|
122
122
|
func = Enum_QSFunction.get(pkt['flags']['func'])
|
123
123
|
pkt['flags']['func'] = func
|
124
124
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
raise FieldValueError(f'HOPOPT: invalid QS function: {func}')
|
125
|
+
schema = QSOption.registry[func]
|
126
|
+
if schema is None:
|
127
|
+
raise FieldValueError(f'IPv4: invalid QS function: {func}')
|
128
|
+
return SchemaField(length=5, schema=schema)
|
130
129
|
|
131
130
|
|
132
|
-
class Option(
|
131
|
+
class Option(EnumSchema[Enum_OptionNumber]):
|
133
132
|
"""Header schema for IPv4 options."""
|
134
133
|
|
134
|
+
__default__ = lambda: UnassignedOption
|
135
|
+
|
135
136
|
#: Option type.
|
136
137
|
type: 'Enum_OptionNumber' = EnumField(length=1, namespace=Enum_OptionNumber)
|
137
138
|
#: Option length.
|
@@ -168,7 +169,7 @@ class UnassignedOption(Option):
|
|
168
169
|
|
169
170
|
|
170
171
|
@schema_final
|
171
|
-
class EOOLOption(Option):
|
172
|
+
class EOOLOption(Option, code=Enum_OptionNumber.EOOL):
|
172
173
|
"""Header schema for IPv4 end of option list (``EOOL``) option."""
|
173
174
|
|
174
175
|
if TYPE_CHECKING:
|
@@ -176,7 +177,7 @@ class EOOLOption(Option):
|
|
176
177
|
|
177
178
|
|
178
179
|
@schema_final
|
179
|
-
class NOPOption(Option):
|
180
|
+
class NOPOption(Option, code=Enum_OptionNumber.NOP):
|
180
181
|
"""Header schema for IPv4 no operation (``NOP``) option."""
|
181
182
|
|
182
183
|
if TYPE_CHECKING:
|
@@ -184,7 +185,7 @@ class NOPOption(Option):
|
|
184
185
|
|
185
186
|
|
186
187
|
@schema_final
|
187
|
-
class SECOption(Option):
|
188
|
+
class SECOption(Option, code=Enum_OptionNumber.SEC):
|
188
189
|
"""Header schema for IPv4 security (``SEC``) option."""
|
189
190
|
|
190
191
|
#: Classification level.
|
@@ -200,7 +201,7 @@ class SECOption(Option):
|
|
200
201
|
|
201
202
|
|
202
203
|
@schema_final
|
203
|
-
class LSROption(Option):
|
204
|
+
class LSROption(Option, code=Enum_OptionNumber.LSR):
|
204
205
|
"""Header schema for IPv4 loose source route (``LSR``) option."""
|
205
206
|
|
206
207
|
#: Pointer.
|
@@ -221,7 +222,7 @@ class LSROption(Option):
|
|
221
222
|
|
222
223
|
|
223
224
|
@schema_final
|
224
|
-
class TSOption(Option):
|
225
|
+
class TSOption(Option, code=Enum_OptionNumber.TS):
|
225
226
|
"""Header schema for IPv4 timestamp (``TS``) option."""
|
226
227
|
|
227
228
|
#: Pointer.
|
@@ -323,7 +324,7 @@ class TSOption(Option):
|
|
323
324
|
|
324
325
|
|
325
326
|
@schema_final
|
326
|
-
class ESECOption(Option):
|
327
|
+
class ESECOption(Option, code=Enum_OptionNumber.E_SEC):
|
327
328
|
"""Header schema for IPv4 extended security (``ESEC``) option."""
|
328
329
|
|
329
330
|
#: Additional security information format code.
|
@@ -339,7 +340,7 @@ class ESECOption(Option):
|
|
339
340
|
|
340
341
|
|
341
342
|
@schema_final
|
342
|
-
class RROption(Option):
|
343
|
+
class RROption(Option, code=Enum_OptionNumber.RR):
|
343
344
|
"""Header schema for IPv4 record route (``RR``) option."""
|
344
345
|
|
345
346
|
#: Pointer.
|
@@ -360,7 +361,7 @@ class RROption(Option):
|
|
360
361
|
|
361
362
|
|
362
363
|
@schema_final
|
363
|
-
class SIDOption(Option):
|
364
|
+
class SIDOption(Option, code=Enum_OptionNumber.SID):
|
364
365
|
"""Header schema for IPv4 stream identifier (``SID``) option."""
|
365
366
|
|
366
367
|
#: Stream identifier.
|
@@ -371,7 +372,7 @@ class SIDOption(Option):
|
|
371
372
|
|
372
373
|
|
373
374
|
@schema_final
|
374
|
-
class SSROption(Option):
|
375
|
+
class SSROption(Option, code=Enum_OptionNumber.SSR):
|
375
376
|
"""Header schema for IPv4 strict source route (``SSR``) option."""
|
376
377
|
|
377
378
|
#: Pointer.
|
@@ -392,7 +393,7 @@ class SSROption(Option):
|
|
392
393
|
|
393
394
|
|
394
395
|
@schema_final
|
395
|
-
class MTUPOption(Option):
|
396
|
+
class MTUPOption(Option, code=Enum_OptionNumber.MTUP):
|
396
397
|
"""Header schema for IPv4 MTU probe (``MTUP``) option."""
|
397
398
|
|
398
399
|
#: MTU.
|
@@ -403,7 +404,7 @@ class MTUPOption(Option):
|
|
403
404
|
|
404
405
|
|
405
406
|
@schema_final
|
406
|
-
class MTUROption(Option):
|
407
|
+
class MTUROption(Option, code=Enum_OptionNumber.MTUR):
|
407
408
|
"""Header schema for IPv4 MTU reply (``MTUR``) option."""
|
408
409
|
|
409
410
|
#: MTU.
|
@@ -414,7 +415,7 @@ class MTUROption(Option):
|
|
414
415
|
|
415
416
|
|
416
417
|
@schema_final
|
417
|
-
class TROption(Option):
|
418
|
+
class TROption(Option, code=Enum_OptionNumber.TR):
|
418
419
|
"""Header schema for IPv4 traceroute (``TR``) option."""
|
419
420
|
|
420
421
|
#: ID number.
|
@@ -431,7 +432,7 @@ class TROption(Option):
|
|
431
432
|
|
432
433
|
|
433
434
|
@schema_final
|
434
|
-
class RTRALTOption(Option):
|
435
|
+
class RTRALTOption(Option, code=Enum_OptionNumber.RTRALT):
|
435
436
|
"""Header schema for IPv4 router alert (``RTRALT``) option."""
|
436
437
|
|
437
438
|
#: Router alert value.
|
@@ -469,9 +470,15 @@ class _QSOption(Schema):
|
|
469
470
|
return ret
|
470
471
|
|
471
472
|
|
472
|
-
|
473
|
+
# register ``_QSOption`` as ``QS`` option
|
474
|
+
Option.register(Enum_OptionNumber.QS, _QSOption)
|
475
|
+
|
476
|
+
|
477
|
+
class QSOption(Option, EnumSchema[Enum_QSFunction]):
|
473
478
|
"""Header schema for IPV4 quick start (``QS``) options."""
|
474
479
|
|
480
|
+
__enum__: 'DefaultDict[Enum_QSFunction, Type[QSOption]]' = collections.defaultdict(lambda: None) # type: ignore[return-value,arg-type]
|
481
|
+
|
475
482
|
#: Flags.
|
476
483
|
flags: 'QuickStartFlags' = BitField(length=1, namespace={
|
477
484
|
'func': (0, 4),
|
@@ -483,7 +490,7 @@ class QSOption(Option):
|
|
483
490
|
|
484
491
|
|
485
492
|
@schema_final
|
486
|
-
class QuickStartRequestOption(QSOption):
|
493
|
+
class QuickStartRequestOption(QSOption, code=Enum_QSFunction.Quick_Start_Request):
|
487
494
|
"""Header schema for IPV4 quick start request options."""
|
488
495
|
|
489
496
|
#: QS time-to-live (TTL).
|
@@ -499,7 +506,7 @@ class QuickStartRequestOption(QSOption):
|
|
499
506
|
|
500
507
|
|
501
508
|
@schema_final
|
502
|
-
class QuickStartReportOption(QSOption):
|
509
|
+
class QuickStartReportOption(QSOption, code=Enum_QSFunction.Report_of_Approved_Rate):
|
503
510
|
"""Header schema for IPV4 quick start report of approved rate options."""
|
504
511
|
|
505
512
|
#: QS nonce.
|
@@ -554,21 +561,9 @@ class IPv4(Schema):
|
|
554
561
|
length=lambda pkt: pkt['vihl']['ihl'] * 4 - 20,
|
555
562
|
base_schema=Option,
|
556
563
|
type_name='type',
|
557
|
-
registry=
|
558
|
-
|
559
|
-
|
560
|
-
Enum_OptionNumber.SEC: SECOption,
|
561
|
-
Enum_OptionNumber.LSR: LSROption,
|
562
|
-
Enum_OptionNumber.E_SEC: ESECOption,
|
563
|
-
Enum_OptionNumber.RR: RROption,
|
564
|
-
Enum_OptionNumber.SID: SIDOption,
|
565
|
-
Enum_OptionNumber.SSR: SSROption,
|
566
|
-
Enum_OptionNumber.MTUP: MTUPOption,
|
567
|
-
Enum_OptionNumber.MTUR: MTUROption,
|
568
|
-
Enum_OptionNumber.TR: TROption,
|
569
|
-
Enum_OptionNumber.RTRALT: RTRALTOption,
|
570
|
-
Enum_OptionNumber.QS: _QSOption,
|
571
|
-
}))
|
564
|
+
registry=Option.registry,
|
565
|
+
eool=Enum_OptionNumber.EOOL,
|
566
|
+
)
|
572
567
|
#: Padding.
|
573
568
|
padding: 'bytes' = PaddingField(length=lambda pkt: pkt.get('__option_padding__', 0))
|
574
569
|
#: Payload.
|