diff options
Diffstat (limited to 'framework/src/onos/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java')
-rw-r--r-- | framework/src/onos/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java | 65 |
1 files changed, 61 insertions, 4 deletions
diff --git a/framework/src/onos/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java b/framework/src/onos/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java index 90def432..a3182e72 100644 --- a/framework/src/onos/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java +++ b/framework/src/onos/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer13.java @@ -18,8 +18,8 @@ package org.onosproject.provider.of.flow.impl; import com.google.common.collect.Lists; import org.onlab.packet.Ip4Address; import org.onlab.packet.Ip6Address; -import org.onosproject.net.DeviceId; import org.onosproject.net.OchSignal; +import org.onosproject.net.OduSignalId; import org.onosproject.net.PortNumber; import org.onosproject.net.driver.DefaultDriverData; import org.onosproject.net.driver.DefaultDriverHandler; @@ -36,6 +36,8 @@ import org.onosproject.net.flow.instructions.Instructions.SetQueueInstruction; import org.onosproject.net.flow.instructions.L0ModificationInstruction; import org.onosproject.net.flow.instructions.L0ModificationInstruction.ModLambdaInstruction; import org.onosproject.net.flow.instructions.L0ModificationInstruction.ModOchSignalInstruction; +import org.onosproject.net.flow.instructions.L1ModificationInstruction; +import org.onosproject.net.flow.instructions.L1ModificationInstruction.ModOduSignalIdInstruction; import org.onosproject.net.flow.instructions.L2ModificationInstruction; import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModEtherInstruction; import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModMplsBosInstruction; @@ -46,6 +48,9 @@ import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModVlanPc import org.onosproject.net.flow.instructions.L2ModificationInstruction.PushHeaderInstructions; import org.onosproject.net.flow.instructions.L3ModificationInstruction; import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModIPInstruction; +import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModArpIPInstruction; +import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModArpEthInstruction; +import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModArpOpInstruction; import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModIPv6FlowLabelInstruction; import org.onosproject.net.flow.instructions.L4ModificationInstruction; import org.onosproject.net.flow.instructions.L4ModificationInstruction.ModTransportPortInstruction; @@ -62,6 +67,7 @@ import org.projectfloodlight.openflow.protocol.action.OFActionSetQueue; import org.projectfloodlight.openflow.protocol.instruction.OFInstruction; import org.projectfloodlight.openflow.protocol.match.Match; 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; import org.projectfloodlight.openflow.types.IPv4Address; @@ -73,6 +79,7 @@ import org.projectfloodlight.openflow.types.OFBufferId; import org.projectfloodlight.openflow.types.OFGroup; import org.projectfloodlight.openflow.types.OFPort; import org.projectfloodlight.openflow.types.OFVlanVidMatch; +import org.projectfloodlight.openflow.types.OduSignalID; import org.projectfloodlight.openflow.types.TableId; import org.projectfloodlight.openflow.types.TransportPort; import org.projectfloodlight.openflow.types.U32; @@ -95,7 +102,6 @@ public class FlowModBuilderVer13 extends FlowModBuilder { private static final int OFPCML_NO_BUFFER = 0xffff; private final TrafficTreatment treatment; - private final DeviceId deviceId; /** * Constructor for a flow mod builder for OpenFlow 1.3. @@ -110,7 +116,6 @@ public class FlowModBuilderVer13 extends FlowModBuilder { super(flowRule, factory, xid, driverService); this.treatment = flowRule.treatment(); - this.deviceId = flowRule.deviceId(); } @Override @@ -233,6 +238,9 @@ public class FlowModBuilderVer13 extends FlowModBuilder { case L0MODIFICATION: actions.add(buildL0Modification(i)); break; + case L1MODIFICATION: + actions.add(buildL1Modification(i)); + break; case L2MODIFICATION: actions.add(buildL2Modification(i)); break; @@ -302,20 +310,31 @@ public class FlowModBuilderVer13 extends FlowModBuilder { private OFAction buildL0Modification(Instruction i) { L0ModificationInstruction l0m = (L0ModificationInstruction) i; + OFOxm<?> oxm = null; switch (l0m.subtype()) { case LAMBDA: return buildModLambdaInstruction((ModLambdaInstruction) i); case OCH: try { - return buildModOchSignalInstruction((ModOchSignalInstruction) i); + ModOchSignalInstruction modOchSignalInstruction = (ModOchSignalInstruction) l0m; + OchSignal signal = modOchSignalInstruction.lambda(); + byte gridType = OpenFlowValueMapper.lookupGridType(signal.gridType()); + byte channelSpacing = OpenFlowValueMapper.lookupChannelSpacing(signal.channelSpacing()); + oxm = factory().oxms().expOchSigId( + new CircuitSignalID(gridType, channelSpacing, + (short) signal.spacingMultiplier(), (short) signal.slotGranularity())); } catch (NoMappingFoundException e) { log.warn(e.getMessage()); break; } + break; default: log.warn("Unimplemented action type {}.", l0m.subtype()); break; } + if (oxm != null) { + return factory().actions().buildSetField().setField(oxm).build(); + } return null; } @@ -335,6 +354,31 @@ public class FlowModBuilderVer13 extends FlowModBuilder { )); } + private OFAction buildL1Modification(Instruction i) { + L1ModificationInstruction l1m = (L1ModificationInstruction) i; + OFOxm<?> oxm = null; + switch (l1m.subtype()) { + case ODU_SIGID: + ModOduSignalIdInstruction modOduSignalIdInstruction = (ModOduSignalIdInstruction) l1m; + OduSignalId oduSignalId = modOduSignalIdInstruction.oduSignalId(); + + OduSignalID oduSignalID = new OduSignalID((short) oduSignalId.tributaryPortNumber(), + (short) oduSignalId.tributarySlotLength(), + oduSignalId.tributarySlotBitmap()); + + oxm = factory().oxms().expOduSigId(oduSignalID); + break; + default: + log.warn("Unimplemented action type {}.", l1m.subtype()); + break; + } + + if (oxm != null) { + return factory().actions().buildSetField().setField(oxm).build(); + } + return null; + } + private OFAction buildL2Modification(Instruction i) { L2ModificationInstruction l2m = (L2ModificationInstruction) i; ModEtherInstruction eth; @@ -433,6 +477,19 @@ public class FlowModBuilderVer13 extends FlowModBuilder { int flowLabel = flowLabelInstruction.flowLabel(); oxm = factory().oxms().ipv6Flabel(IPv6FlowLabel.of(flowLabel)); break; + case ARP_SPA: + ModArpIPInstruction aip = (ModArpIPInstruction) i; + ip4 = aip.ip().getIp4Address(); + oxm = factory().oxms().arpSpa(IPv4Address.of(ip4.toInt())); + break; + case ARP_SHA: + ModArpEthInstruction ei = (ModArpEthInstruction) i; + oxm = factory().oxms().arpSha(MacAddress.of(ei.mac().toLong())); + break; + case ARP_OP: + ModArpOpInstruction oi = (ModArpOpInstruction) i; + oxm = factory().oxms().arpOp(ArpOpcode.of((int) oi.op())); + break; case DEC_TTL: return factory().actions().decNwTtl(); case TTL_IN: |