31
31
from pcapkit .protocols .transport .udp import UDP
32
32
from pcapkit .utilities .exceptions import RegistryError
33
33
from pcapkit .utilities .logging import logger
34
+ from pcapkit .protocols .misc .pcapng import PCAPNG
34
35
35
36
if TYPE_CHECKING :
36
37
from typing import Type
37
38
38
39
from typing_extensions import Literal
39
40
41
+ from pcapkit .const .pcapng .block_type import BlockType as PCAPNG_BlockType
42
+ from pcapkit .const .pcapng .option_type import OptionType as PCAPNG_OptionType
43
+ from pcapkit .const .pcapng .secrets_type import SecretsType as PCAPNG_SecretsType
44
+ from pcapkit .const .pcapng .record_type import RecordType as PCAPNG_RecordType
40
45
from pcapkit .const .hip .parameter import Parameter as HIP_Parameter
41
46
from pcapkit .const .http .frame import Frame as HTTP_Frame
42
47
from pcapkit .const .ipv4 .option_number import OptionNumber as IPv4_OptionNumber
65
70
from pcapkit .protocols .transport .tcp import OptionConstructor as TCP_OptionConstructor
66
71
from pcapkit .protocols .transport .tcp import OptionParser as TCP_OptionParser
67
72
73
+ from pcapkit .protocols .misc .pcapng import BlockParser as PCAPNG_BlockParser
74
+ from pcapkit .protocols .misc .pcapng import BlockConstructor as PCAPNG_BlockConstructor
75
+ from pcapkit .protocols .misc .pcapng import OptionParser as PCAPNG_OptionParser
76
+ from pcapkit .protocols .misc .pcapng import OptionConstructor as PCAPNG_OptionConstructor
77
+ from pcapkit .protocols .misc .pcapng import SecretsParser as PCAPNG_SecretsParser
78
+ from pcapkit .protocols .misc .pcapng import SecretsConstructor as PCAPNG_SecretsConstructor
79
+ from pcapkit .protocols .misc .pcapng import RecordParser as PCAPNG_RecordParser
80
+ from pcapkit .protocols .misc .pcapng import RecordConstructor as PCAPNG_RecordConstructor
81
+
68
82
__all__ = [
69
83
'register_protocol' ,
70
84
71
- 'register_linktype' , 'register_pcap' ,
85
+ 'register_linktype' , 'register_pcap' , 'register_pcapng' ,
72
86
'register_ethertype' , 'register_transtype' ,
73
87
'register_port' , 'register_tcp_port' , 'register_udp_port' ,
74
88
75
89
'register_output' ,
76
90
'register_extractor_dumper' , 'register_extractor_engine' ,
77
91
'register_traceflow' ,
78
92
93
+ 'register_pcapng_block' , 'register_pcapng_option' , 'register_pcapng_secrets' ,
94
+ 'register_pcapng_record' ,
79
95
'register_hopopt' , 'register_ipv6_opts' , 'register_ipv6_route' ,
80
96
'register_ipv4' , 'register_hip' ,
81
97
'register_tcp' , 'register_mptcp' ,
82
98
'register_http' ,
83
99
]
84
100
85
101
###############################################################################
86
- # pcapkit.protocols.Protocol.__proto__
102
+ # pcapkit.protocols.Protocol
87
103
###############################################################################
88
104
89
105
@@ -106,7 +122,7 @@ def register_protocol(protocol: 'Type[Protocol]') -> 'None':
106
122
107
123
108
124
###############################################################################
109
- # pcapkit.foundation.extraction.Extractor.__output__
125
+ # pcapkit.foundation.extraction.Extractor
110
126
###############################################################################
111
127
112
128
@@ -135,11 +151,6 @@ def register_extractor_dumper(format: 'str', module: 'str', class_: 'str', ext:
135
151
logger .info ('registered extractor output dumper: %s' , format )
136
152
137
153
138
- ###############################################################################
139
- # pcapkit.foundation.extraction.Extractor.__engine__
140
- ###############################################################################
141
-
142
-
143
154
def register_extractor_engine (engine : 'str' , module : 'str' , class_ : 'str' ) -> 'None' : # pylint: disable=redefined-builtin
144
155
r"""Registered a new engine class.
145
156
@@ -165,7 +176,7 @@ def register_extractor_engine(engine: 'str', module: 'str', class_: 'str') -> 'N
165
176
166
177
167
178
###############################################################################
168
- # pcapkit.foundation.traceflow.TraceFlow.__output__
179
+ # pcapkit.foundation.traceflow.TraceFlow
169
180
###############################################################################
170
181
171
182
@@ -195,7 +206,7 @@ def register_traceflow(format: 'str', module: 'str', class_: 'str', ext: 'str')
195
206
196
207
197
208
###############################################################################
198
- # pcapkit.protocols.application.httpv2.HTTPv2.__frame__
209
+ # pcapkit.protocols.application.httpv2.HTTPv2
199
210
###############################################################################
200
211
201
212
@@ -243,7 +254,7 @@ def register_hip(code: 'HIP_Parameter', meth: 'str | tuple[HIP_ParameterParser,
243
254
244
255
245
256
###############################################################################
246
- # pcapkit.protocols.internet.hopopt.HOPOPT.__option__
257
+ # pcapkit.protocols.internet.hopopt.HOPOPT
247
258
###############################################################################
248
259
249
260
@@ -267,7 +278,7 @@ def register_hopopt(code: 'IPv6_Option', meth: 'str | tuple[HOPOPT_OptionParser,
267
278
268
279
269
280
###############################################################################
270
- # pcapkit.protocols.internet.internet.Internet.__proto__
281
+ # pcapkit.protocols.internet.internet.Internet
271
282
###############################################################################
272
283
273
284
@@ -323,7 +334,7 @@ def register_ipv4(code: 'IPv4_OptionNumber', meth: 'str | tuple[IPv4_OptionParse
323
334
324
335
325
336
###############################################################################
326
- # pcapkit.protocols.internet.ipv6_opts.IPv6_Opts.__option__
337
+ # pcapkit.protocols.internet.ipv6_opts.IPv6_Opts
327
338
###############################################################################
328
339
329
340
@@ -347,7 +358,7 @@ def register_ipv6_opts(code: 'IPv6_Option', meth: 'str | tuple[IPv6_Opts_OptionP
347
358
348
359
349
360
###############################################################################
350
- # pcapkit.protocols.internet.ipv6_route.IPv6_Route.__routing__
361
+ # pcapkit.protocols.internet.ipv6_route.IPv6_Route
351
362
###############################################################################
352
363
353
364
@@ -371,7 +382,7 @@ def register_ipv6_route(code: 'IPv6_Routing', meth: 'str | tuple[IPv6_Route_Type
371
382
372
383
373
384
###############################################################################
374
- # pcapkit.protocols.link.link.Link.__proto__
385
+ # pcapkit.protocols.link.link.Link
375
386
###############################################################################
376
387
377
388
@@ -403,7 +414,7 @@ def register_ethertype(code: 'EtherType', module: str, class_: str) -> 'None':
403
414
404
415
405
416
###############################################################################
406
- # pcapkit.protocols.misc.pcap.frame.Frame.__proto__
417
+ # pcapkit.protocols.misc.pcap.frame.Frame
407
418
###############################################################################
408
419
409
420
@@ -428,14 +439,123 @@ def register_pcap(code: 'LinkType', module: str, class_: str) -> 'None':
428
439
raise RegistryError ('protocol must be a Protocol subclass' )
429
440
430
441
Frame .register (code , module , class_ )
431
- logger .info ('registered PCAP frame protocol: %s' , code .name )
442
+ logger .info ('registered PCAP linktype protocol: %s' , code .name )
443
+
444
+ # register protocol to protocol registry
445
+ register_protocol (protocol )
446
+
447
+
448
+ ###############################################################################
449
+ # pcapkit.protocols.misc.pcapng.PCAPNG
450
+ ###############################################################################
451
+
452
+
453
+ def register_pcapng (code : 'LinkType' , module : str , class_ : str ) -> 'None' :
454
+ r"""Register a new protocol class.
455
+
456
+ Notes:
457
+ The full qualified class name of the new protocol class
458
+ should be as ``{module}.{class_}``.
459
+
460
+ The function will register the given protocol class to the
461
+ :data:`pcapkit.protocols.misc.pcapng.PCAPNG.__proto__` registry.
462
+
463
+ Arguments:
464
+ code: protocol code as in :class:`~pcapkit.const.reg.linktype.LinkType`
465
+ module: module name
466
+ class\_: class name
467
+
468
+ """
469
+ protocol = getattr (importlib .import_module (module ), class_ )
470
+ if not issubclass (protocol , Protocol ):
471
+ raise RegistryError ('protocol must be a Protocol subclass' )
472
+
473
+ PCAPNG .register (code , module , class_ )
474
+ logger .info ('registered PCAP-NG linktype protocol: %s' , code .name )
432
475
433
476
# register protocol to protocol registry
434
477
register_protocol (protocol )
435
478
436
479
480
+ def register_pcapng_block (code : 'PCAPNG_BlockType' , meth : 'str | tuple[PCAPNG_BlockParser, PCAPNG_BlockConstructor]' ) -> 'None' :
481
+ """Registered a block parser.
482
+
483
+ The function will register the given block parser to the
484
+ :data:`pcapkit.protocols.misc.pcapng.PCAPNG.__block__` registry.
485
+
486
+ Args:
487
+ code: :class:`HTTP/2 <pcapkit.protocols.misc.pcapng.PCAPNG>` block type
488
+ code as in :class:`~pcapkit.const.pcapng.block_type.BlockType`.
489
+ meth: Method name or callable to parse and/or construct the block.
490
+
491
+ """
492
+ if isinstance (meth , str ) and not hasattr (PCAPNG , f'_read_block_{ meth } ' ):
493
+ raise RegistryError ('method must be a block parser function' )
494
+
495
+ PCAPNG .register_block (code , meth )
496
+ logger .info ('registered PCAP-NG block parser: %s' , code .name )
497
+
498
+
499
+ def register_pcapng_option (code : 'PCAPNG_OptionType' , meth : 'str | tuple[PCAPNG_OptionParser, PCAPNG_OptionConstructor]' ) -> 'None' :
500
+ """Registered a option parser.
501
+
502
+ The function will register the given option parser to the
503
+ :data:`pcapkit.protocols.misc.pcapng.PCAPNG.__option__` registry.
504
+
505
+ Args:
506
+ code: :class:`PCAPNG <pcapkit.protocols.misc.pcapng.PCAPNG>` option type
507
+ code as in :class:`~pcapkit.const.pcapng.option_type.OptionType`.
508
+ meth: Method name or callable to parse and/or construct the option.
509
+
510
+ """
511
+ if isinstance (meth , str ) and not hasattr (PCAPNG , f'_read_option_{ meth } ' ):
512
+ raise RegistryError ('method must be a option parser function' )
513
+
514
+ PCAPNG .register_option (code , meth )
515
+ logger .info ('registered PCAP-NG option parser: %s' , code .name )
516
+
517
+
518
+ def register_pcapng_record (code : 'PCAPNG_RecordType' , meth : 'str | tuple[PCAPNG_RecordParser, PCAPNG_RecordConstructor]' ) -> 'None' :
519
+ """Registered a name resolution record parser.
520
+
521
+ The function will register the given name resolution record parser to the
522
+ :data:`pcapkit.protocols.misc.pcapng.PCAPNG.__record__` registry.
523
+
524
+ Args:
525
+ code: :class:`PCAPNG <pcapkit.protocols.misc.pcapng.PCAPNG>` name
526
+ resolution record type code as in :class:`~pcapkit.const.pcapng.record_type.RecordType`.
527
+ meth: Method name or callable to parse and/or construct the name
528
+ resolution record.
529
+
530
+ """
531
+ if isinstance (meth , str ) and not hasattr (PCAPNG , f'_read_record_{ meth } ' ):
532
+ raise RegistryError ('method must be a name resolution record parser function' )
533
+
534
+ PCAPNG .register_record (code , meth )
535
+ logger .info ('registered PCAP-NG name resolution record parser: %s' , code .name )
536
+
537
+
538
+ def register_pcapng_secrets (code : 'PCAPNG_SecretsType' , meth : 'str | tuple[PCAPNG_SecretsParser, PCAPNG_SecretsConstructor]' ) -> 'None' :
539
+ """Registered a decryption secrets parser.
540
+
541
+ The function will register the given decryption secrets parser to the
542
+ :data:`pcapkit.protocols.misc.pcapng.PCAPNG.__secrets__` registry.
543
+
544
+ Args:
545
+ code: :class:`PCAPNG <pcapkit.protocols.misc.pcapng.PCAPNG>` decryption
546
+ secrets type code as in :class:`~pcapkit.const.pcapng.secrets_type.SecretsType`.
547
+ meth: Method name or callable to parse and/or construct the decryption secrets.
548
+
549
+ """
550
+ if isinstance (meth , str ) and not hasattr (PCAPNG , f'_read_secrets_{ meth } ' ):
551
+ raise RegistryError ('method must be a decryption secrets parser function' )
552
+
553
+ PCAPNG .register_secrets (code , meth )
554
+ logger .info ('registered PCAP-NG decryption secrets parser: %s' , code .name )
555
+
556
+
437
557
###############################################################################
438
- # pcapkit.protocols.transport.tcp.TCP.__option__
558
+ # pcapkit.protocols.transport.tcp.TCP
439
559
###############################################################################
440
560
441
561
@@ -458,11 +578,6 @@ def register_tcp(code: 'TCP_Option', meth: 'str | tuple[TCP_OptionParser, TCP_Op
458
578
logger .info ('registered TCP option parser: %s' , code .name )
459
579
460
580
461
- ###############################################################################
462
- # pcapkit.protocols.transport.tcp.TCP.__mp_option__
463
- ###############################################################################
464
-
465
-
466
581
def register_mptcp (code : 'TCP_MPTCPOption' , meth : 'str | tuple[TCP_MPOptionParser, TCP_MPOptionConstructor]' ) -> 'None' :
467
582
"""Register an MPTCP option parser.
468
583
@@ -482,11 +597,6 @@ def register_mptcp(code: 'TCP_MPTCPOption', meth: 'str | tuple[TCP_MPOptionParse
482
597
logger .info ('registered MPTCP option parser: %s' , code .name )
483
598
484
599
485
- ###############################################################################
486
- # pcapkit.protocols.transport.tcp.TCP.__proto__
487
- ###############################################################################
488
-
489
-
490
600
def register_tcp_port (code : 'int' , module : str , class_ : str ) -> 'None' :
491
601
r"""Register a new protocol class.
492
602
@@ -515,7 +625,7 @@ def register_tcp_port(code: 'int', module: str, class_: str) -> 'None':
515
625
516
626
517
627
###############################################################################
518
- # pcapkit.protocols.transport.udp.UDP.__proto__
628
+ # pcapkit.protocols.transport.udp.UDP
519
629
###############################################################################
520
630
521
631
@@ -590,10 +700,14 @@ def register_linktype(code: 'LinkType', module: str, class_: str) -> 'None':
590
700
should be as ``{module}.{class_}``.
591
701
592
702
The function will register the given protocol class to the
593
- :data:`pcapkit.protocols.misc.pcap.frame.Frame.__proto__` registry.
703
+ following registries:
704
+
705
+ - :data:`pcapkit.protocols.misc.pcap.frame.Frame.__proto__`
706
+ - :data:`pcapkit.protocols.misc.pcapng.PCAPNG.__proto__`
594
707
595
708
See Also:
596
709
* :func:`pcapkit.foundation.registry.register_pcap`
710
+ * :func:`pcapkit.foundation.registry.register_pcapng`
597
711
598
712
Arguments:
599
713
code: protocol code as in :class:`~pcapkit.const.reg.linktype.LinkType`
@@ -606,6 +720,7 @@ def register_linktype(code: 'LinkType', module: str, class_: str) -> 'None':
606
720
raise RegistryError ('protocol must be a Protocol subclass' )
607
721
608
722
Frame .register (code , module , class_ )
723
+ PCAPNG .register (code , module , class_ )
609
724
logger .info ('registered linktype protocol: %s' , code .name )
610
725
611
726
# register protocol to protocol registry
0 commit comments