/// ************************************************************************ /// Copyright (C) 2001, Patrick Charles and Jonas Lehmann * /// Distributed under the Mozilla Public License * /// http://www.mozilla.org/NPL/MPL-1.1.txt * /// ************************************************************************* /// using SharpPcap.Packets.Util; namespace SharpPcap.Packets { /// IPProtocol utility class. /// /// public class IPProtocol { public enum IPProtocolType { /// Dummy protocol for TCP. IP = 0, /// IPv6 Hop-by-Hop options. HOPOPTS = 0, /// Internet Control Message Protocol. ICMP = 1, /// Internet Group Management Protocol. IGMP = 2, /// IPIP tunnels (older KA9Q tunnels use 94). IPIP = 4, /// Transmission Control Protocol. TCP = 6, /// Exterior Gateway Protocol. EGP = 8, /// PUP protocol. PUP = 12, /// User Datagram Protocol. UDP = 17, /// XNS IDP protocol. IDP = 22, /// SO Transport Protocol Class 4. TP = 29, /// IPv6 header. IPV6 = 41, /// IPv6 routing header. ROUTING = 43, /// IPv6 fragmentation header. FRAGMENT = 44, /// Reservation Protocol. RSVP = 46, /// General Routing Encapsulation. GRE = 47, /// encapsulating security payload. ESP = 50, /// authentication header. AH = 51, /// ICMPv6. ICMPV6 = 58, /// IPv6 no next header. NONE = 59, /// IPv6 destination options. DSTOPTS = 60, /// Multicast Transport Protocol. MTP = 92, /// Encapsulation Header. ENCAP = 98, /// Protocol Independent Multicast. PIM = 103, /// Compression Header Protocol. COMP = 108, /// Raw IP packets. RAW = 255, /// Unrecognized IP protocol. /// WARNING: this only works because the int storage for the protocol /// code has more bits than the field in the IP header where it is stored. /// INVALID = -1, /// IP protocol mask. MASK = 0xff } /// Fetch a protocol description. /// the code associated with the message. /// /// a message describing the significance of the IP protocol. /// public static System.String getDescription(int code) { System.Int32 c = (System.Int32) code; if (messages.ContainsKey(c)) { return (System.String) messages[c]; } else { return "unknown"; } } /// 'Human-readable' IP protocol descriptions. private static System.Collections.Hashtable messages = new System.Collections.Hashtable(); /// Extract the protocol code from packet data. The packet data /// must contain an IP datagram. /// The protocol code specifies what kind of information is contained in the /// data block of the ip datagram. /// /// /// the length of the link-level header. /// /// packet bytes, including the link-layer header. /// /// the IP protocol code. i.e. 0x06 signifies TCP protocol. /// public static int extractProtocol(int lLen, byte[] packetBytes) { IPPacket.IPVersions ipVer = ExtractVersion(lLen, packetBytes); int protoOffset; switch (ipVer) { case IPPacket.IPVersions.IPv4: protoOffset = IPv4Fields_Fields.IP_CODE_POS; break; case IPPacket.IPVersions.IPv6: protoOffset = IPv6Fields_Fields.NEXT_HEADER_POS; break; default: return -1;//unknown ip version } return packetBytes[lLen + protoOffset]; } public static IPPacket.IPVersions ExtractVersion(int lLen, byte[] packetBytes) { return (IPPacket.IPVersions)((ArrayHelper.extractInteger(packetBytes, lLen + IPv4Fields_Fields.IP_VER_POS, IPv4Fields_Fields.IP_VER_LEN) >> 4) & 0xf); } static IPProtocol() { { messages[(System.Int32) IPProtocolType.IP] = "Dummy protocol for TCP"; messages[(System.Int32) IPProtocolType.HOPOPTS] = "IPv6 Hop-by-Hop options"; messages[(System.Int32) IPProtocolType.ICMP] = "Internet Control Message Protocol"; messages[(System.Int32) IPProtocolType.IGMP] = "Internet Group Management Protocol"; messages[(System.Int32) IPProtocolType.IPIP] = "IPIP tunnels"; messages[(System.Int32) IPProtocolType.TCP] = "Transmission Control Protocol"; messages[(System.Int32) IPProtocolType.EGP] = "Exterior Gateway Protocol"; messages[(System.Int32) IPProtocolType.PUP] = "PUP protocol"; messages[(System.Int32) IPProtocolType.UDP] = "User Datagram Protocol"; messages[(System.Int32) IPProtocolType.IDP] = "XNS IDP protocol"; messages[(System.Int32) IPProtocolType.TP] = "SO Transport Protocol Class 4"; messages[(System.Int32) IPProtocolType.IPV6] = "IPv6 header"; messages[(System.Int32) IPProtocolType.ROUTING] = "IPv6 routing header"; messages[(System.Int32) IPProtocolType.FRAGMENT] = "IPv6 fragmentation header"; messages[(System.Int32) IPProtocolType.RSVP] = "Reservation Protocol"; messages[(System.Int32) IPProtocolType.GRE] = "General Routing Encapsulation"; messages[(System.Int32) IPProtocolType.ESP] = "encapsulating security payload"; messages[(System.Int32) IPProtocolType.AH] = "authentication header"; messages[(System.Int32) IPProtocolType.ICMPV6] = "ICMPv6"; messages[(System.Int32) IPProtocolType.NONE] = "IPv6 no next header"; messages[(System.Int32) IPProtocolType.DSTOPTS] = "IPv6 destination options"; messages[(System.Int32) IPProtocolType.MTP] = "Multicast Transport Protocol"; messages[(System.Int32) IPProtocolType.ENCAP] = "Encapsulation Header"; messages[(System.Int32) IPProtocolType.PIM] = "Protocol Independent Multicast"; messages[(System.Int32) IPProtocolType.COMP] = "Compression Header Protocol"; messages[(System.Int32) IPProtocolType.RAW] = "Raw IP Packet"; // messages[(System.Int32) IPProtocolType.INVALID] = "INVALID IP"; } } } }