Merge "OFPGC_ADD_OR_MOD support in openflowplugin"
authorAnil Vishnoi <vishnoianil@gmail.com>
Tue, 23 Jan 2018 02:30:52 +0000 (02:30 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Tue, 23 Jan 2018 02:30:52 +0000 (02:30 +0000)
21 files changed:
openflowjava/openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/connection/ConnectionConfiguration.java
openflowjava/openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/extensibility/SerializerRegistry.java
openflowjava/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/core/SwitchConnectionProviderFactoryImpl.java
openflowjava/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/core/SwitchConnectionProviderImpl.java
openflowjava/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/MessageFactoryInitializer.java
openflowjava/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/SerializerRegistryImpl.java
openflowjava/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/GroupModInputMessageFactory.java
openflowjava/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/core/connection/ConnectionConfigurationImpl.java
openflowjava/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/core/connection/SwitchConnectionProviderImpl02Test.java
openflowjava/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/core/connection/SwitchConnectionProviderImplTest.java
openflowjava/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/GroupModInputMessageFactoryTest.java
openflowjava/openflow-protocol-it/src/test/java/org/opendaylight/openflowjava/protocol/it/integration/IntegrationTest.java
openflowjava/openflow-protocol-spi/src/main/java/org/opendaylight/openflowjava/protocol/spi/connection/SwitchConnectionProvider.java
openflowjava/openflow-protocol-spi/src/main/yang/openflow-switch-connection-config.yang
openflowjava/openflowjava-blueprint-config/src/main/resources/initial/default-openflow-connection-config.xml
openflowjava/openflowjava-blueprint-config/src/main/resources/initial/legacy-openflow-connection-config.xml
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/OpenFlowPluginProviderImpl.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/serialization/MessageSerializerInjector.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/serialization/SerializerInjector.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/serialization/messages/GroupMessageSerializer.java
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/protocol/serialization/AbstractSerializerTest.java

index 578e97b552479f78212bff0fe6935fb7f2e3f063..f66a6979e62f6ccc952b82359907aae6109a4023 100644 (file)
@@ -55,4 +55,10 @@ public interface ConnectionConfiguration {
      * @return boolean value for usability of Barrier
      */
     boolean useBarrier();
+
+    /**
+     * Checks if group add mod messages are enabled.
+     * @return true if group add mod messages are enabled
+     */
+    boolean isGroupAddModEnabled();
 }
index 1ddc48565e6daf2a5ea095161087d02d1d6e8e87..48aa72b95e91b92f91816102620dd6608dfadf38 100644 (file)
@@ -16,7 +16,6 @@ import org.opendaylight.openflowjava.protocol.api.keys.MessageTypeKey;
  * @author michal.polkorab
  */
 public interface SerializerRegistry {
-
     /**
      * Serializer registry provisioning
      */
@@ -53,4 +52,16 @@ public interface SerializerRegistry {
      *  false if no serializer was found under specified key
      */
     <K> boolean unregisterSerializer(MessageTypeKey<K> key);
+
+    /**
+     * Checks if group add mod messages are enabled.
+     * @return true if group add mod messages are enabled
+     */
+    boolean isGroupAddModEnabled();
+
+    /**
+     *
+     * @param isGroupAddModEnabled true if group add mod messages are enabled
+     */
+    void setGroupAddModConfig(boolean isGroupAddModEnabled);
 }
index 79ad2665351f043edc2668b9d6342031b60a61ba..bf1dea3e3659df14b8f0d588078426e44e79aecc 100644 (file)
@@ -33,8 +33,8 @@ public class SwitchConnectionProviderFactoryImpl implements SwitchConnectionProv
 
     @Override
     public SwitchConnectionProvider newInstance(SwitchConnectionConfig config) {
-        SwitchConnectionProviderImpl switchConnectionProviderImpl = new SwitchConnectionProviderImpl();
-        switchConnectionProviderImpl.setConfiguration(new ConnectionConfigurationImpl(config));
+        SwitchConnectionProviderImpl switchConnectionProviderImpl =
+                new SwitchConnectionProviderImpl(new ConnectionConfigurationImpl(config));
         return switchConnectionProviderImpl;
     }
 
@@ -174,5 +174,10 @@ public class SwitchConnectionProviderFactoryImpl implements SwitchConnectionProv
         public boolean useBarrier() {
             return config.isUseBarrier();
         }
+
+        @Override
+        public boolean isGroupAddModEnabled() {
+            return config.isGroupAddModEnabled();
+        }
     }
 }
index 612afcb73f036cb61af72abdeb5ed3cfcc7c7c4b..7474a311222e3b532f42dad2df36ec30abe738ec 100755 (executable)
@@ -64,16 +64,19 @@ public class SwitchConnectionProviderImpl implements SwitchConnectionProvider, C
             .getLogger(SwitchConnectionProviderImpl.class);
     private SwitchConnectionHandler switchConnectionHandler;
     private ServerFacade serverFacade;
-    private ConnectionConfiguration connConfig;
+    private final ConnectionConfiguration connConfig;
     private final SerializationFactory serializationFactory;
     private final SerializerRegistry serializerRegistry;
     private final DeserializerRegistry deserializerRegistry;
     private final DeserializationFactory deserializationFactory;
     private TcpConnectionInitializer connectionInitializer;
 
-    /** Constructor */
-    public SwitchConnectionProviderImpl() {
+    public SwitchConnectionProviderImpl(ConnectionConfiguration connConfig) {
+        this.connConfig = connConfig;
         serializerRegistry = new SerializerRegistryImpl();
+        if (connConfig != null) {
+            serializerRegistry.setGroupAddModConfig(connConfig.isGroupAddModEnabled());
+        }
         serializerRegistry.init();
         serializationFactory = new SerializationFactory();
         serializationFactory.setSerializerTable(serializerRegistry);
@@ -83,11 +86,6 @@ public class SwitchConnectionProviderImpl implements SwitchConnectionProvider, C
         deserializationFactory.setRegistry(deserializerRegistry);
     }
 
-    @Override
-    public void setConfiguration(final ConnectionConfiguration connConfig) {
-        this.connConfig = connConfig;
-    }
-
     @Override
     public void setSwitchConnectionHandler(final SwitchConnectionHandler switchConnectionHandler) {
         LOG.debug("setSwitchConnectionHandler");
index 23551bb7530ba438c199b2e214b270758ef7991e..401a292727ebcc1751bec9bc1d2986fad09e76e6 100644 (file)
@@ -101,7 +101,8 @@ public final class MessageFactoryInitializer {
         registryHelper.registerSerializer(GetConfigInput.class, new GetConfigInputMessageFactory());
         registryHelper.registerSerializer(GetFeaturesInput.class, new GetFeaturesInputMessageFactory());
         registryHelper.registerSerializer(GetQueueConfigInput.class, new GetQueueConfigInputMessageFactory());
-        registryHelper.registerSerializer(GroupModInput.class, new GroupModInputMessageFactory());
+        registryHelper.registerSerializer(GroupModInput.class,
+                new GroupModInputMessageFactory(serializerRegistry.isGroupAddModEnabled()));
         registryHelper.registerSerializer(HelloInput.class, new HelloInputMessageFactory());
         registryHelper.registerSerializer(MeterModInput.class, new MeterModInputMessageFactory());
         registryHelper.registerSerializer(MultipartRequestInput.class, new MultipartRequestInputFactory());
index 9383187866dfa5608bdffad335ab332c9971356a..4875898ebbdf61859c0a7ff7967984d3e6ac2de1 100644 (file)
@@ -39,6 +39,8 @@ public class SerializerRegistryImpl implements SerializerRegistry {
     private static final short OF13 = EncodeConstants.OF13_VERSION_ID;
     private Map<MessageTypeKey<?>, OFGeneralSerializer> registry;
 
+    private boolean isGroupAddModEnabled = false;
+
     @Override
     public void init() {
         registry = new HashMap<>();
@@ -60,6 +62,15 @@ public class SerializerRegistryImpl implements SerializerRegistry {
         InstructionsInitializer.registerInstructionSerializers(this);
     }
 
+    public void setGroupAddModConfig(boolean isGroupAddModEnabled) {
+        this.isGroupAddModEnabled = isGroupAddModEnabled;
+    }
+
+    @Override
+    public boolean isGroupAddModEnabled() {
+        return isGroupAddModEnabled;
+    }
+
     /**
      * @param msgTypeKey
      * @return encoder for current type of message (msgTypeKey)
index db8142a54f47113f883c5fde737f0e3ea9e43759..2a67c999e09dabdbaca8246d59414d5e486ae043 100644 (file)
@@ -17,6 +17,7 @@ import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
 import org.opendaylight.openflowjava.protocol.impl.util.ListSerializer;
 import org.opendaylight.openflowjava.protocol.impl.util.TypeKeyMakerFactory;
 import org.opendaylight.openflowjava.util.ByteBufUtils;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupModCommand;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupMod;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsList;
 
@@ -30,13 +31,28 @@ public class GroupModInputMessageFactory implements OFSerializer<GroupMod>, Seri
     private static final byte MESSAGE_TYPE = 15;
     private static final byte PADDING_IN_GROUP_MOD_MESSAGE = 1;
     private static final byte PADDING_IN_BUCKET = 4;
+    private static final int OFPGC_ADD_OR_MOD = 32768;
     private SerializerRegistry registry;
+    private final boolean isGroupAddModEnaled;
+
+    public GroupModInputMessageFactory(final boolean isGroupAddModEnaled) {
+        this.isGroupAddModEnaled = isGroupAddModEnaled;
+    }
 
     @Override
     public void serialize(GroupMod message, ByteBuf outBuffer) {
         int index = outBuffer.writerIndex();
         ByteBufUtils.writeOFHeader(MESSAGE_TYPE, message, outBuffer, EncodeConstants.EMPTY_LENGTH);
-        outBuffer.writeShort(message.getCommand().getIntValue());
+        if (isGroupAddModEnaled) {
+            if (message.getCommand().equals(GroupModCommand.OFPGCADD)
+                    || message.getCommand().equals(GroupModCommand.OFPGCMODIFY)) {
+                outBuffer.writeShort(OFPGC_ADD_OR_MOD);
+            } else {
+                outBuffer.writeShort(message.getCommand().getIntValue());
+            }
+        } else {
+            outBuffer.writeShort(message.getCommand().getIntValue());
+        }
         outBuffer.writeByte(message.getType().getIntValue());
         outBuffer.writeZero(PADDING_IN_GROUP_MOD_MESSAGE);
         outBuffer.writeInt(message.getGroupId().getValue().intValue());
index b4097dda605364d101a23e6c5eddda37a44fd0d0..3efb2504e3d35a398393f97744c0c93cf66251c7 100644 (file)
@@ -27,6 +27,7 @@ public class ConnectionConfigurationImpl implements ConnectionConfiguration {
     private final long switchIdleTimeout;
     private ThreadConfiguration threadConfig;
     private final boolean useBarrier;
+    private final boolean isGroupAddModEnabled;
 
     /**
      * Creates {@link ConnectionConfigurationImpl}
@@ -38,12 +39,13 @@ public class ConnectionConfigurationImpl implements ConnectionConfiguration {
      * @param useBarrier
      */
     public ConnectionConfigurationImpl(final InetAddress address, final int port, final TlsConfiguration tlsConfig,
-            final long switchIdleTimeout, final boolean useBarrier) {
+            final long switchIdleTimeout, final boolean useBarrier, final boolean isGroupAddModEnabled) {
         this.address = address;
         this.port = port;
         this.tlsConfig = tlsConfig;
         this.switchIdleTimeout = switchIdleTimeout;
         this.useBarrier = useBarrier;
+        this.isGroupAddModEnabled = isGroupAddModEnabled;
     }
 
     @Override
@@ -101,4 +103,9 @@ public class ConnectionConfigurationImpl implements ConnectionConfiguration {
     public boolean useBarrier() {
         return useBarrier;
     }
+
+    @Override
+    public boolean isGroupAddModEnabled() {
+        return isGroupAddModEnabled;
+    }
 }
\ No newline at end of file
index 03cc3f990dc3ca3679324cb013b3a2f922154f57..af3b418231dbc6bd0444380ade01daeba9e796f8 100755 (executable)
@@ -68,11 +68,11 @@ public class SwitchConnectionProviderImpl02Test {
     @Mock OFSerializer<ExperimenterDataOfChoice> serializerExperimenterInput;
     @Mock OFSerializer<ExperimenterDataOfChoice> serializerMultipartRequestExpCase;
     @Mock OFSerializer<MeterBandExperimenterCase> serializerMeterBandExpCase;
+    @Mock ConnectionConfigurationImpl config;
     private static final int SWITCH_IDLE_TIMEOUT = 2000;
     private InetAddress startupAddress;
     private TlsConfiguration tlsConfiguration;
     private SwitchConnectionProviderImpl provider;
-    private ConnectionConfigurationImpl config;
 
     /**
      * Creates new {@link SwitchConnectionProvider} instance for each test
@@ -84,7 +84,7 @@ public class SwitchConnectionProviderImpl02Test {
         if (protocol != null) {
             createConfig(protocol);
         }
-        provider = new SwitchConnectionProviderImpl();
+        provider = new SwitchConnectionProviderImpl(config);
     }
 
     private void createConfig(final TransportProtocol protocol) {
@@ -100,7 +100,7 @@ public class SwitchConnectionProviderImpl02Test {
                     "/selfSignedController", PathType.CLASSPATH,
                     Lists.newArrayList("TLS_RSA_WITH_AES_128_CBC_SHA", "TLS_RSA_WITH_AES_128_CBC_SHA256")) ;
         }
-        config = new ConnectionConfigurationImpl(startupAddress, 0, tlsConfiguration, SWITCH_IDLE_TIMEOUT, true);
+        config = new ConnectionConfigurationImpl(startupAddress, 0, tlsConfiguration, SWITCH_IDLE_TIMEOUT, true, false);
         config.setTransferProtocol(protocol);
     }
 
@@ -111,7 +111,6 @@ public class SwitchConnectionProviderImpl02Test {
     @Test
     public void testServerFacade(){
         startUp(TransportProtocol.TCP);
-        provider.setConfiguration(config);
         final ListenableFuture<Boolean> future = provider.startup();
         final ServerFacade serverFacade = provider.getServerFacade();
         Assert.assertNotNull("Wrong -- getServerFacade return null",serverFacade);
@@ -131,7 +130,6 @@ public class SwitchConnectionProviderImpl02Test {
     @Test
     public void testUnregisterWrongKeys(){
         startUp(TransportProtocol.TCP);
-        provider.setConfiguration(config);
         final ExperimenterInstructionSerializerKey testSerKey
             = new ExperimenterInstructionSerializerKey(EncodeConstants.OF10_VERSION_ID,42L);
         Assert.assertFalse("Wrong -- unregisterSerializer",provider.unregisterSerializer(testSerKey));
@@ -146,7 +144,6 @@ public class SwitchConnectionProviderImpl02Test {
     @Test
     public void testUnregisterExistingKeys(){
         startUp(TransportProtocol.TCP);
-        provider.setConfiguration(config);
         // -- registerActionSerializer
         final ExperimenterActionSerializerKey key1
             = new ExperimenterActionSerializerKey(EncodeConstants.OF10_VERSION_ID, 42L, TestSubType.class);
index 175595157e054c5422ad3745626b05bf98737d4f..7a8add5072e8c44ea7652760784fe3d0347ad9be 100644 (file)
@@ -53,7 +53,7 @@ public class SwitchConnectionProviderImplTest {
         if (protocol != null) {
             createConfig(protocol);
         }
-        provider = new SwitchConnectionProviderImpl();
+        provider = new SwitchConnectionProviderImpl(config);
     }
 
     private void createConfig(final TransportProtocol protocol) {
@@ -69,7 +69,7 @@ public class SwitchConnectionProviderImplTest {
                     "/selfSignedController", PathType.CLASSPATH,
                     Lists.newArrayList("TLS_RSA_WITH_AES_128_CBC_SHA", "TLS_RSA_WITH_AES_128_CBC_SHA256")) ;
         }
-        config = new ConnectionConfigurationImpl(startupAddress, 0, tlsConfiguration, SWITCH_IDLE_TIMEOUT, true);
+        config = new ConnectionConfigurationImpl(startupAddress, 0, tlsConfiguration, SWITCH_IDLE_TIMEOUT, true, false);
         config.setTransferProtocol(protocol);
     }
 
@@ -78,7 +78,7 @@ public class SwitchConnectionProviderImplTest {
      */
     @Test
     public void testStartup1() {
-        provider = new SwitchConnectionProviderImpl();
+        provider = new SwitchConnectionProviderImpl(config);
         final ListenableFuture<Boolean> future = provider.startup();
         try {
             future.get(WAIT_TIMEOUT, TimeUnit.MILLISECONDS);
@@ -108,7 +108,6 @@ public class SwitchConnectionProviderImplTest {
     @Test
     public void testStartup3() {
         startUp(TransportProtocol.TCP);
-        provider.setConfiguration(config);
         final ListenableFuture<Boolean> future = provider.startup();
         try {
             future.get(WAIT_TIMEOUT, TimeUnit.MILLISECONDS);
@@ -124,7 +123,6 @@ public class SwitchConnectionProviderImplTest {
     @Test
     public void testStartup4() {
         startUp(TransportProtocol.TCP);
-        provider.setConfiguration(config);
         provider.setSwitchConnectionHandler(handler);
         try {
             Assert.assertTrue("Failed to start", provider.startup().get(WAIT_TIMEOUT, TimeUnit.MILLISECONDS));
@@ -139,7 +137,6 @@ public class SwitchConnectionProviderImplTest {
     @Test
     public void testStartup5() {
         startUp(TransportProtocol.TLS);
-        provider.setConfiguration(config);
         provider.setSwitchConnectionHandler(handler);
         try {
             Assert.assertTrue("Failed to start", provider.startup().get(WAIT_TIMEOUT, TimeUnit.MILLISECONDS));
@@ -154,7 +151,6 @@ public class SwitchConnectionProviderImplTest {
     @Test
     public void testStartup6() {
         startUp(TransportProtocol.UDP);
-        provider.setConfiguration(config);
         provider.setSwitchConnectionHandler(handler);
         try {
             Assert.assertTrue("Failed to start", provider.startup().get(WAIT_TIMEOUT, TimeUnit.MILLISECONDS));
@@ -169,7 +165,6 @@ public class SwitchConnectionProviderImplTest {
     @Test
     public void testShutdown() {
         startUp(TransportProtocol.TCP);
-        provider.setConfiguration(config);
         provider.setSwitchConnectionHandler(handler);
         try {
             Assert.assertTrue("Failed to start", provider.startup().get(WAIT_TIMEOUT, TimeUnit.MILLISECONDS));
index 6e75130f9ebe358eaf3b6f56aa7f86940add4e54..bccc198aa8c1616f3e23c1ed7f5ced870e10b543 100644 (file)
@@ -40,7 +40,7 @@ public class GroupModInputMessageFactoryTest {
     private static final byte MESSAGE_TYPE = 15;
     private static final byte PADDING_IN_GROUP_MOD_MESSAGE = 1;
     private SerializerRegistry registry;
-    private OFSerializer<GroupModInput> groupModFactory;
+    private GroupModInputMessageFactory groupModFactory;
 
     /**
      * Initializes serializer registry and stores correct factory in field
@@ -49,8 +49,7 @@ public class GroupModInputMessageFactoryTest {
     public void startUp() {
         registry = new SerializerRegistryImpl();
         registry.init();
-        groupModFactory = registry.getSerializer(
-                new MessageTypeKey<>(EncodeConstants.OF13_VERSION_ID, GroupModInput.class));
+        groupModFactory = new GroupModInputMessageFactory(false);
     }
 
     /**
@@ -76,7 +75,6 @@ public class GroupModInputMessageFactoryTest {
         out.writeShort(3);
 
         groupModFactory.serialize(message, out);
-
         // read parent message
         out.readInt();
         out.skipBytes(2);
index 77e747a96279f793715e110399c08d9e07969e65..a747df745d3141a87a4d8860ba954979f9930133 100644 (file)
@@ -77,13 +77,12 @@ public class IntegrationTest {
                     "/selfSignedController", PathType.CLASSPATH,
                     new ArrayList<String>());
         }
-        connConfig = new ConnectionConfigurationImpl(startupAddress, 0, tlsConfiguration, SWITCH_IDLE_TIMEOUT, true);
+        connConfig = new ConnectionConfigurationImpl(startupAddress, 0, tlsConfiguration, SWITCH_IDLE_TIMEOUT, true, false);
         connConfig.setTransferProtocol(protocol);
         mockPlugin = new MockPlugin();
 
-        switchConnectionProvider = new SwitchConnectionProviderImpl();
+        switchConnectionProvider = new SwitchConnectionProviderImpl(connConfig);
         switchConnectionProvider.setSwitchConnectionHandler(mockPlugin);
-        switchConnectionProvider.setConfiguration(connConfig);
         switchConnectionProvider.startup().get(CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS);
         if (protocol.equals(TransportProtocol.TCP) || protocol.equals(TransportProtocol.TLS)) {
             final TcpHandler tcpHandler = (TcpHandler) switchConnectionProvider.getServerFacade();
index b013471f3b7388d75bd8099a5eba357ecb333ece..0837399ef41791376b10b81a3094665bcf02fbc3 100644 (file)
@@ -24,11 +24,6 @@ import com.google.common.util.concurrent.ListenableFuture;
 public interface SwitchConnectionProvider extends AutoCloseable,
         SerializerExtensionProvider, DeserializerExtensionProvider {
 
-    /**
-     * @param configuration [protocol, port, address and supported features]
-     */
-    void setConfiguration(ConnectionConfiguration configuration);
-
     /**
      * return the connection configuration
      * @return configuration [protocol, port, address and supported features]
index 1ab7ae851b5324edb2f16721084395eb26907ba9..e6d3927f93ae63785ec764105823ce5068cab371 100644 (file)
@@ -45,6 +45,12 @@ module openflow-switch-connection-config {
             default true;
         }
 
+        leaf group-add-mod-enabled {
+            description "Group Add Mod Enabled";
+            type boolean;
+            default false;
+        }
+
         leaf switch-idle-timeout {
             description "idle timeout in [ms]";
             type uint32;
index 08b8a52ed52badfdd75fddbbf43f0d2fc11b1409..8c91e139564f5232ff9e02e42d1e91b83e507f97 100644 (file)
@@ -2,6 +2,7 @@
   <instance-name>openflow-switch-connection-provider-default-impl</instance-name>
   <port>6653</port>
   <transport-protocol>TCP</transport-protocol>
+  <group-add-mod-enabled>false</group-add-mod-enabled>
   <tls>
      <keystore>configuration/ssl/ctl.jks</keystore>
      <keystore-type>JKS</keystore-type>
@@ -14,4 +15,4 @@
      <certificate-password>opendaylight</certificate-password>
      <cipher-suites></cipher-suites>
   </tls>
-</switch-connection-config>
\ No newline at end of file
+</switch-connection-config>
index 13860139be7e97bea8e1462bdf85ba8d4e70f117..6e8a432779f5fcc3408977f54e3bdffb5b97facd 100644 (file)
@@ -2,6 +2,7 @@
   <instance-name>openflow-switch-connection-provider-legacy-impl</instance-name>
   <port>6633</port>
   <transport-protocol>TCP</transport-protocol>
+  <group-add-mod-enabled>false</group-add-mod-enabled>
   <tls>
      <keystore>configuration/ssl/ctl.jks</keystore>
      <keystore-type>JKS</keystore-type>
index 88d3fedd2b446d885d5e56b9726f83d4526c4141..60e5af3c1d9a93d2a38e5105e82885da7d6e5104 100644 (file)
@@ -158,7 +158,8 @@ public class OpenFlowPluginProviderImpl implements
         Futures.addCallback(Futures.allAsList(switchConnectionProviders.stream().map(switchConnectionProvider -> {
             // Inject OpenFlowPlugin custom serializers and deserializers into OpenFlowJava
             if (config.isUseSingleLayerSerialization()) {
-                SerializerInjector.injectSerializers(switchConnectionProvider);
+                SerializerInjector.injectSerializers(switchConnectionProvider,
+                        switchConnectionProvider.getConfiguration().isGroupAddModEnabled());
                 DeserializerInjector.injectDeserializers(switchConnectionProvider);
             } else {
                 DeserializerInjector.revertDeserializers(switchConnectionProvider);
index 58c7b35a5357f50a913a297a6d20aad9211cca03..3805d4cdd1ad22745de11798dabf856c72e06ac2 100644 (file)
@@ -40,10 +40,10 @@ final class MessageSerializerInjector {
     /**
      * Injects message serializers into provided
      * {@link org.opendaylight.openflowjava.protocol.api.extensibility.SerializerExtensionProvider}.
-     *
      * @param provider OpenflowJava serializer extension provider
+     * @param isGroupAddModEnabled config to enale/disable GroupAddMod Message
      */
-    static void injectSerializers(final SerializerExtensionProvider provider) {
+    static void injectSerializers(final SerializerExtensionProvider provider, final boolean isGroupAddModEnabled) {
         // Inject new message serializers here using injector created by createInjector method
         final Function<Class<?>, Consumer<OFSerializer<? extends OfHeader>>> injector =
                 createInjector(provider, EncodeConstants.OF13_VERSION_ID);
@@ -51,7 +51,7 @@ final class MessageSerializerInjector {
         injector.apply(FlowMessage.class).accept(new FlowMessageSerializer());
         injector.apply(MeterMessage.class).accept(new MeterMessageSerializer());
         injector.apply(PortMessage.class).accept(new PortMessageSerializer());
-        injector.apply(GroupMessage.class).accept(new GroupMessageSerializer());
+        injector.apply(GroupMessage.class).accept(new GroupMessageSerializer(isGroupAddModEnabled));
         injector.apply(MultipartRequest.class).accept(new MultipartRequestMessageSerializer());
         injector.apply(AsyncConfigMessage.class).accept(new AsyncConfigMessageSerializer());
     }
index a740ac0ab6cf87174512bab503e94e0c7f003b03..6df805ce3df80c91e2466282adadeb2fcc0929a0 100644 (file)
@@ -21,15 +21,16 @@ public final class SerializerInjector {
     /**
      * Injects serializers into provided
      * {@link org.opendaylight.openflowjava.protocol.api.extensibility.SerializerExtensionProvider}.
-     *
      * @param provider OpenflowJava serializer extension provider
+     * @param isGroupAddModEnabled config to enale/disable GroupAddMod Message
      */
-    public static void injectSerializers(final SerializerExtensionProvider provider) {
+    public static void injectSerializers(final SerializerExtensionProvider provider,
+            final boolean isGroupAddModEnabled) {
         // Inject new serializers here
         MatchSerializerInjector.injectSerializers(provider);
         ActionSerializerInjector.injectSerializers(provider);
         InstructionSerializerInjector.injectSerializers(provider);
         MultipartSerializerInjector.injectSerializers(provider);
-        MessageSerializerInjector.injectSerializers(provider);
+        MessageSerializerInjector.injectSerializers(provider, isGroupAddModEnabled);
     }
 }
index a0286c77fe8d04e8481e5890d8419dcf7e510432..d05129b9992e5f1e1ebff9652d74c48e99c0ea69 100644 (file)
@@ -27,9 +27,11 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev13
  * OF protocol versions: 1.3.
  */
 public class GroupMessageSerializer extends AbstractMessageSerializer<GroupMessage> implements
-        SerializerRegistryInjector {
+    SerializerRegistryInjector {
     private static final byte PADDING_IN_GROUP_MOD_MESSAGE = 1;
     private static final byte PADDING_IN_BUCKET = 4;
+    private static final int OFPGC_ADD_OR_MOD = 32768;
+    private final boolean isGroupAddModEnabled;
 
     private static final Comparator<Bucket> COMPARATOR = (bucket1, bucket2) -> {
         if (bucket1.getBucketId() == null || bucket2.getBucketId() == null) {
@@ -40,11 +42,24 @@ public class GroupMessageSerializer extends AbstractMessageSerializer<GroupMessa
 
     private SerializerRegistry registry;
 
+    public GroupMessageSerializer(boolean isGroupAddModEnabled) {
+        this.isGroupAddModEnabled =  isGroupAddModEnabled;
+    }
+
     @Override
     public void serialize(GroupMessage message, ByteBuf outBuffer) {
         final int index = outBuffer.writerIndex();
         super.serialize(message, outBuffer);
-        outBuffer.writeShort(message.getCommand().getIntValue());
+        if (isGroupAddModEnabled) {
+            if (message.getCommand().equals(GroupModCommand.OFPGCADD)
+                    || message.getCommand().equals(GroupModCommand.OFPGCMODIFY)) {
+                outBuffer.writeShort(OFPGC_ADD_OR_MOD);
+            } else {
+                outBuffer.writeShort(message.getCommand().getIntValue());
+            }
+        } else {
+            outBuffer.writeShort(message.getCommand().getIntValue());
+        }
         outBuffer.writeByte(message.getGroupType().getIntValue());
         outBuffer.writeZero(PADDING_IN_GROUP_MOD_MESSAGE);
         outBuffer.writeInt(message.getGroupId().getValue().intValue());
@@ -75,7 +90,6 @@ public class GroupMessageSerializer extends AbstractMessageSerializer<GroupMessa
 
                     outBuffer.setShort(bucketIndex, outBuffer.writerIndex() - bucketIndex);
                 }));
-
         outBuffer.setShort(index + 2, outBuffer.writerIndex() - index);
     }
 
index b7e8412aeb45e1cd46aa0738102d79ebf8129cd5..5a367880e5f224106e36d5b124a3157daea33eac 100644 (file)
@@ -36,7 +36,7 @@ public abstract class AbstractSerializerTest {
         registry = new SerializerRegistryImpl();
         registry.init();
         provider = new SerializerExtensionProviderImpl(registry);
-        SerializerInjector.injectSerializers(provider);
+        SerializerInjector.injectSerializers(provider, false);
         init();
     }