Speed up ConntrackCodec's ipv4 handling 84/94384/3
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 3 Jan 2021 22:56:34 +0000 (23:56 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 4 Jan 2021 00:06:34 +0000 (01:06 +0100)
Add readIpv4Address(), which uses IetfInetUtil to efficiently
read an Ipv4Address from a ByteBuf. Also move the write path,
which already uses IetfInetUtil.

Change-Id: Ic5a64f06cf4349bfbb2f6a9347a05a81afb33a10
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/ConntrackCodec.java

index d538a3f82639cc83c50d595dc8ce7890d36a61f8..50a9c216a839e9bff94b4230e5ccd31f8bd74c7d 100644 (file)
@@ -11,16 +11,14 @@ import static org.opendaylight.yangtools.yang.common.netty.ByteBufUtils.readUint
 import static org.opendaylight.yangtools.yang.common.netty.ByteBufUtils.readUint32;
 import static org.opendaylight.yangtools.yang.common.netty.ByteBufUtils.readUint8;
 
-import com.google.common.net.InetAddresses;
 import io.netty.buffer.ByteBuf;
-import java.net.InetAddress;
 import java.util.ArrayList;
 import java.util.List;
 import org.opendaylight.openflowjava.nx.api.NiciraActionDeserializerKey;
 import org.opendaylight.openflowjava.nx.api.NiciraActionSerializerKey;
 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.ActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.NxActionNatRangePresent;
@@ -134,16 +132,10 @@ public class ConntrackCodec extends AbstractActionCodec {
                     short rangePresent = natAction.getRangePresent().shortValue();
                     outBuffer.writeShort(rangePresent);
                     if (0 != (rangePresent & NxActionNatRangePresent.NXNATRANGEIPV4MIN.getIntValue())) {
-                        if (null != natAction.getIpAddressMin()) {
-                            outBuffer.writeBytes(IetfInetUtil.INSTANCE.ipv4AddressBytes(natAction
-                                    .getIpAddressMin().getIpv4Address()));
-                        }
+                        writeIpv4Address(outBuffer, natAction.getIpAddressMin());
                     }
                     if (0 != (rangePresent & NxActionNatRangePresent.NXNATRANGEIPV4MAX.getIntValue())) {
-                        if (null != natAction.getIpAddressMax()) {
-                            outBuffer.writeBytes(IetfInetUtil.INSTANCE.ipv4AddressBytes(natAction
-                                    .getIpAddressMax().getIpv4Address()));
-                        }
+                        writeIpv4Address(outBuffer, natAction.getIpAddressMax());
                     }
                     if (0 != (rangePresent & NxActionNatRangePresent.NXNATRANGEPROTOMIN.getIntValue())) {
                         outBuffer.writeShort(natAction.getPortMin().toJava());
@@ -225,12 +217,10 @@ public class ConntrackCodec extends AbstractActionCodec {
 
                 final int rangeBits = rangePresent.toJava();
                 if ((rangeBits & NxActionNatRangePresent.NXNATRANGEIPV4MIN.getIntValue()) != 0) {
-                    InetAddress address = InetAddresses.fromInteger((int)message.readUnsignedInt());
-                    nxActionNatBuilder.setIpAddressMin(IpAddressBuilder.getDefaultInstance(address.getHostAddress()));
+                    nxActionNatBuilder.setIpAddressMin(readIpv4Address(message));
                 }
                 if ((rangeBits & NxActionNatRangePresent.NXNATRANGEIPV4MAX.getIntValue()) != 0) {
-                    InetAddress address = InetAddresses.fromInteger((int)message.readUnsignedInt());
-                    nxActionNatBuilder.setIpAddressMax(IpAddressBuilder.getDefaultInstance(address.getHostAddress()));
+                    nxActionNatBuilder.setIpAddressMax(readIpv4Address(message));
                 }
                 if ((rangeBits & NxActionNatRangePresent.NXNATRANGEPROTOMIN.getIntValue()) != 0) {
                     nxActionNatBuilder.setPortMin(readUint16(message));
@@ -270,6 +260,16 @@ public class ConntrackCodec extends AbstractActionCodec {
         nxActionConntrackBuilder.setCtActions(ctActionsList);
     }
 
+    private static IpAddress readIpv4Address(final ByteBuf message) {
+        return new IpAddress(IetfInetUtil.INSTANCE.ipv4AddressFor(message.readInt()));
+    }
+
+    private static void writeIpv4Address(final ByteBuf outBuffer, final IpAddress ipAddress) {
+        if (ipAddress != null) {
+            outBuffer.writeBytes(IetfInetUtil.INSTANCE.ipv4AddressBytes(ipAddress.getIpv4Address()));
+        }
+    }
+
     private static short deserializeCtHeaderWithoutSubtype(final ByteBuf message) {
         // size of experimenter type / size of set field code (in case of ct_mark)
         message.skipBytes(Short.BYTES);