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,248 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Ethernet Protocol
3
+ =======================
4
+
5
+ .. module:: pcapkit.protocols.link.ethernet
6
+
7
+ :mod:`pcapkit.protocols.link.ethernet` contains
8
+ :class:`~pcapkit.protocols.link.ethernet.Ethernet`
9
+ only, which implements extractor for Ethernet
10
+ Protocol [*]_, whose structure is described as
11
+ below:
12
+
13
+ .. table::
14
+
15
+ ====== ===== ============ =========================
16
+ Octets Bits Name Description
17
+ ====== ===== ============ =========================
18
+ 0 0 ``eth.dst`` Destination MAC Address
19
+ ------ ----- ------------ -------------------------
20
+ 1 8 ``eth.src`` Source MAC Address
21
+ ------ ----- ------------ -------------------------
22
+ 2 16 ``eth.type`` Protocol (Internet Layer)
23
+ ====== ===== ============ =========================
24
+
25
+ .. [*] https://en.wikipedia.org/wiki/Ethernet
26
+
27
+ """
28
+ import re
29
+ import sys
30
+ import textwrap
31
+ from typing import TYPE_CHECKING
32
+
33
+ from pcapkit.const.reg.ethertype import EtherType as Enum_EtherType
34
+ from pcapkit.const.reg.linktype import LinkType as Enum_LinkType
35
+ from pcapkit.protocols.data.link.ethernet import Ethernet as Data_Ethernet
36
+ from pcapkit.protocols.link.link import Link
37
+ from pcapkit.protocols.schema.link.ethernet import Ethernet as Schema_Ethernet
38
+ from pcapkit.utilities.exceptions import ProtocolError
39
+
40
+ if TYPE_CHECKING:
41
+ from enum import IntEnum as StdlibEnum
42
+ from typing import Any, Optional, Type
43
+
44
+ from aenum import IntEnum as AenumEnum
45
+ from typing_extensions import Literal
46
+
47
+ from pcapkit.protocols.protocol import ProtocolBase as Protocol
48
+ from pcapkit.protocols.schema.schema import Schema
49
+
50
+ __all__ = ['Ethernet']
51
+
52
+ # check Python version
53
+ py38 = ((version_info := sys.version_info).major >= 3 and version_info.minor >= 8)
54
+
55
+ # Ethernet address pattern
56
+ PAT_MAC_ADDR = re.compile(rb'(?i)(?:[0-9a-f]{2}[:-]){5}[0-9a-f]{2}')
57
+
58
+
59
+ class Ethernet(Link[Data_Ethernet, Schema_Ethernet],
60
+ schema=Schema_Ethernet, data=Data_Ethernet):
61
+ """This class implements Ethernet Protocol."""
62
+
63
+ ##########################################################################
64
+ # Properties.
65
+ ##########################################################################
66
+
67
+ @property
68
+ def name(self) -> 'Literal["Ethernet Protocol"]':
69
+ """Name of current protocol."""
70
+ return 'Ethernet Protocol'
71
+
72
+ @property
73
+ def length(self) -> 'Literal[14]':
74
+ """Header length of current protocol."""
75
+ return 14
76
+
77
+ @property
78
+ def protocol(self) -> 'Enum_EtherType':
79
+ """Name of next layer protocol."""
80
+ return self._info.type
81
+
82
+ # source mac address
83
+ @property
84
+ def src(self) -> 'str':
85
+ """Source mac address."""
86
+ return self._info.src
87
+
88
+ # destination mac address
89
+ @property
90
+ def dst(self) -> 'str':
91
+ """Destination mac address."""
92
+ return self._info.dst
93
+
94
+ ##########################################################################
95
+ # Methods.
96
+ ##########################################################################
97
+
98
+ def read(self, length: 'Optional[int]' = None, **kwargs: 'Any') -> 'Data_Ethernet': # pylint: disable=unused-argument
99
+ """Read Ethernet Protocol.
100
+
101
+ Structure of Ethernet header [:rfc:`7042`]:
102
+
103
+ .. code-block:: text
104
+
105
+ 0 1 2 3
106
+ 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
107
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
108
+ | Dst MAC Addr |
109
+ + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
110
+ | | |
111
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
112
+ | Src MAC Addr |
113
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
114
+ | Ether Type |
115
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
116
+
117
+ Args:
118
+ length: Length of packet data.
119
+ **kwargs: Arbitrary keyword arguments.
120
+
121
+ Returns:
122
+ Parsed packet data.
123
+
124
+ """
125
+ if length is None:
126
+ length = len(self)
127
+ schema = self.__header__
128
+
129
+ _dstm = self._read_mac_addr(schema.dst)
130
+ _srcm = self._read_mac_addr(schema.src)
131
+ _type = schema.type
132
+
133
+ ethernet = Data_Ethernet(
134
+ dst=_dstm,
135
+ src=_srcm,
136
+ type=_type,
137
+ )
138
+ return self._decode_next_layer(ethernet, _type, length - self.length)
139
+
140
+ def make(self,
141
+ dst: 'str | bytes | bytearray' = '00:00:00:00:00:00',
142
+ src: 'str | bytes | bytearray' = '00:00:00:00:00:00',
143
+ type: 'Enum_EtherType | StdlibEnum | AenumEnum | str | int' = Enum_EtherType.Internet_Protocol_version_4,
144
+ type_default: 'Optional[int]' = None,
145
+ type_namespace: 'Optional[dict[str, int] | dict[int, str] | Type[StdlibEnum] | Type[AenumEnum]]' = None, # pylint: disable=line-too-long
146
+ type_reversed: 'bool' = False,
147
+ payload: 'bytes | Protocol | Schema' = b'',
148
+ **kwargs: 'Any') -> 'Schema_Ethernet':
149
+ """Make (construct) packet data.
150
+
151
+ Args:
152
+ dst: Destination MAC address.
153
+ src: Source MAC address.
154
+ type: EtherType.
155
+ type_default: Default EtherType.
156
+ type_namespace: EtherType namespace.
157
+ type_reversed: Whether EtherType is reversed.
158
+ payload: Payload data.
159
+ **kwargs: Arbitrary keyword arguments.
160
+
161
+ Returns:
162
+ Constructed packet data.
163
+
164
+ """
165
+ _type = self._make_index(type, type_default, namespace=type_namespace,
166
+ reversed=type_reversed, pack=False)
167
+
168
+ return Schema_Ethernet(
169
+ dst=self._make_mac_addr(dst),
170
+ src=self._make_mac_addr(src),
171
+ type=_type, # type: ignore[arg-type]
172
+ payload=payload,
173
+ )
174
+
175
+ ##########################################################################
176
+ # Data models.
177
+ ##########################################################################
178
+
179
+ def __length_hint__(self) -> 'Literal[14]':
180
+ """Return an estimated length for the object."""
181
+ return 14
182
+
183
+ @classmethod
184
+ def __index__(cls) -> 'Enum_LinkType': # pylint: disable=invalid-index-returned
185
+ """Numeral registry index of the protocol.
186
+
187
+ Returns:
188
+ Numeral registry index of the protocol in `tcpdump`_ link-layer
189
+ header types.
190
+
191
+ .. _tcpdump: https://www.tcpdump.org/linktypes.html
192
+
193
+ """
194
+ return Enum_LinkType.ETHERNET # type: ignore[return-value]
195
+
196
+ ##########################################################################
197
+ # Utilities.
198
+ ##########################################################################
199
+
200
+ @classmethod
201
+ def _make_data(cls, data: 'Data_Ethernet') -> 'dict[str, Any]': # type: ignore[override]
202
+ """Create key-value pairs from ``data`` for protocol construction.
203
+
204
+ Args:
205
+ data: protocol data
206
+
207
+ Returns:
208
+ Key-value pairs for protocol construction.
209
+
210
+ """
211
+ return {
212
+ 'dst': data.dst,
213
+ 'src': data.src,
214
+ 'type': data.type,
215
+ 'payload': cls._make_payload(data),
216
+ }
217
+
218
+ def _read_mac_addr(self, addr: 'bytes') -> 'str':
219
+ """Read MAC address.
220
+
221
+ Args:
222
+ addr: MAC address.
223
+
224
+ Returns:
225
+ Colon (``:``) seperated *hex* encoded MAC address.
226
+
227
+ """
228
+ if py38:
229
+ _addr = addr.hex(':')
230
+ else:
231
+ _addr = ':'.join(textwrap.wrap(addr.hex(), 2))
232
+ return _addr
233
+
234
+ def _make_mac_addr(self, addr: 'str | bytes | bytearray') -> 'bytes':
235
+ """Make MAC address.
236
+
237
+ Args:
238
+ addr: MAC address.
239
+
240
+ Returns:
241
+ MAC address.
242
+
243
+ """
244
+ _addr = addr.encode() if isinstance(addr, str) else addr
245
+
246
+ if PAT_MAC_ADDR.fullmatch(_addr) is not None:
247
+ return _addr.replace(b':', b'').replace(b'-', b'')
248
+ raise ProtocolError(f'invalid MAC address: {addr!r}')
@@ -0,0 +1,267 @@
1
+ # -*- coding: utf-8 -*-
2
+ """L2TP - Layer Two Tunnelling Protocol
3
+ ==========================================
4
+
5
+ .. module:: pcapkit.protocols.link.l2tp
6
+
7
+ :mod:`pcapkit.protocols.link.l2tp` contains
8
+ :class:`~pcapkit.protocols.link.l2tp.L2TP` only,
9
+ which implements extractor for Layer Two Tunnelling
10
+ Protocol (L2TP) [*]_, whose structure is described
11
+ as below:
12
+
13
+ .. table::
14
+
15
+ ======= ===== ===================== ==========================================
16
+ Octets Bits Name Description
17
+ ======= ===== ===================== ==========================================
18
+ 0 0 ``l2tp.flags`` Flags and Version Info
19
+ ------- ----- --------------------- ------------------------------------------
20
+ 0 0 ``l2tp.flags.type`` Type (control / data)
21
+ ------- ----- --------------------- ------------------------------------------
22
+ 0 1 ``l2tp.flags.len`` Length
23
+ ------- ----- --------------------- ------------------------------------------
24
+ 0 2 Reserved (must be zero ``x00``)
25
+ ------- ----- --------------------- ------------------------------------------
26
+ 0 4 ``l2tp.flags.seq`` Sequence
27
+ ------- ----- --------------------- ------------------------------------------
28
+ 0 5 Reserved (must be zero ``x00``)
29
+ ------- ----- --------------------- ------------------------------------------
30
+ 0 6 ``l2tp.flags.offset`` Offset
31
+ ------- ----- --------------------- ------------------------------------------
32
+ 0 7 ``l2tp.flags.prio`` Priority
33
+ ------- ----- --------------------- ------------------------------------------
34
+ 1 8 Reserved (must be zero ``x00``)
35
+ ------- ----- --------------------- ------------------------------------------
36
+ 1 12 ``l2tp.ver`` Version (``2``)
37
+ ------- ----- --------------------- ------------------------------------------
38
+ 2 16 ``l2tp.length`` Length (optional by ``len``)
39
+ ------- ----- --------------------- ------------------------------------------
40
+ 4 32 ``l2tp.tunnelid`` Tunnel ID
41
+ ------- ----- --------------------- ------------------------------------------
42
+ 6 48 ``l2tp.sessionid`` Session ID
43
+ ------- ----- --------------------- ------------------------------------------
44
+ 8 64 ``l2tp.ns`` Sequence Number (optional by ``seq``)
45
+ ------- ----- --------------------- ------------------------------------------
46
+ 10 80 ``l2tp.nr`` Next Sequence Number (optional by ``seq``)
47
+ ------- ----- --------------------- ------------------------------------------
48
+ 12 96 ``l2tp.offset`` Offset Size (optional by ``offset``)
49
+ ======= ===== ===================== ==========================================
50
+
51
+ .. [*] https://en.wikipedia.org/wiki/Layer_2_Tunneling_Protocol
52
+
53
+ """
54
+ from typing import TYPE_CHECKING
55
+
56
+ from pcapkit.const.l2tp.type import Type as Enum_Type
57
+ from pcapkit.protocols.data.link.l2tp import L2TP as Data_L2TP
58
+ from pcapkit.protocols.data.link.l2tp import Flags as Data_Flags
59
+ from pcapkit.protocols.link.link import Link
60
+ from pcapkit.protocols.schema.link.l2tp import L2TP as Schema_L2TP
61
+ from pcapkit.utilities.exceptions import UnsupportedCall
62
+
63
+ if TYPE_CHECKING:
64
+ from enum import IntEnum as StdlibEnum
65
+ from typing import Any, NoReturn, Optional, Type
66
+
67
+ from aenum import IntEnum as AenumEnum
68
+ from typing_extensions import Literal
69
+
70
+ from pcapkit.protocols.protocol import ProtocolBase as Protocol
71
+ from pcapkit.protocols.schema.schema import Schema
72
+
73
+ __all__ = ['L2TP']
74
+
75
+
76
+ class L2TP(Link[Data_L2TP, Schema_L2TP],
77
+ schema=Schema_L2TP, data=Data_L2TP):
78
+ """This class implements Layer Two Tunnelling Protocol."""
79
+
80
+ ##########################################################################
81
+ # Properties.
82
+ ##########################################################################
83
+
84
+ @property
85
+ def name(self) -> 'Literal["Layer 2 Tunnelling Protocol"]':
86
+ """Name of current protocol."""
87
+ return 'Layer 2 Tunnelling Protocol'
88
+
89
+ @property
90
+ def length(self) -> 'int':
91
+ """Header length of current protocol."""
92
+ return self._info.hdr_len
93
+
94
+ @property
95
+ def type(self) -> 'Literal["control", "data"]':
96
+ """L2TP type."""
97
+ return self._info.flags.type
98
+
99
+ ##########################################################################
100
+ # Methods.
101
+ ##########################################################################
102
+
103
+ def read(self, length: 'Optional[int]' = None, **kwargs: 'Any') -> 'Data_L2TP': # pylint: disable=unused-argument
104
+ """Read Layer Two Tunnelling Protocol.
105
+
106
+ Structure of L2TP header [:rfc:`2661`]:
107
+
108
+ .. code-block:: text
109
+
110
+ 0 1 2 3
111
+ 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
112
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
113
+ |T|L|x|x|S|x|O|P|x|x|x|x| Ver | Length (opt) |
114
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
115
+ | Tunnel ID | Session ID |
116
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
117
+ | Ns (opt) | Nr (opt) |
118
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
119
+ | Offset Size (opt) | Offset pad... (opt)
120
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
121
+
122
+ Args:
123
+ length: Length of packet data.
124
+ **kwargs: Arbitrary keyword arguments.
125
+
126
+ Returns:
127
+ Parsed packet data.
128
+
129
+ """
130
+ schema = self.__header__
131
+ _flag = schema.flags
132
+
133
+ flags = Data_Flags(
134
+ type=Enum_Type(_flag['type']),
135
+ len=bool(_flag['len']),
136
+ seq=bool(_flag['seq']),
137
+ offset=bool(_flag['offset']),
138
+ prio=bool(_flag['prio']),
139
+ )
140
+
141
+ _size = schema.offset if flags.offset else 0
142
+ hdr_len = 6 + 2 * (flags.len + 2 * flags.seq + flags.offset) + _size
143
+
144
+ l2tp = Data_L2TP(
145
+ flags=flags,
146
+ version=_flag['version'],
147
+ length=schema.length if flags.len else None,
148
+ tunnelid=schema.tunnel_id,
149
+ sessionid=schema.session_id,
150
+ ns=schema.ns if flags.seq else None,
151
+ nr=schema.nr if flags.seq else None,
152
+ offset=_size if flags.offset else None,
153
+ )
154
+
155
+ l2tp.__update__([
156
+ ('hdr_len', hdr_len),
157
+ ])
158
+ if _size:
159
+ self._read_fileng(_size)
160
+ # l2tp['padding'] = self._read_fileng(_size)
161
+
162
+ length = schema.length if flags.len else (length or len(self))
163
+ return self._decode_next_layer(l2tp, length - hdr_len)
164
+
165
+ def make(self,
166
+ version: 'Literal[2]' = 2,
167
+ type: 'Enum_Type | StdlibEnum | AenumEnum | str | int' = Enum_Type.Data,
168
+ type_default: 'Optional[int]' = None,
169
+ type_namespace: 'Optional[dict[str, int] | dict[int, str] | Type[StdlibEnum] | Type[AenumEnum]]' = None, # pylint: disable=line-too-long
170
+ type_reversed: 'bool' = False,
171
+ priority: 'bool' = False,
172
+ length: 'Optional[int]' = None,
173
+ tunnel_id: 'int' = 0,
174
+ session_id: 'int' = 0,
175
+ ns: 'Optional[int]' = None,
176
+ nr: 'Optional[int]' = None,
177
+ offset: 'Optional[int]' = None,
178
+ payload: 'bytes | Protocol | Schema' = b'',
179
+ **kwargs: 'Any') -> 'Schema_L2TP': # pylint: disable=unused-argument
180
+ """Make (construct) packet data.
181
+
182
+ Args:
183
+ version: L2TP version.
184
+ type: L2TP type.
185
+ type_default: Default value of type.
186
+ type_namespace: Namespace of type.
187
+ type_reversed: Reversed namespace of type.
188
+ priority: Priority flag.
189
+ length: Length of packet data.
190
+ tunnel_id: Tunnel ID.
191
+ session_id: Session ID.
192
+ ns: Sequence number.
193
+ nr: Acknowledgement number.
194
+ offset: Offset size.
195
+ payload: Payload data.
196
+ **kwargs: Arbitrary keyword arguments.
197
+
198
+ Returns:
199
+ Constructed packet data.
200
+
201
+ """
202
+ type_ = self._make_index(type, type_default, namespace=type_namespace,
203
+ reversed=type_reversed, pack=False)
204
+
205
+ return Schema_L2TP(
206
+ flags={
207
+ 'type': type_,
208
+ 'len': length is not None,
209
+ 'seq': ns is not None and nr is not None,
210
+ 'offset': offset is not None,
211
+ 'prio': priority,
212
+ 'version': version,
213
+ },
214
+ length=length,
215
+ tunnel_id=tunnel_id,
216
+ session_id=session_id,
217
+ ns=ns,
218
+ nr=nr,
219
+ offset=offset,
220
+ payload=payload,
221
+ )
222
+
223
+ ##########################################################################
224
+ # Data models.
225
+ ##########################################################################
226
+
227
+ def __length_hint__(self) -> 'Literal[16]':
228
+ """Return an estimated length for the object."""
229
+ return 16
230
+
231
+ @classmethod
232
+ def __index__(cls) -> 'NoReturn': # pylint: disable=invalid-index-returned
233
+ """Numeral registry index of the protocol.
234
+
235
+ Raises:
236
+ UnsupportedCall: This protocol has no registry entry.
237
+
238
+ """
239
+ raise UnsupportedCall(f'{cls.__name__!r} object cannot be interpreted as an integer')
240
+
241
+ ##########################################################################
242
+ # Utilities.
243
+ ##########################################################################
244
+
245
+ @classmethod
246
+ def _make_data(cls, data: 'Data_L2TP') -> 'dict[str, Any]': # type: ignore[override]
247
+ """Create key-value pairs from ``data`` for protocol construction.
248
+
249
+ Args:
250
+ data: protocol data
251
+
252
+ Returns:
253
+ Key-value pairs for protocol construction.
254
+
255
+ """
256
+ return {
257
+ 'type': data.flags.type,
258
+ 'prio': data.flags.prio,
259
+ 'version': data.version,
260
+ 'length': data.length,
261
+ 'tunnel_id': data.tunnelid,
262
+ 'session_id': data.sessionid,
263
+ 'ns': data.ns,
264
+ 'nr': data.nr,
265
+ 'offset': data.offset,
266
+ 'payload': cls._make_payload(data),
267
+ }
@@ -0,0 +1,140 @@
1
+ # -*- coding: utf-8 -*-
2
+ # mypy: disable-error-code=dict-item
3
+ """Base Protocol
4
+ ===================
5
+
6
+ .. module:: pcapkit.protocols.link.link
7
+
8
+ :mod:`pcapkit.protocols.link.link` contains
9
+ :class:`~pcapkit.protocols.link.link.Link`,
10
+ which is a base class for link layer protocols, e.g.
11
+ :class:`~pcapkit.protocols.link.arp.ARP`/:class:`~pcapkit.protocols.link.arp.InARP`,
12
+ :class:`~pcapkit.protocols.link.ethernet.Ethernet`,
13
+ :class:`~pcapkit.protocols.link.l2tp.L2TP`,
14
+ :class:`~pcapkit.protocols.link.ospf.OSPF`,
15
+ :class:`~pcapkit.protocols.link.rarp.RARP`/:class:`~pcapkit.protocols.link.rarp.DRARP`
16
+ and etc.
17
+
18
+ """
19
+ import collections
20
+ from typing import TYPE_CHECKING, Generic
21
+
22
+ from pcapkit.const.reg.ethertype import EtherType as Enum_EtherType
23
+ from pcapkit.corekit.module import ModuleDescriptor
24
+ from pcapkit.protocols.protocol import _PT, _ST
25
+ from pcapkit.protocols.protocol import ProtocolBase as Protocol
26
+ from pcapkit.utilities.exceptions import RegistryError
27
+ from pcapkit.utilities.warnings import RegistryWarning, warn
28
+
29
+ if TYPE_CHECKING:
30
+ from typing import DefaultDict, Type
31
+
32
+ from typing_extensions import Literal
33
+
34
+ __all__ = ['Link']
35
+
36
+
37
+ class Link(Protocol[_PT, _ST], Generic[_PT, _ST]): # pylint: disable=abstract-method
38
+ """Abstract base class for link layer protocol family.
39
+
40
+ This class currently supports parsing of the following protocols, which are
41
+ registered in the :attr:`self.__proto__ <pcapkit.protocols.link.link.Link.__proto__>`
42
+ attribute:
43
+
44
+ .. list-table::
45
+ :header-rows: 1
46
+
47
+ * - Index
48
+ - Protocol
49
+ * - :attr:`~pcapkit.const.reg.ethertype.EtherType.Address_Resolution_Protocol`
50
+ - :class:`pcapkit.protocols.link.arp.ARP`
51
+ * - :attr:`~pcapkit.const.reg.ethertype.EtherType.Reverse_Address_Resolution_Protocol`
52
+ - :class:`pcapkit.protocols.link.rarp.RARP`
53
+ * - :attr:`~pcapkit.const.reg.ethertype.EtherType.Customer_VLAN_Tag_Type`
54
+ - :class:`pcapkit.protocols.link.vlan.VLAN`
55
+ * - :attr:`~pcapkit.const.reg.ethertype.EtherType.Internet_Protocol_version_4`
56
+ - :class:`pcapkit.protocols.internet.ipv4.IPv4`
57
+ * - :attr:`~pcapkit.const.reg.ethertype.EtherType.Internet_Protocol_version_6`
58
+ - :class:`pcapkit.protocols.internet.ipv6.IPv6`
59
+ * - 0x8137
60
+ - :class:`pcapkit.protocols.internet.ipx.IPX`
61
+
62
+ """
63
+
64
+ ##########################################################################
65
+ # Defaults.
66
+ ##########################################################################
67
+
68
+ #: Layer of protocol.
69
+ __layer__ = 'Link' # type: Literal['Link']
70
+
71
+ #: DefaultDict[int, ModuleDescriptor[Protocol] | Type[Protocol]]: Protocol index mapping for decoding next layer,
72
+ #: c.f. :meth:`self._decode_next_layer <pcapkit.protocols.protocol.Protocol._decode_next_layer>`
73
+ #: & :meth:`self._import_next_layer <pcapkit.protocols.protocol.Protocol._import_next_layer>`.
74
+ __proto__ = collections.defaultdict(
75
+ lambda: ModuleDescriptor('pcapkit.protocols.misc.raw', 'Raw'),
76
+ {
77
+ Enum_EtherType.Address_Resolution_Protocol: ModuleDescriptor('pcapkit.protocols.link.arp', 'ARP'),
78
+ Enum_EtherType.Reverse_Address_Resolution_Protocol: ModuleDescriptor('pcapkit.protocols.link.rarp', 'RARP'),
79
+ Enum_EtherType.Customer_VLAN_Tag_Type: ModuleDescriptor('pcapkit.protocols.link.vlan', 'VLAN'),
80
+ Enum_EtherType.Internet_Protocol_version_4: ModuleDescriptor('pcapkit.protocols.internet.ipv4', 'IPv4'),
81
+ Enum_EtherType.Internet_Protocol_version_6: ModuleDescriptor('pcapkit.protocols.internet.ipv6', 'IPv6'),
82
+
83
+ # c.f., https://en.wikipedia.org/wiki/EtherType#Values
84
+ 0x8137: ModuleDescriptor('pcapkit.protocols.internet.ipx', 'IPX'),
85
+ },
86
+ ) # type: DefaultDict[int | Enum_EtherType, ModuleDescriptor[Protocol] | Type[Protocol]]
87
+
88
+ ##########################################################################
89
+ # Properties.
90
+ ##########################################################################
91
+
92
+ # protocol layer
93
+ @property
94
+ def layer(self) -> 'Literal["Link"]':
95
+ """Protocol layer."""
96
+ return self.__layer__
97
+
98
+ ##########################################################################
99
+ # Methods.
100
+ ##########################################################################
101
+
102
+ @classmethod
103
+ def register(cls, code: 'Enum_EtherType', protocol: 'ModuleDescriptor[Protocol] | Type[Protocol]') -> 'None': # type: ignore[override]
104
+ r"""Register a new protocol class.
105
+
106
+ Notes:
107
+ The full qualified class name of the new protocol class
108
+ should be as ``{protocol.module}.{protocol.name}``.
109
+
110
+ Arguments:
111
+ code: protocol code as in :class:`~pcapkit.const.reg.ethertype.EtherType`
112
+ protocol: module descriptor or a
113
+ :class:`~pcapkit.protocols.protocol.Protocol` subclass
114
+
115
+ """
116
+ if isinstance(protocol, ModuleDescriptor):
117
+ protocol = protocol.klass
118
+ if not issubclass(protocol, Protocol):
119
+ raise RegistryError(f'protocol must be a Protocol subclass, not {protocol!r}')
120
+ if code in cls.__proto__:
121
+ warn(f'protocol {code} already registered, overwriting', RegistryWarning)
122
+ cls.__proto__[code] = protocol
123
+
124
+ ##########################################################################
125
+ # Utilities.
126
+ ##########################################################################
127
+
128
+ def _read_protos(self, size: int) -> 'Enum_EtherType':
129
+ """Read next layer protocol type.
130
+
131
+ Arguments:
132
+ size: buffer size
133
+
134
+ Returns:
135
+ Internet layer protocol enumeration.
136
+
137
+ """
138
+ _byte = self._read_unpack(size)
139
+ _prot = Enum_EtherType.get(_byte)
140
+ return _prot