pypcapkit 1.3.5.post6__pp310-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (466) hide show
  1. pcapkit/__init__.py +124 -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 +298 -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 +69 -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 +32728 -0
  120. pcapkit/const/reg/ethertype.py +714 -0
  121. pcapkit/const/reg/linktype.py +890 -0
  122. pcapkit/const/reg/transtype.py +526 -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 +249 -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 +412 -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 +708 -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 +197 -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 +197 -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.5.post6.dist-info/LICENSE +29 -0
  462. pypcapkit-1.3.5.post6.dist-info/METADATA +238 -0
  463. pypcapkit-1.3.5.post6.dist-info/RECORD +466 -0
  464. pypcapkit-1.3.5.post6.dist-info/WHEEL +5 -0
  465. pypcapkit-1.3.5.post6.dist-info/entry_points.txt +3 -0
  466. pypcapkit-1.3.5.post6.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': ...