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,282 @@
1
+ # -*- coding: utf-8 -*-
2
+ """container field class"""
3
+
4
+ import copy
5
+ import io
6
+ from typing import TYPE_CHECKING, Generic, TypeVar, cast
7
+
8
+ from pcapkit.corekit.fields.field import FieldBase
9
+ from pcapkit.corekit.multidict import OrderedMultiDict
10
+ from pcapkit.utilities.compat import List
11
+ from pcapkit.utilities.exceptions import FieldValueError
12
+
13
+ __all__ = [
14
+ 'ListField', 'OptionField',
15
+ ]
16
+
17
+ if TYPE_CHECKING:
18
+ from collections import defaultdict
19
+ from enum import IntEnum as StdlibEnum
20
+ from typing import IO, Any, Callable, Optional, Type
21
+
22
+ from aenum import IntEnum as AenumEnum
23
+ from typing_extensions import Self
24
+
25
+ from pcapkit.protocols.schema.schema import Schema
26
+
27
+ _TL = TypeVar('_TL', 'Schema', 'FieldBase', 'bytes')
28
+ _TS = TypeVar('_TS', bound='Schema')
29
+
30
+
31
+ class ListField(FieldBase[List[_TL]], Generic[_TL]):
32
+ """Field list for protocol fields.
33
+
34
+ Args:
35
+ length: Field size (in bytes); if a callable is given, it should return
36
+ an integer value and accept the current packet as its only argument.
37
+ item_type: Field type of the contained items.
38
+ callback: Callback function to be called upon
39
+ :meth:`self.__call__ <pcapkit.corekit.fields.field.FieldBase.__call__>`.
40
+
41
+ This field is used to represent a list of fields, as in the case of lists of
42
+ constrant-length-field items in a protocol.
43
+
44
+ """
45
+
46
+ @property
47
+ def length(self) -> 'int':
48
+ """Field size."""
49
+ return self._length
50
+
51
+ @property
52
+ def optional(self) -> 'bool':
53
+ """Field is optional."""
54
+ return True
55
+
56
+ def __init__(self, length: 'int | Callable[[dict[str, Any]], int]' = lambda _: -1,
57
+ item_type: 'Optional[FieldBase]' = None,
58
+ callback: 'Callable[[Self, dict[str, Any]], None]' = lambda *_: None) -> 'None':
59
+ #self._name = '<list>'
60
+ self._callback = callback
61
+ self._item_type = item_type
62
+
63
+ self._length_callback = None
64
+ if not isinstance(length, int):
65
+ self._length_callback, length = length, -1
66
+ self._length = length
67
+ self._template = '0s'
68
+
69
+ def __call__(self, packet: 'dict[str, Any]') -> 'Self':
70
+ """Update field attributes.
71
+
72
+ Args:
73
+ packet: Packet data.
74
+
75
+ Returns:
76
+ Updated field instance.
77
+
78
+ This method will return a new instance of :class:`ListField`
79
+ instead of updating the current instance.
80
+
81
+ """
82
+ new_self = copy.copy(self)
83
+ new_self._callback(self, packet)
84
+ if new_self._length_callback is not None:
85
+ new_self._length = new_self._length_callback(packet)
86
+ new_self._template = f'{new_self._length}s'
87
+ return new_self
88
+
89
+ def pack(self, value: 'Optional[list[_TL]]', packet: 'dict[str, Any]') -> 'bytes':
90
+ """Pack field value into :obj:`bytes`.
91
+
92
+ Args:
93
+ value: Field value.
94
+ packet: Packet data.
95
+
96
+ Returns:
97
+ Packed field value.
98
+
99
+ """
100
+ if value is None:
101
+ return b''
102
+
103
+ from pcapkit.protocols.schema.schema import \
104
+ Schema # pylint: disable=import-outside-top-level
105
+
106
+ temp = [] # type: list[bytes]
107
+ for item in value:
108
+ if isinstance(item, bytes):
109
+ temp.append(item)
110
+ elif isinstance(item, Schema):
111
+ temp.append(item.pack(packet))
112
+ elif self._item_type is not None:
113
+ temp.append(self._item_type.pack(item, packet))
114
+ else:
115
+ raise FieldValueError(f'Field {self.name} has invalid value.')
116
+ return b''.join(temp)
117
+
118
+ def unpack(self, buffer: 'bytes | IO[bytes]', packet: 'dict[str, Any]') -> 'bytes | list[_TL]':
119
+ """Unpack field value from :obj:`bytes`.
120
+
121
+ Args:
122
+ buffer: Field buffer.
123
+ packet: Packet data.
124
+
125
+ Returns:
126
+ Unpacked field value.
127
+
128
+ """
129
+ length = self._length
130
+ if isinstance(buffer, bytes):
131
+ file = io.BytesIO(buffer) # type: IO[bytes]
132
+ else:
133
+ file = buffer
134
+
135
+ if self._item_type is None:
136
+ return file.read(length)
137
+
138
+ from pcapkit.corekit.fields.misc import SchemaField
139
+ is_schema = isinstance(self._item_type, SchemaField)
140
+
141
+ temp = [] # type: list[_TL]
142
+ while length > 0:
143
+ field = self._item_type(packet)
144
+
145
+ if is_schema:
146
+ data = cast('SchemaField', self._item_type).unpack(file, packet)
147
+
148
+ length -= len(data)
149
+ if length < 0:
150
+ raise FieldValueError(f'Field {self.name} has invalid length.')
151
+ else:
152
+ length -= field.length
153
+ if length < 0:
154
+ raise FieldValueError(f'Field {self.name} has invalid length.')
155
+
156
+ buffer = file.read(field.length)
157
+ data = field.unpack(buffer, packet)
158
+
159
+ temp.append(data)
160
+ return temp
161
+
162
+
163
+ class OptionField(ListField, Generic[_TS]):
164
+ """Field list for protocol options.
165
+
166
+ Args:
167
+ length: Field size (in bytes); if a callable is given, it should return
168
+ an integer value and accept the current packet as its only argument.
169
+ base_schema: Base schema for option fields.
170
+ type_name: Name of the option type field.
171
+ registry: Option registry, as in a mapping from option types (enumeration
172
+ values) to option schemas, with the default value being the unknown
173
+ option schema.
174
+ eool: Enumeration of the EOOL (end-of-option-list, or equivalent) option
175
+ callback: Callback function to be called upon
176
+ :meth:`self.__call__ <pcapkit.corekit.fields.field.FieldBase.__call__>`.
177
+
178
+ This field is used to represent a list of fields, as in the case of lists of
179
+ options and/or parameters in a protocol.
180
+
181
+ """
182
+
183
+ @property
184
+ def base_schema(self) -> 'Type[_TS]':
185
+ """Base schema."""
186
+ return self._base_schema
187
+
188
+ @property
189
+ def type_name(self) -> 'str':
190
+ """Type name."""
191
+ return self._type_name
192
+
193
+ @property
194
+ def registry(self) -> 'defaultdict[int | StdlibEnum | AenumEnum, Type[_TS]]':
195
+ """Option registry."""
196
+ return self._registry
197
+
198
+ @property
199
+ def eool(self) -> 'int | StdlibEnum | AenumEnum':
200
+ """EOOL option."""
201
+ return self._eool
202
+
203
+ @property
204
+ def option_padding(self) -> 'int':
205
+ """Length option padding data."""
206
+ return self._option_padding
207
+
208
+ def __init__(self, length: 'int | Callable[[dict[str, Any]], int]' = lambda _: -1,
209
+ base_schema: 'Optional[Type[_TS]]' = None,
210
+ type_name: 'str' = 'type',
211
+ registry: 'Optional[defaultdict[int | StdlibEnum | AenumEnum, Type[_TS]]]' = None,
212
+ eool: 'Optional[int | StdlibEnum | AenumEnum]' = None,
213
+ callback: 'Callable[[Self, dict[str, Any]], None]' = lambda *_: None) -> 'None':
214
+ super().__init__(length, None, callback)
215
+ #self._name = '<option>'
216
+ self._eool = eool
217
+ self._option_padding = 0
218
+
219
+ if base_schema is None:
220
+ raise FieldValueError('Field <option> has no base schema.')
221
+ self._base_schema = base_schema
222
+
223
+ if not hasattr(self._base_schema, type_name):
224
+ raise FieldValueError(f'Field <option> has no type field "{type_name}".')
225
+ self._type_name = type_name
226
+
227
+ if registry is None:
228
+ raise FieldValueError('Field <option> has no registry.')
229
+ self._registry = registry
230
+
231
+ def unpack(self, buffer: 'bytes | IO[bytes]', packet: 'dict[str, Any]') -> 'list[_TS]':
232
+ """Unpack field value from :obj:`bytes`.
233
+
234
+ Args:
235
+ buffer: Field buffer.
236
+ packet: Packet data.
237
+
238
+ Returns:
239
+ Unpacked field value.
240
+
241
+ Important:
242
+ If the option list ended before the specified size limit,
243
+ set :attr:`self.option_padding <OptionField.option_padding>`
244
+ as the remaining length to the ``packet`` argument such that
245
+ the next fields can be aware of such informations.
246
+
247
+ """
248
+ length = self._length
249
+ if isinstance(buffer, bytes):
250
+ file = io.BytesIO(buffer) # type: IO[bytes]
251
+ else:
252
+ file = buffer
253
+
254
+ # make a copy of the ``packet`` dict so that we can include
255
+ # parsed option schema in the ``packet`` dict
256
+ new_packet = packet.copy()
257
+ new_packet[self.name] = OrderedMultiDict()
258
+
259
+ temp = [] # type: list[_TS]
260
+ while length > 0:
261
+ # unpack option type using base schema
262
+ meta = self._base_schema.unpack(file, length, packet) # type: ignore[call-arg,misc,var-annotated]
263
+ code = cast('int', meta[self._type_name])
264
+ schema = self._registry[code]
265
+
266
+ # rewind to the beginning of the option
267
+ file.seek(-len(meta), io.SEEK_CUR)
268
+
269
+ # unpack option using option schema
270
+ data = schema.unpack(file, length, packet) # type: ignore[call-arg,misc,var-annotated]
271
+ new_packet[self.name].add(code, data)
272
+ temp.append(data)
273
+
274
+ # update length
275
+ length -= len(data)
276
+
277
+ # check for EOOL
278
+ if code == self._eool:
279
+ break
280
+
281
+ self._option_padding = length
282
+ return temp
@@ -0,0 +1,269 @@
1
+ # -*- coding: utf-8 -*-
2
+ """base field class"""
3
+
4
+ import abc
5
+ import copy
6
+ import struct
7
+ from typing import TYPE_CHECKING, Generic, TypeVar, cast
8
+
9
+ from pcapkit.utilities.compat import final
10
+ from pcapkit.utilities.exceptions import NoDefaultValue
11
+
12
+ __all__ = ['Field']
13
+
14
+ if TYPE_CHECKING:
15
+ from typing import IO, Any, Callable, Optional
16
+
17
+ from typing_extensions import Literal, Self
18
+
19
+ from pcapkit.protocols.schema.schema import Schema
20
+
21
+ _T = TypeVar('_T')
22
+
23
+
24
+ @final
25
+ class NoValueType:
26
+ """Default value for fields."""
27
+
28
+ def __bool__(self) -> 'Literal[False]':
29
+ """Return :obj:`False`."""
30
+ return False
31
+
32
+
33
+ #: NoValueType: Default value for :attr:`FieldBase.default`.
34
+ NoValue = NoValueType()
35
+
36
+
37
+ class FieldMeta(abc.ABCMeta, Generic[_T]):
38
+ """Meta class to add dynamic support to :class:`FieldBase`.
39
+
40
+ This meta class is used to generate necessary attributes for the
41
+ :class:`FieldBase` class. It can be useful to reduce unnecessary
42
+ registry calls and simplify the customisation process.
43
+
44
+ """
45
+
46
+
47
+ class FieldBase(Generic[_T], metaclass=FieldMeta):
48
+ """Internal base class for protocol fields.
49
+
50
+ Important:
51
+ A negative value of :attr:`~FieldBase.length` indicates that the field
52
+ is variable-length (i.e., length unspecified) and thus
53
+ :meth:`~FieldBase.pack` should be considerate of the template format
54
+ and the actual value provided for packing.
55
+
56
+ Args:
57
+ *args: Arbitrary positional arguments.
58
+ **kwargs: Arbitrary keyword arguments.
59
+
60
+ """
61
+
62
+ if TYPE_CHECKING:
63
+ _name: 'str'
64
+ _default: '_T | NoValueType'
65
+ _template: 'str'
66
+ _callback: 'Callable[[Self, dict[str, Any]], None]'
67
+
68
+ @property
69
+ def name(self) -> 'str':
70
+ """Field name."""
71
+ return self._name
72
+
73
+ @name.setter
74
+ def name(self, value: 'str') -> 'None':
75
+ """Set field name."""
76
+ self._name = value
77
+
78
+ @property
79
+ def default(self) -> '_T | NoValueType':
80
+ """Field default value."""
81
+ return self._default
82
+
83
+ @default.setter
84
+ def default(self, value: '_T | NoValueType') -> 'None':
85
+ """Set field default value."""
86
+ self._default = value
87
+
88
+ @default.deleter
89
+ def default(self) -> 'None':
90
+ """Delete field default value."""
91
+ self._default = NoValue
92
+
93
+ @property
94
+ def template(self) -> 'str':
95
+ """Field template."""
96
+ return self._template
97
+
98
+ @property
99
+ def length(self) -> 'int':
100
+ """Field size."""
101
+ return struct.calcsize(self.template)
102
+
103
+ @property
104
+ def optional(self) -> 'bool':
105
+ """Field is optional."""
106
+ return False
107
+
108
+ def __call__(self, packet: 'dict[str, Any]') -> 'Self':
109
+ """Update field attributes.
110
+
111
+ Arguments:
112
+ packet: Packet data.
113
+
114
+ Returns:
115
+ Updated field instance.
116
+
117
+ This method will return a new instance of :class:`FieldBase` instead of
118
+ updating the current instance.
119
+
120
+ """
121
+ new_self = copy.copy(self)
122
+ new_self._callback(new_self, packet)
123
+ return new_self
124
+
125
+ # NOTE: This method is created as a placeholder for the necessary attributes.
126
+ def __init__(self, *args: 'Any', **kwargs: 'Any') -> 'None':
127
+ if not hasattr(self, '_name'):
128
+ self._name = f'<{type(self).__name__[:-5].lower()}>'
129
+
130
+ self._default = NoValue
131
+ self._template = '0s'
132
+ self._callback = lambda *_: None
133
+
134
+ def __repr__(self) -> 'str':
135
+ if not self.name.isidentifier():
136
+ return f'<{self.__class__.__name__}>'
137
+ return f'<{self.__class__.__name__} {self.name}>'
138
+
139
+ def __set_name__(self, owner: 'Schema', name: 'str') -> 'None':
140
+ """Set field name and update field list (if applicable).
141
+
142
+ This method is to be called by the metaclass during class creation.
143
+ It is used to set the field name and update the field list, i.e.,
144
+ :attr:`Schema.__fields__ <pcapkit.protocols.schema.schema.Schema.__fields__>`
145
+ mapping dictionary.
146
+
147
+ """
148
+ # Update field list (if applicable)
149
+ if hasattr(owner, '__fields__'):
150
+ owner.__fields__[name] = self
151
+
152
+ # Set field name
153
+ self.name = name
154
+
155
+ def pre_process(self, value: '_T', packet: 'dict[str, Any]') -> 'Any': # pylint: disable=unused-argument
156
+ """Process field value before construction (packing).
157
+
158
+ Arguments:
159
+ value: Field value.
160
+ packet: Packet data.
161
+
162
+ Returns:
163
+ Processed field value.
164
+
165
+ """
166
+ return cast('Any', value)
167
+
168
+ def pack(self, value: 'Optional[_T]', packet: 'dict[str, Any]') -> 'bytes':
169
+ """Pack field value into :obj:`bytes`.
170
+
171
+ Args:
172
+ value: Field value.
173
+ packet: Packet data.
174
+
175
+ Returns:
176
+ Packed field value.
177
+
178
+ """
179
+ if value is None:
180
+ if self._default is NoValue:
181
+ raise NoDefaultValue(f'Field {self.name} has no default value.')
182
+ value = cast('_T', self._default)
183
+
184
+ pre_processed = self.pre_process(value, packet)
185
+ return struct.pack(self.template, pre_processed)
186
+
187
+ def post_process(self, value: 'Any', packet: 'dict[str, Any]') -> '_T': # pylint: disable=unused-argument
188
+ """Process field value after parsing (unpacking).
189
+
190
+ Args:
191
+ value: Field value.
192
+ packet: Packet data.
193
+
194
+ Returns:
195
+ Processed field value.
196
+
197
+ """
198
+ return cast('_T', value)
199
+
200
+ def unpack(self, buffer: 'bytes | IO[bytes]', packet: 'dict[str, Any]') -> '_T':
201
+ """Unpack field value from :obj:`bytes`.
202
+
203
+ Args:
204
+ buffer: Field buffer.
205
+ packet: Packet data.
206
+
207
+ Returns:
208
+ Unpacked field value.
209
+
210
+ """
211
+ if not isinstance(buffer, bytes):
212
+ buffer = buffer.read(self.length)
213
+ value = struct.unpack(self.template, buffer[:self.length].rjust(self.length, b'\x00'))[0]
214
+ return self.post_process(value, packet)
215
+
216
+
217
+ class Field(FieldBase[_T], Generic[_T]):
218
+ """Base class for protocol fields.
219
+
220
+ Args:
221
+ length: Field size (in bytes); if a callable is given, it should return
222
+ an integer value and accept the current packet as its only argument.
223
+ default: Field default value, if any.
224
+ callback: Callback function to be called upon
225
+ :meth:`self.__call__ <pcapkit.corekit.fields.field.FieldBase.__call__>`.
226
+
227
+ """
228
+
229
+ if TYPE_CHECKING:
230
+ _template: 'str'
231
+
232
+ @property
233
+ def template(self) -> 'str':
234
+ """Field template."""
235
+ return self._template
236
+
237
+ def __init__(self, length: 'int | Callable[[dict[str, Any]], int]',
238
+ default: '_T | NoValueType' = NoValue,
239
+ callback: 'Callable[[Self, dict[str, Any]], None]' = lambda *_: None) -> 'None':
240
+ #self._name = '<unknown>'
241
+ if not hasattr(self, '_name'):
242
+ self._name = f'<{type(self).__name__[:-5].lower()}>'
243
+
244
+ self._default = default
245
+ self._callback = callback
246
+
247
+ self._length_callback = None
248
+ if not isinstance(length, int):
249
+ self._length_callback, length = length, -1
250
+ self._length = length
251
+
252
+ def __call__(self, packet: 'dict[str, Any]') -> 'Self':
253
+ """Update field attributes.
254
+
255
+ Args:
256
+ packet: Packet data.
257
+
258
+ Returns:
259
+ New instance of :class:`Field`.
260
+
261
+ This method will return a new instance of :class:`Field` instead of
262
+ updating the current instance.
263
+
264
+ """
265
+ new_self = copy.copy(self)
266
+ new_self._callback(new_self, packet)
267
+ if new_self._length_callback is not None:
268
+ new_self._length = new_self._length_callback(packet)
269
+ return new_self