[CORD-545] Adds ofdpa actions in ONOS core

Change-Id: I98edc27162d7309b9d21f2c939430608e3e85c6e
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 067e294..907111c 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
@@ -25,6 +25,8 @@
 import org.projectfloodlight.openflow.protocol.OFActionType;
 import org.projectfloodlight.openflow.protocol.OFFactory;
 import org.projectfloodlight.openflow.protocol.action.OFAction;
+import org.projectfloodlight.openflow.protocol.action.OFActionExperimenter;
+import org.projectfloodlight.openflow.protocol.action.OFActionOfdpa;
 import org.projectfloodlight.openflow.protocol.action.OFActionSetField;
 import org.projectfloodlight.openflow.protocol.oxm.OFOxm;
 import org.projectfloodlight.openflow.protocol.oxm.OFOxmOfdpaMplsL2Port;
@@ -43,6 +45,12 @@
 public class Ofdpa3ExtensionTreatmentInterpreter extends AbstractHandlerBehaviour
         implements ExtensionTreatmentInterpreter, ExtensionTreatmentResolver {
 
+    private static final int TYPE_OFDPA = 0x1018;
+    private static final int SUB_TYPE_PUSH_L2_HEADER = 1;
+    private static final int SUB_TYPE_POP_L2_HEADER = 2;
+    private static final int SUB_TYPE_PUSH_CW = 3;
+    private static final int SUB_TYPE_POP_CW = 4;
+
     private final Logger log = LoggerFactory.getLogger(getClass());
 
     @Override
@@ -59,6 +67,18 @@
         } else if (extensionTreatmentType.equals(
                 ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_SET_QOS_INDEX.type())) {
             return true;
+        } else if (extensionTreatmentType.equals(
+                ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_PUSH_L2_HEADER.type())) {
+            return true;
+        } else if (extensionTreatmentType.equals(
+                ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_PUSH_CW.type())) {
+            return true;
+        } else if (extensionTreatmentType.equals(
+                ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_POP_L2_HEADER.type())) {
+            return true;
+        } else if (extensionTreatmentType.equals(
+                ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_POP_CW.type())) {
+            return true;
         }
         return false;
     }
@@ -103,6 +123,14 @@
             }
             throw new UnsupportedOperationException(
                     "Unexpected ExtensionTreatment: " + extensionTreatment.toString());
+        } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_PUSH_L2_HEADER.type())) {
+            return factory.actions().ofdpaPushL2Header();
+        } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_PUSH_CW.type())) {
+            return factory.actions().ofdpaPushCw();
+        } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_POP_L2_HEADER.type())) {
+            return factory.actions().ofdpaPopL2Header();
+        } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_POP_CW.type())) {
+            return factory.actions().ofdpaPopCw();
         }
         throw new UnsupportedOperationException(
                 "Unexpected ExtensionTreatment: " + extensionTreatment.toString());
@@ -142,6 +170,26 @@
                     throw new UnsupportedOperationException(
                             "Driver does not support extension type " + oxm.getMatchField().id);
             }
+        } else if (action.getType().equals(OFActionType.EXPERIMENTER)) {
+            OFActionExperimenter experimenter = (OFActionExperimenter) action;
+            if (Long.valueOf(experimenter.getExperimenter()).intValue() == TYPE_OFDPA) {
+                OFActionOfdpa ofdpa = (OFActionOfdpa) experimenter;
+                switch (ofdpa.getExpType()) {
+                    case SUB_TYPE_PUSH_L2_HEADER:
+                        return new Ofdpa3PushL2Header();
+                    case SUB_TYPE_POP_L2_HEADER:
+                        return new Ofdpa3PopL2Header();
+                    case SUB_TYPE_PUSH_CW:
+                        return new Ofdpa3PushCw();
+                    case SUB_TYPE_POP_CW:
+                        return new Ofdpa3PopCw();
+                    default:
+                        throw new UnsupportedOperationException(
+                                "Unexpected OFAction: " + action.toString());
+                }
+            }
+            throw new UnsupportedOperationException(
+                    "Unexpected OFAction: " + action.toString());
         }
         throw new UnsupportedOperationException(
                 "Unexpected OFAction: " + action.toString());
@@ -157,6 +205,14 @@
             return new Ofdpa3SetMplsL2Port();
         } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_SET_QOS_INDEX.type())) {
             return new Ofdpa3SetQosIndex();
+        } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_PUSH_L2_HEADER.type())) {
+            return new Ofdpa3PushL2Header();
+        } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_PUSH_CW.type())) {
+            return new Ofdpa3PushCw();
+        } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_POP_L2_HEADER.type())) {
+            return new Ofdpa3PopL2Header();
+        } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_POP_CW.type())) {
+            return new Ofdpa3PopCw();
         }
         throw new UnsupportedOperationException(
                 "Driver does not support extension type " + type.toString());