diff --git a/src/main/java/net/floodlightcontroller/core/OFMessageFilterManager.java b/src/main/java/net/floodlightcontroller/core/OFMessageFilterManager.java index 07fa96e824afbc7caf603d124ab142678a564c6b..ca26b634381a7ff9133041f83f83e718c7223a42 100644 --- a/src/main/java/net/floodlightcontroller/core/OFMessageFilterManager.java +++ b/src/main/java/net/floodlightcontroller/core/OFMessageFilterManager.java @@ -213,15 +213,17 @@ public class OFMessageFilterManager implements IOFMessageListener { if (m.getType() == OFType.PACKET_IN) { eth = IFloodlightProvider.bcStore.get(cntx, IFloodlightProvider.CONTEXT_PI_PAYLOAD); - - } else if (m.getType() == OFType.PACKET_OUT) { eth = new Ethernet(); OFPacketOut p = (OFPacketOut) m; - eth.deserialize(p.getPacketData(), 0, p.getPacketData().length); + // No MAC match if packetOut doesn't have the packet. + if (p.getPacketData() == null) return null; + + eth.deserialize(p.getPacketData(), 0, p.getPacketData().length); } else if (m.getType() == OFType.FLOW_MOD) { - // no action performed. + // flow-mod can't be matched by mac. + return null; } if (eth == null) return null; @@ -238,10 +240,11 @@ public class OFMessageFilterManager implements IOFMessageListener { while (fieldIt.hasNext()) { String filterFieldType = fieldIt.next(); String filterFieldValue = filter.get(filterFieldType); - if (filterFieldType == "mac") { + if (filterFieldType.equals("mac")) { String srcMac = HexString.toHexString(eth.getSourceMACAddress()); String dstMac = HexString.toHexString(eth.getDestinationMACAddress()); + log.debug("srcMac: {}, dstMac: {}", srcMac, dstMac); if (filterFieldValue.equals(srcMac) || filterFieldValue.equals(dstMac)){ @@ -343,7 +346,7 @@ public class OFMessageFilterManager implements IOFMessageListener { @Override public boolean isCallbackOrderingPostreq(OFType type, String name) { - return false; + return (type == OFType.PACKET_IN && name.equals("learningswitch")); } @Override @@ -368,7 +371,7 @@ public class OFMessageFilterManager implements IOFMessageListener { log.error("sendPacket exception: {}", e); } } - + return Command.CONTINUE; } @@ -421,7 +424,6 @@ public class OFMessageFilterManager implements IOFMessageListener { OFPacketIn pktIn = (OFPacketIn)msg; packet.setSwPortTuple(new SwitchPortTuple(sw.getId(), pktIn.getInPort())); bb = ChannelBuffers.buffer(pktIn.getLength()); - log.debug("Packet-In length is: {}", pktIn.getLength()); pktIn.writeTo(bb); packet.setData(getData(sw, msg, cntx)); break; @@ -473,7 +475,7 @@ public class OFMessageFilterManager implements IOFMessageListener { } } - private byte[] getData(IOFSwitch sw, OFMessage msg, FloodlightContext cntx) { + public String getDataAsString(IOFSwitch sw, OFMessage msg, FloodlightContext cntx) { Ethernet eth; StringBuffer sb = new StringBuffer(""); @@ -488,7 +490,7 @@ public class OFMessageFilterManager implements IOFMessageListener { case PACKET_IN: OFPacketIn pktIn = (OFPacketIn) msg; sb.append("packet_in [ "); - sb.append(HexString.toHexString(sw.getId())); + sb.append(sw.getStringId()); sb.append(" -> Controller"); sb.append(" ]"); @@ -558,10 +560,15 @@ public class OFMessageFilterManager implements IOFMessageListener { } sb.append("\n\n"); - return sb.toString().getBytes(); + return sb.toString(); + + } + + public byte[] getData(IOFSwitch sw, OFMessage msg, FloodlightContext cntx) { + return this.getDataAsString(sw, msg, cntx).getBytes(); } - private String getStringFromEthernetPacket(Ethernet eth) { + public String getStringFromEthernetPacket(Ethernet eth) { StringBuffer sb = new StringBuffer("\n"); diff --git a/src/main/java/net/floodlightcontroller/core/internal/Controller.java b/src/main/java/net/floodlightcontroller/core/internal/Controller.java index 9e63ec49da37d11f61e253bc3fcdaa484f6e171b..a94ef0f6fbcf4eb9334238eb127db31e6f291e50 100644 --- a/src/main/java/net/floodlightcontroller/core/internal/Controller.java +++ b/src/main/java/net/floodlightcontroller/core/internal/Controller.java @@ -756,6 +756,16 @@ public class Controller eth); } + // Print the packet-in for debugging purposes at this point + // The context would have the necessary information for + // the OFMessageFilterManager's getDataToString to work + // for packet-ins. + if (log.isDebugEnabled()) { + String str = messageFilterManager.getDataAsString(sw, m, bc); + log.debug("{}", str); + } + + // Get the starting time (overall and per-component) of // the processing chain for this packet if performance // monitoring is turned on @@ -785,7 +795,6 @@ public class Controller } else { log.error("Unhandled OF Message: {} from {}", m, sw); } - break; } } @@ -1001,6 +1010,11 @@ public class Controller @Override public void handleOutgoingMessage(IOFSwitch sw, OFMessage m, FloodlightContext bc) { + if (log.isDebugEnabled()) { + String str = messageFilterManager.getDataAsString(sw, m, bc); + log.debug("{}", str); + } + List<IOFMessageListener> listeners = null; if (messageListeners.containsKey(m.getType())) { listeners = @@ -1312,7 +1326,7 @@ public class Controller final ServerBootstrap bootstrap = new ServerBootstrap( new NioServerSocketChannelFactory( Executors.newCachedThreadPool(), - Executors.newCachedThreadPool(), 1)); + Executors.newCachedThreadPool())); bootstrap.setOption("reuseAddr", true); bootstrap.setOption("child.keepAlive", true); diff --git a/src/test/java/net/floodlightcontroller/core/internal/ControllerTest.java b/src/test/java/net/floodlightcontroller/core/internal/ControllerTest.java index 516454acac62cab05933fb71aad78ef11b57c7c0..42ed0939695654014d65ff9b0d976921414d9160 100644 --- a/src/test/java/net/floodlightcontroller/core/internal/ControllerTest.java +++ b/src/test/java/net/floodlightcontroller/core/internal/ControllerTest.java @@ -153,7 +153,7 @@ public class ControllerTest extends FloodlightTestCase { reset(test1, test2, sw); expect(test1.receive(eq(sw), eq(pi), isA(FloodlightContext.class))).andReturn(Command.STOP); expect(test1.getId()).andReturn(0).anyTimes(); - expect(sw.getStringId()).andReturn("00:00:00:00:00:00:00"); + expect(sw.getStringId()).andReturn("00:00:00:00:00:00:00").anyTimes(); expect(sw.getFeaturesReply()).andReturn(new OFFeaturesReply()).anyTimes(); replay(test1, test2, sw); controller.handleMessage(sw, pi, null);