@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.
- package/CHANGELOG.md +17 -0
- package/LICENSE +21 -0
- package/README.md +352 -0
- package/README.zh-CN.md +342 -0
- package/dist/Codec.d.ts +133 -0
- package/dist/Codec.js +632 -0
- package/dist/PacketHeaders.d.ts +189 -0
- package/dist/PacketHeaders.js +384 -0
- package/dist/abstracts/BaseHeader.d.ts +325 -0
- package/dist/abstracts/BaseHeader.js +734 -0
- package/dist/errors/CodecSchemaValidateError.d.ts +4 -0
- package/dist/errors/CodecSchemaValidateError.js +11 -0
- package/dist/headers/ADSAMS.d.ts +33 -0
- package/dist/headers/ADSAMS.js +208 -0
- package/dist/headers/AH.d.ts +28 -0
- package/dist/headers/AH.js +137 -0
- package/dist/headers/AMQP.d.ts +31 -0
- package/dist/headers/AMQP.js +316 -0
- package/dist/headers/ARP.d.ts +26 -0
- package/dist/headers/ARP.js +243 -0
- package/dist/headers/BACnetIP.d.ts +27 -0
- package/dist/headers/BACnetIP.js +97 -0
- package/dist/headers/BFD.d.ts +28 -0
- package/dist/headers/BFD.js +155 -0
- package/dist/headers/BGP.d.ts +27 -0
- package/dist/headers/BGP.js +111 -0
- package/dist/headers/BSAPIP.d.ts +33 -0
- package/dist/headers/BSAPIP.js +78 -0
- package/dist/headers/Babel.d.ts +32 -0
- package/dist/headers/Babel.js +224 -0
- package/dist/headers/BitTorrent.d.ts +28 -0
- package/dist/headers/BitTorrent.js +72 -0
- package/dist/headers/C37118.d.ts +26 -0
- package/dist/headers/C37118.js +147 -0
- package/dist/headers/CAPWAP.d.ts +38 -0
- package/dist/headers/CAPWAP.js +275 -0
- package/dist/headers/CDP.d.ts +25 -0
- package/dist/headers/CDP.js +117 -0
- package/dist/headers/CMS.d.ts +33 -0
- package/dist/headers/CMS.js +238 -0
- package/dist/headers/COTP.d.ts +30 -0
- package/dist/headers/COTP.js +193 -0
- package/dist/headers/CassandraCQL.d.ts +28 -0
- package/dist/headers/CassandraCQL.js +117 -0
- package/dist/headers/CoAP.d.ts +29 -0
- package/dist/headers/CoAP.js +140 -0
- package/dist/headers/Codesys.d.ts +32 -0
- package/dist/headers/Codesys.js +119 -0
- package/dist/headers/Collectd.d.ts +29 -0
- package/dist/headers/Collectd.js +154 -0
- package/dist/headers/DCCP.d.ts +30 -0
- package/dist/headers/DCCP.js +204 -0
- package/dist/headers/DHCP.d.ts +26 -0
- package/dist/headers/DHCP.js +148 -0
- package/dist/headers/DHCPFailover.d.ts +30 -0
- package/dist/headers/DHCPFailover.js +104 -0
- package/dist/headers/DHCPv6.d.ts +25 -0
- package/dist/headers/DHCPv6.js +145 -0
- package/dist/headers/DNP3.d.ts +27 -0
- package/dist/headers/DNP3.js +150 -0
- package/dist/headers/DNS.d.ts +55 -0
- package/dist/headers/DNS.js +309 -0
- package/dist/headers/DTLS.d.ts +33 -0
- package/dist/headers/DTLS.js +142 -0
- package/dist/headers/Diameter.d.ts +34 -0
- package/dist/headers/Diameter.js +229 -0
- package/dist/headers/EAPOL.d.ts +32 -0
- package/dist/headers/EAPOL.js +135 -0
- package/dist/headers/EIGRP.d.ts +28 -0
- package/dist/headers/EIGRP.js +165 -0
- package/dist/headers/ENIP.d.ts +31 -0
- package/dist/headers/ENIP.js +164 -0
- package/dist/headers/ESP.d.ts +27 -0
- package/dist/headers/ESP.js +140 -0
- package/dist/headers/Elasticsearch.d.ts +30 -0
- package/dist/headers/Elasticsearch.js +125 -0
- package/dist/headers/EtherCAT.d.ts +35 -0
- package/dist/headers/EtherCAT.js +150 -0
- package/dist/headers/EthernetII.d.ts +28 -0
- package/dist/headers/EthernetII.js +117 -0
- package/dist/headers/FCoE.d.ts +38 -0
- package/dist/headers/FCoE.js +210 -0
- package/dist/headers/FTP.d.ts +34 -0
- package/dist/headers/FTP.js +158 -0
- package/dist/headers/Finger.d.ts +41 -0
- package/dist/headers/Finger.js +135 -0
- package/dist/headers/FoundationFieldbusHSE.d.ts +43 -0
- package/dist/headers/FoundationFieldbusHSE.js +163 -0
- package/dist/headers/GELF.d.ts +35 -0
- package/dist/headers/GELF.js +261 -0
- package/dist/headers/GENEVE.d.ts +26 -0
- package/dist/headers/GENEVE.js +209 -0
- package/dist/headers/GESRTP.d.ts +32 -0
- package/dist/headers/GESRTP.js +141 -0
- package/dist/headers/GLBP.d.ts +29 -0
- package/dist/headers/GLBP.js +159 -0
- package/dist/headers/GRE.d.ts +27 -0
- package/dist/headers/GRE.js +181 -0
- package/dist/headers/GTPU.d.ts +25 -0
- package/dist/headers/GTPU.js +203 -0
- package/dist/headers/GTPv2C.d.ts +30 -0
- package/dist/headers/GTPv2C.js +281 -0
- package/dist/headers/GitProtocol.d.ts +34 -0
- package/dist/headers/GitProtocol.js +141 -0
- package/dist/headers/Goose.d.ts +115 -0
- package/dist/headers/Goose.js +1067 -0
- package/dist/headers/Gopher.d.ts +43 -0
- package/dist/headers/Gopher.js +182 -0
- package/dist/headers/HARTIP.d.ts +30 -0
- package/dist/headers/HARTIP.js +145 -0
- package/dist/headers/HSR.d.ts +27 -0
- package/dist/headers/HSR.js +105 -0
- package/dist/headers/HSRP.d.ts +26 -0
- package/dist/headers/HSRP.js +173 -0
- package/dist/headers/HTTP.d.ts +32 -0
- package/dist/headers/HTTP.js +153 -0
- package/dist/headers/HTTP2.d.ts +34 -0
- package/dist/headers/HTTP2.js +190 -0
- package/dist/headers/IAX2.d.ts +33 -0
- package/dist/headers/IAX2.js +274 -0
- package/dist/headers/ICMP.d.ts +15 -0
- package/dist/headers/ICMP.js +148 -0
- package/dist/headers/ICMPv6.d.ts +15 -0
- package/dist/headers/ICMPv6.js +129 -0
- package/dist/headers/IEC104_I_Frame.d.ts +23 -0
- package/dist/headers/IEC104_I_Frame.js +6489 -0
- package/dist/headers/IEC104_S_Frame.d.ts +26 -0
- package/dist/headers/IEC104_S_Frame.js +135 -0
- package/dist/headers/IEC104_U_Frame.d.ts +27 -0
- package/dist/headers/IEC104_U_Frame.js +176 -0
- package/dist/headers/IEC61850SampledValues.d.ts +20 -0
- package/dist/headers/IEC61850SampledValues.js +420 -0
- package/dist/headers/IGMP.d.ts +31 -0
- package/dist/headers/IGMP.js +274 -0
- package/dist/headers/IMAP.d.ts +32 -0
- package/dist/headers/IMAP.js +185 -0
- package/dist/headers/IPFIX.d.ts +29 -0
- package/dist/headers/IPFIX.js +156 -0
- package/dist/headers/IPv4.d.ts +20 -0
- package/dist/headers/IPv4.js +370 -0
- package/dist/headers/IPv6.d.ts +29 -0
- package/dist/headers/IPv6.js +209 -0
- package/dist/headers/IPv6HopByHopOptions.d.ts +81 -0
- package/dist/headers/IPv6HopByHopOptions.js +495 -0
- package/dist/headers/IRC.d.ts +34 -0
- package/dist/headers/IRC.js +175 -0
- package/dist/headers/ISAKMP.d.ts +29 -0
- package/dist/headers/ISAKMP.js +197 -0
- package/dist/headers/ISCSI.d.ts +39 -0
- package/dist/headers/ISCSI.js +289 -0
- package/dist/headers/ISIS.d.ts +25 -0
- package/dist/headers/ISIS.js +79 -0
- package/dist/headers/ISOSession.d.ts +27 -0
- package/dist/headers/ISOSession.js +343 -0
- package/dist/headers/Ident.d.ts +42 -0
- package/dist/headers/Ident.js +184 -0
- package/dist/headers/KNXnetIP.d.ts +30 -0
- package/dist/headers/KNXnetIP.js +135 -0
- package/dist/headers/Kafka.d.ts +35 -0
- package/dist/headers/Kafka.js +128 -0
- package/dist/headers/Kerberos.d.ts +30 -0
- package/dist/headers/Kerberos.js +217 -0
- package/dist/headers/L2TP.d.ts +26 -0
- package/dist/headers/L2TP.js +297 -0
- package/dist/headers/LACP.d.ts +31 -0
- package/dist/headers/LACP.js +151 -0
- package/dist/headers/LDAP.d.ts +31 -0
- package/dist/headers/LDAP.js +226 -0
- package/dist/headers/LDP.d.ts +31 -0
- package/dist/headers/LDP.js +138 -0
- package/dist/headers/LISP.d.ts +30 -0
- package/dist/headers/LISP.js +103 -0
- package/dist/headers/LLC.d.ts +27 -0
- package/dist/headers/LLC.js +81 -0
- package/dist/headers/LLDP.d.ts +26 -0
- package/dist/headers/LLDP.js +126 -0
- package/dist/headers/LLMNR.d.ts +23 -0
- package/dist/headers/LLMNR.js +40 -0
- package/dist/headers/LPD.d.ts +31 -0
- package/dist/headers/LPD.js +159 -0
- package/dist/headers/MACsec.d.ts +34 -0
- package/dist/headers/MACsec.js +178 -0
- package/dist/headers/MDNS.d.ts +26 -0
- package/dist/headers/MDNS.js +45 -0
- package/dist/headers/MGCP.d.ts +30 -0
- package/dist/headers/MGCP.js +155 -0
- package/dist/headers/MMS.d.ts +29 -0
- package/dist/headers/MMS.js +243 -0
- package/dist/headers/MPLS.d.ts +31 -0
- package/dist/headers/MPLS.js +145 -0
- package/dist/headers/MQTT.d.ts +30 -0
- package/dist/headers/MQTT.js +173 -0
- package/dist/headers/MQTTSN.d.ts +34 -0
- package/dist/headers/MQTTSN.js +177 -0
- package/dist/headers/MarkerProtocol.d.ts +32 -0
- package/dist/headers/MarkerProtocol.js +153 -0
- package/dist/headers/Megaco.d.ts +32 -0
- package/dist/headers/Megaco.js +144 -0
- package/dist/headers/Memcached.d.ts +44 -0
- package/dist/headers/Memcached.js +285 -0
- package/dist/headers/ModbusTCP.d.ts +25 -0
- package/dist/headers/ModbusTCP.js +99 -0
- package/dist/headers/ModbusUDP.d.ts +26 -0
- package/dist/headers/ModbusUDP.js +100 -0
- package/dist/headers/MongoDB.d.ts +33 -0
- package/dist/headers/MongoDB.js +143 -0
- package/dist/headers/MySQL.d.ts +30 -0
- package/dist/headers/MySQL.js +114 -0
- package/dist/headers/NATS.d.ts +29 -0
- package/dist/headers/NATS.js +135 -0
- package/dist/headers/NBDS.d.ts +34 -0
- package/dist/headers/NBDS.js +176 -0
- package/dist/headers/NBNS.d.ts +34 -0
- package/dist/headers/NBNS.js +78 -0
- package/dist/headers/NBSS.d.ts +36 -0
- package/dist/headers/NBSS.js +137 -0
- package/dist/headers/NFS.d.ts +36 -0
- package/dist/headers/NFS.js +273 -0
- package/dist/headers/NHRP.d.ts +32 -0
- package/dist/headers/NHRP.js +154 -0
- package/dist/headers/NNTP.d.ts +35 -0
- package/dist/headers/NNTP.js +162 -0
- package/dist/headers/NTP.d.ts +18 -0
- package/dist/headers/NTP.js +73 -0
- package/dist/headers/NetFlowV5.d.ts +28 -0
- package/dist/headers/NetFlowV5.js +205 -0
- package/dist/headers/OLSR.d.ts +31 -0
- package/dist/headers/OLSR.js +213 -0
- package/dist/headers/OPCUA.d.ts +33 -0
- package/dist/headers/OPCUA.js +165 -0
- package/dist/headers/OPCUAPubSub.d.ts +33 -0
- package/dist/headers/OPCUAPubSub.js +144 -0
- package/dist/headers/OSPF.d.ts +31 -0
- package/dist/headers/OSPF.js +365 -0
- package/dist/headers/OmronFINS.d.ts +31 -0
- package/dist/headers/OmronFINS.js +90 -0
- package/dist/headers/OpenFlow.d.ts +30 -0
- package/dist/headers/OpenFlow.js +113 -0
- package/dist/headers/OpenVPN.d.ts +35 -0
- package/dist/headers/OpenVPN.js +214 -0
- package/dist/headers/PCWorx.d.ts +35 -0
- package/dist/headers/PCWorx.js +115 -0
- package/dist/headers/PIM.d.ts +27 -0
- package/dist/headers/PIM.js +129 -0
- package/dist/headers/POP3.d.ts +31 -0
- package/dist/headers/POP3.js +152 -0
- package/dist/headers/POWERLINK.d.ts +28 -0
- package/dist/headers/POWERLINK.js +116 -0
- package/dist/headers/PPPoEDiscovery.d.ts +29 -0
- package/dist/headers/PPPoEDiscovery.js +198 -0
- package/dist/headers/PPPoESession.d.ts +28 -0
- package/dist/headers/PPPoESession.js +125 -0
- package/dist/headers/PPTP.d.ts +30 -0
- package/dist/headers/PPTP.js +122 -0
- package/dist/headers/PROFINETRT.d.ts +28 -0
- package/dist/headers/PROFINETRT.js +74 -0
- package/dist/headers/PTP.d.ts +34 -0
- package/dist/headers/PTP.js +213 -0
- package/dist/headers/PostgreSQL.d.ts +40 -0
- package/dist/headers/PostgreSQL.js +236 -0
- package/dist/headers/QUIC.d.ts +34 -0
- package/dist/headers/QUIC.js +308 -0
- package/dist/headers/RADIUS.d.ts +24 -0
- package/dist/headers/RADIUS.js +138 -0
- package/dist/headers/RDP.d.ts +27 -0
- package/dist/headers/RDP.js +93 -0
- package/dist/headers/RFB.d.ts +39 -0
- package/dist/headers/RFB.js +151 -0
- package/dist/headers/RGoose.d.ts +72 -0
- package/dist/headers/RGoose.js +340 -0
- package/dist/headers/RIP.d.ts +29 -0
- package/dist/headers/RIP.js +133 -0
- package/dist/headers/RIPng.d.ts +26 -0
- package/dist/headers/RIPng.js +140 -0
- package/dist/headers/RMCP.d.ts +26 -0
- package/dist/headers/RMCP.js +155 -0
- package/dist/headers/RSVP.d.ts +31 -0
- package/dist/headers/RSVP.js +263 -0
- package/dist/headers/RTCP.d.ts +34 -0
- package/dist/headers/RTCP.js +217 -0
- package/dist/headers/RTP.d.ts +33 -0
- package/dist/headers/RTP.js +291 -0
- package/dist/headers/RTPS.d.ts +33 -0
- package/dist/headers/RTPS.js +182 -0
- package/dist/headers/RTSP.d.ts +36 -0
- package/dist/headers/RTSP.js +184 -0
- package/dist/headers/RawData.d.ts +17 -0
- package/dist/headers/RawData.js +43 -0
- package/dist/headers/Redis.d.ts +32 -0
- package/dist/headers/Redis.js +202 -0
- package/dist/headers/Rlogin.d.ts +42 -0
- package/dist/headers/Rlogin.js +139 -0
- package/dist/headers/Rsync.d.ts +28 -0
- package/dist/headers/Rsync.js +117 -0
- package/dist/headers/S7comm.d.ts +36 -0
- package/dist/headers/S7comm.js +244 -0
- package/dist/headers/SCTP.d.ts +35 -0
- package/dist/headers/SCTP.js +174 -0
- package/dist/headers/SFlow.d.ts +29 -0
- package/dist/headers/SFlow.js +242 -0
- package/dist/headers/SIP.d.ts +27 -0
- package/dist/headers/SIP.js +146 -0
- package/dist/headers/SLMP.d.ts +36 -0
- package/dist/headers/SLMP.js +154 -0
- package/dist/headers/SLP.d.ts +30 -0
- package/dist/headers/SLP.js +207 -0
- package/dist/headers/SLPv1.d.ts +32 -0
- package/dist/headers/SLPv1.js +138 -0
- package/dist/headers/SMB1.d.ts +37 -0
- package/dist/headers/SMB1.js +200 -0
- package/dist/headers/SMB2.d.ts +36 -0
- package/dist/headers/SMB2.js +203 -0
- package/dist/headers/SMPP.d.ts +33 -0
- package/dist/headers/SMPP.js +119 -0
- package/dist/headers/SMTP.d.ts +33 -0
- package/dist/headers/SMTP.js +157 -0
- package/dist/headers/SNAP.d.ts +22 -0
- package/dist/headers/SNAP.js +68 -0
- package/dist/headers/SNMP.d.ts +28 -0
- package/dist/headers/SNMP.js +302 -0
- package/dist/headers/SOCKS4.d.ts +42 -0
- package/dist/headers/SOCKS4.js +302 -0
- package/dist/headers/SOCKS5.d.ts +45 -0
- package/dist/headers/SOCKS5.js +223 -0
- package/dist/headers/SSDP.d.ts +27 -0
- package/dist/headers/SSDP.js +161 -0
- package/dist/headers/SSH.d.ts +44 -0
- package/dist/headers/SSH.js +274 -0
- package/dist/headers/STOMP.d.ts +48 -0
- package/dist/headers/STOMP.js +177 -0
- package/dist/headers/STP.d.ts +26 -0
- package/dist/headers/STP.js +150 -0
- package/dist/headers/STUN.d.ts +25 -0
- package/dist/headers/STUN.js +183 -0
- package/dist/headers/SercosIII.d.ts +43 -0
- package/dist/headers/SercosIII.js +199 -0
- package/dist/headers/Skinny.d.ts +32 -0
- package/dist/headers/Skinny.js +139 -0
- package/dist/headers/StatsD.d.ts +27 -0
- package/dist/headers/StatsD.js +134 -0
- package/dist/headers/SunRPC.d.ts +34 -0
- package/dist/headers/SunRPC.js +268 -0
- package/dist/headers/Syslog.d.ts +21 -0
- package/dist/headers/Syslog.js +91 -0
- package/dist/headers/TCP.d.ts +19 -0
- package/dist/headers/TCP.js +905 -0
- package/dist/headers/TFTP.d.ts +28 -0
- package/dist/headers/TFTP.js +224 -0
- package/dist/headers/TLS_Alert.d.ts +24 -0
- package/dist/headers/TLS_Alert.js +639 -0
- package/dist/headers/TLS_ApplicationData.d.ts +24 -0
- package/dist/headers/TLS_ApplicationData.js +170 -0
- package/dist/headers/TLS_ChangeCipherSpec.d.ts +23 -0
- package/dist/headers/TLS_ChangeCipherSpec.js +168 -0
- package/dist/headers/TLS_Handshake.d.ts +65 -0
- package/dist/headers/TLS_Handshake.js +860 -0
- package/dist/headers/TLS_Heartbeat.d.ts +27 -0
- package/dist/headers/TLS_Heartbeat.js +247 -0
- package/dist/headers/TPKT.d.ts +26 -0
- package/dist/headers/TPKT.js +99 -0
- package/dist/headers/TacacsPlus.d.ts +27 -0
- package/dist/headers/TacacsPlus.js +133 -0
- package/dist/headers/Telnet.d.ts +40 -0
- package/dist/headers/Telnet.js +193 -0
- package/dist/headers/Teredo.d.ts +40 -0
- package/dist/headers/Teredo.js +251 -0
- package/dist/headers/TimeProtocol.d.ts +25 -0
- package/dist/headers/TimeProtocol.js +53 -0
- package/dist/headers/UDP.d.ts +19 -0
- package/dist/headers/UDP.js +171 -0
- package/dist/headers/VLAN_802dot1Q.d.ts +24 -0
- package/dist/headers/VLAN_802dot1Q.js +96 -0
- package/dist/headers/VRRP.d.ts +26 -0
- package/dist/headers/VRRP.js +309 -0
- package/dist/headers/VXLAN.d.ts +24 -0
- package/dist/headers/VXLAN.js +75 -0
- package/dist/headers/WCCP.d.ts +29 -0
- package/dist/headers/WCCP.js +117 -0
- package/dist/headers/WHOIS.d.ts +37 -0
- package/dist/headers/WHOIS.js +126 -0
- package/dist/headers/WSDiscovery.d.ts +29 -0
- package/dist/headers/WSDiscovery.js +118 -0
- package/dist/headers/WakeOnLAN.d.ts +30 -0
- package/dist/headers/WakeOnLAN.js +126 -0
- package/dist/headers/WebSocket.d.ts +26 -0
- package/dist/headers/WebSocket.js +173 -0
- package/dist/headers/WireGuard.d.ts +38 -0
- package/dist/headers/WireGuard.js +216 -0
- package/dist/headers/XMPP.d.ts +37 -0
- package/dist/headers/XMPP.js +149 -0
- package/dist/headers/Zabbix.d.ts +35 -0
- package/dist/headers/Zabbix.js +153 -0
- package/dist/headers/cms/AcsiPdu.d.ts +45 -0
- package/dist/headers/cms/AcsiPdu.js +112 -0
- package/dist/headers/cms/PerDecoder.d.ts +68 -0
- package/dist/headers/cms/PerDecoder.js +211 -0
- package/dist/headers/cms/PerReader.d.ts +64 -0
- package/dist/headers/cms/PerReader.js +155 -0
- package/dist/helper/BufferToHex.d.ts +5 -0
- package/dist/helper/BufferToHex.js +10 -0
- package/dist/helper/BufferToIP.d.ts +12 -0
- package/dist/helper/BufferToIP.js +23 -0
- package/dist/helper/BufferToNumber.d.ts +18 -0
- package/dist/helper/BufferToNumber.js +47 -0
- package/dist/helper/HexToBuffer.d.ts +7 -0
- package/dist/helper/HexToBuffer.js +27 -0
- package/dist/helper/HexToNumber.d.ts +18 -0
- package/dist/helper/HexToNumber.js +48 -0
- package/dist/helper/IPToBuffer.d.ts +12 -0
- package/dist/helper/IPToBuffer.js +34 -0
- package/dist/helper/NumberToBERBuffer.d.ts +18 -0
- package/dist/helper/NumberToBERBuffer.js +31 -0
- package/dist/helper/NumberToBERHex.d.ts +18 -0
- package/dist/helper/NumberToBERHex.js +52 -0
- package/dist/helper/NumberToBuffer.d.ts +18 -0
- package/dist/helper/NumberToBuffer.js +38 -0
- package/dist/helper/NumberToHex.d.ts +18 -0
- package/dist/helper/NumberToHex.js +35 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.js +113 -0
- package/dist/lib/FlexibleObject.d.ts +27 -0
- package/dist/lib/FlexibleObject.js +113 -0
- package/dist/lib/GetBERIntegerLengthFromBuffer.d.ts +6 -0
- package/dist/lib/GetBERIntegerLengthFromBuffer.js +16 -0
- package/dist/lib/ProcessPacketPostHandlers.d.ts +13 -0
- package/dist/lib/ProcessPacketPostHandlers.js +53 -0
- package/dist/lib/SortPostHandlers.d.ts +7 -0
- package/dist/lib/SortPostHandlers.js +11 -0
- package/dist/lib/StringContentEncodingEnum.d.ts +10 -0
- package/dist/lib/StringContentEncodingEnum.js +14 -0
- package/dist/schema/ProtocolFieldJSONSchema.d.ts +35 -0
- package/dist/schema/ProtocolFieldJSONSchema.js +2 -0
- package/dist/schema/ProtocolFieldJSONSchemaDefinition.d.ts +2 -0
- package/dist/schema/ProtocolFieldJSONSchemaDefinition.js +2 -0
- package/dist/schema/ProtocolJSONSchema.d.ts +32 -0
- package/dist/schema/ProtocolJSONSchema.js +2 -0
- package/dist/types/CodecData.d.ts +7 -0
- package/dist/types/CodecData.js +2 -0
- package/dist/types/CodecDecodeResult.d.ts +10 -0
- package/dist/types/CodecDecodeResult.js +2 -0
- package/dist/types/CodecEncodeInput.d.ts +2 -0
- package/dist/types/CodecEncodeInput.js +2 -0
- package/dist/types/CodecEncodeResult.d.ts +5 -0
- package/dist/types/CodecEncodeResult.js +2 -0
- package/dist/types/CodecErrorInfo.d.ts +5 -0
- package/dist/types/CodecErrorInfo.js +2 -0
- package/dist/types/CodecModule.d.ts +2 -0
- package/dist/types/CodecModule.js +2 -0
- package/dist/types/CodecModuleConstructor.d.ts +2 -0
- package/dist/types/CodecModuleConstructor.js +2 -0
- package/dist/types/CodecSchema.d.ts +6 -0
- package/dist/types/CodecSchema.js +2 -0
- package/dist/types/DemuxProducer.d.ts +23 -0
- package/dist/types/DemuxProducer.js +2 -0
- package/dist/types/Dissection.d.ts +23 -0
- package/dist/types/Dissection.js +2 -0
- package/dist/types/HeaderTreeNode.d.ts +4 -0
- package/dist/types/HeaderTreeNode.js +2 -0
- package/dist/types/LayerGraph.d.ts +32 -0
- package/dist/types/LayerGraph.js +2 -0
- package/dist/types/PostHandlerItem.d.ts +4 -0
- package/dist/types/PostHandlerItem.js +2 -0
- package/package.json +141 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CoAP = 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 StringContentEncodingEnum_1 = require("../lib/StringContentEncodingEnum");
|
|
8
|
+
/**
|
|
9
|
+
* CoAP — Constrained Application Protocol (RFC 7252), a RESTful transfer protocol for constrained nodes
|
|
10
|
+
* and networks (IoT), riding on UDP port 5683. Every message opens with a 4-byte fixed header: byte 0
|
|
11
|
+
* holds the 2-bit Version (always 1), a 2-bit Type (0 CON, 1 NON, 2 ACK, 3 RST) and a 4-bit Token
|
|
12
|
+
* Length (TKL, 0-8); byte 1 is the 8-bit Code (a 3-bit class '.' 5-bit detail, e.g. 0.01 GET = 0x01,
|
|
13
|
+
* 2.05 Content = 0x45); bytes 2-3 are the big-endian Message ID. The fixed header is followed by a
|
|
14
|
+
* Token of TKL octets, then a sequence of Options, then optionally a 0xFF payload marker and the
|
|
15
|
+
* payload.
|
|
16
|
+
*
|
|
17
|
+
* This codec decodes the fixed header and the Token structurally and keeps everything after the Token
|
|
18
|
+
* (the Options plus the optional payload-marker-and-payload) verbatim as `payload` hex — de-structuring
|
|
19
|
+
* CoAP's option deltas / TLV encoding is a later slice, so those bytes are preserved untouched and the
|
|
20
|
+
* message round-trips byte-for-byte. The region is bounded by the UDP datagram length so any trailing
|
|
21
|
+
* padding is not absorbed. version === 1 is the content signature that separates a real CoAP datagram
|
|
22
|
+
* on port 5683 from arbitrary traffic.
|
|
23
|
+
*/
|
|
24
|
+
class CoAP extends BaseHeader_1.BaseHeader {
|
|
25
|
+
constructor() {
|
|
26
|
+
super(...arguments);
|
|
27
|
+
this.id = 'coap';
|
|
28
|
+
this.name = 'Constrained Application Protocol';
|
|
29
|
+
this.nickname = 'CoAP';
|
|
30
|
+
this.matchKeys = ['udpport:5683'];
|
|
31
|
+
//A leaf header — CoAP option/payload TLV de-structuring is deferred to a later slice.
|
|
32
|
+
this.demuxProducers = [];
|
|
33
|
+
}
|
|
34
|
+
static #schemaCache;
|
|
35
|
+
get SCHEMA() {
|
|
36
|
+
return (CoAP.#schemaCache ??= CoAP.#buildSchema());
|
|
37
|
+
}
|
|
38
|
+
/** The UDP payload length bounded by the datagram (so retained padding is not absorbed). */
|
|
39
|
+
#payloadLength() {
|
|
40
|
+
let available = this.packet.length - this.startPos;
|
|
41
|
+
if (this.prevCodecModule && this.prevCodecModule.id === 'udp') {
|
|
42
|
+
const udpLength = this.prevCodecModule.instance.length.getValue(0);
|
|
43
|
+
if (udpLength >= 8 && udpLength - 8 < available)
|
|
44
|
+
available = udpLength - 8;
|
|
45
|
+
}
|
|
46
|
+
return available < 0 ? 0 : available;
|
|
47
|
+
}
|
|
48
|
+
/** The Token octet count, clamped to the spec's 0-8 range and to the bytes actually available. */
|
|
49
|
+
#tokenBytes() {
|
|
50
|
+
let count = this.instance.tokenLength.getValue(0);
|
|
51
|
+
if (count > 8)
|
|
52
|
+
count = 8;
|
|
53
|
+
if (count < 0)
|
|
54
|
+
count = 0;
|
|
55
|
+
const available = this.#payloadLength();
|
|
56
|
+
if (4 + count > available)
|
|
57
|
+
count = available - 4;
|
|
58
|
+
return count < 0 ? 0 : count;
|
|
59
|
+
}
|
|
60
|
+
/** A fixed-width big-endian bit field within byte 0 (bitOffset 0 = MSB). */
|
|
61
|
+
static #bitField(name, bitOffset, bitLength, maximum, label) {
|
|
62
|
+
return {
|
|
63
|
+
type: 'integer',
|
|
64
|
+
label: label,
|
|
65
|
+
minimum: 0,
|
|
66
|
+
maximum: maximum,
|
|
67
|
+
decode: function () {
|
|
68
|
+
this.instance[name].setValue(this.readBits(0, 1, bitOffset, bitLength));
|
|
69
|
+
},
|
|
70
|
+
encode: function () {
|
|
71
|
+
this.writeBits(0, 1, bitOffset, bitLength, this.instance[name].getValue(0));
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
static #buildSchema() {
|
|
76
|
+
return {
|
|
77
|
+
type: 'object',
|
|
78
|
+
summary: 'CoAP type=${type} code=${code}',
|
|
79
|
+
properties: {
|
|
80
|
+
//Byte 0 (MSB first): Version (bits 7:6, always 1), Type (bits 5:4), Token Length (bits 3:0).
|
|
81
|
+
version: this.#bitField('version', 0, 2, 3, 'Version'),
|
|
82
|
+
type: this.#bitField('type', 2, 2, 3, 'Type'),
|
|
83
|
+
tokenLength: this.#bitField('tokenLength', 4, 4, 15, 'Token Length'),
|
|
84
|
+
//Byte 1: Code — a 3-bit class and 5-bit detail packed as one octet (e.g. 0x01 = 0.01 GET).
|
|
85
|
+
code: this.fieldUInt('code', 1, 1, 'Code'),
|
|
86
|
+
//Bytes 2-3: Message ID (big-endian uint16).
|
|
87
|
+
messageId: this.fieldUInt('messageId', 2, 2, 'Message ID'),
|
|
88
|
+
//Token: TKL octets immediately after the fixed header, kept verbatim as hex ('' when TKL 0).
|
|
89
|
+
token: {
|
|
90
|
+
type: 'string',
|
|
91
|
+
label: 'Token',
|
|
92
|
+
contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX,
|
|
93
|
+
decode: function () {
|
|
94
|
+
const count = this.#tokenBytes();
|
|
95
|
+
this.instance.token.setValue(count > 0 ? (0, BufferToHex_1.BufferToHex)(this.readBytes(4, count)) : '');
|
|
96
|
+
},
|
|
97
|
+
encode: function () {
|
|
98
|
+
const token = this.instance.token.getValue('');
|
|
99
|
+
if (token)
|
|
100
|
+
this.writeBytes(4, (0, HexToBuffer_1.HexToBuffer)(token));
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
//Options + optional payload-marker-and-payload, kept verbatim (TLV de-structuring is a later
|
|
104
|
+
//slice). Bounded by the UDP datagram, and placed right after the Token (offset 4 + TKL).
|
|
105
|
+
payload: {
|
|
106
|
+
type: 'string',
|
|
107
|
+
label: 'Payload',
|
|
108
|
+
contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX,
|
|
109
|
+
decode: function () {
|
|
110
|
+
const available = this.#payloadLength();
|
|
111
|
+
const start = 4 + this.#tokenBytes();
|
|
112
|
+
this.instance.payload.setValue(start < available ? (0, BufferToHex_1.BufferToHex)(this.readBytes(start, available - start)) : '');
|
|
113
|
+
},
|
|
114
|
+
encode: function () {
|
|
115
|
+
const payload = this.instance.payload.getValue('');
|
|
116
|
+
if (payload) {
|
|
117
|
+
//The actual token bytes are authoritative for where the payload starts (the
|
|
118
|
+
//token field writes its own bytes at offset 4), so the payload cannot overlap
|
|
119
|
+
//or gap the token even when a crafted Token Length disagrees with the token.
|
|
120
|
+
const tokenBytes = (0, HexToBuffer_1.HexToBuffer)(this.instance.token.getValue('')).length;
|
|
121
|
+
this.writeBytes(4 + tokenBytes, (0, HexToBuffer_1.HexToBuffer)(payload));
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
match() {
|
|
129
|
+
//CoAP rides on UDP port 5683. Require the 4-byte fixed header within the datagram and the
|
|
130
|
+
//Version == 1 content signature (bits 7:6 of byte 0) so a non-CoAP datagram on 5683 falls
|
|
131
|
+
//through to raw rather than claiming an un-decodable layer.
|
|
132
|
+
if (!this.prevCodecModule || this.prevCodecModule.id !== 'udp')
|
|
133
|
+
return false;
|
|
134
|
+
if (this.#payloadLength() < 4)
|
|
135
|
+
return false;
|
|
136
|
+
const version = this.readBits(0, 1, 0, 2);
|
|
137
|
+
return version === 1;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
exports.CoAP = CoAP;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { BaseHeader } from '../abstracts/BaseHeader';
|
|
2
|
+
import { ProtocolJSONSchema } from '../schema/ProtocolJSONSchema';
|
|
3
|
+
import { DemuxProducer } from '../types/DemuxProducer';
|
|
4
|
+
/**
|
|
5
|
+
* CODESYS V3 (3S-Smart Software Solutions runtime) communication, TCP port 2455. CODESYS wraps its
|
|
6
|
+
* multi-layer message stack (an L3 datagram/router layer, an L4 channel layer and an L7 service layer)
|
|
7
|
+
* inside an outer "block driver" frame: a fixed 8-byte header — a 4-byte magic (`00 01 17 e8`) and a
|
|
8
|
+
* LITTLE-ENDIAN 32-bit Length — followed by the block-driver payload.
|
|
9
|
+
*
|
|
10
|
+
* ⚠️ No authoritative public specification of the CODESYS wire format exists. The block-driver framing
|
|
11
|
+
* used here (magic + little-endian length) is inferred from the community Wireshark dissector
|
|
12
|
+
* `fridgebuyer/codesys3-dissector` (and the ICS-pcap CODESYS notes), not from a vendor spec — so this
|
|
13
|
+
* codec surfaces only the two determinable header fields and keeps the entire block-driver payload
|
|
14
|
+
* (the L3/L4/L7 stack, which needs cross-message / session context) verbatim as `payload` hex
|
|
15
|
+
* (byte-perfect). The Length is auto-computed from the payload on encode when not supplied, else honored
|
|
16
|
+
* verbatim (a crafted frame may carry any Length); the payload is bounded by the Length so a second
|
|
17
|
+
* pipelined block-driver frame or trailing bytes are left to the codec's recursion / RawData. A
|
|
18
|
+
* well-formed frame round-trips byte-for-byte.
|
|
19
|
+
*
|
|
20
|
+
* Like the other multi-byte CODESYS/CIP-style protocols, the Length is little-endian; there is no
|
|
21
|
+
* little-endian helper in this codebase, so it is read/written byte-by-byte in its closures.
|
|
22
|
+
*/
|
|
23
|
+
export declare class Codesys extends BaseHeader {
|
|
24
|
+
#private;
|
|
25
|
+
get SCHEMA(): ProtocolJSONSchema;
|
|
26
|
+
readonly id: string;
|
|
27
|
+
readonly name: string;
|
|
28
|
+
readonly nickname: string;
|
|
29
|
+
readonly matchKeys: string[];
|
|
30
|
+
match(): boolean;
|
|
31
|
+
readonly demuxProducers: DemuxProducer[];
|
|
32
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Codesys = 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 StringContentEncodingEnum_1 = require("../lib/StringContentEncodingEnum");
|
|
8
|
+
/**
|
|
9
|
+
* CODESYS V3 (3S-Smart Software Solutions runtime) communication, TCP port 2455. CODESYS wraps its
|
|
10
|
+
* multi-layer message stack (an L3 datagram/router layer, an L4 channel layer and an L7 service layer)
|
|
11
|
+
* inside an outer "block driver" frame: a fixed 8-byte header — a 4-byte magic (`00 01 17 e8`) and a
|
|
12
|
+
* LITTLE-ENDIAN 32-bit Length — followed by the block-driver payload.
|
|
13
|
+
*
|
|
14
|
+
* ⚠️ No authoritative public specification of the CODESYS wire format exists. The block-driver framing
|
|
15
|
+
* used here (magic + little-endian length) is inferred from the community Wireshark dissector
|
|
16
|
+
* `fridgebuyer/codesys3-dissector` (and the ICS-pcap CODESYS notes), not from a vendor spec — so this
|
|
17
|
+
* codec surfaces only the two determinable header fields and keeps the entire block-driver payload
|
|
18
|
+
* (the L3/L4/L7 stack, which needs cross-message / session context) verbatim as `payload` hex
|
|
19
|
+
* (byte-perfect). The Length is auto-computed from the payload on encode when not supplied, else honored
|
|
20
|
+
* verbatim (a crafted frame may carry any Length); the payload is bounded by the Length so a second
|
|
21
|
+
* pipelined block-driver frame or trailing bytes are left to the codec's recursion / RawData. A
|
|
22
|
+
* well-formed frame round-trips byte-for-byte.
|
|
23
|
+
*
|
|
24
|
+
* Like the other multi-byte CODESYS/CIP-style protocols, the Length is little-endian; there is no
|
|
25
|
+
* little-endian helper in this codebase, so it is read/written byte-by-byte in its closures.
|
|
26
|
+
*/
|
|
27
|
+
class Codesys extends BaseHeader_1.BaseHeader {
|
|
28
|
+
constructor() {
|
|
29
|
+
super(...arguments);
|
|
30
|
+
this.id = 'codesys';
|
|
31
|
+
this.name = 'CODESYS V3';
|
|
32
|
+
this.nickname = 'CODESYS';
|
|
33
|
+
this.matchKeys = ['tcpport:2455'];
|
|
34
|
+
//A leaf header — the block-driver payload (L3/L4/L7) requires cross-message / session parsing that
|
|
35
|
+
//has no authoritative public spec, so it is kept as hex rather than demuxed further.
|
|
36
|
+
this.demuxProducers = [];
|
|
37
|
+
}
|
|
38
|
+
static #schemaCache;
|
|
39
|
+
get SCHEMA() {
|
|
40
|
+
return (Codesys.#schemaCache ??= Codesys.#buildSchema());
|
|
41
|
+
}
|
|
42
|
+
/** The 4-byte block-driver magic that prefixes every frame, as a wire-order byte sequence. */
|
|
43
|
+
static #MAGIC = '000117e8';
|
|
44
|
+
static #buildSchema() {
|
|
45
|
+
return {
|
|
46
|
+
type: 'object',
|
|
47
|
+
summary: 'CODESYS len=${length}',
|
|
48
|
+
properties: {
|
|
49
|
+
//The 4-byte block-driver magic (00 01 17 e8). Kept verbatim (not enum-constrained) so any
|
|
50
|
+
//observed frame round-trips even if a variant carries a different signature.
|
|
51
|
+
magic: this.fieldHex('magic', 0, 4, 'Block Driver Magic'),
|
|
52
|
+
//Block-driver payload byte count that follows the 8-byte header. LITTLE-ENDIAN 32-bit.
|
|
53
|
+
//Honored when supplied (a crafted frame may lie); else derived from the payload bytes.
|
|
54
|
+
length: {
|
|
55
|
+
type: 'integer',
|
|
56
|
+
label: 'Length',
|
|
57
|
+
minimum: 0,
|
|
58
|
+
maximum: 4294967295,
|
|
59
|
+
decode: function () {
|
|
60
|
+
const b = this.readBytes(4, 4);
|
|
61
|
+
//`|` yields a signed int32, so `>>> 0` over the WHOLE expression keeps it unsigned.
|
|
62
|
+
this.instance.length.setValue((b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0);
|
|
63
|
+
},
|
|
64
|
+
encode: function () {
|
|
65
|
+
const provided = this.instance.length.getValue();
|
|
66
|
+
let value = (provided !== undefined && provided !== null)
|
|
67
|
+
? provided
|
|
68
|
+
: (0, HexToBuffer_1.HexToBuffer)(this.instance.payload.getValue('')).length;
|
|
69
|
+
if (value > 4294967295) {
|
|
70
|
+
this.recordError(this.instance.length.getPath(), 'Maximum value is 4294967295');
|
|
71
|
+
value = 4294967295;
|
|
72
|
+
}
|
|
73
|
+
if (value < 0) {
|
|
74
|
+
this.recordError(this.instance.length.getPath(), 'Minimum value is 0');
|
|
75
|
+
value = 0;
|
|
76
|
+
}
|
|
77
|
+
this.instance.length.setValue(value);
|
|
78
|
+
this.writeBytes(4, Buffer.from([value & 0xff, (value >> 8) & 0xff, (value >> 16) & 0xff, (value >>> 24) & 0xff]));
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
//The block-driver payload (the CODESYS L3/L4/L7 stack), kept verbatim. Bounded by the
|
|
82
|
+
//Length field (payload ends at offset 8 + Length) when the Length is sane and the captured
|
|
83
|
+
//bytes, so a trailing / pipelined frame is left to the codec's recursion / RawData.
|
|
84
|
+
payload: {
|
|
85
|
+
type: 'string',
|
|
86
|
+
label: 'Payload',
|
|
87
|
+
contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX,
|
|
88
|
+
decode: function () {
|
|
89
|
+
const available = this.packet.length - this.startPos;
|
|
90
|
+
const length = this.instance.length.getValue(0);
|
|
91
|
+
//Honor the Length to bound the payload when it fits within the captured bytes;
|
|
92
|
+
//otherwise (0, or a lying/oversized Length) consume the rest so nothing is lost.
|
|
93
|
+
let end = 8 + length;
|
|
94
|
+
if (length <= 0 || end > available)
|
|
95
|
+
end = available;
|
|
96
|
+
this.instance.payload.setValue(end > 8 ? (0, BufferToHex_1.BufferToHex)(this.readBytes(8, end - 8)) : '');
|
|
97
|
+
},
|
|
98
|
+
encode: function () {
|
|
99
|
+
const payload = this.instance.payload.getValue('');
|
|
100
|
+
if (payload)
|
|
101
|
+
this.writeBytes(8, (0, HexToBuffer_1.HexToBuffer)(payload));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
match() {
|
|
108
|
+
//CODESYS V3 rides on TCP port 2455 (an observed runtime/gateway port). Require the full 8-byte
|
|
109
|
+
//block-driver header and the 4-byte magic signature (00 01 17 e8) so non-CODESYS 2455 traffic
|
|
110
|
+
//falls through to raw. The magic is a strong 32-bit content signature, but selection stays
|
|
111
|
+
//port-bucketed (matchKeys) like the other length-bounded TCP-payload codecs.
|
|
112
|
+
if (!this.prevCodecModule || this.prevCodecModule.id !== 'tcp')
|
|
113
|
+
return false;
|
|
114
|
+
if (this.packet.length - this.startPos < 8)
|
|
115
|
+
return false;
|
|
116
|
+
return (0, BufferToHex_1.BufferToHex)(this.readBytes(0, 4, true)) === Codesys.#MAGIC;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
exports.Codesys = Codesys;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { BaseHeader } from '../abstracts/BaseHeader';
|
|
2
|
+
import { ProtocolJSONSchema } from '../schema/ProtocolJSONSchema';
|
|
3
|
+
import { DemuxProducer } from '../types/DemuxProducer';
|
|
4
|
+
/**
|
|
5
|
+
* collectd binary network protocol (the monitoring daemon's UDP transport, well-known UDP port 25826,
|
|
6
|
+
* default multicast group 239.192.74.66). A collectd datagram is a flat sequence of parts; each part is
|
|
7
|
+
* a 4-byte header — a 2-byte Type and a 2-byte Length, both big-endian — followed by Length − 4 value
|
|
8
|
+
* bytes (the Length field COUNTS its own 4-byte header). Common part types: 0x0000 Host, 0x0001 Time,
|
|
9
|
+
* 0x0002 Plugin, 0x0004 PluginInstance, 0x0008 Type, 0x0009 Values. There is no top-level length — the
|
|
10
|
+
* datagram owns the whole UDP payload and parts run to its end.
|
|
11
|
+
*
|
|
12
|
+
* Parts are carried generically (Type + on-wire Length + verbatim hex value) so every part — string,
|
|
13
|
+
* numeric, values, or unknown — round-trips byte-for-byte; per-type semantic decoding (string bodies,
|
|
14
|
+
* uint64 times, the Values type/count/data layout) is a later enrichment. The walk peeks each 4-byte
|
|
15
|
+
* header (dry-run), stops at a part that overruns the payload or declares a Length < 4 (its own header),
|
|
16
|
+
* and keeps any bytes after the last complete part verbatim in `trailer` so the datagram is reproduced
|
|
17
|
+
* exactly. Each part's Length is honored verbatim on encode (a crafted part may lie) or derived from the
|
|
18
|
+
* value byte count when absent; the part layout always advances by the actual value bytes written.
|
|
19
|
+
*/
|
|
20
|
+
export declare class Collectd extends BaseHeader {
|
|
21
|
+
#private;
|
|
22
|
+
get SCHEMA(): ProtocolJSONSchema;
|
|
23
|
+
readonly id: string;
|
|
24
|
+
readonly name: string;
|
|
25
|
+
readonly nickname: string;
|
|
26
|
+
readonly matchKeys: string[];
|
|
27
|
+
match(): boolean;
|
|
28
|
+
readonly demuxProducers: DemuxProducer[];
|
|
29
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Collectd = 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
|
+
* collectd binary network protocol (the monitoring daemon's UDP transport, well-known UDP port 25826,
|
|
11
|
+
* default multicast group 239.192.74.66). A collectd datagram is a flat sequence of parts; each part is
|
|
12
|
+
* a 4-byte header — a 2-byte Type and a 2-byte Length, both big-endian — followed by Length − 4 value
|
|
13
|
+
* bytes (the Length field COUNTS its own 4-byte header). Common part types: 0x0000 Host, 0x0001 Time,
|
|
14
|
+
* 0x0002 Plugin, 0x0004 PluginInstance, 0x0008 Type, 0x0009 Values. There is no top-level length — the
|
|
15
|
+
* datagram owns the whole UDP payload and parts run to its end.
|
|
16
|
+
*
|
|
17
|
+
* Parts are carried generically (Type + on-wire Length + verbatim hex value) so every part — string,
|
|
18
|
+
* numeric, values, or unknown — round-trips byte-for-byte; per-type semantic decoding (string bodies,
|
|
19
|
+
* uint64 times, the Values type/count/data layout) is a later enrichment. The walk peeks each 4-byte
|
|
20
|
+
* header (dry-run), stops at a part that overruns the payload or declares a Length < 4 (its own header),
|
|
21
|
+
* and keeps any bytes after the last complete part verbatim in `trailer` so the datagram is reproduced
|
|
22
|
+
* exactly. Each part's Length is honored verbatim on encode (a crafted part may lie) or derived from the
|
|
23
|
+
* value byte count when absent; the part layout always advances by the actual value bytes written.
|
|
24
|
+
*/
|
|
25
|
+
class Collectd extends BaseHeader_1.BaseHeader {
|
|
26
|
+
constructor() {
|
|
27
|
+
super(...arguments);
|
|
28
|
+
this.id = 'collectd';
|
|
29
|
+
this.name = 'collectd Network Protocol';
|
|
30
|
+
this.nickname = 'collectd';
|
|
31
|
+
this.matchKeys = ['udpport:25826'];
|
|
32
|
+
//A leaf header — the per-type part bodies are kept verbatim for now.
|
|
33
|
+
this.demuxProducers = [];
|
|
34
|
+
}
|
|
35
|
+
static #schemaCache;
|
|
36
|
+
get SCHEMA() {
|
|
37
|
+
return (Collectd.#schemaCache ??= Collectd.#buildSchema());
|
|
38
|
+
}
|
|
39
|
+
static #buildSchema() {
|
|
40
|
+
return {
|
|
41
|
+
type: 'object',
|
|
42
|
+
summary: 'collectd ${parts.length} parts',
|
|
43
|
+
properties: {
|
|
44
|
+
parts: {
|
|
45
|
+
type: 'array',
|
|
46
|
+
label: 'Parts',
|
|
47
|
+
items: {
|
|
48
|
+
type: 'object',
|
|
49
|
+
label: 'Part',
|
|
50
|
+
properties: {
|
|
51
|
+
type: { type: 'integer', label: 'Type', minimum: 0, maximum: 65535 },
|
|
52
|
+
//On-wire Length INCLUDING the 4-byte part header (Type + Length). Honored
|
|
53
|
+
//verbatim on encode; derived as 4 + value bytes when omitted.
|
|
54
|
+
length: { type: 'integer', label: 'Length', minimum: 0, maximum: 65535 },
|
|
55
|
+
value: { type: 'string', label: 'Value', contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX }
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
decode: function () {
|
|
59
|
+
//The datagram owns the whole UDP payload — there is no outer length, so bound the
|
|
60
|
+
//walk by the remaining payload bytes. Each part is Type(2) Length(2) Value(Length−4).
|
|
61
|
+
const available = this.packet.length - this.startPos;
|
|
62
|
+
const parts = [];
|
|
63
|
+
let offset = 0;
|
|
64
|
+
while (offset + 4 <= available) {
|
|
65
|
+
//Peek the 4-byte header (dry-run) before committing so a truncated / malformed
|
|
66
|
+
//part is NOT consumed by the header length — its bytes fall through to `trailer`.
|
|
67
|
+
const header = this.readBytes(offset, 4, true);
|
|
68
|
+
const type = header.readUInt16BE(0);
|
|
69
|
+
const length = header.readUInt16BE(2);
|
|
70
|
+
//Length counts its own 4-byte header: a value below 4 cannot delimit the part
|
|
71
|
+
//(and would not advance the offset), so stop and keep the rest as trailer.
|
|
72
|
+
if (length < 4)
|
|
73
|
+
break;
|
|
74
|
+
//A part that overruns the payload (truncation) is not consumed — stop and leave
|
|
75
|
+
//the remaining bytes to `trailer`, keeping the round-trip exact.
|
|
76
|
+
if (offset + length > available)
|
|
77
|
+
break;
|
|
78
|
+
//Commit-read the whole part so the header length covers exactly what is consumed.
|
|
79
|
+
const partBuffer = this.readBytes(offset, length);
|
|
80
|
+
const value = length > 4 ? (0, BufferToHex_1.BufferToHex)(partBuffer.subarray(4)) : '';
|
|
81
|
+
parts.push({ type: type, length: length, value: value });
|
|
82
|
+
offset += length;
|
|
83
|
+
}
|
|
84
|
+
this.instance.parts.setValue(parts);
|
|
85
|
+
//Any bytes after the last complete part (a truncated / malformed final part, or
|
|
86
|
+
//padding) are kept verbatim and consumed, so the datagram is reproduced exactly and
|
|
87
|
+
//collectd always advances to the end of its UDP payload.
|
|
88
|
+
this.instance.trailer.setValue(offset < available ? (0, BufferToHex_1.BufferToHex)(this.readBytes(offset, available - offset)) : '');
|
|
89
|
+
},
|
|
90
|
+
encode: function () {
|
|
91
|
+
const parts = this.instance.parts.getValue([]);
|
|
92
|
+
let offset = 0;
|
|
93
|
+
if (parts) {
|
|
94
|
+
for (let i = 0; i < parts.length; i++) {
|
|
95
|
+
const part = parts[i];
|
|
96
|
+
let type = part.type ? part.type : 0;
|
|
97
|
+
if (type > 65535) {
|
|
98
|
+
this.recordError(`parts[${i}].type`, 'Maximum value is 65535');
|
|
99
|
+
type = 65535;
|
|
100
|
+
}
|
|
101
|
+
if (type < 0) {
|
|
102
|
+
this.recordError(`parts[${i}].type`, 'Minimum value is 0');
|
|
103
|
+
type = 0;
|
|
104
|
+
}
|
|
105
|
+
const value = (0, HexToBuffer_1.HexToBuffer)(part.value ? part.value : '');
|
|
106
|
+
//Length is honored when supplied (a crafted part may lie); else derived as
|
|
107
|
+
//the 4-byte header + value bytes. The layout always advances by the actual
|
|
108
|
+
//value bytes written, so a lying Length does not shift the next part.
|
|
109
|
+
const provided = part.length;
|
|
110
|
+
let length = (provided !== undefined && provided !== null) ? provided : 4 + value.length;
|
|
111
|
+
if (length > 65535) {
|
|
112
|
+
this.recordError(`parts[${i}].length`, 'Maximum value is 65535');
|
|
113
|
+
length = 65535;
|
|
114
|
+
}
|
|
115
|
+
if (length < 0) {
|
|
116
|
+
this.recordError(`parts[${i}].length`, 'Minimum value is 0');
|
|
117
|
+
length = 0;
|
|
118
|
+
}
|
|
119
|
+
this.writeBytes(offset, (0, NumberToBuffer_1.UInt16ToBuffer)(type));
|
|
120
|
+
this.writeBytes(offset + 2, (0, NumberToBuffer_1.UInt16ToBuffer)(length));
|
|
121
|
+
offset += 4;
|
|
122
|
+
if (value.length) {
|
|
123
|
+
this.writeBytes(offset, value);
|
|
124
|
+
offset += value.length;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const trailer = this.instance.trailer.getValue('');
|
|
129
|
+
if (trailer)
|
|
130
|
+
this.writeBytes(offset, (0, HexToBuffer_1.HexToBuffer)(trailer));
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
//Bytes after the last complete part (a truncated/malformed final part, or padding), kept
|
|
134
|
+
//verbatim. No codec of its own — it is set/read by the `parts` field (which owns the single
|
|
135
|
+
//offset walk); this entry is metadata so the editor sees the trailing bytes.
|
|
136
|
+
trailer: {
|
|
137
|
+
type: 'string',
|
|
138
|
+
label: 'Trailer',
|
|
139
|
+
contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
match() {
|
|
145
|
+
//collectd rides on UDP port 25826 (selected via the udpport:25826 bucket). Require the 4-byte
|
|
146
|
+
//minimum for one part header. The binary header carries no strong content magic, so the
|
|
147
|
+
//well-known port is the signature — stays a port-bucket protocol (matchKeys only, NO
|
|
148
|
+
//heuristicFallback: a 2-byte part type is far too weak to claim collectd off its port).
|
|
149
|
+
if (!this.prevCodecModule || this.prevCodecModule.id !== 'udp')
|
|
150
|
+
return false;
|
|
151
|
+
return this.packet.length - this.startPos >= 4;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
exports.Collectd = Collectd;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { BaseHeader } from '../abstracts/BaseHeader';
|
|
2
|
+
import { ProtocolJSONSchema } from '../schema/ProtocolJSONSchema';
|
|
3
|
+
import { DemuxProducer } from '../types/DemuxProducer';
|
|
4
|
+
/**
|
|
5
|
+
* DCCP — Datagram Congestion Control Protocol (RFC 4340), carried directly over IP as protocol 33. The
|
|
6
|
+
* generic header begins with Source Port (2), Destination Port (2), Data Offset (1, in 32-bit words —
|
|
7
|
+
* the length of the whole DCCP header including options), a byte split into CCVal (high 4 bits) and
|
|
8
|
+
* CsCov (low 4 bits), a 2-byte Checksum, and a byte split into Res (3 bits), Type (4 bits — 0 Request,
|
|
9
|
+
* 1 Response, 2 Data, 3 Ack, 4 DataAck, 5 CloseReq, 6 Close, 7 Reset) and X (1 bit, Extended Sequence
|
|
10
|
+
* Numbers). After that byte come the (X-dependent-width) Reserved + Sequence Number and any type-specific
|
|
11
|
+
* fields / options — everything up to Data Offset*4.
|
|
12
|
+
*
|
|
13
|
+
* To sidestep the X sequence-width branch and stay byte-perfect, this codec structures only the fixed
|
|
14
|
+
* 9-byte prefix (ports / data offset / ccval+cscov / checksum / res+type+x) and keeps the remainder of
|
|
15
|
+
* the header — Reserved, the Sequence/Ack numbers, per-type fields and options — verbatim as
|
|
16
|
+
* `headerOptions` hex (bytes 9 .. DataOffset*4). Application data after the header is kept as `payload`
|
|
17
|
+
* hex, bounded by the enclosing IP datagram so an inflated Data Offset can't read past the IP payload.
|
|
18
|
+
* The Checksum is honored verbatim, never recomputed; Data Offset is honored when supplied, else derived
|
|
19
|
+
* from the actual bytes. A well-formed datagram round-trips byte-for-byte.
|
|
20
|
+
*/
|
|
21
|
+
export declare class DCCP 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
|
+
}
|