[CORD-545] Adds QoS Index support in ONOS core

Change-Id: If7649bdf70f5a796466b8efc5798dc3346ea94a0
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 c449702..067e294 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
@@ -30,8 +30,10 @@
 import org.projectfloodlight.openflow.protocol.oxm.OFOxmOfdpaMplsL2Port;
 import org.projectfloodlight.openflow.protocol.oxm.OFOxmOfdpaMplsType;
 import org.projectfloodlight.openflow.protocol.oxm.OFOxmOfdpaOvid;
+import org.projectfloodlight.openflow.protocol.oxm.OFOxmOfdpaQosIndex;
 import org.projectfloodlight.openflow.types.U16;
 import org.projectfloodlight.openflow.types.U32;
+import org.projectfloodlight.openflow.types.U8;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -54,6 +56,9 @@
         } else if (extensionTreatmentType.equals(
                 ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_SET_MPLS_L2_PORT.type())) {
             return true;
+        } else if (extensionTreatmentType.equals(
+                ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_SET_QOS_INDEX.type())) {
+            return true;
         }
         return false;
     }
@@ -86,6 +91,18 @@
             }
             throw new UnsupportedOperationException(
                     "Unexpected ExtensionTreatment: " + extensionTreatment.toString());
+        } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_SET_QOS_INDEX.type())) {
+            Integer qosIndex = ((Ofdpa3SetQosIndex) extensionTreatment).qosIndex();
+            /*
+             * Qos index is a single byte [0...255]
+             */
+            if (qosIndex >= 0 && qosIndex <= 255) {
+                return factory.actions().setField(
+                        factory.oxms().ofdpaQosIndex(U8.ofRaw((byte) (qosIndex & 0xFF)))
+                );
+            }
+            throw new UnsupportedOperationException(
+                    "Unexpected ExtensionTreatment: " + extensionTreatment.toString());
         }
         throw new UnsupportedOperationException(
                 "Unexpected ExtensionTreatment: " + extensionTreatment.toString());
@@ -113,6 +130,14 @@
                             (mplsL2Port >= 0x00020000 && mplsL2Port <= 0x0002FFFF)) {
                         return new Ofdpa3SetMplsL2Port(mplsL2Port);
                     }
+                    break;
+                case OFDPA_QOS_INDEX:
+                    OFOxmOfdpaQosIndex qosindex = ((OFOxmOfdpaQosIndex) oxm);
+                    Integer qosIndex = (int) qosindex.getValue().getRaw();
+                    if (qosIndex >= 0 && qosIndex <= 255) {
+                        return new Ofdpa3SetQosIndex(qosIndex);
+                    }
+                    break;
                 default:
                     throw new UnsupportedOperationException(
                             "Driver does not support extension type " + oxm.getMatchField().id);
@@ -130,6 +155,8 @@
             return new Ofdpa3SetOvid();
         } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_SET_MPLS_L2_PORT.type())) {
             return new Ofdpa3SetMplsL2Port();
+        } else if (type.equals(ExtensionTreatmentType.ExtensionTreatmentTypes.OFDPA_SET_QOS_INDEX.type())) {
+            return new Ofdpa3SetQosIndex();
         }
         throw new UnsupportedOperationException(
                 "Driver does not support extension type " + type.toString());