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,928 @@
1
+ # -*- coding: utf-8 -*-
2
+ # mypy: disable-error-code=assignment
3
+ """header schema for transmission control protocol"""
4
+
5
+ import collections
6
+ from typing import TYPE_CHECKING
7
+
8
+ from pcapkit.const.reg.apptype import AppType as Enum_AppType
9
+ from pcapkit.const.reg.apptype import TransportProtocol as Enum_TransportProtocol
10
+ from pcapkit.const.tcp.checksum import Checksum as Enum_Checksum
11
+ from pcapkit.const.tcp.mp_tcp_option import MPTCPOption as Enum_MPTCPOption
12
+ from pcapkit.const.tcp.option import Option as Enum_Option
13
+ from pcapkit.corekit.fields.collections import ListField, OptionField
14
+ from pcapkit.corekit.fields.ipaddress import IPv4AddressField, IPv6AddressField
15
+ from pcapkit.corekit.fields.misc import (ConditionalField, ForwardMatchField, PayloadField,
16
+ SchemaField, SwitchField)
17
+ from pcapkit.corekit.fields.numbers import (EnumField, NumberField, UInt8Field, UInt16Field,
18
+ UInt32Field, UInt64Field)
19
+ from pcapkit.corekit.fields.strings import BitField, BytesField, PaddingField
20
+ from pcapkit.protocols.schema.schema import EnumSchema, Schema, schema_final
21
+ from pcapkit.utilities.exceptions import FieldError
22
+ from pcapkit.utilities.logging import SPHINX_TYPE_CHECKING
23
+
24
+ __all__ = [
25
+ 'TCP',
26
+
27
+ 'Option',
28
+ 'UnassignedOption', 'EndOfOptionList', 'NoOperation', 'MaximumSegmentSize', 'WindowScale',
29
+ 'SACKPermitted', 'SACK', 'Echo', 'EchoReply', 'Timestamps', 'PartialOrderConnectionPermitted',
30
+ 'PartialOrderServiceProfile', 'CC', 'CCNew', 'CCEcho', 'AlternateChecksumRequest',
31
+ 'AlternateChecksumData', 'MD5Signature', 'QuickStartResponse', 'UserTimeout',
32
+ 'Authentication', 'FastOpenCookie',
33
+
34
+ 'MPTCP',
35
+ 'MPTCPUnknown', 'MPTCPCapable', 'MPTCPDSS', 'MPTCPAddAddress', 'MPTCPRemoveAddress',
36
+ 'MPTCPPriority', 'MPTCPFallback', 'MPTCPFastclose',
37
+
38
+ 'MPTCPJoin',
39
+ 'MPTCPJoinSYN', 'MPTCPJoinSYNACK', 'MPTCPJoinACK',
40
+ ]
41
+
42
+ if TYPE_CHECKING:
43
+ from ipaddress import IPv4Address, IPv6Address
44
+ from typing import Any, DefaultDict, Optional, Type
45
+
46
+ from pcapkit.corekit.fields.field import FieldBase as Field
47
+ from pcapkit.protocols.protocol import ProtocolBase as Protocol
48
+
49
+ if SPHINX_TYPE_CHECKING:
50
+ from typing_extensions import TypedDict
51
+
52
+ class OffsetFlag(TypedDict):
53
+ """TCP offset field flag."""
54
+
55
+ #: Data offset.
56
+ offset: int
57
+ #: ECN-nonce concealment protection.
58
+ ns: int
59
+
60
+ class Flags(TypedDict):
61
+ """TCP flags."""
62
+
63
+ #: Congestion window reduced.
64
+ cwr: int
65
+ #: ECN-Echo.
66
+ ece: int
67
+ #: Urgent pointer.
68
+ urg: int
69
+ #: Acknowledgment.
70
+ ack: int
71
+ #: Push function.
72
+ psh: int
73
+ #: Reset connection.
74
+ rst: int
75
+ #: Synchronize sequence numbers.
76
+ syn: int
77
+ #: Last packet from sender.
78
+ fin: int
79
+
80
+ class POCProfile(TypedDict):
81
+ """TCP partial order connection service profile."""
82
+
83
+ #: Start flag.
84
+ start: int
85
+ #: End flag.
86
+ end: int
87
+
88
+ class QuickStartFlags(TypedDict):
89
+ """TCP quick start flags."""
90
+
91
+ #: Rate request.
92
+ rate: int
93
+
94
+ class QuickStartNonce(TypedDict):
95
+ """TCP quick start nonce."""
96
+
97
+ #: Nonce.
98
+ nonce: int
99
+
100
+ class TimeoutInfo(TypedDict):
101
+ """User timeout information."""
102
+
103
+ #: Granularity.
104
+ granularity: int
105
+ #: Timeout value.
106
+ timeout: int
107
+
108
+ class MPTCPSubtypeTest(TypedDict):
109
+ """TCP MPTCP subtype."""
110
+
111
+ #: Length.
112
+ length: int
113
+ #: Subtype.
114
+ subtype: int
115
+
116
+ class MPTCPSubtypeUnknown(TypedDict):
117
+ """TCP unknown MPTCP subtype field."""
118
+
119
+ #: Subtype.
120
+ subtype: int
121
+ #: Data.
122
+ data: int
123
+
124
+ class MPTCPSubtypeCapable(TypedDict):
125
+ """MPTCP Capable subtype field."""
126
+
127
+ #: Subtype.
128
+ subtype: int
129
+ #: Version.
130
+ version: int
131
+
132
+ class MPTCPCapableFlags(TypedDict):
133
+ """MPTCP Capable flags."""
134
+
135
+ #: Checksum required.
136
+ req: int
137
+ #: Extensibility flag.
138
+ ext: int
139
+ #: Use of HMAC-SHA1.
140
+ hsa: int
141
+
142
+ class MPTCPSubtypeJoin(TypedDict):
143
+ """MPTCP Join subtype field."""
144
+
145
+ #: Subtype.
146
+ subtype: int
147
+ #: Backup flag.
148
+ backup: int
149
+
150
+ class MPTCPSubtype(TypedDict):
151
+ """MPTCP subtype field."""
152
+
153
+ #: Subtype.
154
+ subtype: int
155
+
156
+ class MPTCPDSSFlags(TypedDict):
157
+ """MPTCP-DSS flags."""
158
+
159
+ #: ``DATA_FIN`` flag.
160
+ F: int
161
+ #: Data sequence number is 8 octets (if not set, DSN is 4 octets).
162
+ m: int
163
+ #: Data Sequence Number (DSN), Subflow Sequence Number (SSN), Data-Level
164
+ #: Length, and Checksum present.
165
+ M: int
166
+ #: Data ACK is 8 octets (if not set, Data ACK is 4 octets).
167
+ a: int
168
+ #: Data ACK present.
169
+ A: int
170
+
171
+ class MPTCPSubtypeAddAddress(TypedDict):
172
+ """MPTCP Add Address subtype field."""
173
+
174
+ #: Subtype.
175
+ subtype: int
176
+ #: IP version.
177
+ version: int
178
+
179
+ class MPTCPSubtypePriority(TypedDict):
180
+ """MPTCP Priority subtype field."""
181
+
182
+ #: Subtype.
183
+ subtype: int
184
+ #: Backup flag.
185
+ backup: int
186
+
187
+
188
+ def mptcp_data_selector(pkt: 'dict[str, Any]') -> 'Field':
189
+ """Selector function for :attr:`_MPTCP.data` field.
190
+
191
+ Args:
192
+ pkt: Packet data.
193
+
194
+ Returns:
195
+ A :class:`~pcapkit.corekit.fields.misc.SchemaField` wrapped
196
+ :class:`~pcapkit.protocols.schema.transport.tcp.MPTCP` subclass
197
+ instance.
198
+
199
+ """
200
+ subtype = Enum_MPTCPOption.get(pkt['test']['subtype'])
201
+ pkt['test']['subtype'] = subtype
202
+ schema = MPTCP.registry[subtype]
203
+
204
+ if subtype == Enum_MPTCPOption.MP_JOIN and schema is MPTCPJoin: # placeholder
205
+ if pkt['flags']['syn'] == 1 and pkt['flags']['ack'] == 0:
206
+ schema = MPTCPJoinSYN
207
+ elif pkt['flags']['syn'] == 1 and pkt['flags']['ack'] == 1:
208
+ schema = MPTCPJoinSYNACK
209
+ elif pkt['flags']['syn'] == 0 and pkt['flags']['ack'] == 1:
210
+ schema = MPTCPJoinACK
211
+ else:
212
+ raise FieldError(f'TCP: [OptNo {Enum_Option.Multipath_TCP}] {Enum_MPTCPOption.MP_JOIN} invalid flags')
213
+ return SchemaField(length=pkt['test']['length'], schema=schema)
214
+
215
+
216
+ def mptcp_add_address_selector(pkt: 'dict[str, Any]') -> 'Field':
217
+ """Selector function for :attr:`MPTCPAddAddress.address` field.
218
+
219
+ Args:
220
+ pkt: Packet data.
221
+
222
+ Returns:
223
+ * If IP version is 4, a :class:`~pcapkit.corekit.fields.ipaddress.IPv4AddressField`
224
+ instance.
225
+ * If IP version is 6, a :class:`~pcapkit.corekit.fields.ipaddress.IPv6AddressField`
226
+ instance.
227
+
228
+ """
229
+ if pkt['test']['version'] == 4:
230
+ return IPv4AddressField()
231
+ if pkt['test']['version'] == 6:
232
+ return IPv6AddressField()
233
+ raise FieldError(f'TCP: [OptNo {Enum_Option.Multipath_TCP}] {Enum_MPTCPOption.ADD_ADDR} invalid IP version')
234
+
235
+
236
+ class PortEnumField(EnumField):
237
+ """Enumerated value for protocol fields.
238
+
239
+ Args:
240
+ length: Field size (in bytes); if a callable is given, it should return
241
+ an integer value and accept the current packet as its only argument.
242
+ default: Field default value, if any.
243
+ signed: Whether the field is signed.
244
+ byteorder: Field byte order.
245
+ bit_length: Field bit length.
246
+ callback: Callback function to be called upon
247
+ :meth:`self.__call__ <pcapkit.corekit.fields.field.FieldBase.__call__>`.
248
+
249
+ Important:
250
+ This class is specifically designed for :class:`~pcapkit.const.reg.apptype.AppType`
251
+ as it is actually a :class:`~enum.StrEnum` class.
252
+
253
+ """
254
+ if TYPE_CHECKING:
255
+ _namespace: 'Enum_AppType'
256
+
257
+ def pre_process(self, value: 'int | Enum_AppType', packet: 'dict[str, Any]') -> 'int | bytes':
258
+ """Process field value before construction (packing).
259
+
260
+ Arguments:
261
+ value: Field value.
262
+ packet: Packet data.
263
+
264
+ Returns:
265
+ Processed field value.
266
+
267
+ """
268
+ if isinstance(value, Enum_AppType):
269
+ value = value.port
270
+ return super().pre_process(value, packet)
271
+
272
+ def post_process(self, value: 'int | bytes', packet: 'dict[str, Any]') -> 'Enum_AppType':
273
+ """Process field value after parsing (unpacked).
274
+
275
+ Args:
276
+ value: Field value.
277
+ packet: Packet data.
278
+
279
+ Returns:
280
+ Processed field value.
281
+
282
+ """
283
+ value = super(EnumField, self).post_process(value, packet)
284
+ return self._namespace.get(value, proto=Enum_TransportProtocol.tcp)
285
+
286
+
287
+ class Option(EnumSchema[Enum_Option]):
288
+ """Header schema for TCP options."""
289
+
290
+ __default__ = lambda: UnassignedOption
291
+
292
+ #: Option kind.
293
+ kind: 'Enum_Option' = EnumField(length=1, namespace=Enum_Option)
294
+ #: Option length.
295
+ length: 'int' = ConditionalField(
296
+ UInt8Field(),
297
+ lambda pkt: pkt['kind'] not in (Enum_Option.End_of_Option_List, Enum_Option.No_Operation),
298
+ )
299
+
300
+ def post_process(self, packet: 'dict[str, Any]') -> 'Schema':
301
+ """Revise ``schema`` data after unpacking process.
302
+
303
+ Args:
304
+ packet: Unpacked data.
305
+
306
+ Returns:
307
+ Revised schema.
308
+
309
+ """
310
+ # for EOOL/NOP option, length is always 1
311
+ if self.kind in (Enum_Option.End_of_Option_List, Enum_Option.No_Operation):
312
+ self.length = 1
313
+ return self
314
+
315
+
316
+ @schema_final
317
+ class UnassignedOption(Option):
318
+ """Header schema for TCP unassigned options."""
319
+
320
+ #: Option data.
321
+ data: 'bytes' = BytesField(length=lambda pkt: pkt['length'] - 2)
322
+
323
+ if TYPE_CHECKING:
324
+ def __init__(self, kind: 'Enum_Option', length: 'int', data: 'bytes') -> 'None': ...
325
+
326
+
327
+ @schema_final
328
+ class EndOfOptionList(Option, code=Enum_Option.End_of_Option_List):
329
+ """Header schema for TCP end of option list."""
330
+
331
+ if TYPE_CHECKING:
332
+ def __init__(self, kind: 'Enum_Option', length: 'int') -> 'None': ...
333
+
334
+
335
+ @schema_final
336
+ class NoOperation(Option, code=Enum_Option.No_Operation):
337
+ """Header schema for TCP no operation."""
338
+
339
+ if TYPE_CHECKING:
340
+ def __init__(self, kind: 'Enum_Option', length: 'int') -> 'None': ...
341
+
342
+
343
+ @schema_final
344
+ class MaximumSegmentSize(Option, code=Enum_Option.Maximum_Segment_Size):
345
+ """Header schema for TCP max segment size option."""
346
+
347
+ #: Maximum segment size.
348
+ mss: 'int' = UInt16Field()
349
+
350
+ if TYPE_CHECKING:
351
+ def __init__(self, kind: 'Enum_Option', length: 'int', mss: 'int') -> 'None': ...
352
+
353
+
354
+ @schema_final
355
+ class WindowScale(Option, code=Enum_Option.Window_Scale):
356
+ """Header schema for TCP window scale option."""
357
+
358
+ #: Window scale (shift count).
359
+ shift: 'int' = UInt8Field()
360
+
361
+ if TYPE_CHECKING:
362
+ def __init__(self, kind: 'Enum_Option', length: 'int', scale: 'int') -> 'None': ...
363
+
364
+
365
+ @schema_final
366
+ class SACKPermitted(Option, code=Enum_Option.SACK_Permitted):
367
+ """Header schema for TCP SACK permitted option."""
368
+
369
+ if TYPE_CHECKING:
370
+ def __init__(self, kind: 'Enum_Option', length: 'int') -> 'None': ...
371
+
372
+
373
+ @schema_final
374
+ class SACKBlock(Schema):
375
+ """Header schema for TCP SACK option data."""
376
+
377
+ #: Left edge of the block.
378
+ left: 'int' = UInt32Field()
379
+ #: Right edge of the block.
380
+ right: 'int' = UInt32Field()
381
+
382
+ if TYPE_CHECKING:
383
+ def __init__(self, left: 'int', right: 'int') -> 'None': ...
384
+
385
+
386
+ @schema_final
387
+ class SACK(Option, code=Enum_Option.SACK):
388
+ """Header schema for TCP SACK option."""
389
+
390
+ #: Selected ACK data.
391
+ sack: 'list[SACKBlock]' = ListField(
392
+ length=lambda pkt: pkt['length'] - 2,
393
+ item_type=SchemaField(length=8, schema=SACKBlock),
394
+ )
395
+
396
+ if TYPE_CHECKING:
397
+ def __init__(self, kind: 'Enum_Option', length: 'int', sack: 'list[SACKBlock]') -> 'None': ...
398
+
399
+
400
+ @schema_final
401
+ class Echo(Option, code=Enum_Option.Echo):
402
+ """Header schema for TCP echo option."""
403
+
404
+ #: Info to be echoed.
405
+ data: 'bytes' = BytesField(length=4)
406
+
407
+ if TYPE_CHECKING:
408
+ def __init__(self, kind: 'Enum_Option', length: 'int', data: 'bytes') -> 'None': ...
409
+
410
+
411
+ @schema_final
412
+ class EchoReply(Option, code=Enum_Option.Echo_Reply):
413
+ """Header schema for TCP echo reply option."""
414
+
415
+ #: Echoed info.
416
+ data: 'bytes' = BytesField(length=4)
417
+
418
+ if TYPE_CHECKING:
419
+ def __init__(self, kind: 'Enum_Option', length: 'int', data: 'bytes') -> 'None': ...
420
+
421
+
422
+ @schema_final
423
+ class Timestamps(Option, code=Enum_Option.Timestamps):
424
+ """Header schema for TCP timestamps option."""
425
+
426
+ #: Timestamp value.
427
+ value: 'int' = UInt32Field()
428
+ #: Timestamp echo reply.
429
+ reply: 'int' = UInt32Field()
430
+
431
+ if TYPE_CHECKING:
432
+ def __init__(self, kind: 'Enum_Option', length: 'int', value: 'int', reply: 'int') -> 'None': ...
433
+
434
+
435
+ @schema_final
436
+ class PartialOrderConnectionPermitted(Option, code=Enum_Option.Partial_Order_Connection_Permitted):
437
+ """Header schema for TCP partial order connection permitted option."""
438
+
439
+ if TYPE_CHECKING:
440
+ def __init__(self, kind: 'Enum_Option', length: 'int') -> 'None': ...
441
+
442
+
443
+ @schema_final
444
+ class PartialOrderServiceProfile(Option, code=Enum_Option.Partial_Order_Service_Profile):
445
+ """Header schema for TCP partial order connection service profile option."""
446
+
447
+ #: Profile data.
448
+ profile: 'POCProfile' = BitField(length=1, namespace={
449
+ 'start': (0, 1),
450
+ 'end': (1, 1),
451
+ })
452
+
453
+ if TYPE_CHECKING:
454
+ def __init__(self, kind: 'Enum_Option', length: 'int', profile: 'POCProfile') -> 'None': ...
455
+
456
+
457
+ @schema_final
458
+ class CC(Option, code=Enum_Option.CC):
459
+ """Header schema for TCP CC option."""
460
+
461
+ #: Connection count.
462
+ count: 'int' = UInt32Field()
463
+
464
+ if TYPE_CHECKING:
465
+ def __init__(self, kind: 'Enum_Option', length: 'int', count: 'int') -> 'None': ...
466
+
467
+
468
+ @schema_final
469
+ class CCNew(Option, code=Enum_Option.CC_NEW):
470
+ """Header schema for TCP connection count (new) option."""
471
+
472
+ #: Connection count.
473
+ count: 'int' = UInt32Field()
474
+
475
+ if TYPE_CHECKING:
476
+ def __init__(self, kind: 'Enum_Option', length: 'int', count: 'int') -> 'None': ...
477
+
478
+
479
+ @schema_final
480
+ class CCEcho(Option, code=Enum_Option.CC_ECHO):
481
+ """Header schema for TCP connection count (echo) option."""
482
+
483
+ #: Connection count.
484
+ count: 'int' = UInt32Field()
485
+
486
+ if TYPE_CHECKING:
487
+ def __init__(self, kind: 'Enum_Option', length: 'int', count: 'int') -> 'None': ...
488
+
489
+
490
+ @schema_final
491
+ class AlternateChecksumRequest(Option, code=Enum_Option.TCP_Alternate_Checksum_Request):
492
+ """Header schema for TCP alternate checksum request option."""
493
+
494
+ #: Checksum algorithm.
495
+ algorithm: 'Enum_Checksum' = EnumField(length=1, namespace=Enum_Checksum)
496
+
497
+ if TYPE_CHECKING:
498
+ def __init__(self, kind: 'Enum_Option', length: 'int', algorithm: 'Enum_Checksum') -> 'None': ...
499
+
500
+
501
+ @schema_final
502
+ class AlternateChecksumData(Option, code=Enum_Option.TCP_Alternate_Checksum_Data):
503
+ """Header schema for TCP alternate checksum data option."""
504
+
505
+ #: Checksum data.
506
+ data: 'bytes' = BytesField(length=lambda pkt: pkt['length'] - 2)
507
+
508
+ if TYPE_CHECKING:
509
+ def __init__(self, kind: 'Enum_Option', length: 'int', data: 'bytes') -> 'None': ...
510
+
511
+
512
+ @schema_final
513
+ class MD5Signature(Option, code=Enum_Option.MD5_Signature_Option):
514
+ """Header schema for TCP MD5 signature option."""
515
+
516
+ #: MD5 digest.
517
+ digest: 'bytes' = BytesField(length=16)
518
+
519
+ if TYPE_CHECKING:
520
+ def __init__(self, kind: 'Enum_Option', length: 'int', digest: 'bytes') -> 'None': ...
521
+
522
+
523
+ @schema_final
524
+ class QuickStartResponse(Option, code=Enum_Option.Quick_Start_Response):
525
+ """Header schema for TCP quick start response option."""
526
+
527
+ #: Flags.
528
+ flags: 'QuickStartFlags' = BitField(length=1, namespace={
529
+ 'rate': (4, 4),
530
+ })
531
+ #: TTL difference.
532
+ diff: 'int' = UInt8Field()
533
+ #: QS nonce.
534
+ nonce: 'QuickStartNonce' = BitField(length=4, namespace={
535
+ 'nonce': (0, 30),
536
+ })
537
+
538
+ if TYPE_CHECKING:
539
+ def __init__(self, kind: 'Enum_Option', length: 'int', flags: 'QuickStartFlags', diff: 'int', nonce: 'QuickStartNonce') -> 'None': ...
540
+
541
+
542
+ @schema_final
543
+ class UserTimeout(Option, code=Enum_Option.User_Timeout_Option):
544
+ """Header schema for TCP user timeout option."""
545
+
546
+ #: Granularity and user timeout.
547
+ info: 'TimeoutInfo' = BitField(length=2, namespace={
548
+ 'granularity': (0, 1),
549
+ 'timeout': (1, 15),
550
+ })
551
+
552
+ if TYPE_CHECKING:
553
+ def __init__(self, kind: 'Enum_Option', length: 'int', info: 'TimeoutInfo') -> 'None': ...
554
+
555
+
556
+ @schema_final
557
+ class Authentication(Option, code=Enum_Option.TCP_Authentication_Option):
558
+ """Header schema for TCP authentication option."""
559
+
560
+ #: Key ID.
561
+ key_id: 'int' = UInt8Field()
562
+ #: Next key ID.
563
+ next_key_id: 'int' = UInt8Field()
564
+ #: MAC value.
565
+ mac: 'bytes' = BytesField(length=lambda pkt: pkt['length'] - 4)
566
+
567
+ if TYPE_CHECKING:
568
+ def __init__(self, kind: 'Enum_Option', length: 'int', key_id: 'int', next_key_id: 'int', mac: 'bytes') -> 'None': ...
569
+
570
+
571
+ @schema_final
572
+ class _MPTCP(Schema):
573
+ """Header schema for Multipath TCP options in a generic representation."""
574
+
575
+ #: Subtype and flags.
576
+ test: 'MPTCPSubtypeTest' = ForwardMatchField(BitField(length=3, namespace={
577
+ 'length': (1, 8),
578
+ 'subtype': (16, 4),
579
+ }))
580
+ #: Subtype-specific data.
581
+ data: 'MPTCP' = SwitchField(
582
+ selector=mptcp_data_selector,
583
+ )
584
+
585
+ def post_process(self, packet: 'dict[str, Any]') -> 'MPTCP':
586
+ """Revise ``schema`` data after unpacking process.
587
+
588
+ Args:
589
+ packet: Unpacked data.
590
+
591
+ Returns:
592
+ Revised schema.
593
+
594
+ """
595
+ ret = self.data
596
+
597
+ ret.option = Enum_Option.Multipath_TCP
598
+ ret.length = self.test['length']
599
+ ret.subtype = Enum_MPTCPOption.get(packet['test']['subtype'])
600
+
601
+ return ret
602
+
603
+
604
+ # register ``_MPTCP`` as ``Multipath_TCP`` option
605
+ Option.register(Enum_Option.Multipath_TCP, _MPTCP)
606
+
607
+
608
+ class MPTCP(EnumSchema[Enum_MPTCPOption]):
609
+ """Header schema for Multipath TCP options."""
610
+
611
+ __enum__: 'DefaultDict[Enum_MPTCPOption, Type[MPTCP]]' = collections.defaultdict(lambda: MPTCPUnknown)
612
+
613
+ if TYPE_CHECKING:
614
+ #: Option kind.
615
+ kind: 'Enum_Option'
616
+ #: MPTCP length.
617
+ length: 'int'
618
+ #: MPTCP subtype.
619
+ subtype: 'Enum_MPTCPOption'
620
+
621
+
622
+ @schema_final
623
+ class MPTCPUnknown(MPTCP):
624
+ """Header schema for unknown Multipath TCP option."""
625
+
626
+ #: Subtype and data.
627
+ test: 'MPTCPSubtypeUnknown' = BitField(length=1, namespace={
628
+ 'subtype': (0, 4),
629
+ 'data': (4, 4),
630
+ })
631
+ #: Data.
632
+ data: 'bytes' = BytesField(length=lambda pkt: pkt['length'] - 2)
633
+
634
+ if TYPE_CHECKING:
635
+ def __init__(self, kind: 'Enum_Option', length: 'int', test: 'MPTCPSubtypeUnknown', data: 'bytes') -> 'None': ...
636
+
637
+
638
+ @schema_final
639
+ class MPTCPCapable(MPTCP, code=Enum_MPTCPOption.MP_CAPABLE):
640
+ """Header schema for Multipath TCP capable option."""
641
+
642
+ #: Subtype and version.
643
+ test: 'MPTCPSubtypeCapable' = BitField(length=1, namespace={
644
+ 'subtype': (0, 4),
645
+ 'version': (4, 4),
646
+ })
647
+ #: Flags.
648
+ flags: 'MPTCPCapableFlags' = BitField(length=1, namespace={
649
+ 'req': (0, 1),
650
+ 'ext': (1, 1),
651
+ 'hsa': (7, 1),
652
+ })
653
+ #: Option sender's key.
654
+ skey: 'int' = UInt64Field()
655
+ #: Option receiver's key.
656
+ rkey: 'int' = ConditionalField(
657
+ UInt64Field(),
658
+ lambda pkt: pkt['length'] != 32,
659
+ )
660
+
661
+ if TYPE_CHECKING:
662
+ def __init__(self, kind: 'Enum_Option', length: 'int', test: 'MPTCPSubtypeCapable', flags: 'MPTCPCapableFlags', skey: 'int', rkey: 'Optional[int]') -> 'None': ...
663
+
664
+
665
+ class MPTCPJoin(MPTCP, code=Enum_MPTCPOption.MP_JOIN): # register as a placeholder
666
+ """Header schema for Multipath TCP join option."""
667
+
668
+
669
+ @schema_final
670
+ class MPTCPJoinSYN(MPTCPJoin):
671
+ """Header schema for Multipath TCP join option for ``SYN`` connection."""
672
+
673
+ #: Subtype and flags.
674
+ test: 'MPTCPSubtypeJoin' = BitField(length=1, namespace={
675
+ 'subtype': (0, 4),
676
+ 'backup': (7, 1),
677
+ })
678
+ #: Address ID.
679
+ addr_id: 'int' = UInt8Field()
680
+ #: Receiver's token.
681
+ token: 'int' = UInt32Field()
682
+ #: Sender's random number.
683
+ nonce: 'int' = UInt32Field()
684
+
685
+ if TYPE_CHECKING:
686
+ def __init__(self, kind: 'Enum_Option', length: 'int', test: 'MPTCPSubtypeJoin', addr_id: 'int', token: 'int', nonce: 'int') -> 'None': ...
687
+
688
+
689
+ @schema_final
690
+ class MPTCPJoinSYNACK(MPTCPJoin):
691
+ """Header schema for Multipath TCP join option for ``SYN/ACK`` connection."""
692
+
693
+ #: Subtype and flags.
694
+ test: 'MPTCPSubtypeJoin' = BitField(length=1, namespace={
695
+ 'subtype': (0, 4),
696
+ 'backup': (7, 1),
697
+ })
698
+ #: Address ID.
699
+ addr_id: 'int' = UInt8Field()
700
+ #: Sender's truncated HMAC
701
+ hmac: 'bytes' = BytesField(length=8)
702
+ #: Sender's random number.
703
+ nonce: 'int' = UInt32Field()
704
+
705
+ if TYPE_CHECKING:
706
+ def __init__(self, kind: 'Enum_Option', length: 'int', test: 'MPTCPSubtypeJoin', addr_id: 'int', hmac: 'bytes', nonce: 'int') -> 'None': ...
707
+
708
+
709
+ @schema_final
710
+ class MPTCPJoinACK(MPTCPJoin):
711
+ """Header schema for Multipath TCP join option for ``ACK`` connection."""
712
+
713
+ #: Subtype.
714
+ test: 'MPTCPSubtype' = BitField(length=1, namespace={
715
+ 'subtype': (0, 4),
716
+ })
717
+ #: Reserved.
718
+ reserved: 'bytes' = PaddingField(length=1)
719
+ #: Sender's HMAC.
720
+ hmac: 'bytes' = BytesField(length=20)
721
+
722
+ if TYPE_CHECKING:
723
+ def __init__(self, kind: 'Enum_Option', length: 'int', test: 'MPTCPSubtype', hmac: 'bytes') -> 'None': ...
724
+
725
+
726
+ @schema_final
727
+ class MPTCPDSS(MPTCP, code=Enum_MPTCPOption.DSS):
728
+ """Header schema for Multipath TCP DSS option."""
729
+
730
+ #: Subtype and flags.
731
+ test: 'MPTCPSubtype' = BitField(length=1, namespace={
732
+ 'subtype': (0, 4),
733
+ })
734
+ #: Flags.
735
+ flags: 'MPTCPDSSFlags' = BitField(length=1, namespace={
736
+ 'F': (3, 1),
737
+ 'm': (4, 1),
738
+ 'M': (5, 1),
739
+ 'a': (6, 1),
740
+ 'A': (7, 1),
741
+ })
742
+ #: Data ACK.
743
+ ack: 'int' = ConditionalField(
744
+ NumberField(length=lambda pkt: 8 if pkt['flags']['a'] else 0, signed=False),
745
+ lambda pkt: pkt['flags']['A'],
746
+ )
747
+ #: Data sequence number.
748
+ dsn: 'int' = ConditionalField(
749
+ NumberField(length=lambda pkt: 8 if pkt['flags']['m'] else 0, signed=False),
750
+ lambda pkt: pkt['flags']['M'],
751
+ )
752
+ #: Subflow sequence number.
753
+ ssn: 'int' = ConditionalField(
754
+ UInt32Field(),
755
+ lambda pkt: pkt['flags']['M'],
756
+ )
757
+ #: Data level length.
758
+ dl_len: 'int' = ConditionalField(
759
+ UInt16Field(),
760
+ lambda pkt: pkt['flags']['M'],
761
+ )
762
+ #: Checksum.
763
+ checksum: 'bytes' = ConditionalField(
764
+ BytesField(length=2),
765
+ lambda pkt: pkt['flags']['M'],
766
+ )
767
+
768
+ if TYPE_CHECKING:
769
+ def __init__(self, kind: 'Enum_Option', length: 'int', test: 'MPTCPSubtype', flags: 'MPTCPDSSFlags', ack: 'Optional[int]', dsn: 'Optional[int]', ssn: 'Optional[int]', dl_len: 'Optional[int]', checksum: 'Optional[bytes]') -> 'None': ...
770
+
771
+
772
+ @schema_final
773
+ class MPTCPAddAddress(MPTCP, code=Enum_MPTCPOption.ADD_ADDR):
774
+ """Header schema for Multipath TCP add address option."""
775
+
776
+ #: Subtype and IP version.
777
+ test: 'MPTCPSubtypeAddAddress' = BitField(length=1, namespace={
778
+ 'subtype': (0, 4),
779
+ 'version': (4, 4),
780
+ })
781
+ #: Address ID.
782
+ addr_id: 'int' = UInt8Field()
783
+ #: Address.
784
+ address: 'IPv4Address | IPv6Address' = SwitchField(
785
+ selector=mptcp_add_address_selector,
786
+ )
787
+ #: Port.
788
+ port: 'int' = ConditionalField(
789
+ UInt16Field(),
790
+ lambda pkt: pkt['length'] in (10, 22),
791
+ )
792
+
793
+ if TYPE_CHECKING:
794
+ def __init__(self, kind: 'Enum_Option', length: 'int', test: 'MPTCPSubtypeAddAddress', addr_id: 'int', address: 'IPv4Address | IPv6Address', port: 'Optional[int]') -> 'None': ...
795
+
796
+
797
+ @schema_final
798
+ class MPTCPRemoveAddress(MPTCP, code=Enum_MPTCPOption.REMOVE_ADDR):
799
+ """Header schema for Multipath TCP remove address option."""
800
+
801
+ #: Subtype.
802
+ test: 'MPTCPSubtype' = BitField(length=1, namespace={
803
+ 'subtype': (0, 4),
804
+ })
805
+ #: Address ID.
806
+ addr_id: 'list[int]' = ListField(
807
+ length=lambda pkt: pkt['length'] - 3,
808
+ item_type=UInt8Field(),
809
+ )
810
+
811
+ if TYPE_CHECKING:
812
+ def __init__(self, kind: 'Enum_Option', length: 'int', test: 'MPTCPSubtype', addr_id: 'list[int]') -> 'None': ...
813
+
814
+
815
+ @schema_final
816
+ class MPTCPPriority(MPTCP, code=Enum_MPTCPOption.MP_PRIO):
817
+ """Header schema for Multipath TCP priority option."""
818
+
819
+ #: Subtype.
820
+ test: 'MPTCPSubtypePriority' = BitField(length=1, namespace={
821
+ 'subtype': (0, 4),
822
+ 'backup': (7, 1),
823
+ })
824
+ #: Address ID.
825
+ addr_id: 'int' = ConditionalField(
826
+ UInt8Field(),
827
+ lambda pkt: pkt['length'] == 4,
828
+ )
829
+
830
+ if TYPE_CHECKING:
831
+ def __init__(self, kind: 'Enum_Option', length: 'int', test: 'MPTCPSubtypePriority', addr_id: 'Optional[int]') -> 'None': ...
832
+
833
+
834
+ @schema_final
835
+ class MPTCPFallback(MPTCP, code=Enum_MPTCPOption.MP_FAIL):
836
+ """Header schema for Multipath TCP fallback option."""
837
+
838
+ #: Subtype.
839
+ test: 'MPTCPSubtype' = BitField(length=1, namespace={
840
+ 'subtype': (0, 4),
841
+ })
842
+ #: Data sequence number.
843
+ dsn: 'int' = UInt64Field()
844
+
845
+ if TYPE_CHECKING:
846
+ def __init__(self, kind: 'Enum_Option', length: 'int', test: 'MPTCPSubtype', dsn: 'int') -> 'None': ...
847
+
848
+
849
+ @schema_final
850
+ class MPTCPFastclose(MPTCP, code=Enum_MPTCPOption.MP_FASTCLOSE):
851
+ """Header schema for Multipath TCP fastclose option."""
852
+
853
+ #: Subtype.
854
+ test: 'MPTCPSubtype' = BitField(length=1, namespace={
855
+ 'subtype': (0, 4),
856
+ })
857
+ #: Option receiver's key.
858
+ key: 'int' = UInt64Field()
859
+
860
+ if TYPE_CHECKING:
861
+ def __init__(self, kind: 'Enum_Option', length: 'int', test: 'MPTCPSubtype', key: 'int') -> 'None': ...
862
+
863
+
864
+ @schema_final
865
+ class FastOpenCookie(Option, code=Enum_Option.TCP_Fast_Open_Cookie):
866
+ """"Header schema for TCP Fast Open option."""
867
+
868
+ #: Cookie.
869
+ cookie: 'bytes' = ConditionalField(
870
+ BytesField(length=lambda pkt: pkt['length'] - 2),
871
+ lambda pkt: pkt['length'] >= 6,
872
+ )
873
+
874
+ if TYPE_CHECKING:
875
+ def __init__(self, kind: 'Enum_Option', length: 'int', cookie: 'Optional[bytes]') -> 'None': ...
876
+
877
+
878
+ @schema_final
879
+ class TCP(Schema):
880
+ """Header schema for TCP packet."""
881
+
882
+ #: Source port.
883
+ srcport: 'Enum_AppType' = PortEnumField(length=2, namespace=Enum_AppType)
884
+ #: Destination port.
885
+ dstport: 'Enum_AppType' = PortEnumField(length=2, namespace=Enum_AppType)
886
+ #: Sequence number.
887
+ seq: 'int' = UInt32Field()
888
+ #: Acknowledgement number.
889
+ ack: 'int' = UInt32Field()
890
+ #: Data offset.
891
+ offset: 'OffsetFlag' = BitField(length=1, namespace={
892
+ 'offset': (0, 4),
893
+ 'ns': (7, 1),
894
+ })
895
+ #: TCP flags.
896
+ flags: 'Flags' = BitField(length=1, namespace={
897
+ 'cwr': (0, 1),
898
+ 'ece': (1, 1),
899
+ 'urg': (2, 1),
900
+ 'ack': (3, 1),
901
+ 'psh': (4, 1),
902
+ 'rst': (5, 1),
903
+ 'syn': (6, 1),
904
+ 'fin': (7, 1),
905
+ })
906
+ #: Window size.
907
+ window: 'int' = UInt16Field()
908
+ #: Checksum.
909
+ checksum: 'bytes' = BytesField(length=2)
910
+ #: Urgent pointer.
911
+ urgent: 'int' = UInt16Field()
912
+ #: Options.
913
+ options: 'list[Option]' = OptionField(
914
+ length=lambda pkt: pkt['offset']['offset'] * 4 - 20,
915
+ base_schema=Option,
916
+ type_name='kind',
917
+ registry=Option.registry,
918
+ eool=Enum_Option.End_of_Option_List,
919
+ )
920
+ #: Padding.
921
+ padding: 'bytes' = PaddingField(length=lambda pkt: pkt.get('__option_padding__', 0)) # key generated by OptionField
922
+ #: Payload.
923
+ payload: 'bytes' = PayloadField()
924
+
925
+ if TYPE_CHECKING:
926
+ def __init__(self, srcport: 'Enum_AppType | int', dstport: 'Enum_AppType | int', seq: 'int', ack: 'int',
927
+ offset: 'OffsetFlag', flags: 'Flags', window: 'int', checksum: 'bytes',
928
+ urgent: 'int', options: 'list[Option | bytes] | bytes', payload: 'bytes | Protocol | Schema') -> 'None': ...