blob: 4416456c16fb03449688d6aa6cf31d14dc9bd8a3 [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;
26import org.onosproject.net.PortNumber;
27import org.onosproject.net.flow.criteria.Criteria;
28import org.onosproject.net.flow.criteria.Criterion;
29
30import java.util.Collections;
Thomas Vachuska93c88042015-09-23 14:44:09 -070031import java.util.Comparator;
Jonathan Hartd87aeca2014-10-21 10:42:52 -070032import java.util.HashMap;
33import java.util.Map;
34import java.util.Objects;
35import java.util.Set;
Thomas Vachuska93c88042015-09-23 14:44:09 -070036import java.util.TreeSet;
Jonathan Hartd87aeca2014-10-21 10:42:52 -070037
tom9a693fd2014-10-03 11:32:19 -070038/**
39 * Default traffic selector implementation.
40 */
alshabib7b2748f2014-09-16 20:21:11 -070041public final class DefaultTrafficSelector implements TrafficSelector {
42
Thomas Vachuska93c88042015-09-23 14:44:09 -070043 private static final Comparator<? super Criterion> TYPE_COMPARATOR =
44 (c1, c2) -> c1.type().compareTo(c2.type());
45
tom9a693fd2014-10-03 11:32:19 -070046 private final Set<Criterion> criteria;
alshabib7b2748f2014-09-16 20:21:11 -070047
Brian O'Connor6b528132015-03-10 16:39:52 -070048 private static final TrafficSelector EMPTY
49 = new DefaultTrafficSelector(Collections.emptySet());
50
tom9a693fd2014-10-03 11:32:19 -070051 /**
52 * Creates a new traffic selector with the specified criteria.
53 *
54 * @param criteria criteria
55 */
56 private DefaultTrafficSelector(Set<Criterion> criteria) {
Thomas Vachuska93c88042015-09-23 14:44:09 -070057 TreeSet<Criterion> elements = new TreeSet<>(TYPE_COMPARATOR);
58 elements.addAll(criteria);
59 this.criteria = ImmutableSet.copyOf(elements);
alshabib7b2748f2014-09-16 20:21:11 -070060 }
61
62 @Override
alshabibba5ac482014-10-02 17:15:20 -070063 public Set<Criterion> criteria() {
tom9a693fd2014-10-03 11:32:19 -070064 return criteria;
alshabib7b2748f2014-09-16 20:21:11 -070065 }
66
alshabibba5ac482014-10-02 17:15:20 -070067 @Override
Jonathan Hart936c49d2014-10-23 16:38:59 -070068 public Criterion getCriterion(Criterion.Type type) {
69 for (Criterion c : criteria) {
70 if (c.type() == type) {
71 return c;
72 }
73 }
74 return null;
75 }
76
77 @Override
alshabibba5ac482014-10-02 17:15:20 -070078 public int hashCode() {
Thomas Vachuska9b2da212014-11-10 19:30:25 -080079 return criteria.hashCode();
alshabibba5ac482014-10-02 17:15:20 -070080 }
81
82 @Override
83 public boolean equals(Object obj) {
84 if (this == obj) {
85 return true;
86 }
87 if (obj instanceof DefaultTrafficSelector) {
88 DefaultTrafficSelector that = (DefaultTrafficSelector) obj;
tom9a693fd2014-10-03 11:32:19 -070089 return Objects.equals(criteria, that.criteria);
alshabibba5ac482014-10-02 17:15:20 -070090
91 }
92 return false;
93 }
94
Jonathan Hartd87aeca2014-10-21 10:42:52 -070095 @Override
96 public String toString() {
97 return MoreObjects.toStringHelper(getClass())
98 .add("criteria", criteria)
99 .toString();
100 }
101
tom9a693fd2014-10-03 11:32:19 -0700102 /**
103 * Returns a new traffic selector builder.
104 *
105 * @return traffic selector builder
106 */
107 public static TrafficSelector.Builder builder() {
108 return new Builder();
109 }
alshabibba5ac482014-10-02 17:15:20 -0700110
tom9a693fd2014-10-03 11:32:19 -0700111 /**
Brian O'Connor6b528132015-03-10 16:39:52 -0700112 * Returns an empty traffic selector.
113 *
114 * @return empty traffic selector
115 */
116 public static TrafficSelector emptySelector() {
117 return EMPTY;
118 }
119
120 /**
tom9a693fd2014-10-03 11:32:19 -0700121 * Returns a new traffic selector builder primed to produce entities
122 * patterned after the supplied selector.
123 *
Yuta HIGUCHI5c947272014-11-03 21:39:21 -0800124 * @param selector base selector
tom9a693fd2014-10-03 11:32:19 -0700125 * @return traffic selector builder
126 */
127 public static TrafficSelector.Builder builder(TrafficSelector selector) {
128 return new Builder(selector);
129 }
alshabibba5ac482014-10-02 17:15:20 -0700130
tom9a693fd2014-10-03 11:32:19 -0700131 /**
132 * Builder of traffic selector entities.
133 */
134 public static final class Builder implements TrafficSelector.Builder {
alshabib7b2748f2014-09-16 20:21:11 -0700135
tom9a693fd2014-10-03 11:32:19 -0700136 private final Map<Criterion.Type, Criterion> selector = new HashMap<>();
alshabib7b2748f2014-09-16 20:21:11 -0700137
tom9a693fd2014-10-03 11:32:19 -0700138 private Builder() {
139 }
140
141 private Builder(TrafficSelector selector) {
142 for (Criterion c : selector.criteria()) {
143 add(c);
144 }
145 }
alshabib7b2748f2014-09-16 20:21:11 -0700146
147 @Override
alshabib010c31d2014-09-26 10:01:12 -0700148 public Builder add(Criterion criterion) {
tom9a693fd2014-10-03 11:32:19 -0700149 selector.put(criterion.type(), criterion);
alshabib7b2748f2014-09-16 20:21:11 -0700150 return this;
151 }
152
alshabibba5ac482014-10-02 17:15:20 -0700153 @Override
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800154 public Builder matchInPort(PortNumber port) {
alshabib010c31d2014-09-26 10:01:12 -0700155 return add(Criteria.matchInPort(port));
156 }
157
alshabibba5ac482014-10-02 17:15:20 -0700158 @Override
Pavlin Radoslavovd0fd8412015-02-04 13:57:00 -0800159 public Builder matchInPhyPort(PortNumber port) {
160 return add(Criteria.matchInPhyPort(port));
161 }
162
163 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800164 public Builder matchMetadata(long metadata) {
Pavlin Radoslavovd0fd8412015-02-04 13:57:00 -0800165 return add(Criteria.matchMetadata(metadata));
166 }
167
168 @Override
alshabib010c31d2014-09-26 10:01:12 -0700169 public Builder matchEthDst(MacAddress addr) {
170 return add(Criteria.matchEthDst(addr));
171 }
172
alshabibba5ac482014-10-02 17:15:20 -0700173 @Override
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800174 public Builder matchEthSrc(MacAddress addr) {
175 return add(Criteria.matchEthSrc(addr));
176 }
177
178 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800179 public Builder matchEthType(short ethType) {
alshabib010c31d2014-09-26 10:01:12 -0700180 return add(Criteria.matchEthType(ethType));
181 }
182
alshabibba5ac482014-10-02 17:15:20 -0700183 @Override
alshabib010c31d2014-09-26 10:01:12 -0700184 public Builder matchVlanId(VlanId vlanId) {
185 return add(Criteria.matchVlanId(vlanId));
186 }
187
alshabibba5ac482014-10-02 17:15:20 -0700188 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800189 public Builder matchVlanPcp(byte vlanPcp) {
alshabib010c31d2014-09-26 10:01:12 -0700190 return add(Criteria.matchVlanPcp(vlanPcp));
191 }
192
alshabibba5ac482014-10-02 17:15:20 -0700193 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800194 public Builder matchIPDscp(byte ipDscp) {
Pavlin Radoslavovd0fd8412015-02-04 13:57:00 -0800195 return add(Criteria.matchIPDscp(ipDscp));
196 }
197
198 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800199 public Builder matchIPEcn(byte ipEcn) {
Pavlin Radoslavovd0fd8412015-02-04 13:57:00 -0800200 return add(Criteria.matchIPEcn(ipEcn));
201 }
202
203 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800204 public Builder matchIPProtocol(byte proto) {
alshabib010c31d2014-09-26 10:01:12 -0700205 return add(Criteria.matchIPProtocol(proto));
206 }
207
alshabibba5ac482014-10-02 17:15:20 -0700208 @Override
alshabib010c31d2014-09-26 10:01:12 -0700209 public Builder matchIPSrc(IpPrefix ip) {
210 return add(Criteria.matchIPSrc(ip));
211 }
212
alshabibba5ac482014-10-02 17:15:20 -0700213 @Override
alshabib010c31d2014-09-26 10:01:12 -0700214 public Builder matchIPDst(IpPrefix ip) {
215 return add(Criteria.matchIPDst(ip));
216 }
217
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700218 @Deprecated
alshabib7b2748f2014-09-16 20:21:11 -0700219 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800220 public Builder matchTcpSrc(short tcpPort) {
Sho SHIMIZU8770a932015-08-25 10:06:11 -0700221 return matchTcpSrc(TpPort.tpPort(tcpPort));
Toshio Koide9c44c9a2014-10-09 11:44:36 -0700222 }
223
224 @Override
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700225 public Builder matchTcpSrc(TpPort tcpPort) {
226 return add(Criteria.matchTcpSrc(tcpPort));
227 }
228
229 @Deprecated
230 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800231 public Builder matchTcpDst(short tcpPort) {
Sho SHIMIZU8770a932015-08-25 10:06:11 -0700232 return matchTcpDst(TpPort.tpPort(tcpPort));
Toshio Koide9c44c9a2014-10-09 11:44:36 -0700233 }
234
235 @Override
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700236 public Builder matchTcpDst(TpPort tcpPort) {
237 return add(Criteria.matchTcpDst(tcpPort));
238 }
239
240 @Deprecated
241 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800242 public Builder matchUdpSrc(short udpPort) {
Sho SHIMIZU8770a932015-08-25 10:06:11 -0700243 return matchUdpSrc(TpPort.tpPort(udpPort));
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800244 }
245
246 @Override
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700247 public Builder matchUdpSrc(TpPort udpPort) {
248 return add(Criteria.matchUdpSrc(udpPort));
249 }
250
251 @Deprecated
252 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800253 public Builder matchUdpDst(short udpPort) {
Sho SHIMIZU8770a932015-08-25 10:06:11 -0700254 return matchUdpDst(TpPort.tpPort(udpPort));
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800255 }
256
257 @Override
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700258 public Builder matchUdpDst(TpPort udpPort) {
259 return add(Criteria.matchUdpDst(udpPort));
260 }
261
262 @Deprecated
263 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800264 public Builder matchSctpSrc(short sctpPort) {
Sho SHIMIZU8770a932015-08-25 10:06:11 -0700265 return matchSctpSrc(TpPort.tpPort(sctpPort));
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800266 }
267
268 @Override
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700269 public Builder matchSctpSrc(TpPort sctpPort) {
270 return add(Criteria.matchSctpSrc(sctpPort));
271 }
272
273 @Deprecated
274 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800275 public Builder matchSctpDst(short sctpPort) {
Sho SHIMIZU8770a932015-08-25 10:06:11 -0700276 return matchSctpDst(TpPort.tpPort(sctpPort));
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800277 }
278
279 @Override
Hyunsun Mooncf732fb2015-08-22 21:04:23 -0700280 public Builder matchSctpDst(TpPort sctpPort) {
281 return add(Criteria.matchSctpDst(sctpPort));
282 }
283
284 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800285 public Builder matchIcmpType(byte icmpType) {
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800286 return add(Criteria.matchIcmpType(icmpType));
287 }
288
289 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800290 public Builder matchIcmpCode(byte icmpCode) {
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800291 return add(Criteria.matchIcmpCode(icmpCode));
292 }
293
294 @Override
Charles M.C. Chan52fae7d2015-01-17 00:35:53 +0800295 public Builder matchIPv6Src(IpPrefix ip) {
296 return add(Criteria.matchIPv6Src(ip));
297 }
298
299 @Override
300 public Builder matchIPv6Dst(IpPrefix ip) {
301 return add(Criteria.matchIPv6Dst(ip));
302 }
303
304 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800305 public Builder matchIPv6FlowLabel(int flowLabel) {
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800306 return add(Criteria.matchIPv6FlowLabel(flowLabel));
307 }
308
309 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800310 public Builder matchIcmpv6Type(byte icmpv6Type) {
Kunihiro Ishiguro0f9aba82015-01-15 17:14:17 -0800311 return add(Criteria.matchIcmpv6Type(icmpv6Type));
312 }
313
314 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800315 public Builder matchIcmpv6Code(byte icmpv6Code) {
Kunihiro Ishiguro0f9aba82015-01-15 17:14:17 -0800316 return add(Criteria.matchIcmpv6Code(icmpv6Code));
317 }
318
319 @Override
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800320 public Builder matchIPv6NDTargetAddress(Ip6Address targetAddress) {
321 return add(Criteria.matchIPv6NDTargetAddress(targetAddress));
322 }
323
324 @Override
325 public Builder matchIPv6NDSourceLinkLayerAddress(MacAddress mac) {
326 return add(Criteria.matchIPv6NDSourceLinkLayerAddress(mac));
327 }
328
329 @Override
330 public Builder matchIPv6NDTargetLinkLayerAddress(MacAddress mac) {
331 return add(Criteria.matchIPv6NDTargetLinkLayerAddress(mac));
332 }
333
334 @Override
Michele Santuari4b6019e2014-12-19 11:31:45 +0100335 public Builder matchMplsLabel(MplsLabel mplsLabel) {
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800336 return add(Criteria.matchMplsLabel(mplsLabel));
337 }
338
339 @Override
Saurav Dasffc5bbc2015-08-18 23:30:19 -0700340 public Builder matchMplsBos(boolean mplsBos) {
341 return add(Criteria.matchMplsLabel(mplsBos));
342 }
343
344 @Override
Hyunsun Moona08c5d02015-07-14 17:53:00 -0700345 public TrafficSelector.Builder matchTunnelId(long tunnelId) {
346 return add(Criteria.matchTunnelId(tunnelId));
347 }
348
349 @Override
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800350 public Builder matchIPv6ExthdrFlags(short exthdrFlags) {
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800351 return add(Criteria.matchIPv6ExthdrFlags(exthdrFlags));
352 }
353
Praseed Balakrishnan64369da2014-10-23 15:55:20 -0700354 @Override
alshabib7b2748f2014-09-16 20:21:11 -0700355 public TrafficSelector build() {
tom9a693fd2014-10-03 11:32:19 -0700356 return new DefaultTrafficSelector(ImmutableSet.copyOf(selector.values()));
alshabib7b2748f2014-09-16 20:21:11 -0700357 }
alshabib7b2748f2014-09-16 20:21:11 -0700358 }
alshabib7b2748f2014-09-16 20:21:11 -0700359}