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,680 @@
1
+ # -*- coding: utf-8 -*-
2
+ # mypy: disable-error-code=assignment
3
+ """header schema for IPv6 destination options"""
4
+
5
+ import collections
6
+ from typing import TYPE_CHECKING
7
+
8
+ from pcapkit.const.ipv6.option import Option as Enum_Option
9
+ from pcapkit.const.ipv6.qs_function import QSFunction as Enum_QSFunction
10
+ from pcapkit.const.ipv6.router_alert import RouterAlert as Enum_RouterAlert
11
+ from pcapkit.const.ipv6.seed_id import SeedID as Enum_SeedID
12
+ from pcapkit.const.ipv6.smf_dpd_mode import SMFDPDMode as Enum_SMFDPDMode
13
+ from pcapkit.const.ipv6.tagger_id import TaggerID as Enum_TaggerID
14
+ from pcapkit.const.reg.transtype import TransType as Enum_TransType
15
+ from pcapkit.corekit.fields.collections import OptionField
16
+ from pcapkit.corekit.fields.field import NoValue
17
+ from pcapkit.corekit.fields.ipaddress import IPv4AddressField, IPv6AddressField
18
+ from pcapkit.corekit.fields.misc import (ConditionalField, ForwardMatchField, NoValueField,
19
+ PayloadField, SchemaField, SwitchField)
20
+ from pcapkit.corekit.fields.numbers import (EnumField, NumberField, UInt8Field, UInt16Field,
21
+ UInt32Field)
22
+ from pcapkit.corekit.fields.strings import BitField, BytesField, PaddingField
23
+ from pcapkit.protocols.schema.schema import EnumSchema, Schema, schema_final
24
+ from pcapkit.utilities.exceptions import FieldValueError
25
+ from pcapkit.utilities.logging import SPHINX_TYPE_CHECKING
26
+
27
+ __all__ = [
28
+ 'IPv6_Opts',
29
+
30
+ 'SMFDPDOption', 'QuickStartOption',
31
+ 'UnassignedOption', 'PadOption', 'TunnelEncapsulationLimitOption',
32
+ 'RouterAlertOption', 'CALIPSOOption', 'SMFIdentificationBasedDPDOption',
33
+ 'SMFHashBasedDPDOption', 'PDMOption', 'QuickStartRequestOption',
34
+ 'QuickStartReportOption', 'RPLOption', 'MPLOption', 'ILNPOption',
35
+ 'LineIdentificationOption', 'JumboPayloadOption', 'HomeAddressOption',
36
+ 'IPDFFOption',
37
+ ]
38
+
39
+ if TYPE_CHECKING:
40
+ from ipaddress import IPv4Address, IPv6Address
41
+ from typing import Any, DefaultDict, Optional, Type
42
+
43
+ from pcapkit.corekit.fields.field import FieldBase as Field
44
+ from pcapkit.protocols.protocol import ProtocolBase as Protocol
45
+
46
+ if SPHINX_TYPE_CHECKING:
47
+ from typing_extensions import TypedDict
48
+
49
+ class TaggerIDInfo(TypedDict):
50
+ """TaggerID information."""
51
+
52
+ #: SMF mode.
53
+ mode: int
54
+ #: TaggerID type.
55
+ type: int
56
+ #: TaggerID length.
57
+ len: int
58
+
59
+ class QuickStartFlags(TypedDict):
60
+ """Quick-Start flags."""
61
+
62
+ #: QS function.
63
+ func: int
64
+ #: Rate request/report.
65
+ rate: int
66
+
67
+ class RPLFlags(TypedDict):
68
+ """RPL flags."""
69
+
70
+ #: Down flag.
71
+ down: int
72
+ #: Rank error flag.
73
+ rank_err: int
74
+ #: Forwarding error flag.
75
+ fwd_err: int
76
+
77
+ class MPLFlags(TypedDict):
78
+ """MPL flags."""
79
+
80
+ #: Seed-ID type. Identifies the length of the
81
+ #: Seed-ID.
82
+ type: int
83
+ #: Max flag. ``1`` indicates that the value in the
84
+ #: sequence field is known to be the largest sequence
85
+ #: number that was received from the MPL Seed.
86
+ max: int
87
+ #: Verification flag. ``0`` indicates that the MPL Option
88
+ #: conforms to this specification.
89
+ drop: int
90
+
91
+ class DFFFlags(TypedDict):
92
+ """``IP_DFF`` flags."""
93
+
94
+ #: Version.
95
+ ver: int
96
+ #: Duplicate flag.
97
+ dup: int
98
+ #: Retune flag.
99
+ ret: int
100
+
101
+ class SMFDPDTestFlag(TypedDict):
102
+ """``SMF_DPD`` test flag."""
103
+
104
+ #: Length.
105
+ len: int
106
+ #: DPD mode.
107
+ mode: int
108
+
109
+ class QSTestFlags(TypedDict):
110
+ """Quick start test flag."""
111
+
112
+ #: QS function.
113
+ func: int
114
+
115
+ class QSNonce(TypedDict):
116
+ """Quick start nonce."""
117
+
118
+ #: Nonce.
119
+ nonce: int
120
+
121
+
122
+ def mpl_opt_seed_id_len(pkt: 'dict[str, Any]') -> 'int':
123
+ """Return MPL Seed-ID length.
124
+
125
+ Args:
126
+ pkt: MPL option unpacked schema.
127
+
128
+ Returns:
129
+ MPL Seed-ID length.
130
+
131
+ """
132
+ s_type = pkt['flags']['type']
133
+ if s_type == 0:
134
+ return 0
135
+ if s_type == 1:
136
+ return 2
137
+ if s_type == 2:
138
+ return 8
139
+ if s_type == 3:
140
+ return 16
141
+ raise FieldValueError(f'IPv6-Opts: invalid MPL Seed-ID type: {s_type}')
142
+
143
+
144
+ def smf_dpd_data_selector(pkt: 'dict[str, Any]') -> 'Field':
145
+ """Selector function for :attr:`_SMFDPDOption.data` field.
146
+
147
+ Args:
148
+ pkt: Packet data.
149
+
150
+ Returns:
151
+ * If ``mode`` is ``0``, returns a :class:`~pcapkit.corekit.fields.misc.SchemaField`
152
+ wrapped :class:`~pcapkit.protocols.schema.internet.ipv6_opts.SMFIdentificationBasedDPDOption`
153
+ instance.
154
+ * If ``mode`` is ``1``, returns a :class:`~pcapkit.corekit.fields.misc.SchemaField`
155
+ wrapped :class:`~pcapkit.protocols.schema.internet.ipv6_opts.SMFHashBasedDPDOption`
156
+ instance.
157
+
158
+ """
159
+ mode = Enum_SMFDPDMode.get(pkt['test']['mode'])
160
+ schema = SMFDPDOption.registry[mode]
161
+ if schema is None:
162
+ raise FieldValueError(f'IPv6-Opts: invalid SMF DPD mode: {mode}')
163
+ return SchemaField(length=pkt['test']['len'], schema=schema)
164
+
165
+
166
+ def smf_i_dpd_tid_selector(pkt: 'dict[str, Any]') -> 'Field':
167
+ """Selector function for :attr:`SMFIdentificationBasedDPDOption.tid` field.
168
+
169
+ Args:
170
+ pkt: Packet data.
171
+
172
+ Returns:
173
+ * If ``tid_type`` is ``0``, returns a :class:`~pcapkit.corekit.fields.misc.NoValueField`
174
+ instance.
175
+ * If ``tid_type`` is ``1``, returns a :class:`~pcapkit.corekit.fields.ipaddress.IPv4AddressField`
176
+ instance.
177
+ * If ``tid_type`` is ``2``, returns a :class:`~pcapkit.corekit.fields.ipaddress.IPv6AddressField`
178
+ instance.
179
+ * Otherwise, returns a :class:`~pcapkit.corekit.fields.strings.BytesField` instance.
180
+
181
+ """
182
+ tid_type = Enum_TaggerID.get(pkt['info']['type'])
183
+ tid_len = pkt['info']['len']
184
+
185
+ # update type
186
+ pkt['info']['type'] = tid_type
187
+
188
+ if tid_type == Enum_TaggerID.NULL:
189
+ if tid_len != 0:
190
+ raise FieldValueError(f'IPv6-Opts: invalid TaggerID length: {tid_len}')
191
+ return NoValueField()
192
+ if tid_type == Enum_TaggerID.IPv4:
193
+ if tid_len != 3:
194
+ raise FieldValueError(f'IPv6-Opts: invalid TaggerID length: {tid_len}')
195
+ return IPv4AddressField()
196
+ if tid_type == Enum_TaggerID.IPv6:
197
+ if tid_len != 15:
198
+ raise FieldValueError(f'IPv6-Opts: invalid TaggerID length: {tid_len}')
199
+ return IPv6AddressField()
200
+ return BytesField(length=tid_len + 1)
201
+
202
+
203
+ def quick_start_data_selector(pkt: 'dict[str, Any]') -> 'Field':
204
+ """Selector function for :attr:`_QuickStartOption.data` field.
205
+
206
+ Args:
207
+ pkt: Packet data.
208
+
209
+ Returns:
210
+ * If ``func`` is ``0``, returns a :class:`~pcapkit.corekit.fields.misc.SchemaField`
211
+ wrapped :class:`~pcapkit.protocols.schema.internet.ipv6_opts.QuickStartRequestOption`
212
+ instance.
213
+ * If ``func`` is ``8``, returns a :class:`~pcapkit.corekit.fields.misc.SchemaField`
214
+ wrapped :class:`~pcapkit.protocols.schema.internet.ipv6_opts.QuickStartReportOption`
215
+ instance.
216
+
217
+ """
218
+ func = Enum_QSFunction.get(pkt['flags']['func'])
219
+ pkt['flags']['func'] = func
220
+
221
+ schema = QuickStartOption.registry[func]
222
+ if schema is None:
223
+ raise FieldValueError(f'IPv6-Opts: invalid QS function: {func}')
224
+ return SchemaField(length=5, schema=schema)
225
+
226
+
227
+ class Option(EnumSchema[Enum_Option]):
228
+ """Header schema for IPv6-Opts options."""
229
+
230
+ __default__ = lambda: UnassignedOption
231
+
232
+ #: Option type.
233
+ type: 'Enum_Option' = EnumField(length=1, namespace=Enum_Option)
234
+ #: Option length (conditional in case of ``Pad1`` option).
235
+ len: 'int' = ConditionalField(
236
+ UInt8Field(default=0),
237
+ lambda pkt: pkt['type'] != Enum_Option.Pad1,
238
+ )
239
+
240
+ def post_process(self, packet: 'dict[str, Any]') -> 'Schema':
241
+ """Revise ``schema`` data after unpacking process.
242
+
243
+ Args:
244
+ packet: Unpacked data.
245
+
246
+ Returns:
247
+ Revised schema.
248
+
249
+ """
250
+ # for Pad1 option, length is always 0
251
+ if self.type == Enum_Option.Pad1:
252
+ self.len = 0
253
+ return self
254
+
255
+
256
+ @schema_final
257
+ class UnassignedOption(Option):
258
+ """Header schema for IPv6-Opts unassigned options."""
259
+
260
+ #: Option data.
261
+ data: 'bytes' = BytesField(length=lambda pkt: pkt['len'])
262
+
263
+ if TYPE_CHECKING:
264
+ def __init__(self, type: 'Enum_Option', len: 'int', data: 'bytes') -> 'None': ...
265
+
266
+
267
+ @schema_final
268
+ class PadOption(Option, code=[Enum_Option.Pad1,
269
+ Enum_Option.PadN]):
270
+ """Header schema for IPv6-Opts padding options."""
271
+
272
+ #: Padding.
273
+ pad: 'bytes' = PaddingField(length=lambda pkt: pkt.get('len', 0))
274
+
275
+ if TYPE_CHECKING:
276
+ def __init__(self, type: 'Enum_Option', len: 'int') -> 'None': ...
277
+
278
+
279
+ @schema_final
280
+ class TunnelEncapsulationLimitOption(Option, code=Enum_Option.Tunnel_Encapsulation_Limit):
281
+ """Header schema for IPv6-Opts tunnel encapsulation limit options."""
282
+
283
+ #: Tunnel encapsulation limit.
284
+ limit: 'int' = UInt8Field()
285
+
286
+ if TYPE_CHECKING:
287
+ def __init__(self, type: 'Enum_Option', len: 'int', limit: 'int') -> 'None': ...
288
+
289
+
290
+ @schema_final
291
+ class RouterAlertOption(Option, code=Enum_Option.Router_Alert):
292
+ """Header schema for IPv6-Opts router alert options."""
293
+
294
+ #: Router alert.
295
+ alert: 'Enum_RouterAlert' = EnumField(length=2, namespace=Enum_RouterAlert)
296
+
297
+ if TYPE_CHECKING:
298
+ def __init__(self, type: 'Enum_Option', len: 'int', alert: 'Enum_RouterAlert') -> 'None': ...
299
+
300
+
301
+ @schema_final
302
+ class CALIPSOOption(Option, code=Enum_Option.CALIPSO):
303
+ """Header schema for IPv6-Opts common architecture label IPv6 security options."""
304
+
305
+ #: CALIPSO domain of interpretation.
306
+ domain: 'int' = UInt32Field()
307
+ #: Compartment length.
308
+ cmpt_len: 'int' = UInt8Field()
309
+ #: Sens level.
310
+ level: 'int' = UInt8Field()
311
+ #: Checksum (CRC-16).
312
+ checksum: 'bytes' = BytesField(length=2)
313
+ #: Compartment bitmap.
314
+ bitmap: 'bytes' = ConditionalField(
315
+ BytesField(length=lambda pkt: pkt['cmpt_len'] * 4),
316
+ lambda pkt: pkt['cmpt_len'] > 0,
317
+ )
318
+ #: Padding.
319
+ pad: 'bytes' = PaddingField(length=lambda pkt: pkt['len'] - 8 - pkt['cmpt_len'] * 4)
320
+
321
+ if TYPE_CHECKING:
322
+ def __init__(self, type: 'Enum_Option', len: 'int', domain: 'int', cmpt_len: 'int',
323
+ level: 'int', checksum: 'bytes', bitmap: 'Optional[bytes]') -> 'None': ...
324
+
325
+
326
+ @schema_final
327
+ class _SMFDPDOption(Schema):
328
+ """Header schema for IPv6-Opts SMF DPD options with generic representation."""
329
+
330
+ #: SMF DPD mode.
331
+ test: 'SMFDPDTestFlag' = ForwardMatchField(BitField(length=3, namespace={
332
+ 'len': (1, 8),
333
+ 'mode': (16, 1),
334
+ }))
335
+ #: SMF DPD data.
336
+ data: 'SMFIdentificationBasedDPDOption | SMFHashBasedDPDOption' = SwitchField(
337
+ selector=smf_dpd_data_selector,
338
+ )
339
+
340
+ def post_process(self, packet: 'dict[str, Any]') -> 'SMFDPDOption':
341
+ """Revise ``schema`` data after unpacking process.
342
+
343
+ Args:
344
+ packet: Unpacked data.
345
+
346
+ Returns:
347
+ Revised schema.
348
+
349
+ """
350
+ ret = self.data
351
+ return ret
352
+
353
+
354
+ # register ``_SMFDPDOption`` as ``SMF_DPD`` option
355
+ Option.register(Enum_Option.SMF_DPD, _SMFDPDOption)
356
+
357
+
358
+ class SMFDPDOption(Option, EnumSchema[Enum_SMFDPDMode]):
359
+ """Header schema for IPv6-Opts simplified multicast forwarding duplicate packet
360
+ detection (``SMF_DPD``) options."""
361
+
362
+ __enum__: 'DefaultDict[Enum_SMFDPDMode, Type[SMFDPDOption]]' = collections.defaultdict(lambda: None) # type: ignore[arg-type,return-value]
363
+
364
+ if TYPE_CHECKING:
365
+ mode: 'Enum_SMFDPDMode'
366
+
367
+
368
+ @schema_final
369
+ class SMFIdentificationBasedDPDOption(SMFDPDOption, code=Enum_SMFDPDMode.I_DPD):
370
+ """Header schema for IPv6-Opts SMF identification-based DPD options."""
371
+
372
+ test: 'SMFDPDTestFlag' = ForwardMatchField(BitField(length=1, namespace={
373
+ 'mode': (0, 1),
374
+ }))
375
+ #: TaggerID information.
376
+ info: 'TaggerIDInfo' = BitField(length=1, namespace={
377
+ 'mode': (0, 1),
378
+ 'type': (1, 3),
379
+ 'len': (4, 4),
380
+ })
381
+ #: TaggerID.
382
+ tid: 'bytes | IPv4Address | IPv6Address' = ConditionalField(
383
+ SwitchField(selector=smf_i_dpd_tid_selector),
384
+ lambda pkt: pkt['info']['type'] != 0,
385
+ )
386
+ #: Identifier.
387
+ id: 'bytes' = BytesField(length=lambda pkt: pkt['len'] - (
388
+ 1 if pkt['info']['type'] == 0 else (pkt['info']['len'] + 2)
389
+ ))
390
+
391
+ def post_process(self, packet: 'dict[str, Any]') -> 'SMFIdentificationBasedDPDOption':
392
+ """Revise ``schema`` data after unpacking process.
393
+
394
+ Args:
395
+ packet: Unpacked data.
396
+
397
+ Returns:
398
+ Revised schema.
399
+
400
+ """
401
+ ret = super().post_process(packet) # type: SMFIdentificationBasedDPDOption
402
+ ret.mode = Enum_SMFDPDMode.I_DPD
403
+ return ret
404
+
405
+ if TYPE_CHECKING:
406
+ def __init__(self, type: 'Enum_Option', len: 'int', info: 'TaggerIDInfo',
407
+ tid: 'Optional[bytes]', id: 'bytes') -> 'None': ...
408
+
409
+
410
+ @schema_final
411
+ class SMFHashBasedDPDOption(SMFDPDOption, code=Enum_SMFDPDMode.H_DPD):
412
+ """Header schema for IPv6-Opts SMF hash-based DPD options."""
413
+
414
+ #: Hash assist value (HAV).
415
+ hav: 'bytes' = BytesField(length=lambda pkt: pkt['len'])
416
+
417
+ def post_process(self, packet: 'dict[str, Any]') -> 'SMFIdentificationBasedDPDOption':
418
+ """Revise ``schema`` data after unpacking process.
419
+
420
+ Args:
421
+ packet: Unpacked data.
422
+
423
+ Returns:
424
+ Revised schema.
425
+
426
+ """
427
+ ret = super().post_process(packet) # type: SMFIdentificationBasedDPDOption
428
+ ret.mode = Enum_SMFDPDMode.H_DPD
429
+ return ret
430
+
431
+ if TYPE_CHECKING:
432
+ def __init__(self, type: 'Enum_Option', len: 'int', hav: 'bytes') -> 'None': ...
433
+
434
+
435
+ @schema_final
436
+ class PDMOption(Option, code=Enum_Option.PDM):
437
+ """Header schema for IPv6-Opts performance and diagnostic metrics (PDM) options."""
438
+
439
+ #: Scale delta time last received (DTLR).
440
+ scaledtlr: 'int' = UInt8Field()
441
+ #: Scale delta time last sent (DTLS).
442
+ scaledtls: 'int' = UInt8Field()
443
+ #: Packet sequence number (PSN) this packet.
444
+ psntp: 'int' = UInt16Field()
445
+ #: Packet sequence number (PSN) last received.
446
+ psnlr: 'int' = UInt16Field()
447
+ #: Delta time last received (DTLR).
448
+ deltatlr: 'int' = UInt16Field()
449
+ #: Delta time last sent (DTLS).
450
+ deltatls: 'int' = UInt16Field()
451
+
452
+ if TYPE_CHECKING:
453
+ def __init__(self, type: 'Enum_Option', len: 'int', scaledtlr: 'int', scaledtls: 'int',
454
+ psntp: 'int', psnlr: 'int', deltatlr: 'int', deltatls: 'int') -> 'None': ...
455
+
456
+
457
+ @schema_final
458
+ class _QuickStartOption(Schema):
459
+ """Header schema for IPv6-Opts quick start options in generic representation."""
460
+
461
+ #: Flags.
462
+ flags: 'QSTestFlags' = ForwardMatchField(BitField(length=3, namespace={
463
+ 'func': (16, 4),
464
+ }))
465
+ #: QS data.
466
+ data: 'QuickStartRequestOption | QuickStartReportOption' = SwitchField(
467
+ selector=quick_start_data_selector,
468
+ )
469
+
470
+ def post_process(self, packet: 'dict[str, Any]') -> 'QuickStartOption':
471
+ """Revise ``schema`` data after unpacking process.
472
+
473
+ Args:
474
+ packet: Unpacked data.
475
+
476
+ Returns:
477
+ Revised schema.
478
+
479
+ """
480
+ ret = self.data
481
+ ret.func = Enum_QSFunction.get(self.flags['func'])
482
+ return ret
483
+
484
+
485
+ # register ``_QuickStartOption`` as ``Quick_Start`` option
486
+ Option.register(Enum_Option.Quick_Start, _QuickStartOption)
487
+
488
+
489
+ class QuickStartOption(Option, EnumSchema[Enum_QSFunction]):
490
+ """Header schema for IPv6-Opts quick start options."""
491
+
492
+ #: Flags.
493
+ flags: 'QuickStartFlags' = BitField(length=1, namespace={
494
+ 'func': (0, 4),
495
+ 'rate': (4, 4),
496
+ })
497
+
498
+ if TYPE_CHECKING:
499
+ func: 'Enum_QSFunction'
500
+
501
+
502
+ @schema_final
503
+ class QuickStartRequestOption(QuickStartOption, code=Enum_QSFunction.Quick_Start_Request):
504
+ """Header schema for IPv6-Opts quick start request options."""
505
+
506
+ #: QS time-to-live (TTL).
507
+ ttl: 'int' = UInt8Field()
508
+ #: QS nonce.
509
+ nonce: 'QSNonce' = BitField(length=4, namespace={
510
+ 'nonce': (0, 30),
511
+ })
512
+
513
+ if TYPE_CHECKING:
514
+ def __init__(self, type: 'Enum_Option', len: 'int', flags: 'QuickStartFlags',
515
+ ttl: 'int', nonce: 'QSNonce') -> 'None': ...
516
+
517
+
518
+ @schema_final
519
+ class QuickStartReportOption(QuickStartOption, code=Enum_QSFunction.Report_of_Approved_Rate):
520
+ """Header schema for IPv6-Opts quick start report of approved rate options."""
521
+
522
+ #: Reserved.
523
+ reserved: 'bytes' = PaddingField(length=1)
524
+ #: QS nonce.
525
+ nonce: 'QSNonce' = BitField(length=4, namespace={
526
+ 'nonce': (0, 30),
527
+ })
528
+
529
+ if TYPE_CHECKING:
530
+ def __init__(self, type: 'Enum_Option', len: 'int', flags: 'QuickStartFlags',
531
+ nonce: 'QSNonce') -> 'None': ...
532
+
533
+
534
+ @schema_final
535
+ class RPLOption(Option, code=[Enum_Option.RPL_Option_0x23,
536
+ Enum_Option.RPL_Option_0x63]):
537
+ """Header schema for IPv6-Opts routing protocol for low-power and lossy networks (RPL) options."""
538
+
539
+ #: Flags.
540
+ flags: 'RPLFlags' = BitField(length=1, namespace={
541
+ 'down': (0, 1),
542
+ 'rank_err': (1, 1),
543
+ 'fwd_err': (2, 1),
544
+ })
545
+ #: RPL instance ID.
546
+ id: 'int' = UInt8Field()
547
+ #: Sender rank.
548
+ rank: 'int' = UInt16Field()
549
+
550
+ if TYPE_CHECKING:
551
+ def __init__(self, type: 'Enum_Option', len: 'int', flags: 'RPLFlags', id: 'int',
552
+ rank: 'int') -> 'None': ...
553
+
554
+
555
+ @schema_final
556
+ class MPLOption(Option, code=Enum_Option.MPL_Option):
557
+ """Header schema for IPv6-Opts multicast protocol for low-power and lossy networks (MPL) options."""
558
+
559
+ #: Flags.
560
+ flags: 'MPLFlags' = BitField(length=1, namespace={
561
+ 'type': (0, 2),
562
+ 'max': (2, 1),
563
+ 'drop': (3, 1),
564
+ })
565
+ #: MPL sequence number.
566
+ seq: 'int' = UInt8Field()
567
+ #: MPL Seed-ID.
568
+ seed: 'int' = ConditionalField(
569
+ NumberField(length=mpl_opt_seed_id_len, signed=False),
570
+ lambda pkt: pkt['flags']['type'] != Enum_SeedID.IPV6_SOURCE_ADDRESS,
571
+ )
572
+ #: Reserved data (padding).
573
+ pad: 'bytes' = PaddingField(length=lambda pkt: pkt['len'] - 2 - (
574
+ 0 if pkt['flags']['type'] == 0 else mpl_opt_seed_id_len(pkt)
575
+ ))
576
+
577
+ def post_process(self, packet: 'dict[str, Any]') -> 'Schema':
578
+ """Revise ``schema`` data after unpacking process.
579
+
580
+ Args:
581
+ packet: Unpacked data.
582
+
583
+ Returns:
584
+ Revised schema.
585
+
586
+ """
587
+ if self.flags['type'] == Enum_SeedID.IPV6_SOURCE_ADDRESS:
588
+ self.seed = packet.get('src', NoValue)
589
+ return self
590
+
591
+ if TYPE_CHECKING:
592
+ def __init__(self, type: 'Enum_Option', len: 'int', flags: 'MPLFlags', seq: 'int',
593
+ seed: 'Optional[int]') -> 'None': ...
594
+
595
+
596
+ @schema_final
597
+ class ILNPOption(Option, code=Enum_Option.ILNP_Nonce):
598
+ """Header schema for IPv6-Opts identifier-locator network protocol (ILNP) options."""
599
+
600
+ #: Nonce value.
601
+ nonce: 'int' = NumberField(length=lambda pkt: pkt['len'], signed=False)
602
+
603
+ if TYPE_CHECKING:
604
+ def __init__(self, type: 'Enum_Option', len: 'int', nonce: 'int') -> 'None': ...
605
+
606
+
607
+ @schema_final
608
+ class LineIdentificationOption(Option, code=Enum_Option.Line_Identification_Option):
609
+ """Header schema for IPv6-Opts line-identification options."""
610
+
611
+ #: Line ID length.
612
+ id_len: 'int' = UInt8Field()
613
+ #: Line ID.
614
+ id: 'bytes' = BytesField(length=lambda pkt: pkt['id_len'])
615
+
616
+ if TYPE_CHECKING:
617
+ def __init__(self, type: 'Enum_Option', len: 'int', id_len: 'int', id: 'bytes') -> 'None': ...
618
+
619
+
620
+ @schema_final
621
+ class JumboPayloadOption(Option, code=Enum_Option.Jumbo_Payload):
622
+ """Header schema for IPv6-Opts jumbo payload options."""
623
+
624
+ #: Jumbo payload length.
625
+ jumbo_len: 'int' = UInt32Field()
626
+
627
+ if TYPE_CHECKING:
628
+ def __init__(self, type: 'Enum_Option', len: 'int', jumbo_len: 'int') -> 'None': ...
629
+
630
+
631
+ @schema_final
632
+ class HomeAddressOption(Option, code=Enum_Option.Home_Address):
633
+ """Header schema for IPv6-Opts home address options."""
634
+
635
+ #: Home address.
636
+ addr: 'IPv6Address' = IPv6AddressField()
637
+
638
+ if TYPE_CHECKING:
639
+ def __init__(self, type: 'Enum_Option', len: 'int', addr: 'IPv6Address | int | str | bytes') -> 'None': ...
640
+
641
+
642
+ @schema_final
643
+ class IPDFFOption(Option, code=Enum_Option.IP_DFF):
644
+ """Header schema for IPv6-Opts depth-first forwarding (``IP_DFF``) options."""
645
+
646
+ #: Flags.
647
+ flags: 'DFFFlags' = BitField(length=1, namespace={
648
+ 'ver': (0, 2),
649
+ 'dup': (2, 1),
650
+ 'ret': (3, 1),
651
+ })
652
+ #: Sequence number.
653
+ seq: 'int' = UInt16Field()
654
+
655
+ if TYPE_CHECKING:
656
+ def __init__(self, type: 'Enum_Option', len: 'int', flags: 'DFFFlags', seq: 'int') -> 'None': ...
657
+
658
+
659
+ @schema_final
660
+ class IPv6_Opts(Schema):
661
+ """Header schema for IPv6-Opts packet."""
662
+
663
+ #: Next header.
664
+ next: 'Enum_TransType' = EnumField(length=1, namespace=Enum_TransType)
665
+ #: Header length.
666
+ len: 'int' = UInt8Field()
667
+ #: Options.
668
+ options: 'list[Option]' = OptionField(
669
+ length=lambda pkt: pkt['len'] * 8 + 6,
670
+ base_schema=Option,
671
+ type_name='type',
672
+ registry=Option.registry,
673
+ )
674
+ #: Payload.
675
+ payload: 'bytes' = PayloadField()
676
+
677
+ if TYPE_CHECKING:
678
+ def __init__(self, next: 'Enum_TransType', len: 'int',
679
+ options: 'bytes | list[bytes | Option]',
680
+ payload: 'bytes | Protocol | Schema') -> 'None': ...