diff options
4 files changed, 33 insertions, 33 deletions
diff --git a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/factory/MultipathHopRequestFactory.java b/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/factory/MultipathHopRequestFactory.java index 4497e81dc..6df95a0fd 100644 --- a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/factory/MultipathHopRequestFactory.java +++ b/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/factory/MultipathHopRequestFactory.java @@ -128,7 +128,7 @@ public class MultipathHopRequestFactory extends BasicHopRequestFactory implement final int primaryVrf, final int secondaryVrf, final int classifyTableIndex, final boolean classifyIndexSet) { return flaglessAddDelRouteRequest(booleanToByte(isAdd), nextHopInterfaceIndex, - ipv6AddressNoZoneToArray(nextHopAddress.getValue()), nextHopWeight, toByte(1), + ipv6AddressNoZoneToArray(nextHopAddress), nextHopWeight, toByte(1), ipv6AddressPrefixToArray(destinationAddress), extractPrefix(destinationAddress.getValue()), toByte(1), primaryVrf, secondaryVrf, classifyTableIndex, booleanToByte(classifyIndexSet)); diff --git a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/factory/SimpleHopRequestFactory.java b/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/factory/SimpleHopRequestFactory.java index 98c36e4ad..60be15d44 100644 --- a/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/factory/SimpleHopRequestFactory.java +++ b/routing/routing-impl/src/main/java/io/fd/hc2vpp/routing/write/factory/SimpleHopRequestFactory.java @@ -127,7 +127,7 @@ public class SimpleHopRequestFactory extends BasicHopRequestFactory implements R final int primaryVrf, final int secondaryVrf, final int classifyTableIndex, final boolean classifyIndexSet) { return flaglessAddDelRouteRequest(booleanToByte(isAdd), nextHopInterfaceIndex, - ipv6AddressNoZoneToArray(nextHopAddress.getValue()), DEFAULT_HOP_WEIGHT, BYTE_TRUE, + ipv6AddressNoZoneToArray(nextHopAddress), DEFAULT_HOP_WEIGHT, BYTE_TRUE, ipv6AddressPrefixToArray(destinationAddress), extractPrefix(destinationAddress.getValue()), BYTE_FALSE, primaryVrf, secondaryVrf, classifyTableIndex, booleanToByte(classifyIndexSet)); } diff --git a/vpp-common/vpp-translate-utils/src/main/java/io/fd/hc2vpp/common/translate/util/Ipv6Translator.java b/vpp-common/vpp-translate-utils/src/main/java/io/fd/hc2vpp/common/translate/util/Ipv6Translator.java index 396391dd7..c4a4ba38e 100644 --- a/vpp-common/vpp-translate-utils/src/main/java/io/fd/hc2vpp/common/translate/util/Ipv6Translator.java +++ b/vpp-common/vpp-translate-utils/src/main/java/io/fd/hc2vpp/common/translate/util/Ipv6Translator.java @@ -24,10 +24,7 @@ import com.google.common.net.InetAddresses; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; import javax.annotation.Nonnull; -import org.apache.commons.lang3.StringUtils; 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.IpPrefix; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address; @@ -39,32 +36,14 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types. */ public interface Ipv6Translator extends ByteDataTranslator { - default byte[] ipv6AddressNoZoneToArray(@Nonnull final String address) { - byte[] retval = new byte[16]; - - //splits address and add ommited zeros for easier parsing - List<String> segments = Arrays.asList(address.split(":")) - .stream() - .map(segment -> StringUtils.repeat('0', 4 - segment.length()) + segment) - .collect(Collectors.toList()); - - byte index = 0; - for (String segment : segments) { - - String firstPart = segment.substring(0, 2); - String secondPart = segment.substring(2); - - //first part should be ommited - if ("00".equals(firstPart)) { - index++; - } else { - retval[index++] = ((byte) Short.parseShort(firstPart, 16)); - } - - retval[index++] = ((byte) Short.parseShort(secondPart, 16)); - } - - return retval; + /** + * Transform Ipv6 address to a byte array acceptable by VPP. VPP expects incoming byte array to be in the same order + * as the address. + * + * @return byte array with address bytes + */ + default byte[] ipv6AddressNoZoneToArray(@Nonnull final Ipv6Address address) { + return Impl.ipv6AddressNoZoneToArray(address.getValue()); } /** @@ -74,7 +53,7 @@ public interface Ipv6Translator extends ByteDataTranslator { * @return byte array with address bytes */ default byte[] ipv6AddressNoZoneToArray(@Nonnull final Ipv6AddressNoZone ipv6Addr) { - return ipv6AddressNoZoneToArray(ipv6Addr.getValue()); + return Impl.ipv6AddressNoZoneToArray(ipv6Addr.getValue()); } /** @@ -163,4 +142,15 @@ public interface Ipv6Translator extends ByteDataTranslator { "Cannot create prefix for address[" + Arrays.toString(address) + "],prefix[" + prefix + "]"); } } + + class Impl { + private static byte[] ipv6AddressNoZoneToArray(@Nonnull final String address){ + try { + // No lookup performed for literal ipv6 addresses + return InetAddress.getByName(address).getAddress(); + } catch (UnknownHostException e) { + throw new IllegalArgumentException("Invalid address supplied", e); + } + } + } } diff --git a/vpp-common/vpp-translate-utils/src/test/java/io/fd/hc2vpp/common/translate/util/Ipv6TranslatorTest.java b/vpp-common/vpp-translate-utils/src/test/java/io/fd/hc2vpp/common/translate/util/Ipv6TranslatorTest.java index 1099f6809..a620cbdd2 100644 --- a/vpp-common/vpp-translate-utils/src/test/java/io/fd/hc2vpp/common/translate/util/Ipv6TranslatorTest.java +++ b/vpp-common/vpp-translate-utils/src/test/java/io/fd/hc2vpp/common/translate/util/Ipv6TranslatorTest.java @@ -28,7 +28,17 @@ public class Ipv6TranslatorTest implements Ipv6Translator { public void testIpv6NoZone() { final Ipv6AddressNoZone ipv6Addr = new Ipv6AddressNoZone("3ffe:1900:4545:3:200:f8ff:fe21:67cf"); byte[] bytes = ipv6AddressNoZoneToArray(ipv6Addr); - assertEquals((byte) 63, bytes[0]); + assertEquals((byte) 0x3f, bytes[0]); + final Ipv6AddressNoZone ivp6AddressNoZone = arrayToIpv6AddressNoZone(bytes); + assertEquals(ipv6Addr, ivp6AddressNoZone); + } + + @Test + public void testIpv6NoZoneEmptyGroup() { + final Ipv6AddressNoZone ipv6Addr = new Ipv6AddressNoZone("10::10"); + byte[] bytes = ipv6AddressNoZoneToArray(ipv6Addr); + assertEquals((byte) 0, bytes[0]); + assertEquals((byte) 0x10, bytes[1]); final Ipv6AddressNoZone ivp6AddressNoZone = arrayToIpv6AddressNoZone(bytes); assertEquals(ipv6Addr, ivp6AddressNoZone); } |