diff options
Diffstat (limited to 'framework/src/onos/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java')
-rw-r--r-- | framework/src/onos/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java | 65 |
1 files changed, 42 insertions, 23 deletions
diff --git a/framework/src/onos/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java b/framework/src/onos/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java index 1039d049..4d5b6b28 100644 --- a/framework/src/onos/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java +++ b/framework/src/onos/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowEntryBuilder.java @@ -15,15 +15,7 @@ */ package org.onosproject.provider.of.flow.impl; -import static org.onosproject.net.flow.criteria.Criteria.matchLambda; -import static org.onosproject.net.flow.criteria.Criteria.matchOchSignalType; -import static org.onosproject.provider.of.flow.impl.OpenFlowValueMapper.lookupChannelSpacing; -import static org.onosproject.provider.of.flow.impl.OpenFlowValueMapper.lookupGridType; -import static org.onosproject.provider.of.flow.impl.OpenFlowValueMapper.lookupOchSignalType; -import static org.slf4j.LoggerFactory.getLogger; - -import java.util.List; - +import com.google.common.collect.Lists; import org.onlab.packet.Ip4Address; import org.onlab.packet.Ip4Prefix; import org.onlab.packet.Ip6Address; @@ -36,6 +28,11 @@ import org.onosproject.core.DefaultGroupId; import org.onosproject.net.DeviceId; import org.onosproject.net.Lambda; import org.onosproject.net.PortNumber; +import org.onosproject.net.driver.DefaultDriverData; +import org.onosproject.net.driver.DefaultDriverHandler; +import org.onosproject.net.driver.Driver; +import org.onosproject.net.driver.DriverHandler; +import org.onosproject.net.driver.DriverService; import org.onosproject.net.flow.DefaultFlowEntry; import org.onosproject.net.flow.DefaultFlowRule; import org.onosproject.net.flow.DefaultTrafficSelector; @@ -47,6 +44,7 @@ import org.onosproject.net.flow.TrafficSelector; import org.onosproject.net.flow.TrafficTreatment; import org.onosproject.net.flow.instructions.Instructions; import org.onosproject.openflow.controller.Dpid; +import org.onosproject.openflow.controller.ExtensionInterpreter; import org.projectfloodlight.openflow.protocol.OFFlowMod; import org.projectfloodlight.openflow.protocol.OFFlowRemoved; import org.projectfloodlight.openflow.protocol.OFFlowStatsEntry; @@ -55,13 +53,13 @@ import org.projectfloodlight.openflow.protocol.action.OFActionCircuit; import org.projectfloodlight.openflow.protocol.action.OFActionExperimenter; import org.projectfloodlight.openflow.protocol.action.OFActionGroup; import org.projectfloodlight.openflow.protocol.action.OFActionOutput; -import org.projectfloodlight.openflow.protocol.action.OFActionSetQueue; import org.projectfloodlight.openflow.protocol.action.OFActionPopMpls; import org.projectfloodlight.openflow.protocol.action.OFActionSetDlDst; import org.projectfloodlight.openflow.protocol.action.OFActionSetDlSrc; import org.projectfloodlight.openflow.protocol.action.OFActionSetField; import org.projectfloodlight.openflow.protocol.action.OFActionSetNwDst; import org.projectfloodlight.openflow.protocol.action.OFActionSetNwSrc; +import org.projectfloodlight.openflow.protocol.action.OFActionSetQueue; import org.projectfloodlight.openflow.protocol.action.OFActionSetVlanPcp; import org.projectfloodlight.openflow.protocol.action.OFActionSetVlanVid; import org.projectfloodlight.openflow.protocol.instruction.OFInstruction; @@ -75,7 +73,6 @@ import org.projectfloodlight.openflow.protocol.oxm.OFOxm; import org.projectfloodlight.openflow.protocol.oxm.OFOxmOchSigidBasic; import org.projectfloodlight.openflow.protocol.ver13.OFFactoryVer13; import org.projectfloodlight.openflow.types.CircuitSignalID; -import org.projectfloodlight.openflow.types.EthType; import org.projectfloodlight.openflow.types.IPv4Address; import org.projectfloodlight.openflow.types.IPv6Address; import org.projectfloodlight.openflow.types.Masked; @@ -87,7 +84,14 @@ import org.projectfloodlight.openflow.types.U8; import org.projectfloodlight.openflow.types.VlanPcp; import org.slf4j.Logger; -import com.google.common.collect.Lists; +import java.util.List; + +import static org.onosproject.net.flow.criteria.Criteria.matchLambda; +import static org.onosproject.net.flow.criteria.Criteria.matchOchSignalType; +import static org.onosproject.provider.of.flow.impl.OpenFlowValueMapper.lookupChannelSpacing; +import static org.onosproject.provider.of.flow.impl.OpenFlowValueMapper.lookupGridType; +import static org.onosproject.provider.of.flow.impl.OpenFlowValueMapper.lookupOchSignalType; +import static org.slf4j.LoggerFactory.getLogger; public class FlowEntryBuilder { private final Logger log = getLogger(getClass()); @@ -108,7 +112,9 @@ public class FlowEntryBuilder { private final FlowType type; - public FlowEntryBuilder(Dpid dpid, OFFlowStatsEntry entry) { + private final DriverService driverService; + + public FlowEntryBuilder(Dpid dpid, OFFlowStatsEntry entry, DriverService driverService) { this.stat = entry; this.match = entry.getMatch(); this.instructions = getInstructions(entry); @@ -116,9 +122,10 @@ public class FlowEntryBuilder { this.removed = null; this.flowMod = null; this.type = FlowType.STAT; + this.driverService = driverService; } - public FlowEntryBuilder(Dpid dpid, OFFlowRemoved removed) { + public FlowEntryBuilder(Dpid dpid, OFFlowRemoved removed, DriverService driverService) { this.match = removed.getMatch(); this.removed = removed; @@ -127,10 +134,10 @@ public class FlowEntryBuilder { this.stat = null; this.flowMod = null; this.type = FlowType.REMOVED; - + this.driverService = driverService; } - public FlowEntryBuilder(Dpid dpid, OFFlowMod fm) { + public FlowEntryBuilder(Dpid dpid, OFFlowMod fm, DriverService driverService) { this.match = fm.getMatch(); this.dpid = dpid; this.instructions = getInstructions(fm); @@ -138,6 +145,7 @@ public class FlowEntryBuilder { this.flowMod = fm; this.stat = null; this.removed = null; + this.driverService = driverService; } public FlowEntry build(FlowEntryState... state) { @@ -309,7 +317,7 @@ public class FlowEntryBuilder { break; case SET_FIELD: OFActionSetField setField = (OFActionSetField) act; - handleSetField(builder, setField.getField()); + handleSetField(builder, setField); break; case POP_MPLS: OFActionPopMpls popMpls = (OFActionPopMpls) act; @@ -365,7 +373,8 @@ public class FlowEntryBuilder { } - private void handleSetField(TrafficTreatment.Builder builder, OFOxm<?> oxm) { + private void handleSetField(TrafficTreatment.Builder builder, OFActionSetField action) { + OFOxm<?> oxm = action.getField(); switch (oxm.getMatchField().id) { case VLAN_PCP: @SuppressWarnings("unchecked") @@ -434,6 +443,13 @@ public class FlowEntryBuilder { OFOxm<TransportPort> udpsrc = (OFOxm<TransportPort>) oxm; builder.setUdpSrc(TpPort.tpPort(udpsrc.getValue().getPort())); break; + case TUNNEL_IPV4_DST: + DriverHandler driver = getDriver(dpid); + ExtensionInterpreter interpreter = driver.behaviour(ExtensionInterpreter.class); + if (interpreter != null) { + builder.extension(interpreter.mapAction(action), DeviceId.deviceId(Dpid.uri(dpid))); + } + break; case ARP_OP: case ARP_SHA: case ARP_SPA: @@ -520,11 +536,7 @@ public class FlowEntryBuilder { break; case ETH_TYPE: int ethType = match.get(MatchField.ETH_TYPE).getValue(); - if (ethType == EthType.VLAN_FRAME.getValue()) { - builder.matchVlanId(VlanId.ANY); - } else { - builder.matchEthType((short) ethType); - } + builder.matchEthType((short) ethType); break; case VLAN_VID: VlanId vlanId = null; @@ -703,4 +715,11 @@ public class FlowEntryBuilder { } return builder.build(); } + + private DriverHandler getDriver(Dpid dpid) { + DeviceId deviceId = DeviceId.deviceId(Dpid.uri(dpid)); + Driver driver = driverService.getDriver(deviceId); + DriverHandler handler = new DefaultDriverHandler(new DefaultDriverData(driver, deviceId)); + return handler; + } } |