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.
Files changed (466) hide show
  1. pcapkit/__init__.py +126 -0
  2. pcapkit/__main__.py +138 -0
  3. pcapkit/all.py +136 -0
  4. pcapkit/const/__init__.py +81 -0
  5. pcapkit/const/arp/__init__.py +25 -0
  6. pcapkit/const/arp/hardware.py +181 -0
  7. pcapkit/const/arp/operation.py +131 -0
  8. pcapkit/const/ftp/__init__.py +25 -0
  9. pcapkit/const/ftp/command.py +309 -0
  10. pcapkit/const/ftp/return_code.py +304 -0
  11. pcapkit/const/hip/__init__.py +94 -0
  12. pcapkit/const/hip/certificate.py +77 -0
  13. pcapkit/const/hip/cipher.py +65 -0
  14. pcapkit/const/hip/di.py +59 -0
  15. pcapkit/const/hip/ecdsa_curve.py +59 -0
  16. pcapkit/const/hip/ecdsa_low_curve.py +56 -0
  17. pcapkit/const/hip/eddsa_curve.py +65 -0
  18. pcapkit/const/hip/esp_transform_suite.py +98 -0
  19. pcapkit/const/hip/group.py +86 -0
  20. pcapkit/const/hip/hi_algorithm.py +86 -0
  21. pcapkit/const/hip/hit_suite.py +68 -0
  22. pcapkit/const/hip/nat_traversal.py +62 -0
  23. pcapkit/const/hip/notify_message.py +200 -0
  24. pcapkit/const/hip/packet.py +89 -0
  25. pcapkit/const/hip/parameter.py +377 -0
  26. pcapkit/const/hip/registration.py +68 -0
  27. pcapkit/const/hip/registration_failure.py +84 -0
  28. pcapkit/const/hip/suite.py +71 -0
  29. pcapkit/const/hip/transport.py +59 -0
  30. pcapkit/const/http/__init__.py +39 -0
  31. pcapkit/const/http/error_code.py +95 -0
  32. pcapkit/const/http/frame.py +95 -0
  33. pcapkit/const/http/method.py +184 -0
  34. pcapkit/const/http/setting.py +96 -0
  35. pcapkit/const/http/status_code.py +294 -0
  36. pcapkit/const/ipv4/__init__.py +57 -0
  37. pcapkit/const/ipv4/classification_level.py +64 -0
  38. pcapkit/const/ipv4/option_class.py +55 -0
  39. pcapkit/const/ipv4/option_number.py +137 -0
  40. pcapkit/const/ipv4/protection_authority.py +63 -0
  41. pcapkit/const/ipv4/qs_function.py +51 -0
  42. pcapkit/const/ipv4/router_alert.py +251 -0
  43. pcapkit/const/ipv4/tos_del.py +51 -0
  44. pcapkit/const/ipv4/tos_ecn.py +55 -0
  45. pcapkit/const/ipv4/tos_pre.py +63 -0
  46. pcapkit/const/ipv4/tos_rel.py +51 -0
  47. pcapkit/const/ipv4/tos_thr.py +51 -0
  48. pcapkit/const/ipv4/ts_flag.py +53 -0
  49. pcapkit/const/ipv6/__init__.py +53 -0
  50. pcapkit/const/ipv6/extension_header.py +66 -0
  51. pcapkit/const/ipv6/option.py +137 -0
  52. pcapkit/const/ipv6/option_action.py +55 -0
  53. pcapkit/const/ipv6/qs_function.py +51 -0
  54. pcapkit/const/ipv6/router_alert.py +266 -0
  55. pcapkit/const/ipv6/routing.py +80 -0
  56. pcapkit/const/ipv6/seed_id.py +55 -0
  57. pcapkit/const/ipv6/smf_dpd_mode.py +51 -0
  58. pcapkit/const/ipv6/tagger_id.py +62 -0
  59. pcapkit/const/ipx/__init__.py +27 -0
  60. pcapkit/const/ipx/packet.py +72 -0
  61. pcapkit/const/ipx/socket.py +104 -0
  62. pcapkit/const/l2tp/__init__.py +21 -0
  63. pcapkit/const/l2tp/type.py +51 -0
  64. pcapkit/const/mh/__init__.py +204 -0
  65. pcapkit/const/mh/access_type.py +92 -0
  66. pcapkit/const/mh/ack_status_code.py +71 -0
  67. pcapkit/const/mh/ani_suboption.py +74 -0
  68. pcapkit/const/mh/auth_subtype.py +53 -0
  69. pcapkit/const/mh/binding_ack_flag.py +66 -0
  70. pcapkit/const/mh/binding_error.py +51 -0
  71. pcapkit/const/mh/binding_revocation.py +59 -0
  72. pcapkit/const/mh/binding_update_flag.py +81 -0
  73. pcapkit/const/mh/cga_extension.py +66 -0
  74. pcapkit/const/mh/cga_sec.py +57 -0
  75. pcapkit/const/mh/cga_type.py +68 -0
  76. pcapkit/const/mh/dhcp_support_mode.py +53 -0
  77. pcapkit/const/mh/dns_status_code.py +65 -0
  78. pcapkit/const/mh/dsmip6_tls_packet.py +62 -0
  79. pcapkit/const/mh/dsmipv6_home_address.py +74 -0
  80. pcapkit/const/mh/enumerating_algorithm.py +56 -0
  81. pcapkit/const/mh/fb_ack_status.py +62 -0
  82. pcapkit/const/mh/fb_action.py +71 -0
  83. pcapkit/const/mh/fb_indication_trigger.py +65 -0
  84. pcapkit/const/mh/fb_type.py +59 -0
  85. pcapkit/const/mh/flow_id_status.py +77 -0
  86. pcapkit/const/mh/flow_id_suboption.py +71 -0
  87. pcapkit/const/mh/handoff_type.py +71 -0
  88. pcapkit/const/mh/handover_ack_flag.py +54 -0
  89. pcapkit/const/mh/handover_ack_status.py +92 -0
  90. pcapkit/const/mh/handover_initiate_flag.py +57 -0
  91. pcapkit/const/mh/handover_initiate_status.py +62 -0
  92. pcapkit/const/mh/home_address_reply.py +71 -0
  93. pcapkit/const/mh/lla_code.py +63 -0
  94. pcapkit/const/mh/lma_mag_suboption.py +59 -0
  95. pcapkit/const/mh/mn_group_id.py +59 -0
  96. pcapkit/const/mh/mn_id_subtype.py +77 -0
  97. pcapkit/const/mh/operator_id.py +63 -0
  98. pcapkit/const/mh/option.py +260 -0
  99. pcapkit/const/mh/packet.py +119 -0
  100. pcapkit/const/mh/qos_attribute.py +89 -0
  101. pcapkit/const/mh/revocation_status_code.py +83 -0
  102. pcapkit/const/mh/revocation_trigger.py +86 -0
  103. pcapkit/const/mh/status_code.py +232 -0
  104. pcapkit/const/mh/traffic_selector.py +62 -0
  105. pcapkit/const/mh/upa_status.py +71 -0
  106. pcapkit/const/mh/upn_reason.py +80 -0
  107. pcapkit/const/ospf/__init__.py +27 -0
  108. pcapkit/const/ospf/authentication.py +65 -0
  109. pcapkit/const/ospf/packet.py +71 -0
  110. pcapkit/const/pcapng/__init__.py +51 -0
  111. pcapkit/const/pcapng/block_type.py +152 -0
  112. pcapkit/const/pcapng/filter_type.py +48 -0
  113. pcapkit/const/pcapng/hash_algorithm.py +59 -0
  114. pcapkit/const/pcapng/option_type.py +233 -0
  115. pcapkit/const/pcapng/record_type.py +57 -0
  116. pcapkit/const/pcapng/secrets_type.py +56 -0
  117. pcapkit/const/pcapng/verdict_type.py +53 -0
  118. pcapkit/const/reg/__init__.py +34 -0
  119. pcapkit/const/reg/apptype.py +32702 -0
  120. pcapkit/const/reg/ethertype.py +714 -0
  121. pcapkit/const/reg/linktype.py +902 -0
  122. pcapkit/const/reg/transtype.py +523 -0
  123. pcapkit/const/tcp/__init__.py +35 -0
  124. pcapkit/const/tcp/checksum.py +55 -0
  125. pcapkit/const/tcp/flags.py +73 -0
  126. pcapkit/const/tcp/mp_tcp_option.py +80 -0
  127. pcapkit/const/tcp/option.py +198 -0
  128. pcapkit/const/vlan/__init__.py +23 -0
  129. pcapkit/const/vlan/priority_level.py +71 -0
  130. pcapkit/corekit/__init__.py +59 -0
  131. pcapkit/corekit/fields/__init__.py +45 -0
  132. pcapkit/corekit/fields/collections.py +282 -0
  133. pcapkit/corekit/fields/field.py +269 -0
  134. pcapkit/corekit/fields/ipaddress.py +274 -0
  135. pcapkit/corekit/fields/misc.py +722 -0
  136. pcapkit/corekit/fields/numbers.py +375 -0
  137. pcapkit/corekit/fields/strings.py +245 -0
  138. pcapkit/corekit/infoclass.py +394 -0
  139. pcapkit/corekit/io.py +506 -0
  140. pcapkit/corekit/module.py +39 -0
  141. pcapkit/corekit/multidict.py +626 -0
  142. pcapkit/corekit/protochain.py +263 -0
  143. pcapkit/corekit/version.py +33 -0
  144. pcapkit/dumpkit/__init__.py +15 -0
  145. pcapkit/dumpkit/common.py +199 -0
  146. pcapkit/dumpkit/null.py +77 -0
  147. pcapkit/dumpkit/pcap.py +144 -0
  148. pcapkit/foundation/__init__.py +45 -0
  149. pcapkit/foundation/engines/__init__.py +36 -0
  150. pcapkit/foundation/engines/dpkt.py +230 -0
  151. pcapkit/foundation/engines/engine.py +194 -0
  152. pcapkit/foundation/engines/pcap.py +188 -0
  153. pcapkit/foundation/engines/pcapng.py +310 -0
  154. pcapkit/foundation/engines/pyshark.py +166 -0
  155. pcapkit/foundation/engines/scapy.py +161 -0
  156. pcapkit/foundation/extraction.py +915 -0
  157. pcapkit/foundation/reassembly/__init__.py +49 -0
  158. pcapkit/foundation/reassembly/data/__init__.py +48 -0
  159. pcapkit/foundation/reassembly/data/ip.py +117 -0
  160. pcapkit/foundation/reassembly/data/tcp.py +145 -0
  161. pcapkit/foundation/reassembly/ip.py +192 -0
  162. pcapkit/foundation/reassembly/ipv4.py +50 -0
  163. pcapkit/foundation/reassembly/ipv6.py +50 -0
  164. pcapkit/foundation/reassembly/reassembly.py +389 -0
  165. pcapkit/foundation/reassembly/tcp.py +249 -0
  166. pcapkit/foundation/registry/__init__.py +41 -0
  167. pcapkit/foundation/registry/foundation.py +327 -0
  168. pcapkit/foundation/registry/protocols.py +885 -0
  169. pcapkit/foundation/traceflow/__init__.py +44 -0
  170. pcapkit/foundation/traceflow/data/__init__.py +30 -0
  171. pcapkit/foundation/traceflow/data/tcp.py +105 -0
  172. pcapkit/foundation/traceflow/tcp.py +159 -0
  173. pcapkit/foundation/traceflow/traceflow.py +390 -0
  174. pcapkit/interface/__init__.py +22 -0
  175. pcapkit/interface/core.py +185 -0
  176. pcapkit/interface/misc.py +120 -0
  177. pcapkit/protocols/__init__.py +85 -0
  178. pcapkit/protocols/application/NotImplemented/bgp.py +0 -0
  179. pcapkit/protocols/application/NotImplemented/dhcp.py +0 -0
  180. pcapkit/protocols/application/NotImplemented/dhcpv6.py +0 -0
  181. pcapkit/protocols/application/NotImplemented/dns.py +0 -0
  182. pcapkit/protocols/application/NotImplemented/imap.py +0 -0
  183. pcapkit/protocols/application/NotImplemented/ldap.py +0 -0
  184. pcapkit/protocols/application/NotImplemented/mqtt.py +0 -0
  185. pcapkit/protocols/application/NotImplemented/nntp.py +0 -0
  186. pcapkit/protocols/application/NotImplemented/ntp.py +0 -0
  187. pcapkit/protocols/application/NotImplemented/onc_rpc.py +0 -0
  188. pcapkit/protocols/application/NotImplemented/pop.py +0 -0
  189. pcapkit/protocols/application/NotImplemented/rip.py +0 -0
  190. pcapkit/protocols/application/NotImplemented/rtp.py +0 -0
  191. pcapkit/protocols/application/NotImplemented/sip.py +0 -0
  192. pcapkit/protocols/application/NotImplemented/smtp.py +0 -0
  193. pcapkit/protocols/application/NotImplemented/snmp.py +0 -0
  194. pcapkit/protocols/application/NotImplemented/ssh.py +0 -0
  195. pcapkit/protocols/application/NotImplemented/telnet.py +0 -0
  196. pcapkit/protocols/application/NotImplemented/tls.py +0 -0
  197. pcapkit/protocols/application/NotImplemented/xmpp.py +0 -0
  198. pcapkit/protocols/application/__init__.py +34 -0
  199. pcapkit/protocols/application/application.py +114 -0
  200. pcapkit/protocols/application/ftp.py +206 -0
  201. pcapkit/protocols/application/http.py +176 -0
  202. pcapkit/protocols/application/httpv1.py +320 -0
  203. pcapkit/protocols/application/httpv2.py +1255 -0
  204. pcapkit/protocols/data/__init__.py +192 -0
  205. pcapkit/protocols/data/application/__init__.py +57 -0
  206. pcapkit/protocols/data/application/ftp.py +59 -0
  207. pcapkit/protocols/data/application/httpv1.py +79 -0
  208. pcapkit/protocols/data/application/httpv2.py +293 -0
  209. pcapkit/protocols/data/data.py +25 -0
  210. pcapkit/protocols/data/internet/__init__.py +298 -0
  211. pcapkit/protocols/data/internet/ah.py +31 -0
  212. pcapkit/protocols/data/internet/hip.py +804 -0
  213. pcapkit/protocols/data/internet/hopopt.py +351 -0
  214. pcapkit/protocols/data/internet/ipv4.py +369 -0
  215. pcapkit/protocols/data/internet/ipv6.py +67 -0
  216. pcapkit/protocols/data/internet/ipv6_frag.py +29 -0
  217. pcapkit/protocols/data/internet/ipv6_opts.py +368 -0
  218. pcapkit/protocols/data/internet/ipv6_route.py +86 -0
  219. pcapkit/protocols/data/internet/ipx.py +56 -0
  220. pcapkit/protocols/data/internet/mh.py +509 -0
  221. pcapkit/protocols/data/link/__init__.py +33 -0
  222. pcapkit/protocols/data/link/arp.py +74 -0
  223. pcapkit/protocols/data/link/ethernet.py +28 -0
  224. pcapkit/protocols/data/link/l2tp.py +63 -0
  225. pcapkit/protocols/data/link/ospf.py +58 -0
  226. pcapkit/protocols/data/link/vlan.py +42 -0
  227. pcapkit/protocols/data/misc/__init__.py +109 -0
  228. pcapkit/protocols/data/misc/null.py +18 -0
  229. pcapkit/protocols/data/misc/pcap/__init__.py +18 -0
  230. pcapkit/protocols/data/misc/pcap/frame.py +56 -0
  231. pcapkit/protocols/data/misc/pcap/header.py +53 -0
  232. pcapkit/protocols/data/misc/pcapng.py +925 -0
  233. pcapkit/protocols/data/misc/raw.py +25 -0
  234. pcapkit/protocols/data/protocol.py +32 -0
  235. pcapkit/protocols/data/transport/__init__.py +71 -0
  236. pcapkit/protocols/data/transport/tcp.py +555 -0
  237. pcapkit/protocols/data/transport/udp.py +29 -0
  238. pcapkit/protocols/internet/NotImplemented/ecn.py +0 -0
  239. pcapkit/protocols/internet/NotImplemented/esp.py +97 -0
  240. pcapkit/protocols/internet/NotImplemented/icmp.py +0 -0
  241. pcapkit/protocols/internet/NotImplemented/icmpv6.py +0 -0
  242. pcapkit/protocols/internet/NotImplemented/igmp.py +0 -0
  243. pcapkit/protocols/internet/NotImplemented/shim6.py +0 -0
  244. pcapkit/protocols/internet/__init__.py +43 -0
  245. pcapkit/protocols/internet/ah.py +275 -0
  246. pcapkit/protocols/internet/hip.py +4727 -0
  247. pcapkit/protocols/internet/hopopt.py +1879 -0
  248. pcapkit/protocols/internet/internet.py +240 -0
  249. pcapkit/protocols/internet/ip.py +51 -0
  250. pcapkit/protocols/internet/ipsec.py +50 -0
  251. pcapkit/protocols/internet/ipv4.py +1782 -0
  252. pcapkit/protocols/internet/ipv6.py +361 -0
  253. pcapkit/protocols/internet/ipv6_frag.py +258 -0
  254. pcapkit/protocols/internet/ipv6_opts.py +1890 -0
  255. pcapkit/protocols/internet/ipv6_route.py +710 -0
  256. pcapkit/protocols/internet/ipx.py +230 -0
  257. pcapkit/protocols/internet/mh.py +2764 -0
  258. pcapkit/protocols/link/NotImplemented/dsl.py +0 -0
  259. pcapkit/protocols/link/NotImplemented/eapol.py +1 -0
  260. pcapkit/protocols/link/NotImplemented/fddi.py +0 -0
  261. pcapkit/protocols/link/NotImplemented/isdn.py +0 -0
  262. pcapkit/protocols/link/NotImplemented/ndp.py +0 -0
  263. pcapkit/protocols/link/NotImplemented/ppp.py +0 -0
  264. pcapkit/protocols/link/__init__.py +35 -0
  265. pcapkit/protocols/link/arp.py +421 -0
  266. pcapkit/protocols/link/ethernet.py +248 -0
  267. pcapkit/protocols/link/l2tp.py +267 -0
  268. pcapkit/protocols/link/link.py +140 -0
  269. pcapkit/protocols/link/ospf.py +342 -0
  270. pcapkit/protocols/link/rarp.py +82 -0
  271. pcapkit/protocols/link/vlan.py +225 -0
  272. pcapkit/protocols/misc/__init__.py +37 -0
  273. pcapkit/protocols/misc/null.py +129 -0
  274. pcapkit/protocols/misc/pcap/__init__.py +17 -0
  275. pcapkit/protocols/misc/pcap/frame.py +478 -0
  276. pcapkit/protocols/misc/pcap/header.py +358 -0
  277. pcapkit/protocols/misc/pcapng.py +5520 -0
  278. pcapkit/protocols/misc/raw.py +180 -0
  279. pcapkit/protocols/protocol.py +1216 -0
  280. pcapkit/protocols/schema/__init__.py +140 -0
  281. pcapkit/protocols/schema/application/__init__.py +40 -0
  282. pcapkit/protocols/schema/application/ftp.py +21 -0
  283. pcapkit/protocols/schema/application/httpv1.py +21 -0
  284. pcapkit/protocols/schema/application/httpv2.py +384 -0
  285. pcapkit/protocols/schema/internet/__init__.py +294 -0
  286. pcapkit/protocols/schema/internet/ah.py +40 -0
  287. pcapkit/protocols/schema/internet/hip.py +1184 -0
  288. pcapkit/protocols/schema/internet/hopopt.py +679 -0
  289. pcapkit/protocols/schema/internet/ipv4.py +576 -0
  290. pcapkit/protocols/schema/internet/ipv6.py +63 -0
  291. pcapkit/protocols/schema/internet/ipv6_frag.py +48 -0
  292. pcapkit/protocols/schema/internet/ipv6_opts.py +680 -0
  293. pcapkit/protocols/schema/internet/ipv6_route.py +198 -0
  294. pcapkit/protocols/schema/internet/ipx.py +40 -0
  295. pcapkit/protocols/schema/internet/mh.py +718 -0
  296. pcapkit/protocols/schema/link/__init__.py +19 -0
  297. pcapkit/protocols/schema/link/arp.py +39 -0
  298. pcapkit/protocols/schema/link/ethernet.py +51 -0
  299. pcapkit/protocols/schema/link/l2tp.py +88 -0
  300. pcapkit/protocols/schema/link/ospf.py +90 -0
  301. pcapkit/protocols/schema/link/vlan.py +69 -0
  302. pcapkit/protocols/schema/misc/__init__.py +108 -0
  303. pcapkit/protocols/schema/misc/null.py +18 -0
  304. pcapkit/protocols/schema/misc/pcap/__init__.py +10 -0
  305. pcapkit/protocols/schema/misc/pcap/frame.py +51 -0
  306. pcapkit/protocols/schema/misc/pcap/header.py +63 -0
  307. pcapkit/protocols/schema/misc/pcapng.py +1689 -0
  308. pcapkit/protocols/schema/misc/raw.py +24 -0
  309. pcapkit/protocols/schema/schema.py +809 -0
  310. pcapkit/protocols/schema/transport/__init__.py +69 -0
  311. pcapkit/protocols/schema/transport/tcp.py +928 -0
  312. pcapkit/protocols/schema/transport/udp.py +90 -0
  313. pcapkit/protocols/transport/NotImplemented/dccp.py +0 -0
  314. pcapkit/protocols/transport/NotImplemented/rsvp.py +0 -0
  315. pcapkit/protocols/transport/NotImplemented/sctp.py +0 -0
  316. pcapkit/protocols/transport/__init__.py +27 -0
  317. pcapkit/protocols/transport/tcp.py +3025 -0
  318. pcapkit/protocols/transport/transport.py +158 -0
  319. pcapkit/protocols/transport/udp.py +214 -0
  320. pcapkit/py.typed +0 -0
  321. pcapkit/toolkit/__init__.py +57 -0
  322. pcapkit/toolkit/dpkt.py +306 -0
  323. pcapkit/toolkit/pcap.py +212 -0
  324. pcapkit/toolkit/pcapng.py +251 -0
  325. pcapkit/toolkit/pyshark.py +99 -0
  326. pcapkit/toolkit/scapy.py +297 -0
  327. pcapkit/utilities/__init__.py +20 -0
  328. pcapkit/utilities/compat.py +196 -0
  329. pcapkit/utilities/decorators.py +192 -0
  330. pcapkit/utilities/exceptions.py +365 -0
  331. pcapkit/utilities/logging.py +55 -0
  332. pcapkit/utilities/warnings.py +185 -0
  333. pcapkit/vendor/__init__.py +105 -0
  334. pcapkit/vendor/__main__.py +92 -0
  335. pcapkit/vendor/arp/__init__.py +27 -0
  336. pcapkit/vendor/arp/hardware.py +29 -0
  337. pcapkit/vendor/arp/operation.py +29 -0
  338. pcapkit/vendor/default.py +474 -0
  339. pcapkit/vendor/ftp/__init__.py +27 -0
  340. pcapkit/vendor/ftp/command.py +244 -0
  341. pcapkit/vendor/ftp/return_code.py +256 -0
  342. pcapkit/vendor/hip/__init__.py +94 -0
  343. pcapkit/vendor/hip/certificate.py +29 -0
  344. pcapkit/vendor/hip/cipher.py +29 -0
  345. pcapkit/vendor/hip/di.py +29 -0
  346. pcapkit/vendor/hip/ecdsa_curve.py +29 -0
  347. pcapkit/vendor/hip/ecdsa_low_curve.py +29 -0
  348. pcapkit/vendor/hip/eddsa_curve.py +85 -0
  349. pcapkit/vendor/hip/esp_transform_suite.py +29 -0
  350. pcapkit/vendor/hip/group.py +87 -0
  351. pcapkit/vendor/hip/hi_algorithm.py +29 -0
  352. pcapkit/vendor/hip/hit_suite.py +29 -0
  353. pcapkit/vendor/hip/nat_traversal.py +29 -0
  354. pcapkit/vendor/hip/notify_message.py +29 -0
  355. pcapkit/vendor/hip/packet.py +88 -0
  356. pcapkit/vendor/hip/parameter.py +88 -0
  357. pcapkit/vendor/hip/registration.py +29 -0
  358. pcapkit/vendor/hip/registration_failure.py +29 -0
  359. pcapkit/vendor/hip/suite.py +29 -0
  360. pcapkit/vendor/hip/transport.py +29 -0
  361. pcapkit/vendor/http/__init__.py +39 -0
  362. pcapkit/vendor/http/error_code.py +95 -0
  363. pcapkit/vendor/http/frame.py +91 -0
  364. pcapkit/vendor/http/method.py +167 -0
  365. pcapkit/vendor/http/setting.py +93 -0
  366. pcapkit/vendor/http/status_code.py +185 -0
  367. pcapkit/vendor/ipv4/__init__.py +57 -0
  368. pcapkit/vendor/ipv4/classification_level.py +91 -0
  369. pcapkit/vendor/ipv4/option_class.py +80 -0
  370. pcapkit/vendor/ipv4/option_number.py +105 -0
  371. pcapkit/vendor/ipv4/protection_authority.py +84 -0
  372. pcapkit/vendor/ipv4/qs_function.py +78 -0
  373. pcapkit/vendor/ipv4/router_alert.py +93 -0
  374. pcapkit/vendor/ipv4/tos_del.py +78 -0
  375. pcapkit/vendor/ipv4/tos_ecn.py +95 -0
  376. pcapkit/vendor/ipv4/tos_pre.py +84 -0
  377. pcapkit/vendor/ipv4/tos_rel.py +78 -0
  378. pcapkit/vendor/ipv4/tos_thr.py +77 -0
  379. pcapkit/vendor/ipv4/ts_flag.py +79 -0
  380. pcapkit/vendor/ipv6/__init__.py +53 -0
  381. pcapkit/vendor/ipv6/extension_header.py +171 -0
  382. pcapkit/vendor/ipv6/option.py +104 -0
  383. pcapkit/vendor/ipv6/option_action.py +90 -0
  384. pcapkit/vendor/ipv6/qs_function.py +78 -0
  385. pcapkit/vendor/ipv6/router_alert.py +93 -0
  386. pcapkit/vendor/ipv6/routing.py +87 -0
  387. pcapkit/vendor/ipv6/seed_id.py +81 -0
  388. pcapkit/vendor/ipv6/smf_dpd_mode.py +78 -0
  389. pcapkit/vendor/ipv6/tagger_id.py +81 -0
  390. pcapkit/vendor/ipx/__init__.py +37 -0
  391. pcapkit/vendor/ipx/packet.py +123 -0
  392. pcapkit/vendor/ipx/socket.py +125 -0
  393. pcapkit/vendor/l2tp/__init__.py +21 -0
  394. pcapkit/vendor/l2tp/type.py +78 -0
  395. pcapkit/vendor/mh/__init__.py +204 -0
  396. pcapkit/vendor/mh/access_type.py +87 -0
  397. pcapkit/vendor/mh/ack_status_code.py +88 -0
  398. pcapkit/vendor/mh/ani_suboption.py +88 -0
  399. pcapkit/vendor/mh/auth_subtype.py +83 -0
  400. pcapkit/vendor/mh/binding_ack_flag.py +148 -0
  401. pcapkit/vendor/mh/binding_error.py +78 -0
  402. pcapkit/vendor/mh/binding_revocation.py +87 -0
  403. pcapkit/vendor/mh/binding_update_flag.py +147 -0
  404. pcapkit/vendor/mh/cga_extension.py +91 -0
  405. pcapkit/vendor/mh/cga_sec.py +91 -0
  406. pcapkit/vendor/mh/cga_type.py +74 -0
  407. pcapkit/vendor/mh/dhcp_support_mode.py +77 -0
  408. pcapkit/vendor/mh/dns_status_code.py +87 -0
  409. pcapkit/vendor/mh/dsmip6_tls_packet.py +87 -0
  410. pcapkit/vendor/mh/dsmipv6_home_address.py +87 -0
  411. pcapkit/vendor/mh/enumerating_algorithm.py +82 -0
  412. pcapkit/vendor/mh/fb_ack_status.py +87 -0
  413. pcapkit/vendor/mh/fb_action.py +88 -0
  414. pcapkit/vendor/mh/fb_indication_trigger.py +87 -0
  415. pcapkit/vendor/mh/fb_type.py +88 -0
  416. pcapkit/vendor/mh/flow_id_status.py +87 -0
  417. pcapkit/vendor/mh/flow_id_suboption.py +87 -0
  418. pcapkit/vendor/mh/handoff_type.py +87 -0
  419. pcapkit/vendor/mh/handover_ack_flag.py +143 -0
  420. pcapkit/vendor/mh/handover_ack_status.py +87 -0
  421. pcapkit/vendor/mh/handover_initiate_flag.py +143 -0
  422. pcapkit/vendor/mh/handover_initiate_status.py +87 -0
  423. pcapkit/vendor/mh/home_address_reply.py +87 -0
  424. pcapkit/vendor/mh/lla_code.py +97 -0
  425. pcapkit/vendor/mh/lma_mag_suboption.py +88 -0
  426. pcapkit/vendor/mh/mn_group_id.py +87 -0
  427. pcapkit/vendor/mh/mn_id_subtype.py +87 -0
  428. pcapkit/vendor/mh/operator_id.py +87 -0
  429. pcapkit/vendor/mh/option.py +83 -0
  430. pcapkit/vendor/mh/packet.py +82 -0
  431. pcapkit/vendor/mh/qos_attribute.py +87 -0
  432. pcapkit/vendor/mh/revocation_status_code.py +87 -0
  433. pcapkit/vendor/mh/revocation_trigger.py +87 -0
  434. pcapkit/vendor/mh/status_code.py +91 -0
  435. pcapkit/vendor/mh/traffic_selector.py +87 -0
  436. pcapkit/vendor/mh/upa_status.py +87 -0
  437. pcapkit/vendor/mh/upn_reason.py +87 -0
  438. pcapkit/vendor/ospf/__init__.py +27 -0
  439. pcapkit/vendor/ospf/authentication.py +29 -0
  440. pcapkit/vendor/ospf/packet.py +29 -0
  441. pcapkit/vendor/pcapng/__init__.py +51 -0
  442. pcapkit/vendor/pcapng/block_type.py +94 -0
  443. pcapkit/vendor/pcapng/filter_type.py +77 -0
  444. pcapkit/vendor/pcapng/hash_algorithm.py +82 -0
  445. pcapkit/vendor/pcapng/option_type.py +287 -0
  446. pcapkit/vendor/pcapng/record_type.py +81 -0
  447. pcapkit/vendor/pcapng/secrets_type.py +81 -0
  448. pcapkit/vendor/pcapng/verdict_type.py +79 -0
  449. pcapkit/vendor/reg/__init__.py +34 -0
  450. pcapkit/vendor/reg/apptype.py +338 -0
  451. pcapkit/vendor/reg/ethertype.py +121 -0
  452. pcapkit/vendor/reg/linktype.py +110 -0
  453. pcapkit/vendor/reg/transtype.py +111 -0
  454. pcapkit/vendor/tcp/__init__.py +35 -0
  455. pcapkit/vendor/tcp/checksum.py +80 -0
  456. pcapkit/vendor/tcp/flags.py +149 -0
  457. pcapkit/vendor/tcp/mp_tcp_option.py +90 -0
  458. pcapkit/vendor/tcp/option.py +103 -0
  459. pcapkit/vendor/vlan/__init__.py +23 -0
  460. pcapkit/vendor/vlan/priority_level.py +97 -0
  461. pypcapkit-1.3.3.post1.dist-info/LICENSE +29 -0
  462. pypcapkit-1.3.3.post1.dist-info/METADATA +236 -0
  463. pypcapkit-1.3.3.post1.dist-info/RECORD +466 -0
  464. pypcapkit-1.3.3.post1.dist-info/WHEEL +5 -0
  465. pypcapkit-1.3.3.post1.dist-info/entry_points.txt +3 -0
  466. pypcapkit-1.3.3.post1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,129 @@
1
+ # -*- coding: utf-8 -*-
2
+ """No-Payload Packet
3
+ =======================
4
+
5
+ .. module:: pcapkit.protocols.misc.null
6
+
7
+ :mod:`pcapkit.protocols.null` contains
8
+ :class:`~pcapkit.protocols.null.NoPayload` only, which
9
+ implements a :class:`~pcapkit.protocols.protocol.Protocol` like
10
+ object whose payload is recursively
11
+ :class:`~pcapkit.protocols.null.NoPayload` itself.
12
+
13
+ """
14
+ import io
15
+ from typing import TYPE_CHECKING, overload
16
+
17
+ from pcapkit.protocols.data.misc.null import NoPayload as Data_NoPayload
18
+ from pcapkit.protocols.protocol import ProtocolBase as Protocol
19
+ from pcapkit.protocols.schema.misc.null import NoPayload as Schema_NoPayload
20
+ from pcapkit.utilities.exceptions import UnsupportedCall
21
+
22
+ if TYPE_CHECKING:
23
+ from typing import IO, Any, NoReturn, Optional
24
+
25
+ from typing_extensions import Literal
26
+
27
+ __all__ = ['NoPayload']
28
+
29
+
30
+ class NoPayload(Protocol[Data_NoPayload, Schema_NoPayload],
31
+ schema=Schema_NoPayload, data=Data_NoPayload):
32
+ """This class implements no-payload protocol."""
33
+
34
+ ##########################################################################
35
+ # Properties.
36
+ ##########################################################################
37
+
38
+ # name of current protocol
39
+ @property
40
+ def name(self) -> 'Literal["Null"]':
41
+ """Name of current protocol."""
42
+ return 'Null'
43
+
44
+ # header length of current protocol
45
+ @property
46
+ def length(self) -> 'Literal[0]':
47
+ """Header length of current protocol."""
48
+ return 0
49
+
50
+ # name of next layer protocol
51
+ @property
52
+ def protocol(self) -> 'NoReturn':
53
+ """Name of next layer protocol.
54
+
55
+ Raises:
56
+ UnsupportedCall: This protocol doesn't support :attr:`protocol`.
57
+
58
+ """
59
+ raise UnsupportedCall(f"'{self.__class__.__name__}' object has no attribute 'protocol'")
60
+
61
+ ##########################################################################
62
+ # Methods.
63
+ ##########################################################################
64
+
65
+ def read(self, length: 'Optional[int]' = None, **kwargs: 'Any') -> 'Data_NoPayload': # pylint: disable=unused-argument
66
+ """Read (parse) packet data.
67
+
68
+ Args:
69
+ length: Length of packet data.
70
+ **kwargs: Arbitrary keyword arguments.
71
+
72
+ Returns:
73
+ Parsed packet data.
74
+
75
+ """
76
+ return Data_NoPayload()
77
+
78
+ def make(self, **kwargs: 'Any') -> 'Schema_NoPayload':
79
+ """Make (construct) packet data.
80
+
81
+ Args:
82
+ **kwargs: Arbitrary keyword arguments.
83
+
84
+ Returns:
85
+ Constructed packet schema.
86
+
87
+ """
88
+ return Schema_NoPayload()
89
+
90
+ ##########################################################################
91
+ # Data models.
92
+ ##########################################################################
93
+
94
+ @overload
95
+ def __post_init__(self, file: 'IO[bytes] | bytes', length: 'Optional[int]' = ..., **kwargs: 'Any') -> 'None': ...
96
+ @overload
97
+ def __post_init__(self, **kwargs: 'Any') -> 'None': ... # pylint: disable=arguments-differ
98
+
99
+ def __post_init__(self, file: 'Optional[IO[bytes] | bytes]' = None, # pylint: disable=unused-argument
100
+ length: 'Optional[int]' = None, **kwargs: 'Any') -> 'None':
101
+ """Post initialisation hook.
102
+
103
+ Args:
104
+ file: Source packet stream.
105
+ length: Length of packet data.
106
+ **kwargs: Arbitrary keyword arguments.
107
+
108
+ """
109
+ #: bytes: Raw packet data.
110
+ self._data = b''
111
+ #: io.BytesIO: Source data stream.
112
+ self._file = io.BytesIO()
113
+ #: pcapkit.protocols.data.misc.null.NoPayload: Info dict of current instance.
114
+ self._info = Data_NoPayload()
115
+
116
+ #: pcapkit.protocols.null.NoPayload: Payload of current instance.
117
+ self._next = self
118
+ #: pcapkit.corekit.protochain.ProtoChain: Protocol chain of current instance.
119
+ self._protos = None # type: ignore[assignment]
120
+
121
+ @classmethod
122
+ def __index__(cls) -> 'NoReturn':
123
+ """Numeral registry index of the protocol.
124
+
125
+ Raises:
126
+ UnsupportedCall: This protocol has no registry entry.
127
+
128
+ """
129
+ raise UnsupportedCall(f'{cls.__name__!r} object cannot be interpreted as an integer')
@@ -0,0 +1,17 @@
1
+ # -*- coding: utf-8 -*-
2
+ # pylint: disable=unused-import,unused-wildcard-import,fixme
3
+ """PCAP File Headers
4
+ =======================
5
+
6
+ .. module:: pcapkit.protocols.misc.pcap
7
+
8
+ :mod:`pcapkit.protocols.misc.pcap` contains header descriptions for
9
+ PCAP files, including global header
10
+ (:class:`~pcapkit.protocols.misc.pcap.header.Header`) and frame header
11
+ (:class:`~pcapkit.protocols.misc.pcap.frame.Frame`).
12
+
13
+ """
14
+ from pcapkit.protocols.misc.pcap.frame import Frame
15
+ from pcapkit.protocols.misc.pcap.header import Header
16
+
17
+ __all__ = ['Frame', 'Header']
@@ -0,0 +1,478 @@
1
+ # -*- coding: utf-8 -*-
2
+ # mypy: disable-error-code=dict-item
3
+ """Frame Header
4
+ ==================
5
+
6
+ .. module:: pcapkit.protocols.misc.pcap.frame
7
+
8
+ :mod:`pcapkit.protocols.misc.pcap.frame` contains
9
+ :class:`~pcapkit.protocols.misc.pcap.frame.Frame` only,
10
+ which implements extractor for frame headers [*]_ of PCAP,
11
+ whose structure is described as below:
12
+
13
+ .. code-block:: c
14
+
15
+ typedef struct pcaprec_hdr_s {
16
+ guint32 ts_sec; /* timestamp seconds */
17
+ guint32 ts_usec; /* timestamp microseconds */
18
+ guint32 incl_len; /* number of octets of packet saved in file */
19
+ guint32 orig_len; /* actual length of packet */
20
+ } pcaprec_hdr_t;
21
+
22
+ .. [*] https://wiki.wireshark.org/Development/LibpcapFileFormat#Record_.28Packet.29_Header
23
+
24
+ """
25
+ import collections
26
+ import datetime
27
+ import decimal
28
+ import io
29
+ import sys
30
+ import time
31
+ from typing import TYPE_CHECKING, cast, overload
32
+
33
+ from pcapkit.const.reg.linktype import LinkType as Enum_LinkType
34
+ from pcapkit.corekit.module import ModuleDescriptor
35
+ from pcapkit.protocols.data.misc.pcap.frame import Frame as Data_Frame
36
+ from pcapkit.protocols.data.misc.pcap.frame import FrameInfo as Data_FrameInfo
37
+ from pcapkit.protocols.protocol import ProtocolBase as Protocol
38
+ from pcapkit.protocols.schema.misc.pcap.frame import Frame as Schema_Frame
39
+ from pcapkit.utilities.compat import localcontext
40
+ from pcapkit.utilities.exceptions import RegistryError, UnsupportedCall, stacklevel
41
+ from pcapkit.utilities.warnings import ProtocolWarning, RegistryWarning, warn
42
+
43
+ if TYPE_CHECKING:
44
+ from datetime import datetime as dt_type
45
+ from decimal import Decimal
46
+ from typing import IO, Any, DefaultDict, Optional, Type
47
+
48
+ from typing_extensions import Literal
49
+
50
+ from pcapkit.protocols.data.misc.pcap.header import Header as Data_Header
51
+ from pcapkit.protocols.schema.schema import Schema
52
+
53
+ __all__ = ['Frame']
54
+
55
+ # check Python version
56
+ py37 = ((version_info := sys.version_info).major >= 3 and version_info.minor >= 7)
57
+
58
+
59
+ class Frame(Protocol[Data_Frame, Schema_Frame],
60
+ schema=Schema_Frame, data=Data_Frame):
61
+ """Per packet frame header extractor.
62
+
63
+ This class currently supports parsing of the following protocols, which are
64
+ registered in the :attr:`self.__proto__ <pcapkit.protocols.misc.pcap.frame.Frame.__proto__>`
65
+ attribute:
66
+
67
+ .. list-table::
68
+ :header-rows: 1
69
+
70
+ * - Index
71
+ - Protocol
72
+ * - :attr:`pcapkit.const.reg.linktype.LinkType.ETHERNET`
73
+ - :class:`pcapkit.protocols.link.ethernet.Ethernet`
74
+ * - :attr:`pcapkit.const.reg.linktype.LinkType.IPV4`
75
+ - :class:`pcapkit.protocols.internet.ipv4.IPv4`
76
+ * - :attr:`pcapkit.const.reg.linktype.LinkType.IPV6`
77
+ - :class:`pcapkit.protocols.internet.ipv6.IPv6`
78
+
79
+ """
80
+
81
+ ##########################################################################
82
+ # Defaults.
83
+ ##########################################################################
84
+
85
+ #: DefaultDict[Enum_LinkType, ModuleDescriptor[Protocol] | Type[Protocol]]: Protocol index mapping for
86
+ #: decoding next layer, c.f. :meth:`self._decode_next_layer <pcapkit.protocols.protocol.Protocol._decode_next_layer>`
87
+ #: & :meth:`self._import_next_layer <pcapkit.protocols.protocol.Protocol._import_next_layer>`.
88
+ #: The values should be a tuple representing the module name and class name, or
89
+ #: a :class:`~pcapkit.protocols.protocol.Protocol` subclass.
90
+ __proto__ = collections.defaultdict(
91
+ lambda: ModuleDescriptor('pcapkit.protocols.misc.raw', 'Raw'),
92
+ {
93
+ Enum_LinkType.ETHERNET: ModuleDescriptor('pcapkit.protocols.link', 'Ethernet'),
94
+ Enum_LinkType.IPV4: ModuleDescriptor('pcapkit.protocols.internet', 'IPv4'),
95
+ Enum_LinkType.IPV6: ModuleDescriptor('pcapkit.protocols.internet', 'IPv6'),
96
+ },
97
+ ) # type: DefaultDict[Enum_LinkType | int, ModuleDescriptor[Protocol] | Type[Protocol]]
98
+
99
+ ##########################################################################
100
+ # Properties.
101
+ ##########################################################################
102
+
103
+ @property
104
+ def name(self) -> 'str':
105
+ """Name of corresponding protocol."""
106
+ return f'Frame {self._fnum}'
107
+
108
+ @property
109
+ def length(self) -> 'Literal[16]':
110
+ """Header length of corresponding protocol."""
111
+ return 16
112
+
113
+ @property
114
+ def header(self) -> 'Data_Header':
115
+ """Global header of the PCAP file."""
116
+ return self._ghdr
117
+
118
+ ##########################################################################
119
+ # Methods.
120
+ ##########################################################################
121
+
122
+ @classmethod
123
+ def register(cls, code: 'Enum_LinkType', protocol: 'ModuleDescriptor[Protocol] | Type[Protocol]') -> 'None': # type: ignore[override]
124
+ r"""Register a new protocol class.
125
+
126
+ Notes:
127
+ The full qualified class name of the new protocol class
128
+ should be as ``{protocol.module}.{protocol.name}``.
129
+
130
+ Arguments:
131
+ code: protocol code as in :class:`~pcapkit.const.reg.linktype.LinkType`
132
+ module: module descriptor or a
133
+ :class:`~pcapkit.protocols.protocol.Protocol` subclass
134
+
135
+ """
136
+ if isinstance(protocol, ModuleDescriptor):
137
+ protocol = protocol.klass
138
+ if not issubclass(protocol, Protocol):
139
+ raise RegistryError(f'protocol must be a Protocol subclass, not {protocol!r}')
140
+ if code in cls.__proto__:
141
+ warn(f'protocol {code} already registered, overwriting', RegistryWarning)
142
+ cls.__proto__[code] = protocol
143
+
144
+ def index(self, name: 'str | Protocol | Type[Protocol]') -> 'int':
145
+ """Call :meth:`ProtoChain.index <pcapkit.corekit.protochain.ProtoChain.index>`.
146
+
147
+ Args:
148
+ name: ``name`` to be searched
149
+
150
+ Returns:
151
+ First index of ``name``.
152
+
153
+ Raises:
154
+ IndexNotFound: if ``name`` is not present
155
+
156
+ """
157
+ return self._protos.index(name)
158
+
159
+ def pack(self, **kwargs: 'Any') -> 'bytes':
160
+ """Pack (construct) packet data.
161
+
162
+ Args:
163
+ **kwargs: Arbitrary keyword arguments.
164
+
165
+ Returns:
166
+ Constructed packet data.
167
+
168
+ Notes:
169
+ We used a special keyword argument ``__packet__`` to pass the
170
+ global packet data to underlying methods. This is useful when
171
+ the packet data is not available in the current instance.
172
+
173
+ """
174
+ self.__header__ = self.make(**kwargs)
175
+ packet = kwargs.get('__packet__', {}) # packet data
176
+ packet['byteorder'] = self._ghdr.magic_number.byteorder
177
+ return self.__header__.pack(packet)
178
+
179
+ def unpack(self, length: 'Optional[int]' = None, **kwargs: 'Any') -> 'Data_Frame':
180
+ """Unpack (parse) packet data.
181
+
182
+ Args:
183
+ length: Length of packet data.
184
+ **kwargs: Arbitrary keyword arguments.
185
+
186
+ Returns:
187
+ Parsed packet data.
188
+
189
+ Notes:
190
+ We used a special keyword argument ``__packet__`` to pass the
191
+ global packet data to underlying methods. This is useful when
192
+ the packet data is not available in the current instance.
193
+
194
+ """
195
+ if cast('Optional[Schema_Frame]', self.__header__) is None:
196
+ packet = kwargs.get('__packet__', {}) # packet data
197
+ packet['bytesorder'] = self._ghdr.magic_number.byteorder
198
+ self.__header__ = cast('Schema_Frame', self.__schema__.unpack(self._file, length, packet)) # type: ignore[call-arg,misc]
199
+ return self.read(length, **kwargs)
200
+
201
+ def read(self, length: 'Optional[int]' = None, *, _read: 'bool' = True, **kwargs: 'Any') -> 'Data_Frame':
202
+ r"""Read each block after global header.
203
+
204
+ Args:
205
+ length: Length of data to be read.
206
+ \_read: If the class is called in a parsing scenario.
207
+ **kwargs: Arbitrary keyword arguments.
208
+
209
+ Returns:
210
+ Data_Frame: Parsed packet data.
211
+
212
+ """
213
+ schema = self.__header__
214
+
215
+ _tsss = schema.ts_sec
216
+ _tsus = schema.ts_usec
217
+ _ilen = schema.incl_len
218
+ _olen = schema.orig_len
219
+
220
+ with localcontext(prec=64):
221
+ if self._nsec:
222
+ _epch = _tsss + decimal.Decimal(_tsus) / 1_000_000_000
223
+ else:
224
+ _epch = _tsss + decimal.Decimal(_tsus) / 1_000_000
225
+ _irat = _epch.as_integer_ratio()
226
+
227
+ try:
228
+ _time = datetime.datetime.fromtimestamp(_irat[0] / _irat[1])
229
+ except ValueError:
230
+ warn(f'PCAP: invalid timestamp: {_epch}', ProtocolWarning, stacklevel=stacklevel())
231
+ _time = datetime.datetime.fromtimestamp(0, datetime.timezone.utc)
232
+
233
+ frame = Data_Frame(
234
+ frame_info=Data_FrameInfo(
235
+ ts_sec=_tsss,
236
+ ts_usec=_tsus,
237
+ incl_len=_ilen,
238
+ orig_len=_olen,
239
+ ),
240
+ time=_time,
241
+ number=self._fnum,
242
+ time_epoch=_epch,
243
+ len=_ilen,
244
+ cap_len=_olen,
245
+ )
246
+
247
+ if not _read:
248
+ # move backward to the beginning of the packet
249
+ self._file.seek(0, io.SEEK_SET)
250
+ else:
251
+ # NOTE: We create a copy of the frame data here for parsing
252
+ # scenarios to keep the original frame data intact.
253
+ seek_cur = self._file.tell()
254
+
255
+ # move backward to the beginning of the frame
256
+ self._file.seek(-self.length, io.SEEK_CUR)
257
+
258
+ #: bytes: Raw frame data.
259
+ self._data = self._read_fileng(self.length + _ilen)
260
+
261
+ # move backward to the beginning of frame's payload
262
+ self._file.seek(seek_cur, io.SEEK_SET)
263
+
264
+ #: io.BytesIO: Source data stream.
265
+ self._file = io.BytesIO(self._data)
266
+
267
+ return self._decode_next_layer(frame, self._ghdr.network, frame.len)
268
+
269
+ def make(self,
270
+ timestamp: 'Optional[float | Decimal | int | dt_type]' = None,
271
+ ts_sec: 'Optional[int]' = None,
272
+ ts_usec: 'Optional[int]' = None,
273
+ incl_len: 'Optional[int]' = None,
274
+ orig_len: 'Optional[int]' = None,
275
+ packet: 'bytes | Protocol | Schema' = b'',
276
+ nanosecond: 'bool' = False,
277
+ **kwargs: 'Any') -> 'Schema_Frame':
278
+ """Make frame packet data.
279
+
280
+ Args:
281
+ timestamp: UNIX-Epoch timestamp
282
+ ts_sec: timestamp seconds
283
+ ts_usec: timestamp microseconds
284
+ incl_len: number of octets of packet saved in file
285
+ orig_len: actual length of packet
286
+ packet: raw packet data
287
+ nanosecond: nanosecond-resolution file flag
288
+ **kwargs: Arbitrary keyword arguments.
289
+
290
+ Returns:
291
+ Constructed packet data.
292
+
293
+ """
294
+ ts_sec, ts_usec = self._make_timestamp(timestamp, ts_sec, ts_usec, nanosecond)
295
+
296
+ if incl_len is None:
297
+ incl_len = min(len(packet), self._ghdr.snaplen)
298
+ if orig_len is None:
299
+ orig_len = len(packet)
300
+
301
+ return Schema_Frame(
302
+ ts_sec=ts_sec,
303
+ ts_usec=ts_usec,
304
+ incl_len=incl_len,
305
+ orig_len=orig_len,
306
+ packet=packet,
307
+ )
308
+
309
+ ##########################################################################
310
+ # Data models.
311
+ ##########################################################################
312
+
313
+ @overload
314
+ def __post_init__(self, file: 'IO[bytes] | bytes', length: 'Optional[int]' = ..., *, # pylint: disable=arguments-differ
315
+ num: 'int', header: 'Data_Header', **kwargs: 'Any') -> 'None': ...
316
+ @overload
317
+ def __post_init__(self, *, num: 'int', header: 'Data_Header', # pylint: disable=arguments-differ
318
+ **kwargs: 'Any') -> 'None': ...
319
+
320
+ def __post_init__(self, file: 'Optional[IO[bytes] | bytes]' = None, length: 'Optional[int]' = None, *, # pylint: disable=arguments-differ
321
+ num: 'int', header: 'Data_Header', **kwargs: 'Any') -> 'None':
322
+ """Initialisation.
323
+
324
+ Args:
325
+ file: Source packet stream.
326
+ length: Length of packet data.
327
+ num: Frame index number.
328
+ header: Global header of the PCAP file.
329
+ **kwargs: Arbitrary keyword arguments.
330
+
331
+ See Also:
332
+ For construction argument, please refer to :meth:`make`.
333
+
334
+ """
335
+ #: int: frame index number
336
+ self._fnum = num
337
+ #: pcapkit.protocols.misc.pcap.header.Header: Global header of the PCAP file.
338
+ self._ghdr = header
339
+
340
+ #: pcapkit.const.reg.linktype.LinkType: next layer protocol index
341
+ self._prot = header.network
342
+ #: bool: nanosecond-timestamp PCAP flag
343
+ self._nsec = header.magic_number.nanosecond
344
+
345
+ if file is None:
346
+ _read = False
347
+ #: bytes: Raw packet data.
348
+ self._data = self.pack(**kwargs)
349
+ #: io.BytesIO: Source packet stream.
350
+ self._file = io.BytesIO(self._data)
351
+ else:
352
+ _read = True
353
+ #: io.BytesIO: Source packet stream.
354
+ self._file = io.BytesIO(file) if isinstance(file, bytes) else file
355
+
356
+ #: pcapkit.corekit.infoclass.Info: Parsed packet data.
357
+ self._info = self.unpack(length, _read=_read, **kwargs)
358
+
359
+ def __length_hint__(self) -> 'Literal[16]':
360
+ """Return an estimated length for the object."""
361
+ return 16
362
+
363
+ # NOTE: This is a hack to make the ``__index__`` method work both as a
364
+ # class method and an instance method.
365
+ def __index__(self: 'Optional[Frame]' = None) -> 'int': # type: ignore[override]
366
+ """Index of the frame.
367
+
368
+ Args:
369
+ self: :class:`Frame` object or :obj:`None`.
370
+
371
+ Returns:
372
+ If the object is initiated, i.e. :attr:`self._fnum <pcapkit.protocols.misc.pcap.frame.Frame._fnum>`
373
+ exists, returns the frame index number of itself; else raises :exc:`UnsupportedCall`.
374
+
375
+ Raises:
376
+ UnsupportedCall: This protocol has no registry entry.
377
+
378
+ """
379
+ if self is None:
380
+ raise UnsupportedCall("'Frame' object cannot be interpreted as an integer")
381
+ return self._fnum
382
+
383
+ ##########################################################################
384
+ # Utilities.
385
+ ##########################################################################
386
+
387
+ @classmethod
388
+ def _make_data(cls, data: 'Data_Frame') -> 'dict[str, Any]': # type: ignore[override]
389
+ """Create key-value pairs from ``data`` for protocol construction.
390
+
391
+ Args:
392
+ data: protocol data
393
+
394
+ Returns:
395
+ Key-value pairs for protocol construction.
396
+
397
+ """
398
+ return {
399
+ 'ts_src': data.frame_info.ts_sec,
400
+ 'ts_usec': data.frame_info.ts_usec,
401
+ 'incl_len': data.frame_info.incl_len,
402
+ 'orig_len': data.frame_info.orig_len,
403
+ 'packet': cls._make_payload(data),
404
+ }
405
+
406
+ def _make_timestamp(self, timestamp: 'Optional[float | Decimal | dt_type | int]' = None, ts_sec: 'Optional[int]' = None,
407
+ ts_usec: 'Optional[int]' = None, nanosecond: 'bool' = False) -> 'tuple[int, int]':
408
+ """Make timestamp.
409
+
410
+ Args:
411
+ timestamp: UNIX-Epoch timestamp
412
+ ts_sec: timestamp seconds
413
+ ts_usec: timestamp microseconds
414
+ nanosecond: nanosecond-resolution file flag
415
+
416
+ Returns:
417
+ Second and microsecond/nanosecond value of timestamp.
418
+
419
+ """
420
+ with localcontext(prec=64):
421
+ if timestamp is None:
422
+ if py37 and nanosecond:
423
+ timestamp = decimal.Decimal(time.time_ns()) / 1_000_000_000
424
+ else:
425
+ timestamp = decimal.Decimal(time.time())
426
+ else:
427
+ if isinstance(timestamp, datetime.datetime):
428
+ timestamp = timestamp.timestamp()
429
+ timestamp = decimal.Decimal(timestamp)
430
+
431
+ if ts_sec is None:
432
+ ts_sec = int(timestamp)
433
+
434
+ if ts_usec is None:
435
+ ts_usec = int((timestamp - ts_sec) * (1_000_000_000 if nanosecond else 1_000_000))
436
+
437
+ return ts_sec, ts_usec
438
+
439
+ def _decode_next_layer(self, dict_: 'Data_Frame', proto: 'Optional[int]' = None,
440
+ length: 'Optional[int]' = None, *, packet: 'Optional[dict[str, Any]]' = None) -> 'Data_Frame': # pylint: disable=arguments-differ
441
+ r"""Decode next layer protocol.
442
+
443
+ Arguments:
444
+ dict\_: info buffer
445
+ proto: next layer protocol index
446
+ length: valid (*non-padding*) length
447
+ packet: packet info (passed from :meth:`self.unpack <pcapkit.protocols.protocol.Protocol.unpack>`)
448
+
449
+ Returns:
450
+ Current protocol with packet extracted.
451
+
452
+ Notes:
453
+ We added a new key ``__next_type__`` to ``dict_`` to store the
454
+ next layer protocol type, and a new key ``__next_name__`` to
455
+ store the next layer protocol name. These two keys will **NOT**
456
+ be included when :meth:`Info.to_dict <pcapkit.corekit.infoclass.Info.to_dict>` is called.
457
+
458
+ We also added a new key ``protocols`` to ``dict_`` to store the
459
+ protocol chain of the current packet (frame).
460
+
461
+ """
462
+ next_ = cast('Protocol', self._import_next_layer(proto, length, packet=packet)) # type: ignore[misc,call-arg,redundant-cast]
463
+ info, chain = next_.info, next_.protochain
464
+
465
+ # make next layer protocol name
466
+ layer = next_.info_name
467
+ # proto = next_.__class__.__name__
468
+
469
+ # write info and protocol chain into dict
470
+ dict_.__update__({
471
+ layer: info,
472
+ 'protocols': chain.chain if chain else '',
473
+ '__next_type__': type(next_),
474
+ '__next_name__': layer,
475
+ })
476
+ self._next = next_ # pylint: disable=attribute-defined-outside-init
477
+ self._protos = chain # pylint: disable=attribute-defined-outside-init
478
+ return dict_