blob: 460976aaadfeda6623d26b45d9078c707dc2883c [file] [log] [blame]
Thomas Vachuska83e090e2014-10-22 14:25:35 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2014-present Open Networking Foundation
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
Steffen Gebertba2d3b72015-10-22 11:14:31 +020018import com.google.common.base.MoreObjects;
alshabib7b808c52015-06-26 14:22:24 -070019import org.onlab.packet.EthType;
Jonathan Hart54b406b2015-03-06 16:24:14 -080020import org.onlab.packet.IpAddress;
21import org.onlab.packet.MacAddress;
22import org.onlab.packet.MplsLabel;
Hyunsun Mooncf732fb2015-08-22 21:04:23 -070023import org.onlab.packet.TpPort;
Jonathan Hart54b406b2015-03-06 16:24:14 -080024import org.onlab.packet.VlanId;
sangho8995ac52015-02-04 11:29:03 -080025import org.onosproject.core.GroupId;
Jonathan Hart3c259162015-10-21 21:31:19 -070026import org.onosproject.net.DeviceId;
Sho SHIMIZU2e7ac842015-05-05 15:45:38 -070027import org.onosproject.net.Lambda;
Sho SHIMIZUe9e12752015-05-05 14:45:40 -070028import org.onosproject.net.OchSignal;
Yafit Hadar52d81552015-10-07 12:26:52 +030029import org.onosproject.net.OduSignalId;
Brian O'Connorabafb502014-12-02 22:26:20 -080030import org.onosproject.net.PortNumber;
Sho SHIMIZU2e7ac842015-05-05 15:45:38 -070031import org.onosproject.net.flow.instructions.L0ModificationInstruction.ModOchSignalInstruction;
Yafit Hadar52d81552015-10-07 12:26:52 +030032import org.onosproject.net.flow.instructions.L1ModificationInstruction.ModOduSignalIdInstruction;
Brian O'Connorabafb502014-12-02 22:26:20 -080033import org.onosproject.net.flow.instructions.L3ModificationInstruction.L3SubType;
34import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModIPInstruction;
lishuai3cce60b2015-12-01 19:35:16 +080035import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModArpIPInstruction;
36import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModArpEthInstruction;
37import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModArpOpInstruction;
Pavlin Radoslavovfebe82c2015-02-11 19:08:15 -080038import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModIPv6FlowLabelInstruction;
sangho3f97a17d2015-01-29 22:56:29 -080039import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModTtlInstruction;
Hyunsun Moonc8bd97c2015-07-18 22:47:33 -070040import org.onosproject.net.flow.instructions.L4ModificationInstruction.L4SubType;
41import org.onosproject.net.flow.instructions.L4ModificationInstruction.ModTransportPortInstruction;
alshabib10c810b2015-08-18 16:59:04 -070042import org.onosproject.net.meter.MeterId;
Frank Wangdf383212017-06-23 09:17:41 +080043import org.onosproject.net.pi.runtime.PiTableAction;
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -080044
Jonathan Hart54b406b2015-03-06 16:24:14 -080045import java.util.Objects;
46
47import static com.google.common.base.MoreObjects.toStringHelper;
48import static com.google.common.base.Preconditions.checkNotNull;
alshabib64231f62014-09-16 17:58:36 -070049
alshabib55a55d92014-09-16 11:59:31 -070050/**
51 * Factory class for creating various traffic treatment instructions.
52 */
53public final class Instructions {
54
Jonathan Hartc7840bd2016-01-21 23:26:29 -080055 private static final String SEPARATOR = ":";
56
alshabib55a55d92014-09-16 11:59:31 -070057 // Ban construction
58 private Instructions() {}
59
60 /**
61 * Creates an output instruction using the specified port number. This can
62 * include logical ports such as CONTROLLER, FLOOD, etc.
63 *
64 * @param number port number
65 * @return output instruction
66 */
67 public static OutputInstruction createOutput(final PortNumber number) {
68 checkNotNull(number, "PortNumber cannot be null");
69 return new OutputInstruction(number);
70 }
71
72 /**
Charles Chan7efabeb2015-09-28 15:12:19 -070073 * Creates a no action instruction.
74 *
75 * @return no action instruction
76 */
77 public static NoActionInstruction createNoAction() {
78 return new NoActionInstruction();
79 }
80
81 /**
sangho8995ac52015-02-04 11:29:03 -080082 * Creates a group instruction.
83 *
84 * @param groupId Group Id
85 * @return group instruction
86 */
87 public static GroupInstruction createGroup(final GroupId groupId) {
88 checkNotNull(groupId, "GroupId cannot be null");
89 return new GroupInstruction(groupId);
90 }
91
Steffen Gebertbbfdaaa2015-09-29 11:01:46 +020092 /**
93 * Creates a set-queue instruction.
94 *
95 * @param queueId Queue Id
Steffen Gebertba2d3b72015-10-22 11:14:31 +020096 * @param port Port number
Steffen Gebertbbfdaaa2015-09-29 11:01:46 +020097 * @return set-queue instruction
98 */
Steffen Gebertba2d3b72015-10-22 11:14:31 +020099 public static SetQueueInstruction setQueue(final long queueId, final PortNumber port) {
Steffen Gebertbbfdaaa2015-09-29 11:01:46 +0200100 checkNotNull(queueId, "queue ID cannot be null");
Steffen Gebertba2d3b72015-10-22 11:14:31 +0200101 return new SetQueueInstruction(queueId, port);
Steffen Gebertbbfdaaa2015-09-29 11:01:46 +0200102 }
103
Jian Li1ef82db2016-03-03 14:43:21 -0800104 /**
105 * Creates a meter instruction.
106 *
107 * @param meterId Meter Id
108 * @return meter instruction
109 */
alshabib10c810b2015-08-18 16:59:04 -0700110 public static MeterInstruction meterTraffic(final MeterId meterId) {
111 checkNotNull(meterId, "meter id cannot be null");
112 return new MeterInstruction(meterId);
113 }
114
sangho8995ac52015-02-04 11:29:03 -0800115 /**
Sho SHIMIZUe9e12752015-05-05 14:45:40 -0700116 * Creates an L0 modification with the specified OCh signal.
117 *
118 * @param lambda OCh signal
119 * @return an L0 modification
120 */
Sho SHIMIZU2e7ac842015-05-05 15:45:38 -0700121 public static L0ModificationInstruction modL0Lambda(Lambda lambda) {
Sho SHIMIZUe9e12752015-05-05 14:45:40 -0700122 checkNotNull(lambda, "L0 OCh signal cannot be null");
Sho SHIMIZU2e7ac842015-05-05 15:45:38 -0700123
Sho SHIMIZUa114d892016-03-11 16:48:19 -0800124 if (lambda instanceof OchSignal) {
Sho SHIMIZU2e7ac842015-05-05 15:45:38 -0700125 return new ModOchSignalInstruction((OchSignal) lambda);
126 } else {
127 throw new UnsupportedOperationException(String.format("Unsupported type: %s", lambda));
128 }
Sho SHIMIZUe9e12752015-05-05 14:45:40 -0700129 }
130
131 /**
Yafit Hadar52d81552015-10-07 12:26:52 +0300132 * Creates an L1 modification with the specified ODU signal Id.
133 *
134 * @param oduSignalId ODU Signal Id
135 * @return a L1 modification
136 */
137 public static L1ModificationInstruction modL1OduSignalId(OduSignalId oduSignalId) {
138 checkNotNull(oduSignalId, "L1 ODU signal ID cannot be null");
139 return new ModOduSignalIdInstruction(oduSignalId);
140 }
141 /**
alshabib55a55d92014-09-16 11:59:31 -0700142 * Creates a l2 src modification.
Jonathan Hart54b406b2015-03-06 16:24:14 -0800143 *
144 * @param addr the mac address to modify to
alshabib55a55d92014-09-16 11:59:31 -0700145 * @return a l2 modification
146 */
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700147 public static L2ModificationInstruction modL2Src(MacAddress addr) {
alshabib55a55d92014-09-16 11:59:31 -0700148 checkNotNull(addr, "Src l2 address cannot be null");
alshabibd17abc22015-04-21 18:26:35 -0700149 return new L2ModificationInstruction.ModEtherInstruction(
150 L2ModificationInstruction.L2SubType.ETH_SRC, addr);
alshabib55a55d92014-09-16 11:59:31 -0700151 }
152
153 /**
154 * Creates a L2 dst modification.
Jonathan Hart54b406b2015-03-06 16:24:14 -0800155 *
156 * @param addr the mac address to modify to
alshabib55a55d92014-09-16 11:59:31 -0700157 * @return a L2 modification
158 */
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700159 public static L2ModificationInstruction modL2Dst(MacAddress addr) {
alshabib55a55d92014-09-16 11:59:31 -0700160 checkNotNull(addr, "Dst l2 address cannot be null");
alshabibd17abc22015-04-21 18:26:35 -0700161 return new L2ModificationInstruction.ModEtherInstruction(
162 L2ModificationInstruction.L2SubType.ETH_DST, addr);
alshabib55a55d92014-09-16 11:59:31 -0700163 }
164
165 /**
Jonathan Hart54b406b2015-03-06 16:24:14 -0800166 * Creates a VLAN ID modification.
167 *
168 * @param vlanId the VLAN ID to modify to
alshabib7410fea2014-09-16 13:48:39 -0700169 * @return a L2 modification
170 */
Ayaka Koshibea9c199f2014-09-16 16:21:40 -0700171 public static L2ModificationInstruction modVlanId(VlanId vlanId) {
alshabib55a55d92014-09-16 11:59:31 -0700172 checkNotNull(vlanId, "VLAN id cannot be null");
alshabibd17abc22015-04-21 18:26:35 -0700173 return new L2ModificationInstruction.ModVlanIdInstruction(vlanId);
alshabib55a55d92014-09-16 11:59:31 -0700174 }
175
alshabib7410fea2014-09-16 13:48:39 -0700176 /**
Jonathan Hart54b406b2015-03-06 16:24:14 -0800177 * Creates a VLAN PCP modification.
178 *
179 * @param vlanPcp the PCP to modify to
alshabib7410fea2014-09-16 13:48:39 -0700180 * @return a L2 modification
181 */
182 public static L2ModificationInstruction modVlanPcp(Byte vlanPcp) {
183 checkNotNull(vlanPcp, "VLAN Pcp cannot be null");
alshabibd17abc22015-04-21 18:26:35 -0700184 return new L2ModificationInstruction.ModVlanPcpInstruction(vlanPcp);
alshabib7410fea2014-09-16 13:48:39 -0700185 }
186
187 /**
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800188 * Creates a MPLS label modification.
Jonathan Hart54b406b2015-03-06 16:24:14 -0800189 *
190 * @param mplsLabel MPLS label to set
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800191 * @return a L2 Modification
192 */
Michele Santuari4b6019e2014-12-19 11:31:45 +0100193 public static L2ModificationInstruction modMplsLabel(MplsLabel mplsLabel) {
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800194 checkNotNull(mplsLabel, "MPLS label cannot be null");
alshabibd17abc22015-04-21 18:26:35 -0700195 return new L2ModificationInstruction.ModMplsLabelInstruction(mplsLabel);
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800196 }
sangho3f97a17d2015-01-29 22:56:29 -0800197
198 /**
Saurav Das73a7dd42015-08-19 22:20:31 -0700199 * Creates a MPLS BOS bit modification.
200 *
201 * @param mplsBos MPLS BOS bit to set (true) or unset (false)
202 * @return a L2 Modification
203 */
204 public static L2ModificationInstruction modMplsBos(boolean mplsBos) {
205 return new L2ModificationInstruction.ModMplsBosInstruction(mplsBos);
206 }
207
208 /**
Jonathan Hart54b406b2015-03-06 16:24:14 -0800209 * Creates a MPLS decrement TTL modification.
sangho3f97a17d2015-01-29 22:56:29 -0800210 *
211 * @return a L2 Modification
212 */
213 public static L2ModificationInstruction decMplsTtl() {
alshabibd17abc22015-04-21 18:26:35 -0700214 return new L2ModificationInstruction.ModMplsTtlInstruction();
sangho3f97a17d2015-01-29 22:56:29 -0800215 }
Pavlin Radoslavovfebe82c2015-02-11 19:08:15 -0800216
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800217 /**
Pavlin Radoslavovfebe82c2015-02-11 19:08:15 -0800218 * Creates a L3 IPv4 src modification.
219 *
220 * @param addr the IPv4 address to modify to
alshabib7410fea2014-09-16 13:48:39 -0700221 * @return a L3 modification
222 */
Pavlin Radoslavov855ea2d2014-10-30 15:32:39 -0700223 public static L3ModificationInstruction modL3Src(IpAddress addr) {
Pavlin Radoslavovfebe82c2015-02-11 19:08:15 -0800224 checkNotNull(addr, "Src l3 IPv4 address cannot be null");
225 return new ModIPInstruction(L3SubType.IPV4_SRC, addr);
alshabib7410fea2014-09-16 13:48:39 -0700226 }
227
228 /**
Pavlin Radoslavovfebe82c2015-02-11 19:08:15 -0800229 * Creates a L3 IPv4 dst modification.
230 *
231 * @param addr the IPv4 address to modify to
alshabib7410fea2014-09-16 13:48:39 -0700232 * @return a L3 modification
233 */
Pavlin Radoslavov855ea2d2014-10-30 15:32:39 -0700234 public static L3ModificationInstruction modL3Dst(IpAddress addr) {
Pavlin Radoslavovfebe82c2015-02-11 19:08:15 -0800235 checkNotNull(addr, "Dst l3 IPv4 address cannot be null");
236 return new ModIPInstruction(L3SubType.IPV4_DST, addr);
237 }
238
239 /**
240 * Creates a L3 IPv6 src modification.
241 *
242 * @param addr the IPv6 address to modify to
243 * @return a L3 modification
244 */
245 public static L3ModificationInstruction modL3IPv6Src(IpAddress addr) {
246 checkNotNull(addr, "Src l3 IPv6 address cannot be null");
247 return new ModIPInstruction(L3SubType.IPV6_SRC, addr);
248 }
249
250 /**
251 * Creates a L3 IPv6 dst modification.
252 *
253 * @param addr the IPv6 address to modify to
254 * @return a L3 modification
255 */
256 public static L3ModificationInstruction modL3IPv6Dst(IpAddress addr) {
257 checkNotNull(addr, "Dst l3 IPv6 address cannot be null");
258 return new ModIPInstruction(L3SubType.IPV6_DST, addr);
259 }
260
261 /**
262 * Creates a L3 IPv6 Flow Label modification.
263 *
264 * @param flowLabel the IPv6 flow label to modify to (20 bits)
265 * @return a L3 modification
266 */
267 public static L3ModificationInstruction modL3IPv6FlowLabel(int flowLabel) {
268 return new ModIPv6FlowLabelInstruction(flowLabel);
alshabib7410fea2014-09-16 13:48:39 -0700269 }
270
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800271 /**
Jonathan Hart54b406b2015-03-06 16:24:14 -0800272 * Creates a L3 decrement TTL modification.
273 *
sangho3f97a17d2015-01-29 22:56:29 -0800274 * @return a L3 modification
275 */
276 public static L3ModificationInstruction decNwTtl() {
277 return new ModTtlInstruction(L3SubType.DEC_TTL);
278 }
279
280 /**
Jonathan Hart54b406b2015-03-06 16:24:14 -0800281 * Creates a L3 copy TTL to outer header modification.
282 *
sangho3f97a17d2015-01-29 22:56:29 -0800283 * @return a L3 modification
284 */
285 public static L3ModificationInstruction copyTtlOut() {
286 return new ModTtlInstruction(L3SubType.TTL_OUT);
287 }
288
289 /**
Jonathan Hart54b406b2015-03-06 16:24:14 -0800290 * Creates a L3 copy TTL to inner header modification.
291 *
sangho3f97a17d2015-01-29 22:56:29 -0800292 * @return a L3 modification
293 */
294 public static L3ModificationInstruction copyTtlIn() {
295 return new ModTtlInstruction(L3SubType.TTL_IN);
296 }
297
298 /**
lishuai3cce60b2015-12-01 19:35:16 +0800299 * Creates a L3 ARP IP src modification.
300 *
301 * @param addr the ip address to modify to
302 * @return a L3 modification
303 */
304 public static L3ModificationInstruction modArpSpa(IpAddress addr) {
305 checkNotNull(addr, "Src l3 ARP IP address cannot be null");
306 return new ModArpIPInstruction(L3SubType.ARP_SPA, addr);
307 }
308
309 /**
310 * Creates a l3 ARP Ether src modification.
311 *
312 * @param addr the mac address to modify to
313 * @return a l3 modification
314 */
315 public static L3ModificationInstruction modArpSha(MacAddress addr) {
316 checkNotNull(addr, "Src l3 ARP address cannot be null");
317 return new ModArpEthInstruction(L3SubType.ARP_SHA, addr);
318 }
319
320 /**
321 * Creates a l3 ARP operation modification.
322 *
323 * @param op the ARP operation to modify to
324 * @return a l3 modification
325 */
326 public static L3ModificationInstruction modL3ArpOp(short op) {
327 checkNotNull(op, "Arp operation cannot be null");
328 return new ModArpOpInstruction(L3SubType.ARP_OP, op);
329 }
330
331 /**
Jonathan Hart54b406b2015-03-06 16:24:14 -0800332 * Creates a push MPLS header instruction.
333 *
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800334 * @return a L2 modification.
335 */
336 public static Instruction pushMpls() {
Jian Li11260a02016-05-19 13:07:22 -0700337 return new L2ModificationInstruction.ModMplsHeaderInstruction(
alshabibd17abc22015-04-21 18:26:35 -0700338 L2ModificationInstruction.L2SubType.MPLS_PUSH,
alshabib7b808c52015-06-26 14:22:24 -0700339 EthType.EtherType.MPLS_UNICAST.ethType());
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800340 }
341
342 /**
Jonathan Hart54b406b2015-03-06 16:24:14 -0800343 * Creates a pop MPLS header instruction.
344 *
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800345 * @return a L2 modification.
346 */
347 public static Instruction popMpls() {
Jian Li11260a02016-05-19 13:07:22 -0700348 return new L2ModificationInstruction.ModMplsHeaderInstruction(
alshabibd17abc22015-04-21 18:26:35 -0700349 L2ModificationInstruction.L2SubType.MPLS_POP,
alshabib7b808c52015-06-26 14:22:24 -0700350 EthType.EtherType.MPLS_UNICAST.ethType());
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800351 }
alshabib7410fea2014-09-16 13:48:39 -0700352
sangho3f97a17d2015-01-29 22:56:29 -0800353 /**
Jonathan Hart54b406b2015-03-06 16:24:14 -0800354 * Creates a pop MPLS header instruction with a particular ethertype.
sangho3f97a17d2015-01-29 22:56:29 -0800355 *
356 * @param etherType Ethernet type to set
357 * @return a L2 modification.
alshabib7b808c52015-06-26 14:22:24 -0700358 */
359 public static Instruction popMpls(EthType etherType) {
360 checkNotNull(etherType, "Ethernet type cannot be null");
Jian Li11260a02016-05-19 13:07:22 -0700361 return new L2ModificationInstruction.ModMplsHeaderInstruction(
alshabibd17abc22015-04-21 18:26:35 -0700362 L2ModificationInstruction.L2SubType.MPLS_POP, etherType);
sangho3f97a17d2015-01-29 22:56:29 -0800363 }
364
Saurav Dasfbe25c52015-03-04 11:12:00 -0800365 /**
Jonathan Hart54b406b2015-03-06 16:24:14 -0800366 * Creates a pop VLAN header instruction.
367 *
368 * @return a L2 modification
Saurav Dasfbe25c52015-03-04 11:12:00 -0800369 */
370 public static Instruction popVlan() {
Jian Li11260a02016-05-19 13:07:22 -0700371 return new L2ModificationInstruction.ModVlanHeaderInstruction(
alshabibd17abc22015-04-21 18:26:35 -0700372 L2ModificationInstruction.L2SubType.VLAN_POP);
Saurav Dasfbe25c52015-03-04 11:12:00 -0800373 }
374
375 /**
Jonathan Hart54b406b2015-03-06 16:24:14 -0800376 * Creates a push VLAN header instruction.
377 *
378 * @return a L2 modification
379 */
380 public static Instruction pushVlan() {
Jian Li11260a02016-05-19 13:07:22 -0700381 return new L2ModificationInstruction.ModVlanHeaderInstruction(
alshabib7b808c52015-06-26 14:22:24 -0700382 L2ModificationInstruction.L2SubType.VLAN_PUSH,
383 EthType.EtherType.VLAN.ethType());
Jonathan Hart54b406b2015-03-06 16:24:14 -0800384 }
385
386 /**
Konstantinos Kanonakis9215ff22016-11-04 13:28:11 -0500387 * Creates a push VLAN header instruction using the supplied Ethernet type.
388 *
389 * @param ethType the Ethernet type to use
390 * @return a L2 modification
391 */
392 public static Instruction pushVlan(EthType ethType) {
393 return new L2ModificationInstruction.ModVlanHeaderInstruction(
394 L2ModificationInstruction.L2SubType.VLAN_PUSH,
395 ethType);
396 }
397
398 /**
alshabibd17abc22015-04-21 18:26:35 -0700399 * Sends the packet to the table id.
Jonathan Hart54b406b2015-03-06 16:24:14 -0800400 *
alshabibd17abc22015-04-21 18:26:35 -0700401 * @param tableId flow rule table id
Thomas Vachuska3e2b6512015-03-05 09:25:03 -0800402 * @return table type transition instruction
Saurav Dasfbe25c52015-03-04 11:12:00 -0800403 */
alshabibd17abc22015-04-21 18:26:35 -0700404 public static Instruction transition(Integer tableId) {
405 checkNotNull(tableId, "Table id cannot be null");
406 return new TableTypeTransition(tableId);
alshabib9af70072015-02-09 14:34:16 -0800407 }
408
Yuta HIGUCHI6a479642015-02-08 01:28:50 -0800409 /**
Saurav Das86af8f12015-05-25 23:55:33 -0700410 * Writes metadata to associate with a packet.
411 *
412 * @param metadata the metadata value to write
413 * @param metadataMask the bits to mask for the metadata value
414 * @return metadata instruction
415 */
416 public static Instruction writeMetadata(long metadata, long metadataMask) {
417 return new MetadataInstruction(metadata, metadataMask);
418 }
419
420 /**
Hyunsun Moona08c5d02015-07-14 17:53:00 -0700421 * Creates a Tunnel ID modification.
422 *
423 * @param tunnelId the Tunnel ID to modify to
424 * @return a L2 modification
425 */
426 public static L2ModificationInstruction modTunnelId(long tunnelId) {
427 checkNotNull(tunnelId, "Tunnel id cannot be null");
428 return new L2ModificationInstruction.ModTunnelIdInstruction(tunnelId);
429 }
430
431 /**
Hyunsun Moonc8bd97c2015-07-18 22:47:33 -0700432 * Creates a TCP src modification.
433 *
434 * @param port the TCP port number to modify to
435 * @return a L4 modification
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700436 */
437 public static L4ModificationInstruction modTcpSrc(TpPort port) {
438 checkNotNull(port, "Src TCP port cannot be null");
Hyunsun Moonc8bd97c2015-07-18 22:47:33 -0700439 return new ModTransportPortInstruction(L4SubType.TCP_SRC, port);
440 }
441
442 /**
443 * Creates a TCP dst modification.
444 *
445 * @param port the TCP port number to modify to
446 * @return a L4 modification
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700447 */
448 public static L4ModificationInstruction modTcpDst(TpPort port) {
449 checkNotNull(port, "Dst TCP port cannot be null");
Hyunsun Moonc8bd97c2015-07-18 22:47:33 -0700450 return new ModTransportPortInstruction(L4SubType.TCP_DST, port);
451 }
452
453 /**
454 * Creates a UDP src modification.
455 *
456 * @param port the UDP port number to modify to
457 * @return a L4 modification
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700458 */
459 public static L4ModificationInstruction modUdpSrc(TpPort port) {
460 checkNotNull(port, "Src UDP port cannot be null");
Hyunsun Moonc8bd97c2015-07-18 22:47:33 -0700461 return new ModTransportPortInstruction(L4SubType.UDP_SRC, port);
462 }
463
464 /**
465 * Creates a UDP dst modification.
466 *
467 * @param port the UDP port number to modify to
468 * @return a L4 modification
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700469 */
470 public static L4ModificationInstruction modUdpDst(TpPort port) {
471 checkNotNull(port, "Dst UDP port cannot be null");
Hyunsun Moonc8bd97c2015-07-18 22:47:33 -0700472 return new ModTransportPortInstruction(L4SubType.UDP_DST, port);
473 }
474
475 /**
Frank Wangdf383212017-06-23 09:17:41 +0800476 * Creates a protocol independent instruction.
477 *
478 * @param piTableAction protocol independent instruction
479 * @return extension instruction
480 */
481 public static PiInstruction piTableAction(PiTableAction piTableAction) {
482 checkNotNull(piTableAction, "PiTableAction instruction cannot be null");
483 return new PiInstruction(piTableAction);
484 }
485
486 /**
Jonathan Hart3c259162015-10-21 21:31:19 -0700487 * Creates an extension instruction.
488 *
489 * @param extension extension instruction
490 * @param deviceId device ID
491 * @return extension instruction
492 */
alshabib880b6442015-11-23 22:13:04 -0800493 public static ExtensionInstructionWrapper extension(ExtensionTreatment extension,
Jonathan Hart3c259162015-10-21 21:31:19 -0700494 DeviceId deviceId) {
495 checkNotNull(extension, "Extension instruction cannot be null");
496 checkNotNull(deviceId, "Device ID cannot be null");
497 return new ExtensionInstructionWrapper(extension, deviceId);
498 }
499
500 /**
Charles Chan7efabeb2015-09-28 15:12:19 -0700501 * No Action instruction.
502 */
503 public static final class NoActionInstruction implements Instruction {
504
505 private NoActionInstruction() {}
506
507 @Override
508 public Type type() {
509 return Type.NOACTION;
510 }
511
512 @Override
513 public String toString() {
Jonathan Hartc7840bd2016-01-21 23:26:29 -0800514 return type().toString();
Charles Chan7efabeb2015-09-28 15:12:19 -0700515 }
516
517 @Override
518 public int hashCode() {
HIGUCHI Yutaca9cc8e2015-10-29 23:26:51 -0700519 return type().ordinal();
Charles Chan7efabeb2015-09-28 15:12:19 -0700520 }
521
522 @Override
523 public boolean equals(Object obj) {
524 if (this == obj) {
525 return true;
526 }
527 if (obj instanceof NoActionInstruction) {
528 return true;
529 }
530 return false;
531 }
532 }
533
534 /**
Yuta HIGUCHI6a479642015-02-08 01:28:50 -0800535 * Output Instruction.
sangho8995ac52015-02-04 11:29:03 -0800536 */
alshabib55a55d92014-09-16 11:59:31 -0700537 public static final class OutputInstruction implements Instruction {
538 private final PortNumber port;
539
540 private OutputInstruction(PortNumber port) {
541 this.port = port;
542 }
543
544 public PortNumber port() {
545 return port;
546 }
547
548 @Override
549 public Type type() {
550 return Type.OUTPUT;
551 }
Jonathan Hartc7840bd2016-01-21 23:26:29 -0800552
alshabib99b8fdc2014-09-25 14:30:22 -0700553 @Override
554 public String toString() {
Jonathan Hartc7840bd2016-01-21 23:26:29 -0800555 return type().toString() + SEPARATOR + port.toString();
alshabib99b8fdc2014-09-25 14:30:22 -0700556 }
alshabib8ca53902014-10-07 13:11:17 -0700557
558 @Override
559 public int hashCode() {
Thomas Vachuska6c8eff32015-05-27 16:11:44 -0700560 return Objects.hash(type().ordinal(), port);
alshabib8ca53902014-10-07 13:11:17 -0700561 }
562
563 @Override
564 public boolean equals(Object obj) {
565 if (this == obj) {
566 return true;
567 }
568 if (obj instanceof OutputInstruction) {
569 OutputInstruction that = (OutputInstruction) obj;
Yuta HIGUCHI4ce65292014-11-01 12:09:55 -0700570 return Objects.equals(port, that.port);
alshabib8ca53902014-10-07 13:11:17 -0700571
572 }
573 return false;
574 }
alshabib55a55d92014-09-16 11:59:31 -0700575 }
576
Yuta HIGUCHI6a479642015-02-08 01:28:50 -0800577 /**
578 * Group Instruction.
sangho8995ac52015-02-04 11:29:03 -0800579 */
sangho8995ac52015-02-04 11:29:03 -0800580 public static final class GroupInstruction implements Instruction {
581 private final GroupId groupId;
582
583 private GroupInstruction(GroupId groupId) {
584 this.groupId = groupId;
585 }
586
587 public GroupId groupId() {
588 return groupId;
589 }
590
591 @Override
592 public Type type() {
593 return Type.GROUP;
594 }
alshabib9af70072015-02-09 14:34:16 -0800595
sangho8995ac52015-02-04 11:29:03 -0800596 @Override
597 public String toString() {
Saurav Das0fd79d92016-03-07 10:58:36 -0800598 return type().toString() + SEPARATOR + "0x" + Integer.toHexString(groupId.id());
sangho8995ac52015-02-04 11:29:03 -0800599 }
600
601 @Override
602 public int hashCode() {
Thomas Vachuska6c8eff32015-05-27 16:11:44 -0700603 return Objects.hash(type().ordinal(), groupId);
sangho8995ac52015-02-04 11:29:03 -0800604 }
605
606 @Override
607 public boolean equals(Object obj) {
608 if (this == obj) {
609 return true;
610 }
611 if (obj instanceof GroupInstruction) {
612 GroupInstruction that = (GroupInstruction) obj;
613 return Objects.equals(groupId, that.groupId);
614
615 }
616 return false;
617 }
618 }
619
Saurav Das86af8f12015-05-25 23:55:33 -0700620 /**
Steffen Gebertbbfdaaa2015-09-29 11:01:46 +0200621 * Set-Queue Instruction.
622 */
623 public static final class SetQueueInstruction implements Instruction {
624 private final long queueId;
Steffen Gebertba2d3b72015-10-22 11:14:31 +0200625 private final PortNumber port;
Steffen Gebertbbfdaaa2015-09-29 11:01:46 +0200626
627 private SetQueueInstruction(long queueId) {
628 this.queueId = queueId;
Steffen Gebertba2d3b72015-10-22 11:14:31 +0200629 this.port = null;
630 }
631
632 private SetQueueInstruction(long queueId, PortNumber port) {
633 this.queueId = queueId;
634 this.port = port;
Steffen Gebertbbfdaaa2015-09-29 11:01:46 +0200635 }
636
637 public long queueId() {
638 return queueId;
639 }
640
Steffen Gebertba2d3b72015-10-22 11:14:31 +0200641 public PortNumber port() {
642 return port;
643 }
644
Steffen Gebertbbfdaaa2015-09-29 11:01:46 +0200645 @Override
646 public Type type() {
647 return Type.QUEUE;
648 }
649
650 @Override
651 public String toString() {
Steffen Gebertba2d3b72015-10-22 11:14:31 +0200652 MoreObjects.ToStringHelper toStringHelper = toStringHelper(type().toString());
653 toStringHelper.add("queueId", queueId);
654
655 if (port() != null) {
656 toStringHelper.add("port", port);
657 }
658 return toStringHelper.toString();
Steffen Gebertbbfdaaa2015-09-29 11:01:46 +0200659 }
660
661 @Override
662 public int hashCode() {
Steffen Gebertba2d3b72015-10-22 11:14:31 +0200663 return Objects.hash(type().ordinal(), queueId, port);
Steffen Gebertbbfdaaa2015-09-29 11:01:46 +0200664 }
665
666 @Override
667 public boolean equals(Object obj) {
668 if (this == obj) {
669 return true;
670 }
671 if (obj instanceof SetQueueInstruction) {
672 SetQueueInstruction that = (SetQueueInstruction) obj;
Steffen Gebertba2d3b72015-10-22 11:14:31 +0200673 return Objects.equals(queueId, that.queueId) && Objects.equals(port, that.port);
Steffen Gebertbbfdaaa2015-09-29 11:01:46 +0200674
675 }
676 return false;
677 }
678 }
679
680 /**
alshabib10c810b2015-08-18 16:59:04 -0700681 * A meter instruction.
682 */
683 public static final class MeterInstruction implements Instruction {
684 private final MeterId meterId;
685
686 private MeterInstruction(MeterId meterId) {
687 this.meterId = meterId;
688 }
689
690 public MeterId meterId() {
691 return meterId;
692 }
693
694 @Override
695 public Type type() {
696 return Type.METER;
697 }
698
699 @Override
700 public String toString() {
Jonathan Hartc7840bd2016-01-21 23:26:29 -0800701 return type().toString() + SEPARATOR + meterId.id();
alshabib10c810b2015-08-18 16:59:04 -0700702 }
703
704 @Override
705 public int hashCode() {
706 return Objects.hash(type().ordinal(), meterId);
707 }
708
709 @Override
710 public boolean equals(Object obj) {
711 if (this == obj) {
712 return true;
713 }
714 if (obj instanceof MeterInstruction) {
715 MeterInstruction that = (MeterInstruction) obj;
716 return Objects.equals(meterId, that.meterId);
717
718 }
719 return false;
720 }
721 }
722
723 /**
Saurav Das86af8f12015-05-25 23:55:33 -0700724 * Transition instruction.
725 */
alshabibd17abc22015-04-21 18:26:35 -0700726 public static class TableTypeTransition implements Instruction {
727 private final Integer tableId;
728
729 TableTypeTransition(Integer tableId) {
730 this.tableId = tableId;
alshabib9af70072015-02-09 14:34:16 -0800731 }
732
733 @Override
734 public Type type() {
735 return Type.TABLE;
736 }
737
alshabibd17abc22015-04-21 18:26:35 -0700738 public Integer tableId() {
739 return this.tableId;
alshabib9af70072015-02-09 14:34:16 -0800740 }
741
742 @Override
743 public String toString() {
Jonathan Hartc7840bd2016-01-21 23:26:29 -0800744 return type().toString() + SEPARATOR + this.tableId;
alshabib9af70072015-02-09 14:34:16 -0800745 }
746
747 @Override
748 public int hashCode() {
Thomas Vachuska6c8eff32015-05-27 16:11:44 -0700749 return Objects.hash(type().ordinal(), tableId);
alshabib9af70072015-02-09 14:34:16 -0800750 }
751
752 @Override
753 public boolean equals(Object obj) {
754 if (this == obj) {
755 return true;
756 }
757 if (obj instanceof TableTypeTransition) {
758 TableTypeTransition that = (TableTypeTransition) obj;
alshabibd17abc22015-04-21 18:26:35 -0700759 return Objects.equals(tableId, that.tableId);
alshabib9af70072015-02-09 14:34:16 -0800760
761 }
762 return false;
763 }
Saurav Das86af8f12015-05-25 23:55:33 -0700764 }
alshabib9af70072015-02-09 14:34:16 -0800765
Saurav Das86af8f12015-05-25 23:55:33 -0700766 /**
767 * Metadata instruction.
768 */
769 public static class MetadataInstruction implements Instruction {
770 private final long metadata;
771 private final long metadataMask;
772
773 MetadataInstruction(long metadata, long metadataMask) {
774 this.metadata = metadata;
775 this.metadataMask = metadataMask;
776 }
777
778 @Override
779 public Type type() {
780 return Type.METADATA;
781 }
782
783 public long metadata() {
784 return this.metadata;
785 }
786
787 public long metadataMask() {
788 return this.metadataMask;
789 }
790
791 @Override
792 public String toString() {
Jonathan Hartc7840bd2016-01-21 23:26:29 -0800793 return type().toString() + SEPARATOR +
794 Long.toHexString(this.metadata) + "/" +
795 Long.toHexString(this.metadataMask);
Saurav Das86af8f12015-05-25 23:55:33 -0700796 }
797
798 @Override
799 public int hashCode() {
Thomas Vachuska6c8eff32015-05-27 16:11:44 -0700800 return Objects.hash(type().ordinal(), metadata, metadataMask);
Saurav Das86af8f12015-05-25 23:55:33 -0700801 }
802
803 @Override
804 public boolean equals(Object obj) {
805 if (this == obj) {
806 return true;
807 }
808 if (obj instanceof MetadataInstruction) {
809 MetadataInstruction that = (MetadataInstruction) obj;
810 return Objects.equals(metadata, that.metadata) &&
811 Objects.equals(metadataMask, that.metadataMask);
812
813 }
814 return false;
815 }
alshabib9af70072015-02-09 14:34:16 -0800816 }
Saurav Das73a7dd42015-08-19 22:20:31 -0700817
Jonathan Hart3c259162015-10-21 21:31:19 -0700818 /**
819 * Extension instruction.
820 */
821 public static class ExtensionInstructionWrapper implements Instruction {
alshabib880b6442015-11-23 22:13:04 -0800822 private final ExtensionTreatment extensionTreatment;
Jonathan Hart3c259162015-10-21 21:31:19 -0700823 private final DeviceId deviceId;
824
alshabib880b6442015-11-23 22:13:04 -0800825 ExtensionInstructionWrapper(ExtensionTreatment extension, DeviceId deviceId) {
826 extensionTreatment = extension;
Jonathan Hart3c259162015-10-21 21:31:19 -0700827 this.deviceId = deviceId;
828 }
829
alshabib880b6442015-11-23 22:13:04 -0800830 public ExtensionTreatment extensionInstruction() {
831 return extensionTreatment;
Jonathan Hart3c259162015-10-21 21:31:19 -0700832 }
833
834 public DeviceId deviceId() {
835 return deviceId;
836 }
837
838 @Override
839 public Type type() {
840 return Type.EXTENSION;
841 }
842
843 @Override
844 public String toString() {
Jonathan Hartc7840bd2016-01-21 23:26:29 -0800845 return type().toString() + SEPARATOR + deviceId + "/" + extensionTreatment;
Jonathan Hart3c259162015-10-21 21:31:19 -0700846 }
847
848 @Override
849 public int hashCode() {
alshabib880b6442015-11-23 22:13:04 -0800850 return Objects.hash(type().ordinal(), extensionTreatment, deviceId);
Jonathan Hart3c259162015-10-21 21:31:19 -0700851 }
852
853 @Override
854 public boolean equals(Object obj) {
855 if (this == obj) {
856 return true;
857 }
858 if (obj instanceof ExtensionInstructionWrapper) {
859 ExtensionInstructionWrapper that = (ExtensionInstructionWrapper) obj;
alshabib880b6442015-11-23 22:13:04 -0800860 return Objects.equals(extensionTreatment, that.extensionTreatment)
Jonathan Hart3c259162015-10-21 21:31:19 -0700861 && Objects.equals(deviceId, that.deviceId);
862
863 }
864 return false;
865 }
866 }
867
alshabib55a55d92014-09-16 11:59:31 -0700868}
alshabib8ca53902014-10-07 13:11:17 -0700869
870