VOL-2734 CORD MCast should support configuration of inner VLAN id for
multicast flows.

Change-Id: I79310551ede6306e2ed43110f211a22d8ef3a2d1
diff --git a/app/src/main/java/org/opencord/cordmcast/impl/CordMcast.java b/app/src/main/java/org/opencord/cordmcast/impl/CordMcast.java
index e014b79..f1b9429 100644
--- a/app/src/main/java/org/opencord/cordmcast/impl/CordMcast.java
+++ b/app/src/main/java/org/opencord/cordmcast/impl/CordMcast.java
@@ -157,6 +157,7 @@
     private ApplicationId appId;
     private ApplicationId coreAppId;
     private short mcastVlan = DEFAULT_MCAST_VLAN;
+    private VlanId mcastInnerVlan = VlanId.NONE;
 
     /**
      * Whether to use VLAN for multicast traffic.
@@ -297,6 +298,10 @@
         return vlanEnabled ? multicastVlan() : VlanId.NONE;
     }
 
+    protected VlanId assignedInnerVlan() {
+        return vlanEnabled ? mcastInnerVlan : VlanId.NONE;
+    }
+
     private class InternalMulticastListener implements McastListener {
         @Override
         public void event(McastEvent event) {
@@ -471,13 +476,13 @@
         }
 
         ObjectiveContext context = new DefaultObjectiveContext(
-                (objective) -> log.debug("Successfully add {} on {}/{}, vlan {}",
+                (objective) -> log.debug("Successfully add {} on {}/{}, vlan {}, inner vlan {}",
                                          route.group(), sink.deviceId(), sink.port().toLong(),
-                                         assignedVlan()),
+                                         assignedVlan(), assignedInnerVlan()),
                 (objective, error) -> {
-                    log.warn("Failed to add {} on {}/{}, vlan {}: {}",
+                    log.warn("Failed to add {} on {}/{}, vlan {}, inner vlan {}: {}",
                              route.group(), sink.deviceId(), sink.port().toLong(), assignedVlan(),
-                             error);
+                             assignedInnerVlan(), error);
                 });
 
         flowObjectiveService.next(sink.deviceId(), newNextObj);
@@ -538,7 +543,8 @@
                                 //TODO: Simply remove flows/groups, hosts will response period query
                                 // and re-sent IGMP report, so the flows can be rebuild.
                                 // However, better to remove and re-add mcast flow rules here
-                                if (mcastVlan != config.egressVlan().toShort() && vlanEnabled) {
+                                if (vlanEnabled && (mcastVlan != config.egressVlan().toShort() ||
+                                                    !mcastInnerVlan.equals(config.egressInnerVlan()))) {
                                     clearGroups();
                                 }
                                 updateConfig(config);
@@ -565,6 +571,9 @@
         if (config.egressVlan() != null) {
             mcastVlan = config.egressVlan().toShort();
         }
+        if (config.egressInnerVlan() != null) {
+            mcastInnerVlan = config.egressInnerVlan();
+        }
     }
 
     private class NextKey {
@@ -644,6 +653,10 @@
 
         if (vlanEnabled) {
             metadata.matchVlanId(multicastVlan());
+
+            if (!mcastInnerVlan.equals(VlanId.NONE)) {
+                metadata.matchInnerVlanId(mcastInnerVlan);
+            }
         }
 
         DefaultNextObjective.Builder build = DefaultNextObjective.builder()
@@ -690,6 +703,10 @@
         TrafficSelector.Builder metabuilder = DefaultTrafficSelector.builder();
         if (vlanEnabled) {
             metabuilder.matchVlanId(multicastVlan());
+
+            if (!mcastInnerVlan.equals(VlanId.NONE)) {
+                metabuilder.matchInnerVlanId(mcastInnerVlan);
+            }
         }
 
         ForwardingObjective.Builder fwdBuilder = DefaultForwardingObjective.builder()
diff --git a/app/src/test/java/org/opencord/cordmcast/impl/McastTestBase.java b/app/src/test/java/org/opencord/cordmcast/impl/McastTestBase.java
index 17ad11b..986c175 100644
--- a/app/src/test/java/org/opencord/cordmcast/impl/McastTestBase.java
+++ b/app/src/test/java/org/opencord/cordmcast/impl/McastTestBase.java
@@ -168,6 +168,11 @@
         public VlanId egressVlan() {
             return VlanId.vlanId("4000");
         }
+
+        @Override
+        public VlanId egressInnerVlan() {
+            return VlanId.NONE;
+        }
     }
 
     /**