TrafficTreatment: add support for IP DSCP modifications

Allow modifying IP DSCP field in the headers.

Change-Id: Idd765f40f1baec810273536adcd56bf0e480217f
diff --git a/core/api/src/main/java/org/onosproject/net/flow/instructions/L3ModificationInstruction.java b/core/api/src/main/java/org/onosproject/net/flow/instructions/L3ModificationInstruction.java
index 9fddf89..cc15360 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/instructions/L3ModificationInstruction.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/instructions/L3ModificationInstruction.java
@@ -84,7 +84,12 @@
         /**
          * Arp operation modification.
          */
-        ARP_OP
+        ARP_OP,
+
+        /**
+         * IP DSCP operation modification.
+         */
+        IP_DSCP
     }
 
     /**
@@ -380,4 +385,50 @@
             return false;
         }
     }
+
+    /**
+     * Represents a L3 DSCP modification instruction.
+     */
+    public static final class ModDscpInstruction extends L3ModificationInstruction {
+
+        private final L3SubType subtype;
+        private final byte dscp;
+
+        ModDscpInstruction(L3SubType subtype, byte dscp) {
+            this.subtype = subtype;
+            this.dscp = dscp;
+        }
+
+        @Override
+        public L3SubType subtype() {
+            return this.subtype;
+        }
+
+        @Override
+        public String toString() {
+            return subtype().toString() + SEPARATOR + dscp();
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(type(), subtype(), dscp());
+        }
+
+        public byte dscp() {
+            return this.dscp;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj) {
+                return true;
+            }
+            if (obj instanceof ModDscpInstruction) {
+                ModDscpInstruction that = (ModDscpInstruction) obj;
+                return  Objects.equals(this.subtype(), that.subtype()) &&
+                        Objects.equals(this.dscp(), that.dscp());
+            }
+            return false;
+        }
+    }
 }