From c87ae730d1cf8eb5f7b507da40ca0bc1d319d7c1 Mon Sep 17 00:00:00 2001
From: Shudong Zhou <shudongzhou@gmail.com>
Date: Mon, 24 Jun 2013 18:34:20 -0700
Subject: [PATCH] Mechanical change to use PacketParsingException

---
 .../net/floodlightcontroller/packet/BSN.java  |  3 ++-
 .../floodlightcontroller/packet/BSNPROBE.java |  3 ++-
 .../packet/BasePacket.java                    |  7 +++++-
 .../floodlightcontroller/packet/Ethernet.java | 25 +++++++++++++++----
 .../net/floodlightcontroller/packet/ICMP.java |  3 ++-
 .../floodlightcontroller/packet/IPacket.java  |  3 ++-
 .../net/floodlightcontroller/packet/IPv4.java |  3 ++-
 .../net/floodlightcontroller/packet/TCP.java  |  3 ++-
 .../net/floodlightcontroller/packet/UDP.java  |  3 ++-
 9 files changed, 40 insertions(+), 13 deletions(-)

diff --git a/src/main/java/net/floodlightcontroller/packet/BSN.java b/src/main/java/net/floodlightcontroller/packet/BSN.java
index 27c8f70df..2540f2081 100644
--- a/src/main/java/net/floodlightcontroller/packet/BSN.java
+++ b/src/main/java/net/floodlightcontroller/packet/BSN.java
@@ -96,7 +96,8 @@ public class BSN extends BasePacket {
     }
 
     @Override
-    public IPacket deserialize(byte[] data, int offset, int length) {
+    public IPacket deserialize(byte[] data, int offset, int length)
+            throws PacketParsingException {
         ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
         
         int magic = bb.getInt();
diff --git a/src/main/java/net/floodlightcontroller/packet/BSNPROBE.java b/src/main/java/net/floodlightcontroller/packet/BSNPROBE.java
index 1343f769b..c9115eacb 100644
--- a/src/main/java/net/floodlightcontroller/packet/BSNPROBE.java
+++ b/src/main/java/net/floodlightcontroller/packet/BSNPROBE.java
@@ -125,7 +125,8 @@ public class BSNPROBE extends BasePacket {
     }
 
     @Override
-    public IPacket deserialize(byte[] data, int offset, int length) {
+    public IPacket deserialize(byte[] data, int offset, int length)
+            throws PacketParsingException {
         ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
         
         controllerId = bb.getLong();
diff --git a/src/main/java/net/floodlightcontroller/packet/BasePacket.java b/src/main/java/net/floodlightcontroller/packet/BasePacket.java
index eed530c03..9ed2871aa 100644
--- a/src/main/java/net/floodlightcontroller/packet/BasePacket.java
+++ b/src/main/java/net/floodlightcontroller/packet/BasePacket.java
@@ -113,7 +113,12 @@ public abstract class BasePacket implements IPacket {
         // cloning. Not the most efficient way but simple. We can revisit
         // if we hit performance problems.
         byte[] data = this.serialize();
-        pkt.deserialize(this.serialize(), 0, data.length);
+        try {
+            pkt.deserialize(this.serialize(), 0, data.length);
+        } catch (PacketParsingException e) {
+            // This shouldn't happen here, since we already deserialized it once
+            return new Data(data);
+        }
         pkt.setParent(this.parent);
         return pkt;
     }
diff --git a/src/main/java/net/floodlightcontroller/packet/Ethernet.java b/src/main/java/net/floodlightcontroller/packet/Ethernet.java
index 4fc238076..438e786a3 100644
--- a/src/main/java/net/floodlightcontroller/packet/Ethernet.java
+++ b/src/main/java/net/floodlightcontroller/packet/Ethernet.java
@@ -262,7 +262,7 @@ public class Ethernet extends BasePacket {
             try {
                 payload = clazz.newInstance();
                 this.payload = payload.deserialize(data, bb.position(), bb.limit()-bb.position());
-            } catch (Exception e) {
+            } catch (PacketParsingException e) {
                 if (log.isTraceEnabled()) {
                     log.trace("Failed to parse ethernet packet {}->{}" +
                             " payload as {}, treat as plain ethernet packet",
@@ -271,12 +271,27 @@ public class Ethernet extends BasePacket {
                                           clazz.getClass().getName()});
                     log.trace("Exception from parsing {}", e);
                 }
-                payload = new Data();
-                this.payload = payload.deserialize(data, bb.position(), bb.limit()-bb.position());
+                this.payload = new Data(data);
+            } catch (InstantiationException e) {
+                if (log.isTraceEnabled()) {
+                    log.trace("Fail to instantiate class {}, {}",
+                              clazz.getClass().getName(), e);
+                }
+                this.payload = new Data(data);
+            } catch (IllegalAccessException e) {
+                if (log.isTraceEnabled()) {
+                    log.trace("Fail to access class for instantiation {}, {}",
+                              clazz.getClass().getName(), e);
+                }
+                this.payload = new Data(data);
+            } catch (RuntimeException e) {
+                if (log.isTraceEnabled()) {
+                    log.trace("Runtime exception during packet parsing {}", e);
+                }
+                this.payload = new Data(data);
             }
         } else {
-            payload = new Data();
-            this.payload = payload.deserialize(data, bb.position(), bb.limit()-bb.position());
+            this.payload = new Data(data);
         }
         this.payload.setParent(this);
         return this;
diff --git a/src/main/java/net/floodlightcontroller/packet/ICMP.java b/src/main/java/net/floodlightcontroller/packet/ICMP.java
index 6b02b5bd5..298810648 100644
--- a/src/main/java/net/floodlightcontroller/packet/ICMP.java
+++ b/src/main/java/net/floodlightcontroller/packet/ICMP.java
@@ -184,7 +184,8 @@ public class ICMP extends BasePacket {
     }
 
     @Override
-    public IPacket deserialize(byte[] data, int offset, int length) {
+    public IPacket deserialize(byte[] data, int offset, int length)
+            throws PacketParsingException {
         ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
         this.icmpType = bb.get();
         this.icmpCode = bb.get();
diff --git a/src/main/java/net/floodlightcontroller/packet/IPacket.java b/src/main/java/net/floodlightcontroller/packet/IPacket.java
index 02376cd99..4eaaada8e 100644
--- a/src/main/java/net/floodlightcontroller/packet/IPacket.java
+++ b/src/main/java/net/floodlightcontroller/packet/IPacket.java
@@ -67,7 +67,8 @@ public interface IPacket {
      * @param length length of the data to deserialize
      * @return the deserialized data
      */
-    public IPacket deserialize(byte[] data, int offset, int length);
+    public IPacket deserialize(byte[] data, int offset, int length)
+            throws PacketParsingException;
     
     /** Clone this packet and its payload packet but not its parent. 
      * 
diff --git a/src/main/java/net/floodlightcontroller/packet/IPv4.java b/src/main/java/net/floodlightcontroller/packet/IPv4.java
index 327ef7fac..064ad31e8 100644
--- a/src/main/java/net/floodlightcontroller/packet/IPv4.java
+++ b/src/main/java/net/floodlightcontroller/packet/IPv4.java
@@ -353,7 +353,8 @@ public class IPv4 extends BasePacket {
     }
 
     @Override
-    public IPacket deserialize(byte[] data, int offset, int length) {
+    public IPacket deserialize(byte[] data, int offset, int length)
+            throws PacketParsingException {
         ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
         short sscratch;
 
diff --git a/src/main/java/net/floodlightcontroller/packet/TCP.java b/src/main/java/net/floodlightcontroller/packet/TCP.java
index 5c2f02946..215337885 100644
--- a/src/main/java/net/floodlightcontroller/packet/TCP.java
+++ b/src/main/java/net/floodlightcontroller/packet/TCP.java
@@ -258,7 +258,8 @@ public class TCP extends BasePacket {
     }
 
     @Override
-    public IPacket deserialize(byte[] data, int offset, int length) {
+    public IPacket deserialize(byte[] data, int offset, int length)
+            throws PacketParsingException {
         ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
         this.sourcePort = bb.getShort();
         this.destinationPort = bb.getShort();
diff --git a/src/main/java/net/floodlightcontroller/packet/UDP.java b/src/main/java/net/floodlightcontroller/packet/UDP.java
index cbeeedfd1..710762c09 100644
--- a/src/main/java/net/floodlightcontroller/packet/UDP.java
+++ b/src/main/java/net/floodlightcontroller/packet/UDP.java
@@ -202,7 +202,8 @@ public class UDP extends BasePacket {
     }
 
     @Override
-    public IPacket deserialize(byte[] data, int offset, int length) {
+    public IPacket deserialize(byte[] data, int offset, int length)
+            throws PacketParsingException {
         ByteBuffer bb = ByteBuffer.wrap(data, offset, length);
         this.sourcePort = bb.getShort();
         this.destinationPort = bb.getShort();
-- 
GitLab