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