diff --git a/src/main/java/net/floodlightcontroller/forwarding/Forwarding.java b/src/main/java/net/floodlightcontroller/forwarding/Forwarding.java index 1781f0874e0e748bc7d4cf331e8fd60bfe8bbc93..61f165d0e97de36a89aa2504005b17d03d8e958d 100644 --- a/src/main/java/net/floodlightcontroller/forwarding/Forwarding.java +++ b/src/main/java/net/floodlightcontroller/forwarding/Forwarding.java @@ -17,7 +17,6 @@ package net.floodlightcontroller.forwarding; - import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -60,40 +59,65 @@ public class Forwarding extends ForwardingBase implements IFloodlightModule { protected static Logger log = LoggerFactory.getLogger(Forwarding.class); @Override - public Command processPacketInMessage(IOFSwitch sw, OFPacketIn pi, IRoutingDecision decision, FloodlightContext cntx) { + public Command processPacketInMessage(IOFSwitch sw, OFPacketIn pi, IRoutingDecision decision, + FloodlightContext cntx) { Ethernet eth = IFloodlightProviderService.bcStore.get(cntx, - IFloodlightProviderService.CONTEXT_PI_PAYLOAD); + IFloodlightProviderService.CONTEXT_PI_PAYLOAD); + // If a decision has been made we obey it + // otherwise we just forward if (decision != null) { - //log.info("Decision made for packet!"); - if (decision.getRoutingAction() == IRoutingDecision.RoutingAction.DROP) { - log.info("dropping packet as per decision"); - doDropFlow(sw, pi, decision, cntx); - return Command.CONTINUE; - } - } else { - //log.info("No decision found!"); - } - - if (eth.isBroadcast() || eth.isMulticast()) { - // For now we treat multicast as broadcast - doFlood(sw, pi, cntx); + if (log.isTraceEnabled()) { + log.trace("Forwaring decision={} was made for PacketIn={}", + decision.getRoutingAction().toString(), + pi); + } + + switch(decision.getRoutingAction()) { + case NONE: + // don't do anything + return Command.CONTINUE; + case FORWARD: + doForwardFlow(sw, pi, cntx, false); + return Command.CONTINUE; + case MULTICAST: + // treat as broadcast + doFlood(sw, pi, cntx); + return Command.CONTINUE; + case DROP: + doDropFlow(sw, pi, decision, cntx); + return Command.CONTINUE; + default: + log.error("Unexpected decision made for this packet-in={}", + pi, decision.getRoutingAction()); + return Command.CONTINUE; + } } else { - doForwardFlow(sw, pi, cntx, false); + if (log.isTraceEnabled()) { + log.trace("No decision was made for PacketIn={}, forwarding", + pi); + } + + if (eth.isBroadcast() || eth.isMulticast()) { + // For now we treat multicast as broadcast + doFlood(sw, pi, cntx); + } else { + doForwardFlow(sw, pi, cntx, false); + } } return Command.CONTINUE; } protected void doDropFlow(IOFSwitch sw, OFPacketIn pi, IRoutingDecision decision, FloodlightContext cntx) { - // initialize match structure and populate it using the packet - OFMatch match = new OFMatch(); - match.loadFromPacket(pi.getPacketData(), pi.getInPort()); - if (decision.getWildcards() != null) { - match.setWildcards(decision.getWildcards()); - } - - // Create flow-mod based on packet-in and src-switch + // initialize match structure and populate it using the packet + OFMatch match = new OFMatch(); + match.loadFromPacket(pi.getPacketData(), pi.getInPort()); + if (decision.getWildcards() != null) { + match.setWildcards(decision.getWildcards()); + } + + // Create flow-mod based on packet-in and src-switch OFFlowMod fm = (OFFlowMod) floodlightProvider.getOFMessageFactory() .getMessage(OFType.FLOW_MOD); @@ -110,8 +134,10 @@ public class Forwarding extends ForwardingBase implements IFloodlightModule { .setLengthU(OFFlowMod.MINIMUM_LENGTH); // +OFActionOutput.MINIMUM_LENGTH); try { - log.debug("write drop flow-mod sw={} match={} flow-mod={}", - new Object[] { sw, match, fm }); + if (log.isDebugEnabled()) { + log.debug("write drop flow-mod sw={} match={} flow-mod={}", + new Object[] { sw, match, fm }); + } sw.write(fm, cntx); } catch (IOException e) { log.error("Failure writing drop flow mod", e);