blob: f51d75e0b8e3beb10df1492d526e200016872535 [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.HashMap;
12import java.util.Map;
13import java.util.Objects;
14import java.util.Set;
15
16/**
17 * Default traffic selector implementation.
18 */
alshabib7b2748f2014-09-16 20:21:11 -070019public final class DefaultTrafficSelector implements TrafficSelector {
20
tom9a693fd2014-10-03 11:32:19 -070021 private final Set<Criterion> criteria;
alshabib7b2748f2014-09-16 20:21:11 -070022
tom9a693fd2014-10-03 11:32:19 -070023 /**
24 * Creates a new traffic selector with the specified criteria.
25 *
26 * @param criteria criteria
27 */
28 private DefaultTrafficSelector(Set<Criterion> criteria) {
Yuta HIGUCHI2809bf32014-10-20 22:44:12 -070029 this.criteria = ImmutableSet.copyOf(criteria);
alshabib7b2748f2014-09-16 20:21:11 -070030 }
31
32 @Override
alshabibba5ac482014-10-02 17:15:20 -070033 public Set<Criterion> criteria() {
tom9a693fd2014-10-03 11:32:19 -070034 return criteria;
alshabib7b2748f2014-09-16 20:21:11 -070035 }
36
alshabibba5ac482014-10-02 17:15:20 -070037 @Override
38 public int hashCode() {
tom9a693fd2014-10-03 11:32:19 -070039 return Objects.hash(criteria);
alshabibba5ac482014-10-02 17:15:20 -070040 }
41
42 @Override
43 public boolean equals(Object obj) {
44 if (this == obj) {
45 return true;
46 }
47 if (obj instanceof DefaultTrafficSelector) {
48 DefaultTrafficSelector that = (DefaultTrafficSelector) obj;
tom9a693fd2014-10-03 11:32:19 -070049 return Objects.equals(criteria, that.criteria);
alshabibba5ac482014-10-02 17:15:20 -070050
51 }
52 return false;
53 }
54
tom9a693fd2014-10-03 11:32:19 -070055 /**
56 * Returns a new traffic selector builder.
57 *
58 * @return traffic selector builder
59 */
60 public static TrafficSelector.Builder builder() {
61 return new Builder();
62 }
alshabibba5ac482014-10-02 17:15:20 -070063
tom9a693fd2014-10-03 11:32:19 -070064 /**
65 * Returns a new traffic selector builder primed to produce entities
66 * patterned after the supplied selector.
67 *
68 * @return traffic selector builder
69 */
70 public static TrafficSelector.Builder builder(TrafficSelector selector) {
71 return new Builder(selector);
72 }
alshabibba5ac482014-10-02 17:15:20 -070073
tom9a693fd2014-10-03 11:32:19 -070074 /**
75 * Builder of traffic selector entities.
76 */
77 public static final class Builder implements TrafficSelector.Builder {
alshabib7b2748f2014-09-16 20:21:11 -070078
tom9a693fd2014-10-03 11:32:19 -070079 private final Map<Criterion.Type, Criterion> selector = new HashMap<>();
alshabib7b2748f2014-09-16 20:21:11 -070080
tom9a693fd2014-10-03 11:32:19 -070081 private Builder() {
82 }
83
84 private Builder(TrafficSelector selector) {
85 for (Criterion c : selector.criteria()) {
86 add(c);
87 }
88 }
alshabib7b2748f2014-09-16 20:21:11 -070089
90 @Override
alshabib010c31d2014-09-26 10:01:12 -070091 public Builder add(Criterion criterion) {
tom9a693fd2014-10-03 11:32:19 -070092 selector.put(criterion.type(), criterion);
alshabib7b2748f2014-09-16 20:21:11 -070093 return this;
94 }
95
alshabibba5ac482014-10-02 17:15:20 -070096 @Override
alshabib010c31d2014-09-26 10:01:12 -070097 public Builder matchInport(PortNumber port) {
98 return add(Criteria.matchInPort(port));
99 }
100
alshabibba5ac482014-10-02 17:15:20 -0700101 @Override
alshabib010c31d2014-09-26 10:01:12 -0700102 public Builder matchEthSrc(MacAddress addr) {
103 return add(Criteria.matchEthSrc(addr));
104 }
105
alshabibba5ac482014-10-02 17:15:20 -0700106 @Override
alshabib010c31d2014-09-26 10:01:12 -0700107 public Builder matchEthDst(MacAddress addr) {
108 return add(Criteria.matchEthDst(addr));
109 }
110
alshabibba5ac482014-10-02 17:15:20 -0700111 @Override
alshabib010c31d2014-09-26 10:01:12 -0700112 public Builder matchEthType(short ethType) {
113 return add(Criteria.matchEthType(ethType));
114 }
115
alshabibba5ac482014-10-02 17:15:20 -0700116 @Override
alshabib010c31d2014-09-26 10:01:12 -0700117 public Builder matchVlanId(VlanId vlanId) {
118 return add(Criteria.matchVlanId(vlanId));
119 }
120
alshabibba5ac482014-10-02 17:15:20 -0700121 @Override
alshabib010c31d2014-09-26 10:01:12 -0700122 public Builder matchVlanPcp(Byte vlanPcp) {
123 return add(Criteria.matchVlanPcp(vlanPcp));
124 }
125
alshabibba5ac482014-10-02 17:15:20 -0700126 @Override
alshabib010c31d2014-09-26 10:01:12 -0700127 public Builder matchIPProtocol(Byte proto) {
128 return add(Criteria.matchIPProtocol(proto));
129 }
130
alshabibba5ac482014-10-02 17:15:20 -0700131 @Override
alshabib010c31d2014-09-26 10:01:12 -0700132 public Builder matchIPSrc(IpPrefix ip) {
133 return add(Criteria.matchIPSrc(ip));
134 }
135
alshabibba5ac482014-10-02 17:15:20 -0700136 @Override
alshabib010c31d2014-09-26 10:01:12 -0700137 public Builder matchIPDst(IpPrefix ip) {
138 return add(Criteria.matchIPDst(ip));
139 }
140
alshabib7b2748f2014-09-16 20:21:11 -0700141 @Override
Toshio Koide9c44c9a2014-10-09 11:44:36 -0700142 public Builder matchTcpSrc(Short tcpPort) {
143 return add(Criteria.matchTcpSrc(tcpPort));
144 }
145
146 @Override
147 public Builder matchTcpDst(Short tcpPort) {
148 return add(Criteria.matchTcpDst(tcpPort));
149 }
150
151 @Override
alshabib7b2748f2014-09-16 20:21:11 -0700152 public TrafficSelector build() {
tom9a693fd2014-10-03 11:32:19 -0700153 return new DefaultTrafficSelector(ImmutableSet.copyOf(selector.values()));
alshabib7b2748f2014-09-16 20:21:11 -0700154 }
155
156 }
157
158}