/// ************************************************************************
/// 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";
}
}
}
}