From 7390524f84cc7e823a2d1a5262d99548f5363552 Mon Sep 17 00:00:00 2001 From: Mandeep Dhami <mandeep.dhami@bigswitch.com> Date: Wed, 25 Jul 2012 18:24:31 -0700 Subject: [PATCH] Added more instrumentation on receiving curroupted packets --- .../protocol/factory/BasicFactory.java | 14 ++++++++- .../factory/MessageParseException.java | 2 ++ .../openflow/protocol/BasicFactoryTest.java | 31 +++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/openflow/protocol/factory/BasicFactory.java b/src/main/java/org/openflow/protocol/factory/BasicFactory.java index 553664dd5..e0296e3f5 100644 --- a/src/main/java/org/openflow/protocol/factory/BasicFactory.java +++ b/src/main/java/org/openflow/protocol/factory/BasicFactory.java @@ -113,7 +113,19 @@ public class BasicFactory implements OFMessageFactory, OFActionFactory, return ofm; } catch (Exception e) { - throw new MessageParseException(e); + /* Write the offending data along with the error message */ + data.resetReaderIndex(); + int len = data.readableBytes(); + StringBuffer sb = new StringBuffer(); + for (int i=0 ; i<len; i++) { + sb.append(String.format(" %02x", data.getUnsignedByte(i))); + if (i%16 == 15) sb.append("\n"); + } + String msg = + "Message Parse Error for packet: " + sb.toString() + + "\nException: " + e.toString(); + + throw new MessageParseException(msg, e); } } diff --git a/src/main/java/org/openflow/protocol/factory/MessageParseException.java b/src/main/java/org/openflow/protocol/factory/MessageParseException.java index 328ee583d..b685e5d28 100644 --- a/src/main/java/org/openflow/protocol/factory/MessageParseException.java +++ b/src/main/java/org/openflow/protocol/factory/MessageParseException.java @@ -15,6 +15,7 @@ public class MessageParseException extends Exception { public MessageParseException(String message, Throwable cause) { super(message, cause); + this.setStackTrace(cause.getStackTrace()); } public MessageParseException(String message) { @@ -23,5 +24,6 @@ public class MessageParseException extends Exception { public MessageParseException(Throwable cause) { super(cause); + this.setStackTrace(cause.getStackTrace()); } } diff --git a/src/test/java/org/openflow/protocol/BasicFactoryTest.java b/src/test/java/org/openflow/protocol/BasicFactoryTest.java index 95f61df24..05f8e124b 100644 --- a/src/test/java/org/openflow/protocol/BasicFactoryTest.java +++ b/src/test/java/org/openflow/protocol/BasicFactoryTest.java @@ -28,6 +28,7 @@ import org.openflow.util.U16; import junit.framework.TestCase; public class BasicFactoryTest extends TestCase { + public void testCreateAndParse() throws MessageParseException { BasicFactory factory = new BasicFactory(); OFMessage m = factory.getMessage(OFType.HELLO); @@ -46,4 +47,34 @@ public class BasicFactoryTest extends TestCase { TestCase.assertEquals(message.size(), 1); TestCase.assertTrue(message.get(0).getType() == OFType.ECHO_REQUEST); } + + public void testInvalidMsgParse() throws MessageParseException { + BasicFactory factory = new BasicFactory(); + OFMessage m = factory.getMessage(OFType.HELLO); + m.setVersion((byte) 1); + m.setType(OFType.ECHO_REQUEST); + m.setLength(U16.t(16)); + m.setXid(0xdeadbeef); + ChannelBuffer bb = ChannelBuffers.dynamicBuffer(); + m.writeTo(bb); + List<OFMessage> message = factory.parseMessage(bb); + TestCase.assertNull(message); + } + + public void testCurrouptedMsgParse() throws MessageParseException { + BasicFactory factory = new BasicFactory(); + OFMessage m = factory.getMessage(OFType.HELLO); + m.setVersion((byte) 1); + m.setType(OFType.ERROR); + m.setLength(U16.t(8)); + m.setXid(0xdeadbeef); + ChannelBuffer bb = ChannelBuffers.dynamicBuffer(); + m.writeTo(bb); + try { + factory.parseMessage(bb); + } + catch(Exception e) { + TestCase.assertEquals(MessageParseException.class, e.getClass()); + } + } } -- GitLab