Implement some of the missing Selector and Match Conditions
Work toward ONOS-509
The following match conditions are added/implemented:
- IN_PHY_PORT
- IP_DSCP
- IP_ECN
- METADATA
Change-Id: I6f529ee90b2b9e0d5046f83c034e8be3faf86d8b
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 5c445a8..95e37d0 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
@@ -355,6 +355,15 @@
builder.matchInPort(PortNumber
.portNumber(match.get(MatchField.IN_PORT).getPortNumber()));
break;
+ case IN_PHY_PORT:
+ builder.matchInPhyPort(PortNumber
+ .portNumber(match.get(MatchField.IN_PHY_PORT).getPortNumber()));
+ break;
+ case METADATA:
+ long metadata =
+ match.get(MatchField.METADATA).getValue().getValue();
+ builder.matchMetadata(metadata);
+ break;
case ETH_DST:
mac = MacAddress.valueOf(match.get(MatchField.ETH_DST).getLong());
builder.matchEthDst(mac);
@@ -386,6 +395,14 @@
byte vlanPcp = match.get(MatchField.VLAN_PCP).getValue();
builder.matchVlanPcp(vlanPcp);
break;
+ case IP_DSCP:
+ byte ipDscp = match.get(MatchField.IP_DSCP).getDscpValue();
+ builder.matchIPDscp(ipDscp);
+ break;
+ case IP_ECN:
+ byte ipEcn = match.get(MatchField.IP_ECN).getEcnValue();
+ builder.matchIPEcn(ipEcn);
+ break;
case IP_PROTO:
short proto = match.get(MatchField.IP_PROTO).getIpProtocolNumber();
builder.matchIPProtocol((byte) proto);
@@ -514,10 +531,6 @@
case ARP_SPA:
case ARP_THA:
case ARP_TPA:
- case IN_PHY_PORT:
- case IP_DSCP:
- case IP_ECN:
- case METADATA:
case MPLS_TC:
case TUNNEL_ID:
default:
diff --git a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilder.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilder.java
index dc954da..076bfd6 100644
--- a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilder.java
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilder.java
@@ -30,11 +30,14 @@
import org.onosproject.net.flow.criteria.Criteria.Icmpv6CodeCriterion;
import org.onosproject.net.flow.criteria.Criteria.Icmpv6TypeCriterion;
import org.onosproject.net.flow.criteria.Criteria.IPCriterion;
+import org.onosproject.net.flow.criteria.Criteria.IPDscpCriterion;
+import org.onosproject.net.flow.criteria.Criteria.IPEcnCriterion;
import org.onosproject.net.flow.criteria.Criteria.IPProtocolCriterion;
import org.onosproject.net.flow.criteria.Criteria.IPv6FlowLabelCriterion;
import org.onosproject.net.flow.criteria.Criteria.IPv6NDLinkLayerAddressCriterion;
import org.onosproject.net.flow.criteria.Criteria.IPv6NDTargetAddressCriterion;
import org.onosproject.net.flow.criteria.Criteria.LambdaCriterion;
+import org.onosproject.net.flow.criteria.Criteria.MetadataCriterion;
import org.onosproject.net.flow.criteria.Criteria.PortCriterion;
import org.onosproject.net.flow.criteria.Criteria.SctpPortCriterion;
import org.onosproject.net.flow.criteria.Criteria.TcpPortCriterion;
@@ -55,9 +58,12 @@
import org.projectfloodlight.openflow.types.IPv4Address;
import org.projectfloodlight.openflow.types.IPv6Address;
import org.projectfloodlight.openflow.types.IPv6FlowLabel;
+import org.projectfloodlight.openflow.types.IpDscp;
+import org.projectfloodlight.openflow.types.IpEcn;
import org.projectfloodlight.openflow.types.IpProtocol;
import org.projectfloodlight.openflow.types.MacAddress;
import org.projectfloodlight.openflow.types.Masked;
+import org.projectfloodlight.openflow.types.OFMetadata;
import org.projectfloodlight.openflow.types.OFPort;
import org.projectfloodlight.openflow.types.OFVlanVidMatch;
import org.projectfloodlight.openflow.types.TransportPort;
@@ -161,8 +167,19 @@
for (Criterion c : selector.criteria()) {
switch (c.type()) {
case IN_PORT:
- PortCriterion inport = (PortCriterion) c;
- mBuilder.setExact(MatchField.IN_PORT, OFPort.of((int) inport.port().toLong()));
+ PortCriterion inPort = (PortCriterion) c;
+ mBuilder.setExact(MatchField.IN_PORT,
+ OFPort.of((int) inPort.port().toLong()));
+ break;
+ case IN_PHY_PORT:
+ PortCriterion inPhyPort = (PortCriterion) c;
+ mBuilder.setExact(MatchField.IN_PORT,
+ OFPort.of((int) inPhyPort.port().toLong()));
+ break;
+ case METADATA:
+ MetadataCriterion metadata = (MetadataCriterion) c;
+ mBuilder.setExact(MatchField.METADATA,
+ OFMetadata.ofRaw(metadata.metadata()));
break;
case ETH_DST:
ethCriterion = (EthCriterion) c;
@@ -193,6 +210,16 @@
VlanPcpCriterion vpcp = (VlanPcpCriterion) c;
mBuilder.setExact(MatchField.VLAN_PCP, VlanPcp.of(vpcp.priority()));
break;
+ case IP_DSCP:
+ IPDscpCriterion ipDscpCriterion = (IPDscpCriterion) c;
+ mBuilder.setExact(MatchField.IP_DSCP,
+ IpDscp.of(ipDscpCriterion.ipDscp()));
+ break;
+ case IP_ECN:
+ IPEcnCriterion ipEcnCriterion = (IPEcnCriterion) c;
+ mBuilder.setExact(MatchField.IP_ECN,
+ IpEcn.of(ipEcnCriterion.ipEcn()));
+ break;
case IP_PROTO:
IPProtocolCriterion p = (IPProtocolCriterion) c;
mBuilder.setExact(MatchField.IP_PROTO, IpProtocol.of(p.protocol()));
@@ -353,11 +380,7 @@
case ARP_SPA:
case ARP_THA:
case ARP_TPA:
- case IN_PHY_PORT:
case IPV6_EXTHDR:
- case IP_DSCP:
- case IP_ECN:
- case METADATA:
case MPLS_BOS:
case MPLS_TC:
case PBB_ISID: