blob: f175bd35585f633f1ce82aab1234039bf313a2ea [file] [log] [blame]
alshabib7b2748f2014-09-16 20:21:11 -07001package org.onlab.onos.net.flow;
2
Jonathan Hartd87aeca2014-10-21 10:42:52 -07003import java.util.HashMap;
4import java.util.Map;
5import java.util.Objects;
6import java.util.Set;
7
alshabib010c31d2014-09-26 10:01:12 -07008import org.onlab.onos.net.PortNumber;
9import org.onlab.onos.net.flow.criteria.Criteria;
alshabib7b2748f2014-09-16 20:21:11 -070010import org.onlab.onos.net.flow.criteria.Criterion;
alshabib010c31d2014-09-26 10:01:12 -070011import org.onlab.packet.IpPrefix;
12import org.onlab.packet.MacAddress;
13import org.onlab.packet.VlanId;
alshabib7b2748f2014-09-16 20:21:11 -070014
Jonathan Hartd87aeca2014-10-21 10:42:52 -070015import com.google.common.base.MoreObjects;
16import com.google.common.collect.ImmutableSet;
tom9a693fd2014-10-03 11:32:19 -070017
18/**
19 * Default traffic selector implementation.
20 */
alshabib7b2748f2014-09-16 20:21:11 -070021public final class DefaultTrafficSelector implements TrafficSelector {
22
tom9a693fd2014-10-03 11:32:19 -070023 private final Set<Criterion> criteria;
alshabib7b2748f2014-09-16 20:21:11 -070024
tom9a693fd2014-10-03 11:32:19 -070025 /**
26 * Creates a new traffic selector with the specified criteria.
27 *
28 * @param criteria criteria
29 */
30 private DefaultTrafficSelector(Set<Criterion> criteria) {
Yuta HIGUCHI2809bf32014-10-20 22:44:12 -070031 this.criteria = ImmutableSet.copyOf(criteria);
alshabib7b2748f2014-09-16 20:21:11 -070032 }
33
34 @Override
alshabibba5ac482014-10-02 17:15:20 -070035 public Set<Criterion> criteria() {
tom9a693fd2014-10-03 11:32:19 -070036 return criteria;
alshabib7b2748f2014-09-16 20:21:11 -070037 }
38
alshabibba5ac482014-10-02 17:15:20 -070039 @Override
40 public int hashCode() {
tom9a693fd2014-10-03 11:32:19 -070041 return Objects.hash(criteria);
alshabibba5ac482014-10-02 17:15:20 -070042 }
43
44 @Override
45 public boolean equals(Object obj) {
46 if (this == obj) {
47 return true;
48 }
49 if (obj instanceof DefaultTrafficSelector) {
50 DefaultTrafficSelector that = (DefaultTrafficSelector) obj;
tom9a693fd2014-10-03 11:32:19 -070051 return Objects.equals(criteria, that.criteria);
alshabibba5ac482014-10-02 17:15:20 -070052
53 }
54 return false;
55 }
56
Jonathan Hartd87aeca2014-10-21 10:42:52 -070057 @Override
58 public String toString() {
59 return MoreObjects.toStringHelper(getClass())
60 .add("criteria", criteria)
61 .toString();
62 }
63
tom9a693fd2014-10-03 11:32:19 -070064 /**
65 * Returns a new traffic selector builder.
66 *
67 * @return traffic selector builder
68 */
69 public static TrafficSelector.Builder builder() {
70 return new Builder();
71 }
alshabibba5ac482014-10-02 17:15:20 -070072
tom9a693fd2014-10-03 11:32:19 -070073 /**
74 * Returns a new traffic selector builder primed to produce entities
75 * patterned after the supplied selector.
76 *
77 * @return traffic selector builder
78 */
79 public static TrafficSelector.Builder builder(TrafficSelector selector) {
80 return new Builder(selector);
81 }
alshabibba5ac482014-10-02 17:15:20 -070082
tom9a693fd2014-10-03 11:32:19 -070083 /**
84 * Builder of traffic selector entities.
85 */
86 public static final class Builder implements TrafficSelector.Builder {
alshabib7b2748f2014-09-16 20:21:11 -070087
tom9a693fd2014-10-03 11:32:19 -070088 private final Map<Criterion.Type, Criterion> selector = new HashMap<>();
alshabib7b2748f2014-09-16 20:21:11 -070089
tom9a693fd2014-10-03 11:32:19 -070090 private Builder() {
91 }
92
93 private Builder(TrafficSelector selector) {
94 for (Criterion c : selector.criteria()) {
95 add(c);
96 }
97 }
alshabib7b2748f2014-09-16 20:21:11 -070098
99 @Override
alshabib010c31d2014-09-26 10:01:12 -0700100 public Builder add(Criterion criterion) {
tom9a693fd2014-10-03 11:32:19 -0700101 selector.put(criterion.type(), criterion);
alshabib7b2748f2014-09-16 20:21:11 -0700102 return this;
103 }
104
alshabibba5ac482014-10-02 17:15:20 -0700105 @Override
alshabib010c31d2014-09-26 10:01:12 -0700106 public Builder matchInport(PortNumber port) {
107 return add(Criteria.matchInPort(port));
108 }
109
alshabibba5ac482014-10-02 17:15:20 -0700110 @Override
alshabib010c31d2014-09-26 10:01:12 -0700111 public Builder matchEthSrc(MacAddress addr) {
112 return add(Criteria.matchEthSrc(addr));
113 }
114
alshabibba5ac482014-10-02 17:15:20 -0700115 @Override
alshabib010c31d2014-09-26 10:01:12 -0700116 public Builder matchEthDst(MacAddress addr) {
117 return add(Criteria.matchEthDst(addr));
118 }
119
alshabibba5ac482014-10-02 17:15:20 -0700120 @Override
alshabib010c31d2014-09-26 10:01:12 -0700121 public Builder matchEthType(short ethType) {
122 return add(Criteria.matchEthType(ethType));
123 }
124
alshabibba5ac482014-10-02 17:15:20 -0700125 @Override
alshabib010c31d2014-09-26 10:01:12 -0700126 public Builder matchVlanId(VlanId vlanId) {
127 return add(Criteria.matchVlanId(vlanId));
128 }
129
alshabibba5ac482014-10-02 17:15:20 -0700130 @Override
alshabib010c31d2014-09-26 10:01:12 -0700131 public Builder matchVlanPcp(Byte vlanPcp) {
132 return add(Criteria.matchVlanPcp(vlanPcp));
133 }
134
alshabibba5ac482014-10-02 17:15:20 -0700135 @Override
alshabib010c31d2014-09-26 10:01:12 -0700136 public Builder matchIPProtocol(Byte proto) {
137 return add(Criteria.matchIPProtocol(proto));
138 }
139
alshabibba5ac482014-10-02 17:15:20 -0700140 @Override
alshabib010c31d2014-09-26 10:01:12 -0700141 public Builder matchIPSrc(IpPrefix ip) {
142 return add(Criteria.matchIPSrc(ip));
143 }
144
alshabibba5ac482014-10-02 17:15:20 -0700145 @Override
alshabib010c31d2014-09-26 10:01:12 -0700146 public Builder matchIPDst(IpPrefix ip) {
147 return add(Criteria.matchIPDst(ip));
148 }
149
alshabib7b2748f2014-09-16 20:21:11 -0700150 @Override
Toshio Koide9c44c9a2014-10-09 11:44:36 -0700151 public Builder matchTcpSrc(Short tcpPort) {
152 return add(Criteria.matchTcpSrc(tcpPort));
153 }
154
155 @Override
156 public Builder matchTcpDst(Short tcpPort) {
157 return add(Criteria.matchTcpDst(tcpPort));
158 }
159
160 @Override
alshabib7b2748f2014-09-16 20:21:11 -0700161 public TrafficSelector build() {
tom9a693fd2014-10-03 11:32:19 -0700162 return new DefaultTrafficSelector(ImmutableSet.copyOf(selector.values()));
alshabib7b2748f2014-09-16 20:21:11 -0700163 }
164
165 }
166
167}