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,710 @@
1
+ # -*- coding: utf-8 -*-
2
+ """IPv6-Route - Routing Header for IPv6
3
+ ==========================================
4
+
5
+ .. module:: pcapkit.protocols.internet.ipv6_route
6
+
7
+ :mod:`pcapkit.protocols.internet.ipv6_route` contains
8
+ :class:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route`
9
+ only, which implements extractor for Routing Header for IPv6
10
+ (IPv6-Route) [*]_, whose structure is described as below:
11
+
12
+ ======= ========= ==================== ===============================
13
+ Octets Bits Name Description
14
+ ======= ========= ==================== ===============================
15
+ 0 0 ``route.next`` Next Header
16
+ 1 8 ``route.length`` Header Extensive Length
17
+ 2 16 ``route.type`` Routing Type
18
+ 3 24 ``route.seg_left`` Segments Left
19
+ 4 32 ``route.data`` Type-Specific Data
20
+ ======= ========= ==================== ===============================
21
+
22
+ .. [*] https://en.wikipedia.org/wiki/IPv6_packet#Routing
23
+
24
+ """
25
+ import collections
26
+ import ipaddress
27
+ import math
28
+ import os.path as os_path
29
+ from typing import TYPE_CHECKING, cast, overload
30
+
31
+ from pcapkit.const.ipv6.routing import Routing as Enum_Routing
32
+ from pcapkit.const.reg.transtype import TransType as Enum_TransType
33
+ from pcapkit.protocols.data.internet.ipv6_route import RPL as Data_RPL
34
+ from pcapkit.protocols.data.internet.ipv6_route import IPv6_Route as Data_IPv6_Route
35
+ from pcapkit.protocols.data.internet.ipv6_route import SourceRoute as Data_SourceRoute
36
+ from pcapkit.protocols.data.internet.ipv6_route import Type2 as Data_Type2
37
+ from pcapkit.protocols.data.internet.ipv6_route import UnknownType as Data_UnknownType
38
+ from pcapkit.protocols.internet.internet import Internet
39
+ from pcapkit.protocols.schema.internet.ipv6_route import RPL as Schema_RPL
40
+ from pcapkit.protocols.schema.internet.ipv6_route import IPv6_Route as Schema_IPv6_Route
41
+ from pcapkit.protocols.schema.internet.ipv6_route import SourceRoute as Schema_SourceRoute
42
+ from pcapkit.protocols.schema.internet.ipv6_route import Type2 as Schema_Type2
43
+ from pcapkit.protocols.schema.internet.ipv6_route import UnknownType as Schema_UnknownType
44
+ from pcapkit.protocols.schema.schema import Schema
45
+ from pcapkit.utilities.exceptions import ProtocolError, UnsupportedCall
46
+ from pcapkit.utilities.warnings import RegistryWarning, warn
47
+
48
+ if TYPE_CHECKING:
49
+ from enum import IntEnum as StdlibEnum
50
+ from ipaddress import IPv6Address
51
+ from typing import IO, Any, Callable, DefaultDict, NoReturn, Optional, Type
52
+
53
+ from aenum import IntEnum as AenumEnum
54
+ from mypy_extensions import DefaultArg, KwArg, NamedArg
55
+ from typing_extensions import Literal
56
+
57
+ from pcapkit.corekit.protochain import ProtoChain
58
+ from pcapkit.protocols.protocol import ProtocolBase as Protocol
59
+ from pcapkit.protocols.schema.internet.ipv6_route import RoutingType as Schema_RoutingType
60
+
61
+ TypeParser = Callable[[Schema_RoutingType, NamedArg(Schema_IPv6_Route, 'header')], Data_IPv6_Route]
62
+ TypeConstructor = Callable[[Enum_Routing, DefaultArg(Optional[Data_IPv6_Route]),
63
+ NamedArg(Optional[IPv6Address], 'dst'), KwArg(Any)], Schema_RoutingType]
64
+
65
+ __all__ = ['IPv6_Route']
66
+
67
+
68
+ class IPv6_Route(Internet[Data_IPv6_Route, Schema_IPv6_Route],
69
+ schema=Schema_IPv6_Route, data=Data_IPv6_Route):
70
+ """This class implements Routing Header for IPv6.
71
+
72
+ This class currently supports parsing of the following Routing Header for IPv6
73
+ routing data types, which are registered in the
74
+ :attr:`self.__routing__ <pcapkit.protocols.internet.ipv6_route.IPv6_Route.__routing__>`
75
+ attribute:
76
+
77
+ .. list-table::
78
+ :header-rows: 1
79
+
80
+ * - Routing Code
81
+ - Data Parser
82
+ - Data Constructor
83
+ * - :attr:`~pcapkit.const.ipv6.routing.Routing.Source_Route`
84
+ - :meth:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route._read_data_type_src`
85
+ - :meth:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route._make_data_type_src`
86
+ * - :attr:`~pcapkit.const.ipv6.routing.Routing.Type_2_Routing_Header`
87
+ - :meth:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route._read_data_type_2`
88
+ - :meth:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route._make_data_type_2`
89
+ * - :attr:`~pcapkit.const.ipv6.routing.Routing.RPL_Source_Route_Header`
90
+ - :meth:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route._read_data_type_rpl`
91
+ - :meth:`~pcapkit.protocols.internet.ipv6_route.IPv6_Route._make_data_type_rpl`
92
+
93
+ """
94
+
95
+ ##########################################################################
96
+ # Defaults.
97
+ ##########################################################################
98
+
99
+ #: DefaultDict[Enum_Routing, str | tuple[TypeParser, TypeConstructor]]: Type
100
+ #: code to method mapping. Method names are expected to be referred to
101
+ #: the class by ``_read_data_type_${name}`` and/or ``_make_data_type_${name}``,
102
+ #: and if such name not found, the value should then be a method that can
103
+ #: parse the routing type by itself.
104
+ __routing__ = collections.defaultdict(
105
+ lambda: 'none',
106
+ {
107
+ Enum_Routing.Source_Route: 'src', # [RFC 5095] DEPRECATED
108
+ Enum_Routing.Type_2_Routing_Header: '2', # [RFC 6275]
109
+ Enum_Routing.RPL_Source_Route_Header: 'rpl', # [RFC 6554]
110
+ },
111
+ ) # type: DefaultDict[Enum_Routing | int, str | tuple[TypeParser, TypeConstructor]]
112
+
113
+ ##########################################################################
114
+ # Properties.
115
+ ##########################################################################
116
+
117
+ @property
118
+ def name(self) -> 'Literal["Routing Header for IPv6"]':
119
+ """Name of current protocol."""
120
+ return 'Routing Header for IPv6'
121
+
122
+ @property
123
+ def alias(self) -> 'Literal["IPv6-Route"]':
124
+ """Acronym of corresponding protocol."""
125
+ return 'IPv6-Route'
126
+
127
+ @property
128
+ def length(self) -> 'int':
129
+ """Header length of current protocol."""
130
+ return self._info.length
131
+
132
+ @property
133
+ def payload(self) -> 'Protocol | NoReturn':
134
+ """Payload of current instance.
135
+
136
+ Raises:
137
+ UnsupportedCall: if the protocol is used as an IPv6 extension header
138
+
139
+ :rtype: pcapkit.protocols.protocol.Protocol
140
+ """
141
+ if self._extf:
142
+ raise UnsupportedCall(f"'{self.__class__.__name__}' object has no attribute 'payload'")
143
+ return self._next
144
+
145
+ @property
146
+ def protocol(self) -> 'Optional[str] | NoReturn':
147
+ """Name of next layer protocol (if any).
148
+
149
+ Raises:
150
+ UnsupportedCall: if the protocol is used as an IPv6 extension header
151
+
152
+ """
153
+ if self._extf:
154
+ raise UnsupportedCall(f"'{self.__class__.__name__}' object has no attribute 'protocol'")
155
+ return super().protocol
156
+
157
+ @property
158
+ def protochain(self) -> 'ProtoChain | NoReturn':
159
+ """Protocol chain of current instance.
160
+
161
+ Raises:
162
+ UnsupportedCall: if the protocol is used as an IPv6 extension header
163
+
164
+ """
165
+ if self._extf:
166
+ raise UnsupportedCall(f"'{self.__class__.__name__}' object has no attribute 'protochain'")
167
+ return super().protochain
168
+
169
+ ##########################################################################
170
+ # Methods.
171
+ ##########################################################################
172
+
173
+ def read(self, length: 'Optional[int]' = None, *, extension: 'bool' = False, # pylint: disable=arguments-differ
174
+ **kwargs: 'Any') -> 'Data_IPv6_Route': # pylint: disable=unused-argument
175
+ """Read Routing Header for IPv6.
176
+
177
+ Structure of IPv6-Route header [:rfc:`8200`][:rfc:`5095`]:
178
+
179
+ .. code-block:: text
180
+
181
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
182
+ | Next Header | Hdr Ext Len | Routing Type | Segments Left |
183
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
184
+ | |
185
+ . .
186
+ . type-specific data .
187
+ . .
188
+ | |
189
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
190
+
191
+ Args:
192
+ length: Length of packet data.
193
+ extension: If the packet is used as an IPv6 extension header.
194
+ **kwargs: Arbitrary keyword arguments.
195
+
196
+ Returns:
197
+ Parsed packet data.
198
+
199
+ """
200
+ if length is None:
201
+ length = len(self)
202
+ schema = self.__header__
203
+
204
+ name = self.__routing__[schema.type]
205
+ if isinstance(name, str):
206
+ name = f'_read_data_type_{name.lower()}'
207
+ meth = cast('TypeParser',
208
+ getattr(self, name, self._read_data_type_none))
209
+ else:
210
+ meth = name[0]
211
+ ipv6_route = meth(schema.data, header=schema)
212
+
213
+ if extension:
214
+ return ipv6_route
215
+ return self._decode_next_layer(ipv6_route, schema.next, length - ipv6_route.length)
216
+
217
+ def make(self,
218
+ dst: 'Optional[IPv6Address | str | int| bytes]' = None,
219
+ next: 'Enum_TransType | StdlibEnum | AenumEnum | str | int' = Enum_TransType.UDP,
220
+ next_default: 'Optional[int]' = None,
221
+ next_namespace: 'Optional[dict[str, int] | dict[int, str] | Type[StdlibEnum] | Type[AenumEnum]]' = None, # pylint: disable=line-too-long
222
+ next_reversed: 'bool' = False,
223
+ type: 'Enum_Routing | StdlibEnum | AenumEnum | str | int' = Enum_Routing.Source_Route,
224
+ type_default: 'Optional[int]' = None,
225
+ type_namespace: 'Optional[dict[str, int] | dict[int, str] | Type[StdlibEnum] | Type[AenumEnum]]' = None, # pylint: disable=line-too-long
226
+ type_reversed: 'bool' = False,
227
+ seg_left: 'int' = 0,
228
+ data: 'bytes | Data_IPv6_Route | Schema_RoutingType | dict[str, Any]' = b'\x00\x00\x00\x00',
229
+ payload: 'Protocol | Schema | bytes' = b'',
230
+ **kwargs: 'Any') -> 'Schema_IPv6_Route':
231
+ """Make (construct) packet data.
232
+
233
+ Args:
234
+ dst: Destination address.
235
+ next: Next header type.
236
+ next_default: Default value of next header type.
237
+ next_namespace: Namespace of next header type.
238
+ next_reversed: If the namespace of next header type is reversed.
239
+ type: Routing type.
240
+ type_default: Default value of routing type.
241
+ type_namespace: Namespace of routing type.
242
+ type_reversed: If the namespace of routing type is reversed.
243
+ seg_left: Segments left.
244
+ data: Routing data.
245
+ payload: Payload of current instance.
246
+ **kwargs: Arbitrary keyword arguments.
247
+
248
+ Returns:
249
+ Constructed packet data.
250
+
251
+ """
252
+ next_val = cast('Enum_TransType',
253
+ self._make_index(next, next_default, namespace=next_namespace,
254
+ reversed=next_reversed, pack=False))
255
+ type_val = cast('Enum_Routing',
256
+ self._make_index(type, type_default, namespace=type_namespace,
257
+ reversed=type_reversed, pack=False))
258
+
259
+ if isinstance(data, bytes):
260
+ length = math.ceil((len(data) + 4) / 8)
261
+ data_val = data.ljust(length * 8 - 4, b'\x00') # type: bytes | Schema_RoutingType
262
+ elif isinstance(data, (dict, Data_IPv6_Route)):
263
+ name = self.__routing__[type_val]
264
+ if isinstance(name, str):
265
+ name = f'_make_data_type_{name.lower()}'
266
+ meth = cast('TypeConstructor',
267
+ getattr(self, name, self._make_data_type_none))
268
+ else:
269
+ meth = name[1]
270
+
271
+ dst_val = cast('IPv6Address', ipaddress.ip_address(dst)) if dst is not None else None
272
+ if isinstance(data, dict):
273
+ data_val = meth(type_val, dst=dst_val, **data)
274
+ else:
275
+ data_val = meth(type_val, data, dst=dst_val)
276
+ length = len(data_val.pack())
277
+ elif isinstance(data, Schema):
278
+ length = math.ceil((len(data.pack()) + 4) / 8)
279
+ data_val = data
280
+ else:
281
+ raise ProtocolError(f'{self.alias}: invalid routing data type: {data.__class__}')
282
+
283
+ return Schema_IPv6_Route(
284
+ next=next_val,
285
+ length=length,
286
+ type=type_val,
287
+ seg_left=seg_left,
288
+ data=data_val,
289
+ payload=payload,
290
+ )
291
+
292
+ @classmethod
293
+ def register_routing(cls, code: 'Enum_Routing', meth: 'str | tuple[TypeParser, TypeConstructor]') -> 'None':
294
+ """Register an routing data parser.
295
+
296
+ Args:
297
+ code: IPv6-Route data type code.
298
+ meth: Method name or callable to parse and/or construct the data.
299
+
300
+ """
301
+ if code in cls.__routing__:
302
+ warn(f'routing {code} already registered, overwriting', RegistryWarning)
303
+ cls.__routing__[code] = meth
304
+
305
+ ##########################################################################
306
+ # Data models.
307
+ ##########################################################################
308
+
309
+ @overload
310
+ def __post_init__(self, file: 'IO[bytes] | bytes', length: 'Optional[int]' = ..., *, # pylint: disable=arguments-differ
311
+ extension: 'bool' = ..., src_ip: 'Optional[IPv6Address]'= ...,
312
+ dst_ip: 'Optional[IPv6Address]'= ..., **kwargs: 'Any') -> 'None': ...
313
+
314
+ @overload
315
+ def __post_init__(self, **kwargs: 'Any') -> 'None': ... # pylint: disable=arguments-differ
316
+
317
+ def __post_init__(self, file: 'Optional[IO[bytes] | bytes]' = None, length: 'Optional[int]' = None, *, # pylint: disable=arguments-differ
318
+ extension: 'bool' = False, **kwargs: 'Any') -> 'None':
319
+ """Post initialisation hook.
320
+
321
+ Args:
322
+ file: Source packet stream.
323
+ length: Length of packet data.
324
+ extension: If the protocol is used as an IPv6 extension header.
325
+ src_ip: source IP address
326
+ dst_ip: destination IP address
327
+ **kwargs: Arbitrary keyword arguments.
328
+
329
+ See Also:
330
+ For construction argument, please refer to :meth:`self.make <IPv6_Route.make>`.
331
+
332
+ """
333
+ #: bool: If the protocol is used as an IPv6 extension header.
334
+ self._extf = extension
335
+
336
+ # call super __post_init__
337
+ super().__post_init__(file, length, extension=extension, **kwargs) # type: ignore[arg-type]
338
+
339
+ def __length_hint__(self) -> 'Literal[4]':
340
+ """Return an estimated length for the object."""
341
+ return 4
342
+
343
+ @classmethod
344
+ def __index__(cls) -> 'Enum_TransType': # pylint: disable=invalid-index-returned
345
+ """Numeral registry index of the protocol.
346
+
347
+ Returns:
348
+ Numeral registry index of the protocol in `IANA`_.
349
+
350
+ .. _IANA: https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml
351
+
352
+ """
353
+ return Enum_TransType.IPv6_Route # type: ignore[return-value]
354
+
355
+ ##########################################################################
356
+ # Utilities.
357
+ ##########################################################################
358
+
359
+ @classmethod
360
+ def _make_data(cls, data: 'Data_IPv6_Route') -> 'dict[str, Any]': # type: ignore[override]
361
+ """Create key-value pairs from ``data`` for protocol construction.
362
+
363
+ Args:
364
+ data: protocol data
365
+
366
+ Returns:
367
+ Key-value pairs for protocol construction.
368
+
369
+ """
370
+ return {
371
+ 'next': data.next,
372
+ 'type': data.type,
373
+ 'seg_left': data.seg_left,
374
+ 'data': data,
375
+ 'payload': cls._make_payload(data),
376
+ }
377
+
378
+ def _read_data_type_none(self, schema: 'Schema_UnknownType', *, header: 'Schema_IPv6_Route') -> 'Data_UnknownType':
379
+ """Read IPv6-Route unknown type data.
380
+
381
+ Structure of IPv6-Route unknown type data [:rfc:`8200`][:rfc:`5095`]:
382
+
383
+ .. code-block:: text
384
+
385
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
386
+ | Next Header | Hdr Ext Len | Routing Type | Segments Left |
387
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
388
+ | |
389
+ . .
390
+ . type-specific data .
391
+ . .
392
+ | |
393
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
394
+
395
+ Args:
396
+ schema: parsed routing data schema
397
+ header: parsed IPv6-Route header schema
398
+
399
+ Returns:
400
+ Parsed route data.
401
+
402
+ """
403
+ ipv6_route = Data_UnknownType(
404
+ next=header.next,
405
+ length=header.length,
406
+ type=header.type,
407
+ seg_left=header.seg_left,
408
+ data=schema.data,
409
+ )
410
+ return ipv6_route
411
+
412
+ def _read_data_type_src(self, schema: 'Schema_SourceRoute', *, header: 'Schema_IPv6_Route') -> 'Data_SourceRoute':
413
+ """Read IPv6-Route Source Route data.
414
+
415
+ Structure of IPv6-Route Source Route data [:rfc:`5095`]:
416
+
417
+ .. code-block:: text
418
+
419
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
420
+ | Next Header | Hdr Ext Len | Routing Type=0| Segments Left |
421
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
422
+ | Reserved |
423
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
424
+ | |
425
+ + +
426
+ | |
427
+ + Address[1] +
428
+ | |
429
+ + +
430
+ | |
431
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
432
+ | |
433
+ + +
434
+ | |
435
+ + Address[2] +
436
+ | |
437
+ + +
438
+ | |
439
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
440
+ . . .
441
+ . . .
442
+ . . .
443
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
444
+ | |
445
+ + +
446
+ | |
447
+ + Address[n] +
448
+ | |
449
+ + +
450
+ | |
451
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
452
+
453
+ Args:
454
+ schema: parsed routing data schema
455
+ header: parsed IPv6-Route header schema
456
+
457
+ Returns:
458
+ Parsed route data.
459
+
460
+ """
461
+ if (header.length - 8) % 16 != 0:
462
+ raise ProtocolError(f'{self.alias} [TypeNo {type}]: invalid format')
463
+
464
+ ipv6_route = Data_SourceRoute(
465
+ next=header.next,
466
+ length=header.length,
467
+ type=header.type,
468
+ seg_left=header.seg_left,
469
+ ip=tuple(schema.ip),
470
+ )
471
+ return ipv6_route
472
+
473
+ def _read_data_type_2(self, schema: 'Schema_Type2', *, header: 'Schema_IPv6_Route') -> 'Data_Type2':
474
+ """Read IPv6-Route Type 2 data.
475
+
476
+ Structure of IPv6-Route Type 2 data [:rfc:`6275`]:
477
+
478
+ .. code-block:: text
479
+
480
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
481
+ | Next Header | Hdr Ext Len=2 | Routing Type=2|Segments Left=1|
482
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
483
+ | Reserved |
484
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
485
+ | |
486
+ + +
487
+ | |
488
+ + Home Address +
489
+ | |
490
+ + +
491
+ | |
492
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
493
+
494
+ Args:
495
+ schema: parsed routing data schema
496
+ header: parsed IPv6-Route header schema
497
+
498
+ Returns:
499
+ Parsed route data.
500
+
501
+ Raises:
502
+ ProtocolError: If ``length`` is **NOT** ``24``.
503
+
504
+ """
505
+ if header.length != 24:
506
+ raise ProtocolError(f'{self.alias}: [TypeNo {type}] invalid format')
507
+
508
+ ipv6_route = Data_Type2(
509
+ next=header.next,
510
+ length=header.length,
511
+ type=header.type,
512
+ seg_left=header.seg_left,
513
+ ip=schema.ip,
514
+ )
515
+ return ipv6_route
516
+
517
+ def _read_data_type_rpl(self, schema: 'Schema_RPL', *, header: 'Schema_IPv6_Route') -> 'Data_RPL':
518
+ """Read IPv6-Route RPL Source data.
519
+
520
+ Structure of IPv6-Route RPL Source data [:rfc:`6554`]:
521
+
522
+ .. code-block:: text
523
+
524
+ 0 1 2 3
525
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
526
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
527
+ | Next Header | Hdr Ext Len | Routing Type | Segments Left |
528
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
529
+ | CmprI | CmprE | Pad | Reserved |
530
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
531
+ | |
532
+ . .
533
+ . Addresses[1..n] .
534
+ . .
535
+ | |
536
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
537
+
538
+ Args:
539
+ length: route data length
540
+
541
+ Returns:
542
+ Parsed route data.
543
+
544
+ """
545
+ if header.length % 16 != 0:
546
+ raise ProtocolError(f'{self.alias}: [TypeNo {type}] invalid format')
547
+
548
+ ipv6_route = Data_RPL(
549
+ next=header.next,
550
+ length=header.length,
551
+ type=header.type,
552
+ seg_left=header.seg_left,
553
+ cmpr_i=schema.cmpr_i,
554
+ cmpr_e=schema.cmpr_e,
555
+ pad=schema.pad['pad_len'],
556
+ ip=tuple(schema.ip),
557
+ )
558
+ return ipv6_route
559
+
560
+ def _make_data_type_none(self, type: 'Enum_Routing', route: 'Optional[Data_UnknownType]' = None, *,
561
+ dst: 'Optional[IPv6Address]' = None,
562
+ data: 'bytes' = b'\x00\x00\x00\x00',
563
+ **kwargs: 'Any') -> 'Schema_UnknownType':
564
+ """Make IPv6-Route unknown type data.
565
+
566
+ Args:
567
+ type: routing type
568
+ route: route data
569
+ dst: destination IPv6 address
570
+ data: raw route data as :obj:`bytes`
571
+ **kwargs: arbitrary keyword arguments
572
+
573
+ Returns:
574
+ Constructed route data schema.
575
+
576
+ """
577
+ if route is not None:
578
+ data = route.data
579
+
580
+ pad_len = 8 - (len(data) + 4) % 8
581
+ if pad_len:
582
+ data += bytes(pad_len)
583
+
584
+ return Schema_UnknownType(
585
+ data=data,
586
+ )
587
+
588
+ def _make_data_type_src(self, type: 'Enum_Routing', route: 'Optional[Data_SourceRoute]' = None, *,
589
+ dst: 'Optional[IPv6Address]' = None,
590
+ ip: 'Optional[list[IPv6Address | str | bytes | int]]' = None,
591
+ **kwargs: 'Any') -> 'Schema_SourceRoute':
592
+ """Make IPv6-Route Source Route data.
593
+
594
+ Args:
595
+ type: routing type
596
+ route: route data
597
+ dst: destination IPv6 address
598
+ ip: list of IPv6 addresses
599
+ **kwargs: arbitrary keyword arguments
600
+
601
+ Returns:
602
+ Constructed route data schema.
603
+
604
+ """
605
+ if route is not None:
606
+ ip = cast('list[IPv6Address | str | bytes | int]', route.ip)
607
+ else:
608
+ ip = [] if ip is None else ip
609
+
610
+ return Schema_SourceRoute(
611
+ ip=ip,
612
+ )
613
+
614
+ def _make_data_type_2(self, type: 'Enum_Routing', route: 'Optional[Data_Type2]' = None, *,
615
+ dst: 'Optional[IPv6Address]' = None,
616
+ ip: 'IPv6Address | str | bytes | int' = '::',
617
+ **kwargs: 'Any') -> 'Schema_Type2':
618
+ """Make IPv6-Route Type 2 data.
619
+
620
+ Args:
621
+ type: routing type
622
+ route: route data
623
+ dst: destination IPv6 address
624
+ ip: home address
625
+ **kwargs: arbitrary keyword arguments
626
+
627
+ Returns:
628
+ Constructed route data schema.
629
+
630
+ """
631
+ if route is not None:
632
+ ip = cast('IPv6Address | str | bytes | int', route.ip)
633
+
634
+ return Schema_Type2(
635
+ ip=ip,
636
+ )
637
+
638
+ def _make_data_type_rpl(self, type: 'Enum_Routing', route: 'Optional[Data_RPL]' = None, *,
639
+ dst: 'Optional[IPv6Address]' = None,
640
+ ip: 'Optional[list[IPv6Address | str | bytes | int]]' = None,
641
+ **kwargs: 'Any') -> 'Schema_RPL':
642
+ """Make IPv6-Route RPL Source data.
643
+
644
+ Args:
645
+ type: routing type
646
+ route: route data
647
+ dst: destination IPv6 address
648
+ ip: list of IPv6 addresses
649
+ **kwargs: arbitrary keyword arguments
650
+
651
+ Returns:
652
+ Constructed route data schema.
653
+
654
+ """
655
+ if route is not None:
656
+ cmpr_i = route.cmpr_i
657
+ cmpr_e = route.cmpr_e
658
+ pad = route.pad
659
+ ip_val = [
660
+ addr if isinstance(addr, bytes) else addr.packed for addr in route.ip
661
+ ]
662
+ else:
663
+ ip = [] if ip is None else ip
664
+
665
+ if dst is None:
666
+ pad = 0
667
+ cmpr_i = 0
668
+ cmpr_e = 0
669
+ ip_val = [
670
+ cast('IPv6Address', ipaddress.ip_address(addr)).packed for addr in ip
671
+ ]
672
+ else:
673
+ test_list = [dst.packed] # type: list[bytes]
674
+ for item in ip[:-1]:
675
+ if isinstance(item, bytes):
676
+ test_list.append(item)
677
+ else:
678
+ test_list.append(cast('IPv6Address', ipaddress.ip_address(item)).packed)
679
+ prefix_i = os_path.commonprefix(test_list)
680
+ cmpr_i = len(prefix_i)
681
+
682
+ test_list = [dst.packed]
683
+ if isinstance(ip[-1], bytes):
684
+ test_list.append(ip[-1])
685
+ else:
686
+ test_list.append(cast('IPv6Address', ipaddress.ip_address(ip[-1])).packed)
687
+ prefix_e = os_path.commonprefix(test_list)
688
+ cmpr_e = len(prefix_e)
689
+
690
+ pad = 8 - ((len(ip) - 1) * (16 - cmpr_i) + (16 - cmpr_e)) % 8
691
+
692
+ ip_val = []
693
+ for item in ip[:-1]:
694
+ if isinstance(item, bytes):
695
+ ip_val.append(item[cmpr_i:])
696
+ else:
697
+ ip_val.append(cast('IPv6Address', ipaddress.ip_address(item)).packed[cmpr_i:])
698
+ if isinstance(ip[-1], bytes):
699
+ ip_val.append(ip[-1][cmpr_e:])
700
+ else:
701
+ ip_val.append(cast('IPv6Address', ipaddress.ip_address(ip[-1])).packed[cmpr_e:])
702
+
703
+ return Schema_RPL(
704
+ cmpr_i=cmpr_i,
705
+ cmpr_e=cmpr_e,
706
+ pad={
707
+ 'pad_len': pad,
708
+ },
709
+ addresses=ip_val,
710
+ )