ONOS-2403 Support setting TCP/UDP port action in flow rule for OpenFlow13
Change-Id: I4ce84aba9db03a66ebcfb34959c11cc4acadb07b
diff --git a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java
index 6760462..4a3872c 100644
--- a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java
@@ -71,6 +71,7 @@
import org.projectfloodlight.openflow.types.IPv6Address;
import org.projectfloodlight.openflow.types.Masked;
import org.projectfloodlight.openflow.types.OFVlanVidMatch;
+import org.projectfloodlight.openflow.types.TransportPort;
import org.projectfloodlight.openflow.types.U32;
import org.projectfloodlight.openflow.types.U64;
import org.projectfloodlight.openflow.types.U8;
@@ -408,6 +409,26 @@
OFOxm<U64> tunnelId = (OFOxm<U64>) oxm;
builder.setTunnelId(tunnelId.getValue().getValue());
break;
+ case TCP_DST:
+ @SuppressWarnings("unchecked")
+ OFOxm<TransportPort> tcpdst = (OFOxm<TransportPort>) oxm;
+ builder.setTcpDst((short) tcpdst.getValue().getPort());
+ break;
+ case TCP_SRC:
+ @SuppressWarnings("unchecked")
+ OFOxm<TransportPort> tcpsrc = (OFOxm<TransportPort>) oxm;
+ builder.setTcpSrc((short) tcpsrc.getValue().getPort());
+ break;
+ case UDP_DST:
+ @SuppressWarnings("unchecked")
+ OFOxm<TransportPort> udpdst = (OFOxm<TransportPort>) oxm;
+ builder.setUdpDst((short) udpdst.getValue().getPort());
+ break;
+ case UDP_SRC:
+ @SuppressWarnings("unchecked")
+ OFOxm<TransportPort> udpsrc = (OFOxm<TransportPort>) oxm;
+ builder.setUdpSrc((short) udpsrc.getValue().getPort());
+ break;
case ARP_OP:
case ARP_SHA:
case ARP_SPA:
@@ -455,10 +476,6 @@
case OCH_SIGTYPE_BASIC:
case SCTP_DST:
case SCTP_SRC:
- case TCP_DST:
- case TCP_SRC:
- case UDP_DST:
- case UDP_SRC:
default:
log.warn("Set field type {} not yet implemented.", oxm.getMatchField().id);
break;
diff --git a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java
index 7bbc375..58c19ad 100644
--- a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java
@@ -39,6 +39,8 @@
import org.onosproject.net.flow.instructions.L3ModificationInstruction;
import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModIPInstruction;
import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModIPv6FlowLabelInstruction;
+import org.onosproject.net.flow.instructions.L4ModificationInstruction;
+import org.onosproject.net.flow.instructions.L4ModificationInstruction.ModTransportPortInstruction;
import org.projectfloodlight.openflow.protocol.OFFactory;
import org.projectfloodlight.openflow.protocol.OFFlowAdd;
import org.projectfloodlight.openflow.protocol.OFFlowDelete;
@@ -61,6 +63,7 @@
import org.projectfloodlight.openflow.types.OFPort;
import org.projectfloodlight.openflow.types.OFVlanVidMatch;
import org.projectfloodlight.openflow.types.TableId;
+import org.projectfloodlight.openflow.types.TransportPort;
import org.projectfloodlight.openflow.types.U32;
import org.projectfloodlight.openflow.types.U64;
import org.projectfloodlight.openflow.types.VlanPcp;
@@ -214,6 +217,9 @@
case L3MODIFICATION:
actions.add(buildL3Modification(i));
break;
+ case L4MODIFICATION:
+ actions.add(buildL4Modification(i));
+ break;
case OUTPUT:
OutputInstruction out = (OutputInstruction) i;
OFActionOutput.Builder action = factory().actions().buildOutput()
@@ -327,7 +333,7 @@
ModMplsLabelInstruction mplsLabel =
(ModMplsLabelInstruction) l2m;
oxm = factory().oxms().mplsLabel(U32.of(mplsLabel.label()
- .longValue()));
+ .longValue()));
break;
case DEC_MPLS_TTL:
return factory().actions().decMplsTtl();
@@ -402,4 +408,36 @@
return null;
}
+ private OFAction buildL4Modification(Instruction i) {
+ L4ModificationInstruction l4m = (L4ModificationInstruction) i;
+ ModTransportPortInstruction tp;
+ OFOxm<?> oxm = null;
+ switch (l4m.subtype()) {
+ case TCP_SRC:
+ tp = (ModTransportPortInstruction) l4m;
+ oxm = factory().oxms().tcpSrc(TransportPort.of(tp.port()));
+ break;
+ case TCP_DST:
+ tp = (ModTransportPortInstruction) l4m;
+ oxm = factory().oxms().tcpDst(TransportPort.of(tp.port()));
+ break;
+ case UDP_SRC:
+ tp = (ModTransportPortInstruction) l4m;
+ oxm = factory().oxms().udpSrc(TransportPort.of(tp.port()));
+ break;
+ case UDP_DST:
+ tp = (ModTransportPortInstruction) l4m;
+ oxm = factory().oxms().udpDst(TransportPort.of(tp.port()));
+ break;
+ default:
+ log.warn("Unimplemented action type {}.", l4m.subtype());
+ break;
+ }
+
+ if (oxm != null) {
+ return factory().actions().buildSetField().setField(oxm).build();
+ }
+ return null;
+ }
+
}