blob: a388b484f868b03593f91caf036b598fc42d662a [file] [log] [blame]
alshabib7b2748f2014-09-16 20:21:11 -07001package org.onlab.onos.net.flow;
2
tom9a693fd2014-10-03 11:32:19 -07003import com.google.common.collect.ImmutableSet;
alshabib010c31d2014-09-26 10:01:12 -07004import org.onlab.onos.net.PortNumber;
5import org.onlab.onos.net.flow.criteria.Criteria;
alshabib7b2748f2014-09-16 20:21:11 -07006import org.onlab.onos.net.flow.criteria.Criterion;
alshabib010c31d2014-09-26 10:01:12 -07007import org.onlab.packet.IpPrefix;
8import org.onlab.packet.MacAddress;
9import org.onlab.packet.VlanId;
alshabib7b2748f2014-09-16 20:21:11 -070010
tom9a693fd2014-10-03 11:32:19 -070011import java.util.Collections;
12import java.util.HashMap;
13import java.util.Map;
14import java.util.Objects;
15import java.util.Set;
16
17/**
18 * Default traffic selector implementation.
19 */
alshabib7b2748f2014-09-16 20:21:11 -070020public final class DefaultTrafficSelector implements TrafficSelector {
21
tom9a693fd2014-10-03 11:32:19 -070022 private final Set<Criterion> criteria;
alshabib7b2748f2014-09-16 20:21:11 -070023
tom9a693fd2014-10-03 11:32:19 -070024 /**
25 * Creates a new traffic selector with the specified criteria.
26 *
27 * @param criteria criteria
28 */
29 private DefaultTrafficSelector(Set<Criterion> criteria) {
30 this.criteria = Collections.unmodifiableSet(criteria);
alshabib7b2748f2014-09-16 20:21:11 -070031 }
32
33 @Override
alshabibba5ac482014-10-02 17:15:20 -070034 public Set<Criterion> criteria() {
tom9a693fd2014-10-03 11:32:19 -070035 return criteria;
alshabib7b2748f2014-09-16 20:21:11 -070036 }
37
alshabibba5ac482014-10-02 17:15:20 -070038 @Override
39 public int hashCode() {
tom9a693fd2014-10-03 11:32:19 -070040 return Objects.hash(criteria);
alshabibba5ac482014-10-02 17:15:20 -070041 }
42
43 @Override
44 public boolean equals(Object obj) {
45 if (this == obj) {
46 return true;
47 }
48 if (obj instanceof DefaultTrafficSelector) {
49 DefaultTrafficSelector that = (DefaultTrafficSelector) obj;
tom9a693fd2014-10-03 11:32:19 -070050 return Objects.equals(criteria, that.criteria);
alshabibba5ac482014-10-02 17:15:20 -070051
52 }
53 return false;
54 }
55
tom9a693fd2014-10-03 11:32:19 -070056 /**
57 * Returns a new traffic selector builder.
58 *
59 * @return traffic selector builder
60 */
61 public static TrafficSelector.Builder builder() {
62 return new Builder();
63 }
alshabibba5ac482014-10-02 17:15:20 -070064
tom9a693fd2014-10-03 11:32:19 -070065 /**
66 * Returns a new traffic selector builder primed to produce entities
67 * patterned after the supplied selector.
68 *
69 * @return traffic selector builder
70 */
71 public static TrafficSelector.Builder builder(TrafficSelector selector) {
72 return new Builder(selector);
73 }
alshabibba5ac482014-10-02 17:15:20 -070074
tom9a693fd2014-10-03 11:32:19 -070075 /**
76 * Builder of traffic selector entities.
77 */
78 public static final class Builder implements TrafficSelector.Builder {
alshabib7b2748f2014-09-16 20:21:11 -070079
tom9a693fd2014-10-03 11:32:19 -070080 private final Map<Criterion.Type, Criterion> selector = new HashMap<>();
alshabib7b2748f2014-09-16 20:21:11 -070081
tom9a693fd2014-10-03 11:32:19 -070082 private Builder() {
83 }
84
85 private Builder(TrafficSelector selector) {
86 for (Criterion c : selector.criteria()) {
87 add(c);
88 }
89 }
alshabib7b2748f2014-09-16 20:21:11 -070090
91 @Override
alshabib010c31d2014-09-26 10:01:12 -070092 public Builder add(Criterion criterion) {
tom9a693fd2014-10-03 11:32:19 -070093 selector.put(criterion.type(), criterion);
alshabib7b2748f2014-09-16 20:21:11 -070094 return this;
95 }
96
alshabibba5ac482014-10-02 17:15:20 -070097 @Override
alshabib010c31d2014-09-26 10:01:12 -070098 public Builder matchInport(PortNumber port) {
99 return add(Criteria.matchInPort(port));
100 }
101
alshabibba5ac482014-10-02 17:15:20 -0700102 @Override
alshabib010c31d2014-09-26 10:01:12 -0700103 public Builder matchEthSrc(MacAddress addr) {
104 return add(Criteria.matchEthSrc(addr));
105 }
106
alshabibba5ac482014-10-02 17:15:20 -0700107 @Override
alshabib010c31d2014-09-26 10:01:12 -0700108 public Builder matchEthDst(MacAddress addr) {
109 return add(Criteria.matchEthDst(addr));
110 }
111
alshabibba5ac482014-10-02 17:15:20 -0700112 @Override
alshabib010c31d2014-09-26 10:01:12 -0700113 public Builder matchEthType(short ethType) {
114 return add(Criteria.matchEthType(ethType));
115 }
116
alshabibba5ac482014-10-02 17:15:20 -0700117 @Override
alshabib010c31d2014-09-26 10:01:12 -0700118 public Builder matchVlanId(VlanId vlanId) {
119 return add(Criteria.matchVlanId(vlanId));
120 }
121
alshabibba5ac482014-10-02 17:15:20 -0700122 @Override
alshabib010c31d2014-09-26 10:01:12 -0700123 public Builder matchVlanPcp(Byte vlanPcp) {
124 return add(Criteria.matchVlanPcp(vlanPcp));
125 }
126
alshabibba5ac482014-10-02 17:15:20 -0700127 @Override
alshabib010c31d2014-09-26 10:01:12 -0700128 public Builder matchIPProtocol(Byte proto) {
129 return add(Criteria.matchIPProtocol(proto));
130 }
131
alshabibba5ac482014-10-02 17:15:20 -0700132 @Override
alshabib010c31d2014-09-26 10:01:12 -0700133 public Builder matchIPSrc(IpPrefix ip) {
134 return add(Criteria.matchIPSrc(ip));
135 }
136
alshabibba5ac482014-10-02 17:15:20 -0700137 @Override
alshabib010c31d2014-09-26 10:01:12 -0700138 public Builder matchIPDst(IpPrefix ip) {
139 return add(Criteria.matchIPDst(ip));
140 }
141
alshabib7b2748f2014-09-16 20:21:11 -0700142 @Override
Toshio Koide9c44c9a2014-10-09 11:44:36 -0700143 public Builder matchTcpSrc(Short tcpPort) {
144 return add(Criteria.matchTcpSrc(tcpPort));
145 }
146
147 @Override
148 public Builder matchTcpDst(Short tcpPort) {
149 return add(Criteria.matchTcpDst(tcpPort));
150 }
151
152 @Override
alshabib7b2748f2014-09-16 20:21:11 -0700153 public TrafficSelector build() {
tom9a693fd2014-10-03 11:32:19 -0700154 return new DefaultTrafficSelector(ImmutableSet.copyOf(selector.values()));
alshabib7b2748f2014-09-16 20:21:11 -0700155 }
156
157 }
158
159}