Optimize ipv4/ipv6 formatting 62/7662/2
authorRobert Varga <rovarga@cisco.com>
Tue, 3 Jun 2014 22:41:56 +0000 (00:41 +0200)
committerRobert Varga <rovarga@cisco.com>
Wed, 4 Jun 2014 09:36:27 +0000 (11:36 +0200)
IPv4/IPv6 formatting relied on multiple objects until the final string
was produced. This fixes the way the algorithm operates to make it more
obvious, but also more performant.

Change-Id: Idcfbde227e999dc78363c87952bca7dfb376c5b7
Signed-off-by: Robert Varga <rovarga@cisco.com>
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/action/OF10AbstractIpAddressActionDeserializer.java
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/match/AbstractOxmIpv4AddressDeserializer.java
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/match/AbstractOxmIpv6AddressDeserializer.java
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/ByteBufUtils.java
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/OF10MatchDeserializer.java

index cb3194144fdc1b2dd42cc391a7c95b2d7d17e4d2..6190e9120b74797ebc93d5ed5d284fec0b0f9543 100644 (file)
@@ -10,9 +10,6 @@ package org.opendaylight.openflowjava.protocol.impl.deserialization.action;
 \r
 import io.netty.buffer.ByteBuf;\r
 \r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
 import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;\r
 import org.opendaylight.openflowjava.protocol.impl.util.EncodeConstants;\r
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;\r
@@ -41,11 +38,7 @@ public abstract class OF10AbstractIpAddressActionDeserializer extends AbstractAc
 \r
     private static Augmentation<Action> createNwAddressAugmentationAndPad(final ByteBuf input) {\r
         IpAddressActionBuilder ipBuilder = new IpAddressActionBuilder();\r
-        List<String> groups = new ArrayList<>();\r
-        for (int i = 0; i < EncodeConstants.GROUPS_IN_IPV4_ADDRESS; i++) {\r
-            groups.add(Short.toString(input.readUnsignedByte()));\r
-        }\r
-        ipBuilder.setIpAddress(new Ipv4Address(ByteBufUtils.DOT_JOINER.join(groups)));\r
+        ipBuilder.setIpAddress(new Ipv4Address(ByteBufUtils.readIpv4Address(input)));\r
         return ipBuilder.build();\r
     }\r
 \r
index a3ac7c0695648e11721d42f79cfcc65190c8d2c6..63085cb32948772c6d8d551cd0f63fab915d89d8 100644 (file)
@@ -9,9 +9,6 @@ package org.opendaylight.openflowjava.protocol.impl.deserialization.match;
 \r
 import io.netty.buffer.ByteBuf;\r
 \r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;\r
 import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;\r
 import org.opendaylight.openflowjava.protocol.impl.util.EncodeConstants;\r
@@ -40,11 +37,7 @@ public abstract class AbstractOxmIpv4AddressDeserializer extends AbstractOxmMatc
 \r
     private static void addIpv4AddressAugmentation(final MatchEntriesBuilder builder, final ByteBuf input) {\r
         Ipv4AddressMatchEntryBuilder ipv4AddressBuilder = new Ipv4AddressMatchEntryBuilder();\r
-        List<String> groups = new ArrayList<>();\r
-        for (int i = 0; i < EncodeConstants.GROUPS_IN_IPV4_ADDRESS; i++) {\r
-            groups.add(Short.toString(input.readUnsignedByte()));\r
-        }\r
-        ipv4AddressBuilder.setIpv4Address(new Ipv4Address(ByteBufUtils.DOT_JOINER.join(groups)));\r
+        ipv4AddressBuilder.setIpv4Address(new Ipv4Address(ByteBufUtils.readIpv4Address(input)));\r
         builder.addAugmentation(Ipv4AddressMatchEntry.class, ipv4AddressBuilder.build());\r
     }\r
 }\r
index 94eec111f7a59ddb228f483568d24d1427483fd0..2afce0b88d6bfddd73e4d47ad40e333ac3cad94e 100644 (file)
@@ -9,9 +9,6 @@ package org.opendaylight.openflowjava.protocol.impl.deserialization.match;
 \r
 import io.netty.buffer.ByteBuf;\r
 \r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;\r
 import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;\r
 import org.opendaylight.openflowjava.protocol.impl.util.EncodeConstants;\r
@@ -41,11 +38,7 @@ public abstract class AbstractOxmIpv6AddressDeserializer extends AbstractOxmMatc
 \r
     private static void addIpv6AddressAugmentation(final MatchEntriesBuilder builder, final ByteBuf input) {\r
         Ipv6AddressMatchEntryBuilder ipv6AddressBuilder = new Ipv6AddressMatchEntryBuilder();\r
-        List<String> groups = new ArrayList<>();\r
-        for (int i = 0; i < EncodeConstants.GROUPS_IN_IPV6_ADDRESS; i++) {\r
-            groups.add(String.format("%04X", input.readUnsignedShort()));\r
-        }\r
-        ipv6AddressBuilder.setIpv6Address(new Ipv6Address(ByteBufUtils.COLON_JOINER.join(groups)));\r
+        ipv6AddressBuilder.setIpv6Address(new Ipv6Address(ByteBufUtils.readIpv6Address(input)));\r
         builder.addAugmentation(Ipv6AddressMatchEntry.class, ipv6AddressBuilder.build());\r
     }\r
 }\r
index 1fab286cf55bcf3f909093433aa64c4865968f28..07ad5584894a40813ab1ad945f9f2d170a24750b 100644 (file)
@@ -20,7 +20,6 @@ import java.util.Map.Entry;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
 
-import com.google.common.base.Joiner;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Splitter;
 import com.google.common.collect.Lists;
@@ -32,9 +31,7 @@ import com.google.common.primitives.UnsignedBytes;
  */
 public abstract class ByteBufUtils {
     public static final Splitter DOT_SPLITTER = Splitter.on('.');
-    public static final Joiner DOT_JOINER = Joiner.on(".");
     public static final Splitter COLON_SPLITTER = Splitter.on(':');
-    public static final Joiner COLON_JOINER = Joiner.on(":");
     private static final char[] HEX_CHARS = "0123456789ABCDEF".toCharArray();
 
     /**
@@ -249,12 +246,19 @@ public abstract class ByteBufUtils {
         return result;
     }
 
-    private static final void appendByte(final StringBuilder sb, final byte b) {
+    private static final void appendHexByte(final StringBuilder sb, final byte b) {
         final int v = UnsignedBytes.toInt(b);
         sb.append(HEX_CHARS[v >> 4]);
         sb.append(HEX_CHARS[v & 15]);
     }
 
+    private static void appendHexUnsignedShort(final StringBuilder sb, final int val) {
+        sb.append(ByteBufUtils.HEX_CHARS[(val >> 12) & 15]);
+        sb.append(ByteBufUtils.HEX_CHARS[(val >>  8) & 15]);
+        sb.append(ByteBufUtils.HEX_CHARS[(val >>  4) & 15]);
+        sb.append(ByteBufUtils.HEX_CHARS[ val        & 15]);
+    }
+
     /**
      * Converts a MAC address represented in bytes to String
      * @param address
@@ -266,10 +270,10 @@ public abstract class ByteBufUtils {
 
         final StringBuilder sb = new StringBuilder(17);
 
-        appendByte(sb, address[0]);
+        appendHexByte(sb, address[0]);
         for (int i = 1; i < EncodeConstants.MAC_ADDRESS_LENGTH; i++) {
             sb.append(':');
-            appendByte(sb, address[i]);
+            appendHexByte(sb, address[i]);
         }
 
         return sb.toString();
@@ -287,4 +291,40 @@ public abstract class ByteBufUtils {
         return new String(name).trim();
     }
 
+    /**
+     * Read an IPv4 address from a buffer and format it into dotted-quad string.
+     *
+     * @param buf Input buffer
+     * @return Dotted-quad string
+     */
+    public static String readIpv4Address(final ByteBuf buf) {
+        final StringBuilder sb = new StringBuilder(EncodeConstants.GROUPS_IN_IPV4_ADDRESS * 4 - 1);
+
+        sb.append(buf.readUnsignedByte());
+        for (int i = 1; i < EncodeConstants.GROUPS_IN_IPV4_ADDRESS; i++) {
+            sb.append('.');
+            sb.append(buf.readUnsignedByte());
+        }
+
+        return sb.toString();
+    }
+
+    /**
+     * Read an IPv6 address from a buffer and format it into a string of eight groups of four
+     * hexadecimal digits separated by colons.
+     *
+     * @param buf Input buffer
+     * @return IPv6 address in string format
+     */
+    public static String readIpv6Address(final ByteBuf buf) {
+        final StringBuilder sb = new StringBuilder(EncodeConstants.GROUPS_IN_IPV6_ADDRESS * 5 - 1);
+
+        appendHexUnsignedShort(sb, buf.readUnsignedShort());
+        for (int i = 1; i < EncodeConstants.GROUPS_IN_IPV6_ADDRESS; i++) {
+            sb.append(':');
+            appendHexUnsignedShort(sb, buf.readUnsignedShort());
+        }
+
+        return sb.toString();
+    }
 }
index cd06f2ddbec5cc4ae825b6a66cce23564683c109..4e510df9fa4b4f5da82ffe550f3a1fdad78be3c2 100644 (file)
@@ -10,9 +10,6 @@ package org.opendaylight.openflowjava.protocol.impl.util;
 
 import io.netty.buffer.ByteBuf;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
@@ -57,16 +54,8 @@ public class OF10MatchDeserializer implements OFDeserializer<MatchV10> {
         builder.setNwTos(input.readUnsignedByte());
         builder.setNwProto(input.readUnsignedByte());
         input.skipBytes(PADDING_IN_MATCH_2);
-        List<String> srcGroups = new ArrayList<>();
-        for (int i = 0; i < EncodeConstants.GROUPS_IN_IPV4_ADDRESS; i++) {
-            srcGroups.add(Short.toString(input.readUnsignedByte()));
-        }
-        builder.setNwSrc(new Ipv4Address(ByteBufUtils.DOT_JOINER.join(srcGroups)));
-        List<String> dstGroups = new ArrayList<>();
-        for (int i = 0; i < EncodeConstants.GROUPS_IN_IPV4_ADDRESS; i++) {
-            dstGroups.add(Short.toString(input.readUnsignedByte()));
-        }
-        builder.setNwDst(new Ipv4Address(ByteBufUtils.DOT_JOINER.join(dstGroups)));
+        builder.setNwSrc(new Ipv4Address(ByteBufUtils.readIpv4Address(input)));
+        builder.setNwDst(new Ipv4Address(ByteBufUtils.readIpv4Address(input)));
         builder.setTpSrc(input.readUnsignedShort());
         builder.setTpDst(input.readUnsignedShort());
         return builder.build();