X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=extension%2Fopenflowjava-extension-nicira%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowjava%2Fnx%2Fcodec%2Faction%2FConntrackCodec.java;h=a44a4c865493fb8d56d075dc4c02e7a4099098c9;hb=dc2befb3188ea11dfd0d74d375a8d3acf3619d38;hp=624b0248994dca95388cf69b54cce8ecba28b807;hpb=9688b3b10ee4113753705f0080b29cd30e61a85d;p=openflowplugin.git diff --git a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/ConntrackCodec.java b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/ConntrackCodec.java index 624b024899..a44a4c8654 100644 --- a/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/ConntrackCodec.java +++ b/extension/openflowjava-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/ConntrackCodec.java @@ -5,15 +5,15 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ - package org.opendaylight.openflowjava.nx.codec.action; -import io.netty.buffer.ByteBuf; +import static org.opendaylight.yangtools.yang.common.netty.ByteBufUtils.readUint16; +import static org.opendaylight.yangtools.yang.common.netty.ByteBufUtils.readUint32; +import static org.opendaylight.yangtools.yang.common.netty.ByteBufUtils.readUint8; -import java.net.InetAddress; +import io.netty.buffer.ByteBuf; 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; @@ -22,28 +22,28 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types. 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; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.action.container.action.choice.ActionConntrack; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.action.container.action.choice.ActionConntrackBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.aug.nx.action.ActionConntrack; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.aug.nx.action.ActionConntrackBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.conntrack.grouping.NxActionConntrackBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.conntrack.grouping.nx.action.conntrack.CtActions; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofj.nx.action.conntrack.grouping.nx.action.conntrack.CtActionsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.NxActionCtMarkCase; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.NxActionNatCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.NxActionCtMarkCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.NxActionNatCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.NxActionNatCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.nx.action.ct.mark._case.NxActionCtMark; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.nx.action.nat._case.NxActionNat; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.nx.action.ct.mark._case.NxActionCtMarkBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.nx.action.nat._case.NxActionNat; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.ofpact.actions.ofpact.actions.nx.action.nat._case.NxActionNatBuilder; +import org.opendaylight.yangtools.yang.common.Uint16; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.net.InetAddresses; - /** + * Action codec for conntrack. + * * @author Aswin Suryanarayanan. */ - public class ConntrackCodec extends AbstractActionCodec { private static final Logger LOG = LoggerFactory.getLogger(ConntrackCodec.class); public static final int CT_LENGTH = 24; @@ -58,9 +58,9 @@ public class ConntrackCodec extends AbstractActionCodec { public static final byte NXAST_CONNTRACK_SUBTYPE = 35; public static final byte NXAST_NAT_SUBTYPE = 36; public static final NiciraActionSerializerKey SERIALIZER_KEY = - new NiciraActionSerializerKey(EncodeConstants.OF13_VERSION_ID, ActionConntrack.class); + new NiciraActionSerializerKey(EncodeConstants.OF_VERSION_1_3, ActionConntrack.class); public static final NiciraActionDeserializerKey DESERIALIZER_KEY = - new NiciraActionDeserializerKey(EncodeConstants.OF13_VERSION_ID, NXAST_CONNTRACK_SUBTYPE); + new NiciraActionDeserializerKey(EncodeConstants.OF_VERSION_1_3, NXAST_CONNTRACK_SUBTYPE); @Override public void serialize(final Action input, final ByteBuf outBuffer) { @@ -78,7 +78,7 @@ public class ConntrackCodec extends AbstractActionCodec { serializeCtAction(outBuffer,action); } - private int getActionLength(final ActionConntrack action) { + private static int getActionLength(final ActionConntrack action) { int length = 0; List ctActionsList = action.getNxActionConntrack().getCtActions(); if (ctActionsList == null) { @@ -89,7 +89,7 @@ public class ConntrackCodec extends AbstractActionCodec { NxActionNatCase nxActionNatCase = (NxActionNatCase)ctActions.getOfpactActions(); NxActionNat natAction = nxActionNatCase.getNxActionNat(); int natLength = getNatActionLength(natAction); - int pad = 8 - (natLength % 8); + int pad = 8 - natLength % 8; length += natLength + pad; } else if (ctActions.getOfpactActions() instanceof NxActionCtMarkCase) { length += SET_FIELD_LENGTH; @@ -99,7 +99,7 @@ public class ConntrackCodec extends AbstractActionCodec { return length; } - private int getNatActionLength(final NxActionNat natAction) { + private static int getNatActionLength(final NxActionNat natAction) { int natLength = NX_NAT_LENGTH; short rangePresent = natAction.getRangePresent().shortValue(); if (0 != (rangePresent & NxActionNatRangePresent.NXNATRANGEIPV4MIN.getIntValue())) { @@ -115,43 +115,36 @@ public class ConntrackCodec extends AbstractActionCodec { natLength += SHORT_LENGTH; } return natLength; - } - private void serializeCtAction(final ByteBuf outBuffer, final ActionConntrack action) { + private static void serializeCtAction(final ByteBuf outBuffer, final ActionConntrack action) { List ctActionsList = action.getNxActionConntrack().getCtActions(); if (ctActionsList != null) { for (CtActions ctActions : ctActionsList) { - if (ctActions.getOfpactActions() instanceof NxActionNatCase){ + if (ctActions.getOfpactActions() instanceof NxActionNatCase) { NxActionNatCase nxActionNatCase = (NxActionNatCase)ctActions.getOfpactActions(); NxActionNat natAction = nxActionNatCase.getNxActionNat(); int natLength = getNatActionLength(natAction); - int pad = 8 - (natLength % 8); + int pad = 8 - natLength % 8; serializeHeader(natLength + pad, NXAST_NAT_SUBTYPE, outBuffer); outBuffer.writeZero(2); outBuffer.writeShort(natAction.getFlags().shortValue()); 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()); + outBuffer.writeShort(natAction.getPortMin().toJava()); } if (0 != (rangePresent & NxActionNatRangePresent.NXNATRANGEPROTOMAX.getIntValue())) { - outBuffer.writeShort(natAction.getPortMax()); + outBuffer.writeShort(natAction.getPortMax().toJava()); } outBuffer.writeZero(pad); - } else if (ctActions.getOfpactActions() instanceof NxActionCtMarkCase){ + } else if (ctActions.getOfpactActions() instanceof NxActionCtMarkCase) { NxActionCtMarkCase nxActionCtMarkCase = (NxActionCtMarkCase)ctActions.getOfpactActions(); NxActionCtMark ctMarkAction = nxActionCtMarkCase.getNxActionCtMark(); @@ -179,69 +172,70 @@ public class ConntrackCodec extends AbstractActionCodec { @Override public Action deserialize(final ByteBuf message) { - short length = deserializeCtHeader(message); - NxActionConntrackBuilder nxActionConntrackBuilder = new NxActionConntrackBuilder(); - nxActionConntrackBuilder.setFlags(message.readUnsignedShort()); - nxActionConntrackBuilder.setZoneSrc(message.readUnsignedInt()); - nxActionConntrackBuilder.setConntrackZone(message.readUnsignedShort()); - nxActionConntrackBuilder.setRecircTable(message.readUnsignedByte()); + final short length = deserializeCtHeader(message); + final var nxActionConntrackBuilder = new NxActionConntrackBuilder() + .setFlags(readUint16(message)) + .setZoneSrc(readUint32(message)) + .setConntrackZone(readUint16(message)) + .setRecircTable(readUint8(message)); message.skipBytes(5); - if (length > CT_LENGTH) { - deserializeCtAction(message,nxActionConntrackBuilder, length - CT_LENGTH); + + if (length > CT_LENGTH) { + deserializeCtAction(message, nxActionConntrackBuilder, length - CT_LENGTH); } - ActionBuilder actionBuilder = new ActionBuilder(); - actionBuilder.setExperimenterId(getExperimenterId()); - ActionConntrackBuilder actionConntrackBuilder = new ActionConntrackBuilder(); - actionConntrackBuilder.setNxActionConntrack(nxActionConntrackBuilder.build()); - actionBuilder.setActionChoice(actionConntrackBuilder.build()); - return actionBuilder.build(); + return new ActionBuilder() + .setExperimenterId(getExperimenterId()) + .setActionChoice(new ActionConntrackBuilder() + .setNxActionConntrack(nxActionConntrackBuilder.build()) + .build()) + .build(); } - private void deserializeCtAction(final ByteBuf message, final NxActionConntrackBuilder nxActionConntrackBuilder, - final int ctActionsLength) { + private static void deserializeCtAction(final ByteBuf message, + final NxActionConntrackBuilder nxActionConntrackBuilder, final int ctActionsLength) { List ctActionsList = new ArrayList<>(); int processedCtActionsLength = ctActionsLength; - while (processedCtActionsLength > 0){ - int startReaderIndex = message.readerIndex(); + while (processedCtActionsLength > 0) { + final int startReaderIndex = message.readerIndex(); if (EncodeConstants.EXPERIMENTER_VALUE == message.readUnsignedShort()) { // NAT action // reset indices message.setIndex(startReaderIndex, message.writerIndex()); - int startIndex = message.readerIndex(); - int length = deserializeCtHeader(message); + final int startIndex = message.readerIndex(); + final int length = deserializeCtHeader(message); processedCtActionsLength = processedCtActionsLength - length; - NxActionNatBuilder nxActionNatBuilder = new NxActionNatBuilder(); message.skipBytes(2); - nxActionNatBuilder.setFlags(message.readUnsignedShort()); + final var nxActionNatBuilder = new NxActionNatBuilder() + .setFlags(readUint16(message)); - int rangePresent = message.readUnsignedShort(); + final Uint16 rangePresent = readUint16(message); nxActionNatBuilder.setRangePresent(rangePresent); - if (0 != (rangePresent & NxActionNatRangePresent.NXNATRANGEIPV4MIN.getIntValue())) { - InetAddress address = InetAddresses.fromInteger((int)message.readUnsignedInt()); - nxActionNatBuilder.setIpAddressMin(new IpAddress(address.getHostAddress().toCharArray())); + + final int rangeBits = rangePresent.toJava(); + if ((rangeBits & NxActionNatRangePresent.NXNATRANGEIPV4MIN.getIntValue()) != 0) { + nxActionNatBuilder.setIpAddressMin(readIpv4Address(message)); } - if (0 != (rangePresent & NxActionNatRangePresent.NXNATRANGEIPV4MAX.getIntValue())) { - InetAddress address = InetAddresses.fromInteger((int)message.readUnsignedInt()); - nxActionNatBuilder.setIpAddressMax(new IpAddress(address.getHostAddress().toCharArray())); + if ((rangeBits & NxActionNatRangePresent.NXNATRANGEIPV4MAX.getIntValue()) != 0) { + nxActionNatBuilder.setIpAddressMax(readIpv4Address(message)); } - if (0 != (rangePresent & NxActionNatRangePresent.NXNATRANGEPROTOMIN.getIntValue())) { - nxActionNatBuilder.setPortMin(message.readUnsignedShort()); + if ((rangeBits & NxActionNatRangePresent.NXNATRANGEPROTOMIN.getIntValue()) != 0) { + nxActionNatBuilder.setPortMin(readUint16(message)); } - if (0 != (rangePresent & NxActionNatRangePresent.NXNATRANGEPROTOMAX.getIntValue())) { - nxActionNatBuilder.setPortMax(message.readUnsignedShort()); + if ((rangeBits & NxActionNatRangePresent.NXNATRANGEPROTOMAX.getIntValue()) != 0) { + nxActionNatBuilder.setPortMax(readUint16(message)); } - NxActionNatCaseBuilder caseBuilder = new NxActionNatCaseBuilder(); - caseBuilder.setNxActionNat(nxActionNatBuilder.build()); - CtActionsBuilder ctActionsBuilder = new CtActionsBuilder(); - ctActionsBuilder.setOfpactActions(caseBuilder.build()); - ctActionsList.add(ctActionsBuilder.build()); - int pad = length - (message.readerIndex() - startIndex); - message.skipBytes(pad); + ctActionsList.add(new CtActionsBuilder() + .setOfpactActions(new NxActionNatCaseBuilder() + .setNxActionNat(nxActionNatBuilder.build()).build()) + .build()); + + // Padding + message.skipBytes(length - (message.readerIndex() - startIndex)); } else { // only other possible action here is currently ct_mark // reset indices @@ -250,36 +244,46 @@ public class ConntrackCodec extends AbstractActionCodec { deserializeCtHeaderWithoutSubtype(message); - NxActionCtMarkBuilder nxActionCtMarkBuilder = new NxActionCtMarkBuilder(); - nxActionCtMarkBuilder.setCtMark(message.readUnsignedInt()); + ctActionsList.add(new CtActionsBuilder() + .setOfpactActions(new NxActionCtMarkCaseBuilder() + .setNxActionCtMark(new NxActionCtMarkBuilder() + .setCtMark(readUint32(message)) + .build()) + .build()) + .build()); - NxActionCtMarkCaseBuilder caseBuilder = new NxActionCtMarkCaseBuilder(); - caseBuilder.setNxActionCtMark(nxActionCtMarkBuilder.build()); - CtActionsBuilder ctActionsBuilder = new CtActionsBuilder(); - ctActionsBuilder.setOfpactActions(caseBuilder.build()); - ctActionsList.add(ctActionsBuilder.build()); - // padding - message.skipBytes(EncodeConstants.SIZE_OF_INT_IN_BYTES); + // Padding + message.skipBytes(Integer.BYTES); } } nxActionConntrackBuilder.setCtActions(ctActionsList); } - private short deserializeCtHeaderWithoutSubtype(final ByteBuf message) { + private static IpAddress readIpv4Address(final ByteBuf message) { + return new IpAddress(IetfInetUtil.ipv4AddressFor(message.readInt())); + } + + private static void writeIpv4Address(final ByteBuf outBuffer, final IpAddress ipAddress) { + if (ipAddress != null) { + outBuffer.writeBytes(IetfInetUtil.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(EncodeConstants.SIZE_OF_SHORT_IN_BYTES); + message.skipBytes(Short.BYTES); // size of length short length = message.readShort(); // vendor id / 00 01 d6 04 (in case of ct_mark) - message.skipBytes(EncodeConstants.SIZE_OF_INT_IN_BYTES); + message.skipBytes(Integer.BYTES); return length; } - private short deserializeCtHeader(final ByteBuf message) { + private static short deserializeCtHeader(final ByteBuf message) { short length = deserializeCtHeaderWithoutSubtype(message); // subtype - message.skipBytes(EncodeConstants.SIZE_OF_SHORT_IN_BYTES); + message.skipBytes(Short.BYTES); return length; } }