blob: 3d76f3b5d4291f95eab48f36bcd52f858744738d [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;
tom8bb16062014-09-12 14:47:46 -070017
Pavlin Radoslavov855ea2d2014-10-30 15:32:39 -070018import org.onlab.packet.IpAddress;
alshabib010c31d2014-09-26 10:01:12 -070019import org.onlab.packet.MacAddress;
Michele Santuari4b6019e2014-12-19 11:31:45 +010020import org.onlab.packet.MplsLabel;
alshabib010c31d2014-09-26 10:01:12 -070021import org.onlab.packet.VlanId;
Jonathan Hart54b406b2015-03-06 16:24:14 -080022import org.onosproject.core.GroupId;
23import org.onosproject.net.PortNumber;
24import org.onosproject.net.flow.instructions.Instruction;
alshabib346b5b32015-03-06 00:42:16 -080025import org.onosproject.net.flow.instructions.Instructions;
alshabib55a55d92014-09-16 11:59:31 -070026
Jonathan Hart54b406b2015-03-06 16:24:14 -080027import java.util.List;
28
tom8bb16062014-09-12 14:47:46 -070029/**
30 * Abstraction of network traffic treatment.
31 */
32public interface TrafficTreatment {
33
34 /**
35 * Returns list of instructions on how to treat traffic.
36 *
37 * @return list of treatment instructions
38 */
alshabib346b5b32015-03-06 00:42:16 -080039 @Deprecated
tom8bb16062014-09-12 14:47:46 -070040 List<Instruction> instructions();
41
42 /**
alshabib346b5b32015-03-06 00:42:16 -080043 * Returns the list of treatment instructions that will be applied
44 * further down the pipeline.
45 * @return list of treatment instructions
46 */
47 List<Instruction> deferred();
48
49 /**
50 * Returns the list of treatment instructions that will be applied
51 * immediately.
52 * @return list of treatment instructions
53 */
54 List<Instruction> immediate();
55
56 /**
Jonathan Hart8ef6d3b2015-03-08 21:21:27 -070057 * Returns the list of all instructions in the treatment, both immediate and
58 * deferred.
59 *
60 * @return list of treatment instructions
61 */
62 List<Instruction> allInstructions();
63
64 /**
alshabib346b5b32015-03-06 00:42:16 -080065 * Returns the next table in the pipeline.
66 * @return a table transition; may be null.
67 */
68 Instructions.TableTypeTransition tableTransition();
69
70 /**
71 * Whether the deferred treatment instructions will be cleared
72 * by the device.
73 * @return a boolean
74 */
75 Boolean clearedDeferred();
76
77 /**
tom8bb16062014-09-12 14:47:46 -070078 * Builder of traffic treatment entities.
79 */
80 public interface Builder {
81
82 /**
alshabib010c31d2014-09-26 10:01:12 -070083 * Adds an instruction to the builder.
Sho SHIMIZUbdaea832014-11-12 11:29:38 -080084 *
alshabib010c31d2014-09-26 10:01:12 -070085 * @param instruction an instruction
86 * @return a treatment builder
tom8bb16062014-09-12 14:47:46 -070087 */
alshabib369d2942014-09-12 17:59:35 -070088 Builder add(Instruction instruction);
tom8bb16062014-09-12 14:47:46 -070089
90 /**
Thomas Vachuskaf4df0052015-01-06 12:30:11 -080091 * Adds a drop instruction.
92 *
93 * @return a treatment builder
alshabib010c31d2014-09-26 10:01:12 -070094 */
Thomas Vachuskaf4df0052015-01-06 12:30:11 -080095 public Builder drop();
96
97 /**
98 * Adds a punt-to-controller instruction.
99 *
100 * @return a treatment builder
101 */
102 public Builder punt();
alshabib010c31d2014-09-26 10:01:12 -0700103
104 /**
105 * Set the output port.
Sho SHIMIZUbdaea832014-11-12 11:29:38 -0800106 *
alshabib010c31d2014-09-26 10:01:12 -0700107 * @param number the out port
108 * @return a treatment builder
109 */
110 public Builder setOutput(PortNumber number);
111
112 /**
113 * Sets the src l2 address.
Sho SHIMIZUbdaea832014-11-12 11:29:38 -0800114 *
alshabib010c31d2014-09-26 10:01:12 -0700115 * @param addr a macaddress
116 * @return a treatment builder
117 */
118 public Builder setEthSrc(MacAddress addr);
119
120 /**
121 * Sets the dst l2 address.
Sho SHIMIZUbdaea832014-11-12 11:29:38 -0800122 *
alshabib010c31d2014-09-26 10:01:12 -0700123 * @param addr a macaddress
124 * @return a treatment builder
125 */
126 public Builder setEthDst(MacAddress addr);
127
128 /**
129 * Sets the vlan id.
Sho SHIMIZUbdaea832014-11-12 11:29:38 -0800130 *
alshabib010c31d2014-09-26 10:01:12 -0700131 * @param id a vlanid
132 * @return a treatment builder
133 */
134 public Builder setVlanId(VlanId id);
135
136 /**
137 * Sets the vlan priority.
Sho SHIMIZUbdaea832014-11-12 11:29:38 -0800138 *
alshabib010c31d2014-09-26 10:01:12 -0700139 * @param pcp a vlan priority
140 * @return a treatment builder
141 */
142 public Builder setVlanPcp(Byte pcp);
143
144 /**
alshabibab21b2d2015-03-04 18:35:33 -0800145 * Strips the vlan tag if there is one.
146 * @return a treatment builder
147 */
148 public Builder stripVlan();
149
150 /**
alshabib010c31d2014-09-26 10:01:12 -0700151 * Sets the src l3 address.
Sho SHIMIZUbdaea832014-11-12 11:29:38 -0800152 *
alshabib010c31d2014-09-26 10:01:12 -0700153 * @param addr an ip
154 * @return a treatment builder
155 */
Pavlin Radoslavov855ea2d2014-10-30 15:32:39 -0700156 public Builder setIpSrc(IpAddress addr);
alshabib010c31d2014-09-26 10:01:12 -0700157
158 /**
159 * Sets the dst l3 address.
Sho SHIMIZUbdaea832014-11-12 11:29:38 -0800160 *
alshabib010c31d2014-09-26 10:01:12 -0700161 * @param addr an ip
162 * @return a treatment builder
163 */
Pavlin Radoslavov855ea2d2014-10-30 15:32:39 -0700164 public Builder setIpDst(IpAddress addr);
alshabib010c31d2014-09-26 10:01:12 -0700165
166 /**
Pavlin Radoslavovfebe82c2015-02-11 19:08:15 -0800167 * Decrement the TTL in IP header by one.
sangho3f97a17d2015-01-29 22:56:29 -0800168 *
169 * @return a treatment builder
170 */
171 public Builder decNwTtl();
172
173 /**
174 * Copy the TTL to outer protocol layer.
175 *
176 * @return a treatment builder
177 */
178 public Builder copyTtlOut();
179
180 /**
181 * Copy the TTL to inner protocol layer.
182 *
183 * @return a treatment builder
184 */
185 public Builder copyTtlIn();
186
187 /**
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800188 * Push MPLS ether type.
Thomas Vachuskaf4df0052015-01-06 12:30:11 -0800189 *
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800190 * @return a treatment builder.
191 */
192 public Builder pushMpls();
193
194 /**
195 * Pops MPLS ether type.
Thomas Vachuskaf4df0052015-01-06 12:30:11 -0800196 *
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800197 * @return a treatment builder.
198 */
199 public Builder popMpls();
200
201 /**
Michele Santuari4b6019e2014-12-19 11:31:45 +0100202 * Pops MPLS ether type and set the new ethertype.
sangho3f97a17d2015-01-29 22:56:29 -0800203 *
Michele Santuari4b6019e2014-12-19 11:31:45 +0100204 * @param etherType an ether type
sangho3f97a17d2015-01-29 22:56:29 -0800205 * @return a treatment builder.
206 */
Michele Santuari4b6019e2014-12-19 11:31:45 +0100207 public Builder popMpls(Short etherType);
sangho3f97a17d2015-01-29 22:56:29 -0800208
209 /**
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800210 * Sets the mpls label.
Thomas Vachuskaf4df0052015-01-06 12:30:11 -0800211 *
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800212 * @param mplsLabel MPLS label.
213 * @return a treatment builder.
214 */
Michele Santuari4b6019e2014-12-19 11:31:45 +0100215 public Builder setMpls(MplsLabel mplsLabel);
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800216
217 /**
sangho3f97a17d2015-01-29 22:56:29 -0800218 * Decrement MPLS TTL.
219 *
220 * @return a treatment builder
221 */
222 public Builder decMplsTtl();
223
224 /**
Marc De Leenheer49087752014-10-23 13:54:09 -0700225 * Sets the optical channel ID or lambda.
Sho SHIMIZUbdaea832014-11-12 11:29:38 -0800226 *
Marc De Leenheer49087752014-10-23 13:54:09 -0700227 * @param lambda optical channel ID
228 * @return a treatment builder
229 */
230 public Builder setLambda(short lambda);
231
232 /**
sangho8995ac52015-02-04 11:29:03 -0800233 * Sets the group ID.
234 *
235 * @param groupId group ID
236 * @return a treatment builder
237 */
238 public Builder group(GroupId groupId);
239
alshabib9af70072015-02-09 14:34:16 -0800240
241 /**
242 * Sets the next table type to transition to.
243 *
244 * @param type the table type
245 * @return a treatement builder
246 */
247 public Builder transition(FlowRule.Type type);
248
sangho8995ac52015-02-04 11:29:03 -0800249 /**
Saurav Dasfbe25c52015-03-04 11:12:00 -0800250 * Pops outermost VLAN tag.
251 *
252 * @return a treatment builder.
253 */
254 public Builder popVlan();
255
256 /**
Jonathan Hart54b406b2015-03-06 16:24:14 -0800257 * Pushes a new VLAN tag.
258 *
259 * @return a treatment builder.
260 */
261 public Builder pushVlan();
262
263 /**
alshabib346b5b32015-03-06 00:42:16 -0800264 * Any instructions preceded by this method call will be deferred.
265 * @return a treatment builder
266 */
267 public Builder deferred();
268
269 /**
270 * Any instructions preceded by this method call will be immediate.
271 * @return a treatment builder
272 */
273 public Builder immediate();
274
275
276 /**
277 * Instructs the device to clear the deferred instructions set.
278 * @return a treatment builder
279 */
280 public Builder wipeDeferred();
281
282 /**
tom8bb16062014-09-12 14:47:46 -0700283 * Builds an immutable traffic treatment descriptor.
Brian O'Connor6b528132015-03-10 16:39:52 -0700284 * <p>
285 * If the treatment is empty when build() is called, it will add a default
286 * drop rule automatically. For a treatment that is actually empty, use
287 * {@link org.onosproject.net.flow.DefaultTrafficTreatment#emptyTreatment}.
288 * </p>
tom8bb16062014-09-12 14:47:46 -0700289 *
290 * @return traffic treatment
291 */
292 TrafficTreatment build();
tom8bb16062014-09-12 14:47:46 -0700293 }
tom8bb16062014-09-12 14:47:46 -0700294}