blob: c97b66aa48529ce964ddb30599e249bceec1d44e [file] [log] [blame]
Thomas Vachuska83e090e2014-10-22 14:25:35 -07001/*
Ray Milkey34c95902015-04-15 09:47:53 -07002 * Copyright 2014-2015 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;
alshabib7b2748f2014-09-16 20:21:11 -070017
Brian O'Connor6b528132015-03-10 16:39:52 -070018import com.google.common.base.MoreObjects;
19import com.google.common.collect.ImmutableSet;
20import org.onlab.packet.Ip6Address;
21import org.onlab.packet.IpPrefix;
22import org.onlab.packet.MacAddress;
23import org.onlab.packet.MplsLabel;
Hyunsun Mooncf732fb2015-08-22 21:04:23 -070024import org.onlab.packet.TpPort;
Brian O'Connor6b528132015-03-10 16:39:52 -070025import org.onlab.packet.VlanId;
Sho SHIMIZU260439d2015-06-30 16:35:34 -070026import org.onosproject.net.IndexedLambda;
Brian O'Connor6b528132015-03-10 16:39:52 -070027import org.onosproject.net.PortNumber;
28import org.onosproject.net.flow.criteria.Criteria;
29import org.onosproject.net.flow.criteria.Criterion;
30
31import java.util.Collections;
Jonathan Hartd87aeca2014-10-21 10:42:52 -070032import java.util.HashMap;
33import java.util.Map;
34import java.util.Objects;
35import java.util.Set;
36
tom9a693fd2014-10-03 11:32:19 -070037/**
38 * Default traffic selector implementation.
39 */
alshabib7b2748f2014-09-16 20:21:11 -070040public final class DefaultTrafficSelector implements TrafficSelector {
41
tom9a693fd2014-10-03 11:32:19 -070042 private final Set<Criterion> criteria;
alshabib7b2748f2014-09-16 20:21:11 -070043
Brian O'Connor6b528132015-03-10 16:39:52 -070044 private static final TrafficSelector EMPTY
45 = new DefaultTrafficSelector(Collections.emptySet());
46
tom9a693fd2014-10-03 11:32:19 -070047 /**
48 * Creates a new traffic selector with the specified criteria.
49 *
50 * @param criteria criteria
51 */
52 private DefaultTrafficSelector(Set<Criterion> criteria) {
Yuta HIGUCHI2809bf32014-10-20 22:44:12 -070053 this.criteria = ImmutableSet.copyOf(criteria);
alshabib7b2748f2014-09-16 20:21:11 -070054 }
55
56 @Override
alshabibba5ac482014-10-02 17:15:20 -070057 public Set<Criterion> criteria() {
tom9a693fd2014-10-03 11:32:19 -070058 return criteria;
alshabib7b2748f2014-09-16 20:21:11 -070059 }
60
alshabibba5ac482014-10-02 17:15:20 -070061 @Override
Jonathan Hart936c49d2014-10-23 16:38:59 -070062 public Criterion getCriterion(Criterion.Type type) {
63 for (Criterion c : criteria) {
64 if (c.type() == type) {
65 return c;
66 }
67 }
68 return null;
69 }
70
71 @Override
alshabibba5ac482014-10-02 17:15:20 -070072 public int hashCode() {
Thomas Vachuska9b2da212014-11-10 19:30:25 -080073 return criteria.hashCode();
alshabibba5ac482014-10-02 17:15:20 -070074 }
75
76 @Override
77 public boolean equals(Object obj) {
78 if (this == obj) {
79 return true;
80 }
81 if (obj instanceof DefaultTrafficSelector) {
82 DefaultTrafficSelector that = (DefaultTrafficSelector) obj;
tom9a693fd2014-10-03 11:32:19 -070083 return Objects.equals(criteria, that.criteria);
alshabibba5ac482014-10-02 17:15:20 -070084
85 }
86 return false;
87 }
88
Jonathan Hartd87aeca2014-10-21 10:42:52 -070089 @Override
90 public String toString() {
91 return MoreObjects.toStringHelper(getClass())
92 .add("criteria", criteria)
93 .toString();
94 }
95
tom9a693fd2014-10-03 11:32:19 -070096 /**
97 * Returns a new traffic selector builder.
98 *
99 * @return traffic selector builder
100 */
101 public static TrafficSelector.Builder builder() {
102 return new Builder();
103 }
alshabibba5ac482014-10-02 17:15:20 -0700104
tom9a693fd2014-10-03 11:32:19 -0700105 /**
Brian O'Connor6b528132015-03-10 16:39:52 -0700106 * Returns an empty traffic selector.
107 *
108 * @return empty traffic selector
109 */
110 public static TrafficSelector emptySelector() {
111 return EMPTY;
112 }
113
114 /**
tom9a693fd2014-10-03 11:32:19 -0700115 * Returns a new traffic selector builder primed to produce entities
116 * patterned after the supplied selector.
117 *
Yuta HIGUCHI5c947272014-11-03 21:39:21 -0800118 * @param selector base selector
tom9a693fd2014-10-03 11:32:19 -0700119 * @return traffic selector builder
120 */
121 public static TrafficSelector.Builder builder(TrafficSelector selector) {
122 return new Builder(selector);
123 }
alshabibba5ac482014-10-02 17:15:20 -0700124
tom9a693fd2014-10-03 11:32:19 -0700125 /**
126 * Builder of traffic selector entities.
127 */
128 public static final class Builder implements TrafficSelector.Builder {
alshabib7b2748f2014-09-16 20:21:11 -0700129
tom9a693fd2014-10-03 11:32:19 -0700130 private final Map<Criterion.Type, Criterion> selector = new HashMap<>();
alshabib7b2748f2014-09-16 20:21:11 -0700131
tom9a693fd2014-10-03 11:32:19 -0700132 private Builder() {
133 }
134
135 private Builder(TrafficSelector selector) {
136 for (Criterion c : selector.criteria()) {
137 add(c);
138 }
139 }
alshabib7b2748f2014-09-16 20:21:11 -0700140
141 @Override
alshabib010c31d2014-09-26 10:01:12 -0700142 public Builder add(Criterion criterion) {
tom9a693fd2014-10-03 11:32:19 -0700143 selector.put(criterion.type(), criterion);
alshabib7b2748f2014-09-16 20:21:11 -0700144 return this;
145 }
146
alshabibba5ac482014-10-02 17:15:20 -0700147 @Override
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800148 public Builder matchInPort(PortNumber port) {
alshabib010c31d2014-09-26 10:01:12 -0700149 return add(Criteria.matchInPort(port));
150 }
151
alshabibba5ac482014-10-02 17:15:20 -0700152 @Override
Pavlin Radoslavovd0fd8412015-02-04 13:57:00 -0800153 public Builder matchInPhyPort(PortNumber port) {
154 return add(Criteria.matchInPhyPort(port));
155 }
156
157 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800158 public Builder matchMetadata(long metadata) {
Pavlin Radoslavovd0fd8412015-02-04 13:57:00 -0800159 return add(Criteria.matchMetadata(metadata));
160 }
161
162 @Override
alshabib010c31d2014-09-26 10:01:12 -0700163 public Builder matchEthDst(MacAddress addr) {
164 return add(Criteria.matchEthDst(addr));
165 }
166
alshabibba5ac482014-10-02 17:15:20 -0700167 @Override
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800168 public Builder matchEthSrc(MacAddress addr) {
169 return add(Criteria.matchEthSrc(addr));
170 }
171
172 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800173 public Builder matchEthType(short ethType) {
alshabib010c31d2014-09-26 10:01:12 -0700174 return add(Criteria.matchEthType(ethType));
175 }
176
alshabibba5ac482014-10-02 17:15:20 -0700177 @Override
alshabib010c31d2014-09-26 10:01:12 -0700178 public Builder matchVlanId(VlanId vlanId) {
179 return add(Criteria.matchVlanId(vlanId));
180 }
181
alshabibba5ac482014-10-02 17:15:20 -0700182 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800183 public Builder matchVlanPcp(byte vlanPcp) {
alshabib010c31d2014-09-26 10:01:12 -0700184 return add(Criteria.matchVlanPcp(vlanPcp));
185 }
186
alshabibba5ac482014-10-02 17:15:20 -0700187 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800188 public Builder matchIPDscp(byte ipDscp) {
Pavlin Radoslavovd0fd8412015-02-04 13:57:00 -0800189 return add(Criteria.matchIPDscp(ipDscp));
190 }
191
192 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800193 public Builder matchIPEcn(byte ipEcn) {
Pavlin Radoslavovd0fd8412015-02-04 13:57:00 -0800194 return add(Criteria.matchIPEcn(ipEcn));
195 }
196
197 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800198 public Builder matchIPProtocol(byte proto) {
alshabib010c31d2014-09-26 10:01:12 -0700199 return add(Criteria.matchIPProtocol(proto));
200 }
201
alshabibba5ac482014-10-02 17:15:20 -0700202 @Override
alshabib010c31d2014-09-26 10:01:12 -0700203 public Builder matchIPSrc(IpPrefix ip) {
204 return add(Criteria.matchIPSrc(ip));
205 }
206
alshabibba5ac482014-10-02 17:15:20 -0700207 @Override
alshabib010c31d2014-09-26 10:01:12 -0700208 public Builder matchIPDst(IpPrefix ip) {
209 return add(Criteria.matchIPDst(ip));
210 }
211
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700212 @Deprecated
alshabib7b2748f2014-09-16 20:21:11 -0700213 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800214 public Builder matchTcpSrc(short tcpPort) {
Toshio Koide9c44c9a2014-10-09 11:44:36 -0700215 return add(Criteria.matchTcpSrc(tcpPort));
216 }
217
218 @Override
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700219 public Builder matchTcpSrc(TpPort tcpPort) {
220 return add(Criteria.matchTcpSrc(tcpPort));
221 }
222
223 @Deprecated
224 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800225 public Builder matchTcpDst(short tcpPort) {
Toshio Koide9c44c9a2014-10-09 11:44:36 -0700226 return add(Criteria.matchTcpDst(tcpPort));
227 }
228
229 @Override
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700230 public Builder matchTcpDst(TpPort tcpPort) {
231 return add(Criteria.matchTcpDst(tcpPort));
232 }
233
234 @Deprecated
235 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800236 public Builder matchUdpSrc(short udpPort) {
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800237 return add(Criteria.matchUdpSrc(udpPort));
238 }
239
240 @Override
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700241 public Builder matchUdpSrc(TpPort udpPort) {
242 return add(Criteria.matchUdpSrc(udpPort));
243 }
244
245 @Deprecated
246 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800247 public Builder matchUdpDst(short udpPort) {
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800248 return add(Criteria.matchUdpDst(udpPort));
249 }
250
251 @Override
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700252 public Builder matchUdpDst(TpPort udpPort) {
253 return add(Criteria.matchUdpDst(udpPort));
254 }
255
256 @Deprecated
257 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800258 public Builder matchSctpSrc(short sctpPort) {
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800259 return add(Criteria.matchSctpSrc(sctpPort));
260 }
261
262 @Override
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700263 public Builder matchSctpSrc(TpPort sctpPort) {
264 return add(Criteria.matchSctpSrc(sctpPort));
265 }
266
267 @Deprecated
268 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800269 public Builder matchSctpDst(short sctpPort) {
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800270 return add(Criteria.matchSctpDst(sctpPort));
271 }
272
273 @Override
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700274 public Builder matchSctpDst(TpPort sctpPort) {
275 return add(Criteria.matchSctpDst(sctpPort));
276 }
277
278 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800279 public Builder matchIcmpType(byte icmpType) {
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800280 return add(Criteria.matchIcmpType(icmpType));
281 }
282
283 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800284 public Builder matchIcmpCode(byte icmpCode) {
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800285 return add(Criteria.matchIcmpCode(icmpCode));
286 }
287
288 @Override
Charles M.C. Chan52fae7d2015-01-17 00:35:53 +0800289 public Builder matchIPv6Src(IpPrefix ip) {
290 return add(Criteria.matchIPv6Src(ip));
291 }
292
293 @Override
294 public Builder matchIPv6Dst(IpPrefix ip) {
295 return add(Criteria.matchIPv6Dst(ip));
296 }
297
298 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800299 public Builder matchIPv6FlowLabel(int flowLabel) {
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800300 return add(Criteria.matchIPv6FlowLabel(flowLabel));
301 }
302
303 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800304 public Builder matchIcmpv6Type(byte icmpv6Type) {
Kunihiro Ishiguro0f9aba82015-01-15 17:14:17 -0800305 return add(Criteria.matchIcmpv6Type(icmpv6Type));
306 }
307
308 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800309 public Builder matchIcmpv6Code(byte icmpv6Code) {
Kunihiro Ishiguro0f9aba82015-01-15 17:14:17 -0800310 return add(Criteria.matchIcmpv6Code(icmpv6Code));
311 }
312
313 @Override
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800314 public Builder matchIPv6NDTargetAddress(Ip6Address targetAddress) {
315 return add(Criteria.matchIPv6NDTargetAddress(targetAddress));
316 }
317
318 @Override
319 public Builder matchIPv6NDSourceLinkLayerAddress(MacAddress mac) {
320 return add(Criteria.matchIPv6NDSourceLinkLayerAddress(mac));
321 }
322
323 @Override
324 public Builder matchIPv6NDTargetLinkLayerAddress(MacAddress mac) {
325 return add(Criteria.matchIPv6NDTargetLinkLayerAddress(mac));
326 }
327
328 @Override
Michele Santuari4b6019e2014-12-19 11:31:45 +0100329 public Builder matchMplsLabel(MplsLabel mplsLabel) {
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800330 return add(Criteria.matchMplsLabel(mplsLabel));
331 }
332
333 @Override
Saurav Dasffc5bbc2015-08-18 23:30:19 -0700334 public Builder matchMplsBos(boolean mplsBos) {
335 return add(Criteria.matchMplsLabel(mplsBos));
336 }
337
338 @Override
Hyunsun Moona08c5d02015-07-14 17:53:00 -0700339 public TrafficSelector.Builder matchTunnelId(long tunnelId) {
340 return add(Criteria.matchTunnelId(tunnelId));
341 }
342
343 @Override
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800344 public Builder matchIPv6ExthdrFlags(short exthdrFlags) {
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800345 return add(Criteria.matchIPv6ExthdrFlags(exthdrFlags));
346 }
347
Sho SHIMIZUc72c8ea2015-05-06 16:01:47 -0700348 @Deprecated
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800349 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800350 public Builder matchLambda(short lambda) {
Sho SHIMIZU260439d2015-06-30 16:35:34 -0700351 return add(Criteria.matchLambda(new IndexedLambda(lambda)));
Marc De Leenheer49087752014-10-23 13:54:09 -0700352 }
353
Sho SHIMIZUc72c8ea2015-05-06 16:01:47 -0700354 @Deprecated
Marc De Leenheer49087752014-10-23 13:54:09 -0700355 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800356 public Builder matchOpticalSignalType(short signalType) {
Praseed Balakrishnan64369da2014-10-23 15:55:20 -0700357 return add(Criteria.matchOpticalSignalType(signalType));
Praseed Balakrishnan64369da2014-10-23 15:55:20 -0700358 }
359
360 @Override
alshabib7b2748f2014-09-16 20:21:11 -0700361 public TrafficSelector build() {
tom9a693fd2014-10-03 11:32:19 -0700362 return new DefaultTrafficSelector(ImmutableSet.copyOf(selector.values()));
alshabib7b2748f2014-09-16 20:21:11 -0700363 }
alshabib7b2748f2014-09-16 20:21:11 -0700364 }
alshabib7b2748f2014-09-16 20:21:11 -0700365}