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
@@ -0,0 +1,129 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""No-Payload Packet
|
3
|
+
=======================
|
4
|
+
|
5
|
+
.. module:: pcapkit.protocols.misc.null
|
6
|
+
|
7
|
+
:mod:`pcapkit.protocols.null` contains
|
8
|
+
:class:`~pcapkit.protocols.null.NoPayload` only, which
|
9
|
+
implements a :class:`~pcapkit.protocols.protocol.Protocol` like
|
10
|
+
object whose payload is recursively
|
11
|
+
:class:`~pcapkit.protocols.null.NoPayload` itself.
|
12
|
+
|
13
|
+
"""
|
14
|
+
import io
|
15
|
+
from typing import TYPE_CHECKING, overload
|
16
|
+
|
17
|
+
from pcapkit.protocols.data.misc.null import NoPayload as Data_NoPayload
|
18
|
+
from pcapkit.protocols.protocol import ProtocolBase as Protocol
|
19
|
+
from pcapkit.protocols.schema.misc.null import NoPayload as Schema_NoPayload
|
20
|
+
from pcapkit.utilities.exceptions import UnsupportedCall
|
21
|
+
|
22
|
+
if TYPE_CHECKING:
|
23
|
+
from typing import IO, Any, NoReturn, Optional
|
24
|
+
|
25
|
+
from typing_extensions import Literal
|
26
|
+
|
27
|
+
__all__ = ['NoPayload']
|
28
|
+
|
29
|
+
|
30
|
+
class NoPayload(Protocol[Data_NoPayload, Schema_NoPayload],
|
31
|
+
schema=Schema_NoPayload, data=Data_NoPayload):
|
32
|
+
"""This class implements no-payload protocol."""
|
33
|
+
|
34
|
+
##########################################################################
|
35
|
+
# Properties.
|
36
|
+
##########################################################################
|
37
|
+
|
38
|
+
# name of current protocol
|
39
|
+
@property
|
40
|
+
def name(self) -> 'Literal["Null"]':
|
41
|
+
"""Name of current protocol."""
|
42
|
+
return 'Null'
|
43
|
+
|
44
|
+
# header length of current protocol
|
45
|
+
@property
|
46
|
+
def length(self) -> 'Literal[0]':
|
47
|
+
"""Header length of current protocol."""
|
48
|
+
return 0
|
49
|
+
|
50
|
+
# name of next layer protocol
|
51
|
+
@property
|
52
|
+
def protocol(self) -> 'NoReturn':
|
53
|
+
"""Name of next layer protocol.
|
54
|
+
|
55
|
+
Raises:
|
56
|
+
UnsupportedCall: This protocol doesn't support :attr:`protocol`.
|
57
|
+
|
58
|
+
"""
|
59
|
+
raise UnsupportedCall(f"'{self.__class__.__name__}' object has no attribute 'protocol'")
|
60
|
+
|
61
|
+
##########################################################################
|
62
|
+
# Methods.
|
63
|
+
##########################################################################
|
64
|
+
|
65
|
+
def read(self, length: 'Optional[int]' = None, **kwargs: 'Any') -> 'Data_NoPayload': # pylint: disable=unused-argument
|
66
|
+
"""Read (parse) packet data.
|
67
|
+
|
68
|
+
Args:
|
69
|
+
length: Length of packet data.
|
70
|
+
**kwargs: Arbitrary keyword arguments.
|
71
|
+
|
72
|
+
Returns:
|
73
|
+
Parsed packet data.
|
74
|
+
|
75
|
+
"""
|
76
|
+
return Data_NoPayload()
|
77
|
+
|
78
|
+
def make(self, **kwargs: 'Any') -> 'Schema_NoPayload':
|
79
|
+
"""Make (construct) packet data.
|
80
|
+
|
81
|
+
Args:
|
82
|
+
**kwargs: Arbitrary keyword arguments.
|
83
|
+
|
84
|
+
Returns:
|
85
|
+
Constructed packet schema.
|
86
|
+
|
87
|
+
"""
|
88
|
+
return Schema_NoPayload()
|
89
|
+
|
90
|
+
##########################################################################
|
91
|
+
# Data models.
|
92
|
+
##########################################################################
|
93
|
+
|
94
|
+
@overload
|
95
|
+
def __post_init__(self, file: 'IO[bytes] | bytes', length: 'Optional[int]' = ..., **kwargs: 'Any') -> 'None': ...
|
96
|
+
@overload
|
97
|
+
def __post_init__(self, **kwargs: 'Any') -> 'None': ... # pylint: disable=arguments-differ
|
98
|
+
|
99
|
+
def __post_init__(self, file: 'Optional[IO[bytes] | bytes]' = None, # pylint: disable=unused-argument
|
100
|
+
length: 'Optional[int]' = None, **kwargs: 'Any') -> 'None':
|
101
|
+
"""Post initialisation hook.
|
102
|
+
|
103
|
+
Args:
|
104
|
+
file: Source packet stream.
|
105
|
+
length: Length of packet data.
|
106
|
+
**kwargs: Arbitrary keyword arguments.
|
107
|
+
|
108
|
+
"""
|
109
|
+
#: bytes: Raw packet data.
|
110
|
+
self._data = b''
|
111
|
+
#: io.BytesIO: Source data stream.
|
112
|
+
self._file = io.BytesIO()
|
113
|
+
#: pcapkit.protocols.data.misc.null.NoPayload: Info dict of current instance.
|
114
|
+
self._info = Data_NoPayload()
|
115
|
+
|
116
|
+
#: pcapkit.protocols.null.NoPayload: Payload of current instance.
|
117
|
+
self._next = self
|
118
|
+
#: pcapkit.corekit.protochain.ProtoChain: Protocol chain of current instance.
|
119
|
+
self._protos = None # type: ignore[assignment]
|
120
|
+
|
121
|
+
@classmethod
|
122
|
+
def __index__(cls) -> 'NoReturn':
|
123
|
+
"""Numeral registry index of the protocol.
|
124
|
+
|
125
|
+
Raises:
|
126
|
+
UnsupportedCall: This protocol has no registry entry.
|
127
|
+
|
128
|
+
"""
|
129
|
+
raise UnsupportedCall(f'{cls.__name__!r} object cannot be interpreted as an integer')
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# pylint: disable=unused-import,unused-wildcard-import,fixme
|
3
|
+
"""PCAP File Headers
|
4
|
+
=======================
|
5
|
+
|
6
|
+
.. module:: pcapkit.protocols.misc.pcap
|
7
|
+
|
8
|
+
:mod:`pcapkit.protocols.misc.pcap` contains header descriptions for
|
9
|
+
PCAP files, including global header
|
10
|
+
(:class:`~pcapkit.protocols.misc.pcap.header.Header`) and frame header
|
11
|
+
(:class:`~pcapkit.protocols.misc.pcap.frame.Frame`).
|
12
|
+
|
13
|
+
"""
|
14
|
+
from pcapkit.protocols.misc.pcap.frame import Frame
|
15
|
+
from pcapkit.protocols.misc.pcap.header import Header
|
16
|
+
|
17
|
+
__all__ = ['Frame', 'Header']
|
@@ -0,0 +1,478 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# mypy: disable-error-code=dict-item
|
3
|
+
"""Frame Header
|
4
|
+
==================
|
5
|
+
|
6
|
+
.. module:: pcapkit.protocols.misc.pcap.frame
|
7
|
+
|
8
|
+
:mod:`pcapkit.protocols.misc.pcap.frame` contains
|
9
|
+
:class:`~pcapkit.protocols.misc.pcap.frame.Frame` only,
|
10
|
+
which implements extractor for frame headers [*]_ of PCAP,
|
11
|
+
whose structure is described as below:
|
12
|
+
|
13
|
+
.. code-block:: c
|
14
|
+
|
15
|
+
typedef struct pcaprec_hdr_s {
|
16
|
+
guint32 ts_sec; /* timestamp seconds */
|
17
|
+
guint32 ts_usec; /* timestamp microseconds */
|
18
|
+
guint32 incl_len; /* number of octets of packet saved in file */
|
19
|
+
guint32 orig_len; /* actual length of packet */
|
20
|
+
} pcaprec_hdr_t;
|
21
|
+
|
22
|
+
.. [*] https://wiki.wireshark.org/Development/LibpcapFileFormat#Record_.28Packet.29_Header
|
23
|
+
|
24
|
+
"""
|
25
|
+
import collections
|
26
|
+
import datetime
|
27
|
+
import decimal
|
28
|
+
import io
|
29
|
+
import sys
|
30
|
+
import time
|
31
|
+
from typing import TYPE_CHECKING, cast, overload
|
32
|
+
|
33
|
+
from pcapkit.const.reg.linktype import LinkType as Enum_LinkType
|
34
|
+
from pcapkit.corekit.module import ModuleDescriptor
|
35
|
+
from pcapkit.protocols.data.misc.pcap.frame import Frame as Data_Frame
|
36
|
+
from pcapkit.protocols.data.misc.pcap.frame import FrameInfo as Data_FrameInfo
|
37
|
+
from pcapkit.protocols.protocol import ProtocolBase as Protocol
|
38
|
+
from pcapkit.protocols.schema.misc.pcap.frame import Frame as Schema_Frame
|
39
|
+
from pcapkit.utilities.compat import localcontext
|
40
|
+
from pcapkit.utilities.exceptions import RegistryError, UnsupportedCall, stacklevel
|
41
|
+
from pcapkit.utilities.warnings import ProtocolWarning, RegistryWarning, warn
|
42
|
+
|
43
|
+
if TYPE_CHECKING:
|
44
|
+
from datetime import datetime as dt_type
|
45
|
+
from decimal import Decimal
|
46
|
+
from typing import IO, Any, DefaultDict, Optional, Type
|
47
|
+
|
48
|
+
from typing_extensions import Literal
|
49
|
+
|
50
|
+
from pcapkit.protocols.data.misc.pcap.header import Header as Data_Header
|
51
|
+
from pcapkit.protocols.schema.schema import Schema
|
52
|
+
|
53
|
+
__all__ = ['Frame']
|
54
|
+
|
55
|
+
# check Python version
|
56
|
+
py37 = ((version_info := sys.version_info).major >= 3 and version_info.minor >= 7)
|
57
|
+
|
58
|
+
|
59
|
+
class Frame(Protocol[Data_Frame, Schema_Frame],
|
60
|
+
schema=Schema_Frame, data=Data_Frame):
|
61
|
+
"""Per packet frame header extractor.
|
62
|
+
|
63
|
+
This class currently supports parsing of the following protocols, which are
|
64
|
+
registered in the :attr:`self.__proto__ <pcapkit.protocols.misc.pcap.frame.Frame.__proto__>`
|
65
|
+
attribute:
|
66
|
+
|
67
|
+
.. list-table::
|
68
|
+
:header-rows: 1
|
69
|
+
|
70
|
+
* - Index
|
71
|
+
- Protocol
|
72
|
+
* - :attr:`pcapkit.const.reg.linktype.LinkType.ETHERNET`
|
73
|
+
- :class:`pcapkit.protocols.link.ethernet.Ethernet`
|
74
|
+
* - :attr:`pcapkit.const.reg.linktype.LinkType.IPV4`
|
75
|
+
- :class:`pcapkit.protocols.internet.ipv4.IPv4`
|
76
|
+
* - :attr:`pcapkit.const.reg.linktype.LinkType.IPV6`
|
77
|
+
- :class:`pcapkit.protocols.internet.ipv6.IPv6`
|
78
|
+
|
79
|
+
"""
|
80
|
+
|
81
|
+
##########################################################################
|
82
|
+
# Defaults.
|
83
|
+
##########################################################################
|
84
|
+
|
85
|
+
#: DefaultDict[Enum_LinkType, ModuleDescriptor[Protocol] | Type[Protocol]]: Protocol index mapping for
|
86
|
+
#: decoding next layer, c.f. :meth:`self._decode_next_layer <pcapkit.protocols.protocol.Protocol._decode_next_layer>`
|
87
|
+
#: & :meth:`self._import_next_layer <pcapkit.protocols.protocol.Protocol._import_next_layer>`.
|
88
|
+
#: The values should be a tuple representing the module name and class name, or
|
89
|
+
#: a :class:`~pcapkit.protocols.protocol.Protocol` subclass.
|
90
|
+
__proto__ = collections.defaultdict(
|
91
|
+
lambda: ModuleDescriptor('pcapkit.protocols.misc.raw', 'Raw'),
|
92
|
+
{
|
93
|
+
Enum_LinkType.ETHERNET: ModuleDescriptor('pcapkit.protocols.link', 'Ethernet'),
|
94
|
+
Enum_LinkType.IPV4: ModuleDescriptor('pcapkit.protocols.internet', 'IPv4'),
|
95
|
+
Enum_LinkType.IPV6: ModuleDescriptor('pcapkit.protocols.internet', 'IPv6'),
|
96
|
+
},
|
97
|
+
) # type: DefaultDict[Enum_LinkType | int, ModuleDescriptor[Protocol] | Type[Protocol]]
|
98
|
+
|
99
|
+
##########################################################################
|
100
|
+
# Properties.
|
101
|
+
##########################################################################
|
102
|
+
|
103
|
+
@property
|
104
|
+
def name(self) -> 'str':
|
105
|
+
"""Name of corresponding protocol."""
|
106
|
+
return f'Frame {self._fnum}'
|
107
|
+
|
108
|
+
@property
|
109
|
+
def length(self) -> 'Literal[16]':
|
110
|
+
"""Header length of corresponding protocol."""
|
111
|
+
return 16
|
112
|
+
|
113
|
+
@property
|
114
|
+
def header(self) -> 'Data_Header':
|
115
|
+
"""Global header of the PCAP file."""
|
116
|
+
return self._ghdr
|
117
|
+
|
118
|
+
##########################################################################
|
119
|
+
# Methods.
|
120
|
+
##########################################################################
|
121
|
+
|
122
|
+
@classmethod
|
123
|
+
def register(cls, code: 'Enum_LinkType', protocol: 'ModuleDescriptor[Protocol] | Type[Protocol]') -> 'None': # type: ignore[override]
|
124
|
+
r"""Register a new protocol class.
|
125
|
+
|
126
|
+
Notes:
|
127
|
+
The full qualified class name of the new protocol class
|
128
|
+
should be as ``{protocol.module}.{protocol.name}``.
|
129
|
+
|
130
|
+
Arguments:
|
131
|
+
code: protocol code as in :class:`~pcapkit.const.reg.linktype.LinkType`
|
132
|
+
module: module descriptor or a
|
133
|
+
:class:`~pcapkit.protocols.protocol.Protocol` subclass
|
134
|
+
|
135
|
+
"""
|
136
|
+
if isinstance(protocol, ModuleDescriptor):
|
137
|
+
protocol = protocol.klass
|
138
|
+
if not issubclass(protocol, Protocol):
|
139
|
+
raise RegistryError(f'protocol must be a Protocol subclass, not {protocol!r}')
|
140
|
+
if code in cls.__proto__:
|
141
|
+
warn(f'protocol {code} already registered, overwriting', RegistryWarning)
|
142
|
+
cls.__proto__[code] = protocol
|
143
|
+
|
144
|
+
def index(self, name: 'str | Protocol | Type[Protocol]') -> 'int':
|
145
|
+
"""Call :meth:`ProtoChain.index <pcapkit.corekit.protochain.ProtoChain.index>`.
|
146
|
+
|
147
|
+
Args:
|
148
|
+
name: ``name`` to be searched
|
149
|
+
|
150
|
+
Returns:
|
151
|
+
First index of ``name``.
|
152
|
+
|
153
|
+
Raises:
|
154
|
+
IndexNotFound: if ``name`` is not present
|
155
|
+
|
156
|
+
"""
|
157
|
+
return self._protos.index(name)
|
158
|
+
|
159
|
+
def pack(self, **kwargs: 'Any') -> 'bytes':
|
160
|
+
"""Pack (construct) packet data.
|
161
|
+
|
162
|
+
Args:
|
163
|
+
**kwargs: Arbitrary keyword arguments.
|
164
|
+
|
165
|
+
Returns:
|
166
|
+
Constructed packet data.
|
167
|
+
|
168
|
+
Notes:
|
169
|
+
We used a special keyword argument ``__packet__`` to pass the
|
170
|
+
global packet data to underlying methods. This is useful when
|
171
|
+
the packet data is not available in the current instance.
|
172
|
+
|
173
|
+
"""
|
174
|
+
self.__header__ = self.make(**kwargs)
|
175
|
+
packet = kwargs.get('__packet__', {}) # packet data
|
176
|
+
packet['byteorder'] = self._ghdr.magic_number.byteorder
|
177
|
+
return self.__header__.pack(packet)
|
178
|
+
|
179
|
+
def unpack(self, length: 'Optional[int]' = None, **kwargs: 'Any') -> 'Data_Frame':
|
180
|
+
"""Unpack (parse) packet data.
|
181
|
+
|
182
|
+
Args:
|
183
|
+
length: Length of packet data.
|
184
|
+
**kwargs: Arbitrary keyword arguments.
|
185
|
+
|
186
|
+
Returns:
|
187
|
+
Parsed packet data.
|
188
|
+
|
189
|
+
Notes:
|
190
|
+
We used a special keyword argument ``__packet__`` to pass the
|
191
|
+
global packet data to underlying methods. This is useful when
|
192
|
+
the packet data is not available in the current instance.
|
193
|
+
|
194
|
+
"""
|
195
|
+
if cast('Optional[Schema_Frame]', self.__header__) is None:
|
196
|
+
packet = kwargs.get('__packet__', {}) # packet data
|
197
|
+
packet['bytesorder'] = self._ghdr.magic_number.byteorder
|
198
|
+
self.__header__ = cast('Schema_Frame', self.__schema__.unpack(self._file, length, packet)) # type: ignore[call-arg,misc]
|
199
|
+
return self.read(length, **kwargs)
|
200
|
+
|
201
|
+
def read(self, length: 'Optional[int]' = None, *, _read: 'bool' = True, **kwargs: 'Any') -> 'Data_Frame':
|
202
|
+
r"""Read each block after global header.
|
203
|
+
|
204
|
+
Args:
|
205
|
+
length: Length of data to be read.
|
206
|
+
\_read: If the class is called in a parsing scenario.
|
207
|
+
**kwargs: Arbitrary keyword arguments.
|
208
|
+
|
209
|
+
Returns:
|
210
|
+
Data_Frame: Parsed packet data.
|
211
|
+
|
212
|
+
"""
|
213
|
+
schema = self.__header__
|
214
|
+
|
215
|
+
_tsss = schema.ts_sec
|
216
|
+
_tsus = schema.ts_usec
|
217
|
+
_ilen = schema.incl_len
|
218
|
+
_olen = schema.orig_len
|
219
|
+
|
220
|
+
with localcontext(prec=64):
|
221
|
+
if self._nsec:
|
222
|
+
_epch = _tsss + decimal.Decimal(_tsus) / 1_000_000_000
|
223
|
+
else:
|
224
|
+
_epch = _tsss + decimal.Decimal(_tsus) / 1_000_000
|
225
|
+
_irat = _epch.as_integer_ratio()
|
226
|
+
|
227
|
+
try:
|
228
|
+
_time = datetime.datetime.fromtimestamp(_irat[0] / _irat[1])
|
229
|
+
except ValueError:
|
230
|
+
warn(f'PCAP: invalid timestamp: {_epch}', ProtocolWarning, stacklevel=stacklevel())
|
231
|
+
_time = datetime.datetime.fromtimestamp(0, datetime.timezone.utc)
|
232
|
+
|
233
|
+
frame = Data_Frame(
|
234
|
+
frame_info=Data_FrameInfo(
|
235
|
+
ts_sec=_tsss,
|
236
|
+
ts_usec=_tsus,
|
237
|
+
incl_len=_ilen,
|
238
|
+
orig_len=_olen,
|
239
|
+
),
|
240
|
+
time=_time,
|
241
|
+
number=self._fnum,
|
242
|
+
time_epoch=_epch,
|
243
|
+
len=_ilen,
|
244
|
+
cap_len=_olen,
|
245
|
+
)
|
246
|
+
|
247
|
+
if not _read:
|
248
|
+
# move backward to the beginning of the packet
|
249
|
+
self._file.seek(0, io.SEEK_SET)
|
250
|
+
else:
|
251
|
+
# NOTE: We create a copy of the frame data here for parsing
|
252
|
+
# scenarios to keep the original frame data intact.
|
253
|
+
seek_cur = self._file.tell()
|
254
|
+
|
255
|
+
# move backward to the beginning of the frame
|
256
|
+
self._file.seek(-self.length, io.SEEK_CUR)
|
257
|
+
|
258
|
+
#: bytes: Raw frame data.
|
259
|
+
self._data = self._read_fileng(self.length + _ilen)
|
260
|
+
|
261
|
+
# move backward to the beginning of frame's payload
|
262
|
+
self._file.seek(seek_cur, io.SEEK_SET)
|
263
|
+
|
264
|
+
#: io.BytesIO: Source data stream.
|
265
|
+
self._file = io.BytesIO(self._data)
|
266
|
+
|
267
|
+
return self._decode_next_layer(frame, self._ghdr.network, frame.len)
|
268
|
+
|
269
|
+
def make(self,
|
270
|
+
timestamp: 'Optional[float | Decimal | int | dt_type]' = None,
|
271
|
+
ts_sec: 'Optional[int]' = None,
|
272
|
+
ts_usec: 'Optional[int]' = None,
|
273
|
+
incl_len: 'Optional[int]' = None,
|
274
|
+
orig_len: 'Optional[int]' = None,
|
275
|
+
packet: 'bytes | Protocol | Schema' = b'',
|
276
|
+
nanosecond: 'bool' = False,
|
277
|
+
**kwargs: 'Any') -> 'Schema_Frame':
|
278
|
+
"""Make frame packet data.
|
279
|
+
|
280
|
+
Args:
|
281
|
+
timestamp: UNIX-Epoch timestamp
|
282
|
+
ts_sec: timestamp seconds
|
283
|
+
ts_usec: timestamp microseconds
|
284
|
+
incl_len: number of octets of packet saved in file
|
285
|
+
orig_len: actual length of packet
|
286
|
+
packet: raw packet data
|
287
|
+
nanosecond: nanosecond-resolution file flag
|
288
|
+
**kwargs: Arbitrary keyword arguments.
|
289
|
+
|
290
|
+
Returns:
|
291
|
+
Constructed packet data.
|
292
|
+
|
293
|
+
"""
|
294
|
+
ts_sec, ts_usec = self._make_timestamp(timestamp, ts_sec, ts_usec, nanosecond)
|
295
|
+
|
296
|
+
if incl_len is None:
|
297
|
+
incl_len = min(len(packet), self._ghdr.snaplen)
|
298
|
+
if orig_len is None:
|
299
|
+
orig_len = len(packet)
|
300
|
+
|
301
|
+
return Schema_Frame(
|
302
|
+
ts_sec=ts_sec,
|
303
|
+
ts_usec=ts_usec,
|
304
|
+
incl_len=incl_len,
|
305
|
+
orig_len=orig_len,
|
306
|
+
packet=packet,
|
307
|
+
)
|
308
|
+
|
309
|
+
##########################################################################
|
310
|
+
# Data models.
|
311
|
+
##########################################################################
|
312
|
+
|
313
|
+
@overload
|
314
|
+
def __post_init__(self, file: 'IO[bytes] | bytes', length: 'Optional[int]' = ..., *, # pylint: disable=arguments-differ
|
315
|
+
num: 'int', header: 'Data_Header', **kwargs: 'Any') -> 'None': ...
|
316
|
+
@overload
|
317
|
+
def __post_init__(self, *, num: 'int', header: 'Data_Header', # pylint: disable=arguments-differ
|
318
|
+
**kwargs: 'Any') -> 'None': ...
|
319
|
+
|
320
|
+
def __post_init__(self, file: 'Optional[IO[bytes] | bytes]' = None, length: 'Optional[int]' = None, *, # pylint: disable=arguments-differ
|
321
|
+
num: 'int', header: 'Data_Header', **kwargs: 'Any') -> 'None':
|
322
|
+
"""Initialisation.
|
323
|
+
|
324
|
+
Args:
|
325
|
+
file: Source packet stream.
|
326
|
+
length: Length of packet data.
|
327
|
+
num: Frame index number.
|
328
|
+
header: Global header of the PCAP file.
|
329
|
+
**kwargs: Arbitrary keyword arguments.
|
330
|
+
|
331
|
+
See Also:
|
332
|
+
For construction argument, please refer to :meth:`make`.
|
333
|
+
|
334
|
+
"""
|
335
|
+
#: int: frame index number
|
336
|
+
self._fnum = num
|
337
|
+
#: pcapkit.protocols.misc.pcap.header.Header: Global header of the PCAP file.
|
338
|
+
self._ghdr = header
|
339
|
+
|
340
|
+
#: pcapkit.const.reg.linktype.LinkType: next layer protocol index
|
341
|
+
self._prot = header.network
|
342
|
+
#: bool: nanosecond-timestamp PCAP flag
|
343
|
+
self._nsec = header.magic_number.nanosecond
|
344
|
+
|
345
|
+
if file is None:
|
346
|
+
_read = False
|
347
|
+
#: bytes: Raw packet data.
|
348
|
+
self._data = self.pack(**kwargs)
|
349
|
+
#: io.BytesIO: Source packet stream.
|
350
|
+
self._file = io.BytesIO(self._data)
|
351
|
+
else:
|
352
|
+
_read = True
|
353
|
+
#: io.BytesIO: Source packet stream.
|
354
|
+
self._file = io.BytesIO(file) if isinstance(file, bytes) else file
|
355
|
+
|
356
|
+
#: pcapkit.corekit.infoclass.Info: Parsed packet data.
|
357
|
+
self._info = self.unpack(length, _read=_read, **kwargs)
|
358
|
+
|
359
|
+
def __length_hint__(self) -> 'Literal[16]':
|
360
|
+
"""Return an estimated length for the object."""
|
361
|
+
return 16
|
362
|
+
|
363
|
+
# NOTE: This is a hack to make the ``__index__`` method work both as a
|
364
|
+
# class method and an instance method.
|
365
|
+
def __index__(self: 'Optional[Frame]' = None) -> 'int': # type: ignore[override]
|
366
|
+
"""Index of the frame.
|
367
|
+
|
368
|
+
Args:
|
369
|
+
self: :class:`Frame` object or :obj:`None`.
|
370
|
+
|
371
|
+
Returns:
|
372
|
+
If the object is initiated, i.e. :attr:`self._fnum <pcapkit.protocols.misc.pcap.frame.Frame._fnum>`
|
373
|
+
exists, returns the frame index number of itself; else raises :exc:`UnsupportedCall`.
|
374
|
+
|
375
|
+
Raises:
|
376
|
+
UnsupportedCall: This protocol has no registry entry.
|
377
|
+
|
378
|
+
"""
|
379
|
+
if self is None:
|
380
|
+
raise UnsupportedCall("'Frame' object cannot be interpreted as an integer")
|
381
|
+
return self._fnum
|
382
|
+
|
383
|
+
##########################################################################
|
384
|
+
# Utilities.
|
385
|
+
##########################################################################
|
386
|
+
|
387
|
+
@classmethod
|
388
|
+
def _make_data(cls, data: 'Data_Frame') -> 'dict[str, Any]': # type: ignore[override]
|
389
|
+
"""Create key-value pairs from ``data`` for protocol construction.
|
390
|
+
|
391
|
+
Args:
|
392
|
+
data: protocol data
|
393
|
+
|
394
|
+
Returns:
|
395
|
+
Key-value pairs for protocol construction.
|
396
|
+
|
397
|
+
"""
|
398
|
+
return {
|
399
|
+
'ts_src': data.frame_info.ts_sec,
|
400
|
+
'ts_usec': data.frame_info.ts_usec,
|
401
|
+
'incl_len': data.frame_info.incl_len,
|
402
|
+
'orig_len': data.frame_info.orig_len,
|
403
|
+
'packet': cls._make_payload(data),
|
404
|
+
}
|
405
|
+
|
406
|
+
def _make_timestamp(self, timestamp: 'Optional[float | Decimal | dt_type | int]' = None, ts_sec: 'Optional[int]' = None,
|
407
|
+
ts_usec: 'Optional[int]' = None, nanosecond: 'bool' = False) -> 'tuple[int, int]':
|
408
|
+
"""Make timestamp.
|
409
|
+
|
410
|
+
Args:
|
411
|
+
timestamp: UNIX-Epoch timestamp
|
412
|
+
ts_sec: timestamp seconds
|
413
|
+
ts_usec: timestamp microseconds
|
414
|
+
nanosecond: nanosecond-resolution file flag
|
415
|
+
|
416
|
+
Returns:
|
417
|
+
Second and microsecond/nanosecond value of timestamp.
|
418
|
+
|
419
|
+
"""
|
420
|
+
with localcontext(prec=64):
|
421
|
+
if timestamp is None:
|
422
|
+
if py37 and nanosecond:
|
423
|
+
timestamp = decimal.Decimal(time.time_ns()) / 1_000_000_000
|
424
|
+
else:
|
425
|
+
timestamp = decimal.Decimal(time.time())
|
426
|
+
else:
|
427
|
+
if isinstance(timestamp, datetime.datetime):
|
428
|
+
timestamp = timestamp.timestamp()
|
429
|
+
timestamp = decimal.Decimal(timestamp)
|
430
|
+
|
431
|
+
if ts_sec is None:
|
432
|
+
ts_sec = int(timestamp)
|
433
|
+
|
434
|
+
if ts_usec is None:
|
435
|
+
ts_usec = int((timestamp - ts_sec) * (1_000_000_000 if nanosecond else 1_000_000))
|
436
|
+
|
437
|
+
return ts_sec, ts_usec
|
438
|
+
|
439
|
+
def _decode_next_layer(self, dict_: 'Data_Frame', proto: 'Optional[int]' = None,
|
440
|
+
length: 'Optional[int]' = None, *, packet: 'Optional[dict[str, Any]]' = None) -> 'Data_Frame': # pylint: disable=arguments-differ
|
441
|
+
r"""Decode next layer protocol.
|
442
|
+
|
443
|
+
Arguments:
|
444
|
+
dict\_: info buffer
|
445
|
+
proto: next layer protocol index
|
446
|
+
length: valid (*non-padding*) length
|
447
|
+
packet: packet info (passed from :meth:`self.unpack <pcapkit.protocols.protocol.Protocol.unpack>`)
|
448
|
+
|
449
|
+
Returns:
|
450
|
+
Current protocol with packet extracted.
|
451
|
+
|
452
|
+
Notes:
|
453
|
+
We added a new key ``__next_type__`` to ``dict_`` to store the
|
454
|
+
next layer protocol type, and a new key ``__next_name__`` to
|
455
|
+
store the next layer protocol name. These two keys will **NOT**
|
456
|
+
be included when :meth:`Info.to_dict <pcapkit.corekit.infoclass.Info.to_dict>` is called.
|
457
|
+
|
458
|
+
We also added a new key ``protocols`` to ``dict_`` to store the
|
459
|
+
protocol chain of the current packet (frame).
|
460
|
+
|
461
|
+
"""
|
462
|
+
next_ = cast('Protocol', self._import_next_layer(proto, length, packet=packet)) # type: ignore[misc,call-arg,redundant-cast]
|
463
|
+
info, chain = next_.info, next_.protochain
|
464
|
+
|
465
|
+
# make next layer protocol name
|
466
|
+
layer = next_.info_name
|
467
|
+
# proto = next_.__class__.__name__
|
468
|
+
|
469
|
+
# write info and protocol chain into dict
|
470
|
+
dict_.__update__({
|
471
|
+
layer: info,
|
472
|
+
'protocols': chain.chain if chain else '',
|
473
|
+
'__next_type__': type(next_),
|
474
|
+
'__next_name__': layer,
|
475
|
+
})
|
476
|
+
self._next = next_ # pylint: disable=attribute-defined-outside-init
|
477
|
+
self._protos = chain # pylint: disable=attribute-defined-outside-init
|
478
|
+
return dict_
|