X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflowplugin-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fimpl%2Fprotocol%2Fdeserialization%2Futil%2FActionUtil.java;h=57adfdb1910a6c0439662b6441c424a75046100e;hb=fb33411ea295d68c1c887702f706ec6633f6527e;hp=ae24d8ba938b7468763cf363590b9661e54532fd;hpb=1d29d77d895878262d6349fc9eb580afd934a051;p=openflowplugin.git diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/util/ActionUtil.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/util/ActionUtil.java index ae24d8ba93..57adfdb191 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/util/ActionUtil.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/util/ActionUtil.java @@ -11,6 +11,7 @@ package org.opendaylight.openflowplugin.impl.protocol.deserialization.util; import java.util.Objects; import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry; +import org.opendaylight.openflowjava.protocol.api.extensibility.HeaderDeserializer; import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer; import org.opendaylight.openflowjava.protocol.api.keys.ActionDeserializerKey; import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterActionDeserializerKey; @@ -55,7 +56,7 @@ public class ActionUtil { final OFDeserializer deserializer = registry.getDeserializer(key); return deserializer.deserialize(message); - } catch (IllegalStateException e) { + } catch (ClassCastException | IllegalStateException e) { final MessageCodeKey key = Objects.nonNull(expId) ? new ExperimenterActionDeserializerKey(version, expId) : new ActionDeserializerKey(version, type, expId); @@ -68,4 +69,43 @@ public class ActionUtil { } } + /** + * Deserialize OpenFlow action header, using extension converter if available + * TODO: Remove also extension converters + * + * @param version OpenFlow version + * @param message OpenFlow buffered message + * @param registry deserializer registry + * @param path Action path + */ + public static Action readActionHeader(short version, ByteBuf message, DeserializerRegistry registry, + ActionPath path) { + int type = message.getUnsignedShort(message.readerIndex()); + Long expId = null; + + if (type == EncodeConstants.EXPERIMENTER_VALUE) { + expId = message.getUnsignedInt(message.readerIndex() + + 2 * EncodeConstants.SIZE_OF_SHORT_IN_BYTES); + } + + try { + final MessageCodeExperimenterKey key = new MessageCodeExperimenterKey( + version, type, Action.class, expId); + + final HeaderDeserializer deserializer = registry.getDeserializer(key); + + return deserializer.deserializeHeader(message); + } catch (ClassCastException | IllegalStateException e) { + final MessageCodeKey key = Objects.nonNull(expId) + ? new ExperimenterActionDeserializerKey(version, expId) + : new ActionDeserializerKey(version, type, expId); + + final HeaderDeserializer deserializer = registry.getDeserializer(key); + + return ActionExtensionHelper.processAlienAction(deserializer.deserializeHeader(message), + OpenflowVersion.get(version), path); + } + } + }