pypcapkit 1.0.3.post3__pp38-none-any.whl → 1.1.0.post1__pp38-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
@@ -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
- 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'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
- 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'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(Schema):
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
- 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 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
- class QuickStartOption(Option):
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=collections.defaultdict(lambda: UnassignedOption, {
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.hopopt.QuickStartRequestOption`
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.hopopt.QuickStartReportOption`
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
- if func == Enum_QSFunction.Quick_Start_Request:
126
- return SchemaField(length=5, schema=QuickStartRequestOption)
127
- if func == Enum_QSFunction.Report_of_Approved_Rate:
128
- return SchemaField(length=5, schema=QuickStartReportOption)
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(Schema):
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
- class QSOption(Option):
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=collections.defaultdict(lambda: UnassignedOption, {
558
- Enum_OptionNumber.EOOL: EOOLOption,
559
- Enum_OptionNumber.NOP: NOPOption,
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.