blob: ece32d43646c3bf9f4972a83c9e782122234cdf7 [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;
24import org.onlab.packet.VlanId;
Sho SHIMIZU260439d2015-06-30 16:35:34 -070025import org.onosproject.net.IndexedLambda;
Brian O'Connor6b528132015-03-10 16:39:52 -070026import org.onosproject.net.PortNumber;
27import org.onosproject.net.flow.criteria.Criteria;
28import org.onosproject.net.flow.criteria.Criterion;
29
30import java.util.Collections;
Jonathan Hartd87aeca2014-10-21 10:42:52 -070031import java.util.HashMap;
32import java.util.Map;
33import java.util.Objects;
34import java.util.Set;
35
tom9a693fd2014-10-03 11:32:19 -070036/**
37 * Default traffic selector implementation.
38 */
alshabib7b2748f2014-09-16 20:21:11 -070039public final class DefaultTrafficSelector implements TrafficSelector {
40
tom9a693fd2014-10-03 11:32:19 -070041 private final Set<Criterion> criteria;
alshabib7b2748f2014-09-16 20:21:11 -070042
Brian O'Connor6b528132015-03-10 16:39:52 -070043 private static final TrafficSelector EMPTY
44 = new DefaultTrafficSelector(Collections.emptySet());
45
tom9a693fd2014-10-03 11:32:19 -070046 /**
47 * Creates a new traffic selector with the specified criteria.
48 *
49 * @param criteria criteria
50 */
51 private DefaultTrafficSelector(Set<Criterion> criteria) {
Yuta HIGUCHI2809bf32014-10-20 22:44:12 -070052 this.criteria = ImmutableSet.copyOf(criteria);
alshabib7b2748f2014-09-16 20:21:11 -070053 }
54
55 @Override
alshabibba5ac482014-10-02 17:15:20 -070056 public Set<Criterion> criteria() {
tom9a693fd2014-10-03 11:32:19 -070057 return criteria;
alshabib7b2748f2014-09-16 20:21:11 -070058 }
59
alshabibba5ac482014-10-02 17:15:20 -070060 @Override
Jonathan Hart936c49d2014-10-23 16:38:59 -070061 public Criterion getCriterion(Criterion.Type type) {
62 for (Criterion c : criteria) {
63 if (c.type() == type) {
64 return c;
65 }
66 }
67 return null;
68 }
69
70 @Override
alshabibba5ac482014-10-02 17:15:20 -070071 public int hashCode() {
Thomas Vachuska9b2da212014-11-10 19:30:25 -080072 return criteria.hashCode();
alshabibba5ac482014-10-02 17:15:20 -070073 }
74
75 @Override
76 public boolean equals(Object obj) {
77 if (this == obj) {
78 return true;
79 }
80 if (obj instanceof DefaultTrafficSelector) {
81 DefaultTrafficSelector that = (DefaultTrafficSelector) obj;
tom9a693fd2014-10-03 11:32:19 -070082 return Objects.equals(criteria, that.criteria);
alshabibba5ac482014-10-02 17:15:20 -070083
84 }
85 return false;
86 }
87
Jonathan Hartd87aeca2014-10-21 10:42:52 -070088 @Override
89 public String toString() {
90 return MoreObjects.toStringHelper(getClass())
91 .add("criteria", criteria)
92 .toString();
93 }
94
tom9a693fd2014-10-03 11:32:19 -070095 /**
96 * Returns a new traffic selector builder.
97 *
98 * @return traffic selector builder
99 */
100 public static TrafficSelector.Builder builder() {
101 return new Builder();
102 }
alshabibba5ac482014-10-02 17:15:20 -0700103
tom9a693fd2014-10-03 11:32:19 -0700104 /**
Brian O'Connor6b528132015-03-10 16:39:52 -0700105 * Returns an empty traffic selector.
106 *
107 * @return empty traffic selector
108 */
109 public static TrafficSelector emptySelector() {
110 return EMPTY;
111 }
112
113 /**
tom9a693fd2014-10-03 11:32:19 -0700114 * Returns a new traffic selector builder primed to produce entities
115 * patterned after the supplied selector.
116 *
Yuta HIGUCHI5c947272014-11-03 21:39:21 -0800117 * @param selector base selector
tom9a693fd2014-10-03 11:32:19 -0700118 * @return traffic selector builder
119 */
120 public static TrafficSelector.Builder builder(TrafficSelector selector) {
121 return new Builder(selector);
122 }
alshabibba5ac482014-10-02 17:15:20 -0700123
tom9a693fd2014-10-03 11:32:19 -0700124 /**
125 * Builder of traffic selector entities.
126 */
127 public static final class Builder implements TrafficSelector.Builder {
alshabib7b2748f2014-09-16 20:21:11 -0700128
tom9a693fd2014-10-03 11:32:19 -0700129 private final Map<Criterion.Type, Criterion> selector = new HashMap<>();
alshabib7b2748f2014-09-16 20:21:11 -0700130
tom9a693fd2014-10-03 11:32:19 -0700131 private Builder() {
132 }
133
134 private Builder(TrafficSelector selector) {
135 for (Criterion c : selector.criteria()) {
136 add(c);
137 }
138 }
alshabib7b2748f2014-09-16 20:21:11 -0700139
140 @Override
alshabib010c31d2014-09-26 10:01:12 -0700141 public Builder add(Criterion criterion) {
tom9a693fd2014-10-03 11:32:19 -0700142 selector.put(criterion.type(), criterion);
alshabib7b2748f2014-09-16 20:21:11 -0700143 return this;
144 }
145
alshabibba5ac482014-10-02 17:15:20 -0700146 @Override
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800147 public Builder matchInPort(PortNumber port) {
alshabib010c31d2014-09-26 10:01:12 -0700148 return add(Criteria.matchInPort(port));
149 }
150
alshabibba5ac482014-10-02 17:15:20 -0700151 @Override
Pavlin Radoslavovd0fd8412015-02-04 13:57:00 -0800152 public Builder matchInPhyPort(PortNumber port) {
153 return add(Criteria.matchInPhyPort(port));
154 }
155
156 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800157 public Builder matchMetadata(long metadata) {
Pavlin Radoslavovd0fd8412015-02-04 13:57:00 -0800158 return add(Criteria.matchMetadata(metadata));
159 }
160
161 @Override
alshabib010c31d2014-09-26 10:01:12 -0700162 public Builder matchEthDst(MacAddress addr) {
163 return add(Criteria.matchEthDst(addr));
164 }
165
alshabibba5ac482014-10-02 17:15:20 -0700166 @Override
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800167 public Builder matchEthSrc(MacAddress addr) {
168 return add(Criteria.matchEthSrc(addr));
169 }
170
171 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800172 public Builder matchEthType(short ethType) {
alshabib010c31d2014-09-26 10:01:12 -0700173 return add(Criteria.matchEthType(ethType));
174 }
175
alshabibba5ac482014-10-02 17:15:20 -0700176 @Override
alshabib010c31d2014-09-26 10:01:12 -0700177 public Builder matchVlanId(VlanId vlanId) {
178 return add(Criteria.matchVlanId(vlanId));
179 }
180
alshabibba5ac482014-10-02 17:15:20 -0700181 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800182 public Builder matchVlanPcp(byte vlanPcp) {
alshabib010c31d2014-09-26 10:01:12 -0700183 return add(Criteria.matchVlanPcp(vlanPcp));
184 }
185
alshabibba5ac482014-10-02 17:15:20 -0700186 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800187 public Builder matchIPDscp(byte ipDscp) {
Pavlin Radoslavovd0fd8412015-02-04 13:57:00 -0800188 return add(Criteria.matchIPDscp(ipDscp));
189 }
190
191 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800192 public Builder matchIPEcn(byte ipEcn) {
Pavlin Radoslavovd0fd8412015-02-04 13:57:00 -0800193 return add(Criteria.matchIPEcn(ipEcn));
194 }
195
196 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800197 public Builder matchIPProtocol(byte proto) {
alshabib010c31d2014-09-26 10:01:12 -0700198 return add(Criteria.matchIPProtocol(proto));
199 }
200
alshabibba5ac482014-10-02 17:15:20 -0700201 @Override
alshabib010c31d2014-09-26 10:01:12 -0700202 public Builder matchIPSrc(IpPrefix ip) {
203 return add(Criteria.matchIPSrc(ip));
204 }
205
alshabibba5ac482014-10-02 17:15:20 -0700206 @Override
alshabib010c31d2014-09-26 10:01:12 -0700207 public Builder matchIPDst(IpPrefix ip) {
208 return add(Criteria.matchIPDst(ip));
209 }
210
alshabib7b2748f2014-09-16 20:21:11 -0700211 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800212 public Builder matchTcpSrc(short tcpPort) {
Toshio Koide9c44c9a2014-10-09 11:44:36 -0700213 return add(Criteria.matchTcpSrc(tcpPort));
214 }
215
216 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800217 public Builder matchTcpDst(short tcpPort) {
Toshio Koide9c44c9a2014-10-09 11:44:36 -0700218 return add(Criteria.matchTcpDst(tcpPort));
219 }
220
221 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800222 public Builder matchUdpSrc(short udpPort) {
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800223 return add(Criteria.matchUdpSrc(udpPort));
224 }
225
226 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800227 public Builder matchUdpDst(short udpPort) {
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800228 return add(Criteria.matchUdpDst(udpPort));
229 }
230
231 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800232 public Builder matchSctpSrc(short sctpPort) {
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800233 return add(Criteria.matchSctpSrc(sctpPort));
234 }
235
236 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800237 public Builder matchSctpDst(short sctpPort) {
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800238 return add(Criteria.matchSctpDst(sctpPort));
239 }
240
241 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800242 public Builder matchIcmpType(byte icmpType) {
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800243 return add(Criteria.matchIcmpType(icmpType));
244 }
245
246 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800247 public Builder matchIcmpCode(byte icmpCode) {
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800248 return add(Criteria.matchIcmpCode(icmpCode));
249 }
250
251 @Override
Charles M.C. Chan52fae7d2015-01-17 00:35:53 +0800252 public Builder matchIPv6Src(IpPrefix ip) {
253 return add(Criteria.matchIPv6Src(ip));
254 }
255
256 @Override
257 public Builder matchIPv6Dst(IpPrefix ip) {
258 return add(Criteria.matchIPv6Dst(ip));
259 }
260
261 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800262 public Builder matchIPv6FlowLabel(int flowLabel) {
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800263 return add(Criteria.matchIPv6FlowLabel(flowLabel));
264 }
265
266 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800267 public Builder matchIcmpv6Type(byte icmpv6Type) {
Kunihiro Ishiguro0f9aba82015-01-15 17:14:17 -0800268 return add(Criteria.matchIcmpv6Type(icmpv6Type));
269 }
270
271 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800272 public Builder matchIcmpv6Code(byte icmpv6Code) {
Kunihiro Ishiguro0f9aba82015-01-15 17:14:17 -0800273 return add(Criteria.matchIcmpv6Code(icmpv6Code));
274 }
275
276 @Override
Pavlin Radoslavov320e6c92015-02-02 16:51:58 -0800277 public Builder matchIPv6NDTargetAddress(Ip6Address targetAddress) {
278 return add(Criteria.matchIPv6NDTargetAddress(targetAddress));
279 }
280
281 @Override
282 public Builder matchIPv6NDSourceLinkLayerAddress(MacAddress mac) {
283 return add(Criteria.matchIPv6NDSourceLinkLayerAddress(mac));
284 }
285
286 @Override
287 public Builder matchIPv6NDTargetLinkLayerAddress(MacAddress mac) {
288 return add(Criteria.matchIPv6NDTargetLinkLayerAddress(mac));
289 }
290
291 @Override
Michele Santuari4b6019e2014-12-19 11:31:45 +0100292 public Builder matchMplsLabel(MplsLabel mplsLabel) {
Praseed Balakrishnan8c67d172014-11-10 10:15:41 -0800293 return add(Criteria.matchMplsLabel(mplsLabel));
294 }
295
296 @Override
Saurav Dasffc5bbc2015-08-18 23:30:19 -0700297 public Builder matchMplsBos(boolean mplsBos) {
298 return add(Criteria.matchMplsLabel(mplsBos));
299 }
300
301 @Override
Hyunsun Moona08c5d02015-07-14 17:53:00 -0700302 public TrafficSelector.Builder matchTunnelId(long tunnelId) {
303 return add(Criteria.matchTunnelId(tunnelId));
304 }
305
306 @Override
Charles M.C. Chan2184de12015-04-26 02:24:53 +0800307 public Builder matchIPv6ExthdrFlags(short exthdrFlags) {
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800308 return add(Criteria.matchIPv6ExthdrFlags(exthdrFlags));
309 }
310
Sho SHIMIZUc72c8ea2015-05-06 16:01:47 -0700311 @Deprecated
Pavlin Radoslavov5e4f7542015-02-06 18:18:21 -0800312 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800313 public Builder matchLambda(short lambda) {
Sho SHIMIZU260439d2015-06-30 16:35:34 -0700314 return add(Criteria.matchLambda(new IndexedLambda(lambda)));
Marc De Leenheer49087752014-10-23 13:54:09 -0700315 }
316
Sho SHIMIZUc72c8ea2015-05-06 16:01:47 -0700317 @Deprecated
Marc De Leenheer49087752014-10-23 13:54:09 -0700318 @Override
Sho SHIMIZUd796ae42015-02-26 12:08:01 -0800319 public Builder matchOpticalSignalType(short signalType) {
Praseed Balakrishnan64369da2014-10-23 15:55:20 -0700320 return add(Criteria.matchOpticalSignalType(signalType));
Praseed Balakrishnan64369da2014-10-23 15:55:20 -0700321 }
322
323 @Override
alshabib7b2748f2014-09-16 20:21:11 -0700324 public TrafficSelector build() {
tom9a693fd2014-10-03 11:32:19 -0700325 return new DefaultTrafficSelector(ImmutableSet.copyOf(selector.values()));
alshabib7b2748f2014-09-16 20:21:11 -0700326 }
alshabib7b2748f2014-09-16 20:21:11 -0700327 }
alshabib7b2748f2014-09-16 20:21:11 -0700328}