Implement some of the missing Selector and Match Conditions
Work toward ONOS-509 The following match conditions are added/implemented: - UDP_SRC, UDP_DST - SCTP_SRC, SCTP_DST - ICMPV4_TYPE, ICMPV4_CODE - IPV6_FLABEL - IPV6_ND_TARGET - IPV6_ND_SLL - IPV6_ND_TLL Also: * Renamed method TrafficSelector.Builder.matchInport(PortNumber port) to TrafficSelector.Builder.matchInPort(PortNumber port) (for consistency with the corresponding method(s) elsewhere) * Reordered the code for some of the existing matching conditions to follow the order in the OpenFlow spec, so it is easier to cross-reference such code. * Added missing Javadoc * Added few more Criterion.Type values as per OpenFlow spec 1.5.0 Change-Id: I7fc1656f32d8a7280c67d7827e4aa84528b0eafc
Showing
15 changed files
with
1878 additions
and
409 deletions
... | @@ -288,7 +288,7 @@ public class ReactiveForwarding { | ... | @@ -288,7 +288,7 @@ public class ReactiveForwarding { |
288 | builder.matchEthType(inPkt.getEtherType()) | 288 | builder.matchEthType(inPkt.getEtherType()) |
289 | .matchEthSrc(inPkt.getSourceMAC()) | 289 | .matchEthSrc(inPkt.getSourceMAC()) |
290 | .matchEthDst(inPkt.getDestinationMAC()) | 290 | .matchEthDst(inPkt.getDestinationMAC()) |
291 | - .matchInport(context.inPacket().receivedFrom().port()); | 291 | + .matchInPort(context.inPacket().receivedFrom().port()); |
292 | 292 | ||
293 | TrafficTreatment.Builder treat = DefaultTrafficTreatment.builder(); | 293 | TrafficTreatment.Builder treat = DefaultTrafficTreatment.builder(); |
294 | treat.setOutput(portNumber); | 294 | treat.setOutput(portNumber); | ... | ... |
... | @@ -107,21 +107,21 @@ public class LambdaForwarding { | ... | @@ -107,21 +107,21 @@ public class LambdaForwarding { |
107 | case 1: | 107 | case 1: |
108 | inport = 10; | 108 | inport = 10; |
109 | outport = 20; | 109 | outport = 20; |
110 | - sbuilder.matchInport(PortNumber.portNumber(inport)); | 110 | + sbuilder.matchInPort(PortNumber.portNumber(inport)); |
111 | tbuilder.setOutput(PortNumber.portNumber(outport)).setLambda(lambda); | 111 | tbuilder.setOutput(PortNumber.portNumber(outport)).setLambda(lambda); |
112 | break; | 112 | break; |
113 | case 2: | 113 | case 2: |
114 | inport = 21; | 114 | inport = 21; |
115 | outport = 11; | 115 | outport = 11; |
116 | sbuilder.matchLambda(lambda). | 116 | sbuilder.matchLambda(lambda). |
117 | - matchInport(PortNumber.portNumber(inport)); // match sigtype | 117 | + matchInPort(PortNumber.portNumber(inport)); // match sigtype |
118 | tbuilder.setOutput(PortNumber.portNumber(outport)); | 118 | tbuilder.setOutput(PortNumber.portNumber(outport)); |
119 | break; | 119 | break; |
120 | case 3: | 120 | case 3: |
121 | inport = 30; | 121 | inport = 30; |
122 | outport = 31; | 122 | outport = 31; |
123 | sbuilder.matchLambda(lambda). | 123 | sbuilder.matchLambda(lambda). |
124 | - matchInport(PortNumber.portNumber(inport)); | 124 | + matchInPort(PortNumber.portNumber(inport)); |
125 | tbuilder.setOutput(PortNumber.portNumber(outport)).setLambda(lambda); | 125 | tbuilder.setOutput(PortNumber.portNumber(outport)).setLambda(lambda); |
126 | break; | 126 | break; |
127 | default: | 127 | default: | ... | ... |
... | @@ -106,7 +106,7 @@ public class MPLSForwarding { | ... | @@ -106,7 +106,7 @@ public class MPLSForwarding { |
106 | 106 | ||
107 | switch (switchNumber) { | 107 | switch (switchNumber) { |
108 | case 1: | 108 | case 1: |
109 | - sbuilder.matchInport(PortNumber.portNumber(inport)); | 109 | + sbuilder.matchInPort(PortNumber.portNumber(inport)); |
110 | tbuilder.setOutput(PortNumber.portNumber(outport)) | 110 | tbuilder.setOutput(PortNumber.portNumber(outport)) |
111 | .pushMpls() | 111 | .pushMpls() |
112 | .setMpls(mplsLabel); | 112 | .setMpls(mplsLabel); |
... | @@ -114,13 +114,13 @@ public class MPLSForwarding { | ... | @@ -114,13 +114,13 @@ public class MPLSForwarding { |
114 | case 2: | 114 | case 2: |
115 | sbuilder.matchMplsLabel(mplsLabel) | 115 | sbuilder.matchMplsLabel(mplsLabel) |
116 | .matchEthType(Ethernet.MPLS_UNICAST) | 116 | .matchEthType(Ethernet.MPLS_UNICAST) |
117 | - .matchInport(PortNumber.portNumber(inport)); | 117 | + .matchInPort(PortNumber.portNumber(inport)); |
118 | tbuilder.setOutput(PortNumber.portNumber(outport)); | 118 | tbuilder.setOutput(PortNumber.portNumber(outport)); |
119 | break; | 119 | break; |
120 | case 3: | 120 | case 3: |
121 | sbuilder.matchMplsLabel(mplsLabel) | 121 | sbuilder.matchMplsLabel(mplsLabel) |
122 | .matchEthType(Ethernet.MPLS_UNICAST) | 122 | .matchEthType(Ethernet.MPLS_UNICAST) |
123 | - .matchInport(PortNumber.portNumber(inport)); | 123 | + .matchInPort(PortNumber.portNumber(inport)); |
124 | tbuilder.popMpls().setOutput(PortNumber.portNumber(outport)); | 124 | tbuilder.popMpls().setOutput(PortNumber.portNumber(outport)); |
125 | break; | 125 | break; |
126 | default: | 126 | default: | ... | ... |
... | @@ -24,6 +24,7 @@ import org.onosproject.net.PortNumber; | ... | @@ -24,6 +24,7 @@ import org.onosproject.net.PortNumber; |
24 | import org.onosproject.net.flow.criteria.Criteria; | 24 | import org.onosproject.net.flow.criteria.Criteria; |
25 | import org.onosproject.net.flow.criteria.Criterion; | 25 | import org.onosproject.net.flow.criteria.Criterion; |
26 | import org.onlab.packet.IpPrefix; | 26 | import org.onlab.packet.IpPrefix; |
27 | +import org.onlab.packet.Ip6Address; | ||
27 | import org.onlab.packet.MacAddress; | 28 | import org.onlab.packet.MacAddress; |
28 | import org.onlab.packet.VlanId; | 29 | import org.onlab.packet.VlanId; |
29 | 30 | ||
... | @@ -129,22 +130,22 @@ public final class DefaultTrafficSelector implements TrafficSelector { | ... | @@ -129,22 +130,22 @@ public final class DefaultTrafficSelector implements TrafficSelector { |
129 | } | 130 | } |
130 | 131 | ||
131 | @Override | 132 | @Override |
132 | - public Builder matchInport(PortNumber port) { | 133 | + public Builder matchInPort(PortNumber port) { |
133 | return add(Criteria.matchInPort(port)); | 134 | return add(Criteria.matchInPort(port)); |
134 | } | 135 | } |
135 | 136 | ||
136 | @Override | 137 | @Override |
137 | - public Builder matchEthSrc(MacAddress addr) { | 138 | + public Builder matchEthDst(MacAddress addr) { |
138 | - return add(Criteria.matchEthSrc(addr)); | 139 | + return add(Criteria.matchEthDst(addr)); |
139 | } | 140 | } |
140 | 141 | ||
141 | @Override | 142 | @Override |
142 | - public Builder matchEthDst(MacAddress addr) { | 143 | + public Builder matchEthSrc(MacAddress addr) { |
143 | - return add(Criteria.matchEthDst(addr)); | 144 | + return add(Criteria.matchEthSrc(addr)); |
144 | } | 145 | } |
145 | 146 | ||
146 | @Override | 147 | @Override |
147 | - public Builder matchEthType(short ethType) { | 148 | + public Builder matchEthType(Short ethType) { |
148 | return add(Criteria.matchEthType(ethType)); | 149 | return add(Criteria.matchEthType(ethType)); |
149 | } | 150 | } |
150 | 151 | ||
... | @@ -184,6 +185,36 @@ public final class DefaultTrafficSelector implements TrafficSelector { | ... | @@ -184,6 +185,36 @@ public final class DefaultTrafficSelector implements TrafficSelector { |
184 | } | 185 | } |
185 | 186 | ||
186 | @Override | 187 | @Override |
188 | + public Builder matchUdpSrc(Short udpPort) { | ||
189 | + return add(Criteria.matchUdpSrc(udpPort)); | ||
190 | + } | ||
191 | + | ||
192 | + @Override | ||
193 | + public Builder matchUdpDst(Short udpPort) { | ||
194 | + return add(Criteria.matchUdpDst(udpPort)); | ||
195 | + } | ||
196 | + | ||
197 | + @Override | ||
198 | + public Builder matchSctpSrc(Short sctpPort) { | ||
199 | + return add(Criteria.matchSctpSrc(sctpPort)); | ||
200 | + } | ||
201 | + | ||
202 | + @Override | ||
203 | + public Builder matchSctpDst(Short sctpPort) { | ||
204 | + return add(Criteria.matchSctpDst(sctpPort)); | ||
205 | + } | ||
206 | + | ||
207 | + @Override | ||
208 | + public Builder matchIcmpType(Byte icmpType) { | ||
209 | + return add(Criteria.matchIcmpType(icmpType)); | ||
210 | + } | ||
211 | + | ||
212 | + @Override | ||
213 | + public Builder matchIcmpCode(Byte icmpCode) { | ||
214 | + return add(Criteria.matchIcmpCode(icmpCode)); | ||
215 | + } | ||
216 | + | ||
217 | + @Override | ||
187 | public Builder matchIPv6Src(IpPrefix ip) { | 218 | public Builder matchIPv6Src(IpPrefix ip) { |
188 | return add(Criteria.matchIPv6Src(ip)); | 219 | return add(Criteria.matchIPv6Src(ip)); |
189 | } | 220 | } |
... | @@ -194,6 +225,11 @@ public final class DefaultTrafficSelector implements TrafficSelector { | ... | @@ -194,6 +225,11 @@ public final class DefaultTrafficSelector implements TrafficSelector { |
194 | } | 225 | } |
195 | 226 | ||
196 | @Override | 227 | @Override |
228 | + public Builder matchIPv6FlowLabel(Integer flowLabel) { | ||
229 | + return add(Criteria.matchIPv6FlowLabel(flowLabel)); | ||
230 | + } | ||
231 | + | ||
232 | + @Override | ||
197 | public Builder matchIcmpv6Type(Byte icmpv6Type) { | 233 | public Builder matchIcmpv6Type(Byte icmpv6Type) { |
198 | return add(Criteria.matchIcmpv6Type(icmpv6Type)); | 234 | return add(Criteria.matchIcmpv6Type(icmpv6Type)); |
199 | } | 235 | } |
... | @@ -204,6 +240,21 @@ public final class DefaultTrafficSelector implements TrafficSelector { | ... | @@ -204,6 +240,21 @@ public final class DefaultTrafficSelector implements TrafficSelector { |
204 | } | 240 | } |
205 | 241 | ||
206 | @Override | 242 | @Override |
243 | + public Builder matchIPv6NDTargetAddress(Ip6Address targetAddress) { | ||
244 | + return add(Criteria.matchIPv6NDTargetAddress(targetAddress)); | ||
245 | + } | ||
246 | + | ||
247 | + @Override | ||
248 | + public Builder matchIPv6NDSourceLinkLayerAddress(MacAddress mac) { | ||
249 | + return add(Criteria.matchIPv6NDSourceLinkLayerAddress(mac)); | ||
250 | + } | ||
251 | + | ||
252 | + @Override | ||
253 | + public Builder matchIPv6NDTargetLinkLayerAddress(MacAddress mac) { | ||
254 | + return add(Criteria.matchIPv6NDTargetLinkLayerAddress(mac)); | ||
255 | + } | ||
256 | + | ||
257 | + @Override | ||
207 | public Builder matchMplsLabel(Integer mplsLabel) { | 258 | public Builder matchMplsLabel(Integer mplsLabel) { |
208 | return add(Criteria.matchMplsLabel(mplsLabel)); | 259 | return add(Criteria.matchMplsLabel(mplsLabel)); |
209 | } | 260 | } | ... | ... |
... | @@ -20,6 +20,7 @@ import java.util.Set; | ... | @@ -20,6 +20,7 @@ import java.util.Set; |
20 | import org.onosproject.net.PortNumber; | 20 | import org.onosproject.net.PortNumber; |
21 | import org.onosproject.net.flow.criteria.Criterion; | 21 | import org.onosproject.net.flow.criteria.Criterion; |
22 | import org.onlab.packet.IpPrefix; | 22 | import org.onlab.packet.IpPrefix; |
23 | +import org.onlab.packet.Ip6Address; | ||
23 | import org.onlab.packet.MacAddress; | 24 | import org.onlab.packet.MacAddress; |
24 | import org.onlab.packet.VlanId; | 25 | import org.onlab.packet.VlanId; |
25 | 26 | ||
... | @@ -64,23 +65,23 @@ public interface TrafficSelector { | ... | @@ -64,23 +65,23 @@ public interface TrafficSelector { |
64 | * @param port the inport | 65 | * @param port the inport |
65 | * @return a selection builder | 66 | * @return a selection builder |
66 | */ | 67 | */ |
67 | - public Builder matchInport(PortNumber port); | 68 | + public Builder matchInPort(PortNumber port); |
68 | 69 | ||
69 | /** | 70 | /** |
70 | - * Matches a l2 src address. | 71 | + * Matches a l2 dst address. |
71 | * | 72 | * |
72 | * @param addr a l2 address | 73 | * @param addr a l2 address |
73 | * @return a selection builder | 74 | * @return a selection builder |
74 | */ | 75 | */ |
75 | - public Builder matchEthSrc(MacAddress addr); | 76 | + public Builder matchEthDst(MacAddress addr); |
76 | 77 | ||
77 | /** | 78 | /** |
78 | - * Matches a l2 dst address. | 79 | + * Matches a l2 src address. |
79 | * | 80 | * |
80 | * @param addr a l2 address | 81 | * @param addr a l2 address |
81 | * @return a selection builder | 82 | * @return a selection builder |
82 | */ | 83 | */ |
83 | - public Builder matchEthDst(MacAddress addr); | 84 | + public Builder matchEthSrc(MacAddress addr); |
84 | 85 | ||
85 | /** | 86 | /** |
86 | * Matches the ethernet type. | 87 | * Matches the ethernet type. |
... | @@ -88,7 +89,7 @@ public interface TrafficSelector { | ... | @@ -88,7 +89,7 @@ public interface TrafficSelector { |
88 | * @param ethType an ethernet type | 89 | * @param ethType an ethernet type |
89 | * @return a selection builder | 90 | * @return a selection builder |
90 | */ | 91 | */ |
91 | - public Builder matchEthType(short ethType); | 92 | + public Builder matchEthType(Short ethType); |
92 | 93 | ||
93 | /** | 94 | /** |
94 | * Matches the vlan id. | 95 | * Matches the vlan id. |
... | @@ -147,6 +148,54 @@ public interface TrafficSelector { | ... | @@ -147,6 +148,54 @@ public interface TrafficSelector { |
147 | public Builder matchTcpDst(Short tcpPort); | 148 | public Builder matchTcpDst(Short tcpPort); |
148 | 149 | ||
149 | /** | 150 | /** |
151 | + * Matches an UDP source port number. | ||
152 | + * | ||
153 | + * @param udpPort an UDP source port number | ||
154 | + * @return a selection builder | ||
155 | + */ | ||
156 | + public Builder matchUdpSrc(Short udpPort); | ||
157 | + | ||
158 | + /** | ||
159 | + * Matches an UDP destination port number. | ||
160 | + * | ||
161 | + * @param udpPort an UDP destination port number | ||
162 | + * @return a selection builder | ||
163 | + */ | ||
164 | + public Builder matchUdpDst(Short udpPort); | ||
165 | + | ||
166 | + /** | ||
167 | + * Matches a SCTP source port number. | ||
168 | + * | ||
169 | + * @param sctpPort a SCTP source port number | ||
170 | + * @return a selection builder | ||
171 | + */ | ||
172 | + public Builder matchSctpSrc(Short sctpPort); | ||
173 | + | ||
174 | + /** | ||
175 | + * Matches a SCTP destination port number. | ||
176 | + * | ||
177 | + * @param sctpPort a SCTP destination port number | ||
178 | + * @return a selection builder | ||
179 | + */ | ||
180 | + public Builder matchSctpDst(Short sctpPort); | ||
181 | + | ||
182 | + /** | ||
183 | + * Matches an ICMP type. | ||
184 | + * | ||
185 | + * @param icmpType an ICMP type | ||
186 | + * @return a selection builder | ||
187 | + */ | ||
188 | + public Builder matchIcmpType(Byte icmpType); | ||
189 | + | ||
190 | + /** | ||
191 | + * Matches an ICMP code. | ||
192 | + * | ||
193 | + * @param icmpCode an ICMP code | ||
194 | + * @return a selection builder | ||
195 | + */ | ||
196 | + public Builder matchIcmpCode(Byte icmpCode); | ||
197 | + | ||
198 | + /** | ||
150 | * Matches a l3 IPv6 address. | 199 | * Matches a l3 IPv6 address. |
151 | * | 200 | * |
152 | * @param ip a l3 IPv6 address | 201 | * @param ip a l3 IPv6 address |
... | @@ -163,23 +212,56 @@ public interface TrafficSelector { | ... | @@ -163,23 +212,56 @@ public interface TrafficSelector { |
163 | public Builder matchIPv6Dst(IpPrefix ip); | 212 | public Builder matchIPv6Dst(IpPrefix ip); |
164 | 213 | ||
165 | /** | 214 | /** |
166 | - * Matches a ICMPv6 type. | 215 | + * Matches an IPv6 flow label. |
167 | * | 216 | * |
168 | - * @param icmpv6Type a ICMPv6 type | 217 | + * @param flowLabel an IPv6 flow label |
218 | + * @return a selection builder | ||
219 | + */ | ||
220 | + public Builder matchIPv6FlowLabel(Integer flowLabel); | ||
221 | + | ||
222 | + /** | ||
223 | + * Matches an ICMPv6 type. | ||
224 | + * | ||
225 | + * @param icmpv6Type an ICMPv6 type | ||
169 | * @return a selection builder | 226 | * @return a selection builder |
170 | */ | 227 | */ |
171 | public Builder matchIcmpv6Type(Byte icmpv6Type); | 228 | public Builder matchIcmpv6Type(Byte icmpv6Type); |
172 | 229 | ||
173 | /** | 230 | /** |
174 | - * Matches a ICMPv6 code. | 231 | + * Matches an ICMPv6 code. |
175 | * | 232 | * |
176 | - * @param icmpv6Code a ICMPv6 code | 233 | + * @param icmpv6Code an ICMPv6 code |
177 | * @return a selection builder | 234 | * @return a selection builder |
178 | */ | 235 | */ |
179 | public Builder matchIcmpv6Code(Byte icmpv6Code); | 236 | public Builder matchIcmpv6Code(Byte icmpv6Code); |
180 | 237 | ||
181 | /** | 238 | /** |
182 | - * Matches on a MPLS label . | 239 | + * Matches an IPv6 Neighbor Discovery target address. |
240 | + * | ||
241 | + * @param targetAddress an IPv6 Neighbor Discovery target address | ||
242 | + * @return a selection builder | ||
243 | + */ | ||
244 | + public Builder matchIPv6NDTargetAddress(Ip6Address targetAddress); | ||
245 | + | ||
246 | + /** | ||
247 | + * Matches an IPv6 Neighbor Discovery source link-layer address. | ||
248 | + * | ||
249 | + * @param mac an IPv6 Neighbor Discovery source link-layer address | ||
250 | + * @return a selection builder | ||
251 | + */ | ||
252 | + public Builder matchIPv6NDSourceLinkLayerAddress(MacAddress mac); | ||
253 | + | ||
254 | + /** | ||
255 | + * Matches an IPv6 Neighbor Discovery target link-layer address. | ||
256 | + * | ||
257 | + * @param mac an IPv6 Neighbor Discovery target link-layer address | ||
258 | + * @return a selection builder | ||
259 | + */ | ||
260 | + public Builder matchIPv6NDTargetLinkLayerAddress(MacAddress mac); | ||
261 | + | ||
262 | + /** | ||
263 | + * Matches on a MPLS label. | ||
264 | + * | ||
183 | * @param mplsLabel a MPLS label. | 265 | * @param mplsLabel a MPLS label. |
184 | * @return a selection builder | 266 | * @return a selection builder |
185 | */ | 267 | */ |
... | @@ -208,5 +290,4 @@ public interface TrafficSelector { | ... | @@ -208,5 +290,4 @@ public interface TrafficSelector { |
208 | */ | 290 | */ |
209 | TrafficSelector build(); | 291 | TrafficSelector build(); |
210 | } | 292 | } |
211 | - | ||
212 | } | 293 | } | ... | ... |
... | @@ -21,6 +21,7 @@ import java.util.Objects; | ... | @@ -21,6 +21,7 @@ import java.util.Objects; |
21 | import org.onosproject.net.PortNumber; | 21 | import org.onosproject.net.PortNumber; |
22 | import org.onosproject.net.flow.criteria.Criterion.Type; | 22 | import org.onosproject.net.flow.criteria.Criterion.Type; |
23 | import org.onlab.packet.IpPrefix; | 23 | import org.onlab.packet.IpPrefix; |
24 | +import org.onlab.packet.Ip6Address; | ||
24 | import org.onlab.packet.MacAddress; | 25 | import org.onlab.packet.MacAddress; |
25 | import org.onlab.packet.VlanId; | 26 | import org.onlab.packet.VlanId; |
26 | 27 | ||
... | @@ -46,25 +47,25 @@ public final class Criteria { | ... | @@ -46,25 +47,25 @@ public final class Criteria { |
46 | } | 47 | } |
47 | 48 | ||
48 | /** | 49 | /** |
49 | - * Creates a match on ETH_SRC field using the specified value. This value | 50 | + * Creates a match on ETH_DST field using the specified value. This value |
50 | * may be a wildcard mask. | 51 | * may be a wildcard mask. |
51 | * | 52 | * |
52 | * @param mac MAC address value or wildcard mask | 53 | * @param mac MAC address value or wildcard mask |
53 | * @return match criterion | 54 | * @return match criterion |
54 | */ | 55 | */ |
55 | - public static Criterion matchEthSrc(MacAddress mac) { | 56 | + public static Criterion matchEthDst(MacAddress mac) { |
56 | - return new EthCriterion(mac, Type.ETH_SRC); | 57 | + return new EthCriterion(mac, Type.ETH_DST); |
57 | } | 58 | } |
58 | 59 | ||
59 | /** | 60 | /** |
60 | - * Creates a match on ETH_DST field using the specified value. This value | 61 | + * Creates a match on ETH_SRC field using the specified value. This value |
61 | * may be a wildcard mask. | 62 | * may be a wildcard mask. |
62 | * | 63 | * |
63 | * @param mac MAC address value or wildcard mask | 64 | * @param mac MAC address value or wildcard mask |
64 | * @return match criterion | 65 | * @return match criterion |
65 | */ | 66 | */ |
66 | - public static Criterion matchEthDst(MacAddress mac) { | 67 | + public static Criterion matchEthSrc(MacAddress mac) { |
67 | - return new EthCriterion(mac, Type.ETH_DST); | 68 | + return new EthCriterion(mac, Type.ETH_SRC); |
68 | } | 69 | } |
69 | 70 | ||
70 | /** | 71 | /** |
... | @@ -148,6 +149,67 @@ public final class Criteria { | ... | @@ -148,6 +149,67 @@ public final class Criteria { |
148 | } | 149 | } |
149 | 150 | ||
150 | /** | 151 | /** |
152 | + * Creates a match on UDP source port field using the specified value. | ||
153 | + * | ||
154 | + * @param udpPort UDP source port | ||
155 | + * @return match criterion | ||
156 | + */ | ||
157 | + public static Criterion matchUdpSrc(Short udpPort) { | ||
158 | + return new UdpPortCriterion(udpPort, Type.UDP_SRC); | ||
159 | + } | ||
160 | + | ||
161 | + /** | ||
162 | + * Creates a match on UDP destination port field using the specified value. | ||
163 | + * | ||
164 | + * @param udpPort UDP destination port | ||
165 | + * @return match criterion | ||
166 | + */ | ||
167 | + public static Criterion matchUdpDst(Short udpPort) { | ||
168 | + return new UdpPortCriterion(udpPort, Type.UDP_DST); | ||
169 | + } | ||
170 | + | ||
171 | + /** | ||
172 | + * Creates a match on SCTP source port field using the specified value. | ||
173 | + * | ||
174 | + * @param sctpPort SCTP source port | ||
175 | + * @return match criterion | ||
176 | + */ | ||
177 | + public static Criterion matchSctpSrc(Short sctpPort) { | ||
178 | + return new SctpPortCriterion(sctpPort, Type.SCTP_SRC); | ||
179 | + } | ||
180 | + | ||
181 | + /** | ||
182 | + * Creates a match on SCTP destination port field using the specified | ||
183 | + * value. | ||
184 | + * | ||
185 | + * @param sctpPort SCTP destination port | ||
186 | + * @return match criterion | ||
187 | + */ | ||
188 | + public static Criterion matchSctpDst(Short sctpPort) { | ||
189 | + return new SctpPortCriterion(sctpPort, Type.SCTP_DST); | ||
190 | + } | ||
191 | + | ||
192 | + /** | ||
193 | + * Creates a match on ICMP type field using the specified value. | ||
194 | + * | ||
195 | + * @param icmpType ICMP type | ||
196 | + * @return match criterion | ||
197 | + */ | ||
198 | + public static Criterion matchIcmpType(Byte icmpType) { | ||
199 | + return new IcmpTypeCriterion(icmpType); | ||
200 | + } | ||
201 | + | ||
202 | + /** | ||
203 | + * Creates a match on ICMP code field using the specified value. | ||
204 | + * | ||
205 | + * @param icmpCode ICMP code | ||
206 | + * @return match criterion | ||
207 | + */ | ||
208 | + public static Criterion matchIcmpCode(Byte icmpCode) { | ||
209 | + return new IcmpCodeCriterion(icmpCode); | ||
210 | + } | ||
211 | + | ||
212 | + /** | ||
151 | * Creates a match on IPv6 source field using the specified value. | 213 | * Creates a match on IPv6 source field using the specified value. |
152 | * | 214 | * |
153 | * @param ip ipv6 source value | 215 | * @param ip ipv6 source value |
... | @@ -160,14 +222,24 @@ public final class Criteria { | ... | @@ -160,14 +222,24 @@ public final class Criteria { |
160 | /** | 222 | /** |
161 | * Creates a match on IPv6 destination field using the specified value. | 223 | * Creates a match on IPv6 destination field using the specified value. |
162 | * | 224 | * |
163 | - * @param ip ipv6 source value | 225 | + * @param ip ipv6 destination value |
164 | * @return match criterion | 226 | * @return match criterion |
165 | */ | 227 | */ |
166 | public static Criterion matchIPv6Dst(IpPrefix ip) { | 228 | public static Criterion matchIPv6Dst(IpPrefix ip) { |
167 | return new IPCriterion(ip, Type.IPV6_DST); | 229 | return new IPCriterion(ip, Type.IPV6_DST); |
168 | } | 230 | } |
169 | 231 | ||
170 | - /* | 232 | + /** |
233 | + * Creates a match on IPv6 flow label field using the specified value. | ||
234 | + * | ||
235 | + * @param flowLabel IPv6 flow label | ||
236 | + * @return match criterion | ||
237 | + */ | ||
238 | + public static Criterion matchIPv6FlowLabel(Integer flowLabel) { | ||
239 | + return new IPv6FlowLabelCriterion(flowLabel); | ||
240 | + } | ||
241 | + | ||
242 | + /** | ||
171 | * Creates a match on ICMPv6 type field using the specified value. | 243 | * Creates a match on ICMPv6 type field using the specified value. |
172 | * | 244 | * |
173 | * @param icmpv6Type ICMPv6 type | 245 | * @param icmpv6Type ICMPv6 type |
... | @@ -188,11 +260,44 @@ public final class Criteria { | ... | @@ -188,11 +260,44 @@ public final class Criteria { |
188 | } | 260 | } |
189 | 261 | ||
190 | /** | 262 | /** |
263 | + * Creates a match on IPv6 Neighbor Discovery target address using the | ||
264 | + * specified value. | ||
265 | + * | ||
266 | + * @param targetAddress IPv6 Neighbor Discovery target address | ||
267 | + * @return match criterion | ||
268 | + */ | ||
269 | + public static Criterion matchIPv6NDTargetAddress(Ip6Address targetAddress) { | ||
270 | + return new IPv6NDTargetAddressCriterion(targetAddress); | ||
271 | + } | ||
272 | + | ||
273 | + /** | ||
274 | + * Creates a match on IPv6 Neighbor Discovery source link-layer address | ||
275 | + * using the specified value. | ||
276 | + * | ||
277 | + * @param mac IPv6 Neighbor Discovery source link-layer address | ||
278 | + * @return match criterion | ||
279 | + */ | ||
280 | + public static Criterion matchIPv6NDSourceLinkLayerAddress(MacAddress mac) { | ||
281 | + return new IPv6NDLinkLayerAddressCriterion(mac, Type.IPV6_ND_SLL); | ||
282 | + } | ||
283 | + | ||
284 | + /** | ||
285 | + * Creates a match on IPv6 Neighbor Discovery target link-layer address | ||
286 | + * using the specified value. | ||
287 | + * | ||
288 | + * @param mac IPv6 Neighbor Discovery target link-layer address | ||
289 | + * @return match criterion | ||
290 | + */ | ||
291 | + public static Criterion matchIPv6NDTargetLinkLayerAddress(MacAddress mac) { | ||
292 | + return new IPv6NDLinkLayerAddressCriterion(mac, Type.IPV6_ND_TLL); | ||
293 | + } | ||
294 | + | ||
295 | + /** | ||
191 | * Creates a match on MPLS label. | 296 | * Creates a match on MPLS label. |
297 | + * | ||
192 | * @param mplsLabel MPLS label | 298 | * @param mplsLabel MPLS label |
193 | * @return match criterion | 299 | * @return match criterion |
194 | */ | 300 | */ |
195 | - | ||
196 | public static Criterion matchMplsLabel(Integer mplsLabel) { | 301 | public static Criterion matchMplsLabel(Integer mplsLabel) { |
197 | return new MplsCriterion(mplsLabel); | 302 | return new MplsCriterion(mplsLabel); |
198 | } | 303 | } |
... | @@ -223,6 +328,11 @@ public final class Criteria { | ... | @@ -223,6 +328,11 @@ public final class Criteria { |
223 | public static final class PortCriterion implements Criterion { | 328 | public static final class PortCriterion implements Criterion { |
224 | private final PortNumber port; | 329 | private final PortNumber port; |
225 | 330 | ||
331 | + /** | ||
332 | + * Constructor. | ||
333 | + * | ||
334 | + * @param port the input port number to match | ||
335 | + */ | ||
226 | public PortCriterion(PortNumber port) { | 336 | public PortCriterion(PortNumber port) { |
227 | this.port = port; | 337 | this.port = port; |
228 | } | 338 | } |
... | @@ -232,6 +342,11 @@ public final class Criteria { | ... | @@ -232,6 +342,11 @@ public final class Criteria { |
232 | return Type.IN_PORT; | 342 | return Type.IN_PORT; |
233 | } | 343 | } |
234 | 344 | ||
345 | + /** | ||
346 | + * Gets the input port number to match. | ||
347 | + * | ||
348 | + * @return the input port number to match | ||
349 | + */ | ||
235 | public PortNumber port() { | 350 | public PortNumber port() { |
236 | return this.port; | 351 | return this.port; |
237 | } | 352 | } |
... | @@ -260,10 +375,8 @@ public final class Criteria { | ... | @@ -260,10 +375,8 @@ public final class Criteria { |
260 | } | 375 | } |
261 | return false; | 376 | return false; |
262 | } | 377 | } |
263 | - | ||
264 | } | 378 | } |
265 | 379 | ||
266 | - | ||
267 | /** | 380 | /** |
268 | * Implementation of MAC address criterion. | 381 | * Implementation of MAC address criterion. |
269 | */ | 382 | */ |
... | @@ -271,6 +384,13 @@ public final class Criteria { | ... | @@ -271,6 +384,13 @@ public final class Criteria { |
271 | private final MacAddress mac; | 384 | private final MacAddress mac; |
272 | private final Type type; | 385 | private final Type type; |
273 | 386 | ||
387 | + /** | ||
388 | + * Constructor. | ||
389 | + * | ||
390 | + * @param mac the source or destination MAC address to match | ||
391 | + * @param type the match type. Should be either Type.ETH_DST or | ||
392 | + * Type.ETH_SRC | ||
393 | + */ | ||
274 | public EthCriterion(MacAddress mac, Type type) { | 394 | public EthCriterion(MacAddress mac, Type type) { |
275 | this.mac = mac; | 395 | this.mac = mac; |
276 | this.type = type; | 396 | this.type = type; |
... | @@ -281,6 +401,11 @@ public final class Criteria { | ... | @@ -281,6 +401,11 @@ public final class Criteria { |
281 | return this.type; | 401 | return this.type; |
282 | } | 402 | } |
283 | 403 | ||
404 | + /** | ||
405 | + * Gets the MAC address to match. | ||
406 | + * | ||
407 | + * @return the MAC address to match | ||
408 | + */ | ||
284 | public MacAddress mac() { | 409 | public MacAddress mac() { |
285 | return this.mac; | 410 | return this.mac; |
286 | } | 411 | } |
... | @@ -305,22 +430,22 @@ public final class Criteria { | ... | @@ -305,22 +430,22 @@ public final class Criteria { |
305 | EthCriterion that = (EthCriterion) obj; | 430 | EthCriterion that = (EthCriterion) obj; |
306 | return Objects.equals(mac, that.mac) && | 431 | return Objects.equals(mac, that.mac) && |
307 | Objects.equals(type, that.type); | 432 | Objects.equals(type, that.type); |
308 | - | ||
309 | - | ||
310 | } | 433 | } |
311 | return false; | 434 | return false; |
312 | } | 435 | } |
313 | - | ||
314 | - | ||
315 | } | 436 | } |
316 | 437 | ||
317 | /** | 438 | /** |
318 | * Implementation of Ethernet type criterion. | 439 | * Implementation of Ethernet type criterion. |
319 | */ | 440 | */ |
320 | public static final class EthTypeCriterion implements Criterion { | 441 | public static final class EthTypeCriterion implements Criterion { |
321 | - | ||
322 | private final Short ethType; | 442 | private final Short ethType; |
323 | 443 | ||
444 | + /** | ||
445 | + * Constructor. | ||
446 | + * | ||
447 | + * @param ethType the Ethernet frame type to match | ||
448 | + */ | ||
324 | public EthTypeCriterion(Short ethType) { | 449 | public EthTypeCriterion(Short ethType) { |
325 | this.ethType = ethType; | 450 | this.ethType = ethType; |
326 | } | 451 | } |
... | @@ -330,6 +455,11 @@ public final class Criteria { | ... | @@ -330,6 +455,11 @@ public final class Criteria { |
330 | return Type.ETH_TYPE; | 455 | return Type.ETH_TYPE; |
331 | } | 456 | } |
332 | 457 | ||
458 | + /** | ||
459 | + * Gets the Ethernet frame type to match. | ||
460 | + * | ||
461 | + * @return the Ethernet frame type to match | ||
462 | + */ | ||
333 | public Short ethType() { | 463 | public Short ethType() { |
334 | return ethType; | 464 | return ethType; |
335 | } | 465 | } |
... | @@ -360,40 +490,46 @@ public final class Criteria { | ... | @@ -360,40 +490,46 @@ public final class Criteria { |
360 | } | 490 | } |
361 | return false; | 491 | return false; |
362 | } | 492 | } |
363 | - | ||
364 | } | 493 | } |
365 | 494 | ||
366 | /** | 495 | /** |
367 | - * Implementation of IP address criterion. | 496 | + * Implementation of VLAN ID criterion. |
368 | */ | 497 | */ |
369 | - public static final class IPCriterion implements Criterion { | 498 | + public static final class VlanIdCriterion implements Criterion { |
370 | - | 499 | + private final VlanId vlanId; |
371 | - private final IpPrefix ip; | ||
372 | - private final Type type; | ||
373 | 500 | ||
374 | - public IPCriterion(IpPrefix ip, Type type) { | 501 | + /** |
375 | - this.ip = ip; | 502 | + * Constructor. |
376 | - this.type = type; | 503 | + * |
504 | + * @param vlanId the VLAN ID to match | ||
505 | + */ | ||
506 | + public VlanIdCriterion(VlanId vlanId) { | ||
507 | + this.vlanId = vlanId; | ||
377 | } | 508 | } |
378 | 509 | ||
379 | @Override | 510 | @Override |
380 | public Type type() { | 511 | public Type type() { |
381 | - return this.type; | 512 | + return Type.VLAN_VID; |
382 | } | 513 | } |
383 | 514 | ||
384 | - public IpPrefix ip() { | 515 | + /** |
385 | - return this.ip; | 516 | + * Gets the VLAN ID to match. |
517 | + * | ||
518 | + * @return the VLAN ID to match | ||
519 | + */ | ||
520 | + public VlanId vlanId() { | ||
521 | + return vlanId; | ||
386 | } | 522 | } |
387 | 523 | ||
388 | @Override | 524 | @Override |
389 | public String toString() { | 525 | public String toString() { |
390 | return toStringHelper(type().toString()) | 526 | return toStringHelper(type().toString()) |
391 | - .add("ip", ip).toString(); | 527 | + .add("vlanId", vlanId).toString(); |
392 | } | 528 | } |
393 | 529 | ||
394 | @Override | 530 | @Override |
395 | public int hashCode() { | 531 | public int hashCode() { |
396 | - return Objects.hash(type, ip); | 532 | + return Objects.hash(type(), vlanId); |
397 | } | 533 | } |
398 | 534 | ||
399 | @Override | 535 | @Override |
... | @@ -401,25 +537,80 @@ public final class Criteria { | ... | @@ -401,25 +537,80 @@ public final class Criteria { |
401 | if (this == obj) { | 537 | if (this == obj) { |
402 | return true; | 538 | return true; |
403 | } | 539 | } |
404 | - if (obj instanceof IPCriterion) { | 540 | + if (obj instanceof VlanIdCriterion) { |
405 | - IPCriterion that = (IPCriterion) obj; | 541 | + VlanIdCriterion that = (VlanIdCriterion) obj; |
406 | - return Objects.equals(ip, that.ip) && | 542 | + return Objects.equals(vlanId, that.vlanId) && |
407 | - Objects.equals(type, that.type); | 543 | + Objects.equals(this.type(), that.type()); |
544 | + } | ||
545 | + return false; | ||
546 | + } | ||
547 | + } | ||
548 | + | ||
549 | + /** | ||
550 | + * Implementation of VLAN priority criterion. | ||
551 | + */ | ||
552 | + public static final class VlanPcpCriterion implements Criterion { | ||
553 | + private final Byte vlanPcp; | ||
408 | 554 | ||
555 | + /** | ||
556 | + * Constructor. | ||
557 | + * | ||
558 | + * @param vlanPcp the VLAN priority to match | ||
559 | + */ | ||
560 | + public VlanPcpCriterion(Byte vlanPcp) { | ||
561 | + this.vlanPcp = vlanPcp; | ||
562 | + } | ||
563 | + | ||
564 | + @Override | ||
565 | + public Type type() { | ||
566 | + return Type.VLAN_PCP; | ||
567 | + } | ||
409 | 568 | ||
569 | + /** | ||
570 | + * Gets the VLAN priority to match. | ||
571 | + * | ||
572 | + * @return the VLAN priority to match | ||
573 | + */ | ||
574 | + public Byte priority() { | ||
575 | + return vlanPcp; | ||
576 | + } | ||
577 | + | ||
578 | + @Override | ||
579 | + public String toString() { | ||
580 | + return toStringHelper(type().toString()) | ||
581 | + .add("priority", Long.toHexString(vlanPcp)).toString(); | ||
582 | + } | ||
583 | + | ||
584 | + @Override | ||
585 | + public int hashCode() { | ||
586 | + return Objects.hash(type(), vlanPcp); | ||
587 | + } | ||
588 | + | ||
589 | + @Override | ||
590 | + public boolean equals(Object obj) { | ||
591 | + if (this == obj) { | ||
592 | + return true; | ||
593 | + } | ||
594 | + if (obj instanceof VlanPcpCriterion) { | ||
595 | + VlanPcpCriterion that = (VlanPcpCriterion) obj; | ||
596 | + return Objects.equals(vlanPcp, that.vlanPcp) && | ||
597 | + Objects.equals(this.type(), that.type()); | ||
410 | } | 598 | } |
411 | return false; | 599 | return false; |
412 | } | 600 | } |
413 | - | ||
414 | } | 601 | } |
415 | 602 | ||
416 | /** | 603 | /** |
417 | * Implementation of Internet Protocol Number criterion. | 604 | * Implementation of Internet Protocol Number criterion. |
418 | */ | 605 | */ |
419 | public static final class IPProtocolCriterion implements Criterion { | 606 | public static final class IPProtocolCriterion implements Criterion { |
420 | - | ||
421 | private final Byte proto; | 607 | private final Byte proto; |
422 | 608 | ||
609 | + /** | ||
610 | + * Constructor. | ||
611 | + * | ||
612 | + * @param protocol the IP protocol to match (e.g., TCP=6, UDP=17). | ||
613 | + */ | ||
423 | public IPProtocolCriterion(Byte protocol) { | 614 | public IPProtocolCriterion(Byte protocol) { |
424 | this.proto = protocol; | 615 | this.proto = protocol; |
425 | } | 616 | } |
... | @@ -429,6 +620,11 @@ public final class Criteria { | ... | @@ -429,6 +620,11 @@ public final class Criteria { |
429 | return Type.IP_PROTO; | 620 | return Type.IP_PROTO; |
430 | } | 621 | } |
431 | 622 | ||
623 | + /** | ||
624 | + * Gets the IP protocol to match. | ||
625 | + * | ||
626 | + * @return the IP protocol to match | ||
627 | + */ | ||
432 | public Byte protocol() { | 628 | public Byte protocol() { |
433 | return proto; | 629 | return proto; |
434 | } | 630 | } |
... | @@ -453,43 +649,111 @@ public final class Criteria { | ... | @@ -453,43 +649,111 @@ public final class Criteria { |
453 | if (obj instanceof IPProtocolCriterion) { | 649 | if (obj instanceof IPProtocolCriterion) { |
454 | IPProtocolCriterion that = (IPProtocolCriterion) obj; | 650 | IPProtocolCriterion that = (IPProtocolCriterion) obj; |
455 | return Objects.equals(proto, that.proto); | 651 | return Objects.equals(proto, that.proto); |
652 | + } | ||
653 | + return false; | ||
654 | + } | ||
655 | + } | ||
456 | 656 | ||
657 | + /** | ||
658 | + * Implementation of IP address criterion. | ||
659 | + */ | ||
660 | + public static final class IPCriterion implements Criterion { | ||
661 | + private final IpPrefix ip; | ||
662 | + private final Type type; | ||
663 | + | ||
664 | + /** | ||
665 | + * Constructor. | ||
666 | + * | ||
667 | + * @param ip the IP prefix to match. Could be either IPv4 or IPv6 | ||
668 | + * @param type the match type. Should be one of the following: | ||
669 | + * Type.IPV4_SRC, Type.IPV4_DST, Type.IPV6_SRC, Type.IPV6_DST | ||
670 | + */ | ||
671 | + public IPCriterion(IpPrefix ip, Type type) { | ||
672 | + this.ip = ip; | ||
673 | + this.type = type; | ||
674 | + } | ||
675 | + | ||
676 | + @Override | ||
677 | + public Type type() { | ||
678 | + return this.type; | ||
679 | + } | ||
680 | + | ||
681 | + /** | ||
682 | + * Gets the IP prefix to match. | ||
683 | + * | ||
684 | + * @return the IP prefix to match | ||
685 | + */ | ||
686 | + public IpPrefix ip() { | ||
687 | + return this.ip; | ||
688 | + } | ||
689 | + | ||
690 | + @Override | ||
691 | + public String toString() { | ||
692 | + return toStringHelper(type().toString()) | ||
693 | + .add("ip", ip).toString(); | ||
694 | + } | ||
695 | + | ||
696 | + @Override | ||
697 | + public int hashCode() { | ||
698 | + return Objects.hash(type, ip); | ||
699 | + } | ||
457 | 700 | ||
701 | + @Override | ||
702 | + public boolean equals(Object obj) { | ||
703 | + if (this == obj) { | ||
704 | + return true; | ||
705 | + } | ||
706 | + if (obj instanceof IPCriterion) { | ||
707 | + IPCriterion that = (IPCriterion) obj; | ||
708 | + return Objects.equals(ip, that.ip) && | ||
709 | + Objects.equals(type, that.type); | ||
458 | } | 710 | } |
459 | return false; | 711 | return false; |
460 | } | 712 | } |
461 | - | ||
462 | } | 713 | } |
463 | 714 | ||
464 | /** | 715 | /** |
465 | - * Implementation of VLAN priority criterion. | 716 | + * Implementation of TCP port criterion. |
466 | */ | 717 | */ |
467 | - public static final class VlanPcpCriterion implements Criterion { | 718 | + public static final class TcpPortCriterion implements Criterion { |
468 | - | 719 | + private final Short tcpPort; |
469 | - private final Byte vlanPcp; | 720 | + private final Type type; |
470 | 721 | ||
471 | - public VlanPcpCriterion(Byte vlanPcp) { | 722 | + /** |
472 | - this.vlanPcp = vlanPcp; | 723 | + * Constructor. |
724 | + * | ||
725 | + * @param tcpPort the TCP port to match | ||
726 | + * @param type the match type. Should be either Type.TCP_SRC or | ||
727 | + * Type.TCP_DST | ||
728 | + */ | ||
729 | + public TcpPortCriterion(Short tcpPort, Type type) { | ||
730 | + this.tcpPort = tcpPort; | ||
731 | + this.type = type; | ||
473 | } | 732 | } |
474 | 733 | ||
475 | @Override | 734 | @Override |
476 | public Type type() { | 735 | public Type type() { |
477 | - return Type.VLAN_PCP; | 736 | + return this.type; |
478 | } | 737 | } |
479 | 738 | ||
480 | - public Byte priority() { | 739 | + /** |
481 | - return vlanPcp; | 740 | + * Gets the TCP port to match. |
741 | + * | ||
742 | + * @return the TCP port to match | ||
743 | + */ | ||
744 | + public Short tcpPort() { | ||
745 | + return this.tcpPort; | ||
482 | } | 746 | } |
483 | 747 | ||
484 | @Override | 748 | @Override |
485 | public String toString() { | 749 | public String toString() { |
486 | return toStringHelper(type().toString()) | 750 | return toStringHelper(type().toString()) |
487 | - .add("pcp", Long.toHexString(vlanPcp)).toString(); | 751 | + .add("tcpPort", tcpPort & 0xffff).toString(); |
488 | } | 752 | } |
489 | 753 | ||
490 | @Override | 754 | @Override |
491 | public int hashCode() { | 755 | public int hashCode() { |
492 | - return Objects.hash(type(), vlanPcp); | 756 | + return Objects.hash(type, tcpPort); |
493 | } | 757 | } |
494 | 758 | ||
495 | @Override | 759 | @Override |
... | @@ -497,48 +761,169 @@ public final class Criteria { | ... | @@ -497,48 +761,169 @@ public final class Criteria { |
497 | if (this == obj) { | 761 | if (this == obj) { |
498 | return true; | 762 | return true; |
499 | } | 763 | } |
500 | - if (obj instanceof VlanPcpCriterion) { | 764 | + if (obj instanceof TcpPortCriterion) { |
501 | - VlanPcpCriterion that = (VlanPcpCriterion) obj; | 765 | + TcpPortCriterion that = (TcpPortCriterion) obj; |
502 | - return Objects.equals(vlanPcp, that.vlanPcp) && | 766 | + return Objects.equals(tcpPort, that.tcpPort) && |
503 | - Objects.equals(this.type(), that.type()); | 767 | + Objects.equals(type, that.type); |
768 | + } | ||
769 | + return false; | ||
770 | + } | ||
771 | + } | ||
772 | + | ||
773 | + /** | ||
774 | + * Implementation of UDP port criterion. | ||
775 | + */ | ||
776 | + public static final class UdpPortCriterion implements Criterion { | ||
777 | + private final Short udpPort; | ||
778 | + private final Type type; | ||
504 | 779 | ||
780 | + /** | ||
781 | + * Constructor. | ||
782 | + * | ||
783 | + * @param udpPort the UDP port to match | ||
784 | + * @param type the match type. Should be either Type.UDP_SRC or | ||
785 | + * Type.UDP_DST | ||
786 | + */ | ||
787 | + public UdpPortCriterion(Short udpPort, Type type) { | ||
788 | + this.udpPort = udpPort; | ||
789 | + this.type = type; | ||
790 | + } | ||
791 | + | ||
792 | + @Override | ||
793 | + public Type type() { | ||
794 | + return this.type; | ||
795 | + } | ||
505 | 796 | ||
797 | + /** | ||
798 | + * Gets the UDP port to match. | ||
799 | + * | ||
800 | + * @return the UDP port to match | ||
801 | + */ | ||
802 | + public Short udpPort() { | ||
803 | + return this.udpPort; | ||
804 | + } | ||
805 | + | ||
806 | + @Override | ||
807 | + public String toString() { | ||
808 | + return toStringHelper(type().toString()) | ||
809 | + .add("udpPort", udpPort & 0xffff).toString(); | ||
810 | + } | ||
811 | + | ||
812 | + @Override | ||
813 | + public int hashCode() { | ||
814 | + return Objects.hash(type, udpPort); | ||
815 | + } | ||
816 | + | ||
817 | + @Override | ||
818 | + public boolean equals(Object obj) { | ||
819 | + if (this == obj) { | ||
820 | + return true; | ||
821 | + } | ||
822 | + if (obj instanceof UdpPortCriterion) { | ||
823 | + UdpPortCriterion that = (UdpPortCriterion) obj; | ||
824 | + return Objects.equals(udpPort, that.udpPort) && | ||
825 | + Objects.equals(type, that.type); | ||
506 | } | 826 | } |
507 | return false; | 827 | return false; |
508 | } | 828 | } |
509 | - | ||
510 | } | 829 | } |
511 | 830 | ||
512 | /** | 831 | /** |
513 | - * Implementation of VLAN ID criterion. | 832 | + * Implementation of SCTP port criterion. |
514 | */ | 833 | */ |
515 | - public static final class VlanIdCriterion implements Criterion { | 834 | + public static final class SctpPortCriterion implements Criterion { |
835 | + private final Short sctpPort; | ||
836 | + private final Type type; | ||
516 | 837 | ||
838 | + /** | ||
839 | + * Constructor. | ||
840 | + * | ||
841 | + * @param sctpPort the SCTP port to match | ||
842 | + * @param type the match type. Should be either Type.SCTP_SRC or | ||
843 | + * Type.SCTP_DST | ||
844 | + */ | ||
845 | + public SctpPortCriterion(Short sctpPort, Type type) { | ||
846 | + this.sctpPort = sctpPort; | ||
847 | + this.type = type; | ||
848 | + } | ||
517 | 849 | ||
518 | - private final VlanId vlanId; | 850 | + @Override |
851 | + public Type type() { | ||
852 | + return this.type; | ||
853 | + } | ||
519 | 854 | ||
520 | - public VlanIdCriterion(VlanId vlanId) { | 855 | + /** |
521 | - this.vlanId = vlanId; | 856 | + * Gets the SCTP port to match. |
857 | + * | ||
858 | + * @return the SCTP port to match | ||
859 | + */ | ||
860 | + public Short sctpPort() { | ||
861 | + return this.sctpPort; | ||
862 | + } | ||
863 | + | ||
864 | + @Override | ||
865 | + public String toString() { | ||
866 | + return toStringHelper(type().toString()) | ||
867 | + .add("sctpPort", sctpPort & 0xffff).toString(); | ||
868 | + } | ||
869 | + | ||
870 | + @Override | ||
871 | + public int hashCode() { | ||
872 | + return Objects.hash(type, sctpPort); | ||
873 | + } | ||
874 | + | ||
875 | + @Override | ||
876 | + public boolean equals(Object obj) { | ||
877 | + if (this == obj) { | ||
878 | + return true; | ||
879 | + } | ||
880 | + if (obj instanceof SctpPortCriterion) { | ||
881 | + SctpPortCriterion that = (SctpPortCriterion) obj; | ||
882 | + return Objects.equals(sctpPort, that.sctpPort) && | ||
883 | + Objects.equals(type, that.type); | ||
884 | + } | ||
885 | + return false; | ||
886 | + } | ||
887 | + } | ||
888 | + | ||
889 | + /** | ||
890 | + * Implementation of ICMP type criterion. | ||
891 | + */ | ||
892 | + public static final class IcmpTypeCriterion implements Criterion { | ||
893 | + private final Byte icmpType; | ||
894 | + | ||
895 | + /** | ||
896 | + * Constructor. | ||
897 | + * | ||
898 | + * @param icmpType the ICMP type to match | ||
899 | + */ | ||
900 | + public IcmpTypeCriterion(Byte icmpType) { | ||
901 | + this.icmpType = icmpType; | ||
522 | } | 902 | } |
523 | 903 | ||
524 | @Override | 904 | @Override |
525 | public Type type() { | 905 | public Type type() { |
526 | - return Type.VLAN_VID; | 906 | + return Type.ICMPV4_TYPE; |
527 | } | 907 | } |
528 | 908 | ||
529 | - public VlanId vlanId() { | 909 | + /** |
530 | - return vlanId; | 910 | + * Gets the ICMP type to match. |
911 | + * | ||
912 | + * @return the ICMP type to match | ||
913 | + */ | ||
914 | + public Byte icmpType() { | ||
915 | + return icmpType; | ||
531 | } | 916 | } |
532 | 917 | ||
533 | @Override | 918 | @Override |
534 | public String toString() { | 919 | public String toString() { |
535 | return toStringHelper(type().toString()) | 920 | return toStringHelper(type().toString()) |
536 | - .add("id", vlanId).toString(); | 921 | + .add("icmpType", icmpType & 0xff).toString(); |
537 | } | 922 | } |
538 | 923 | ||
539 | @Override | 924 | @Override |
540 | public int hashCode() { | 925 | public int hashCode() { |
541 | - return Objects.hash(type(), vlanId); | 926 | + return Objects.hash(type(), icmpType); |
542 | } | 927 | } |
543 | 928 | ||
544 | @Override | 929 | @Override |
... | @@ -546,49 +931,53 @@ public final class Criteria { | ... | @@ -546,49 +931,53 @@ public final class Criteria { |
546 | if (this == obj) { | 931 | if (this == obj) { |
547 | return true; | 932 | return true; |
548 | } | 933 | } |
549 | - if (obj instanceof VlanIdCriterion) { | 934 | + if (obj instanceof IcmpTypeCriterion) { |
550 | - VlanIdCriterion that = (VlanIdCriterion) obj; | 935 | + IcmpTypeCriterion that = (IcmpTypeCriterion) obj; |
551 | - return Objects.equals(vlanId, that.vlanId) && | 936 | + return Objects.equals(icmpType, that.icmpType) && |
552 | Objects.equals(this.type(), that.type()); | 937 | Objects.equals(this.type(), that.type()); |
553 | - | ||
554 | - | ||
555 | } | 938 | } |
556 | return false; | 939 | return false; |
557 | } | 940 | } |
558 | - | ||
559 | } | 941 | } |
560 | 942 | ||
561 | /** | 943 | /** |
562 | - * Implementation of TCP port criterion. | 944 | + * Implementation of ICMP code criterion. |
563 | */ | 945 | */ |
564 | - public static final class TcpPortCriterion implements Criterion { | 946 | + public static final class IcmpCodeCriterion implements Criterion { |
947 | + private final Byte icmpCode; | ||
565 | 948 | ||
566 | - private final Short tcpPort; | 949 | + /** |
567 | - private final Type type; | 950 | + * Constructor. |
568 | - | 951 | + * |
569 | - public TcpPortCriterion(Short tcpPort, Type type) { | 952 | + * @param icmpCode the ICMP code to match |
570 | - this.tcpPort = tcpPort; | 953 | + */ |
571 | - this.type = type; | 954 | + public IcmpCodeCriterion(Byte icmpCode) { |
955 | + this.icmpCode = icmpCode; | ||
572 | } | 956 | } |
573 | 957 | ||
574 | @Override | 958 | @Override |
575 | public Type type() { | 959 | public Type type() { |
576 | - return this.type; | 960 | + return Type.ICMPV4_CODE; |
577 | } | 961 | } |
578 | 962 | ||
579 | - public Short tcpPort() { | 963 | + /** |
580 | - return this.tcpPort; | 964 | + * Gets the ICMP code to match. |
965 | + * | ||
966 | + * @return the ICMP code to match | ||
967 | + */ | ||
968 | + public Byte icmpCode() { | ||
969 | + return icmpCode; | ||
581 | } | 970 | } |
582 | 971 | ||
583 | @Override | 972 | @Override |
584 | public String toString() { | 973 | public String toString() { |
585 | return toStringHelper(type().toString()) | 974 | return toStringHelper(type().toString()) |
586 | - .add("tcpPort", tcpPort & 0xffff).toString(); | 975 | + .add("icmpCode", icmpCode & 0xff).toString(); |
587 | } | 976 | } |
588 | 977 | ||
589 | @Override | 978 | @Override |
590 | public int hashCode() { | 979 | public int hashCode() { |
591 | - return Objects.hash(type, tcpPort); | 980 | + return Objects.hash(type(), icmpCode); |
592 | } | 981 | } |
593 | 982 | ||
594 | @Override | 983 | @Override |
... | @@ -596,12 +985,65 @@ public final class Criteria { | ... | @@ -596,12 +985,65 @@ public final class Criteria { |
596 | if (this == obj) { | 985 | if (this == obj) { |
597 | return true; | 986 | return true; |
598 | } | 987 | } |
599 | - if (obj instanceof TcpPortCriterion) { | 988 | + if (obj instanceof IcmpCodeCriterion) { |
600 | - TcpPortCriterion that = (TcpPortCriterion) obj; | 989 | + IcmpCodeCriterion that = (IcmpCodeCriterion) obj; |
601 | - return Objects.equals(tcpPort, that.tcpPort) && | 990 | + return Objects.equals(icmpCode, that.icmpCode) && |
602 | - Objects.equals(type, that.type); | 991 | + Objects.equals(this.type(), that.type()); |
992 | + } | ||
993 | + return false; | ||
994 | + } | ||
995 | + } | ||
996 | + | ||
997 | + /** | ||
998 | + * Implementation of IPv6 Flow Label criterion (RFC 6437). | ||
999 | + */ | ||
1000 | + public static final class IPv6FlowLabelCriterion implements Criterion { | ||
1001 | + private static final int FLOW_LABEL_MASK = 0xfffff; | ||
1002 | + private final Integer flowLabel; // IPv6 flow label: 20 bits | ||
1003 | + | ||
1004 | + /** | ||
1005 | + * Constructor. | ||
1006 | + * | ||
1007 | + * @param flowLabel the IPv6 flow label to match | ||
1008 | + */ | ||
1009 | + public IPv6FlowLabelCriterion(Integer flowLabel) { | ||
1010 | + this.flowLabel = flowLabel & FLOW_LABEL_MASK; | ||
1011 | + } | ||
1012 | + | ||
1013 | + @Override | ||
1014 | + public Type type() { | ||
1015 | + return Type.IPV6_FLABEL; | ||
1016 | + } | ||
603 | 1017 | ||
1018 | + /** | ||
1019 | + * Gets the IPv6 flow label to match. | ||
1020 | + * | ||
1021 | + * @return the IPv6 flow label to match | ||
1022 | + */ | ||
1023 | + public Integer flowLabel() { | ||
1024 | + return flowLabel; | ||
1025 | + } | ||
1026 | + | ||
1027 | + @Override | ||
1028 | + public String toString() { | ||
1029 | + return toStringHelper(type().toString()) | ||
1030 | + .add("flowLabel", flowLabel).toString(); | ||
1031 | + } | ||
1032 | + | ||
1033 | + @Override | ||
1034 | + public int hashCode() { | ||
1035 | + return Objects.hash(type(), flowLabel); | ||
1036 | + } | ||
604 | 1037 | ||
1038 | + @Override | ||
1039 | + public boolean equals(Object obj) { | ||
1040 | + if (this == obj) { | ||
1041 | + return true; | ||
1042 | + } | ||
1043 | + if (obj instanceof IPv6FlowLabelCriterion) { | ||
1044 | + IPv6FlowLabelCriterion that = (IPv6FlowLabelCriterion) obj; | ||
1045 | + return Objects.equals(flowLabel, that.flowLabel) && | ||
1046 | + Objects.equals(this.type(), that.type()); | ||
605 | } | 1047 | } |
606 | return false; | 1048 | return false; |
607 | } | 1049 | } |
... | @@ -611,9 +1053,13 @@ public final class Criteria { | ... | @@ -611,9 +1053,13 @@ public final class Criteria { |
611 | * Implementation of ICMPv6 type criterion. | 1053 | * Implementation of ICMPv6 type criterion. |
612 | */ | 1054 | */ |
613 | public static final class Icmpv6TypeCriterion implements Criterion { | 1055 | public static final class Icmpv6TypeCriterion implements Criterion { |
614 | - | ||
615 | private final Byte icmpv6Type; | 1056 | private final Byte icmpv6Type; |
616 | 1057 | ||
1058 | + /** | ||
1059 | + * Constructor. | ||
1060 | + * | ||
1061 | + * @param icmpv6Type the ICMPv6 type to match | ||
1062 | + */ | ||
617 | public Icmpv6TypeCriterion(Byte icmpv6Type) { | 1063 | public Icmpv6TypeCriterion(Byte icmpv6Type) { |
618 | this.icmpv6Type = icmpv6Type; | 1064 | this.icmpv6Type = icmpv6Type; |
619 | } | 1065 | } |
... | @@ -623,6 +1069,11 @@ public final class Criteria { | ... | @@ -623,6 +1069,11 @@ public final class Criteria { |
623 | return Type.ICMPV6_TYPE; | 1069 | return Type.ICMPV6_TYPE; |
624 | } | 1070 | } |
625 | 1071 | ||
1072 | + /** | ||
1073 | + * Gets the ICMPv6 type to match. | ||
1074 | + * | ||
1075 | + * @return the ICMPv6 type to match | ||
1076 | + */ | ||
626 | public Byte icmpv6Type() { | 1077 | public Byte icmpv6Type() { |
627 | return icmpv6Type; | 1078 | return icmpv6Type; |
628 | } | 1079 | } |
... | @@ -635,7 +1086,7 @@ public final class Criteria { | ... | @@ -635,7 +1086,7 @@ public final class Criteria { |
635 | 1086 | ||
636 | @Override | 1087 | @Override |
637 | public int hashCode() { | 1088 | public int hashCode() { |
638 | - return Objects.hash(icmpv6Type, type()); | 1089 | + return Objects.hash(type(), icmpv6Type); |
639 | } | 1090 | } |
640 | 1091 | ||
641 | @Override | 1092 | @Override |
... | @@ -656,9 +1107,13 @@ public final class Criteria { | ... | @@ -656,9 +1107,13 @@ public final class Criteria { |
656 | * Implementation of ICMPv6 code criterion. | 1107 | * Implementation of ICMPv6 code criterion. |
657 | */ | 1108 | */ |
658 | public static final class Icmpv6CodeCriterion implements Criterion { | 1109 | public static final class Icmpv6CodeCriterion implements Criterion { |
659 | - | ||
660 | private final Byte icmpv6Code; | 1110 | private final Byte icmpv6Code; |
661 | 1111 | ||
1112 | + /** | ||
1113 | + * Constructor. | ||
1114 | + * | ||
1115 | + * @param icmpv6Code the ICMPv6 code to match | ||
1116 | + */ | ||
662 | public Icmpv6CodeCriterion(Byte icmpv6Code) { | 1117 | public Icmpv6CodeCriterion(Byte icmpv6Code) { |
663 | this.icmpv6Code = icmpv6Code; | 1118 | this.icmpv6Code = icmpv6Code; |
664 | } | 1119 | } |
... | @@ -668,6 +1123,11 @@ public final class Criteria { | ... | @@ -668,6 +1123,11 @@ public final class Criteria { |
668 | return Type.ICMPV6_CODE; | 1123 | return Type.ICMPV6_CODE; |
669 | } | 1124 | } |
670 | 1125 | ||
1126 | + /** | ||
1127 | + * Gets the ICMPv6 code to match. | ||
1128 | + * | ||
1129 | + * @return the ICMPv6 code to match | ||
1130 | + */ | ||
671 | public Byte icmpv6Code() { | 1131 | public Byte icmpv6Code() { |
672 | return icmpv6Code; | 1132 | return icmpv6Code; |
673 | } | 1133 | } |
... | @@ -680,7 +1140,7 @@ public final class Criteria { | ... | @@ -680,7 +1140,7 @@ public final class Criteria { |
680 | 1140 | ||
681 | @Override | 1141 | @Override |
682 | public int hashCode() { | 1142 | public int hashCode() { |
683 | - return Objects.hash(icmpv6Code, type()); | 1143 | + return Objects.hash(type(), icmpv6Code); |
684 | } | 1144 | } |
685 | 1145 | ||
686 | @Override | 1146 | @Override |
... | @@ -698,12 +1158,132 @@ public final class Criteria { | ... | @@ -698,12 +1158,132 @@ public final class Criteria { |
698 | } | 1158 | } |
699 | 1159 | ||
700 | /** | 1160 | /** |
1161 | + * Implementation of IPv6 Neighbor Discovery target address criterion. | ||
1162 | + */ | ||
1163 | + public static final class IPv6NDTargetAddressCriterion | ||
1164 | + implements Criterion { | ||
1165 | + private final Ip6Address targetAddress; | ||
1166 | + | ||
1167 | + /** | ||
1168 | + * Constructor. | ||
1169 | + * | ||
1170 | + * @param targetAddress the IPv6 target address to match | ||
1171 | + */ | ||
1172 | + public IPv6NDTargetAddressCriterion(Ip6Address targetAddress) { | ||
1173 | + this.targetAddress = targetAddress; | ||
1174 | + } | ||
1175 | + | ||
1176 | + @Override | ||
1177 | + public Type type() { | ||
1178 | + return Type.IPV6_ND_TARGET; | ||
1179 | + } | ||
1180 | + | ||
1181 | + /** | ||
1182 | + * Gets the IPv6 target address to match. | ||
1183 | + * | ||
1184 | + * @return the IPv6 target address to match | ||
1185 | + */ | ||
1186 | + public Ip6Address targetAddress() { | ||
1187 | + return this.targetAddress; | ||
1188 | + } | ||
1189 | + | ||
1190 | + @Override | ||
1191 | + public String toString() { | ||
1192 | + return toStringHelper(type().toString()) | ||
1193 | + .add("targetAddress", targetAddress).toString(); | ||
1194 | + } | ||
1195 | + | ||
1196 | + @Override | ||
1197 | + public int hashCode() { | ||
1198 | + return Objects.hash(type(), targetAddress); | ||
1199 | + } | ||
1200 | + | ||
1201 | + @Override | ||
1202 | + public boolean equals(Object obj) { | ||
1203 | + if (this == obj) { | ||
1204 | + return true; | ||
1205 | + } | ||
1206 | + if (obj instanceof IPv6NDTargetAddressCriterion) { | ||
1207 | + IPv6NDTargetAddressCriterion that = | ||
1208 | + (IPv6NDTargetAddressCriterion) obj; | ||
1209 | + return Objects.equals(targetAddress, that.targetAddress) && | ||
1210 | + Objects.equals(type(), that.type()); | ||
1211 | + } | ||
1212 | + return false; | ||
1213 | + } | ||
1214 | + } | ||
1215 | + | ||
1216 | + /** | ||
1217 | + * Implementation of IPv6 Neighbor Discovery link-layer address criterion. | ||
1218 | + */ | ||
1219 | + public static final class IPv6NDLinkLayerAddressCriterion | ||
1220 | + implements Criterion { | ||
1221 | + private final MacAddress mac; | ||
1222 | + private final Type type; | ||
1223 | + | ||
1224 | + /** | ||
1225 | + * Constructor. | ||
1226 | + * | ||
1227 | + * @param mac the source or destination link-layer address to match | ||
1228 | + * @param type the match type. Should be either Type.IPV6_ND_SLL or | ||
1229 | + * Type.IPV6_ND_TLL | ||
1230 | + */ | ||
1231 | + public IPv6NDLinkLayerAddressCriterion(MacAddress mac, Type type) { | ||
1232 | + this.mac = mac; | ||
1233 | + this.type = type; | ||
1234 | + } | ||
1235 | + | ||
1236 | + @Override | ||
1237 | + public Type type() { | ||
1238 | + return this.type; | ||
1239 | + } | ||
1240 | + | ||
1241 | + /** | ||
1242 | + * Gets the MAC link-layer address to match. | ||
1243 | + * | ||
1244 | + * @return the MAC link-layer address to match | ||
1245 | + */ | ||
1246 | + public MacAddress mac() { | ||
1247 | + return this.mac; | ||
1248 | + } | ||
1249 | + | ||
1250 | + @Override | ||
1251 | + public String toString() { | ||
1252 | + return toStringHelper(type().toString()) | ||
1253 | + .add("mac", mac).toString(); | ||
1254 | + } | ||
1255 | + | ||
1256 | + @Override | ||
1257 | + public int hashCode() { | ||
1258 | + return Objects.hash(type, mac); | ||
1259 | + } | ||
1260 | + | ||
1261 | + @Override | ||
1262 | + public boolean equals(Object obj) { | ||
1263 | + if (this == obj) { | ||
1264 | + return true; | ||
1265 | + } | ||
1266 | + if (obj instanceof IPv6NDLinkLayerAddressCriterion) { | ||
1267 | + IPv6NDLinkLayerAddressCriterion that = | ||
1268 | + (IPv6NDLinkLayerAddressCriterion) obj; | ||
1269 | + return Objects.equals(mac, that.mac) && | ||
1270 | + Objects.equals(type, that.type); | ||
1271 | + } | ||
1272 | + return false; | ||
1273 | + } | ||
1274 | + } | ||
1275 | + | ||
1276 | + /** | ||
701 | * Implementation of MPLS tag criterion. | 1277 | * Implementation of MPLS tag criterion. |
702 | */ | 1278 | */ |
703 | public static final class MplsCriterion implements Criterion { | 1279 | public static final class MplsCriterion implements Criterion { |
704 | - | ||
705 | private final Integer mplsLabel; | 1280 | private final Integer mplsLabel; |
706 | 1281 | ||
1282 | + /** | ||
1283 | + * Constructor. | ||
1284 | + * | ||
1285 | + * @param mplsLabel the MPLS label to match | ||
1286 | + */ | ||
707 | public MplsCriterion(Integer mplsLabel) { | 1287 | public MplsCriterion(Integer mplsLabel) { |
708 | this.mplsLabel = mplsLabel; | 1288 | this.mplsLabel = mplsLabel; |
709 | } | 1289 | } |
... | @@ -713,6 +1293,11 @@ public final class Criteria { | ... | @@ -713,6 +1293,11 @@ public final class Criteria { |
713 | return Type.MPLS_LABEL; | 1293 | return Type.MPLS_LABEL; |
714 | } | 1294 | } |
715 | 1295 | ||
1296 | + /** | ||
1297 | + * Gets the MPLS label to match. | ||
1298 | + * | ||
1299 | + * @return the MPLS label to match | ||
1300 | + */ | ||
716 | public Integer label() { | 1301 | public Integer label() { |
717 | return mplsLabel; | 1302 | return mplsLabel; |
718 | } | 1303 | } |
... | @@ -720,12 +1305,12 @@ public final class Criteria { | ... | @@ -720,12 +1305,12 @@ public final class Criteria { |
720 | @Override | 1305 | @Override |
721 | public String toString() { | 1306 | public String toString() { |
722 | return toStringHelper(type().toString()) | 1307 | return toStringHelper(type().toString()) |
723 | - .add("mpls", mplsLabel & 0xffffffffL).toString(); | 1308 | + .add("label", mplsLabel & 0xffffffffL).toString(); |
724 | } | 1309 | } |
725 | 1310 | ||
726 | @Override | 1311 | @Override |
727 | public int hashCode() { | 1312 | public int hashCode() { |
728 | - return Objects.hash(mplsLabel, type()); | 1313 | + return Objects.hash(type(), mplsLabel); |
729 | } | 1314 | } |
730 | 1315 | ||
731 | @Override | 1316 | @Override |
... | @@ -737,8 +1322,6 @@ public final class Criteria { | ... | @@ -737,8 +1322,6 @@ public final class Criteria { |
737 | MplsCriterion that = (MplsCriterion) obj; | 1322 | MplsCriterion that = (MplsCriterion) obj; |
738 | return Objects.equals(mplsLabel, that.mplsLabel) && | 1323 | return Objects.equals(mplsLabel, that.mplsLabel) && |
739 | Objects.equals(this.type(), that.type()); | 1324 | Objects.equals(this.type(), that.type()); |
740 | - | ||
741 | - | ||
742 | } | 1325 | } |
743 | return false; | 1326 | return false; |
744 | } | 1327 | } |
... | @@ -749,10 +1332,15 @@ public final class Criteria { | ... | @@ -749,10 +1332,15 @@ public final class Criteria { |
749 | * Implementation of lambda (wavelength) criterion. | 1332 | * Implementation of lambda (wavelength) criterion. |
750 | */ | 1333 | */ |
751 | public static final class LambdaCriterion implements Criterion { | 1334 | public static final class LambdaCriterion implements Criterion { |
752 | - | ||
753 | private final short lambda; | 1335 | private final short lambda; |
754 | private final Type type; | 1336 | private final Type type; |
755 | 1337 | ||
1338 | + /** | ||
1339 | + * Constructor. | ||
1340 | + * | ||
1341 | + * @param lambda the lambda (wavelength) to match | ||
1342 | + * @param type the match type. Should be Type.OCH_SIGID | ||
1343 | + */ | ||
756 | public LambdaCriterion(short lambda, Type type) { | 1344 | public LambdaCriterion(short lambda, Type type) { |
757 | this.lambda = lambda; | 1345 | this.lambda = lambda; |
758 | this.type = type; | 1346 | this.type = type; |
... | @@ -763,6 +1351,11 @@ public final class Criteria { | ... | @@ -763,6 +1351,11 @@ public final class Criteria { |
763 | return this.type; | 1351 | return this.type; |
764 | } | 1352 | } |
765 | 1353 | ||
1354 | + /** | ||
1355 | + * Gets the lambda (wavelength) to match. | ||
1356 | + * | ||
1357 | + * @return the lambda (wavelength) to match. | ||
1358 | + */ | ||
766 | public Short lambda() { | 1359 | public Short lambda() { |
767 | return this.lambda; | 1360 | return this.lambda; |
768 | } | 1361 | } |
... | @@ -796,10 +1389,15 @@ public final class Criteria { | ... | @@ -796,10 +1389,15 @@ public final class Criteria { |
796 | * Implementation of optical signal type criterion. | 1389 | * Implementation of optical signal type criterion. |
797 | */ | 1390 | */ |
798 | public static final class OpticalSignalTypeCriterion implements Criterion { | 1391 | public static final class OpticalSignalTypeCriterion implements Criterion { |
799 | - | ||
800 | private final Short signalType; | 1392 | private final Short signalType; |
801 | private final Type type; | 1393 | private final Type type; |
802 | 1394 | ||
1395 | + /** | ||
1396 | + * Constructor. | ||
1397 | + * | ||
1398 | + * @param signalType the optical signal type to match | ||
1399 | + * @param type the match type. Should be Type.OCH_SIGTYPE | ||
1400 | + */ | ||
803 | public OpticalSignalTypeCriterion(Short signalType, Type type) { | 1401 | public OpticalSignalTypeCriterion(Short signalType, Type type) { |
804 | this.signalType = signalType; | 1402 | this.signalType = signalType; |
805 | this.type = type; | 1403 | this.type = type; |
... | @@ -810,6 +1408,11 @@ public final class Criteria { | ... | @@ -810,6 +1408,11 @@ public final class Criteria { |
810 | return this.type; | 1408 | return this.type; |
811 | } | 1409 | } |
812 | 1410 | ||
1411 | + /** | ||
1412 | + * Gets the optical signal type to match. | ||
1413 | + * | ||
1414 | + * @return the optical signal type to match | ||
1415 | + */ | ||
813 | public Short signalType() { | 1416 | public Short signalType() { |
814 | return this.signalType; | 1417 | return this.signalType; |
815 | } | 1418 | } |
... | @@ -838,5 +1441,4 @@ public final class Criteria { | ... | @@ -838,5 +1441,4 @@ public final class Criteria { |
838 | return false; | 1441 | return false; |
839 | } | 1442 | } |
840 | } | 1443 | } |
841 | - | ||
842 | } | 1444 | } | ... | ... |
... | @@ -24,7 +24,7 @@ public interface Criterion { | ... | @@ -24,7 +24,7 @@ public interface Criterion { |
24 | /** | 24 | /** |
25 | * Types of fields to which the selection criterion may apply. | 25 | * Types of fields to which the selection criterion may apply. |
26 | */ | 26 | */ |
27 | - // From page 42 of OpenFlow 1.3.x spec | 27 | + // From page 75 of OpenFlow 1.5.0 spec |
28 | public enum Type { | 28 | public enum Type { |
29 | /** Switch input port. */ | 29 | /** Switch input port. */ |
30 | IN_PORT, | 30 | IN_PORT, |
... | @@ -106,6 +106,21 @@ public interface Criterion { | ... | @@ -106,6 +106,21 @@ public interface Criterion { |
106 | TUNNEL_ID, | 106 | TUNNEL_ID, |
107 | /** IPv6 Extension Header pseudo-field. */ | 107 | /** IPv6 Extension Header pseudo-field. */ |
108 | IPV6_EXTHDR, | 108 | IPV6_EXTHDR, |
109 | + /** Unassigned value: 40. */ | ||
110 | + UNASSIGNED_40, | ||
111 | + /** PBB UCA header field. */ | ||
112 | + PBB_UCA, | ||
113 | + /** TCP flags. */ | ||
114 | + TCP_FLAGS, | ||
115 | + /** Output port from action set metadata. */ | ||
116 | + ACTSET_OUTPUT, | ||
117 | + /** Packet type value. */ | ||
118 | + PACKET_TYPE, | ||
119 | + | ||
120 | + // | ||
121 | + // NOTE: Everything below is defined elsewhere: ONOS-specific, | ||
122 | + // extensions, etc. | ||
123 | + // | ||
109 | /** Optical channel signal ID (lambda). */ | 124 | /** Optical channel signal ID (lambda). */ |
110 | OCH_SIGID, | 125 | OCH_SIGID, |
111 | /** Optical channel signal type (fixed or flexible). */ | 126 | /** Optical channel signal type (fixed or flexible). */ | ... | ... |
... | @@ -25,6 +25,7 @@ import org.junit.Test; | ... | @@ -25,6 +25,7 @@ import org.junit.Test; |
25 | import org.onosproject.net.PortNumber; | 25 | import org.onosproject.net.PortNumber; |
26 | import org.onosproject.net.flow.criteria.Criteria; | 26 | import org.onosproject.net.flow.criteria.Criteria; |
27 | import org.onosproject.net.flow.criteria.Criterion; | 27 | import org.onosproject.net.flow.criteria.Criterion; |
28 | +import org.onlab.packet.Ip6Address; | ||
28 | import org.onlab.packet.IpPrefix; | 29 | import org.onlab.packet.IpPrefix; |
29 | import org.onlab.packet.MacAddress; | 30 | import org.onlab.packet.MacAddress; |
30 | import org.onlab.packet.VlanId; | 31 | import org.onlab.packet.VlanId; |
... | @@ -126,22 +127,25 @@ public class DefaultTrafficSelectorTest { | ... | @@ -126,22 +127,25 @@ public class DefaultTrafficSelectorTest { |
126 | public void testCriteriaCreation() { | 127 | public void testCriteriaCreation() { |
127 | TrafficSelector selector; | 128 | TrafficSelector selector; |
128 | 129 | ||
130 | + final int intValue = 22; | ||
129 | final short shortValue = 33; | 131 | final short shortValue = 33; |
130 | final byte byteValue = 44; | 132 | final byte byteValue = 44; |
133 | + final MacAddress macValue = MacAddress.valueOf("11:22:33:44:55:66"); | ||
131 | final IpPrefix ipPrefixValue = IpPrefix.valueOf("192.168.1.0/24"); | 134 | final IpPrefix ipPrefixValue = IpPrefix.valueOf("192.168.1.0/24"); |
132 | final IpPrefix ipv6PrefixValue = IpPrefix.valueOf("fe80::1/64"); | 135 | final IpPrefix ipv6PrefixValue = IpPrefix.valueOf("fe80::1/64"); |
136 | + final Ip6Address ipv6AddressValue = Ip6Address.valueOf("fe80::1"); | ||
133 | 137 | ||
134 | selector = DefaultTrafficSelector.builder() | 138 | selector = DefaultTrafficSelector.builder() |
135 | - .matchInport(PortNumber.portNumber(11)).build(); | 139 | + .matchInPort(PortNumber.portNumber(11)).build(); |
136 | assertThat(selector, hasCriterionWithType(Type.IN_PORT)); | 140 | assertThat(selector, hasCriterionWithType(Type.IN_PORT)); |
137 | 141 | ||
138 | selector = DefaultTrafficSelector.builder() | 142 | selector = DefaultTrafficSelector.builder() |
139 | - .matchEthSrc(MacAddress.BROADCAST).build(); | 143 | + .matchEthDst(macValue).build(); |
140 | - assertThat(selector, hasCriterionWithType(Type.ETH_SRC)); | 144 | + assertThat(selector, hasCriterionWithType(Type.ETH_DST)); |
141 | 145 | ||
142 | selector = DefaultTrafficSelector.builder() | 146 | selector = DefaultTrafficSelector.builder() |
143 | - .matchEthDst(MacAddress.BROADCAST).build(); | 147 | + .matchEthSrc(macValue).build(); |
144 | - assertThat(selector, hasCriterionWithType(Type.ETH_DST)); | 148 | + assertThat(selector, hasCriterionWithType(Type.ETH_SRC)); |
145 | 149 | ||
146 | selector = DefaultTrafficSelector.builder() | 150 | selector = DefaultTrafficSelector.builder() |
147 | .matchEthType(shortValue).build(); | 151 | .matchEthType(shortValue).build(); |
... | @@ -176,6 +180,30 @@ public class DefaultTrafficSelectorTest { | ... | @@ -176,6 +180,30 @@ public class DefaultTrafficSelectorTest { |
176 | assertThat(selector, hasCriterionWithType(Type.TCP_DST)); | 180 | assertThat(selector, hasCriterionWithType(Type.TCP_DST)); |
177 | 181 | ||
178 | selector = DefaultTrafficSelector.builder() | 182 | selector = DefaultTrafficSelector.builder() |
183 | + .matchUdpSrc(shortValue).build(); | ||
184 | + assertThat(selector, hasCriterionWithType(Type.UDP_SRC)); | ||
185 | + | ||
186 | + selector = DefaultTrafficSelector.builder() | ||
187 | + .matchUdpDst(shortValue).build(); | ||
188 | + assertThat(selector, hasCriterionWithType(Type.UDP_DST)); | ||
189 | + | ||
190 | + selector = DefaultTrafficSelector.builder() | ||
191 | + .matchSctpSrc(shortValue).build(); | ||
192 | + assertThat(selector, hasCriterionWithType(Type.SCTP_SRC)); | ||
193 | + | ||
194 | + selector = DefaultTrafficSelector.builder() | ||
195 | + .matchSctpDst(shortValue).build(); | ||
196 | + assertThat(selector, hasCriterionWithType(Type.SCTP_DST)); | ||
197 | + | ||
198 | + selector = DefaultTrafficSelector.builder() | ||
199 | + .matchIcmpType(byteValue).build(); | ||
200 | + assertThat(selector, hasCriterionWithType(Type.ICMPV4_TYPE)); | ||
201 | + | ||
202 | + selector = DefaultTrafficSelector.builder() | ||
203 | + .matchIcmpCode(byteValue).build(); | ||
204 | + assertThat(selector, hasCriterionWithType(Type.ICMPV4_CODE)); | ||
205 | + | ||
206 | + selector = DefaultTrafficSelector.builder() | ||
179 | .matchIPv6Src(ipv6PrefixValue).build(); | 207 | .matchIPv6Src(ipv6PrefixValue).build(); |
180 | assertThat(selector, hasCriterionWithType(Type.IPV6_SRC)); | 208 | assertThat(selector, hasCriterionWithType(Type.IPV6_SRC)); |
181 | 209 | ||
... | @@ -184,6 +212,26 @@ public class DefaultTrafficSelectorTest { | ... | @@ -184,6 +212,26 @@ public class DefaultTrafficSelectorTest { |
184 | assertThat(selector, hasCriterionWithType(Type.IPV6_DST)); | 212 | assertThat(selector, hasCriterionWithType(Type.IPV6_DST)); |
185 | 213 | ||
186 | selector = DefaultTrafficSelector.builder() | 214 | selector = DefaultTrafficSelector.builder() |
215 | + .matchIPv6FlowLabel(intValue).build(); | ||
216 | + assertThat(selector, hasCriterionWithType(Type.IPV6_FLABEL)); | ||
217 | + | ||
218 | + selector = DefaultTrafficSelector.builder() | ||
219 | + .matchIcmpv6Type(byteValue).build(); | ||
220 | + assertThat(selector, hasCriterionWithType(Type.ICMPV6_TYPE)); | ||
221 | + | ||
222 | + selector = DefaultTrafficSelector.builder() | ||
223 | + .matchIPv6NDTargetAddress(ipv6AddressValue).build(); | ||
224 | + assertThat(selector, hasCriterionWithType(Type.IPV6_ND_TARGET)); | ||
225 | + | ||
226 | + selector = DefaultTrafficSelector.builder() | ||
227 | + .matchIPv6NDSourceLinkLayerAddress(macValue).build(); | ||
228 | + assertThat(selector, hasCriterionWithType(Type.IPV6_ND_SLL)); | ||
229 | + | ||
230 | + selector = DefaultTrafficSelector.builder() | ||
231 | + .matchIPv6NDTargetLinkLayerAddress(macValue).build(); | ||
232 | + assertThat(selector, hasCriterionWithType(Type.IPV6_ND_TLL)); | ||
233 | + | ||
234 | + selector = DefaultTrafficSelector.builder() | ||
187 | .matchMplsLabel(3).build(); | 235 | .matchMplsLabel(3).build(); |
188 | assertThat(selector, hasCriterionWithType(Type.MPLS_LABEL)); | 236 | assertThat(selector, hasCriterionWithType(Type.MPLS_LABEL)); |
189 | 237 | ||
... | @@ -194,12 +242,21 @@ public class DefaultTrafficSelectorTest { | ... | @@ -194,12 +242,21 @@ public class DefaultTrafficSelectorTest { |
194 | selector = DefaultTrafficSelector.builder() | 242 | selector = DefaultTrafficSelector.builder() |
195 | .matchOpticalSignalType(shortValue).build(); | 243 | .matchOpticalSignalType(shortValue).build(); |
196 | assertThat(selector, hasCriterionWithType(Type.OCH_SIGTYPE)); | 244 | assertThat(selector, hasCriterionWithType(Type.OCH_SIGTYPE)); |
245 | + } | ||
246 | + | ||
247 | + /** | ||
248 | + * Tests the traffic selector builder. | ||
249 | + */ | ||
250 | + @Test | ||
251 | + public void testTrafficSelectorBuilder() { | ||
252 | + TrafficSelector selector; | ||
253 | + final short shortValue = 33; | ||
197 | 254 | ||
198 | final TrafficSelector baseSelector = DefaultTrafficSelector.builder() | 255 | final TrafficSelector baseSelector = DefaultTrafficSelector.builder() |
199 | - .matchOpticalSignalType(shortValue).build(); | 256 | + .matchLambda(shortValue).build(); |
200 | selector = DefaultTrafficSelector.builder(baseSelector) | 257 | selector = DefaultTrafficSelector.builder(baseSelector) |
201 | .build(); | 258 | .build(); |
202 | - assertThat(selector, hasCriterionWithType(Type.OCH_SIGTYPE)); | 259 | + assertThat(selector, hasCriterionWithType(Type.OCH_SIGID)); |
203 | 260 | ||
204 | final Criterion criterion = Criteria.matchLambda(shortValue); | 261 | final Criterion criterion = Criteria.matchLambda(shortValue); |
205 | selector = DefaultTrafficSelector.builder() | 262 | selector = DefaultTrafficSelector.builder() | ... | ... |
... | @@ -18,6 +18,7 @@ package org.onosproject.net.flow.criteria; | ... | @@ -18,6 +18,7 @@ package org.onosproject.net.flow.criteria; |
18 | import org.junit.Test; | 18 | import org.junit.Test; |
19 | import org.onosproject.net.PortNumber; | 19 | import org.onosproject.net.PortNumber; |
20 | import org.onlab.packet.IpPrefix; | 20 | import org.onlab.packet.IpPrefix; |
21 | +import org.onlab.packet.Ip6Address; | ||
21 | import org.onlab.packet.MacAddress; | 22 | import org.onlab.packet.MacAddress; |
22 | import org.onlab.packet.VlanId; | 23 | import org.onlab.packet.VlanId; |
23 | 24 | ||
... | @@ -44,14 +45,10 @@ public class CriteriaTest { | ... | @@ -44,14 +45,10 @@ public class CriteriaTest { |
44 | Criterion sameAsMatchInPort1 = Criteria.matchInPort(port1); | 45 | Criterion sameAsMatchInPort1 = Criteria.matchInPort(port1); |
45 | Criterion matchInPort2 = Criteria.matchInPort(port2); | 46 | Criterion matchInPort2 = Criteria.matchInPort(port2); |
46 | 47 | ||
47 | - Criterion matchTcpPort1 = Criteria.matchTcpSrc((short) 1); | ||
48 | - Criterion sameAsMatchTcpPort1 = Criteria.matchTcpSrc((short) 1); | ||
49 | - Criterion matchTcpPort2 = Criteria.matchTcpDst((short) 2); | ||
50 | - | ||
51 | private static final String MAC1 = "00:00:00:00:00:01"; | 48 | private static final String MAC1 = "00:00:00:00:00:01"; |
52 | private static final String MAC2 = "00:00:00:00:00:02"; | 49 | private static final String MAC2 = "00:00:00:00:00:02"; |
53 | - private MacAddress mac1 = new MacAddress(MAC1.getBytes()); | 50 | + private MacAddress mac1 = MacAddress.valueOf(MAC1); |
54 | - private MacAddress mac2 = new MacAddress(MAC2.getBytes()); | 51 | + private MacAddress mac2 = MacAddress.valueOf(MAC2); |
55 | Criterion matchEth1 = Criteria.matchEthSrc(mac1); | 52 | Criterion matchEth1 = Criteria.matchEthSrc(mac1); |
56 | Criterion sameAsMatchEth1 = Criteria.matchEthSrc(mac1); | 53 | Criterion sameAsMatchEth1 = Criteria.matchEthSrc(mac1); |
57 | Criterion matchEth2 = Criteria.matchEthDst(mac2); | 54 | Criterion matchEth2 = Criteria.matchEthDst(mac2); |
... | @@ -97,6 +94,82 @@ public class CriteriaTest { | ... | @@ -97,6 +94,82 @@ public class CriteriaTest { |
97 | Criterion sameAsMatchIpv61 = Criteria.matchIPSrc(ipv61); | 94 | Criterion sameAsMatchIpv61 = Criteria.matchIPSrc(ipv61); |
98 | Criterion matchIpv62 = Criteria.matchIPSrc(ipv62); | 95 | Criterion matchIpv62 = Criteria.matchIPSrc(ipv62); |
99 | 96 | ||
97 | + Criterion matchTcpPort1 = Criteria.matchTcpSrc((short) 1); | ||
98 | + Criterion sameAsMatchTcpPort1 = Criteria.matchTcpSrc((short) 1); | ||
99 | + Criterion matchTcpPort2 = Criteria.matchTcpDst((short) 2); | ||
100 | + | ||
101 | + Criterion matchUdpPort1 = Criteria.matchUdpSrc((short) 1); | ||
102 | + Criterion sameAsMatchUdpPort1 = Criteria.matchUdpSrc((short) 1); | ||
103 | + Criterion matchUdpPort2 = Criteria.matchUdpDst((short) 2); | ||
104 | + | ||
105 | + Criterion matchSctpPort1 = Criteria.matchSctpSrc((short) 1); | ||
106 | + Criterion sameAsMatchSctpPort1 = Criteria.matchSctpSrc((short) 1); | ||
107 | + Criterion matchSctpPort2 = Criteria.matchSctpDst((short) 2); | ||
108 | + | ||
109 | + byte icmpType1 = 1; | ||
110 | + byte icmpType2 = 2; | ||
111 | + Criterion matchIcmpType1 = Criteria.matchIcmpType(icmpType1); | ||
112 | + Criterion sameAsMatchIcmpType1 = Criteria.matchIcmpType(icmpType1); | ||
113 | + Criterion matchIcmpType2 = Criteria.matchIcmpType(icmpType2); | ||
114 | + | ||
115 | + byte icmpCode1 = 1; | ||
116 | + byte icmpCode2 = 2; | ||
117 | + Criterion matchIcmpCode1 = Criteria.matchIcmpCode(icmpCode1); | ||
118 | + Criterion sameAsMatchIcmpCode1 = Criteria.matchIcmpCode(icmpCode1); | ||
119 | + Criterion matchIcmpCode2 = Criteria.matchIcmpCode(icmpCode2); | ||
120 | + | ||
121 | + int flowLabel1 = 1; | ||
122 | + int flowLabel2 = 2; | ||
123 | + Criterion matchFlowLabel1 = Criteria.matchIPv6FlowLabel(flowLabel1); | ||
124 | + Criterion sameAsMatchFlowLabel1 = Criteria.matchIPv6FlowLabel(flowLabel1); | ||
125 | + Criterion matchFlowLabel2 = Criteria.matchIPv6FlowLabel(flowLabel2); | ||
126 | + | ||
127 | + byte icmpv6Type1 = 1; | ||
128 | + byte icmpv6Type2 = 2; | ||
129 | + Criterion matchIcmpv6Type1 = Criteria.matchIcmpv6Type(icmpv6Type1); | ||
130 | + Criterion sameAsMatchIcmpv6Type1 = Criteria.matchIcmpv6Type(icmpv6Type1); | ||
131 | + Criterion matchIcmpv6Type2 = Criteria.matchIcmpv6Type(icmpv6Type2); | ||
132 | + | ||
133 | + byte icmpv6Code1 = 1; | ||
134 | + byte icmpv6Code2 = 2; | ||
135 | + Criterion matchIcmpv6Code1 = Criteria.matchIcmpv6Code(icmpv6Code1); | ||
136 | + Criterion sameAsMatchIcmpv6Code1 = Criteria.matchIcmpv6Code(icmpv6Code1); | ||
137 | + Criterion matchIcmpv6Code2 = Criteria.matchIcmpv6Code(icmpv6Code2); | ||
138 | + | ||
139 | + private static final String IPV6_ADDR1 = "fe80::1"; | ||
140 | + private static final String IPV6_ADDR2 = "fe80::2"; | ||
141 | + private Ip6Address ip6TargetAddress1 = Ip6Address.valueOf(IPV6_ADDR1); | ||
142 | + private Ip6Address ip6TargetAddress2 = Ip6Address.valueOf(IPV6_ADDR2); | ||
143 | + Criterion matchIpv6TargetAddr1 = | ||
144 | + Criteria.matchIPv6NDTargetAddress(ip6TargetAddress1); | ||
145 | + Criterion sameAsMatchIpv6TargetAddr1 = | ||
146 | + Criteria.matchIPv6NDTargetAddress(ip6TargetAddress1); | ||
147 | + Criterion matchIpv6TargetAddr2 = | ||
148 | + Criteria.matchIPv6NDTargetAddress(ip6TargetAddress2); | ||
149 | + | ||
150 | + private static final String LL_MAC1 = "00:00:00:00:00:01"; | ||
151 | + private static final String LL_MAC2 = "00:00:00:00:00:02"; | ||
152 | + private MacAddress llMac1 = MacAddress.valueOf(LL_MAC1); | ||
153 | + private MacAddress llMac2 = MacAddress.valueOf(LL_MAC2); | ||
154 | + Criterion matchSrcLlAddr1 = | ||
155 | + Criteria.matchIPv6NDSourceLinkLayerAddress(llMac1); | ||
156 | + Criterion sameAsMatchSrcLlAddr1 = | ||
157 | + Criteria.matchIPv6NDSourceLinkLayerAddress(llMac1); | ||
158 | + Criterion matchSrcLlAddr2 = | ||
159 | + Criteria.matchIPv6NDSourceLinkLayerAddress(llMac2); | ||
160 | + Criterion matchTargetLlAddr1 = | ||
161 | + Criteria.matchIPv6NDTargetLinkLayerAddress(llMac1); | ||
162 | + Criterion sameAsMatchTargetLlAddr1 = | ||
163 | + Criteria.matchIPv6NDTargetLinkLayerAddress(llMac1); | ||
164 | + Criterion matchTargetLlAddr2 = | ||
165 | + Criteria.matchIPv6NDTargetLinkLayerAddress(llMac2); | ||
166 | + | ||
167 | + int mpls1 = 1; | ||
168 | + int mpls2 = 2; | ||
169 | + Criterion matchMpls1 = Criteria.matchMplsLabel(mpls1); | ||
170 | + Criterion sameAsMatchMpls1 = Criteria.matchMplsLabel(mpls1); | ||
171 | + Criterion matchMpls2 = Criteria.matchMplsLabel(mpls2); | ||
172 | + | ||
100 | short lambda1 = 1; | 173 | short lambda1 = 1; |
101 | short lambda2 = 2; | 174 | short lambda2 = 2; |
102 | Criterion matchLambda1 = Criteria.matchLambda(lambda1); | 175 | Criterion matchLambda1 = Criteria.matchLambda(lambda1); |
... | @@ -143,11 +216,21 @@ public class CriteriaTest { | ... | @@ -143,11 +216,21 @@ public class CriteriaTest { |
143 | assertThatClassIsImmutable(Criteria.PortCriterion.class); | 216 | assertThatClassIsImmutable(Criteria.PortCriterion.class); |
144 | assertThatClassIsImmutable(Criteria.EthCriterion.class); | 217 | assertThatClassIsImmutable(Criteria.EthCriterion.class); |
145 | assertThatClassIsImmutable(Criteria.EthTypeCriterion.class); | 218 | assertThatClassIsImmutable(Criteria.EthTypeCriterion.class); |
146 | - assertThatClassIsImmutable(Criteria.IPCriterion.class); | ||
147 | - assertThatClassIsImmutable(Criteria.IPProtocolCriterion.class); | ||
148 | - assertThatClassIsImmutable(Criteria.VlanPcpCriterion.class); | ||
149 | assertThatClassIsImmutable(Criteria.VlanIdCriterion.class); | 219 | assertThatClassIsImmutable(Criteria.VlanIdCriterion.class); |
220 | + assertThatClassIsImmutable(Criteria.VlanPcpCriterion.class); | ||
221 | + assertThatClassIsImmutable(Criteria.IPProtocolCriterion.class); | ||
222 | + assertThatClassIsImmutable(Criteria.IPCriterion.class); | ||
150 | assertThatClassIsImmutable(Criteria.TcpPortCriterion.class); | 223 | assertThatClassIsImmutable(Criteria.TcpPortCriterion.class); |
224 | + assertThatClassIsImmutable(Criteria.UdpPortCriterion.class); | ||
225 | + assertThatClassIsImmutable(Criteria.SctpPortCriterion.class); | ||
226 | + assertThatClassIsImmutable(Criteria.IcmpTypeCriterion.class); | ||
227 | + assertThatClassIsImmutable(Criteria.IcmpCodeCriterion.class); | ||
228 | + assertThatClassIsImmutable(Criteria.IPv6FlowLabelCriterion.class); | ||
229 | + assertThatClassIsImmutable(Criteria.Icmpv6TypeCriterion.class); | ||
230 | + assertThatClassIsImmutable(Criteria.Icmpv6CodeCriterion.class); | ||
231 | + assertThatClassIsImmutable(Criteria.IPv6NDTargetAddressCriterion.class); | ||
232 | + assertThatClassIsImmutable(Criteria.IPv6NDLinkLayerAddressCriterion.class); | ||
233 | + assertThatClassIsImmutable(Criteria.MplsCriterion.class); | ||
151 | assertThatClassIsImmutable(Criteria.LambdaCriterion.class); | 234 | assertThatClassIsImmutable(Criteria.LambdaCriterion.class); |
152 | assertThatClassIsImmutable(Criteria.OpticalSignalTypeCriterion.class); | 235 | assertThatClassIsImmutable(Criteria.OpticalSignalTypeCriterion.class); |
153 | } | 236 | } |
... | @@ -182,6 +265,19 @@ public class CriteriaTest { | ... | @@ -182,6 +265,19 @@ public class CriteriaTest { |
182 | // EthCriterion class | 265 | // EthCriterion class |
183 | 266 | ||
184 | /** | 267 | /** |
268 | + * Test the matchEthDst method. | ||
269 | + */ | ||
270 | + @Test | ||
271 | + public void testMatchEthDstMethod() { | ||
272 | + Criterion matchEthDst = Criteria.matchEthDst(mac1); | ||
273 | + Criteria.EthCriterion ethCriterion = | ||
274 | + checkAndConvert(matchEthDst, | ||
275 | + Criterion.Type.ETH_DST, | ||
276 | + Criteria.EthCriterion.class); | ||
277 | + assertThat(ethCriterion.mac(), is(equalTo(mac1))); | ||
278 | + } | ||
279 | + | ||
280 | + /** | ||
185 | * Test the matchEthSrc method. | 281 | * Test the matchEthSrc method. |
186 | */ | 282 | */ |
187 | @Test | 283 | @Test |
... | @@ -195,19 +291,6 @@ public class CriteriaTest { | ... | @@ -195,19 +291,6 @@ public class CriteriaTest { |
195 | } | 291 | } |
196 | 292 | ||
197 | /** | 293 | /** |
198 | - * Test the matchEthDst method. | ||
199 | - */ | ||
200 | - @Test | ||
201 | - public void testMatchEthDstMethod() { | ||
202 | - Criterion matchTcpDst = Criteria.matchEthDst(mac1); | ||
203 | - Criteria.EthCriterion ethCriterion = | ||
204 | - checkAndConvert(matchTcpDst, | ||
205 | - Criterion.Type.ETH_DST, | ||
206 | - Criteria.EthCriterion.class); | ||
207 | - assertThat(ethCriterion.mac(), is(equalTo(mac1))); | ||
208 | - } | ||
209 | - | ||
210 | - /** | ||
211 | * Test the equals() method of the EthCriterion class. | 294 | * Test the equals() method of the EthCriterion class. |
212 | */ | 295 | */ |
213 | @Test | 296 | @Test |
... | @@ -218,45 +301,6 @@ public class CriteriaTest { | ... | @@ -218,45 +301,6 @@ public class CriteriaTest { |
218 | .testEquals(); | 301 | .testEquals(); |
219 | } | 302 | } |
220 | 303 | ||
221 | - // TcpPortCriterion class | ||
222 | - | ||
223 | - /** | ||
224 | - * Test the matchTcpSrc method. | ||
225 | - */ | ||
226 | - @Test | ||
227 | - public void testMatchTcpSrcMethod() { | ||
228 | - Criterion matchTcpSrc = Criteria.matchTcpSrc((short) 1); | ||
229 | - Criteria.TcpPortCriterion tcpPortCriterion = | ||
230 | - checkAndConvert(matchTcpSrc, | ||
231 | - Criterion.Type.TCP_SRC, | ||
232 | - Criteria.TcpPortCriterion.class); | ||
233 | - assertThat(tcpPortCriterion.tcpPort(), is(equalTo((short) 1))); | ||
234 | - } | ||
235 | - | ||
236 | - /** | ||
237 | - * Test the matchTcpDst method. | ||
238 | - */ | ||
239 | - @Test | ||
240 | - public void testMatchTcpDstMethod() { | ||
241 | - Criterion matchTcpDst = Criteria.matchTcpDst((short) 1); | ||
242 | - Criteria.TcpPortCriterion tcpPortCriterion = | ||
243 | - checkAndConvert(matchTcpDst, | ||
244 | - Criterion.Type.TCP_DST, | ||
245 | - Criteria.TcpPortCriterion.class); | ||
246 | - assertThat(tcpPortCriterion.tcpPort(), is(equalTo((short) 1))); | ||
247 | - } | ||
248 | - | ||
249 | - /** | ||
250 | - * Test the equals() method of the TcpPortCriterion class. | ||
251 | - */ | ||
252 | - @Test | ||
253 | - public void testTcpPortCriterionEquals() { | ||
254 | - new EqualsTester() | ||
255 | - .addEqualityGroup(matchTcpPort1, sameAsMatchTcpPort1) | ||
256 | - .addEqualityGroup(matchTcpPort2) | ||
257 | - .testEquals(); | ||
258 | - } | ||
259 | - | ||
260 | // EthTypeCriterion class | 304 | // EthTypeCriterion class |
261 | 305 | ||
262 | /** | 306 | /** |
... | @@ -365,7 +409,7 @@ public class CriteriaTest { | ... | @@ -365,7 +409,7 @@ public class CriteriaTest { |
365 | // IPCriterion class | 409 | // IPCriterion class |
366 | 410 | ||
367 | /** | 411 | /** |
368 | - * Test the matchIPSrc method. | 412 | + * Test the matchIPSrc method: IPv4. |
369 | */ | 413 | */ |
370 | @Test | 414 | @Test |
371 | public void testMatchIPSrcMethod() { | 415 | public void testMatchIPSrcMethod() { |
... | @@ -378,7 +422,7 @@ public class CriteriaTest { | ... | @@ -378,7 +422,7 @@ public class CriteriaTest { |
378 | } | 422 | } |
379 | 423 | ||
380 | /** | 424 | /** |
381 | - * Test the matchIPDst method. | 425 | + * Test the matchIPDst method: IPv4. |
382 | */ | 426 | */ |
383 | @Test | 427 | @Test |
384 | public void testMatchIPDstMethod() { | 428 | public void testMatchIPDstMethod() { |
... | @@ -391,7 +435,7 @@ public class CriteriaTest { | ... | @@ -391,7 +435,7 @@ public class CriteriaTest { |
391 | } | 435 | } |
392 | 436 | ||
393 | /** | 437 | /** |
394 | - * Test the matchIPSrc method. | 438 | + * Test the matchIPSrc method: IPv6. |
395 | */ | 439 | */ |
396 | @Test | 440 | @Test |
397 | public void testMatchIPv6SrcMethod() { | 441 | public void testMatchIPv6SrcMethod() { |
... | @@ -404,7 +448,7 @@ public class CriteriaTest { | ... | @@ -404,7 +448,7 @@ public class CriteriaTest { |
404 | } | 448 | } |
405 | 449 | ||
406 | /** | 450 | /** |
407 | - * Test the matchIPDst method. | 451 | + * Test the matchIPDst method: IPv6. |
408 | */ | 452 | */ |
409 | @Test | 453 | @Test |
410 | public void testMatchIPv6DstMethod() { | 454 | public void testMatchIPv6DstMethod() { |
... | @@ -432,6 +476,359 @@ public class CriteriaTest { | ... | @@ -432,6 +476,359 @@ public class CriteriaTest { |
432 | .testEquals(); | 476 | .testEquals(); |
433 | } | 477 | } |
434 | 478 | ||
479 | + // TcpPortCriterion class | ||
480 | + | ||
481 | + /** | ||
482 | + * Test the matchTcpSrc method. | ||
483 | + */ | ||
484 | + @Test | ||
485 | + public void testMatchTcpSrcMethod() { | ||
486 | + Criterion matchTcpSrc = Criteria.matchTcpSrc((short) 1); | ||
487 | + Criteria.TcpPortCriterion tcpPortCriterion = | ||
488 | + checkAndConvert(matchTcpSrc, | ||
489 | + Criterion.Type.TCP_SRC, | ||
490 | + Criteria.TcpPortCriterion.class); | ||
491 | + assertThat(tcpPortCriterion.tcpPort(), is(equalTo((short) 1))); | ||
492 | + } | ||
493 | + | ||
494 | + /** | ||
495 | + * Test the matchTcpDst method. | ||
496 | + */ | ||
497 | + @Test | ||
498 | + public void testMatchTcpDstMethod() { | ||
499 | + Criterion matchTcpDst = Criteria.matchTcpDst((short) 1); | ||
500 | + Criteria.TcpPortCriterion tcpPortCriterion = | ||
501 | + checkAndConvert(matchTcpDst, | ||
502 | + Criterion.Type.TCP_DST, | ||
503 | + Criteria.TcpPortCriterion.class); | ||
504 | + assertThat(tcpPortCriterion.tcpPort(), is(equalTo((short) 1))); | ||
505 | + } | ||
506 | + | ||
507 | + /** | ||
508 | + * Test the equals() method of the TcpPortCriterion class. | ||
509 | + */ | ||
510 | + @Test | ||
511 | + public void testTcpPortCriterionEquals() { | ||
512 | + new EqualsTester() | ||
513 | + .addEqualityGroup(matchTcpPort1, sameAsMatchTcpPort1) | ||
514 | + .addEqualityGroup(matchTcpPort2) | ||
515 | + .testEquals(); | ||
516 | + } | ||
517 | + | ||
518 | + // UdpPortCriterion class | ||
519 | + | ||
520 | + /** | ||
521 | + * Test the matchUdpSrc method. | ||
522 | + */ | ||
523 | + @Test | ||
524 | + public void testMatchUdpSrcMethod() { | ||
525 | + Criterion matchUdpSrc = Criteria.matchUdpSrc((short) 1); | ||
526 | + Criteria.UdpPortCriterion udpPortCriterion = | ||
527 | + checkAndConvert(matchUdpSrc, | ||
528 | + Criterion.Type.UDP_SRC, | ||
529 | + Criteria.UdpPortCriterion.class); | ||
530 | + assertThat(udpPortCriterion.udpPort(), is(equalTo((short) 1))); | ||
531 | + } | ||
532 | + | ||
533 | + /** | ||
534 | + * Test the matchUdpDst method. | ||
535 | + */ | ||
536 | + @Test | ||
537 | + public void testMatchUdpDstMethod() { | ||
538 | + Criterion matchUdpDst = Criteria.matchUdpDst((short) 1); | ||
539 | + Criteria.UdpPortCriterion udpPortCriterion = | ||
540 | + checkAndConvert(matchUdpDst, | ||
541 | + Criterion.Type.UDP_DST, | ||
542 | + Criteria.UdpPortCriterion.class); | ||
543 | + assertThat(udpPortCriterion.udpPort(), is(equalTo((short) 1))); | ||
544 | + } | ||
545 | + | ||
546 | + /** | ||
547 | + * Test the equals() method of the UdpPortCriterion class. | ||
548 | + */ | ||
549 | + @Test | ||
550 | + public void testUdpPortCriterionEquals() { | ||
551 | + new EqualsTester() | ||
552 | + .addEqualityGroup(matchUdpPort1, sameAsMatchUdpPort1) | ||
553 | + .addEqualityGroup(matchUdpPort2) | ||
554 | + .testEquals(); | ||
555 | + } | ||
556 | + | ||
557 | + // SctpPortCriterion class | ||
558 | + | ||
559 | + /** | ||
560 | + * Test the matchSctpSrc method. | ||
561 | + */ | ||
562 | + @Test | ||
563 | + public void testMatchSctpSrcMethod() { | ||
564 | + Criterion matchSctpSrc = Criteria.matchSctpSrc((short) 1); | ||
565 | + Criteria.SctpPortCriterion sctpPortCriterion = | ||
566 | + checkAndConvert(matchSctpSrc, | ||
567 | + Criterion.Type.SCTP_SRC, | ||
568 | + Criteria.SctpPortCriterion.class); | ||
569 | + assertThat(sctpPortCriterion.sctpPort(), is(equalTo((short) 1))); | ||
570 | + } | ||
571 | + | ||
572 | + /** | ||
573 | + * Test the matchSctpDst method. | ||
574 | + */ | ||
575 | + @Test | ||
576 | + public void testMatchSctpDstMethod() { | ||
577 | + Criterion matchSctpDst = Criteria.matchSctpDst((short) 1); | ||
578 | + Criteria.SctpPortCriterion sctpPortCriterion = | ||
579 | + checkAndConvert(matchSctpDst, | ||
580 | + Criterion.Type.SCTP_DST, | ||
581 | + Criteria.SctpPortCriterion.class); | ||
582 | + assertThat(sctpPortCriterion.sctpPort(), is(equalTo((short) 1))); | ||
583 | + } | ||
584 | + | ||
585 | + /** | ||
586 | + * Test the equals() method of the SctpPortCriterion class. | ||
587 | + */ | ||
588 | + @Test | ||
589 | + public void testSctpPortCriterionEquals() { | ||
590 | + new EqualsTester() | ||
591 | + .addEqualityGroup(matchSctpPort1, sameAsMatchSctpPort1) | ||
592 | + .addEqualityGroup(matchSctpPort2) | ||
593 | + .testEquals(); | ||
594 | + } | ||
595 | + | ||
596 | + // IcmpTypeCriterion class | ||
597 | + | ||
598 | + /** | ||
599 | + * Test the matchIcmpType method. | ||
600 | + */ | ||
601 | + @Test | ||
602 | + public void testMatchIcmpTypeMethod() { | ||
603 | + Byte icmpType = 12; | ||
604 | + Criterion matchIcmpType = Criteria.matchIcmpType(icmpType); | ||
605 | + Criteria.IcmpTypeCriterion icmpTypeCriterion = | ||
606 | + checkAndConvert(matchIcmpType, | ||
607 | + Criterion.Type.ICMPV4_TYPE, | ||
608 | + Criteria.IcmpTypeCriterion.class); | ||
609 | + assertThat(icmpTypeCriterion.icmpType(), is(equalTo(icmpType))); | ||
610 | + } | ||
611 | + | ||
612 | + /** | ||
613 | + * Test the equals() method of the IcmpTypeCriterion class. | ||
614 | + */ | ||
615 | + @Test | ||
616 | + public void testIcmpTypeCriterionEquals() { | ||
617 | + new EqualsTester() | ||
618 | + .addEqualityGroup(matchIcmpType1, sameAsMatchIcmpType1) | ||
619 | + .addEqualityGroup(matchIcmpType2) | ||
620 | + .testEquals(); | ||
621 | + } | ||
622 | + | ||
623 | + // IcmpCodeCriterion class | ||
624 | + | ||
625 | + /** | ||
626 | + * Test the matchIcmpCode method. | ||
627 | + */ | ||
628 | + @Test | ||
629 | + public void testMatchIcmpCodeMethod() { | ||
630 | + Byte icmpCode = 12; | ||
631 | + Criterion matchIcmpCode = Criteria.matchIcmpCode(icmpCode); | ||
632 | + Criteria.IcmpCodeCriterion icmpCodeCriterion = | ||
633 | + checkAndConvert(matchIcmpCode, | ||
634 | + Criterion.Type.ICMPV4_CODE, | ||
635 | + Criteria.IcmpCodeCriterion.class); | ||
636 | + assertThat(icmpCodeCriterion.icmpCode(), is(equalTo(icmpCode))); | ||
637 | + } | ||
638 | + | ||
639 | + /** | ||
640 | + * Test the equals() method of the IcmpCodeCriterion class. | ||
641 | + */ | ||
642 | + @Test | ||
643 | + public void testIcmpCodeCriterionEquals() { | ||
644 | + new EqualsTester() | ||
645 | + .addEqualityGroup(matchIcmpCode1, sameAsMatchIcmpCode1) | ||
646 | + .addEqualityGroup(matchIcmpCode2) | ||
647 | + .testEquals(); | ||
648 | + } | ||
649 | + | ||
650 | + // IPv6FlowLabelCriterion class | ||
651 | + | ||
652 | + /** | ||
653 | + * Test the matchIPv6FlowLabel method. | ||
654 | + */ | ||
655 | + @Test | ||
656 | + public void testMatchIPv6FlowLabelMethod() { | ||
657 | + Integer flowLabel = 12; | ||
658 | + Criterion matchFlowLabel = Criteria.matchIPv6FlowLabel(flowLabel); | ||
659 | + Criteria.IPv6FlowLabelCriterion flowLabelCriterion = | ||
660 | + checkAndConvert(matchFlowLabel, | ||
661 | + Criterion.Type.IPV6_FLABEL, | ||
662 | + Criteria.IPv6FlowLabelCriterion.class); | ||
663 | + assertThat(flowLabelCriterion.flowLabel(), is(equalTo(flowLabel))); | ||
664 | + } | ||
665 | + | ||
666 | + /** | ||
667 | + * Test the equals() method of the IPv6FlowLabelCriterion class. | ||
668 | + */ | ||
669 | + @Test | ||
670 | + public void testIPv6FlowLabelCriterionEquals() { | ||
671 | + new EqualsTester() | ||
672 | + .addEqualityGroup(matchFlowLabel1, sameAsMatchFlowLabel1) | ||
673 | + .addEqualityGroup(matchFlowLabel2) | ||
674 | + .testEquals(); | ||
675 | + } | ||
676 | + | ||
677 | + // Icmpv6TypeCriterion class | ||
678 | + | ||
679 | + /** | ||
680 | + * Test the matchIcmpv6Type method. | ||
681 | + */ | ||
682 | + @Test | ||
683 | + public void testMatchIcmpv6TypeMethod() { | ||
684 | + Byte icmpv6Type = 12; | ||
685 | + Criterion matchIcmpv6Type = Criteria.matchIcmpv6Type(icmpv6Type); | ||
686 | + Criteria.Icmpv6TypeCriterion icmpv6TypeCriterion = | ||
687 | + checkAndConvert(matchIcmpv6Type, | ||
688 | + Criterion.Type.ICMPV6_TYPE, | ||
689 | + Criteria.Icmpv6TypeCriterion.class); | ||
690 | + assertThat(icmpv6TypeCriterion.icmpv6Type(), is(equalTo(icmpv6Type))); | ||
691 | + } | ||
692 | + | ||
693 | + /** | ||
694 | + * Test the equals() method of the Icmpv6TypeCriterion class. | ||
695 | + */ | ||
696 | + @Test | ||
697 | + public void testIcmpv6TypeCriterionEquals() { | ||
698 | + new EqualsTester() | ||
699 | + .addEqualityGroup(matchIcmpv6Type1, sameAsMatchIcmpv6Type1) | ||
700 | + .addEqualityGroup(matchIcmpv6Type2) | ||
701 | + .testEquals(); | ||
702 | + } | ||
703 | + | ||
704 | + // Icmpv6CodeCriterion class | ||
705 | + | ||
706 | + /** | ||
707 | + * Test the matchIcmpv6Code method. | ||
708 | + */ | ||
709 | + @Test | ||
710 | + public void testMatchIcmpv6CodeMethod() { | ||
711 | + Byte icmpv6Code = 12; | ||
712 | + Criterion matchIcmpv6Code = Criteria.matchIcmpv6Code(icmpv6Code); | ||
713 | + Criteria.Icmpv6CodeCriterion icmpv6CodeCriterion = | ||
714 | + checkAndConvert(matchIcmpv6Code, | ||
715 | + Criterion.Type.ICMPV6_CODE, | ||
716 | + Criteria.Icmpv6CodeCriterion.class); | ||
717 | + assertThat(icmpv6CodeCriterion.icmpv6Code(), is(equalTo(icmpv6Code))); | ||
718 | + } | ||
719 | + | ||
720 | + /** | ||
721 | + * Test the equals() method of the Icmpv6CodeCriterion class. | ||
722 | + */ | ||
723 | + @Test | ||
724 | + public void testIcmpv6CodeCriterionEquals() { | ||
725 | + new EqualsTester() | ||
726 | + .addEqualityGroup(matchIcmpv6Code1, sameAsMatchIcmpv6Code1) | ||
727 | + .addEqualityGroup(matchIcmpv6Code2) | ||
728 | + .testEquals(); | ||
729 | + } | ||
730 | + | ||
731 | + // IPv6NDTargetAddressCriterion class | ||
732 | + | ||
733 | + /** | ||
734 | + * Test the matchIPv6NDTargetAddress method. | ||
735 | + */ | ||
736 | + @Test | ||
737 | + public void testMatchIPv6NDTargetAddressMethod() { | ||
738 | + Criterion matchTargetAddress = | ||
739 | + Criteria.matchIPv6NDTargetAddress(ip6TargetAddress1); | ||
740 | + Criteria.IPv6NDTargetAddressCriterion targetAddressCriterion = | ||
741 | + checkAndConvert(matchTargetAddress, | ||
742 | + Criterion.Type.IPV6_ND_TARGET, | ||
743 | + Criteria.IPv6NDTargetAddressCriterion.class); | ||
744 | + assertThat(targetAddressCriterion.targetAddress(), | ||
745 | + is(ip6TargetAddress1)); | ||
746 | + } | ||
747 | + | ||
748 | + /** | ||
749 | + * Test the equals() method of the IPv6NDTargetAddressCriterion class. | ||
750 | + */ | ||
751 | + @Test | ||
752 | + public void testIPv6NDTargetAddressCriterionEquals() { | ||
753 | + new EqualsTester() | ||
754 | + .addEqualityGroup(matchIpv6TargetAddr1, | ||
755 | + sameAsMatchIpv6TargetAddr1) | ||
756 | + .addEqualityGroup(matchIpv6TargetAddr2) | ||
757 | + .testEquals(); | ||
758 | + } | ||
759 | + | ||
760 | + // IPv6NDLinkLayerAddressCriterion class | ||
761 | + | ||
762 | + /** | ||
763 | + * Test the matchIPv6NDSourceLinkLayerAddress method. | ||
764 | + */ | ||
765 | + @Test | ||
766 | + public void testMatchIPv6NDSourceLinkLayerAddressMethod() { | ||
767 | + Criterion matchSrcLlAddr = | ||
768 | + Criteria.matchIPv6NDSourceLinkLayerAddress(llMac1); | ||
769 | + Criteria.IPv6NDLinkLayerAddressCriterion srcLlCriterion = | ||
770 | + checkAndConvert(matchSrcLlAddr, | ||
771 | + Criterion.Type.IPV6_ND_SLL, | ||
772 | + Criteria.IPv6NDLinkLayerAddressCriterion.class); | ||
773 | + assertThat(srcLlCriterion.mac(), is(equalTo(llMac1))); | ||
774 | + } | ||
775 | + | ||
776 | + /** | ||
777 | + * Test the matchIPv6NDTargetLinkLayerAddress method. | ||
778 | + */ | ||
779 | + @Test | ||
780 | + public void testMatchIPv6NDTargetLinkLayerAddressMethod() { | ||
781 | + Criterion matchTargetLlAddr = | ||
782 | + Criteria.matchIPv6NDTargetLinkLayerAddress(llMac1); | ||
783 | + Criteria.IPv6NDLinkLayerAddressCriterion targetLlCriterion = | ||
784 | + checkAndConvert(matchTargetLlAddr, | ||
785 | + Criterion.Type.IPV6_ND_TLL, | ||
786 | + Criteria.IPv6NDLinkLayerAddressCriterion.class); | ||
787 | + assertThat(targetLlCriterion.mac(), is(equalTo(llMac1))); | ||
788 | + } | ||
789 | + | ||
790 | + /** | ||
791 | + * Test the equals() method of the IPv6NDLinkLayerAddressCriterion class. | ||
792 | + */ | ||
793 | + @Test | ||
794 | + public void testIPv6NDLinkLayerAddressCriterionEquals() { | ||
795 | + new EqualsTester() | ||
796 | + .addEqualityGroup(matchSrcLlAddr1, sameAsMatchSrcLlAddr1) | ||
797 | + .addEqualityGroup(matchSrcLlAddr2) | ||
798 | + .testEquals(); | ||
799 | + | ||
800 | + new EqualsTester() | ||
801 | + .addEqualityGroup(matchTargetLlAddr1, sameAsMatchTargetLlAddr1) | ||
802 | + .addEqualityGroup(matchTargetLlAddr2) | ||
803 | + .testEquals(); | ||
804 | + } | ||
805 | + | ||
806 | + // MplsCriterion class | ||
807 | + | ||
808 | + /** | ||
809 | + * Test the matchMplsLabel method. | ||
810 | + */ | ||
811 | + @Test | ||
812 | + public void testMatchMplsLabelMethod() { | ||
813 | + Criterion matchMplsLabel = Criteria.matchMplsLabel(mpls1); | ||
814 | + Criteria.MplsCriterion mplsCriterion = | ||
815 | + checkAndConvert(matchMplsLabel, | ||
816 | + Criterion.Type.MPLS_LABEL, | ||
817 | + Criteria.MplsCriterion.class); | ||
818 | + assertThat(mplsCriterion.label(), is(equalTo(mpls1))); | ||
819 | + } | ||
820 | + | ||
821 | + /** | ||
822 | + * Test the equals() method of the MplsCriterion class. | ||
823 | + */ | ||
824 | + @Test | ||
825 | + public void testMplsCriterionEquals() { | ||
826 | + new EqualsTester() | ||
827 | + .addEqualityGroup(matchMpls1, sameAsMatchMpls1) | ||
828 | + .addEqualityGroup(matchMpls2) | ||
829 | + .testEquals(); | ||
830 | + } | ||
831 | + | ||
435 | // LambdaCriterion class | 832 | // LambdaCriterion class |
436 | 833 | ||
437 | /** | 834 | /** | ... | ... |
... | @@ -127,7 +127,7 @@ public class OpticalPathIntentInstaller implements IntentInstaller<OpticalPathIn | ... | @@ -127,7 +127,7 @@ public class OpticalPathIntentInstaller implements IntentInstaller<OpticalPathIn |
127 | LinkResourceAllocations allocations, | 127 | LinkResourceAllocations allocations, |
128 | FlowRuleOperation operation) { | 128 | FlowRuleOperation operation) { |
129 | TrafficSelector.Builder selectorBuilder = DefaultTrafficSelector.builder(); | 129 | TrafficSelector.Builder selectorBuilder = DefaultTrafficSelector.builder(); |
130 | - selectorBuilder.matchInport(intent.src().port()); | 130 | + selectorBuilder.matchInPort(intent.src().port()); |
131 | 131 | ||
132 | List<FlowRuleBatchEntry> rules = Lists.newLinkedList(); | 132 | List<FlowRuleBatchEntry> rules = Lists.newLinkedList(); |
133 | ConnectPoint prev = intent.src(); | 133 | ConnectPoint prev = intent.src(); |
... | @@ -163,7 +163,7 @@ public class OpticalPathIntentInstaller implements IntentInstaller<OpticalPathIn | ... | @@ -163,7 +163,7 @@ public class OpticalPathIntentInstaller implements IntentInstaller<OpticalPathIn |
163 | rules.add(new FlowRuleBatchEntry(operation, rule)); | 163 | rules.add(new FlowRuleBatchEntry(operation, rule)); |
164 | 164 | ||
165 | prev = link.dst(); | 165 | prev = link.dst(); |
166 | - selectorBuilder.matchInport(link.dst().port()); | 166 | + selectorBuilder.matchInPort(link.dst().port()); |
167 | selectorBuilder.matchOpticalSignalType(SIGNAL_TYPE); //todo | 167 | selectorBuilder.matchOpticalSignalType(SIGNAL_TYPE); //todo |
168 | selectorBuilder.matchLambda((short) la.toInt()); | 168 | selectorBuilder.matchLambda((short) la.toInt()); |
169 | 169 | ... | ... |
... | @@ -92,7 +92,7 @@ public class PathIntentInstaller implements IntentInstaller<PathIntent> { | ... | @@ -92,7 +92,7 @@ public class PathIntentInstaller implements IntentInstaller<PathIntent> { |
92 | List<FlowRuleBatchEntry> rules = Lists.newLinkedList(); | 92 | List<FlowRuleBatchEntry> rules = Lists.newLinkedList(); |
93 | // TODO Generate multiple batches | 93 | // TODO Generate multiple batches |
94 | while (links.hasNext()) { | 94 | while (links.hasNext()) { |
95 | - builder.matchInport(prev.port()); | 95 | + builder.matchInPort(prev.port()); |
96 | Link link = links.next(); | 96 | Link link = links.next(); |
97 | // if this is the last flow rule, apply the intent's treatments | 97 | // if this is the last flow rule, apply the intent's treatments |
98 | TrafficTreatment treatment = | 98 | TrafficTreatment treatment = |
... | @@ -124,7 +124,7 @@ public class PathIntentInstaller implements IntentInstaller<PathIntent> { | ... | @@ -124,7 +124,7 @@ public class PathIntentInstaller implements IntentInstaller<PathIntent> { |
124 | List<FlowRuleBatchEntry> rules = Lists.newLinkedList(); | 124 | List<FlowRuleBatchEntry> rules = Lists.newLinkedList(); |
125 | // TODO Generate multiple batches | 125 | // TODO Generate multiple batches |
126 | while (links.hasNext()) { | 126 | while (links.hasNext()) { |
127 | - builder.matchInport(prev.port()); | 127 | + builder.matchInPort(prev.port()); |
128 | Link link = links.next(); | 128 | Link link = links.next(); |
129 | // if this is the last flow rule, apply the intent's treatments | 129 | // if this is the last flow rule, apply the intent's treatments |
130 | TrafficTreatment treatment = | 130 | TrafficTreatment treatment = | ... | ... |
... | @@ -18,6 +18,7 @@ package org.onosproject.provider.of.flow.impl; | ... | @@ -18,6 +18,7 @@ package org.onosproject.provider.of.flow.impl; |
18 | import com.google.common.collect.Lists; | 18 | import com.google.common.collect.Lists; |
19 | import org.onlab.packet.Ip4Address; | 19 | import org.onlab.packet.Ip4Address; |
20 | import org.onlab.packet.Ip4Prefix; | 20 | import org.onlab.packet.Ip4Prefix; |
21 | +import org.onlab.packet.Ip6Address; | ||
21 | import org.onlab.packet.Ip6Prefix; | 22 | import org.onlab.packet.Ip6Prefix; |
22 | import org.onlab.packet.MacAddress; | 23 | import org.onlab.packet.MacAddress; |
23 | import org.onlab.packet.VlanId; | 24 | import org.onlab.packet.VlanId; |
... | @@ -348,124 +349,139 @@ public class FlowEntryBuilder { | ... | @@ -348,124 +349,139 @@ public class FlowEntryBuilder { |
348 | } | 349 | } |
349 | 350 | ||
350 | private TrafficSelector buildSelector() { | 351 | private TrafficSelector buildSelector() { |
352 | + MacAddress mac; | ||
353 | + Ip4Prefix ip4Prefix; | ||
354 | + Ip6Address ip6Address; | ||
355 | + Ip6Prefix ip6Prefix; | ||
356 | + | ||
351 | TrafficSelector.Builder builder = DefaultTrafficSelector.builder(); | 357 | TrafficSelector.Builder builder = DefaultTrafficSelector.builder(); |
352 | for (MatchField<?> field : match.getMatchFields()) { | 358 | for (MatchField<?> field : match.getMatchFields()) { |
353 | switch (field.id) { | 359 | switch (field.id) { |
354 | case IN_PORT: | 360 | case IN_PORT: |
355 | - builder.matchInport(PortNumber | 361 | + builder.matchInPort(PortNumber |
356 | .portNumber(match.get(MatchField.IN_PORT).getPortNumber())); | 362 | .portNumber(match.get(MatchField.IN_PORT).getPortNumber())); |
357 | break; | 363 | break; |
358 | - case ETH_SRC: | ||
359 | - MacAddress sMac = MacAddress.valueOf(match.get(MatchField.ETH_SRC).getLong()); | ||
360 | - builder.matchEthSrc(sMac); | ||
361 | - break; | ||
362 | case ETH_DST: | 364 | case ETH_DST: |
363 | - MacAddress dMac = MacAddress.valueOf(match.get(MatchField.ETH_DST).getLong()); | 365 | + mac = MacAddress.valueOf(match.get(MatchField.ETH_DST).getLong()); |
364 | - builder.matchEthDst(dMac); | 366 | + builder.matchEthDst(mac); |
367 | + break; | ||
368 | + case ETH_SRC: | ||
369 | + mac = MacAddress.valueOf(match.get(MatchField.ETH_SRC).getLong()); | ||
370 | + builder.matchEthSrc(mac); | ||
365 | break; | 371 | break; |
366 | case ETH_TYPE: | 372 | case ETH_TYPE: |
367 | int ethType = match.get(MatchField.ETH_TYPE).getValue(); | 373 | int ethType = match.get(MatchField.ETH_TYPE).getValue(); |
368 | builder.matchEthType((short) ethType); | 374 | builder.matchEthType((short) ethType); |
369 | break; | 375 | break; |
370 | - case IPV4_DST: | 376 | + case VLAN_VID: |
371 | - Ip4Prefix dip; | 377 | + VlanId vlanId = null; |
372 | - if (match.isPartiallyMasked(MatchField.IPV4_DST)) { | 378 | + if (match.isPartiallyMasked(MatchField.VLAN_VID)) { |
373 | - Masked<IPv4Address> maskedIp = match.getMasked(MatchField.IPV4_DST); | 379 | + Masked<OFVlanVidMatch> masked = match.getMasked(MatchField.VLAN_VID); |
374 | - | 380 | + if (masked.getValue().equals(OFVlanVidMatch.PRESENT) |
375 | - dip = Ip4Prefix.valueOf( | 381 | + && masked.getMask().equals(OFVlanVidMatch.PRESENT)) { |
376 | - maskedIp.getValue().getInt(), | 382 | + vlanId = VlanId.ANY; |
377 | - maskedIp.getMask().asCidrMaskLength()); | 383 | + } |
378 | } else { | 384 | } else { |
379 | - dip = Ip4Prefix.valueOf( | 385 | + vlanId = VlanId.vlanId(match.get(MatchField.VLAN_VID).getVlan()); |
380 | - match.get(MatchField.IPV4_DST).getInt(), | ||
381 | - Ip4Prefix.MAX_MASK_LENGTH); | ||
382 | } | 386 | } |
383 | - | 387 | + if (vlanId != null) { |
384 | - builder.matchIPDst(dip); | 388 | + builder.matchVlanId(vlanId); |
389 | + } | ||
390 | + break; | ||
391 | + case VLAN_PCP: | ||
392 | + byte vlanPcp = match.get(MatchField.VLAN_PCP).getValue(); | ||
393 | + builder.matchVlanPcp(vlanPcp); | ||
394 | + break; | ||
395 | + case IP_PROTO: | ||
396 | + short proto = match.get(MatchField.IP_PROTO).getIpProtocolNumber(); | ||
397 | + builder.matchIPProtocol((byte) proto); | ||
385 | break; | 398 | break; |
386 | case IPV4_SRC: | 399 | case IPV4_SRC: |
387 | - Ip4Prefix sip; | ||
388 | if (match.isPartiallyMasked(MatchField.IPV4_SRC)) { | 400 | if (match.isPartiallyMasked(MatchField.IPV4_SRC)) { |
389 | Masked<IPv4Address> maskedIp = match.getMasked(MatchField.IPV4_SRC); | 401 | Masked<IPv4Address> maskedIp = match.getMasked(MatchField.IPV4_SRC); |
390 | 402 | ||
391 | - sip = Ip4Prefix.valueOf( | 403 | + ip4Prefix = Ip4Prefix.valueOf( |
392 | maskedIp.getValue().getInt(), | 404 | maskedIp.getValue().getInt(), |
393 | maskedIp.getMask().asCidrMaskLength()); | 405 | maskedIp.getMask().asCidrMaskLength()); |
394 | } else { | 406 | } else { |
395 | - sip = Ip4Prefix.valueOf( | 407 | + ip4Prefix = Ip4Prefix.valueOf( |
396 | match.get(MatchField.IPV4_SRC).getInt(), | 408 | match.get(MatchField.IPV4_SRC).getInt(), |
397 | Ip4Prefix.MAX_MASK_LENGTH); | 409 | Ip4Prefix.MAX_MASK_LENGTH); |
398 | } | 410 | } |
399 | 411 | ||
400 | - builder.matchIPSrc(sip); | 412 | + builder.matchIPSrc(ip4Prefix); |
401 | - break; | ||
402 | - case IP_PROTO: | ||
403 | - short proto = match.get(MatchField.IP_PROTO).getIpProtocolNumber(); | ||
404 | - builder.matchIPProtocol((byte) proto); | ||
405 | - break; | ||
406 | - case VLAN_PCP: | ||
407 | - byte vlanPcp = match.get(MatchField.VLAN_PCP).getValue(); | ||
408 | - builder.matchVlanPcp(vlanPcp); | ||
409 | break; | 413 | break; |
410 | - case VLAN_VID: | 414 | + case IPV4_DST: |
411 | - VlanId vlanId = null; | 415 | + if (match.isPartiallyMasked(MatchField.IPV4_DST)) { |
412 | - if (match.isPartiallyMasked(MatchField.VLAN_VID)) { | 416 | + Masked<IPv4Address> maskedIp = match.getMasked(MatchField.IPV4_DST); |
413 | - Masked<OFVlanVidMatch> masked = match.getMasked(MatchField.VLAN_VID); | 417 | + |
414 | - if (masked.getValue().equals(OFVlanVidMatch.PRESENT) | 418 | + ip4Prefix = Ip4Prefix.valueOf( |
415 | - && masked.getMask().equals(OFVlanVidMatch.PRESENT)) { | 419 | + maskedIp.getValue().getInt(), |
416 | - vlanId = VlanId.ANY; | 420 | + maskedIp.getMask().asCidrMaskLength()); |
417 | - } | ||
418 | } else { | 421 | } else { |
419 | - vlanId = VlanId.vlanId(match.get(MatchField.VLAN_VID).getVlan()); | 422 | + ip4Prefix = Ip4Prefix.valueOf( |
420 | - } | 423 | + match.get(MatchField.IPV4_DST).getInt(), |
421 | - if (vlanId != null) { | 424 | + Ip4Prefix.MAX_MASK_LENGTH); |
422 | - builder.matchVlanId(vlanId); | ||
423 | } | 425 | } |
426 | + | ||
427 | + builder.matchIPDst(ip4Prefix); | ||
428 | + break; | ||
429 | + case TCP_SRC: | ||
430 | + builder.matchTcpSrc((short) match.get(MatchField.TCP_SRC).getPort()); | ||
424 | break; | 431 | break; |
425 | case TCP_DST: | 432 | case TCP_DST: |
426 | builder.matchTcpDst((short) match.get(MatchField.TCP_DST).getPort()); | 433 | builder.matchTcpDst((short) match.get(MatchField.TCP_DST).getPort()); |
427 | break; | 434 | break; |
428 | - case TCP_SRC: | 435 | + case UDP_SRC: |
429 | - builder.matchTcpSrc((short) match.get(MatchField.TCP_SRC).getPort()); | 436 | + builder.matchUdpSrc((short) match.get(MatchField.UDP_SRC).getPort()); |
430 | break; | 437 | break; |
431 | - case MPLS_LABEL: | 438 | + case UDP_DST: |
432 | - builder.matchMplsLabel((int) match.get(MatchField.MPLS_LABEL) | 439 | + builder.matchUdpDst((short) match.get(MatchField.UDP_DST).getPort()); |
433 | - .getValue()); | ||
434 | break; | 440 | break; |
435 | - case OCH_SIGID: | 441 | + case SCTP_SRC: |
436 | - builder.matchLambda(match.get(MatchField.OCH_SIGID).getChannelNumber()); | 442 | + builder.matchSctpSrc((short) match.get(MatchField.SCTP_SRC).getPort()); |
437 | break; | 443 | break; |
438 | - case OCH_SIGTYPE: | 444 | + case SCTP_DST: |
439 | - builder.matchOpticalSignalType(match.get(MatchField | 445 | + builder.matchSctpDst((short) match.get(MatchField.SCTP_DST).getPort()); |
440 | - .OCH_SIGTYPE).getValue()); | ||
441 | break; | 446 | break; |
442 | - case IPV6_DST: | 447 | + case ICMPV4_TYPE: |
443 | - Ip6Prefix dipv6; | 448 | + byte icmpType = (byte) match.get(MatchField.ICMPV4_TYPE).getType(); |
444 | - if (match.isPartiallyMasked(MatchField.IPV6_DST)) { | 449 | + builder.matchIcmpType(icmpType); |
445 | - Masked<IPv6Address> maskedIp = match.getMasked(MatchField.IPV6_DST); | 450 | + break; |
446 | - dipv6 = Ip6Prefix.valueOf( | 451 | + case ICMPV4_CODE: |
452 | + byte icmpCode = (byte) match.get(MatchField.ICMPV4_CODE).getCode(); | ||
453 | + builder.matchIcmpCode(icmpCode); | ||
454 | + break; | ||
455 | + case IPV6_SRC: | ||
456 | + if (match.isPartiallyMasked(MatchField.IPV6_SRC)) { | ||
457 | + Masked<IPv6Address> maskedIp = match.getMasked(MatchField.IPV6_SRC); | ||
458 | + ip6Prefix = Ip6Prefix.valueOf( | ||
447 | maskedIp.getValue().getBytes(), | 459 | maskedIp.getValue().getBytes(), |
448 | maskedIp.getMask().asCidrMaskLength()); | 460 | maskedIp.getMask().asCidrMaskLength()); |
449 | } else { | 461 | } else { |
450 | - dipv6 = Ip6Prefix.valueOf( | 462 | + ip6Prefix = Ip6Prefix.valueOf( |
451 | - match.get(MatchField.IPV6_DST).getBytes(), | 463 | + match.get(MatchField.IPV6_SRC).getBytes(), |
452 | Ip6Prefix.MAX_MASK_LENGTH); | 464 | Ip6Prefix.MAX_MASK_LENGTH); |
453 | } | 465 | } |
454 | - builder.matchIPv6Dst(dipv6); | 466 | + builder.matchIPv6Src(ip6Prefix); |
455 | break; | 467 | break; |
456 | - case IPV6_SRC: | 468 | + case IPV6_DST: |
457 | - Ip6Prefix sipv6; | 469 | + if (match.isPartiallyMasked(MatchField.IPV6_DST)) { |
458 | - if (match.isPartiallyMasked(MatchField.IPV6_SRC)) { | 470 | + Masked<IPv6Address> maskedIp = match.getMasked(MatchField.IPV6_DST); |
459 | - Masked<IPv6Address> maskedIp = match.getMasked(MatchField.IPV6_SRC); | 471 | + ip6Prefix = Ip6Prefix.valueOf( |
460 | - sipv6 = Ip6Prefix.valueOf( | ||
461 | maskedIp.getValue().getBytes(), | 472 | maskedIp.getValue().getBytes(), |
462 | maskedIp.getMask().asCidrMaskLength()); | 473 | maskedIp.getMask().asCidrMaskLength()); |
463 | } else { | 474 | } else { |
464 | - sipv6 = Ip6Prefix.valueOf( | 475 | + ip6Prefix = Ip6Prefix.valueOf( |
465 | - match.get(MatchField.IPV6_SRC).getBytes(), | 476 | + match.get(MatchField.IPV6_DST).getBytes(), |
466 | Ip6Prefix.MAX_MASK_LENGTH); | 477 | Ip6Prefix.MAX_MASK_LENGTH); |
467 | } | 478 | } |
468 | - builder.matchIPv6Src(sipv6); | 479 | + builder.matchIPv6Dst(ip6Prefix); |
480 | + break; | ||
481 | + case IPV6_FLABEL: | ||
482 | + int flowLabel = | ||
483 | + match.get(MatchField.IPV6_FLABEL).getIPv6FlowLabelValue(); | ||
484 | + builder.matchIPv6FlowLabel(flowLabel); | ||
469 | break; | 485 | break; |
470 | case ICMPV6_TYPE: | 486 | case ICMPV6_TYPE: |
471 | byte icmpv6type = (byte) match.get(MatchField.ICMPV6_TYPE).getValue(); | 487 | byte icmpv6type = (byte) match.get(MatchField.ICMPV6_TYPE).getValue(); |
... | @@ -475,27 +491,41 @@ public class FlowEntryBuilder { | ... | @@ -475,27 +491,41 @@ public class FlowEntryBuilder { |
475 | byte icmpv6code = (byte) match.get(MatchField.ICMPV6_CODE).getValue(); | 491 | byte icmpv6code = (byte) match.get(MatchField.ICMPV6_CODE).getValue(); |
476 | builder.matchIcmpv6Code(icmpv6code); | 492 | builder.matchIcmpv6Code(icmpv6code); |
477 | break; | 493 | break; |
494 | + case IPV6_ND_TARGET: | ||
495 | + ip6Address = | ||
496 | + Ip6Address.valueOf(match.get(MatchField.IPV6_ND_TARGET).getBytes()); | ||
497 | + builder.matchIPv6NDTargetAddress(ip6Address); | ||
498 | + break; | ||
499 | + case IPV6_ND_SLL: | ||
500 | + mac = MacAddress.valueOf(match.get(MatchField.IPV6_ND_SLL).getLong()); | ||
501 | + builder.matchIPv6NDSourceLinkLayerAddress(mac); | ||
502 | + break; | ||
503 | + case IPV6_ND_TLL: | ||
504 | + mac = MacAddress.valueOf(match.get(MatchField.IPV6_ND_TLL).getLong()); | ||
505 | + builder.matchIPv6NDTargetLinkLayerAddress(mac); | ||
506 | + break; | ||
507 | + case MPLS_LABEL: | ||
508 | + builder.matchMplsLabel((int) match.get(MatchField.MPLS_LABEL) | ||
509 | + .getValue()); | ||
510 | + break; | ||
511 | + case OCH_SIGID: | ||
512 | + builder.matchLambda(match.get(MatchField.OCH_SIGID).getChannelNumber()); | ||
513 | + break; | ||
514 | + case OCH_SIGTYPE: | ||
515 | + builder.matchOpticalSignalType(match.get(MatchField | ||
516 | + .OCH_SIGTYPE).getValue()); | ||
517 | + break; | ||
478 | case ARP_OP: | 518 | case ARP_OP: |
479 | case ARP_SHA: | 519 | case ARP_SHA: |
480 | case ARP_SPA: | 520 | case ARP_SPA: |
481 | case ARP_THA: | 521 | case ARP_THA: |
482 | case ARP_TPA: | 522 | case ARP_TPA: |
483 | - case ICMPV4_CODE: | ||
484 | - case ICMPV4_TYPE: | ||
485 | case IN_PHY_PORT: | 523 | case IN_PHY_PORT: |
486 | - case IPV6_FLABEL: | ||
487 | - case IPV6_ND_SLL: | ||
488 | - case IPV6_ND_TARGET: | ||
489 | - case IPV6_ND_TLL: | ||
490 | case IP_DSCP: | 524 | case IP_DSCP: |
491 | case IP_ECN: | 525 | case IP_ECN: |
492 | case METADATA: | 526 | case METADATA: |
493 | case MPLS_TC: | 527 | case MPLS_TC: |
494 | - case SCTP_DST: | ||
495 | - case SCTP_SRC: | ||
496 | case TUNNEL_ID: | 528 | case TUNNEL_ID: |
497 | - case UDP_DST: | ||
498 | - case UDP_SRC: | ||
499 | default: | 529 | default: |
500 | log.warn("Match type {} not yet implemented.", field.id); | 530 | log.warn("Match type {} not yet implemented.", field.id); |
501 | } | 531 | } | ... | ... |
... | @@ -25,13 +25,20 @@ import org.onosproject.net.flow.TrafficSelector; | ... | @@ -25,13 +25,20 @@ import org.onosproject.net.flow.TrafficSelector; |
25 | import org.onosproject.net.flow.criteria.Criteria; | 25 | import org.onosproject.net.flow.criteria.Criteria; |
26 | import org.onosproject.net.flow.criteria.Criteria.EthCriterion; | 26 | import org.onosproject.net.flow.criteria.Criteria.EthCriterion; |
27 | import org.onosproject.net.flow.criteria.Criteria.EthTypeCriterion; | 27 | import org.onosproject.net.flow.criteria.Criteria.EthTypeCriterion; |
28 | -import org.onosproject.net.flow.criteria.Criteria.IPCriterion; | 28 | +import org.onosproject.net.flow.criteria.Criteria.IcmpCodeCriterion; |
29 | -import org.onosproject.net.flow.criteria.Criteria.IPProtocolCriterion; | 29 | +import org.onosproject.net.flow.criteria.Criteria.IcmpTypeCriterion; |
30 | import org.onosproject.net.flow.criteria.Criteria.Icmpv6CodeCriterion; | 30 | import org.onosproject.net.flow.criteria.Criteria.Icmpv6CodeCriterion; |
31 | import org.onosproject.net.flow.criteria.Criteria.Icmpv6TypeCriterion; | 31 | import org.onosproject.net.flow.criteria.Criteria.Icmpv6TypeCriterion; |
32 | +import org.onosproject.net.flow.criteria.Criteria.IPCriterion; | ||
33 | +import org.onosproject.net.flow.criteria.Criteria.IPProtocolCriterion; | ||
34 | +import org.onosproject.net.flow.criteria.Criteria.IPv6FlowLabelCriterion; | ||
35 | +import org.onosproject.net.flow.criteria.Criteria.IPv6NDLinkLayerAddressCriterion; | ||
36 | +import org.onosproject.net.flow.criteria.Criteria.IPv6NDTargetAddressCriterion; | ||
32 | import org.onosproject.net.flow.criteria.Criteria.LambdaCriterion; | 37 | import org.onosproject.net.flow.criteria.Criteria.LambdaCriterion; |
33 | import org.onosproject.net.flow.criteria.Criteria.PortCriterion; | 38 | import org.onosproject.net.flow.criteria.Criteria.PortCriterion; |
39 | +import org.onosproject.net.flow.criteria.Criteria.SctpPortCriterion; | ||
34 | import org.onosproject.net.flow.criteria.Criteria.TcpPortCriterion; | 40 | import org.onosproject.net.flow.criteria.Criteria.TcpPortCriterion; |
41 | +import org.onosproject.net.flow.criteria.Criteria.UdpPortCriterion; | ||
35 | import org.onosproject.net.flow.criteria.Criteria.VlanIdCriterion; | 42 | import org.onosproject.net.flow.criteria.Criteria.VlanIdCriterion; |
36 | import org.onosproject.net.flow.criteria.Criteria.VlanPcpCriterion; | 43 | import org.onosproject.net.flow.criteria.Criteria.VlanPcpCriterion; |
37 | import org.onosproject.net.flow.criteria.Criterion; | 44 | import org.onosproject.net.flow.criteria.Criterion; |
... | @@ -43,8 +50,11 @@ import org.projectfloodlight.openflow.protocol.match.Match; | ... | @@ -43,8 +50,11 @@ import org.projectfloodlight.openflow.protocol.match.Match; |
43 | import org.projectfloodlight.openflow.protocol.match.MatchField; | 50 | import org.projectfloodlight.openflow.protocol.match.MatchField; |
44 | import org.projectfloodlight.openflow.types.CircuitSignalID; | 51 | import org.projectfloodlight.openflow.types.CircuitSignalID; |
45 | import org.projectfloodlight.openflow.types.EthType; | 52 | import org.projectfloodlight.openflow.types.EthType; |
53 | +import org.projectfloodlight.openflow.types.ICMPv4Code; | ||
54 | +import org.projectfloodlight.openflow.types.ICMPv4Type; | ||
46 | import org.projectfloodlight.openflow.types.IPv4Address; | 55 | import org.projectfloodlight.openflow.types.IPv4Address; |
47 | import org.projectfloodlight.openflow.types.IPv6Address; | 56 | import org.projectfloodlight.openflow.types.IPv6Address; |
57 | +import org.projectfloodlight.openflow.types.IPv6FlowLabel; | ||
48 | import org.projectfloodlight.openflow.types.IpProtocol; | 58 | import org.projectfloodlight.openflow.types.IpProtocol; |
49 | import org.projectfloodlight.openflow.types.MacAddress; | 59 | import org.projectfloodlight.openflow.types.MacAddress; |
50 | import org.projectfloodlight.openflow.types.Masked; | 60 | import org.projectfloodlight.openflow.types.Masked; |
... | @@ -135,168 +145,223 @@ public abstract class FlowModBuilder { | ... | @@ -135,168 +145,223 @@ public abstract class FlowModBuilder { |
135 | * | 145 | * |
136 | * @return the match | 146 | * @return the match |
137 | */ | 147 | */ |
148 | + // CHECKSTYLE IGNORE MethodLength FOR NEXT 300 LINES | ||
138 | protected Match buildMatch() { | 149 | protected Match buildMatch() { |
139 | Match.Builder mBuilder = factory.buildMatch(); | 150 | Match.Builder mBuilder = factory.buildMatch(); |
140 | - EthCriterion eth; | 151 | + Ip6Address ip6Address; |
141 | - IPCriterion ip; | ||
142 | Ip4Prefix ip4Prefix; | 152 | Ip4Prefix ip4Prefix; |
143 | Ip6Prefix ip6Prefix; | 153 | Ip6Prefix ip6Prefix; |
144 | - TcpPortCriterion tp; | 154 | + EthCriterion ethCriterion; |
155 | + IPCriterion ipCriterion; | ||
156 | + TcpPortCriterion tcpPortCriterion; | ||
157 | + UdpPortCriterion udpPortCriterion; | ||
158 | + SctpPortCriterion sctpPortCriterion; | ||
159 | + IPv6NDLinkLayerAddressCriterion llAddressCriterion; | ||
160 | + | ||
145 | for (Criterion c : selector.criteria()) { | 161 | for (Criterion c : selector.criteria()) { |
146 | switch (c.type()) { | 162 | switch (c.type()) { |
147 | case IN_PORT: | 163 | case IN_PORT: |
148 | PortCriterion inport = (PortCriterion) c; | 164 | PortCriterion inport = (PortCriterion) c; |
149 | mBuilder.setExact(MatchField.IN_PORT, OFPort.of((int) inport.port().toLong())); | 165 | mBuilder.setExact(MatchField.IN_PORT, OFPort.of((int) inport.port().toLong())); |
150 | break; | 166 | break; |
151 | - case ETH_SRC: | ||
152 | - eth = (EthCriterion) c; | ||
153 | - mBuilder.setExact(MatchField.ETH_SRC, MacAddress.of(eth.mac().toLong())); | ||
154 | - break; | ||
155 | case ETH_DST: | 167 | case ETH_DST: |
156 | - eth = (EthCriterion) c; | 168 | + ethCriterion = (EthCriterion) c; |
157 | - mBuilder.setExact(MatchField.ETH_DST, MacAddress.of(eth.mac().toLong())); | 169 | + mBuilder.setExact(MatchField.ETH_DST, |
170 | + MacAddress.of(ethCriterion.mac().toLong())); | ||
171 | + break; | ||
172 | + case ETH_SRC: | ||
173 | + ethCriterion = (EthCriterion) c; | ||
174 | + mBuilder.setExact(MatchField.ETH_SRC, | ||
175 | + MacAddress.of(ethCriterion.mac().toLong())); | ||
158 | break; | 176 | break; |
159 | case ETH_TYPE: | 177 | case ETH_TYPE: |
160 | EthTypeCriterion ethType = (EthTypeCriterion) c; | 178 | EthTypeCriterion ethType = (EthTypeCriterion) c; |
161 | mBuilder.setExact(MatchField.ETH_TYPE, EthType.of(ethType.ethType())); | 179 | mBuilder.setExact(MatchField.ETH_TYPE, EthType.of(ethType.ethType())); |
162 | break; | 180 | break; |
163 | - case IPV4_DST: | 181 | + case VLAN_VID: |
164 | - ip = (IPCriterion) c; | 182 | + VlanIdCriterion vid = (VlanIdCriterion) c; |
165 | - ip4Prefix = ip.ip().getIp4Prefix(); | 183 | + |
184 | + if (vid.vlanId().equals(VlanId.ANY)) { | ||
185 | + mBuilder.setMasked(MatchField.VLAN_VID, OFVlanVidMatch.PRESENT, | ||
186 | + OFVlanVidMatch.PRESENT); | ||
187 | + } else { | ||
188 | + mBuilder.setExact(MatchField.VLAN_VID, | ||
189 | + OFVlanVidMatch.ofVlanVid(VlanVid.ofVlan(vid.vlanId().toShort()))); | ||
190 | + } | ||
191 | + break; | ||
192 | + case VLAN_PCP: | ||
193 | + VlanPcpCriterion vpcp = (VlanPcpCriterion) c; | ||
194 | + mBuilder.setExact(MatchField.VLAN_PCP, VlanPcp.of(vpcp.priority())); | ||
195 | + break; | ||
196 | + case IP_PROTO: | ||
197 | + IPProtocolCriterion p = (IPProtocolCriterion) c; | ||
198 | + mBuilder.setExact(MatchField.IP_PROTO, IpProtocol.of(p.protocol())); | ||
199 | + break; | ||
200 | + case IPV4_SRC: | ||
201 | + ipCriterion = (IPCriterion) c; | ||
202 | + ip4Prefix = ipCriterion.ip().getIp4Prefix(); | ||
166 | if (ip4Prefix.prefixLength() != Ip4Prefix.MAX_MASK_LENGTH) { | 203 | if (ip4Prefix.prefixLength() != Ip4Prefix.MAX_MASK_LENGTH) { |
167 | Ip4Address maskAddr = | 204 | Ip4Address maskAddr = |
168 | Ip4Address.makeMaskPrefix(ip4Prefix.prefixLength()); | 205 | Ip4Address.makeMaskPrefix(ip4Prefix.prefixLength()); |
169 | Masked<IPv4Address> maskedIp = | 206 | Masked<IPv4Address> maskedIp = |
170 | Masked.of(IPv4Address.of(ip4Prefix.address().toInt()), | 207 | Masked.of(IPv4Address.of(ip4Prefix.address().toInt()), |
171 | IPv4Address.of(maskAddr.toInt())); | 208 | IPv4Address.of(maskAddr.toInt())); |
172 | - mBuilder.setMasked(MatchField.IPV4_DST, maskedIp); | 209 | + mBuilder.setMasked(MatchField.IPV4_SRC, maskedIp); |
173 | } else { | 210 | } else { |
174 | - mBuilder.setExact(MatchField.IPV4_DST, | 211 | + mBuilder.setExact(MatchField.IPV4_SRC, |
175 | IPv4Address.of(ip4Prefix.address().toInt())); | 212 | IPv4Address.of(ip4Prefix.address().toInt())); |
176 | } | 213 | } |
177 | break; | 214 | break; |
178 | - case IPV4_SRC: | 215 | + case IPV4_DST: |
179 | - ip = (IPCriterion) c; | 216 | + ipCriterion = (IPCriterion) c; |
180 | - ip4Prefix = ip.ip().getIp4Prefix(); | 217 | + ip4Prefix = ipCriterion.ip().getIp4Prefix(); |
181 | if (ip4Prefix.prefixLength() != Ip4Prefix.MAX_MASK_LENGTH) { | 218 | if (ip4Prefix.prefixLength() != Ip4Prefix.MAX_MASK_LENGTH) { |
182 | Ip4Address maskAddr = | 219 | Ip4Address maskAddr = |
183 | Ip4Address.makeMaskPrefix(ip4Prefix.prefixLength()); | 220 | Ip4Address.makeMaskPrefix(ip4Prefix.prefixLength()); |
184 | Masked<IPv4Address> maskedIp = | 221 | Masked<IPv4Address> maskedIp = |
185 | Masked.of(IPv4Address.of(ip4Prefix.address().toInt()), | 222 | Masked.of(IPv4Address.of(ip4Prefix.address().toInt()), |
186 | IPv4Address.of(maskAddr.toInt())); | 223 | IPv4Address.of(maskAddr.toInt())); |
187 | - mBuilder.setMasked(MatchField.IPV4_SRC, maskedIp); | 224 | + mBuilder.setMasked(MatchField.IPV4_DST, maskedIp); |
188 | } else { | 225 | } else { |
189 | - mBuilder.setExact(MatchField.IPV4_SRC, | 226 | + mBuilder.setExact(MatchField.IPV4_DST, |
190 | IPv4Address.of(ip4Prefix.address().toInt())); | 227 | IPv4Address.of(ip4Prefix.address().toInt())); |
191 | } | 228 | } |
192 | break; | 229 | break; |
193 | - case IP_PROTO: | 230 | + case TCP_SRC: |
194 | - IPProtocolCriterion p = (IPProtocolCriterion) c; | 231 | + tcpPortCriterion = (TcpPortCriterion) c; |
195 | - mBuilder.setExact(MatchField.IP_PROTO, IpProtocol.of(p.protocol())); | 232 | + mBuilder.setExact(MatchField.TCP_SRC, |
233 | + TransportPort.of(tcpPortCriterion.tcpPort())); | ||
196 | break; | 234 | break; |
197 | - case VLAN_PCP: | 235 | + case TCP_DST: |
198 | - VlanPcpCriterion vpcp = (VlanPcpCriterion) c; | 236 | + tcpPortCriterion = (TcpPortCriterion) c; |
199 | - mBuilder.setExact(MatchField.VLAN_PCP, VlanPcp.of(vpcp.priority())); | 237 | + mBuilder.setExact(MatchField.TCP_DST, |
238 | + TransportPort.of(tcpPortCriterion.tcpPort())); | ||
200 | break; | 239 | break; |
201 | - case VLAN_VID: | 240 | + case UDP_SRC: |
202 | - VlanIdCriterion vid = (VlanIdCriterion) c; | 241 | + udpPortCriterion = (UdpPortCriterion) c; |
203 | - | 242 | + mBuilder.setExact(MatchField.UDP_SRC, |
204 | - if (vid.vlanId().equals(VlanId.ANY)) { | 243 | + TransportPort.of(udpPortCriterion.udpPort())); |
205 | - mBuilder.setMasked(MatchField.VLAN_VID, OFVlanVidMatch.PRESENT, | ||
206 | - OFVlanVidMatch.PRESENT); | ||
207 | - } else { | ||
208 | - mBuilder.setExact(MatchField.VLAN_VID, | ||
209 | - OFVlanVidMatch.ofVlanVid(VlanVid.ofVlan(vid.vlanId().toShort()))); | ||
210 | - } | ||
211 | break; | 244 | break; |
212 | - case TCP_DST: | 245 | + case UDP_DST: |
213 | - tp = (TcpPortCriterion) c; | 246 | + udpPortCriterion = (UdpPortCriterion) c; |
214 | - mBuilder.setExact(MatchField.TCP_DST, TransportPort.of(tp.tcpPort())); | 247 | + mBuilder.setExact(MatchField.UDP_DST, |
248 | + TransportPort.of(udpPortCriterion.udpPort())); | ||
215 | break; | 249 | break; |
216 | - case TCP_SRC: | 250 | + case SCTP_SRC: |
217 | - tp = (TcpPortCriterion) c; | 251 | + sctpPortCriterion = (SctpPortCriterion) c; |
218 | - mBuilder.setExact(MatchField.TCP_SRC, TransportPort.of(tp.tcpPort())); | 252 | + mBuilder.setExact(MatchField.SCTP_SRC, |
253 | + TransportPort.of(sctpPortCriterion.sctpPort())); | ||
219 | break; | 254 | break; |
220 | - case MPLS_LABEL: | 255 | + case SCTP_DST: |
221 | - Criteria.MplsCriterion mp = (Criteria.MplsCriterion) c; | 256 | + sctpPortCriterion = (SctpPortCriterion) c; |
222 | - mBuilder.setExact(MatchField.MPLS_LABEL, | 257 | + mBuilder.setExact(MatchField.SCTP_DST, |
223 | - U32.of(mp.label().intValue())); | 258 | + TransportPort.of(sctpPortCriterion.sctpPort())); |
224 | break; | 259 | break; |
225 | - case OCH_SIGID: | 260 | + case ICMPV4_TYPE: |
226 | - LambdaCriterion lc = (LambdaCriterion) c; | 261 | + IcmpTypeCriterion icmpType = (IcmpTypeCriterion) c; |
227 | - mBuilder.setExact(MatchField.OCH_SIGID, | 262 | + mBuilder.setExact(MatchField.ICMPV4_TYPE, |
228 | - new CircuitSignalID((byte) 1, (byte) 2, lc.lambda(), (short) 1)); | 263 | + ICMPv4Type.of(icmpType.icmpType())); |
229 | break; | 264 | break; |
230 | - case OCH_SIGTYPE: | 265 | + case ICMPV4_CODE: |
231 | - Criteria.OpticalSignalTypeCriterion sc = | 266 | + IcmpCodeCriterion icmpCode = (IcmpCodeCriterion) c; |
232 | - (Criteria.OpticalSignalTypeCriterion) c; | 267 | + mBuilder.setExact(MatchField.ICMPV4_CODE, |
233 | - mBuilder.setExact(MatchField.OCH_SIGTYPE, | 268 | + ICMPv4Code.of(icmpCode.icmpCode())); |
234 | - U8.of(sc.signalType())); | ||
235 | break; | 269 | break; |
236 | - case IPV6_DST: | 270 | + case IPV6_SRC: |
237 | - ip = (IPCriterion) c; | 271 | + ipCriterion = (IPCriterion) c; |
238 | - ip6Prefix = ip.ip().getIp6Prefix(); | 272 | + ip6Prefix = ipCriterion.ip().getIp6Prefix(); |
239 | if (ip6Prefix.prefixLength() != Ip6Prefix.MAX_MASK_LENGTH) { | 273 | if (ip6Prefix.prefixLength() != Ip6Prefix.MAX_MASK_LENGTH) { |
240 | Ip6Address maskAddr = | 274 | Ip6Address maskAddr = |
241 | Ip6Address.makeMaskPrefix(ip6Prefix.prefixLength()); | 275 | Ip6Address.makeMaskPrefix(ip6Prefix.prefixLength()); |
242 | Masked<IPv6Address> maskedIp = | 276 | Masked<IPv6Address> maskedIp = |
243 | Masked.of(IPv6Address.of(ip6Prefix.address().toString()), | 277 | Masked.of(IPv6Address.of(ip6Prefix.address().toString()), |
244 | IPv6Address.of(maskAddr.toString())); | 278 | IPv6Address.of(maskAddr.toString())); |
245 | - mBuilder.setMasked(MatchField.IPV6_DST, maskedIp); | 279 | + mBuilder.setMasked(MatchField.IPV6_SRC, maskedIp); |
246 | } else { | 280 | } else { |
247 | - mBuilder.setExact(MatchField.IPV6_DST, | 281 | + mBuilder.setExact(MatchField.IPV6_SRC, |
248 | IPv6Address.of(ip6Prefix.address().toString())); | 282 | IPv6Address.of(ip6Prefix.address().toString())); |
249 | } | 283 | } |
250 | break; | 284 | break; |
251 | - case IPV6_SRC: | 285 | + case IPV6_DST: |
252 | - ip = (IPCriterion) c; | 286 | + ipCriterion = (IPCriterion) c; |
253 | - ip6Prefix = ip.ip().getIp6Prefix(); | 287 | + ip6Prefix = ipCriterion.ip().getIp6Prefix(); |
254 | if (ip6Prefix.prefixLength() != Ip6Prefix.MAX_MASK_LENGTH) { | 288 | if (ip6Prefix.prefixLength() != Ip6Prefix.MAX_MASK_LENGTH) { |
255 | Ip6Address maskAddr = | 289 | Ip6Address maskAddr = |
256 | Ip6Address.makeMaskPrefix(ip6Prefix.prefixLength()); | 290 | Ip6Address.makeMaskPrefix(ip6Prefix.prefixLength()); |
257 | Masked<IPv6Address> maskedIp = | 291 | Masked<IPv6Address> maskedIp = |
258 | Masked.of(IPv6Address.of(ip6Prefix.address().toString()), | 292 | Masked.of(IPv6Address.of(ip6Prefix.address().toString()), |
259 | IPv6Address.of(maskAddr.toString())); | 293 | IPv6Address.of(maskAddr.toString())); |
260 | - mBuilder.setMasked(MatchField.IPV6_SRC, maskedIp); | 294 | + mBuilder.setMasked(MatchField.IPV6_DST, maskedIp); |
261 | } else { | 295 | } else { |
262 | - mBuilder.setExact(MatchField.IPV6_SRC, | 296 | + mBuilder.setExact(MatchField.IPV6_DST, |
263 | IPv6Address.of(ip6Prefix.address().toString())); | 297 | IPv6Address.of(ip6Prefix.address().toString())); |
264 | } | 298 | } |
265 | break; | 299 | break; |
300 | + case IPV6_FLABEL: | ||
301 | + IPv6FlowLabelCriterion flowLabelCriterion = | ||
302 | + (IPv6FlowLabelCriterion) c; | ||
303 | + mBuilder.setExact(MatchField.IPV6_FLABEL, | ||
304 | + IPv6FlowLabel.of(flowLabelCriterion.flowLabel())); | ||
305 | + break; | ||
266 | case ICMPV6_TYPE: | 306 | case ICMPV6_TYPE: |
267 | - Icmpv6TypeCriterion icmpv6type = (Icmpv6TypeCriterion) c; | 307 | + Icmpv6TypeCriterion icmpv6Type = (Icmpv6TypeCriterion) c; |
268 | mBuilder.setExact(MatchField.ICMPV6_TYPE, | 308 | mBuilder.setExact(MatchField.ICMPV6_TYPE, |
269 | - U8.of(icmpv6type.icmpv6Type().byteValue())); | 309 | + U8.of(icmpv6Type.icmpv6Type().byteValue())); |
270 | break; | 310 | break; |
271 | case ICMPV6_CODE: | 311 | case ICMPV6_CODE: |
272 | - Icmpv6CodeCriterion icmpv6code = (Icmpv6CodeCriterion) c; | 312 | + Icmpv6CodeCriterion icmpv6Code = (Icmpv6CodeCriterion) c; |
273 | mBuilder.setExact(MatchField.ICMPV6_CODE, | 313 | mBuilder.setExact(MatchField.ICMPV6_CODE, |
274 | - U8.of(icmpv6code.icmpv6Code().byteValue())); | 314 | + U8.of(icmpv6Code.icmpv6Code().byteValue())); |
315 | + break; | ||
316 | + case IPV6_ND_TARGET: | ||
317 | + IPv6NDTargetAddressCriterion targetAddressCriterion = | ||
318 | + (IPv6NDTargetAddressCriterion) c; | ||
319 | + ip6Address = targetAddressCriterion.targetAddress(); | ||
320 | + mBuilder.setExact(MatchField.IPV6_ND_TARGET, | ||
321 | + IPv6Address.of(ip6Address.toOctets())); | ||
322 | + break; | ||
323 | + case IPV6_ND_SLL: | ||
324 | + llAddressCriterion = | ||
325 | + (IPv6NDLinkLayerAddressCriterion) c; | ||
326 | + mBuilder.setExact(MatchField.IPV6_ND_SLL, | ||
327 | + MacAddress.of(llAddressCriterion.mac().toLong())); | ||
328 | + break; | ||
329 | + case IPV6_ND_TLL: | ||
330 | + llAddressCriterion = | ||
331 | + (IPv6NDLinkLayerAddressCriterion) c; | ||
332 | + mBuilder.setExact(MatchField.IPV6_ND_TLL, | ||
333 | + MacAddress.of(llAddressCriterion.mac().toLong())); | ||
334 | + break; | ||
335 | + case MPLS_LABEL: | ||
336 | + Criteria.MplsCriterion mp = (Criteria.MplsCriterion) c; | ||
337 | + mBuilder.setExact(MatchField.MPLS_LABEL, | ||
338 | + U32.of(mp.label().intValue())); | ||
339 | + break; | ||
340 | + case OCH_SIGID: | ||
341 | + LambdaCriterion lc = (LambdaCriterion) c; | ||
342 | + mBuilder.setExact(MatchField.OCH_SIGID, | ||
343 | + new CircuitSignalID((byte) 1, (byte) 2, lc.lambda(), (short) 1)); | ||
344 | + break; | ||
345 | + case OCH_SIGTYPE: | ||
346 | + Criteria.OpticalSignalTypeCriterion sc = | ||
347 | + (Criteria.OpticalSignalTypeCriterion) c; | ||
348 | + mBuilder.setExact(MatchField.OCH_SIGTYPE, | ||
349 | + U8.of(sc.signalType())); | ||
275 | break; | 350 | break; |
276 | case ARP_OP: | 351 | case ARP_OP: |
277 | case ARP_SHA: | 352 | case ARP_SHA: |
278 | case ARP_SPA: | 353 | case ARP_SPA: |
279 | case ARP_THA: | 354 | case ARP_THA: |
280 | case ARP_TPA: | 355 | case ARP_TPA: |
281 | - case ICMPV4_CODE: | ||
282 | - case ICMPV4_TYPE: | ||
283 | case IN_PHY_PORT: | 356 | case IN_PHY_PORT: |
284 | case IPV6_EXTHDR: | 357 | case IPV6_EXTHDR: |
285 | - case IPV6_FLABEL: | ||
286 | - case IPV6_ND_SLL: | ||
287 | - case IPV6_ND_TARGET: | ||
288 | - case IPV6_ND_TLL: | ||
289 | case IP_DSCP: | 358 | case IP_DSCP: |
290 | case IP_ECN: | 359 | case IP_ECN: |
291 | case METADATA: | 360 | case METADATA: |
292 | case MPLS_BOS: | 361 | case MPLS_BOS: |
293 | case MPLS_TC: | 362 | case MPLS_TC: |
294 | case PBB_ISID: | 363 | case PBB_ISID: |
295 | - case SCTP_DST: | ||
296 | - case SCTP_SRC: | ||
297 | case TUNNEL_ID: | 364 | case TUNNEL_ID: |
298 | - case UDP_DST: | ||
299 | - case UDP_SRC: | ||
300 | default: | 365 | default: |
301 | log.warn("Match type {} not yet implemented.", c.type()); | 366 | log.warn("Match type {} not yet implemented.", c.type()); |
302 | } | 367 | } | ... | ... |
... | @@ -44,11 +44,11 @@ public class CriterionCodec extends JsonCodec<Criterion> { | ... | @@ -44,11 +44,11 @@ public class CriterionCodec extends JsonCodec<Criterion> { |
44 | 44 | ||
45 | case IN_PORT: | 45 | case IN_PORT: |
46 | final Criteria.PortCriterion portCriterion = (Criteria.PortCriterion) criterion; | 46 | final Criteria.PortCriterion portCriterion = (Criteria.PortCriterion) criterion; |
47 | - result.put("tcpPort", portCriterion.port().toLong()); | 47 | + result.put("port", portCriterion.port().toLong()); |
48 | break; | 48 | break; |
49 | 49 | ||
50 | - case ETH_SRC: | ||
51 | case ETH_DST: | 50 | case ETH_DST: |
51 | + case ETH_SRC: | ||
52 | final Criteria.EthCriterion ethCriterion = (Criteria.EthCriterion) criterion; | 52 | final Criteria.EthCriterion ethCriterion = (Criteria.EthCriterion) criterion; |
53 | result.put("mac", ethCriterion.mac().toString()); | 53 | result.put("mac", ethCriterion.mac().toString()); |
54 | break; | 54 | break; |
... | @@ -59,18 +59,10 @@ public class CriterionCodec extends JsonCodec<Criterion> { | ... | @@ -59,18 +59,10 @@ public class CriterionCodec extends JsonCodec<Criterion> { |
59 | result.put("ethType", ethTypeCriterion.ethType()); | 59 | result.put("ethType", ethTypeCriterion.ethType()); |
60 | break; | 60 | break; |
61 | 61 | ||
62 | - case IPV4_SRC: | 62 | + case VLAN_VID: |
63 | - case IPV6_SRC: | 63 | + final Criteria.VlanIdCriterion vlanIdCriterion = |
64 | - case IPV4_DST: | 64 | + (Criteria.VlanIdCriterion) criterion; |
65 | - case IPV6_DST: | 65 | + result.put("vlanId", vlanIdCriterion.vlanId().toShort()); |
66 | - final Criteria.IPCriterion iPCriterion = (Criteria.IPCriterion) criterion; | ||
67 | - result.put("ip", iPCriterion.ip().toString()); | ||
68 | - break; | ||
69 | - | ||
70 | - case IP_PROTO: | ||
71 | - final Criteria.IPProtocolCriterion iPProtocolCriterion = | ||
72 | - (Criteria.IPProtocolCriterion) criterion; | ||
73 | - result.put("protocol", iPProtocolCriterion.protocol()); | ||
74 | break; | 66 | break; |
75 | 67 | ||
76 | case VLAN_PCP: | 68 | case VLAN_PCP: |
... | @@ -79,10 +71,18 @@ public class CriterionCodec extends JsonCodec<Criterion> { | ... | @@ -79,10 +71,18 @@ public class CriterionCodec extends JsonCodec<Criterion> { |
79 | result.put("priority", vlanPcpCriterion.priority()); | 71 | result.put("priority", vlanPcpCriterion.priority()); |
80 | break; | 72 | break; |
81 | 73 | ||
82 | - case VLAN_VID: | 74 | + case IP_PROTO: |
83 | - final Criteria.VlanIdCriterion vlanIdCriterion = | 75 | + final Criteria.IPProtocolCriterion iPProtocolCriterion = |
84 | - (Criteria.VlanIdCriterion) criterion; | 76 | + (Criteria.IPProtocolCriterion) criterion; |
85 | - result.put("vlanId", vlanIdCriterion.vlanId().toShort()); | 77 | + result.put("protocol", iPProtocolCriterion.protocol()); |
78 | + break; | ||
79 | + | ||
80 | + case IPV4_SRC: | ||
81 | + case IPV4_DST: | ||
82 | + case IPV6_SRC: | ||
83 | + case IPV6_DST: | ||
84 | + final Criteria.IPCriterion iPCriterion = (Criteria.IPCriterion) criterion; | ||
85 | + result.put("ip", iPCriterion.ip().toString()); | ||
86 | break; | 86 | break; |
87 | 87 | ||
88 | case TCP_SRC: | 88 | case TCP_SRC: |
... | @@ -92,6 +92,67 @@ public class CriterionCodec extends JsonCodec<Criterion> { | ... | @@ -92,6 +92,67 @@ public class CriterionCodec extends JsonCodec<Criterion> { |
92 | result.put("tcpPort", tcpPortCriterion.tcpPort().byteValue()); | 92 | result.put("tcpPort", tcpPortCriterion.tcpPort().byteValue()); |
93 | break; | 93 | break; |
94 | 94 | ||
95 | + case UDP_SRC: | ||
96 | + case UDP_DST: | ||
97 | + final Criteria.UdpPortCriterion udpPortCriterion = | ||
98 | + (Criteria.UdpPortCriterion) criterion; | ||
99 | + result.put("udpPort", udpPortCriterion.udpPort().byteValue()); | ||
100 | + break; | ||
101 | + | ||
102 | + case SCTP_SRC: | ||
103 | + case SCTP_DST: | ||
104 | + final Criteria.SctpPortCriterion sctpPortCriterion = | ||
105 | + (Criteria.SctpPortCriterion) criterion; | ||
106 | + result.put("sctpPort", | ||
107 | + sctpPortCriterion.sctpPort().byteValue()); | ||
108 | + break; | ||
109 | + | ||
110 | + case ICMPV4_TYPE: | ||
111 | + final Criteria.IcmpTypeCriterion icmpTypeCriterion = | ||
112 | + (Criteria.IcmpTypeCriterion) criterion; | ||
113 | + result.put("icmpType", icmpTypeCriterion.icmpType()); | ||
114 | + break; | ||
115 | + | ||
116 | + case ICMPV4_CODE: | ||
117 | + final Criteria.IcmpCodeCriterion icmpCodeCriterion = | ||
118 | + (Criteria.IcmpCodeCriterion) criterion; | ||
119 | + result.put("icmpCode", icmpCodeCriterion.icmpCode()); | ||
120 | + break; | ||
121 | + | ||
122 | + case IPV6_FLABEL: | ||
123 | + final Criteria.IPv6FlowLabelCriterion ipv6FlowLabelCriterion = | ||
124 | + (Criteria.IPv6FlowLabelCriterion) criterion; | ||
125 | + result.put("flowLabel", | ||
126 | + ipv6FlowLabelCriterion.flowLabel()); | ||
127 | + break; | ||
128 | + | ||
129 | + case ICMPV6_TYPE: | ||
130 | + final Criteria.Icmpv6TypeCriterion icmpv6TypeCriterion = | ||
131 | + (Criteria.Icmpv6TypeCriterion) criterion; | ||
132 | + result.put("icmpv6Type", icmpv6TypeCriterion.icmpv6Type()); | ||
133 | + break; | ||
134 | + | ||
135 | + case ICMPV6_CODE: | ||
136 | + final Criteria.Icmpv6CodeCriterion icmpv6CodeCriterion = | ||
137 | + (Criteria.Icmpv6CodeCriterion) criterion; | ||
138 | + result.put("icmpv6Code", icmpv6CodeCriterion.icmpv6Code()); | ||
139 | + break; | ||
140 | + | ||
141 | + case IPV6_ND_TARGET: | ||
142 | + final Criteria.IPv6NDTargetAddressCriterion ipv6NDTargetAddressCriterion | ||
143 | + = (Criteria.IPv6NDTargetAddressCriterion) criterion; | ||
144 | + result.put("targetAddress", | ||
145 | + ipv6NDTargetAddressCriterion.targetAddress().toString()); | ||
146 | + break; | ||
147 | + | ||
148 | + case IPV6_ND_SLL: | ||
149 | + case IPV6_ND_TLL: | ||
150 | + final Criteria.IPv6NDLinkLayerAddressCriterion ipv6NDLinkLayerAddressCriterion | ||
151 | + = (Criteria.IPv6NDLinkLayerAddressCriterion) criterion; | ||
152 | + result.put("mac", | ||
153 | + ipv6NDLinkLayerAddressCriterion.mac().toString()); | ||
154 | + break; | ||
155 | + | ||
95 | case MPLS_LABEL: | 156 | case MPLS_LABEL: |
96 | final Criteria.MplsCriterion mplsCriterion = | 157 | final Criteria.MplsCriterion mplsCriterion = |
97 | (Criteria.MplsCriterion) criterion; | 158 | (Criteria.MplsCriterion) criterion; | ... | ... |
... | @@ -33,6 +33,7 @@ public final class CriterionJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNo | ... | @@ -33,6 +33,7 @@ public final class CriterionJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNo |
33 | criterion = criterionValue; | 33 | criterion = criterionValue; |
34 | } | 34 | } |
35 | 35 | ||
36 | + // CHECKSTYLE IGNORE MethodLength FOR NEXT 300 LINES | ||
36 | @Override | 37 | @Override |
37 | public boolean matchesSafely(JsonNode jsonCriterion, Description description) { | 38 | public boolean matchesSafely(JsonNode jsonCriterion, Description description) { |
38 | final String type = criterion.type().name(); | 39 | final String type = criterion.type().name(); |
... | @@ -54,8 +55,8 @@ public final class CriterionJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNo | ... | @@ -54,8 +55,8 @@ public final class CriterionJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNo |
54 | } | 55 | } |
55 | break; | 56 | break; |
56 | 57 | ||
57 | - case ETH_SRC: | ||
58 | case ETH_DST: | 58 | case ETH_DST: |
59 | + case ETH_SRC: | ||
59 | final Criteria.EthCriterion ethCriterion = (Criteria.EthCriterion) criterion; | 60 | final Criteria.EthCriterion ethCriterion = (Criteria.EthCriterion) criterion; |
60 | final String mac = ethCriterion.mac().toString(); | 61 | final String mac = ethCriterion.mac().toString(); |
61 | final String jsonMac = jsonCriterion.get("mac").textValue(); | 62 | final String jsonMac = jsonCriterion.get("mac").textValue(); |
... | @@ -76,15 +77,24 @@ public final class CriterionJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNo | ... | @@ -76,15 +77,24 @@ public final class CriterionJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNo |
76 | } | 77 | } |
77 | break; | 78 | break; |
78 | 79 | ||
79 | - case IPV4_SRC: | 80 | + case VLAN_VID: |
80 | - case IPV6_SRC: | 81 | + final Criteria.VlanIdCriterion vlanIdCriterion = |
81 | - case IPV4_DST: | 82 | + (Criteria.VlanIdCriterion) criterion; |
82 | - case IPV6_DST: | 83 | + final short vlanId = vlanIdCriterion.vlanId().toShort(); |
83 | - final Criteria.IPCriterion ipCriterion = (Criteria.IPCriterion) criterion; | 84 | + final short jsonVlanId = jsonCriterion.get("vlanId").shortValue(); |
84 | - final String ip = ipCriterion.ip().toString(); | 85 | + if (vlanId != jsonVlanId) { |
85 | - final String jsonIp = jsonCriterion.get("ip").textValue(); | 86 | + description.appendText("vlanId was " + Short.toString(jsonVlanId)); |
86 | - if (!ip.equals(jsonIp)) { | 87 | + return false; |
87 | - description.appendText("ip was " + jsonIp); | 88 | + } |
89 | + break; | ||
90 | + | ||
91 | + case VLAN_PCP: | ||
92 | + final Criteria.VlanPcpCriterion vlanPcpCriterion = | ||
93 | + (Criteria.VlanPcpCriterion) criterion; | ||
94 | + final byte priority = vlanPcpCriterion.priority(); | ||
95 | + final byte jsonPriority = (byte) jsonCriterion.get("priority").shortValue(); | ||
96 | + if (priority != jsonPriority) { | ||
97 | + description.appendText("priority was " + Byte.toString(jsonPriority)); | ||
88 | return false; | 98 | return false; |
89 | } | 99 | } |
90 | break; | 100 | break; |
... | @@ -100,24 +110,15 @@ public final class CriterionJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNo | ... | @@ -100,24 +110,15 @@ public final class CriterionJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNo |
100 | } | 110 | } |
101 | break; | 111 | break; |
102 | 112 | ||
103 | - case VLAN_PCP: | 113 | + case IPV4_SRC: |
104 | - final Criteria.VlanPcpCriterion vlanPcpCriterion = | 114 | + case IPV4_DST: |
105 | - (Criteria.VlanPcpCriterion) criterion; | 115 | + case IPV6_SRC: |
106 | - final byte priority = vlanPcpCriterion.priority(); | 116 | + case IPV6_DST: |
107 | - final byte jsonPriority = (byte) jsonCriterion.get("protocol").shortValue(); | 117 | + final Criteria.IPCriterion ipCriterion = (Criteria.IPCriterion) criterion; |
108 | - if (priority != jsonPriority) { | 118 | + final String ip = ipCriterion.ip().toString(); |
109 | - description.appendText("priority was " + Byte.toString(jsonPriority)); | 119 | + final String jsonIp = jsonCriterion.get("ip").textValue(); |
110 | - return false; | 120 | + if (!ip.equals(jsonIp)) { |
111 | - } | 121 | + description.appendText("ip was " + jsonIp); |
112 | - break; | ||
113 | - | ||
114 | - case VLAN_VID: | ||
115 | - final Criteria.VlanIdCriterion vlanIdCriterion = | ||
116 | - (Criteria.VlanIdCriterion) criterion; | ||
117 | - final short vlanId = vlanIdCriterion.vlanId().toShort(); | ||
118 | - final short jsonvlanId = jsonCriterion.get("vlanId").shortValue(); | ||
119 | - if (vlanId != jsonvlanId) { | ||
120 | - description.appendText("vlanId was " + Short.toString(jsonvlanId)); | ||
121 | return false; | 122 | return false; |
122 | } | 123 | } |
123 | break; | 124 | break; |
... | @@ -126,10 +127,119 @@ public final class CriterionJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNo | ... | @@ -126,10 +127,119 @@ public final class CriterionJsonMatcher extends TypeSafeDiagnosingMatcher<JsonNo |
126 | case TCP_DST: | 127 | case TCP_DST: |
127 | final Criteria.TcpPortCriterion tcpPortCriterion = | 128 | final Criteria.TcpPortCriterion tcpPortCriterion = |
128 | (Criteria.TcpPortCriterion) criterion; | 129 | (Criteria.TcpPortCriterion) criterion; |
129 | - final byte tcpPort = tcpPortCriterion.tcpPort().byteValue(); | 130 | + final short tcpPort = tcpPortCriterion.tcpPort(); |
130 | - final byte jsonTcpPort = (byte) jsonCriterion.get("tcpPort").shortValue(); | 131 | + final short jsonTcpPort = jsonCriterion.get("tcpPort").shortValue(); |
131 | if (tcpPort != jsonTcpPort) { | 132 | if (tcpPort != jsonTcpPort) { |
132 | - description.appendText("tcp port was " + Byte.toString(jsonTcpPort)); | 133 | + description.appendText("tcp port was " + Short.toString(jsonTcpPort)); |
134 | + return false; | ||
135 | + } | ||
136 | + break; | ||
137 | + | ||
138 | + case UDP_SRC: | ||
139 | + case UDP_DST: | ||
140 | + final Criteria.UdpPortCriterion udpPortCriterion = | ||
141 | + (Criteria.UdpPortCriterion) criterion; | ||
142 | + final short udpPort = udpPortCriterion.udpPort(); | ||
143 | + final short jsonUdpPort = jsonCriterion.get("udpPort").shortValue(); | ||
144 | + if (udpPort != jsonUdpPort) { | ||
145 | + description.appendText("udp port was " + Short.toString(jsonUdpPort)); | ||
146 | + return false; | ||
147 | + } | ||
148 | + break; | ||
149 | + | ||
150 | + case SCTP_SRC: | ||
151 | + case SCTP_DST: | ||
152 | + final Criteria.SctpPortCriterion sctpPortCriterion = | ||
153 | + (Criteria.SctpPortCriterion) criterion; | ||
154 | + final short sctpPort = sctpPortCriterion.sctpPort(); | ||
155 | + final short jsonSctpPort = jsonCriterion.get("sctpPort").shortValue(); | ||
156 | + if (sctpPort != jsonSctpPort) { | ||
157 | + description.appendText("sctp port was " + Short.toString(jsonSctpPort)); | ||
158 | + return false; | ||
159 | + } | ||
160 | + break; | ||
161 | + | ||
162 | + case ICMPV4_TYPE: | ||
163 | + final Criteria.IcmpTypeCriterion icmpTypeCriterion = | ||
164 | + (Criteria.IcmpTypeCriterion) criterion; | ||
165 | + final byte icmpType = icmpTypeCriterion.icmpType(); | ||
166 | + final byte jsonIcmpType = (byte) jsonCriterion.get("icmpType").shortValue(); | ||
167 | + if (icmpType != jsonIcmpType) { | ||
168 | + description.appendText("icmp type was " + Byte.toString(jsonIcmpType)); | ||
169 | + return false; | ||
170 | + } | ||
171 | + break; | ||
172 | + | ||
173 | + case ICMPV4_CODE: | ||
174 | + final Criteria.IcmpCodeCriterion icmpCodeCriterion = | ||
175 | + (Criteria.IcmpCodeCriterion) criterion; | ||
176 | + final byte icmpCode = icmpCodeCriterion.icmpCode(); | ||
177 | + final byte jsonIcmpCode = (byte) jsonCriterion.get("icmpCode").shortValue(); | ||
178 | + if (icmpCode != jsonIcmpCode) { | ||
179 | + description.appendText("icmp code was " + Byte.toString(jsonIcmpCode)); | ||
180 | + return false; | ||
181 | + } | ||
182 | + break; | ||
183 | + | ||
184 | + case IPV6_FLABEL: | ||
185 | + final Criteria.IPv6FlowLabelCriterion ipv6FlowLabelCriterion = | ||
186 | + (Criteria.IPv6FlowLabelCriterion) criterion; | ||
187 | + final int flowLabel = ipv6FlowLabelCriterion.flowLabel(); | ||
188 | + final int jsonFlowLabel = jsonCriterion.get("flowLabel").intValue(); | ||
189 | + if (flowLabel != jsonFlowLabel) { | ||
190 | + description.appendText("IPv6 flow label was " + Integer.toString(jsonFlowLabel)); | ||
191 | + return false; | ||
192 | + } | ||
193 | + break; | ||
194 | + | ||
195 | + case ICMPV6_TYPE: | ||
196 | + final Criteria.Icmpv6TypeCriterion icmpv6TypeCriterion = | ||
197 | + (Criteria.Icmpv6TypeCriterion) criterion; | ||
198 | + final byte icmpv6Type = icmpv6TypeCriterion.icmpv6Type(); | ||
199 | + final byte jsonIcmpv6Type = (byte) jsonCriterion.get("icmpv6Type").shortValue(); | ||
200 | + if (icmpv6Type != jsonIcmpv6Type) { | ||
201 | + description.appendText("icmpv6 type was " + Byte.toString(jsonIcmpv6Type)); | ||
202 | + return false; | ||
203 | + } | ||
204 | + break; | ||
205 | + | ||
206 | + case ICMPV6_CODE: | ||
207 | + final Criteria.Icmpv6CodeCriterion icmpv6CodeCriterion = | ||
208 | + (Criteria.Icmpv6CodeCriterion) criterion; | ||
209 | + final byte icmpv6Code = icmpv6CodeCriterion.icmpv6Code(); | ||
210 | + final byte jsonIcmpv6Code = (byte) jsonCriterion.get("icmpv6Code").shortValue(); | ||
211 | + if (icmpv6Code != jsonIcmpv6Code) { | ||
212 | + description.appendText("icmpv6 code was " + Byte.toString(jsonIcmpv6Code)); | ||
213 | + return false; | ||
214 | + } | ||
215 | + break; | ||
216 | + | ||
217 | + case IPV6_ND_TARGET: | ||
218 | + final Criteria.IPv6NDTargetAddressCriterion | ||
219 | + ipv6NDTargetAddressCriterion = | ||
220 | + (Criteria.IPv6NDTargetAddressCriterion) criterion; | ||
221 | + final String targetAddress = | ||
222 | + ipv6NDTargetAddressCriterion.targetAddress().toString(); | ||
223 | + final String jsonTargetAddress = | ||
224 | + jsonCriterion.get("targetAddress").textValue(); | ||
225 | + if (!targetAddress.equals(jsonTargetAddress)) { | ||
226 | + description.appendText("target address was " + | ||
227 | + jsonTargetAddress); | ||
228 | + return false; | ||
229 | + } | ||
230 | + break; | ||
231 | + | ||
232 | + case IPV6_ND_SLL: | ||
233 | + case IPV6_ND_TLL: | ||
234 | + final Criteria.IPv6NDLinkLayerAddressCriterion | ||
235 | + ipv6NDLinkLayerAddressCriterion = | ||
236 | + (Criteria.IPv6NDLinkLayerAddressCriterion) criterion; | ||
237 | + final String llAddress = | ||
238 | + ipv6NDLinkLayerAddressCriterion.mac().toString(); | ||
239 | + final String jsonLlAddress = | ||
240 | + jsonCriterion.get("mac").textValue(); | ||
241 | + if (!llAddress.equals(jsonLlAddress)) { | ||
242 | + description.appendText("mac was " + jsonLlAddress); | ||
133 | return false; | 243 | return false; |
134 | } | 244 | } |
135 | break; | 245 | break; | ... | ... |
-
Please register or login to post a comment