diff options
author | Ashlee Young <ashlee@onosfw.com> | 2015-09-09 22:15:21 -0700 |
---|---|---|
committer | Ashlee Young <ashlee@onosfw.com> | 2015-09-09 22:15:21 -0700 |
commit | 13d05bc8458758ee39cb829098241e89616717ee (patch) | |
tree | 22a4d1ce65f15952f07a3df5af4b462b4697cb3a /framework/src/onos/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer10.java | |
parent | 6139282e1e93c2322076de4b91b1c85d0bc4a8b3 (diff) |
ONOS checkin based on commit tag e796610b1f721d02f9b0e213cf6f7790c10ecd60
Change-Id: Ife8810491034fe7becdba75dda20de4267bd15cd
Diffstat (limited to 'framework/src/onos/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer10.java')
-rw-r--r-- | framework/src/onos/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer10.java | 230 |
1 files changed, 230 insertions, 0 deletions
diff --git a/framework/src/onos/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer10.java b/framework/src/onos/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer10.java new file mode 100644 index 00000000..c9de4500 --- /dev/null +++ b/framework/src/onos/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/FlowModBuilderVer10.java @@ -0,0 +1,230 @@ +/* + * Copyright 2014-2015 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onosproject.provider.of.flow.impl; + +import org.onlab.packet.Ip4Address; +import org.onosproject.net.PortNumber; +import org.onosproject.net.flow.FlowRule; +import org.onosproject.net.flow.TrafficTreatment; +import org.onosproject.net.flow.instructions.Instruction; +import org.onosproject.net.flow.instructions.Instructions.OutputInstruction; +import org.onosproject.net.flow.instructions.L2ModificationInstruction; +import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModEtherInstruction; +import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModVlanIdInstruction; +import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModVlanPcpInstruction; +import org.onosproject.net.flow.instructions.L3ModificationInstruction; +import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModIPInstruction; +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.OFFlowModFlags; +import org.projectfloodlight.openflow.protocol.action.OFAction; +import org.projectfloodlight.openflow.protocol.action.OFActionOutput; +import org.projectfloodlight.openflow.protocol.match.Match; +import org.projectfloodlight.openflow.types.IPv4Address; +import org.projectfloodlight.openflow.types.MacAddress; +import org.projectfloodlight.openflow.types.OFBufferId; +import org.projectfloodlight.openflow.types.OFPort; +import org.projectfloodlight.openflow.types.U64; +import org.projectfloodlight.openflow.types.VlanPcp; +import org.projectfloodlight.openflow.types.VlanVid; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.Optional; + +/** + * Flow mod builder for OpenFlow 1.0. + */ +public class FlowModBuilderVer10 extends FlowModBuilder { + + private final Logger log = LoggerFactory.getLogger(getClass()); + private static final int OFPCML_NO_BUFFER = 0xffff; + + private final TrafficTreatment treatment; + + /** + * Constructor for a flow mod builder for OpenFlow 1.0. + * + * @param flowRule the flow rule to transform into a flow mod + * @param factory the OpenFlow factory to use to build the flow mod + * @param xid the transaction ID + */ + protected FlowModBuilderVer10(FlowRule flowRule, + OFFactory factory, Optional<Long> xid) { + super(flowRule, factory, xid); + + this.treatment = flowRule.treatment(); + } + + @Override + public OFFlowAdd buildFlowAdd() { + Match match = buildMatch(); + List<OFAction> actions = buildActions(); + + long cookie = flowRule().id().value(); + + + OFFlowAdd fm = factory().buildFlowAdd() + .setXid(xid) + .setCookie(U64.of(cookie)) + .setBufferId(OFBufferId.NO_BUFFER) + .setActions(actions) + .setMatch(match) + .setFlags(Collections.singleton(OFFlowModFlags.SEND_FLOW_REM)) + .setPriority(flowRule().priority()) + .build(); + + return fm; + } + + @Override + public OFFlowMod buildFlowMod() { + Match match = buildMatch(); + List<OFAction> actions = buildActions(); + + long cookie = flowRule().id().value(); + + OFFlowMod fm = factory().buildFlowModify() + .setXid(xid) + .setCookie(U64.of(cookie)) + .setBufferId(OFBufferId.NO_BUFFER) + .setActions(actions) + .setMatch(match) + .setFlags(Collections.singleton(OFFlowModFlags.SEND_FLOW_REM)) + .setPriority(flowRule().priority()) + .build(); + + return fm; + } + + @Override + public OFFlowDelete buildFlowDel() { + Match match = buildMatch(); + + long cookie = flowRule().id().value(); + + OFFlowDelete fm = factory().buildFlowDelete() + .setXid(xid) + .setCookie(U64.of(cookie)) + .setBufferId(OFBufferId.NO_BUFFER) + .setMatch(match) + .setFlags(Collections.singleton(OFFlowModFlags.SEND_FLOW_REM)) + .setPriority(flowRule().priority()) + .build(); + + return fm; + } + + private List<OFAction> buildActions() { + List<OFAction> acts = new LinkedList<>(); + OFAction act; + if (treatment == null) { + return acts; + } + for (Instruction i : treatment.immediate()) { + switch (i.type()) { + case DROP: + log.warn("Saw drop action; assigning drop action"); + return Collections.emptyList(); + case L2MODIFICATION: + act = buildL2Modification(i); + if (act != null) { + acts.add(buildL2Modification(i)); + } + break; + case L3MODIFICATION: + act = buildL3Modification(i); + if (act != null) { + acts.add(buildL3Modification(i)); + } + break; + case OUTPUT: + OutputInstruction out = (OutputInstruction) i; + OFActionOutput.Builder action = factory().actions().buildOutput() + .setPort(OFPort.of((int) out.port().toLong())); + if (out.port().equals(PortNumber.CONTROLLER)) { + action.setMaxLen(OFPCML_NO_BUFFER); + } + acts.add(action.build()); + break; + case L0MODIFICATION: + case GROUP: + case TABLE: + case METADATA: + log.warn("Instruction type {} not supported with protocol version {}", + i.type(), factory().getVersion()); + break; + default: + log.warn("Instruction type {} not yet implemented.", i.type()); + } + } + + return acts; + } + + private OFAction buildL3Modification(Instruction i) { + L3ModificationInstruction l3m = (L3ModificationInstruction) i; + ModIPInstruction ip; + Ip4Address ip4; + switch (l3m.subtype()) { + case IPV4_SRC: + ip = (ModIPInstruction) i; + ip4 = ip.ip().getIp4Address(); + return factory().actions().setNwSrc(IPv4Address.of(ip4.toInt())); + case IPV4_DST: + ip = (ModIPInstruction) i; + ip4 = ip.ip().getIp4Address(); + return factory().actions().setNwDst(IPv4Address.of(ip4.toInt())); + default: + log.warn("Unimplemented action type {}.", l3m.subtype()); + break; + } + return null; + } + + private OFAction buildL2Modification(Instruction i) { + L2ModificationInstruction l2m = (L2ModificationInstruction) i; + ModEtherInstruction eth; + switch (l2m.subtype()) { + case ETH_DST: + eth = (ModEtherInstruction) l2m; + return factory().actions().setDlDst(MacAddress.of(eth.mac().toLong())); + case ETH_SRC: + eth = (ModEtherInstruction) l2m; + return factory().actions().setDlSrc(MacAddress.of(eth.mac().toLong())); + case VLAN_ID: + ModVlanIdInstruction vlanId = (ModVlanIdInstruction) l2m; + return factory().actions().setVlanVid(VlanVid.ofVlan(vlanId.vlanId().toShort())); + case VLAN_PCP: + ModVlanPcpInstruction vlanPcp = (ModVlanPcpInstruction) l2m; + return factory().actions().setVlanPcp(VlanPcp.of(vlanPcp.vlanPcp())); + case VLAN_POP: + return factory().actions().stripVlan(); + case VLAN_PUSH: + return null; + default: + log.warn("Unimplemented action type {}.", l2m.subtype()); + break; + } + return null; + } + +} |