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,576 @@
1
+ # -*- coding: utf-8 -*-
2
+ # mypy: disable-error-code=assignment
3
+ """header schema for internet protocol version 4"""
4
+
5
+ import collections
6
+ import datetime
7
+ import ipaddress
8
+ from typing import TYPE_CHECKING, cast
9
+
10
+ from pcapkit.const.ipv4.classification_level import ClassificationLevel as Enum_ClassificationLevel
11
+ from pcapkit.const.ipv4.option_number import OptionNumber as Enum_OptionNumber
12
+ from pcapkit.const.ipv4.qs_function import QSFunction as Enum_QSFunction
13
+ from pcapkit.const.ipv4.router_alert import RouterAlert as Enum_RouterAlert
14
+ from pcapkit.const.ipv4.ts_flag import TSFlag as Enum_TSFlag
15
+ from pcapkit.const.reg.transtype import TransType as Enum_TransType
16
+ from pcapkit.corekit.fields.collections import ListField, OptionField
17
+ from pcapkit.corekit.fields.ipaddress import IPv4AddressField
18
+ from pcapkit.corekit.fields.misc import (ConditionalField, ForwardMatchField, PayloadField,
19
+ SchemaField, SwitchField)
20
+ from pcapkit.corekit.fields.numbers import EnumField, UInt8Field, UInt16Field, UInt32Field
21
+ from pcapkit.corekit.fields.strings import BitField, BytesField, PaddingField
22
+ from pcapkit.protocols.schema.schema import EnumSchema, Schema, schema_final
23
+ from pcapkit.utilities.exceptions import FieldValueError
24
+ from pcapkit.utilities.logging import SPHINX_TYPE_CHECKING
25
+ from pcapkit.utilities.warnings import ProtocolWarning, warn
26
+
27
+ __all__ = [
28
+ 'IPv4',
29
+
30
+ 'Option',
31
+ 'UnassignedOption', 'EOOLOption', 'NOPOption',
32
+ 'SECOption', 'LSROption', 'TSOption',
33
+ 'ESECOption', 'RROption', 'SIDOption',
34
+ 'SSROption', 'MTUPOption', 'MTUROption',
35
+ 'TROption', 'RTRALTOption', 'QSOption',
36
+ 'QuickStartRequestOption', 'QuickStartReportOption',
37
+ ]
38
+
39
+ if TYPE_CHECKING:
40
+ from datetime import timedelta
41
+ from ipaddress import IPv4Address
42
+ from typing import Any, DefaultDict, Optional, Type
43
+
44
+ from pcapkit.corekit.fields.field import FieldBase as Field
45
+ from pcapkit.corekit.multidict import OrderedMultiDict
46
+ from pcapkit.protocols.protocol import ProtocolBase as Protocol
47
+
48
+ if SPHINX_TYPE_CHECKING:
49
+ from typing_extensions import TypedDict
50
+
51
+ class VerIHLField(TypedDict):
52
+ """Version and header length field."""
53
+
54
+ #: IP version.
55
+ version: int
56
+ #: Internet header length.
57
+ ihl: int
58
+
59
+ #: Type of service field.
60
+ ToSField = TypedDict('ToSField', {
61
+ 'pre': int,
62
+ 'del': int,
63
+ 'thr': int,
64
+ 'rel': int,
65
+ 'ecn': int,
66
+ })
67
+
68
+ class Flags(TypedDict):
69
+ """Flags and fragment offset field."""
70
+
71
+ #: Don't fragment flag.
72
+ df: int
73
+ #: More fragments flag.
74
+ mf: int
75
+ #: Fragment offset.
76
+ offset: int
77
+
78
+ class TSFlags(TypedDict):
79
+ """Timestamp flags field."""
80
+
81
+ #: Timestamp overflow flag.
82
+ oflw: int
83
+ #: Timestamp type flag.
84
+ flag: int
85
+
86
+ class QuickStartFlags(TypedDict):
87
+ """Quick-Start flags."""
88
+
89
+ #: QS function.
90
+ func: int
91
+ #: Rate request/report.
92
+ rate: int
93
+
94
+ class QSTestFlags(TypedDict):
95
+ """Quick start test flag."""
96
+
97
+ #: QS function.
98
+ func: int
99
+
100
+ class QSNonce(TypedDict):
101
+ """Quick start nonce field."""
102
+
103
+ #: Nonce.
104
+ nonce: int
105
+
106
+
107
+ def quick_start_data_selector(pkt: 'dict[str, Any]') -> 'Field':
108
+ """Selector function for :attr:`_QSOption.data` field.
109
+
110
+ Args:
111
+ pkt: Packet data.
112
+
113
+ Returns:
114
+ * If ``func`` is ``0``, returns a :class:`~pcapkit.corekit.fields.misc.SchemaField`
115
+ wrapped :class:`~pcapkit.protocols.schema.internet.ipv4.QuickStartRequestOption`
116
+ instance.
117
+ * If ``func`` is ``8``, returns a :class:`~pcapkit.corekit.fields.misc.SchemaField`
118
+ wrapped :class:`~pcapkit.protocols.schema.internet.ipv4.QuickStartReportOption`
119
+ instance.
120
+
121
+ """
122
+ func = Enum_QSFunction.get(pkt['flags']['func'])
123
+ pkt['flags']['func'] = func
124
+
125
+ schema = QSOption.registry[func]
126
+ if schema is None:
127
+ raise FieldValueError(f'IPv4: invalid QS function: {func}')
128
+ return SchemaField(length=5, schema=schema)
129
+
130
+
131
+ class Option(EnumSchema[Enum_OptionNumber]):
132
+ """Header schema for IPv4 options."""
133
+
134
+ __default__ = lambda: UnassignedOption
135
+
136
+ #: Option type.
137
+ type: 'Enum_OptionNumber' = EnumField(length=1, namespace=Enum_OptionNumber)
138
+ #: Option length.
139
+ length: 'int' = ConditionalField(
140
+ UInt8Field(),
141
+ lambda pkt: pkt['type'] not in (Enum_OptionNumber.EOOL, Enum_OptionNumber.NOP),
142
+ )
143
+
144
+ def post_process(self, packet: 'dict[str, Any]') -> 'Schema':
145
+ """Revise ``schema`` data after unpacking process.
146
+
147
+ Args:
148
+ packet: Unpacked data.
149
+
150
+ Returns:
151
+ Revised schema.
152
+
153
+ """
154
+ # for EOOL/NOP option, length is always 1
155
+ if self.type in (Enum_OptionNumber.EOOL, Enum_OptionNumber.NOP):
156
+ self.length = 1
157
+ return self
158
+
159
+
160
+ @schema_final
161
+ class UnassignedOption(Option):
162
+ """Header schema for IPv4 unassigned options."""
163
+
164
+ #: Option data.
165
+ data: 'bytes' = BytesField(length=lambda pkt: pkt['length'] - 2)
166
+
167
+ if TYPE_CHECKING:
168
+ def __init__(self, type: 'Enum_OptionNumber', length: 'int', data: 'bytes') -> 'None': ...
169
+
170
+
171
+ @schema_final
172
+ class EOOLOption(Option, code=Enum_OptionNumber.EOOL):
173
+ """Header schema for IPv4 end of option list (``EOOL``) option."""
174
+
175
+ if TYPE_CHECKING:
176
+ def __init__(self, type: 'Enum_OptionNumber', length: 'int') -> 'None': ...
177
+
178
+
179
+ @schema_final
180
+ class NOPOption(Option, code=Enum_OptionNumber.NOP):
181
+ """Header schema for IPv4 no operation (``NOP``) option."""
182
+
183
+ if TYPE_CHECKING:
184
+ def __init__(self, type: 'Enum_OptionNumber', length: 'int') -> 'None': ...
185
+
186
+
187
+ @schema_final
188
+ class SECOption(Option, code=Enum_OptionNumber.SEC):
189
+ """Header schema for IPv4 security (``SEC``) option."""
190
+
191
+ #: Classification level.
192
+ level: 'Enum_ClassificationLevel' = EnumField(length=1, namespace=Enum_ClassificationLevel)
193
+ #: Protection authority flags.
194
+ data: 'bytes' = ConditionalField(
195
+ BytesField(length=lambda pkt: pkt['length'] - 3),
196
+ lambda pkt: pkt['length'] > 3,
197
+ )
198
+
199
+ if TYPE_CHECKING:
200
+ def __init__(self, type: 'Enum_OptionNumber', length: 'int', level: 'int', data: 'Optional[bytes]') -> 'None': ...
201
+
202
+
203
+ @schema_final
204
+ class LSROption(Option, code=Enum_OptionNumber.LSR):
205
+ """Header schema for IPv4 loose source route (``LSR``) option."""
206
+
207
+ #: Pointer.
208
+ pointer: 'int' = UInt8Field()
209
+ #: Route.
210
+ route: 'list[IPv4Address]' = ListField(
211
+ length=lambda pkt: pkt['pointer'] - 4,
212
+ item_type=IPv4AddressField(),
213
+ )
214
+ #: Remaining data buffer0.
215
+ remainder: 'bytes' = PaddingField(
216
+ length=lambda pkt: pkt['length'] - pkt['pointer'] + 1,
217
+ default=bytes(36), # a reasonable default
218
+ )
219
+
220
+ if TYPE_CHECKING:
221
+ def __init__(self, type: 'Enum_OptionNumber', length: 'int', pointer: 'int', route: 'list[IPv4Address | str | bytes | int]') -> 'None': ...
222
+
223
+
224
+ @schema_final
225
+ class TSOption(Option, code=Enum_OptionNumber.TS):
226
+ """Header schema for IPv4 timestamp (``TS``) option."""
227
+
228
+ #: Pointer.
229
+ pointer: 'int' = UInt8Field()
230
+ #: Overflow and flags.
231
+ flags: 'TSFlags' = BitField(length=1, namespace={
232
+ 'oflw': (0, 4),
233
+ 'flag': (4, 4),
234
+ })
235
+ #: Timestamps and internet addresses.
236
+ ts_data: 'list[int]' = ListField(
237
+ length=lambda pkt: pkt['pointer'] - 5 if pkt['flags']['flag'] != 3 else pkt['length'] - 4,
238
+ item_type=UInt32Field(),
239
+ )
240
+ #: Remaining data buffer.
241
+ remainder: 'bytes' = PaddingField(
242
+ length=lambda pkt: pkt['length'] - pkt['pointer'] + 1 if pkt['flags']['flag'] != 3 else 0,
243
+ default=bytes(36), # 36 is the maximum length of the option data field for timestamps
244
+ )
245
+
246
+ def post_process(self, packet: 'dict[str, Any]') -> 'Schema':
247
+ """Revise ``schema`` data after unpacking process.
248
+
249
+ Args:
250
+ packet: Unpacked data.
251
+
252
+ Returns:
253
+ Revised schema.
254
+
255
+ """
256
+ ts_flag = Enum_TSFlag.get(self.flags['flag'])
257
+ if ts_flag == Enum_TSFlag.Timestamp_Only:
258
+ ts_data = self.ts_data
259
+ self.data = []
260
+ ts_list = [] # type: list[int | timedelta]
261
+
262
+ for ts in ts_data:
263
+ self.data.append(ts)
264
+
265
+ if ts >> 31:
266
+ warn(f'IPv4: [OptNo {self.type}] invalid format: timestamp error: {ts_val}', ProtocolWarning)
267
+ ts_val = ts & 0x7FFFFFFF # type: int | timedelta
268
+ else:
269
+ ts_val = datetime.timedelta(milliseconds=ts)
270
+ ts_list.append(ts_val)
271
+ timestamp = tuple(ts_list) # type: tuple[int | timedelta, ...] | OrderedMultiDict[IPv4Address, int | timedelta]
272
+ elif ts_flag == Enum_TSFlag.IP_with_Timestamp:
273
+ ts_data = self.ts_data
274
+ self.data = OrderedMultiDict()
275
+ timestamp = OrderedMultiDict()
276
+
277
+ for ip, ts in zip(ts_data[::2], ts_data[1::2]):
278
+ ip_val = cast('IPv4Address', ipaddress.ip_address(ip))
279
+ self.data.add(ip_val, ts)
280
+
281
+ if ts >> 31:
282
+ warn(f'IPv4: [OptNo {self.type}] invalid format: timestamp error: {ts_val}', ProtocolWarning)
283
+ ts_val = ts & 0x7FFFFFFF
284
+ else:
285
+ ts_val = datetime.timedelta(milliseconds=ts)
286
+ timestamp.add(ip_val, ts_val)
287
+ elif ts_flag == Enum_TSFlag.Prespecified_IP_with_Timestamp:
288
+ ts_data = self.ts_data
289
+ self.data = OrderedMultiDict()
290
+ timestamp = OrderedMultiDict()
291
+
292
+ for ip, ts in zip(ts_data[::2], ts_data[1::2]):
293
+ ip_val = cast('IPv4Address', ipaddress.ip_address(ip))
294
+ self.data.add(ip_val, ts)
295
+
296
+ if ts >> 31:
297
+ warn(f'IPv4: [OptNo {self.type}] invalid format: timestamp error: {ts_val}', ProtocolWarning)
298
+ ts_val = ts & 0x7FFFFFFF
299
+ else:
300
+ ts_val = datetime.timedelta(milliseconds=ts)
301
+ timestamp.add(ip_val, ts_val)
302
+
303
+ # extract also the prespecified IP addresses
304
+ # but set the timestamp to 0
305
+ pad = self.remainder
306
+ for index in range(0, len(pad), 8):
307
+ buf_ip = pad[index:index + 4]
308
+ self.data.add(ipaddress.ip_address(buf_ip), 0) # type: ignore[arg-type]
309
+ else:
310
+ warn(f'IPv4: [OptNo {self.type}] invalid format: unknown timestmap flag: {ts_flag}', ProtocolWarning)
311
+ self.data = self.ts_data
312
+ timestamp = tuple(self.ts_data)
313
+
314
+ self.ts_flag = ts_flag
315
+ self.timestamp = timestamp
316
+ return self
317
+
318
+ if TYPE_CHECKING:
319
+ ts_flag: 'Enum_TSFlag'
320
+ data: 'list[int] | OrderedMultiDict[IPv4Address, int]'
321
+ timestamp: 'tuple[int | timedelta] | OrderedMultiDict[IPv4Address, int | timedelta]'
322
+
323
+ def __init__(self, type: 'Enum_OptionNumber', length: 'int', pointer: 'int', flags: 'TSFlags', data: 'list[int]') -> 'None': ...
324
+
325
+
326
+ @schema_final
327
+ class ESECOption(Option, code=Enum_OptionNumber.E_SEC):
328
+ """Header schema for IPv4 extended security (``ESEC``) option."""
329
+
330
+ #: Additional security information format code.
331
+ format: 'int' = UInt8Field()
332
+ #: Additional security information.
333
+ info: 'bytes' = ConditionalField(
334
+ BytesField(length=lambda pkt: pkt['length'] - 3),
335
+ lambda pkt: pkt['length'] > 3,
336
+ )
337
+
338
+ if TYPE_CHECKING:
339
+ def __init__(self, type: 'Enum_OptionNumber', length: 'int', format: 'int', info: 'Optional[bytes]') -> 'None': ...
340
+
341
+
342
+ @schema_final
343
+ class RROption(Option, code=Enum_OptionNumber.RR):
344
+ """Header schema for IPv4 record route (``RR``) option."""
345
+
346
+ #: Pointer.
347
+ pointer: 'int' = UInt8Field()
348
+ #: Route.
349
+ route: 'list[IPv4Address]' = ListField(
350
+ length=lambda pkt: pkt['pointer'] - 4,
351
+ item_type=IPv4AddressField(),
352
+ )
353
+ #: Remaining data buffer0.
354
+ remainder: 'bytes' = PaddingField(
355
+ length=lambda pkt: pkt['length'] - pkt['pointer'] + 1,
356
+ default=bytes(36), # a reasonable default
357
+ )
358
+
359
+ if TYPE_CHECKING:
360
+ def __init__(self, type: 'Enum_OptionNumber', length: 'int', pointer: 'int', route: 'list[IPv4Address | str | bytes | int]') -> 'None': ...
361
+
362
+
363
+ @schema_final
364
+ class SIDOption(Option, code=Enum_OptionNumber.SID):
365
+ """Header schema for IPv4 stream identifier (``SID``) option."""
366
+
367
+ #: Stream identifier.
368
+ sid: 'int' = UInt32Field()
369
+
370
+ if TYPE_CHECKING:
371
+ def __init__(self, type: 'Enum_OptionNumber', length: 'int', sid: 'int') -> 'None': ...
372
+
373
+
374
+ @schema_final
375
+ class SSROption(Option, code=Enum_OptionNumber.SSR):
376
+ """Header schema for IPv4 strict source route (``SSR``) option."""
377
+
378
+ #: Pointer.
379
+ pointer: 'int' = UInt8Field()
380
+ #: Route.
381
+ route: 'list[IPv4Address]' = ListField(
382
+ length=lambda pkt: pkt['pointer'] - 4,
383
+ item_type=IPv4AddressField(),
384
+ )
385
+ #: Remaining data buffer0.
386
+ remainder: 'bytes' = PaddingField(
387
+ length=lambda pkt: pkt['length'] - pkt['pointer'] + 1,
388
+ default=bytes(36), # a reasonable default
389
+ )
390
+
391
+ if TYPE_CHECKING:
392
+ def __init__(self, type: 'Enum_OptionNumber', length: 'int', pointer: 'int', route: 'list[IPv4Address | str | bytes | int]') -> 'None': ...
393
+
394
+
395
+ @schema_final
396
+ class MTUPOption(Option, code=Enum_OptionNumber.MTUP):
397
+ """Header schema for IPv4 MTU probe (``MTUP``) option."""
398
+
399
+ #: MTU.
400
+ mtu: 'int' = UInt16Field()
401
+
402
+ if TYPE_CHECKING:
403
+ def __init__(self, type: 'Enum_OptionNumber', length: 'int', mtu: 'int') -> 'None': ...
404
+
405
+
406
+ @schema_final
407
+ class MTUROption(Option, code=Enum_OptionNumber.MTUR):
408
+ """Header schema for IPv4 MTU reply (``MTUR``) option."""
409
+
410
+ #: MTU.
411
+ mtu: 'int' = UInt16Field()
412
+
413
+ if TYPE_CHECKING:
414
+ def __init__(self, type: 'Enum_OptionNumber', length: 'int', mtu: 'int') -> 'None': ...
415
+
416
+
417
+ @schema_final
418
+ class TROption(Option, code=Enum_OptionNumber.TR):
419
+ """Header schema for IPv4 traceroute (``TR``) option."""
420
+
421
+ #: ID number.
422
+ id: 'int' = UInt16Field()
423
+ #: Outbound hop count.
424
+ out: 'int' = UInt16Field()
425
+ #: Return hop count.
426
+ ret: 'int' = UInt16Field()
427
+ #: Originator IP address.
428
+ origin: 'IPv4Address' = IPv4AddressField()
429
+
430
+ if TYPE_CHECKING:
431
+ def __init__(self, type: 'Enum_OptionNumber', length: 'int', id: 'int', out: 'int', ret: 'int', origin: 'IPv4Address | str | bytes | int') -> 'None': ...
432
+
433
+
434
+ @schema_final
435
+ class RTRALTOption(Option, code=Enum_OptionNumber.RTRALT):
436
+ """Header schema for IPv4 router alert (``RTRALT``) option."""
437
+
438
+ #: Router alert value.
439
+ alert: 'Enum_RouterAlert' = EnumField(length=2, namespace=Enum_RouterAlert)
440
+
441
+ if TYPE_CHECKING:
442
+ def __init__(self, type: 'Enum_OptionNumber', length: 'int', alert: 'Enum_RouterAlert') -> 'None': ...
443
+
444
+
445
+ @schema_final
446
+ class _QSOption(Schema):
447
+ """Header schema for IPv4 quick start (``QS``) options in generic representation."""
448
+
449
+ #: Flags.
450
+ flags: 'QSTestFlags' = ForwardMatchField(BitField(length=3, namespace={
451
+ 'func': (16, 4),
452
+ }))
453
+ #: QS data.
454
+ data: 'QuickStartRequestOption | QuickStartReportOption' = SwitchField(
455
+ selector=quick_start_data_selector,
456
+ )
457
+
458
+ def post_process(self, packet: 'dict[str, Any]') -> 'QSOption':
459
+ """Revise ``schema`` data after unpacking process.
460
+
461
+ Args:
462
+ packet: Unpacked data.
463
+
464
+ Returns:
465
+ Revised schema.
466
+
467
+ """
468
+ ret = self.data
469
+ ret.func = Enum_QSFunction.get(self.flags['func'])
470
+ return ret
471
+
472
+
473
+ # register ``_QSOption`` as ``QS`` option
474
+ Option.register(Enum_OptionNumber.QS, _QSOption)
475
+
476
+
477
+ class QSOption(Option, EnumSchema[Enum_QSFunction]):
478
+ """Header schema for IPV4 quick start (``QS``) options."""
479
+
480
+ __enum__: 'DefaultDict[Enum_QSFunction, Type[QSOption]]' = collections.defaultdict(lambda: None) # type: ignore[return-value,arg-type]
481
+
482
+ #: Flags.
483
+ flags: 'QuickStartFlags' = BitField(length=1, namespace={
484
+ 'func': (0, 4),
485
+ 'rate': (4, 4),
486
+ })
487
+
488
+ if TYPE_CHECKING:
489
+ func: 'Enum_QSFunction'
490
+
491
+
492
+ @schema_final
493
+ class QuickStartRequestOption(QSOption, code=Enum_QSFunction.Quick_Start_Request):
494
+ """Header schema for IPV4 quick start request options."""
495
+
496
+ #: QS time-to-live (TTL).
497
+ ttl: 'int' = UInt8Field()
498
+ #: QS nonce.
499
+ nonce: 'QSNonce' = BitField(length=4, namespace={
500
+ 'nonce': (0, 30),
501
+ })
502
+
503
+ if TYPE_CHECKING:
504
+ def __init__(self, type: 'Enum_OptionNumber', length: 'int', flags: 'QuickStartFlags',
505
+ ttl: 'int', nonce: 'QSNonce') -> 'None': ...
506
+
507
+
508
+ @schema_final
509
+ class QuickStartReportOption(QSOption, code=Enum_QSFunction.Report_of_Approved_Rate):
510
+ """Header schema for IPV4 quick start report of approved rate options."""
511
+
512
+ #: QS nonce.
513
+ nonce: 'QSNonce' = BitField(length=4, namespace={
514
+ 'nonce': (0, 30),
515
+ })
516
+
517
+ if TYPE_CHECKING:
518
+ def __init__(self, type: 'Enum_OptionNumber', length: 'int', flags: 'QuickStartFlags',
519
+ nonce: 'QSNonce') -> 'None': ...
520
+
521
+
522
+ @schema_final
523
+ class IPv4(Schema):
524
+ """Header schema for IPv4 packet."""
525
+
526
+ #: Version and header length.
527
+ vihl: 'VerIHLField' = BitField(length=1, namespace={
528
+ 'version': (0, 4),
529
+ 'ihl': (4, 8),
530
+ })
531
+ #: Type of service.
532
+ tos: 'ToSField' = BitField(length=1, namespace={
533
+ 'pre': (0, 3),
534
+ 'del': (3, 1),
535
+ 'thr': (4, 1),
536
+ 'rel': (5, 1),
537
+ 'ecn': (6, 2),
538
+ })
539
+ #: Total length.
540
+ length: 'int' = UInt16Field()
541
+ #: Identification.
542
+ id: 'int' = UInt16Field()
543
+ #: Flags and fragment offset.
544
+ flags: 'Flags' = BitField(length=2, namespace={
545
+ 'df': (1, 1),
546
+ 'mf': (2, 1),
547
+ 'offset': (3, 13),
548
+ })
549
+ #: Time to live.
550
+ ttl: 'int' = UInt8Field()
551
+ #: Protocol.
552
+ proto: 'Enum_TransType' = EnumField(length=1, namespace=Enum_TransType)
553
+ #: Header checksum.
554
+ chksum: 'bytes' = BytesField(length=2)
555
+ #: Source address.
556
+ src: 'IPv4Address' = IPv4AddressField()
557
+ #: Destination address.
558
+ dst: 'IPv4Address' = IPv4AddressField()
559
+ #: Options.
560
+ options: 'list[Option]' = OptionField(
561
+ length=lambda pkt: pkt['vihl']['ihl'] * 4 - 20,
562
+ base_schema=Option,
563
+ type_name='type',
564
+ registry=Option.registry,
565
+ eool=Enum_OptionNumber.EOOL,
566
+ )
567
+ #: Padding.
568
+ padding: 'bytes' = PaddingField(length=lambda pkt: pkt.get('__option_padding__', 0))
569
+ #: Payload.
570
+ payload: 'bytes' = PayloadField(length=lambda pkt: pkt['length'] - pkt['vihl']['ihl'] * 4)
571
+
572
+ if TYPE_CHECKING:
573
+ def __init__(self, vihl: 'VerIHLField', tos: 'ToSField', length: 'int', id: 'int',
574
+ flags: 'Flags', ttl: 'int', proto: 'Enum_TransType', chksum: 'bytes',
575
+ src: 'IPv4Address | str | bytes | int', dst: 'IPv4Address | str | bytes | int',
576
+ options: 'list[Option | bytes] | bytes', payload: 'bytes | Protocol | Schema') -> 'None': ...
@@ -0,0 +1,63 @@
1
+ # -*- coding: utf-8 -*-
2
+ # mypy: disable-error-code=assignment
3
+ """header schema for internet protocol version 6"""
4
+
5
+ from typing import TYPE_CHECKING
6
+
7
+ from pcapkit.const.reg.transtype import TransType as Enum_TransType
8
+ from pcapkit.corekit.fields.ipaddress import IPv6AddressField
9
+ from pcapkit.corekit.fields.misc import PayloadField
10
+ from pcapkit.corekit.fields.numbers import EnumField, UInt8Field, UInt16Field
11
+ from pcapkit.corekit.fields.strings import BitField
12
+ from pcapkit.protocols.schema.schema import Schema, schema_final
13
+ from pcapkit.utilities.logging import SPHINX_TYPE_CHECKING
14
+
15
+ __all__ = ['IPv6']
16
+
17
+ if TYPE_CHECKING:
18
+ from ipaddress import IPv6Address
19
+
20
+ from pcapkit.protocols.protocol import ProtocolBase as Protocol
21
+
22
+ if SPHINX_TYPE_CHECKING:
23
+ from typing_extensions import TypedDict
24
+
25
+ #: Version, traffic class and flow label.
26
+ IPv6Hextet = TypedDict('IPv6Hextet', {
27
+ #: Version.
28
+ 'version': int,
29
+ #: Traffic class.
30
+ 'class': int,
31
+ #: Flow label.
32
+ 'label': int,
33
+ })
34
+
35
+
36
+ @schema_final
37
+ class IPv6(Schema):
38
+ """Header schema for IPv6 packet."""
39
+
40
+ #: Version, traffic class and flow label.
41
+ hextet: 'IPv6Hextet' = BitField(length=4, namespace={
42
+ 'version': (0, 4),
43
+ 'class': (4, 8),
44
+ 'label': (8, 20),
45
+ })
46
+ #: Payload length.
47
+ length: int = UInt16Field()
48
+ #: Next header.
49
+ next: 'Enum_TransType' = EnumField(length=1, namespace=Enum_TransType)
50
+ #: Hop limit.
51
+ limit: int = UInt8Field()
52
+ #: Source address.
53
+ src: 'IPv6Address' = IPv6AddressField()
54
+ #: Destination address.
55
+ dst: 'IPv6Address' = IPv6AddressField()
56
+ #: Payload.
57
+ payload: 'bytes' = PayloadField(length=lambda pkt: pkt['length'])
58
+
59
+ if TYPE_CHECKING:
60
+ def __init__(self, hextet: 'IPv6Hextet', length: 'int', next: 'Enum_TransType',
61
+ limit: 'int', src: 'IPv6Address | bytes | str | int',
62
+ dst: 'IPv6Address | bytes | str | int',
63
+ payload: 'bytes | Protocol | Schema') -> None: ...
@@ -0,0 +1,48 @@
1
+ # -*- coding: utf-8 -*-
2
+ # mypy: disable-error-code=assignment
3
+ """header schema for IPv6 Fragment Header"""
4
+
5
+ from typing import TYPE_CHECKING
6
+
7
+ from pcapkit.const.reg.transtype import TransType as Enum_TransType
8
+ from pcapkit.corekit.fields.misc import PayloadField
9
+ from pcapkit.corekit.fields.numbers import EnumField, UInt32Field
10
+ from pcapkit.corekit.fields.strings import BitField, PaddingField
11
+ from pcapkit.protocols.schema.schema import Schema, schema_final
12
+
13
+ __all__ = ['IPv6_Frag']
14
+
15
+ if TYPE_CHECKING:
16
+ from typing_extensions import TypedDict
17
+
18
+ from pcapkit.protocols.protocol import ProtocolBase as Protocol
19
+
20
+ class Flags(TypedDict):
21
+ """Fragment offset and flags."""
22
+
23
+ #: Fragment offset.
24
+ offset: int
25
+ #: More fragments flag.
26
+ mf: int
27
+
28
+
29
+ @schema_final
30
+ class IPv6_Frag(Schema):
31
+ """Header schema for IPv6-Frag packet."""
32
+
33
+ #: Next header.
34
+ next: 'Enum_TransType' = EnumField(length=1, namespace=Enum_TransType)
35
+ #: Reserved.
36
+ reserved: 'bytes' = PaddingField(length=1)
37
+ #: Fragment offset and flags.
38
+ flags: 'Flags' = BitField(length=2, namespace={
39
+ 'offset': (0, 13),
40
+ 'mf': (15, 1),
41
+ })
42
+ #: Identification.
43
+ id: 'int' = UInt32Field()
44
+ #: Payload.
45
+ payload: 'bytes' = PayloadField()
46
+
47
+ if TYPE_CHECKING:
48
+ def __init__(self, next:'Enum_TransType', flags: 'Flags', id: 'int', payload: 'bytes | Schema | Protocol') -> 'None': ...