diff --git a/src/main/java/net/floodlightcontroller/packet/BSN.java b/src/main/java/net/floodlightcontroller/packet/BSN.java index 27c8f70df69cce5896f66a5d64522a2bc1c9f654..2540f2081d10f261f493dadc0d68ee9a318917c9 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 1343f769b86f45399f33357ff3932092007c562c..c9115eacb5c22c459cbaded572a64063125118c6 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 eed530c03d2e8047774697bc70032d58eee63981..9ed2871aaee86322680f039b0babba5483e4bbd5 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 4fc2380762a5c71e019886cb6c0da82e6b84fc19..438e786a3459028888f1b95c6480ff052c5c5f45 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 6b02b5bd502a5869e35a86579152417f39cd0698..2988106484530d437df2b5fe62aac2c0a0bea480 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 02376cd990cbd1c1980b78bb7815323a46480cf2..4eaaada8e243c072a7a33c48c46fc9d2b1d6ea72 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 327ef7fac9891833e41244d868e2614d15d18770..064ad31e81409941260530aea1fa4323871c0c77 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 5c2f0294696351152a59701c412858b0dbde5c71..2153378853818fd62d75ae21b9c1518b8b37f35a 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 cbeeedfd18add16d1f657c7930cadf4bf08da6b8..710762c097137bede7a84da1fa7cd6de2a586057 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();