aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/onos/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilder.java
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/onos/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilder.java')
-rw-r--r--framework/src/onos/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilder.java76
1 files changed, 72 insertions, 4 deletions
diff --git a/framework/src/onos/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilder.java b/framework/src/onos/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilder.java
index 2a8d2010..dcd7b0fc 100644
--- a/framework/src/onos/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilder.java
+++ b/framework/src/onos/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilder.java
@@ -20,8 +20,13 @@ import org.onlab.packet.Ip4Prefix;
import org.onlab.packet.Ip6Address;
import org.onlab.packet.Ip6Prefix;
import org.onlab.packet.VlanId;
+import org.onosproject.net.DeviceId;
import org.onosproject.net.OchSignal;
+import org.onosproject.net.driver.DefaultDriverData;
+import org.onosproject.net.driver.DefaultDriverHandler;
+import org.onosproject.net.driver.Driver;
import org.onosproject.net.driver.DriverService;
+import org.onosproject.net.OduSignalId;
import org.onosproject.net.flow.FlowRule;
import org.onosproject.net.flow.TrafficSelector;
import org.onosproject.net.flow.criteria.ArpHaCriterion;
@@ -30,6 +35,8 @@ import org.onosproject.net.flow.criteria.ArpPaCriterion;
import org.onosproject.net.flow.criteria.Criterion;
import org.onosproject.net.flow.criteria.EthCriterion;
import org.onosproject.net.flow.criteria.EthTypeCriterion;
+import org.onosproject.net.flow.criteria.ExtensionCriterion;
+import org.onosproject.net.flow.criteria.ExtensionSelector;
import org.onosproject.net.flow.criteria.IPCriterion;
import org.onosproject.net.flow.criteria.IPDscpCriterion;
import org.onosproject.net.flow.criteria.IPEcnCriterion;
@@ -47,6 +54,8 @@ import org.onosproject.net.flow.criteria.MplsBosCriterion;
import org.onosproject.net.flow.criteria.MplsCriterion;
import org.onosproject.net.flow.criteria.OchSignalCriterion;
import org.onosproject.net.flow.criteria.OchSignalTypeCriterion;
+import org.onosproject.net.flow.criteria.OduSignalIdCriterion;
+import org.onosproject.net.flow.criteria.OduSignalTypeCriterion;
import org.onosproject.net.flow.criteria.PortCriterion;
import org.onosproject.net.flow.criteria.SctpPortCriterion;
import org.onosproject.net.flow.criteria.TcpPortCriterion;
@@ -54,12 +63,14 @@ import org.onosproject.net.flow.criteria.TunnelIdCriterion;
import org.onosproject.net.flow.criteria.UdpPortCriterion;
import org.onosproject.net.flow.criteria.VlanIdCriterion;
import org.onosproject.net.flow.criteria.VlanPcpCriterion;
+import org.onosproject.openflow.controller.ExtensionSelectorInterpreter;
import org.projectfloodlight.openflow.protocol.OFFactory;
import org.projectfloodlight.openflow.protocol.OFFlowAdd;
import org.projectfloodlight.openflow.protocol.OFFlowDelete;
import org.projectfloodlight.openflow.protocol.OFFlowMod;
import org.projectfloodlight.openflow.protocol.match.Match;
import org.projectfloodlight.openflow.protocol.match.MatchField;
+import org.projectfloodlight.openflow.protocol.oxm.OFOxm;
import org.projectfloodlight.openflow.types.ArpOpcode;
import org.projectfloodlight.openflow.types.CircuitSignalID;
import org.projectfloodlight.openflow.types.EthType;
@@ -84,6 +95,7 @@ import org.projectfloodlight.openflow.types.U64;
import org.projectfloodlight.openflow.types.U8;
import org.projectfloodlight.openflow.types.VlanPcp;
import org.projectfloodlight.openflow.types.VlanVid;
+import org.projectfloodlight.openflow.types.OduSignalID;
import org.slf4j.Logger;
import java.util.Optional;
@@ -102,6 +114,7 @@ public abstract class FlowModBuilder {
private final TrafficSelector selector;
protected final Long xid;
protected final Optional<DriverService> driverService;
+ protected final DeviceId deviceId;
/**
* Creates a new flow mod builder.
@@ -142,6 +155,7 @@ public abstract class FlowModBuilder {
this.selector = flowRule.selector();
this.xid = xid.orElse(0L);
this.driverService = driverService;
+ this.deviceId = flowRule.deviceId();
}
/**
@@ -398,7 +412,7 @@ public abstract class FlowModBuilder {
OchSignal signal = ochSignalCriterion.lambda();
byte gridType = OpenFlowValueMapper.lookupGridType(signal.gridType());
byte channelSpacing = OpenFlowValueMapper.lookupChannelSpacing(signal.channelSpacing());
- mBuilder.setExact(MatchField.OCH_SIGID,
+ mBuilder.setExact(MatchField.EXP_OCH_SIG_ID,
new CircuitSignalID(gridType, channelSpacing,
(short) signal.spacingMultiplier(), (short) signal.slotGranularity()));
} catch (NoMappingFoundException e) {
@@ -406,9 +420,30 @@ public abstract class FlowModBuilder {
}
break;
case OCH_SIGTYPE:
- OchSignalTypeCriterion sc = (OchSignalTypeCriterion) c;
- byte signalType = OpenFlowValueMapper.lookupOchSignalType(sc.signalType());
- mBuilder.setExact(MatchField.OCH_SIGTYPE, U8.of(signalType));
+ try {
+ OchSignalTypeCriterion sc = (OchSignalTypeCriterion) c;
+ byte signalType = OpenFlowValueMapper.lookupOchSignalType(sc.signalType());
+ mBuilder.setExact(MatchField.EXP_OCH_SIGTYPE, U8.of(signalType));
+ } catch (NoMappingFoundException e) {
+ log.warn(e.getMessage());
+ }
+ break;
+ case ODU_SIGID:
+ OduSignalIdCriterion oduSignalIdCriterion = (OduSignalIdCriterion) c;
+ OduSignalId oduSignalId = oduSignalIdCriterion.oduSignalId();
+ mBuilder.setExact(MatchField.EXP_ODU_SIG_ID,
+ new OduSignalID((short) oduSignalId.tributaryPortNumber(),
+ (short) oduSignalId.tributarySlotLength(),
+ oduSignalId.tributarySlotBitmap()));
+ break;
+ case ODU_SIGTYPE:
+ try {
+ OduSignalTypeCriterion oduSignalTypeCriterion = (OduSignalTypeCriterion) c;
+ byte oduSigType = OpenFlowValueMapper.lookupOduSignalType(oduSignalTypeCriterion.signalType());
+ mBuilder.setExact(MatchField.EXP_ODU_SIGTYPE, U8.of(oduSigType));
+ } catch (NoMappingFoundException e) {
+ log.warn(e.getMessage());
+ }
break;
case TUNNEL_ID:
TunnelIdCriterion tunnelId = (TunnelIdCriterion) c;
@@ -446,8 +481,24 @@ public abstract class FlowModBuilder {
mBuilder.setExact(MatchField.ARP_TPA,
IPv4Address.of(arpPaCriterion.ip().toInt()));
break;
+ case EXTENSION:
+ ExtensionCriterion extensionCriterion = (ExtensionCriterion) c;
+ OFOxm oxm = buildExtensionOxm(extensionCriterion.extensionSelector());
+ if (oxm == null) {
+ log.warn("Unable to build extension selector");
+ break;
+ }
+
+ if (oxm.isMasked()) {
+ mBuilder.setMasked(oxm.getMatchField(), oxm.getValue(), oxm.getMask());
+ } else {
+ mBuilder.setExact(oxm.getMatchField(), oxm.getValue());
+ }
+
+ break;
case MPLS_TC:
case PBB_ISID:
+ // TODO: need to implement PBB-ISID case when OpenFlowJ is ready
default:
log.warn("Match type {} not yet implemented.", c.type());
}
@@ -473,4 +524,21 @@ public abstract class FlowModBuilder {
return factory;
}
+ private OFOxm buildExtensionOxm(ExtensionSelector extension) {
+ if (!driverService.isPresent()) {
+ log.error("No driver service present");
+ return null;
+ }
+ Driver driver = driverService.get().getDriver(deviceId);
+ if (driver.hasBehaviour(ExtensionSelectorInterpreter.class)) {
+ DefaultDriverHandler handler =
+ new DefaultDriverHandler(new DefaultDriverData(driver, deviceId));
+ ExtensionSelectorInterpreter interpreter = handler.behaviour(ExtensionSelectorInterpreter.class);
+
+ return interpreter.mapSelector(factory(), extension);
+ }
+
+ return null;
+ }
+
}