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,306 @@
1
+ # -*- coding: utf-8 -*-
2
+ """DPKT Tools
3
+ ================
4
+
5
+ .. module:: pcapkit.toolkit.dpkt
6
+
7
+ :mod:`pcapkit.toolkit.dpkt` contains all you need for
8
+ :mod:`pcapkit` handy usage with `DPKT`_ engine. All reforming
9
+ functions returns with a flag to indicate if usable for
10
+ its caller.
11
+
12
+ .. _DPKT: https://dpkt.readthedocs.io
13
+
14
+ """
15
+ import ipaddress
16
+ from typing import TYPE_CHECKING, cast
17
+
18
+ from pcapkit.const.reg.transtype import TransType as Enum_TransType
19
+ from pcapkit.foundation.reassembly.data.ip import Packet as IP_Packet
20
+ from pcapkit.foundation.reassembly.data.tcp import Packet as TCP_Packet
21
+ from pcapkit.foundation.traceflow.data.tcp import Packet as TF_TCP_Packet
22
+
23
+ if TYPE_CHECKING:
24
+ from ipaddress import IPv4Address, IPv6Address
25
+ from typing import Any, Optional
26
+
27
+ from dpkt.dpkt import Packet
28
+ from dpkt.ip import IP
29
+ from dpkt.ip6 import IP6, IP6FragmentHeader
30
+ from dpkt.tcp import TCP
31
+
32
+ from pcapkit.const.reg.linktype import LinkType as Enum_LinkType
33
+
34
+ __all__ = [
35
+ 'ipv6_hdr_len', 'packet2chain', 'packet2dict',
36
+ 'ipv4_reassembly', 'ipv6_reassembly', 'tcp_reassembly', 'tcp_traceflow'
37
+ ]
38
+
39
+
40
+ def ipv6_hdr_len(ipv6: 'IP6') -> 'int':
41
+ """Calculate length of headers before IPv6 Fragment header.
42
+
43
+ Args:
44
+ ipv6: DPKT IPv6 packet.
45
+
46
+ Returns:
47
+ Length of headers before IPv6 Fragment header
48
+ :class:`dpkt.ip6.IP6FragmentHeader` (:rfc:`2460#section-4.5`).
49
+
50
+ As specified in :rfc:`2460#section-4.1`, such headers (before the IPv6 Fragment Header)
51
+ includes Hop-by-Hop Options header :class:`dpkt.ip6.IP6HopOptsHeader` (:rfc:`2460#section-4.3`),
52
+ Destination Options header :class:`dpkt.ip6.IP6DstOptHeader` (:rfc:`2460#section-4.6`) and
53
+ Routing header :class:`dpkt.ip6.IP6RoutingHeader` (:rfc:`2460#section-4.4`).
54
+
55
+ """
56
+ hdr_len = ipv6.__hdr_len__
57
+ # IP6HopOptsHeader / IP6DstOptHeader / IP6RoutingHeader
58
+ for code in (0, 60, 43):
59
+ ext_hdr = ipv6.extension_hdrs.get(code)
60
+ if ext_hdr is not None:
61
+ hdr_len += ext_hdr.length
62
+ return hdr_len
63
+
64
+
65
+ def packet2chain(packet: 'Packet') -> 'str':
66
+ """Fetch DPKT packet protocol chain.
67
+
68
+ Args:
69
+ packet: DPKT packet.
70
+
71
+ Returns:
72
+ Colon (``:``) seperated list of protocol chain.
73
+
74
+ """
75
+ chain = [type(packet).__name__]
76
+ payload = packet.data
77
+ while not isinstance(payload, bytes):
78
+ chain.append(type(payload).__name__)
79
+ payload = payload.data
80
+ return ':'.join(chain)
81
+
82
+
83
+ def packet2dict(packet: 'Packet', timestamp: 'float', *,
84
+ data_link: 'Enum_LinkType') -> 'dict[str, Any]':
85
+ """Convert DPKT packet into :obj:`dict`.
86
+
87
+ Args:
88
+ packet: Scapy packet.
89
+ timestamp: Timestamp of packet.
90
+ data_link: Data link type.
91
+
92
+ Returns:
93
+ Dict[str, Any]: A :obj:`dict` mapping of packet data.
94
+
95
+ """
96
+ def wrapper(packet: 'Packet') -> 'dict[str, Any]':
97
+ dict_ = {} # type: dict[str, Any]
98
+ for field in packet.__hdr_fields__:
99
+ dict_[field] = getattr(packet, field, None)
100
+ payload = packet.data
101
+ if not isinstance(payload, bytes):
102
+ dict_[type(payload).__name__] = wrapper(payload)
103
+ return dict_
104
+
105
+ return {
106
+ 'timestamp': timestamp,
107
+ 'packet': packet.pack(),
108
+ data_link.name: wrapper(packet),
109
+ }
110
+
111
+
112
+ def ipv4_reassembly(packet: 'Packet', *, count: 'int' = -1) -> 'IP_Packet[IPv4Address] | None':
113
+ """Make data for IPv4 reassembly.
114
+
115
+ Args:
116
+ packet: DPKT packet.
117
+ count: Packet index. If not provided, default to ``-1``.
118
+
119
+ Returns:
120
+ Data for IPv4 reassembly.
121
+
122
+ * If the ``packet`` can be used for IPv4 reassembly. A packet can be reassembled
123
+ if it contains IPv4 layer (:class:`dpkt.ip.IP`) and the **DF** (:attr:`dpkt.ip.IP.df`)
124
+ flag is :data:`False`.
125
+ * If the ``packet`` can be reassembled, then the :obj:`dict` mapping of data for IPv4
126
+ reassembly (:term:`reasm.ipv4.packet`) will be returned; otherwise, returns :data:`None`.
127
+
128
+ See Also:
129
+ :class:`pcapkit.foundation.reassembly.ipv4.IPv4`
130
+
131
+ """
132
+ ipv4 = getattr(packet, 'ip', None) # type: Optional[IP]
133
+ if ipv4 is not None:
134
+ if ipv4.df: # dismiss not fragmented packet
135
+ return None
136
+
137
+ data = IP_Packet(
138
+ bufid=(
139
+ cast('IPv4Address',
140
+ ipaddress.ip_address(ipv4.src)), # source IP address
141
+ cast('IPv4Address',
142
+ ipaddress.ip_address(ipv4.dst)), # destination IP address
143
+ ipv4.id, # identification
144
+ Enum_TransType.get(ipv4.p).name, # payload protocol type
145
+ ),
146
+ num=count, # original packet range number
147
+ fo=ipv4.off, # fragment offset
148
+ ihl=ipv4.__hdr_len__, # internet header length
149
+ mf=bool(ipv4.mf), # more fragment flag
150
+ tl=ipv4.len, # total length, header includes
151
+ header=ipv4.pack()[:ipv4.__hdr_len__], # raw bytes type header
152
+ payload=bytearray(ipv4.pack()[ipv4.__hdr_len__:]), # raw bytearray type payload
153
+ )
154
+ return data
155
+ return None
156
+
157
+
158
+ def ipv6_reassembly(packet: 'Packet', *, count: 'int' = -1) -> 'IP_Packet[IPv6Address] | None':
159
+ """Make data for IPv6 reassembly.
160
+
161
+ Args:
162
+ packet: DPKT packet.
163
+ count: Packet index. If not provided, default to ``-1``.
164
+
165
+ Returns:
166
+ Data for IPv6 reassembly.
167
+
168
+ * If the ``packet`` can be used for IPv6 reassembly. A packet can be reassembled
169
+ if it contains IPv6 layer (:class:`dpkt.ip6.IP6`) and IPv6 Fragment header
170
+ (:rfc:`2460#section-4.5`, i.e., :class:`dpkt.ip6.IP6FragmentHeader`).
171
+ * If the ``packet`` can be reassembled, then the :obj:`dict` mapping of data for IPv6
172
+ reassembly (:term:`reasm.ipv6.packet`) will be returned; otherwise, returns :data:`None`.
173
+
174
+ See Also:
175
+ :class:`pcapkit.foundation.reassembly.ipv6.IPv6`
176
+
177
+ """
178
+ ipv6 = getattr(packet, 'ip6', None) # type: Optional[IP6]
179
+ if ipv6 is not None:
180
+ ipv6_frag = ipv6.extension_hdrs.get(44) # type: Optional[IP6FragmentHeader]
181
+ if ipv6_frag is None: # dismiss not fragmented packet
182
+ return None
183
+ hdr_len = ipv6_hdr_len(ipv6)
184
+
185
+ data = IP_Packet(
186
+ bufid=(
187
+ cast('IPv6Address',
188
+ ipaddress.ip_address(ipv6.src)), # source IP address
189
+ cast('IPv6Address',
190
+ ipaddress.ip_address(ipv6.dst)), # destination IP address
191
+ ipv6.flow, # label
192
+ Enum_TransType.get(ipv6_frag.nh).name, # next header field in IPv6 Fragment Header
193
+ ),
194
+ num=count, # original packet range number
195
+ fo=ipv6_frag.nxt, # fragment offset
196
+ ihl=hdr_len, # header length, only headers before IPv6-Frag
197
+ mf=bool(ipv6_frag.m_flag), # more fragment flag
198
+ tl=len(ipv6), # total length, header includes
199
+ header=ipv6.pack()[:hdr_len], # raw bytearray type header before IPv6-Frag
200
+ payload=bytearray(ipv6.pack()[hdr_len+ipv6_frag:]), # raw bytearray type payload after IPv6-Frag
201
+ )
202
+ return data
203
+ return None
204
+
205
+
206
+ def tcp_reassembly(packet: 'Packet', *, count: 'int' = -1) -> 'TCP_Packet | None':
207
+ """Make data for TCP reassembly.
208
+
209
+ Args:
210
+ packet: DPKT packet.
211
+ count: Packet index. If not provided, default to ``-1``.
212
+
213
+ Returns:
214
+ Data for TCP reassembly.
215
+
216
+ * If the ``packet`` can be used for TCP reassembly. A packet can be reassembled
217
+ if it contains TCP layer (:class:`dpkt.tcp.TCP`).
218
+ * If the ``packet`` can be reassembled, then the :obj:`dict` mapping of data for TCP
219
+ reassembly (:term:`reasm.tcp.packet`) will be returned; otherwise, returns :data:`None`.
220
+
221
+ See Also:
222
+ :class:`pcapkit.foundation.reassembly.tcp.TCP`
223
+
224
+ """
225
+ if hasattr(packet, 'ip'):
226
+ ip = cast('IP', packet.ip)
227
+ elif hasattr(packet, 'ip6'):
228
+ ip = cast('IP6', packet.ip6)
229
+ else:
230
+ return None
231
+
232
+ tcp = getattr(ip, 'tcp', None) # type: Optional[TCP]
233
+ if tcp is not None:
234
+ flags = bin(tcp.flags)[2:].zfill(8)
235
+ raw_len = len(tcp.data) # payload length, header excludes
236
+
237
+ data = TCP_Packet(
238
+ bufid=(
239
+ ipaddress.ip_address(ip.src), # source IP address
240
+ tcp.sport, # source port
241
+ ipaddress.ip_address(ip.dst), # destination IP address
242
+ tcp.dport, # destination port
243
+ ),
244
+ num=count, # original packet range number
245
+ ack=tcp.ack, # acknowledgement
246
+ dsn=tcp.seq, # data sequence number
247
+ rst=bool(int(flags[5])), # reset connection flag
248
+ syn=bool(int(flags[6])), # synchronise flag
249
+ fin=bool(int(flags[7])), # finish flag
250
+ header=tcp.pack()[:tcp.__hdr_len__], # raw bytes type header
251
+ payload=bytearray(tcp.pack()[tcp.__hdr_len__:]), # raw bytearray type payload
252
+ first=tcp.seq, # this sequence number
253
+ last=tcp.seq + raw_len, # next (wanted) sequence number
254
+ len=raw_len, # payload length, header excludes
255
+ )
256
+ return data
257
+ return None
258
+
259
+
260
+ def tcp_traceflow(packet: 'Packet', timestamp: 'float', *,
261
+ data_link: 'Enum_LinkType', count: 'int' = -1) -> 'TF_TCP_Packet | None':
262
+ """Trace packet flow for TCP.
263
+
264
+ Args:
265
+ packet: DPKT packet.
266
+ timestamp: Timestamp of the packet.
267
+ data_link: Data link layer protocol (from global header).
268
+ count: Packet index. If not provided, default to ``-1``.
269
+
270
+ Returns:
271
+ Data for TCP reassembly.
272
+
273
+ * If the ``packet`` can be used for TCP flow tracing. A packet can be reassembled
274
+ if it contains TCP layer (:class:`dpkt.tcp.TCP`).
275
+ * If the ``packet`` can be reassembled, then the :obj:`dict` mapping of data for TCP
276
+ flow tracing (:term:`trace.tcp.packet`) will be returned; otherwise, returns :data:`None`.
277
+
278
+ See Also:
279
+ :class:`pcapkit.foundation.traceflow.tcp.TCP`
280
+
281
+ """
282
+ if hasattr(packet, 'ip'):
283
+ ip = cast('IP', packet.ip)
284
+ elif hasattr(packet, 'ip6'):
285
+ ip = cast('IP6', packet.ip6)
286
+ else:
287
+ return None
288
+
289
+ tcp = getattr(ip, 'tcp', None) # type: Optional[TCP]
290
+ if tcp is not None:
291
+ flags = bin(tcp.flags)[2:].zfill(8)
292
+
293
+ data = TF_TCP_Packet( # type: ignore[type-var]
294
+ protocol=data_link, # data link type from global header
295
+ index=count, # frame number
296
+ frame=packet2dict(packet, timestamp, data_link=data_link), # extracted packet
297
+ syn=bool(int(flags[6])), # TCP synchronise (SYN) flag
298
+ fin=bool(int(flags[7])), # TCP finish (FIN) flag
299
+ src=ipaddress.ip_address(ip.src), # source IP
300
+ dst=ipaddress.ip_address(ip.dst), # destination IP
301
+ srcport=tcp.sport, # TCP source port
302
+ dstport=tcp.dport, # TCP destination port
303
+ timestamp=timestamp, # timestamp
304
+ )
305
+ return data
306
+ return None
@@ -0,0 +1,212 @@
1
+ # -*- coding: utf-8 -*-
2
+ """PCAP Tools
3
+ ================
4
+
5
+ .. module:: pcapkit.toolkit.pcap
6
+
7
+ :mod:`pcapkit.toolkit.pcap` contains all you need for
8
+ :mod:`pcapkit` handy usage of PCAP file format. All
9
+ functions returns with a flag to indicate if usable
10
+ for its caller.
11
+
12
+ """
13
+ from typing import TYPE_CHECKING, cast
14
+
15
+ from pcapkit.const.ipv6.extension_header import ExtensionHeader as Enum_ExtensionHeader
16
+ from pcapkit.foundation.reassembly.data.ip import Packet as IP_Packet
17
+ from pcapkit.foundation.reassembly.data.tcp import Packet as TCP_Packet
18
+ from pcapkit.foundation.traceflow.data.tcp import Packet as TF_TCP_Packet
19
+
20
+ if TYPE_CHECKING:
21
+ from ipaddress import IPv4Address, IPv6Address
22
+
23
+ from pcapkit.const.reg.linktype import LinkType
24
+ from pcapkit.protocols.internet.ipv4 import IPv4
25
+ from pcapkit.protocols.internet.ipv6 import IPv6
26
+ from pcapkit.protocols.internet.ipv6_frag import IPv6_Frag
27
+ from pcapkit.protocols.misc.pcap import Frame
28
+ from pcapkit.protocols.transport.tcp import TCP
29
+
30
+ __all__ = ['ipv4_reassembly', 'ipv6_reassembly', 'tcp_reassembly', 'tcp_traceflow']
31
+
32
+
33
+ def ipv4_reassembly(frame: 'Frame') -> 'IP_Packet[IPv4Address] | None':
34
+ """Make data for IPv4 reassembly.
35
+
36
+ Args:
37
+ frame: PCAP frame.
38
+
39
+ Returns:
40
+ Data for IPv4 reassembly.
41
+
42
+ * If the ``frame`` can be used for IPv4 reassembly. A frame can be reassembled
43
+ if it contains IPv4 layer (:class:`~pcapkit.protocols.internet.ipv4.IPv4`) and
44
+ the **DF** (:attr:`IPv4.flags.df <pcapkit.protocols.data.internet.ipv4.Flags.df>`)
45
+ flag is :data:`False`.
46
+ * If the ``frame`` can be reassembled, then the :obj:`dict` mapping of data for IPv4
47
+ reassembly (c.f. :term:`reasm.ipv4.packet`) will be returned; otherwise, returns :data:`None`.
48
+
49
+ See Also:
50
+ :class:`pcapkit.foundation.reassembly.ipv4.IPv4`
51
+
52
+ """
53
+ if 'IPv4' in frame:
54
+ ipv4 = cast('IPv4', frame['IPv4'])
55
+ ipv4_info = ipv4.info
56
+ if ipv4_info.flags.df: # dismiss not fragmented frame
57
+ return None
58
+
59
+ data = IP_Packet(
60
+ bufid=(
61
+ ipv4_info.src, # source IP address
62
+ ipv4_info.dst, # destination IP address
63
+ ipv4_info.id, # identification
64
+ ipv4_info.protocol, # payload protocol type
65
+ ),
66
+ num=frame.info.number, # original packet range number
67
+ fo=ipv4_info.offset, # fragment offset
68
+ ihl=ipv4_info.hdr_len, # internet header length
69
+ mf=ipv4_info.flags.mf, # more fragment flag
70
+ tl=ipv4_info.len, # total length, header includes
71
+ header=ipv4.packet.header, # raw bytes type header
72
+ payload=bytearray(ipv4.packet.payload), # raw bytearray type payload
73
+ )
74
+ return data
75
+ return None
76
+
77
+
78
+ def ipv6_reassembly(frame: 'Frame') -> 'IP_Packet[IPv6Address] | None':
79
+ """Make data for IPv6 reassembly.
80
+
81
+ Args:
82
+ frame: PCAP frame.
83
+
84
+ Returns:
85
+ A tuple of data for IPv6 reassembly.
86
+
87
+ * If the ``frame`` can be used for IPv6 reassembly. A frame can be reassembled
88
+ if it contains IPv6 layer (:class:`~pcapkit.protocols.internet.ipv6.IPv6`) and
89
+ IPv6 Fragment header (:rfc:`2460#section-4.5`, i.e.,
90
+ :class:`~pcapkit.protocols.internet.ipv6_frag.IPv6_Frag`).
91
+ * If the ``frame`` can be reassembled, then the :obj:`dict` mapping of data for IPv6
92
+ reassembly (:term:`reasm.ipv6.packet`) will be returned; otherwise, returns :data:`None`.
93
+
94
+ See Also:
95
+ :class:`pcapkit.foundation.reassembly.ipv6.IPv6`
96
+
97
+ """
98
+ if 'IPv6' in frame:
99
+ ipv6 = cast('IPv6', frame['IPv6'])
100
+ ipv6_info = ipv6.info
101
+ if (ipv6_frag := ipv6.extension_headers.get( # type: ignore[call-overload]
102
+ Enum_ExtensionHeader.IPv6_Frag
103
+ )) is None: # dismiss not fragmented frame
104
+ return None
105
+ ipv6_frag_info = cast('IPv6_Frag', ipv6_frag).info
106
+
107
+ data = IP_Packet(
108
+ bufid=(
109
+ ipv6_info.src, # source IP address
110
+ ipv6_info.dst, # destination IP address
111
+ ipv6_info.label, # label
112
+ ipv6_frag_info.next, # next header field in IPv6 Fragment Header
113
+ ),
114
+ num=frame.info.number, # original packet range number
115
+ fo=ipv6_frag_info.offset, # fragment offset
116
+ ihl=ipv6_info.hdr_len, # header length, only headers before IPv6-Frag
117
+ mf=ipv6_frag_info.mf, # more fragment flag
118
+ tl=ipv6_info.hdr_len + ipv6_info.raw_len, # total length, header includes
119
+ header=ipv6_info.fragment.header, # raw bytearray type header before IPv6-Frag
120
+ payload=bytearray(ipv6_info.fragment.payload), # raw bytearray type payload after IPv6-Frag
121
+ )
122
+ return data
123
+ return None
124
+
125
+
126
+ def tcp_reassembly(frame: 'Frame') -> 'TCP_Packet | None':
127
+ """Make data for TCP reassembly.
128
+
129
+ Args:
130
+ frame: PCAP frame.
131
+
132
+ Returns:
133
+ A tuple of data for TCP reassembly.
134
+
135
+ * If the ``frame`` can be used for TCP reassembly. A frame can be reassembled
136
+ if it contains TCP layer (:class:`~pcapkit.protocols.transport.tcp.TCP`).
137
+ * If the ``frame`` can be reassembled, then the :obj:`dict` mapping of data for TCP
138
+ reassembly (:term:`reasm.tcp.packet`) will be returned; otherwise, returns :data:`None`.
139
+
140
+ See Also:
141
+ :class:`pcapkit.foundation.reassembly.tcp.TCP`
142
+
143
+ """
144
+ if 'TCP' in frame:
145
+ ip = cast('IPv4 | IPv6', frame['IP'])
146
+ ip_info = ip.info
147
+ tcp = cast('TCP', frame['TCP'])
148
+ tcp_info = tcp.info
149
+
150
+ raw_len = len(tcp.packet.payload)
151
+ data = TCP_Packet(
152
+ bufid=(
153
+ ip_info.src, # source IP address
154
+ tcp_info.srcport.port, # source port
155
+ ip_info.dst, # destination IP address
156
+ tcp_info.dstport.port, # destination port
157
+ ),
158
+ num=frame.info.number, # original packet range number
159
+ ack=tcp_info.ack, # acknowledgement
160
+ dsn=tcp_info.seq, # data sequence number
161
+ syn=tcp_info.flags.syn, # synchronise flag
162
+ fin=tcp_info.flags.fin, # finish flag
163
+ rst=tcp_info.flags.rst, # reset connection flag
164
+ header=tcp.packet.header, # raw bytes type header
165
+ payload=bytearray(tcp.packet.payload), # raw bytearray type payload
166
+ first=tcp_info.seq, # this sequence number
167
+ last=tcp_info.seq + raw_len, # next (wanted) sequence number
168
+ len=raw_len, # payload length, header excludes
169
+ )
170
+ return data
171
+ return None
172
+
173
+
174
+ def tcp_traceflow(frame: 'Frame', *, data_link: 'LinkType') -> 'TF_TCP_Packet | None':
175
+ """Trace packet flow for TCP.
176
+
177
+ Args:
178
+ frame: PCAP frame.
179
+ data_link: Data link layer protocol (from global header).
180
+
181
+ Returns:
182
+ Data for TCP reassembly.
183
+
184
+ * If the ``packet`` can be used for TCP flow tracing. A frame can be reassembled
185
+ if it contains TCP layer (:class:`~pcapkit.protocols.transport.tcp.TCP`).
186
+ * If the ``frame`` can be reassembled, then the :obj:`dict` mapping of data for TCP
187
+ flow tracing (:term:`trace.tcp.packet`) will be returned; otherwise, returns :data:`None`.
188
+
189
+ See Also:
190
+ :class:`pcapkit.foundation.traceflow.tcp.TCP`
191
+
192
+ """
193
+ if 'TCP' in frame:
194
+ ip = cast('IPv4 | IPv6', frame['IP'])
195
+ ip_info = ip.info
196
+ tcp = cast('TCP', frame['TCP'])
197
+ tcp_info = tcp.info
198
+
199
+ data = TF_TCP_Packet( # type: ignore[type-var]
200
+ protocol=data_link, # data link type from global header
201
+ index=frame.info.number, # frame number
202
+ frame=frame.info, # extracted frame info
203
+ syn=tcp_info.flags.syn, # TCP synchronise (SYN) flag
204
+ fin=tcp_info.flags.fin, # TCP finish (FIN) flag
205
+ src=ip_info.src, # source IP
206
+ dst=ip_info.dst, # destination IP
207
+ srcport=tcp_info.srcport.port, # TCP source port
208
+ dstport=tcp_info.dstport.port, # TCP destination port
209
+ timestamp=float(frame.info.time_epoch), # frame timestamp
210
+ )
211
+ return data
212
+ return None