Block pseudo wire VLAN translation
- Dune doesn't support VLAN translation in table 10. Need to revisit this with egress table
- Remove redundant setVlan action
- Implement partial unit test for PwaasUtil
Change-Id: Iabed388f6c68d8ddfc64a3302e6084c2e2aeeb44
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/pwaas/PwaasUtil.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/pwaas/PwaasUtil.java
index ada38f4..7cb60a6 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/pwaas/PwaasUtil.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/pwaas/PwaasUtil.java
@@ -16,6 +16,7 @@
package org.onosproject.segmentrouting.pwaas;
+import org.onlab.osgi.ServiceNotFoundException;
import org.onlab.packet.MplsLabel;
import org.onlab.packet.VlanId;
import org.onosproject.cli.AbstractShellCommand;
@@ -43,12 +44,46 @@
private static final Logger log = LoggerFactory.getLogger(PwaasUtil.class);
- private static DeviceService deviceService = AbstractShellCommand.get(DeviceService.class);
+ private static DeviceService deviceService;
+ private static InterfaceService intfService;
- private static InterfaceService intfService = AbstractShellCommand.get(InterfaceService.class);
+ // Suppress ExceptionInInitializerError and simply set the value to null,
+ // such that unit tests have a chance to replace the variable with mocked service
+ static {
+ try {
+ deviceService = AbstractShellCommand.get(DeviceService.class);
+ } catch (NullPointerException | ServiceNotFoundException e) {
+ deviceService = null;
+ }
+ try {
+ intfService = AbstractShellCommand.get(InterfaceService.class);
+ } catch (NullPointerException | ServiceNotFoundException e) {
+ intfService = null;
+ }
+ }
+
+ static final String ERR_SERVICE_UNAVAIL = "Service %s not available";
+ static final String ERR_SAME_DEV =
+ "Pseudowire connection points can not reside in the same node, in pseudowire %d.";
+ static final String ERR_EMPTY_INNER_WHEN_OUTER_PRESENT =
+ "Inner tag should not be empty when outer tag is set for pseudowire %d for %s.";
+ static final String ERR_WILDCARD_VLAN =
+ "Wildcard VLAN matching not yet supported for pseudowire %d.";
+ static final String ERR_DOUBLE_TO_UNTAGGED =
+ "Support for double tag <-> untag is not supported for pseudowire %d.";
+ static final String ERR_DOUBLE_TO_SINGLE =
+ "Support for double-tag<-> single-tag is not supported for pseudowire %d.";
+ static final String ERR_SINGLE_TO_UNTAGGED =
+ "single-tag <-> untag is not supported for pseudowire %d.";
+ static final String ERR_VLAN_TRANSLATION =
+ "We do not support VLAN translation for pseudowire %d.";
+ static final String ERR_DEV_NOT_FOUND =
+ "Device %s does not exist for pseudowire %d.";
+ static final String ERR_PORT_NOT_FOUND =
+ "Port %s of device %s does not exist for pseudowire %d.";
private PwaasUtil() {
- return;
+
}
/**
@@ -129,12 +164,15 @@
* supported and if policy will be successfully instantiated in the
* network.
*
+ * @param cP1 pseudo wire endpoint 1
+ * @param cP2 pseudo wire endpoint 2
* @param ingressInner the ingress inner tag
* @param ingressOuter the ingress outer tag
* @param egressInner the egress inner tag
* @param egressOuter the egress outer tag
+ * @param tunnelId tunnel ID
*/
- private static void verifyPolicy(ConnectPoint cP1,
+ static void verifyPolicy(ConnectPoint cP1,
ConnectPoint cP2,
VlanId ingressInner,
VlanId ingressOuter,
@@ -143,42 +181,34 @@
Long tunnelId) {
if (cP1.deviceId().equals(cP2.deviceId())) {
- throw new IllegalArgumentException(String.format("Pseudowire connection points can not reside in the " +
- "same node, in pseudowire %d.", tunnelId));
+ throw new IllegalArgumentException(String.format(ERR_SAME_DEV, tunnelId));
}
// We can have multiple tags, all of them can be NONE,
// indicating untagged traffic, however, the outer tag can
// not have value if the inner tag is None
if (ingressInner.equals(VlanId.NONE) && !ingressOuter.equals(VlanId.NONE)) {
- throw new IllegalArgumentException(String.format("Inner tag should not be empty when " +
- "outer tag is set for pseudowire %d for cP1.",
- tunnelId));
+ throw new IllegalArgumentException(String.format(ERR_EMPTY_INNER_WHEN_OUTER_PRESENT,
+ tunnelId, "cp1"));
}
if (egressInner.equals(VlanId.NONE) && !egressOuter.equals(VlanId.NONE)) {
- throw new IllegalArgumentException(String.valueOf(String.format("Inner tag should not be empty when" +
- " outer tag is set for " +
- "pseudowire %d " +
- "for cP2.", tunnelId)));
+ throw new IllegalArgumentException(String.format(ERR_EMPTY_INNER_WHEN_OUTER_PRESENT,
+ tunnelId, "cp2"));
}
if (ingressInner.equals(VlanId.ANY) ||
ingressOuter.equals(VlanId.ANY) ||
egressInner.equals(VlanId.ANY) ||
egressOuter.equals(VlanId.ANY)) {
- throw new IllegalArgumentException(String.valueOf(String.format("Wildcard VLAN matching not yet " +
- "supported for pseudowire %d.",
- tunnelId)));
+ throw new IllegalArgumentException(String.format(ERR_WILDCARD_VLAN, tunnelId));
}
if (((!ingressOuter.equals(VlanId.NONE) && !ingressInner.equals(VlanId.NONE)) &&
(egressOuter.equals(VlanId.NONE) && egressInner.equals(VlanId.NONE)))
|| ((ingressOuter.equals(VlanId.NONE) && ingressInner.equals(VlanId.NONE)) &&
(!egressOuter.equals(VlanId.NONE) && !egressInner.equals(VlanId.NONE)))) {
- throw new IllegalArgumentException(String.valueOf(String.format("Support for double tag <-> untag is not" +
- "supported for pseudowire %d.",
- tunnelId)));
+ throw new IllegalArgumentException(String.format(ERR_DOUBLE_TO_UNTAGGED, tunnelId));
}
if ((!ingressInner.equals(VlanId.NONE) &&
ingressOuter.equals(VlanId.NONE) &&
@@ -186,50 +216,42 @@
|| (egressOuter.equals(VlanId.NONE) &&
!egressInner.equals(VlanId.NONE) &&
!ingressOuter.equals(VlanId.NONE))) {
- throw new IllegalArgumentException(String.valueOf(String.format("Support for double-tag<->" +
- "single-tag is not supported" +
- " for pseudowire %d.", tunnelId)));
+ throw new IllegalArgumentException(String.format(ERR_DOUBLE_TO_SINGLE, tunnelId));
}
if ((ingressInner.equals(VlanId.NONE) && !egressInner.equals(VlanId.NONE))
|| (!ingressInner.equals(VlanId.NONE) && egressInner.equals(VlanId.NONE))) {
- throw new IllegalArgumentException(String.valueOf(String.format("single-tag <-> untag is not supported" +
- " for pseudowire %d.", tunnelId)));
+ throw new IllegalArgumentException(String.format(ERR_SINGLE_TO_UNTAGGED, tunnelId));
}
+ // FIXME PW VLAN translation is not supported on Dune
+ // Need to explore doing that in egress table later if there is a requirement
+ if (!ingressInner.equals(egressInner) || !ingressOuter.equals(egressOuter)) {
+ throw new IllegalArgumentException(String.format(ERR_VLAN_TRANSLATION, tunnelId));
+ }
- if (!ingressInner.equals(egressInner) && !ingressOuter.equals(egressOuter)) {
- throw new IllegalArgumentException(String.valueOf(String.format("We do not support changing both tags " +
- "in double tagged pws, only the " +
- "outer," +
- " for pseudowire %d.", tunnelId)));
+ if (deviceService == null) {
+ throw new IllegalStateException(String.format(ERR_SERVICE_UNAVAIL, "DeviceService"));
}
// check if cp1 and port of cp1 exist
if (deviceService.getDevice(cP1.deviceId()) == null) {
- throw new IllegalArgumentException(String.valueOf(String.format("cP1 device %s does not exist for" +
- " pseudowire %d.", cP1.deviceId(),
- tunnelId)));
+ throw new IllegalArgumentException(String.format(ERR_DEV_NOT_FOUND, cP1.deviceId(), tunnelId));
}
if (deviceService.getPort(cP1) == null) {
- throw new IllegalArgumentException(String.valueOf(String.format("Port %s for cP1 device %s does not" +
- " exist for pseudowire %d.",
- cP1.port(),
- cP1.deviceId(), tunnelId)));
+ throw new IllegalArgumentException(String.format(ERR_PORT_NOT_FOUND, cP1.port(),
+ cP1.deviceId(), tunnelId));
}
// check if cp2 and port of cp2 exist
if (deviceService.getDevice(cP2.deviceId()) == null) {
- throw new IllegalArgumentException(String.valueOf(String.format("cP2 device %s does not exist for" +
- " pseudowire %d.", cP2.deviceId(),
- tunnelId)));
+ throw new IllegalArgumentException(String.format(ERR_DEV_NOT_FOUND, cP2.deviceId(), tunnelId));
}
if (deviceService.getPort(cP2) == null) {
- throw new IllegalArgumentException(String.valueOf(String.format("Port %s for cP2 device %s does " +
- "not exist for pseudowire %d.",
- cP2.port(), cP2.deviceId(), tunnelId)));
+ throw new IllegalArgumentException(String.format(ERR_PORT_NOT_FOUND, cP2.port(),
+ cP2.deviceId(), tunnelId));
}
}
@@ -312,6 +334,10 @@
}
vlanSet.get(cP2).add(vlanToCheckCP2);
+ if (intfService == null) {
+ throw new IllegalStateException(String.format(ERR_SERVICE_UNAVAIL, "InterfaceService"));
+ }
+
// check that vlans for the connect points are not used
intfService.getInterfacesByPort(cP1).stream()
.forEach(intf -> {
diff --git a/apps/segmentrouting/app/src/test/java/org/onosproject/segmentrouting/pwaas/PwaasUtilTest.java b/apps/segmentrouting/app/src/test/java/org/onosproject/segmentrouting/pwaas/PwaasUtilTest.java
new file mode 100644
index 0000000..1d9f07e
--- /dev/null
+++ b/apps/segmentrouting/app/src/test/java/org/onosproject/segmentrouting/pwaas/PwaasUtilTest.java
@@ -0,0 +1,263 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.segmentrouting.pwaas;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.onlab.junit.TestUtils;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.DefaultPort;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.Port;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.intf.Interface;
+import org.onosproject.net.intf.InterfaceService;
+import org.onosproject.segmentrouting.MockDevice;
+
+import static org.easymock.EasyMock.createNiceMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+
+public class PwaasUtilTest {
+ private static final DeviceId DID1 = DeviceId.deviceId("of:1");
+ private static final DeviceId DID2 = DeviceId.deviceId("of:2");
+ private static final DeviceId DID99 = DeviceId.deviceId("of:99");
+ private static final PortNumber PN1 = PortNumber.portNumber(1);
+ private static final PortNumber PN2 = PortNumber.portNumber(2);
+ private static final PortNumber PN99 = PortNumber.portNumber(99);
+ private static final ConnectPoint CP11 = new ConnectPoint(DID1, PN1);
+ private static final ConnectPoint CP12 = new ConnectPoint(DID1, PN2);
+ private static final ConnectPoint CP21 = new ConnectPoint(DID2, PN1);
+ private static final ConnectPoint CP22 = new ConnectPoint(DID2, PN2);
+ private static final VlanId V1 = VlanId.vlanId((short) 1);
+ private static final VlanId V2 = VlanId.vlanId((short) 2);
+ private static final Device D1 = new MockDevice(DID1, null);
+ private static final Device D2 = new MockDevice(DID2, null);
+ private static final Port P11 = new DefaultPort(D1, PN1, true);
+ private static final Port P12 = new DefaultPort(D1, PN2, true);
+ private static final Port P21 = new DefaultPort(D2, PN1, true);
+ private static final Port P22 = new DefaultPort(D2, PN2, true);
+ private static final Interface I11 = new Interface("I11", CP11, Lists.newArrayList(), MacAddress.NONE,
+ VlanId.NONE, VlanId.NONE, Sets.newHashSet(VlanId.NONE), VlanId.NONE);
+ private static final Interface I12 = new Interface("I12", CP12, Lists.newArrayList(), MacAddress.NONE,
+ VlanId.NONE, VlanId.NONE, Sets.newHashSet(VlanId.NONE), VlanId.NONE);
+ private static final Interface I21 = new Interface("I21", CP21, Lists.newArrayList(), MacAddress.NONE,
+ VlanId.NONE, VlanId.NONE, Sets.newHashSet(VlanId.NONE), VlanId.NONE);
+ private static final Interface I22 = new Interface("I22", CP22, Lists.newArrayList(), MacAddress.NONE,
+ VlanId.NONE, VlanId.NONE, Sets.newHashSet(VlanId.NONE), VlanId.NONE);
+
+ private ConnectPoint cp1;
+ private ConnectPoint cp2;
+ private VlanId ingressInner;
+ private VlanId ingressOuter;
+ private VlanId egressInner;
+ private VlanId egressOuter;
+ private static final Long TUNNEL_ID = (long) 1234;
+
+ @Before
+ public void setUp() {
+ DeviceService deviceService = createNiceMock(DeviceService.class);
+ InterfaceService intfService = createNiceMock(InterfaceService.class);
+ TestUtils.setField(PwaasUtil.class, "deviceService", deviceService);
+ TestUtils.setField(PwaasUtil.class, "intfService", intfService);
+
+ expect(deviceService.getDevice(DID1)).andReturn(D1).anyTimes();
+ expect(deviceService.getDevice(DID2)).andReturn(D2).anyTimes();
+ expect(deviceService.getPort(CP11)).andReturn(P11).anyTimes();
+ expect(deviceService.getPort(CP12)).andReturn(P12).anyTimes();
+ expect(deviceService.getPort(CP21)).andReturn(P21).anyTimes();
+ expect(deviceService.getPort(CP22)).andReturn(P22).anyTimes();
+ expect(intfService.getInterfacesByPort(CP11)).andReturn(Sets.newHashSet(I11)).anyTimes();
+ expect(intfService.getInterfacesByPort(CP12)).andReturn(Sets.newHashSet(I12)).anyTimes();
+ expect(intfService.getInterfacesByPort(CP21)).andReturn(Sets.newHashSet(I21)).anyTimes();
+ expect(intfService.getInterfacesByPort(CP22)).andReturn(Sets.newHashSet(I22)).anyTimes();
+ replay(deviceService);
+ replay(intfService);
+ }
+
+ @Rule
+ public final ExpectedException exception = ExpectedException.none();
+
+ @Test
+ public void verifyPolicy() {
+ cp1 = new ConnectPoint(DID1, PN1);
+ cp2 = new ConnectPoint(DID2, PN2);
+ ingressInner = V1;
+ ingressOuter = V2;
+ egressInner = V1;
+ egressOuter = V2;
+ PwaasUtil.verifyPolicy(cp1, cp2, ingressInner, ingressOuter, egressInner, egressOuter, TUNNEL_ID);
+
+ ingressInner = VlanId.NONE;
+ ingressOuter = VlanId.NONE;
+ egressInner = VlanId.NONE;
+ egressOuter = VlanId.NONE;
+ PwaasUtil.verifyPolicy(cp1, cp2, ingressInner, ingressOuter, egressInner, egressOuter, TUNNEL_ID);
+ }
+
+ @Test
+ public void verifyPolicyOnSameDevice() {
+ cp1 = new ConnectPoint(DID1, PN1);
+ cp2 = new ConnectPoint(DID1, PN2);
+ ingressInner = VlanId.NONE;
+ ingressOuter = VlanId.NONE;
+ egressInner = VlanId.NONE;
+ egressOuter = VlanId.NONE;
+ exception.expect(IllegalArgumentException.class);
+ exception.expectMessage(String.format(PwaasUtil.ERR_SAME_DEV, TUNNEL_ID));
+ PwaasUtil.verifyPolicy(cp1, cp2, ingressInner, ingressOuter, egressInner, egressOuter, TUNNEL_ID);
+ }
+
+ @Test
+ public void verifyPolicyEmptyInnerCp1() {
+ cp1 = new ConnectPoint(DID1, PN1);
+ cp2 = new ConnectPoint(DID2, PN2);
+ ingressInner = VlanId.NONE;
+ ingressOuter = V1;
+ egressInner = VlanId.NONE;
+ egressOuter = VlanId.NONE;
+ exception.expect(IllegalArgumentException.class);
+ exception.expectMessage(String.format(PwaasUtil.ERR_EMPTY_INNER_WHEN_OUTER_PRESENT, TUNNEL_ID, "cp1"));
+ PwaasUtil.verifyPolicy(cp1, cp2, ingressInner, ingressOuter, egressInner, egressOuter, TUNNEL_ID);
+ }
+
+ @Test
+ public void verifyPolicyEmptyInnerCp2() {
+ cp1 = new ConnectPoint(DID1, PN1);
+ cp2 = new ConnectPoint(DID2, PN2);
+ ingressInner = VlanId.NONE;
+ ingressOuter = VlanId.NONE;
+ egressInner = VlanId.NONE;
+ egressOuter = V1;
+ exception.expect(IllegalArgumentException.class);
+ exception.expectMessage(String.format(PwaasUtil.ERR_EMPTY_INNER_WHEN_OUTER_PRESENT, TUNNEL_ID, "cp2"));
+ PwaasUtil.verifyPolicy(cp1, cp2, ingressInner, ingressOuter, egressInner, egressOuter, TUNNEL_ID);
+ }
+
+ @Test
+ public void verifyPolicyVlanWildcard() {
+ cp1 = new ConnectPoint(DID1, PN1);
+ cp2 = new ConnectPoint(DID2, PN2);
+ ingressInner = VlanId.ANY;
+ ingressOuter = VlanId.NONE;
+ egressInner = VlanId.NONE;
+ egressOuter = VlanId.NONE;
+ exception.expect(IllegalArgumentException.class);
+ exception.expectMessage(String.format(PwaasUtil.ERR_WILDCARD_VLAN, TUNNEL_ID));
+ PwaasUtil.verifyPolicy(cp1, cp2, ingressInner, ingressOuter, egressInner, egressOuter, TUNNEL_ID);
+ }
+
+
+ @Test
+ public void verifyPolicyDeviceServiceNotAvailable() {
+ TestUtils.setField(PwaasUtil.class, "deviceService", null);
+ cp1 = new ConnectPoint(DID1, PN1);
+ cp2 = new ConnectPoint(DID2, PN2);
+ ingressInner = V1;
+ ingressOuter = V2;
+ egressInner = V1;
+ egressOuter = V2;
+ exception.expect(IllegalStateException.class);
+ exception.expectMessage(String.format(PwaasUtil.ERR_SERVICE_UNAVAIL, "DeviceService"));
+ PwaasUtil.verifyPolicy(cp1, cp2, ingressInner, ingressOuter, egressInner, egressOuter, TUNNEL_ID);
+ }
+
+ @Test
+ public void verifyPolicyDoubleToUntagged() {
+ cp1 = new ConnectPoint(DID1, PN1);
+ cp2 = new ConnectPoint(DID2, PN2);
+ ingressInner = V1;
+ ingressOuter = V2;
+ egressInner = VlanId.NONE;
+ egressOuter = VlanId.NONE;
+ exception.expect(IllegalArgumentException.class);
+ exception.expectMessage(String.format(PwaasUtil.ERR_DOUBLE_TO_UNTAGGED, TUNNEL_ID));
+ PwaasUtil.verifyPolicy(cp1, cp2, ingressInner, ingressOuter, egressInner, egressOuter, TUNNEL_ID);
+ }
+
+ @Test
+ public void verifyPolicyDoubleToSingle() {
+ cp1 = new ConnectPoint(DID1, PN1);
+ cp2 = new ConnectPoint(DID2, PN2);
+ ingressInner = V1;
+ ingressOuter = V2;
+ egressInner = V1;
+ egressOuter = VlanId.NONE;
+ exception.expect(IllegalArgumentException.class);
+ exception.expectMessage(String.format(PwaasUtil.ERR_DOUBLE_TO_SINGLE, TUNNEL_ID));
+ PwaasUtil.verifyPolicy(cp1, cp2, ingressInner, ingressOuter, egressInner, egressOuter, TUNNEL_ID);
+ }
+
+ @Test
+ public void verifyPolicySingleToUntagged() {
+ cp1 = new ConnectPoint(DID1, PN1);
+ cp2 = new ConnectPoint(DID2, PN2);
+ ingressInner = V1;
+ ingressOuter = VlanId.NONE;
+ egressInner = VlanId.NONE;
+ egressOuter = VlanId.NONE;
+ exception.expect(IllegalArgumentException.class);
+ exception.expectMessage(String.format(PwaasUtil.ERR_SINGLE_TO_UNTAGGED, TUNNEL_ID));
+ PwaasUtil.verifyPolicy(cp1, cp2, ingressInner, ingressOuter, egressInner, egressOuter, TUNNEL_ID);
+ }
+
+ @Test
+ public void verifyPolicyVlanTranslation() {
+ cp1 = new ConnectPoint(DID1, PN1);
+ cp2 = new ConnectPoint(DID2, PN2);
+ ingressInner = V1;
+ ingressOuter = VlanId.NONE;
+ egressInner = V2;
+ egressOuter = VlanId.NONE;
+ exception.expect(IllegalArgumentException.class);
+ exception.expectMessage(String.format(PwaasUtil.ERR_VLAN_TRANSLATION, TUNNEL_ID));
+ PwaasUtil.verifyPolicy(cp1, cp2, ingressInner, ingressOuter, egressInner, egressOuter, TUNNEL_ID);
+ }
+
+ @Test
+ public void verifyPolicyDeviceNotFound() {
+ cp1 = new ConnectPoint(DID99, PN1);
+ cp2 = new ConnectPoint(DID2, PN2);
+ ingressInner = V1;
+ ingressOuter = V2;
+ egressInner = V1;
+ egressOuter = V2;
+ exception.expect(IllegalArgumentException.class);
+ exception.expectMessage(String.format(PwaasUtil.ERR_DEV_NOT_FOUND, DID99, TUNNEL_ID));
+ PwaasUtil.verifyPolicy(cp1, cp2, ingressInner, ingressOuter, egressInner, egressOuter, TUNNEL_ID);
+ }
+
+ @Test
+ public void verifyPolicyPortNotFound() {
+ cp1 = new ConnectPoint(DID1, PN99);
+ cp2 = new ConnectPoint(DID2, PN2);
+ ingressInner = V1;
+ ingressOuter = V2;
+ egressInner = V1;
+ egressOuter = V2;
+ exception.expect(IllegalArgumentException.class);
+ exception.expectMessage(String.format(PwaasUtil.ERR_PORT_NOT_FOUND, PN99, DID1, TUNNEL_ID));
+ PwaasUtil.verifyPolicy(cp1, cp2, ingressInner, ingressOuter, egressInner, egressOuter, TUNNEL_ID);
+ }
+}
\ No newline at end of file
diff --git a/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/Ofdpa3Pipeline.java b/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/Ofdpa3Pipeline.java
index 13fe2b1..7168f6d 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/Ofdpa3Pipeline.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/pipeline/ofdpa/Ofdpa3Pipeline.java
@@ -568,8 +568,9 @@
.matchVlanId(innerVlanIdCriterion.vlanId());
TrafficTreatment.Builder singleVlanTreatment = DefaultTrafficTreatment.builder()
- // .pushVlan()
- .setVlanId(egressVlan)
+ // FIXME PW VLAN translation is not supported on Dune
+ // Need to explore doing that in egress table later if there is a requirement
+ // .setVlanId(egressVlan)
.extension(new Ofdpa3SetMplsType(VPWS), deviceId)
.extension(new Ofdpa3SetMplsL2Port(mplsLogicalPort), deviceId)
.setTunnelId(tunnelId)