blob: 9768aee2ff051d08d27c6086f42f33dc53586345 [file] [log] [blame]
package org.projectfloodlight.openflow.types;
import org.jboss.netty.buffer.ChannelBuffer;
import com.google.common.hash.PrimitiveSink;
import com.google.common.primitives.Shorts;
public class ICMPv4Type implements OFValueType<ICMPv4Type> {
final static int LENGTH = 1;
private static final short ICMPV4_TYPE_VAL_ECHO_REPLY = 0;
private static final short ICMPV4_TYPE_VAL_DESTINATION_UNREACHABLE = 3;
private static final short ICMPV4_TYPE_VAL_SOURCE_QUENCH = 4;
private static final short ICMPV4_TYPE_VAL_REDIRECT = 5;
private static final short ICMPV4_TYPE_VAL_ALTERNATE_HOST_ADDRESS = 6;
private static final short ICMPV4_TYPE_VAL_ECHO = 8;
private static final short ICMPV4_TYPE_VAL_ROUTER_ADVERTISEMENT = 9;
private static final short ICMPV4_TYPE_VAL_ROUTER_SOLICITATION = 10;
private static final short ICMPV4_TYPE_VAL_TIME_EXCEEDED = 11;
private static final short ICMPV4_TYPE_VAL_PARAMETER_PROBLEM = 12;
private static final short ICMPV4_TYPE_VAL_TIMESTAMP = 13;
private static final short ICMPV4_TYPE_VAL_TIMESTAMP_REPLY = 14;
private static final short ICMPV4_TYPE_VAL_INFORMATION_REQUEST = 15;
private static final short ICMPV4_TYPE_VAL_INFORMATION_REPLY = 16;
private static final short ICMPV4_TYPE_VAL_ADDRESS_MASK_REQUEST = 17;
private static final short ICMPV4_TYPE_VAL_ADDRESS_MASK_REPLY = 18;
private static final short ICMPV4_TYPE_VAL_TRACEROUTE = 30;
private static final short ICMPV4_TYPE_VAL_DATAGRAM_CONVERSION_ERROR = 31;
private static final short ICMPV4_TYPE_VAL_MOBILE_HOST_REDIRECT = 32;
private static final short ICMPV4_TYPE_VAL_IPV6_WHERE_ARE_YOU = 33;
private static final short ICMPV4_TYPE_VAL_IPV6_I_AM_HERE = 34;
private static final short ICMPV4_TYPE_VAL_MOBILE_REGISTRATION_REQUEST = 35;
private static final short ICMPV4_TYPE_VAL_MOBILE_REGISTRATION_REPLY = 36;
private static final short ICMPV4_TYPE_VAL_DOMAIN_NAME_REQUEST = 37;
private static final short ICMPV4_TYPE_VAL_DOMAIN_NAME_REPLY = 38;
private static final short ICMPV4_TYPE_VAL_SKIP = 39;
private static final short ICMPV4_TYPE_VAL_PHOTURIS = 40;
private static final short ICMPV4_TYPE_VAL_EXPERIMENTAL_MOBILITY = 41;
public static final ICMPv4Type ICMPV4_TYPE_ECHO_REPLY = new ICMPv4Type(ICMPV4_TYPE_VAL_ECHO_REPLY);
public static final ICMPv4Type ICMPV4_TYPE_DESTINATION_UNREACHABLE = new ICMPv4Type(ICMPV4_TYPE_VAL_DESTINATION_UNREACHABLE);
public static final ICMPv4Type ICMPV4_TYPE_SOURCE_QUENCH = new ICMPv4Type(ICMPV4_TYPE_VAL_SOURCE_QUENCH);
public static final ICMPv4Type ICMPV4_TYPE_REDIRECT = new ICMPv4Type(ICMPV4_TYPE_VAL_REDIRECT);
public static final ICMPv4Type ICMPV4_TYPE_ALTERNATE_HOST_ADDRESS = new ICMPv4Type(ICMPV4_TYPE_VAL_ALTERNATE_HOST_ADDRESS);
public static final ICMPv4Type ICMPV4_TYPE_ECHO = new ICMPv4Type(ICMPV4_TYPE_VAL_ECHO);
public static final ICMPv4Type ICMPV4_TYPE_ROUTER_ADVERTISEMENT = new ICMPv4Type(ICMPV4_TYPE_VAL_ROUTER_ADVERTISEMENT);
public static final ICMPv4Type ICMPV4_TYPE_ROUTER_SOLICITATION = new ICMPv4Type(ICMPV4_TYPE_VAL_ROUTER_SOLICITATION);
public static final ICMPv4Type ICMPV4_TYPE_TIME_EXCEEDED = new ICMPv4Type(ICMPV4_TYPE_VAL_TIME_EXCEEDED);
public static final ICMPv4Type ICMPV4_TYPE_PARAMETER_PROBLEM = new ICMPv4Type(ICMPV4_TYPE_VAL_PARAMETER_PROBLEM);
public static final ICMPv4Type ICMPV4_TYPE_TIMESTAMP = new ICMPv4Type(ICMPV4_TYPE_VAL_TIMESTAMP);
public static final ICMPv4Type ICMPV4_TYPE_TIMESTAMP_REPLY = new ICMPv4Type(ICMPV4_TYPE_VAL_TIMESTAMP_REPLY);
public static final ICMPv4Type ICMPV4_TYPE_INFORMATION_REQUEST = new ICMPv4Type(ICMPV4_TYPE_VAL_INFORMATION_REQUEST);
public static final ICMPv4Type ICMPV4_TYPE_INFORMATION_REPLY = new ICMPv4Type(ICMPV4_TYPE_VAL_INFORMATION_REPLY);
public static final ICMPv4Type ICMPV4_TYPE_ADDRESS_MASK_REQUEST = new ICMPv4Type(ICMPV4_TYPE_VAL_ADDRESS_MASK_REQUEST);
public static final ICMPv4Type ICMPV4_TYPE_ADDRESS_MASK_REPLY = new ICMPv4Type(ICMPV4_TYPE_VAL_ADDRESS_MASK_REPLY);
public static final ICMPv4Type ICMPV4_TYPE_TRACEROUTE = new ICMPv4Type(ICMPV4_TYPE_VAL_TRACEROUTE);
public static final ICMPv4Type ICMPV4_TYPE_DATAGRAM_CONVERSION_ERROR = new ICMPv4Type(ICMPV4_TYPE_VAL_DATAGRAM_CONVERSION_ERROR);
public static final ICMPv4Type ICMPV4_TYPE_MOBILE_HOST_REDIRECT = new ICMPv4Type(ICMPV4_TYPE_VAL_MOBILE_HOST_REDIRECT);
public static final ICMPv4Type ICMPV4_TYPE_IPV6_WHERE_ARE_YOU = new ICMPv4Type(ICMPV4_TYPE_VAL_IPV6_WHERE_ARE_YOU);
public static final ICMPv4Type ICMPV4_TYPE_IPV6_I_AM_HERE = new ICMPv4Type(ICMPV4_TYPE_VAL_IPV6_I_AM_HERE);
public static final ICMPv4Type ICMPV4_TYPE_MOBILE_REGISTRATION_REQUEST = new ICMPv4Type(ICMPV4_TYPE_VAL_MOBILE_REGISTRATION_REQUEST);
public static final ICMPv4Type ICMPV4_TYPE_MOBILE_REGISTRATION_REPLY = new ICMPv4Type(ICMPV4_TYPE_VAL_MOBILE_REGISTRATION_REPLY);
public static final ICMPv4Type ICMPV4_TYPE_DOMAIN_NAME_REQUEST = new ICMPv4Type(ICMPV4_TYPE_VAL_DOMAIN_NAME_REQUEST);
public static final ICMPv4Type ICMPV4_TYPE_DOMAIN_NAME_REPLY = new ICMPv4Type(ICMPV4_TYPE_VAL_DOMAIN_NAME_REPLY);
public static final ICMPv4Type ICMPV4_TYPE_SKIP = new ICMPv4Type(ICMPV4_TYPE_VAL_SKIP);
public static final ICMPv4Type ICMPV4_TYPE_PHOTURIS = new ICMPv4Type(ICMPV4_TYPE_VAL_PHOTURIS);
public static final ICMPv4Type ICMPV4_TYPE_EXPERIMENTAL_MOBILITY = new ICMPv4Type(ICMPV4_TYPE_VAL_EXPERIMENTAL_MOBILITY);
// HACK alert - we're disapproriating ICMPV4_TYPE_ECHO_REPLY (value 0) as 'none' as well
public static final ICMPv4Type NONE = ICMPV4_TYPE_ECHO_REPLY;
public static final ICMPv4Type NO_MASK = new ICMPv4Type((short)0xFFFF);
public static final ICMPv4Type FULL_MASK = new ICMPv4Type((short)0x0000);
private final short type;
private static final int MIN_TYPE = 0;
private static final int MAX_TYPE = 0xFF;
private ICMPv4Type(short type) {
this.type = type;
}
public static ICMPv4Type of(short type) {
if (type < MIN_TYPE || type > MAX_TYPE)
throw new IllegalArgumentException("Invalid ICMPv4 type: " + type);
switch (type) {
case ICMPV4_TYPE_VAL_ECHO_REPLY:
return ICMPV4_TYPE_ECHO_REPLY;
case ICMPV4_TYPE_VAL_DESTINATION_UNREACHABLE:
return ICMPV4_TYPE_DESTINATION_UNREACHABLE;
case ICMPV4_TYPE_VAL_SOURCE_QUENCH:
return ICMPV4_TYPE_SOURCE_QUENCH;
case ICMPV4_TYPE_VAL_REDIRECT:
return ICMPV4_TYPE_REDIRECT;
case ICMPV4_TYPE_VAL_ALTERNATE_HOST_ADDRESS:
return ICMPV4_TYPE_ALTERNATE_HOST_ADDRESS;
case ICMPV4_TYPE_VAL_ECHO:
return ICMPV4_TYPE_ECHO;
case ICMPV4_TYPE_VAL_ROUTER_ADVERTISEMENT:
return ICMPV4_TYPE_ROUTER_ADVERTISEMENT;
case ICMPV4_TYPE_VAL_ROUTER_SOLICITATION:
return ICMPV4_TYPE_ROUTER_SOLICITATION;
case ICMPV4_TYPE_VAL_TIME_EXCEEDED:
return ICMPV4_TYPE_TIME_EXCEEDED;
case ICMPV4_TYPE_VAL_PARAMETER_PROBLEM:
return ICMPV4_TYPE_PARAMETER_PROBLEM;
case ICMPV4_TYPE_VAL_TIMESTAMP:
return ICMPV4_TYPE_TIMESTAMP;
case ICMPV4_TYPE_VAL_TIMESTAMP_REPLY:
return ICMPV4_TYPE_TIMESTAMP_REPLY;
case ICMPV4_TYPE_VAL_INFORMATION_REQUEST:
return ICMPV4_TYPE_INFORMATION_REQUEST;
case ICMPV4_TYPE_VAL_INFORMATION_REPLY:
return ICMPV4_TYPE_INFORMATION_REPLY;
case ICMPV4_TYPE_VAL_ADDRESS_MASK_REQUEST:
return ICMPV4_TYPE_ADDRESS_MASK_REQUEST;
case ICMPV4_TYPE_VAL_ADDRESS_MASK_REPLY:
return ICMPV4_TYPE_ADDRESS_MASK_REPLY;
case ICMPV4_TYPE_VAL_TRACEROUTE:
return ICMPV4_TYPE_TRACEROUTE;
case ICMPV4_TYPE_VAL_DATAGRAM_CONVERSION_ERROR:
return ICMPV4_TYPE_DATAGRAM_CONVERSION_ERROR;
case ICMPV4_TYPE_VAL_MOBILE_HOST_REDIRECT:
return ICMPV4_TYPE_MOBILE_HOST_REDIRECT;
case ICMPV4_TYPE_VAL_IPV6_WHERE_ARE_YOU:
return ICMPV4_TYPE_IPV6_WHERE_ARE_YOU;
case ICMPV4_TYPE_VAL_IPV6_I_AM_HERE:
return ICMPV4_TYPE_IPV6_I_AM_HERE;
case ICMPV4_TYPE_VAL_MOBILE_REGISTRATION_REQUEST:
return ICMPV4_TYPE_MOBILE_REGISTRATION_REQUEST;
case ICMPV4_TYPE_VAL_MOBILE_REGISTRATION_REPLY:
return ICMPV4_TYPE_MOBILE_REGISTRATION_REPLY;
case ICMPV4_TYPE_VAL_DOMAIN_NAME_REQUEST:
return ICMPV4_TYPE_DOMAIN_NAME_REQUEST;
case ICMPV4_TYPE_VAL_DOMAIN_NAME_REPLY:
return ICMPV4_TYPE_DOMAIN_NAME_REPLY;
case ICMPV4_TYPE_VAL_SKIP:
return ICMPV4_TYPE_SKIP;
case ICMPV4_TYPE_VAL_PHOTURIS:
return ICMPV4_TYPE_PHOTURIS;
case ICMPV4_TYPE_VAL_EXPERIMENTAL_MOBILITY:
return ICMPV4_TYPE_EXPERIMENTAL_MOBILITY;
default:
return new ICMPv4Type(type);
}
}
@Override
public int getLength() {
return LENGTH;
}
public short getType() {
return type;
}
public void writeByte(ChannelBuffer c) {
c.writeByte(this.type);
}
public static ICMPv4Type readByte(ChannelBuffer c) {
return ICMPv4Type.of(c.readUnsignedByte());
}
@Override
public ICMPv4Type applyMask(ICMPv4Type mask) {
return ICMPv4Type.of((short)(this.type & mask.type));
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + type;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ICMPv4Type other = (ICMPv4Type) obj;
if (type != other.type)
return false;
return true;
}
@Override
public int compareTo(ICMPv4Type o) {
return Shorts.compare(type, o.type);
}
@Override
public void putTo(PrimitiveSink sink) {
sink.putShort(type);
}
}