[CORD-545] Adds OVID support in ONOS core
Change-Id: Ib0c195825e86c245e626a11b0eac5d7003b561b0
diff --git a/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3ExtensionTreatmentInterpreter.java b/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3ExtensionTreatmentInterpreter.java
index a07862e..afdb29f 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3ExtensionTreatmentInterpreter.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/extensions/Ofdpa3ExtensionTreatmentInterpreter.java
@@ -16,6 +16,7 @@
package org.onosproject.driver.extensions;
+import org.onlab.packet.VlanId;
import org.onosproject.net.behaviour.ExtensionTreatmentResolver;
import org.onosproject.net.driver.AbstractHandlerBehaviour;
import org.onosproject.net.flow.instructions.ExtensionTreatment;
@@ -27,18 +28,27 @@
import org.projectfloodlight.openflow.protocol.action.OFActionSetField;
import org.projectfloodlight.openflow.protocol.oxm.OFOxm;
import org.projectfloodlight.openflow.protocol.oxm.OFOxmOfdpaMplsType;
+import org.projectfloodlight.openflow.protocol.oxm.OFOxmOfdpaOvid;
import org.projectfloodlight.openflow.types.U16;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* Interpreter for OFDPA3 OpenFlow treatment extensions.
*/
public class Ofdpa3ExtensionTreatmentInterpreter extends AbstractHandlerBehaviour
implements ExtensionTreatmentInterpreter, ExtensionTreatmentResolver {
+
+ private final Logger log = LoggerFactory.getLogger(getClass());
+
@Override
public boolean supported(ExtensionTreatmentType extensionTreatmentType) {
if (extensionTreatmentType.equals(
ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_SET_MPLS_TYPE.type())) {
return true;
+ } else if (extensionTreatmentType.equals(
+ ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_SET_OVID.type())) {
+ return true;
}
return false;
}
@@ -50,6 +60,13 @@
short mplsType = ((Ofdpa3SetMplsType) extensionTreatment).mplsType();
return factory.actions().setField(factory.oxms().ofdpaMplsType(
U16.ofRaw(mplsType)));
+ } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_SET_OVID.type())) {
+ // OFDPA requires isPresent bit set to 1 for OVID.
+ VlanId vlanId = ((Ofdpa3SetOvid) extensionTreatment).vlanId();
+ short mask = (short) 0x1000;
+ short oVid = (short) (mask | vlanId.toShort());
+ return factory.actions().setField(factory.oxms().ofdpaOvid(
+ U16.ofRaw(oVid)));
}
throw new UnsupportedOperationException(
"Unexpected ExtensionTreatment: " + extensionTreatment.toString());
@@ -64,6 +81,12 @@
case OFDPA_MPLS_TYPE:
OFOxmOfdpaMplsType mplsType = (OFOxmOfdpaMplsType) oxm;
return new Ofdpa3SetMplsType(mplsType.getValue().getRaw());
+ case OFDPA_OVID:
+ OFOxmOfdpaOvid ovid = ((OFOxmOfdpaOvid) oxm);
+ short mask = (short) 0x0FFF;
+ short oVid = (short) (mask & ovid.getValue().getRaw());
+ VlanId vlanId = VlanId.vlanId(oVid);
+ return new Ofdpa3SetOvid(vlanId);
default:
throw new UnsupportedOperationException(
"Driver does not support extension type " + oxm.getMatchField().id);
@@ -77,6 +100,8 @@
public ExtensionTreatment getExtensionInstruction(ExtensionTreatmentType type) {
if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_SET_MPLS_TYPE.type())) {
return new Ofdpa3SetMplsType();
+ } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_SET_OVID.type())) {
+ return new Ofdpa3SetOvid();
}
throw new UnsupportedOperationException(
"Driver does not support extension type " + type.toString());