void setBarrierInterval(long barrierTimeoutLimit);
CheckedFuture<Void, TransactionCommitFailedException> removeDeviceFromOperationalDS(DeviceInfo deviceInfo);
+
+ void setUseSingleLayerSerialization(Boolean useSingleLayerSerilization);
}
#maximum timer delay is the wait time to collect next statistics
#used in polling the statistics, value is in milliseconds
maximum-timer-delay=900000
+use-single-layer-serialization=true
public void update(Map<String,Object> props) {
LOG.debug("Update managed properties = {}", props.toString());
+ final boolean containsUseSingleLayer = props.containsKey("use-single-layer-serialization");
+
+ if (containsUseSingleLayer) {
+ final Boolean useSingleLayer = Boolean.valueOf(props.get("use-single-layer-serialization").toString());
+
+ if (useSingleLayer != useSingleLayerSerialization) {
+ useSingleLayerSerialization = useSingleLayer;
+
+ if (useSingleLayer) {
+ switchConnectionProviders.forEach(switchConnectionProvider -> {
+ SerializerInjector.injectSerializers(switchConnectionProvider);
+ DeserializerInjector.injectDeserializers(switchConnectionProvider);
+ });
+ } else {
+ switchConnectionProviders.forEach(DeserializerInjector::revertDeserializers);
+ }
+ }
+ }
+
if(deviceManager != null) {
+ if (containsUseSingleLayer) {
+ deviceManager.setUseSingleLayerSerialization(Boolean.valueOf(props.get("use-single-layer-serialization").toString()));
+ }
+
if (props.containsKey("notification-flow-removed-off")) {
deviceManager.setFlowRemovedNotificationOn(Boolean.valueOf(props.get("enable-flow-removed-notification").toString()));
}
private final NotificationPublishService notificationPublishService;
private final MessageSpy messageSpy;
private final HashedWheelTimer hashedWheelTimer;
- private final boolean useSingleLayerSerialization;
+ private boolean useSingleLayerSerialization;
public DeviceManagerImpl(@Nonnull final DataBroker dataBroker,
final long globalNotificationQuota,
return delFuture;
}
+ @Override
+ public void setUseSingleLayerSerialization(final Boolean useSingleLayerSerialization) {
+ this.useSingleLayerSerialization = useSingleLayerSerialization;
+ }
+
private void addCallbackToDeviceInitializeToSlave(final DeviceInfo deviceInfo, final DeviceContext deviceContext, final LifecycleService lifecycleService) {
Futures.addCallback(deviceContext.makeDeviceSlave(), new FutureCallback<RpcResult<SetRoleOutput>>() {
ActionDeserializerInjector.injectDeserializers(provider);
InstructionDeserializerInjector.injectDeserializers(provider);
MultipartDeserializerInjector.injectDeserializers(provider);
+ MessageDeserializerInjector.injectDeserializers(provider);
+ }
- // Message deserializers are not used, so disable them here
- // Uncomment to enable
- // MessageDeserializerInjector.injectDeserializers(provider);
+ /**
+ * Reverts original deserializers in provided {@link org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerExtensionProvider}
+ * @param provider OpenflowJava deserializer extension provider
+ */
+ public static void revertDeserializers(final DeserializerExtensionProvider provider) {
+ MessageDeserializerInjector.revertDeserializers(provider);
}
}
import org.opendaylight.openflowjava.protocol.api.keys.TypeToClassKey;
import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
import org.opendaylight.openflowplugin.impl.protocol.deserialization.messages.FlowMessageDeserializer;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowMessage;
import org.opendaylight.openflowplugin.impl.protocol.deserialization.messages.GroupMessageDeserializer;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupMessage;
import org.opendaylight.openflowplugin.impl.protocol.deserialization.messages.MeterMessageDeserializer;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterMessage;
import org.opendaylight.openflowplugin.impl.protocol.deserialization.messages.PortMessageDeserializer;
+import org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart.MultipartReplyMessageDeserializer;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortMessage;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowMessage;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupMessage;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterMessage;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.MultipartReply;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput;
public class MessageDeserializerInjector {
final Function<Integer, Function<Class<? extends OfHeader>, Consumer<OFDeserializer<? extends OfHeader>>>> injector =
createInjector(provider, EncodeConstants.OF13_VERSION_ID);
- injector.apply(14).apply(FlowMessage.class).accept(new FlowMessageDeserializer());
- injector.apply(15).apply(GroupMessage.class).accept(new GroupMessageDeserializer());
- injector.apply(29).apply(MeterMessage.class).accept(new MeterMessageDeserializer());
- injector.apply(16).apply(PortMessage.class).accept(new PortMessageDeserializer());
+ injector.apply(19).apply(MultipartReply.class).accept(new MultipartReplyMessageDeserializer());
+ }
+
+ /**
+ * Reverts original message deserializers in provided {@link org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerExtensionProvider}
+ * @param provider OpenflowJava deserializer extension provider
+ */
+ static void revertDeserializers(final DeserializerExtensionProvider provider) {
+ provider.unregisterDeserializerMapping(new TypeToClassKey(EncodeConstants.OF13_VERSION_ID, 14));
+ provider.registerDeserializerMapping(new TypeToClassKey(EncodeConstants.OF13_VERSION_ID, 14), FlowModInput.class);
+ provider.unregisterDeserializerMapping(new TypeToClassKey(EncodeConstants.OF13_VERSION_ID, 15));
+ provider.registerDeserializerMapping(new TypeToClassKey(EncodeConstants.OF13_VERSION_ID, 15), GroupModInput.class);
+ provider.unregisterDeserializerMapping(new TypeToClassKey(EncodeConstants.OF13_VERSION_ID, 29));
+ provider.registerDeserializerMapping(new TypeToClassKey(EncodeConstants.OF13_VERSION_ID, 29), MeterModInput.class);
+ provider.unregisterDeserializerMapping(new TypeToClassKey(EncodeConstants.OF13_VERSION_ID, 16));
+ provider.registerDeserializerMapping(new TypeToClassKey(EncodeConstants.OF13_VERSION_ID, 16), PortModInput.class);
+ provider.unregisterDeserializerMapping(new TypeToClassKey(EncodeConstants.OF13_VERSION_ID, 19));
+ provider.registerDeserializerMapping(new TypeToClassKey(EncodeConstants.OF13_VERSION_ID, 19), MultipartReplyMessage.class);
}
/**
};
}
+ @VisibleForTesting
+ static void injectLegacyDeserializers(final DeserializerExtensionProvider provider) {
+ final Function<Integer, Function<Class<? extends OfHeader>, Consumer<OFDeserializer<? extends OfHeader>>>> injector =
+ createInjector(provider, EncodeConstants.OF13_VERSION_ID);
+
+ injector.apply(14).apply(FlowMessage.class).accept(new FlowMessageDeserializer());
+ injector.apply(15).apply(GroupMessage.class).accept(new GroupMessageDeserializer());
+ injector.apply(29).apply(MeterMessage.class).accept(new MeterMessageDeserializer());
+ injector.apply(16).apply(PortMessage.class).accept(new PortMessageDeserializer());
+ }
+
}
import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerExtensionProvider;
import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
import org.opendaylight.openflowjava.protocol.api.keys.MessageCodeKey;
-import org.opendaylight.openflowjava.protocol.api.keys.TypeToClassKey;
import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
import org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart.MultipartReplyDescDeserializer;
import org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart.MultipartReplyExperimenterDeserializer;
import org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart.MultipartReplyGroupDescDeserializer;
import org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart.MultipartReplyGroupFeaturesDeserializer;
import org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart.MultipartReplyGroupStatsDeserializer;
-import org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart.MultipartReplyMessageDeserializer;
import org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart.MultipartReplyMeterConfigDeserializer;
import org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart.MultipartReplyMeterFeaturesDeserializer;
import org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart.MultipartReplyMeterStatsDeserializer;
import org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart.MultipartReplyPortStatsDeserializer;
import org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart.MultipartReplyQueueStatsDeserializer;
import org.opendaylight.openflowplugin.impl.protocol.deserialization.multipart.MultipartReplyTableFeaturesDeserializer;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.MultipartReply;
import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.multipart.reply.MultipartReplyBody;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
public class MultipartDeserializerInjector {
static void injectDeserializers(final DeserializerExtensionProvider provider) {
final short version = EncodeConstants.OF13_VERSION_ID;
- // Inject main multipart reply deserializer
- injectMultipartReplyDeserializer(provider, version);
-
// Inject new multipart body deserializers here using injector created by createInjector method
final Function<Integer, Consumer<OFDeserializer<? extends MultipartReplyBody>>> injector =
createInjector(provider, version);
injector.apply(MultipartType.OFPMPEXPERIMENTER.getIntValue()).accept(new MultipartReplyExperimenterDeserializer());
}
- /**
- * Register main multipart reply deserializer
- * @param provider OpenflowJava deserializer extension provider
- * @param version Openflow version
- */
- static void injectMultipartReplyDeserializer(final DeserializerExtensionProvider provider, final short version) {
- final short code = 19;
- final Class<? extends OfHeader> retType = MultipartReply.class;
- provider.unregisterDeserializerMapping(new TypeToClassKey(version, code));
- provider.registerDeserializerMapping(new TypeToClassKey(version, code), retType);
- provider.registerDeserializer(
- new MessageCodeKey(version, code, retType),
- new MultipartReplyMessageDeserializer());
- }
-
/**
* Create injector that will inject new deserializers into #{@link org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerExtensionProvider}
* @param provider OpenflowJava deserializer extension provider
factory.setRegistry(registry);
provider = new DeserializerExtensionProviderImpl(registry, factory);
DeserializerInjector.injectDeserializers(provider);
- MessageDeserializerInjector.injectDeserializers(provider);
+ MessageDeserializerInjector.injectLegacyDeserializers(provider);
init();
}