Fix IetfInetUtil.ipv{4,6}PrefixFor(Ipv{4,6}Address) 59/72759/2
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 7 Jun 2018 13:21:14 +0000 (15:21 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 7 Jun 2018 13:40:47 +0000 (15:40 +0200)
These methods forgot to account for possible zone, leading to
illegal prefixes being handed out.

Change-Id: Iac4a27eae0ddd1f1215afcca289410eb1f54f458
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
model/ietf/ietf-inet-types-2013-07-15/src/test/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IetfInetUtilTest.java
model/ietf/ietf-type-util/src/main/java/org/opendaylight/mdsal/model/ietf/util/AbstractIetfInetUtil.java

index f9a0080997b346de6a0d4212d3fb3d57077686d3..2a4ada40fd7169a595086f4226eaeb82cab22341 100644 (file)
@@ -57,4 +57,10 @@ public class IetfInetUtilTest {
         assertEquals(ipv6AddressString, maybeIpv6Address.getValue());
         assertEquals(ipAddress, new IpAddress(ipv6Address));
     }
+
+    @Test
+    public void testAddressToString() {
+        assertEquals(new Ipv4Prefix("1.2.3.4/8"), IetfInetUtil.INSTANCE.ipv4PrefixFor(new Ipv4Address("1.2.3.4%1"), 8));
+        assertEquals(new Ipv6Prefix("ff00::/8"), IetfInetUtil.INSTANCE.ipv6PrefixFor(new Ipv6Address("ff00::%bar"), 8));
+    }
 }
\ No newline at end of file
index 9114644585a9077d856e521829b55d342f4950d1..0c7d76abd6c85b5dacddff6fe2e2f5cb1ac944b4 100644 (file)
@@ -218,7 +218,7 @@ public abstract class AbstractIetfInetUtil<A4, P4, A6, P6, A, P> {
             return prefix4Factory.getTemplate();
         }
 
-        return v4PrefixForShort(address, 0, (mask / Byte.SIZE) + ((mask % Byte.SIZE == 0) ? 0 : 1), mask);
+        return v4PrefixForShort(address, 0, mask / Byte.SIZE + (mask % Byte.SIZE == 0 ? 0 : 1), mask);
     }
 
     @Nonnull public final P4 ipv4PrefixForShort(@Nonnull final byte[] array, final int startOffset, final int mask) {
@@ -227,7 +227,7 @@ public abstract class AbstractIetfInetUtil<A4, P4, A6, P6, A, P> {
             return prefix4Factory.getTemplate();
         }
 
-        return v4PrefixForShort(array, startOffset, (mask / Byte.SIZE) + ((mask % Byte.SIZE == 0) ? 0 : 1), mask);
+        return v4PrefixForShort(array, startOffset, mask / Byte.SIZE + (mask % Byte.SIZE == 0 ? 0 : 1), mask);
     }
 
     /**
@@ -262,13 +262,18 @@ public abstract class AbstractIetfInetUtil<A4, P4, A6, P6, A, P> {
 
     @Nonnull public final P4 ipv4PrefixFor(@Nonnull final A4 addr) {
         Preconditions.checkNotNull(addr, "Address must not be null");
-        return prefix4Factory.newInstance(ipv4AddressString(addr) + "/32");
+        return prefix4Factory.newInstance(stripZone(ipv4AddressString(addr)) + "/32");
     }
 
     @Nonnull public final P4 ipv4PrefixFor(@Nonnull final A4 addr, final int mask) {
         Preconditions.checkNotNull(addr, "Address must not be null");
         Preconditions.checkArgument(mask >= 0 && mask <= 32, "Invalid mask %s", mask);
-        return prefix4Factory.newInstance(ipv4AddressString(addr) + '/' + mask);
+        return prefix4Factory.newInstance(stripZone(ipv4AddressString(addr)) + '/' + mask);
+    }
+
+    private static String stripZone(final String str) {
+        final int percent = str.indexOf('%');
+        return percent == -1 ? str : str.substring(0, percent);
     }
 
     @Nonnull public final Entry<A4, Integer> splitIpv4Prefix(@Nonnull final P4 prefix) {
@@ -362,7 +367,7 @@ public abstract class AbstractIetfInetUtil<A4, P4, A6, P6, A, P> {
         }
 
         Preconditions.checkArgument(mask > 0 && mask <= 128, "Invalid mask %s", mask);
-        final int size = (mask / Byte.SIZE) + ((mask % Byte.SIZE == 0) ? 0 : 1);
+        final int size = mask / Byte.SIZE + (mask % Byte.SIZE == 0 ? 0 : 1);
 
         // Until we can instantiate an IPv6 address for a partial array, use a temporary buffer
         byte[] tmp = new byte[INET6_LENGTH];
@@ -402,13 +407,13 @@ public abstract class AbstractIetfInetUtil<A4, P4, A6, P6, A, P> {
 
     @Nonnull public final P6 ipv6PrefixFor(@Nonnull final A6 addr) {
         Preconditions.checkNotNull(addr, "Address must not be null");
-        return prefix6Factory.newInstance(ipv6AddressString(addr) + "/128");
+        return prefix6Factory.newInstance(stripZone(ipv6AddressString(addr)) + "/128");
     }
 
     @Nonnull public final P6 ipv6PrefixFor(@Nonnull final A6 addr, final int mask) {
         Preconditions.checkNotNull(addr, "Address must not be null");
         Preconditions.checkArgument(mask >= 0 && mask <= 128, "Invalid mask %s", mask);
-        return prefix6Factory.newInstance(ipv6AddressString(addr) + '/' + mask);
+        return prefix6Factory.newInstance(stripZone(ipv6AddressString(addr)) + '/' + mask);
     }
 
     @Nonnull public final Entry<A6, Integer> splitIpv6Prefix(@Nonnull final P6 prefix) {