ONOS-2403 Support setting TCP/UDP port action in flow rule for OpenFlow13
Change-Id: I4ce84aba9db03a66ebcfb34959c11cc4acadb07b
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 fe657e6..06c49ba 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
@@ -224,6 +224,7 @@
case L0MODIFICATION:
case L2MODIFICATION:
case L3MODIFICATION:
+ case L4MODIFICATION:
current.add(instruction);
break;
case TABLE:
@@ -390,6 +391,26 @@
}
@Override
+ public TrafficTreatment.Builder setTcpSrc(short port) {
+ return add(Instructions.modTcpSrc(port));
+ }
+
+ @Override
+ public TrafficTreatment.Builder setTcpDst(short port) {
+ return add(Instructions.modTcpDst(port));
+ }
+
+ @Override
+ public TrafficTreatment.Builder setUdpSrc(short port) {
+ return add(Instructions.modUdpSrc(port));
+ }
+
+ @Override
+ public TrafficTreatment.Builder setUdpDst(short port) {
+ return add(Instructions.modUdpDst(port));
+ }
+
+ @Override
public TrafficTreatment build() {
//Don't add DROP instruction by default when instruction
//set is empty. This will be handled in DefaultSingleTablePipeline
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 35ef6d3..d125a9f 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
@@ -319,6 +319,38 @@
Builder setTunnelId(long tunnelId);
/**
+ * Sets the src TCP port.
+ *
+ * @param port a port number
+ * @return a treatment builder
+ */
+ Builder setTcpSrc(short port);
+
+ /**
+ * Sets the dst TCP port.
+ *
+ * @param port a port number
+ * @return a treatment builder
+ */
+ Builder setTcpDst(short port);
+
+ /**
+ * Sets the src UDP port.
+ *
+ * @param port a port number
+ * @return a treatment builder
+ */
+ Builder setUdpSrc(short port);
+
+ /**
+ * Sets the dst UDP port.
+ *
+ * @param port a port number
+ * @return a treatment builder
+ */
+ Builder setUdpDst(short port);
+
+ /**
* Builds an immutable traffic treatment descriptor.
* <p>
* If the treatment is empty when build() is called, it will add a default
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 0467a91..3cacfa5 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
@@ -32,6 +32,8 @@
import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModIPInstruction;
import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModIPv6FlowLabelInstruction;
import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModTtlInstruction;
+import org.onosproject.net.flow.instructions.L4ModificationInstruction.L4SubType;
+import org.onosproject.net.flow.instructions.L4ModificationInstruction.ModTransportPortInstruction;
import java.util.Objects;
@@ -361,6 +363,50 @@
}
/**
+ * Creates a TCP src modification.
+ *
+ * @param port the TCP port number to modify to
+ * @return a L4 modification
+ */
+ public static L4ModificationInstruction modTcpSrc(short port) {
+ checkNotNull(port, "Src TCP port cannot be null");
+ return new ModTransportPortInstruction(L4SubType.TCP_SRC, port);
+ }
+
+ /**
+ * Creates a TCP dst modification.
+ *
+ * @param port the TCP port number to modify to
+ * @return a L4 modification
+ */
+ public static L4ModificationInstruction modTcpDst(short port) {
+ checkNotNull(port, "Dst TCP port cannot be null");
+ return new ModTransportPortInstruction(L4SubType.TCP_DST, port);
+ }
+
+ /**
+ * Creates a UDP src modification.
+ *
+ * @param port the UDP port number to modify to
+ * @return a L4 modification
+ */
+ public static L4ModificationInstruction modUdpSrc(short port) {
+ checkNotNull(port, "Src UDP port cannot be null");
+ return new ModTransportPortInstruction(L4SubType.UDP_SRC, port);
+ }
+
+ /**
+ * Creates a UDP dst modification.
+ *
+ * @param port the UDP port number to modify to
+ * @return a L4 modification
+ */
+ public static L4ModificationInstruction modUdpDst(short port) {
+ checkNotNull(port, "Dst UDP port cannot be null");
+ return new ModTransportPortInstruction(L4SubType.UDP_DST, port);
+ }
+
+ /**
* Drop instruction.
*/
public static final class DropInstruction implements Instruction {
diff --git a/core/api/src/main/java/org/onosproject/net/flow/instructions/L4ModificationInstruction.java b/core/api/src/main/java/org/onosproject/net/flow/instructions/L4ModificationInstruction.java
index 09f02fb..c78f639 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/instructions/L4ModificationInstruction.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/instructions/L4ModificationInstruction.java
@@ -66,12 +66,12 @@
/**
* Represents a L4 src/dst modification instruction.
*/
- public static final class ModL4PortInstruction extends L4ModificationInstruction {
+ public static final class ModTransportPortInstruction extends L4ModificationInstruction {
private final L4SubType subtype;
private final short port;
- public ModL4PortInstruction(L4SubType subtype, short port) {
+ public ModTransportPortInstruction(L4SubType subtype, short port) {
this.subtype = subtype;
this.port = port;
}
@@ -101,8 +101,8 @@
if (this == obj) {
return true;
}
- if (obj instanceof ModL4PortInstruction) {
- ModL4PortInstruction that = (ModL4PortInstruction) obj;
+ if (obj instanceof ModTransportPortInstruction) {
+ ModTransportPortInstruction that = (ModTransportPortInstruction) obj;
return Objects.equals(port, that.port) &&
Objects.equals(this.subtype(), that.subtype());
}