diff --git a/lib/openflowj-2.0.0-SNAPSHOT.jar b/lib/openflowj-2.0.0-SNAPSHOT.jar index 42b49cbd10d259a432cb3f72930b9d2237a7aef3..7f25d80d801bfca393c2ea807f9df8349c418fac 100644 Binary files a/lib/openflowj-2.0.0-SNAPSHOT.jar and b/lib/openflowj-2.0.0-SNAPSHOT.jar differ diff --git a/src/main/java/net/floodlightcontroller/forwarding/Forwarding.java b/src/main/java/net/floodlightcontroller/forwarding/Forwarding.java index aef485f3a8c727fff837ccd9ca9f43ea92ab28d5..19a51d1eb77eb45d8f729447e153a0ddeedb7012 100644 --- a/src/main/java/net/floodlightcontroller/forwarding/Forwarding.java +++ b/src/main/java/net/floodlightcontroller/forwarding/Forwarding.java @@ -51,6 +51,7 @@ import net.floodlightcontroller.routing.IRoutingService; import net.floodlightcontroller.routing.Route; import net.floodlightcontroller.topology.ITopologyService; import net.floodlightcontroller.topology.NodePortTuple; +import net.floodlightcontroller.util.FlowModUtils; import net.floodlightcontroller.util.OFDPAUtils; import net.floodlightcontroller.util.OFPortMode; import net.floodlightcontroller.util.OFPortModeTuple; @@ -139,8 +140,9 @@ public class Forwarding extends ForwardingBase implements IFloodlightModule, IOF .setIdleTimeout(FLOWMOD_DEFAULT_IDLE_TIMEOUT) .setBufferId(OFBufferId.NO_BUFFER) .setMatch(m) - .setActions(actions) // empty list .setPriority(FLOWMOD_DEFAULT_PRIORITY); + + FlowModUtils.setActions(fmb, actions, sw); try { if (log.isDebugEnabled()) { diff --git a/src/main/java/net/floodlightcontroller/routing/ForwardingBase.java b/src/main/java/net/floodlightcontroller/routing/ForwardingBase.java index 5cf593b3d4dcc353288c251530066d588ac16d2e..2cf719931d20e71f150e59f254fdedd978aab14e 100644 --- a/src/main/java/net/floodlightcontroller/routing/ForwardingBase.java +++ b/src/main/java/net/floodlightcontroller/routing/ForwardingBase.java @@ -41,6 +41,7 @@ import net.floodlightcontroller.routing.IRoutingDecision; import net.floodlightcontroller.routing.Route; import net.floodlightcontroller.topology.ITopologyService; import net.floodlightcontroller.topology.NodePortTuple; +import net.floodlightcontroller.util.FlowModUtils; import net.floodlightcontroller.util.MatchUtils; import net.floodlightcontroller.util.OFDPAUtils; import net.floodlightcontroller.util.OFMessageDamper; @@ -247,7 +248,6 @@ public abstract class ForwardingBase implements IOFMessageListener { } fmb.setMatch(mb.build()) - .setActions(actions) .setIdleTimeout(FLOWMOD_DEFAULT_IDLE_TIMEOUT) .setHardTimeout(FLOWMOD_DEFAULT_HARD_TIMEOUT) .setBufferId(OFBufferId.NO_BUFFER) @@ -255,6 +255,8 @@ public abstract class ForwardingBase implements IOFMessageListener { .setOutPort(outPort) .setPriority(FLOWMOD_DEFAULT_PRIORITY); + FlowModUtils.setActions(fmb, actions, sw); + try { if (log.isTraceEnabled()) { log.trace("Pushing Route flowmod routeIndx={} " + @@ -445,8 +447,9 @@ public abstract class ForwardingBase implements IOFMessageListener { .setIdleTimeout(FLOWMOD_DEFAULT_IDLE_TIMEOUT) .setPriority(FLOWMOD_DEFAULT_PRIORITY) .setBufferId(OFBufferId.NO_BUFFER) - .setMatch(mb.build()) - .setActions(actions); + .setMatch(mb.build()); + + FlowModUtils.setActions(fmb, actions, sw); log.debug("write drop flow-mod sw={} match={} flow-mod={}", new Object[] { sw, mb.build(), fmb.build() }); diff --git a/src/main/java/net/floodlightcontroller/util/FlowModUtils.java b/src/main/java/net/floodlightcontroller/util/FlowModUtils.java index 9a8d6cdbdeaada086daa8f8627da1c426d3f5f1c..8f7645b725bdcc467b6c5e98fce6b3247d7cffe3 100644 --- a/src/main/java/net/floodlightcontroller/util/FlowModUtils.java +++ b/src/main/java/net/floodlightcontroller/util/FlowModUtils.java @@ -1,5 +1,10 @@ package net.floodlightcontroller.util; +import java.util.Collections; +import java.util.List; + +import net.floodlightcontroller.core.IOFSwitch; + import org.projectfloodlight.openflow.protocol.OFFactories; import org.projectfloodlight.openflow.protocol.OFFlowAdd; import org.projectfloodlight.openflow.protocol.OFFlowDelete; @@ -8,6 +13,8 @@ import org.projectfloodlight.openflow.protocol.OFFlowMod; import org.projectfloodlight.openflow.protocol.OFFlowModify; import org.projectfloodlight.openflow.protocol.OFFlowModifyStrict; import org.projectfloodlight.openflow.protocol.OFVersion; +import org.projectfloodlight.openflow.protocol.action.OFAction; +import org.projectfloodlight.openflow.protocol.instruction.OFInstruction; /** * Convert an OFFlowMod to a specific OFFlowMod-OFFlowModCommand. @@ -221,4 +228,23 @@ public class FlowModUtils { .build(); } } + + /** + * Sets the actions in fmb according to the sw version. + * + * @param fmb the FlowMod Builder that is being built + * @param actions the actions to set + * @param sw the switch that will receive the FlowMod + */ + public static void setActions(OFFlowMod.Builder fmb, + List<OFAction> actions, IOFSwitch sw) { + if (sw.getOFFactory().getVersion().compareTo(OFVersion.OF_11) >= 0) { + // Instructions are used starting in OF 1.1 + fmb.setInstructions(Collections.singletonList((OFInstruction) sw + .getOFFactory().instructions().applyActions(actions))); + } else { + // OF 1.0 only supports actions + fmb.setActions(actions); + } + } }