summaryrefslogtreecommitdiffstats
path: root/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util
diff options
context:
space:
mode:
Diffstat (limited to 'acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util')
-rw-r--r--acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/AclContextManager.java2
-rw-r--r--acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/AclContextManagerImpl.java24
-rw-r--r--acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/ace/AceConverter.java129
-rw-r--r--acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/ace/extractor/MacIpAceDataExtractor.java140
-rw-r--r--acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/ace/extractor/StandardAceDataExtractor.java234
-rw-r--r--acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/acl/AclDataExtractor.java39
-rw-r--r--acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/acl/AclWriter.java134
-rw-r--r--acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/factory/AclFactory.java71
-rw-r--r--acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/iface/acl/AclInterfaceAssignmentRequest.java170
-rw-r--r--acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/iface/macip/MacIpInterfaceAssignmentRequest.java112
-rw-r--r--acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/protocol/IpProtocolReader.java176
-rw-r--r--acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/protocol/ProtoPreBindRuleProducer.java285
12 files changed, 569 insertions, 947 deletions
diff --git a/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/AclContextManager.java b/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/AclContextManager.java
index 377d4e1dc..1b590cb7b 100644
--- a/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/AclContextManager.java
+++ b/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/AclContextManager.java
@@ -19,7 +19,7 @@ package io.fd.hc2vpp.acl.util;
import io.fd.honeycomb.translate.MappingContext;
import java.util.List;
import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.Ace;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.Ace;
/**
* Manages metadata for acl plugin
diff --git a/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/AclContextManagerImpl.java b/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/AclContextManagerImpl.java
index aa25c3eb1..a96680897 100644
--- a/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/AclContextManagerImpl.java
+++ b/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/AclContextManagerImpl.java
@@ -29,18 +29,18 @@ import java.util.List;
import java.util.stream.Collector;
import javax.annotation.Nonnull;
import javax.annotation.concurrent.ThreadSafe;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.context.rev170104.VppAclContextAugmentation;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.context.rev170104.vpp.acl.context.attributes.VppAclMappings;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.context.rev170104.vpp.acl.context.attributes.vpp.acl.mappings.VppAclContext;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.context.rev170104.vpp.acl.context.attributes.vpp.acl.mappings.VppAclContextKey;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.context.rev170104.vpp.acl.context.attributes.vpp.acl.mappings.vpp.acl.context.AclMapping;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.context.rev170104.vpp.acl.context.attributes.vpp.acl.mappings.vpp.acl.context.AclMappingBuilder;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.context.rev170104.vpp.acl.context.attributes.vpp.acl.mappings.vpp.acl.context.AclMappingKey;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.context.rev170104.vpp.acl.context.attributes.vpp.acl.mappings.vpp.acl.context.acl.mapping.AceMapping;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.context.rev170104.vpp.acl.context.attributes.vpp.acl.mappings.vpp.acl.context.acl.mapping.AceMappingBuilder;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.context.rev170104.vpp.acl.context.attributes.vpp.acl.mappings.vpp.acl.context.acl.mapping.AceMappingKey;
import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.naming.context.rev160513.Contexts;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.Ace;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.context.rev170104.VppAclContextAugmentation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.context.rev170104.vpp.acl.context.attributes.VppAclMappings;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.context.rev170104.vpp.acl.context.attributes.vpp.acl.mappings.VppAclContext;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.context.rev170104.vpp.acl.context.attributes.vpp.acl.mappings.VppAclContextKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.context.rev170104.vpp.acl.context.attributes.vpp.acl.mappings.vpp.acl.context.AclMapping;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.context.rev170104.vpp.acl.context.attributes.vpp.acl.mappings.vpp.acl.context.AclMappingBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.context.rev170104.vpp.acl.context.attributes.vpp.acl.mappings.vpp.acl.context.AclMappingKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.context.rev170104.vpp.acl.context.attributes.vpp.acl.mappings.vpp.acl.context.acl.mapping.AceMapping;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.context.rev170104.vpp.acl.context.attributes.vpp.acl.mappings.vpp.acl.context.acl.mapping.AceMappingBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.context.rev170104.vpp.acl.context.attributes.vpp.acl.mappings.vpp.acl.context.acl.mapping.AceMappingKey;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.Ace;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
@@ -77,7 +77,7 @@ public final class AclContextManagerImpl implements AclContextManager {
final List<AceMapping> mappings = new ArrayList<>(aces.size());
int aceIndex = 0;
for (final Ace ace : aces) {
- mappings.add(new AceMappingBuilder().setName(ace.getRuleName()).setIndex(aceIndex++).build());
+ mappings.add(new AceMappingBuilder().setName(ace.getName()).setIndex(aceIndex++).build());
}
aclMapping.setAceMapping(mappings);
ctx.put(mappingIid, aclMapping.build());
diff --git a/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/ace/AceConverter.java b/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/ace/AceConverter.java
index db5efb4d6..8e774104a 100644
--- a/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/ace/AceConverter.java
+++ b/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/ace/AceConverter.java
@@ -16,6 +16,7 @@
package io.fd.hc2vpp.acl.util.ace;
+import com.google.common.base.Preconditions;
import io.fd.hc2vpp.acl.util.AclContextManager;
import io.fd.hc2vpp.acl.util.ace.extractor.MacIpAceDataExtractor;
import io.fd.hc2vpp.acl.util.ace.extractor.StandardAceDataExtractor;
@@ -27,16 +28,16 @@ import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.Ace;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.AceBuilder;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.AceKey;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.MatchesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.VppAce;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.VppAceBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.VppMacipAce;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.VppMacipAceBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.VppAceNodesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.macip.ace.VppMacipAceNodesBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.Ace;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.AceBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.AceKey;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.MatchesBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.L3;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l2.EthBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l2.eth.Eth;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l3.ipv4.Ipv4;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l3.ipv6.Ipv6;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev181001.acl.ipv4.header.fields.SourceNetwork;
/**
* Convert between Ace's and vpp rules.
@@ -45,23 +46,55 @@ public interface AceConverter extends MacIpAceDataExtractor, StandardAceDataExtr
default MacipAclRule[] toMacIpAclRules(@Nonnull final List<Ace> aces) {
return aces.stream()
+ .filter(ace -> ace.getMatches() != null && ace.getMatches().getL2() != null)
+ .filter(ace -> ace.getMatches().getL2().getImplementedInterface()
+ .equals(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l2.Eth.class))
.map(ace -> {
- final VppMacipAce macIpAce = fromMacIpAce(ace);
-
MacipAclRule rule = new MacipAclRule();
+ org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l2.Eth
+ l2 =
+ (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l2.Eth) ace
+ .getMatches().getL2();
+
+ Eth eth = Preconditions
+ .checkNotNull(l2.getEth(), "Cannot parse eth for MacIpAcl ACE rule: {}", ace);
- rule.srcMac = sourceMacAsBytes(macIpAce);
- rule.srcMacMask = sourceMacMaskAsBytes(macIpAce);
+ rule.srcMac = sourceMacAsBytes(eth.getSourceMacAddress());
+ rule.srcMacMask = sourceMacMaskAsBytes(eth.getSourceMacAddressMask());
rule.isPermit = macIpAction(ace);
- if (macIpIsIpv6(macIpAce)) {
- rule.isIpv6 = 1;
- rule.srcIpAddr = ipv6Address(macIpAce);
- rule.srcIpPrefixLen = ipv6AddressPrefix(macIpAce);
+ L3 l3 = ace.getMatches().getL3();
+
+ if (l3 != null && l3.getImplementedInterface()
+ .equals(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l3.Ipv4.class)) {
+ Ipv4 ipv4 =
+ ((org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l3.Ipv4) l3)
+ .getIpv4();
+ if (ipv4 != null && ipv4.getSourceNetwork() != null) {
+ // IPv4 is set for MacIpAcl
+ SourceNetwork sourceNetwork = ipv4.getSourceNetwork();
+ rule.isIpv6 = 0;
+ rule.srcIpAddr = ipv4Address(sourceNetwork);
+ rule.srcIpPrefixLen = ipv4AddressPrefix(sourceNetwork);
+ }
+ } else if (l3 != null && l3.getImplementedInterface()
+ .equals(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l3.Ipv6.class)) {
+ Ipv6 ipv6 =
+ ((org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l3.Ipv6) l3)
+ .getIpv6();
+ if (ipv6 != null && ipv6.getSourceNetwork() != null) {
+ // IPv6 is set for MacIpAcl
+ org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev181001.acl.ipv6.header.fields.SourceNetwork
+ sourceNetwork = ipv6.getSourceNetwork();
+ rule.isIpv6 = 1;
+ rule.srcIpAddr = ipv6Address(sourceNetwork);
+ rule.srcIpPrefixLen = ipv6AddressPrefix(sourceNetwork);
+ }
} else {
+ // No IP is set for MacIpAcl
rule.isIpv6 = 0;
- rule.srcIpAddr = ipv4Address(macIpAce);
- rule.srcIpPrefixLen = ipv4AddressPrefix(macIpAce);
+ rule.srcIpAddr = new byte[4];
+ rule.srcIpPrefixLen = 0;
}
return rule;
@@ -72,26 +105,25 @@ public interface AceConverter extends MacIpAceDataExtractor, StandardAceDataExtr
default AclRule[] toStandardAclRules(@Nonnull final List<Ace> aces) {
return aces.stream()
+ .filter(ace -> ace.getMatches() != null)
.map(ace -> {
- final VppAce standardAce = fromStandardAce(ace);
-
// pre-bind rule with protocol based attributes (if present)
- AclRule rule = createPreBindRule(standardAce);
+ AclRule rule = createPreBindRule(ace);
rule.isPermit = standardAction(ace);
- if (standardIsIpv6(standardAce, ace.getMatches())) {
+ if (standardIsIpv6(ace.getMatches())) {
rule.isIpv6 = 1;
- rule.srcIpAddr = ipv6SourceAddress(standardAce);
- rule.srcIpPrefixLen = ipv6SourceAddressPrefix(standardAce);
- rule.dstIpAddr = ipv6DestinationAddress(standardAce);
- rule.dstIpPrefixLen = ipv6DestinationAddressPrefix(standardAce);
+ rule.srcIpAddr = ipv6SourceAddress(ace.getMatches());
+ rule.srcIpPrefixLen = ipv6SourceAddressPrefix(ace.getMatches());
+ rule.dstIpAddr = ipv6DestinationAddress(ace.getMatches());
+ rule.dstIpPrefixLen = ipv6DestinationAddressPrefix(ace.getMatches());
} else {
rule.isIpv6 = 0;
- rule.srcIpAddr = ipv4SourceAddress(standardAce);
- rule.srcIpPrefixLen = ipv4SourceAddressPrefix(standardAce);
- rule.dstIpAddr = ipv4DestinationAddress(standardAce);
- rule.dstIpPrefixLen = ipv4DestinationAddressPrefix(standardAce);
+ rule.srcIpAddr = ipv4SourceAddress(ace.getMatches());
+ rule.srcIpPrefixLen = ipv4SourceAddressPrefix(ace.getMatches());
+ rule.dstIpAddr = ipv4DestinationAddress(ace.getMatches());
+ rule.dstIpPrefixLen = ipv4DestinationAddressPrefix(ace.getMatches());
}
return rule;
@@ -107,18 +139,20 @@ public interface AceConverter extends MacIpAceDataExtractor, StandardAceDataExtr
int i = 0;
for (final MacipAclRule rule : rules) {
final AceBuilder ace = new AceBuilder();
- final VppMacipAceBuilder aceType = new VppMacipAceBuilder();
- final VppMacipAceNodesBuilder nodes = new VppMacipAceNodesBuilder();
- nodes.setAceIpVersion(ipVersion(rule));
- nodes.setSourceMacAddress(sourceMac(rule));
- nodes.setSourceMacAddressMask(sourceMacMask(rule));
- aceType.setVppMacipAceNodes(nodes.build());
-
- ace.setMatches(new MatchesBuilder().setAceType(aceType.build()).build());
+ ace.setMatches(
+ new MatchesBuilder()
+ .setL3(parseMacIpAceL3(rule))
+ .setL2(new EthBuilder()
+ .setEth(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l2.eth.EthBuilder()
+ .setSourceMacAddress(sourceMac(rule))
+ .setSourceMacAddressMask(sourceMacMask(rule))
+ .build())
+ .build())
+ .build());
ace.setActions(actions(rule.isPermit));
final String aceName = macipAclContext.getAceName(aclName, i++, mappingContext);
- ace.setRuleName(aceName);
+ ace.setName(aceName);
ace.withKey(new AceKey(aceName));
aces.add(ace.build());
@@ -133,17 +167,14 @@ public interface AceConverter extends MacIpAceDataExtractor, StandardAceDataExtr
int i = 0;
for (final AclRule rule : rules) {
final AceBuilder ace = new AceBuilder();
- final VppAceBuilder aceType = new VppAceBuilder();
- final VppAceNodesBuilder nodes = new VppAceNodesBuilder();
- nodes.setAceIpVersion(ipVersion(rule));
- nodes.setIpProtocol(parseProtocol(rule));
- aceType.setVppAceNodes(nodes.build());
-
- ace.setMatches(new MatchesBuilder().setAceType(aceType.build()).build());
+ ace.setMatches(new MatchesBuilder()
+ .setL3(parseStandardAceL3(rule))
+ .setL4(parseProtocol(rule))
+ .build());
ace.setActions(actions(rule.isPermit));
final String aceName = standardAclContext.getAceName(aclName, i++, mappingContext);
- ace.setRuleName(aceName);
+ ace.setName(aceName);
ace.withKey(new AceKey(aceName));
aces.add(ace.build());
}
diff --git a/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/ace/extractor/MacIpAceDataExtractor.java b/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/ace/extractor/MacIpAceDataExtractor.java
index ddb41ee3c..0c7d761a0 100644
--- a/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/ace/extractor/MacIpAceDataExtractor.java
+++ b/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/ace/extractor/MacIpAceDataExtractor.java
@@ -21,84 +21,67 @@ import io.fd.hc2vpp.common.translate.util.MacTranslator;
import io.fd.vpp.jvpp.acl.types.MacipAclRule;
import java.util.Optional;
import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.Ace;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.Matches;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.actions.PacketHandling;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.actions.packet.handling.Deny;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.actions.packet.handling.Permit;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.Accept;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.Ace;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.Actions;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.L3;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l3.Ipv4;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l3.Ipv4Builder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l3.Ipv6;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l3.Ipv6Builder;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev181001.acl.ipv4.header.fields.SourceNetwork;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev181001.acl.ipv4.header.fields.source.network.SourceIpv4Network;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev181001.acl.ipv4.header.fields.source.network.SourceIpv4NetworkBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev181001.acl.ipv6.header.fields.source.network.SourceIpv6Network;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev181001.acl.ipv6.header.fields.source.network.SourceIpv6NetworkBuilder;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.VppMacipAceEthHeaderFields;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.VppMacipAceIpv4HeaderFields;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.VppMacipAceIpv6HeaderFields;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.VppMacipAce;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.macip.ace.VppMacipAceNodes;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.macip.ace.vpp.macip.ace.nodes.AceIpVersion;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.macip.ace.vpp.macip.ace.nodes.ace.ip.version.AceIpv4Builder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.macip.ace.vpp.macip.ace.nodes.ace.ip.version.AceIpv6;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.macip.ace.vpp.macip.ace.nodes.ace.ip.version.AceIpv6Builder;
public interface MacIpAceDataExtractor extends AddressExtractor, MacTranslator {
- default VppMacipAce fromMacIpAce(@Nonnull final Ace ace) {
- return Optional.ofNullable(ace.getMatches())
- .map(Matches::getAceType)
- .map(VppMacipAce.class::cast)
- .orElseThrow(
- () -> new IllegalArgumentException(String.format("Unable to create VppMacipAce from %s", ace)));
- }
-
- default boolean macIpIsIpv6(@Nonnull final VppMacipAce ace) {
- return Optional.ofNullable(ace.getVppMacipAceNodes())
- .map(VppMacipAceNodes::getAceIpVersion)
- .map(aceIpVersion -> aceIpVersion instanceof AceIpv6)
- .orElse(false);
- }
-
- default byte[] sourceMacAsBytes(@Nonnull final VppMacipAce ace) {
- return macToByteArray(Optional.ofNullable(ace.getVppMacipAceNodes())
- .map(VppMacipAceEthHeaderFields::getSourceMacAddress)
+ default byte[] sourceMacAsBytes(final MacAddress mac) {
+ return macToByteArray(Optional.ofNullable(mac)
.map(MacAddress::getValue)
.orElse(Impl.DEFAULT_MAC));
}
- default byte[] sourceMacMaskAsBytes(@Nonnull final VppMacipAce ace) {
- return macToByteArray(Optional.ofNullable(ace.getVppMacipAceNodes())
- .map(VppMacipAceEthHeaderFields::getSourceMacAddressMask)
+ default byte[] sourceMacMaskAsBytes(final MacAddress mac) {
+ return macToByteArray(Optional.ofNullable(mac)
.map(MacAddress::getValue)
.orElse(Impl.DEFAULT_MAC_MASK));
}
- default byte[] ipv4Address(@Nonnull final VppMacipAce ace) {
- return extractIp4Address(extractV4NetworkAddressOrNull(ace));
+ default byte[] ipv4Address(@Nonnull final SourceNetwork network) {
+ return extractIp4Address(extractV4NetworkAddressOrNull(network));
}
- default byte ipv4AddressPrefix(@Nonnull final VppMacipAce ace) {
- return extractIp4AddressPrefix(extractV4NetworkAddressOrNull(ace));
+ default byte ipv4AddressPrefix(@Nonnull final SourceNetwork network) {
+ return extractIp4AddressPrefix(extractV4NetworkAddressOrNull(network));
}
- static Ipv4Prefix extractV4NetworkAddressOrNull(final @Nonnull VppMacipAce ace) {
- return Optional.ofNullable(ace.getVppMacipAceNodes())
- .map(VppMacipAceNodes::getAceIpVersion)
- .map(VppMacipAceIpv4HeaderFields.class::cast)
- .map(VppMacipAceIpv4HeaderFields::getSourceIpv4Network)
+ static Ipv4Prefix extractV4NetworkAddressOrNull(final @Nonnull SourceNetwork network) {
+ return Optional.of(network).filter(net -> net instanceof SourceIpv4Network)
+ .map(SourceIpv4Network.class::cast)
+ .map(SourceIpv4Network::getSourceIpv4Network)
.orElse(null);
}
- default byte[] ipv6Address(@Nonnull final VppMacipAce ace) {
- return extractIp6Address(extractV6NetworkAddressOrNull(ace));
+ default byte[] ipv6Address(
+ @Nonnull final org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev181001.acl.ipv6.header.fields.SourceNetwork network) {
+ return extractIp6Address(extractV6NetworkAddressOrNull(network));
}
- default byte ipv6AddressPrefix(@Nonnull final VppMacipAce ace) {
- return extractIp6AddressPrefix(extractV6NetworkAddressOrNull(ace));
+ default byte ipv6AddressPrefix(
+ @Nonnull final org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev181001.acl.ipv6.header.fields.SourceNetwork network) {
+ return extractIp6AddressPrefix(extractV6NetworkAddressOrNull(network));
}
- default Ipv6Prefix extractV6NetworkAddressOrNull(@Nonnull final VppMacipAce ace) {
- return Optional.ofNullable(ace.getVppMacipAceNodes())
- .map(VppMacipAceNodes::getAceIpVersion)
- .map(VppMacipAceIpv6HeaderFields.class::cast)
- .map(VppMacipAceIpv6HeaderFields::getSourceIpv6Network)
+ default Ipv6Prefix extractV6NetworkAddressOrNull(
+ @Nonnull final org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev181001.acl.ipv6.header.fields.SourceNetwork network) {
+ return Optional.of(network).filter(net -> net instanceof SourceIpv6Network)
+ .map(SourceIpv6Network.class::cast)
+ .map(SourceIpv6Network::getSourceIpv6Network)
.orElse(null);
}
@@ -107,41 +90,54 @@ public interface MacIpAceDataExtractor extends AddressExtractor, MacTranslator {
*/
default byte macIpAction(@Nonnull final Ace ace) {
// action choice itself has default, but nothing stops us from not defining actions container itself
- final PacketHandling action = Optional.ofNullable(ace.getActions()).orElseThrow(
- () -> new IllegalArgumentException(String.format("Unable to extract Action from %s", ace)))
- .getPacketHandling();
- if (action instanceof Permit) {
- return 1;
- } else if (action instanceof Deny) {
- return 0;
+ Actions actions = Optional.ofNullable(ace.getActions()).orElseThrow(
+ () -> new IllegalArgumentException(String.format("Unable to extract Action from %s", ace)));
+ if (actions.getForwarding() != null) {
+ if (ace.getActions().getForwarding().equals(Accept.class)) {
+ return 1;
+ } else {
+ return 0;
+ }
} else {
throw new IllegalArgumentException(
- String.format("Unsupported packet-handling action %s for ACE %s", action, ace));
+ String.format("Unsupported packet-handling action %s for ACE %s", actions, ace));
}
}
- default AceIpVersion ipVersion(@Nonnull final MacipAclRule rule) {
+ default L3 parseMacIpAceL3(@Nonnull final MacipAclRule rule) {
if (rule.isIpv6 == 0) {
- return ip4Ace(rule);
+ return ip4L3(rule);
} else {
- return ip6Ace(rule);
+ return ip6L3(rule);
}
}
- default AceIpVersion ip4Ace(@Nonnull final MacipAclRule rule) {
- final AceIpv4Builder ipVersion = new AceIpv4Builder();
+ default Ipv4 ip4L3(@Nonnull final MacipAclRule rule) {
+ final Ipv4Builder ipv4Builder = new Ipv4Builder();
+
if (rule.srcIpAddr != null && rule.srcIpAddr.length != 0) {
- ipVersion.setSourceIpv4Network(toIpv4Prefix(truncateIp4Array(rule.srcIpAddr), rule.srcIpPrefixLen));
+ ipv4Builder.setIpv4(
+ new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l3.ipv4.Ipv4Builder()
+ .setSourceNetwork(new SourceIpv4NetworkBuilder()
+ .setSourceIpv4Network(
+ toIpv4Prefix(truncateIp4Array(rule.srcIpAddr), rule.srcIpPrefixLen))
+ .build())
+ .build());
}
- return ipVersion.build();
+ return ipv4Builder.build();
}
- default AceIpVersion ip6Ace(@Nonnull final MacipAclRule rule) {
- final AceIpv6Builder ipVersion = new AceIpv6Builder();
+ default Ipv6 ip6L3(@Nonnull final MacipAclRule rule) {
+ final Ipv6Builder ipv6Builder = new Ipv6Builder();
if (rule.srcIpAddr != null && rule.srcIpAddr.length != 0) {
- ipVersion.setSourceIpv6Network(toIpv6Prefix(rule.srcIpAddr, rule.srcIpPrefixLen));
+ ipv6Builder.setIpv6(
+ new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l3.ipv6.Ipv6Builder()
+ .setSourceNetwork(new SourceIpv6NetworkBuilder()
+ .setSourceIpv6Network(toIpv6Prefix(rule.srcIpAddr, rule.srcIpPrefixLen))
+ .build())
+ .build());
}
- return ipVersion.build();
+ return ipv6Builder.build();
}
default MacAddress sourceMac(@Nonnull final MacipAclRule rule) {
diff --git a/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/ace/extractor/StandardAceDataExtractor.java b/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/ace/extractor/StandardAceDataExtractor.java
index 8f463aef5..9f454fd38 100644
--- a/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/ace/extractor/StandardAceDataExtractor.java
+++ b/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/ace/extractor/StandardAceDataExtractor.java
@@ -24,147 +24,148 @@ import java.util.Map;
import java.util.Optional;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.Ace;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.Actions;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.ActionsBuilder;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.Matches;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.actions.PacketHandling;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.actions.packet.handling.Deny;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.actions.packet.handling.DenyBuilder;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.actions.packet.handling.Permit;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.actions.packet.handling.PermitBuilder;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.rev181022.AcceptAndReflect;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.Accept;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.Drop;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.ForwardingAction;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.Reject;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.Ace;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.Actions;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.ActionsBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.Matches;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.L3;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l3.Ipv4;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l3.Ipv4Builder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l3.Ipv6;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l3.Ipv6Builder;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.AclIpv4HeaderFields;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.AclIpv6HeaderFields;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.AclIpProtocolHeaderFields;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.actions.packet.handling.Stateful;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.actions.packet.handling.StatefulBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.VppAce;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.VppAceNodes;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.vpp.ace.nodes.AceIpVersion;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.vpp.ace.nodes.ace.ip.version.AceIpv4Builder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.vpp.ace.nodes.ace.ip.version.AceIpv6;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.vpp.ace.nodes.ace.ip.version.AceIpv6Builder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.IcmpV6;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev181001.AclIpv4HeaderFields;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev181001.AclIpv6HeaderFields;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev181001.acl.ipv4.header.fields.destination.network.DestinationIpv4Network;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev181001.acl.ipv4.header.fields.destination.network.DestinationIpv4NetworkBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev181001.acl.ipv4.header.fields.source.network.SourceIpv4Network;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev181001.acl.ipv4.header.fields.source.network.SourceIpv4NetworkBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev181001.acl.ipv6.header.fields.destination.network.DestinationIpv6Network;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev181001.acl.ipv6.header.fields.destination.network.DestinationIpv6NetworkBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev181001.acl.ipv6.header.fields.source.network.SourceIpv6Network;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev181001.acl.ipv6.header.fields.source.network.SourceIpv6NetworkBuilder;
public interface StandardAceDataExtractor extends AddressExtractor, ProtoPreBindRuleProducer, IpProtocolReader {
/**
* Allowed packet-processing actions for Acl's
*/
- Map<Class<? extends PacketHandling>, Integer> ACTION_VALUE_PAIRS = ImmutableMap.of(Deny.class, 0, Permit.class, 1,
- Stateful.class, 2);
-
- default VppAce fromStandardAce(@Nonnull final Ace ace) {
- return Optional.ofNullable(ace.getMatches())
- .map(Matches::getAceType)
- .map(VppAce.class::cast)
- .orElseThrow(() -> new IllegalArgumentException(String.format("Unable to create VppAce from %s", ace)));
- }
-
- default boolean standardIsIpv6(@Nonnull final VppAce ace, @Nullable final Matches matches) {
- final Optional<AceIpVersion> aceIpVersion = Optional.ofNullable(matches)
- .map(Matches::getAceType)
- .map(VppAce.class::cast)
- .map(VppAce::getVppAceNodes)
- .map(VppAceNodes::getAceIpVersion);
-
- // tries to detect version by ace-ip-version
- if(aceIpVersion.isPresent()){
- return aceIpVersion
- .map(version -> version instanceof AceIpv6)
- .orElse(false);
- }
+ Map<Class<? extends ForwardingAction>, Integer> ACTION_VALUE_PAIRS =
+ ImmutableMap.of(Drop.class, 0, Reject.class, 0, Accept.class, 1, AcceptAndReflect.class, 2);
- // otherwise goes by ip-protocol
- return Optional.ofNullable(ace.getVppAceNodes())
- .map(AclIpProtocolHeaderFields::getIpProtocol)
- .map(ipProtocol -> ipProtocol instanceof IcmpV6)
- .orElse(false);
+ default boolean standardIsIpv6(@Nullable final Matches matches) {
+ return Optional.ofNullable(matches)
+ .map(Matches::getL3)
+ .filter(l3 -> l3.getImplementedInterface().equals(Ipv6.class))
+ .map(Ipv6.class::cast)
+ .map(Ipv6::getIpv6)
+ .isPresent();
}
- default byte[] ipv4SourceAddress(@Nonnull final VppAce ace) {
- return extractIp4Address(
- extractV4SourceAddressOrNull(ace));
+ default byte[] ipv4SourceAddress(@Nonnull final Matches matches) {
+ return extractIp4Address(extractV4SourceAddressOrNull(matches));
}
- default byte ipv4SourceAddressPrefix(@Nonnull final VppAce ace) {
- return extractIp4AddressPrefix(
- extractV4SourceAddressOrNull(ace));
+ default byte ipv4SourceAddressPrefix(@Nonnull final Matches matches) {
+ return extractIp4AddressPrefix(extractV4SourceAddressOrNull(matches));
}
- static Ipv4Prefix extractV4SourceAddressOrNull(@Nonnull final VppAce ace) {
- return Optional.ofNullable(ace.getVppAceNodes())
- .map(VppAceNodes::getAceIpVersion)
- .map(AclIpv4HeaderFields.class::cast)
- .map(AclIpv4HeaderFields::getSourceIpv4Network)
+ static Ipv4Prefix extractV4SourceAddressOrNull(@Nonnull final Matches matches) {
+ return getIpv4Optional(matches)
+ .map(AclIpv4HeaderFields::getSourceNetwork)
+ .filter(network -> network instanceof SourceIpv4Network)
+ .map(SourceIpv4Network.class::cast)
+ .map(SourceIpv4Network::getSourceIpv4Network)
.orElse(null);
}
- default byte[] ipv4DestinationAddress(@Nonnull final VppAce ace) {
- return extractIp4Address(extractV4DestinationAddressOrNull(ace));
+ default byte[] ipv4DestinationAddress(@Nonnull final Matches matches) {
+ return extractIp4Address(extractV4DestinationAddressOrNull(matches));
}
- default byte ipv4DestinationAddressPrefix(@Nonnull final VppAce ace) {
- return extractIp4AddressPrefix(extractV4DestinationAddressOrNull(ace));
+ default byte ipv4DestinationAddressPrefix(@Nonnull final Matches matches) {
+ return extractIp4AddressPrefix(extractV4DestinationAddressOrNull(matches));
}
- static Ipv4Prefix extractV4DestinationAddressOrNull(@Nonnull final VppAce ace) {
- return Optional.ofNullable(ace.getVppAceNodes())
- .map(VppAceNodes::getAceIpVersion)
- .map(AclIpv4HeaderFields.class::cast)
- .map(AclIpv4HeaderFields::getDestinationIpv4Network)
+ static Ipv4Prefix extractV4DestinationAddressOrNull(@Nonnull final Matches matches) {
+ return getIpv4Optional(matches)
+ .map(AclIpv4HeaderFields::getDestinationNetwork)
+ .filter(destinationNetwork -> destinationNetwork instanceof DestinationIpv4Network)
+ .map(DestinationIpv4Network.class::cast)
+ .map(DestinationIpv4Network::getDestinationIpv4Network)
.orElse(null);
}
- default byte[] ipv6SourceAddress(@Nonnull final VppAce ace) {
- return extractIp6Address(extractV6SourceAddressOrNull(ace));
+ static Optional<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l3.ipv4.Ipv4> getIpv4Optional(
+ @Nonnull final Matches matches) {
+ return Optional.ofNullable(matches.getL3())
+ .filter(l3 -> l3.getImplementedInterface().equals(Ipv4.class))
+ .map(Ipv4.class::cast)
+ .map(Ipv4::getIpv4);
+ }
+
+ default byte[] ipv6SourceAddress(@Nonnull final Matches matches) {
+ return extractIp6Address(extractV6SourceAddressOrNull(matches));
}
- default byte ipv6SourceAddressPrefix(@Nonnull final VppAce ace) {
- return extractIp6AddressPrefix(extractV6SourceAddressOrNull(ace));
+ default byte ipv6SourceAddressPrefix(@Nonnull final Matches matches) {
+ return extractIp6AddressPrefix(extractV6SourceAddressOrNull(matches));
}
- static Ipv6Prefix extractV6SourceAddressOrNull(@Nonnull final VppAce ace) {
- return Optional.ofNullable(ace.getVppAceNodes())
- .map(VppAceNodes::getAceIpVersion)
- .map(AclIpv6HeaderFields.class::cast)
- .map(AclIpv6HeaderFields::getSourceIpv6Network)
+ static Ipv6Prefix extractV6SourceAddressOrNull(@Nonnull final Matches matches) {
+ return getIpv6Optional(matches)
+ .map(AclIpv6HeaderFields::getSourceNetwork)
+ .filter(sourceNetwork -> sourceNetwork instanceof SourceIpv6Network)
+ .map(SourceIpv6Network.class::cast)
+ .map(SourceIpv6Network::getSourceIpv6Network)
.orElse(null);
}
- default byte[] ipv6DestinationAddress(@Nonnull final VppAce ace) {
- return extractIp6Address(extractV6DestinationAddressOrNull(ace));
+ default byte[] ipv6DestinationAddress(@Nonnull final Matches matches) {
+ return extractIp6Address(extractV6DestinationAddressOrNull(matches));
}
- default byte ipv6DestinationAddressPrefix(@Nonnull final VppAce ace) {
- return extractIp6AddressPrefix(extractV6DestinationAddressOrNull(ace));
+ default byte ipv6DestinationAddressPrefix(@Nonnull final Matches matches) {
+ return extractIp6AddressPrefix(extractV6DestinationAddressOrNull(matches));
}
- static Ipv6Prefix extractV6DestinationAddressOrNull(@Nonnull final VppAce ace) {
- return Optional.ofNullable(ace.getVppAceNodes())
- .map(VppAceNodes::getAceIpVersion)
- .map(AclIpv6HeaderFields.class::cast)
- .map(AclIpv6HeaderFields::getDestinationIpv6Network)
+ static Ipv6Prefix extractV6DestinationAddressOrNull(@Nonnull final Matches matches) {
+ return getIpv6Optional(matches)
+ .map(AclIpv6HeaderFields::getDestinationNetwork)
+ .filter(destinationNetwork -> destinationNetwork instanceof DestinationIpv6Network)
+ .map(DestinationIpv6Network.class::cast)
+ .map(DestinationIpv6Network::getDestinationIpv6Network)
.orElse(null);
}
+ static Optional<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l3.ipv6.Ipv6> getIpv6Optional(
+ @Nonnull final Matches matches) {
+ return Optional.ofNullable(matches.getL3())
+ .filter(l3 -> l3.getImplementedInterface().equals(Ipv6.class))
+ .map(Ipv6.class::cast)
+ .map(Ipv6::getIpv6);
+ }
+
default byte standardAction(@Nonnull final Ace ace) {
- // default == deny
- final PacketHandling action = Optional.ofNullable(ace.getActions())
+ Class<? extends ForwardingAction> forwarding = Optional.ofNullable(ace.getActions())
.orElseThrow(() -> new IllegalArgumentException(String.format("Unable to extract Action from %s", ace)))
- .getPacketHandling();
+ .getForwarding();
return ACTION_VALUE_PAIRS.get(ACTION_VALUE_PAIRS.keySet().stream()
- .filter(aClass -> aClass.isInstance(action))
+ .filter(aClass -> aClass.equals(forwarding))
.findAny()
.orElseThrow(() -> new IllegalArgumentException(
- String.format("Unsupported packet-handling action %s for ACE %s", action,
- ace.getRuleName())))).byteValue();
+ String.format("Unsupported packet-handling action %s for ACE %s", forwarding,
+ ace.getName())))).byteValue();
}
- default AceIpVersion ipVersion(@Nonnull final AclRule rule) {
+ default L3 parseStandardAceL3(@Nonnull final AclRule rule) {
if (rule.isIpv6 == 0) {
return ip4Ace(rule);
} else {
@@ -172,40 +173,55 @@ public interface StandardAceDataExtractor extends AddressExtractor, ProtoPreBind
}
}
- default AceIpVersion ip4Ace(@Nonnull final AclRule rule) {
- final AceIpv4Builder ipVersion = new AceIpv4Builder();
+ default org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l3.Ipv4 ip4Ace(
+ @Nonnull final AclRule rule) {
+ Ipv4Builder ipv4Builder = new Ipv4Builder();
+ org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l3.ipv4.Ipv4Builder
+ ip4Builder =
+ new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l3.ipv4.Ipv4Builder();
if (rule.srcIpAddr != null && rule.srcIpAddr.length != 0) {
- ipVersion.setSourceIpv4Network(toIpv4Prefix(truncateIp4Array(rule.srcIpAddr), rule.srcIpPrefixLen));
+ ip4Builder.setSourceNetwork(new SourceIpv4NetworkBuilder()
+ .setSourceIpv4Network(toIpv4Prefix(truncateIp4Array(rule.srcIpAddr), rule.srcIpPrefixLen))
+ .build());
}
if (rule.dstIpAddr != null && rule.dstIpAddr.length != 0) {
- ipVersion.setDestinationIpv4Network(toIpv4Prefix(truncateIp4Array(rule.dstIpAddr), rule.dstIpPrefixLen));
+ ip4Builder.setDestinationNetwork(new DestinationIpv4NetworkBuilder()
+ .setDestinationIpv4Network(toIpv4Prefix(truncateIp4Array(rule.dstIpAddr), rule.dstIpPrefixLen))
+ .build());
}
- return ipVersion.build();
+ return ipv4Builder.setIpv4(ip4Builder.build()).build();
}
- default AceIpVersion ip6Ace(@Nonnull final AclRule rule) {
- final AceIpv6Builder ipVersion = new AceIpv6Builder();
+ default org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l3.Ipv6 ip6Ace(
+ @Nonnull final AclRule rule) {
+ Ipv6Builder ipv6Builder = new Ipv6Builder();
+ org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l3.ipv6.Ipv6Builder
+ ip6Builder =
+ new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l3.ipv6.Ipv6Builder();
+
if (rule.srcIpAddr != null && rule.srcIpAddr.length != 0) {
- ipVersion.setSourceIpv6Network(toIpv6Prefix(rule.srcIpAddr, rule.srcIpPrefixLen));
+ ip6Builder.setSourceNetwork(new SourceIpv6NetworkBuilder()
+ .setSourceIpv6Network(toIpv6Prefix(rule.srcIpAddr, rule.srcIpPrefixLen))
+ .build());
}
if (rule.dstIpAddr != null && rule.dstIpAddr.length != 0) {
- ipVersion.setDestinationIpv6Network(toIpv6Prefix(rule.dstIpAddr, rule.dstIpPrefixLen));
+ ip6Builder.setDestinationNetwork(new DestinationIpv6NetworkBuilder()
+ .setDestinationIpv6Network(toIpv6Prefix(rule.dstIpAddr, rule.dstIpPrefixLen))
+ .build());
}
- return ipVersion.build();
+ return ipv6Builder.setIpv6(ip6Builder.build()).build();
}
default Actions actions(final byte isPermit) {
final ActionsBuilder actions = new ActionsBuilder();
switch (isPermit) {
case 0:
- actions.setPacketHandling(new DenyBuilder().setDeny(true).build());
+ actions.setForwarding(Drop.class);
break;
case 1:
- actions.setPacketHandling(new PermitBuilder().setPermit(true).build());
- break;
- case 2:
- actions.setPacketHandling(new StatefulBuilder().setPermitAndReflect(true).build());
+ actions.setForwarding(Accept.class);
break;
+
default:
throw new IllegalArgumentException("Unsupported action: " + isPermit);
}
diff --git a/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/acl/AclDataExtractor.java b/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/acl/AclDataExtractor.java
index 5f75ae306..977dd4062 100644
--- a/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/acl/AclDataExtractor.java
+++ b/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/acl/AclDataExtractor.java
@@ -16,16 +16,19 @@
package io.fd.hc2vpp.acl.util.acl;
+import com.google.common.base.Preconditions;
+import io.fd.hc2vpp.acl.write.AclValidator;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Optional;
import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.Acl;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.Ace;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.Matches;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.VppAclAugmentation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.VppAce;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.VppMacipAce;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.rev181022.VppAcl;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.rev181022.VppAclAugmentation;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.rev181022.VppMacipAcl;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.AclBase;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.Ipv4AclType;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.Acl;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.Ace;
/**
* Extracts data from Acls.
@@ -34,31 +37,25 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.
public interface AclDataExtractor {
/**
- * Checks if provided {@link Acl} has aces of type {@link VppAce}
+ * Checks if provided {@link Acl} has aces of type {@link Ipv4AclType} or {@link VppAcl}
*/
default boolean isStandardAcl(@Nonnull final Acl acl) {
- return acl.getAccessListEntries().getAce().stream()
- .map(Ace::getMatches)
- .map(Matches::getAceType)
- .filter(aceType -> aceType instanceof VppAce)
- .findAny()
- .isPresent();
+ Class<? extends AclBase> type =
+ Preconditions.checkNotNull(acl.getType(), "Type is not set for ACL:{}", acl);
+ return type.equals(VppAcl.class);
}
/**
- * Checks if provided {@link Acl} has aces of type {@link VppMacipAce}
+ * Checks if provided {@link Acl} has aces of type {@link VppMacipAcl}
*/
default boolean isMacIpAcl(@Nonnull final Acl acl) {
- return acl.getAccessListEntries().getAce().stream()
- .map(Ace::getMatches)
- .map(Matches::getAceType)
- .filter(aceType -> aceType instanceof VppMacipAce)
- .findAny()
- .isPresent();
+ Class<? extends AclBase> type =
+ Preconditions.checkNotNull(acl.getType(), "Type is not set for ACL:{}", acl);
+ return type.equals(VppMacipAcl.class);
}
default List<Ace> getAces(@Nonnull final Acl acl) {
- return Optional.ofNullable(acl.getAccessListEntries()).orElseThrow(() ->
+ return Optional.ofNullable(acl.getAces()).orElseThrow(() ->
new IllegalArgumentException(String.format("Unable to extract aces from %s", acl))).getAce();
}
diff --git a/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/acl/AclWriter.java b/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/acl/AclWriter.java
deleted file mode 100644
index 32e20ebac..000000000
--- a/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/acl/AclWriter.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.hc2vpp.acl.util.acl;
-
-import io.fd.hc2vpp.acl.util.AclContextManager;
-import io.fd.hc2vpp.acl.util.ace.AceConverter;
-import io.fd.hc2vpp.common.translate.util.JvppReplyConsumer;
-import io.fd.honeycomb.translate.MappingContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import io.fd.vpp.jvpp.acl.dto.AclAddReplace;
-import io.fd.vpp.jvpp.acl.dto.AclAddReplaceReply;
-import io.fd.vpp.jvpp.acl.dto.AclDel;
-import io.fd.vpp.jvpp.acl.dto.MacipAclAdd;
-import io.fd.vpp.jvpp.acl.dto.MacipAclAddReply;
-import io.fd.vpp.jvpp.acl.dto.MacipAclDel;
-import io.fd.vpp.jvpp.acl.future.FutureJVppAclFacade;
-import java.util.List;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.Acl;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.Ace;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-
-/**
- * Write standard and mac-ip acls
- */
-public interface AclWriter extends AclDataExtractor, AceConverter, JvppReplyConsumer {
-
- int ACL_INDEX_CREATE_NEW = -1;
-
- default void addStandardAcl(@Nonnull final FutureJVppAclFacade futureFacade,
- @Nonnull final InstanceIdentifier<Acl> id, @Nonnull final Acl acl,
- @Nonnull final AclContextManager standardAclContext,
- @Nonnull final MappingContext mappingContext) throws WriteFailedException {
-
- final AclAddReplace request = new AclAddReplace();
-
- request.tag = getAclTag(acl);
- request.aclIndex = ACL_INDEX_CREATE_NEW;
-
- final List<Ace> aces = getAces(acl);
- request.r = toStandardAclRules(aces);
- request.count = request.r.length;
-
- final AclAddReplaceReply reply =
- getReplyForWrite(futureFacade.aclAddReplace(request).toCompletableFuture(), id);
-
- // maps new acl to returned index
- standardAclContext.addAcl(reply.aclIndex, acl.getAclName(), aces, mappingContext);
- }
-
- // according to vpp team, this was tested extensively, and should work
- default void updateStandardAcl(@Nonnull final FutureJVppAclFacade futureFacade,
- @Nonnull final InstanceIdentifier<Acl> id, @Nonnull final Acl acl,
- @Nonnull final AclContextManager standardAclContext,
- @Nonnull final MappingContext mappingContext) throws WriteFailedException {
-
- final AclAddReplace request = new AclAddReplace();
-
- request.tag = getAclTag(acl);
- // by setting existing index, request is resolved as update
- request.aclIndex = standardAclContext.getAclIndex(acl.getAclName(), mappingContext);
-
- final List<Ace> aces = getAces(acl);
- request.r = toStandardAclRules(aces);
- request.count = request.r.length;
-
- final AclAddReplaceReply reply = getReplyForWrite(futureFacade.aclAddReplace(request).toCompletableFuture(), id);
-
- // overwrites existing acl metadata (aces might have been changed):
- standardAclContext.addAcl(reply.aclIndex, acl.getAclName(), aces, mappingContext);
- }
-
- default void deleteStandardAcl(@Nonnull final FutureJVppAclFacade futureFacade,
- @Nonnull final InstanceIdentifier<Acl> id, @Nonnull final Acl acl,
- @Nonnull final AclContextManager standardAclContext,
- @Nonnull final MappingContext mappingContext) throws WriteFailedException {
-
- final AclDel request = new AclDel();
- final String aclName = acl.getAclName();
- request.aclIndex = standardAclContext.getAclIndex(aclName, mappingContext);
-
- getReplyForDelete(futureFacade.aclDel(request).toCompletableFuture(), id);
-
- // removes mapping after successful delete
- standardAclContext.removeAcl(aclName, mappingContext);
- }
-
- default void addMacIpAcl(@Nonnull final FutureJVppAclFacade futureFacade,
- @Nonnull final InstanceIdentifier<Acl> id, @Nonnull final Acl acl,
- @Nonnull final AclContextManager macIpAclContext,
- @Nonnull final MappingContext mappingContext) throws WriteFailedException {
- final MacipAclAdd request = new MacipAclAdd();
-
- request.tag = getAclTag(acl);
-
- final List<Ace> aces = getAces(acl);
- request.r = toMacIpAclRules(aces);
- request.count = request.r.length;
-
- final MacipAclAddReply reply = getReplyForWrite(futureFacade.macipAclAdd(request).toCompletableFuture(), id);
-
- // map mac-ip acl to returned index
- macIpAclContext.addAcl(reply.aclIndex, acl.getAclName(), aces, mappingContext);
- }
-
- default void deleteMacIpAcl(@Nonnull final FutureJVppAclFacade futureFacade,
- @Nonnull final InstanceIdentifier<Acl> id, @Nonnull final Acl acl,
- @Nonnull final AclContextManager macIpAclContext,
- @Nonnull final MappingContext mappingContext) throws WriteFailedException {
- final MacipAclDel request = new MacipAclDel();
- final String aclName = acl.getAclName();
- request.aclIndex = macIpAclContext.getAclIndex(aclName, mappingContext);
-
- getReplyForDelete(futureFacade.macipAclDel(request).toCompletableFuture(), id);
-
- macIpAclContext.removeAcl(aclName, mappingContext);
- }
-
-
-}
diff --git a/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/factory/AclFactory.java b/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/factory/AclFactory.java
deleted file mode 100644
index 474a52844..000000000
--- a/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/factory/AclFactory.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (c) 2017 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.hc2vpp.acl.util.factory;
-
-import com.google.common.collect.ImmutableSet;
-import java.util.Set;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.Acl;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.AccessListEntries;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.Ace;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.Actions;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.Matches;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.DestinationPortRange;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.SourcePortRange;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.VppAclAugmentation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.VppAceNodes;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.macip.ace.VppMacipAceNodes;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.icmp.header.fields.IcmpCodeRange;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.icmp.header.fields.IcmpTypeRange;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.icmp.IcmpNodes;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.icmp.v6.IcmpV6Nodes;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.other.OtherNodes;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.tcp.TcpNodes;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.udp.UdpNodes;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-
-public interface AclFactory {
-
- default Set<InstanceIdentifier<?>> vppAclChildren(final InstanceIdentifier<Acl> parentId) {
- final InstanceIdentifier<Matches> matchesIid =
- parentId.child(AccessListEntries.class).child(Ace.class).child(Matches.class);
- return ImmutableSet.of(
- parentId.augmentation(VppAclAugmentation.class),
- parentId.child(AccessListEntries.class),
- parentId.child(AccessListEntries.class).child(Ace.class),
- parentId.child(AccessListEntries.class).child(Ace.class).child(Matches.class),
- parentId.child(AccessListEntries.class).child(Ace.class).child(Actions.class),
- matchesIid,
- matchesIid.child(VppMacipAceNodes.class),
- matchesIid.child(VppAceNodes.class),
- matchesIid.child(VppAceNodes.class).child(IcmpNodes.class),
- matchesIid.child(VppAceNodes.class).child(IcmpNodes.class).child(IcmpCodeRange.class),
- matchesIid.child(VppAceNodes.class).child(IcmpNodes.class).child(IcmpTypeRange.class),
- matchesIid.child(VppAceNodes.class).child(IcmpV6Nodes.class),
- matchesIid.child(VppAceNodes.class).child(IcmpV6Nodes.class).child(IcmpCodeRange.class),
- matchesIid.child(VppAceNodes.class).child(IcmpV6Nodes.class).child(IcmpTypeRange.class),
- matchesIid.child(VppAceNodes.class).child(UdpNodes.class),
- matchesIid.child(VppAceNodes.class).child(UdpNodes.class).child(SourcePortRange.class),
- matchesIid.child(VppAceNodes.class).child(UdpNodes.class).child(DestinationPortRange.class),
- matchesIid.child(VppAceNodes.class).child(TcpNodes.class),
- matchesIid.child(VppAceNodes.class).child(TcpNodes.class).child(SourcePortRange.class),
- matchesIid.child(VppAceNodes.class).child(TcpNodes.class).child(DestinationPortRange.class),
- matchesIid.child(VppAceNodes.class).child(OtherNodes.class)
-
- );
- }
-
-}
diff --git a/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/iface/acl/AclInterfaceAssignmentRequest.java b/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/iface/acl/AclInterfaceAssignmentRequest.java
deleted file mode 100644
index bf1f1497e..000000000
--- a/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/iface/acl/AclInterfaceAssignmentRequest.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package io.fd.hc2vpp.acl.util.iface.acl;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.common.collect.ImmutableList;
-import io.fd.hc2vpp.acl.util.AclContextManager;
-import io.fd.hc2vpp.common.translate.util.ByteDataTranslator;
-import io.fd.hc2vpp.common.translate.util.JvppReplyConsumer;
-import io.fd.hc2vpp.common.translate.util.NamingContext;
-import io.fd.honeycomb.translate.MappingContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import io.fd.vpp.jvpp.acl.dto.AclInterfaceSetAclList;
-import io.fd.vpp.jvpp.acl.future.FutureJVppAclFacade;
-import java.util.Collections;
-import java.util.List;
-import java.util.stream.Stream;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.acl.rev161214._interface.acl.attributes.Acl;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Multi-assignment single-request taking advantage from acl_interface_set_acl_list api
- */
-public class AclInterfaceAssignmentRequest implements JvppReplyConsumer, ByteDataTranslator {
-
- private static final Logger LOG = LoggerFactory.getLogger(AclInterfaceAssignmentRequest.class);
-
- private final MappingContext mappingContext;
- private InstanceIdentifier<Acl> identifier;
- private List<String> inputAclNames = Collections.emptyList();
- private List<String> outputAclNames = Collections.emptyList();
- private AclContextManager standardAclContext;
- private NamingContext interfaceContext;
-
-
- private AclInterfaceAssignmentRequest(final MappingContext mappingContext) {
- this.mappingContext = checkNotNull(mappingContext, "Mapping context cannot be null");
- }
-
- public static AclInterfaceAssignmentRequest create(@Nonnull final MappingContext mappingContext) {
- return new AclInterfaceAssignmentRequest(mappingContext);
- }
-
- public AclInterfaceAssignmentRequest identifier(
- @Nonnull final InstanceIdentifier<Acl> identifier) {
- this.identifier = identifier;
- return this;
- }
-
- public AclInterfaceAssignmentRequest inputAclNames(@Nonnull final List<String> inputAclNames) {
- checkNotNull(inputAclNames, "Input ACL names cannot be null");
- this.inputAclNames = ImmutableList.copyOf(inputAclNames);
- return this;
- }
-
- public AclInterfaceAssignmentRequest outputAclNames(@Nonnull final List<String> outputAclNames) {
- checkNotNull(outputAclNames, "Output ACL names cannot be null");
- this.outputAclNames = ImmutableList.copyOf(outputAclNames);
- return this;
- }
-
- public AclInterfaceAssignmentRequest standardAclContext(@Nonnull final AclContextManager standardAclContext) {
- this.standardAclContext = standardAclContext;
- return this;
- }
-
- public AclInterfaceAssignmentRequest interfaceContext(@Nonnull final NamingContext interfaceContext) {
- this.interfaceContext = interfaceContext;
- return this;
- }
-
- private void checkValidRequest() {
- checkNotNull(identifier, "Identifier cannot be null");
- checkNotNull(standardAclContext, "ACL context cannot be null");
- checkNotNull(interfaceContext, "Interface context cannot be null");
- }
-
- public void executeAsCreate(@Nonnull final FutureJVppAclFacade api) throws WriteFailedException {
- checkValidRequest();
- final String interfaceName = identifier.firstKeyOf(Interface.class).getName();
-
- // locking on mapping context, to prevent modifying of mappings (for both contexts) during binding/execution of request
- synchronized (mappingContext) {
- LOG.debug(
- "Executing acl interface assignment write request for interface={}, input ACL's={},output ACL's={}",
- interfaceName, inputAclNames, outputAclNames);
-
- getReplyForWrite(api.aclInterfaceSetAclList(createRequest(interfaceName)).toCompletableFuture(),
- identifier);
- LOG.debug(
- "Acl interface assignment write request for interface={}, input ACL's={},output ACL's={} successfully passed",
- interfaceName, inputAclNames, outputAclNames);
- }
- }
-
- public void executeAsUpdate(@Nonnull final FutureJVppAclFacade api, final Acl before, final Acl after)
- throws WriteFailedException {
- checkValidRequest();
- final String interfaceName = identifier.firstKeyOf(Interface.class).getName();
-
- // locking on mapping context, to prevent modifying of mappings (for both contexts) during binding/execution of request
- synchronized (mappingContext) {
- LOG.debug(
- "Executing acl interface assignment update request for interface={}, input ACL's={},output ACL's={}",
- interfaceName, inputAclNames, outputAclNames);
-
- getReplyForUpdate(api.aclInterfaceSetAclList(createRequest(interfaceName)).toCompletableFuture(),
- identifier, before, after);
- LOG.debug(
- "Acl interface assignment update request for interface={}, input ACL's={},output ACL's={} successfully passed",
- interfaceName, inputAclNames, outputAclNames);
- }
- }
-
- public void executeAsDelete(@Nonnull final FutureJVppAclFacade api) throws WriteFailedException {
- checkValidRequest();
- final String interfaceName = identifier.firstKeyOf(Interface.class).getName();
-
- // locking on mapping context, to prevent modifying of mappings (for both contexts) during binding/execution of request
- synchronized (mappingContext) {
- LOG.debug(
- "Executing acl interface assignment delete request for interface={}, input ACL's={},output ACL's={}",
- interfaceName, inputAclNames, outputAclNames);
-
- // remove all ACLs, just in case they were set by AclInterfaceAssignmentRequest user
- inputAclNames = Collections.emptyList();
- outputAclNames = Collections.emptyList();
-
- getReplyForDelete(api.aclInterfaceSetAclList(createRequest(interfaceName)).toCompletableFuture(),
- identifier);
- LOG.debug(
- "Acl interface assignment delete request for interface={}, input ACL's={},output ACL's={} successfully passed",
- interfaceName, inputAclNames, outputAclNames);
- }
- }
-
- // synchronized on higher layer
- private AclInterfaceSetAclList createRequest(final String interfaceName) {
-
- AclInterfaceSetAclList request = new AclInterfaceSetAclList();
- request.swIfIndex = interfaceContext.getIndex(interfaceName, mappingContext);
- // FIXME (HC2VPP-201): possible overflow
- request.nInput = (byte) inputAclNames.size();
- request.count = (byte) (inputAclNames.size() + outputAclNames.size());
- request.acls = Stream.concat(inputAclNames.stream(), outputAclNames.stream())
- .mapToInt(aclName -> standardAclContext.getAclIndex(aclName, mappingContext))
- .toArray();
- return request;
- }
-}
diff --git a/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/iface/macip/MacIpInterfaceAssignmentRequest.java b/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/iface/macip/MacIpInterfaceAssignmentRequest.java
deleted file mode 100644
index 882cfd631..000000000
--- a/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/iface/macip/MacIpInterfaceAssignmentRequest.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package io.fd.hc2vpp.acl.util.iface.macip;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import io.fd.hc2vpp.acl.util.AclContextManager;
-import io.fd.hc2vpp.common.translate.util.ByteDataTranslator;
-import io.fd.hc2vpp.common.translate.util.JvppReplyConsumer;
-import io.fd.hc2vpp.common.translate.util.NamingContext;
-import io.fd.honeycomb.translate.MappingContext;
-import io.fd.honeycomb.translate.write.WriteFailedException;
-import io.fd.vpp.jvpp.acl.dto.MacipAclInterfaceAddDel;
-import io.fd.vpp.jvpp.acl.future.FutureJVppAclFacade;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang._interface.acl.rev161214.vpp.macip.acls.base.attributes.VppMacipAcl;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class MacIpInterfaceAssignmentRequest implements ByteDataTranslator, JvppReplyConsumer {
-
- private static final Logger LOG = LoggerFactory.getLogger(MacIpInterfaceAssignmentRequest.class);
-
- private final boolean isNew;
- private final MappingContext mappingContext;
- private InstanceIdentifier<VppMacipAcl> identifier;
- private String aclName;
- private AclContextManager macIpAclContext;
- private NamingContext interfaceContext;
-
-
- private MacIpInterfaceAssignmentRequest(final boolean isNew, final MappingContext mappingContext) {
- this.isNew = isNew;
- this.mappingContext = checkNotNull(mappingContext, "Mapping context cannot be null");
- }
-
- public static MacIpInterfaceAssignmentRequest addNew(@Nonnull final MappingContext mappingContext) {
- return new MacIpInterfaceAssignmentRequest(true, mappingContext);
- }
-
- public static MacIpInterfaceAssignmentRequest deleteExisting(@Nonnull final MappingContext mappingContext) {
- return new MacIpInterfaceAssignmentRequest(false, mappingContext);
- }
-
- public MacIpInterfaceAssignmentRequest identifier(@Nonnull final InstanceIdentifier<VppMacipAcl> identifier) {
- this.identifier = identifier;
- return this;
- }
-
- public MacIpInterfaceAssignmentRequest aclName(@Nonnull final String aclName) {
- this.aclName = aclName;
- return this;
- }
-
- public MacIpInterfaceAssignmentRequest macIpAclContext(@Nonnull final AclContextManager macIpAclContext) {
- this.macIpAclContext = macIpAclContext;
- return this;
- }
-
- public MacIpInterfaceAssignmentRequest interfaceContext(@Nonnull final NamingContext interfaceContext) {
- this.interfaceContext = interfaceContext;
- return this;
- }
-
- private void checkValidRequest() {
- checkNotNull(identifier, "Identifier cannot be null");
- checkNotNull(aclName, "ACL name cannot be null");
- checkNotNull(macIpAclContext, "ACL context cannot be null");
- checkNotNull(interfaceContext, "Interface context cannot be null");
- }
-
- public void execute(@Nonnull final FutureJVppAclFacade api)
- throws WriteFailedException {
-
- // locking on mapping context, to prevent modifying of mappings (for both contexts) during execution of request
- synchronized (mappingContext) {
- checkValidRequest();
-
- final String interfaceName = identifier.firstKeyOf(Interface.class).getName();
-
- MacipAclInterfaceAddDel request = new MacipAclInterfaceAddDel();
- request.isAdd = booleanToByte(isNew);
- request.aclIndex = macIpAclContext.getAclIndex(aclName, mappingContext);
- request.swIfIndex =
- interfaceContext.getIndex(interfaceName, mappingContext);
-
- LOG.debug("Executing mac-ip interface assignment request for isNew={},aclName={},interfaceName={}", isNew,
- aclName, interfaceName);
- getReplyForWrite(api.macipAclInterfaceAddDel(request).toCompletableFuture(), identifier);
- LOG.debug(
- "Mac-ip interface assignment request for isNew={},aclName={},interfaceName={} successfully passed",
- isNew, aclName, interfaceName);
- }
- }
-}
diff --git a/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/protocol/IpProtocolReader.java b/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/protocol/IpProtocolReader.java
index 9c8b99b45..3207ecd4b 100644
--- a/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/protocol/IpProtocolReader.java
+++ b/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/protocol/IpProtocolReader.java
@@ -21,40 +21,42 @@ import static io.fd.hc2vpp.acl.util.protocol.ProtoPreBindRuleProducer.ICMP_INDEX
import static io.fd.hc2vpp.acl.util.protocol.ProtoPreBindRuleProducer.TCP_INDEX;
import static io.fd.hc2vpp.acl.util.protocol.ProtoPreBindRuleProducer.UDP_INDEX;
+import com.google.common.annotations.VisibleForTesting;
import io.fd.vpp.jvpp.acl.types.AclRule;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.rev181022.VppIcmpAceAugmentation;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.rev181022.VppIcmpAceAugmentationBuilder;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.rev181022.VppTcpAceAugmentation;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.rev181022.VppTcpAceAugmentationBuilder;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.rev181022.acl.icmp.header.fields.IcmpCodeRange;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.rev181022.acl.icmp.header.fields.IcmpCodeRangeBuilder;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.rev181022.acl.icmp.header.fields.IcmpTypeRange;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.rev181022.acl.icmp.header.fields.IcmpTypeRangeBuilder;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.rev181022.acls.acl.aces.ace.matches.l4.icmp.icmp.VppIcmpAceBuilder;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.rev181022.acls.acl.aces.ace.matches.l4.tcp.tcp.VppTcpAceBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.L4;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.Icmp;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.IcmpBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.Tcp;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.TcpBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.Udp;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.UdpBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.tcp.tcp.DestinationPortBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.tcp.tcp.SourcePortBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.tcp.tcp.source.port.source.port.RangeOrOperatorBuilder;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.DestinationPortRange;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.DestinationPortRangeBuilder;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.SourcePortRange;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.SourcePortRangeBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.icmp.header.fields.IcmpCodeRange;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.icmp.header.fields.IcmpCodeRangeBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.icmp.header.fields.IcmpTypeRange;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.icmp.header.fields.IcmpTypeRangeBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.IpProtocol;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.Icmp;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.IcmpBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.IcmpV6;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.IcmpV6Builder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.Other;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.OtherBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.Tcp;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.TcpBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.Udp;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.UdpBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.icmp.IcmpNodesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.icmp.v6.IcmpV6NodesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.other.OtherNodesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.tcp.TcpNodesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.udp.UdpNodesBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev181001.AclTcpHeaderFields;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev181001.port.range.or.operator.PortRangeOrOperator;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev181001.port.range.or.operator.port.range.or.operator.Range;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev181001.port.range.or.operator.port.range.or.operator.RangeBuilder;
/**
* Utility for parsing IpProtocol DO based on data returned by vpp as {@link AclRule}.
*/
public interface IpProtocolReader {
- default IpProtocol parseProtocol(final AclRule rule) {
+ default L4 parseProtocol(final AclRule rule) {
switch (rule.proto) {
+ case ICMPV6_INDEX:
case ICMP_INDEX: {
return Impl.parseIcmp(rule);
}
@@ -66,14 +68,8 @@ public interface IpProtocolReader {
case UDP_INDEX: {
return Impl.parseUdp(rule);
}
-
- case ICMPV6_INDEX: {
- return Impl.parseIcmp6(rule);
- }
- default: {
- return Impl.parse(rule);
- }
}
+ return null;
}
class Impl {
@@ -91,51 +87,107 @@ public interface IpProtocolReader {
}
private static Icmp parseIcmp(final AclRule rule) {
- final IcmpNodesBuilder nodes = new IcmpNodesBuilder();
- nodes.setIcmpCodeRange(parseIcmpCodeRange(rule));
- nodes.setIcmpTypeRange(parseIcmpTypeRange(rule));
- return new IcmpBuilder().setIcmpNodes(nodes.build()).build();
+ return new IcmpBuilder().setIcmp(
+ new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.icmp.IcmpBuilder()
+ .addAugmentation(VppIcmpAceAugmentation.class,
+ new VppIcmpAceAugmentationBuilder()
+ .setVppIcmpAce(new VppIcmpAceBuilder()
+ .setIcmpCodeRange(parseIcmpCodeRange(rule))
+ .setIcmpTypeRange(parseIcmpTypeRange(rule))
+ .build())
+ .build())
+ .build())
+ .build();
}
- private static DestinationPortRange parseDstPortRange(final AclRule rule) {
- return new DestinationPortRangeBuilder()
- .setLowerPort(new PortNumber(Short.toUnsignedInt(rule.dstportOrIcmpcodeFirst)))
- .setUpperPort(new PortNumber(Short.toUnsignedInt(rule.dstportOrIcmpcodeLast))).build();
+ private static PortRangeOrOperator parseDstPortRange(final AclRule rule) {
+ return new RangeBuilder()
+ .setLowerPort(new PortNumber(Short.toUnsignedInt(rule.dstportOrIcmpcodeFirst)))
+ .setUpperPort(new PortNumber(Short.toUnsignedInt(rule.dstportOrIcmpcodeLast))).build();
}
- private static SourcePortRange parseSrcPortRange(final AclRule rule) {
- return new SourcePortRangeBuilder()
+ private static Range parseSrcPortRange(final AclRule rule) {
+ return new RangeBuilder()
.setLowerPort(new PortNumber(Short.toUnsignedInt(rule.srcportOrIcmptypeFirst)))
.setUpperPort(new PortNumber(Short.toUnsignedInt(rule.srcportOrIcmptypeLast))).build();
}
private static Tcp parseTcp(final AclRule rule) {
- final TcpNodesBuilder nodes = new TcpNodesBuilder();
- nodes.setDestinationPortRange(parseDstPortRange(rule));
- nodes.setSourcePortRange(parseSrcPortRange(rule));
- nodes.setTcpFlagsMask((short) Byte.toUnsignedInt(rule.tcpFlagsMask));
- nodes.setTcpFlagsValue((short) Byte.toUnsignedInt(rule.tcpFlagsValue));
- return new TcpBuilder().setTcpNodes(nodes.build()).build();
+ return new TcpBuilder().setTcp(
+ new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.tcp.TcpBuilder()
+ .setFlags(parseTcpFlags((short) Byte.toUnsignedInt(rule.tcpFlagsValue)))
+ .addAugmentation(VppTcpAceAugmentation.class, new VppTcpAceAugmentationBuilder()
+ .setVppTcpAce(new VppTcpAceBuilder()
+ .setFlagsMask(
+ parseTcpFlagsMask((short) Byte.toUnsignedInt(rule.tcpFlagsMask)))
+ .build())
+ .build())
+ .setSourcePort(new SourcePortBuilder()
+ .setSourcePort(new RangeOrOperatorBuilder()
+ .setPortRangeOrOperator(parseSrcPortRange(rule))
+ .build())
+ .build())
+ .setDestinationPort(new DestinationPortBuilder()
+ .setDestinationPort(
+ new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.tcp.tcp.destination.port.destination.port.RangeOrOperatorBuilder()
+ .setPortRangeOrOperator(parseDstPortRange(rule))
+ .build())
+ .build())
+ .build())
+ .build();
}
- private static Udp parseUdp(final AclRule rule) {
- final UdpNodesBuilder nodes = new UdpNodesBuilder();
- nodes.setDestinationPortRange(parseDstPortRange(rule));
- nodes.setSourcePortRange(parseSrcPortRange(rule));
- return new UdpBuilder().setUdpNodes(nodes.build()).build();
+ @VisibleForTesting
+ private static org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.rev181022.AclTcpHeaderFields.FlagsMask parseTcpFlagsMask(
+ final short tcpFlagsMask) {
+ // Flags from bit on position 1 to 8
+ final Boolean cwr = (tcpFlagsMask & 0b00000001) == 1;
+ final Boolean ece = (tcpFlagsMask & 0b00000010) >> 1 == 1;
+ final Boolean urg = (tcpFlagsMask & 0b00000100) >> 2 == 1;
+ final Boolean ack = (tcpFlagsMask & 0b00001000) >> 3 == 1;
+ final Boolean psh = (tcpFlagsMask & 0b00010000) >> 4 == 1;
+ final Boolean rst = (tcpFlagsMask & 0b00100000) >> 5 == 1;
+ final Boolean syn = (tcpFlagsMask & 0b01000000) >> 6 == 1;
+ final Boolean fin = (tcpFlagsMask & 0b10000000) >> 7 == 1;
+
+ return new org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.rev181022.AclTcpHeaderFields.FlagsMask(
+ ack, cwr, ece, fin, psh, rst, syn, urg);
}
- private static IcmpV6 parseIcmp6(final AclRule rule) {
- final IcmpV6NodesBuilder nodes = new IcmpV6NodesBuilder();
- nodes.setIcmpCodeRange(parseIcmpCodeRange(rule));
- nodes.setIcmpTypeRange(parseIcmpTypeRange(rule));
- return new IcmpV6Builder().setIcmpV6Nodes(nodes.build()).build();
+ @VisibleForTesting
+ private static AclTcpHeaderFields.Flags parseTcpFlags(final short tcpFlagsValue) {
+ // Flags from bit on position 1 to 8
+ final Boolean cwr = (tcpFlagsValue & 0b00000001) == 1;
+ final Boolean ece = (tcpFlagsValue & 0b00000010) >> 1 == 1;
+ final Boolean urg = (tcpFlagsValue & 0b00000100) >> 2 == 1;
+ final Boolean ack = (tcpFlagsValue & 0b00001000) >> 3 == 1;
+ final Boolean psh = (tcpFlagsValue & 0b00010000) >> 4 == 1;
+ final Boolean rst = (tcpFlagsValue & 0b00100000) >> 5 == 1;
+ final Boolean syn = (tcpFlagsValue & 0b01000000) >> 6 == 1;
+ final Boolean fin = (tcpFlagsValue & 0b10000000) >> 7 == 1;
+
+ return new AclTcpHeaderFields.Flags(ack, cwr, ece, fin, psh, rst, syn, urg);
}
- private static Other parse(final AclRule rule) {
- final OtherNodesBuilder nodes = new OtherNodesBuilder();
- nodes.setProtocol((short) Short.toUnsignedInt(rule.proto));
- return new OtherBuilder().setOtherNodes(nodes.build()).build();
+ private static Udp parseUdp(final AclRule rule) {
+ return new UdpBuilder().setUdp(
+ new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.udp.UdpBuilder()
+ .setSourcePort(
+ new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.udp.udp.SourcePortBuilder()
+ .setSourcePort(
+ new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.udp.udp.source.port.source.port.RangeOrOperatorBuilder()
+ .setPortRangeOrOperator(parseSrcPortRange(rule))
+ .build())
+ .build())
+ .setDestinationPort(
+ new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.udp.udp.DestinationPortBuilder()
+ .setDestinationPort(
+ new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.udp.udp.destination.port.destination.port.RangeOrOperatorBuilder()
+ .setPortRangeOrOperator(parseDstPortRange(rule))
+ .build())
+ .build())
+ .build())
+ .build();
}
}
}
diff --git a/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/protocol/ProtoPreBindRuleProducer.java b/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/protocol/ProtoPreBindRuleProducer.java
index 582da0357..3ca18d6e6 100644
--- a/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/protocol/ProtoPreBindRuleProducer.java
+++ b/acl/acl-impl/src/main/java/io/fd/hc2vpp/acl/util/protocol/ProtoPreBindRuleProducer.java
@@ -16,31 +16,27 @@
package io.fd.hc2vpp.acl.util.protocol;
-import static com.google.common.base.Preconditions.checkArgument;
-import static io.fd.hc2vpp.acl.util.protocol.ProtoPreBindRuleProducer.ProtocolPair.pair;
-
-import com.google.common.collect.ImmutableSet;
+import com.google.common.base.Preconditions;
import io.fd.vpp.jvpp.acl.types.AclRule;
-import java.util.Optional;
-import java.util.Set;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.rev181022.ValueRange;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.rev181022.VppIcmpAceAugmentation;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.rev181022.VppTcpAceAugmentation;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.Ace;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.L4;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l3.Ipv6;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.icmp.Icmp;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.tcp.Tcp;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.tcp.tcp.destination.port.DestinationPort;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.tcp.tcp.source.port.SourcePort;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.tcp.tcp.source.port.source.port.RangeOrOperator;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.udp.Udp;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.DestinationPortRange;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.SourcePortRange;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.ValueRange;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.VppAce;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.VppAceNodes;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.IpProtocol;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.Icmp;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.IcmpV6;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.Other;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.Tcp;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.Udp;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.icmp.IcmpNodes;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.icmp.v6.IcmpV6Nodes;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.tcp.TcpNodes;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.udp.UdpNodes;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev181001.AclTcpHeaderFields;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev181001.port.range.or.operator.PortRangeOrOperator;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev181001.port.range.or.operator.port.range.or.operator.Range;
+import org.opendaylight.yangtools.yang.binding.DataContainer;
/**
* Creates ACL rules pre-bind with protocol-related fields.<br>
@@ -53,89 +49,41 @@ public interface ProtoPreBindRuleProducer {
int TCP_INDEX = 6;
int UDP_INDEX = 17;
int ICMPV6_INDEX = 58;
- short MAX_PORT_NUMBER = (short)65535;
-
- Set<ProtocolPair> PROTOCOL_PAIRS = ImmutableSet.of(pair(Icmp.class, ICMP_INDEX), pair(Tcp.class, TCP_INDEX),
- pair(Udp.class, UDP_INDEX), pair(IcmpV6.class, ICMPV6_INDEX));
-
- class ProtocolPair {
- private final Class<? extends IpProtocol> protocolClass;
- private final int index;
+ short MAX_PORT_NUMBER = (short) 65535;
- private ProtocolPair(final Class<? extends IpProtocol> protocolClass, final int index) {
- this.protocolClass = protocolClass;
- this.index = index;
- }
-
- static ProtocolPair pair(@Nonnull final Class<? extends IpProtocol> protocolClass, @Nonnull final int index) {
- return new ProtocolPair(protocolClass, index);
- }
+ static AclRule bindIcmpVppFields(AclRule rule, Icmp icmp) {
+ VppIcmpAceAugmentation vppIcmp = icmp.augmentation(VppIcmpAceAugmentation.class);
+ Preconditions.checkNotNull(vppIcmp.getVppIcmpAce(), "Cannot determine VPP ICMP attributes!");
+ final ValueRange typesRange = vppIcmp.getVppIcmpAce().getIcmpTypeRange();
+ final ValueRange codesRange = vppIcmp.getVppIcmpAce().getIcmpCodeRange();
- boolean match(@Nonnull final Class<? extends IpProtocol> protocolClass) {
- return this.protocolClass.isAssignableFrom(protocolClass);
+ if (typesRange != null) {
+ rule.srcportOrIcmptypeFirst = Preconditions.checkNotNull(typesRange.getFirst());
+ rule.srcportOrIcmptypeLast = Preconditions.checkNotNull(typesRange.getLast());
}
- int getIndex() {
- return this.index;
+ if (codesRange != null) {
+ rule.dstportOrIcmpcodeFirst = Preconditions.checkNotNull(codesRange.getFirst());
+ rule.dstportOrIcmpcodeLast = Preconditions.checkNotNull(codesRange.getLast());
}
- }
-
- static byte protocol(final IpProtocol ipProtocol) {
- final Optional<ProtocolPair> optPair = PROTOCOL_PAIRS.stream()
- .filter(protocolPair -> protocolPair.match(ipProtocol.getClass()))
- .findAny();
-
- if (!optPair.isPresent()) {
- if (Other.class.isAssignableFrom(ipProtocol.getClass())) {
- return Other.class.cast(ipProtocol).getOtherNodes().getProtocol().byteValue();
- }
-
- throw new IllegalArgumentException(String.format("Unsupported Protocol Type %s", ipProtocol.getClass()));
- }
- return (byte) optPair.get().getIndex();
- }
-
- static AclRule bindIcmpNodes(AclRule rule, VppAce ace) {
- final VppAceNodes vppAceNodes = ace.getVppAceNodes();
- checkArgument(vppAceNodes.getIpProtocol() instanceof Icmp);
- final IcmpNodes icmp = Icmp.class.cast(vppAceNodes.getIpProtocol()).getIcmpNodes();
- final ValueRange typesRange = icmp.getIcmpTypeRange();
- final ValueRange codesRange = icmp.getIcmpCodeRange();
-
- rule.srcportOrIcmptypeFirst = typesRange.getFirst();
- rule.srcportOrIcmptypeLast = typesRange.getLast();
- rule.dstportOrIcmpcodeFirst = codesRange.getFirst();
- rule.dstportOrIcmpcodeLast = codesRange.getLast();
return rule;
}
- static AclRule bindIcmpv6Nodes(AclRule rule, VppAce ace) {
- final VppAceNodes vppAceNodes = ace.getVppAceNodes();
- checkArgument(vppAceNodes.getIpProtocol() instanceof IcmpV6);
- final IcmpV6Nodes icmpV6 = IcmpV6.class.cast(vppAceNodes.getIpProtocol()).getIcmpV6Nodes();
- final ValueRange typesRange = icmpV6.getIcmpTypeRange();
- final ValueRange codesRange = icmpV6.getIcmpCodeRange();
-
- rule.srcportOrIcmptypeFirst = typesRange.getFirst();
- rule.srcportOrIcmptypeLast = typesRange.getLast();
- rule.dstportOrIcmpcodeFirst = codesRange.getFirst();
- rule.dstportOrIcmpcodeLast = codesRange.getLast();
-
- return rule;
- }
-
- static void bindSourcePortRange(@Nonnull final AclRule rule, @Nullable final SourcePortRange sourcePortRange) {
+ static void bindSourcePortRange(@Nonnull final AclRule rule, @Nullable final PortRangeOrOperator sourcePortRange) {
// allow all ports by default:
rule.srcportOrIcmptypeFirst = 0;
rule.srcportOrIcmptypeLast = MAX_PORT_NUMBER;
- if(sourcePortRange != null) {
+ if (sourcePortRange != null) {
// lower port is mandatory
- rule.srcportOrIcmptypeFirst = portNumber(sourcePortRange.getLowerPort());
+ Preconditions.checkArgument(sourcePortRange instanceof Range);
+ Range portRange = (Range) sourcePortRange;
+ Preconditions.checkNotNull(portRange.getLowerPort(), "Lower port is mandatory!");
+ rule.srcportOrIcmptypeFirst = portNumber(portRange.getLowerPort());
- if (sourcePortRange.getUpperPort() != null) {
- rule.srcportOrIcmptypeLast = portNumber(sourcePortRange.getUpperPort());
+ if (portRange.getUpperPort() != null) {
+ rule.srcportOrIcmptypeLast = portNumber(portRange.getUpperPort());
} else {
// if upper port is missing, set lower port value as end of checked range:
rule.srcportOrIcmptypeLast = rule.srcportOrIcmptypeFirst;
@@ -143,17 +91,21 @@ public interface ProtoPreBindRuleProducer {
}
}
- static void bindDestinationPortRange(@Nonnull final AclRule rule, @Nullable final DestinationPortRange destinationPortRange) {
+ static void bindDestinationPortRange(@Nonnull final AclRule rule,
+ @Nullable final PortRangeOrOperator destinationPortRange) {
// allow all ports by default:
rule.dstportOrIcmpcodeFirst = 0;
rule.dstportOrIcmpcodeLast = MAX_PORT_NUMBER;
- if(destinationPortRange != null) {
+ if (destinationPortRange != null) {
// lower port is mandatory
- rule.dstportOrIcmpcodeFirst = portNumber(destinationPortRange.getLowerPort());
+ Preconditions.checkArgument(destinationPortRange instanceof Range);
+ Range portRange = (Range) destinationPortRange;
+ Preconditions.checkNotNull(portRange.getLowerPort(), "Lower port is mandatory!");
+ rule.dstportOrIcmpcodeFirst = portNumber(portRange.getLowerPort());
- if (destinationPortRange.getUpperPort() != null) {
- rule.dstportOrIcmpcodeLast = portNumber(destinationPortRange.getUpperPort());
+ if (portRange.getUpperPort() != null) {
+ rule.dstportOrIcmpcodeLast = portNumber(portRange.getUpperPort());
} else {
// if upper port is missing, set lower port value as end of checked range:
rule.dstportOrIcmpcodeLast = rule.dstportOrIcmpcodeFirst;
@@ -161,30 +113,78 @@ public interface ProtoPreBindRuleProducer {
}
}
- static AclRule bindTcpNodes(AclRule rule, VppAce ace) {
- final VppAceNodes vppAceNodes = ace.getVppAceNodes();
- checkArgument(vppAceNodes.getIpProtocol() instanceof Tcp);
+ static AclRule bindTcpAttributes(AclRule rule, Tcp tcp) {
+ SourcePort srcPort = Preconditions.checkNotNull(tcp.getSourcePort()).getSourcePort();
+ if (srcPort instanceof RangeOrOperator) {
+ bindSourcePortRange(rule, ((RangeOrOperator) srcPort).getPortRangeOrOperator());
+ }
- final TcpNodes tcp = Tcp.class.cast(vppAceNodes.getIpProtocol()).getTcpNodes();
- bindSourcePortRange(rule, tcp.getSourcePortRange());
- bindDestinationPortRange(rule, tcp.getDestinationPortRange());
+ DestinationPort dstPort = Preconditions.checkNotNull(tcp.getDestinationPort()).getDestinationPort();
+ if (dstPort instanceof org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.tcp.tcp.destination.port.destination.port.RangeOrOperator) {
+ bindDestinationPortRange(rule,
+ ((org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.tcp.tcp.destination.port.destination.port.RangeOrOperator) dstPort)
+ .getPortRangeOrOperator());
+ }
+ AclTcpHeaderFields.Flags flags = tcp.getFlags();
- if(tcp.getTcpFlagsMask() != null) {
- rule.tcpFlagsMask = tcp.getTcpFlagsMask().byteValue();
+ if (flags != null) {
+ rule.tcpFlagsValue = parseTcpFlagsValue(flags);
}
- if(tcp.getTcpFlagsValue() != null) {
- rule.tcpFlagsValue = tcp.getTcpFlagsValue().byteValue();
+
+ VppTcpAceAugmentation vppTcpAceAugmentation = tcp.augmentation(VppTcpAceAugmentation.class);
+ if (vppTcpAceAugmentation != null && vppTcpAceAugmentation.getVppTcpAce() != null &&
+ vppTcpAceAugmentation.getVppTcpAce().getFlagsMask() != null) {
+ rule.tcpFlagsMask = parseTcpFlagsMask(vppTcpAceAugmentation.getVppTcpAce().getFlagsMask());
}
+
return rule;
}
- static AclRule bindUdpNodes(AclRule rule, VppAce ace) {
- final VppAceNodes vppAceNodes = ace.getVppAceNodes();
- checkArgument(vppAceNodes.getIpProtocol() instanceof Udp);
+ static byte parseTcpFlagsValue(AclTcpHeaderFields.Flags flags) {
+ int fin = flags.isFin() ? 1 : 0;
+ int syn = flags.isSyn() ? 1 : 0;
+ int rst = flags.isRst() ? 1 : 0;
+ int psh = flags.isPsh() ? 1 : 0;
+ int ack = flags.isAck() ? 1 : 0;
+ int urg = flags.isUrg() ? 1 : 0;
+ int ece = flags.isEce() ? 1 : 0;
+ int cwr = flags.isCwr() ? 1 : 0;
+ String strFlags = String.format("%d%d%d%d%d%d%d%d", fin, syn, rst, psh, ack, urg, ece, cwr);
+ return Byte.parseByte(strFlags, 2);
+ }
+
+ static byte parseTcpFlagsMask(
+ org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.vpp.acl.rev181022.AclTcpHeaderFields.FlagsMask flags) {
+ int fin = flags.isFin() ? 1 : 0;
+ int syn = flags.isSyn() ? 1 : 0;
+ int rst = flags.isRst() ? 1 : 0;
+ int psh = flags.isPsh() ? 1 : 0;
+ int ack = flags.isAck() ? 1 : 0;
+ int urg = flags.isUrg() ? 1 : 0;
+ int ece = flags.isEce() ? 1 : 0;
+ int cwr = flags.isCwr() ? 1 : 0;
+ String strFlags = String.format("%d%d%d%d%d%d%d%d", fin, syn, rst, psh, ack, urg, ece, cwr);
+ return Byte.parseByte(strFlags, 2);
+ }
+
+ static AclRule bindUdpAttributes(AclRule rule, Udp udp) {
+ org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.udp.udp.source.port.SourcePort
+ srcPort = Preconditions.checkNotNull(udp.getSourcePort()).getSourcePort();
+
+ if (srcPort instanceof org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.udp.udp.source.port.source.port.RangeOrOperator) {
+ bindSourcePortRange(rule,
+ ((org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.udp.udp.source.port.source.port.RangeOrOperator) srcPort)
+ .getPortRangeOrOperator());
+ }
+
+ org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.udp.udp.destination.port.DestinationPort
+ dstPort = Preconditions.checkNotNull(udp.getDestinationPort()).getDestinationPort();
- final UdpNodes udp = Udp.class.cast(vppAceNodes.getIpProtocol()).getUdpNodes();
- bindSourcePortRange(rule, udp.getSourcePortRange());
- bindDestinationPortRange(rule, udp.getDestinationPortRange());
+ if (dstPort instanceof org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.udp.udp.destination.port.destination.port.RangeOrOperator) {
+ bindDestinationPortRange(rule,
+ ((org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.udp.udp.destination.port.destination.port.RangeOrOperator) dstPort)
+ .getPortRangeOrOperator());
+ }
return rule;
}
@@ -208,39 +208,56 @@ public interface ProtoPreBindRuleProducer {
* @param vppAce rule to be processed
* @return AclRule with protocol filled protocol fields
*/
- default AclRule createPreBindRule(@Nonnull final VppAce vppAce) {
+ default AclRule createPreBindRule(@Nonnull final Ace vppAce) {
AclRule rule = new AclRule();
-
- final IpProtocol ipProtocol = vppAce.getVppAceNodes().getIpProtocol();
- if (ipProtocol == null) {
+ L4 l4 = Preconditions.checkNotNull(vppAce.getMatches(), "Matches are not defined for ACE: {}!", vppAce).getL4();
+ if (l4 == null) {
// returns AclRule with rule.proto set to 0 (protocol fields will be ignored by vpp)
return rule;
}
- rule.proto = protocol(ipProtocol);
-
- switch (rule.proto) {
- case ICMP_INDEX: {
- return bindIcmpNodes(rule, vppAce);
- }
-
- case TCP_INDEX: {
- return bindTcpNodes(rule, vppAce);
- }
-
- case UDP_INDEX: {
- return bindUdpNodes(rule, vppAce);
- }
+ if (l4.getImplementedInterface()
+ .equals(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.Icmp.class)) {
+ return getIcmpAclRule(vppAce, rule,
+ (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.Icmp) l4);
+ } else if (l4.getImplementedInterface()
+ .equals(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.Tcp.class)) {
+ return getTcpAclRule(rule,
+ (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.Tcp) l4);
+ } else if (l4.getImplementedInterface()
+ .equals(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.Udp.class)) {
+ return getUdpAclRule(rule,
+ (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.Udp) l4);
+ } else {
+ return bindDefaultNodes(rule);
+ }
+ }
- case ICMPV6_INDEX: {
- return bindIcmpv6Nodes(rule, vppAce);
- }
- default: {
- return bindDefaultNodes(rule);
- }
+ default AclRule getIcmpAclRule(@Nonnull final Ace vppAce, final AclRule rule,
+ final org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.Icmp l4) {
+ if (vppAce.getMatches().getL3() == null) {
+ rule.proto = ICMP_INDEX;
+ } else {
+ Class<? extends DataContainer> ipVersion = vppAce.getMatches().getL3().getImplementedInterface();
+ rule.proto = (byte) (ipVersion.equals(Ipv6.class) ? ICMPV6_INDEX : ICMP_INDEX);
}
+ Icmp icmp = l4.getIcmp();
+ return icmp != null ? bindIcmpVppFields(rule, icmp) : bindDefaultNodes(rule);
}
+ default AclRule getUdpAclRule(final AclRule rule,
+ final org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.Udp l4) {
+ rule.proto = UDP_INDEX;
+ Udp udp = l4.getUdp();
+ return udp != null ? bindUdpAttributes(rule, udp) : bindDefaultNodes(rule);
+ }
+
+ default AclRule getTcpAclRule(final AclRule rule,
+ final org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev181001.acls.acl.aces.ace.matches.l4.Tcp l4) {
+ rule.proto = TCP_INDEX;
+ Tcp tcp = l4.getTcp();
+ return tcp != null ? bindTcpAttributes(rule, tcp) : bindDefaultNodes(rule);
+ }
}