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,710 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""IPv6-Route - Routing Header for IPv6
|
3
|
+
==========================================
|
4
|
+
|
5
|
+
.. module:: pcapkit.protocols.internet.ipv6_route
|
6
|
+
|
7
|
+
:mod:`pcapkit.protocols.internet.ipv6_route` contains
|
8
|
+
:class:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route`
|
9
|
+
only, which implements extractor for Routing Header for IPv6
|
10
|
+
(IPv6-Route) [*]_, whose structure is described as below:
|
11
|
+
|
12
|
+
======= ========= ==================== ===============================
|
13
|
+
Octets Bits Name Description
|
14
|
+
======= ========= ==================== ===============================
|
15
|
+
0 0 ``route.next`` Next Header
|
16
|
+
1 8 ``route.length`` Header Extensive Length
|
17
|
+
2 16 ``route.type`` Routing Type
|
18
|
+
3 24 ``route.seg_left`` Segments Left
|
19
|
+
4 32 ``route.data`` Type-Specific Data
|
20
|
+
======= ========= ==================== ===============================
|
21
|
+
|
22
|
+
.. [*] https://en.wikipedia.org/wiki/IPv6_packet#Routing
|
23
|
+
|
24
|
+
"""
|
25
|
+
import collections
|
26
|
+
import ipaddress
|
27
|
+
import math
|
28
|
+
import os.path as os_path
|
29
|
+
from typing import TYPE_CHECKING, cast, overload
|
30
|
+
|
31
|
+
from pcapkit.const.ipv6.routing import Routing as Enum_Routing
|
32
|
+
from pcapkit.const.reg.transtype import TransType as Enum_TransType
|
33
|
+
from pcapkit.protocols.data.internet.ipv6_route import RPL as Data_RPL
|
34
|
+
from pcapkit.protocols.data.internet.ipv6_route import IPv6_Route as Data_IPv6_Route
|
35
|
+
from pcapkit.protocols.data.internet.ipv6_route import SourceRoute as Data_SourceRoute
|
36
|
+
from pcapkit.protocols.data.internet.ipv6_route import Type2 as Data_Type2
|
37
|
+
from pcapkit.protocols.data.internet.ipv6_route import UnknownType as Data_UnknownType
|
38
|
+
from pcapkit.protocols.internet.internet import Internet
|
39
|
+
from pcapkit.protocols.schema.internet.ipv6_route import RPL as Schema_RPL
|
40
|
+
from pcapkit.protocols.schema.internet.ipv6_route import IPv6_Route as Schema_IPv6_Route
|
41
|
+
from pcapkit.protocols.schema.internet.ipv6_route import SourceRoute as Schema_SourceRoute
|
42
|
+
from pcapkit.protocols.schema.internet.ipv6_route import Type2 as Schema_Type2
|
43
|
+
from pcapkit.protocols.schema.internet.ipv6_route import UnknownType as Schema_UnknownType
|
44
|
+
from pcapkit.protocols.schema.schema import Schema
|
45
|
+
from pcapkit.utilities.exceptions import ProtocolError, UnsupportedCall
|
46
|
+
from pcapkit.utilities.warnings import RegistryWarning, warn
|
47
|
+
|
48
|
+
if TYPE_CHECKING:
|
49
|
+
from enum import IntEnum as StdlibEnum
|
50
|
+
from ipaddress import IPv6Address
|
51
|
+
from typing import IO, Any, Callable, DefaultDict, NoReturn, Optional, Type
|
52
|
+
|
53
|
+
from aenum import IntEnum as AenumEnum
|
54
|
+
from mypy_extensions import DefaultArg, KwArg, NamedArg
|
55
|
+
from typing_extensions import Literal
|
56
|
+
|
57
|
+
from pcapkit.corekit.protochain import ProtoChain
|
58
|
+
from pcapkit.protocols.protocol import ProtocolBase as Protocol
|
59
|
+
from pcapkit.protocols.schema.internet.ipv6_route import RoutingType as Schema_RoutingType
|
60
|
+
|
61
|
+
TypeParser = Callable[[Schema_RoutingType, NamedArg(Schema_IPv6_Route, 'header')], Data_IPv6_Route]
|
62
|
+
TypeConstructor = Callable[[Enum_Routing, DefaultArg(Optional[Data_IPv6_Route]),
|
63
|
+
NamedArg(Optional[IPv6Address], 'dst'), KwArg(Any)], Schema_RoutingType]
|
64
|
+
|
65
|
+
__all__ = ['IPv6_Route']
|
66
|
+
|
67
|
+
|
68
|
+
class IPv6_Route(Internet[Data_IPv6_Route, Schema_IPv6_Route],
|
69
|
+
schema=Schema_IPv6_Route, data=Data_IPv6_Route):
|
70
|
+
"""This class implements Routing Header for IPv6.
|
71
|
+
|
72
|
+
This class currently supports parsing of the following Routing Header for IPv6
|
73
|
+
routing data types, which are registered in the
|
74
|
+
:attr:`self.__routing__ <pcapkit.protocols.internet.ipv6_route.IPv6_Route.__routing__>`
|
75
|
+
attribute:
|
76
|
+
|
77
|
+
.. list-table::
|
78
|
+
:header-rows: 1
|
79
|
+
|
80
|
+
* - Routing Code
|
81
|
+
- Data Parser
|
82
|
+
- Data Constructor
|
83
|
+
* - :attr:`~pcapkit.const.ipv6.routing.Routing.Source_Route`
|
84
|
+
- :meth:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route._read_data_type_src`
|
85
|
+
- :meth:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route._make_data_type_src`
|
86
|
+
* - :attr:`~pcapkit.const.ipv6.routing.Routing.Type_2_Routing_Header`
|
87
|
+
- :meth:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route._read_data_type_2`
|
88
|
+
- :meth:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route._make_data_type_2`
|
89
|
+
* - :attr:`~pcapkit.const.ipv6.routing.Routing.RPL_Source_Route_Header`
|
90
|
+
- :meth:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route._read_data_type_rpl`
|
91
|
+
- :meth:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route._make_data_type_rpl`
|
92
|
+
|
93
|
+
"""
|
94
|
+
|
95
|
+
##########################################################################
|
96
|
+
# Defaults.
|
97
|
+
##########################################################################
|
98
|
+
|
99
|
+
#: DefaultDict[Enum_Routing, str | tuple[TypeParser, TypeConstructor]]: Type
|
100
|
+
#: code to method mapping. Method names are expected to be referred to
|
101
|
+
#: the class by ``_read_data_type_${name}`` and/or ``_make_data_type_${name}``,
|
102
|
+
#: and if such name not found, the value should then be a method that can
|
103
|
+
#: parse the routing type by itself.
|
104
|
+
__routing__ = collections.defaultdict(
|
105
|
+
lambda: 'none',
|
106
|
+
{
|
107
|
+
Enum_Routing.Source_Route: 'src', # [RFC 5095] DEPRECATED
|
108
|
+
Enum_Routing.Type_2_Routing_Header: '2', # [RFC 6275]
|
109
|
+
Enum_Routing.RPL_Source_Route_Header: 'rpl', # [RFC 6554]
|
110
|
+
},
|
111
|
+
) # type: DefaultDict[Enum_Routing | int, str | tuple[TypeParser, TypeConstructor]]
|
112
|
+
|
113
|
+
##########################################################################
|
114
|
+
# Properties.
|
115
|
+
##########################################################################
|
116
|
+
|
117
|
+
@property
|
118
|
+
def name(self) -> 'Literal["Routing Header for IPv6"]':
|
119
|
+
"""Name of current protocol."""
|
120
|
+
return 'Routing Header for IPv6'
|
121
|
+
|
122
|
+
@property
|
123
|
+
def alias(self) -> 'Literal["IPv6-Route"]':
|
124
|
+
"""Acronym of corresponding protocol."""
|
125
|
+
return 'IPv6-Route'
|
126
|
+
|
127
|
+
@property
|
128
|
+
def length(self) -> 'int':
|
129
|
+
"""Header length of current protocol."""
|
130
|
+
return self._info.length
|
131
|
+
|
132
|
+
@property
|
133
|
+
def payload(self) -> 'Protocol | NoReturn':
|
134
|
+
"""Payload of current instance.
|
135
|
+
|
136
|
+
Raises:
|
137
|
+
UnsupportedCall: if the protocol is used as an IPv6 extension header
|
138
|
+
|
139
|
+
:rtype: pcapkit.protocols.protocol.Protocol
|
140
|
+
"""
|
141
|
+
if self._extf:
|
142
|
+
raise UnsupportedCall(f"'{self.__class__.__name__}' object has no attribute 'payload'")
|
143
|
+
return self._next
|
144
|
+
|
145
|
+
@property
|
146
|
+
def protocol(self) -> 'Optional[str] | NoReturn':
|
147
|
+
"""Name of next layer protocol (if any).
|
148
|
+
|
149
|
+
Raises:
|
150
|
+
UnsupportedCall: if the protocol is used as an IPv6 extension header
|
151
|
+
|
152
|
+
"""
|
153
|
+
if self._extf:
|
154
|
+
raise UnsupportedCall(f"'{self.__class__.__name__}' object has no attribute 'protocol'")
|
155
|
+
return super().protocol
|
156
|
+
|
157
|
+
@property
|
158
|
+
def protochain(self) -> 'ProtoChain | NoReturn':
|
159
|
+
"""Protocol chain of current instance.
|
160
|
+
|
161
|
+
Raises:
|
162
|
+
UnsupportedCall: if the protocol is used as an IPv6 extension header
|
163
|
+
|
164
|
+
"""
|
165
|
+
if self._extf:
|
166
|
+
raise UnsupportedCall(f"'{self.__class__.__name__}' object has no attribute 'protochain'")
|
167
|
+
return super().protochain
|
168
|
+
|
169
|
+
##########################################################################
|
170
|
+
# Methods.
|
171
|
+
##########################################################################
|
172
|
+
|
173
|
+
def read(self, length: 'Optional[int]' = None, *, extension: 'bool' = False, # pylint: disable=arguments-differ
|
174
|
+
**kwargs: 'Any') -> 'Data_IPv6_Route': # pylint: disable=unused-argument
|
175
|
+
"""Read Routing Header for IPv6.
|
176
|
+
|
177
|
+
Structure of IPv6-Route header [:rfc:`8200`][:rfc:`5095`]:
|
178
|
+
|
179
|
+
.. code-block:: text
|
180
|
+
|
181
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
182
|
+
| Next Header | Hdr Ext Len | Routing Type | Segments Left |
|
183
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
184
|
+
| |
|
185
|
+
. .
|
186
|
+
. type-specific data .
|
187
|
+
. .
|
188
|
+
| |
|
189
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
190
|
+
|
191
|
+
Args:
|
192
|
+
length: Length of packet data.
|
193
|
+
extension: If the packet is used as an IPv6 extension header.
|
194
|
+
**kwargs: Arbitrary keyword arguments.
|
195
|
+
|
196
|
+
Returns:
|
197
|
+
Parsed packet data.
|
198
|
+
|
199
|
+
"""
|
200
|
+
if length is None:
|
201
|
+
length = len(self)
|
202
|
+
schema = self.__header__
|
203
|
+
|
204
|
+
name = self.__routing__[schema.type]
|
205
|
+
if isinstance(name, str):
|
206
|
+
name = f'_read_data_type_{name.lower()}'
|
207
|
+
meth = cast('TypeParser',
|
208
|
+
getattr(self, name, self._read_data_type_none))
|
209
|
+
else:
|
210
|
+
meth = name[0]
|
211
|
+
ipv6_route = meth(schema.data, header=schema)
|
212
|
+
|
213
|
+
if extension:
|
214
|
+
return ipv6_route
|
215
|
+
return self._decode_next_layer(ipv6_route, schema.next, length - ipv6_route.length)
|
216
|
+
|
217
|
+
def make(self,
|
218
|
+
dst: 'Optional[IPv6Address | str | int| bytes]' = None,
|
219
|
+
next: 'Enum_TransType | StdlibEnum | AenumEnum | str | int' = Enum_TransType.UDP,
|
220
|
+
next_default: 'Optional[int]' = None,
|
221
|
+
next_namespace: 'Optional[dict[str, int] | dict[int, str] | Type[StdlibEnum] | Type[AenumEnum]]' = None, # pylint: disable=line-too-long
|
222
|
+
next_reversed: 'bool' = False,
|
223
|
+
type: 'Enum_Routing | StdlibEnum | AenumEnum | str | int' = Enum_Routing.Source_Route,
|
224
|
+
type_default: 'Optional[int]' = None,
|
225
|
+
type_namespace: 'Optional[dict[str, int] | dict[int, str] | Type[StdlibEnum] | Type[AenumEnum]]' = None, # pylint: disable=line-too-long
|
226
|
+
type_reversed: 'bool' = False,
|
227
|
+
seg_left: 'int' = 0,
|
228
|
+
data: 'bytes | Data_IPv6_Route | Schema_RoutingType | dict[str, Any]' = b'\x00\x00\x00\x00',
|
229
|
+
payload: 'Protocol | Schema | bytes' = b'',
|
230
|
+
**kwargs: 'Any') -> 'Schema_IPv6_Route':
|
231
|
+
"""Make (construct) packet data.
|
232
|
+
|
233
|
+
Args:
|
234
|
+
dst: Destination address.
|
235
|
+
next: Next header type.
|
236
|
+
next_default: Default value of next header type.
|
237
|
+
next_namespace: Namespace of next header type.
|
238
|
+
next_reversed: If the namespace of next header type is reversed.
|
239
|
+
type: Routing type.
|
240
|
+
type_default: Default value of routing type.
|
241
|
+
type_namespace: Namespace of routing type.
|
242
|
+
type_reversed: If the namespace of routing type is reversed.
|
243
|
+
seg_left: Segments left.
|
244
|
+
data: Routing data.
|
245
|
+
payload: Payload of current instance.
|
246
|
+
**kwargs: Arbitrary keyword arguments.
|
247
|
+
|
248
|
+
Returns:
|
249
|
+
Constructed packet data.
|
250
|
+
|
251
|
+
"""
|
252
|
+
next_val = cast('Enum_TransType',
|
253
|
+
self._make_index(next, next_default, namespace=next_namespace,
|
254
|
+
reversed=next_reversed, pack=False))
|
255
|
+
type_val = cast('Enum_Routing',
|
256
|
+
self._make_index(type, type_default, namespace=type_namespace,
|
257
|
+
reversed=type_reversed, pack=False))
|
258
|
+
|
259
|
+
if isinstance(data, bytes):
|
260
|
+
length = math.ceil((len(data) + 4) / 8)
|
261
|
+
data_val = data.ljust(length * 8 - 4, b'\x00') # type: bytes | Schema_RoutingType
|
262
|
+
elif isinstance(data, (dict, Data_IPv6_Route)):
|
263
|
+
name = self.__routing__[type_val]
|
264
|
+
if isinstance(name, str):
|
265
|
+
name = f'_make_data_type_{name.lower()}'
|
266
|
+
meth = cast('TypeConstructor',
|
267
|
+
getattr(self, name, self._make_data_type_none))
|
268
|
+
else:
|
269
|
+
meth = name[1]
|
270
|
+
|
271
|
+
dst_val = cast('IPv6Address', ipaddress.ip_address(dst)) if dst is not None else None
|
272
|
+
if isinstance(data, dict):
|
273
|
+
data_val = meth(type_val, dst=dst_val, **data)
|
274
|
+
else:
|
275
|
+
data_val = meth(type_val, data, dst=dst_val)
|
276
|
+
length = len(data_val.pack())
|
277
|
+
elif isinstance(data, Schema):
|
278
|
+
length = math.ceil((len(data.pack()) + 4) / 8)
|
279
|
+
data_val = data
|
280
|
+
else:
|
281
|
+
raise ProtocolError(f'{self.alias}: invalid routing data type: {data.__class__}')
|
282
|
+
|
283
|
+
return Schema_IPv6_Route(
|
284
|
+
next=next_val,
|
285
|
+
length=length,
|
286
|
+
type=type_val,
|
287
|
+
seg_left=seg_left,
|
288
|
+
data=data_val,
|
289
|
+
payload=payload,
|
290
|
+
)
|
291
|
+
|
292
|
+
@classmethod
|
293
|
+
def register_routing(cls, code: 'Enum_Routing', meth: 'str | tuple[TypeParser, TypeConstructor]') -> 'None':
|
294
|
+
"""Register an routing data parser.
|
295
|
+
|
296
|
+
Args:
|
297
|
+
code: IPv6-Route data type code.
|
298
|
+
meth: Method name or callable to parse and/or construct the data.
|
299
|
+
|
300
|
+
"""
|
301
|
+
if code in cls.__routing__:
|
302
|
+
warn(f'routing {code} already registered, overwriting', RegistryWarning)
|
303
|
+
cls.__routing__[code] = meth
|
304
|
+
|
305
|
+
##########################################################################
|
306
|
+
# Data models.
|
307
|
+
##########################################################################
|
308
|
+
|
309
|
+
@overload
|
310
|
+
def __post_init__(self, file: 'IO[bytes] | bytes', length: 'Optional[int]' = ..., *, # pylint: disable=arguments-differ
|
311
|
+
extension: 'bool' = ..., src_ip: 'Optional[IPv6Address]'= ...,
|
312
|
+
dst_ip: 'Optional[IPv6Address]'= ..., **kwargs: 'Any') -> 'None': ...
|
313
|
+
|
314
|
+
@overload
|
315
|
+
def __post_init__(self, **kwargs: 'Any') -> 'None': ... # pylint: disable=arguments-differ
|
316
|
+
|
317
|
+
def __post_init__(self, file: 'Optional[IO[bytes] | bytes]' = None, length: 'Optional[int]' = None, *, # pylint: disable=arguments-differ
|
318
|
+
extension: 'bool' = False, **kwargs: 'Any') -> 'None':
|
319
|
+
"""Post initialisation hook.
|
320
|
+
|
321
|
+
Args:
|
322
|
+
file: Source packet stream.
|
323
|
+
length: Length of packet data.
|
324
|
+
extension: If the protocol is used as an IPv6 extension header.
|
325
|
+
src_ip: source IP address
|
326
|
+
dst_ip: destination IP address
|
327
|
+
**kwargs: Arbitrary keyword arguments.
|
328
|
+
|
329
|
+
See Also:
|
330
|
+
For construction argument, please refer to :meth:`self.make <IPv6_Route.make>`.
|
331
|
+
|
332
|
+
"""
|
333
|
+
#: bool: If the protocol is used as an IPv6 extension header.
|
334
|
+
self._extf = extension
|
335
|
+
|
336
|
+
# call super __post_init__
|
337
|
+
super().__post_init__(file, length, extension=extension, **kwargs) # type: ignore[arg-type]
|
338
|
+
|
339
|
+
def __length_hint__(self) -> 'Literal[4]':
|
340
|
+
"""Return an estimated length for the object."""
|
341
|
+
return 4
|
342
|
+
|
343
|
+
@classmethod
|
344
|
+
def __index__(cls) -> 'Enum_TransType': # pylint: disable=invalid-index-returned
|
345
|
+
"""Numeral registry index of the protocol.
|
346
|
+
|
347
|
+
Returns:
|
348
|
+
Numeral registry index of the protocol in `IANA`_.
|
349
|
+
|
350
|
+
.. _IANA: https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml
|
351
|
+
|
352
|
+
"""
|
353
|
+
return Enum_TransType.IPv6_Route # type: ignore[return-value]
|
354
|
+
|
355
|
+
##########################################################################
|
356
|
+
# Utilities.
|
357
|
+
##########################################################################
|
358
|
+
|
359
|
+
@classmethod
|
360
|
+
def _make_data(cls, data: 'Data_IPv6_Route') -> 'dict[str, Any]': # type: ignore[override]
|
361
|
+
"""Create key-value pairs from ``data`` for protocol construction.
|
362
|
+
|
363
|
+
Args:
|
364
|
+
data: protocol data
|
365
|
+
|
366
|
+
Returns:
|
367
|
+
Key-value pairs for protocol construction.
|
368
|
+
|
369
|
+
"""
|
370
|
+
return {
|
371
|
+
'next': data.next,
|
372
|
+
'type': data.type,
|
373
|
+
'seg_left': data.seg_left,
|
374
|
+
'data': data,
|
375
|
+
'payload': cls._make_payload(data),
|
376
|
+
}
|
377
|
+
|
378
|
+
def _read_data_type_none(self, schema: 'Schema_UnknownType', *, header: 'Schema_IPv6_Route') -> 'Data_UnknownType':
|
379
|
+
"""Read IPv6-Route unknown type data.
|
380
|
+
|
381
|
+
Structure of IPv6-Route unknown type data [:rfc:`8200`][:rfc:`5095`]:
|
382
|
+
|
383
|
+
.. code-block:: text
|
384
|
+
|
385
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
386
|
+
| Next Header | Hdr Ext Len | Routing Type | Segments Left |
|
387
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
388
|
+
| |
|
389
|
+
. .
|
390
|
+
. type-specific data .
|
391
|
+
. .
|
392
|
+
| |
|
393
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
394
|
+
|
395
|
+
Args:
|
396
|
+
schema: parsed routing data schema
|
397
|
+
header: parsed IPv6-Route header schema
|
398
|
+
|
399
|
+
Returns:
|
400
|
+
Parsed route data.
|
401
|
+
|
402
|
+
"""
|
403
|
+
ipv6_route = Data_UnknownType(
|
404
|
+
next=header.next,
|
405
|
+
length=header.length,
|
406
|
+
type=header.type,
|
407
|
+
seg_left=header.seg_left,
|
408
|
+
data=schema.data,
|
409
|
+
)
|
410
|
+
return ipv6_route
|
411
|
+
|
412
|
+
def _read_data_type_src(self, schema: 'Schema_SourceRoute', *, header: 'Schema_IPv6_Route') -> 'Data_SourceRoute':
|
413
|
+
"""Read IPv6-Route Source Route data.
|
414
|
+
|
415
|
+
Structure of IPv6-Route Source Route data [:rfc:`5095`]:
|
416
|
+
|
417
|
+
.. code-block:: text
|
418
|
+
|
419
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
420
|
+
| Next Header | Hdr Ext Len | Routing Type=0| Segments Left |
|
421
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
422
|
+
| Reserved |
|
423
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
424
|
+
| |
|
425
|
+
+ +
|
426
|
+
| |
|
427
|
+
+ Address[1] +
|
428
|
+
| |
|
429
|
+
+ +
|
430
|
+
| |
|
431
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
432
|
+
| |
|
433
|
+
+ +
|
434
|
+
| |
|
435
|
+
+ Address[2] +
|
436
|
+
| |
|
437
|
+
+ +
|
438
|
+
| |
|
439
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
440
|
+
. . .
|
441
|
+
. . .
|
442
|
+
. . .
|
443
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
444
|
+
| |
|
445
|
+
+ +
|
446
|
+
| |
|
447
|
+
+ Address[n] +
|
448
|
+
| |
|
449
|
+
+ +
|
450
|
+
| |
|
451
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
452
|
+
|
453
|
+
Args:
|
454
|
+
schema: parsed routing data schema
|
455
|
+
header: parsed IPv6-Route header schema
|
456
|
+
|
457
|
+
Returns:
|
458
|
+
Parsed route data.
|
459
|
+
|
460
|
+
"""
|
461
|
+
if (header.length - 8) % 16 != 0:
|
462
|
+
raise ProtocolError(f'{self.alias} [TypeNo {type}]: invalid format')
|
463
|
+
|
464
|
+
ipv6_route = Data_SourceRoute(
|
465
|
+
next=header.next,
|
466
|
+
length=header.length,
|
467
|
+
type=header.type,
|
468
|
+
seg_left=header.seg_left,
|
469
|
+
ip=tuple(schema.ip),
|
470
|
+
)
|
471
|
+
return ipv6_route
|
472
|
+
|
473
|
+
def _read_data_type_2(self, schema: 'Schema_Type2', *, header: 'Schema_IPv6_Route') -> 'Data_Type2':
|
474
|
+
"""Read IPv6-Route Type 2 data.
|
475
|
+
|
476
|
+
Structure of IPv6-Route Type 2 data [:rfc:`6275`]:
|
477
|
+
|
478
|
+
.. code-block:: text
|
479
|
+
|
480
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
481
|
+
| Next Header | Hdr Ext Len=2 | Routing Type=2|Segments Left=1|
|
482
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
483
|
+
| Reserved |
|
484
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
485
|
+
| |
|
486
|
+
+ +
|
487
|
+
| |
|
488
|
+
+ Home Address +
|
489
|
+
| |
|
490
|
+
+ +
|
491
|
+
| |
|
492
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
493
|
+
|
494
|
+
Args:
|
495
|
+
schema: parsed routing data schema
|
496
|
+
header: parsed IPv6-Route header schema
|
497
|
+
|
498
|
+
Returns:
|
499
|
+
Parsed route data.
|
500
|
+
|
501
|
+
Raises:
|
502
|
+
ProtocolError: If ``length`` is **NOT** ``24``.
|
503
|
+
|
504
|
+
"""
|
505
|
+
if header.length != 24:
|
506
|
+
raise ProtocolError(f'{self.alias}: [TypeNo {type}] invalid format')
|
507
|
+
|
508
|
+
ipv6_route = Data_Type2(
|
509
|
+
next=header.next,
|
510
|
+
length=header.length,
|
511
|
+
type=header.type,
|
512
|
+
seg_left=header.seg_left,
|
513
|
+
ip=schema.ip,
|
514
|
+
)
|
515
|
+
return ipv6_route
|
516
|
+
|
517
|
+
def _read_data_type_rpl(self, schema: 'Schema_RPL', *, header: 'Schema_IPv6_Route') -> 'Data_RPL':
|
518
|
+
"""Read IPv6-Route RPL Source data.
|
519
|
+
|
520
|
+
Structure of IPv6-Route RPL Source data [:rfc:`6554`]:
|
521
|
+
|
522
|
+
.. code-block:: text
|
523
|
+
|
524
|
+
0 1 2 3
|
525
|
+
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
526
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
527
|
+
| Next Header | Hdr Ext Len | Routing Type | Segments Left |
|
528
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
529
|
+
| CmprI | CmprE | Pad | Reserved |
|
530
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
531
|
+
| |
|
532
|
+
. .
|
533
|
+
. Addresses[1..n] .
|
534
|
+
. .
|
535
|
+
| |
|
536
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
537
|
+
|
538
|
+
Args:
|
539
|
+
length: route data length
|
540
|
+
|
541
|
+
Returns:
|
542
|
+
Parsed route data.
|
543
|
+
|
544
|
+
"""
|
545
|
+
if header.length % 16 != 0:
|
546
|
+
raise ProtocolError(f'{self.alias}: [TypeNo {type}] invalid format')
|
547
|
+
|
548
|
+
ipv6_route = Data_RPL(
|
549
|
+
next=header.next,
|
550
|
+
length=header.length,
|
551
|
+
type=header.type,
|
552
|
+
seg_left=header.seg_left,
|
553
|
+
cmpr_i=schema.cmpr_i,
|
554
|
+
cmpr_e=schema.cmpr_e,
|
555
|
+
pad=schema.pad['pad_len'],
|
556
|
+
ip=tuple(schema.ip),
|
557
|
+
)
|
558
|
+
return ipv6_route
|
559
|
+
|
560
|
+
def _make_data_type_none(self, type: 'Enum_Routing', route: 'Optional[Data_UnknownType]' = None, *,
|
561
|
+
dst: 'Optional[IPv6Address]' = None,
|
562
|
+
data: 'bytes' = b'\x00\x00\x00\x00',
|
563
|
+
**kwargs: 'Any') -> 'Schema_UnknownType':
|
564
|
+
"""Make IPv6-Route unknown type data.
|
565
|
+
|
566
|
+
Args:
|
567
|
+
type: routing type
|
568
|
+
route: route data
|
569
|
+
dst: destination IPv6 address
|
570
|
+
data: raw route data as :obj:`bytes`
|
571
|
+
**kwargs: arbitrary keyword arguments
|
572
|
+
|
573
|
+
Returns:
|
574
|
+
Constructed route data schema.
|
575
|
+
|
576
|
+
"""
|
577
|
+
if route is not None:
|
578
|
+
data = route.data
|
579
|
+
|
580
|
+
pad_len = 8 - (len(data) + 4) % 8
|
581
|
+
if pad_len:
|
582
|
+
data += bytes(pad_len)
|
583
|
+
|
584
|
+
return Schema_UnknownType(
|
585
|
+
data=data,
|
586
|
+
)
|
587
|
+
|
588
|
+
def _make_data_type_src(self, type: 'Enum_Routing', route: 'Optional[Data_SourceRoute]' = None, *,
|
589
|
+
dst: 'Optional[IPv6Address]' = None,
|
590
|
+
ip: 'Optional[list[IPv6Address | str | bytes | int]]' = None,
|
591
|
+
**kwargs: 'Any') -> 'Schema_SourceRoute':
|
592
|
+
"""Make IPv6-Route Source Route data.
|
593
|
+
|
594
|
+
Args:
|
595
|
+
type: routing type
|
596
|
+
route: route data
|
597
|
+
dst: destination IPv6 address
|
598
|
+
ip: list of IPv6 addresses
|
599
|
+
**kwargs: arbitrary keyword arguments
|
600
|
+
|
601
|
+
Returns:
|
602
|
+
Constructed route data schema.
|
603
|
+
|
604
|
+
"""
|
605
|
+
if route is not None:
|
606
|
+
ip = cast('list[IPv6Address | str | bytes | int]', route.ip)
|
607
|
+
else:
|
608
|
+
ip = [] if ip is None else ip
|
609
|
+
|
610
|
+
return Schema_SourceRoute(
|
611
|
+
ip=ip,
|
612
|
+
)
|
613
|
+
|
614
|
+
def _make_data_type_2(self, type: 'Enum_Routing', route: 'Optional[Data_Type2]' = None, *,
|
615
|
+
dst: 'Optional[IPv6Address]' = None,
|
616
|
+
ip: 'IPv6Address | str | bytes | int' = '::',
|
617
|
+
**kwargs: 'Any') -> 'Schema_Type2':
|
618
|
+
"""Make IPv6-Route Type 2 data.
|
619
|
+
|
620
|
+
Args:
|
621
|
+
type: routing type
|
622
|
+
route: route data
|
623
|
+
dst: destination IPv6 address
|
624
|
+
ip: home address
|
625
|
+
**kwargs: arbitrary keyword arguments
|
626
|
+
|
627
|
+
Returns:
|
628
|
+
Constructed route data schema.
|
629
|
+
|
630
|
+
"""
|
631
|
+
if route is not None:
|
632
|
+
ip = cast('IPv6Address | str | bytes | int', route.ip)
|
633
|
+
|
634
|
+
return Schema_Type2(
|
635
|
+
ip=ip,
|
636
|
+
)
|
637
|
+
|
638
|
+
def _make_data_type_rpl(self, type: 'Enum_Routing', route: 'Optional[Data_RPL]' = None, *,
|
639
|
+
dst: 'Optional[IPv6Address]' = None,
|
640
|
+
ip: 'Optional[list[IPv6Address | str | bytes | int]]' = None,
|
641
|
+
**kwargs: 'Any') -> 'Schema_RPL':
|
642
|
+
"""Make IPv6-Route RPL Source data.
|
643
|
+
|
644
|
+
Args:
|
645
|
+
type: routing type
|
646
|
+
route: route data
|
647
|
+
dst: destination IPv6 address
|
648
|
+
ip: list of IPv6 addresses
|
649
|
+
**kwargs: arbitrary keyword arguments
|
650
|
+
|
651
|
+
Returns:
|
652
|
+
Constructed route data schema.
|
653
|
+
|
654
|
+
"""
|
655
|
+
if route is not None:
|
656
|
+
cmpr_i = route.cmpr_i
|
657
|
+
cmpr_e = route.cmpr_e
|
658
|
+
pad = route.pad
|
659
|
+
ip_val = [
|
660
|
+
addr if isinstance(addr, bytes) else addr.packed for addr in route.ip
|
661
|
+
]
|
662
|
+
else:
|
663
|
+
ip = [] if ip is None else ip
|
664
|
+
|
665
|
+
if dst is None:
|
666
|
+
pad = 0
|
667
|
+
cmpr_i = 0
|
668
|
+
cmpr_e = 0
|
669
|
+
ip_val = [
|
670
|
+
cast('IPv6Address', ipaddress.ip_address(addr)).packed for addr in ip
|
671
|
+
]
|
672
|
+
else:
|
673
|
+
test_list = [dst.packed] # type: list[bytes]
|
674
|
+
for item in ip[:-1]:
|
675
|
+
if isinstance(item, bytes):
|
676
|
+
test_list.append(item)
|
677
|
+
else:
|
678
|
+
test_list.append(cast('IPv6Address', ipaddress.ip_address(item)).packed)
|
679
|
+
prefix_i = os_path.commonprefix(test_list)
|
680
|
+
cmpr_i = len(prefix_i)
|
681
|
+
|
682
|
+
test_list = [dst.packed]
|
683
|
+
if isinstance(ip[-1], bytes):
|
684
|
+
test_list.append(ip[-1])
|
685
|
+
else:
|
686
|
+
test_list.append(cast('IPv6Address', ipaddress.ip_address(ip[-1])).packed)
|
687
|
+
prefix_e = os_path.commonprefix(test_list)
|
688
|
+
cmpr_e = len(prefix_e)
|
689
|
+
|
690
|
+
pad = 8 - ((len(ip) - 1) * (16 - cmpr_i) + (16 - cmpr_e)) % 8
|
691
|
+
|
692
|
+
ip_val = []
|
693
|
+
for item in ip[:-1]:
|
694
|
+
if isinstance(item, bytes):
|
695
|
+
ip_val.append(item[cmpr_i:])
|
696
|
+
else:
|
697
|
+
ip_val.append(cast('IPv6Address', ipaddress.ip_address(item)).packed[cmpr_i:])
|
698
|
+
if isinstance(ip[-1], bytes):
|
699
|
+
ip_val.append(ip[-1][cmpr_e:])
|
700
|
+
else:
|
701
|
+
ip_val.append(cast('IPv6Address', ipaddress.ip_address(ip[-1])).packed[cmpr_e:])
|
702
|
+
|
703
|
+
return Schema_RPL(
|
704
|
+
cmpr_i=cmpr_i,
|
705
|
+
cmpr_e=cmpr_e,
|
706
|
+
pad={
|
707
|
+
'pad_len': pad,
|
708
|
+
},
|
709
|
+
addresses=ip_val,
|
710
|
+
)
|