blob: 246d21a45b726a3799fb964221f03974e0ba177c [file] [log] [blame]
Thomas Vachuska83e090e2014-10-22 14:25:35 -07001/*
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07002 * Copyright 2014 Open Networking Laboratory
Thomas Vachuska83e090e2014-10-22 14:25:35 -07003 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07004 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
Thomas Vachuska83e090e2014-10-22 14:25:35 -07007 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07008 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
Thomas Vachuska83e090e2014-10-22 14:25:35 -070015 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.net.flow.instructions;
alshabib55a55d92014-09-16 11:59:31 -070017
alshabib99b8fdc2014-09-25 14:30:22 -070018import static com.google.common.base.MoreObjects.toStringHelper;
alshabib55a55d92014-09-16 11:59:31 -070019import static com.google.common.base.Preconditions.checkNotNull;
Brian O'Connorabafb502014-12-02 22:26:20 -080020import static org.onosproject.net.flow.instructions.L2ModificationInstruction.*;
alshabib55a55d92014-09-16 11:59:31 -070021
alshabib8ca53902014-10-07 13:11:17 -070022import java.util.Objects;
23
sangho8995ac52015-02-04 11:29:03 -080024import org.onosproject.core.GroupId;
Brian O'Connorabafb502014-12-02 22:26:20 -080025import org.onosproject.net.PortNumber;
alshabib9af70072015-02-09 14:34:16 -080026import org.onosproject.net.flow.FlowRule;
Brian O'Connorabafb502014-12-02 22:26:20 -080027import org.onosproject.net.flow.instructions.L0ModificationInstruction.L0SubType;
28import org.onosproject.net.flow.instructions.L0ModificationInstruction.ModLambdaInstruction;
29import org.onosproject.net.flow.instructions.L2ModificationInstruction.L2SubType;
30import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModEtherInstruction;
31import org.onosproject.net.flow.instructions.L3ModificationInstruction.L3SubType;
32import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModIPInstruction;
Pavlin Radoslavovfebe82c2015-02-11 19:08:15 -080033import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModIPv6FlowLabelInstruction;
sangho3f97a17d2015-01-29 22:56:29 -080034import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModTtlInstruction;
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -080035
36import org.onlab.packet.Ethernet;
Pavlin Radoslavov855ea2d2014-10-30 15:32:39 -070037import org.onlab.packet.IpAddress;
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070038import org.onlab.packet.MacAddress;
Michele Santuari4b6019e2014-12-19 11:31:45 +010039import org.onlab.packet.MplsLabel;
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070040import org.onlab.packet.VlanId;
alshabib64231f62014-09-16 17:58:36 -070041
alshabib55a55d92014-09-16 11:59:31 -070042/**
43 * Factory class for creating various traffic treatment instructions.
44 */
45public final class Instructions {
46
47
48 // Ban construction
49 private Instructions() {}
50
51 /**
52 * Creates an output instruction using the specified port number. This can
53 * include logical ports such as CONTROLLER, FLOOD, etc.
54 *
55 * @param number port number
56 * @return output instruction
57 */
58 public static OutputInstruction createOutput(final PortNumber number) {
59 checkNotNull(number, "PortNumber cannot be null");
60 return new OutputInstruction(number);
61 }
62
63 /**
64 * Creates a drop instruction.
65 * @return drop instruction
66 */
67 public static DropInstruction createDrop() {
68 return new DropInstruction();
69 }
70
71 /**
sangho8995ac52015-02-04 11:29:03 -080072 * Creates a group instruction.
73 *
74 * @param groupId Group Id
75 * @return group instruction
76 */
77 public static GroupInstruction createGroup(final GroupId groupId) {
78 checkNotNull(groupId, "GroupId cannot be null");
79 return new GroupInstruction(groupId);
80 }
81
82 /**
Marc De Leenheer49087752014-10-23 13:54:09 -070083 * Creates a l0 modification.
84 * @param lambda the lambda to modify to.
85 * @return a l0 modification
86 */
87 public static L0ModificationInstruction modL0Lambda(short lambda) {
88 checkNotNull(lambda, "L0 lambda cannot be null");
89 return new ModLambdaInstruction(L0SubType.LAMBDA, lambda);
90 }
91
92 /**
alshabib55a55d92014-09-16 11:59:31 -070093 * Creates a l2 src modification.
94 * @param addr the mac address to modify to.
95 * @return a l2 modification
96 */
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070097 public static L2ModificationInstruction modL2Src(MacAddress addr) {
alshabib55a55d92014-09-16 11:59:31 -070098 checkNotNull(addr, "Src l2 address cannot be null");
alshabib99b8fdc2014-09-25 14:30:22 -070099 return new ModEtherInstruction(L2SubType.ETH_SRC, addr);
alshabib55a55d92014-09-16 11:59:31 -0700100 }
101
102 /**
103 * Creates a L2 dst modification.
104 * @param addr the mac address to modify to.
105 * @return a L2 modification
106 */
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700107 public static L2ModificationInstruction modL2Dst(MacAddress addr) {
alshabib55a55d92014-09-16 11:59:31 -0700108 checkNotNull(addr, "Dst l2 address cannot be null");
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800109 return new ModEtherInstruction(L2SubType.ETH_DST, addr);
alshabib55a55d92014-09-16 11:59:31 -0700110 }
111
112 /**
alshabib7410fea2014-09-16 13:48:39 -0700113 * Creates a Vlan id modification.
114 * @param vlanId the vlan id to modify to.
115 * @return a L2 modification
116 */
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700117 public static L2ModificationInstruction modVlanId(VlanId vlanId) {
alshabib55a55d92014-09-16 11:59:31 -0700118 checkNotNull(vlanId, "VLAN id cannot be null");
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800119 return new ModVlanIdInstruction(vlanId);
alshabib55a55d92014-09-16 11:59:31 -0700120 }
121
alshabib7410fea2014-09-16 13:48:39 -0700122 /**
123 * Creates a Vlan pcp modification.
124 * @param vlanPcp the pcp to modify to.
125 * @return a L2 modification
126 */
127 public static L2ModificationInstruction modVlanPcp(Byte vlanPcp) {
128 checkNotNull(vlanPcp, "VLAN Pcp cannot be null");
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800129 return new ModVlanPcpInstruction(vlanPcp);
alshabib7410fea2014-09-16 13:48:39 -0700130 }
131
132 /**
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800133 * Creates a MPLS label modification.
134 * @param mplsLabel to set.
135 * @return a L2 Modification
136 */
Michele Santuari4b6019e2014-12-19 11:31:45 +0100137 public static L2ModificationInstruction modMplsLabel(MplsLabel mplsLabel) {
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800138 checkNotNull(mplsLabel, "MPLS label cannot be null");
139 return new ModMplsLabelInstruction(mplsLabel);
140 }
sangho3f97a17d2015-01-29 22:56:29 -0800141
142 /**
143 * Creates a MPLS TTL modification.
144 *
145 * @return a L2 Modification
146 */
147 public static L2ModificationInstruction decMplsTtl() {
148 return new ModMplsTtlInstruction();
149 }
Pavlin Radoslavovfebe82c2015-02-11 19:08:15 -0800150
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800151 /**
Pavlin Radoslavovfebe82c2015-02-11 19:08:15 -0800152 * Creates a L3 IPv4 src modification.
153 *
154 * @param addr the IPv4 address to modify to
alshabib7410fea2014-09-16 13:48:39 -0700155 * @return a L3 modification
156 */
Pavlin Radoslavov855ea2d2014-10-30 15:32:39 -0700157 public static L3ModificationInstruction modL3Src(IpAddress addr) {
Pavlin Radoslavovfebe82c2015-02-11 19:08:15 -0800158 checkNotNull(addr, "Src l3 IPv4 address cannot be null");
159 return new ModIPInstruction(L3SubType.IPV4_SRC, addr);
alshabib7410fea2014-09-16 13:48:39 -0700160 }
161
162 /**
Pavlin Radoslavovfebe82c2015-02-11 19:08:15 -0800163 * Creates a L3 IPv4 dst modification.
164 *
165 * @param addr the IPv4 address to modify to
alshabib7410fea2014-09-16 13:48:39 -0700166 * @return a L3 modification
167 */
Pavlin Radoslavov855ea2d2014-10-30 15:32:39 -0700168 public static L3ModificationInstruction modL3Dst(IpAddress addr) {
Pavlin Radoslavovfebe82c2015-02-11 19:08:15 -0800169 checkNotNull(addr, "Dst l3 IPv4 address cannot be null");
170 return new ModIPInstruction(L3SubType.IPV4_DST, addr);
171 }
172
173 /**
174 * Creates a L3 IPv6 src modification.
175 *
176 * @param addr the IPv6 address to modify to
177 * @return a L3 modification
178 */
179 public static L3ModificationInstruction modL3IPv6Src(IpAddress addr) {
180 checkNotNull(addr, "Src l3 IPv6 address cannot be null");
181 return new ModIPInstruction(L3SubType.IPV6_SRC, addr);
182 }
183
184 /**
185 * Creates a L3 IPv6 dst modification.
186 *
187 * @param addr the IPv6 address to modify to
188 * @return a L3 modification
189 */
190 public static L3ModificationInstruction modL3IPv6Dst(IpAddress addr) {
191 checkNotNull(addr, "Dst l3 IPv6 address cannot be null");
192 return new ModIPInstruction(L3SubType.IPV6_DST, addr);
193 }
194
195 /**
196 * Creates a L3 IPv6 Flow Label modification.
197 *
198 * @param flowLabel the IPv6 flow label to modify to (20 bits)
199 * @return a L3 modification
200 */
201 public static L3ModificationInstruction modL3IPv6FlowLabel(int flowLabel) {
202 return new ModIPv6FlowLabelInstruction(flowLabel);
alshabib7410fea2014-09-16 13:48:39 -0700203 }
204
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800205 /**
sangho3f97a17d2015-01-29 22:56:29 -0800206 * Creates a L3 TTL modification.
207 * @return a L3 modification
208 */
209 public static L3ModificationInstruction decNwTtl() {
210 return new ModTtlInstruction(L3SubType.DEC_TTL);
211 }
212
213 /**
214 * Creates a L3 TTL modification.
215 * @return a L3 modification
216 */
217 public static L3ModificationInstruction copyTtlOut() {
218 return new ModTtlInstruction(L3SubType.TTL_OUT);
219 }
220
221 /**
222 * Creates a L3 TTL modification.
223 * @return a L3 modification
224 */
225 public static L3ModificationInstruction copyTtlIn() {
226 return new ModTtlInstruction(L3SubType.TTL_IN);
227 }
228
229 /**
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800230 * Creates a mpls header instruction.
231 * @return a L2 modification.
232 */
233 public static Instruction pushMpls() {
234 return new PushHeaderInstructions(L2SubType.MPLS_PUSH,
Yuta HIGUCHI32a53c52015-02-08 01:25:40 -0800235 Ethernet.MPLS_UNICAST);
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800236 }
237
238 /**
239 * Creates a mpls header instruction.
240 * @return a L2 modification.
241 */
242 public static Instruction popMpls() {
243 return new PushHeaderInstructions(L2SubType.MPLS_POP,
Yuta HIGUCHI32a53c52015-02-08 01:25:40 -0800244 Ethernet.MPLS_UNICAST);
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800245 }
alshabib7410fea2014-09-16 13:48:39 -0700246
sangho3f97a17d2015-01-29 22:56:29 -0800247 /**
248 * Creates a mpls header instruction.
249 *
250 * @param etherType Ethernet type to set
251 * @return a L2 modification.
252 */
253 public static Instruction popMpls(Short etherType) {
254 checkNotNull(etherType, "Ethernet type cannot be null");
Yuta HIGUCHI32a53c52015-02-08 01:25:40 -0800255 return new PushHeaderInstructions(L2SubType.MPLS_POP, etherType);
sangho3f97a17d2015-01-29 22:56:29 -0800256 }
257
alshabib9af70072015-02-09 14:34:16 -0800258 public static Instruction transition(FlowRule.Type type) {
259 checkNotNull(type, "Table type cannot be null");
260 return new TableTypeTransition(type);
261 }
262
alshabib55a55d92014-09-16 11:59:31 -0700263 /*
sangho8995ac52015-02-04 11:29:03 -0800264 * Drop instructions
alshabib55a55d92014-09-16 11:59:31 -0700265 */
266
267 public static final class DropInstruction implements Instruction {
268 @Override
269 public Type type() {
270 return Type.DROP;
271 }
alshabib99b8fdc2014-09-25 14:30:22 -0700272
273 @Override
274 public String toString() {
275 return toStringHelper(type()).toString();
276
277 }
alshabib8ca53902014-10-07 13:11:17 -0700278
279 @Override
280 public int hashCode() {
281 return Objects.hash(type());
282 }
283
284 @Override
285 public boolean equals(Object obj) {
286 if (this == obj) {
287 return true;
288 }
289 if (obj instanceof DropInstruction) {
290 DropInstruction that = (DropInstruction) obj;
291 return Objects.equals(type(), that.type());
292
293 }
294 return false;
295 }
alshabib55a55d92014-09-16 11:59:31 -0700296 }
297
sangho8995ac52015-02-04 11:29:03 -0800298 /*
299 * Output Instruction
300 */
alshabib55a55d92014-09-16 11:59:31 -0700301
302 public static final class OutputInstruction implements Instruction {
303 private final PortNumber port;
304
305 private OutputInstruction(PortNumber port) {
306 this.port = port;
307 }
308
309 public PortNumber port() {
310 return port;
311 }
312
313 @Override
314 public Type type() {
315 return Type.OUTPUT;
316 }
alshabib99b8fdc2014-09-25 14:30:22 -0700317 @Override
318 public String toString() {
319 return toStringHelper(type().toString())
320 .add("port", port).toString();
321 }
alshabib8ca53902014-10-07 13:11:17 -0700322
323 @Override
324 public int hashCode() {
Thomas Vachuska9b2da212014-11-10 19:30:25 -0800325 return Objects.hash(type(), port);
alshabib8ca53902014-10-07 13:11:17 -0700326 }
327
328 @Override
329 public boolean equals(Object obj) {
330 if (this == obj) {
331 return true;
332 }
333 if (obj instanceof OutputInstruction) {
334 OutputInstruction that = (OutputInstruction) obj;
Yuta HIGUCHI4ce65292014-11-01 12:09:55 -0700335 return Objects.equals(port, that.port);
alshabib8ca53902014-10-07 13:11:17 -0700336
337 }
338 return false;
339 }
alshabib55a55d92014-09-16 11:59:31 -0700340 }
341
sangho8995ac52015-02-04 11:29:03 -0800342 /*
343 * Group Instruction
344 */
345
346 public static final class GroupInstruction implements Instruction {
347 private final GroupId groupId;
348
349 private GroupInstruction(GroupId groupId) {
350 this.groupId = groupId;
351 }
352
353 public GroupId groupId() {
354 return groupId;
355 }
356
357 @Override
358 public Type type() {
359 return Type.GROUP;
360 }
alshabib9af70072015-02-09 14:34:16 -0800361
sangho8995ac52015-02-04 11:29:03 -0800362 @Override
363 public String toString() {
364 return toStringHelper(type().toString())
365 .add("group ID", groupId.id()).toString();
366 }
367
368 @Override
369 public int hashCode() {
370 return Objects.hash(type(), groupId);
371 }
372
373 @Override
374 public boolean equals(Object obj) {
375 if (this == obj) {
376 return true;
377 }
378 if (obj instanceof GroupInstruction) {
379 GroupInstruction that = (GroupInstruction) obj;
380 return Objects.equals(groupId, that.groupId);
381
382 }
383 return false;
384 }
385 }
386
alshabib9af70072015-02-09 14:34:16 -0800387 // FIXME: Temporary support for this. This should probably become it's own
388 // type like other instructions.
389 public static class TableTypeTransition implements Instruction {
390 private final FlowRule.Type tableType;
391
392 public TableTypeTransition(FlowRule.Type type) {
393 this.tableType = type;
394 }
395
396 @Override
397 public Type type() {
398 return Type.TABLE;
399 }
400
401 public FlowRule.Type tableType() {
402 return this.tableType;
403 }
404
405 @Override
406 public String toString() {
407 return toStringHelper(type().toString())
408 .add("group ID", this.tableType).toString();
409 }
410
411 @Override
412 public int hashCode() {
413 return Objects.hash(type(), tableType);
414 }
415
416 @Override
417 public boolean equals(Object obj) {
418 if (this == obj) {
419 return true;
420 }
421 if (obj instanceof TableTypeTransition) {
422 TableTypeTransition that = (TableTypeTransition) obj;
423 return Objects.equals(tableType, that.tableType);
424
425 }
426 return false;
427 }
428
429 }
alshabib55a55d92014-09-16 11:59:31 -0700430}
alshabib8ca53902014-10-07 13:11:17 -0700431
432