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,282 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""container field class"""
|
3
|
+
|
4
|
+
import copy
|
5
|
+
import io
|
6
|
+
from typing import TYPE_CHECKING, Generic, TypeVar, cast
|
7
|
+
|
8
|
+
from pcapkit.corekit.fields.field import FieldBase
|
9
|
+
from pcapkit.corekit.multidict import OrderedMultiDict
|
10
|
+
from pcapkit.utilities.compat import List
|
11
|
+
from pcapkit.utilities.exceptions import FieldValueError
|
12
|
+
|
13
|
+
__all__ = [
|
14
|
+
'ListField', 'OptionField',
|
15
|
+
]
|
16
|
+
|
17
|
+
if TYPE_CHECKING:
|
18
|
+
from collections import defaultdict
|
19
|
+
from enum import IntEnum as StdlibEnum
|
20
|
+
from typing import IO, Any, Callable, Optional, Type
|
21
|
+
|
22
|
+
from aenum import IntEnum as AenumEnum
|
23
|
+
from typing_extensions import Self
|
24
|
+
|
25
|
+
from pcapkit.protocols.schema.schema import Schema
|
26
|
+
|
27
|
+
_TL = TypeVar('_TL', 'Schema', 'FieldBase', 'bytes')
|
28
|
+
_TS = TypeVar('_TS', bound='Schema')
|
29
|
+
|
30
|
+
|
31
|
+
class ListField(FieldBase[List[_TL]], Generic[_TL]):
|
32
|
+
"""Field list for protocol fields.
|
33
|
+
|
34
|
+
Args:
|
35
|
+
length: Field size (in bytes); if a callable is given, it should return
|
36
|
+
an integer value and accept the current packet as its only argument.
|
37
|
+
item_type: Field type of the contained items.
|
38
|
+
callback: Callback function to be called upon
|
39
|
+
:meth:`self.__call__ <pcapkit.corekit.fields.field.FieldBase.__call__>`.
|
40
|
+
|
41
|
+
This field is used to represent a list of fields, as in the case of lists of
|
42
|
+
constrant-length-field items in a protocol.
|
43
|
+
|
44
|
+
"""
|
45
|
+
|
46
|
+
@property
|
47
|
+
def length(self) -> 'int':
|
48
|
+
"""Field size."""
|
49
|
+
return self._length
|
50
|
+
|
51
|
+
@property
|
52
|
+
def optional(self) -> 'bool':
|
53
|
+
"""Field is optional."""
|
54
|
+
return True
|
55
|
+
|
56
|
+
def __init__(self, length: 'int | Callable[[dict[str, Any]], int]' = lambda _: -1,
|
57
|
+
item_type: 'Optional[FieldBase]' = None,
|
58
|
+
callback: 'Callable[[Self, dict[str, Any]], None]' = lambda *_: None) -> 'None':
|
59
|
+
#self._name = '<list>'
|
60
|
+
self._callback = callback
|
61
|
+
self._item_type = item_type
|
62
|
+
|
63
|
+
self._length_callback = None
|
64
|
+
if not isinstance(length, int):
|
65
|
+
self._length_callback, length = length, -1
|
66
|
+
self._length = length
|
67
|
+
self._template = '0s'
|
68
|
+
|
69
|
+
def __call__(self, packet: 'dict[str, Any]') -> 'Self':
|
70
|
+
"""Update field attributes.
|
71
|
+
|
72
|
+
Args:
|
73
|
+
packet: Packet data.
|
74
|
+
|
75
|
+
Returns:
|
76
|
+
Updated field instance.
|
77
|
+
|
78
|
+
This method will return a new instance of :class:`ListField`
|
79
|
+
instead of updating the current instance.
|
80
|
+
|
81
|
+
"""
|
82
|
+
new_self = copy.copy(self)
|
83
|
+
new_self._callback(self, packet)
|
84
|
+
if new_self._length_callback is not None:
|
85
|
+
new_self._length = new_self._length_callback(packet)
|
86
|
+
new_self._template = f'{new_self._length}s'
|
87
|
+
return new_self
|
88
|
+
|
89
|
+
def pack(self, value: 'Optional[list[_TL]]', packet: 'dict[str, Any]') -> 'bytes':
|
90
|
+
"""Pack field value into :obj:`bytes`.
|
91
|
+
|
92
|
+
Args:
|
93
|
+
value: Field value.
|
94
|
+
packet: Packet data.
|
95
|
+
|
96
|
+
Returns:
|
97
|
+
Packed field value.
|
98
|
+
|
99
|
+
"""
|
100
|
+
if value is None:
|
101
|
+
return b''
|
102
|
+
|
103
|
+
from pcapkit.protocols.schema.schema import \
|
104
|
+
Schema # pylint: disable=import-outside-top-level
|
105
|
+
|
106
|
+
temp = [] # type: list[bytes]
|
107
|
+
for item in value:
|
108
|
+
if isinstance(item, bytes):
|
109
|
+
temp.append(item)
|
110
|
+
elif isinstance(item, Schema):
|
111
|
+
temp.append(item.pack(packet))
|
112
|
+
elif self._item_type is not None:
|
113
|
+
temp.append(self._item_type.pack(item, packet))
|
114
|
+
else:
|
115
|
+
raise FieldValueError(f'Field {self.name} has invalid value.')
|
116
|
+
return b''.join(temp)
|
117
|
+
|
118
|
+
def unpack(self, buffer: 'bytes | IO[bytes]', packet: 'dict[str, Any]') -> 'bytes | list[_TL]':
|
119
|
+
"""Unpack field value from :obj:`bytes`.
|
120
|
+
|
121
|
+
Args:
|
122
|
+
buffer: Field buffer.
|
123
|
+
packet: Packet data.
|
124
|
+
|
125
|
+
Returns:
|
126
|
+
Unpacked field value.
|
127
|
+
|
128
|
+
"""
|
129
|
+
length = self._length
|
130
|
+
if isinstance(buffer, bytes):
|
131
|
+
file = io.BytesIO(buffer) # type: IO[bytes]
|
132
|
+
else:
|
133
|
+
file = buffer
|
134
|
+
|
135
|
+
if self._item_type is None:
|
136
|
+
return file.read(length)
|
137
|
+
|
138
|
+
from pcapkit.corekit.fields.misc import SchemaField
|
139
|
+
is_schema = isinstance(self._item_type, SchemaField)
|
140
|
+
|
141
|
+
temp = [] # type: list[_TL]
|
142
|
+
while length > 0:
|
143
|
+
field = self._item_type(packet)
|
144
|
+
|
145
|
+
if is_schema:
|
146
|
+
data = cast('SchemaField', self._item_type).unpack(file, packet)
|
147
|
+
|
148
|
+
length -= len(data)
|
149
|
+
if length < 0:
|
150
|
+
raise FieldValueError(f'Field {self.name} has invalid length.')
|
151
|
+
else:
|
152
|
+
length -= field.length
|
153
|
+
if length < 0:
|
154
|
+
raise FieldValueError(f'Field {self.name} has invalid length.')
|
155
|
+
|
156
|
+
buffer = file.read(field.length)
|
157
|
+
data = field.unpack(buffer, packet)
|
158
|
+
|
159
|
+
temp.append(data)
|
160
|
+
return temp
|
161
|
+
|
162
|
+
|
163
|
+
class OptionField(ListField, Generic[_TS]):
|
164
|
+
"""Field list for protocol options.
|
165
|
+
|
166
|
+
Args:
|
167
|
+
length: Field size (in bytes); if a callable is given, it should return
|
168
|
+
an integer value and accept the current packet as its only argument.
|
169
|
+
base_schema: Base schema for option fields.
|
170
|
+
type_name: Name of the option type field.
|
171
|
+
registry: Option registry, as in a mapping from option types (enumeration
|
172
|
+
values) to option schemas, with the default value being the unknown
|
173
|
+
option schema.
|
174
|
+
eool: Enumeration of the EOOL (end-of-option-list, or equivalent) option
|
175
|
+
callback: Callback function to be called upon
|
176
|
+
:meth:`self.__call__ <pcapkit.corekit.fields.field.FieldBase.__call__>`.
|
177
|
+
|
178
|
+
This field is used to represent a list of fields, as in the case of lists of
|
179
|
+
options and/or parameters in a protocol.
|
180
|
+
|
181
|
+
"""
|
182
|
+
|
183
|
+
@property
|
184
|
+
def base_schema(self) -> 'Type[_TS]':
|
185
|
+
"""Base schema."""
|
186
|
+
return self._base_schema
|
187
|
+
|
188
|
+
@property
|
189
|
+
def type_name(self) -> 'str':
|
190
|
+
"""Type name."""
|
191
|
+
return self._type_name
|
192
|
+
|
193
|
+
@property
|
194
|
+
def registry(self) -> 'defaultdict[int | StdlibEnum | AenumEnum, Type[_TS]]':
|
195
|
+
"""Option registry."""
|
196
|
+
return self._registry
|
197
|
+
|
198
|
+
@property
|
199
|
+
def eool(self) -> 'int | StdlibEnum | AenumEnum':
|
200
|
+
"""EOOL option."""
|
201
|
+
return self._eool
|
202
|
+
|
203
|
+
@property
|
204
|
+
def option_padding(self) -> 'int':
|
205
|
+
"""Length option padding data."""
|
206
|
+
return self._option_padding
|
207
|
+
|
208
|
+
def __init__(self, length: 'int | Callable[[dict[str, Any]], int]' = lambda _: -1,
|
209
|
+
base_schema: 'Optional[Type[_TS]]' = None,
|
210
|
+
type_name: 'str' = 'type',
|
211
|
+
registry: 'Optional[defaultdict[int | StdlibEnum | AenumEnum, Type[_TS]]]' = None,
|
212
|
+
eool: 'Optional[int | StdlibEnum | AenumEnum]' = None,
|
213
|
+
callback: 'Callable[[Self, dict[str, Any]], None]' = lambda *_: None) -> 'None':
|
214
|
+
super().__init__(length, None, callback)
|
215
|
+
#self._name = '<option>'
|
216
|
+
self._eool = eool
|
217
|
+
self._option_padding = 0
|
218
|
+
|
219
|
+
if base_schema is None:
|
220
|
+
raise FieldValueError('Field <option> has no base schema.')
|
221
|
+
self._base_schema = base_schema
|
222
|
+
|
223
|
+
if not hasattr(self._base_schema, type_name):
|
224
|
+
raise FieldValueError(f'Field <option> has no type field "{type_name}".')
|
225
|
+
self._type_name = type_name
|
226
|
+
|
227
|
+
if registry is None:
|
228
|
+
raise FieldValueError('Field <option> has no registry.')
|
229
|
+
self._registry = registry
|
230
|
+
|
231
|
+
def unpack(self, buffer: 'bytes | IO[bytes]', packet: 'dict[str, Any]') -> 'list[_TS]':
|
232
|
+
"""Unpack field value from :obj:`bytes`.
|
233
|
+
|
234
|
+
Args:
|
235
|
+
buffer: Field buffer.
|
236
|
+
packet: Packet data.
|
237
|
+
|
238
|
+
Returns:
|
239
|
+
Unpacked field value.
|
240
|
+
|
241
|
+
Important:
|
242
|
+
If the option list ended before the specified size limit,
|
243
|
+
set :attr:`self.option_padding <OptionField.option_padding>`
|
244
|
+
as the remaining length to the ``packet`` argument such that
|
245
|
+
the next fields can be aware of such informations.
|
246
|
+
|
247
|
+
"""
|
248
|
+
length = self._length
|
249
|
+
if isinstance(buffer, bytes):
|
250
|
+
file = io.BytesIO(buffer) # type: IO[bytes]
|
251
|
+
else:
|
252
|
+
file = buffer
|
253
|
+
|
254
|
+
# make a copy of the ``packet`` dict so that we can include
|
255
|
+
# parsed option schema in the ``packet`` dict
|
256
|
+
new_packet = packet.copy()
|
257
|
+
new_packet[self.name] = OrderedMultiDict()
|
258
|
+
|
259
|
+
temp = [] # type: list[_TS]
|
260
|
+
while length > 0:
|
261
|
+
# unpack option type using base schema
|
262
|
+
meta = self._base_schema.unpack(file, length, packet) # type: ignore[call-arg,misc,var-annotated]
|
263
|
+
code = cast('int', meta[self._type_name])
|
264
|
+
schema = self._registry[code]
|
265
|
+
|
266
|
+
# rewind to the beginning of the option
|
267
|
+
file.seek(-len(meta), io.SEEK_CUR)
|
268
|
+
|
269
|
+
# unpack option using option schema
|
270
|
+
data = schema.unpack(file, length, packet) # type: ignore[call-arg,misc,var-annotated]
|
271
|
+
new_packet[self.name].add(code, data)
|
272
|
+
temp.append(data)
|
273
|
+
|
274
|
+
# update length
|
275
|
+
length -= len(data)
|
276
|
+
|
277
|
+
# check for EOOL
|
278
|
+
if code == self._eool:
|
279
|
+
break
|
280
|
+
|
281
|
+
self._option_padding = length
|
282
|
+
return temp
|
@@ -0,0 +1,269 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""base field class"""
|
3
|
+
|
4
|
+
import abc
|
5
|
+
import copy
|
6
|
+
import struct
|
7
|
+
from typing import TYPE_CHECKING, Generic, TypeVar, cast
|
8
|
+
|
9
|
+
from pcapkit.utilities.compat import final
|
10
|
+
from pcapkit.utilities.exceptions import NoDefaultValue
|
11
|
+
|
12
|
+
__all__ = ['Field']
|
13
|
+
|
14
|
+
if TYPE_CHECKING:
|
15
|
+
from typing import IO, Any, Callable, Optional
|
16
|
+
|
17
|
+
from typing_extensions import Literal, Self
|
18
|
+
|
19
|
+
from pcapkit.protocols.schema.schema import Schema
|
20
|
+
|
21
|
+
_T = TypeVar('_T')
|
22
|
+
|
23
|
+
|
24
|
+
@final
|
25
|
+
class NoValueType:
|
26
|
+
"""Default value for fields."""
|
27
|
+
|
28
|
+
def __bool__(self) -> 'Literal[False]':
|
29
|
+
"""Return :obj:`False`."""
|
30
|
+
return False
|
31
|
+
|
32
|
+
|
33
|
+
#: NoValueType: Default value for :attr:`FieldBase.default`.
|
34
|
+
NoValue = NoValueType()
|
35
|
+
|
36
|
+
|
37
|
+
class FieldMeta(abc.ABCMeta, Generic[_T]):
|
38
|
+
"""Meta class to add dynamic support to :class:`FieldBase`.
|
39
|
+
|
40
|
+
This meta class is used to generate necessary attributes for the
|
41
|
+
:class:`FieldBase` class. It can be useful to reduce unnecessary
|
42
|
+
registry calls and simplify the customisation process.
|
43
|
+
|
44
|
+
"""
|
45
|
+
|
46
|
+
|
47
|
+
class FieldBase(Generic[_T], metaclass=FieldMeta):
|
48
|
+
"""Internal base class for protocol fields.
|
49
|
+
|
50
|
+
Important:
|
51
|
+
A negative value of :attr:`~FieldBase.length` indicates that the field
|
52
|
+
is variable-length (i.e., length unspecified) and thus
|
53
|
+
:meth:`~FieldBase.pack` should be considerate of the template format
|
54
|
+
and the actual value provided for packing.
|
55
|
+
|
56
|
+
Args:
|
57
|
+
*args: Arbitrary positional arguments.
|
58
|
+
**kwargs: Arbitrary keyword arguments.
|
59
|
+
|
60
|
+
"""
|
61
|
+
|
62
|
+
if TYPE_CHECKING:
|
63
|
+
_name: 'str'
|
64
|
+
_default: '_T | NoValueType'
|
65
|
+
_template: 'str'
|
66
|
+
_callback: 'Callable[[Self, dict[str, Any]], None]'
|
67
|
+
|
68
|
+
@property
|
69
|
+
def name(self) -> 'str':
|
70
|
+
"""Field name."""
|
71
|
+
return self._name
|
72
|
+
|
73
|
+
@name.setter
|
74
|
+
def name(self, value: 'str') -> 'None':
|
75
|
+
"""Set field name."""
|
76
|
+
self._name = value
|
77
|
+
|
78
|
+
@property
|
79
|
+
def default(self) -> '_T | NoValueType':
|
80
|
+
"""Field default value."""
|
81
|
+
return self._default
|
82
|
+
|
83
|
+
@default.setter
|
84
|
+
def default(self, value: '_T | NoValueType') -> 'None':
|
85
|
+
"""Set field default value."""
|
86
|
+
self._default = value
|
87
|
+
|
88
|
+
@default.deleter
|
89
|
+
def default(self) -> 'None':
|
90
|
+
"""Delete field default value."""
|
91
|
+
self._default = NoValue
|
92
|
+
|
93
|
+
@property
|
94
|
+
def template(self) -> 'str':
|
95
|
+
"""Field template."""
|
96
|
+
return self._template
|
97
|
+
|
98
|
+
@property
|
99
|
+
def length(self) -> 'int':
|
100
|
+
"""Field size."""
|
101
|
+
return struct.calcsize(self.template)
|
102
|
+
|
103
|
+
@property
|
104
|
+
def optional(self) -> 'bool':
|
105
|
+
"""Field is optional."""
|
106
|
+
return False
|
107
|
+
|
108
|
+
def __call__(self, packet: 'dict[str, Any]') -> 'Self':
|
109
|
+
"""Update field attributes.
|
110
|
+
|
111
|
+
Arguments:
|
112
|
+
packet: Packet data.
|
113
|
+
|
114
|
+
Returns:
|
115
|
+
Updated field instance.
|
116
|
+
|
117
|
+
This method will return a new instance of :class:`FieldBase` instead of
|
118
|
+
updating the current instance.
|
119
|
+
|
120
|
+
"""
|
121
|
+
new_self = copy.copy(self)
|
122
|
+
new_self._callback(new_self, packet)
|
123
|
+
return new_self
|
124
|
+
|
125
|
+
# NOTE: This method is created as a placeholder for the necessary attributes.
|
126
|
+
def __init__(self, *args: 'Any', **kwargs: 'Any') -> 'None':
|
127
|
+
if not hasattr(self, '_name'):
|
128
|
+
self._name = f'<{type(self).__name__[:-5].lower()}>'
|
129
|
+
|
130
|
+
self._default = NoValue
|
131
|
+
self._template = '0s'
|
132
|
+
self._callback = lambda *_: None
|
133
|
+
|
134
|
+
def __repr__(self) -> 'str':
|
135
|
+
if not self.name.isidentifier():
|
136
|
+
return f'<{self.__class__.__name__}>'
|
137
|
+
return f'<{self.__class__.__name__} {self.name}>'
|
138
|
+
|
139
|
+
def __set_name__(self, owner: 'Schema', name: 'str') -> 'None':
|
140
|
+
"""Set field name and update field list (if applicable).
|
141
|
+
|
142
|
+
This method is to be called by the metaclass during class creation.
|
143
|
+
It is used to set the field name and update the field list, i.e.,
|
144
|
+
:attr:`Schema.__fields__ <pcapkit.protocols.schema.schema.Schema.__fields__>`
|
145
|
+
mapping dictionary.
|
146
|
+
|
147
|
+
"""
|
148
|
+
# Update field list (if applicable)
|
149
|
+
if hasattr(owner, '__fields__'):
|
150
|
+
owner.__fields__[name] = self
|
151
|
+
|
152
|
+
# Set field name
|
153
|
+
self.name = name
|
154
|
+
|
155
|
+
def pre_process(self, value: '_T', packet: 'dict[str, Any]') -> 'Any': # pylint: disable=unused-argument
|
156
|
+
"""Process field value before construction (packing).
|
157
|
+
|
158
|
+
Arguments:
|
159
|
+
value: Field value.
|
160
|
+
packet: Packet data.
|
161
|
+
|
162
|
+
Returns:
|
163
|
+
Processed field value.
|
164
|
+
|
165
|
+
"""
|
166
|
+
return cast('Any', value)
|
167
|
+
|
168
|
+
def pack(self, value: 'Optional[_T]', packet: 'dict[str, Any]') -> 'bytes':
|
169
|
+
"""Pack field value into :obj:`bytes`.
|
170
|
+
|
171
|
+
Args:
|
172
|
+
value: Field value.
|
173
|
+
packet: Packet data.
|
174
|
+
|
175
|
+
Returns:
|
176
|
+
Packed field value.
|
177
|
+
|
178
|
+
"""
|
179
|
+
if value is None:
|
180
|
+
if self._default is NoValue:
|
181
|
+
raise NoDefaultValue(f'Field {self.name} has no default value.')
|
182
|
+
value = cast('_T', self._default)
|
183
|
+
|
184
|
+
pre_processed = self.pre_process(value, packet)
|
185
|
+
return struct.pack(self.template, pre_processed)
|
186
|
+
|
187
|
+
def post_process(self, value: 'Any', packet: 'dict[str, Any]') -> '_T': # pylint: disable=unused-argument
|
188
|
+
"""Process field value after parsing (unpacking).
|
189
|
+
|
190
|
+
Args:
|
191
|
+
value: Field value.
|
192
|
+
packet: Packet data.
|
193
|
+
|
194
|
+
Returns:
|
195
|
+
Processed field value.
|
196
|
+
|
197
|
+
"""
|
198
|
+
return cast('_T', value)
|
199
|
+
|
200
|
+
def unpack(self, buffer: 'bytes | IO[bytes]', packet: 'dict[str, Any]') -> '_T':
|
201
|
+
"""Unpack field value from :obj:`bytes`.
|
202
|
+
|
203
|
+
Args:
|
204
|
+
buffer: Field buffer.
|
205
|
+
packet: Packet data.
|
206
|
+
|
207
|
+
Returns:
|
208
|
+
Unpacked field value.
|
209
|
+
|
210
|
+
"""
|
211
|
+
if not isinstance(buffer, bytes):
|
212
|
+
buffer = buffer.read(self.length)
|
213
|
+
value = struct.unpack(self.template, buffer[:self.length].rjust(self.length, b'\x00'))[0]
|
214
|
+
return self.post_process(value, packet)
|
215
|
+
|
216
|
+
|
217
|
+
class Field(FieldBase[_T], Generic[_T]):
|
218
|
+
"""Base class for protocol fields.
|
219
|
+
|
220
|
+
Args:
|
221
|
+
length: Field size (in bytes); if a callable is given, it should return
|
222
|
+
an integer value and accept the current packet as its only argument.
|
223
|
+
default: Field default value, if any.
|
224
|
+
callback: Callback function to be called upon
|
225
|
+
:meth:`self.__call__ <pcapkit.corekit.fields.field.FieldBase.__call__>`.
|
226
|
+
|
227
|
+
"""
|
228
|
+
|
229
|
+
if TYPE_CHECKING:
|
230
|
+
_template: 'str'
|
231
|
+
|
232
|
+
@property
|
233
|
+
def template(self) -> 'str':
|
234
|
+
"""Field template."""
|
235
|
+
return self._template
|
236
|
+
|
237
|
+
def __init__(self, length: 'int | Callable[[dict[str, Any]], int]',
|
238
|
+
default: '_T | NoValueType' = NoValue,
|
239
|
+
callback: 'Callable[[Self, dict[str, Any]], None]' = lambda *_: None) -> 'None':
|
240
|
+
#self._name = '<unknown>'
|
241
|
+
if not hasattr(self, '_name'):
|
242
|
+
self._name = f'<{type(self).__name__[:-5].lower()}>'
|
243
|
+
|
244
|
+
self._default = default
|
245
|
+
self._callback = callback
|
246
|
+
|
247
|
+
self._length_callback = None
|
248
|
+
if not isinstance(length, int):
|
249
|
+
self._length_callback, length = length, -1
|
250
|
+
self._length = length
|
251
|
+
|
252
|
+
def __call__(self, packet: 'dict[str, Any]') -> 'Self':
|
253
|
+
"""Update field attributes.
|
254
|
+
|
255
|
+
Args:
|
256
|
+
packet: Packet data.
|
257
|
+
|
258
|
+
Returns:
|
259
|
+
New instance of :class:`Field`.
|
260
|
+
|
261
|
+
This method will return a new instance of :class:`Field` instead of
|
262
|
+
updating the current instance.
|
263
|
+
|
264
|
+
"""
|
265
|
+
new_self = copy.copy(self)
|
266
|
+
new_self._callback(new_self, packet)
|
267
|
+
if new_self._length_callback is not None:
|
268
|
+
new_self._length = new_self._length_callback(packet)
|
269
|
+
return new_self
|