blob: abb29a6d34ff4d92aa7c5c68d6a8c97450a8fa9b [file] [log] [blame]
Thomas Vachuska83e090e2014-10-22 14:25:35 -07001/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
alshabib7b2748f2014-09-16 20:21:11 -070019package org.onlab.onos.net.flow;
20
Jonathan Hartd87aeca2014-10-21 10:42:52 -070021import java.util.HashMap;
22import java.util.Map;
23import java.util.Objects;
24import java.util.Set;
25
alshabib010c31d2014-09-26 10:01:12 -070026import org.onlab.onos.net.PortNumber;
27import org.onlab.onos.net.flow.criteria.Criteria;
alshabib7b2748f2014-09-16 20:21:11 -070028import org.onlab.onos.net.flow.criteria.Criterion;
alshabib010c31d2014-09-26 10:01:12 -070029import org.onlab.packet.IpPrefix;
30import org.onlab.packet.MacAddress;
31import org.onlab.packet.VlanId;
alshabib7b2748f2014-09-16 20:21:11 -070032
Jonathan Hartd87aeca2014-10-21 10:42:52 -070033import com.google.common.base.MoreObjects;
34import com.google.common.collect.ImmutableSet;
tom9a693fd2014-10-03 11:32:19 -070035
36/**
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
tom9a693fd2014-10-03 11:32:19 -070043 /**
44 * Creates a new traffic selector with the specified criteria.
45 *
46 * @param criteria criteria
47 */
48 private DefaultTrafficSelector(Set<Criterion> criteria) {
Yuta HIGUCHI2809bf32014-10-20 22:44:12 -070049 this.criteria = ImmutableSet.copyOf(criteria);
alshabib7b2748f2014-09-16 20:21:11 -070050 }
51
52 @Override
alshabibba5ac482014-10-02 17:15:20 -070053 public Set<Criterion> criteria() {
tom9a693fd2014-10-03 11:32:19 -070054 return criteria;
alshabib7b2748f2014-09-16 20:21:11 -070055 }
56
alshabibba5ac482014-10-02 17:15:20 -070057 @Override
58 public int hashCode() {
tom9a693fd2014-10-03 11:32:19 -070059 return Objects.hash(criteria);
alshabibba5ac482014-10-02 17:15:20 -070060 }
61
62 @Override
63 public boolean equals(Object obj) {
64 if (this == obj) {
65 return true;
66 }
67 if (obj instanceof DefaultTrafficSelector) {
68 DefaultTrafficSelector that = (DefaultTrafficSelector) obj;
tom9a693fd2014-10-03 11:32:19 -070069 return Objects.equals(criteria, that.criteria);
alshabibba5ac482014-10-02 17:15:20 -070070
71 }
72 return false;
73 }
74
Jonathan Hartd87aeca2014-10-21 10:42:52 -070075 @Override
76 public String toString() {
77 return MoreObjects.toStringHelper(getClass())
78 .add("criteria", criteria)
79 .toString();
80 }
81
tom9a693fd2014-10-03 11:32:19 -070082 /**
83 * Returns a new traffic selector builder.
84 *
85 * @return traffic selector builder
86 */
87 public static TrafficSelector.Builder builder() {
88 return new Builder();
89 }
alshabibba5ac482014-10-02 17:15:20 -070090
tom9a693fd2014-10-03 11:32:19 -070091 /**
92 * Returns a new traffic selector builder primed to produce entities
93 * patterned after the supplied selector.
94 *
95 * @return traffic selector builder
96 */
97 public static TrafficSelector.Builder builder(TrafficSelector selector) {
98 return new Builder(selector);
99 }
alshabibba5ac482014-10-02 17:15:20 -0700100
tom9a693fd2014-10-03 11:32:19 -0700101 /**
102 * Builder of traffic selector entities.
103 */
104 public static final class Builder implements TrafficSelector.Builder {
alshabib7b2748f2014-09-16 20:21:11 -0700105
tom9a693fd2014-10-03 11:32:19 -0700106 private final Map<Criterion.Type, Criterion> selector = new HashMap<>();
alshabib7b2748f2014-09-16 20:21:11 -0700107
tom9a693fd2014-10-03 11:32:19 -0700108 private Builder() {
109 }
110
111 private Builder(TrafficSelector selector) {
112 for (Criterion c : selector.criteria()) {
113 add(c);
114 }
115 }
alshabib7b2748f2014-09-16 20:21:11 -0700116
117 @Override
alshabib010c31d2014-09-26 10:01:12 -0700118 public Builder add(Criterion criterion) {
tom9a693fd2014-10-03 11:32:19 -0700119 selector.put(criterion.type(), criterion);
alshabib7b2748f2014-09-16 20:21:11 -0700120 return this;
121 }
122
alshabibba5ac482014-10-02 17:15:20 -0700123 @Override
alshabib010c31d2014-09-26 10:01:12 -0700124 public Builder matchInport(PortNumber port) {
125 return add(Criteria.matchInPort(port));
126 }
127
alshabibba5ac482014-10-02 17:15:20 -0700128 @Override
alshabib010c31d2014-09-26 10:01:12 -0700129 public Builder matchEthSrc(MacAddress addr) {
130 return add(Criteria.matchEthSrc(addr));
131 }
132
alshabibba5ac482014-10-02 17:15:20 -0700133 @Override
alshabib010c31d2014-09-26 10:01:12 -0700134 public Builder matchEthDst(MacAddress addr) {
135 return add(Criteria.matchEthDst(addr));
136 }
137
alshabibba5ac482014-10-02 17:15:20 -0700138 @Override
alshabib010c31d2014-09-26 10:01:12 -0700139 public Builder matchEthType(short ethType) {
140 return add(Criteria.matchEthType(ethType));
141 }
142
alshabibba5ac482014-10-02 17:15:20 -0700143 @Override
alshabib010c31d2014-09-26 10:01:12 -0700144 public Builder matchVlanId(VlanId vlanId) {
145 return add(Criteria.matchVlanId(vlanId));
146 }
147
alshabibba5ac482014-10-02 17:15:20 -0700148 @Override
alshabib010c31d2014-09-26 10:01:12 -0700149 public Builder matchVlanPcp(Byte vlanPcp) {
150 return add(Criteria.matchVlanPcp(vlanPcp));
151 }
152
alshabibba5ac482014-10-02 17:15:20 -0700153 @Override
alshabib010c31d2014-09-26 10:01:12 -0700154 public Builder matchIPProtocol(Byte proto) {
155 return add(Criteria.matchIPProtocol(proto));
156 }
157
alshabibba5ac482014-10-02 17:15:20 -0700158 @Override
alshabib010c31d2014-09-26 10:01:12 -0700159 public Builder matchIPSrc(IpPrefix ip) {
160 return add(Criteria.matchIPSrc(ip));
161 }
162
alshabibba5ac482014-10-02 17:15:20 -0700163 @Override
alshabib010c31d2014-09-26 10:01:12 -0700164 public Builder matchIPDst(IpPrefix ip) {
165 return add(Criteria.matchIPDst(ip));
166 }
167
alshabib7b2748f2014-09-16 20:21:11 -0700168 @Override
Toshio Koide9c44c9a2014-10-09 11:44:36 -0700169 public Builder matchTcpSrc(Short tcpPort) {
170 return add(Criteria.matchTcpSrc(tcpPort));
171 }
172
173 @Override
174 public Builder matchTcpDst(Short tcpPort) {
175 return add(Criteria.matchTcpDst(tcpPort));
176 }
177
178 @Override
alshabib7b2748f2014-09-16 20:21:11 -0700179 public TrafficSelector build() {
tom9a693fd2014-10-03 11:32:19 -0700180 return new DefaultTrafficSelector(ImmutableSet.copyOf(selector.values()));
alshabib7b2748f2014-09-16 20:21:11 -0700181 }
182
183 }
184
185}