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