blob: 634bc038241c9531624299bd6da05da63d51d3ba [file] [log] [blame]
tom0eb04ca2014-08-25 14:34:51 -07001package org.projectfloodlight.openflow.types;
2
3import org.jboss.netty.buffer.ChannelBuffer;
4
5import com.google.common.hash.PrimitiveSink;
6import com.google.common.primitives.Shorts;
7
8public class ICMPv4Type implements OFValueType<ICMPv4Type> {
9 final static int LENGTH = 1;
10
11 private static final short VAL_ECHO_REPLY = 0;
12 private static final short VAL_DESTINATION_UNREACHABLE = 3;
13 private static final short VAL_SOURCE_QUENCH = 4;
14 private static final short VAL_REDIRECT = 5;
15 private static final short VAL_ALTERNATE_HOST_ADDRESS = 6;
16 private static final short VAL_ECHO = 8;
17 private static final short VAL_ROUTER_ADVERTISEMENT = 9;
18 private static final short VAL_ROUTER_SOLICITATION = 10;
19 private static final short VAL_TIME_EXCEEDED = 11;
20 private static final short VAL_PARAMETER_PROBLEM = 12;
21 private static final short VAL_TIMESTAMP = 13;
22 private static final short VAL_TIMESTAMP_REPLY = 14;
23 private static final short VAL_INFORMATION_REQUEST = 15;
24 private static final short VAL_INFORMATION_REPLY = 16;
25 private static final short VAL_ADDRESS_MASK_REQUEST = 17;
26 private static final short VAL_ADDRESS_MASK_REPLY = 18;
27 private static final short VAL_TRACEROUTE = 30;
28 private static final short VAL_DATAGRAM_CONVERSION_ERROR = 31;
29 private static final short VAL_MOBILE_HOST_REDIRECT = 32;
30 private static final short VAL_IPV6_WHERE_ARE_YOU = 33;
31 private static final short VAL_IPV6_I_AM_HERE = 34;
32 private static final short VAL_MOBILE_REGISTRATION_REQUEST = 35;
33 private static final short VAL_MOBILE_REGISTRATION_REPLY = 36;
34 private static final short VAL_DOMAIN_NAME_REQUEST = 37;
35 private static final short VAL_DOMAIN_NAME_REPLY = 38;
36 private static final short VAL_SKIP = 39;
37 private static final short VAL_PHOTURIS = 40;
38 private static final short VAL_EXPERIMENTAL_MOBILITY = 41;
39
40 public static final ICMPv4Type ECHO_REPLY = new ICMPv4Type(VAL_ECHO_REPLY);
41 public static final ICMPv4Type DESTINATION_UNREACHABLE = new ICMPv4Type(VAL_DESTINATION_UNREACHABLE);
42 public static final ICMPv4Type SOURCE_QUENCH = new ICMPv4Type(VAL_SOURCE_QUENCH);
43 public static final ICMPv4Type REDIRECT = new ICMPv4Type(VAL_REDIRECT);
44 public static final ICMPv4Type ALTERNATE_HOST_ADDRESS = new ICMPv4Type(VAL_ALTERNATE_HOST_ADDRESS);
45 public static final ICMPv4Type ECHO = new ICMPv4Type(VAL_ECHO);
46 public static final ICMPv4Type ROUTER_ADVERTISEMENT = new ICMPv4Type(VAL_ROUTER_ADVERTISEMENT);
47 public static final ICMPv4Type ROUTER_SOLICITATION = new ICMPv4Type(VAL_ROUTER_SOLICITATION);
48 public static final ICMPv4Type TIME_EXCEEDED = new ICMPv4Type(VAL_TIME_EXCEEDED);
49 public static final ICMPv4Type PARAMETER_PROBLEM = new ICMPv4Type(VAL_PARAMETER_PROBLEM);
50 public static final ICMPv4Type TIMESTAMP = new ICMPv4Type(VAL_TIMESTAMP);
51 public static final ICMPv4Type TIMESTAMP_REPLY = new ICMPv4Type(VAL_TIMESTAMP_REPLY);
52 public static final ICMPv4Type INFORMATION_REQUEST = new ICMPv4Type(VAL_INFORMATION_REQUEST);
53 public static final ICMPv4Type INFORMATION_REPLY = new ICMPv4Type(VAL_INFORMATION_REPLY);
54 public static final ICMPv4Type ADDRESS_MASK_REQUEST = new ICMPv4Type(VAL_ADDRESS_MASK_REQUEST);
55 public static final ICMPv4Type ADDRESS_MASK_REPLY = new ICMPv4Type(VAL_ADDRESS_MASK_REPLY);
56 public static final ICMPv4Type TRACEROUTE = new ICMPv4Type(VAL_TRACEROUTE);
57 public static final ICMPv4Type DATAGRAM_CONVERSION_ERROR = new ICMPv4Type(VAL_DATAGRAM_CONVERSION_ERROR);
58 public static final ICMPv4Type MOBILE_HOST_REDIRECT = new ICMPv4Type(VAL_MOBILE_HOST_REDIRECT);
59 public static final ICMPv4Type IPV6_WHERE_ARE_YOU = new ICMPv4Type(VAL_IPV6_WHERE_ARE_YOU);
60 public static final ICMPv4Type IPV6_I_AM_HERE = new ICMPv4Type(VAL_IPV6_I_AM_HERE);
61 public static final ICMPv4Type MOBILE_REGISTRATION_REQUEST = new ICMPv4Type(VAL_MOBILE_REGISTRATION_REQUEST);
62 public static final ICMPv4Type MOBILE_REGISTRATION_REPLY = new ICMPv4Type(VAL_MOBILE_REGISTRATION_REPLY);
63 public static final ICMPv4Type DOMAIN_NAME_REQUEST = new ICMPv4Type(VAL_DOMAIN_NAME_REQUEST);
64 public static final ICMPv4Type DOMAIN_NAME_REPLY = new ICMPv4Type(VAL_DOMAIN_NAME_REPLY);
65 public static final ICMPv4Type SKIP = new ICMPv4Type(VAL_SKIP);
66 public static final ICMPv4Type PHOTURIS = new ICMPv4Type(VAL_PHOTURIS);
67 public static final ICMPv4Type EXPERIMENTAL_MOBILITY = new ICMPv4Type(VAL_EXPERIMENTAL_MOBILITY);
68
69 // HACK alert - we're disapproriating ECHO_REPLY (value 0) as 'none' as well
70 public static final ICMPv4Type NONE = ECHO_REPLY;
71
72 public static final ICMPv4Type NO_MASK = new ICMPv4Type((short)0xFFFF);
73 public static final ICMPv4Type FULL_MASK = new ICMPv4Type((short)0x0000);
74
75 private final short type;
76
77 private static final int MIN_TYPE = 0;
78 private static final int MAX_TYPE = 0xFF;
79
80 private ICMPv4Type(short type) {
81 this.type = type;
82 }
83
84 public static ICMPv4Type of(short type) {
85 if (type < MIN_TYPE || type > MAX_TYPE)
86 throw new IllegalArgumentException("Invalid ICMPv4 type: " + type);
87 switch (type) {
88 case VAL_ECHO_REPLY:
89 return ECHO_REPLY;
90 case VAL_DESTINATION_UNREACHABLE:
91 return DESTINATION_UNREACHABLE;
92 case VAL_SOURCE_QUENCH:
93 return SOURCE_QUENCH;
94 case VAL_REDIRECT:
95 return REDIRECT;
96 case VAL_ALTERNATE_HOST_ADDRESS:
97 return ALTERNATE_HOST_ADDRESS;
98 case VAL_ECHO:
99 return ECHO;
100 case VAL_ROUTER_ADVERTISEMENT:
101 return ROUTER_ADVERTISEMENT;
102 case VAL_ROUTER_SOLICITATION:
103 return ROUTER_SOLICITATION;
104 case VAL_TIME_EXCEEDED:
105 return TIME_EXCEEDED;
106 case VAL_PARAMETER_PROBLEM:
107 return PARAMETER_PROBLEM;
108 case VAL_TIMESTAMP:
109 return TIMESTAMP;
110 case VAL_TIMESTAMP_REPLY:
111 return TIMESTAMP_REPLY;
112 case VAL_INFORMATION_REQUEST:
113 return INFORMATION_REQUEST;
114 case VAL_INFORMATION_REPLY:
115 return INFORMATION_REPLY;
116 case VAL_ADDRESS_MASK_REQUEST:
117 return ADDRESS_MASK_REQUEST;
118 case VAL_ADDRESS_MASK_REPLY:
119 return ADDRESS_MASK_REPLY;
120 case VAL_TRACEROUTE:
121 return TRACEROUTE;
122 case VAL_DATAGRAM_CONVERSION_ERROR:
123 return DATAGRAM_CONVERSION_ERROR;
124 case VAL_MOBILE_HOST_REDIRECT:
125 return MOBILE_HOST_REDIRECT;
126 case VAL_IPV6_WHERE_ARE_YOU:
127 return IPV6_WHERE_ARE_YOU;
128 case VAL_IPV6_I_AM_HERE:
129 return IPV6_I_AM_HERE;
130 case VAL_MOBILE_REGISTRATION_REQUEST:
131 return MOBILE_REGISTRATION_REQUEST;
132 case VAL_MOBILE_REGISTRATION_REPLY:
133 return MOBILE_REGISTRATION_REPLY;
134 case VAL_DOMAIN_NAME_REQUEST:
135 return DOMAIN_NAME_REQUEST;
136 case VAL_DOMAIN_NAME_REPLY:
137 return DOMAIN_NAME_REPLY;
138 case VAL_SKIP:
139 return SKIP;
140 case VAL_PHOTURIS:
141 return PHOTURIS;
142 case VAL_EXPERIMENTAL_MOBILITY:
143 return EXPERIMENTAL_MOBILITY;
144 default:
145 return new ICMPv4Type(type);
146 }
147 }
148
149 @Override
150 public int getLength() {
151 return LENGTH;
152 }
153
154 public short getType() {
155 return type;
156 }
157
158 public void writeByte(ChannelBuffer c) {
159 c.writeByte(this.type);
160 }
161
162 public static ICMPv4Type readByte(ChannelBuffer c) {
163 return ICMPv4Type.of(c.readUnsignedByte());
164 }
165
166 @Override
167 public ICMPv4Type applyMask(ICMPv4Type mask) {
168 return ICMPv4Type.of((short)(this.type & mask.type));
169 }
170
171 @Override
172 public int hashCode() {
173 final int prime = 31;
174 int result = 1;
175 result = prime * result + type;
176 return result;
177 }
178
179 @Override
180 public boolean equals(Object obj) {
181 if (this == obj)
182 return true;
183 if (obj == null)
184 return false;
185 if (getClass() != obj.getClass())
186 return false;
187 ICMPv4Type other = (ICMPv4Type) obj;
188 if (type != other.type)
189 return false;
190 return true;
191 }
192
193 @Override
194 public int compareTo(ICMPv4Type o) {
195 return Shorts.compare(type, o.type);
196 }
197
198 @Override
199 public void putTo(PrimitiveSink sink) {
200 sink.putShort(type);
201 }
202
203 @Override
204 public String toString() {
205 return String.valueOf(this.type);
206 }
207}