@netkitty/codec 1.0.0

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 (463) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/LICENSE +21 -0
  3. package/README.md +352 -0
  4. package/README.zh-CN.md +342 -0
  5. package/dist/Codec.d.ts +133 -0
  6. package/dist/Codec.js +632 -0
  7. package/dist/PacketHeaders.d.ts +189 -0
  8. package/dist/PacketHeaders.js +384 -0
  9. package/dist/abstracts/BaseHeader.d.ts +325 -0
  10. package/dist/abstracts/BaseHeader.js +734 -0
  11. package/dist/errors/CodecSchemaValidateError.d.ts +4 -0
  12. package/dist/errors/CodecSchemaValidateError.js +11 -0
  13. package/dist/headers/ADSAMS.d.ts +33 -0
  14. package/dist/headers/ADSAMS.js +208 -0
  15. package/dist/headers/AH.d.ts +28 -0
  16. package/dist/headers/AH.js +137 -0
  17. package/dist/headers/AMQP.d.ts +31 -0
  18. package/dist/headers/AMQP.js +316 -0
  19. package/dist/headers/ARP.d.ts +26 -0
  20. package/dist/headers/ARP.js +243 -0
  21. package/dist/headers/BACnetIP.d.ts +27 -0
  22. package/dist/headers/BACnetIP.js +97 -0
  23. package/dist/headers/BFD.d.ts +28 -0
  24. package/dist/headers/BFD.js +155 -0
  25. package/dist/headers/BGP.d.ts +27 -0
  26. package/dist/headers/BGP.js +111 -0
  27. package/dist/headers/BSAPIP.d.ts +33 -0
  28. package/dist/headers/BSAPIP.js +78 -0
  29. package/dist/headers/Babel.d.ts +32 -0
  30. package/dist/headers/Babel.js +224 -0
  31. package/dist/headers/BitTorrent.d.ts +28 -0
  32. package/dist/headers/BitTorrent.js +72 -0
  33. package/dist/headers/C37118.d.ts +26 -0
  34. package/dist/headers/C37118.js +147 -0
  35. package/dist/headers/CAPWAP.d.ts +38 -0
  36. package/dist/headers/CAPWAP.js +275 -0
  37. package/dist/headers/CDP.d.ts +25 -0
  38. package/dist/headers/CDP.js +117 -0
  39. package/dist/headers/CMS.d.ts +33 -0
  40. package/dist/headers/CMS.js +238 -0
  41. package/dist/headers/COTP.d.ts +30 -0
  42. package/dist/headers/COTP.js +193 -0
  43. package/dist/headers/CassandraCQL.d.ts +28 -0
  44. package/dist/headers/CassandraCQL.js +117 -0
  45. package/dist/headers/CoAP.d.ts +29 -0
  46. package/dist/headers/CoAP.js +140 -0
  47. package/dist/headers/Codesys.d.ts +32 -0
  48. package/dist/headers/Codesys.js +119 -0
  49. package/dist/headers/Collectd.d.ts +29 -0
  50. package/dist/headers/Collectd.js +154 -0
  51. package/dist/headers/DCCP.d.ts +30 -0
  52. package/dist/headers/DCCP.js +204 -0
  53. package/dist/headers/DHCP.d.ts +26 -0
  54. package/dist/headers/DHCP.js +148 -0
  55. package/dist/headers/DHCPFailover.d.ts +30 -0
  56. package/dist/headers/DHCPFailover.js +104 -0
  57. package/dist/headers/DHCPv6.d.ts +25 -0
  58. package/dist/headers/DHCPv6.js +145 -0
  59. package/dist/headers/DNP3.d.ts +27 -0
  60. package/dist/headers/DNP3.js +150 -0
  61. package/dist/headers/DNS.d.ts +55 -0
  62. package/dist/headers/DNS.js +309 -0
  63. package/dist/headers/DTLS.d.ts +33 -0
  64. package/dist/headers/DTLS.js +142 -0
  65. package/dist/headers/Diameter.d.ts +34 -0
  66. package/dist/headers/Diameter.js +229 -0
  67. package/dist/headers/EAPOL.d.ts +32 -0
  68. package/dist/headers/EAPOL.js +135 -0
  69. package/dist/headers/EIGRP.d.ts +28 -0
  70. package/dist/headers/EIGRP.js +165 -0
  71. package/dist/headers/ENIP.d.ts +31 -0
  72. package/dist/headers/ENIP.js +164 -0
  73. package/dist/headers/ESP.d.ts +27 -0
  74. package/dist/headers/ESP.js +140 -0
  75. package/dist/headers/Elasticsearch.d.ts +30 -0
  76. package/dist/headers/Elasticsearch.js +125 -0
  77. package/dist/headers/EtherCAT.d.ts +35 -0
  78. package/dist/headers/EtherCAT.js +150 -0
  79. package/dist/headers/EthernetII.d.ts +28 -0
  80. package/dist/headers/EthernetII.js +117 -0
  81. package/dist/headers/FCoE.d.ts +38 -0
  82. package/dist/headers/FCoE.js +210 -0
  83. package/dist/headers/FTP.d.ts +34 -0
  84. package/dist/headers/FTP.js +158 -0
  85. package/dist/headers/Finger.d.ts +41 -0
  86. package/dist/headers/Finger.js +135 -0
  87. package/dist/headers/FoundationFieldbusHSE.d.ts +43 -0
  88. package/dist/headers/FoundationFieldbusHSE.js +163 -0
  89. package/dist/headers/GELF.d.ts +35 -0
  90. package/dist/headers/GELF.js +261 -0
  91. package/dist/headers/GENEVE.d.ts +26 -0
  92. package/dist/headers/GENEVE.js +209 -0
  93. package/dist/headers/GESRTP.d.ts +32 -0
  94. package/dist/headers/GESRTP.js +141 -0
  95. package/dist/headers/GLBP.d.ts +29 -0
  96. package/dist/headers/GLBP.js +159 -0
  97. package/dist/headers/GRE.d.ts +27 -0
  98. package/dist/headers/GRE.js +181 -0
  99. package/dist/headers/GTPU.d.ts +25 -0
  100. package/dist/headers/GTPU.js +203 -0
  101. package/dist/headers/GTPv2C.d.ts +30 -0
  102. package/dist/headers/GTPv2C.js +281 -0
  103. package/dist/headers/GitProtocol.d.ts +34 -0
  104. package/dist/headers/GitProtocol.js +141 -0
  105. package/dist/headers/Goose.d.ts +115 -0
  106. package/dist/headers/Goose.js +1067 -0
  107. package/dist/headers/Gopher.d.ts +43 -0
  108. package/dist/headers/Gopher.js +182 -0
  109. package/dist/headers/HARTIP.d.ts +30 -0
  110. package/dist/headers/HARTIP.js +145 -0
  111. package/dist/headers/HSR.d.ts +27 -0
  112. package/dist/headers/HSR.js +105 -0
  113. package/dist/headers/HSRP.d.ts +26 -0
  114. package/dist/headers/HSRP.js +173 -0
  115. package/dist/headers/HTTP.d.ts +32 -0
  116. package/dist/headers/HTTP.js +153 -0
  117. package/dist/headers/HTTP2.d.ts +34 -0
  118. package/dist/headers/HTTP2.js +190 -0
  119. package/dist/headers/IAX2.d.ts +33 -0
  120. package/dist/headers/IAX2.js +274 -0
  121. package/dist/headers/ICMP.d.ts +15 -0
  122. package/dist/headers/ICMP.js +148 -0
  123. package/dist/headers/ICMPv6.d.ts +15 -0
  124. package/dist/headers/ICMPv6.js +129 -0
  125. package/dist/headers/IEC104_I_Frame.d.ts +23 -0
  126. package/dist/headers/IEC104_I_Frame.js +6489 -0
  127. package/dist/headers/IEC104_S_Frame.d.ts +26 -0
  128. package/dist/headers/IEC104_S_Frame.js +135 -0
  129. package/dist/headers/IEC104_U_Frame.d.ts +27 -0
  130. package/dist/headers/IEC104_U_Frame.js +176 -0
  131. package/dist/headers/IEC61850SampledValues.d.ts +20 -0
  132. package/dist/headers/IEC61850SampledValues.js +420 -0
  133. package/dist/headers/IGMP.d.ts +31 -0
  134. package/dist/headers/IGMP.js +274 -0
  135. package/dist/headers/IMAP.d.ts +32 -0
  136. package/dist/headers/IMAP.js +185 -0
  137. package/dist/headers/IPFIX.d.ts +29 -0
  138. package/dist/headers/IPFIX.js +156 -0
  139. package/dist/headers/IPv4.d.ts +20 -0
  140. package/dist/headers/IPv4.js +370 -0
  141. package/dist/headers/IPv6.d.ts +29 -0
  142. package/dist/headers/IPv6.js +209 -0
  143. package/dist/headers/IPv6HopByHopOptions.d.ts +81 -0
  144. package/dist/headers/IPv6HopByHopOptions.js +495 -0
  145. package/dist/headers/IRC.d.ts +34 -0
  146. package/dist/headers/IRC.js +175 -0
  147. package/dist/headers/ISAKMP.d.ts +29 -0
  148. package/dist/headers/ISAKMP.js +197 -0
  149. package/dist/headers/ISCSI.d.ts +39 -0
  150. package/dist/headers/ISCSI.js +289 -0
  151. package/dist/headers/ISIS.d.ts +25 -0
  152. package/dist/headers/ISIS.js +79 -0
  153. package/dist/headers/ISOSession.d.ts +27 -0
  154. package/dist/headers/ISOSession.js +343 -0
  155. package/dist/headers/Ident.d.ts +42 -0
  156. package/dist/headers/Ident.js +184 -0
  157. package/dist/headers/KNXnetIP.d.ts +30 -0
  158. package/dist/headers/KNXnetIP.js +135 -0
  159. package/dist/headers/Kafka.d.ts +35 -0
  160. package/dist/headers/Kafka.js +128 -0
  161. package/dist/headers/Kerberos.d.ts +30 -0
  162. package/dist/headers/Kerberos.js +217 -0
  163. package/dist/headers/L2TP.d.ts +26 -0
  164. package/dist/headers/L2TP.js +297 -0
  165. package/dist/headers/LACP.d.ts +31 -0
  166. package/dist/headers/LACP.js +151 -0
  167. package/dist/headers/LDAP.d.ts +31 -0
  168. package/dist/headers/LDAP.js +226 -0
  169. package/dist/headers/LDP.d.ts +31 -0
  170. package/dist/headers/LDP.js +138 -0
  171. package/dist/headers/LISP.d.ts +30 -0
  172. package/dist/headers/LISP.js +103 -0
  173. package/dist/headers/LLC.d.ts +27 -0
  174. package/dist/headers/LLC.js +81 -0
  175. package/dist/headers/LLDP.d.ts +26 -0
  176. package/dist/headers/LLDP.js +126 -0
  177. package/dist/headers/LLMNR.d.ts +23 -0
  178. package/dist/headers/LLMNR.js +40 -0
  179. package/dist/headers/LPD.d.ts +31 -0
  180. package/dist/headers/LPD.js +159 -0
  181. package/dist/headers/MACsec.d.ts +34 -0
  182. package/dist/headers/MACsec.js +178 -0
  183. package/dist/headers/MDNS.d.ts +26 -0
  184. package/dist/headers/MDNS.js +45 -0
  185. package/dist/headers/MGCP.d.ts +30 -0
  186. package/dist/headers/MGCP.js +155 -0
  187. package/dist/headers/MMS.d.ts +29 -0
  188. package/dist/headers/MMS.js +243 -0
  189. package/dist/headers/MPLS.d.ts +31 -0
  190. package/dist/headers/MPLS.js +145 -0
  191. package/dist/headers/MQTT.d.ts +30 -0
  192. package/dist/headers/MQTT.js +173 -0
  193. package/dist/headers/MQTTSN.d.ts +34 -0
  194. package/dist/headers/MQTTSN.js +177 -0
  195. package/dist/headers/MarkerProtocol.d.ts +32 -0
  196. package/dist/headers/MarkerProtocol.js +153 -0
  197. package/dist/headers/Megaco.d.ts +32 -0
  198. package/dist/headers/Megaco.js +144 -0
  199. package/dist/headers/Memcached.d.ts +44 -0
  200. package/dist/headers/Memcached.js +285 -0
  201. package/dist/headers/ModbusTCP.d.ts +25 -0
  202. package/dist/headers/ModbusTCP.js +99 -0
  203. package/dist/headers/ModbusUDP.d.ts +26 -0
  204. package/dist/headers/ModbusUDP.js +100 -0
  205. package/dist/headers/MongoDB.d.ts +33 -0
  206. package/dist/headers/MongoDB.js +143 -0
  207. package/dist/headers/MySQL.d.ts +30 -0
  208. package/dist/headers/MySQL.js +114 -0
  209. package/dist/headers/NATS.d.ts +29 -0
  210. package/dist/headers/NATS.js +135 -0
  211. package/dist/headers/NBDS.d.ts +34 -0
  212. package/dist/headers/NBDS.js +176 -0
  213. package/dist/headers/NBNS.d.ts +34 -0
  214. package/dist/headers/NBNS.js +78 -0
  215. package/dist/headers/NBSS.d.ts +36 -0
  216. package/dist/headers/NBSS.js +137 -0
  217. package/dist/headers/NFS.d.ts +36 -0
  218. package/dist/headers/NFS.js +273 -0
  219. package/dist/headers/NHRP.d.ts +32 -0
  220. package/dist/headers/NHRP.js +154 -0
  221. package/dist/headers/NNTP.d.ts +35 -0
  222. package/dist/headers/NNTP.js +162 -0
  223. package/dist/headers/NTP.d.ts +18 -0
  224. package/dist/headers/NTP.js +73 -0
  225. package/dist/headers/NetFlowV5.d.ts +28 -0
  226. package/dist/headers/NetFlowV5.js +205 -0
  227. package/dist/headers/OLSR.d.ts +31 -0
  228. package/dist/headers/OLSR.js +213 -0
  229. package/dist/headers/OPCUA.d.ts +33 -0
  230. package/dist/headers/OPCUA.js +165 -0
  231. package/dist/headers/OPCUAPubSub.d.ts +33 -0
  232. package/dist/headers/OPCUAPubSub.js +144 -0
  233. package/dist/headers/OSPF.d.ts +31 -0
  234. package/dist/headers/OSPF.js +365 -0
  235. package/dist/headers/OmronFINS.d.ts +31 -0
  236. package/dist/headers/OmronFINS.js +90 -0
  237. package/dist/headers/OpenFlow.d.ts +30 -0
  238. package/dist/headers/OpenFlow.js +113 -0
  239. package/dist/headers/OpenVPN.d.ts +35 -0
  240. package/dist/headers/OpenVPN.js +214 -0
  241. package/dist/headers/PCWorx.d.ts +35 -0
  242. package/dist/headers/PCWorx.js +115 -0
  243. package/dist/headers/PIM.d.ts +27 -0
  244. package/dist/headers/PIM.js +129 -0
  245. package/dist/headers/POP3.d.ts +31 -0
  246. package/dist/headers/POP3.js +152 -0
  247. package/dist/headers/POWERLINK.d.ts +28 -0
  248. package/dist/headers/POWERLINK.js +116 -0
  249. package/dist/headers/PPPoEDiscovery.d.ts +29 -0
  250. package/dist/headers/PPPoEDiscovery.js +198 -0
  251. package/dist/headers/PPPoESession.d.ts +28 -0
  252. package/dist/headers/PPPoESession.js +125 -0
  253. package/dist/headers/PPTP.d.ts +30 -0
  254. package/dist/headers/PPTP.js +122 -0
  255. package/dist/headers/PROFINETRT.d.ts +28 -0
  256. package/dist/headers/PROFINETRT.js +74 -0
  257. package/dist/headers/PTP.d.ts +34 -0
  258. package/dist/headers/PTP.js +213 -0
  259. package/dist/headers/PostgreSQL.d.ts +40 -0
  260. package/dist/headers/PostgreSQL.js +236 -0
  261. package/dist/headers/QUIC.d.ts +34 -0
  262. package/dist/headers/QUIC.js +308 -0
  263. package/dist/headers/RADIUS.d.ts +24 -0
  264. package/dist/headers/RADIUS.js +138 -0
  265. package/dist/headers/RDP.d.ts +27 -0
  266. package/dist/headers/RDP.js +93 -0
  267. package/dist/headers/RFB.d.ts +39 -0
  268. package/dist/headers/RFB.js +151 -0
  269. package/dist/headers/RGoose.d.ts +72 -0
  270. package/dist/headers/RGoose.js +340 -0
  271. package/dist/headers/RIP.d.ts +29 -0
  272. package/dist/headers/RIP.js +133 -0
  273. package/dist/headers/RIPng.d.ts +26 -0
  274. package/dist/headers/RIPng.js +140 -0
  275. package/dist/headers/RMCP.d.ts +26 -0
  276. package/dist/headers/RMCP.js +155 -0
  277. package/dist/headers/RSVP.d.ts +31 -0
  278. package/dist/headers/RSVP.js +263 -0
  279. package/dist/headers/RTCP.d.ts +34 -0
  280. package/dist/headers/RTCP.js +217 -0
  281. package/dist/headers/RTP.d.ts +33 -0
  282. package/dist/headers/RTP.js +291 -0
  283. package/dist/headers/RTPS.d.ts +33 -0
  284. package/dist/headers/RTPS.js +182 -0
  285. package/dist/headers/RTSP.d.ts +36 -0
  286. package/dist/headers/RTSP.js +184 -0
  287. package/dist/headers/RawData.d.ts +17 -0
  288. package/dist/headers/RawData.js +43 -0
  289. package/dist/headers/Redis.d.ts +32 -0
  290. package/dist/headers/Redis.js +202 -0
  291. package/dist/headers/Rlogin.d.ts +42 -0
  292. package/dist/headers/Rlogin.js +139 -0
  293. package/dist/headers/Rsync.d.ts +28 -0
  294. package/dist/headers/Rsync.js +117 -0
  295. package/dist/headers/S7comm.d.ts +36 -0
  296. package/dist/headers/S7comm.js +244 -0
  297. package/dist/headers/SCTP.d.ts +35 -0
  298. package/dist/headers/SCTP.js +174 -0
  299. package/dist/headers/SFlow.d.ts +29 -0
  300. package/dist/headers/SFlow.js +242 -0
  301. package/dist/headers/SIP.d.ts +27 -0
  302. package/dist/headers/SIP.js +146 -0
  303. package/dist/headers/SLMP.d.ts +36 -0
  304. package/dist/headers/SLMP.js +154 -0
  305. package/dist/headers/SLP.d.ts +30 -0
  306. package/dist/headers/SLP.js +207 -0
  307. package/dist/headers/SLPv1.d.ts +32 -0
  308. package/dist/headers/SLPv1.js +138 -0
  309. package/dist/headers/SMB1.d.ts +37 -0
  310. package/dist/headers/SMB1.js +200 -0
  311. package/dist/headers/SMB2.d.ts +36 -0
  312. package/dist/headers/SMB2.js +203 -0
  313. package/dist/headers/SMPP.d.ts +33 -0
  314. package/dist/headers/SMPP.js +119 -0
  315. package/dist/headers/SMTP.d.ts +33 -0
  316. package/dist/headers/SMTP.js +157 -0
  317. package/dist/headers/SNAP.d.ts +22 -0
  318. package/dist/headers/SNAP.js +68 -0
  319. package/dist/headers/SNMP.d.ts +28 -0
  320. package/dist/headers/SNMP.js +302 -0
  321. package/dist/headers/SOCKS4.d.ts +42 -0
  322. package/dist/headers/SOCKS4.js +302 -0
  323. package/dist/headers/SOCKS5.d.ts +45 -0
  324. package/dist/headers/SOCKS5.js +223 -0
  325. package/dist/headers/SSDP.d.ts +27 -0
  326. package/dist/headers/SSDP.js +161 -0
  327. package/dist/headers/SSH.d.ts +44 -0
  328. package/dist/headers/SSH.js +274 -0
  329. package/dist/headers/STOMP.d.ts +48 -0
  330. package/dist/headers/STOMP.js +177 -0
  331. package/dist/headers/STP.d.ts +26 -0
  332. package/dist/headers/STP.js +150 -0
  333. package/dist/headers/STUN.d.ts +25 -0
  334. package/dist/headers/STUN.js +183 -0
  335. package/dist/headers/SercosIII.d.ts +43 -0
  336. package/dist/headers/SercosIII.js +199 -0
  337. package/dist/headers/Skinny.d.ts +32 -0
  338. package/dist/headers/Skinny.js +139 -0
  339. package/dist/headers/StatsD.d.ts +27 -0
  340. package/dist/headers/StatsD.js +134 -0
  341. package/dist/headers/SunRPC.d.ts +34 -0
  342. package/dist/headers/SunRPC.js +268 -0
  343. package/dist/headers/Syslog.d.ts +21 -0
  344. package/dist/headers/Syslog.js +91 -0
  345. package/dist/headers/TCP.d.ts +19 -0
  346. package/dist/headers/TCP.js +905 -0
  347. package/dist/headers/TFTP.d.ts +28 -0
  348. package/dist/headers/TFTP.js +224 -0
  349. package/dist/headers/TLS_Alert.d.ts +24 -0
  350. package/dist/headers/TLS_Alert.js +639 -0
  351. package/dist/headers/TLS_ApplicationData.d.ts +24 -0
  352. package/dist/headers/TLS_ApplicationData.js +170 -0
  353. package/dist/headers/TLS_ChangeCipherSpec.d.ts +23 -0
  354. package/dist/headers/TLS_ChangeCipherSpec.js +168 -0
  355. package/dist/headers/TLS_Handshake.d.ts +65 -0
  356. package/dist/headers/TLS_Handshake.js +860 -0
  357. package/dist/headers/TLS_Heartbeat.d.ts +27 -0
  358. package/dist/headers/TLS_Heartbeat.js +247 -0
  359. package/dist/headers/TPKT.d.ts +26 -0
  360. package/dist/headers/TPKT.js +99 -0
  361. package/dist/headers/TacacsPlus.d.ts +27 -0
  362. package/dist/headers/TacacsPlus.js +133 -0
  363. package/dist/headers/Telnet.d.ts +40 -0
  364. package/dist/headers/Telnet.js +193 -0
  365. package/dist/headers/Teredo.d.ts +40 -0
  366. package/dist/headers/Teredo.js +251 -0
  367. package/dist/headers/TimeProtocol.d.ts +25 -0
  368. package/dist/headers/TimeProtocol.js +53 -0
  369. package/dist/headers/UDP.d.ts +19 -0
  370. package/dist/headers/UDP.js +171 -0
  371. package/dist/headers/VLAN_802dot1Q.d.ts +24 -0
  372. package/dist/headers/VLAN_802dot1Q.js +96 -0
  373. package/dist/headers/VRRP.d.ts +26 -0
  374. package/dist/headers/VRRP.js +309 -0
  375. package/dist/headers/VXLAN.d.ts +24 -0
  376. package/dist/headers/VXLAN.js +75 -0
  377. package/dist/headers/WCCP.d.ts +29 -0
  378. package/dist/headers/WCCP.js +117 -0
  379. package/dist/headers/WHOIS.d.ts +37 -0
  380. package/dist/headers/WHOIS.js +126 -0
  381. package/dist/headers/WSDiscovery.d.ts +29 -0
  382. package/dist/headers/WSDiscovery.js +118 -0
  383. package/dist/headers/WakeOnLAN.d.ts +30 -0
  384. package/dist/headers/WakeOnLAN.js +126 -0
  385. package/dist/headers/WebSocket.d.ts +26 -0
  386. package/dist/headers/WebSocket.js +173 -0
  387. package/dist/headers/WireGuard.d.ts +38 -0
  388. package/dist/headers/WireGuard.js +216 -0
  389. package/dist/headers/XMPP.d.ts +37 -0
  390. package/dist/headers/XMPP.js +149 -0
  391. package/dist/headers/Zabbix.d.ts +35 -0
  392. package/dist/headers/Zabbix.js +153 -0
  393. package/dist/headers/cms/AcsiPdu.d.ts +45 -0
  394. package/dist/headers/cms/AcsiPdu.js +112 -0
  395. package/dist/headers/cms/PerDecoder.d.ts +68 -0
  396. package/dist/headers/cms/PerDecoder.js +211 -0
  397. package/dist/headers/cms/PerReader.d.ts +64 -0
  398. package/dist/headers/cms/PerReader.js +155 -0
  399. package/dist/helper/BufferToHex.d.ts +5 -0
  400. package/dist/helper/BufferToHex.js +10 -0
  401. package/dist/helper/BufferToIP.d.ts +12 -0
  402. package/dist/helper/BufferToIP.js +23 -0
  403. package/dist/helper/BufferToNumber.d.ts +18 -0
  404. package/dist/helper/BufferToNumber.js +47 -0
  405. package/dist/helper/HexToBuffer.d.ts +7 -0
  406. package/dist/helper/HexToBuffer.js +27 -0
  407. package/dist/helper/HexToNumber.d.ts +18 -0
  408. package/dist/helper/HexToNumber.js +48 -0
  409. package/dist/helper/IPToBuffer.d.ts +12 -0
  410. package/dist/helper/IPToBuffer.js +34 -0
  411. package/dist/helper/NumberToBERBuffer.d.ts +18 -0
  412. package/dist/helper/NumberToBERBuffer.js +31 -0
  413. package/dist/helper/NumberToBERHex.d.ts +18 -0
  414. package/dist/helper/NumberToBERHex.js +52 -0
  415. package/dist/helper/NumberToBuffer.d.ts +18 -0
  416. package/dist/helper/NumberToBuffer.js +38 -0
  417. package/dist/helper/NumberToHex.d.ts +18 -0
  418. package/dist/helper/NumberToHex.js +35 -0
  419. package/dist/index.d.ts +52 -0
  420. package/dist/index.js +113 -0
  421. package/dist/lib/FlexibleObject.d.ts +27 -0
  422. package/dist/lib/FlexibleObject.js +113 -0
  423. package/dist/lib/GetBERIntegerLengthFromBuffer.d.ts +6 -0
  424. package/dist/lib/GetBERIntegerLengthFromBuffer.js +16 -0
  425. package/dist/lib/ProcessPacketPostHandlers.d.ts +13 -0
  426. package/dist/lib/ProcessPacketPostHandlers.js +53 -0
  427. package/dist/lib/SortPostHandlers.d.ts +7 -0
  428. package/dist/lib/SortPostHandlers.js +11 -0
  429. package/dist/lib/StringContentEncodingEnum.d.ts +10 -0
  430. package/dist/lib/StringContentEncodingEnum.js +14 -0
  431. package/dist/schema/ProtocolFieldJSONSchema.d.ts +35 -0
  432. package/dist/schema/ProtocolFieldJSONSchema.js +2 -0
  433. package/dist/schema/ProtocolFieldJSONSchemaDefinition.d.ts +2 -0
  434. package/dist/schema/ProtocolFieldJSONSchemaDefinition.js +2 -0
  435. package/dist/schema/ProtocolJSONSchema.d.ts +32 -0
  436. package/dist/schema/ProtocolJSONSchema.js +2 -0
  437. package/dist/types/CodecData.d.ts +7 -0
  438. package/dist/types/CodecData.js +2 -0
  439. package/dist/types/CodecDecodeResult.d.ts +10 -0
  440. package/dist/types/CodecDecodeResult.js +2 -0
  441. package/dist/types/CodecEncodeInput.d.ts +2 -0
  442. package/dist/types/CodecEncodeInput.js +2 -0
  443. package/dist/types/CodecEncodeResult.d.ts +5 -0
  444. package/dist/types/CodecEncodeResult.js +2 -0
  445. package/dist/types/CodecErrorInfo.d.ts +5 -0
  446. package/dist/types/CodecErrorInfo.js +2 -0
  447. package/dist/types/CodecModule.d.ts +2 -0
  448. package/dist/types/CodecModule.js +2 -0
  449. package/dist/types/CodecModuleConstructor.d.ts +2 -0
  450. package/dist/types/CodecModuleConstructor.js +2 -0
  451. package/dist/types/CodecSchema.d.ts +6 -0
  452. package/dist/types/CodecSchema.js +2 -0
  453. package/dist/types/DemuxProducer.d.ts +23 -0
  454. package/dist/types/DemuxProducer.js +2 -0
  455. package/dist/types/Dissection.d.ts +23 -0
  456. package/dist/types/Dissection.js +2 -0
  457. package/dist/types/HeaderTreeNode.d.ts +4 -0
  458. package/dist/types/HeaderTreeNode.js +2 -0
  459. package/dist/types/LayerGraph.d.ts +32 -0
  460. package/dist/types/LayerGraph.js +2 -0
  461. package/dist/types/PostHandlerItem.d.ts +4 -0
  462. package/dist/types/PostHandlerItem.js +2 -0
  463. package/package.json +141 -0
@@ -0,0 +1,204 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DCCP = void 0;
4
+ const BaseHeader_1 = require("../abstracts/BaseHeader");
5
+ const BufferToHex_1 = require("../helper/BufferToHex");
6
+ const HexToBuffer_1 = require("../helper/HexToBuffer");
7
+ const NumberToBuffer_1 = require("../helper/NumberToBuffer");
8
+ const StringContentEncodingEnum_1 = require("../lib/StringContentEncodingEnum");
9
+ /**
10
+ * DCCP — Datagram Congestion Control Protocol (RFC 4340), carried directly over IP as protocol 33. The
11
+ * generic header begins with Source Port (2), Destination Port (2), Data Offset (1, in 32-bit words —
12
+ * the length of the whole DCCP header including options), a byte split into CCVal (high 4 bits) and
13
+ * CsCov (low 4 bits), a 2-byte Checksum, and a byte split into Res (3 bits), Type (4 bits — 0 Request,
14
+ * 1 Response, 2 Data, 3 Ack, 4 DataAck, 5 CloseReq, 6 Close, 7 Reset) and X (1 bit, Extended Sequence
15
+ * Numbers). After that byte come the (X-dependent-width) Reserved + Sequence Number and any type-specific
16
+ * fields / options — everything up to Data Offset*4.
17
+ *
18
+ * To sidestep the X sequence-width branch and stay byte-perfect, this codec structures only the fixed
19
+ * 9-byte prefix (ports / data offset / ccval+cscov / checksum / res+type+x) and keeps the remainder of
20
+ * the header — Reserved, the Sequence/Ack numbers, per-type fields and options — verbatim as
21
+ * `headerOptions` hex (bytes 9 .. DataOffset*4). Application data after the header is kept as `payload`
22
+ * hex, bounded by the enclosing IP datagram so an inflated Data Offset can't read past the IP payload.
23
+ * The Checksum is honored verbatim, never recomputed; Data Offset is honored when supplied, else derived
24
+ * from the actual bytes. A well-formed datagram round-trips byte-for-byte.
25
+ */
26
+ class DCCP extends BaseHeader_1.BaseHeader {
27
+ constructor() {
28
+ super(...arguments);
29
+ this.id = 'dccp';
30
+ this.name = 'Datagram Congestion Control Protocol';
31
+ this.nickname = 'DCCP';
32
+ this.matchKeys = ['ipproto:33'];
33
+ //A leaf header — application data is kept verbatim as `payload` hex.
34
+ this.demuxProducers = [];
35
+ }
36
+ static #schemaCache;
37
+ get SCHEMA() {
38
+ return (DCCP.#schemaCache ??= DCCP.#buildSchema());
39
+ }
40
+ /**
41
+ * Bytes of DCCP the IP layer below says are available. IPv4 carries a total-length field, so the
42
+ * DCCP payload is (total length - IP header length); IPv6 carries the payload length directly
43
+ * (plen). Mirrors the GRE/OSPF #available() pattern so header-option and payload reads are bounded
44
+ * by the real on-wire length rather than trusting Data Offset alone. Returns the captured remainder
45
+ * when neither IP length is present.
46
+ */
47
+ #available() {
48
+ let available = this.packet.length - this.startPos;
49
+ const prev = this.prevCodecModule;
50
+ if (prev && prev.id === 'ipv4') {
51
+ const ipPayload = prev.instance.length.getValue(0) - prev.length;
52
+ if (ipPayload >= 0 && ipPayload < available)
53
+ available = ipPayload;
54
+ }
55
+ else if (prev && prev.id === 'ipv6') {
56
+ const ipPayload = prev.instance.plen.getValue(0);
57
+ if (ipPayload >= 0 && ipPayload < available)
58
+ available = ipPayload;
59
+ }
60
+ return available < 0 ? 0 : available;
61
+ }
62
+ /**
63
+ * Header-relative end offset of the DCCP header = Data Offset*4, clamped down to the bytes the IP
64
+ * layer actually made available. Both `headerOptions` (which starts at the fixed 9-byte prefix) and
65
+ * the `payload` split are bounded by this.
66
+ */
67
+ #headerEnd() {
68
+ let end = this.instance.dataOffset.getValue(0) * 4;
69
+ const available = this.#available();
70
+ if (end > available)
71
+ end = available;
72
+ if (end < 0)
73
+ end = 0;
74
+ return end;
75
+ }
76
+ /** A big-endian bit-slice within a single octet at `offset`, read/written in place. */
77
+ static #bitField(name, offset, bitOffset, bitLength, label) {
78
+ const maximum = (2 ** bitLength) - 1;
79
+ return {
80
+ type: 'integer',
81
+ label: label,
82
+ minimum: 0,
83
+ maximum: maximum,
84
+ decode: function () {
85
+ this.instance[name].setValue(this.readBits(offset, 1, bitOffset, bitLength));
86
+ },
87
+ encode: function () {
88
+ const node = this.instance[name];
89
+ let value = node.getValue(0);
90
+ if (value > maximum)
91
+ value = maximum;
92
+ if (value < 0)
93
+ value = 0;
94
+ node.setValue(value);
95
+ this.writeBits(offset, 1, bitOffset, bitLength, value);
96
+ }
97
+ };
98
+ }
99
+ static #buildSchema() {
100
+ return {
101
+ type: 'object',
102
+ summary: 'DCCP ${srcPort}→${dstPort} type=${type}',
103
+ properties: {
104
+ srcPort: this.fieldUInt('srcPort', 0, 2, 'Source Port'),
105
+ dstPort: this.fieldUInt('dstPort', 2, 2, 'Destination Port'),
106
+ //Data Offset (32-bit words) = the length of the whole DCCP header incl. options. Honored
107
+ //when supplied (a crafted datagram may lie); else derived from the fixed 9-byte prefix
108
+ //plus the verbatim headerOptions bytes, rounded up to a word.
109
+ dataOffset: {
110
+ type: 'integer',
111
+ label: 'Data Offset',
112
+ minimum: 0,
113
+ maximum: 255,
114
+ decode: function () {
115
+ this.instance.dataOffset.setValue(this.readBytes(4, 1)[0]);
116
+ },
117
+ encode: function () {
118
+ const provided = this.instance.dataOffset.getValue();
119
+ let value;
120
+ if (provided !== undefined && provided !== null) {
121
+ value = provided;
122
+ }
123
+ else {
124
+ const optBytes = (0, HexToBuffer_1.HexToBuffer)(this.instance.headerOptions.getValue('')).length;
125
+ value = Math.ceil((9 + optBytes) / 4);
126
+ }
127
+ if (value > 255) {
128
+ this.recordError(this.instance.dataOffset.getPath(), 'Maximum value is 255');
129
+ value = 255;
130
+ }
131
+ if (value < 0)
132
+ value = 0;
133
+ this.instance.dataOffset.setValue(value);
134
+ this.writeBytes(4, (0, NumberToBuffer_1.UInt8ToBuffer)(value));
135
+ }
136
+ },
137
+ //Byte 5: CCVal (high 4 bits) + CsCov (low 4 bits).
138
+ ccval: this.#bitField('ccval', 5, 0, 4, 'CCVal'),
139
+ cscov: this.#bitField('cscov', 5, 4, 4, 'Checksum Coverage'),
140
+ //Honored verbatim: the DCCP checksum (ones-complement over pseudo-header + coverage) is
141
+ //never recomputed, so a captured datagram round-trips byte-for-byte.
142
+ checksum: this.fieldUInt('checksum', 6, 2, 'Checksum'),
143
+ //Byte 8: Res (3 bits) + Type (4 bits) + X (1 bit, Extended Sequence Numbers).
144
+ res: this.#bitField('res', 8, 0, 3, 'Reserved'),
145
+ type: this.#bitField('type', 8, 3, 4, 'Type'),
146
+ x: this.#bitField('x', 8, 7, 1, 'Extended Sequence Numbers'),
147
+ //Everything after the fixed 9-byte prefix up to Data Offset*4 — Reserved, the
148
+ //(X-dependent) Sequence/Ack numbers, per-type fields and options — kept verbatim so the
149
+ //X sequence-width branch never has to be modelled. Bounded by #headerEnd.
150
+ headerOptions: {
151
+ type: 'string',
152
+ label: 'Header Options',
153
+ contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX,
154
+ decode: function () {
155
+ const end = this.#headerEnd();
156
+ this.instance.headerOptions.setValue(end > 9 ? (0, BufferToHex_1.BufferToHex)(this.readBytes(9, end - 9)) : '');
157
+ },
158
+ encode: function () {
159
+ const headerOptions = this.instance.headerOptions.getValue('');
160
+ if (headerOptions)
161
+ this.writeBytes(9, (0, HexToBuffer_1.HexToBuffer)(headerOptions));
162
+ }
163
+ },
164
+ //Application data after the DCCP header, kept verbatim. Runs from Data Offset*4 to the end
165
+ //of the IP payload (a leaf — DCCP consumes the whole IP datagram, nothing recurses after).
166
+ payload: {
167
+ type: 'string',
168
+ label: 'Payload',
169
+ contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX,
170
+ decode: function () {
171
+ const available = this.#available();
172
+ let start = this.instance.dataOffset.getValue(0) * 4;
173
+ if (start < 9)
174
+ start = 9;
175
+ if (start > available)
176
+ start = available;
177
+ this.instance.payload.setValue(available > start ? (0, BufferToHex_1.BufferToHex)(this.readBytes(start, available - start)) : '');
178
+ },
179
+ encode: function () {
180
+ const payload = this.instance.payload.getValue('');
181
+ if (!payload)
182
+ return;
183
+ let start = this.instance.dataOffset.getValue(0) * 4;
184
+ if (start < 9)
185
+ start = 9;
186
+ this.writeBytes(start, (0, HexToBuffer_1.HexToBuffer)(payload));
187
+ }
188
+ }
189
+ }
190
+ };
191
+ }
192
+ match() {
193
+ //DCCP sits directly on IPv4 (protocol field) or IPv6 (next-header field) with protocol 33, and
194
+ //needs at least the smallest generic header (12 bytes, X=0) of IP payload present.
195
+ if (!this.prevCodecModule)
196
+ return false;
197
+ const protocol = this.prevCodecModule.instance.protocol.getValue(0);
198
+ const nextHeader = this.prevCodecModule.instance.nxt.getValue(0);
199
+ if (protocol !== 33 && nextHeader !== 33)
200
+ return false;
201
+ return this.#available() >= 12;
202
+ }
203
+ }
204
+ exports.DCCP = DCCP;
@@ -0,0 +1,26 @@
1
+ import { BaseHeader } from '../abstracts/BaseHeader';
2
+ import { ProtocolJSONSchema } from '../schema/ProtocolJSONSchema';
3
+ import { DemuxProducer } from '../types/DemuxProducer';
4
+ /**
5
+ * DHCP — Dynamic Host Configuration Protocol (RFC 2131), built on the BOOTP message format (RFC 951).
6
+ * A 236-byte fixed header (op/htype/hlen/hops, xid, secs, flags, the four IP addresses, 16-byte client
7
+ * hardware address, 64-byte server name and 128-byte boot file name), then the 4-byte magic cookie
8
+ * 0x63825363 (RFC 2131 §3), then variable options in code-length-value form (§9) terminated by End
9
+ * (255). Rides UDP, ports 67 (server) and 68 (client).
10
+ *
11
+ * Options are carried generically (code + verbatim hex value) so every option — standard or unknown —
12
+ * round-trips byte-for-byte; per-option semantic decoding is a later enrichment. sname/file/chaddr are
13
+ * kept as raw hex (they contain fixed-width zero padding an editor must preserve). Any bytes after the
14
+ * End option (the BOOTP minimum-size padding) fall to the following raw layer.
15
+ */
16
+ export declare class DHCP extends BaseHeader {
17
+ #private;
18
+ get SCHEMA(): ProtocolJSONSchema;
19
+ readonly id: string;
20
+ readonly name: string;
21
+ readonly nickname: string;
22
+ readonly matchKeys: string[];
23
+ readonly heuristicFallback: boolean;
24
+ match(): boolean;
25
+ readonly demuxProducers: DemuxProducer[];
26
+ }
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DHCP = void 0;
4
+ const BaseHeader_1 = require("../abstracts/BaseHeader");
5
+ const BufferToHex_1 = require("../helper/BufferToHex");
6
+ const BufferToNumber_1 = require("../helper/BufferToNumber");
7
+ const NumberToBuffer_1 = require("../helper/NumberToBuffer");
8
+ const StringContentEncodingEnum_1 = require("../lib/StringContentEncodingEnum");
9
+ /**
10
+ * DHCP — Dynamic Host Configuration Protocol (RFC 2131), built on the BOOTP message format (RFC 951).
11
+ * A 236-byte fixed header (op/htype/hlen/hops, xid, secs, flags, the four IP addresses, 16-byte client
12
+ * hardware address, 64-byte server name and 128-byte boot file name), then the 4-byte magic cookie
13
+ * 0x63825363 (RFC 2131 §3), then variable options in code-length-value form (§9) terminated by End
14
+ * (255). Rides UDP, ports 67 (server) and 68 (client).
15
+ *
16
+ * Options are carried generically (code + verbatim hex value) so every option — standard or unknown —
17
+ * round-trips byte-for-byte; per-option semantic decoding is a later enrichment. sname/file/chaddr are
18
+ * kept as raw hex (they contain fixed-width zero padding an editor must preserve). Any bytes after the
19
+ * End option (the BOOTP minimum-size padding) fall to the following raw layer.
20
+ */
21
+ class DHCP extends BaseHeader_1.BaseHeader {
22
+ constructor() {
23
+ super(...arguments);
24
+ this.id = 'dhcp';
25
+ this.name = 'Dynamic Host Configuration Protocol';
26
+ this.nickname = 'DHCP';
27
+ //Server port 67 and client port 68 (both UDP). heuristicFallback because the 0x63825363 magic
28
+ //cookie at offset 236 is a reliable 32-bit content signature.
29
+ this.matchKeys = ['udpport:67', 'udpport:68'];
30
+ this.heuristicFallback = true;
31
+ //A leaf header — nothing demuxes above DHCP.
32
+ this.demuxProducers = [];
33
+ }
34
+ static #schemaCache;
35
+ get SCHEMA() {
36
+ return (DHCP.#schemaCache ??= DHCP.#buildSchema());
37
+ }
38
+ static #buildSchema() {
39
+ return {
40
+ type: 'object',
41
+ properties: {
42
+ op: this.fieldUInt('op', 0, 1, 'Message Type'),
43
+ htype: this.fieldUInt('htype', 1, 1, 'Hardware Type'),
44
+ hlen: this.fieldUInt('hlen', 2, 1, 'Hardware Address Length'),
45
+ hops: this.fieldUInt('hops', 3, 1, 'Hops'),
46
+ xid: this.fieldUInt('xid', 4, 4, 'Transaction ID'),
47
+ secs: this.fieldUInt('secs', 8, 2, 'Seconds Elapsed'),
48
+ flags: this.fieldUInt('flags', 10, 2, 'Flags'),
49
+ ciaddr: this.fieldIPv4('ciaddr', 12, 'Client IP Address'),
50
+ yiaddr: this.fieldIPv4('yiaddr', 16, 'Your IP Address'),
51
+ siaddr: this.fieldIPv4('siaddr', 20, 'Next Server IP Address'),
52
+ giaddr: this.fieldIPv4('giaddr', 24, 'Relay Agent IP Address'),
53
+ chaddr: this.fieldHex('chaddr', 28, 16, 'Client Hardware Address'),
54
+ sname: this.fieldHex('sname', 44, 64, 'Server Host Name'),
55
+ file: this.fieldHex('file', 108, 128, 'Boot File Name'),
56
+ magicCookie: this.fieldHex('magicCookie', 236, 4, 'Magic Cookie'),
57
+ options: {
58
+ type: 'array',
59
+ label: 'Options',
60
+ items: {
61
+ type: 'object',
62
+ label: 'Option',
63
+ properties: {
64
+ code: {
65
+ type: 'integer',
66
+ label: 'Code',
67
+ minimum: 0,
68
+ maximum: 255
69
+ },
70
+ value: {
71
+ type: 'string',
72
+ label: 'Value',
73
+ contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX
74
+ }
75
+ }
76
+ },
77
+ decode: function () {
78
+ //Options begin right after the 4-byte magic cookie (fixed 236 + 4 = 240).
79
+ const available = this.packet.length - this.startPos;
80
+ const options = [];
81
+ let offset = 240;
82
+ //Code(1) [Len(1) Value(Len)]. Pad(0) and End(255) are bare single bytes; End
83
+ //terminates the option block (trailing BOOTP padding falls to the raw layer).
84
+ //readBytes clamps at the buffer end and offset always advances, so a truncated
85
+ //or option-list-with-no-End packet cannot read out of bounds or loop forever.
86
+ while (offset < available) {
87
+ const code = (0, BufferToNumber_1.BufferToUInt8)(this.readBytes(offset, 1));
88
+ offset += 1;
89
+ if (code === 0) {
90
+ options.push({ code: 0 });
91
+ continue;
92
+ }
93
+ if (code === 255) {
94
+ options.push({ code: 255 });
95
+ break;
96
+ }
97
+ //Need a length byte; if the buffer ends here, stop.
98
+ if (offset >= available) {
99
+ options.push({ code: code });
100
+ break;
101
+ }
102
+ const length = (0, BufferToNumber_1.BufferToUInt8)(this.readBytes(offset, 1));
103
+ offset += 1;
104
+ let value = Buffer.alloc(0);
105
+ if (length) {
106
+ value = this.readBytes(offset, length);
107
+ offset += length;
108
+ }
109
+ options.push({ code: code, value: (0, BufferToHex_1.BufferToHex)(value) });
110
+ }
111
+ this.instance.options.setValue(options);
112
+ },
113
+ encode: function () {
114
+ const options = this.instance.options.getValue();
115
+ if (!options)
116
+ return;
117
+ let offset = 240;
118
+ options.forEach((option) => {
119
+ const code = option.code ? option.code : 0;
120
+ this.writeBytes(offset, (0, NumberToBuffer_1.UInt8ToBuffer)(code));
121
+ offset += 1;
122
+ //Pad (0) and End (255): a single byte, no length/value.
123
+ if (code === 0 || code === 255)
124
+ return;
125
+ const value = Buffer.from(option.value ? option.value : '', 'hex');
126
+ this.writeBytes(offset, (0, NumberToBuffer_1.UInt8ToBuffer)(value.length));
127
+ offset += 1;
128
+ if (value.length) {
129
+ this.writeBytes(offset, value);
130
+ offset += value.length;
131
+ }
132
+ });
133
+ }
134
+ }
135
+ }
136
+ };
137
+ }
138
+ match() {
139
+ if (!this.prevCodecModule)
140
+ return false;
141
+ //Magic cookie 0x63825363 at offset 236 (RFC 2131 §3) — the fixed BOOTP header is always 236
142
+ //bytes, so a valid DHCP message is at least 240 bytes.
143
+ if (this.packet.length - this.startPos < 240)
144
+ return false;
145
+ return (0, BufferToHex_1.BufferToHex)(this.readBytes(236, 4)) === '63825363';
146
+ }
147
+ }
148
+ exports.DHCP = DHCP;
@@ -0,0 +1,30 @@
1
+ import { BaseHeader } from '../abstracts/BaseHeader';
2
+ import { ProtocolJSONSchema } from '../schema/ProtocolJSONSchema';
3
+ import { DemuxProducer } from '../types/DemuxProducer';
4
+ /**
5
+ * DHCP Failover protocol (ISC DHCPv4 failover, draft-ietf-dhc-failover), TCP port 647. A failover
6
+ * connection carries a stream of messages between the primary and secondary DHCP servers. Every message
7
+ * begins with a fixed header — a 2-byte Message Length (the total octet count of the whole message,
8
+ * including this length field), a 1-byte Message Type (1 POOLREQ, 2 POOLRESP, 3 BNDUPD, 4 BNDACK,
9
+ * 5 CONNECT, 6 CONNECTACK, 7 UPDREQ, 8 UPDDONE, 9 UPDREQALL, 10 STATE, 11 CONTACT, 12 DISCONNECT) —
10
+ * followed by the rest of the message: a payload-offset byte, a time and transaction id, then a series
11
+ * of option TLVs (2-byte option code, 2-byte option length, value).
12
+ *
13
+ * The payload after the Message Type is a chain of option TLVs whose meaning is message-type- and
14
+ * cross-connection-dependent (server states, MCLT, binding status, message digests, TLS negotiation), so
15
+ * this single-message codec keeps everything after the type verbatim as `payload` hex (byte-perfect) and
16
+ * does not sub-decode the options. The Message Length is auto-computed from the payload on encode when
17
+ * not supplied, else honored verbatim (a crafted message may carry any Length); the message is bounded by
18
+ * Length so a second pipelined message or trailing bytes are left to the codec's recursion / RawData. A
19
+ * well-formed message round-trips byte-for-byte.
20
+ */
21
+ export declare class DHCPFailover extends BaseHeader {
22
+ #private;
23
+ get SCHEMA(): ProtocolJSONSchema;
24
+ readonly id: string;
25
+ readonly name: string;
26
+ readonly nickname: string;
27
+ readonly matchKeys: string[];
28
+ match(): boolean;
29
+ readonly demuxProducers: DemuxProducer[];
30
+ }
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DHCPFailover = void 0;
4
+ const BaseHeader_1 = require("../abstracts/BaseHeader");
5
+ const BufferToHex_1 = require("../helper/BufferToHex");
6
+ const HexToBuffer_1 = require("../helper/HexToBuffer");
7
+ const BufferToNumber_1 = require("../helper/BufferToNumber");
8
+ const NumberToBuffer_1 = require("../helper/NumberToBuffer");
9
+ const StringContentEncodingEnum_1 = require("../lib/StringContentEncodingEnum");
10
+ /**
11
+ * DHCP Failover protocol (ISC DHCPv4 failover, draft-ietf-dhc-failover), TCP port 647. A failover
12
+ * connection carries a stream of messages between the primary and secondary DHCP servers. Every message
13
+ * begins with a fixed header — a 2-byte Message Length (the total octet count of the whole message,
14
+ * including this length field), a 1-byte Message Type (1 POOLREQ, 2 POOLRESP, 3 BNDUPD, 4 BNDACK,
15
+ * 5 CONNECT, 6 CONNECTACK, 7 UPDREQ, 8 UPDDONE, 9 UPDREQALL, 10 STATE, 11 CONTACT, 12 DISCONNECT) —
16
+ * followed by the rest of the message: a payload-offset byte, a time and transaction id, then a series
17
+ * of option TLVs (2-byte option code, 2-byte option length, value).
18
+ *
19
+ * The payload after the Message Type is a chain of option TLVs whose meaning is message-type- and
20
+ * cross-connection-dependent (server states, MCLT, binding status, message digests, TLS negotiation), so
21
+ * this single-message codec keeps everything after the type verbatim as `payload` hex (byte-perfect) and
22
+ * does not sub-decode the options. The Message Length is auto-computed from the payload on encode when
23
+ * not supplied, else honored verbatim (a crafted message may carry any Length); the message is bounded by
24
+ * Length so a second pipelined message or trailing bytes are left to the codec's recursion / RawData. A
25
+ * well-formed message round-trips byte-for-byte.
26
+ */
27
+ class DHCPFailover extends BaseHeader_1.BaseHeader {
28
+ constructor() {
29
+ super(...arguments);
30
+ this.id = 'dhcpfo';
31
+ this.name = 'DHCP Failover';
32
+ this.nickname = 'DHCPFO';
33
+ this.matchKeys = ['tcpport:647'];
34
+ //A leaf header — the option TLVs are message-type- and connection-dependent; kept as payload hex.
35
+ this.demuxProducers = [];
36
+ }
37
+ static #schemaCache;
38
+ get SCHEMA() {
39
+ return (DHCPFailover.#schemaCache ??= DHCPFailover.#buildSchema());
40
+ }
41
+ static #buildSchema() {
42
+ return {
43
+ type: 'object',
44
+ summary: 'DHCPFO type=${type} len=${length}',
45
+ properties: {
46
+ length: {
47
+ type: 'integer',
48
+ label: 'Message Length',
49
+ minimum: 0,
50
+ maximum: 65535,
51
+ decode: function () {
52
+ this.instance.length.setValue((0, BufferToNumber_1.BufferToUInt16)(this.readBytes(0, 2)));
53
+ },
54
+ encode: function () {
55
+ //Message Length counts the whole message = 2-byte length + 1-byte type + payload.
56
+ //Honored when supplied (a crafted message may lie); else derived from the payload.
57
+ const provided = this.instance.length.getValue();
58
+ let value = (provided !== undefined && provided !== null)
59
+ ? provided
60
+ : 3 + (0, HexToBuffer_1.HexToBuffer)(this.instance.payload.getValue('')).length;
61
+ if (value > 65535) {
62
+ this.recordError(this.instance.length.getPath(), 'Maximum value is 65535');
63
+ value = 65535;
64
+ }
65
+ this.instance.length.setValue(value);
66
+ this.writeBytes(0, (0, NumberToBuffer_1.UInt16ToBuffer)(value));
67
+ }
68
+ },
69
+ type: this.fieldUInt('type', 2, 1, 'Message Type'),
70
+ //Everything after the Message Type (payload-offset, time, xid, and the option TLVs), kept
71
+ //verbatim. Bounded by the Message Length (the message ends at offset Length) and the
72
+ //captured bytes, so trailing / pipelined data is left to the codec's recursion / RawData.
73
+ payload: {
74
+ type: 'string',
75
+ label: 'Payload',
76
+ contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX,
77
+ decode: function () {
78
+ const remaining = this.packet.length - this.startPos;
79
+ const length = this.instance.length.getValue(0);
80
+ let end = length;
81
+ if (end > remaining || end < 3)
82
+ end = remaining;
83
+ this.instance.payload.setValue(end > 3 ? (0, BufferToHex_1.BufferToHex)(this.readBytes(3, end - 3)) : '');
84
+ },
85
+ encode: function () {
86
+ const payload = this.instance.payload.getValue('');
87
+ if (payload)
88
+ this.writeBytes(3, (0, HexToBuffer_1.HexToBuffer)(payload));
89
+ }
90
+ }
91
+ }
92
+ };
93
+ }
94
+ match() {
95
+ //DHCP Failover rides on TCP port 647. The message header carries no strong content magic, so the
96
+ //well-known port is the signature. Require at least the fixed message header (2-byte length +
97
+ //1-byte type + payload-offset + 4-byte time = 8 bytes) so tiny stray port-647 payloads fall
98
+ //through to raw; decode itself never throws on a shorter/malformed message.
99
+ if (!this.prevCodecModule || this.prevCodecModule.id !== 'tcp')
100
+ return false;
101
+ return this.packet.length - this.startPos >= 8;
102
+ }
103
+ }
104
+ exports.DHCPFailover = DHCPFailover;
@@ -0,0 +1,25 @@
1
+ import { BaseHeader } from '../abstracts/BaseHeader';
2
+ import { ProtocolJSONSchema } from '../schema/ProtocolJSONSchema';
3
+ import { DemuxProducer } from '../types/DemuxProducer';
4
+ /**
5
+ * DHCPv6 — Dynamic Host Configuration Protocol for IPv6 (RFC 8415). A client/server message is a
6
+ * 1-byte message-type, a 3-byte transaction-id, then options in a regular code-length-value form:
7
+ * option-code(2) + option-len(2) + option-data(option-len), no padding. Rides UDP, client port 546 and
8
+ * server port 547 (over IPv6, multicast ff02::1:2).
9
+ *
10
+ * Options are carried generically (code + verbatim hex data) so every option — including ones whose
11
+ * data is itself nested options (IA_NA/IA_PD) — round-trips byte-for-byte; per-option / nested decoding
12
+ * is a later enrichment. Relay-agent messages (RELAY-FORW 12 / RELAY-REPL 13) have a DIFFERENT body
13
+ * (hop-count + 2 IPv6 addresses + options), so their body is kept verbatim (rawBody) rather than
14
+ * misparsed as a transaction-id, preserving a byte-perfect round-trip.
15
+ */
16
+ export declare class DHCPv6 extends BaseHeader {
17
+ #private;
18
+ get SCHEMA(): ProtocolJSONSchema;
19
+ readonly id: string;
20
+ readonly name: string;
21
+ readonly nickname: string;
22
+ readonly matchKeys: string[];
23
+ match(): boolean;
24
+ readonly demuxProducers: DemuxProducer[];
25
+ }