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,679 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# mypy: disable-error-code=assignment
|
3
|
+
"""header schema for hop-by-hop options"""
|
4
|
+
|
5
|
+
import collections
|
6
|
+
from typing import TYPE_CHECKING
|
7
|
+
|
8
|
+
from pcapkit.const.ipv6.option import Option as Enum_Option
|
9
|
+
from pcapkit.const.ipv6.qs_function import QSFunction as Enum_QSFunction
|
10
|
+
from pcapkit.const.ipv6.router_alert import RouterAlert as Enum_RouterAlert
|
11
|
+
from pcapkit.const.ipv6.seed_id import SeedID as Enum_SeedID
|
12
|
+
from pcapkit.const.ipv6.smf_dpd_mode import SMFDPDMode as Enum_SMFDPDMode
|
13
|
+
from pcapkit.const.ipv6.tagger_id import TaggerID as Enum_TaggerID
|
14
|
+
from pcapkit.const.reg.transtype import TransType as Enum_TransType
|
15
|
+
from pcapkit.corekit.fields.collections import OptionField
|
16
|
+
from pcapkit.corekit.fields.field import NoValue
|
17
|
+
from pcapkit.corekit.fields.ipaddress import IPv4AddressField, IPv6AddressField
|
18
|
+
from pcapkit.corekit.fields.misc import (ConditionalField, ForwardMatchField, NoValueField,
|
19
|
+
PayloadField, SchemaField, SwitchField)
|
20
|
+
from pcapkit.corekit.fields.numbers import (EnumField, NumberField, UInt8Field, UInt16Field,
|
21
|
+
UInt32Field)
|
22
|
+
from pcapkit.corekit.fields.strings import BitField, BytesField, PaddingField
|
23
|
+
from pcapkit.protocols.schema.schema import EnumSchema, Schema, schema_final
|
24
|
+
from pcapkit.utilities.exceptions import FieldValueError
|
25
|
+
from pcapkit.utilities.logging import SPHINX_TYPE_CHECKING
|
26
|
+
|
27
|
+
__all__ = [
|
28
|
+
'HOPOPT',
|
29
|
+
|
30
|
+
'SMFDPDOption', 'QuickStartOption',
|
31
|
+
'UnassignedOption', 'PadOption', 'TunnelEncapsulationLimitOption',
|
32
|
+
'RouterAlertOption', 'CALIPSOOption', 'SMFIdentificationBasedDPDOption',
|
33
|
+
'SMFHashBasedDPDOption', 'PDMOption', 'QuickStartRequestOption',
|
34
|
+
'QuickStartReportOption', 'RPLOption', 'MPLOption', 'ILNPOption',
|
35
|
+
'LineIdentificationOption', 'JumboPayloadOption', 'HomeAddressOption',
|
36
|
+
'IPDFFOption',
|
37
|
+
]
|
38
|
+
|
39
|
+
if TYPE_CHECKING:
|
40
|
+
from ipaddress import IPv4Address, IPv6Address
|
41
|
+
from typing import Any, DefaultDict, Optional, Type
|
42
|
+
|
43
|
+
from pcapkit.corekit.fields.field import FieldBase as Field
|
44
|
+
from pcapkit.protocols.protocol import ProtocolBase as Protocol
|
45
|
+
|
46
|
+
if SPHINX_TYPE_CHECKING:
|
47
|
+
from typing_extensions import TypedDict
|
48
|
+
|
49
|
+
class TaggerIDInfo(TypedDict):
|
50
|
+
"""TaggerID information."""
|
51
|
+
|
52
|
+
#: SMF mode.
|
53
|
+
mode: int
|
54
|
+
#: TaggerID type.
|
55
|
+
type: int
|
56
|
+
#: TaggerID length.
|
57
|
+
len: int
|
58
|
+
|
59
|
+
class QuickStartFlags(TypedDict):
|
60
|
+
"""Quick-Start flags."""
|
61
|
+
|
62
|
+
#: QS function.
|
63
|
+
func: int
|
64
|
+
#: Rate request/report.
|
65
|
+
rate: int
|
66
|
+
|
67
|
+
class RPLFlags(TypedDict):
|
68
|
+
"""RPL flags."""
|
69
|
+
|
70
|
+
#: Down flag.
|
71
|
+
down: int
|
72
|
+
#: Rank error flag.
|
73
|
+
rank_err: int
|
74
|
+
#: Forwarding error flag.
|
75
|
+
fwd_err: int
|
76
|
+
|
77
|
+
class MPLFlags(TypedDict):
|
78
|
+
"""MPL flags."""
|
79
|
+
|
80
|
+
#: Seed-ID type. Identifies the length of the
|
81
|
+
#: Seed-ID.
|
82
|
+
type: int
|
83
|
+
#: Max flag. ``1`` indicates that the value in the
|
84
|
+
#: sequence field is known to be the largest sequence
|
85
|
+
#: number that was received from the MPL Seed.
|
86
|
+
max: int
|
87
|
+
#: Verification flag. ``0`` indicates that the MPL Option
|
88
|
+
#: conforms to this specification.
|
89
|
+
drop: int
|
90
|
+
|
91
|
+
class DFFFlags(TypedDict):
|
92
|
+
"""``IP_DFF`` flags."""
|
93
|
+
|
94
|
+
#: Version.
|
95
|
+
ver: int
|
96
|
+
#: Duplicate flag.
|
97
|
+
dup: int
|
98
|
+
#: Retune flag.
|
99
|
+
ret: int
|
100
|
+
|
101
|
+
class SMFDPDTestFlag(TypedDict):
|
102
|
+
"""``SMF_DPD`` test flag."""
|
103
|
+
|
104
|
+
#: Length.
|
105
|
+
len: int
|
106
|
+
#: DPD mode.
|
107
|
+
mode: int
|
108
|
+
|
109
|
+
class QSTestFlags(TypedDict):
|
110
|
+
"""Quick start test flag."""
|
111
|
+
|
112
|
+
#: QS function.
|
113
|
+
func: int
|
114
|
+
|
115
|
+
class QSNonce(TypedDict):
|
116
|
+
"""Quick start nonce."""
|
117
|
+
|
118
|
+
#: Nonce.
|
119
|
+
nonce: int
|
120
|
+
|
121
|
+
|
122
|
+
def mpl_opt_seed_id_len(pkt: 'dict[str, Any]') -> 'int':
|
123
|
+
"""Return MPL Seed-ID length.
|
124
|
+
|
125
|
+
Args:
|
126
|
+
pkt: MPL option unpacked schema.
|
127
|
+
|
128
|
+
Returns:
|
129
|
+
MPL Seed-ID length.
|
130
|
+
|
131
|
+
"""
|
132
|
+
s_type = pkt['flags']['type']
|
133
|
+
if s_type == 0:
|
134
|
+
return 0
|
135
|
+
if s_type == 1:
|
136
|
+
return 2
|
137
|
+
if s_type == 2:
|
138
|
+
return 8
|
139
|
+
if s_type == 3:
|
140
|
+
return 16
|
141
|
+
raise FieldValueError(f'HOPOPT: invalid MPL Seed-ID type: {s_type}')
|
142
|
+
|
143
|
+
|
144
|
+
def smf_dpd_data_selector(pkt: 'dict[str, Any]') -> 'Field':
|
145
|
+
"""Selector function for :attr:`_SMFDPDOption.data` field.
|
146
|
+
|
147
|
+
Args:
|
148
|
+
pkt: Packet data.
|
149
|
+
|
150
|
+
Returns:
|
151
|
+
* If ``mode`` is ``0``, returns a :class:`~pcapkit.corekit.fields.misc.SchemaField`
|
152
|
+
wrapped :class:`~pcapkit.protocols.schema.internet.hopopt.SMFIdentificationBasedDPDOption`
|
153
|
+
instance.
|
154
|
+
* If ``mode`` is ``1``, returns a :class:`~pcapkit.corekit.fields.misc.SchemaField`
|
155
|
+
wrapped :class:`~pcapkit.protocols.schema.internet.hopopt.SMFHashBasedDPDOption`
|
156
|
+
instance.
|
157
|
+
|
158
|
+
"""
|
159
|
+
mode = Enum_SMFDPDMode.get(pkt['test']['mode'])
|
160
|
+
schema = SMFDPDOption.registry[mode]
|
161
|
+
if schema is None:
|
162
|
+
raise FieldValueError(f'HOPOPT: invalid SMF DPD mode: {mode}')
|
163
|
+
return SchemaField(length=pkt['test']['len'], schema=schema)
|
164
|
+
|
165
|
+
|
166
|
+
def smf_i_dpd_tid_selector(pkt: 'dict[str, Any]') -> 'Field':
|
167
|
+
"""Selector function for :attr:`SMFIdentificationBasedDPDOption.tid` field.
|
168
|
+
|
169
|
+
Args:
|
170
|
+
pkt: Packet data.
|
171
|
+
|
172
|
+
Returns:
|
173
|
+
* If ``tid_type`` is ``0``, returns a :class:`~pcapkit.corekit.fields.misc.NoValueField`
|
174
|
+
instance.
|
175
|
+
* If ``tid_type`` is ``1``, returns a :class:`~pcapkit.corekit.fields.ipaddress.IPv4AddressField`
|
176
|
+
instance.
|
177
|
+
* If ``tid_type`` is ``2``, returns a :class:`~pcapkit.corekit.fields.ipaddress.IPv6AddressField`
|
178
|
+
instance.
|
179
|
+
* Otherwise, returns a :class:`~pcapkit.corekit.fields.strings.BytesField` instance.
|
180
|
+
|
181
|
+
"""
|
182
|
+
tid_type = Enum_TaggerID.get(pkt['info']['type'])
|
183
|
+
tid_len = pkt['info']['len']
|
184
|
+
|
185
|
+
# update type
|
186
|
+
pkt['info']['type'] = tid_type
|
187
|
+
|
188
|
+
if tid_type == Enum_TaggerID.NULL:
|
189
|
+
if tid_len != 0:
|
190
|
+
raise FieldValueError(f'HOPOPT: invalid TaggerID length: {tid_len}')
|
191
|
+
return NoValueField()
|
192
|
+
if tid_type == Enum_TaggerID.IPv4:
|
193
|
+
if tid_len != 3:
|
194
|
+
raise FieldValueError(f'HOPOPT: invalid TaggerID length: {tid_len}')
|
195
|
+
return IPv4AddressField()
|
196
|
+
if tid_type == Enum_TaggerID.IPv6:
|
197
|
+
if tid_len != 15:
|
198
|
+
raise FieldValueError(f'HOPOPT: invalid TaggerID length: {tid_len}')
|
199
|
+
return IPv6AddressField()
|
200
|
+
return BytesField(length=tid_len + 1)
|
201
|
+
|
202
|
+
|
203
|
+
def quick_start_data_selector(pkt: 'dict[str, Any]') -> 'Field':
|
204
|
+
"""Selector function for :attr:`_QuickStartOption.data` field.
|
205
|
+
|
206
|
+
Args:
|
207
|
+
pkt: Packet data.
|
208
|
+
|
209
|
+
Returns:
|
210
|
+
* If ``func`` is ``0``, returns a :class:`~pcapkit.corekit.fields.misc.SchemaField`
|
211
|
+
wrapped :class:`~pcapkit.protocols.schema.internet.hopopt.QuickStartRequestOption`
|
212
|
+
instance.
|
213
|
+
* If ``func`` is ``8``, returns a :class:`~pcapkit.corekit.fields.misc.SchemaField`
|
214
|
+
wrapped :class:`~pcapkit.protocols.schema.internet.hopopt.QuickStartReportOption`
|
215
|
+
instance.
|
216
|
+
|
217
|
+
"""
|
218
|
+
func = Enum_QSFunction.get(pkt['flags']['func'])
|
219
|
+
pkt['flags']['func'] = func
|
220
|
+
|
221
|
+
schema = QuickStartOption.registry[func]
|
222
|
+
if schema is None:
|
223
|
+
raise FieldValueError(f'HOPOPT: invalid QS function: {func}')
|
224
|
+
return SchemaField(length=5, schema=schema)
|
225
|
+
|
226
|
+
|
227
|
+
class Option(EnumSchema[Enum_Option]):
|
228
|
+
"""Header schema for HOPOPT options."""
|
229
|
+
|
230
|
+
__default__ = lambda: UnassignedOption
|
231
|
+
|
232
|
+
#: Option type.
|
233
|
+
type: 'Enum_Option' = EnumField(length=1, namespace=Enum_Option)
|
234
|
+
#: Option length (conditional in case of ``Pad1`` option).
|
235
|
+
len: 'int' = ConditionalField(
|
236
|
+
UInt8Field(default=0),
|
237
|
+
lambda pkt: pkt['type'] != Enum_Option.Pad1,
|
238
|
+
)
|
239
|
+
|
240
|
+
def post_process(self, packet: 'dict[str, Any]') -> 'Schema':
|
241
|
+
"""Revise ``schema`` data after unpacking process.
|
242
|
+
|
243
|
+
Args:
|
244
|
+
packet: Unpacked data.
|
245
|
+
|
246
|
+
Returns:
|
247
|
+
Revised schema.
|
248
|
+
|
249
|
+
"""
|
250
|
+
# for Pad1 option, length is always 0
|
251
|
+
if self.type == Enum_Option.Pad1:
|
252
|
+
self.len = 0
|
253
|
+
return self
|
254
|
+
|
255
|
+
|
256
|
+
@schema_final
|
257
|
+
class UnassignedOption(Option):
|
258
|
+
"""Header schema for HOPOPT unassigned options."""
|
259
|
+
|
260
|
+
#: Option data.
|
261
|
+
data: 'bytes' = BytesField(length=lambda pkt: pkt['len'])
|
262
|
+
|
263
|
+
if TYPE_CHECKING:
|
264
|
+
def __init__(self, type: 'Enum_Option', len: 'int', data: 'bytes') -> 'None': ...
|
265
|
+
|
266
|
+
|
267
|
+
@schema_final
|
268
|
+
class PadOption(Option, code=[Enum_Option.Pad1,
|
269
|
+
Enum_Option.PadN]):
|
270
|
+
"""Header schema for HOPOPT padding options."""
|
271
|
+
|
272
|
+
#: Padding.
|
273
|
+
pad: 'bytes' = PaddingField(length=lambda pkt: pkt.get('len', 0))
|
274
|
+
|
275
|
+
if TYPE_CHECKING:
|
276
|
+
def __init__(self, type: 'Enum_Option', len: 'int') -> 'None': ...
|
277
|
+
|
278
|
+
|
279
|
+
@schema_final
|
280
|
+
class TunnelEncapsulationLimitOption(Option, code=Enum_Option.Tunnel_Encapsulation_Limit):
|
281
|
+
"""Header schema for HOPOPT tunnel encapsulation limit options."""
|
282
|
+
|
283
|
+
#: Tunnel encapsulation limit.
|
284
|
+
limit: 'int' = UInt8Field()
|
285
|
+
|
286
|
+
if TYPE_CHECKING:
|
287
|
+
def __init__(self, type: 'Enum_Option', len: 'int', limit: 'int') -> 'None': ...
|
288
|
+
|
289
|
+
|
290
|
+
@schema_final
|
291
|
+
class RouterAlertOption(Option, code=Enum_Option.Router_Alert):
|
292
|
+
"""Header schema for HOPOPT router alert options."""
|
293
|
+
|
294
|
+
#: Router alert.
|
295
|
+
alert: 'Enum_RouterAlert' = EnumField(length=2, namespace=Enum_RouterAlert)
|
296
|
+
|
297
|
+
if TYPE_CHECKING:
|
298
|
+
def __init__(self, type: 'Enum_Option', len: 'int', alert: 'Enum_RouterAlert') -> 'None': ...
|
299
|
+
|
300
|
+
|
301
|
+
@schema_final
|
302
|
+
class CALIPSOOption(Option, code=Enum_Option.CALIPSO):
|
303
|
+
"""Header schema for HOPOPT common architecture label IPv6 security options."""
|
304
|
+
|
305
|
+
#: CALIPSO domain of interpretation.
|
306
|
+
domain: 'int' = UInt32Field()
|
307
|
+
#: Compartment length.
|
308
|
+
cmpt_len: 'int' = UInt8Field()
|
309
|
+
#: Sens level.
|
310
|
+
level: 'int' = UInt8Field()
|
311
|
+
#: Checksum (CRC-16).
|
312
|
+
checksum: 'bytes' = BytesField(length=2)
|
313
|
+
#: Compartment bitmap.
|
314
|
+
bitmap: 'bytes' = ConditionalField(
|
315
|
+
BytesField(length=lambda pkt: pkt['cmpt_len'] * 4),
|
316
|
+
lambda pkt: pkt['cmpt_len'] > 0,
|
317
|
+
)
|
318
|
+
#: Padding.
|
319
|
+
pad: 'bytes' = PaddingField(length=lambda pkt: pkt['len'] - 8 - pkt['cmpt_len'] * 4)
|
320
|
+
|
321
|
+
if TYPE_CHECKING:
|
322
|
+
def __init__(self, type: 'Enum_Option', len: 'int', domain: 'int', cmpt_len: 'int',
|
323
|
+
level: 'int', checksum: 'bytes', bitmap: 'Optional[bytes]') -> 'None': ...
|
324
|
+
|
325
|
+
|
326
|
+
@schema_final
|
327
|
+
class _SMFDPDOption(Schema):
|
328
|
+
"""Header schema for HOPOPT SMF DPD options with generic representation."""
|
329
|
+
|
330
|
+
#: SMF DPD mode.
|
331
|
+
test: 'SMFDPDTestFlag' = ForwardMatchField(BitField(length=3, namespace={
|
332
|
+
'len': (1, 8),
|
333
|
+
'mode': (16, 1),
|
334
|
+
}))
|
335
|
+
#: SMF DPD data.
|
336
|
+
data: 'SMFIdentificationBasedDPDOption | SMFHashBasedDPDOption' = SwitchField(
|
337
|
+
selector=smf_dpd_data_selector,
|
338
|
+
)
|
339
|
+
|
340
|
+
def post_process(self, packet: 'dict[str, Any]') -> 'SMFDPDOption':
|
341
|
+
"""Revise ``schema`` data after unpacking process.
|
342
|
+
|
343
|
+
Args:
|
344
|
+
packet: Unpacked data.
|
345
|
+
|
346
|
+
Returns:
|
347
|
+
Revised schema.
|
348
|
+
|
349
|
+
"""
|
350
|
+
ret = self.data
|
351
|
+
return ret
|
352
|
+
|
353
|
+
|
354
|
+
# register ``_SMFDPDOption`` as ``SMF_DPD`` option
|
355
|
+
Option.register(Enum_Option.SMF_DPD, _SMFDPDOption)
|
356
|
+
|
357
|
+
|
358
|
+
class SMFDPDOption(Option, EnumSchema[Enum_SMFDPDMode]):
|
359
|
+
"""Header schema for HOPOPT simplified multicast forwarding duplicate packet
|
360
|
+
detection (``SMF_DPD``) options."""
|
361
|
+
|
362
|
+
__enum__: 'DefaultDict[Enum_SMFDPDMode, Type[SMFDPDOption]]' = collections.defaultdict(lambda: None) # type: ignore[arg-type,return-value]
|
363
|
+
|
364
|
+
if TYPE_CHECKING:
|
365
|
+
mode: 'Enum_SMFDPDMode'
|
366
|
+
|
367
|
+
|
368
|
+
@schema_final
|
369
|
+
class SMFIdentificationBasedDPDOption(SMFDPDOption, code=Enum_SMFDPDMode.I_DPD):
|
370
|
+
"""Header schema for HOPOPT SMF identification-based DPD options."""
|
371
|
+
|
372
|
+
#: TaggerID information.
|
373
|
+
info: 'TaggerIDInfo' = BitField(length=1, namespace={
|
374
|
+
'mode': (0, 1),
|
375
|
+
'type': (1, 3),
|
376
|
+
'len': (4, 4),
|
377
|
+
})
|
378
|
+
#: TaggerID.
|
379
|
+
tid: 'bytes | IPv4Address | IPv6Address' = ConditionalField(
|
380
|
+
SwitchField(selector=smf_i_dpd_tid_selector),
|
381
|
+
lambda pkt: pkt['info']['type'] != 0,
|
382
|
+
)
|
383
|
+
#: Identifier.
|
384
|
+
id: 'bytes' = BytesField(length=lambda pkt: pkt['len'] - (
|
385
|
+
1 if pkt['info']['type'] == 0 else (pkt['info']['len'] + 2)
|
386
|
+
))
|
387
|
+
|
388
|
+
def post_process(self, packet: 'dict[str, Any]') -> 'SMFIdentificationBasedDPDOption':
|
389
|
+
"""Revise ``schema`` data after unpacking process.
|
390
|
+
|
391
|
+
Args:
|
392
|
+
packet: Unpacked data.
|
393
|
+
|
394
|
+
Returns:
|
395
|
+
Revised schema.
|
396
|
+
|
397
|
+
"""
|
398
|
+
ret = super().post_process(packet) # type: SMFIdentificationBasedDPDOption
|
399
|
+
ret.mode = Enum_SMFDPDMode.I_DPD
|
400
|
+
return ret
|
401
|
+
|
402
|
+
if TYPE_CHECKING:
|
403
|
+
def __init__(self, type: 'Enum_Option', len: 'int', info: 'TaggerIDInfo',
|
404
|
+
tid: 'Optional[bytes]', id: 'bytes') -> 'None': ...
|
405
|
+
|
406
|
+
|
407
|
+
@schema_final
|
408
|
+
class SMFHashBasedDPDOption(SMFDPDOption, code=Enum_SMFDPDMode.H_DPD):
|
409
|
+
"""Header schema for HOPOPT SMF hash-based DPD options."""
|
410
|
+
|
411
|
+
#: Hash assist value (HAV).
|
412
|
+
hav: 'bytes' = BytesField(length=lambda pkt: pkt['len'])
|
413
|
+
|
414
|
+
def post_process(self, packet: 'dict[str, Any]') -> 'SMFIdentificationBasedDPDOption':
|
415
|
+
"""Revise ``schema`` data after unpacking process.
|
416
|
+
|
417
|
+
Args:
|
418
|
+
packet: Unpacked data.
|
419
|
+
|
420
|
+
Returns:
|
421
|
+
Revised schema.
|
422
|
+
|
423
|
+
"""
|
424
|
+
ret = super().post_process(packet) # type: SMFIdentificationBasedDPDOption
|
425
|
+
ret.mode = Enum_SMFDPDMode.H_DPD
|
426
|
+
return ret
|
427
|
+
|
428
|
+
if TYPE_CHECKING:
|
429
|
+
def __init__(self, type: 'Enum_Option', len: 'int', hav: 'bytes') -> 'None': ...
|
430
|
+
|
431
|
+
|
432
|
+
@schema_final
|
433
|
+
class PDMOption(Option, code=Enum_Option.PDM):
|
434
|
+
"""Header schema for HOPOPT performance and diagnostic metrics (PDM) options."""
|
435
|
+
|
436
|
+
#: Scale delta time last received (DTLR).
|
437
|
+
scaledtlr: 'int' = UInt8Field()
|
438
|
+
#: Scale delta time last sent (DTLS).
|
439
|
+
scaledtls: 'int' = UInt8Field()
|
440
|
+
#: Packet sequence number (PSN) this packet.
|
441
|
+
psntp: 'int' = UInt16Field()
|
442
|
+
#: Packet sequence number (PSN) last received.
|
443
|
+
psnlr: 'int' = UInt16Field()
|
444
|
+
#: Delta time last received (DTLR).
|
445
|
+
deltatlr: 'int' = UInt16Field()
|
446
|
+
#: Delta time last sent (DTLS).
|
447
|
+
deltatls: 'int' = UInt16Field()
|
448
|
+
|
449
|
+
if TYPE_CHECKING:
|
450
|
+
def __init__(self, type: 'Enum_Option', len: 'int', scaledtlr: 'int', scaledtls: 'int',
|
451
|
+
psntp: 'int', psnlr: 'int', deltatlr: 'int', deltatls: 'int') -> 'None': ...
|
452
|
+
|
453
|
+
|
454
|
+
@schema_final
|
455
|
+
class _QuickStartOption(Schema):
|
456
|
+
"""Header schema for HOPOPT quick start options in generic representation."""
|
457
|
+
|
458
|
+
#: Flags.
|
459
|
+
flags: 'QSTestFlags' = ForwardMatchField(BitField(length=3, namespace={
|
460
|
+
'func': (16, 4),
|
461
|
+
}))
|
462
|
+
#: QS data.
|
463
|
+
data: 'QuickStartRequestOption | QuickStartReportOption' = SwitchField(
|
464
|
+
selector=quick_start_data_selector,
|
465
|
+
)
|
466
|
+
|
467
|
+
def post_process(self, packet: 'dict[str, Any]') -> 'QuickStartOption':
|
468
|
+
"""Revise ``schema`` data after unpacking process.
|
469
|
+
|
470
|
+
Args:
|
471
|
+
packet: Unpacked data.
|
472
|
+
|
473
|
+
Returns:
|
474
|
+
Revised schema.
|
475
|
+
|
476
|
+
"""
|
477
|
+
ret = self.data
|
478
|
+
ret.func = Enum_QSFunction.get(self.flags['func'])
|
479
|
+
return ret
|
480
|
+
|
481
|
+
|
482
|
+
# register ``_QuickStartOption`` as ``Quick_Start`` option
|
483
|
+
Option.register(Enum_Option.Quick_Start, _QuickStartOption)
|
484
|
+
|
485
|
+
|
486
|
+
class QuickStartOption(Option, EnumSchema[Enum_QSFunction]):
|
487
|
+
"""Header schema for HOPOPT quick start options."""
|
488
|
+
|
489
|
+
__enum__: 'DefaultDict[Enum_QSFunction, Type[QuickStartOption]]' = collections.defaultdict(lambda: None) # type: ignore[arg-type,return-value]
|
490
|
+
|
491
|
+
#: Flags.
|
492
|
+
flags: 'QuickStartFlags' = BitField(length=1, namespace={
|
493
|
+
'func': (0, 4),
|
494
|
+
'rate': (4, 4),
|
495
|
+
})
|
496
|
+
|
497
|
+
if TYPE_CHECKING:
|
498
|
+
func: 'Enum_QSFunction'
|
499
|
+
|
500
|
+
|
501
|
+
@schema_final
|
502
|
+
class QuickStartRequestOption(QuickStartOption, code=Enum_QSFunction.Quick_Start_Request):
|
503
|
+
"""Header schema for HOPOPT quick start request options."""
|
504
|
+
|
505
|
+
#: QS time-to-live (TTL).
|
506
|
+
ttl: 'int' = UInt8Field()
|
507
|
+
#: QS nonce.
|
508
|
+
nonce: 'QSNonce' = BitField(length=4, namespace={
|
509
|
+
'nonce': (0, 30),
|
510
|
+
})
|
511
|
+
|
512
|
+
if TYPE_CHECKING:
|
513
|
+
def __init__(self, type: 'Enum_Option', len: 'int', flags: 'QuickStartFlags',
|
514
|
+
ttl: 'int', nonce: 'QSNonce') -> 'None': ...
|
515
|
+
|
516
|
+
|
517
|
+
@schema_final
|
518
|
+
class QuickStartReportOption(QuickStartOption, code=Enum_QSFunction.Report_of_Approved_Rate):
|
519
|
+
"""Header schema for HOPOPT quick start report of approved rate options."""
|
520
|
+
|
521
|
+
#: Reserved.
|
522
|
+
reserved: 'bytes' = PaddingField(length=1)
|
523
|
+
#: QS nonce.
|
524
|
+
nonce: 'QSNonce' = BitField(length=4, namespace={
|
525
|
+
'nonce': (0, 30),
|
526
|
+
})
|
527
|
+
|
528
|
+
if TYPE_CHECKING:
|
529
|
+
def __init__(self, type: 'Enum_Option', len: 'int', flags: 'QuickStartFlags',
|
530
|
+
nonce: 'QSNonce') -> 'None': ...
|
531
|
+
|
532
|
+
|
533
|
+
@schema_final
|
534
|
+
class RPLOption(Option, code=[Enum_Option.RPL_Option_0x23,
|
535
|
+
Enum_Option.RPL_Option_0x63]):
|
536
|
+
"""Header schema for HOPOPT routing protocol for low-power and lossy networks (RPL) options."""
|
537
|
+
|
538
|
+
#: Flags.
|
539
|
+
flags: 'RPLFlags' = BitField(length=1, namespace={
|
540
|
+
'down': (0, 1),
|
541
|
+
'rank_err': (1, 1),
|
542
|
+
'fwd_err': (2, 1),
|
543
|
+
})
|
544
|
+
#: RPL instance ID.
|
545
|
+
id: 'int' = UInt8Field()
|
546
|
+
#: Sender rank.
|
547
|
+
rank: 'int' = UInt16Field()
|
548
|
+
|
549
|
+
if TYPE_CHECKING:
|
550
|
+
def __init__(self, type: 'Enum_Option', len: 'int', flags: 'RPLFlags', id: 'int',
|
551
|
+
rank: 'int') -> 'None': ...
|
552
|
+
|
553
|
+
|
554
|
+
@schema_final
|
555
|
+
class MPLOption(Option, code=Enum_Option.MPL_Option):
|
556
|
+
"""Header schema for HOPOPT multicast protocol for low-power and lossy networks (MPL) options."""
|
557
|
+
|
558
|
+
#: Flags.
|
559
|
+
flags: 'MPLFlags' = BitField(length=1, namespace={
|
560
|
+
'type': (0, 2),
|
561
|
+
'max': (2, 1),
|
562
|
+
'drop': (3, 1),
|
563
|
+
})
|
564
|
+
#: MPL sequence number.
|
565
|
+
seq: 'int' = UInt8Field()
|
566
|
+
#: MPL Seed-ID.
|
567
|
+
seed: 'int' = ConditionalField(
|
568
|
+
NumberField(length=mpl_opt_seed_id_len, signed=False),
|
569
|
+
lambda pkt: pkt['flags']['type'] != Enum_SeedID.IPV6_SOURCE_ADDRESS,
|
570
|
+
)
|
571
|
+
#: Reserved data (padding).
|
572
|
+
pad: 'bytes' = PaddingField(length=lambda pkt: pkt['len'] - 2 - (
|
573
|
+
0 if pkt['flags']['type'] == 0 else mpl_opt_seed_id_len(pkt)
|
574
|
+
))
|
575
|
+
|
576
|
+
def post_process(self, packet: 'dict[str, Any]') -> 'Schema':
|
577
|
+
"""Revise ``schema`` data after unpacking process.
|
578
|
+
|
579
|
+
Args:
|
580
|
+
packet: Unpacked data.
|
581
|
+
|
582
|
+
Returns:
|
583
|
+
Revised schema.
|
584
|
+
|
585
|
+
"""
|
586
|
+
if self.flags['type'] == Enum_SeedID.IPV6_SOURCE_ADDRESS:
|
587
|
+
self.seed = packet.get('src', NoValue)
|
588
|
+
return self
|
589
|
+
|
590
|
+
if TYPE_CHECKING:
|
591
|
+
def __init__(self, type: 'Enum_Option', len: 'int', flags: 'MPLFlags', seq: 'int',
|
592
|
+
seed: 'Optional[int]') -> 'None': ...
|
593
|
+
|
594
|
+
|
595
|
+
@schema_final
|
596
|
+
class ILNPOption(Option, code=Enum_Option.ILNP_Nonce):
|
597
|
+
"""Header schema for HOPOPT identifier-locator network protocol (ILNP) options."""
|
598
|
+
|
599
|
+
#: Nonce value.
|
600
|
+
nonce: 'int' = NumberField(length=lambda pkt: pkt['len'], signed=False)
|
601
|
+
|
602
|
+
if TYPE_CHECKING:
|
603
|
+
def __init__(self, type: 'Enum_Option', len: 'int', nonce: 'int') -> 'None': ...
|
604
|
+
|
605
|
+
|
606
|
+
@schema_final
|
607
|
+
class LineIdentificationOption(Option, code=Enum_Option.Line_Identification_Option):
|
608
|
+
"""Header schema for HOPOPT line-identification options."""
|
609
|
+
|
610
|
+
#: Line ID length.
|
611
|
+
id_len: 'int' = UInt8Field()
|
612
|
+
#: Line ID.
|
613
|
+
id: 'bytes' = BytesField(length=lambda pkt: pkt['id_len'])
|
614
|
+
|
615
|
+
if TYPE_CHECKING:
|
616
|
+
def __init__(self, type: 'Enum_Option', len: 'int', id_len: 'int', id: 'bytes') -> 'None': ...
|
617
|
+
|
618
|
+
|
619
|
+
@schema_final
|
620
|
+
class JumboPayloadOption(Option, code=Enum_Option.Jumbo_Payload):
|
621
|
+
"""Header schema for HOPOPT jumbo payload options."""
|
622
|
+
|
623
|
+
#: Jumbo payload length.
|
624
|
+
jumbo_len: 'int' = UInt32Field()
|
625
|
+
|
626
|
+
if TYPE_CHECKING:
|
627
|
+
def __init__(self, type: 'Enum_Option', len: 'int', jumbo_len: 'int') -> 'None': ...
|
628
|
+
|
629
|
+
|
630
|
+
@schema_final
|
631
|
+
class HomeAddressOption(Option, code=Enum_Option.Home_Address):
|
632
|
+
"""Header schema for HOPOPT home address options."""
|
633
|
+
|
634
|
+
#: Home address.
|
635
|
+
addr: 'IPv6Address' = IPv6AddressField()
|
636
|
+
|
637
|
+
if TYPE_CHECKING:
|
638
|
+
def __init__(self, type: 'Enum_Option', len: 'int', addr: 'IPv6Address | int | str | bytes') -> 'None': ...
|
639
|
+
|
640
|
+
|
641
|
+
@schema_final
|
642
|
+
class IPDFFOption(Option, code=Enum_Option.IP_DFF):
|
643
|
+
"""Header schema for HOPOPT depth-first forwarding (``IP_DFF``) options."""
|
644
|
+
|
645
|
+
#: Flags.
|
646
|
+
flags: 'DFFFlags' = BitField(length=1, namespace={
|
647
|
+
'ver': (0, 2),
|
648
|
+
'dup': (2, 1),
|
649
|
+
'ret': (3, 1),
|
650
|
+
})
|
651
|
+
#: Sequence number.
|
652
|
+
seq: 'int' = UInt16Field()
|
653
|
+
|
654
|
+
if TYPE_CHECKING:
|
655
|
+
def __init__(self, type: 'Enum_Option', len: 'int', flags: 'DFFFlags', seq: 'int') -> 'None': ...
|
656
|
+
|
657
|
+
|
658
|
+
@schema_final
|
659
|
+
class HOPOPT(Schema):
|
660
|
+
"""Header schema for HOPOPT packet."""
|
661
|
+
|
662
|
+
#: Next header.
|
663
|
+
next: 'Enum_TransType' = EnumField(length=1, namespace=Enum_TransType)
|
664
|
+
#: Header length.
|
665
|
+
len: 'int' = UInt8Field()
|
666
|
+
#: Options.
|
667
|
+
options: 'list[Option]' = OptionField(
|
668
|
+
length=lambda pkt: pkt['len'] * 8 + 6,
|
669
|
+
base_schema=Option,
|
670
|
+
type_name='type',
|
671
|
+
registry=Option.registry,
|
672
|
+
)
|
673
|
+
#: Payload.
|
674
|
+
payload: 'bytes' = PayloadField()
|
675
|
+
|
676
|
+
if TYPE_CHECKING:
|
677
|
+
def __init__(self, next: 'Enum_TransType', len: 'int',
|
678
|
+
options: 'bytes | list[bytes | Option]',
|
679
|
+
payload: 'bytes | Protocol | Schema') -> 'None': ...
|