2 * Copyright © 2017 Ericsson, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.netvirt.sfc.classifier.utils;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertNotEquals;
13 import static org.junit.Assert.assertNotNull;
14 import static org.junit.Assert.assertNull;
15 import static org.junit.Assert.assertTrue;
17 import java.util.HashSet;
18 import java.util.List;
21 import org.junit.Test;
22 import org.opendaylight.genius.mdsalutil.NwConstants;
23 import org.opendaylight.genius.mdsalutil.packet.IPProtocols;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.acl.access.list.entries.ace.Matches;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.acl.access.list.entries.ace.MatchesBuilder;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.acl.access.list.entries.ace.matches.ace.type.AceEth;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.acl.access.list.entries.ace.matches.ace.type.AceEthBuilder;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.acl.access.list.entries.ace.matches.ace.type.AceIp;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.acl.access.list.entries.ace.matches.ace.type.AceIpBuilder;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.acl.access.list.entries.ace.matches.ace.type.ace.ip.ace.ip.version.AceIpv4;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.acl.access.list.entries.ace.matches.ace.type.ace.ip.ace.ip.version.AceIpv4Builder;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.acl.access.list.entries.ace.matches.ace.type.ace.ip.ace.ip.version.AceIpv6;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.acl.access.list.entries.ace.matches.ace.type.ace.ip.ace.ip.version.AceIpv6Builder;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Dscp;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160218.acl.transport.header.fields.DestinationPortRange;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160218.acl.transport.header.fields.DestinationPortRangeBuilder;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160218.acl.transport.header.fields.SourcePortRange;
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160218.acl.transport.header.fields.SourcePortRangeBuilder;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatch;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatch;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6Match;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralAugMatchNodesNodeTableFlow;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.NxAugMatchNodesNodeTableFlow;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.of.tcp.dst.grouping.NxmOfTcpDst;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.of.tcp.src.grouping.NxmOfTcpSrc;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.of.udp.dst.grouping.NxmOfUdpDst;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.match.rev140714.nxm.of.udp.src.grouping.NxmOfUdpSrc;
54 import org.opendaylight.yangtools.yang.common.Uint32;
55 import org.opendaylight.yangtools.yang.common.Uint8;
57 public class AclMatchesTest {
59 private static final String MAC_SRC_STR = "11:22:33:44:55:66";
60 private static final String MAC_DST_STR = "66:55:44:33:22:11";
61 private static final String IPV4_DST_STR = "10.1.2.0/24";
62 private static final String IPV4_SRC_STR = "10.1.2.3/32";
63 private static final String IPV6_DST_STR = "2001:DB8:AC10:FE01::/64";
64 private static final String IPV6_SRC_STR = "2001:db8:85a3:7334::/64";
65 private static final int TCP_SRC_LOWER_PORT = 80;
66 private static final int TCP_SRC_UPPER_PORT = 82;
67 private static final int TCP_DST_LOWER_PORT = 800;
68 private static final int TCP_DST_UPPER_PORT = 800;
69 private static final int UDP_SRC_LOWER_PORT = 90;
70 private static final int UDP_SRC_UPPER_PORT = 90;
71 private static final int UDP_DST_LOWER_PORT = 900;
72 private static final int UDP_DST_UPPER_PORT = 902;
73 private static final short DSCP_VALUE = (short) 42;
77 public void buildEthMatchTest() {
78 AceEthBuilder aceEthBuilder = new AceEthBuilder();
79 aceEthBuilder.setDestinationMacAddress(new MacAddress(MAC_DST_STR));
80 aceEthBuilder.setSourceMacAddress(new MacAddress(MAC_SRC_STR));
82 MatchesBuilder matchesBuilder = new MatchesBuilder();
83 matchesBuilder.setAceType(aceEthBuilder.build());
85 // Create the aclMatches that is the object to be tested
86 AclMatches aclMatches = new AclMatches(matchesBuilder.build());
87 List<MatchBuilder> matchBuilds = aclMatches.buildMatch();
89 for (MatchBuilder matchBuilder : matchBuilds) {
90 // The ethernet match should be there with src/dst values
91 EthernetMatch ethMatch = matchBuilder.getEthernetMatch();
92 assertNotNull(ethMatch);
93 assertEquals(ethMatch.getEthernetSource().getAddress().getValue(), MAC_SRC_STR);
94 assertEquals(ethMatch.getEthernetDestination().getAddress().getValue(), MAC_DST_STR);
96 // The rest should be null
97 assertNull(matchBuilder.getIpMatch());
98 assertNull(matchBuilder.getLayer3Match());
99 assertNull(matchBuilder.getLayer4Match());
104 public void buildIpv4MatchTest() {
105 AceIpv4Builder aceIpv4 = new AceIpv4Builder();
106 aceIpv4.setDestinationIpv4Network(new Ipv4Prefix(IPV4_DST_STR));
107 aceIpv4.setSourceIpv4Network(new Ipv4Prefix(IPV4_SRC_STR));
109 AceIpBuilder aceIpBuilder = new AceIpBuilder();
110 aceIpBuilder.setAceIpVersion(aceIpv4.build());
112 MatchesBuilder matchesBuilder = new MatchesBuilder();
113 matchesBuilder.setAceType(aceIpBuilder.build());
115 // Create the aclMatches that is the object to be tested
116 AclMatches aclMatches = new AclMatches(matchesBuilder.build());
117 List<MatchBuilder> matchBuilds = aclMatches.buildMatch();
119 for (MatchBuilder matchBuilder : matchBuilds) {
120 // The layer3 match should be there with src/dst values
121 Ipv4Match l3 = (Ipv4Match) matchBuilder.getLayer3Match();
123 assertEquals(l3.getIpv4Destination().getValue().toString(), IPV4_DST_STR);
124 assertEquals(l3.getIpv4Source().getValue().toString(), IPV4_SRC_STR);
126 // There should be an IPv4 etherType set
127 EthernetMatch ethMatch = matchBuilder.getEthernetMatch();
128 assertNotNull(ethMatch);
129 assertEquals(ethMatch.getEthernetType().getType().getValue(), Uint32.valueOf(NwConstants.ETHTYPE_IPV4));
131 // The rest should be null
132 assertNull(matchBuilder.getIpMatch());
133 assertNull(matchBuilder.getLayer4Match());
135 assertEquals(1, matchBuilds.size());
139 public void buildIpv4SrcLwrTcpMatchTest() {
140 AceIpBuilder aceIpBuilder = new AceIpBuilder();
141 aceIpBuilder.setAceIpVersion(new AceIpv4Builder().build());
142 aceIpBuilder.setProtocol(IPProtocols.TCP.shortValue());
144 SourcePortRangeBuilder srcPortRange = new SourcePortRangeBuilder();
145 srcPortRange.setLowerPort(new PortNumber(TCP_SRC_LOWER_PORT));
146 aceIpBuilder.setSourcePortRange(srcPortRange.build());
148 MatchesBuilder matchesBuilder = new MatchesBuilder();
149 matchesBuilder.setAceType(aceIpBuilder.build());
151 AclMatches aclMatches = new AclMatches(matchesBuilder.build());
152 List<MatchBuilder> matchBuilds = aclMatches.buildMatch();
154 Set<Integer> srcTcpMatches = new HashSet<>();
156 for (MatchBuilder matchBuilder : matchBuilds) {
157 // There should be an IPv4 etherType set
158 EthernetMatch ethMatch = matchBuilder.getEthernetMatch();
159 assertNotNull(ethMatch);
160 assertEquals(ethMatch.getEthernetType().getType().getValue(), Uint32.valueOf(NwConstants.ETHTYPE_IPV4));
163 IpMatch ipMatch = matchBuilder.getIpMatch();
164 assertNotNull(ipMatch);
165 assertEquals(ipMatch.getIpProtocol(), Uint8.valueOf(IPProtocols.TCP.shortValue()));
167 NxmOfTcpSrc tcpSrc = matchBuilder
168 .augmentation(GeneralAugMatchNodesNodeTableFlow.class).getExtensionList().get(0)
169 .getExtension().augmentation(NxAugMatchNodesNodeTableFlow.class).getNxmOfTcpSrc();
172 if (tcpSrc != null) {
173 srcTcpMatches.add(tcpSrc.getPort().getValue().toJava());
174 srcTcpMatches.add(tcpSrc.getMask().toJava());
177 // The layer3 match should be null
178 assertNull(matchBuilder.getLayer3Match());
180 assertEquals(1, matchBuilds.size());
181 assertEquals(2, srcTcpMatches.size());
182 assertTrue(srcTcpMatches.contains(TCP_SRC_LOWER_PORT));
183 assertTrue(srcTcpMatches.contains(65535));
187 public void buildIpv4SrcTcpMatchTest() {
188 AceIpBuilder aceIpBuilder = new AceIpBuilder();
189 aceIpBuilder.setAceIpVersion(new AceIpv4Builder().build());
190 aceIpBuilder.setProtocol(IPProtocols.TCP.shortValue());
192 SourcePortRangeBuilder srcPortRange = new SourcePortRangeBuilder();
193 srcPortRange.setLowerPort(new PortNumber(TCP_SRC_LOWER_PORT));
194 srcPortRange.setUpperPort(new PortNumber(TCP_SRC_UPPER_PORT));
195 aceIpBuilder.setSourcePortRange(srcPortRange.build());
197 MatchesBuilder matchesBuilder = new MatchesBuilder();
198 matchesBuilder.setAceType(aceIpBuilder.build());
200 AclMatches aclMatches = new AclMatches(matchesBuilder.build());
201 List<MatchBuilder> matchBuilds = aclMatches.buildMatch();
203 Set<Integer> srcTcpMatches = new HashSet<>();
205 for (MatchBuilder matchBuilder : matchBuilds) {
206 // There should be an IPv4 etherType set
207 EthernetMatch ethMatch = matchBuilder.getEthernetMatch();
208 assertNotNull(ethMatch);
209 assertEquals(ethMatch.getEthernetType().getType().getValue(), Uint32.valueOf(NwConstants.ETHTYPE_IPV4));
212 IpMatch ipMatch = matchBuilder.getIpMatch();
213 assertNotNull(ipMatch);
214 assertEquals(ipMatch.getIpProtocol(), Uint8.valueOf(IPProtocols.TCP.shortValue()));
216 NxmOfTcpSrc tcpSrc = matchBuilder
217 .augmentation(GeneralAugMatchNodesNodeTableFlow.class).getExtensionList().get(0)
218 .getExtension().augmentation(NxAugMatchNodesNodeTableFlow.class).getNxmOfTcpSrc();
221 if (tcpSrc != null) {
222 srcTcpMatches.add(tcpSrc.getPort().getValue().toJava());
223 srcTcpMatches.add(tcpSrc.getMask().toJava());
226 // The layer3 match should be null
227 assertNull(matchBuilder.getLayer3Match());
229 assertEquals(2, matchBuilds.size());
230 assertEquals(4, srcTcpMatches.size());
231 assertTrue(srcTcpMatches.contains(TCP_SRC_LOWER_PORT));
232 assertTrue(srcTcpMatches.contains(TCP_SRC_UPPER_PORT));
233 assertTrue(srcTcpMatches.contains(65535));
234 assertTrue(srcTcpMatches.contains(65534));
238 public void buildIpv4DstLwrTcpMatchTest() {
239 AceIpBuilder aceIpBuilder = new AceIpBuilder();
240 aceIpBuilder.setAceIpVersion(new AceIpv4Builder().build());
241 aceIpBuilder.setProtocol(IPProtocols.TCP.shortValue());
243 DestinationPortRangeBuilder dstPortRange = new DestinationPortRangeBuilder();
244 dstPortRange.setLowerPort(new PortNumber(TCP_DST_LOWER_PORT));
245 aceIpBuilder.setDestinationPortRange(dstPortRange.build());
247 MatchesBuilder matchesBuilder = new MatchesBuilder();
248 matchesBuilder.setAceType(aceIpBuilder.build());
250 AclMatches aclMatches = new AclMatches(matchesBuilder.build());
251 List<MatchBuilder> matchBuilds = aclMatches.buildMatch();
253 Set<Integer> dstTcpMatches = new HashSet<>();
255 for (MatchBuilder matchBuilder : matchBuilds) {
256 // There should be an IPv4 etherType set
257 EthernetMatch ethMatch = matchBuilder.getEthernetMatch();
258 assertNotNull(ethMatch);
259 assertEquals(ethMatch.getEthernetType().getType().getValue(), Uint32.valueOf(NwConstants.ETHTYPE_IPV4));
262 IpMatch ipMatch = matchBuilder.getIpMatch();
263 assertNotNull(ipMatch);
264 assertEquals(ipMatch.getIpProtocol(), Uint8.valueOf(IPProtocols.TCP.shortValue()));
266 NxmOfTcpDst tcpDst = matchBuilder
267 .augmentation(GeneralAugMatchNodesNodeTableFlow.class).getExtensionList().get(0)
268 .getExtension().augmentation(NxAugMatchNodesNodeTableFlow.class).getNxmOfTcpDst();
270 if (tcpDst != null) {
271 dstTcpMatches.add(tcpDst.getPort().getValue().toJava());
272 dstTcpMatches.add(tcpDst.getMask().toJava());
274 // The layer3 match should be null
275 assertNull(matchBuilder.getLayer3Match());
277 assertEquals(1, matchBuilds.size());
278 assertEquals(2, dstTcpMatches.size());
279 assertTrue(dstTcpMatches.contains(TCP_DST_LOWER_PORT));
280 assertTrue(dstTcpMatches.contains(65535));
284 public void buildIpv4DstTcpMatchTest() {
285 AceIpBuilder aceIpBuilder = new AceIpBuilder();
286 aceIpBuilder.setAceIpVersion(new AceIpv4Builder().build());
287 aceIpBuilder.setProtocol(IPProtocols.TCP.shortValue());
289 DestinationPortRangeBuilder dstPortRange = new DestinationPortRangeBuilder();
290 dstPortRange.setLowerPort(new PortNumber(TCP_DST_LOWER_PORT));
291 dstPortRange.setUpperPort(new PortNumber(TCP_DST_UPPER_PORT));
292 aceIpBuilder.setDestinationPortRange(dstPortRange.build());
294 MatchesBuilder matchesBuilder = new MatchesBuilder();
295 matchesBuilder.setAceType(aceIpBuilder.build());
297 AclMatches aclMatches = new AclMatches(matchesBuilder.build());
298 List<MatchBuilder> matchBuilds = aclMatches.buildMatch();
300 Set<Integer> dstTcpMatches = new HashSet<>();
302 for (MatchBuilder matchBuilder : matchBuilds) {
303 // There should be an IPv4 etherType set
304 EthernetMatch ethMatch = matchBuilder.getEthernetMatch();
305 assertNotNull(ethMatch);
306 assertEquals(ethMatch.getEthernetType().getType().getValue(), Uint32.valueOf(NwConstants.ETHTYPE_IPV4));
309 IpMatch ipMatch = matchBuilder.getIpMatch();
310 assertNotNull(ipMatch);
311 assertEquals(ipMatch.getIpProtocol(), Uint8.valueOf(IPProtocols.TCP.shortValue()));
313 NxmOfTcpDst tcpDst = matchBuilder
314 .augmentation(GeneralAugMatchNodesNodeTableFlow.class).getExtensionList().get(0)
315 .getExtension().augmentation(NxAugMatchNodesNodeTableFlow.class).getNxmOfTcpDst();
317 if (tcpDst != null) {
318 dstTcpMatches.add(tcpDst.getPort().getValue().toJava());
319 dstTcpMatches.add(tcpDst.getMask().toJava());
321 // The layer3 match should be null
322 assertNull(matchBuilder.getLayer3Match());
324 assertEquals(1, matchBuilds.size());
325 assertEquals(2, dstTcpMatches.size());
326 assertTrue(dstTcpMatches.contains(TCP_DST_LOWER_PORT));
327 assertTrue(dstTcpMatches.contains(TCP_DST_UPPER_PORT));
328 assertTrue(dstTcpMatches.contains(65535));
332 public void buildIpv4TcpMatchTest() {
333 AceIpBuilder aceIpBuilder = new AceIpBuilder();
334 aceIpBuilder.setAceIpVersion(new AceIpv4Builder().build());
335 aceIpBuilder.setProtocol(IPProtocols.TCP.shortValue());
337 SourcePortRangeBuilder srcPortRange = new SourcePortRangeBuilder();
338 srcPortRange.setLowerPort(new PortNumber(TCP_SRC_LOWER_PORT));
339 srcPortRange.setUpperPort(new PortNumber(TCP_SRC_UPPER_PORT));
340 aceIpBuilder.setSourcePortRange(srcPortRange.build());
342 DestinationPortRangeBuilder dstPortRange = new DestinationPortRangeBuilder();
343 dstPortRange.setLowerPort(new PortNumber(TCP_DST_LOWER_PORT));
344 dstPortRange.setUpperPort(new PortNumber(TCP_DST_UPPER_PORT));
345 aceIpBuilder.setDestinationPortRange(dstPortRange.build());
347 MatchesBuilder matchesBuilder = new MatchesBuilder();
348 matchesBuilder.setAceType(aceIpBuilder.build());
350 AclMatches aclMatches = new AclMatches(matchesBuilder.build());
351 List<MatchBuilder> matchBuilds = aclMatches.buildMatch();
353 Set<Integer> dstTcpMatches = new HashSet<>();
354 Set<Integer> srcTcpMatches = new HashSet<>();
356 for (MatchBuilder matchBuilder : matchBuilds) {
357 // There should be an IPv4 etherType set
358 EthernetMatch ethMatch = matchBuilder.getEthernetMatch();
359 assertNotNull(ethMatch);
360 assertEquals(ethMatch.getEthernetType().getType().getValue(), Uint32.valueOf(NwConstants.ETHTYPE_IPV4));
363 IpMatch ipMatch = matchBuilder.getIpMatch();
364 assertNotNull(ipMatch);
365 assertEquals(ipMatch.getIpProtocol(), Uint8.valueOf(IPProtocols.TCP.shortValue()));
367 NxmOfTcpSrc tcpSrc = matchBuilder
368 .augmentation(GeneralAugMatchNodesNodeTableFlow.class).getExtensionList().get(0)
369 .getExtension().augmentation(NxAugMatchNodesNodeTableFlow.class).getNxmOfTcpSrc();
371 NxmOfTcpDst tcpDst = matchBuilder
372 .augmentation(GeneralAugMatchNodesNodeTableFlow.class).getExtensionList().get(1)
373 .getExtension().augmentation(NxAugMatchNodesNodeTableFlow.class).getNxmOfTcpDst();
375 if (tcpSrc != null) {
376 srcTcpMatches.add(tcpSrc.getPort().getValue().toJava());
377 srcTcpMatches.add(tcpSrc.getMask().toJava());
380 if (tcpDst != null) {
381 dstTcpMatches.add(tcpDst.getPort().getValue().toJava());
382 dstTcpMatches.add(tcpDst.getMask().toJava());
384 // The layer3 match should be null
385 assertNull(matchBuilder.getLayer3Match());
387 assertEquals(2, matchBuilds.size());
388 assertEquals(4, srcTcpMatches.size());
389 assertEquals(2, dstTcpMatches.size());
391 assertTrue(srcTcpMatches.contains(TCP_SRC_LOWER_PORT));
392 assertTrue(srcTcpMatches.contains(TCP_SRC_UPPER_PORT));
393 assertTrue(srcTcpMatches.contains(65535));
394 assertTrue(srcTcpMatches.contains(65534));
396 assertTrue(dstTcpMatches.contains(TCP_DST_LOWER_PORT));
397 assertTrue(dstTcpMatches.contains(TCP_DST_UPPER_PORT));
398 assertTrue(dstTcpMatches.contains(65535));
402 public void buildIpv4SrcLwrUdpMatchTest() {
403 AceIpBuilder aceIpBuilder = new AceIpBuilder();
404 aceIpBuilder.setAceIpVersion(new AceIpv4Builder().build());
405 aceIpBuilder.setProtocol(IPProtocols.UDP.shortValue());
407 SourcePortRangeBuilder srcPortRange = new SourcePortRangeBuilder();
408 srcPortRange.setLowerPort(new PortNumber(UDP_SRC_LOWER_PORT));
409 aceIpBuilder.setSourcePortRange(srcPortRange.build());
411 MatchesBuilder matchesBuilder = new MatchesBuilder();
412 matchesBuilder.setAceType(aceIpBuilder.build());
414 // Create the aclMatches that is the object to be tested
415 AclMatches aclMatches = new AclMatches(matchesBuilder.build());
416 List<MatchBuilder> matchBuilds = aclMatches.buildMatch();
418 Set<Integer> srcUdpMatches = new HashSet<>();
420 for (MatchBuilder matchBuilder : matchBuilds) {
421 // There should be an IPv4 etherType set
422 EthernetMatch ethMatch = matchBuilder.getEthernetMatch();
423 assertNotNull(ethMatch);
424 assertEquals(ethMatch.getEthernetType().getType().getValue(), Uint32.valueOf(NwConstants.ETHTYPE_IPV4));
427 IpMatch ipMatch = matchBuilder.getIpMatch();
428 assertNotNull(ipMatch);
429 assertEquals(ipMatch.getIpProtocol(), Uint8.valueOf(IPProtocols.UDP.shortValue()));
431 NxmOfUdpSrc udpSrc = matchBuilder
432 .augmentation(GeneralAugMatchNodesNodeTableFlow.class).getExtensionList().get(0)
433 .getExtension().augmentation(NxAugMatchNodesNodeTableFlow.class).getNxmOfUdpSrc();
435 if (udpSrc != null) {
436 srcUdpMatches.add(udpSrc.getPort().getValue().toJava());
437 srcUdpMatches.add(udpSrc.getMask().toJava());
440 // The layer3 match should be null
441 assertNull(matchBuilder.getLayer3Match());
443 assertEquals(1, matchBuilds.size());
444 assertEquals(2, srcUdpMatches.size());
445 assertTrue(srcUdpMatches.contains(UDP_SRC_LOWER_PORT));
446 assertTrue(srcUdpMatches.contains(65535));
450 public void buildIpv4SrcUdpMatchTest() {
451 AceIpBuilder aceIpBuilder = new AceIpBuilder();
452 aceIpBuilder.setAceIpVersion(new AceIpv4Builder().build());
453 aceIpBuilder.setProtocol(IPProtocols.UDP.shortValue());
455 SourcePortRangeBuilder srcPortRange = new SourcePortRangeBuilder();
456 srcPortRange.setLowerPort(new PortNumber(UDP_SRC_LOWER_PORT));
457 srcPortRange.setUpperPort(new PortNumber(UDP_SRC_UPPER_PORT));
458 aceIpBuilder.setSourcePortRange(srcPortRange.build());
460 MatchesBuilder matchesBuilder = new MatchesBuilder();
461 matchesBuilder.setAceType(aceIpBuilder.build());
463 // Create the aclMatches that is the object to be tested
464 AclMatches aclMatches = new AclMatches(matchesBuilder.build());
465 List<MatchBuilder> matchBuilds = aclMatches.buildMatch();
467 Set<Integer> srcUdpMatches = new HashSet<>();
469 for (MatchBuilder matchBuilder : matchBuilds) {
470 // There should be an IPv4 etherType set
471 EthernetMatch ethMatch = matchBuilder.getEthernetMatch();
472 assertNotNull(ethMatch);
473 assertEquals(ethMatch.getEthernetType().getType().getValue(), Uint32.valueOf(NwConstants.ETHTYPE_IPV4));
476 IpMatch ipMatch = matchBuilder.getIpMatch();
477 assertNotNull(ipMatch);
478 assertEquals(ipMatch.getIpProtocol(), Uint8.valueOf(IPProtocols.UDP.shortValue()));
480 NxmOfUdpSrc udpSrc = matchBuilder
481 .augmentation(GeneralAugMatchNodesNodeTableFlow.class).getExtensionList().get(0)
482 .getExtension().augmentation(NxAugMatchNodesNodeTableFlow.class).getNxmOfUdpSrc();
484 if (udpSrc != null) {
485 srcUdpMatches.add(udpSrc.getPort().getValue().toJava());
486 srcUdpMatches.add(udpSrc.getMask().toJava());
489 // The layer3 match should be null
490 assertNull(matchBuilder.getLayer3Match());
492 assertEquals(1, matchBuilds.size());
493 assertEquals(2, srcUdpMatches.size());
494 assertTrue(srcUdpMatches.contains(UDP_SRC_LOWER_PORT));
495 assertTrue(srcUdpMatches.contains(UDP_SRC_UPPER_PORT));
496 assertTrue(srcUdpMatches.contains(65535));
500 public void buildIpv4DstLwrUdpMatchTest() {
501 AceIpBuilder aceIpBuilder = new AceIpBuilder();
502 aceIpBuilder.setAceIpVersion(new AceIpv4Builder().build());
503 aceIpBuilder.setProtocol(IPProtocols.UDP.shortValue());
505 DestinationPortRangeBuilder dstPortRange = new DestinationPortRangeBuilder();
506 dstPortRange.setLowerPort(new PortNumber(UDP_DST_LOWER_PORT));
507 aceIpBuilder.setDestinationPortRange(dstPortRange.build());
509 MatchesBuilder matchesBuilder = new MatchesBuilder();
510 matchesBuilder.setAceType(aceIpBuilder.build());
512 // Create the aclMatches that is the object to be tested
513 AclMatches aclMatches = new AclMatches(matchesBuilder.build());
514 List<MatchBuilder> matchBuilds = aclMatches.buildMatch();
516 Set<Integer> dstUdpMatches = new HashSet<>();
518 for (MatchBuilder matchBuilder : matchBuilds) {
519 // There should be an IPv4 etherType set
520 EthernetMatch ethMatch = matchBuilder.getEthernetMatch();
521 assertNotNull(ethMatch);
522 assertEquals(ethMatch.getEthernetType().getType().getValue(), Uint32.valueOf(NwConstants.ETHTYPE_IPV4));
525 IpMatch ipMatch = matchBuilder.getIpMatch();
526 assertNotNull(ipMatch);
527 assertEquals(ipMatch.getIpProtocol(), Uint8.valueOf(IPProtocols.UDP.shortValue()));
529 NxmOfUdpDst udpDst = matchBuilder
530 .augmentation(GeneralAugMatchNodesNodeTableFlow.class).getExtensionList().get(0)
531 .getExtension().augmentation(NxAugMatchNodesNodeTableFlow.class).getNxmOfUdpDst();
533 if (udpDst != null) {
534 dstUdpMatches.add(udpDst.getPort().getValue().toJava());
535 dstUdpMatches.add(udpDst.getMask().toJava());
538 // The layer3 match should be null
539 assertNull(matchBuilder.getLayer3Match());
541 assertEquals(1, matchBuilds.size());
542 assertEquals(2, dstUdpMatches.size());
543 assertTrue(dstUdpMatches.contains(UDP_DST_LOWER_PORT));
544 assertTrue(dstUdpMatches.contains(65535));
548 public void buildIpv4DstUdpMatchTest() {
549 AceIpBuilder aceIpBuilder = new AceIpBuilder();
550 aceIpBuilder.setAceIpVersion(new AceIpv4Builder().build());
551 aceIpBuilder.setProtocol(IPProtocols.UDP.shortValue());
553 DestinationPortRangeBuilder dstPortRange = new DestinationPortRangeBuilder();
554 dstPortRange.setLowerPort(new PortNumber(UDP_DST_LOWER_PORT));
555 dstPortRange.setUpperPort(new PortNumber(UDP_DST_UPPER_PORT));
556 aceIpBuilder.setDestinationPortRange(dstPortRange.build());
558 MatchesBuilder matchesBuilder = new MatchesBuilder();
559 matchesBuilder.setAceType(aceIpBuilder.build());
561 // Create the aclMatches that is the object to be tested
562 AclMatches aclMatches = new AclMatches(matchesBuilder.build());
563 List<MatchBuilder> matchBuilds = aclMatches.buildMatch();
565 Set<Integer> dstUdpMatches = new HashSet<>();
567 for (MatchBuilder matchBuilder : matchBuilds) {
568 // There should be an IPv4 etherType set
569 EthernetMatch ethMatch = matchBuilder.getEthernetMatch();
570 assertNotNull(ethMatch);
571 assertEquals(ethMatch.getEthernetType().getType().getValue(), Uint32.valueOf(NwConstants.ETHTYPE_IPV4));
574 IpMatch ipMatch = matchBuilder.getIpMatch();
575 assertNotNull(ipMatch);
576 assertEquals(ipMatch.getIpProtocol(), Uint8.valueOf(IPProtocols.UDP.shortValue()));
578 NxmOfUdpDst udpDst = matchBuilder
579 .augmentation(GeneralAugMatchNodesNodeTableFlow.class).getExtensionList().get(0)
580 .getExtension().augmentation(NxAugMatchNodesNodeTableFlow.class).getNxmOfUdpDst();
582 if (udpDst != null) {
583 dstUdpMatches.add(udpDst.getPort().getValue().toJava());
584 dstUdpMatches.add(udpDst.getMask().toJava());
587 // The layer3 match should be null
588 assertNull(matchBuilder.getLayer3Match());
590 assertEquals(2, matchBuilds.size());
591 assertEquals(4, dstUdpMatches.size());
592 assertTrue(dstUdpMatches.contains(UDP_DST_LOWER_PORT));
593 assertTrue(dstUdpMatches.contains(UDP_DST_UPPER_PORT));
594 assertTrue(dstUdpMatches.contains(65534));
595 assertTrue(dstUdpMatches.contains(65535));
599 public void buildIpv4UdpMatchTest() {
600 AceIpBuilder aceIpBuilder = new AceIpBuilder();
601 aceIpBuilder.setAceIpVersion(new AceIpv4Builder().build());
602 aceIpBuilder.setProtocol(IPProtocols.UDP.shortValue());
604 SourcePortRangeBuilder srcPortRange = new SourcePortRangeBuilder();
605 srcPortRange.setLowerPort(new PortNumber(UDP_SRC_LOWER_PORT));
606 srcPortRange.setUpperPort(new PortNumber(UDP_SRC_UPPER_PORT));
607 aceIpBuilder.setSourcePortRange(srcPortRange.build());
609 DestinationPortRangeBuilder dstPortRange = new DestinationPortRangeBuilder();
610 dstPortRange.setLowerPort(new PortNumber(UDP_DST_LOWER_PORT));
611 dstPortRange.setUpperPort(new PortNumber(UDP_DST_UPPER_PORT));
612 aceIpBuilder.setDestinationPortRange(dstPortRange.build());
614 MatchesBuilder matchesBuilder = new MatchesBuilder();
615 matchesBuilder.setAceType(aceIpBuilder.build());
617 // Create the aclMatches that is the object to be tested
618 AclMatches aclMatches = new AclMatches(matchesBuilder.build());
619 List<MatchBuilder> matchBuilds = aclMatches.buildMatch();
621 Set<Integer> srcUdpMatches = new HashSet<>();
622 Set<Integer> dstUdpMatches = new HashSet<>();
624 for (MatchBuilder matchBuilder : matchBuilds) {
625 // There should be an IPv4 etherType set
626 EthernetMatch ethMatch = matchBuilder.getEthernetMatch();
627 assertNotNull(ethMatch);
628 assertEquals(ethMatch.getEthernetType().getType().getValue(), Uint32.valueOf(NwConstants.ETHTYPE_IPV4));
631 IpMatch ipMatch = matchBuilder.getIpMatch();
632 assertNotNull(ipMatch);
633 assertEquals(ipMatch.getIpProtocol(), Uint8.valueOf(IPProtocols.UDP.shortValue()));
635 NxmOfUdpSrc udpSrc = matchBuilder
636 .augmentation(GeneralAugMatchNodesNodeTableFlow.class).getExtensionList().get(0)
637 .getExtension().augmentation(NxAugMatchNodesNodeTableFlow.class).getNxmOfUdpSrc();
639 NxmOfUdpDst udpDst = matchBuilder
640 .augmentation(GeneralAugMatchNodesNodeTableFlow.class).getExtensionList().get(1)
641 .getExtension().augmentation(NxAugMatchNodesNodeTableFlow.class).getNxmOfUdpDst();
643 if (udpSrc != null) {
644 srcUdpMatches.add(udpSrc.getPort().getValue().toJava());
645 srcUdpMatches.add(udpSrc.getMask().toJava());
648 if (udpDst != null) {
649 dstUdpMatches.add(udpDst.getPort().getValue().toJava());
650 dstUdpMatches.add(udpDst.getMask().toJava());
653 // The layer3 match should be null
654 assertNull(matchBuilder.getLayer3Match());
656 assertEquals(2, matchBuilds.size());
657 assertEquals(2, srcUdpMatches.size());
658 assertEquals(4, dstUdpMatches.size());
660 assertTrue(srcUdpMatches.contains(UDP_SRC_LOWER_PORT));
661 assertTrue(srcUdpMatches.contains(UDP_SRC_UPPER_PORT));
662 assertTrue(srcUdpMatches.contains(65535));
664 assertTrue(dstUdpMatches.contains(UDP_DST_LOWER_PORT));
665 assertTrue(dstUdpMatches.contains(UDP_DST_UPPER_PORT));
666 assertTrue(dstUdpMatches.contains(65534));
667 assertTrue(dstUdpMatches.contains(65535));
671 public void buildIpv4DscpMatchTest() {
672 AceIpBuilder aceIpBuilder = new AceIpBuilder();
673 aceIpBuilder.setAceIpVersion(new AceIpv4Builder().build());
674 aceIpBuilder.setDscp(new Dscp(DSCP_VALUE));
676 MatchesBuilder matchesBuilder = new MatchesBuilder();
677 matchesBuilder.setAceType(aceIpBuilder.build());
679 // Create the aclMatches that is the object to be tested
680 AclMatches aclMatches = new AclMatches(matchesBuilder.build());
681 List<MatchBuilder> matchBuilds = aclMatches.buildMatch();
683 for (MatchBuilder matchBuilder : matchBuilds) {
684 // There should be an IPv4 etherType set
685 EthernetMatch ethMatch = matchBuilder.getEthernetMatch();
686 assertNotNull(ethMatch);
687 assertEquals(ethMatch.getEthernetType().getType().getValue(), Uint32.valueOf(NwConstants.ETHTYPE_IPV4));
689 // Check the DSCP value
690 IpMatch ipMatch = matchBuilder.getIpMatch();
691 assertNotNull(ipMatch);
692 assertEquals(ipMatch.getIpDscp().getValue(), Uint8.valueOf(DSCP_VALUE));
694 // The rest should be null
695 assertNull(matchBuilder.getLayer3Match());
696 assertNull(matchBuilder.getLayer4Match());
701 public void buildIpv6MatchTest() {
702 AceIpv6Builder aceIpv6 = new AceIpv6Builder();
703 aceIpv6.setDestinationIpv6Network(new Ipv6Prefix(IPV6_DST_STR));
704 aceIpv6.setSourceIpv6Network(new Ipv6Prefix(IPV6_SRC_STR));
706 AceIpBuilder aceIpBuilder = new AceIpBuilder();
707 aceIpBuilder.setAceIpVersion(aceIpv6.build());
709 MatchesBuilder matchesBuilder = new MatchesBuilder();
710 matchesBuilder.setAceType(aceIpBuilder.build());
712 // Create the aclMatches that is the object to be tested
713 AclMatches aclMatches = new AclMatches(matchesBuilder.build());
714 List<MatchBuilder> matchBuilds = aclMatches.buildMatch();
716 for (MatchBuilder matchBuilder : matchBuilds) {
717 // The layer3 match should be there with src/dst values
718 Ipv6Match l3 = (Ipv6Match) matchBuilder.getLayer3Match();
720 assertEquals(l3.getIpv6Destination().getValue().toString(), IPV6_DST_STR);
721 assertEquals(l3.getIpv6Source().getValue().toString(), IPV6_SRC_STR);
723 // There should be an IPv6 etherType set
724 EthernetMatch ethMatch = matchBuilder.getEthernetMatch();
725 assertNotNull(ethMatch);
726 assertEquals(ethMatch.getEthernetType().getType().getValue(), Uint32.valueOf(NwConstants.ETHTYPE_IPV6));
728 // The rest should be null
729 assertNull(matchBuilder.getIpMatch());
730 assertNull(matchBuilder.getLayer4Match());
735 public void invertEthMatchTest() {
736 AceEthBuilder aceEthBuilder = new AceEthBuilder();
737 aceEthBuilder.setDestinationMacAddress(new MacAddress(MAC_DST_STR));
738 aceEthBuilder.setSourceMacAddress(new MacAddress(MAC_SRC_STR));
739 AceEth aceEth = aceEthBuilder.build();
741 MatchesBuilder matchesBuilder = new MatchesBuilder();
742 matchesBuilder.setAceType(aceEth);
743 Matches matches = matchesBuilder.build();
745 Matches invertedMatches = AclMatches.invertMatches(matches);
747 assertNotEquals(matches, invertedMatches);
749 AceEth invertedAceEth = (AceEth) invertedMatches.getAceType();
750 assertEquals(invertedAceEth.getDestinationMacAddress(), aceEth.getSourceMacAddress());
751 assertEquals(invertedAceEth.getSourceMacAddress(), aceEth.getDestinationMacAddress());
755 public void invertIpv4MatchTest() {
756 AceIpBuilder aceIpBuilder = new AceIpBuilder();
757 aceIpBuilder.setProtocol(IPProtocols.UDP.shortValue());
758 aceIpBuilder.setDscp(new Dscp(DSCP_VALUE));
760 DestinationPortRangeBuilder dstPortRange = new DestinationPortRangeBuilder();
761 dstPortRange.setLowerPort(new PortNumber(UDP_DST_LOWER_PORT));
762 dstPortRange.setUpperPort(new PortNumber(UDP_DST_UPPER_PORT));
763 DestinationPortRange destinationPortRange = dstPortRange.build();
764 aceIpBuilder.setDestinationPortRange(destinationPortRange);
766 AceIpv4Builder aceIpv4Builder = new AceIpv4Builder();
767 aceIpv4Builder.setDestinationIpv4Network(new Ipv4Prefix(IPV4_DST_STR));
768 aceIpv4Builder.setSourceIpv4Network(new Ipv4Prefix(IPV4_SRC_STR));
769 AceIpv4 aceIpv4 = aceIpv4Builder.build();
770 aceIpBuilder.setAceIpVersion(aceIpv4);
772 MatchesBuilder matchesBuilder = new MatchesBuilder();
773 AceIp aceIp = aceIpBuilder.build();
774 matchesBuilder.setAceType(aceIp);
776 Matches matches = matchesBuilder.build();
778 Matches invertedMatches = AclMatches.invertMatches(matches);
780 assertNotEquals(matches, invertedMatches);
782 AceIp invertedAceIp = (AceIp) invertedMatches.getAceType();
783 assertEquals(invertedAceIp.getDscp(), aceIp.getDscp());
784 assertEquals(invertedAceIp.getProtocol(), aceIp.getProtocol());
786 DestinationPortRange invertedDestinationPortRange = invertedAceIp.getDestinationPortRange();
787 assertNull(invertedDestinationPortRange);
789 SourcePortRange invertedSourcePortRange = invertedAceIp.getSourcePortRange();
790 assertEquals(invertedSourcePortRange.getLowerPort(), destinationPortRange.getLowerPort());
791 assertEquals(invertedSourcePortRange.getUpperPort(), destinationPortRange.getUpperPort());
793 AceIpv4 invertedAceIpv4 = (AceIpv4) invertedAceIp.getAceIpVersion();
794 assertEquals(invertedAceIpv4.getDestinationIpv4Network(), aceIpv4.getSourceIpv4Network());
795 assertEquals(invertedAceIpv4.getSourceIpv4Network(), aceIpv4.getDestinationIpv4Network());
799 public void invertIpv6MatchTest() {
800 AceIpBuilder aceIpBuilder = new AceIpBuilder();
801 aceIpBuilder.setProtocol(IPProtocols.TCP.shortValue());
802 aceIpBuilder.setDscp(new Dscp(DSCP_VALUE));
804 SourcePortRangeBuilder srcPortRange = new SourcePortRangeBuilder();
805 srcPortRange.setLowerPort(new PortNumber(TCP_SRC_LOWER_PORT));
806 srcPortRange.setUpperPort(new PortNumber(TCP_SRC_UPPER_PORT));
807 SourcePortRange sourcePortRange = srcPortRange.build();
808 aceIpBuilder.setSourcePortRange(sourcePortRange);
810 DestinationPortRangeBuilder dstPortRange = new DestinationPortRangeBuilder();
811 dstPortRange.setLowerPort(new PortNumber(TCP_DST_LOWER_PORT));
812 dstPortRange.setUpperPort(new PortNumber(TCP_DST_UPPER_PORT));
813 DestinationPortRange destinationPortRange = dstPortRange.build();
814 aceIpBuilder.setDestinationPortRange(destinationPortRange);
816 AceIpv6Builder aceIpv6Builder = new AceIpv6Builder();
817 aceIpv6Builder.setDestinationIpv6Network(new Ipv6Prefix(IPV6_DST_STR));
818 aceIpv6Builder.setSourceIpv6Network(new Ipv6Prefix(IPV6_SRC_STR));
819 AceIpv6 aceIpv6 = aceIpv6Builder.build();
820 aceIpBuilder.setAceIpVersion(aceIpv6);
822 MatchesBuilder matchesBuilder = new MatchesBuilder();
823 AceIp aceIp = aceIpBuilder.build();
824 matchesBuilder.setAceType(aceIp);
826 Matches matches = matchesBuilder.build();
828 Matches invertedMatches = AclMatches.invertMatches(matches);
830 assertNotEquals(matches, invertedMatches);
832 AceIp invertedAceIp = (AceIp) invertedMatches.getAceType();
833 assertEquals(invertedAceIp.getDscp(), aceIp.getDscp());
834 assertEquals(invertedAceIp.getProtocol(), aceIp.getProtocol());
836 DestinationPortRange invertedDestinationPortRange = invertedAceIp.getDestinationPortRange();
837 assertEquals(invertedDestinationPortRange.getLowerPort(), sourcePortRange.getLowerPort());
838 assertEquals(invertedDestinationPortRange.getUpperPort(), sourcePortRange.getUpperPort());
840 SourcePortRange invertedSourcePortRange = invertedAceIp.getSourcePortRange();
841 assertEquals(invertedSourcePortRange.getLowerPort(), destinationPortRange.getLowerPort());
842 assertEquals(invertedSourcePortRange.getUpperPort(), destinationPortRange.getUpperPort());
844 AceIpv6 invertedAceIpv6 = (AceIpv6) invertedAceIp.getAceIpVersion();
845 assertEquals(invertedAceIpv6.getDestinationIpv6Network(), aceIpv6.getSourceIpv6Network());
846 assertEquals(invertedAceIpv6.getSourceIpv6Network(), aceIpv6.getDestinationIpv6Network());
850 public void testgetLayer4MaskForRange_SinglePort() {
851 Map<Integer, Integer> layer4MaskForRange = AclMatches.getLayer4MaskForRange(1111, 1111);
852 assertEquals("port L4 mask missing", 1, layer4MaskForRange.size());
856 public void testgetLayer4MaskForRange_MultiplePorts() {
857 Map<Integer, Integer> layer4MaskForRange = AclMatches.getLayer4MaskForRange(1024, 2048);
858 assertEquals("port L4 mask missing", 2, layer4MaskForRange.size());
862 public void testgetLayer4MaskForRange_IllegalPortRange_ExceedMin() {
863 Map<Integer, Integer> layer4MaskForRange = AclMatches.getLayer4MaskForRange(0, 1);
865 assertEquals("port L4 mask missing", 1, layer4MaskForRange.size());
869 public void testgetLayer4MaskForRange_IllegalPortRange_ExceedMax() {
870 Map<Integer, Integer> layer4MaskForRange = AclMatches.getLayer4MaskForRange(1, 65536);
871 assertEquals("Illegal ports range", 0, layer4MaskForRange.size());
875 public void testgetLayer4MaskForRange_IllegalPortRange_MinGreaterThanMax() {
876 Map<Integer, Integer> layer4MaskForRange = AclMatches.getLayer4MaskForRange(8192, 4096);
877 assertEquals("Illegal ports range", 0, layer4MaskForRange.size());