Support to enable multicast snooping of ovsdb through bridge desc

Change-Id: Ia14e67ab3a5a734a8a0eaa0b7bdda2fc9429c905
diff --git a/core/api/src/main/java/org/onosproject/net/behaviour/BridgeDescription.java b/core/api/src/main/java/org/onosproject/net/behaviour/BridgeDescription.java
index a3b02a8..5273b87 100644
--- a/core/api/src/main/java/org/onosproject/net/behaviour/BridgeDescription.java
+++ b/core/api/src/main/java/org/onosproject/net/behaviour/BridgeDescription.java
@@ -104,6 +104,15 @@
     Optional<Boolean> disableInBand();
 
     /**
+     * Returns multicast snooping is enabled or not. If set to true, enable multicast
+     * snooping on the bridge.
+     * If it is not set, the multicast snooping is disabled.
+     *
+     * @return true if the multicast snooping is enabled, false otherwise
+     */
+    Optional<Boolean> mcastSnoopingEnable();
+
+    /**
      * Returns list of Control Protocol Versions supported on device.
      * @return List of Control Protocol Versions enabled on bridge
      */
@@ -178,6 +187,13 @@
         Builder disableInBand();
 
         /**
+         * Returns bridge description builder with mcast snooping enabled.
+         *
+         * @return bridge description builder
+         */
+        Builder mcastSnoopingEnable();
+
+        /**
          * Builds an immutable bridge description.
          *
          * @return bridge description
diff --git a/core/api/src/main/java/org/onosproject/net/behaviour/DefaultBridgeDescription.java b/core/api/src/main/java/org/onosproject/net/behaviour/DefaultBridgeDescription.java
index cc0b837..609c71b 100644
--- a/core/api/src/main/java/org/onosproject/net/behaviour/DefaultBridgeDescription.java
+++ b/core/api/src/main/java/org/onosproject/net/behaviour/DefaultBridgeDescription.java
@@ -41,6 +41,7 @@
     private final Optional<String> datapathType;
     private final Optional<List<ControlProtocolVersion>> controlProtocols;
     private final Optional<Boolean> disableInBand;
+    private final Optional<Boolean> mcastSnoopingEnable;
 
     /* Adds more configurations */
 
@@ -51,6 +52,7 @@
                                      Optional<String> datapathId,
                                      Optional<String> datapathType,
                                      Optional<Boolean> disableInBand,
+                                     Optional<Boolean> mcastSnoopingEnable,
                                      Optional<List<ControlProtocolVersion>> controlProtocols) {
         this.name = checkNotNull(name);
         this.controllers = controllers;
@@ -59,6 +61,7 @@
         this.datapathId = datapathId;
         this.datapathType = datapathType;
         this.disableInBand = disableInBand;
+        this.mcastSnoopingEnable = mcastSnoopingEnable;
         this.controlProtocols = controlProtocols;
     }
 
@@ -116,6 +119,11 @@
         return disableInBand;
     }
 
+    @Override
+    public Optional<Boolean> mcastSnoopingEnable() {
+        return mcastSnoopingEnable;
+    }
+
     /**
      * Creates and returns a new builder instance.
      *
@@ -135,6 +143,7 @@
         private Optional<String> datapathType = Optional.empty();
         private Optional<List<ControlProtocolVersion>> controlProtocols = Optional.empty();
         private Optional<Boolean> disableInBand = Optional.empty();
+        private Optional<Boolean> mcastSnoopingEnable = Optional.empty();
 
         private Builder() {
         }
@@ -147,6 +156,7 @@
                                                 datapathId,
                                                 datapathType,
                                                 disableInBand,
+                                                mcastSnoopingEnable,
                                                 controlProtocols);
         }
 
@@ -200,5 +210,11 @@
             this.disableInBand = Optional.of(Boolean.TRUE);
             return this;
         }
+
+        @Override
+        public BridgeDescription.Builder mcastSnoopingEnable() {
+            this.mcastSnoopingEnable = Optional.of(Boolean.TRUE);
+            return this;
+        }
     }
 }
diff --git a/core/api/src/test/java/org/onosproject/net/behaviour/DefaultBridgeDescriptionTest.java b/core/api/src/test/java/org/onosproject/net/behaviour/DefaultBridgeDescriptionTest.java
index 9cd59c2..86b0a6a 100644
--- a/core/api/src/test/java/org/onosproject/net/behaviour/DefaultBridgeDescriptionTest.java
+++ b/core/api/src/test/java/org/onosproject/net/behaviour/DefaultBridgeDescriptionTest.java
@@ -24,7 +24,9 @@
 import java.util.List;
 
 import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
 
 /**
  * Unit tests for DefaultBridgeDescription.
@@ -58,6 +60,7 @@
         build.datapathType(type);
         build.failMode(mode);
         build.disableInBand();
+        build.mcastSnoopingEnable();
         build.enableLocalController();
         BridgeDescription test;
         test = build.build();
@@ -68,6 +71,7 @@
         assertThat(test.datapathType().get(), is(type));
         assertThat(test.failMode().get(), is(mode));
         assertThat(test.disableInBand().get(), is(true));
+        assertThat(test.mcastSnoopingEnable().get(), is(true));
         assertNull(test.annotations());
         assertTrue(test.enableLocalController());
         assertThat(test.deviceId().get(), is(DeviceId.deviceId("of:" + id)));