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;
+ }
}
/**