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/DefaultTrafficTreatment.java b/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java
index c6a1c16..72cfd3f 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java
@@ -515,6 +515,11 @@
}
@Override
+ public TrafficTreatment.Builder setIpDscp(byte dscpValue) {
+ return add(Instructions.modIpDscp(dscpValue));
+ }
+
+ @Override
public TrafficTreatment.Builder extension(ExtensionTreatment extension,
DeviceId deviceId) {
return add(Instructions.extension(extension, deviceId));
diff --git a/core/api/src/main/java/org/onosproject/net/flow/TrafficTreatment.java b/core/api/src/main/java/org/onosproject/net/flow/TrafficTreatment.java
index f61b017..154f8c6 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/TrafficTreatment.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/TrafficTreatment.java
@@ -428,6 +428,14 @@
Builder piTableAction(PiTableAction piTableAction);
/**
+ * Sets the IP DSCP field.
+ *
+ * @param dscpValue the DSCP value
+ * @return a treatment builder.
+ */
+ Builder setIpDscp(byte dscpValue);
+
+ /**
* Uses an extension treatment.
*
* @param extension extension treatment
diff --git a/core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java b/core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java
index 33b7482..e0c58d3 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java
@@ -485,6 +485,16 @@
}
/**
+ * Creates an IP DSCP modification.
+ *
+ * @param dscpValue the DSCP value to modify to
+ * @return a L3 modification
+ */
+ public static Instruction modIpDscp(byte dscpValue) {
+ return new L3ModificationInstruction.ModDscpInstruction(L3SubType.IP_DSCP, dscpValue);
+ }
+
+ /**
* Creates an extension instruction.
*
* @param extension extension instruction
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;
+ }
+ }
}