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