@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,275 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CAPWAP = 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
|
+
* CAPWAP — Control And Provisioning of Wireless Access Points (RFC 5415), UDP port 5246 (control) and
|
|
10
|
+
* 5247 (data). Every CAPWAP message begins with a fixed 8-byte header whose layout is a preamble octet
|
|
11
|
+
* followed by tightly bit-packed fields:
|
|
12
|
+
*
|
|
13
|
+
* - Preamble (octet 0): Version (high nibble) + Type (low nibble). Type 0 = a CAPWAP header follows,
|
|
14
|
+
* Type 1 = the payload is a DTLS record (the header below is then not present).
|
|
15
|
+
* - Octets 1-3 (24 bits): HLEN (5 bits, the whole CAPWAP header length in units of 4 octets),
|
|
16
|
+
* RID (5 bits, Radio ID), WBID (5 bits, Wireless Binding ID), then the flag bits T, F, L, W, M, K
|
|
17
|
+
* (1 bit each) and a 3-bit reserved Flags remainder.
|
|
18
|
+
* - Octets 4-5: Fragment ID (16 bits).
|
|
19
|
+
* - Octets 6-7: Fragment Offset (13 bits) + a 3-bit reserved field.
|
|
20
|
+
*
|
|
21
|
+
* When the M/W flags are set the header carries optional Radio MAC Address / Wireless Specific
|
|
22
|
+
* Information fields; HLEN delimits the whole header (HLEN × 4 octets), after which the payload begins
|
|
23
|
+
* (the control-plane Control Header + message elements, or the tunneled 802.3/802.11 data frame).
|
|
24
|
+
*
|
|
25
|
+
* This is the minimal, byte-faithful slice: the preamble and every bit-packed field are modelled so an
|
|
26
|
+
* editor can see/round-trip them, the optional per-flag header fields are kept verbatim as
|
|
27
|
+
* `headerRemainder` hex (bounded by HLEN × 4), and everything after the header is kept verbatim as
|
|
28
|
+
* `payload` hex (bounded by the UDP datagram so a retained trailer is not absorbed). Sub-decoding the
|
|
29
|
+
* Control Header / message elements or the tunneled frame is deferred, so CAPWAP is effectively a leaf.
|
|
30
|
+
* HLEN is honored verbatim when supplied (a crafted header may lie) else derived from the header bytes;
|
|
31
|
+
* a well-formed message round-trips byte-for-byte.
|
|
32
|
+
*/
|
|
33
|
+
class CAPWAP extends BaseHeader_1.BaseHeader {
|
|
34
|
+
constructor() {
|
|
35
|
+
super(...arguments);
|
|
36
|
+
this.id = 'capwap';
|
|
37
|
+
this.name = 'Control And Provisioning of Wireless Access Points';
|
|
38
|
+
this.nickname = 'CAPWAP';
|
|
39
|
+
//Well-known UDP ports 5246 (control) and 5247 (data). No content magic, so selection is
|
|
40
|
+
//port-bucketed only (no heuristicFallback).
|
|
41
|
+
this.matchKeys = ['udpport:5246', 'udpport:5247'];
|
|
42
|
+
//A leaf header — the Control Header / message elements and the tunneled frame are kept verbatim.
|
|
43
|
+
this.demuxProducers = [];
|
|
44
|
+
}
|
|
45
|
+
static #schemaCache;
|
|
46
|
+
get SCHEMA() {
|
|
47
|
+
return (CAPWAP.#schemaCache ??= CAPWAP.#buildSchema());
|
|
48
|
+
}
|
|
49
|
+
/** The payload length bounded by the UDP datagram (so a retained trailer/padding is not absorbed). */
|
|
50
|
+
#payloadBound() {
|
|
51
|
+
let available = this.packet.length - this.startPos;
|
|
52
|
+
if (this.prevCodecModule && this.prevCodecModule.id === 'udp') {
|
|
53
|
+
const udpLength = this.prevCodecModule.instance.length.getValue(0);
|
|
54
|
+
if (udpLength >= 8 && udpLength - 8 < available)
|
|
55
|
+
available = udpLength - 8;
|
|
56
|
+
}
|
|
57
|
+
return available < 0 ? 0 : available;
|
|
58
|
+
}
|
|
59
|
+
/** A single flag bit within the 24-bit field packed across octets 1-3 (bit 0 = MSB of octet 1). */
|
|
60
|
+
static #flagBit(name, bitOffset, label) {
|
|
61
|
+
return {
|
|
62
|
+
type: 'boolean',
|
|
63
|
+
label: label,
|
|
64
|
+
decode: function () {
|
|
65
|
+
this.instance.flags[name].setValue(!!this.readBits(1, 3, bitOffset, 1));
|
|
66
|
+
},
|
|
67
|
+
encode: function () {
|
|
68
|
+
const value = !!this.instance.flags[name].getValue();
|
|
69
|
+
this.instance.flags[name].setValue(value);
|
|
70
|
+
this.writeBits(1, 3, bitOffset, 1, value ? 1 : 0);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
static #buildSchema() {
|
|
75
|
+
return {
|
|
76
|
+
type: 'object',
|
|
77
|
+
summary: 'CAPWAP v${version} type=${type} hlen=${hlen}',
|
|
78
|
+
properties: {
|
|
79
|
+
//Preamble (octet 0): Version (high nibble) + Type (low nibble, 0 = CAPWAP header, 1 = DTLS).
|
|
80
|
+
version: {
|
|
81
|
+
type: 'integer',
|
|
82
|
+
label: 'Version',
|
|
83
|
+
minimum: 0,
|
|
84
|
+
maximum: 15,
|
|
85
|
+
decode: function () {
|
|
86
|
+
this.instance.version.setValue(this.readBits(0, 1, 0, 4));
|
|
87
|
+
},
|
|
88
|
+
encode: function () {
|
|
89
|
+
this.writeBits(0, 1, 0, 4, this.instance.version.getValue(0));
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
type: {
|
|
93
|
+
type: 'integer',
|
|
94
|
+
label: 'Type',
|
|
95
|
+
minimum: 0,
|
|
96
|
+
maximum: 15,
|
|
97
|
+
decode: function () {
|
|
98
|
+
this.instance.type.setValue(this.readBits(0, 1, 4, 4));
|
|
99
|
+
},
|
|
100
|
+
encode: function () {
|
|
101
|
+
this.writeBits(0, 1, 4, 4, this.instance.type.getValue(0));
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
//HLEN (octet 1-3 bits 0-4): the whole CAPWAP header length in units of 4 octets. Honored
|
|
105
|
+
//verbatim when supplied (a crafted header may lie); else derived from the 8-byte fixed
|
|
106
|
+
//header plus the verbatim optional (headerRemainder) bytes. HLEN × 4 delimits the header.
|
|
107
|
+
hlen: {
|
|
108
|
+
type: 'integer',
|
|
109
|
+
label: 'HLEN',
|
|
110
|
+
minimum: 0,
|
|
111
|
+
maximum: 31,
|
|
112
|
+
decode: function () {
|
|
113
|
+
this.instance.hlen.setValue(this.readBits(1, 3, 0, 5));
|
|
114
|
+
},
|
|
115
|
+
encode: function () {
|
|
116
|
+
const provided = this.instance.hlen.getValue();
|
|
117
|
+
let value = (provided !== undefined && provided !== null)
|
|
118
|
+
? provided
|
|
119
|
+
: Math.ceil((8 + (0, HexToBuffer_1.HexToBuffer)(this.instance.headerRemainder.getValue('')).length) / 4);
|
|
120
|
+
if (value > 31) {
|
|
121
|
+
this.recordError(this.instance.hlen.getPath(), 'Maximum value is 31');
|
|
122
|
+
value = 31;
|
|
123
|
+
}
|
|
124
|
+
if (value < 0) {
|
|
125
|
+
this.recordError(this.instance.hlen.getPath(), 'Minimum value is 0');
|
|
126
|
+
value = 0;
|
|
127
|
+
}
|
|
128
|
+
this.instance.hlen.setValue(value);
|
|
129
|
+
this.writeBits(1, 3, 0, 5, value);
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
//RID (octet 1-3 bits 5-9): Radio ID.
|
|
133
|
+
rid: {
|
|
134
|
+
type: 'integer',
|
|
135
|
+
label: 'RID',
|
|
136
|
+
minimum: 0,
|
|
137
|
+
maximum: 31,
|
|
138
|
+
decode: function () {
|
|
139
|
+
this.instance.rid.setValue(this.readBits(1, 3, 5, 5));
|
|
140
|
+
},
|
|
141
|
+
encode: function () {
|
|
142
|
+
this.writeBits(1, 3, 5, 5, this.instance.rid.getValue(0));
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
//WBID (octet 1-3 bits 10-14): Wireless Binding ID (1 = IEEE 802.11).
|
|
146
|
+
wbid: {
|
|
147
|
+
type: 'integer',
|
|
148
|
+
label: 'WBID',
|
|
149
|
+
minimum: 0,
|
|
150
|
+
maximum: 31,
|
|
151
|
+
decode: function () {
|
|
152
|
+
this.instance.wbid.setValue(this.readBits(1, 3, 10, 5));
|
|
153
|
+
},
|
|
154
|
+
encode: function () {
|
|
155
|
+
this.writeBits(1, 3, 10, 5, this.instance.wbid.getValue(0));
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
//Flag bits (octet 1-3 bits 15-20): T (payload type), F (fragment), L (last fragment),
|
|
159
|
+
//W (Wireless Specific Info present), M (Radio MAC present), K (keep-alive).
|
|
160
|
+
flags: {
|
|
161
|
+
type: 'object',
|
|
162
|
+
label: 'Flags',
|
|
163
|
+
properties: {
|
|
164
|
+
t: this.#flagBit('t', 15, 'T (Payload Type)'),
|
|
165
|
+
f: this.#flagBit('f', 16, 'F (Fragment)'),
|
|
166
|
+
l: this.#flagBit('l', 17, 'L (Last Fragment)'),
|
|
167
|
+
w: this.#flagBit('w', 18, 'W (Wireless Specific Info)'),
|
|
168
|
+
m: this.#flagBit('m', 19, 'M (Radio MAC Present)'),
|
|
169
|
+
k: this.#flagBit('k', 20, 'K (Keep-Alive)')
|
|
170
|
+
}
|
|
171
|
+
},
|
|
172
|
+
//Flags reserved remainder (octet 1-3 bits 21-23). RFC 5415 requires 0, kept verbatim.
|
|
173
|
+
flagsReserved: {
|
|
174
|
+
type: 'integer',
|
|
175
|
+
label: 'Flags Reserved',
|
|
176
|
+
minimum: 0,
|
|
177
|
+
maximum: 7,
|
|
178
|
+
hidden: true,
|
|
179
|
+
decode: function () {
|
|
180
|
+
this.instance.flagsReserved.setValue(this.readBits(1, 3, 21, 3));
|
|
181
|
+
},
|
|
182
|
+
encode: function () {
|
|
183
|
+
this.writeBits(1, 3, 21, 3, this.instance.flagsReserved.getValue(0));
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
//Fragment ID (octet 4-5): identifies fragments of a single CAPWAP message.
|
|
187
|
+
fragmentId: this.fieldUInt('fragmentId', 4, 2, 'Fragment ID'),
|
|
188
|
+
//Fragment Offset (octet 6-7 bits 0-12): the fragment's offset in units of 8 octets.
|
|
189
|
+
fragmentOffset: {
|
|
190
|
+
type: 'integer',
|
|
191
|
+
label: 'Fragment Offset',
|
|
192
|
+
minimum: 0,
|
|
193
|
+
maximum: 8191,
|
|
194
|
+
decode: function () {
|
|
195
|
+
this.instance.fragmentOffset.setValue(this.readBits(6, 2, 0, 13));
|
|
196
|
+
},
|
|
197
|
+
encode: function () {
|
|
198
|
+
this.writeBits(6, 2, 0, 13, this.instance.fragmentOffset.getValue(0));
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
//Reserved (octet 6-7 bits 13-15). RFC 5415 requires 0, kept verbatim.
|
|
202
|
+
reserved: {
|
|
203
|
+
type: 'integer',
|
|
204
|
+
label: 'Reserved',
|
|
205
|
+
minimum: 0,
|
|
206
|
+
maximum: 7,
|
|
207
|
+
hidden: true,
|
|
208
|
+
decode: function () {
|
|
209
|
+
this.instance.reserved.setValue(this.readBits(6, 2, 13, 3));
|
|
210
|
+
},
|
|
211
|
+
encode: function () {
|
|
212
|
+
this.writeBits(6, 2, 13, 3, this.instance.reserved.getValue(0));
|
|
213
|
+
}
|
|
214
|
+
},
|
|
215
|
+
//The optional per-flag header fields (Radio MAC Address / Wireless Specific Information),
|
|
216
|
+
//kept verbatim and bounded by HLEN × 4. Empty for the minimal 8-byte header (HLEN = 2).
|
|
217
|
+
headerRemainder: {
|
|
218
|
+
type: 'string',
|
|
219
|
+
label: 'Header Remainder',
|
|
220
|
+
contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX,
|
|
221
|
+
decode: function () {
|
|
222
|
+
const hlen = this.instance.hlen.getValue(0);
|
|
223
|
+
const available = this.packet.length - this.startPos;
|
|
224
|
+
let headerEnd = hlen * 4;
|
|
225
|
+
if (headerEnd < 8)
|
|
226
|
+
headerEnd = 8;
|
|
227
|
+
if (headerEnd > available)
|
|
228
|
+
headerEnd = available;
|
|
229
|
+
this.instance.headerRemainder.setValue(headerEnd > 8 ? (0, BufferToHex_1.BufferToHex)(this.readBytes(8, headerEnd - 8)) : '');
|
|
230
|
+
},
|
|
231
|
+
encode: function () {
|
|
232
|
+
const headerRemainder = this.instance.headerRemainder.getValue('');
|
|
233
|
+
if (headerRemainder)
|
|
234
|
+
this.writeBytes(8, (0, HexToBuffer_1.HexToBuffer)(headerRemainder));
|
|
235
|
+
}
|
|
236
|
+
},
|
|
237
|
+
//Everything after the CAPWAP header (Control Header + message elements, or the tunneled
|
|
238
|
+
//802.3/802.11 data frame), kept verbatim. Bounded by the UDP datagram so a retained
|
|
239
|
+
//trailer is not absorbed; sub-decoding is deferred (CAPWAP is effectively a leaf here).
|
|
240
|
+
payload: {
|
|
241
|
+
type: 'string',
|
|
242
|
+
label: 'Payload',
|
|
243
|
+
contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX,
|
|
244
|
+
decode: function () {
|
|
245
|
+
const hlen = this.instance.hlen.getValue(0);
|
|
246
|
+
let headerEnd = hlen * 4;
|
|
247
|
+
if (headerEnd < 8)
|
|
248
|
+
headerEnd = 8;
|
|
249
|
+
const end = this.#payloadBound();
|
|
250
|
+
if (headerEnd > end)
|
|
251
|
+
headerEnd = end;
|
|
252
|
+
this.instance.payload.setValue(end > headerEnd ? (0, BufferToHex_1.BufferToHex)(this.readBytes(headerEnd, end - headerEnd)) : '');
|
|
253
|
+
},
|
|
254
|
+
encode: function () {
|
|
255
|
+
const hlen = this.instance.hlen.getValue(0);
|
|
256
|
+
let headerEnd = hlen * 4;
|
|
257
|
+
if (headerEnd < 8)
|
|
258
|
+
headerEnd = 8;
|
|
259
|
+
const payload = this.instance.payload.getValue('');
|
|
260
|
+
if (payload)
|
|
261
|
+
this.writeBytes(headerEnd, (0, HexToBuffer_1.HexToBuffer)(payload));
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
match() {
|
|
268
|
+
//Require the fixed 8-byte header within the UDP payload (not just the captured frame — a padded
|
|
269
|
+
//sub-8-byte datagram on a CAPWAP port would otherwise over-read the trailer into the header).
|
|
270
|
+
if (!this.prevCodecModule || this.prevCodecModule.id !== 'udp')
|
|
271
|
+
return false;
|
|
272
|
+
return this.#payloadBound() >= 8;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
exports.CAPWAP = CAPWAP;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { BaseHeader } from '../abstracts/BaseHeader';
|
|
2
|
+
import { ProtocolJSONSchema } from '../schema/ProtocolJSONSchema';
|
|
3
|
+
import { DemuxProducer } from '../types/DemuxProducer';
|
|
4
|
+
/**
|
|
5
|
+
* CDP — Cisco Discovery Protocol, carried in an 802.3 frame over LLC/SNAP with OUI 0x00000C and PID
|
|
6
|
+
* 0x2000. A 4-byte header — Version (1), Time-to-Live (1) and a 2-byte Checksum — is followed by a
|
|
7
|
+
* sequence of TLVs, each a 2-byte Type + 2-byte Length (the whole TLV octet count including this 4-byte
|
|
8
|
+
* TLV header) + value. Common types: 0x0001 Device ID, 0x0002 Addresses, 0x0003 Port ID, 0x0004
|
|
9
|
+
* Capabilities, 0x0005 Software Version, 0x0006 Platform.
|
|
10
|
+
*
|
|
11
|
+
* The TLV values are kept verbatim as hex (device names, address lists and capability bitmaps need no
|
|
12
|
+
* form structure), the Checksum is honored verbatim (never recomputed), and the TLV walk is bounded by
|
|
13
|
+
* the captured bytes so a corrupt Length can't run past the frame. A well-formed CDP frame round-trips
|
|
14
|
+
* byte-for-byte.
|
|
15
|
+
*/
|
|
16
|
+
export declare class CDP 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
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CDP = 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
|
+
* CDP — Cisco Discovery Protocol, carried in an 802.3 frame over LLC/SNAP with OUI 0x00000C and PID
|
|
12
|
+
* 0x2000. A 4-byte header — Version (1), Time-to-Live (1) and a 2-byte Checksum — is followed by a
|
|
13
|
+
* sequence of TLVs, each a 2-byte Type + 2-byte Length (the whole TLV octet count including this 4-byte
|
|
14
|
+
* TLV header) + value. Common types: 0x0001 Device ID, 0x0002 Addresses, 0x0003 Port ID, 0x0004
|
|
15
|
+
* Capabilities, 0x0005 Software Version, 0x0006 Platform.
|
|
16
|
+
*
|
|
17
|
+
* The TLV values are kept verbatim as hex (device names, address lists and capability bitmaps need no
|
|
18
|
+
* form structure), the Checksum is honored verbatim (never recomputed), and the TLV walk is bounded by
|
|
19
|
+
* the captured bytes so a corrupt Length can't run past the frame. A well-formed CDP frame round-trips
|
|
20
|
+
* byte-for-byte.
|
|
21
|
+
*/
|
|
22
|
+
class CDP extends BaseHeader_1.BaseHeader {
|
|
23
|
+
constructor() {
|
|
24
|
+
super(...arguments);
|
|
25
|
+
this.id = 'cdp';
|
|
26
|
+
this.name = 'Cisco Discovery Protocol';
|
|
27
|
+
this.nickname = 'CDP';
|
|
28
|
+
this.matchKeys = ['snapoui:00000c2000'];
|
|
29
|
+
//A leaf — CDP TLVs carry no encapsulated protocol.
|
|
30
|
+
this.demuxProducers = [];
|
|
31
|
+
}
|
|
32
|
+
static #schemaCache;
|
|
33
|
+
get SCHEMA() {
|
|
34
|
+
return (CDP.#schemaCache ??= CDP.#buildSchema());
|
|
35
|
+
}
|
|
36
|
+
static #buildSchema() {
|
|
37
|
+
return {
|
|
38
|
+
type: 'object',
|
|
39
|
+
summary: 'CDP v${version} ttl=${ttl}',
|
|
40
|
+
properties: {
|
|
41
|
+
version: this.fieldUInt('version', 0, 1, 'Version'),
|
|
42
|
+
ttl: this.fieldUInt('ttl', 1, 1, 'TTL'),
|
|
43
|
+
//Honored verbatim — the ones-complement checksum is never recomputed, so a captured frame
|
|
44
|
+
//round-trips byte-for-byte.
|
|
45
|
+
checksum: this.fieldHex('checksum', 2, 2, 'Checksum'),
|
|
46
|
+
tlvs: {
|
|
47
|
+
type: 'array',
|
|
48
|
+
label: 'TLVs',
|
|
49
|
+
items: {
|
|
50
|
+
type: 'object',
|
|
51
|
+
properties: {
|
|
52
|
+
type: { type: 'integer', label: 'Type', minimum: 0, maximum: 65535 },
|
|
53
|
+
length: { type: 'integer', label: 'Length', minimum: 0, maximum: 65535 },
|
|
54
|
+
value: { type: 'string', label: 'Value', contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX }
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
decode: function () {
|
|
58
|
+
const available = this.packet.length - this.startPos;
|
|
59
|
+
const tlvs = [];
|
|
60
|
+
let offset = 4;
|
|
61
|
+
while (offset + 4 <= available) {
|
|
62
|
+
const type = (0, BufferToNumber_1.BufferToUInt16)(this.readBytes(offset, 2, true));
|
|
63
|
+
const length = (0, BufferToNumber_1.BufferToUInt16)(this.readBytes(offset + 2, 2, true));
|
|
64
|
+
//A Length below the 4-byte TLV header is malformed — record and stop.
|
|
65
|
+
if (length < 4) {
|
|
66
|
+
this.recordError(this.instance.tlvs.getPath(), `Invalid TLV length ${length}`);
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
let end = offset + length;
|
|
70
|
+
if (end > available)
|
|
71
|
+
end = available;
|
|
72
|
+
const value = end > offset + 4 ? (0, BufferToHex_1.BufferToHex)(this.readBytes(offset + 4, end - (offset + 4))) : '';
|
|
73
|
+
tlvs.push({ type: type, length: length, value: value });
|
|
74
|
+
offset += length;
|
|
75
|
+
}
|
|
76
|
+
//Mark the whole consumed TLV region so an empty-value trailing TLV is not re-decoded
|
|
77
|
+
//as trailing RawData and duplicated on encode (the headers above are dryRun peeks).
|
|
78
|
+
const consumedEnd = offset < available ? offset : available;
|
|
79
|
+
if (consumedEnd > 4)
|
|
80
|
+
this.readBytes(4, consumedEnd - 4);
|
|
81
|
+
this.instance.tlvs.setValue(tlvs);
|
|
82
|
+
},
|
|
83
|
+
encode: function () {
|
|
84
|
+
const tlvs = this.instance.tlvs.getValue();
|
|
85
|
+
if (!Array.isArray(tlvs))
|
|
86
|
+
return;
|
|
87
|
+
let offset = 4;
|
|
88
|
+
for (const tlv of tlvs) {
|
|
89
|
+
const valueBuffer = (0, HexToBuffer_1.HexToBuffer)(tlv && tlv.value ? String(tlv.value) : '');
|
|
90
|
+
const providedLength = Number(tlv && tlv.length);
|
|
91
|
+
const lengthValue = (Number.isFinite(providedLength) && providedLength > 0)
|
|
92
|
+
? providedLength
|
|
93
|
+
: 4 + valueBuffer.length;
|
|
94
|
+
const type = Number(tlv && tlv.type) || 0;
|
|
95
|
+
this.writeBytes(offset, (0, NumberToBuffer_1.UInt16ToBuffer)(type & 0xffff));
|
|
96
|
+
this.writeBytes(offset + 2, (0, NumberToBuffer_1.UInt16ToBuffer)(lengthValue > 65535 ? 65535 : lengthValue));
|
|
97
|
+
if (valueBuffer.length)
|
|
98
|
+
this.writeBytes(offset + 4, valueBuffer);
|
|
99
|
+
offset += 4 + valueBuffer.length;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
match() {
|
|
107
|
+
//A SNAP child under Cisco OUI 0x00000C + PID 0x2000. Re-verify the OUI/PID off the SNAP parent
|
|
108
|
+
//rather than trusting the key alone, and require the 4-byte CDP header.
|
|
109
|
+
const prev = this.prevCodecModule;
|
|
110
|
+
if (!prev || prev.id !== 'snap')
|
|
111
|
+
return false;
|
|
112
|
+
if (prev.instance.oui.getValue('') !== '00000c' || prev.instance.etherType.getValue('') !== '2000')
|
|
113
|
+
return false;
|
|
114
|
+
return this.packet.length - this.startPos >= 4;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
exports.CDP = CDP;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { BaseHeader } from '../abstracts/BaseHeader';
|
|
2
|
+
import { ProtocolJSONSchema } from '../schema/ProtocolJSONSchema';
|
|
3
|
+
import { DemuxProducer } from '../types/DemuxProducer';
|
|
4
|
+
/**
|
|
5
|
+
* CMS — China smart-substation communication (DL/T 2811-2024, "变电站二次系统通信报文规范"), the
|
|
6
|
+
* State-Grid replacement for IEC 61850 MMS that maps ACSI directly onto TCP (port 8102), dropping the
|
|
7
|
+
* OSI upper layers. Per DL/T 2811 §6.1, an Application Protocol Data Unit (APDU) is an Application
|
|
8
|
+
* Protocol Control Header (APCH) followed by an Application Service Data Unit (ASDU):
|
|
9
|
+
*
|
|
10
|
+
* APCH (4 bytes): Control Code CC — Next(bit8) + Resp(bit7) + Err(bit6) + bak(bit5) + a 4-bit Protocol
|
|
11
|
+
* type PI (low nibble, = 0x01); Service Code SC (1 byte, §6.1.2 Table 1: 1 Associate,
|
|
12
|
+
* 2 Abort, 3 Release, 48 GetDataValues, 83 GetAllDataValues, 154 AssociateNegotiate,
|
|
13
|
+
* 155 GetAllDataDefinition, …); Frame Length FL (2 bytes, little-endian, the APDU
|
|
14
|
+
* length excluding the APCH).
|
|
15
|
+
* ASDU (FL bytes): Service Request Id ReqID (2 bytes, little-endian, §6.2 — 1..65535, 0 for Report)
|
|
16
|
+
* + the service data area (encoded per the SC, kept verbatim here).
|
|
17
|
+
*
|
|
18
|
+
* An empty frame (§6.3) has FL=0 (APCH only) or FL=2 (APCH+ReqID). A large ASDU is framed (§6.5) with
|
|
19
|
+
* the Next bit set. A CMS PDU can also exceed one TCP segment; this single-packet stateless codec
|
|
20
|
+
* structures the APCH + the ASDU bytes present in the packet, leaving TCP-stream reassembly to a higher
|
|
21
|
+
* layer (mid-PDU continuation segments carry no APCH — their first byte's low nibble is not the PI 0x01
|
|
22
|
+
* — so they fall to raw). A single frame round-trips byte-for-byte.
|
|
23
|
+
*/
|
|
24
|
+
export declare class CMS extends BaseHeader {
|
|
25
|
+
#private;
|
|
26
|
+
get SCHEMA(): ProtocolJSONSchema;
|
|
27
|
+
readonly id: string;
|
|
28
|
+
readonly name: string;
|
|
29
|
+
readonly nickname: string;
|
|
30
|
+
readonly matchKeys: string[];
|
|
31
|
+
match(): boolean;
|
|
32
|
+
readonly demuxProducers: DemuxProducer[];
|
|
33
|
+
}
|