blob: 413473fc9fc87ab1fa9a385eab62493eb918726f [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 */
alshabib7b2748f2014-09-16 20:21:11 -070016package org.onlab.onos.net.flow;
17
Jonathan Hartd87aeca2014-10-21 10:42:52 -070018import java.util.HashMap;
19import java.util.Map;
20import java.util.Objects;
21import java.util.Set;
22
alshabib010c31d2014-09-26 10:01:12 -070023import org.onlab.onos.net.PortNumber;
24import org.onlab.onos.net.flow.criteria.Criteria;
alshabib7b2748f2014-09-16 20:21:11 -070025import org.onlab.onos.net.flow.criteria.Criterion;
alshabib010c31d2014-09-26 10:01:12 -070026import org.onlab.packet.IpPrefix;
27import org.onlab.packet.MacAddress;
28import org.onlab.packet.VlanId;
alshabib7b2748f2014-09-16 20:21:11 -070029
Jonathan Hartd87aeca2014-10-21 10:42:52 -070030import com.google.common.base.MoreObjects;
31import com.google.common.collect.ImmutableSet;
tom9a693fd2014-10-03 11:32:19 -070032
33/**
34 * Default traffic selector implementation.
35 */
alshabib7b2748f2014-09-16 20:21:11 -070036public final class DefaultTrafficSelector implements TrafficSelector {
37
tom9a693fd2014-10-03 11:32:19 -070038 private final Set<Criterion> criteria;
alshabib7b2748f2014-09-16 20:21:11 -070039
tom9a693fd2014-10-03 11:32:19 -070040 /**
41 * Creates a new traffic selector with the specified criteria.
42 *
43 * @param criteria criteria
44 */
45 private DefaultTrafficSelector(Set<Criterion> criteria) {
Yuta HIGUCHI2809bf32014-10-20 22:44:12 -070046 this.criteria = ImmutableSet.copyOf(criteria);
alshabib7b2748f2014-09-16 20:21:11 -070047 }
48
49 @Override
alshabibba5ac482014-10-02 17:15:20 -070050 public Set<Criterion> criteria() {
tom9a693fd2014-10-03 11:32:19 -070051 return criteria;
alshabib7b2748f2014-09-16 20:21:11 -070052 }
53
alshabibba5ac482014-10-02 17:15:20 -070054 @Override
Jonathan Hart936c49d2014-10-23 16:38:59 -070055 public Criterion getCriterion(Criterion.Type type) {
56 for (Criterion c : criteria) {
57 if (c.type() == type) {
58 return c;
59 }
60 }
61 return null;
62 }
63
64 @Override
alshabibba5ac482014-10-02 17:15:20 -070065 public int hashCode() {
tom9a693fd2014-10-03 11:32:19 -070066 return Objects.hash(criteria);
alshabibba5ac482014-10-02 17:15:20 -070067 }
68
69 @Override
70 public boolean equals(Object obj) {
71 if (this == obj) {
72 return true;
73 }
74 if (obj instanceof DefaultTrafficSelector) {
75 DefaultTrafficSelector that = (DefaultTrafficSelector) obj;
tom9a693fd2014-10-03 11:32:19 -070076 return Objects.equals(criteria, that.criteria);
alshabibba5ac482014-10-02 17:15:20 -070077
78 }
79 return false;
80 }
81
Jonathan Hartd87aeca2014-10-21 10:42:52 -070082 @Override
83 public String toString() {
84 return MoreObjects.toStringHelper(getClass())
85 .add("criteria", criteria)
86 .toString();
87 }
88
tom9a693fd2014-10-03 11:32:19 -070089 /**
90 * Returns a new traffic selector builder.
91 *
92 * @return traffic selector builder
93 */
94 public static TrafficSelector.Builder builder() {
95 return new Builder();
96 }
alshabibba5ac482014-10-02 17:15:20 -070097
tom9a693fd2014-10-03 11:32:19 -070098 /**
99 * Returns a new traffic selector builder primed to produce entities
100 * patterned after the supplied selector.
101 *
Yuta HIGUCHI5c947272014-11-03 21:39:21 -0800102 * @param selector base selector
tom9a693fd2014-10-03 11:32:19 -0700103 * @return traffic selector builder
104 */
105 public static TrafficSelector.Builder builder(TrafficSelector selector) {
106 return new Builder(selector);
107 }
alshabibba5ac482014-10-02 17:15:20 -0700108
tom9a693fd2014-10-03 11:32:19 -0700109 /**
110 * Builder of traffic selector entities.
111 */
112 public static final class Builder implements TrafficSelector.Builder {
alshabib7b2748f2014-09-16 20:21:11 -0700113
tom9a693fd2014-10-03 11:32:19 -0700114 private final Map<Criterion.Type, Criterion> selector = new HashMap<>();
alshabib7b2748f2014-09-16 20:21:11 -0700115
tom9a693fd2014-10-03 11:32:19 -0700116 private Builder() {
117 }
118
119 private Builder(TrafficSelector selector) {
120 for (Criterion c : selector.criteria()) {
121 add(c);
122 }
123 }
alshabib7b2748f2014-09-16 20:21:11 -0700124
125 @Override
alshabib010c31d2014-09-26 10:01:12 -0700126 public Builder add(Criterion criterion) {
tom9a693fd2014-10-03 11:32:19 -0700127 selector.put(criterion.type(), criterion);
alshabib7b2748f2014-09-16 20:21:11 -0700128 return this;
129 }
130
alshabibba5ac482014-10-02 17:15:20 -0700131 @Override
alshabib010c31d2014-09-26 10:01:12 -0700132 public Builder matchInport(PortNumber port) {
133 return add(Criteria.matchInPort(port));
134 }
135
alshabibba5ac482014-10-02 17:15:20 -0700136 @Override
alshabib010c31d2014-09-26 10:01:12 -0700137 public Builder matchEthSrc(MacAddress addr) {
138 return add(Criteria.matchEthSrc(addr));
139 }
140
alshabibba5ac482014-10-02 17:15:20 -0700141 @Override
alshabib010c31d2014-09-26 10:01:12 -0700142 public Builder matchEthDst(MacAddress addr) {
143 return add(Criteria.matchEthDst(addr));
144 }
145
alshabibba5ac482014-10-02 17:15:20 -0700146 @Override
alshabib010c31d2014-09-26 10:01:12 -0700147 public Builder matchEthType(short ethType) {
148 return add(Criteria.matchEthType(ethType));
149 }
150
alshabibba5ac482014-10-02 17:15:20 -0700151 @Override
alshabib010c31d2014-09-26 10:01:12 -0700152 public Builder matchVlanId(VlanId vlanId) {
153 return add(Criteria.matchVlanId(vlanId));
154 }
155
alshabibba5ac482014-10-02 17:15:20 -0700156 @Override
alshabib010c31d2014-09-26 10:01:12 -0700157 public Builder matchVlanPcp(Byte vlanPcp) {
158 return add(Criteria.matchVlanPcp(vlanPcp));
159 }
160
alshabibba5ac482014-10-02 17:15:20 -0700161 @Override
alshabib010c31d2014-09-26 10:01:12 -0700162 public Builder matchIPProtocol(Byte proto) {
163 return add(Criteria.matchIPProtocol(proto));
164 }
165
alshabibba5ac482014-10-02 17:15:20 -0700166 @Override
alshabib010c31d2014-09-26 10:01:12 -0700167 public Builder matchIPSrc(IpPrefix ip) {
168 return add(Criteria.matchIPSrc(ip));
169 }
170
alshabibba5ac482014-10-02 17:15:20 -0700171 @Override
alshabib010c31d2014-09-26 10:01:12 -0700172 public Builder matchIPDst(IpPrefix ip) {
173 return add(Criteria.matchIPDst(ip));
174 }
175
alshabib7b2748f2014-09-16 20:21:11 -0700176 @Override
Toshio Koide9c44c9a2014-10-09 11:44:36 -0700177 public Builder matchTcpSrc(Short tcpPort) {
178 return add(Criteria.matchTcpSrc(tcpPort));
179 }
180
181 @Override
182 public Builder matchTcpDst(Short tcpPort) {
183 return add(Criteria.matchTcpDst(tcpPort));
184 }
185
186 @Override
Praseed Balakrishnan64369da2014-10-23 15:55:20 -0700187 public Builder matchLambda(Short lambda) {
Marc De Leenheer49087752014-10-23 13:54:09 -0700188 return add(Criteria.matchLambda(lambda));
189 }
190
191 @Override
Praseed Balakrishnan2dd5abd2014-11-03 14:56:28 -0800192 public Builder matchOpticalSignalType(Short signalType) {
Praseed Balakrishnan64369da2014-10-23 15:55:20 -0700193 return add(Criteria.matchOpticalSignalType(signalType));
194
195 }
196
197 @Override
alshabib7b2748f2014-09-16 20:21:11 -0700198 public TrafficSelector build() {
tom9a693fd2014-10-03 11:32:19 -0700199 return new DefaultTrafficSelector(ImmutableSet.copyOf(selector.values()));
alshabib7b2748f2014-09-16 20:21:11 -0700200 }
201
202 }
203
204}