Optimize IpConversionUtil.extractIpv4AddressMask() 44/80544/7
authorRobert Varga <robert.varga@pantheon.tech>
Fri, 22 Feb 2019 13:14:11 +0000 (14:14 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 7 Mar 2019 10:41:13 +0000 (11:41 +0100)
Rather than going through String.format() use simple pre-allocated
StringBuilder.

Furthermore, Ipv4Prefix is guaranteed to always contain a slash,
hence we can use a simple indexOf/substring instead of splitting
the string.

Finally, if the prefix is 32, we can reuse the DottedQuad we keep
around for full arbitrary mask.

JIRA: OPNFLWPLUG-1067
Change-Id: I99f036c86606142a9f844507789293cd9822692f
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/common/IpConversionUtil.java
openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/common/IpConversionUtilTest.java

index d1b217005141fb920d3a52fd023188ed51dd3d8f..4fe4d390816984330a4027234e934a090da29922 100644 (file)
@@ -630,18 +630,18 @@ public final class IpConversionUtil {
     }
 
     public static DottedQuad extractIpv4AddressMask(final Ipv4Prefix ipv4Prefix) {
-        Iterator<String> addressParts = PREFIX_SPLITTER.split(ipv4Prefix.getValue()).iterator();
-        addressParts.next();
-        Integer cidrMask = 0;
-        if (addressParts.hasNext()) {
-            cidrMask = Integer.parseInt(addressParts.next());
-        }
-        long maskBits = 0;
-        maskBits = 0xffffffff << IPV4_ADDRESS_LENGTH - cidrMask;
-        String mask = String.format("%d.%d.%d.%d", (maskBits & 0x0000000000ff000000L) >> 24,
-                (maskBits & 0x0000000000ff0000) >> 16, (maskBits & 0x0000000000ff00) >> 8, maskBits & 0xff);
-        DottedQuad netMask = new DottedQuad(mask);
-        return netMask;
+        final String value = ipv4Prefix.getValue();
+        final int cidrMask = Integer.parseInt(value.substring(value.indexOf('/') + 1));
+        if (cidrMask == IPV4_ADDRESS_LENGTH) {
+            return DEFAULT_ARBITRARY_BITMASK;
+        }
+
+        final long maskBits = 0xffffffff << IPV4_ADDRESS_LENGTH - cidrMask;
+        return new DottedQuad(new StringBuilder(15)
+            .append((maskBits & 0x0000000000ff000000L) >> 24).append('.')
+            .append((maskBits & 0x0000000000ff0000) >> 16).append('.')
+            .append((maskBits & 0x0000000000ff00) >> 8).append('.')
+            .append(maskBits & 0xff).toString());
     }
 
     @Nullable
index de11d54db72fd52d88a38d80f4ca62fb07451d91..71211f05d992dbf51acd36dd70e8b58f98ae8e2d 100644 (file)
@@ -125,9 +125,20 @@ public class IpConversionUtilTest {
 
     @Test
     public void extractIpv4AddressMaskTest() {
-        DottedQuad dottedQuad;
-        dottedQuad = IpConversionUtil.extractIpv4AddressMask(new Ipv4Prefix("1.1.1.1/24"));
-        Assert.assertEquals(dottedQuad.getValue(),"255.255.255.0");
+        assertAddressMask("128.0.0.0", 1);
+        assertAddressMask("255.0.0.0", 8);
+        assertAddressMask("255.128.0.0", 9);
+        assertAddressMask("255.255.0.0", 16);
+        assertAddressMask("255.255.128.0", 17);
+        assertAddressMask("255.255.255.0", 24);
+        assertAddressMask("255.255.255.128", 25);
+        assertAddressMask("255.255.255.254", 31);
+        assertAddressMask("255.255.255.255", 32);
+    }
+
+    private static void assertAddressMask(final String expected, final int prefix) {
+        Assert.assertEquals(expected,
+            IpConversionUtil.extractIpv4AddressMask(new Ipv4Prefix("1.1.1.1/" + prefix)).getValue());
     }
 
     @Test