From 01a3e436f6947964998fcf9a9f50e68d13e63e05 Mon Sep 17 00:00:00 2001 From: Martin Sunal Date: Tue, 29 Jul 2014 12:21:56 +0200 Subject: [PATCH] Created experimenter subtype for vendor's actions ExperimenterActionSerializerKey has a new parameter which is type of vendor's action. It allows to select right serializer directly in OFJava so a vendor does not need to care about it. - created codec for Nicira match nxm_of_eth_type Change-Id: Id9bc0f06820cab7b897eb710a70ddc3d6af13a45 Signed-off-by: Martin Sunal --- .../nx/NiciraExtensionsRegistrator.java | 21 ++++-- .../openflowjava/nx/NiciraMatchCodecs.java | 2 + .../action/AbstractActionSerializer.java | 34 +++++++++ ...tionCodec.java => ActionDeserializer.java} | 45 +++--------- .../nx/codec/action/NiciraActionCodecs.java | 19 +++++ .../nx/codec/action/RegLoadCodec.java | 21 ++++-- .../nx/codec/action/RegMoveCodec.java | 25 ++++--- .../nx/codec/match/ArpTpaCodec.java | 2 +- .../nx/codec/match/EthDstCodec.java | 2 +- .../nx/codec/match/EthTypeCodec.java | 69 +++++++++++++++++++ .../src/main/yang/nicira-action.yang | 7 ++ .../src/main/yang/nicira-match.yang | 11 +++ .../nx/NxResubmitActionRegistrator.java | 14 +--- .../src/main/yang/nx-resubmit-action.yang | 4 ++ .../api/keys/ActionSerializerKey.java | 2 +- .../ExperimenterActionSerializerKey.java | 31 ++++++++- .../src/main/yang/openflow-action.yang | 6 +- .../src/main/yang/openflow-augments.yang | 5 ++ .../api/keys/extensibility/KeysTest.java | 11 ++- .../impl/util/TypeKeyMakerFactory.java | 2 +- 20 files changed, 258 insertions(+), 75 deletions(-) create mode 100644 openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/AbstractActionSerializer.java rename openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/{ActionCodec.java => ActionDeserializer.java} (55%) create mode 100644 openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/NiciraActionCodecs.java create mode 100644 openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/EthTypeCodec.java diff --git a/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/NiciraExtensionsRegistrator.java b/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/NiciraExtensionsRegistrator.java index 551b9e9d..1ed72236 100644 --- a/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/NiciraExtensionsRegistrator.java +++ b/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/NiciraExtensionsRegistrator.java @@ -2,7 +2,10 @@ package org.opendaylight.openflowjava.nx; import java.util.List; -import org.opendaylight.openflowjava.nx.codec.action.ActionCodec; +import org.opendaylight.openflowjava.nx.codec.action.ActionDeserializer; +import org.opendaylight.openflowjava.nx.codec.action.NiciraActionCodecs; +import org.opendaylight.openflowjava.nx.codec.action.RegLoadCodec; +import org.opendaylight.openflowjava.nx.codec.action.RegMoveCodec; import org.opendaylight.openflowjava.nx.codec.match.ArpOpCodec; import org.opendaylight.openflowjava.nx.codec.match.ArpShaCodec; import org.opendaylight.openflowjava.nx.codec.match.ArpSpaCodec; @@ -10,6 +13,7 @@ import org.opendaylight.openflowjava.nx.codec.match.ArpThaCodec; import org.opendaylight.openflowjava.nx.codec.match.ArpTpaCodec; import org.opendaylight.openflowjava.nx.codec.match.EthDstCodec; import org.opendaylight.openflowjava.nx.codec.match.EthSrcCodec; +import org.opendaylight.openflowjava.nx.codec.match.EthTypeCodec; import org.opendaylight.openflowjava.nx.codec.match.Reg0Codec; import org.opendaylight.openflowjava.nx.codec.match.Reg1Codec; import org.opendaylight.openflowjava.nx.codec.match.Reg2Codec; @@ -27,7 +31,6 @@ import com.google.common.base.Preconditions; public class NiciraExtensionsRegistrator implements AutoCloseable { - private static final ActionCodec ACTION_CODEC = new ActionCodec(); private final List providers; /** @@ -40,8 +43,9 @@ public class NiciraExtensionsRegistrator implements AutoCloseable { public void registerNiciraExtensions() { for (SwitchConnectionProvider provider : providers) { - provider.registerActionDeserializer(ActionCodec.DESERIALIZER_KEY, ACTION_CODEC); - provider.registerActionSerializer(ActionCodec.SERIALIZER_KEY, ACTION_CODEC); + provider.registerActionDeserializer(ActionDeserializer.DESERIALIZER_KEY, NiciraActionCodecs.ACTION_DESERIALIZER); + provider.registerActionSerializer(RegLoadCodec.SERIALIZER_KEY, NiciraActionCodecs.REG_LOAD_CODEC); + provider.registerActionSerializer(RegMoveCodec.SERIALIZER_KEY, NiciraActionCodecs.REG_MOVE_CODEC); provider.registerMatchEntrySerializer(Reg0Codec.SERIALIZER_KEY, NiciraMatchCodecs.REG0_CODEC); provider.registerMatchEntryDeserializer(Reg0Codec.DESERIALIZER_KEY, NiciraMatchCodecs.REG0_CODEC); provider.registerMatchEntrySerializer(Reg1Codec.SERIALIZER_KEY, NiciraMatchCodecs.REG1_CODEC); @@ -78,13 +82,16 @@ public class NiciraExtensionsRegistrator implements AutoCloseable { provider.registerMatchEntryDeserializer(TunIpv4DstCodec.DESERIALIZER_KEY, NiciraMatchCodecs.TUN_IPV4_DST_CODEC); provider.registerMatchEntrySerializer(TunIpv4SrcCodec.SERIALIZER_KEY, NiciraMatchCodecs.TUN_IPV4_SRC_CODEC); provider.registerMatchEntryDeserializer(TunIpv4SrcCodec.DESERIALIZER_KEY, NiciraMatchCodecs.TUN_IPV4_SRC_CODEC); + provider.registerMatchEntrySerializer(EthTypeCodec.SERIALIZER_KEY, NiciraMatchCodecs.ETH_TYPE_CODEC); + provider.registerMatchEntryDeserializer(EthTypeCodec.DESERIALIZER_KEY, NiciraMatchCodecs.ETH_TYPE_CODEC); } } public void unregisterExtensions() { for (SwitchConnectionProvider provider : providers) { - provider.unregisterSerializer(ActionCodec.SERIALIZER_KEY); - provider.unregisterDeserializer(ActionCodec.DESERIALIZER_KEY); + provider.unregisterDeserializer(ActionDeserializer.DESERIALIZER_KEY); + provider.unregisterSerializer(RegLoadCodec.SERIALIZER_KEY); + provider.unregisterSerializer(RegMoveCodec.SERIALIZER_KEY); provider.unregisterSerializer(Reg0Codec.SERIALIZER_KEY); provider.unregisterDeserializer(Reg0Codec.DESERIALIZER_KEY); provider.unregisterSerializer(Reg1Codec.SERIALIZER_KEY); @@ -121,6 +128,8 @@ public class NiciraExtensionsRegistrator implements AutoCloseable { provider.unregisterDeserializer(TunIpv4DstCodec.DESERIALIZER_KEY); provider.unregisterSerializer(TunIpv4SrcCodec.SERIALIZER_KEY); provider.unregisterDeserializer(TunIpv4SrcCodec.DESERIALIZER_KEY); + provider.unregisterSerializer(EthTypeCodec.SERIALIZER_KEY); + provider.unregisterDeserializer(EthTypeCodec.DESERIALIZER_KEY); } } diff --git a/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/NiciraMatchCodecs.java b/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/NiciraMatchCodecs.java index 0e166ba8..b9422f51 100644 --- a/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/NiciraMatchCodecs.java +++ b/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/NiciraMatchCodecs.java @@ -14,6 +14,7 @@ import org.opendaylight.openflowjava.nx.codec.match.ArpThaCodec; import org.opendaylight.openflowjava.nx.codec.match.ArpTpaCodec; import org.opendaylight.openflowjava.nx.codec.match.EthDstCodec; import org.opendaylight.openflowjava.nx.codec.match.EthSrcCodec; +import org.opendaylight.openflowjava.nx.codec.match.EthTypeCodec; import org.opendaylight.openflowjava.nx.codec.match.Reg0Codec; import org.opendaylight.openflowjava.nx.codec.match.Reg1Codec; import org.opendaylight.openflowjava.nx.codec.match.Reg2Codec; @@ -50,5 +51,6 @@ public class NiciraMatchCodecs { public static final EthSrcCodec ETH_SRC_CODEC = new EthSrcCodec(); public static final TunIpv4DstCodec TUN_IPV4_DST_CODEC = new TunIpv4DstCodec(); public static final TunIpv4SrcCodec TUN_IPV4_SRC_CODEC = new TunIpv4SrcCodec(); + public static final EthTypeCodec ETH_TYPE_CODEC = new EthTypeCodec(); } diff --git a/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/AbstractActionSerializer.java b/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/AbstractActionSerializer.java new file mode 100644 index 00000000..b141d5ca --- /dev/null +++ b/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/AbstractActionSerializer.java @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * 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 org.opendaylight.openflowjava.nx.NiciraConstants; +import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action; + +/** + * @author msunal + * + */ +public abstract class AbstractActionSerializer implements OFSerializer { + + protected final static void serializeHeader(int msgLength, int subtype, ByteBuf outBuffer) { + outBuffer.writeShort(EncodeConstants.EXPERIMENTER_VALUE); + writeMsgLengthVendorIdSubtypeToBuffer(msgLength, subtype, outBuffer); + } + + private final static void writeMsgLengthVendorIdSubtypeToBuffer(int msgLength, int subtype, ByteBuf outBuffer) { + outBuffer.writeShort(msgLength); + outBuffer.writeInt(NiciraConstants.NX_VENDOR_ID.intValue()); + outBuffer.writeShort(subtype); + } + +} diff --git a/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/ActionCodec.java b/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/ActionDeserializer.java similarity index 55% rename from openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/ActionCodec.java rename to openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/ActionDeserializer.java index 3d58439c..43e3de09 100644 --- a/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/ActionCodec.java +++ b/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/ActionDeserializer.java @@ -4,9 +4,7 @@ import io.netty.buffer.ByteBuf; import org.opendaylight.openflowjava.nx.NiciraConstants; import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer; -import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer; import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterActionDeserializerKey; -import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterActionSerializerKey; import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdAction; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdActionBuilder; @@ -14,44 +12,19 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev1 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.ActionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.extension.nicira.action.rev140421.NxmNxRegLoad; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.extension.nicira.action.rev140421.NxmNxRegMove; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.extension.nicira.action.rev140421.OfjAugNxAction; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.extension.nicira.action.rev140421.OfjAugNxActionBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class ActionCodec implements OFSerializer, OFDeserializer { +public class ActionDeserializer implements OFDeserializer { - private static final Logger LOG = LoggerFactory.getLogger(ActionCodec.class); + private static final Logger LOG = LoggerFactory.getLogger(ActionDeserializer.class); - public static final ExperimenterActionSerializerKey SERIALIZER_KEY = new ExperimenterActionSerializerKey(EncodeConstants.OF13_VERSION_ID, NiciraConstants.NX_VENDOR_ID); - public static final ExperimenterActionDeserializerKey DESERIALIZER_KEY = new ExperimenterActionDeserializerKey(EncodeConstants.OF13_VERSION_ID, NiciraConstants.NX_VENDOR_ID); - private static final RegMoveCodec regMoveCodec = new RegMoveCodec(); - private static final RegLoadCodec regLoadCodec = new RegLoadCodec(); - - @Override - public void serialize(Action input, ByteBuf outBuffer) { - outBuffer.writeShort(EncodeConstants.EXPERIMENTER_VALUE); - OfjAugNxAction augNxAction = input.getAugmentation(OfjAugNxAction.class); - if (augNxAction == null) { - LOG.info("Action {} does not have any serializer.", input.getClass()); - return; - } - if (augNxAction.getActionRegMove() != null) { - writeMsgLengthVendorIdSubtypeToBuffer(RegMoveCodec.LENGTH, RegMoveCodec.SUBTYPE, outBuffer); - regMoveCodec.serialize(augNxAction.getActionRegMove(), outBuffer); - } else if (augNxAction.getActionRegLoad() != null) { - writeMsgLengthVendorIdSubtypeToBuffer(RegLoadCodec.LENGTH, RegLoadCodec.SUBTYPE, outBuffer); - regLoadCodec.serialize(augNxAction.getActionRegLoad(), outBuffer); - } else { - LOG.info("Action {} does not have any serializer.", input.getClass()); - } - } - - private final static void writeMsgLengthVendorIdSubtypeToBuffer(int msgLength, int subtype, ByteBuf outBuffer) { - outBuffer.writeShort(msgLength); - outBuffer.writeInt(NiciraConstants.NX_VENDOR_ID.intValue()); - outBuffer.writeShort(subtype); - } + public static final ExperimenterActionDeserializerKey DESERIALIZER_KEY = new ExperimenterActionDeserializerKey( + EncodeConstants.OF13_VERSION_ID, NiciraConstants.NX_VENDOR_ID); @Override public Action deserialize(ByteBuf message) { @@ -65,10 +38,12 @@ public class ActionCodec implements OFSerializer, OFDeserializer OfjAugNxActionBuilder augNxActionBuilder = new OfjAugNxActionBuilder(); switch (subtype) { case RegMoveCodec.SUBTYPE: - augNxActionBuilder.setActionRegMove(regMoveCodec.deserialize(message)); + augNxActionBuilder.setActionRegMove(NiciraActionCodecs.REG_MOVE_CODEC.deserialize(message)); + expIdBuilder.setSubType(NxmNxRegMove.class); break; case RegLoadCodec.SUBTYPE: - augNxActionBuilder.setActionRegLoad(regLoadCodec.deserialize(message)); + augNxActionBuilder.setActionRegLoad(NiciraActionCodecs.REG_LOAD_CODEC.deserialize(message)); + expIdBuilder.setSubType(NxmNxRegLoad.class); break; default: LOG.info("Action {} does not have any deserializer.", subtype); diff --git a/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/NiciraActionCodecs.java b/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/NiciraActionCodecs.java new file mode 100644 index 00000000..877b677f --- /dev/null +++ b/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/NiciraActionCodecs.java @@ -0,0 +1,19 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * 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; + +/** + * @author msunal + * + */ +public class NiciraActionCodecs { + + public static final RegMoveCodec REG_MOVE_CODEC = new RegMoveCodec(); + public static final RegLoadCodec REG_LOAD_CODEC = new RegLoadCodec(); + public static final ActionDeserializer ACTION_DESERIALIZER = new ActionDeserializer(); +} diff --git a/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/RegLoadCodec.java b/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/RegLoadCodec.java index 0776edd4..0ccfa881 100644 --- a/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/RegLoadCodec.java +++ b/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/RegLoadCodec.java @@ -4,21 +4,30 @@ import io.netty.buffer.ByteBuf; import java.math.BigInteger; +import org.opendaylight.openflowjava.nx.NiciraConstants; import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer; -import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer; +import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterActionSerializerKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.extension.nicira.action.rev140421.NxmNxRegLoad; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.extension.nicira.action.rev140421.OfjAugNxAction; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.extension.nicira.action.rev140421.ofj.nx.action.reg.load.grouping.ActionRegLoad; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.extension.nicira.action.rev140421.ofj.nx.action.reg.load.grouping.ActionRegLoadBuilder; -public class RegLoadCodec implements OFSerializer, OFDeserializer { +public class RegLoadCodec extends AbstractActionSerializer implements OFDeserializer { + public static final ExperimenterActionSerializerKey SERIALIZER_KEY = new ExperimenterActionSerializerKey( + EncodeConstants.OF13_VERSION_ID, NiciraConstants.NX_VENDOR_ID, NxmNxRegLoad.class); public static final int LENGTH = 24; public static final byte SUBTYPE = 7; // NXAST_REG_LOAD @Override - public void serialize(ActionRegLoad input, ByteBuf outBuffer) { - outBuffer.writeShort(input.getOfsNbits()); - outBuffer.writeInt(input.getDst().intValue()); - outBuffer.writeLong(input.getValue().longValue()); + public void serialize(Action input, ByteBuf outBuffer) { + ActionRegLoad actionRegLoad = input.getAugmentation(OfjAugNxAction.class).getActionRegLoad(); + serializeHeader(LENGTH, SUBTYPE, outBuffer); + outBuffer.writeShort(actionRegLoad.getOfsNbits()); + outBuffer.writeInt(actionRegLoad.getDst().intValue()); + outBuffer.writeLong(actionRegLoad.getValue().longValue()); } @Override diff --git a/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/RegMoveCodec.java b/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/RegMoveCodec.java index c7965880..f9bf8716 100644 --- a/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/RegMoveCodec.java +++ b/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/action/RegMoveCodec.java @@ -2,23 +2,32 @@ package org.opendaylight.openflowjava.nx.codec.action; import io.netty.buffer.ByteBuf; +import org.opendaylight.openflowjava.nx.NiciraConstants; import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer; -import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer; +import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterActionSerializerKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.extension.nicira.action.rev140421.NxmNxRegMove; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.extension.nicira.action.rev140421.OfjAugNxAction; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.extension.nicira.action.rev140421.ofj.nx.action.reg.move.grouping.ActionRegMove; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.extension.nicira.action.rev140421.ofj.nx.action.reg.move.grouping.ActionRegMoveBuilder; -public class RegMoveCodec implements OFSerializer, OFDeserializer { +public class RegMoveCodec extends AbstractActionSerializer implements OFDeserializer { + public static final ExperimenterActionSerializerKey SERIALIZER_KEY = new ExperimenterActionSerializerKey( + EncodeConstants.OF13_VERSION_ID, NiciraConstants.NX_VENDOR_ID, NxmNxRegMove.class); public static final int LENGTH = 24; public static final byte SUBTYPE = 6; // NXAST_REG_MOVE @Override - public void serialize(ActionRegMove input, ByteBuf outBuffer) { - outBuffer.writeShort(input.getNBits()); - outBuffer.writeShort(input.getSrcOfs()); - outBuffer.writeShort(input.getDstOfs()); - outBuffer.writeInt(input.getSrc().intValue()); - outBuffer.writeInt(input.getDst().intValue()); + public void serialize(Action input, ByteBuf outBuffer) { + ActionRegMove actionRegMove = input.getAugmentation(OfjAugNxAction.class).getActionRegMove(); + serializeHeader(LENGTH, SUBTYPE, outBuffer); + outBuffer.writeShort(actionRegMove.getNBits()); + outBuffer.writeShort(actionRegMove.getSrcOfs()); + outBuffer.writeShort(actionRegMove.getDstOfs()); + outBuffer.writeInt(actionRegMove.getSrc().intValue()); + outBuffer.writeInt(actionRegMove.getDst().intValue()); } @Override diff --git a/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/ArpTpaCodec.java b/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/ArpTpaCodec.java index 04fc5ad1..6962a529 100644 --- a/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/ArpTpaCodec.java +++ b/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/ArpTpaCodec.java @@ -19,7 +19,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm. public class ArpTpaCodec extends AbstractMatchCodec { private static final int VALUE_LENGTH = 4; - private static final int NXM_FIELD_CODE = 16; + private static final int NXM_FIELD_CODE = 17; public static final MatchEntrySerializerKey SERIALIZER_KEY = new MatchEntrySerializerKey<>( EncodeConstants.OF13_VERSION_ID, Nxm0Class.class, NxmOfArpTpa.class); public static final MatchEntryDeserializerKey DESERIALIZER_KEY = new MatchEntryDeserializerKey( diff --git a/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/EthDstCodec.java b/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/EthDstCodec.java index dacbe1f8..9c25f936 100644 --- a/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/EthDstCodec.java +++ b/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/EthDstCodec.java @@ -21,7 +21,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm. public class EthDstCodec extends AbstractMatchCodec { private static final int VALUE_LENGTH = 6; - private static final int NXM_FIELD_CODE = 2; + private static final int NXM_FIELD_CODE = 1; public static final MatchEntrySerializerKey SERIALIZER_KEY = new MatchEntrySerializerKey<>( EncodeConstants.OF13_VERSION_ID, Nxm0Class.class, NxmOfEthDst.class); public static final MatchEntryDeserializerKey DESERIALIZER_KEY = new MatchEntryDeserializerKey( diff --git a/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/EthTypeCodec.java b/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/EthTypeCodec.java new file mode 100644 index 00000000..4eccd373 --- /dev/null +++ b/openflow-extension-nicira/src/main/java/org/opendaylight/openflowjava/nx/codec/match/EthTypeCodec.java @@ -0,0 +1,69 @@ +package org.opendaylight.openflowjava.nx.codec.match; + +import io.netty.buffer.ByteBuf; + +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey; +import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey; +import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; +import org.opendaylight.openflowjava.protocol.api.util.OxmMatchConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.extension.nicira.match.rev140421.NxmOfEthType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.extension.nicira.match.rev140421.OfjAugNxMatch; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.extension.nicira.match.rev140421.OfjAugNxMatchBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.extension.nicira.match.rev140421.ofj.nxm.of.match.eth.type.grouping.EthTypeValuesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm0Class; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntriesBuilder; + +public class EthTypeCodec extends AbstractMatchCodec { + + private static final int VALUE_LENGTH = 2; + private static final int NXM_FIELD_CODE = 3; + public static final MatchEntrySerializerKey SERIALIZER_KEY = new MatchEntrySerializerKey<>( + EncodeConstants.OF13_VERSION_ID, Nxm0Class.class, NxmOfEthType.class); + public static final MatchEntryDeserializerKey DESERIALIZER_KEY = new MatchEntryDeserializerKey( + EncodeConstants.OF13_VERSION_ID, OxmMatchConstants.NXM_0_CLASS, NXM_FIELD_CODE); + + @Override + public void serialize(MatchEntries input, ByteBuf outBuffer) { + serializeHeader(input, outBuffer); + Integer value = input.getAugmentation(OfjAugNxMatch.class).getEthTypeValues().getValue(); + outBuffer.writeShort(value); + } + + @Override + public MatchEntries deserialize(ByteBuf message) { + MatchEntriesBuilder matchEntriesBuilder = deserializeHeader(message); + OfjAugNxMatchBuilder augNxMatchBuilder = new OfjAugNxMatchBuilder(); + augNxMatchBuilder.setEthTypeValues(new EthTypeValuesBuilder().setValue(message.readUnsignedShort()).build()); + matchEntriesBuilder.addAugmentation(OfjAugNxMatch.class, augNxMatchBuilder.build()); + return matchEntriesBuilder.build(); + } + + @Override + public int getNxmFieldCode() { + return NXM_FIELD_CODE; + } + + @Override + public int getOxmClassCode() { + return OxmMatchConstants.NXM_0_CLASS; + } + + @Override + public int getValueLength() { + return VALUE_LENGTH; + } + + @Override + public Class getNxmField() { + return NxmOfEthType.class; + } + + @Override + public Class getOxmClass() { + return Nxm0Class.class; + } + +} diff --git a/openflow-extension-nicira/src/main/yang/nicira-action.yang b/openflow-extension-nicira/src/main/yang/nicira-action.yang index 7bb5faf7..c43b1520 100644 --- a/openflow-extension-nicira/src/main/yang/nicira-action.yang +++ b/openflow-extension-nicira/src/main/yang/nicira-action.yang @@ -14,6 +14,13 @@ module nicira-action { revision "2014-04-21" { description "Initial revision"; } + + identity nxm-nx-reg-load { + base ofaction:experimenter-action-sub-type; + } + identity nxm-nx-reg-move { + base ofaction:experimenter-action-sub-type; + } grouping ofj-nx-action-reg-load-grouping { container action-reg-load { diff --git a/openflow-extension-nicira/src/main/yang/nicira-match.yang b/openflow-extension-nicira/src/main/yang/nicira-match.yang index edf8a3a3..3bff0351 100644 --- a/openflow-extension-nicira/src/main/yang/nicira-match.yang +++ b/openflow-extension-nicira/src/main/yang/nicira-match.yang @@ -74,6 +74,9 @@ module nicira-match { identity nxm-of-eth-dst { base ofoxm:match-field; } + identity nxm-of-eth-type { + base ofoxm:match-field; + } grouping ofj-nxm-nx-match-reg-grouping { container reg-values { @@ -152,6 +155,13 @@ module nicira-match { } } } + grouping ofj-nxm-of-match-eth-type-grouping { + container eth-type-values { + leaf value { + type uint16; + } + } + } augment "/ofoxm:oxm-container/ofoxm:match-entries" { ext:augment-identifier "ofj-aug_nx_match"; @@ -166,6 +176,7 @@ module nicira-match { uses ofj-nxm-nx-match-tun-ipv4-src-grouping; uses ofj-nxm-of-match-eth-src-grouping; uses ofj-nxm-of-match-eth-dst-grouping; + uses ofj-nxm-of-match-eth-type-grouping; } } \ No newline at end of file diff --git a/openflow-nx-resubmit-action/src/main/java/org/opendaylight/openflowjava/protocol/nx/NxResubmitActionRegistrator.java b/openflow-nx-resubmit-action/src/main/java/org/opendaylight/openflowjava/protocol/nx/NxResubmitActionRegistrator.java index 4baf6d2d..a9a04a53 100644 --- a/openflow-nx-resubmit-action/src/main/java/org/opendaylight/openflowjava/protocol/nx/NxResubmitActionRegistrator.java +++ b/openflow-nx-resubmit-action/src/main/java/org/opendaylight/openflowjava/protocol/nx/NxResubmitActionRegistrator.java @@ -16,6 +16,7 @@ import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; import org.opendaylight.openflowjava.protocol.nx.deserialization.NxActionResubmitDeserializer; import org.opendaylight.openflowjava.protocol.nx.serialization.NxActionResubmitSerializer; import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.nx.resubmit.action.rev130731.NxResubmitAction; /** * @author michal.polkorab @@ -34,17 +35,8 @@ public class NxResubmitActionRegistrator implements AutoCloseable { if (providers != null) { this.providers = providers; for (SwitchConnectionProvider provider : providers) { - /* In case of handling multiple actions, instructions and other structures which - * are differentiated by vendor / experimenter subtype, vendor has to - * switch / choose between these subtypes. - * - * This has to be done in this way because of experimenter headers, which - * provide only vendor / experimenter ID. Subtype position may be different - * for different vendors (or not present at all) - that's why vendor has to - * handle it in his own implementations. - */ provider.registerActionSerializer(new ExperimenterActionSerializerKey( - EncodeConstants.OF13_VERSION_ID, NICIRA_EXPERIMENTER_ID), + EncodeConstants.OF13_VERSION_ID, NICIRA_EXPERIMENTER_ID, NxResubmitAction.class), new NxActionResubmitSerializer()); } } @@ -78,7 +70,7 @@ public class NxResubmitActionRegistrator implements AutoCloseable { for (SwitchConnectionProvider provider : providers) { // unregister serializer provider.unregisterSerializer(new ExperimenterActionSerializerKey( - EncodeConstants.OF13_VERSION_ID, NICIRA_EXPERIMENTER_ID)); + EncodeConstants.OF13_VERSION_ID, NICIRA_EXPERIMENTER_ID, NxResubmitAction.class)); // unregister deserializer provider.unregisterDeserializer(new ExperimenterActionDeserializerKey( EncodeConstants.OF13_VERSION_ID, NICIRA_EXPERIMENTER_ID)); diff --git a/openflow-nx-resubmit-action/src/main/yang/nx-resubmit-action.yang b/openflow-nx-resubmit-action/src/main/yang/nx-resubmit-action.yang index 5ab94cd1..418611b5 100644 --- a/openflow-nx-resubmit-action/src/main/yang/nx-resubmit-action.yang +++ b/openflow-nx-resubmit-action/src/main/yang/nx-resubmit-action.yang @@ -17,6 +17,10 @@ revision "2013-07-31" { description "OpenFlow 1.3 - action model"; } + + identity nx-resubmit-action { + base ofaction:experimenter-action-sub-type; + } augment "/ofaction:actions-container/ofaction:action" { ext:augment-identifier "nx-action-resubmit-augment"; diff --git a/openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/keys/ActionSerializerKey.java b/openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/keys/ActionSerializerKey.java index 38b8cd49..bf1fe7dc 100644 --- a/openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/keys/ActionSerializerKey.java +++ b/openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/keys/ActionSerializerKey.java @@ -48,7 +48,7 @@ public class ActionSerializerKey extends MessageTypeKey return true; if (!super.equals(obj)) return false; - if (!(obj instanceof ActionSerializerKey)) + if (getClass() != obj.getClass()) return false; ActionSerializerKey other = (ActionSerializerKey) obj; if (actionType == null) { diff --git a/openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/keys/experimenter/ExperimenterActionSerializerKey.java b/openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/keys/experimenter/ExperimenterActionSerializerKey.java index 989e1ba7..be18643c 100644 --- a/openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/keys/experimenter/ExperimenterActionSerializerKey.java +++ b/openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/keys/experimenter/ExperimenterActionSerializerKey.java @@ -10,6 +10,7 @@ package org.opendaylight.openflowjava.protocol.api.keys.experimenter; import org.opendaylight.openflowjava.protocol.api.keys.ActionSerializerKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.ExperimenterActionSubType; /** * @author michal.polkorab @@ -17,12 +18,40 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev1 public final class ExperimenterActionSerializerKey extends ActionSerializerKey implements ExperimenterSerializerKey { + private Class actionSubType; + /** * @param msgVersion protocol wire version * @param experimenterId experimenter / vendor ID */ - public ExperimenterActionSerializerKey(short msgVersion, Long experimenterId) { + public ExperimenterActionSerializerKey(short msgVersion, Long experimenterId, Class actionSubType) { super(msgVersion, Experimenter.class, experimenterId); + this.actionSubType = actionSubType; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + ((actionSubType == null) ? 0 : actionSubType.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!super.equals(obj)) + return false; + if (getClass() != obj.getClass()) + return false; + ExperimenterActionSerializerKey other = (ExperimenterActionSerializerKey) obj; + if (actionSubType == null) { + if (other.actionSubType != null) + return false; + } else if (!actionSubType.equals(other.actionSubType)) + return false; + return true; } } \ No newline at end of file diff --git a/openflow-protocol-api/src/main/yang/openflow-action.yang b/openflow-protocol-api/src/main/yang/openflow-action.yang index 9cc200c4..482c1228 100644 --- a/openflow-protocol-api/src/main/yang/openflow-action.yang +++ b/openflow-protocol-api/src/main/yang/openflow-action.yang @@ -84,7 +84,11 @@ description ""; base oft:action-base; } - + + identity experimenter-action-sub-type { + description "The base identity for vendor's actions."; + } + container actions-container { uses actions-grouping; } diff --git a/openflow-protocol-api/src/main/yang/openflow-augments.yang b/openflow-protocol-api/src/main/yang/openflow-augments.yang index 910dfa5f..a2e69293 100644 --- a/openflow-protocol-api/src/main/yang/openflow-augments.yang +++ b/openflow-protocol-api/src/main/yang/openflow-augments.yang @@ -252,6 +252,11 @@ leaf experimenter { type oft:experimenter-id; } + leaf sub-type { + type identityref { + base ofaction:experimenter-action-sub-type; + } + } } // OF1.0 structures augment "/ofaction:actions-container/ofaction:action" { diff --git a/openflow-protocol-api/src/test/java/org/opendaylight/openflowjava/protocol/api/keys/extensibility/KeysTest.java b/openflow-protocol-api/src/test/java/org/opendaylight/openflowjava/protocol/api/keys/extensibility/KeysTest.java index 9b4cf744..0093e9c8 100644 --- a/openflow-protocol-api/src/test/java/org/opendaylight/openflowjava/protocol/api/keys/extensibility/KeysTest.java +++ b/openflow-protocol-api/src/test/java/org/opendaylight/openflowjava/protocol/api/keys/extensibility/KeysTest.java @@ -13,6 +13,7 @@ import org.opendaylight.openflowjava.protocol.api.keys.experimenter.Experimenter import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterInstructionSerializerKey; import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.ExperimenterActionSubType; /** * @author michal.polkorab @@ -49,9 +50,9 @@ public class KeysTest { ActionSerializerKey actionSerializerKey = new ActionSerializerKey<>( EncodeConstants.OF13_VERSION_ID, Experimenter.class, 1L); ExperimenterActionSerializerKey experimenterActionSerializerKey = new ExperimenterActionSerializerKey( - EncodeConstants.OF13_VERSION_ID, 1L); - Assert.assertEquals(actionSerializerKey, experimenterActionSerializerKey); - Assert.assertEquals(actionSerializerKey.hashCode(), experimenterActionSerializerKey.hashCode()); + EncodeConstants.OF13_VERSION_ID, 1L, ExpSubType.class); + Assert.assertFalse(actionSerializerKey.equals(experimenterActionSerializerKey)); + Assert.assertFalse(experimenterActionSerializerKey.equals(actionSerializerKey)); InstructionSerializerKey instructionSerializerKey = new InstructionSerializerKey<>( EncodeConstants.OF13_VERSION_ID, @@ -61,5 +62,9 @@ public class KeysTest { Assert.assertEquals(instructionSerializerKey, experimenterInstructionSerializerKey); Assert.assertEquals(instructionSerializerKey.hashCode(), experimenterInstructionSerializerKey.hashCode()); } + + private static class ExpSubType extends ExperimenterActionSubType { + + } } diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/TypeKeyMakerFactory.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/TypeKeyMakerFactory.java index 6530ee2c..1d3875df 100644 --- a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/TypeKeyMakerFactory.java +++ b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/TypeKeyMakerFactory.java @@ -63,7 +63,7 @@ public abstract class TypeKeyMakerFactory { public MessageTypeKey make(Action entry) { if (entry.getType().equals(Experimenter.class)) { return new ExperimenterActionSerializerKey(getVersion(), - entry.getAugmentation(ExperimenterIdAction.class).getExperimenter().getValue()); + entry.getAugmentation(ExperimenterIdAction.class).getExperimenter().getValue(), entry.getAugmentation(ExperimenterIdAction.class).getSubType()); } return new ActionSerializerKey<>(getVersion(), entry.getType(), null); } -- 2.36.6