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,79 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""Verdict Types
|
3
|
+
===================
|
4
|
+
|
5
|
+
.. module:: pcapkit.vendor.pcapng.verdict_type
|
6
|
+
|
7
|
+
This module contains the vendor crawler for **Verdict Types**,
|
8
|
+
which is automatically generating :class:`pcapkit.const.pcapng.verdict_type.VerdictType`.
|
9
|
+
|
10
|
+
"""
|
11
|
+
|
12
|
+
import collections
|
13
|
+
import sys
|
14
|
+
from typing import TYPE_CHECKING
|
15
|
+
|
16
|
+
from pcapkit.vendor.default import Vendor
|
17
|
+
|
18
|
+
if TYPE_CHECKING:
|
19
|
+
from collections import Counter
|
20
|
+
|
21
|
+
__all__ = ['VerdictType']
|
22
|
+
|
23
|
+
#: Verdict type registry.
|
24
|
+
DATA = {
|
25
|
+
0: 'Hardware',
|
26
|
+
1: 'Linux_eBPF_TC',
|
27
|
+
2: 'Linux_eBPF_XDP',
|
28
|
+
} # type: dict[int, str]
|
29
|
+
|
30
|
+
|
31
|
+
class VerdictType(Vendor):
|
32
|
+
"""Verdict Types"""
|
33
|
+
|
34
|
+
#: Value limit checker.
|
35
|
+
FLAG = 'isinstance(value, int) and 0x00 <= value <= 0xFF'
|
36
|
+
|
37
|
+
def request(self) -> 'dict[int, str]': # type: ignore[override] # pylint: disable=arguments-differ
|
38
|
+
"""Fetch registry data.
|
39
|
+
|
40
|
+
Returns:
|
41
|
+
Registry data (:data:`~pcapkit.vendor.pcapng.verdict_type.DATA`).
|
42
|
+
|
43
|
+
"""
|
44
|
+
return DATA
|
45
|
+
|
46
|
+
def count(self, data: 'dict[int, str]') -> 'Counter[str]': # type: ignore[override]
|
47
|
+
"""Count field records.
|
48
|
+
|
49
|
+
Args:
|
50
|
+
data: Registry data.
|
51
|
+
|
52
|
+
Returns:
|
53
|
+
Field recordings.
|
54
|
+
|
55
|
+
"""
|
56
|
+
return collections.Counter(map(self.safe_name, data.values()))
|
57
|
+
|
58
|
+
def process(self, data: 'dict[int, str]') -> 'tuple[list[str], list[str]]': # type: ignore[override]
|
59
|
+
"""Process registry data.
|
60
|
+
|
61
|
+
Args:
|
62
|
+
data: Registry data.
|
63
|
+
|
64
|
+
Returns:
|
65
|
+
Enumeration fields and missing fields.
|
66
|
+
|
67
|
+
"""
|
68
|
+
enum = [] # type: list[str]
|
69
|
+
miss = [
|
70
|
+
"return extend_enum(cls, 'Unassigned_%d' % value, value)",
|
71
|
+
]
|
72
|
+
for code, name in DATA.items():
|
73
|
+
renm = self.rename(name, code) # type: ignore[arg-type]
|
74
|
+
enum.append(f"{renm} = {code}".ljust(76))
|
75
|
+
return enum, miss
|
76
|
+
|
77
|
+
|
78
|
+
if __name__ == '__main__':
|
79
|
+
sys.exit(VerdictType()) # type: ignore[arg-type]
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# pylint: disable=unused-import
|
3
|
+
"""Protocol Type Registry Vendor Crawlers
|
4
|
+
============================================
|
5
|
+
|
6
|
+
.. module:: pcapkit.vendor.reg
|
7
|
+
|
8
|
+
This module contains all vendor crawlers of protocol type registry
|
9
|
+
implementations. Available enumerations include:
|
10
|
+
|
11
|
+
.. list-table::
|
12
|
+
|
13
|
+
* - :class:`LINKTYPE <pcapkit.vendor.reg.linktype.LinkType>`
|
14
|
+
- Link-Layer Header Type Values [*]_
|
15
|
+
* - :class:`ETHERTYPE <pcapkit.vendor.reg.ethertype.EtherType>`
|
16
|
+
- Ethertype IEEE 802 Numbers [*]_
|
17
|
+
* - :class:`TRANSTYPE <pcapkit.vendor.reg.transtype.TransType>`
|
18
|
+
- Transport Layer Protocol Numbers [*]_
|
19
|
+
* - :class:`APPTYPE <pcapkit.vendor.reg.apptype.AppType>`
|
20
|
+
- Application Layer Protocol Numbers (Service Name and Transport Protocol Port Number Registry) [*]_
|
21
|
+
|
22
|
+
.. [*] http://www.tcpdump.org/linktypes.html
|
23
|
+
.. [*] https://www.iana.org/assignments/ieee-802-numbers/ieee-802-numbers.xhtml#ieee-802-numbers-1
|
24
|
+
.. [*] https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml#protocol-numbers-1
|
25
|
+
.. [*] https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml?
|
26
|
+
|
27
|
+
"""
|
28
|
+
|
29
|
+
from pcapkit.vendor.reg.apptype import AppType
|
30
|
+
from pcapkit.vendor.reg.ethertype import EtherType
|
31
|
+
from pcapkit.vendor.reg.linktype import LinkType
|
32
|
+
from pcapkit.vendor.reg.transtype import TransType
|
33
|
+
|
34
|
+
__all__ = ['EtherType', 'LinkType', 'TransType', 'AppType']
|
@@ -0,0 +1,338 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""Application Layer Protocol Numbers
|
3
|
+
========================================
|
4
|
+
|
5
|
+
.. module:: pcapkit.vendor.reg.apptype
|
6
|
+
|
7
|
+
This module contains the vendor crawler for **Application Layer Protocol Numbers**,
|
8
|
+
which is automatically generating :class:`pcapkit.const.reg.apptype.AppType`.
|
9
|
+
|
10
|
+
"""
|
11
|
+
|
12
|
+
import collections
|
13
|
+
import csv
|
14
|
+
import keyword
|
15
|
+
import re
|
16
|
+
import sys
|
17
|
+
import textwrap
|
18
|
+
from typing import TYPE_CHECKING, Callable
|
19
|
+
|
20
|
+
from pcapkit.vendor.default import Vendor
|
21
|
+
|
22
|
+
if TYPE_CHECKING:
|
23
|
+
from collections import Counter, OrderedDict
|
24
|
+
from typing import Callable
|
25
|
+
|
26
|
+
__all__ = ['AppType']
|
27
|
+
|
28
|
+
LINE = lambda NAME, DOCS, FLAG, ENUM, MISS, MODL: f'''\
|
29
|
+
# -*- coding: utf-8 -*-
|
30
|
+
# mypy: disable-error-code=assignment
|
31
|
+
# pylint: disable=line-too-long,consider-using-f-string
|
32
|
+
"""{(name := DOCS.split(' [', maxsplit=1)[0])}
|
33
|
+
{'=' * (len(name) + 6)}
|
34
|
+
|
35
|
+
.. module:: {MODL.replace('vendor', 'const')}
|
36
|
+
|
37
|
+
This module contains the constant enumeration for **{name}**,
|
38
|
+
which is automatically generated from :class:`{MODL}.{NAME}`.
|
39
|
+
|
40
|
+
"""
|
41
|
+
from collections import defaultdict
|
42
|
+
from typing import TYPE_CHECKING
|
43
|
+
|
44
|
+
from aenum import IntFlag, StrEnum, auto, extend_enum
|
45
|
+
|
46
|
+
from pcapkit.utilities.compat import show_flag_values
|
47
|
+
|
48
|
+
__all__ = ['{NAME}']
|
49
|
+
|
50
|
+
if TYPE_CHECKING:
|
51
|
+
from typing import Any, DefaultDict, Type
|
52
|
+
|
53
|
+
|
54
|
+
class TransportProtocol(IntFlag):
|
55
|
+
"""Transport layer protocol."""
|
56
|
+
|
57
|
+
undefined = 0
|
58
|
+
|
59
|
+
#: Transmission Control Protocol.
|
60
|
+
tcp = auto()
|
61
|
+
#: User Datagram Protocol.
|
62
|
+
udp = auto()
|
63
|
+
#: Stream Control Transmission Protocol.
|
64
|
+
sctp = auto()
|
65
|
+
#: Datagram Congestion Control Protocol.
|
66
|
+
dccp = auto()
|
67
|
+
|
68
|
+
@staticmethod
|
69
|
+
def get(key: 'int | str') -> 'TransportProtocol':
|
70
|
+
"""Backport support for original codes.
|
71
|
+
|
72
|
+
Args:
|
73
|
+
key: Key to get enum item.
|
74
|
+
|
75
|
+
:meta private:
|
76
|
+
"""
|
77
|
+
if isinstance(key, int):
|
78
|
+
return TransportProtocol(key)
|
79
|
+
if key.lower() in TransportProtocol.__members__:
|
80
|
+
return TransportProtocol[key.lower()] # type: ignore[misc]
|
81
|
+
max_val = max(TransportProtocol.__members__.values())
|
82
|
+
return extend_enum(TransportProtocol, key.lower(), max_val * 2)
|
83
|
+
|
84
|
+
|
85
|
+
class {NAME}(StrEnum):
|
86
|
+
"""[{NAME}] {DOCS}"""
|
87
|
+
|
88
|
+
if TYPE_CHECKING:
|
89
|
+
#: Service name.
|
90
|
+
svc: 'str'
|
91
|
+
#: Port number.
|
92
|
+
port: 'int'
|
93
|
+
#: Transport protocol.
|
94
|
+
proto: 'TransportProtocol'
|
95
|
+
|
96
|
+
#: Mapping of members based on transport protocol.
|
97
|
+
__members_proto__: 'DefaultDict[TransportProtocol, dict[int, {NAME}]]' = defaultdict(dict)
|
98
|
+
|
99
|
+
def __new__(cls, value: 'int', name: 'str' = '<null>',
|
100
|
+
proto: 'TransportProtocol' = TransportProtocol.undefined) -> 'Type[{NAME}]':
|
101
|
+
temp = '%s [%d - %s]' % (name, value, proto.name)
|
102
|
+
|
103
|
+
obj = str.__new__(cls, temp)
|
104
|
+
obj._value_ = temp
|
105
|
+
|
106
|
+
obj.svc = name
|
107
|
+
obj.port = value
|
108
|
+
obj.proto = proto
|
109
|
+
|
110
|
+
for namespace in show_flag_values(proto):
|
111
|
+
cls.__members_proto__[TransportProtocol(namespace)][value] = obj
|
112
|
+
if proto is TransportProtocol.undefined:
|
113
|
+
cls.__members_proto__[proto][value] = obj
|
114
|
+
|
115
|
+
return obj
|
116
|
+
|
117
|
+
def __repr__(self) -> 'str':
|
118
|
+
return "<%s.%s: %d [%s]>" % (self.__class__.__name__, self.svc, self.port, self.proto.name)
|
119
|
+
|
120
|
+
def __str__(self) -> 'str':
|
121
|
+
return '%s [%d - %s]' % (self.svc, self.port, self.proto.name)
|
122
|
+
|
123
|
+
def __int__(self) -> 'int':
|
124
|
+
return self.port
|
125
|
+
|
126
|
+
def __lt__(self, other: '{NAME}') -> 'bool':
|
127
|
+
return self.port < other
|
128
|
+
|
129
|
+
def __gt__(self, other: '{NAME}') -> 'bool':
|
130
|
+
return self.port > other
|
131
|
+
|
132
|
+
def __le__(self, other: '{NAME}') -> 'bool':
|
133
|
+
return self.port <= other
|
134
|
+
|
135
|
+
def __ge__(self, other: '{NAME}') -> 'bool':
|
136
|
+
return self.port >= other
|
137
|
+
|
138
|
+
def __eq__(self, other: 'Any') -> 'bool':
|
139
|
+
return self.port == other
|
140
|
+
|
141
|
+
def __ne__(self, other: 'Any') -> 'bool':
|
142
|
+
return self.port != other
|
143
|
+
|
144
|
+
def __hash__(self) -> 'int':
|
145
|
+
return hash(self.port)
|
146
|
+
|
147
|
+
{ENUM}
|
148
|
+
|
149
|
+
@staticmethod
|
150
|
+
def get(key: 'int | str', default: 'int' = -1, *,
|
151
|
+
proto: 'TransportProtocol | str' = TransportProtocol.undefined) -> '{NAME}':
|
152
|
+
"""Backport support for original codes.
|
153
|
+
|
154
|
+
Args:
|
155
|
+
key: Key to get enum item.
|
156
|
+
default: Default value if not found.
|
157
|
+
proto: Transport protocol of the enum item.
|
158
|
+
|
159
|
+
:meta private:
|
160
|
+
"""
|
161
|
+
if isinstance(key, int):
|
162
|
+
if isinstance(proto, str):
|
163
|
+
proto = TransportProtocol.get(proto.lower())
|
164
|
+
temp_ns = {NAME}.__members_proto__.get(proto, {{}})
|
165
|
+
if key in temp_ns:
|
166
|
+
return temp_ns[key]
|
167
|
+
try:
|
168
|
+
ret = {NAME}._missing_(key)
|
169
|
+
if ret is None:
|
170
|
+
raise ValueError
|
171
|
+
except ValueError:
|
172
|
+
|
173
|
+
ret = extend_enum({NAME}, 'PORT_%d_%s' % (key, proto.name), key, 'unknown', proto)
|
174
|
+
return ret
|
175
|
+
if key in {NAME}.__members_proto__:
|
176
|
+
return getattr({NAME}, key)
|
177
|
+
return extend_enum({NAME}, key, default, key)
|
178
|
+
|
179
|
+
@classmethod
|
180
|
+
def _missing_(cls, value: 'int') -> '{NAME}':
|
181
|
+
"""Lookup function used when value is not found.
|
182
|
+
|
183
|
+
Args:
|
184
|
+
value: Value to get enum item.
|
185
|
+
|
186
|
+
"""
|
187
|
+
if not ({FLAG}):
|
188
|
+
raise ValueError('%r is not a valid %s' % (value, cls.__name__))
|
189
|
+
if value in cls.__members_proto__.get(TransportProtocol.undefined, {{}}): # type: ignore[call-overload]
|
190
|
+
return cls.__members_proto__[TransportProtocol.undefined][value] # type: ignore[index]
|
191
|
+
{MISS}
|
192
|
+
{'' if ''.join(MISS.splitlines()[-1:]).startswith('return') else 'return super()._missing_(value)'}
|
193
|
+
'''.strip() # type: Callable[[str, str, str, str, str, str], str]
|
194
|
+
|
195
|
+
|
196
|
+
class AppType(Vendor):
|
197
|
+
"""Application Layer Protocol Numbers"""
|
198
|
+
|
199
|
+
#: Value limit checker.
|
200
|
+
FLAG = 'isinstance(value, int) and 0 <= value <= 65535'
|
201
|
+
#: Link to registry.
|
202
|
+
LINK = 'https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.csv'
|
203
|
+
|
204
|
+
def count(self, data: 'list[str]') -> 'Counter[str]':
|
205
|
+
"""Count field records."""
|
206
|
+
reader = csv.reader(data)
|
207
|
+
next(reader) # header
|
208
|
+
return collections.Counter(map(lambda item: '[%s] %s' % (item[2], item[0].strip() or self.safe_name(item[3].strip())),
|
209
|
+
filter(lambda item: len(item[1].split('-')) != 2, reader)))
|
210
|
+
|
211
|
+
@staticmethod
|
212
|
+
def wrap_comment(text: 'str') -> 'str':
|
213
|
+
"""Wraps long-length text to shorter lines of comments.
|
214
|
+
|
215
|
+
Args:
|
216
|
+
text: Source text.
|
217
|
+
|
218
|
+
Returns:
|
219
|
+
Wrapped comments.
|
220
|
+
|
221
|
+
"""
|
222
|
+
return '\n #: '.join(textwrap.wrap(text.strip(), 76))
|
223
|
+
|
224
|
+
def process(self, data: 'list[str]') -> 'tuple[list[str], list[str]]':
|
225
|
+
"""Process registry data.
|
226
|
+
|
227
|
+
Args:
|
228
|
+
data: Registry data.
|
229
|
+
|
230
|
+
Returns:
|
231
|
+
Enumeration fields and missing fields.
|
232
|
+
|
233
|
+
"""
|
234
|
+
reader = csv.reader(data)
|
235
|
+
next(reader) # header
|
236
|
+
|
237
|
+
enum = [] # type: list[str]
|
238
|
+
miss = [] # type: list[str]
|
239
|
+
|
240
|
+
line = collections.OrderedDict() # type: OrderedDict[str, list[str]]
|
241
|
+
for item in reader:
|
242
|
+
svc = item[0].strip().lower() or self.safe_name(item[3].strip()).lower()
|
243
|
+
port = item[1].strip() or '-1'
|
244
|
+
proto = 'TransportProtocol.get(%r)' % (item[2].strip().lower() or 'undefined')
|
245
|
+
desc = item[3].strip()
|
246
|
+
|
247
|
+
temp = [] # type: list[str]
|
248
|
+
#for rfc in filter(lambda s: 'RFC' in s, re.split(r'\[|\]', item[8])):
|
249
|
+
# temp.append(f'[{rfc[:3]} {rfc[3:]}]')
|
250
|
+
for rfc in filter(None, map(lambda s: s.strip(), re.split(r'\[|\]', item[8]))):
|
251
|
+
if 'RFC' in rfc and re.match(r'\d+', rfc[3:]):
|
252
|
+
match = re.fullmatch(r'RFC(?P<rfc>\d+)(, Section (?P<sec>.*?))?', rfc)
|
253
|
+
if match is None:
|
254
|
+
temp.append(f'[{rfc}]')
|
255
|
+
else:
|
256
|
+
if match.group('sec') is not None:
|
257
|
+
temp.append(f'[:rfc:`{match.group("rfc")}#{match.group("sec")}`]')
|
258
|
+
else:
|
259
|
+
temp.append(f'[:rfc:`{match.group("rfc")}`]')
|
260
|
+
else:
|
261
|
+
temp.append(f'[{rfc}]'.replace('_', ' '))
|
262
|
+
cmmt = self.wrap_comment(re.sub(r'\s+', r' ',
|
263
|
+
'[%s] %s %s' % (item[2].strip().upper() or 'N/A',
|
264
|
+
desc, ''.join(temp)))) # pylint: disable=consider-using-f-string
|
265
|
+
|
266
|
+
try:
|
267
|
+
code, _ = port, int(port)
|
268
|
+
if port == '-1':
|
269
|
+
code = 'null'
|
270
|
+
renm = self.rename(svc, code)
|
271
|
+
|
272
|
+
if f'{renm}_{code}' in line:
|
273
|
+
renm = f'{renm}_{code}'
|
274
|
+
|
275
|
+
if renm in line:
|
276
|
+
if port == line[renm][1]:
|
277
|
+
line[renm][2] = f'{line[renm][2]} | {proto}'
|
278
|
+
if line[renm][3].startswith('-'):
|
279
|
+
line[renm][3] = f'{line[renm][3]}\n #: - {cmmt}'
|
280
|
+
else:
|
281
|
+
line[renm][3] = f'- {line[renm][3]}\n #: - {cmmt}'
|
282
|
+
else:
|
283
|
+
line[f'{renm}_{line[renm][1]}'] = line[renm]
|
284
|
+
line[f'{renm}_{code}'] = [svc, port, proto, cmmt]
|
285
|
+
del line[renm]
|
286
|
+
else:
|
287
|
+
line[renm] = [svc, port, proto, cmmt]
|
288
|
+
|
289
|
+
# if port == '-1':
|
290
|
+
# continue
|
291
|
+
# proto_name = item[2].strip().lower()
|
292
|
+
|
293
|
+
# if proto_name:
|
294
|
+
# renm = f'PORT_{code}_{proto_name}'
|
295
|
+
# else:
|
296
|
+
# renm = f'PORT_{code}'
|
297
|
+
# line[renm] = [svc, code, proto, cmmt]
|
298
|
+
except ValueError:
|
299
|
+
start, stop = port.split('-')
|
300
|
+
|
301
|
+
miss.append(f'if {start} <= value <= {stop}:')
|
302
|
+
miss.append(f' #: {cmmt}')
|
303
|
+
miss.append(f" return extend_enum(cls, '{self.safe_name(svc)}_%d' % value, value, {svc!r}, {proto})")
|
304
|
+
|
305
|
+
for key, (svc, code, proto, cmmt) in line.items():
|
306
|
+
if keyword.iskeyword(key):
|
307
|
+
key = '%s_' % key
|
308
|
+
|
309
|
+
pres = f"{key}: 'AppType' = {code}, {svc!r}, {proto}"
|
310
|
+
if cmmt.startswith('-'):
|
311
|
+
sufs = f'#: {cmmt}'
|
312
|
+
else:
|
313
|
+
sufs = '#: %s' % cmmt.replace(' #: ', ' #: ')
|
314
|
+
|
315
|
+
enum.append(f'{sufs}\n {pres}')
|
316
|
+
|
317
|
+
return enum, miss
|
318
|
+
|
319
|
+
def context(self, data: 'list[str]') -> 'str':
|
320
|
+
"""Generate constant context.
|
321
|
+
|
322
|
+
Args:
|
323
|
+
data: CSV data.
|
324
|
+
|
325
|
+
Returns:
|
326
|
+
Constant context.
|
327
|
+
|
328
|
+
"""
|
329
|
+
enum, miss = self.process(data)
|
330
|
+
|
331
|
+
ENUM = '\n\n '.join(map(lambda s: s.rstrip(), enum)).strip()
|
332
|
+
MISS = '\n '.join(map(lambda s: s.rstrip(), miss)).strip()
|
333
|
+
|
334
|
+
return LINE(self.NAME, self.DOCS, self.FLAG, ENUM, MISS, self.__module__)
|
335
|
+
|
336
|
+
|
337
|
+
if __name__ == '__main__':
|
338
|
+
sys.exit(AppType()) # type: ignore[arg-type]
|
@@ -0,0 +1,121 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""Ethertype IEEE 802 Numbers
|
3
|
+
================================
|
4
|
+
|
5
|
+
.. module:: pcapkit.vendor.reg.ethertype
|
6
|
+
|
7
|
+
This module contains the vendor crawler for **Ethertype IEEE 802 Numbers**,
|
8
|
+
which is automatically generating :class:`pcapkit.const.reg.ethertype.EtherType`.
|
9
|
+
|
10
|
+
"""
|
11
|
+
|
12
|
+
import collections
|
13
|
+
import csv
|
14
|
+
import re
|
15
|
+
import sys
|
16
|
+
from typing import TYPE_CHECKING
|
17
|
+
|
18
|
+
from pcapkit.vendor.default import Vendor
|
19
|
+
|
20
|
+
if TYPE_CHECKING:
|
21
|
+
from collections import Counter
|
22
|
+
from typing import Optional
|
23
|
+
|
24
|
+
__all__ = ['EtherType']
|
25
|
+
|
26
|
+
|
27
|
+
class EtherType(Vendor):
|
28
|
+
"""Ethertype IEEE 802 Numbers"""
|
29
|
+
|
30
|
+
#: Value limit checker.
|
31
|
+
FLAG = 'isinstance(value, int) and 0x0000 <= value <= 0xFFFF'
|
32
|
+
#: Link to registry.
|
33
|
+
LINK = 'https://www.iana.org/assignments/ieee-802-numbers/ieee-802-numbers-1.csv'
|
34
|
+
|
35
|
+
def count(self, data: 'list[str]') -> 'Counter[str]':
|
36
|
+
"""Count field records.
|
37
|
+
|
38
|
+
Args:
|
39
|
+
data: CSV data.
|
40
|
+
|
41
|
+
Returns:
|
42
|
+
Field recordings.
|
43
|
+
|
44
|
+
"""
|
45
|
+
reader = csv.reader(data)
|
46
|
+
next(reader) # header
|
47
|
+
return collections.Counter(map(lambda item: self.safe_name(item[4]),
|
48
|
+
filter(lambda item: len(item[1].split('-')) != 2, reader)))
|
49
|
+
|
50
|
+
def rename(self, name: 'str', code: 'str', *, original: 'Optional[str]' = None) -> 'str': # pylint: disable=redefined-outer-name
|
51
|
+
"""Rename duplicated fields.
|
52
|
+
|
53
|
+
Args:
|
54
|
+
name: Field name.
|
55
|
+
code: Field code.
|
56
|
+
|
57
|
+
Keyword Args:
|
58
|
+
original: Original field name (extracted from CSV records).
|
59
|
+
|
60
|
+
Returns:
|
61
|
+
Revised field name.
|
62
|
+
|
63
|
+
"""
|
64
|
+
if self.record[self.safe_name(name)] > 1:
|
65
|
+
name = f'{name}_0x{code}'
|
66
|
+
return self.safe_name(name)
|
67
|
+
|
68
|
+
def process(self, data: 'list[str]') -> 'tuple[list[str], list[str]]':
|
69
|
+
"""Process CSV data.
|
70
|
+
|
71
|
+
Args:
|
72
|
+
data: CSV data.
|
73
|
+
|
74
|
+
Returns:
|
75
|
+
Enumeration fields and missing fields.
|
76
|
+
|
77
|
+
"""
|
78
|
+
reader = csv.reader(data)
|
79
|
+
next(reader) # header
|
80
|
+
|
81
|
+
enum = [] # type: list[str]
|
82
|
+
miss = [] # type: list[str]
|
83
|
+
for item in reader:
|
84
|
+
name = item[4]
|
85
|
+
rfcs = item[5]
|
86
|
+
|
87
|
+
temp = [] # type: list[str]
|
88
|
+
for rfc in filter(None, re.split(r'\[|\]', rfcs)):
|
89
|
+
if 'RFC' in rfc and re.match(r'\d+', rfc[3:]):
|
90
|
+
#temp.append(f'[{rfc[:3]} {rfc[3:]}]')
|
91
|
+
temp.append(f'[:rfc:`{rfc[3:]}`]')
|
92
|
+
else:
|
93
|
+
temp.append(f'[{rfc}]'.replace('_', ' '))
|
94
|
+
tmp1 = re.sub(r'( )( )*', ' ', f"{''.join(temp)}".replace('\n', ' ')) if rfcs else ''
|
95
|
+
tmp2 = re.sub(r'\r*\n', ' ', tmp1, re.MULTILINE)
|
96
|
+
tmp3 = name.replace('\n', ' ')
|
97
|
+
desc = self.wrap_comment(f"{tmp3} {tmp2}")
|
98
|
+
|
99
|
+
try:
|
100
|
+
code, _ = item[1], int(item[1], base=16)
|
101
|
+
renm = re.sub(r'( )( )*', ' ', self.rename(name, code).replace('\n', ' '))
|
102
|
+
|
103
|
+
pres = f'{renm} = 0x{code}'
|
104
|
+
sufs = f'#: {desc}'
|
105
|
+
|
106
|
+
# if len(pres) > 74:
|
107
|
+
# sufs = f"\n{' '*80}{sufs}"
|
108
|
+
|
109
|
+
# enum.append(f'{pres.ljust(76)}{sufs}')
|
110
|
+
enum.append(f'{sufs}\n {pres}')
|
111
|
+
except ValueError:
|
112
|
+
start, stop = item[1].split('-')
|
113
|
+
|
114
|
+
miss.append(f'if 0x{start} <= value <= 0x{stop}:')
|
115
|
+
miss.append(f' #: {desc}')
|
116
|
+
miss.append(f" return extend_enum(cls, '{self.safe_name(name)}_0x%s' % hex(value)[2:].upper().zfill(4), value)") # pylint: disable=line-too-long
|
117
|
+
return enum, miss
|
118
|
+
|
119
|
+
|
120
|
+
if __name__ == '__main__':
|
121
|
+
sys.exit(EtherType()) # type: ignore[arg-type]
|
@@ -0,0 +1,110 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""Link-Layer Header Type Values
|
3
|
+
===================================
|
4
|
+
|
5
|
+
.. module:: pcapkit.vendor.reg.linktype
|
6
|
+
|
7
|
+
This module contains the vendor crawler for **Link-Layer Header Type Values**,
|
8
|
+
which is automatically generating :class:`pcapkit.const.reg.linktype.LinkType`.
|
9
|
+
|
10
|
+
"""
|
11
|
+
|
12
|
+
import collections
|
13
|
+
import re
|
14
|
+
import sys
|
15
|
+
from typing import TYPE_CHECKING
|
16
|
+
|
17
|
+
import bs4
|
18
|
+
|
19
|
+
from pcapkit.vendor.default import Vendor
|
20
|
+
|
21
|
+
if TYPE_CHECKING:
|
22
|
+
from collections import Counter
|
23
|
+
|
24
|
+
from bs4.element import Tag
|
25
|
+
|
26
|
+
__all__ = ['LinkType']
|
27
|
+
|
28
|
+
|
29
|
+
class LinkType(Vendor):
|
30
|
+
"""Link-Layer Header Type Values"""
|
31
|
+
|
32
|
+
#: Value limit checker.
|
33
|
+
FLAG = 'isinstance(value, int) and 0x00000000 <= value <= 0xFFFFFFFF'
|
34
|
+
#: Link to registry.
|
35
|
+
LINK = 'http://www.tcpdump.org/linktypes.html'
|
36
|
+
|
37
|
+
def count(self, data: 'list[str]') -> 'Counter[str]':
|
38
|
+
"""Count field records."""
|
39
|
+
return collections.Counter()
|
40
|
+
|
41
|
+
def request(self, text: 'str') -> 'list[Tag]': # type: ignore[override] # pylint: disable=signature-differs
|
42
|
+
"""Fetch registry table.
|
43
|
+
|
44
|
+
Args:
|
45
|
+
text: Context from :attr:`~LinkType.LINK`.
|
46
|
+
|
47
|
+
Returns:
|
48
|
+
Rows (``tr``) from registry table (``table``).
|
49
|
+
|
50
|
+
"""
|
51
|
+
soup = bs4.BeautifulSoup(text, 'html5lib')
|
52
|
+
table = soup.select('table.linktypedlt')[0]
|
53
|
+
return table.select('tr')[1:]
|
54
|
+
|
55
|
+
def process(self, data: 'list[Tag]') -> 'tuple[list[str], list[str]]':
|
56
|
+
"""Process registry data.
|
57
|
+
|
58
|
+
Args:
|
59
|
+
data: Registry data.
|
60
|
+
|
61
|
+
Returns:
|
62
|
+
Enumeration fields and missing fields.
|
63
|
+
|
64
|
+
"""
|
65
|
+
enum = [] # type: list[str]
|
66
|
+
miss = [
|
67
|
+
"return extend_enum(cls, 'Unassigned_%d' % value, value)",
|
68
|
+
]
|
69
|
+
for content in data:
|
70
|
+
name = content.select('td.symbol')[0].text.strip()[9:].strip()
|
71
|
+
temp = content.select('td.number')[0].text.strip()
|
72
|
+
desc = content.select('td.symbol')[1].text.strip()
|
73
|
+
cmmt = re.sub(r'\s+', ' ', content.select('td')[3].text.strip()).replace("''", '``').replace('_', r'\_')
|
74
|
+
|
75
|
+
if not name:
|
76
|
+
name = desc[4:]
|
77
|
+
|
78
|
+
try:
|
79
|
+
code, _ = temp, int(temp)
|
80
|
+
|
81
|
+
pres = f"{name} = {code}"
|
82
|
+
if desc:
|
83
|
+
sufs = "#: %s" % self.wrap_comment(f"[``{desc}``] {cmmt}") # pylint: disable=consider-using-f-string
|
84
|
+
else:
|
85
|
+
sufs = "#: %s" % self.wrap_comment(cmmt)
|
86
|
+
|
87
|
+
# if len(pres) > 74:
|
88
|
+
# sufs = f"\n{' '*80}{sufs}"
|
89
|
+
|
90
|
+
# enum.append(f'{pres.ljust(76)}{sufs}')
|
91
|
+
enum.append(f'{sufs}\n {pres}')
|
92
|
+
except ValueError:
|
93
|
+
start, stop = map(int, temp.split('–'))
|
94
|
+
for code in range(start, stop+1):
|
95
|
+
name = f'USER{code-start}'
|
96
|
+
desc = f'DLT_USER{code-start}'
|
97
|
+
|
98
|
+
pres = f"{name} = {code}"
|
99
|
+
sufs = "#: %s" % self.wrap_comment(f"[``{desc}``] {cmmt}") # pylint: disable=consider-using-f-string
|
100
|
+
|
101
|
+
# if len(pres) > 74:
|
102
|
+
# sufs = f"\n{' '*80}{sufs}"
|
103
|
+
|
104
|
+
# enum.append(f'{pres.ljust(76)}{sufs}')
|
105
|
+
enum.append(f'{sufs}\n {pres}')
|
106
|
+
return enum, miss
|
107
|
+
|
108
|
+
|
109
|
+
if __name__ == '__main__':
|
110
|
+
sys.exit(LinkType()) # type: ignore[arg-type]
|