From 7a432b5dea58a8576830985baaffa3c5ee41978e Mon Sep 17 00:00:00 2001 From: Maros Marsalek Date: Mon, 10 Oct 2016 15:30:12 +0200 Subject: HONEYCOMB-249 Add Ipv4Range calulator utility Change-Id: If55fdafd6ed0a9c6acb9de74bf64154d3f26b2d5 Signed-off-by: Maros Marsalek --- .../translate/vpp/util/Ipv4AddressRange.java | 114 +++++++++++++++++++++ .../translate/vpp/util/Ipv4Translator.java | 3 + .../translate/vpp/util/Ipv4AddressRangeTest.java | 57 +++++++++++ 3 files changed, 174 insertions(+) create mode 100644 vpp-common/vpp-translate-utils/src/main/java/io/fd/honeycomb/translate/vpp/util/Ipv4AddressRange.java create mode 100644 vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/Ipv4AddressRangeTest.java (limited to 'vpp-common') diff --git a/vpp-common/vpp-translate-utils/src/main/java/io/fd/honeycomb/translate/vpp/util/Ipv4AddressRange.java b/vpp-common/vpp-translate-utils/src/main/java/io/fd/honeycomb/translate/vpp/util/Ipv4AddressRange.java new file mode 100644 index 000000000..8408e79f4 --- /dev/null +++ b/vpp-common/vpp-translate-utils/src/main/java/io/fd/honeycomb/translate/vpp/util/Ipv4AddressRange.java @@ -0,0 +1,114 @@ +/* + * 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.honeycomb.translate.vpp.util; + +import java.util.Objects; +import javax.annotation.Nonnull; +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; + +/** + * IPv4 address range representation. + */ +public final class Ipv4AddressRange { + + private final Ipv4AddressNoZone start; + private final Ipv4AddressNoZone end; + + private Ipv4AddressRange(@Nonnull final Ipv4AddressNoZone start, @Nonnull final Ipv4AddressNoZone end) { + this.start = start; + this.end = end; + } + + public Ipv4AddressNoZone getStart() { + return start; + } + + public Ipv4AddressNoZone getEnd() { + return end; + } + + @Override + public boolean equals(final Object other) { + if (this == other) { + return true; + } + if (other == null || getClass() != other.getClass()) { + return false; + } + final Ipv4AddressRange that = (Ipv4AddressRange) other; + return Objects.equals(start, that.start) + && Objects.equals(end, that.end); + } + + @Override + public int hashCode() { + return Objects.hash(start, end); + } + + @Override + public String toString() { + return "Ipv4AddressRange{" + + "start=" + start + + ", end=" + end + + '}'; + } + + /** + * Create address range from prefix. + */ + public static Ipv4AddressRange fromPrefix(final Ipv4Prefix externalIpPool) { + final String addressString = externalIpPool.getValue().split("/")[0]; + byte prefixLength = Ipv4Translator.INSTANCE.extractPrefix(externalIpPool); + + if (prefixLength == 32) { + // 32 Prefix can be handled instantly + return new Ipv4AddressRange(new Ipv4AddressNoZone(addressString), new Ipv4AddressNoZone(addressString)); + } + + final byte[] prefixAddrBytes = Ipv4Translator.INSTANCE.ipv4AddressNoZoneToArray(addressString); + final byte[] prefixAddrBytes0 = new byte[prefixAddrBytes.length]; + final byte[] prefixAddrBytesF = new byte[prefixAddrBytes.length]; + + byte index = 0; + while (prefixLength >= 8) { + prefixAddrBytes0[index] = prefixAddrBytes[index]; + prefixAddrBytesF[index] = prefixAddrBytes[index]; + index++; + prefixLength -= 8; + } + + // Take care of the rest + if (prefixLength != 0) { + final int mask0 = (byte) (Math.pow(2, prefixLength) - 1) << (8 - prefixLength); + prefixAddrBytes0[index] = (byte) (prefixAddrBytes[index] & mask0); + + final int maskF = (byte) (Math.pow(2, 8 - prefixLength) - 1); + prefixAddrBytesF[index] = (byte) (prefixAddrBytes[index] | maskF); + + index++; + } + + for (int i = index; i < 4; i++) { + prefixAddrBytes0[i] = 0; + prefixAddrBytesF[i] = (byte) 255; + } + + return new Ipv4AddressRange(Ipv4Translator.INSTANCE.arrayToIpv4AddressNoZoneReversed(prefixAddrBytes0), + Ipv4Translator.INSTANCE.arrayToIpv4AddressNoZoneReversed(prefixAddrBytesF)); + } +} diff --git a/vpp-common/vpp-translate-utils/src/main/java/io/fd/honeycomb/translate/vpp/util/Ipv4Translator.java b/vpp-common/vpp-translate-utils/src/main/java/io/fd/honeycomb/translate/vpp/util/Ipv4Translator.java index ff737d4ab..b5f93dfba 100644 --- a/vpp-common/vpp-translate-utils/src/main/java/io/fd/honeycomb/translate/vpp/util/Ipv4Translator.java +++ b/vpp-common/vpp-translate-utils/src/main/java/io/fd/honeycomb/translate/vpp/util/Ipv4Translator.java @@ -30,6 +30,9 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types. */ public interface Ipv4Translator extends ByteDataTranslator { + /** + * Make available also from static context. + */ Ipv4Translator INSTANCE = new Ipv4Translator() {}; /** diff --git a/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/Ipv4AddressRangeTest.java b/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/Ipv4AddressRangeTest.java new file mode 100644 index 000000000..aef81fce6 --- /dev/null +++ b/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/Ipv4AddressRangeTest.java @@ -0,0 +1,57 @@ +/* + * 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.honeycomb.translate.vpp.util; + +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; +import java.util.Collection; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix; + +@RunWith(Parameterized.class) +public class Ipv4AddressRangeTest { + + private final String prefix; + private final String start; + private final String end; + + public Ipv4AddressRangeTest(String prefix, String start, String end) { + this.prefix = prefix; + this.start = start; + this.end = end; + } + + @Parameterized.Parameters + public static Collection data() { + return Arrays.asList(new Object[][] { + { "1.1.1.1/0", "0.0.0.0", "255.255.255.255"}, + { "1.1.1.1/32", "1.1.1.1", "1.1.1.1"}, + { "192.168.1.5/8", "192.0.0.0", "192.255.255.255"}, + { "192.168.1.5/10", "192.128.0.0", "192.191.255.255"} + }); + } + + @Test + public void test() throws Exception { + final Ipv4AddressRange range = Ipv4AddressRange.fromPrefix(new Ipv4Prefix(prefix)); + assertEquals(start, range.getStart().getValue()); + assertEquals(end, range.getEnd().getValue()); + } +} \ No newline at end of file -- cgit 1.2.3-korg