fix Nat implementation after API changes in VPP 21/19321/2
authorMichal Cmarada <[email protected]>
Mon, 6 May 2019 11:48:21 +0000 (13:48 +0200)
committerMichal Cmarada <[email protected]>
Mon, 6 May 2019 11:48:21 +0000 (13:48 +0200)
Change-Id: Ibe8ead5a19119af9eb6b673f0713890ad5e243cb
Signed-off-by: Michal Cmarada <[email protected]>
27 files changed:
nat/nat2vpp/src/main/java/io/fd/hc2vpp/nat/read/ExternalIpPoolCustomizer.java
nat/nat2vpp/src/main/java/io/fd/hc2vpp/nat/read/MappingEntryCustomizer.java
nat/nat2vpp/src/main/java/io/fd/hc2vpp/nat/read/Nat64PrefixesCustomizer.java
nat/nat2vpp/src/main/java/io/fd/hc2vpp/nat/read/ifc/AbstractInterfaceNatCustomizer.java
nat/nat2vpp/src/main/java/io/fd/hc2vpp/nat/read/ifc/InterfaceInboundNatCustomizer.java
nat/nat2vpp/src/main/java/io/fd/hc2vpp/nat/read/ifc/InterfaceOutboundNatCustomizer.java
nat/nat2vpp/src/main/java/io/fd/hc2vpp/nat/read/ifc/SubInterfaceInboundNatCustomizer.java
nat/nat2vpp/src/main/java/io/fd/hc2vpp/nat/read/ifc/SubInterfaceOutboundNatCustomizer.java
nat/nat2vpp/src/main/java/io/fd/hc2vpp/nat/util/MappingEntryContext.java
nat/nat2vpp/src/main/java/io/fd/hc2vpp/nat/write/ExternalIpPoolCustomizer.java
nat/nat2vpp/src/main/java/io/fd/hc2vpp/nat/write/MappingEntryCustomizer.java
nat/nat2vpp/src/main/java/io/fd/hc2vpp/nat/write/Nat64PrefixesCustomizer.java
nat/nat2vpp/src/main/java/io/fd/hc2vpp/nat/write/ifc/AbstractInterfaceNatCustomizer.java
nat/nat2vpp/src/test/java/io/fd/hc2vpp/nat/read/ExternalIpPoolCustomizerTest.java
nat/nat2vpp/src/test/java/io/fd/hc2vpp/nat/read/MappingEntryCustomizerTest.java
nat/nat2vpp/src/test/java/io/fd/hc2vpp/nat/read/Nat64PrefixesCustomizerTest.java
nat/nat2vpp/src/test/java/io/fd/hc2vpp/nat/read/ifc/InterfaceInboundNatCustomizerTest.java
nat/nat2vpp/src/test/java/io/fd/hc2vpp/nat/read/ifc/InterfaceOutboundNatCustomizerTest.java
nat/nat2vpp/src/test/java/io/fd/hc2vpp/nat/util/MappingEntryContextTest.java
nat/nat2vpp/src/test/java/io/fd/hc2vpp/nat/write/ExternalIpPoolCustomizerTest.java
nat/nat2vpp/src/test/java/io/fd/hc2vpp/nat/write/MappingEntryCustomizerTest.java
nat/nat2vpp/src/test/java/io/fd/hc2vpp/nat/write/Nat64PrefixesCustomizerTest.java
nat/nat2vpp/src/test/java/io/fd/hc2vpp/nat/write/ifc/AbstractNatCustomizerTest.java
vpp-common/vpp-translate-utils/pom.xml
vpp-common/vpp-translate-utils/src/main/java/io/fd/hc2vpp/common/translate/util/AddressTranslator.java
vpp-common/vpp-translate-utils/src/main/java/io/fd/hc2vpp/common/translate/util/Ipv4Translator.java
vpp-common/vpp-translate-utils/src/main/java/io/fd/hc2vpp/common/translate/util/Ipv6Translator.java

index 7a97a68..574d058 100644 (file)
@@ -102,7 +102,7 @@ final class ExternalIpPoolCustomizer implements
         // Uses ID<->address mapping as defined by getAllIds (nat44 mappings go before nat64):
         if (poolId < nat44PoolCount) {
             final Nat44AddressDetails detail = nat44Details.get(Math.toIntExact(poolId));
-            readPoolIp(builder, detail.ipAddress);
+            readPoolIp(builder, detail.ipAddress.ip4Address);
             setPoolType(builder, NatPoolType.Nat44);
         } else {
             final List<Nat64PoolAddrDetails> nat64Details = nat64DumpMgr.getDump(id, ctx.getModificationCache())
@@ -111,7 +111,7 @@ final class ExternalIpPoolCustomizer implements
             final int nat64PoolPosition = Math.toIntExact(poolId) - nat44PoolCount;
             if (nat64PoolPosition < nat64PoolCount) {
                 final Nat64PoolAddrDetails detail = nat64Details.get(nat64PoolPosition);
-                readPoolIp(builder, detail.address);
+                readPoolIp(builder, detail.address.ip4Address);
                 setPoolType(builder, NatPoolType.Nat64);
             } else {
                 // Address pool for given ID is missing (legal state).
index 1ae4521..70dc10b 100644 (file)
@@ -33,6 +33,7 @@ import io.fd.jvpp.nat.dto.Nat64BibDetails;
 import io.fd.jvpp.nat.dto.Nat64BibDetailsReplyDump;
 import io.fd.jvpp.nat.dto.Nat64BibDump;
 import io.fd.jvpp.nat.future.FutureJVppNatFacade;
+import io.fd.jvpp.nat.types.NatConfigFlags;
 import java.util.List;
 import java.util.Optional;
 import java.util.stream.Collectors;
@@ -114,10 +115,10 @@ final class MappingEntryCustomizer implements Ipv4Translator, Ipv6Translator,
         builder.setIndex((long) index);
         builder.setType(
                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.nat.rev180628.MappingEntry.Type.Static);
-        builder.setExternalSrcAddress(new IpPrefix(toIpv4Prefix(detail.externalIpAddress, 32)));
-        builder.setInternalSrcAddress(new IpPrefix(toIpv4Prefix(detail.localIpAddress, 32)));
+        builder.setExternalSrcAddress(new IpPrefix(toIpv4Prefix(detail.externalIpAddress.ip4Address, 32)));
+        builder.setInternalSrcAddress(new IpPrefix(toIpv4Prefix(detail.localIpAddress.ip4Address, 32)));
 
-        if (detail.addrOnly == 0) {
+        if (!detail.flags.contains(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_ADDR_ONLY)) {
             builder.setExternalSrcPort(new ExternalSrcPortBuilder()
                 .setStartPortNumber(new PortNumber(Short.toUnsignedInt(detail.externalPort))).build());
             builder.setInternalSrcPort(new InternalSrcPortBuilder()
@@ -128,15 +129,15 @@ final class MappingEntryCustomizer implements Ipv4Translator, Ipv6Translator,
     private void readNat64Entry(@Nonnull final MappingEntryBuilder builder,
                                 final int index, final Nat64BibDetails detail) {
         builder.setIndex((long) index);
-        if (detail.isStatic == 1) {
+        if (detail.flags.contains(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_STATIC)) {
             builder.setType(
                     org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.nat.rev180628.MappingEntry.Type.Static);
         } else {
             builder.setType(
                     org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.nat.rev180628.MappingEntry.Type.DynamicImplicit);
         }
-        builder.setExternalSrcAddress(new IpPrefix(toIpv4Prefix(detail.oAddr,32 )));
-        builder.setInternalSrcAddress(new IpPrefix(toIpv6Prefix(detail.iAddr, 128)));
+        builder.setExternalSrcAddress(new IpPrefix(toIpv4Prefix(detail.oAddr.ip4Address, 32)));
+        builder.setInternalSrcAddress(new IpPrefix(toIpv6Prefix(detail.iAddr.ip6Address, 128)));
 
         builder.setExternalSrcPort(new ExternalSrcPortBuilder()
             .setStartPortNumber(new PortNumber(Short.toUnsignedInt(detail.oPort))).build());
index 6e955ea..468008c 100644 (file)
@@ -111,7 +111,7 @@ final class Nat64PrefixesCustomizer
     }
 
     private Ipv6Prefix readPrefix(final Nat64PrefixDetails details) {
-        return toIpv6Prefix(details.prefix, UnsignedBytes.toInt(details.prefixLen));
+        return toIpv6Prefix(details.prefix.prefix.ip6Address, UnsignedBytes.toInt(details.prefix.len));
     }
 
     private final class Nat64PrefixesExecutor implements EntityDumpExecutor<Map<Long, Nat64PrefixDetails>, Void> {
index 2d8e4cc..8ce475b 100644 (file)
@@ -31,6 +31,7 @@ import io.fd.jvpp.nat.dto.Nat44InterfaceOutputFeatureDump;
 import io.fd.jvpp.nat.dto.Nat64InterfaceDetailsReplyDump;
 import io.fd.jvpp.nat.dto.Nat64InterfaceDump;
 import io.fd.jvpp.nat.future.FutureJVppNatFacade;
+import io.fd.jvpp.nat.types.NatConfigFlags;
 import java.util.Optional;
 import javax.annotation.Nonnull;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
@@ -96,8 +97,8 @@ abstract class AbstractInterfaceNatCustomizer<C extends DataObject, B extends Bu
                 preRoutingNat44DumpMgr.getDump(id, ctx.getModificationCache());
 
         dump.orElse(new Nat44InterfaceDetailsReplyDump()).nat44InterfaceDetails.stream()
-                .filter(natIfcDetail -> natIfcDetail.swIfIndex == index)
-                .filter(natIfcDetail -> isExpectedNatType(natIfcDetail.isInside))
+                .filter(natIfcDetail -> natIfcDetail.swIfIndex.interfaceindex == index)
+                .filter(natIfcDetail -> isExpectedNatType(natIfcDetail.flags))
                 .findAny()
                 .ifPresent(natIfcDetail -> vppAttributesBuilder.enableNat44(builder));
         // do not modify builder is feature is absent (inbound/outbound are presence containers)
@@ -109,8 +110,8 @@ abstract class AbstractInterfaceNatCustomizer<C extends DataObject, B extends Bu
                 preRoutingNat64DumpMgr.getDump(id, ctx.getModificationCache());
 
         dump.orElse(new Nat64InterfaceDetailsReplyDump()).nat64InterfaceDetails.stream()
-                .filter(natIfcDetail -> natIfcDetail.swIfIndex == index)
-                .filter(natIfcDetail -> isExpectedNatType(natIfcDetail.isInside))
+                .filter(natIfcDetail -> natIfcDetail.swIfIndex.interfaceindex == index)
+                .filter(natIfcDetail -> isExpectedNatType(natIfcDetail.flags))
                 .findAny()
                 .ifPresent(natIfcDetail -> vppAttributesBuilder.enableNat64(builder));
         // do not modify builder is feature is absent (inbound/outbound are presence containers)
@@ -123,8 +124,8 @@ abstract class AbstractInterfaceNatCustomizer<C extends DataObject, B extends Bu
 
         dump.orElse(new Nat44InterfaceOutputFeatureDetailsReplyDump()).nat44InterfaceOutputFeatureDetails
                 .stream()
-                .filter(natIfcDetail -> natIfcDetail.swIfIndex == index)
-                .filter(natIfcDetail -> isExpectedNatType(natIfcDetail.isInside))
+                .filter(natIfcDetail -> natIfcDetail.swIfIndex.interfaceindex == index)
+                .filter(natIfcDetail -> isExpectedNatType(natIfcDetail.flags))
                 .findAny()
                 .ifPresent(natIfcDetail -> vppAttributesBuilder.enablePostRouting(builder));
         // do not modify builder is feature is absent (inbound/outbound are presence containers)
@@ -136,5 +137,5 @@ abstract class AbstractInterfaceNatCustomizer<C extends DataObject, B extends Bu
 
     abstract Logger getLog();
 
-    abstract boolean isExpectedNatType(final int isInside);
+    abstract boolean isExpectedNatType(final NatConfigFlags flags);
 }
index 76a20a9..c0dde65 100644 (file)
@@ -20,6 +20,7 @@ import io.fd.hc2vpp.common.translate.util.NamingContext;
 import io.fd.honeycomb.translate.read.ReadContext;
 import io.fd.honeycomb.translate.spi.read.Initialized;
 import io.fd.jvpp.nat.future.FutureJVppNatFacade;
+import io.fd.jvpp.nat.types.NatConfigFlags;
 import javax.annotation.Nonnull;
 import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang._interface.nat.rev170816.NatInterfaceAugmentation;
 import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang._interface.nat.rev170816._interface.nat.attributes.Nat;
@@ -50,8 +51,8 @@ final class InterfaceInboundNatCustomizer extends AbstractInterfaceNatCustomizer
     }
 
     @Override
-    boolean isExpectedNatType(final int isInside) {
-        return isInside == 1;
+    boolean isExpectedNatType(final NatConfigFlags flags) {
+        return flags.contains(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_INSIDE);
     }
 
     @Nonnull
index 68c0cb1..3196cda 100644 (file)
@@ -20,6 +20,7 @@ import io.fd.hc2vpp.common.translate.util.NamingContext;
 import io.fd.honeycomb.translate.read.ReadContext;
 import io.fd.honeycomb.translate.spi.read.Initialized;
 import io.fd.jvpp.nat.future.FutureJVppNatFacade;
+import io.fd.jvpp.nat.types.NatConfigFlags;
 import javax.annotation.Nonnull;
 import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang._interface.nat.rev170816.NatInterfaceAugmentation;
 import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang._interface.nat.rev170816._interface.nat.attributes.Nat;
@@ -50,8 +51,8 @@ final class InterfaceOutboundNatCustomizer extends AbstractInterfaceNatCustomize
     }
 
     @Override
-    boolean isExpectedNatType(final int isInside) {
-        return isInside == 0;
+    boolean isExpectedNatType(final NatConfigFlags flags) {
+        return flags.contains(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_OUTSIDE);
     }
 
     @Nonnull
index 0ca3444..c9f4dc8 100644 (file)
@@ -20,6 +20,7 @@ import io.fd.hc2vpp.common.translate.util.NamingContext;
 import io.fd.honeycomb.translate.read.ReadContext;
 import io.fd.honeycomb.translate.spi.read.Initialized;
 import io.fd.jvpp.nat.future.FutureJVppNatFacade;
+import io.fd.jvpp.nat.types.NatConfigFlags;
 import javax.annotation.Nonnull;
 import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang._interface.nat.rev170816._interface.nat.attributes.Nat;
 import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang._interface.nat.rev170816._interface.nat.attributes.NatBuilder;
@@ -54,8 +55,8 @@ final class SubInterfaceInboundNatCustomizer extends AbstractSubInterfaceNatCust
     }
 
     @Override
-    boolean isExpectedNatType(final int isInside) {
-        return isInside == 1;
+    boolean isExpectedNatType(final NatConfigFlags flags) {
+        return flags.contains(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_INSIDE);
     }
 
     @Nonnull
index 92d8299..8485cde 100644 (file)
@@ -20,6 +20,7 @@ import io.fd.hc2vpp.common.translate.util.NamingContext;
 import io.fd.honeycomb.translate.read.ReadContext;
 import io.fd.honeycomb.translate.spi.read.Initialized;
 import io.fd.jvpp.nat.future.FutureJVppNatFacade;
+import io.fd.jvpp.nat.types.NatConfigFlags;
 import javax.annotation.Nonnull;
 import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang._interface.nat.rev170816._interface.nat.attributes.Nat;
 import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang._interface.nat.rev170816._interface.nat.attributes.NatBuilder;
@@ -54,8 +55,8 @@ final class SubInterfaceOutboundNatCustomizer extends AbstractSubInterfaceNatCus
     }
 
     @Override
-    boolean isExpectedNatType(final int isInside) {
-        return isInside == 0;
+    boolean isExpectedNatType(final NatConfigFlags flags) {
+        return flags.contains(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_OUTSIDE);
     }
 
     @Nonnull
index aed383b..67e29cc 100644 (file)
@@ -19,7 +19,6 @@ package io.fd.hc2vpp.nat.util;
 import static com.google.common.base.Preconditions.checkArgument;
 
 import com.google.common.annotations.VisibleForTesting;
-import java.util.Optional;
 import io.fd.hc2vpp.common.translate.util.Ipv4Translator;
 import io.fd.hc2vpp.common.translate.util.Ipv6Translator;
 import io.fd.honeycomb.translate.MappingContext;
@@ -28,6 +27,7 @@ import io.fd.jvpp.nat.dto.Nat64BibDetails;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
+import java.util.Optional;
 import javax.annotation.Nonnull;
 import javax.annotation.concurrent.ThreadSafe;
 import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.naming.context.rev160513.Contexts;
@@ -100,24 +100,24 @@ public class MappingEntryContext implements Ipv4Translator, Ipv6Translator {
     private MappingEntryKey entryToKey(final Nat44StaticMappingDetails entry) {
         // Only IPv4
         return new MappingEntryKey(
-            new IpPrefix(new Ipv4Prefix(toIpv4Prefix(entry.externalIpAddress,32))),
-            new IpPrefix(new Ipv4Prefix(toIpv4Prefix(entry.localIpAddress, 32))));
+                new IpPrefix(new Ipv4Prefix(toIpv4Prefix(entry.externalIpAddress.ip4Address, 32))),
+                new IpPrefix(new Ipv4Prefix(toIpv4Prefix(entry.localIpAddress.ip4Address, 32))));
     }
 
     private MappingEntryKey entryToKey(final Nat64BibDetails entry) {
         return new MappingEntryKey(
-                new IpPrefix(new Ipv4Prefix(toIpv4Prefix(entry.oAddr, 32))),
-                new IpPrefix(new Ipv6Prefix(toIpv6Prefix(entry.iAddr, 128))));
+                new IpPrefix(new Ipv4Prefix(toIpv4Prefix(entry.oAddr.ip4Address, 32))),
+                new IpPrefix(new Ipv6Prefix(toIpv6Prefix(entry.iAddr.ip6Address, 128))));
     }
 
     private boolean equalEntries(final Nat44StaticMappingDetails detail, final MappingEntry ctxMappingEntry) {
         // Only IPv4
-        final IpPrefix internalAddrFromDetails = new IpPrefix(toIpv4Prefix(detail.localIpAddress, 32));
+        final IpPrefix internalAddrFromDetails = new IpPrefix(toIpv4Prefix(detail.localIpAddress.ip4Address, 32));
         if (!ctxMappingEntry.getInternal().equals(internalAddrFromDetails)) {
             return false;
         }
         // Only IPv4
-        final IpPrefix externalAddrFromDetails = new IpPrefix(toIpv4Prefix(detail.externalIpAddress, 32));
+        final IpPrefix externalAddrFromDetails = new IpPrefix(toIpv4Prefix(detail.externalIpAddress.ip4Address, 32));
         if (!ctxMappingEntry.getExternal().equals(externalAddrFromDetails)) {
             return false;
         }
@@ -126,12 +126,12 @@ public class MappingEntryContext implements Ipv4Translator, Ipv6Translator {
 
     private boolean equalEntries(final Nat64BibDetails detail, final MappingEntry ctxMappingEntry) {
         // Only IPv6
-        final IpPrefix internalAddrFromDetails = new IpPrefix(toIpv6Prefix(detail.iAddr, 128));
+        final IpPrefix internalAddrFromDetails = new IpPrefix(toIpv6Prefix(detail.iAddr.ip6Address, 128));
         if (!ctxMappingEntry.getInternal().equals(internalAddrFromDetails)) {
             return false;
         }
         // Only IPv4
-        final IpPrefix externalAddrFromDetails = new IpPrefix(toIpv4Prefix(detail.oAddr, 32));
+        final IpPrefix externalAddrFromDetails = new IpPrefix(toIpv4Prefix(detail.oAddr.ip4Address, 32));
         if (!ctxMappingEntry.getExternal().equals(externalAddrFromDetails)) {
             return false;
         }
index 38d2f5a..8b9d9dd 100644 (file)
@@ -89,9 +89,9 @@ final class ExternalIpPoolCustomizer implements ListWriterCustomizer<ExternalIpA
         final Nat44AddDelAddressRange request = new Nat44AddDelAddressRange();
         final Ipv4AddressRange range = Ipv4AddressRange.fromPrefix(externalIpPool);
         LOG.trace("Handling NAT44 address range: {}", range);
-        request.isAdd = booleanToByte(isAdd);
-        request.firstIpAddress = ipv4AddressNoZoneToArray(range.getStart());
-        request.lastIpAddress = ipv4AddressNoZoneToArray(range.getEnd());
+        request.isAdd = isAdd;
+        request.firstIpAddress = ipv4AddressNoZoneToNatIp4Address(range.getStart());
+        request.lastIpAddress = ipv4AddressNoZoneToNatIp4Address(range.getEnd());
         return request;
     }
 
@@ -99,9 +99,9 @@ final class ExternalIpPoolCustomizer implements ListWriterCustomizer<ExternalIpA
         final Nat64AddDelPoolAddrRange request = new Nat64AddDelPoolAddrRange();
         final Ipv4AddressRange range = Ipv4AddressRange.fromPrefix(externalIpPool);
         LOG.trace("Handling NAT64 address range: {}", range);
-        request.isAdd = booleanToByte(isAdd);
-        request.startAddr = ipv4AddressNoZoneToArray(range.getStart());
-        request.endAddr = ipv4AddressNoZoneToArray(range.getEnd());
+        request.isAdd = isAdd;
+        request.startAddr = ipv4AddressNoZoneToNatIp4Address(range.getStart());
+        request.endAddr = ipv4AddressNoZoneToNatIp4Address(range.getEnd());
         return request;
     }
 }
index 9c8da8c..bf78118 100644 (file)
@@ -16,7 +16,6 @@
 
 package io.fd.hc2vpp.nat.write;
 
-import java.util.Optional;
 import io.fd.hc2vpp.common.translate.util.ByteDataTranslator;
 import io.fd.hc2vpp.common.translate.util.Ipv4Translator;
 import io.fd.hc2vpp.common.translate.util.Ipv6Translator;
@@ -28,6 +27,9 @@ import io.fd.honeycomb.translate.write.WriteFailedException;
 import io.fd.jvpp.nat.dto.Nat44AddDelStaticMapping;
 import io.fd.jvpp.nat.dto.Nat64AddDelStaticBib;
 import io.fd.jvpp.nat.future.FutureJVppNatFacade;
+import io.fd.jvpp.nat.types.InterfaceIndex;
+import io.fd.jvpp.nat.types.NatConfigFlags;
+import java.util.Optional;
 import javax.annotation.Nonnull;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
@@ -133,15 +135,20 @@ final class MappingEntryCustomizer implements ListWriterCustomizer<MappingEntry,
                                                  final boolean isAdd)
             throws WriteFailedException.CreateFailedException {
         final Nat44AddDelStaticMapping request = new Nat44AddDelStaticMapping();
-        request.isAdd = booleanToByte(isAdd);
+        request.isAdd = isAdd;
         // VPP uses int, model long
         request.vrfId = natInstanceId.intValue();
 
         final Ipv4Prefix internalAddress = mappingEntry.getInternalSrcAddress().getIpv4Prefix();
-        request.addrOnly = 1;
-        request.localIpAddress = ipv4AddressPrefixToArray(internalAddress);
-        request.externalIpAddress = ipv4AddressPrefixToArray(mappingEntry.getExternalSrcAddress().getIpv4Prefix());
-        request.externalSwIfIndex = -1; // external ip address is ignored if externalSwIfIndex is given
+        if (request.flags == null) {
+            request.flags = new NatConfigFlags();
+        }
+        request.flags.add(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_ADDR_ONLY);
+        request.localIpAddress = ipv4AddressPrefixToNatIp4Address(internalAddress);
+        request.externalIpAddress =
+                ipv4AddressPrefixToNatIp4Address(mappingEntry.getExternalSrcAddress().getIpv4Prefix());
+        request.externalSwIfIndex = new InterfaceIndex();
+        request.externalSwIfIndex.interfaceindex = -1; // external ip address is ignored if externalSwIfIndex is given
         request.protocol = -1;
         final Short protocol = mappingEntry.getTransportProtocol();
         if (protocol != null) {
@@ -151,7 +158,7 @@ final class MappingEntryCustomizer implements ListWriterCustomizer<MappingEntry,
         final Integer internalPortNumber = getPortNumber(mappingEntry.getInternalSrcPort());
         final Integer externalPortNumber = getPortNumber(mappingEntry.getExternalSrcPort());
         if (internalPortNumber != null && externalPortNumber != null) {
-            request.addrOnly = 0;
+            request.flags.remove(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_ADDR_ONLY);
             request.localPort = internalPortNumber.shortValue();
             request.externalPort = externalPortNumber.shortValue();
         }
@@ -164,13 +171,13 @@ final class MappingEntryCustomizer implements ListWriterCustomizer<MappingEntry,
                                                  final boolean isAdd)
             throws WriteFailedException.CreateFailedException {
         final Nat64AddDelStaticBib request = new Nat64AddDelStaticBib();
-        request.isAdd = booleanToByte(isAdd);
+        request.isAdd = isAdd;
         // VPP uses int, model long
         request.vrfId = natInstanceId.intValue();
 
         final Ipv6Prefix internalAddress = mappingEntry.getInternalSrcAddress().getIpv6Prefix();
-        request.iAddr = ipv6AddressPrefixToArray(internalAddress);
-        request.oAddr = ipv4AddressPrefixToArray(mappingEntry.getExternalSrcAddress().getIpv4Prefix());
+        request.iAddr = ipv6AddressPrefixToNatIp6Address(internalAddress);
+        request.oAddr = ipv4AddressPrefixToNatIp4Address(mappingEntry.getExternalSrcAddress().getIpv4Prefix());
         request.proto = -1;
         final Short protocol = mappingEntry.getTransportProtocol();
         if (protocol != null) {
index df8af85..a9082c0 100644 (file)
@@ -76,9 +76,8 @@ final class Nat64PrefixesCustomizer
 
         final Ipv6Prefix nat64Prefix = data.getNat64Prefix();
         final Nat64AddDelPrefix request = new Nat64AddDelPrefix();
-        request.prefix = ipv6AddressPrefixToArray(nat64Prefix);
-        request.prefixLen = extractPrefix(nat64Prefix);
-        request.isAdd = booleanToByte(isAdd);
+        request.prefix = ipv6AddressPrefixToNatIp6Prefix(nat64Prefix);
+        request.isAdd = isAdd;
         request.vrfId = vrfId;
         getReplyForWrite(jvppNat.nat64AddDelPrefix(request).toCompletableFuture(), id);
     }
index 336b17a..380de89 100644 (file)
@@ -28,6 +28,8 @@ import io.fd.jvpp.nat.dto.Nat44InterfaceAddDelFeature;
 import io.fd.jvpp.nat.dto.Nat44InterfaceAddDelOutputFeature;
 import io.fd.jvpp.nat.dto.Nat64AddDelInterface;
 import io.fd.jvpp.nat.future.FutureJVppNatFacade;
+import io.fd.jvpp.nat.types.InterfaceIndex;
+import io.fd.jvpp.nat.types.NatConfigFlags;
 import javax.annotation.Nonnull;
 import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang._interface.nat.rev170816.InterfaceNatVppFeatureAttributes;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
@@ -89,9 +91,17 @@ abstract class AbstractInterfaceNatCustomizer<D extends InterfaceNatVppFeatureAt
             throws WriteFailedException {
         checkArgument(!isNat64Supported(natAttributes), "Post routing Nat64 is not supported by VPP");
         final Nat44InterfaceAddDelOutputFeature request = new Nat44InterfaceAddDelOutputFeature();
-        request.isAdd = booleanToByte(enable);
-        request.isInside = getType().isInside;
-        request.swIfIndex = ifcIndex;
+        request.isAdd = enable;
+        if (request.flags == null) {
+            request.flags = new NatConfigFlags();
+        }
+        if (getType() == NatType.INBOUND) {
+            request.flags.add(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_INSIDE);
+        } else if (getType() == NatType.OUTBOUND) {
+            request.flags.add(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_OUTSIDE);
+        }
+        request.swIfIndex = new InterfaceIndex();
+        request.swIfIndex.interfaceindex = ifcIndex;
         getReplyForWrite(jvppNat.nat44InterfaceAddDelOutputFeature(request).toCompletableFuture(), id);
     }
 
@@ -114,18 +124,34 @@ abstract class AbstractInterfaceNatCustomizer<D extends InterfaceNatVppFeatureAt
     private void preRoutingNat44(@Nonnull final InstanceIdentifier<D> id, final int ifcIndex, final boolean enable)
             throws WriteFailedException {
         final Nat44InterfaceAddDelFeature request = new Nat44InterfaceAddDelFeature();
-        request.isAdd = booleanToByte(enable);
-        request.isInside = getType().isInside;
-        request.swIfIndex = ifcIndex;
+        request.isAdd = enable;
+        if (request.flags == null) {
+            request.flags = new NatConfigFlags();
+        }
+        if (getType() == NatType.INBOUND) {
+            request.flags.add(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_INSIDE);
+        } else if (getType() == NatType.OUTBOUND) {
+            request.flags.add(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_OUTSIDE);
+        }
+        request.swIfIndex = new InterfaceIndex();
+        request.swIfIndex.interfaceindex = ifcIndex;
         getReplyForWrite(jvppNat.nat44InterfaceAddDelFeature(request).toCompletableFuture(), id);
     }
 
     private void preRoutingNat64(@Nonnull final InstanceIdentifier<D> id, final int ifcIndex, final boolean enable)
             throws WriteFailedException {
         final Nat64AddDelInterface request = new Nat64AddDelInterface();
-        request.isAdd = booleanToByte(enable);
-        request.isInside = getType().isInside;
-        request.swIfIndex = ifcIndex;
+        request.isAdd = enable;
+        if (request.flags == null) {
+            request.flags = new NatConfigFlags();
+        }
+        if (getType() == NatType.INBOUND) {
+            request.flags.add(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_INSIDE);
+        } else if (getType() == NatType.OUTBOUND) {
+            request.flags.add(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_OUTSIDE);
+        }
+        request.swIfIndex = new InterfaceIndex();
+        request.swIfIndex.interfaceindex = ifcIndex;
         getReplyForWrite(jvppNat.nat64AddDelInterface(request).toCompletableFuture(), id);
     }
 
index db23b7a..906572c 100644 (file)
@@ -33,6 +33,7 @@ import io.fd.jvpp.nat.dto.Nat44AddressDetailsReplyDump;
 import io.fd.jvpp.nat.dto.Nat64PoolAddrDetails;
 import io.fd.jvpp.nat.dto.Nat64PoolAddrDetailsReplyDump;
 import io.fd.jvpp.nat.future.FutureJVppNatFacade;
+import io.fd.jvpp.nat.types.Ip4Address;
 import java.util.Arrays;
 import java.util.List;
 import java.util.stream.LongStream;
@@ -172,13 +173,16 @@ public class ExternalIpPoolCustomizerTest
         Nat44AddressDetailsReplyDump replyDump = dumpReplyNat44Empty();
 
         Nat44AddressDetails detailsOne = new Nat44AddressDetails();
-        detailsOne.ipAddress = new byte[]{-64, -88, 44, 1};
+        detailsOne.ipAddress = new Ip4Address();
+        detailsOne.ipAddress.ip4Address = new byte[]{-64, -88, 44, 1};
 
         Nat44AddressDetails detailsTwo = new Nat44AddressDetails();
-        detailsTwo.ipAddress = new byte[]{-64, -88, 44, 2};
+        detailsTwo.ipAddress = new Ip4Address();
+        detailsTwo.ipAddress.ip4Address = new byte[]{-64, -88, 44, 2};
 
         Nat44AddressDetails detailsThree = new Nat44AddressDetails();
-        detailsThree.ipAddress = new byte[]{-64, -88, 44, 3};
+        detailsThree.ipAddress = new Ip4Address();
+        detailsThree.ipAddress.ip4Address = new byte[]{-64, -88, 44, 3};
 
         replyDump.nat44AddressDetails = Arrays.asList(detailsOne, detailsTwo, detailsThree);
 
@@ -193,13 +197,16 @@ public class ExternalIpPoolCustomizerTest
         Nat64PoolAddrDetailsReplyDump replyDump = dumpReplyNat64Empty();
 
         Nat64PoolAddrDetails detailsOne = new Nat64PoolAddrDetails();
-        detailsOne.address = new byte[]{-64, -88, 64, 1};
+        detailsOne.address = new Ip4Address();
+        detailsOne.address.ip4Address = new byte[]{-64, -88, 64, 1};
 
         Nat64PoolAddrDetails detailsTwo = new Nat64PoolAddrDetails();
-        detailsTwo.address = new byte[]{-64, -88, 64, 2};
+        detailsTwo.address = new Ip4Address();
+        detailsTwo.address.ip4Address = new byte[]{-64, -88, 64, 2};
 
         Nat64PoolAddrDetails detailsThree = new Nat64PoolAddrDetails();
-        detailsThree.address = new byte[]{-64, -88, 64, 3};
+        detailsThree.address = new Ip4Address();
+        detailsThree.address.ip4Address = new byte[]{-64, -88, 64, 3};
 
         replyDump.nat64PoolAddrDetails = Arrays.asList(detailsOne, detailsTwo, detailsThree);
 
index d0541dc..247c810 100644 (file)
@@ -30,6 +30,9 @@ import io.fd.jvpp.nat.dto.Nat44StaticMappingDetails;
 import io.fd.jvpp.nat.dto.Nat44StaticMappingDetailsReplyDump;
 import io.fd.jvpp.nat.dto.Nat64BibDetails;
 import io.fd.jvpp.nat.dto.Nat64BibDetailsReplyDump;
+import io.fd.jvpp.nat.types.Ip4Address;
+import io.fd.jvpp.nat.types.Ip6Address;
+import io.fd.jvpp.nat.types.NatConfigFlags;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Optional;
@@ -214,26 +217,33 @@ public class MappingEntryCustomizerTest
         Nat44StaticMappingDetailsReplyDump replyDump = new Nat44StaticMappingDetailsReplyDump();
 
         Nat44StaticMappingDetails detailsOne = new Nat44StaticMappingDetails();
-        detailsOne.addrOnly = 1;
-        detailsOne.localIpAddress = new byte[]{-64, -88, 2, 1};
+        detailsOne.flags = new NatConfigFlags();
+        detailsOne.flags.add(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_ADDR_ONLY);
+        detailsOne.localIpAddress = new Ip4Address();
+        detailsOne.localIpAddress.ip4Address = new byte[]{-64, -88, 2, 1};
         detailsOne.localPort = 1234;
-        detailsOne.externalIpAddress = new byte[]{-64, -88, 2, 8};
+        detailsOne.externalIpAddress = new Ip4Address();
+        detailsOne.externalIpAddress.ip4Address = new byte[]{-64, -88, 2, 8};
         detailsOne.externalPort = 5874;
         detailsOne.vrfId = NatInstanceCustomizer.DEFAULT_VRF_ID.getId().byteValue();
 
         Nat44StaticMappingDetails detailsTwo = new Nat44StaticMappingDetails();
-        detailsTwo.addrOnly = 0;
-        detailsTwo.localIpAddress = new byte[]{-64, -88, 2, 3};
+        detailsTwo.flags = new NatConfigFlags();
+        detailsTwo.localIpAddress = new Ip4Address();
+        detailsTwo.localIpAddress.ip4Address = new byte[]{-64, -88, 2, 3};
         detailsTwo.localPort = (short) 60000;
-        detailsTwo.externalIpAddress = new byte[]{-64, -88, 2, 5};
+        detailsTwo.externalIpAddress = new Ip4Address();
+        detailsTwo.externalIpAddress.ip4Address = new byte[]{-64, -88, 2, 5};
         detailsTwo.externalPort = (short) 65535;
         detailsTwo.vrfId = 2;
 
         Nat44StaticMappingDetails detailsThree = new Nat44StaticMappingDetails();
-        detailsThree.addrOnly = 0;
-        detailsThree.localIpAddress = new byte[]{-64, -88, 2, 2};
+        detailsThree.flags = new NatConfigFlags();
+        detailsThree.localIpAddress = new Ip4Address();
+        detailsThree.localIpAddress.ip4Address = new byte[]{-64, -88, 2, 2};
         detailsThree.localPort = 1274;
-        detailsThree.externalIpAddress = new byte[]{-64, -88, 3, 8};
+        detailsThree.externalIpAddress = new Ip4Address();
+        detailsThree.externalIpAddress.ip4Address = new byte[]{-64, -88, 3, 8};
         detailsThree.externalPort = 6874;
         detailsThree.vrfId = NatInstanceCustomizer.DEFAULT_VRF_ID.getId().byteValue();
 
@@ -245,32 +255,40 @@ public class MappingEntryCustomizerTest
         Nat64BibDetailsReplyDump replyDump = new Nat64BibDetailsReplyDump();
 
         Nat64BibDetails detailsOne = new Nat64BibDetails();
-        detailsOne.isStatic = 1;
-        detailsOne.iAddr =
+        detailsOne.flags = new NatConfigFlags();
+        detailsOne.flags.add(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_STATIC);
+        detailsOne.iAddr = new Ip6Address();
+        detailsOne.iAddr.ip6Address =
                 new byte[]{0x20, 0x01, 0x0d, (byte) 0xb8, (byte) 0x85, (byte) 0xa3, 0, 0, 0, 0, (byte) 0x8a, 0x2e, 0x03,
                         0x70, 0x73, 0x01};
         detailsOne.iPort = 1234;
-        detailsOne.oAddr = new byte[]{-64, -88, 64, 1};
+        detailsOne.oAddr = new Ip4Address();
+        detailsOne.oAddr.ip4Address = new byte[]{-64, -88, 64, 1};
         detailsOne.oPort = 5874;
         detailsOne.vrfId = NatInstanceCustomizer.DEFAULT_VRF_ID.getId().byteValue();
 
         Nat64BibDetails detailsTwo = new Nat64BibDetails();
-        detailsTwo.isStatic = 0;
-        detailsTwo.iAddr =
+        detailsTwo.flags = new NatConfigFlags();
+        detailsTwo.iAddr = new Ip6Address();
+        detailsTwo.iAddr.ip6Address =
                 new byte[]{0x20, 0x01, 0x0d, (byte) 0xb8, (byte) 0x85, (byte) 0xa3, 0, 0, 0, 0, (byte) 0x8a, 0x2e, 0x03,
                         0x70, 0x73, 0x02};
         detailsTwo.iPort = (short) 60000;
-        detailsTwo.oAddr = new byte[]{-64, -88, 64, 2};
+        detailsTwo.oAddr = new Ip4Address();
+        detailsTwo.oAddr.ip4Address = new byte[]{-64, -88, 64, 2};
         detailsTwo.oPort = (short) 65535;
         detailsTwo.vrfId = 2;
 
         Nat64BibDetails detailsThree = new Nat64BibDetails();
-        detailsThree.isStatic = 1;
-        detailsThree.iAddr =
+        detailsThree.flags = new NatConfigFlags();
+        detailsThree.flags.add(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_STATIC);
+        detailsThree.iAddr = new Ip6Address();
+        detailsThree.iAddr.ip6Address =
                 new byte[]{0x20, 0x01, 0x0d, (byte) 0xb8, (byte) 0x85, (byte) 0xa3, 0, 0, 0, 0, (byte) 0x8a, 0x2e, 0x03,
                         0x70, 0x73, 0x03};
         detailsThree.iPort = 1274;
-        detailsThree.oAddr = new byte[]{-64, -88, 64, 3};
+        detailsThree.oAddr = new Ip4Address();
+        detailsThree.oAddr.ip4Address = new byte[]{-64, -88, 64, 3};
         detailsThree.oPort = 6874;
         detailsThree.vrfId = NatInstanceCustomizer.DEFAULT_VRF_ID.getId().byteValue();
 
index a3f7573..d576b60 100644 (file)
@@ -29,6 +29,8 @@ import io.fd.honeycomb.translate.spi.read.ReaderCustomizer;
 import io.fd.jvpp.nat.dto.Nat64PrefixDetails;
 import io.fd.jvpp.nat.dto.Nat64PrefixDetailsReplyDump;
 import io.fd.jvpp.nat.future.FutureJVppNatFacade;
+import io.fd.jvpp.nat.types.Ip6Address;
+import io.fd.jvpp.nat.types.Ip6Prefix;
 import java.util.List;
 import org.junit.Test;
 import org.mockito.Mock;
@@ -110,13 +112,18 @@ public class Nat64PrefixesCustomizerTest extends ListReaderCustomizerTest<Nat64P
         final Nat64PrefixDetailsReplyDump reply = new Nat64PrefixDetailsReplyDump();
         final Nat64PrefixDetails prefix0 = new Nat64PrefixDetails();
         prefix0.vrfId = 0;
-        prefix0.prefix = new byte[]{0, 0x64, (byte) 0xff, (byte) 0x9b, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
-        prefix0.prefixLen = (byte) 96;
+        prefix0.prefix = new Ip6Prefix();
+        prefix0.prefix.prefix = new Ip6Address();
+        prefix0.prefix.prefix.ip6Address =
+                new byte[]{0, 0x64, (byte) 0xff, (byte) 0x9b, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
+        prefix0.prefix.len = (byte) 96;
         reply.nat64PrefixDetails.add(prefix0);
         final Nat64PrefixDetails prefix1 = new Nat64PrefixDetails();
         prefix1.vrfId = 1;
-        prefix1.prefix = new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
-        prefix1.prefixLen = (byte) 128;
+        prefix1.prefix = new Ip6Prefix();
+        prefix1.prefix.prefix = new Ip6Address();
+        prefix1.prefix.prefix.ip6Address = new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
+        prefix1.prefix.len = (byte) 128;
         reply.nat64PrefixDetails.add(prefix1);
         return reply;
     }
index 8d62782..e917412 100644 (file)
@@ -34,6 +34,8 @@ import io.fd.jvpp.nat.dto.Nat44InterfaceOutputFeatureDetails;
 import io.fd.jvpp.nat.dto.Nat44InterfaceOutputFeatureDetailsReplyDump;
 import io.fd.jvpp.nat.dto.Nat64InterfaceDetailsReplyDump;
 import io.fd.jvpp.nat.future.FutureJVppNatFacade;
+import io.fd.jvpp.nat.types.InterfaceIndex;
+import io.fd.jvpp.nat.types.NatConfigFlags;
 import org.junit.Test;
 import org.mockito.Mock;
 import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang._interface.nat.rev170816.NatInterfaceStateAugmentation;
@@ -90,8 +92,10 @@ public class InterfaceInboundNatCustomizerTest
     private void mockPostRoutingDump() {
         final Nat44InterfaceOutputFeatureDetailsReplyDump details = new Nat44InterfaceOutputFeatureDetailsReplyDump();
         final Nat44InterfaceOutputFeatureDetails detail = new Nat44InterfaceOutputFeatureDetails();
-        detail.isInside = 1;
-        detail.swIfIndex = IFC_IDX;
+        detail.flags = new NatConfigFlags();
+        detail.flags.add(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_INSIDE);
+        detail.swIfIndex = new InterfaceIndex();
+        detail.swIfIndex.interfaceindex = IFC_IDX;
         details.nat44InterfaceOutputFeatureDetails = Lists.newArrayList(detail);
         when(jvppNat.nat44InterfaceOutputFeatureDump(any())).thenReturn(future(details));
     }
@@ -100,8 +104,10 @@ public class InterfaceInboundNatCustomizerTest
     public void testPresencePreRouting() throws Exception {
         final Nat44InterfaceDetailsReplyDump details = new Nat44InterfaceDetailsReplyDump();
         final Nat44InterfaceDetails detail = new Nat44InterfaceDetails();
-        detail.isInside = 1;
-        detail.swIfIndex = IFC_IDX;
+        detail.flags = new NatConfigFlags();
+        detail.flags.add(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_INSIDE);
+        detail.swIfIndex = new InterfaceIndex();
+        detail.swIfIndex.interfaceindex = IFC_IDX;
         details.nat44InterfaceDetails = Lists.newArrayList(detail);
         when(jvppNat.nat44InterfaceDump(any())).thenReturn(future(details));
 
index dcf3a3c..8bcfd50 100644 (file)
@@ -35,6 +35,8 @@ import io.fd.jvpp.nat.dto.Nat44InterfaceOutputFeatureDetails;
 import io.fd.jvpp.nat.dto.Nat44InterfaceOutputFeatureDetailsReplyDump;
 import io.fd.jvpp.nat.dto.Nat64InterfaceDetailsReplyDump;
 import io.fd.jvpp.nat.future.FutureJVppNatFacade;
+import io.fd.jvpp.nat.types.InterfaceIndex;
+import io.fd.jvpp.nat.types.NatConfigFlags;
 import org.junit.Test;
 import org.mockito.Mock;
 import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang._interface.nat.rev170816._interface.nat.attributes.NatBuilder;
@@ -76,8 +78,10 @@ public class InterfaceOutboundNatCustomizerTest
     private void mockPostRoutingDump() {
         final Nat44InterfaceOutputFeatureDetailsReplyDump details = new Nat44InterfaceOutputFeatureDetailsReplyDump();
         final Nat44InterfaceOutputFeatureDetails detail = new Nat44InterfaceOutputFeatureDetails();
-        detail.isInside = 0;
-        detail.swIfIndex = IFC_IDX;
+        detail.flags = new NatConfigFlags();
+        detail.flags.add(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_OUTSIDE);
+        detail.swIfIndex = new InterfaceIndex();
+        detail.swIfIndex.interfaceindex = IFC_IDX;
         details.nat44InterfaceOutputFeatureDetails = Lists.newArrayList(detail);
         when(jvppNat.nat44InterfaceOutputFeatureDump(any())).thenReturn(future(details));
     }
@@ -86,8 +90,10 @@ public class InterfaceOutboundNatCustomizerTest
     public void testPresencePreRouting() throws Exception {
         final Nat44InterfaceDetailsReplyDump details = new Nat44InterfaceDetailsReplyDump();
         final Nat44InterfaceDetails detail = new Nat44InterfaceDetails();
-        detail.isInside = 0;
-        detail.swIfIndex = IFC_IDX;
+        detail.flags = new NatConfigFlags();
+        detail.flags.add(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_OUTSIDE);
+        detail.swIfIndex = new InterfaceIndex();
+        detail.swIfIndex.interfaceindex = IFC_IDX;
         details.nat44InterfaceDetails = Lists.newArrayList(detail);
         when(jvppNat.nat44InterfaceDump(any())).thenReturn(future(details));
 
index 86abf0e..fdfec02 100644 (file)
@@ -24,18 +24,20 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 import static org.mockito.MockitoAnnotations.initMocks;
 
-import java.util.Optional;
 import com.google.common.collect.Lists;
 import io.fd.hc2vpp.common.translate.util.Ipv4Translator;
 import io.fd.honeycomb.translate.MappingContext;
 import io.fd.jvpp.nat.dto.Nat44StaticMappingDetails;
+import io.fd.jvpp.nat.types.NatConfigFlags;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mock;
 import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang.nat.context.rev161214.mapping.entry.context.attributes.nat.mapping.entry.context.nat.instance.MappingTableBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone;
 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.nat.rev180628.nat.instances.instance.mapping.table.MappingEntry;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.nat.rev180628.nat.instances.instance.mapping.table.MappingEntryBuilder;
@@ -168,9 +170,10 @@ public class MappingEntryContextTest implements Ipv4Translator {
     private Nat44StaticMappingDetails getDetails(final long vrfId, final String localIp, final String externIp) {
         final Nat44StaticMappingDetails nat44StaticMappingDetails = new Nat44StaticMappingDetails();
         nat44StaticMappingDetails.vrfId = (int) vrfId;
-        nat44StaticMappingDetails.addrOnly = 1;
-        nat44StaticMappingDetails.localIpAddress = ipv4AddressNoZoneToArray(localIp);
-        nat44StaticMappingDetails.externalIpAddress = ipv4AddressNoZoneToArray(externIp);
+        nat44StaticMappingDetails.flags = new NatConfigFlags();
+        nat44StaticMappingDetails.flags.add(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_ADDR_ONLY);
+        nat44StaticMappingDetails.localIpAddress = ipv4AddressNoZoneToNatIp4Address(new Ipv4AddressNoZone(localIp));
+        nat44StaticMappingDetails.externalIpAddress = ipv4AddressNoZoneToNatIp4Address(new Ipv4AddressNoZone(externIp));
         return nat44StaticMappingDetails;
     }
 
index 9da83bf..0ad8197 100644 (file)
@@ -33,6 +33,7 @@ import io.fd.jvpp.nat.dto.Nat44AddDelAddressRangeReply;
 import io.fd.jvpp.nat.dto.Nat64AddDelPoolAddrRange;
 import io.fd.jvpp.nat.dto.Nat64AddDelPoolAddrRangeReply;
 import io.fd.jvpp.nat.future.FutureJVppNatFacade;
+import io.fd.jvpp.nat.types.Ip4Address;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -117,17 +118,21 @@ public class ExternalIpPoolCustomizerTest extends WriterCustomizerTest implement
 
     private Nat44AddDelAddressRange getExpectedRequestNat44(final boolean isAdd) {
         final Nat44AddDelAddressRange expectedRequest = new Nat44AddDelAddressRange();
-        expectedRequest.isAdd = booleanToByte(isAdd);
-        expectedRequest.firstIpAddress = new byte[] {(byte) 192, (byte) 168, 1, 0};
-        expectedRequest.lastIpAddress = new byte[] {(byte) 192, (byte) 168, 1, (byte) 255};
+        expectedRequest.isAdd = isAdd;
+        expectedRequest.firstIpAddress = new Ip4Address();
+        expectedRequest.firstIpAddress.ip4Address = new byte[]{(byte) 192, (byte) 168, 1, 0};
+        expectedRequest.lastIpAddress = new Ip4Address();
+        expectedRequest.lastIpAddress.ip4Address = new byte[]{(byte) 192, (byte) 168, 1, (byte) 255};
         return expectedRequest;
     }
 
     private Nat64AddDelPoolAddrRange getExpectedRequestNat64(final boolean isAdd) {
         final Nat64AddDelPoolAddrRange expectedRequest = new Nat64AddDelPoolAddrRange();
-        expectedRequest.isAdd = booleanToByte(isAdd);
-        expectedRequest.startAddr = new byte[] {(byte) 192, (byte) 168, 1, 0};
-        expectedRequest.endAddr = new byte[] {(byte) 192, (byte) 168, 1, (byte) 255};
+        expectedRequest.isAdd = isAdd;
+        expectedRequest.startAddr = new Ip4Address();
+        expectedRequest.startAddr.ip4Address = new byte[]{(byte) 192, (byte) 168, 1, 0};
+        expectedRequest.endAddr = new Ip4Address();
+        expectedRequest.endAddr.ip4Address = new byte[]{(byte) 192, (byte) 168, 1, (byte) 255};
         return expectedRequest;
     }
 }
\ No newline at end of file
index 129fb8f..d67552b 100644 (file)
@@ -32,6 +32,10 @@ import io.fd.jvpp.nat.dto.Nat44AddDelStaticMappingReply;
 import io.fd.jvpp.nat.dto.Nat64AddDelStaticBib;
 import io.fd.jvpp.nat.dto.Nat64AddDelStaticBibReply;
 import io.fd.jvpp.nat.future.FutureJVppNatFacade;
+import io.fd.jvpp.nat.types.InterfaceIndex;
+import io.fd.jvpp.nat.types.Ip4Address;
+import io.fd.jvpp.nat.types.Ip6Address;
+import io.fd.jvpp.nat.types.NatConfigFlags;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -73,7 +77,7 @@ public class MappingEntryCustomizerTest extends WriterCustomizerTest implements
             throws WriteFailedException {
         customizer.writeCurrentAttributes(IID, extractMappingEntry(data), writeContext);
         final Nat44AddDelStaticMapping expectedRequest = getExpectedNat44Request();
-        expectedRequest.isAdd = 1;
+        expectedRequest.isAdd = true;
         verify(jvppNat).nat44AddDelStaticMapping(expectedRequest);
     }
 
@@ -83,7 +87,7 @@ public class MappingEntryCustomizerTest extends WriterCustomizerTest implements
             throws WriteFailedException {
         customizer.writeCurrentAttributes(IID, extractMappingEntry(data), writeContext);
         final Nat64AddDelStaticBib expectedRequest = getExpectedNat64Request();
-        expectedRequest.isAdd = 1;
+        expectedRequest.isAdd = true;
         verify(jvppNat).nat64AddDelStaticBib(expectedRequest);
     }
 
@@ -96,7 +100,7 @@ public class MappingEntryCustomizerTest extends WriterCustomizerTest implements
         final Nat64AddDelStaticBib expectedDeleteRequest = getExpectedNat64Request();
         verify(jvppNat).nat64AddDelStaticBib(expectedDeleteRequest);
         final Nat64AddDelStaticBib expectedUpdateRequest = getExpectedNat64UpdateRequest();
-        expectedUpdateRequest.isAdd = 1;
+        expectedUpdateRequest.isAdd = true;
         verify(jvppNat).nat64AddDelStaticBib(expectedUpdateRequest);
     }
 
@@ -123,12 +127,16 @@ public class MappingEntryCustomizerTest extends WriterCustomizerTest implements
 
     private static Nat44AddDelStaticMapping getExpectedNat44Request() {
         final Nat44AddDelStaticMapping expectedRequest = new Nat44AddDelStaticMapping();
-        expectedRequest.addrOnly = 1;
+        expectedRequest.flags = new NatConfigFlags();
+        expectedRequest.flags.add(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_ADDR_ONLY);
         expectedRequest.protocol = 17; // udp
         expectedRequest.vrfId = (int) NAT_INSTANCE_ID;
-        expectedRequest.externalSwIfIndex = -1;
-        expectedRequest.localIpAddress = new byte[] {(byte) 192, (byte) 168, 1, 87};
-        expectedRequest.externalIpAddress = new byte[] {45, 1, 5, 7};
+        expectedRequest.externalSwIfIndex = new InterfaceIndex();
+        expectedRequest.externalSwIfIndex.interfaceindex = -1;
+        expectedRequest.localIpAddress = new Ip4Address();
+        expectedRequest.localIpAddress.ip4Address = new byte[]{(byte) 192, (byte) 168, 1, 87};
+        expectedRequest.externalIpAddress = new Ip4Address();
+        expectedRequest.externalIpAddress.ip4Address = new byte[]{45, 1, 5, 7};
         return expectedRequest;
     }
 
@@ -136,21 +144,29 @@ public class MappingEntryCustomizerTest extends WriterCustomizerTest implements
         final Nat64AddDelStaticBib expectedRequest = new Nat64AddDelStaticBib();
         expectedRequest.proto = 58; // icmp v6
         expectedRequest.vrfId = (int) NAT_INSTANCE_ID;
-        expectedRequest.iAddr = new byte[] {0x20, 0x01, 0x0d, (byte) 0xb8, (byte) 0x85, (byte) 0xa3, 0, 0, 0, 0, (byte) 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x33};
+        expectedRequest.iAddr = new Ip6Address();
+        expectedRequest.iAddr.ip6Address =
+                new byte[]{0x20, 0x01, 0x0d, (byte) 0xb8, (byte) 0x85, (byte) 0xa3, 0, 0, 0, 0, (byte) 0x8a, 0x2e, 0x03,
+                        0x70, 0x73, 0x33};
         expectedRequest.iPort = 123;
-        expectedRequest.oAddr = new byte[] {10, 1, 1, 3};
+        expectedRequest.oAddr = new Ip4Address();
+        expectedRequest.oAddr.ip4Address = new byte[]{10, 1, 1, 3};
         expectedRequest.oPort = 456;
         return expectedRequest;
     }
 
     private static Nat44AddDelStaticMapping getExpectedNat44UpdateRequest() {
         final Nat44AddDelStaticMapping expectedRequest = new Nat44AddDelStaticMapping();
-        expectedRequest.addrOnly = 1;
+        expectedRequest.flags = new NatConfigFlags();
+        expectedRequest.flags.add(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_ADDR_ONLY);
         expectedRequest.protocol = 17; // udp
         expectedRequest.vrfId = (int) NAT_INSTANCE_ID;
-        expectedRequest.externalSwIfIndex = -1;
-        expectedRequest.localIpAddress = new byte[] {(byte) 192, (byte) 168, 1, 86};
-        expectedRequest.externalIpAddress = new byte[] {45, 1, 5, 6};
+        expectedRequest.externalSwIfIndex = new InterfaceIndex();
+        expectedRequest.externalSwIfIndex.interfaceindex = -1;
+        expectedRequest.localIpAddress = new Ip4Address();
+        expectedRequest.localIpAddress.ip4Address = new byte[]{(byte) 192, (byte) 168, 1, 86};
+        expectedRequest.externalIpAddress = new Ip4Address();
+        expectedRequest.externalIpAddress.ip4Address = new byte[]{45, 1, 5, 6};
         return expectedRequest;
     }
 
@@ -158,8 +174,12 @@ public class MappingEntryCustomizerTest extends WriterCustomizerTest implements
         final Nat64AddDelStaticBib expectedRequest = new Nat64AddDelStaticBib();
         expectedRequest.proto = 58; // icmp v6
         expectedRequest.vrfId = (int) NAT_INSTANCE_ID;
-        expectedRequest.iAddr = new byte[] {0x20, 0x01, 0x0d, (byte) 0xb8, (byte) 0x85, (byte) 0xa3, 0, 0, 0, 0, (byte) 0x8a, 0x2e, 0x03, 0x70, 0x73, 0x34};
-        expectedRequest.oAddr = new byte[] {10, 1, 1, 4};
+        expectedRequest.iAddr = new Ip6Address();
+        expectedRequest.iAddr.ip6Address =
+                new byte[]{0x20, 0x01, 0x0d, (byte) 0xb8, (byte) 0x85, (byte) 0xa3, 0, 0, 0, 0, (byte) 0x8a, 0x2e, 0x03,
+                        0x70, 0x73, 0x34};
+        expectedRequest.oAddr = new Ip4Address();
+        expectedRequest.oAddr.ip4Address = new byte[]{10, 1, 1, 4};
         expectedRequest.iPort = 1234;
         expectedRequest.oPort = 5678;
         return expectedRequest;
index b16de90..079b205 100644 (file)
@@ -26,6 +26,8 @@ import io.fd.hc2vpp.common.translate.util.ByteDataTranslator;
 import io.fd.jvpp.nat.dto.Nat64AddDelPrefix;
 import io.fd.jvpp.nat.dto.Nat64AddDelPrefixReply;
 import io.fd.jvpp.nat.future.FutureJVppNatFacade;
+import io.fd.jvpp.nat.types.Ip6Address;
+import io.fd.jvpp.nat.types.Ip6Prefix;
 import org.junit.Test;
 import org.mockito.Mock;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;
@@ -77,10 +79,13 @@ public class Nat64PrefixesCustomizerTest extends WriterCustomizerTest implements
 
     private Nat64AddDelPrefix expectedRequest(final boolean isAdd) {
         final Nat64AddDelPrefix request = new Nat64AddDelPrefix();
-        request.isAdd = booleanToByte(isAdd);
+        request.isAdd = isAdd;
         request.vrfId = (int) VRF_ID;
-        request.prefix = new byte[]{0x20, 0x01, 0x0d, (byte) 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-        request.prefixLen = 32;
+        request.prefix = new Ip6Prefix();
+        request.prefix.prefix = new Ip6Address();
+        request.prefix.prefix.ip6Address =
+                new byte[]{0x20, 0x01, 0x0d, (byte) 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+        request.prefix.len = 32;
         return request;
     }
 }
\ No newline at end of file
index 52eeb82..c2ea5b6 100644 (file)
@@ -31,10 +31,13 @@ import io.fd.jvpp.nat.dto.Nat44InterfaceAddDelOutputFeatureReply;
 import io.fd.jvpp.nat.dto.Nat64AddDelInterface;
 import io.fd.jvpp.nat.dto.Nat64AddDelInterfaceReply;
 import io.fd.jvpp.nat.future.FutureJVppNatFacade;
+import io.fd.jvpp.nat.types.InterfaceIndex;
+import io.fd.jvpp.nat.types.NatConfigFlags;
 import org.junit.Test;
 import org.mockito.Mock;
 import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang._interface.nat.rev170816.InterfaceNatVppFeatureAttributes;
 import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang._interface.nat.rev170816._interface.nat.attributes.nat.Inbound;
+import org.opendaylight.yang.gen.v1.http.fd.io.hc2vpp.yang._interface.nat.rev170816._interface.nat.attributes.nat.Outbound;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
@@ -118,25 +121,43 @@ abstract class AbstractNatCustomizerTest<D extends InterfaceNatVppFeatureAttribu
 
     private Nat44InterfaceAddDelFeature expectedPreRoutingNat44Request(final D data, boolean isAdd) {
         Nat44InterfaceAddDelFeature request = new Nat44InterfaceAddDelFeature();
-        request.isInside = booleanToByte(data instanceof Inbound);
-        request.swIfIndex = IFACE_ID;
-        request.isAdd = booleanToByte(isAdd);
+        request.flags = new NatConfigFlags();
+        if (data instanceof Inbound) {
+            request.flags.add(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_INSIDE);
+        } else if (data instanceof Outbound) {
+            request.flags.add(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_OUTSIDE);
+        }
+        request.swIfIndex = new InterfaceIndex();
+        request.swIfIndex.interfaceindex = IFACE_ID;
+        request.isAdd = isAdd;
         return request;
     }
 
     private Nat64AddDelInterface expectedPreRoutingNat64Request(final D data, boolean isAdd) {
         Nat64AddDelInterface request = new Nat64AddDelInterface();
-        request.isInside = booleanToByte(data instanceof Inbound);
-        request.swIfIndex = IFACE_ID;
-        request.isAdd = booleanToByte(isAdd);
+        request.flags = new NatConfigFlags();
+        if (data instanceof Inbound) {
+            request.flags.add(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_INSIDE);
+        } else if (data instanceof Outbound) {
+            request.flags.add(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_OUTSIDE);
+        }
+        request.swIfIndex = new InterfaceIndex();
+        request.swIfIndex.interfaceindex = IFACE_ID;
+        request.isAdd = isAdd;
         return request;
     }
 
     private Nat44InterfaceAddDelOutputFeature expectedPostRoutingRequest(final D data, boolean isAdd) {
         Nat44InterfaceAddDelOutputFeature request = new Nat44InterfaceAddDelOutputFeature();
-        request.isInside = booleanToByte(data instanceof Inbound);
-        request.swIfIndex = IFACE_ID;
-        request.isAdd = booleanToByte(isAdd);
+        request.flags = new NatConfigFlags();
+        if (data instanceof Inbound) {
+            request.flags.add(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_INSIDE);
+        } else if (data instanceof Outbound) {
+            request.flags.add(NatConfigFlags.NatConfigFlagsOptions.NAT_IS_OUTSIDE);
+        }
+        request.swIfIndex = new InterfaceIndex();
+        request.swIfIndex.interfaceindex = IFACE_ID;
+        request.isAdd = isAdd;
         return request;
     }
 
index 9519e79..c5e1fb4 100644 (file)
             <groupId>io.fd.jvpp</groupId>
             <artifactId>jvpp-core</artifactId>
         </dependency>
+        <dependency>
+            <groupId>io.fd.jvpp</groupId>
+            <artifactId>jvpp-nat</artifactId>
+            <version>${jvpp.version}</version>
+        </dependency>
         <dependency>
             <groupId>org.opendaylight.mdsal.model</groupId>
             <artifactId>ietf-inet-types-2013-07-15</artifactId>
index 3f5a56f..e6d71be 100644 (file)
@@ -18,7 +18,6 @@ package io.fd.hc2vpp.common.translate.util;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import java.util.Arrays;
 import javax.annotation.Nonnull;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressNoZone;
index 88085db..f6fc3c7 100644 (file)
@@ -55,6 +55,20 @@ public interface Ipv4Translator extends ByteDataTranslator {
         return retval;
     }
 
+    /**
+     * Creates {@link io.fd.jvpp.nat.types.Ip4Address} address from address part of {@link Ipv4Prefix}
+     *
+     * @return {@link io.fd.jvpp.nat.types.Ip4Address}
+     */
+    default io.fd.jvpp.nat.types.Ip4Address ipv4AddressPrefixToNatIp4Address(@Nonnull final Ipv4Prefix ipv4Prefix) {
+        checkNotNull(ipv4Prefix, "Cannot convert null prefix");
+
+        io.fd.jvpp.nat.types.Ip4Address address = new io.fd.jvpp.nat.types.Ip4Address();
+        address.ip4Address = ipv4AddressPrefixToArray(ipv4Prefix);
+
+        return address;
+    }
+
     /**
      * Extracts {@link Ipv4Prefix} prefix
      */
@@ -88,6 +102,17 @@ public interface Ipv4Translator extends ByteDataTranslator {
         return ipv4AddressNoZoneToArray(ipv4Addr.getValue());
     }
 
+    /**
+     * Transform Ipv4 address to a {@link io.fd.jvpp.nat.types.Ip4Address} acceptable by VPP.
+     *
+     * @return {@link io.fd.jvpp.nat.types.Ip4Address}
+     */
+    default io.fd.jvpp.nat.types.Ip4Address ipv4AddressNoZoneToNatIp4Address(final Ipv4AddressNoZone ipv4Addr) {
+        io.fd.jvpp.nat.types.Ip4Address ip4Address = new io.fd.jvpp.nat.types.Ip4Address();
+        ip4Address.ip4Address = ipv4AddressNoZoneToArray(ipv4Addr.getValue());
+        return ip4Address;
+    }
+
     /**
      * Transform Ipv4 address to a Ip4Address acceptable by VPP.
      *
index 1531439..c1ccd2d 100644 (file)
@@ -77,6 +77,19 @@ public interface Ipv6Translator extends ByteDataTranslator {
                 new Ipv6Address(ipv6Prefix.getValue().substring(0, ipv6Prefix.getValue().indexOf('/')))));
     }
 
+    /**
+     * Creates {@link io.fd.jvpp.nat.types.Ip6Address} from address part of {@link Ipv6Prefix}
+     *
+     * @return {@link io.fd.jvpp.nat.types.Ip6Address}
+     */
+    default io.fd.jvpp.nat.types.Ip6Address ipv6AddressPrefixToNatIp6Address(@Nonnull final Ipv6Prefix ipv6Prefix) {
+        checkNotNull(ipv6Prefix, "Cannot convert null prefix");
+
+        io.fd.jvpp.nat.types.Ip6Address ip6Address = new io.fd.jvpp.nat.types.Ip6Address();
+        ip6Address.ip6Address = ipv6AddressPrefixToArray(ipv6Prefix);
+        return ip6Address;
+    }
+
     /**
      * Transforms {@link Prefix} from {@link Ipv6Prefix}
      * @param ipv6Prefix prefix to be translated
@@ -94,6 +107,21 @@ public interface Ipv6Translator extends ByteDataTranslator {
         return prefix;
     }
 
+    /**
+     * Creates {@link io.fd.jvpp.nat.types.Ip6Prefix} from {@link Ipv6Prefix}
+     *
+     * @param ipv6Prefix prefix to be translated
+     * @return Vpp {@link io.fd.jvpp.nat.types.Ip6Prefix} from {@link Ipv6Prefix}
+     */
+    default io.fd.jvpp.nat.types.Ip6Prefix ipv6AddressPrefixToNatIp6Prefix(@Nonnull final Ipv6Prefix ipv6Prefix) {
+        checkNotNull(ipv6Prefix, "Cannot convert null prefix");
+        io.fd.jvpp.nat.types.Ip6Prefix prefix = new io.fd.jvpp.nat.types.Ip6Prefix();
+        prefix.prefix = new io.fd.jvpp.nat.types.Ip6Address();
+        prefix.prefix.ip6Address = ipv6AddressPrefixToArray(ipv6Prefix);
+        prefix.len = extractPrefix(ipv6Prefix);
+        return prefix;
+    }
+
     /**
      * Extracts {@link Ipv6Prefix} prefix
      */