pypcapkit 1.3.3.post1__cp313-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 +126 -0
- pcapkit/__main__.py +138 -0
- pcapkit/all.py +136 -0
- pcapkit/const/__init__.py +81 -0
- pcapkit/const/arp/__init__.py +25 -0
- pcapkit/const/arp/hardware.py +181 -0
- pcapkit/const/arp/operation.py +131 -0
- pcapkit/const/ftp/__init__.py +25 -0
- pcapkit/const/ftp/command.py +309 -0
- pcapkit/const/ftp/return_code.py +304 -0
- pcapkit/const/hip/__init__.py +94 -0
- pcapkit/const/hip/certificate.py +77 -0
- pcapkit/const/hip/cipher.py +65 -0
- pcapkit/const/hip/di.py +59 -0
- pcapkit/const/hip/ecdsa_curve.py +59 -0
- pcapkit/const/hip/ecdsa_low_curve.py +56 -0
- pcapkit/const/hip/eddsa_curve.py +65 -0
- pcapkit/const/hip/esp_transform_suite.py +98 -0
- pcapkit/const/hip/group.py +86 -0
- pcapkit/const/hip/hi_algorithm.py +86 -0
- pcapkit/const/hip/hit_suite.py +68 -0
- pcapkit/const/hip/nat_traversal.py +62 -0
- pcapkit/const/hip/notify_message.py +200 -0
- pcapkit/const/hip/packet.py +89 -0
- pcapkit/const/hip/parameter.py +377 -0
- pcapkit/const/hip/registration.py +68 -0
- pcapkit/const/hip/registration_failure.py +84 -0
- pcapkit/const/hip/suite.py +71 -0
- pcapkit/const/hip/transport.py +59 -0
- pcapkit/const/http/__init__.py +39 -0
- pcapkit/const/http/error_code.py +95 -0
- pcapkit/const/http/frame.py +95 -0
- pcapkit/const/http/method.py +184 -0
- pcapkit/const/http/setting.py +96 -0
- pcapkit/const/http/status_code.py +294 -0
- pcapkit/const/ipv4/__init__.py +57 -0
- pcapkit/const/ipv4/classification_level.py +64 -0
- pcapkit/const/ipv4/option_class.py +55 -0
- pcapkit/const/ipv4/option_number.py +137 -0
- pcapkit/const/ipv4/protection_authority.py +63 -0
- pcapkit/const/ipv4/qs_function.py +51 -0
- pcapkit/const/ipv4/router_alert.py +251 -0
- pcapkit/const/ipv4/tos_del.py +51 -0
- pcapkit/const/ipv4/tos_ecn.py +55 -0
- pcapkit/const/ipv4/tos_pre.py +63 -0
- pcapkit/const/ipv4/tos_rel.py +51 -0
- pcapkit/const/ipv4/tos_thr.py +51 -0
- pcapkit/const/ipv4/ts_flag.py +53 -0
- pcapkit/const/ipv6/__init__.py +53 -0
- pcapkit/const/ipv6/extension_header.py +66 -0
- pcapkit/const/ipv6/option.py +137 -0
- pcapkit/const/ipv6/option_action.py +55 -0
- pcapkit/const/ipv6/qs_function.py +51 -0
- pcapkit/const/ipv6/router_alert.py +266 -0
- pcapkit/const/ipv6/routing.py +80 -0
- pcapkit/const/ipv6/seed_id.py +55 -0
- pcapkit/const/ipv6/smf_dpd_mode.py +51 -0
- pcapkit/const/ipv6/tagger_id.py +62 -0
- pcapkit/const/ipx/__init__.py +27 -0
- pcapkit/const/ipx/packet.py +72 -0
- pcapkit/const/ipx/socket.py +104 -0
- pcapkit/const/l2tp/__init__.py +21 -0
- pcapkit/const/l2tp/type.py +51 -0
- pcapkit/const/mh/__init__.py +204 -0
- pcapkit/const/mh/access_type.py +92 -0
- pcapkit/const/mh/ack_status_code.py +71 -0
- pcapkit/const/mh/ani_suboption.py +74 -0
- pcapkit/const/mh/auth_subtype.py +53 -0
- pcapkit/const/mh/binding_ack_flag.py +66 -0
- pcapkit/const/mh/binding_error.py +51 -0
- pcapkit/const/mh/binding_revocation.py +59 -0
- pcapkit/const/mh/binding_update_flag.py +81 -0
- pcapkit/const/mh/cga_extension.py +66 -0
- pcapkit/const/mh/cga_sec.py +57 -0
- pcapkit/const/mh/cga_type.py +68 -0
- pcapkit/const/mh/dhcp_support_mode.py +53 -0
- pcapkit/const/mh/dns_status_code.py +65 -0
- pcapkit/const/mh/dsmip6_tls_packet.py +62 -0
- pcapkit/const/mh/dsmipv6_home_address.py +74 -0
- pcapkit/const/mh/enumerating_algorithm.py +56 -0
- pcapkit/const/mh/fb_ack_status.py +62 -0
- pcapkit/const/mh/fb_action.py +71 -0
- pcapkit/const/mh/fb_indication_trigger.py +65 -0
- pcapkit/const/mh/fb_type.py +59 -0
- pcapkit/const/mh/flow_id_status.py +77 -0
- pcapkit/const/mh/flow_id_suboption.py +71 -0
- pcapkit/const/mh/handoff_type.py +71 -0
- pcapkit/const/mh/handover_ack_flag.py +54 -0
- pcapkit/const/mh/handover_ack_status.py +92 -0
- pcapkit/const/mh/handover_initiate_flag.py +57 -0
- pcapkit/const/mh/handover_initiate_status.py +62 -0
- pcapkit/const/mh/home_address_reply.py +71 -0
- pcapkit/const/mh/lla_code.py +63 -0
- pcapkit/const/mh/lma_mag_suboption.py +59 -0
- pcapkit/const/mh/mn_group_id.py +59 -0
- pcapkit/const/mh/mn_id_subtype.py +77 -0
- pcapkit/const/mh/operator_id.py +63 -0
- pcapkit/const/mh/option.py +260 -0
- pcapkit/const/mh/packet.py +119 -0
- pcapkit/const/mh/qos_attribute.py +89 -0
- pcapkit/const/mh/revocation_status_code.py +83 -0
- pcapkit/const/mh/revocation_trigger.py +86 -0
- pcapkit/const/mh/status_code.py +232 -0
- pcapkit/const/mh/traffic_selector.py +62 -0
- pcapkit/const/mh/upa_status.py +71 -0
- pcapkit/const/mh/upn_reason.py +80 -0
- pcapkit/const/ospf/__init__.py +27 -0
- pcapkit/const/ospf/authentication.py +65 -0
- pcapkit/const/ospf/packet.py +71 -0
- pcapkit/const/pcapng/__init__.py +51 -0
- pcapkit/const/pcapng/block_type.py +152 -0
- pcapkit/const/pcapng/filter_type.py +48 -0
- pcapkit/const/pcapng/hash_algorithm.py +59 -0
- pcapkit/const/pcapng/option_type.py +233 -0
- pcapkit/const/pcapng/record_type.py +57 -0
- pcapkit/const/pcapng/secrets_type.py +56 -0
- pcapkit/const/pcapng/verdict_type.py +53 -0
- pcapkit/const/reg/__init__.py +34 -0
- pcapkit/const/reg/apptype.py +32702 -0
- pcapkit/const/reg/ethertype.py +714 -0
- pcapkit/const/reg/linktype.py +902 -0
- pcapkit/const/reg/transtype.py +523 -0
- pcapkit/const/tcp/__init__.py +35 -0
- pcapkit/const/tcp/checksum.py +55 -0
- pcapkit/const/tcp/flags.py +73 -0
- pcapkit/const/tcp/mp_tcp_option.py +80 -0
- pcapkit/const/tcp/option.py +198 -0
- pcapkit/const/vlan/__init__.py +23 -0
- pcapkit/const/vlan/priority_level.py +71 -0
- pcapkit/corekit/__init__.py +59 -0
- pcapkit/corekit/fields/__init__.py +45 -0
- pcapkit/corekit/fields/collections.py +282 -0
- pcapkit/corekit/fields/field.py +269 -0
- pcapkit/corekit/fields/ipaddress.py +274 -0
- pcapkit/corekit/fields/misc.py +722 -0
- pcapkit/corekit/fields/numbers.py +375 -0
- pcapkit/corekit/fields/strings.py +245 -0
- pcapkit/corekit/infoclass.py +394 -0
- pcapkit/corekit/io.py +506 -0
- pcapkit/corekit/module.py +39 -0
- pcapkit/corekit/multidict.py +626 -0
- pcapkit/corekit/protochain.py +263 -0
- pcapkit/corekit/version.py +33 -0
- pcapkit/dumpkit/__init__.py +15 -0
- pcapkit/dumpkit/common.py +199 -0
- pcapkit/dumpkit/null.py +77 -0
- pcapkit/dumpkit/pcap.py +144 -0
- pcapkit/foundation/__init__.py +45 -0
- pcapkit/foundation/engines/__init__.py +36 -0
- pcapkit/foundation/engines/dpkt.py +230 -0
- pcapkit/foundation/engines/engine.py +194 -0
- pcapkit/foundation/engines/pcap.py +188 -0
- pcapkit/foundation/engines/pcapng.py +310 -0
- pcapkit/foundation/engines/pyshark.py +166 -0
- pcapkit/foundation/engines/scapy.py +161 -0
- pcapkit/foundation/extraction.py +915 -0
- pcapkit/foundation/reassembly/__init__.py +49 -0
- pcapkit/foundation/reassembly/data/__init__.py +48 -0
- pcapkit/foundation/reassembly/data/ip.py +117 -0
- pcapkit/foundation/reassembly/data/tcp.py +145 -0
- pcapkit/foundation/reassembly/ip.py +192 -0
- pcapkit/foundation/reassembly/ipv4.py +50 -0
- pcapkit/foundation/reassembly/ipv6.py +50 -0
- pcapkit/foundation/reassembly/reassembly.py +389 -0
- pcapkit/foundation/reassembly/tcp.py +249 -0
- pcapkit/foundation/registry/__init__.py +41 -0
- pcapkit/foundation/registry/foundation.py +327 -0
- pcapkit/foundation/registry/protocols.py +885 -0
- pcapkit/foundation/traceflow/__init__.py +44 -0
- pcapkit/foundation/traceflow/data/__init__.py +30 -0
- pcapkit/foundation/traceflow/data/tcp.py +105 -0
- pcapkit/foundation/traceflow/tcp.py +159 -0
- pcapkit/foundation/traceflow/traceflow.py +390 -0
- pcapkit/interface/__init__.py +22 -0
- pcapkit/interface/core.py +185 -0
- pcapkit/interface/misc.py +120 -0
- pcapkit/protocols/__init__.py +85 -0
- pcapkit/protocols/application/NotImplemented/bgp.py +0 -0
- pcapkit/protocols/application/NotImplemented/dhcp.py +0 -0
- pcapkit/protocols/application/NotImplemented/dhcpv6.py +0 -0
- pcapkit/protocols/application/NotImplemented/dns.py +0 -0
- pcapkit/protocols/application/NotImplemented/imap.py +0 -0
- pcapkit/protocols/application/NotImplemented/ldap.py +0 -0
- pcapkit/protocols/application/NotImplemented/mqtt.py +0 -0
- pcapkit/protocols/application/NotImplemented/nntp.py +0 -0
- pcapkit/protocols/application/NotImplemented/ntp.py +0 -0
- pcapkit/protocols/application/NotImplemented/onc_rpc.py +0 -0
- pcapkit/protocols/application/NotImplemented/pop.py +0 -0
- pcapkit/protocols/application/NotImplemented/rip.py +0 -0
- pcapkit/protocols/application/NotImplemented/rtp.py +0 -0
- pcapkit/protocols/application/NotImplemented/sip.py +0 -0
- pcapkit/protocols/application/NotImplemented/smtp.py +0 -0
- pcapkit/protocols/application/NotImplemented/snmp.py +0 -0
- pcapkit/protocols/application/NotImplemented/ssh.py +0 -0
- pcapkit/protocols/application/NotImplemented/telnet.py +0 -0
- pcapkit/protocols/application/NotImplemented/tls.py +0 -0
- pcapkit/protocols/application/NotImplemented/xmpp.py +0 -0
- pcapkit/protocols/application/__init__.py +34 -0
- pcapkit/protocols/application/application.py +114 -0
- pcapkit/protocols/application/ftp.py +206 -0
- pcapkit/protocols/application/http.py +176 -0
- pcapkit/protocols/application/httpv1.py +320 -0
- pcapkit/protocols/application/httpv2.py +1255 -0
- pcapkit/protocols/data/__init__.py +192 -0
- pcapkit/protocols/data/application/__init__.py +57 -0
- pcapkit/protocols/data/application/ftp.py +59 -0
- pcapkit/protocols/data/application/httpv1.py +79 -0
- pcapkit/protocols/data/application/httpv2.py +293 -0
- pcapkit/protocols/data/data.py +25 -0
- pcapkit/protocols/data/internet/__init__.py +298 -0
- pcapkit/protocols/data/internet/ah.py +31 -0
- pcapkit/protocols/data/internet/hip.py +804 -0
- pcapkit/protocols/data/internet/hopopt.py +351 -0
- pcapkit/protocols/data/internet/ipv4.py +369 -0
- pcapkit/protocols/data/internet/ipv6.py +67 -0
- pcapkit/protocols/data/internet/ipv6_frag.py +29 -0
- pcapkit/protocols/data/internet/ipv6_opts.py +368 -0
- pcapkit/protocols/data/internet/ipv6_route.py +86 -0
- pcapkit/protocols/data/internet/ipx.py +56 -0
- pcapkit/protocols/data/internet/mh.py +509 -0
- pcapkit/protocols/data/link/__init__.py +33 -0
- pcapkit/protocols/data/link/arp.py +74 -0
- pcapkit/protocols/data/link/ethernet.py +28 -0
- pcapkit/protocols/data/link/l2tp.py +63 -0
- pcapkit/protocols/data/link/ospf.py +58 -0
- pcapkit/protocols/data/link/vlan.py +42 -0
- pcapkit/protocols/data/misc/__init__.py +109 -0
- pcapkit/protocols/data/misc/null.py +18 -0
- pcapkit/protocols/data/misc/pcap/__init__.py +18 -0
- pcapkit/protocols/data/misc/pcap/frame.py +56 -0
- pcapkit/protocols/data/misc/pcap/header.py +53 -0
- pcapkit/protocols/data/misc/pcapng.py +925 -0
- pcapkit/protocols/data/misc/raw.py +25 -0
- pcapkit/protocols/data/protocol.py +32 -0
- pcapkit/protocols/data/transport/__init__.py +71 -0
- pcapkit/protocols/data/transport/tcp.py +555 -0
- pcapkit/protocols/data/transport/udp.py +29 -0
- pcapkit/protocols/internet/NotImplemented/ecn.py +0 -0
- pcapkit/protocols/internet/NotImplemented/esp.py +97 -0
- pcapkit/protocols/internet/NotImplemented/icmp.py +0 -0
- pcapkit/protocols/internet/NotImplemented/icmpv6.py +0 -0
- pcapkit/protocols/internet/NotImplemented/igmp.py +0 -0
- pcapkit/protocols/internet/NotImplemented/shim6.py +0 -0
- pcapkit/protocols/internet/__init__.py +43 -0
- pcapkit/protocols/internet/ah.py +275 -0
- pcapkit/protocols/internet/hip.py +4727 -0
- pcapkit/protocols/internet/hopopt.py +1879 -0
- pcapkit/protocols/internet/internet.py +240 -0
- pcapkit/protocols/internet/ip.py +51 -0
- pcapkit/protocols/internet/ipsec.py +50 -0
- pcapkit/protocols/internet/ipv4.py +1782 -0
- pcapkit/protocols/internet/ipv6.py +361 -0
- pcapkit/protocols/internet/ipv6_frag.py +258 -0
- pcapkit/protocols/internet/ipv6_opts.py +1890 -0
- pcapkit/protocols/internet/ipv6_route.py +710 -0
- pcapkit/protocols/internet/ipx.py +230 -0
- pcapkit/protocols/internet/mh.py +2764 -0
- pcapkit/protocols/link/NotImplemented/dsl.py +0 -0
- pcapkit/protocols/link/NotImplemented/eapol.py +1 -0
- pcapkit/protocols/link/NotImplemented/fddi.py +0 -0
- pcapkit/protocols/link/NotImplemented/isdn.py +0 -0
- pcapkit/protocols/link/NotImplemented/ndp.py +0 -0
- pcapkit/protocols/link/NotImplemented/ppp.py +0 -0
- pcapkit/protocols/link/__init__.py +35 -0
- pcapkit/protocols/link/arp.py +421 -0
- pcapkit/protocols/link/ethernet.py +248 -0
- pcapkit/protocols/link/l2tp.py +267 -0
- pcapkit/protocols/link/link.py +140 -0
- pcapkit/protocols/link/ospf.py +342 -0
- pcapkit/protocols/link/rarp.py +82 -0
- pcapkit/protocols/link/vlan.py +225 -0
- pcapkit/protocols/misc/__init__.py +37 -0
- pcapkit/protocols/misc/null.py +129 -0
- pcapkit/protocols/misc/pcap/__init__.py +17 -0
- pcapkit/protocols/misc/pcap/frame.py +478 -0
- pcapkit/protocols/misc/pcap/header.py +358 -0
- pcapkit/protocols/misc/pcapng.py +5520 -0
- pcapkit/protocols/misc/raw.py +180 -0
- pcapkit/protocols/protocol.py +1216 -0
- pcapkit/protocols/schema/__init__.py +140 -0
- pcapkit/protocols/schema/application/__init__.py +40 -0
- pcapkit/protocols/schema/application/ftp.py +21 -0
- pcapkit/protocols/schema/application/httpv1.py +21 -0
- pcapkit/protocols/schema/application/httpv2.py +384 -0
- pcapkit/protocols/schema/internet/__init__.py +294 -0
- pcapkit/protocols/schema/internet/ah.py +40 -0
- pcapkit/protocols/schema/internet/hip.py +1184 -0
- pcapkit/protocols/schema/internet/hopopt.py +679 -0
- pcapkit/protocols/schema/internet/ipv4.py +576 -0
- pcapkit/protocols/schema/internet/ipv6.py +63 -0
- pcapkit/protocols/schema/internet/ipv6_frag.py +48 -0
- pcapkit/protocols/schema/internet/ipv6_opts.py +680 -0
- pcapkit/protocols/schema/internet/ipv6_route.py +198 -0
- pcapkit/protocols/schema/internet/ipx.py +40 -0
- pcapkit/protocols/schema/internet/mh.py +718 -0
- pcapkit/protocols/schema/link/__init__.py +19 -0
- pcapkit/protocols/schema/link/arp.py +39 -0
- pcapkit/protocols/schema/link/ethernet.py +51 -0
- pcapkit/protocols/schema/link/l2tp.py +88 -0
- pcapkit/protocols/schema/link/ospf.py +90 -0
- pcapkit/protocols/schema/link/vlan.py +69 -0
- pcapkit/protocols/schema/misc/__init__.py +108 -0
- pcapkit/protocols/schema/misc/null.py +18 -0
- pcapkit/protocols/schema/misc/pcap/__init__.py +10 -0
- pcapkit/protocols/schema/misc/pcap/frame.py +51 -0
- pcapkit/protocols/schema/misc/pcap/header.py +63 -0
- pcapkit/protocols/schema/misc/pcapng.py +1689 -0
- pcapkit/protocols/schema/misc/raw.py +24 -0
- pcapkit/protocols/schema/schema.py +809 -0
- pcapkit/protocols/schema/transport/__init__.py +69 -0
- pcapkit/protocols/schema/transport/tcp.py +928 -0
- pcapkit/protocols/schema/transport/udp.py +90 -0
- pcapkit/protocols/transport/NotImplemented/dccp.py +0 -0
- pcapkit/protocols/transport/NotImplemented/rsvp.py +0 -0
- pcapkit/protocols/transport/NotImplemented/sctp.py +0 -0
- pcapkit/protocols/transport/__init__.py +27 -0
- pcapkit/protocols/transport/tcp.py +3025 -0
- pcapkit/protocols/transport/transport.py +158 -0
- pcapkit/protocols/transport/udp.py +214 -0
- pcapkit/py.typed +0 -0
- pcapkit/toolkit/__init__.py +57 -0
- pcapkit/toolkit/dpkt.py +306 -0
- pcapkit/toolkit/pcap.py +212 -0
- pcapkit/toolkit/pcapng.py +251 -0
- pcapkit/toolkit/pyshark.py +99 -0
- pcapkit/toolkit/scapy.py +297 -0
- pcapkit/utilities/__init__.py +20 -0
- pcapkit/utilities/compat.py +196 -0
- pcapkit/utilities/decorators.py +192 -0
- pcapkit/utilities/exceptions.py +365 -0
- pcapkit/utilities/logging.py +55 -0
- pcapkit/utilities/warnings.py +185 -0
- pcapkit/vendor/__init__.py +105 -0
- pcapkit/vendor/__main__.py +92 -0
- pcapkit/vendor/arp/__init__.py +27 -0
- pcapkit/vendor/arp/hardware.py +29 -0
- pcapkit/vendor/arp/operation.py +29 -0
- pcapkit/vendor/default.py +474 -0
- pcapkit/vendor/ftp/__init__.py +27 -0
- pcapkit/vendor/ftp/command.py +244 -0
- pcapkit/vendor/ftp/return_code.py +256 -0
- pcapkit/vendor/hip/__init__.py +94 -0
- pcapkit/vendor/hip/certificate.py +29 -0
- pcapkit/vendor/hip/cipher.py +29 -0
- pcapkit/vendor/hip/di.py +29 -0
- pcapkit/vendor/hip/ecdsa_curve.py +29 -0
- pcapkit/vendor/hip/ecdsa_low_curve.py +29 -0
- pcapkit/vendor/hip/eddsa_curve.py +85 -0
- pcapkit/vendor/hip/esp_transform_suite.py +29 -0
- pcapkit/vendor/hip/group.py +87 -0
- pcapkit/vendor/hip/hi_algorithm.py +29 -0
- pcapkit/vendor/hip/hit_suite.py +29 -0
- pcapkit/vendor/hip/nat_traversal.py +29 -0
- pcapkit/vendor/hip/notify_message.py +29 -0
- pcapkit/vendor/hip/packet.py +88 -0
- pcapkit/vendor/hip/parameter.py +88 -0
- pcapkit/vendor/hip/registration.py +29 -0
- pcapkit/vendor/hip/registration_failure.py +29 -0
- pcapkit/vendor/hip/suite.py +29 -0
- pcapkit/vendor/hip/transport.py +29 -0
- pcapkit/vendor/http/__init__.py +39 -0
- pcapkit/vendor/http/error_code.py +95 -0
- pcapkit/vendor/http/frame.py +91 -0
- pcapkit/vendor/http/method.py +167 -0
- pcapkit/vendor/http/setting.py +93 -0
- pcapkit/vendor/http/status_code.py +185 -0
- pcapkit/vendor/ipv4/__init__.py +57 -0
- pcapkit/vendor/ipv4/classification_level.py +91 -0
- pcapkit/vendor/ipv4/option_class.py +80 -0
- pcapkit/vendor/ipv4/option_number.py +105 -0
- pcapkit/vendor/ipv4/protection_authority.py +84 -0
- pcapkit/vendor/ipv4/qs_function.py +78 -0
- pcapkit/vendor/ipv4/router_alert.py +93 -0
- pcapkit/vendor/ipv4/tos_del.py +78 -0
- pcapkit/vendor/ipv4/tos_ecn.py +95 -0
- pcapkit/vendor/ipv4/tos_pre.py +84 -0
- pcapkit/vendor/ipv4/tos_rel.py +78 -0
- pcapkit/vendor/ipv4/tos_thr.py +77 -0
- pcapkit/vendor/ipv4/ts_flag.py +79 -0
- pcapkit/vendor/ipv6/__init__.py +53 -0
- pcapkit/vendor/ipv6/extension_header.py +171 -0
- pcapkit/vendor/ipv6/option.py +104 -0
- pcapkit/vendor/ipv6/option_action.py +90 -0
- pcapkit/vendor/ipv6/qs_function.py +78 -0
- pcapkit/vendor/ipv6/router_alert.py +93 -0
- pcapkit/vendor/ipv6/routing.py +87 -0
- pcapkit/vendor/ipv6/seed_id.py +81 -0
- pcapkit/vendor/ipv6/smf_dpd_mode.py +78 -0
- pcapkit/vendor/ipv6/tagger_id.py +81 -0
- pcapkit/vendor/ipx/__init__.py +37 -0
- pcapkit/vendor/ipx/packet.py +123 -0
- pcapkit/vendor/ipx/socket.py +125 -0
- pcapkit/vendor/l2tp/__init__.py +21 -0
- pcapkit/vendor/l2tp/type.py +78 -0
- pcapkit/vendor/mh/__init__.py +204 -0
- pcapkit/vendor/mh/access_type.py +87 -0
- pcapkit/vendor/mh/ack_status_code.py +88 -0
- pcapkit/vendor/mh/ani_suboption.py +88 -0
- pcapkit/vendor/mh/auth_subtype.py +83 -0
- pcapkit/vendor/mh/binding_ack_flag.py +148 -0
- pcapkit/vendor/mh/binding_error.py +78 -0
- pcapkit/vendor/mh/binding_revocation.py +87 -0
- pcapkit/vendor/mh/binding_update_flag.py +147 -0
- pcapkit/vendor/mh/cga_extension.py +91 -0
- pcapkit/vendor/mh/cga_sec.py +91 -0
- pcapkit/vendor/mh/cga_type.py +74 -0
- pcapkit/vendor/mh/dhcp_support_mode.py +77 -0
- pcapkit/vendor/mh/dns_status_code.py +87 -0
- pcapkit/vendor/mh/dsmip6_tls_packet.py +87 -0
- pcapkit/vendor/mh/dsmipv6_home_address.py +87 -0
- pcapkit/vendor/mh/enumerating_algorithm.py +82 -0
- pcapkit/vendor/mh/fb_ack_status.py +87 -0
- pcapkit/vendor/mh/fb_action.py +88 -0
- pcapkit/vendor/mh/fb_indication_trigger.py +87 -0
- pcapkit/vendor/mh/fb_type.py +88 -0
- pcapkit/vendor/mh/flow_id_status.py +87 -0
- pcapkit/vendor/mh/flow_id_suboption.py +87 -0
- pcapkit/vendor/mh/handoff_type.py +87 -0
- pcapkit/vendor/mh/handover_ack_flag.py +143 -0
- pcapkit/vendor/mh/handover_ack_status.py +87 -0
- pcapkit/vendor/mh/handover_initiate_flag.py +143 -0
- pcapkit/vendor/mh/handover_initiate_status.py +87 -0
- pcapkit/vendor/mh/home_address_reply.py +87 -0
- pcapkit/vendor/mh/lla_code.py +97 -0
- pcapkit/vendor/mh/lma_mag_suboption.py +88 -0
- pcapkit/vendor/mh/mn_group_id.py +87 -0
- pcapkit/vendor/mh/mn_id_subtype.py +87 -0
- pcapkit/vendor/mh/operator_id.py +87 -0
- pcapkit/vendor/mh/option.py +83 -0
- pcapkit/vendor/mh/packet.py +82 -0
- pcapkit/vendor/mh/qos_attribute.py +87 -0
- pcapkit/vendor/mh/revocation_status_code.py +87 -0
- pcapkit/vendor/mh/revocation_trigger.py +87 -0
- pcapkit/vendor/mh/status_code.py +91 -0
- pcapkit/vendor/mh/traffic_selector.py +87 -0
- pcapkit/vendor/mh/upa_status.py +87 -0
- pcapkit/vendor/mh/upn_reason.py +87 -0
- pcapkit/vendor/ospf/__init__.py +27 -0
- pcapkit/vendor/ospf/authentication.py +29 -0
- pcapkit/vendor/ospf/packet.py +29 -0
- pcapkit/vendor/pcapng/__init__.py +51 -0
- pcapkit/vendor/pcapng/block_type.py +94 -0
- pcapkit/vendor/pcapng/filter_type.py +77 -0
- pcapkit/vendor/pcapng/hash_algorithm.py +82 -0
- pcapkit/vendor/pcapng/option_type.py +287 -0
- pcapkit/vendor/pcapng/record_type.py +81 -0
- pcapkit/vendor/pcapng/secrets_type.py +81 -0
- pcapkit/vendor/pcapng/verdict_type.py +79 -0
- pcapkit/vendor/reg/__init__.py +34 -0
- pcapkit/vendor/reg/apptype.py +338 -0
- pcapkit/vendor/reg/ethertype.py +121 -0
- pcapkit/vendor/reg/linktype.py +110 -0
- pcapkit/vendor/reg/transtype.py +111 -0
- pcapkit/vendor/tcp/__init__.py +35 -0
- pcapkit/vendor/tcp/checksum.py +80 -0
- pcapkit/vendor/tcp/flags.py +149 -0
- pcapkit/vendor/tcp/mp_tcp_option.py +90 -0
- pcapkit/vendor/tcp/option.py +103 -0
- pcapkit/vendor/vlan/__init__.py +23 -0
- pcapkit/vendor/vlan/priority_level.py +97 -0
- pypcapkit-1.3.3.post1.dist-info/LICENSE +29 -0
- pypcapkit-1.3.3.post1.dist-info/METADATA +236 -0
- pypcapkit-1.3.3.post1.dist-info/RECORD +466 -0
- pypcapkit-1.3.3.post1.dist-info/WHEEL +5 -0
- pypcapkit-1.3.3.post1.dist-info/entry_points.txt +3 -0
- pypcapkit-1.3.3.post1.dist-info/top_level.txt +1 -0
pcapkit/toolkit/dpkt.py
ADDED
@@ -0,0 +1,306 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""DPKT Tools
|
3
|
+
================
|
4
|
+
|
5
|
+
.. module:: pcapkit.toolkit.dpkt
|
6
|
+
|
7
|
+
:mod:`pcapkit.toolkit.dpkt` contains all you need for
|
8
|
+
:mod:`pcapkit` handy usage with `DPKT`_ engine. All reforming
|
9
|
+
functions returns with a flag to indicate if usable for
|
10
|
+
its caller.
|
11
|
+
|
12
|
+
.. _DPKT: https://dpkt.readthedocs.io
|
13
|
+
|
14
|
+
"""
|
15
|
+
import ipaddress
|
16
|
+
from typing import TYPE_CHECKING, cast
|
17
|
+
|
18
|
+
from pcapkit.const.reg.transtype import TransType as Enum_TransType
|
19
|
+
from pcapkit.foundation.reassembly.data.ip import Packet as IP_Packet
|
20
|
+
from pcapkit.foundation.reassembly.data.tcp import Packet as TCP_Packet
|
21
|
+
from pcapkit.foundation.traceflow.data.tcp import Packet as TF_TCP_Packet
|
22
|
+
|
23
|
+
if TYPE_CHECKING:
|
24
|
+
from ipaddress import IPv4Address, IPv6Address
|
25
|
+
from typing import Any, Optional
|
26
|
+
|
27
|
+
from dpkt.dpkt import Packet
|
28
|
+
from dpkt.ip import IP
|
29
|
+
from dpkt.ip6 import IP6, IP6FragmentHeader
|
30
|
+
from dpkt.tcp import TCP
|
31
|
+
|
32
|
+
from pcapkit.const.reg.linktype import LinkType as Enum_LinkType
|
33
|
+
|
34
|
+
__all__ = [
|
35
|
+
'ipv6_hdr_len', 'packet2chain', 'packet2dict',
|
36
|
+
'ipv4_reassembly', 'ipv6_reassembly', 'tcp_reassembly', 'tcp_traceflow'
|
37
|
+
]
|
38
|
+
|
39
|
+
|
40
|
+
def ipv6_hdr_len(ipv6: 'IP6') -> 'int':
|
41
|
+
"""Calculate length of headers before IPv6 Fragment header.
|
42
|
+
|
43
|
+
Args:
|
44
|
+
ipv6: DPKT IPv6 packet.
|
45
|
+
|
46
|
+
Returns:
|
47
|
+
Length of headers before IPv6 Fragment header
|
48
|
+
:class:`dpkt.ip6.IP6FragmentHeader` (:rfc:`2460#section-4.5`).
|
49
|
+
|
50
|
+
As specified in :rfc:`2460#section-4.1`, such headers (before the IPv6 Fragment Header)
|
51
|
+
includes Hop-by-Hop Options header :class:`dpkt.ip6.IP6HopOptsHeader` (:rfc:`2460#section-4.3`),
|
52
|
+
Destination Options header :class:`dpkt.ip6.IP6DstOptHeader` (:rfc:`2460#section-4.6`) and
|
53
|
+
Routing header :class:`dpkt.ip6.IP6RoutingHeader` (:rfc:`2460#section-4.4`).
|
54
|
+
|
55
|
+
"""
|
56
|
+
hdr_len = ipv6.__hdr_len__
|
57
|
+
# IP6HopOptsHeader / IP6DstOptHeader / IP6RoutingHeader
|
58
|
+
for code in (0, 60, 43):
|
59
|
+
ext_hdr = ipv6.extension_hdrs.get(code)
|
60
|
+
if ext_hdr is not None:
|
61
|
+
hdr_len += ext_hdr.length
|
62
|
+
return hdr_len
|
63
|
+
|
64
|
+
|
65
|
+
def packet2chain(packet: 'Packet') -> 'str':
|
66
|
+
"""Fetch DPKT packet protocol chain.
|
67
|
+
|
68
|
+
Args:
|
69
|
+
packet: DPKT packet.
|
70
|
+
|
71
|
+
Returns:
|
72
|
+
Colon (``:``) seperated list of protocol chain.
|
73
|
+
|
74
|
+
"""
|
75
|
+
chain = [type(packet).__name__]
|
76
|
+
payload = packet.data
|
77
|
+
while not isinstance(payload, bytes):
|
78
|
+
chain.append(type(payload).__name__)
|
79
|
+
payload = payload.data
|
80
|
+
return ':'.join(chain)
|
81
|
+
|
82
|
+
|
83
|
+
def packet2dict(packet: 'Packet', timestamp: 'float', *,
|
84
|
+
data_link: 'Enum_LinkType') -> 'dict[str, Any]':
|
85
|
+
"""Convert DPKT packet into :obj:`dict`.
|
86
|
+
|
87
|
+
Args:
|
88
|
+
packet: Scapy packet.
|
89
|
+
timestamp: Timestamp of packet.
|
90
|
+
data_link: Data link type.
|
91
|
+
|
92
|
+
Returns:
|
93
|
+
Dict[str, Any]: A :obj:`dict` mapping of packet data.
|
94
|
+
|
95
|
+
"""
|
96
|
+
def wrapper(packet: 'Packet') -> 'dict[str, Any]':
|
97
|
+
dict_ = {} # type: dict[str, Any]
|
98
|
+
for field in packet.__hdr_fields__:
|
99
|
+
dict_[field] = getattr(packet, field, None)
|
100
|
+
payload = packet.data
|
101
|
+
if not isinstance(payload, bytes):
|
102
|
+
dict_[type(payload).__name__] = wrapper(payload)
|
103
|
+
return dict_
|
104
|
+
|
105
|
+
return {
|
106
|
+
'timestamp': timestamp,
|
107
|
+
'packet': packet.pack(),
|
108
|
+
data_link.name: wrapper(packet),
|
109
|
+
}
|
110
|
+
|
111
|
+
|
112
|
+
def ipv4_reassembly(packet: 'Packet', *, count: 'int' = -1) -> 'IP_Packet[IPv4Address] | None':
|
113
|
+
"""Make data for IPv4 reassembly.
|
114
|
+
|
115
|
+
Args:
|
116
|
+
packet: DPKT packet.
|
117
|
+
count: Packet index. If not provided, default to ``-1``.
|
118
|
+
|
119
|
+
Returns:
|
120
|
+
Data for IPv4 reassembly.
|
121
|
+
|
122
|
+
* If the ``packet`` can be used for IPv4 reassembly. A packet can be reassembled
|
123
|
+
if it contains IPv4 layer (:class:`dpkt.ip.IP`) and the **DF** (:attr:`dpkt.ip.IP.df`)
|
124
|
+
flag is :data:`False`.
|
125
|
+
* If the ``packet`` can be reassembled, then the :obj:`dict` mapping of data for IPv4
|
126
|
+
reassembly (:term:`reasm.ipv4.packet`) will be returned; otherwise, returns :data:`None`.
|
127
|
+
|
128
|
+
See Also:
|
129
|
+
:class:`pcapkit.foundation.reassembly.ipv4.IPv4`
|
130
|
+
|
131
|
+
"""
|
132
|
+
ipv4 = getattr(packet, 'ip', None) # type: Optional[IP]
|
133
|
+
if ipv4 is not None:
|
134
|
+
if ipv4.df: # dismiss not fragmented packet
|
135
|
+
return None
|
136
|
+
|
137
|
+
data = IP_Packet(
|
138
|
+
bufid=(
|
139
|
+
cast('IPv4Address',
|
140
|
+
ipaddress.ip_address(ipv4.src)), # source IP address
|
141
|
+
cast('IPv4Address',
|
142
|
+
ipaddress.ip_address(ipv4.dst)), # destination IP address
|
143
|
+
ipv4.id, # identification
|
144
|
+
Enum_TransType.get(ipv4.p).name, # payload protocol type
|
145
|
+
),
|
146
|
+
num=count, # original packet range number
|
147
|
+
fo=ipv4.off, # fragment offset
|
148
|
+
ihl=ipv4.__hdr_len__, # internet header length
|
149
|
+
mf=bool(ipv4.mf), # more fragment flag
|
150
|
+
tl=ipv4.len, # total length, header includes
|
151
|
+
header=ipv4.pack()[:ipv4.__hdr_len__], # raw bytes type header
|
152
|
+
payload=bytearray(ipv4.pack()[ipv4.__hdr_len__:]), # raw bytearray type payload
|
153
|
+
)
|
154
|
+
return data
|
155
|
+
return None
|
156
|
+
|
157
|
+
|
158
|
+
def ipv6_reassembly(packet: 'Packet', *, count: 'int' = -1) -> 'IP_Packet[IPv6Address] | None':
|
159
|
+
"""Make data for IPv6 reassembly.
|
160
|
+
|
161
|
+
Args:
|
162
|
+
packet: DPKT packet.
|
163
|
+
count: Packet index. If not provided, default to ``-1``.
|
164
|
+
|
165
|
+
Returns:
|
166
|
+
Data for IPv6 reassembly.
|
167
|
+
|
168
|
+
* If the ``packet`` can be used for IPv6 reassembly. A packet can be reassembled
|
169
|
+
if it contains IPv6 layer (:class:`dpkt.ip6.IP6`) and IPv6 Fragment header
|
170
|
+
(:rfc:`2460#section-4.5`, i.e., :class:`dpkt.ip6.IP6FragmentHeader`).
|
171
|
+
* If the ``packet`` can be reassembled, then the :obj:`dict` mapping of data for IPv6
|
172
|
+
reassembly (:term:`reasm.ipv6.packet`) will be returned; otherwise, returns :data:`None`.
|
173
|
+
|
174
|
+
See Also:
|
175
|
+
:class:`pcapkit.foundation.reassembly.ipv6.IPv6`
|
176
|
+
|
177
|
+
"""
|
178
|
+
ipv6 = getattr(packet, 'ip6', None) # type: Optional[IP6]
|
179
|
+
if ipv6 is not None:
|
180
|
+
ipv6_frag = ipv6.extension_hdrs.get(44) # type: Optional[IP6FragmentHeader]
|
181
|
+
if ipv6_frag is None: # dismiss not fragmented packet
|
182
|
+
return None
|
183
|
+
hdr_len = ipv6_hdr_len(ipv6)
|
184
|
+
|
185
|
+
data = IP_Packet(
|
186
|
+
bufid=(
|
187
|
+
cast('IPv6Address',
|
188
|
+
ipaddress.ip_address(ipv6.src)), # source IP address
|
189
|
+
cast('IPv6Address',
|
190
|
+
ipaddress.ip_address(ipv6.dst)), # destination IP address
|
191
|
+
ipv6.flow, # label
|
192
|
+
Enum_TransType.get(ipv6_frag.nh).name, # next header field in IPv6 Fragment Header
|
193
|
+
),
|
194
|
+
num=count, # original packet range number
|
195
|
+
fo=ipv6_frag.nxt, # fragment offset
|
196
|
+
ihl=hdr_len, # header length, only headers before IPv6-Frag
|
197
|
+
mf=bool(ipv6_frag.m_flag), # more fragment flag
|
198
|
+
tl=len(ipv6), # total length, header includes
|
199
|
+
header=ipv6.pack()[:hdr_len], # raw bytearray type header before IPv6-Frag
|
200
|
+
payload=bytearray(ipv6.pack()[hdr_len+ipv6_frag:]), # raw bytearray type payload after IPv6-Frag
|
201
|
+
)
|
202
|
+
return data
|
203
|
+
return None
|
204
|
+
|
205
|
+
|
206
|
+
def tcp_reassembly(packet: 'Packet', *, count: 'int' = -1) -> 'TCP_Packet | None':
|
207
|
+
"""Make data for TCP reassembly.
|
208
|
+
|
209
|
+
Args:
|
210
|
+
packet: DPKT packet.
|
211
|
+
count: Packet index. If not provided, default to ``-1``.
|
212
|
+
|
213
|
+
Returns:
|
214
|
+
Data for TCP reassembly.
|
215
|
+
|
216
|
+
* If the ``packet`` can be used for TCP reassembly. A packet can be reassembled
|
217
|
+
if it contains TCP layer (:class:`dpkt.tcp.TCP`).
|
218
|
+
* If the ``packet`` can be reassembled, then the :obj:`dict` mapping of data for TCP
|
219
|
+
reassembly (:term:`reasm.tcp.packet`) will be returned; otherwise, returns :data:`None`.
|
220
|
+
|
221
|
+
See Also:
|
222
|
+
:class:`pcapkit.foundation.reassembly.tcp.TCP`
|
223
|
+
|
224
|
+
"""
|
225
|
+
if hasattr(packet, 'ip'):
|
226
|
+
ip = cast('IP', packet.ip)
|
227
|
+
elif hasattr(packet, 'ip6'):
|
228
|
+
ip = cast('IP6', packet.ip6)
|
229
|
+
else:
|
230
|
+
return None
|
231
|
+
|
232
|
+
tcp = getattr(ip, 'tcp', None) # type: Optional[TCP]
|
233
|
+
if tcp is not None:
|
234
|
+
flags = bin(tcp.flags)[2:].zfill(8)
|
235
|
+
raw_len = len(tcp.data) # payload length, header excludes
|
236
|
+
|
237
|
+
data = TCP_Packet(
|
238
|
+
bufid=(
|
239
|
+
ipaddress.ip_address(ip.src), # source IP address
|
240
|
+
tcp.sport, # source port
|
241
|
+
ipaddress.ip_address(ip.dst), # destination IP address
|
242
|
+
tcp.dport, # destination port
|
243
|
+
),
|
244
|
+
num=count, # original packet range number
|
245
|
+
ack=tcp.ack, # acknowledgement
|
246
|
+
dsn=tcp.seq, # data sequence number
|
247
|
+
rst=bool(int(flags[5])), # reset connection flag
|
248
|
+
syn=bool(int(flags[6])), # synchronise flag
|
249
|
+
fin=bool(int(flags[7])), # finish flag
|
250
|
+
header=tcp.pack()[:tcp.__hdr_len__], # raw bytes type header
|
251
|
+
payload=bytearray(tcp.pack()[tcp.__hdr_len__:]), # raw bytearray type payload
|
252
|
+
first=tcp.seq, # this sequence number
|
253
|
+
last=tcp.seq + raw_len, # next (wanted) sequence number
|
254
|
+
len=raw_len, # payload length, header excludes
|
255
|
+
)
|
256
|
+
return data
|
257
|
+
return None
|
258
|
+
|
259
|
+
|
260
|
+
def tcp_traceflow(packet: 'Packet', timestamp: 'float', *,
|
261
|
+
data_link: 'Enum_LinkType', count: 'int' = -1) -> 'TF_TCP_Packet | None':
|
262
|
+
"""Trace packet flow for TCP.
|
263
|
+
|
264
|
+
Args:
|
265
|
+
packet: DPKT packet.
|
266
|
+
timestamp: Timestamp of the packet.
|
267
|
+
data_link: Data link layer protocol (from global header).
|
268
|
+
count: Packet index. If not provided, default to ``-1``.
|
269
|
+
|
270
|
+
Returns:
|
271
|
+
Data for TCP reassembly.
|
272
|
+
|
273
|
+
* If the ``packet`` can be used for TCP flow tracing. A packet can be reassembled
|
274
|
+
if it contains TCP layer (:class:`dpkt.tcp.TCP`).
|
275
|
+
* If the ``packet`` can be reassembled, then the :obj:`dict` mapping of data for TCP
|
276
|
+
flow tracing (:term:`trace.tcp.packet`) will be returned; otherwise, returns :data:`None`.
|
277
|
+
|
278
|
+
See Also:
|
279
|
+
:class:`pcapkit.foundation.traceflow.tcp.TCP`
|
280
|
+
|
281
|
+
"""
|
282
|
+
if hasattr(packet, 'ip'):
|
283
|
+
ip = cast('IP', packet.ip)
|
284
|
+
elif hasattr(packet, 'ip6'):
|
285
|
+
ip = cast('IP6', packet.ip6)
|
286
|
+
else:
|
287
|
+
return None
|
288
|
+
|
289
|
+
tcp = getattr(ip, 'tcp', None) # type: Optional[TCP]
|
290
|
+
if tcp is not None:
|
291
|
+
flags = bin(tcp.flags)[2:].zfill(8)
|
292
|
+
|
293
|
+
data = TF_TCP_Packet( # type: ignore[type-var]
|
294
|
+
protocol=data_link, # data link type from global header
|
295
|
+
index=count, # frame number
|
296
|
+
frame=packet2dict(packet, timestamp, data_link=data_link), # extracted packet
|
297
|
+
syn=bool(int(flags[6])), # TCP synchronise (SYN) flag
|
298
|
+
fin=bool(int(flags[7])), # TCP finish (FIN) flag
|
299
|
+
src=ipaddress.ip_address(ip.src), # source IP
|
300
|
+
dst=ipaddress.ip_address(ip.dst), # destination IP
|
301
|
+
srcport=tcp.sport, # TCP source port
|
302
|
+
dstport=tcp.dport, # TCP destination port
|
303
|
+
timestamp=timestamp, # timestamp
|
304
|
+
)
|
305
|
+
return data
|
306
|
+
return None
|
pcapkit/toolkit/pcap.py
ADDED
@@ -0,0 +1,212 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""PCAP Tools
|
3
|
+
================
|
4
|
+
|
5
|
+
.. module:: pcapkit.toolkit.pcap
|
6
|
+
|
7
|
+
:mod:`pcapkit.toolkit.pcap` contains all you need for
|
8
|
+
:mod:`pcapkit` handy usage of PCAP file format. All
|
9
|
+
functions returns with a flag to indicate if usable
|
10
|
+
for its caller.
|
11
|
+
|
12
|
+
"""
|
13
|
+
from typing import TYPE_CHECKING, cast
|
14
|
+
|
15
|
+
from pcapkit.const.ipv6.extension_header import ExtensionHeader as Enum_ExtensionHeader
|
16
|
+
from pcapkit.foundation.reassembly.data.ip import Packet as IP_Packet
|
17
|
+
from pcapkit.foundation.reassembly.data.tcp import Packet as TCP_Packet
|
18
|
+
from pcapkit.foundation.traceflow.data.tcp import Packet as TF_TCP_Packet
|
19
|
+
|
20
|
+
if TYPE_CHECKING:
|
21
|
+
from ipaddress import IPv4Address, IPv6Address
|
22
|
+
|
23
|
+
from pcapkit.const.reg.linktype import LinkType
|
24
|
+
from pcapkit.protocols.internet.ipv4 import IPv4
|
25
|
+
from pcapkit.protocols.internet.ipv6 import IPv6
|
26
|
+
from pcapkit.protocols.internet.ipv6_frag import IPv6_Frag
|
27
|
+
from pcapkit.protocols.misc.pcap import Frame
|
28
|
+
from pcapkit.protocols.transport.tcp import TCP
|
29
|
+
|
30
|
+
__all__ = ['ipv4_reassembly', 'ipv6_reassembly', 'tcp_reassembly', 'tcp_traceflow']
|
31
|
+
|
32
|
+
|
33
|
+
def ipv4_reassembly(frame: 'Frame') -> 'IP_Packet[IPv4Address] | None':
|
34
|
+
"""Make data for IPv4 reassembly.
|
35
|
+
|
36
|
+
Args:
|
37
|
+
frame: PCAP frame.
|
38
|
+
|
39
|
+
Returns:
|
40
|
+
Data for IPv4 reassembly.
|
41
|
+
|
42
|
+
* If the ``frame`` can be used for IPv4 reassembly. A frame can be reassembled
|
43
|
+
if it contains IPv4 layer (:class:`~pcapkit.protocols.internet.ipv4.IPv4`) and
|
44
|
+
the **DF** (:attr:`IPv4.flags.df <pcapkit.protocols.data.internet.ipv4.Flags.df>`)
|
45
|
+
flag is :data:`False`.
|
46
|
+
* If the ``frame`` can be reassembled, then the :obj:`dict` mapping of data for IPv4
|
47
|
+
reassembly (c.f. :term:`reasm.ipv4.packet`) will be returned; otherwise, returns :data:`None`.
|
48
|
+
|
49
|
+
See Also:
|
50
|
+
:class:`pcapkit.foundation.reassembly.ipv4.IPv4`
|
51
|
+
|
52
|
+
"""
|
53
|
+
if 'IPv4' in frame:
|
54
|
+
ipv4 = cast('IPv4', frame['IPv4'])
|
55
|
+
ipv4_info = ipv4.info
|
56
|
+
if ipv4_info.flags.df: # dismiss not fragmented frame
|
57
|
+
return None
|
58
|
+
|
59
|
+
data = IP_Packet(
|
60
|
+
bufid=(
|
61
|
+
ipv4_info.src, # source IP address
|
62
|
+
ipv4_info.dst, # destination IP address
|
63
|
+
ipv4_info.id, # identification
|
64
|
+
ipv4_info.protocol, # payload protocol type
|
65
|
+
),
|
66
|
+
num=frame.info.number, # original packet range number
|
67
|
+
fo=ipv4_info.offset, # fragment offset
|
68
|
+
ihl=ipv4_info.hdr_len, # internet header length
|
69
|
+
mf=ipv4_info.flags.mf, # more fragment flag
|
70
|
+
tl=ipv4_info.len, # total length, header includes
|
71
|
+
header=ipv4.packet.header, # raw bytes type header
|
72
|
+
payload=bytearray(ipv4.packet.payload), # raw bytearray type payload
|
73
|
+
)
|
74
|
+
return data
|
75
|
+
return None
|
76
|
+
|
77
|
+
|
78
|
+
def ipv6_reassembly(frame: 'Frame') -> 'IP_Packet[IPv6Address] | None':
|
79
|
+
"""Make data for IPv6 reassembly.
|
80
|
+
|
81
|
+
Args:
|
82
|
+
frame: PCAP frame.
|
83
|
+
|
84
|
+
Returns:
|
85
|
+
A tuple of data for IPv6 reassembly.
|
86
|
+
|
87
|
+
* If the ``frame`` can be used for IPv6 reassembly. A frame can be reassembled
|
88
|
+
if it contains IPv6 layer (:class:`~pcapkit.protocols.internet.ipv6.IPv6`) and
|
89
|
+
IPv6 Fragment header (:rfc:`2460#section-4.5`, i.e.,
|
90
|
+
:class:`~pcapkit.protocols.internet.ipv6_frag.IPv6_Frag`).
|
91
|
+
* If the ``frame`` can be reassembled, then the :obj:`dict` mapping of data for IPv6
|
92
|
+
reassembly (:term:`reasm.ipv6.packet`) will be returned; otherwise, returns :data:`None`.
|
93
|
+
|
94
|
+
See Also:
|
95
|
+
:class:`pcapkit.foundation.reassembly.ipv6.IPv6`
|
96
|
+
|
97
|
+
"""
|
98
|
+
if 'IPv6' in frame:
|
99
|
+
ipv6 = cast('IPv6', frame['IPv6'])
|
100
|
+
ipv6_info = ipv6.info
|
101
|
+
if (ipv6_frag := ipv6.extension_headers.get( # type: ignore[call-overload]
|
102
|
+
Enum_ExtensionHeader.IPv6_Frag
|
103
|
+
)) is None: # dismiss not fragmented frame
|
104
|
+
return None
|
105
|
+
ipv6_frag_info = cast('IPv6_Frag', ipv6_frag).info
|
106
|
+
|
107
|
+
data = IP_Packet(
|
108
|
+
bufid=(
|
109
|
+
ipv6_info.src, # source IP address
|
110
|
+
ipv6_info.dst, # destination IP address
|
111
|
+
ipv6_info.label, # label
|
112
|
+
ipv6_frag_info.next, # next header field in IPv6 Fragment Header
|
113
|
+
),
|
114
|
+
num=frame.info.number, # original packet range number
|
115
|
+
fo=ipv6_frag_info.offset, # fragment offset
|
116
|
+
ihl=ipv6_info.hdr_len, # header length, only headers before IPv6-Frag
|
117
|
+
mf=ipv6_frag_info.mf, # more fragment flag
|
118
|
+
tl=ipv6_info.hdr_len + ipv6_info.raw_len, # total length, header includes
|
119
|
+
header=ipv6_info.fragment.header, # raw bytearray type header before IPv6-Frag
|
120
|
+
payload=bytearray(ipv6_info.fragment.payload), # raw bytearray type payload after IPv6-Frag
|
121
|
+
)
|
122
|
+
return data
|
123
|
+
return None
|
124
|
+
|
125
|
+
|
126
|
+
def tcp_reassembly(frame: 'Frame') -> 'TCP_Packet | None':
|
127
|
+
"""Make data for TCP reassembly.
|
128
|
+
|
129
|
+
Args:
|
130
|
+
frame: PCAP frame.
|
131
|
+
|
132
|
+
Returns:
|
133
|
+
A tuple of data for TCP reassembly.
|
134
|
+
|
135
|
+
* If the ``frame`` can be used for TCP reassembly. A frame can be reassembled
|
136
|
+
if it contains TCP layer (:class:`~pcapkit.protocols.transport.tcp.TCP`).
|
137
|
+
* If the ``frame`` can be reassembled, then the :obj:`dict` mapping of data for TCP
|
138
|
+
reassembly (:term:`reasm.tcp.packet`) will be returned; otherwise, returns :data:`None`.
|
139
|
+
|
140
|
+
See Also:
|
141
|
+
:class:`pcapkit.foundation.reassembly.tcp.TCP`
|
142
|
+
|
143
|
+
"""
|
144
|
+
if 'TCP' in frame:
|
145
|
+
ip = cast('IPv4 | IPv6', frame['IP'])
|
146
|
+
ip_info = ip.info
|
147
|
+
tcp = cast('TCP', frame['TCP'])
|
148
|
+
tcp_info = tcp.info
|
149
|
+
|
150
|
+
raw_len = len(tcp.packet.payload)
|
151
|
+
data = TCP_Packet(
|
152
|
+
bufid=(
|
153
|
+
ip_info.src, # source IP address
|
154
|
+
tcp_info.srcport.port, # source port
|
155
|
+
ip_info.dst, # destination IP address
|
156
|
+
tcp_info.dstport.port, # destination port
|
157
|
+
),
|
158
|
+
num=frame.info.number, # original packet range number
|
159
|
+
ack=tcp_info.ack, # acknowledgement
|
160
|
+
dsn=tcp_info.seq, # data sequence number
|
161
|
+
syn=tcp_info.flags.syn, # synchronise flag
|
162
|
+
fin=tcp_info.flags.fin, # finish flag
|
163
|
+
rst=tcp_info.flags.rst, # reset connection flag
|
164
|
+
header=tcp.packet.header, # raw bytes type header
|
165
|
+
payload=bytearray(tcp.packet.payload), # raw bytearray type payload
|
166
|
+
first=tcp_info.seq, # this sequence number
|
167
|
+
last=tcp_info.seq + raw_len, # next (wanted) sequence number
|
168
|
+
len=raw_len, # payload length, header excludes
|
169
|
+
)
|
170
|
+
return data
|
171
|
+
return None
|
172
|
+
|
173
|
+
|
174
|
+
def tcp_traceflow(frame: 'Frame', *, data_link: 'LinkType') -> 'TF_TCP_Packet | None':
|
175
|
+
"""Trace packet flow for TCP.
|
176
|
+
|
177
|
+
Args:
|
178
|
+
frame: PCAP frame.
|
179
|
+
data_link: Data link layer protocol (from global header).
|
180
|
+
|
181
|
+
Returns:
|
182
|
+
Data for TCP reassembly.
|
183
|
+
|
184
|
+
* If the ``packet`` can be used for TCP flow tracing. A frame can be reassembled
|
185
|
+
if it contains TCP layer (:class:`~pcapkit.protocols.transport.tcp.TCP`).
|
186
|
+
* If the ``frame`` can be reassembled, then the :obj:`dict` mapping of data for TCP
|
187
|
+
flow tracing (:term:`trace.tcp.packet`) will be returned; otherwise, returns :data:`None`.
|
188
|
+
|
189
|
+
See Also:
|
190
|
+
:class:`pcapkit.foundation.traceflow.tcp.TCP`
|
191
|
+
|
192
|
+
"""
|
193
|
+
if 'TCP' in frame:
|
194
|
+
ip = cast('IPv4 | IPv6', frame['IP'])
|
195
|
+
ip_info = ip.info
|
196
|
+
tcp = cast('TCP', frame['TCP'])
|
197
|
+
tcp_info = tcp.info
|
198
|
+
|
199
|
+
data = TF_TCP_Packet( # type: ignore[type-var]
|
200
|
+
protocol=data_link, # data link type from global header
|
201
|
+
index=frame.info.number, # frame number
|
202
|
+
frame=frame.info, # extracted frame info
|
203
|
+
syn=tcp_info.flags.syn, # TCP synchronise (SYN) flag
|
204
|
+
fin=tcp_info.flags.fin, # TCP finish (FIN) flag
|
205
|
+
src=ip_info.src, # source IP
|
206
|
+
dst=ip_info.dst, # destination IP
|
207
|
+
srcport=tcp_info.srcport.port, # TCP source port
|
208
|
+
dstport=tcp_info.dstport.port, # TCP destination port
|
209
|
+
timestamp=float(frame.info.time_epoch), # frame timestamp
|
210
|
+
)
|
211
|
+
return data
|
212
|
+
return None
|