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,361 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""IPv6 - Internet Protocol version 6
|
3
|
+
========================================
|
4
|
+
|
5
|
+
.. module:: pcapkit.protocols.internet.ipv6
|
6
|
+
|
7
|
+
:mod:`pcapkit.protocols.internet.ipv6` contains
|
8
|
+
:class:`~pcapkit.protocols.internet.ipv6.IPv6` only,
|
9
|
+
which implements extractor for Internet Protocol
|
10
|
+
version 6 (IPv6) [*]_, whose structure is described
|
11
|
+
as below:
|
12
|
+
|
13
|
+
======= ========= ===================== =======================================
|
14
|
+
Octets Bits Name Description
|
15
|
+
======= ========= ===================== =======================================
|
16
|
+
0 0 ``ip.version`` Version (``6``)
|
17
|
+
0 4 ``ip.class`` Traffic Class
|
18
|
+
1 12 ``ip.label`` Flow Label
|
19
|
+
4 32 ``ip.payload`` Payload Length (header excludes)
|
20
|
+
6 48 ``ip.next`` Next Header
|
21
|
+
7 56 ``ip.limit`` Hop Limit
|
22
|
+
8 64 ``ip.src`` Source Address
|
23
|
+
24 192 ``ip.dst`` Destination Address
|
24
|
+
======= ========= ===================== =======================================
|
25
|
+
|
26
|
+
.. [*] https://en.wikipedia.org/wiki/IPv6_packet
|
27
|
+
|
28
|
+
"""
|
29
|
+
import ipaddress
|
30
|
+
from typing import TYPE_CHECKING
|
31
|
+
|
32
|
+
from pcapkit.const.ipv6.extension_header import ExtensionHeader as Enum_ExtensionHeader
|
33
|
+
from pcapkit.const.reg.transtype import TransType as Enum_TransType
|
34
|
+
from pcapkit.corekit.multidict import OrderedMultiDict
|
35
|
+
from pcapkit.corekit.protochain import ProtoChain
|
36
|
+
from pcapkit.protocols.data.internet.ipv6 import IPv6 as Data_IPv6
|
37
|
+
from pcapkit.protocols.internet.ip import IP
|
38
|
+
from pcapkit.protocols.schema.internet.ipv6 import IPv6 as Schema_IPv6
|
39
|
+
|
40
|
+
if TYPE_CHECKING:
|
41
|
+
from enum import IntEnum as StdlibEnum
|
42
|
+
from ipaddress import IPv6Address
|
43
|
+
from typing import Any, Optional, Type
|
44
|
+
|
45
|
+
from aenum import IntEnum as AenumEnum
|
46
|
+
from typing_extensions import Literal
|
47
|
+
|
48
|
+
from pcapkit.protocols.protocol import ProtocolBase as Protocol
|
49
|
+
from pcapkit.protocols.schema.schema import Schema
|
50
|
+
|
51
|
+
__all__ = ['IPv6']
|
52
|
+
|
53
|
+
|
54
|
+
class IPv6(IP[Data_IPv6, Schema_IPv6],
|
55
|
+
schema=Schema_IPv6, data=Data_IPv6):
|
56
|
+
"""This class implements Internet Protocol version 6."""
|
57
|
+
|
58
|
+
##########################################################################
|
59
|
+
# Properties.
|
60
|
+
##########################################################################
|
61
|
+
|
62
|
+
@property
|
63
|
+
def name(self) -> 'Literal["Internet Protocol version 6"]':
|
64
|
+
"""Name of corresponding protocol."""
|
65
|
+
return 'Internet Protocol version 6'
|
66
|
+
|
67
|
+
@property
|
68
|
+
def length(self) -> 'Literal[40]':
|
69
|
+
"""Header length of corresponding protocol."""
|
70
|
+
return 40
|
71
|
+
|
72
|
+
@property
|
73
|
+
def protocol(self) -> 'Enum_TransType':
|
74
|
+
"""Name of next layer protocol."""
|
75
|
+
return self._info.protocol
|
76
|
+
|
77
|
+
# source IP address
|
78
|
+
@property
|
79
|
+
def src(self) -> 'IPv6Address':
|
80
|
+
"""Source IP address."""
|
81
|
+
return self._info.src
|
82
|
+
|
83
|
+
# destination IP address
|
84
|
+
@property
|
85
|
+
def dst(self) -> 'IPv6Address':
|
86
|
+
"""Destination IP address."""
|
87
|
+
return self._info.dst
|
88
|
+
|
89
|
+
@property
|
90
|
+
def extension_headers(self) -> 'OrderedMultiDict[Enum_ExtensionHeader, Protocol]':
|
91
|
+
"""IPv6 extension header records."""
|
92
|
+
return self._exthdr
|
93
|
+
|
94
|
+
##########################################################################
|
95
|
+
# Methods.
|
96
|
+
##########################################################################
|
97
|
+
|
98
|
+
def read(self, length: 'Optional[int]' = None, *,
|
99
|
+
__packet__: 'Optional[dict[str, Any]]' = None, **kwargs: 'Any') -> 'Data_IPv6': # pylint: disable=unused-argument
|
100
|
+
"""Read Internet Protocol version 6 (IPv6).
|
101
|
+
|
102
|
+
Structure of IPv6 header [:rfc:`2460`]:
|
103
|
+
|
104
|
+
.. code-block:: text
|
105
|
+
|
106
|
+
0 1 2 3
|
107
|
+
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
|
108
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
109
|
+
|Version| Traffic Class | Flow Label |
|
110
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
111
|
+
| Payload Length | Next Header | Hop Limit |
|
112
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
113
|
+
| |
|
114
|
+
+ +
|
115
|
+
| |
|
116
|
+
+ Source Address +
|
117
|
+
| |
|
118
|
+
+ +
|
119
|
+
| |
|
120
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
121
|
+
| |
|
122
|
+
+ +
|
123
|
+
| |
|
124
|
+
+ Destination Address +
|
125
|
+
| |
|
126
|
+
+ +
|
127
|
+
| |
|
128
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
129
|
+
|
130
|
+
Args:
|
131
|
+
length: Length of packet data.
|
132
|
+
__packet__: Optional packet data.
|
133
|
+
**kwargs: Arbitrary keyword arguments.
|
134
|
+
|
135
|
+
Returns:
|
136
|
+
Parsed packet data.
|
137
|
+
|
138
|
+
"""
|
139
|
+
if length is None:
|
140
|
+
length = len(self)
|
141
|
+
schema = self.__header__
|
142
|
+
|
143
|
+
ipv6 = Data_IPv6.from_dict({
|
144
|
+
'version': schema.hextet['version'],
|
145
|
+
'class': schema.hextet['class'],
|
146
|
+
'label': schema.hextet['label'],
|
147
|
+
'payload': schema.length,
|
148
|
+
'next': schema.next,
|
149
|
+
'limit': schema.limit,
|
150
|
+
'src': schema.src,
|
151
|
+
'dst': schema.dst,
|
152
|
+
}) # type: Data_IPv6
|
153
|
+
|
154
|
+
# update packet info
|
155
|
+
if __packet__ is None:
|
156
|
+
__packet__ = {}
|
157
|
+
__packet__.update({
|
158
|
+
'src': ipv6.src,
|
159
|
+
'dst': ipv6.dst,
|
160
|
+
})
|
161
|
+
|
162
|
+
return self._decode_next_layer(ipv6, schema.next, ipv6.payload, packet=__packet__) # pylint: disable=no-member
|
163
|
+
|
164
|
+
def make(self,
|
165
|
+
traffic_class: 'int' = 0,
|
166
|
+
flow_label: 'int' = 0,
|
167
|
+
next: 'Enum_TransType | StdlibEnum | AenumEnum | str | int' = Enum_TransType.UDP,
|
168
|
+
next_default: 'Optional[int]' = None,
|
169
|
+
next_namespace: 'Optional[dict[str, int] | dict[int, str] | Type[StdlibEnum] | Type[AenumEnum]]' = None, # pylint: disable=line-too-long
|
170
|
+
next_reversed: 'bool' = False,
|
171
|
+
hop_limit: 'int' = 64, # reasonable default
|
172
|
+
src: 'IPv6Address | str | bytes | int' = '::1',
|
173
|
+
dst: 'IPv6Address | str | bytes | int' = '::',
|
174
|
+
payload: 'bytes | Protocol | Schema' = b'',
|
175
|
+
**kwargs: 'Any') -> 'Schema_IPv6':
|
176
|
+
"""Make (construct) packet data.
|
177
|
+
|
178
|
+
Args:
|
179
|
+
traffic_class: Traffic class.
|
180
|
+
flow_label: Flow label.
|
181
|
+
next: Next header.
|
182
|
+
next_default: Default value of next header.
|
183
|
+
next_namespace: Namespace of next header.
|
184
|
+
next_reversed: Whether to reverse the namespace of next header.
|
185
|
+
hop_limit: Hop limit.
|
186
|
+
src: Source IP address.
|
187
|
+
dst: Destination IP address.
|
188
|
+
payload: Payload data.
|
189
|
+
**kwargs: Arbitrary keyword arguments.
|
190
|
+
|
191
|
+
Returns:
|
192
|
+
Constructed packet data.
|
193
|
+
|
194
|
+
"""
|
195
|
+
next_val = self._make_index(next, next_default, namespace=next_namespace,
|
196
|
+
reversed=next_reversed, pack=False)
|
197
|
+
|
198
|
+
return Schema_IPv6(
|
199
|
+
hextet={
|
200
|
+
'version': 6,
|
201
|
+
'class': traffic_class,
|
202
|
+
'label': flow_label,
|
203
|
+
},
|
204
|
+
length=len(payload),
|
205
|
+
next=next_val, # type: ignore[arg-type]
|
206
|
+
limit=hop_limit,
|
207
|
+
src=src,
|
208
|
+
dst=dst,
|
209
|
+
payload=payload,
|
210
|
+
)
|
211
|
+
|
212
|
+
@classmethod
|
213
|
+
def id(cls) -> 'tuple[Literal["IPv6"]]': # type: ignore[override]
|
214
|
+
"""Index ID of the protocol.
|
215
|
+
|
216
|
+
Returns:
|
217
|
+
Index ID of the protocol.
|
218
|
+
|
219
|
+
"""
|
220
|
+
return ('IPv6',)
|
221
|
+
|
222
|
+
##########################################################################
|
223
|
+
# Data models.
|
224
|
+
##########################################################################
|
225
|
+
|
226
|
+
def __length_hint__(self) -> 'Literal[40]':
|
227
|
+
"""Return an estimated length for the object."""
|
228
|
+
return 40
|
229
|
+
|
230
|
+
@classmethod
|
231
|
+
def __index__(cls) -> 'Enum_TransType': # pylint: disable=invalid-index-returned
|
232
|
+
"""Numeral registry index of the protocol.
|
233
|
+
|
234
|
+
Returns:
|
235
|
+
Numeral registry index of the protocol in `IANA`_.
|
236
|
+
|
237
|
+
.. _IANA: https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml
|
238
|
+
|
239
|
+
"""
|
240
|
+
return Enum_TransType.IPv6 # type: ignore[return-value]
|
241
|
+
|
242
|
+
##########################################################################
|
243
|
+
# Utilities.
|
244
|
+
##########################################################################
|
245
|
+
|
246
|
+
@classmethod
|
247
|
+
def _make_data(cls, data: 'Data_IPv6') -> 'dict[str, Any]': # type: ignore[override]
|
248
|
+
"""Create key-value pairs from ``data`` for protocol construction.
|
249
|
+
|
250
|
+
Args:
|
251
|
+
data: protocol data
|
252
|
+
|
253
|
+
Returns:
|
254
|
+
Key-value pairs for protocol construction.
|
255
|
+
|
256
|
+
"""
|
257
|
+
return {
|
258
|
+
'traffic_class': data['class'],
|
259
|
+
'flow_label': data.label,
|
260
|
+
'next': data.next,
|
261
|
+
'hop_limit': data.limit,
|
262
|
+
'src': data.src,
|
263
|
+
'dst': data.dst,
|
264
|
+
'payload': cls._make_payload(data)
|
265
|
+
}
|
266
|
+
|
267
|
+
def _read_ip_hextet(self) -> 'tuple[int, int, int]':
|
268
|
+
"""Read first four hextets of IPv6.
|
269
|
+
|
270
|
+
Returns:
|
271
|
+
Parsed hextets data, including version number, traffic class and
|
272
|
+
flow label.
|
273
|
+
|
274
|
+
"""
|
275
|
+
_htet = self._read_fileng(4).hex()
|
276
|
+
_vers = int(_htet[0], base=16) # version number (6)
|
277
|
+
_tcls = int(_htet[0:2], base=16) # traffic class
|
278
|
+
_flow = int(_htet[2:], base=16) # flow label
|
279
|
+
|
280
|
+
return (_vers, _tcls, _flow)
|
281
|
+
|
282
|
+
def _read_ip_addr(self) -> 'IPv6Address':
|
283
|
+
"""Read IP address.
|
284
|
+
|
285
|
+
Returns:
|
286
|
+
Parsed IP address.
|
287
|
+
|
288
|
+
"""
|
289
|
+
return ipaddress.ip_address(self._read_fileng(16)) # type: ignore[return-value]
|
290
|
+
|
291
|
+
def _decode_next_layer(self, ipv6: 'Data_IPv6', proto: 'Optional[int]' = None, # type: ignore[override] # pylint: disable=arguments-differ,arguments-renamed
|
292
|
+
length: 'Optional[int]' = None, *, packet: 'Optional[dict[str, Any]]' = None) -> 'Data_IPv6': # pylint: disable=arguments-differ
|
293
|
+
"""Decode next layer extractor.
|
294
|
+
|
295
|
+
Arguments:
|
296
|
+
ipv6: info buffer
|
297
|
+
proto: next layer protocol name
|
298
|
+
length: valid (*not padding*) length
|
299
|
+
packet: packet info (passed from :meth:`self.unpack <pcapkit.protocols.protocol.Protocol.unpack>`)
|
300
|
+
|
301
|
+
Returns:
|
302
|
+
Current protocol with next layer extracted.
|
303
|
+
|
304
|
+
"""
|
305
|
+
#: Extension headers.
|
306
|
+
self._exthdr = OrderedMultiDict() # type: OrderedMultiDict[Enum_ExtensionHeader, Protocol] # pylint: disable=attribute-defined-outside-init
|
307
|
+
|
308
|
+
hdr_len = self.length # header length
|
309
|
+
raw_len = ipv6.payload # payload length
|
310
|
+
_protos = [] # ProtoChain buffer
|
311
|
+
|
312
|
+
# traverse if next header is an extensive header
|
313
|
+
while True:
|
314
|
+
try:
|
315
|
+
ex_proto = Enum_ExtensionHeader(proto)
|
316
|
+
except ValueError:
|
317
|
+
break
|
318
|
+
|
319
|
+
# # directly break when No Next Header occurs
|
320
|
+
# if proto.name == 'IPv6-NoNxt':
|
321
|
+
# proto = None
|
322
|
+
# break
|
323
|
+
|
324
|
+
# make protocol name
|
325
|
+
next_ = self._import_next_layer(proto, packet=packet, version=6, extension=True) # type: ignore[misc,call-arg,arg-type]
|
326
|
+
info = next_.info
|
327
|
+
name = next_.alias.lstrip('IPv6-').lower()
|
328
|
+
ipv6.__update__({
|
329
|
+
name: info,
|
330
|
+
})
|
331
|
+
|
332
|
+
# record protocol name
|
333
|
+
# self._protos = ProtoChain(name, chain, alias)
|
334
|
+
_protos.append(next_)
|
335
|
+
proto = info.next
|
336
|
+
|
337
|
+
# update header & payload length
|
338
|
+
hdr_len += next_.length # type: ignore[assignment]
|
339
|
+
raw_len -= next_.length
|
340
|
+
|
341
|
+
# keep record of extension headers
|
342
|
+
self._exthdr.add(ex_proto, next_)
|
343
|
+
|
344
|
+
# keep original data after fragment header
|
345
|
+
if ex_proto == Enum_ExtensionHeader.IPv6_Frag:
|
346
|
+
ipv6.__update__({
|
347
|
+
'fragment': self._read_packet(header=hdr_len, payload=raw_len),
|
348
|
+
})
|
349
|
+
break
|
350
|
+
|
351
|
+
# record real header & payload length (headers exclude)
|
352
|
+
ipv6.__update__({
|
353
|
+
'hdr_len': hdr_len,
|
354
|
+
'raw_len': raw_len,
|
355
|
+
|
356
|
+
# update next header
|
357
|
+
'protocol': proto,
|
358
|
+
})
|
359
|
+
|
360
|
+
ipv6_exthdr = ProtoChain.from_list(_protos) # type: ignore[arg-type]
|
361
|
+
return super()._decode_next_layer(ipv6, proto, raw_len, packet=packet, ipv6_exthdr=ipv6_exthdr)
|
@@ -0,0 +1,258 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""IPv6-Frag - Fragment Header for IPv6
|
3
|
+
==========================================
|
4
|
+
|
5
|
+
.. module:: pcapkit.protocols.internet.ipv6_frag
|
6
|
+
|
7
|
+
:mod:`pcapkit.protocols.internet.ipv6_frag` contains
|
8
|
+
:class:`~pcapkit.protocols.internet.ipv6_frag.IPv6_Frag`
|
9
|
+
only, which implements extractor for Fragment Header for
|
10
|
+
IPv6 (IPv6-Frag) [*]_, whose structure is described as
|
11
|
+
below:
|
12
|
+
|
13
|
+
======= ========= ==================== =======================
|
14
|
+
Octets Bits Name Description
|
15
|
+
======= ========= ==================== =======================
|
16
|
+
0 0 ``frag.next`` Next Header
|
17
|
+
1 8 Reserved
|
18
|
+
2 16 ``frag.offset`` Fragment Offset
|
19
|
+
3 29 Reserved
|
20
|
+
3 31 ``frag.mf`` More Flag
|
21
|
+
4 32 ``frag.id`` Identification
|
22
|
+
======= ========= ==================== =======================
|
23
|
+
|
24
|
+
.. [*] https://en.wikipedia.org/wiki/IPv6_packet#Fragment
|
25
|
+
|
26
|
+
"""
|
27
|
+
from typing import TYPE_CHECKING, overload
|
28
|
+
|
29
|
+
from pcapkit.const.reg.transtype import TransType as Enum_TransType
|
30
|
+
from pcapkit.protocols.data.internet.ipv6_frag import IPv6_Frag as Data_IPv6_Frag
|
31
|
+
from pcapkit.protocols.internet.internet import Internet
|
32
|
+
from pcapkit.protocols.schema.internet.ipv6_frag import IPv6_Frag as Schema_IPv6_Frag
|
33
|
+
from pcapkit.utilities.exceptions import UnsupportedCall
|
34
|
+
|
35
|
+
if TYPE_CHECKING:
|
36
|
+
from enum import IntEnum as StdlibEnum
|
37
|
+
from typing import IO, Any, NoReturn, Optional, Type
|
38
|
+
|
39
|
+
from aenum import IntEnum as AenumEnum
|
40
|
+
from typing_extensions import Literal
|
41
|
+
|
42
|
+
from pcapkit.corekit.protochain import ProtoChain
|
43
|
+
from pcapkit.protocols.protocol import ProtocolBase as Protocol
|
44
|
+
from pcapkit.protocols.schema.schema import Schema
|
45
|
+
|
46
|
+
__all__ = ['IPv6_Frag']
|
47
|
+
|
48
|
+
|
49
|
+
class IPv6_Frag(Internet[Data_IPv6_Frag, Schema_IPv6_Frag],
|
50
|
+
schema=Schema_IPv6_Frag, data=Data_IPv6_Frag):
|
51
|
+
"""This class implements Fragment Header for IPv6."""
|
52
|
+
|
53
|
+
##########################################################################
|
54
|
+
# Properties.
|
55
|
+
##########################################################################
|
56
|
+
|
57
|
+
@property
|
58
|
+
def name(self) -> 'Literal["Fragment Header for IPv6"]':
|
59
|
+
"""Name of current protocol."""
|
60
|
+
return 'Fragment Header for IPv6'
|
61
|
+
|
62
|
+
@property
|
63
|
+
def alias(self) -> 'Literal["IPv6-Frag"]':
|
64
|
+
"""Acronym of corresponding protocol."""
|
65
|
+
return 'IPv6-Frag'
|
66
|
+
|
67
|
+
@property
|
68
|
+
def length(self) -> 'Literal[8]':
|
69
|
+
"""Header length of current protocol."""
|
70
|
+
return 8
|
71
|
+
|
72
|
+
@property
|
73
|
+
def payload(self) -> 'Protocol | NoReturn':
|
74
|
+
"""Payload of current instance.
|
75
|
+
|
76
|
+
Raises:
|
77
|
+
UnsupportedCall: if the protocol is used as an IPv6 extension header
|
78
|
+
|
79
|
+
"""
|
80
|
+
if self._extf:
|
81
|
+
raise UnsupportedCall(f"'{self.__class__.__name__}' object has no attribute 'payload'")
|
82
|
+
return self._next
|
83
|
+
|
84
|
+
@property
|
85
|
+
def protocol(self) -> 'Optional[str] | NoReturn':
|
86
|
+
"""Name of next layer protocol (if any).
|
87
|
+
|
88
|
+
Raises:
|
89
|
+
UnsupportedCall: if the protocol is used as an IPv6 extension header
|
90
|
+
|
91
|
+
"""
|
92
|
+
if self._extf:
|
93
|
+
raise UnsupportedCall(f"'{self.__class__.__name__}' object has no attribute 'protocol'")
|
94
|
+
return super().protocol
|
95
|
+
|
96
|
+
@property
|
97
|
+
def protochain(self) -> 'ProtoChain | NoReturn':
|
98
|
+
"""Protocol chain of current instance.
|
99
|
+
|
100
|
+
Raises:
|
101
|
+
UnsupportedCall: if the protocol is used as an IPv6 extension header
|
102
|
+
|
103
|
+
"""
|
104
|
+
if self._extf:
|
105
|
+
raise UnsupportedCall(f"'{self.__class__.__name__}' object has no attribute 'protochain'")
|
106
|
+
return super().protochain
|
107
|
+
|
108
|
+
##########################################################################
|
109
|
+
# Methods.
|
110
|
+
##########################################################################
|
111
|
+
|
112
|
+
def read(self, length: 'Optional[int]' = None, *, extension: 'bool' = False, # pylint: disable=arguments-differ
|
113
|
+
**kwargs: 'Any') -> 'Data_IPv6_Frag': # pylint: disable=unused-argument
|
114
|
+
"""Read Fragment Header for IPv6.
|
115
|
+
|
116
|
+
Structure of IPv6-Frag header [:rfc:`8200`]:
|
117
|
+
|
118
|
+
.. code-block:: text
|
119
|
+
|
120
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
121
|
+
| Next Header | Reserved | Fragment Offset |Res|M|
|
122
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
123
|
+
| Identification |
|
124
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
125
|
+
|
126
|
+
Args:
|
127
|
+
length: Length of packet data.
|
128
|
+
extension: If the packet is used as an IPv6 extension header.
|
129
|
+
**kwargs: Arbitrary keyword arguments.
|
130
|
+
|
131
|
+
Returns:
|
132
|
+
Parsed packet data.
|
133
|
+
|
134
|
+
"""
|
135
|
+
if length is None:
|
136
|
+
length = len(self)
|
137
|
+
schema = self.__header__
|
138
|
+
|
139
|
+
ipv6_frag = Data_IPv6_Frag(
|
140
|
+
next=schema.next,
|
141
|
+
offset=schema.flags['offset'],
|
142
|
+
mf=bool(schema.flags['mf']),
|
143
|
+
id=schema.id,
|
144
|
+
)
|
145
|
+
|
146
|
+
if extension:
|
147
|
+
return ipv6_frag
|
148
|
+
return self._decode_next_layer(ipv6_frag, schema.next, length - self.length)
|
149
|
+
|
150
|
+
def make(self,
|
151
|
+
next: 'Enum_TransType | StdlibEnum | AenumEnum | str | int' = Enum_TransType.UDP,
|
152
|
+
next_default: 'Optional[int]' = None,
|
153
|
+
next_namespace: 'Optional[dict[str, int] | dict[int, str] | Type[StdlibEnum] | Type[AenumEnum]]' = None, # pylint: disable=line-too-long
|
154
|
+
next_reversed: 'bool' = False,
|
155
|
+
offset: 'int' = 0,
|
156
|
+
mf: 'bool' = False,
|
157
|
+
id: 'int' = 0,
|
158
|
+
payload: 'bytes | Protocol | Schema' = b'',
|
159
|
+
**kwargs: 'Any') -> 'Schema_IPv6_Frag':
|
160
|
+
"""Make (construct) packet data.
|
161
|
+
|
162
|
+
Args:
|
163
|
+
next: Next header.
|
164
|
+
next_default: Default value of next header.
|
165
|
+
next_namespace: Namespace of next header.
|
166
|
+
next_reversed: If the namespace of next header is reversed.
|
167
|
+
offset: Fragment offset.
|
168
|
+
mf: More fragments flag.
|
169
|
+
id: Identification.
|
170
|
+
payload: Payload of current instance.
|
171
|
+
**kwargs: Arbitrary keyword arguments.
|
172
|
+
|
173
|
+
Returns:
|
174
|
+
Constructed packet data.
|
175
|
+
|
176
|
+
"""
|
177
|
+
next_val = self._make_index(next, next_default, namespace=next_namespace,
|
178
|
+
reversed=next_reversed, pack=False)
|
179
|
+
|
180
|
+
return Schema_IPv6_Frag(
|
181
|
+
next=next_val, # type: ignore[arg-type]
|
182
|
+
flags={
|
183
|
+
'offset': offset,
|
184
|
+
'mf': mf,
|
185
|
+
},
|
186
|
+
id=id,
|
187
|
+
payload=payload,
|
188
|
+
)
|
189
|
+
|
190
|
+
##########################################################################
|
191
|
+
# Data models.
|
192
|
+
##########################################################################
|
193
|
+
|
194
|
+
@overload
|
195
|
+
def __post_init__(self, file: 'IO[bytes] | bytes', length: 'Optional[int]' = ..., *, # pylint: disable=arguments-differ
|
196
|
+
extension: 'bool' = ..., **kwargs: 'Any') -> 'None': ...
|
197
|
+
|
198
|
+
@overload
|
199
|
+
def __post_init__(self, **kwargs: 'Any') -> 'None': ... # pylint: disable=arguments-differ
|
200
|
+
|
201
|
+
def __post_init__(self, file: 'Optional[IO[bytes] | bytes]' = None, length: 'Optional[int]' = None, *, # pylint: disable=arguments-differ
|
202
|
+
extension: 'bool' = False, **kwargs: 'Any') -> 'None':
|
203
|
+
"""Post initialisation hook.
|
204
|
+
|
205
|
+
Args:
|
206
|
+
file: Source packet stream.
|
207
|
+
length: Length of packet data.
|
208
|
+
extension: If the protocol is used as an IPv6 extension header.
|
209
|
+
**kwargs: Arbitrary keyword arguments.
|
210
|
+
|
211
|
+
See Also:
|
212
|
+
For construction argument, please refer to :meth:`self.make <IPv6_Frag.make>`.
|
213
|
+
|
214
|
+
"""
|
215
|
+
#: bool: If the protocol is used as an IPv6 extension header.
|
216
|
+
self._extf = extension
|
217
|
+
|
218
|
+
# call super __post_init__
|
219
|
+
super().__post_init__(file, length, extension=extension, **kwargs) # type: ignore[arg-type]
|
220
|
+
|
221
|
+
def __length_hint__(self) -> 'Literal[8]':
|
222
|
+
"""Return an estimated length for the object."""
|
223
|
+
return 8
|
224
|
+
|
225
|
+
@classmethod
|
226
|
+
def __index__(cls) -> 'Enum_TransType': # pylint: disable=invalid-index-returned
|
227
|
+
"""Numeral registry index of the protocol.
|
228
|
+
|
229
|
+
Returns:
|
230
|
+
Numeral registry index of the protocol in `IANA`_.
|
231
|
+
|
232
|
+
.. _IANA: https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml
|
233
|
+
|
234
|
+
"""
|
235
|
+
return Enum_TransType.IPv6_Frag # type: ignore[return-value]
|
236
|
+
|
237
|
+
##########################################################################
|
238
|
+
# Utilities.
|
239
|
+
##########################################################################
|
240
|
+
|
241
|
+
@classmethod
|
242
|
+
def _make_data(cls, data: 'Data_IPv6_Frag') -> 'dict[str, Any]': # type: ignore[override]
|
243
|
+
"""Create key-value pairs from ``data`` for protocol construction.
|
244
|
+
|
245
|
+
Args:
|
246
|
+
data: protocol data
|
247
|
+
|
248
|
+
Returns:
|
249
|
+
Key-value pairs for protocol construction.
|
250
|
+
|
251
|
+
"""
|
252
|
+
return {
|
253
|
+
'next': data.next,
|
254
|
+
'offset': data.offset,
|
255
|
+
'mf': data.mf,
|
256
|
+
'id': data.id,
|
257
|
+
'payload': cls._make_payload(data),
|
258
|
+
}
|