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,248 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""Ethernet Protocol
|
3
|
+
=======================
|
4
|
+
|
5
|
+
.. module:: pcapkit.protocols.link.ethernet
|
6
|
+
|
7
|
+
:mod:`pcapkit.protocols.link.ethernet` contains
|
8
|
+
:class:`~pcapkit.protocols.link.ethernet.Ethernet`
|
9
|
+
only, which implements extractor for Ethernet
|
10
|
+
Protocol [*]_, whose structure is described as
|
11
|
+
below:
|
12
|
+
|
13
|
+
.. table::
|
14
|
+
|
15
|
+
====== ===== ============ =========================
|
16
|
+
Octets Bits Name Description
|
17
|
+
====== ===== ============ =========================
|
18
|
+
0 0 ``eth.dst`` Destination MAC Address
|
19
|
+
------ ----- ------------ -------------------------
|
20
|
+
1 8 ``eth.src`` Source MAC Address
|
21
|
+
------ ----- ------------ -------------------------
|
22
|
+
2 16 ``eth.type`` Protocol (Internet Layer)
|
23
|
+
====== ===== ============ =========================
|
24
|
+
|
25
|
+
.. [*] https://en.wikipedia.org/wiki/Ethernet
|
26
|
+
|
27
|
+
"""
|
28
|
+
import re
|
29
|
+
import sys
|
30
|
+
import textwrap
|
31
|
+
from typing import TYPE_CHECKING
|
32
|
+
|
33
|
+
from pcapkit.const.reg.ethertype import EtherType as Enum_EtherType
|
34
|
+
from pcapkit.const.reg.linktype import LinkType as Enum_LinkType
|
35
|
+
from pcapkit.protocols.data.link.ethernet import Ethernet as Data_Ethernet
|
36
|
+
from pcapkit.protocols.link.link import Link
|
37
|
+
from pcapkit.protocols.schema.link.ethernet import Ethernet as Schema_Ethernet
|
38
|
+
from pcapkit.utilities.exceptions import ProtocolError
|
39
|
+
|
40
|
+
if TYPE_CHECKING:
|
41
|
+
from enum import IntEnum as StdlibEnum
|
42
|
+
from typing import Any, Optional, Type
|
43
|
+
|
44
|
+
from aenum import IntEnum as AenumEnum
|
45
|
+
from typing_extensions import Literal
|
46
|
+
|
47
|
+
from pcapkit.protocols.protocol import ProtocolBase as Protocol
|
48
|
+
from pcapkit.protocols.schema.schema import Schema
|
49
|
+
|
50
|
+
__all__ = ['Ethernet']
|
51
|
+
|
52
|
+
# check Python version
|
53
|
+
py38 = ((version_info := sys.version_info).major >= 3 and version_info.minor >= 8)
|
54
|
+
|
55
|
+
# Ethernet address pattern
|
56
|
+
PAT_MAC_ADDR = re.compile(rb'(?i)(?:[0-9a-f]{2}[:-]){5}[0-9a-f]{2}')
|
57
|
+
|
58
|
+
|
59
|
+
class Ethernet(Link[Data_Ethernet, Schema_Ethernet],
|
60
|
+
schema=Schema_Ethernet, data=Data_Ethernet):
|
61
|
+
"""This class implements Ethernet Protocol."""
|
62
|
+
|
63
|
+
##########################################################################
|
64
|
+
# Properties.
|
65
|
+
##########################################################################
|
66
|
+
|
67
|
+
@property
|
68
|
+
def name(self) -> 'Literal["Ethernet Protocol"]':
|
69
|
+
"""Name of current protocol."""
|
70
|
+
return 'Ethernet Protocol'
|
71
|
+
|
72
|
+
@property
|
73
|
+
def length(self) -> 'Literal[14]':
|
74
|
+
"""Header length of current protocol."""
|
75
|
+
return 14
|
76
|
+
|
77
|
+
@property
|
78
|
+
def protocol(self) -> 'Enum_EtherType':
|
79
|
+
"""Name of next layer protocol."""
|
80
|
+
return self._info.type
|
81
|
+
|
82
|
+
# source mac address
|
83
|
+
@property
|
84
|
+
def src(self) -> 'str':
|
85
|
+
"""Source mac address."""
|
86
|
+
return self._info.src
|
87
|
+
|
88
|
+
# destination mac address
|
89
|
+
@property
|
90
|
+
def dst(self) -> 'str':
|
91
|
+
"""Destination mac address."""
|
92
|
+
return self._info.dst
|
93
|
+
|
94
|
+
##########################################################################
|
95
|
+
# Methods.
|
96
|
+
##########################################################################
|
97
|
+
|
98
|
+
def read(self, length: 'Optional[int]' = None, **kwargs: 'Any') -> 'Data_Ethernet': # pylint: disable=unused-argument
|
99
|
+
"""Read Ethernet Protocol.
|
100
|
+
|
101
|
+
Structure of Ethernet header [:rfc:`7042`]:
|
102
|
+
|
103
|
+
.. code-block:: text
|
104
|
+
|
105
|
+
0 1 2 3
|
106
|
+
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
|
107
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
108
|
+
| Dst MAC Addr |
|
109
|
+
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
110
|
+
| | |
|
111
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
|
112
|
+
| Src MAC Addr |
|
113
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
114
|
+
| Ether Type |
|
115
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
116
|
+
|
117
|
+
Args:
|
118
|
+
length: Length of packet data.
|
119
|
+
**kwargs: Arbitrary keyword arguments.
|
120
|
+
|
121
|
+
Returns:
|
122
|
+
Parsed packet data.
|
123
|
+
|
124
|
+
"""
|
125
|
+
if length is None:
|
126
|
+
length = len(self)
|
127
|
+
schema = self.__header__
|
128
|
+
|
129
|
+
_dstm = self._read_mac_addr(schema.dst)
|
130
|
+
_srcm = self._read_mac_addr(schema.src)
|
131
|
+
_type = schema.type
|
132
|
+
|
133
|
+
ethernet = Data_Ethernet(
|
134
|
+
dst=_dstm,
|
135
|
+
src=_srcm,
|
136
|
+
type=_type,
|
137
|
+
)
|
138
|
+
return self._decode_next_layer(ethernet, _type, length - self.length)
|
139
|
+
|
140
|
+
def make(self,
|
141
|
+
dst: 'str | bytes | bytearray' = '00:00:00:00:00:00',
|
142
|
+
src: 'str | bytes | bytearray' = '00:00:00:00:00:00',
|
143
|
+
type: 'Enum_EtherType | StdlibEnum | AenumEnum | str | int' = Enum_EtherType.Internet_Protocol_version_4,
|
144
|
+
type_default: 'Optional[int]' = None,
|
145
|
+
type_namespace: 'Optional[dict[str, int] | dict[int, str] | Type[StdlibEnum] | Type[AenumEnum]]' = None, # pylint: disable=line-too-long
|
146
|
+
type_reversed: 'bool' = False,
|
147
|
+
payload: 'bytes | Protocol | Schema' = b'',
|
148
|
+
**kwargs: 'Any') -> 'Schema_Ethernet':
|
149
|
+
"""Make (construct) packet data.
|
150
|
+
|
151
|
+
Args:
|
152
|
+
dst: Destination MAC address.
|
153
|
+
src: Source MAC address.
|
154
|
+
type: EtherType.
|
155
|
+
type_default: Default EtherType.
|
156
|
+
type_namespace: EtherType namespace.
|
157
|
+
type_reversed: Whether EtherType is reversed.
|
158
|
+
payload: Payload data.
|
159
|
+
**kwargs: Arbitrary keyword arguments.
|
160
|
+
|
161
|
+
Returns:
|
162
|
+
Constructed packet data.
|
163
|
+
|
164
|
+
"""
|
165
|
+
_type = self._make_index(type, type_default, namespace=type_namespace,
|
166
|
+
reversed=type_reversed, pack=False)
|
167
|
+
|
168
|
+
return Schema_Ethernet(
|
169
|
+
dst=self._make_mac_addr(dst),
|
170
|
+
src=self._make_mac_addr(src),
|
171
|
+
type=_type, # type: ignore[arg-type]
|
172
|
+
payload=payload,
|
173
|
+
)
|
174
|
+
|
175
|
+
##########################################################################
|
176
|
+
# Data models.
|
177
|
+
##########################################################################
|
178
|
+
|
179
|
+
def __length_hint__(self) -> 'Literal[14]':
|
180
|
+
"""Return an estimated length for the object."""
|
181
|
+
return 14
|
182
|
+
|
183
|
+
@classmethod
|
184
|
+
def __index__(cls) -> 'Enum_LinkType': # pylint: disable=invalid-index-returned
|
185
|
+
"""Numeral registry index of the protocol.
|
186
|
+
|
187
|
+
Returns:
|
188
|
+
Numeral registry index of the protocol in `tcpdump`_ link-layer
|
189
|
+
header types.
|
190
|
+
|
191
|
+
.. _tcpdump: https://www.tcpdump.org/linktypes.html
|
192
|
+
|
193
|
+
"""
|
194
|
+
return Enum_LinkType.ETHERNET # type: ignore[return-value]
|
195
|
+
|
196
|
+
##########################################################################
|
197
|
+
# Utilities.
|
198
|
+
##########################################################################
|
199
|
+
|
200
|
+
@classmethod
|
201
|
+
def _make_data(cls, data: 'Data_Ethernet') -> 'dict[str, Any]': # type: ignore[override]
|
202
|
+
"""Create key-value pairs from ``data`` for protocol construction.
|
203
|
+
|
204
|
+
Args:
|
205
|
+
data: protocol data
|
206
|
+
|
207
|
+
Returns:
|
208
|
+
Key-value pairs for protocol construction.
|
209
|
+
|
210
|
+
"""
|
211
|
+
return {
|
212
|
+
'dst': data.dst,
|
213
|
+
'src': data.src,
|
214
|
+
'type': data.type,
|
215
|
+
'payload': cls._make_payload(data),
|
216
|
+
}
|
217
|
+
|
218
|
+
def _read_mac_addr(self, addr: 'bytes') -> 'str':
|
219
|
+
"""Read MAC address.
|
220
|
+
|
221
|
+
Args:
|
222
|
+
addr: MAC address.
|
223
|
+
|
224
|
+
Returns:
|
225
|
+
Colon (``:``) seperated *hex* encoded MAC address.
|
226
|
+
|
227
|
+
"""
|
228
|
+
if py38:
|
229
|
+
_addr = addr.hex(':')
|
230
|
+
else:
|
231
|
+
_addr = ':'.join(textwrap.wrap(addr.hex(), 2))
|
232
|
+
return _addr
|
233
|
+
|
234
|
+
def _make_mac_addr(self, addr: 'str | bytes | bytearray') -> 'bytes':
|
235
|
+
"""Make MAC address.
|
236
|
+
|
237
|
+
Args:
|
238
|
+
addr: MAC address.
|
239
|
+
|
240
|
+
Returns:
|
241
|
+
MAC address.
|
242
|
+
|
243
|
+
"""
|
244
|
+
_addr = addr.encode() if isinstance(addr, str) else addr
|
245
|
+
|
246
|
+
if PAT_MAC_ADDR.fullmatch(_addr) is not None:
|
247
|
+
return _addr.replace(b':', b'').replace(b'-', b'')
|
248
|
+
raise ProtocolError(f'invalid MAC address: {addr!r}')
|
@@ -0,0 +1,267 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""L2TP - Layer Two Tunnelling Protocol
|
3
|
+
==========================================
|
4
|
+
|
5
|
+
.. module:: pcapkit.protocols.link.l2tp
|
6
|
+
|
7
|
+
:mod:`pcapkit.protocols.link.l2tp` contains
|
8
|
+
:class:`~pcapkit.protocols.link.l2tp.L2TP` only,
|
9
|
+
which implements extractor for Layer Two Tunnelling
|
10
|
+
Protocol (L2TP) [*]_, whose structure is described
|
11
|
+
as below:
|
12
|
+
|
13
|
+
.. table::
|
14
|
+
|
15
|
+
======= ===== ===================== ==========================================
|
16
|
+
Octets Bits Name Description
|
17
|
+
======= ===== ===================== ==========================================
|
18
|
+
0 0 ``l2tp.flags`` Flags and Version Info
|
19
|
+
------- ----- --------------------- ------------------------------------------
|
20
|
+
0 0 ``l2tp.flags.type`` Type (control / data)
|
21
|
+
------- ----- --------------------- ------------------------------------------
|
22
|
+
0 1 ``l2tp.flags.len`` Length
|
23
|
+
------- ----- --------------------- ------------------------------------------
|
24
|
+
0 2 Reserved (must be zero ``x00``)
|
25
|
+
------- ----- --------------------- ------------------------------------------
|
26
|
+
0 4 ``l2tp.flags.seq`` Sequence
|
27
|
+
------- ----- --------------------- ------------------------------------------
|
28
|
+
0 5 Reserved (must be zero ``x00``)
|
29
|
+
------- ----- --------------------- ------------------------------------------
|
30
|
+
0 6 ``l2tp.flags.offset`` Offset
|
31
|
+
------- ----- --------------------- ------------------------------------------
|
32
|
+
0 7 ``l2tp.flags.prio`` Priority
|
33
|
+
------- ----- --------------------- ------------------------------------------
|
34
|
+
1 8 Reserved (must be zero ``x00``)
|
35
|
+
------- ----- --------------------- ------------------------------------------
|
36
|
+
1 12 ``l2tp.ver`` Version (``2``)
|
37
|
+
------- ----- --------------------- ------------------------------------------
|
38
|
+
2 16 ``l2tp.length`` Length (optional by ``len``)
|
39
|
+
------- ----- --------------------- ------------------------------------------
|
40
|
+
4 32 ``l2tp.tunnelid`` Tunnel ID
|
41
|
+
------- ----- --------------------- ------------------------------------------
|
42
|
+
6 48 ``l2tp.sessionid`` Session ID
|
43
|
+
------- ----- --------------------- ------------------------------------------
|
44
|
+
8 64 ``l2tp.ns`` Sequence Number (optional by ``seq``)
|
45
|
+
------- ----- --------------------- ------------------------------------------
|
46
|
+
10 80 ``l2tp.nr`` Next Sequence Number (optional by ``seq``)
|
47
|
+
------- ----- --------------------- ------------------------------------------
|
48
|
+
12 96 ``l2tp.offset`` Offset Size (optional by ``offset``)
|
49
|
+
======= ===== ===================== ==========================================
|
50
|
+
|
51
|
+
.. [*] https://en.wikipedia.org/wiki/Layer_2_Tunneling_Protocol
|
52
|
+
|
53
|
+
"""
|
54
|
+
from typing import TYPE_CHECKING
|
55
|
+
|
56
|
+
from pcapkit.const.l2tp.type import Type as Enum_Type
|
57
|
+
from pcapkit.protocols.data.link.l2tp import L2TP as Data_L2TP
|
58
|
+
from pcapkit.protocols.data.link.l2tp import Flags as Data_Flags
|
59
|
+
from pcapkit.protocols.link.link import Link
|
60
|
+
from pcapkit.protocols.schema.link.l2tp import L2TP as Schema_L2TP
|
61
|
+
from pcapkit.utilities.exceptions import UnsupportedCall
|
62
|
+
|
63
|
+
if TYPE_CHECKING:
|
64
|
+
from enum import IntEnum as StdlibEnum
|
65
|
+
from typing import Any, NoReturn, Optional, Type
|
66
|
+
|
67
|
+
from aenum import IntEnum as AenumEnum
|
68
|
+
from typing_extensions import Literal
|
69
|
+
|
70
|
+
from pcapkit.protocols.protocol import ProtocolBase as Protocol
|
71
|
+
from pcapkit.protocols.schema.schema import Schema
|
72
|
+
|
73
|
+
__all__ = ['L2TP']
|
74
|
+
|
75
|
+
|
76
|
+
class L2TP(Link[Data_L2TP, Schema_L2TP],
|
77
|
+
schema=Schema_L2TP, data=Data_L2TP):
|
78
|
+
"""This class implements Layer Two Tunnelling Protocol."""
|
79
|
+
|
80
|
+
##########################################################################
|
81
|
+
# Properties.
|
82
|
+
##########################################################################
|
83
|
+
|
84
|
+
@property
|
85
|
+
def name(self) -> 'Literal["Layer 2 Tunnelling Protocol"]':
|
86
|
+
"""Name of current protocol."""
|
87
|
+
return 'Layer 2 Tunnelling Protocol'
|
88
|
+
|
89
|
+
@property
|
90
|
+
def length(self) -> 'int':
|
91
|
+
"""Header length of current protocol."""
|
92
|
+
return self._info.hdr_len
|
93
|
+
|
94
|
+
@property
|
95
|
+
def type(self) -> 'Literal["control", "data"]':
|
96
|
+
"""L2TP type."""
|
97
|
+
return self._info.flags.type
|
98
|
+
|
99
|
+
##########################################################################
|
100
|
+
# Methods.
|
101
|
+
##########################################################################
|
102
|
+
|
103
|
+
def read(self, length: 'Optional[int]' = None, **kwargs: 'Any') -> 'Data_L2TP': # pylint: disable=unused-argument
|
104
|
+
"""Read Layer Two Tunnelling Protocol.
|
105
|
+
|
106
|
+
Structure of L2TP header [:rfc:`2661`]:
|
107
|
+
|
108
|
+
.. code-block:: text
|
109
|
+
|
110
|
+
0 1 2 3
|
111
|
+
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
|
112
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
113
|
+
|T|L|x|x|S|x|O|P|x|x|x|x| Ver | Length (opt) |
|
114
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
115
|
+
| Tunnel ID | Session ID |
|
116
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
117
|
+
| Ns (opt) | Nr (opt) |
|
118
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
119
|
+
| Offset Size (opt) | Offset pad... (opt)
|
120
|
+
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
121
|
+
|
122
|
+
Args:
|
123
|
+
length: Length of packet data.
|
124
|
+
**kwargs: Arbitrary keyword arguments.
|
125
|
+
|
126
|
+
Returns:
|
127
|
+
Parsed packet data.
|
128
|
+
|
129
|
+
"""
|
130
|
+
schema = self.__header__
|
131
|
+
_flag = schema.flags
|
132
|
+
|
133
|
+
flags = Data_Flags(
|
134
|
+
type=Enum_Type(_flag['type']),
|
135
|
+
len=bool(_flag['len']),
|
136
|
+
seq=bool(_flag['seq']),
|
137
|
+
offset=bool(_flag['offset']),
|
138
|
+
prio=bool(_flag['prio']),
|
139
|
+
)
|
140
|
+
|
141
|
+
_size = schema.offset if flags.offset else 0
|
142
|
+
hdr_len = 6 + 2 * (flags.len + 2 * flags.seq + flags.offset) + _size
|
143
|
+
|
144
|
+
l2tp = Data_L2TP(
|
145
|
+
flags=flags,
|
146
|
+
version=_flag['version'],
|
147
|
+
length=schema.length if flags.len else None,
|
148
|
+
tunnelid=schema.tunnel_id,
|
149
|
+
sessionid=schema.session_id,
|
150
|
+
ns=schema.ns if flags.seq else None,
|
151
|
+
nr=schema.nr if flags.seq else None,
|
152
|
+
offset=_size if flags.offset else None,
|
153
|
+
)
|
154
|
+
|
155
|
+
l2tp.__update__([
|
156
|
+
('hdr_len', hdr_len),
|
157
|
+
])
|
158
|
+
if _size:
|
159
|
+
self._read_fileng(_size)
|
160
|
+
# l2tp['padding'] = self._read_fileng(_size)
|
161
|
+
|
162
|
+
length = schema.length if flags.len else (length or len(self))
|
163
|
+
return self._decode_next_layer(l2tp, length - hdr_len)
|
164
|
+
|
165
|
+
def make(self,
|
166
|
+
version: 'Literal[2]' = 2,
|
167
|
+
type: 'Enum_Type | StdlibEnum | AenumEnum | str | int' = Enum_Type.Data,
|
168
|
+
type_default: 'Optional[int]' = None,
|
169
|
+
type_namespace: 'Optional[dict[str, int] | dict[int, str] | Type[StdlibEnum] | Type[AenumEnum]]' = None, # pylint: disable=line-too-long
|
170
|
+
type_reversed: 'bool' = False,
|
171
|
+
priority: 'bool' = False,
|
172
|
+
length: 'Optional[int]' = None,
|
173
|
+
tunnel_id: 'int' = 0,
|
174
|
+
session_id: 'int' = 0,
|
175
|
+
ns: 'Optional[int]' = None,
|
176
|
+
nr: 'Optional[int]' = None,
|
177
|
+
offset: 'Optional[int]' = None,
|
178
|
+
payload: 'bytes | Protocol | Schema' = b'',
|
179
|
+
**kwargs: 'Any') -> 'Schema_L2TP': # pylint: disable=unused-argument
|
180
|
+
"""Make (construct) packet data.
|
181
|
+
|
182
|
+
Args:
|
183
|
+
version: L2TP version.
|
184
|
+
type: L2TP type.
|
185
|
+
type_default: Default value of type.
|
186
|
+
type_namespace: Namespace of type.
|
187
|
+
type_reversed: Reversed namespace of type.
|
188
|
+
priority: Priority flag.
|
189
|
+
length: Length of packet data.
|
190
|
+
tunnel_id: Tunnel ID.
|
191
|
+
session_id: Session ID.
|
192
|
+
ns: Sequence number.
|
193
|
+
nr: Acknowledgement number.
|
194
|
+
offset: Offset size.
|
195
|
+
payload: Payload data.
|
196
|
+
**kwargs: Arbitrary keyword arguments.
|
197
|
+
|
198
|
+
Returns:
|
199
|
+
Constructed packet data.
|
200
|
+
|
201
|
+
"""
|
202
|
+
type_ = self._make_index(type, type_default, namespace=type_namespace,
|
203
|
+
reversed=type_reversed, pack=False)
|
204
|
+
|
205
|
+
return Schema_L2TP(
|
206
|
+
flags={
|
207
|
+
'type': type_,
|
208
|
+
'len': length is not None,
|
209
|
+
'seq': ns is not None and nr is not None,
|
210
|
+
'offset': offset is not None,
|
211
|
+
'prio': priority,
|
212
|
+
'version': version,
|
213
|
+
},
|
214
|
+
length=length,
|
215
|
+
tunnel_id=tunnel_id,
|
216
|
+
session_id=session_id,
|
217
|
+
ns=ns,
|
218
|
+
nr=nr,
|
219
|
+
offset=offset,
|
220
|
+
payload=payload,
|
221
|
+
)
|
222
|
+
|
223
|
+
##########################################################################
|
224
|
+
# Data models.
|
225
|
+
##########################################################################
|
226
|
+
|
227
|
+
def __length_hint__(self) -> 'Literal[16]':
|
228
|
+
"""Return an estimated length for the object."""
|
229
|
+
return 16
|
230
|
+
|
231
|
+
@classmethod
|
232
|
+
def __index__(cls) -> 'NoReturn': # pylint: disable=invalid-index-returned
|
233
|
+
"""Numeral registry index of the protocol.
|
234
|
+
|
235
|
+
Raises:
|
236
|
+
UnsupportedCall: This protocol has no registry entry.
|
237
|
+
|
238
|
+
"""
|
239
|
+
raise UnsupportedCall(f'{cls.__name__!r} object cannot be interpreted as an integer')
|
240
|
+
|
241
|
+
##########################################################################
|
242
|
+
# Utilities.
|
243
|
+
##########################################################################
|
244
|
+
|
245
|
+
@classmethod
|
246
|
+
def _make_data(cls, data: 'Data_L2TP') -> 'dict[str, Any]': # type: ignore[override]
|
247
|
+
"""Create key-value pairs from ``data`` for protocol construction.
|
248
|
+
|
249
|
+
Args:
|
250
|
+
data: protocol data
|
251
|
+
|
252
|
+
Returns:
|
253
|
+
Key-value pairs for protocol construction.
|
254
|
+
|
255
|
+
"""
|
256
|
+
return {
|
257
|
+
'type': data.flags.type,
|
258
|
+
'prio': data.flags.prio,
|
259
|
+
'version': data.version,
|
260
|
+
'length': data.length,
|
261
|
+
'tunnel_id': data.tunnelid,
|
262
|
+
'session_id': data.sessionid,
|
263
|
+
'ns': data.ns,
|
264
|
+
'nr': data.nr,
|
265
|
+
'offset': data.offset,
|
266
|
+
'payload': cls._make_payload(data),
|
267
|
+
}
|
@@ -0,0 +1,140 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# mypy: disable-error-code=dict-item
|
3
|
+
"""Base Protocol
|
4
|
+
===================
|
5
|
+
|
6
|
+
.. module:: pcapkit.protocols.link.link
|
7
|
+
|
8
|
+
:mod:`pcapkit.protocols.link.link` contains
|
9
|
+
:class:`~pcapkit.protocols.link.link.Link`,
|
10
|
+
which is a base class for link layer protocols, e.g.
|
11
|
+
:class:`~pcapkit.protocols.link.arp.ARP`/:class:`~pcapkit.protocols.link.arp.InARP`,
|
12
|
+
:class:`~pcapkit.protocols.link.ethernet.Ethernet`,
|
13
|
+
:class:`~pcapkit.protocols.link.l2tp.L2TP`,
|
14
|
+
:class:`~pcapkit.protocols.link.ospf.OSPF`,
|
15
|
+
:class:`~pcapkit.protocols.link.rarp.RARP`/:class:`~pcapkit.protocols.link.rarp.DRARP`
|
16
|
+
and etc.
|
17
|
+
|
18
|
+
"""
|
19
|
+
import collections
|
20
|
+
from typing import TYPE_CHECKING, Generic
|
21
|
+
|
22
|
+
from pcapkit.const.reg.ethertype import EtherType as Enum_EtherType
|
23
|
+
from pcapkit.corekit.module import ModuleDescriptor
|
24
|
+
from pcapkit.protocols.protocol import _PT, _ST
|
25
|
+
from pcapkit.protocols.protocol import ProtocolBase as Protocol
|
26
|
+
from pcapkit.utilities.exceptions import RegistryError
|
27
|
+
from pcapkit.utilities.warnings import RegistryWarning, warn
|
28
|
+
|
29
|
+
if TYPE_CHECKING:
|
30
|
+
from typing import DefaultDict, Type
|
31
|
+
|
32
|
+
from typing_extensions import Literal
|
33
|
+
|
34
|
+
__all__ = ['Link']
|
35
|
+
|
36
|
+
|
37
|
+
class Link(Protocol[_PT, _ST], Generic[_PT, _ST]): # pylint: disable=abstract-method
|
38
|
+
"""Abstract base class for link layer protocol family.
|
39
|
+
|
40
|
+
This class currently supports parsing of the following protocols, which are
|
41
|
+
registered in the :attr:`self.__proto__ <pcapkit.protocols.link.link.Link.__proto__>`
|
42
|
+
attribute:
|
43
|
+
|
44
|
+
.. list-table::
|
45
|
+
:header-rows: 1
|
46
|
+
|
47
|
+
* - Index
|
48
|
+
- Protocol
|
49
|
+
* - :attr:`~pcapkit.const.reg.ethertype.EtherType.Address_Resolution_Protocol`
|
50
|
+
- :class:`pcapkit.protocols.link.arp.ARP`
|
51
|
+
* - :attr:`~pcapkit.const.reg.ethertype.EtherType.Reverse_Address_Resolution_Protocol`
|
52
|
+
- :class:`pcapkit.protocols.link.rarp.RARP`
|
53
|
+
* - :attr:`~pcapkit.const.reg.ethertype.EtherType.Customer_VLAN_Tag_Type`
|
54
|
+
- :class:`pcapkit.protocols.link.vlan.VLAN`
|
55
|
+
* - :attr:`~pcapkit.const.reg.ethertype.EtherType.Internet_Protocol_version_4`
|
56
|
+
- :class:`pcapkit.protocols.internet.ipv4.IPv4`
|
57
|
+
* - :attr:`~pcapkit.const.reg.ethertype.EtherType.Internet_Protocol_version_6`
|
58
|
+
- :class:`pcapkit.protocols.internet.ipv6.IPv6`
|
59
|
+
* - 0x8137
|
60
|
+
- :class:`pcapkit.protocols.internet.ipx.IPX`
|
61
|
+
|
62
|
+
"""
|
63
|
+
|
64
|
+
##########################################################################
|
65
|
+
# Defaults.
|
66
|
+
##########################################################################
|
67
|
+
|
68
|
+
#: Layer of protocol.
|
69
|
+
__layer__ = 'Link' # type: Literal['Link']
|
70
|
+
|
71
|
+
#: DefaultDict[int, ModuleDescriptor[Protocol] | Type[Protocol]]: Protocol index mapping for decoding next layer,
|
72
|
+
#: c.f. :meth:`self._decode_next_layer <pcapkit.protocols.protocol.Protocol._decode_next_layer>`
|
73
|
+
#: & :meth:`self._import_next_layer <pcapkit.protocols.protocol.Protocol._import_next_layer>`.
|
74
|
+
__proto__ = collections.defaultdict(
|
75
|
+
lambda: ModuleDescriptor('pcapkit.protocols.misc.raw', 'Raw'),
|
76
|
+
{
|
77
|
+
Enum_EtherType.Address_Resolution_Protocol: ModuleDescriptor('pcapkit.protocols.link.arp', 'ARP'),
|
78
|
+
Enum_EtherType.Reverse_Address_Resolution_Protocol: ModuleDescriptor('pcapkit.protocols.link.rarp', 'RARP'),
|
79
|
+
Enum_EtherType.Customer_VLAN_Tag_Type: ModuleDescriptor('pcapkit.protocols.link.vlan', 'VLAN'),
|
80
|
+
Enum_EtherType.Internet_Protocol_version_4: ModuleDescriptor('pcapkit.protocols.internet.ipv4', 'IPv4'),
|
81
|
+
Enum_EtherType.Internet_Protocol_version_6: ModuleDescriptor('pcapkit.protocols.internet.ipv6', 'IPv6'),
|
82
|
+
|
83
|
+
# c.f., https://en.wikipedia.org/wiki/EtherType#Values
|
84
|
+
0x8137: ModuleDescriptor('pcapkit.protocols.internet.ipx', 'IPX'),
|
85
|
+
},
|
86
|
+
) # type: DefaultDict[int | Enum_EtherType, ModuleDescriptor[Protocol] | Type[Protocol]]
|
87
|
+
|
88
|
+
##########################################################################
|
89
|
+
# Properties.
|
90
|
+
##########################################################################
|
91
|
+
|
92
|
+
# protocol layer
|
93
|
+
@property
|
94
|
+
def layer(self) -> 'Literal["Link"]':
|
95
|
+
"""Protocol layer."""
|
96
|
+
return self.__layer__
|
97
|
+
|
98
|
+
##########################################################################
|
99
|
+
# Methods.
|
100
|
+
##########################################################################
|
101
|
+
|
102
|
+
@classmethod
|
103
|
+
def register(cls, code: 'Enum_EtherType', protocol: 'ModuleDescriptor[Protocol] | Type[Protocol]') -> 'None': # type: ignore[override]
|
104
|
+
r"""Register a new protocol class.
|
105
|
+
|
106
|
+
Notes:
|
107
|
+
The full qualified class name of the new protocol class
|
108
|
+
should be as ``{protocol.module}.{protocol.name}``.
|
109
|
+
|
110
|
+
Arguments:
|
111
|
+
code: protocol code as in :class:`~pcapkit.const.reg.ethertype.EtherType`
|
112
|
+
protocol: module descriptor or a
|
113
|
+
:class:`~pcapkit.protocols.protocol.Protocol` subclass
|
114
|
+
|
115
|
+
"""
|
116
|
+
if isinstance(protocol, ModuleDescriptor):
|
117
|
+
protocol = protocol.klass
|
118
|
+
if not issubclass(protocol, Protocol):
|
119
|
+
raise RegistryError(f'protocol must be a Protocol subclass, not {protocol!r}')
|
120
|
+
if code in cls.__proto__:
|
121
|
+
warn(f'protocol {code} already registered, overwriting', RegistryWarning)
|
122
|
+
cls.__proto__[code] = protocol
|
123
|
+
|
124
|
+
##########################################################################
|
125
|
+
# Utilities.
|
126
|
+
##########################################################################
|
127
|
+
|
128
|
+
def _read_protos(self, size: int) -> 'Enum_EtherType':
|
129
|
+
"""Read next layer protocol type.
|
130
|
+
|
131
|
+
Arguments:
|
132
|
+
size: buffer size
|
133
|
+
|
134
|
+
Returns:
|
135
|
+
Internet layer protocol enumeration.
|
136
|
+
|
137
|
+
"""
|
138
|
+
_byte = self._read_unpack(size)
|
139
|
+
_prot = Enum_EtherType.get(_byte)
|
140
|
+
return _prot
|