diff options
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.java | 76 |
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; + } + } |