2828from pcapkit .utilities .exceptions import (CallableError , FileNotFound , FormatError , IterableError ,
2929 UnsupportedCall , stacklevel )
3030from pcapkit .utilities .warnings import EngineWarning , FormatWarning , warn
31+ from pcapkit .foundation .reassembly .data import ReassemblyData
32+ from pcapkit .foundation .traceflow .data import TraceFlowData
33+ from pcapkit .utilities .logging import logger
3134
3235if TYPE_CHECKING :
3336 from types import ModuleType , TracebackType
4043 from typing_extensions import Literal
4144
4245 from pcapkit .foundation .engines .engine import Engine
43- from pcapkit .foundation .reassembly .data import ReassemblyData
44- from pcapkit .foundation .traceflow .data import TraceFlowData
4546 from pcapkit .protocols .misc .pcap .frame import Frame
4647 from pcapkit .protocols .misc .pcapng import PCAPNG
4748 from pcapkit .protocols .protocol import Protocol
@@ -208,7 +209,7 @@ def frame(self) -> 'tuple[Packet, ...]':
208209
209210 Raises:
210211 UnsupportedCall: If :attr:`self._flag_d <pcapkit.foundation.extraction.Extractor._flag_d>`
211- is :data:`True `, as storing frame data is disabled.
212+ is :data:`False `, as storing frame data is disabled.
212213
213214 """
214215 if self ._flag_d :
@@ -219,25 +220,41 @@ def frame(self) -> 'tuple[Packet, ...]':
219220 def reassembly (self ) -> 'ReassemblyData' :
220221 """Frame record for reassembly.
221222
222- * ``ipv4`` -- tuple of TCP payload fragment (:term:`reasm.ipv4.datagram`)
223- * ``ipv6`` -- tuple of TCP payload fragment (:term:`reasm.ipv6.datagram`)
223+ * ``ipv4`` -- tuple of IPv4 payload fragment (:term:`reasm.ipv4.datagram`)
224+ * ``ipv6`` -- tuple of IPv6 payload fragment (:term:`reasm.ipv6.datagram`)
224225 * ``tcp`` -- tuple of TCP payload fragment (:term:`reasm.tcp.datagram`)
225226
227+ Raises:
228+ UnsupportedCall: If :attr:`self._flag_r <pcapkit.foundation.extraction.Extractor._flag_r>`
229+ is :data:`False`, as reassembly is disabled.
230+
226231 """
227- data = ReassemblyData (
228- ipv4 = tuple (self ._reasm .ipv4 .datagram ) if self ._ipv4 else None ,
229- ipv6 = tuple (self ._reasm .ipv6 .datagram ) if self ._ipv6 else None ,
230- tcp = tuple (self ._reasm .tcp .datagram ) if self ._tcp else None ,
231- )
232- return data
232+ if self ._flag_r :
233+ data = ReassemblyData (
234+ ipv4 = tuple (self ._reasm .ipv4 .datagram ) if self ._ipv4 else None ,
235+ ipv6 = tuple (self ._reasm .ipv6 .datagram ) if self ._ipv6 else None ,
236+ tcp = tuple (self ._reasm .tcp .datagram ) if self ._tcp else None ,
237+ )
238+ return data
239+ raise UnsupportedCall ("'Extractor(reassembly=False)' object has no attribute 'reassembly'" )
233240
234241 @property
235242 def trace (self ) -> 'TraceFlowData' :
236- """Index table for traced flow."""
237- data = TraceFlowData (
238- tcp = tuple (self ._trace .tcp .index ) if self ._tcp else None ,
239- )
240- return data
243+ """Index table for traced flow.
244+
245+ * ``tcp`` -- tuple of TCP flows (:term:`trace.tcp.index`)
246+
247+ Raises:
248+ UnsupportedCall: If :attr:`self._flag_t <pcapkit.foundation.extraction.Extractor._flag_t>`
249+ is :data:`False`, as flow tracing is disabled.
250+
251+ """
252+ if self ._flag_t :
253+ data = TraceFlowData (
254+ tcp = tuple (self ._trace .tcp .index ) if self ._tcp else None ,
255+ )
256+ return data
257+ raise UnsupportedCall ("'Extractor(trace=False)' object has no attribute 'trace'" )
241258
242259 @property
243260 def engine (self ) -> 'Engine' :
@@ -536,10 +553,11 @@ def __init__(self,
536553 trace_byteorder: output file byte order
537554 trace_nanosecond: output nanosecond-resolution file flag
538555
539- ip: if record data for IPv4 & IPv6 reassembly
540- ipv4: if perform IPv4 reassembly
541- ipv6: if perform IPv6 reassembly
556+ ip: if record data for IPv4 & IPv6 reassembly (must be used with ``reassembly=True``)
557+ ipv4: if perform IPv4 reassembly (must be used with ``reassembly=True``)
558+ ipv6: if perform IPv6 reassembly (must be used with ``reassembly=True``)
542559 tcp: if perform TCP reassembly and/or flow tracing
560+ (must be used with ``reassembly=True`` or ``trace=True``)
543561
544562 Warns:
545563 FormatWarning: Warns under following circumstances:
@@ -599,6 +617,13 @@ def __init__(self,
599617 from pcapkit .foundation .reassembly .ipv6 import IPv6 as IPv6_Reassembly
600618 from pcapkit .foundation .reassembly .tcp import TCP as TCP_Reassembly
601619
620+ if self ._ipv4 :
621+ logger .info ('IPv4 reassembly enabled' )
622+ if self ._ipv6 :
623+ logger .info ('IPv6 reassembly enabled' )
624+ if self ._tcp :
625+ logger .info ('TCP reassembly enabled' )
626+
602627 self ._reasm = ReassemblyManager (
603628 ipv4 = IPv4_Reassembly (strict = strict ) if self ._ipv4 else None ,
604629 ipv6 = IPv6_Reassembly (strict = strict ) if self ._ipv6 else None ,
@@ -613,6 +638,9 @@ def __init__(self,
613638 "using 'trace_format=None' instead" , FormatWarning , stacklevel = stacklevel ())
614639 trace_format = None
615640
641+ if self ._tcp :
642+ logger .info ('TCP flow tracing enabled' )
643+
616644 self ._trace = TraceFlowManager (
617645 tcp = TCP_TraceFlow (fout = trace_fout , format = trace_format , byteorder = trace_byteorder ,
618646 nanosecond = trace_nanosecond ) if self ._tcp else None ,
0 commit comments