@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,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
|
+
}
|