[ONOS-3222] Implement toString method for each Packet class

Change-Id: I17d72338d4202117d08b3dca9463be35a87a0c1e
diff --git a/utils/misc/src/main/java/org/onlab/packet/ARP.java b/utils/misc/src/main/java/org/onlab/packet/ARP.java
index dc3c07f..5ea0cad 100644
--- a/utils/misc/src/main/java/org/onlab/packet/ARP.java
+++ b/utils/misc/src/main/java/org/onlab/packet/ARP.java
@@ -14,18 +14,17 @@
  * limitations under the License.
  */
 
-
-
 package org.onlab.packet;
 
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 
-import static org.onlab.packet.PacketUtils.*;
+import static com.google.common.base.MoreObjects.toStringHelper;
+import static org.onlab.packet.PacketUtils.checkHeaderLength;
+import static org.onlab.packet.PacketUtils.checkInput;
 
 /**
- *
- *
+ * Representation of an ARP Packet.
  */
 public class ARP extends BasePacket {
     public static final short HW_TYPE_ETHERNET = 0x1;
@@ -341,27 +340,6 @@
         return true;
     }
 
-    /*
-     * (non-Javadoc)
-     *
-     * @see java.lang.Object#toString()
-     */
-    @Override
-    public String toString() {
-        return "ARP [hardwareType=" + this.hardwareType + ", protocolType="
-                + this.protocolType + ", hardwareAddressLength="
-                + this.hardwareAddressLength + ", protocolAddressLength="
-                + this.protocolAddressLength + ", opCode=" + this.opCode
-                + ", senderHardwareAddress="
-                + Arrays.toString(this.senderHardwareAddress)
-                + ", senderProtocolAddress="
-                + Arrays.toString(this.senderProtocolAddress)
-                + ", targetHardwareAddress="
-                + Arrays.toString(this.targetHardwareAddress)
-                + ", targetProtocolAddress="
-                + Arrays.toString(this.targetProtocolAddress) + "]";
-    }
-
     /**
      * Builds an ARP reply based on a request.
      *
@@ -436,4 +414,18 @@
         };
     }
 
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("hardwareType", Short.toString(hardwareType))
+                .add("protocolType", Short.toString(protocolType))
+                .add("hardwareAddressLength", Byte.toString(hardwareAddressLength))
+                .add("protocolAddressLength", Byte.toString(protocolAddressLength))
+                .add("opCode", Short.toString(opCode))
+                .add("senderHardwareAddress", Arrays.toString(senderHardwareAddress))
+                .add("senderProtocolAddress", Arrays.toString(senderProtocolAddress))
+                .add("targetHardwareAddress", Arrays.toString(targetHardwareAddress))
+                .add("targetProtocolAddress", Arrays.toString(targetProtocolAddress))
+                .toString();
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/BasePacket.java b/utils/misc/src/main/java/org/onlab/packet/BasePacket.java
index 4aece66..d138028 100644
--- a/utils/misc/src/main/java/org/onlab/packet/BasePacket.java
+++ b/utils/misc/src/main/java/org/onlab/packet/BasePacket.java
@@ -14,48 +14,32 @@
  * limitations under the License.
  */
 
-
-
 package org.onlab.packet;
 
 /**
- *
- *
+ * Base packet class.
  */
 public abstract class BasePacket implements IPacket {
+
     protected IPacket parent;
     protected IPacket payload;
 
-    /**
-     * @return the parent
-     */
     @Override
     public IPacket getParent() {
         return this.parent;
     }
 
-    /**
-     * @param parent
-     *            the parent to set
-     */
     @Override
     public IPacket setParent(final IPacket parent) {
         this.parent = parent;
         return this;
     }
 
-    /**
-     * @return the payload
-     */
     @Override
     public IPacket getPayload() {
         return this.payload;
     }
 
-    /**
-     * @param payload
-     *            the payload to set
-     */
     @Override
     public IPacket setPayload(final IPacket payload) {
         this.payload = payload;
@@ -69,11 +53,6 @@
         }
     }
 
-    /*
-     * (non-Javadoc)
-     *
-     * @see java.lang.Object#hashCode()
-     */
     @Override
     public int hashCode() {
         final int prime = 6733;
@@ -83,11 +62,6 @@
         return result;
     }
 
-    /*
-     * (non-Javadoc)
-     *
-     * @see java.lang.Object#equals(java.lang.Object)
-     */
     @Override
     public boolean equals(final Object obj) {
         if (this == obj) {
diff --git a/utils/misc/src/main/java/org/onlab/packet/DHCP.java b/utils/misc/src/main/java/org/onlab/packet/DHCP.java
index de5b43f..491185d 100644
--- a/utils/misc/src/main/java/org/onlab/packet/DHCP.java
+++ b/utils/misc/src/main/java/org/onlab/packet/DHCP.java
@@ -21,14 +21,16 @@
 import java.io.UnsupportedEncodingException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.ListIterator;
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static org.onlab.packet.PacketUtils.checkInput;
+import static com.google.common.base.MoreObjects.toStringHelper;
 
 /**
- *
+ * Representation of an DHCP Packet.
  */
 public class DHCP extends BasePacket {
     /**
@@ -629,4 +631,25 @@
             return dhcp;
         };
     }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("opCode", Byte.toString(opCode))
+                .add("hardwareType", Byte.toString(hardwareType))
+                .add("hardwareAddressLength", Byte.toString(hardwareAddressLength))
+                .add("hops", Byte.toString(hops))
+                .add("transactionId", Integer.toString(transactionId))
+                .add("seconds", Short.toString(seconds))
+                .add("flags", Short.toString(flags))
+                .add("clientIPAddress", Integer.toString(clientIPAddress))
+                .add("yourIPAddress", Integer.toString(yourIPAddress))
+                .add("serverIPAddress", Integer.toString(serverIPAddress))
+                .add("gatewayIPAddress", Integer.toString(gatewayIPAddress))
+                .add("clientHardwareAddress", Arrays.toString(clientHardwareAddress))
+                .add("serverName", serverName)
+                .add("bootFileName", bootFileName)
+                .toString();
+        // TODO: need to handle options
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/DHCPOption.java b/utils/misc/src/main/java/org/onlab/packet/DHCPOption.java
index 1b6c670..cedd670 100644
--- a/utils/misc/src/main/java/org/onlab/packet/DHCPOption.java
+++ b/utils/misc/src/main/java/org/onlab/packet/DHCPOption.java
@@ -14,14 +14,12 @@
  * limitations under the License.
  */
 
-
-
 package org.onlab.packet;
 
 import java.util.Arrays;
 
 /**
- *
+ * Representation of DHCPOption field.
  */
 public class DHCPOption {
     protected byte code;
@@ -36,8 +34,7 @@
     }
 
     /**
-     * @param code
-     *            the code to set
+     * @param code the code to set
      * @return this
      */
     public DHCPOption setCode(final byte code) {
@@ -53,8 +50,7 @@
     }
 
     /**
-     * @param length
-     *            the length to set
+     * @param length the length to set
      * @return this
      */
     public DHCPOption setLength(final byte length) {
@@ -70,8 +66,7 @@
     }
 
     /**
-     * @param data
-     *            the data to set
+     * @param data the data to set
      * @return this
      */
     public DHCPOption setData(final byte[] data) {
diff --git a/utils/misc/src/main/java/org/onlab/packet/Data.java b/utils/misc/src/main/java/org/onlab/packet/Data.java
index 79abcba..714d237 100644
--- a/utils/misc/src/main/java/org/onlab/packet/Data.java
+++ b/utils/misc/src/main/java/org/onlab/packet/Data.java
@@ -20,6 +20,7 @@
 
 import java.util.Arrays;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onlab.packet.PacketUtils.*;
 
 /**
@@ -129,4 +130,10 @@
         };
     }
 
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("data", Arrays.toString(data))
+                .toString();
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/EAP.java b/utils/misc/src/main/java/org/onlab/packet/EAP.java
index 516938a..8450e59 100644
--- a/utils/misc/src/main/java/org/onlab/packet/EAP.java
+++ b/utils/misc/src/main/java/org/onlab/packet/EAP.java
@@ -19,7 +19,9 @@
 package org.onlab.packet;
 
 import java.nio.ByteBuffer;
+import java.util.Arrays;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onlab.packet.PacketUtils.checkHeaderLength;
 import static org.onlab.packet.PacketUtils.checkInput;
 
@@ -54,7 +56,6 @@
     protected byte type;
     protected byte[] data;
 
-
     /**
      * Gets the EAP code.
      *
@@ -261,4 +262,15 @@
         result = prime * result + this.type;
         return result;
     }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("code", Byte.toString(code))
+                .add("identifier", Byte.toString(identifier))
+                .add("length", Short.toString(length))
+                .add("type", Byte.toString(type))
+                .add("data", Arrays.toString(data))
+                .toString();
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/EAPOL.java b/utils/misc/src/main/java/org/onlab/packet/EAPOL.java
index 1820cc3..3849caa 100644
--- a/utils/misc/src/main/java/org/onlab/packet/EAPOL.java
+++ b/utils/misc/src/main/java/org/onlab/packet/EAPOL.java
@@ -20,6 +20,7 @@
 
 import java.nio.ByteBuffer;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onlab.packet.PacketUtils.checkHeaderLength;
 import static org.onlab.packet.PacketUtils.checkInput;
 
@@ -195,5 +196,14 @@
 
         return this;
     }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("version", Byte.toString(version))
+                .add("eapolType", Byte.toString(eapolType))
+                .add("packetLength", Short.toString(packetLength))
+                .toString();
+    }
 }
 
diff --git a/utils/misc/src/main/java/org/onlab/packet/Ethernet.java b/utils/misc/src/main/java/org/onlab/packet/Ethernet.java
index 9ab5cab..ab33e80 100644
--- a/utils/misc/src/main/java/org/onlab/packet/Ethernet.java
+++ b/utils/misc/src/main/java/org/onlab/packet/Ethernet.java
@@ -34,7 +34,7 @@
 import static org.onlab.packet.PacketUtils.checkInput;
 
 /**
- *
+ * Ethernet Packet.
  */
 public class Ethernet extends BasePacket {
     private static final String HEXES = "0123456789ABCDEF";
@@ -714,5 +714,4 @@
             return eth;
         };
     }
-
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/ICMP.java b/utils/misc/src/main/java/org/onlab/packet/ICMP.java
index d07a9ba..4c23fff 100644
--- a/utils/misc/src/main/java/org/onlab/packet/ICMP.java
+++ b/utils/misc/src/main/java/org/onlab/packet/ICMP.java
@@ -15,16 +15,15 @@
  */
 
 
-
 package org.onlab.packet;
 
 import java.nio.ByteBuffer;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onlab.packet.PacketUtils.*;
 
 /**
  * Implements ICMP packet format.
- *
  */
 public class ICMP extends BasePacket {
     protected byte icmpType;
@@ -45,8 +44,7 @@
     }
 
     /**
-     * @param icmpType
-     *            to set
+     * @param icmpType to set
      * @return this
      */
     public ICMP setIcmpType(final byte icmpType) {
@@ -62,8 +60,7 @@
     }
 
     /**
-     * @param icmpCode
-     *            code to set
+     * @param icmpCode code to set
      * @return this
      */
     public ICMP setIcmpCode(final byte icmpCode) {
@@ -79,8 +76,7 @@
     }
 
     /**
-     * @param checksum
-     *            the checksum to set
+     * @param checksum the checksum to set
      * @return this
      */
     public ICMP setChecksum(final short checksum) {
@@ -220,4 +216,13 @@
             return icmp;
         };
     }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("icmpType", Byte.toString(icmpType))
+                .add("icmpCode", Byte.toString(icmpCode))
+                .add("checksum", Short.toString(checksum))
+                .toString();
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/ICMP6.java b/utils/misc/src/main/java/org/onlab/packet/ICMP6.java
index c898130..45b7a62 100644
--- a/utils/misc/src/main/java/org/onlab/packet/ICMP6.java
+++ b/utils/misc/src/main/java/org/onlab/packet/ICMP6.java
@@ -29,6 +29,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onlab.packet.PacketUtils.checkInput;
 
 /**
@@ -363,4 +364,13 @@
             return icmp6;
         };
     }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("icmpType", Byte.toString(icmpType))
+                .add("icmpCode", Byte.toString(icmpCode))
+                .add("checksum", Short.toString(checksum))
+                .toString();
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/IGMP.java b/utils/misc/src/main/java/org/onlab/packet/IGMP.java
index 254f132..594b79d 100644
--- a/utils/misc/src/main/java/org/onlab/packet/IGMP.java
+++ b/utils/misc/src/main/java/org/onlab/packet/IGMP.java
@@ -15,16 +15,19 @@
  */
 package org.onlab.packet;
 
+import org.slf4j.Logger;
+
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import org.slf4j.Logger;
+import java.util.Arrays;
 
-import static org.slf4j.LoggerFactory.getLogger;
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.onlab.packet.PacketUtils.checkInput;
+import static org.slf4j.LoggerFactory.getLogger;
 
 
 /**
@@ -332,4 +335,15 @@
         result = prime * result + this.groups.hashCode();
         return result;
     }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("igmpType", Byte.toString(igmpType))
+                .add("resField", Byte.toString(resField))
+                .add("checksum", Short.toString(checksum))
+                .add("unsupportTypeData", Arrays.toString(unsupportTypeData))
+                .toString();
+        // TODO: need to handle groups
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/IGMPGroup.java b/utils/misc/src/main/java/org/onlab/packet/IGMPGroup.java
index 70ff556..8be75d4 100644
--- a/utils/misc/src/main/java/org/onlab/packet/IGMPGroup.java
+++ b/utils/misc/src/main/java/org/onlab/packet/IGMPGroup.java
@@ -95,4 +95,18 @@
      * @return The serialized message
      */
     public abstract byte[] serialize(ByteBuffer bb);
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("[");
+        sb.append("auxInfo= ");
+        sb.append(auxInfo);
+        sb.append("gaddr= ");
+        sb.append(gaddr);
+        sb.append("sources= ");
+        sb.append(sources.toString());
+        sb.append("]");
+        return sb.toString();
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/IPacket.java b/utils/misc/src/main/java/org/onlab/packet/IPacket.java
index 64e6ac3..2391ad9 100644
--- a/utils/misc/src/main/java/org/onlab/packet/IPacket.java
+++ b/utils/misc/src/main/java/org/onlab/packet/IPacket.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2014 Open Networking Laboratory
+ * Copyright 2015 Open Networking Laboratory
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,21 +14,22 @@
  * limitations under the License.
  */
 
-
-
 package org.onlab.packet;
 
 /**
- *
+ * Packet Interface.
  */
 public interface IPacket {
+
     /**
+     * Obtain the packet payload.
      *
      * @return the payload
      */
     IPacket getPayload();
 
     /**
+     * Assign the packet payload.
      *
      * @param packet new payload
      * @return self
@@ -36,12 +37,14 @@
     IPacket setPayload(IPacket packet);
 
     /**
+     * Obtain the parent packet.
      *
      * @return parent packet
      */
     IPacket getParent();
 
     /**
+     * Configure a new parent packet.
      *
      * @param packet new parent
      * @return self
@@ -49,7 +52,7 @@
     IPacket setParent(IPacket packet);
 
     /**
-     * Reset any checksums as needed, and call resetChecksum on all parents.
+     * Reset any checksum as needed, and call resetChecksum on all parents.
      */
     void resetChecksum();
 
@@ -62,7 +65,7 @@
     byte[] serialize();
 
     /**
-     * Deserializes this packet layer and all possible payloads.
+     * Deserialize this packet layer and all possible payloads.
      *
      * NOTE: This method has been deprecated and will be removed in a future
      * release. It is now recommended to use the Deserializer function provided
diff --git a/utils/misc/src/main/java/org/onlab/packet/IPv4.java b/utils/misc/src/main/java/org/onlab/packet/IPv4.java
index a5c5f4f..9d31fd6 100644
--- a/utils/misc/src/main/java/org/onlab/packet/IPv4.java
+++ b/utils/misc/src/main/java/org/onlab/packet/IPv4.java
@@ -25,10 +25,11 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onlab.packet.PacketUtils.*;
 
 /**
- *
+ * Implements IPv4 packet format.
  */
 public class IPv4 extends BasePacket {
     public static final byte PROTOCOL_ICMP = 0x1;
@@ -730,4 +731,24 @@
             return ipv4;
         };
     }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("version", Byte.toString(version))
+                .add("headerLength", Byte.toString(headerLength))
+                .add("diffServ", Byte.toString(diffServ))
+                .add("totalLength", Short.toString(totalLength))
+                .add("identification", Short.toString(identification))
+                .add("flags", Byte.toString(flags))
+                .add("fragmentOffset", Short.toString(fragmentOffset))
+                .add("ttl", Byte.toString(ttl))
+                .add("protocol", Byte.toString(protocol))
+                .add("checksum", Short.toString(checksum))
+                .add("sourceAddress", Integer.toString(sourceAddress))
+                .add("destinationAddress", Integer.toString(destinationAddress))
+                .add("options", Arrays.toString(options))
+                .add("isTruncated", Boolean.toString(isTruncated))
+                .toString();
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/IPv6.java b/utils/misc/src/main/java/org/onlab/packet/IPv6.java
index 2e59632..ca8c319 100644
--- a/utils/misc/src/main/java/org/onlab/packet/IPv6.java
+++ b/utils/misc/src/main/java/org/onlab/packet/IPv6.java
@@ -31,6 +31,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onlab.packet.PacketUtils.checkInput;
 
 /**
@@ -381,4 +382,18 @@
             return ipv6;
         };
     }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("version", Byte.toString(version))
+                .add("trafficClass", Byte.toString(trafficClass))
+                .add("flowLabel", Integer.toString(flowLabel))
+                .add("payloadLength", Short.toString(payloadLength))
+                .add("nextHeader", Byte.toString(nextHeader))
+                .add("hopLimit", Byte.toString(hopLimit))
+                .add("sourceAddress", Arrays.toString(sourceAddress))
+                .add("destinationAddress", Arrays.toString(destinationAddress))
+                .toString();
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/LLC.java b/utils/misc/src/main/java/org/onlab/packet/LLC.java
index 78b4f3f..bd2739f 100644
--- a/utils/misc/src/main/java/org/onlab/packet/LLC.java
+++ b/utils/misc/src/main/java/org/onlab/packet/LLC.java
@@ -20,13 +20,12 @@
 
 import java.nio.ByteBuffer;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onlab.packet.PacketUtils.*;
 
 /**
  * This class represents an Link Local Control header that is used in Ethernet
  * 802.3.
- *
- *
  */
 public class LLC extends BasePacket {
 
@@ -99,4 +98,13 @@
             return llc;
         };
     }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("dsap", Byte.toString(dsap))
+                .add("ssap", Byte.toString(ssap))
+                .add("ctrl", Byte.toString(ctrl))
+                .toString();
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/LLDP.java b/utils/misc/src/main/java/org/onlab/packet/LLDP.java
index ae9d717..fe0d419 100644
--- a/utils/misc/src/main/java/org/onlab/packet/LLDP.java
+++ b/utils/misc/src/main/java/org/onlab/packet/LLDP.java
@@ -20,13 +20,15 @@
 package org.onlab.packet;
 
 import java.nio.ByteBuffer;
+import java.util.Arrays;
 import java.util.LinkedList;
 import java.util.List;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onlab.packet.PacketUtils.*;
 
 /**
- *
+ * Representation of an LLDP Packet.
  */
 public class LLDP extends BasePacket {
     public static final byte CHASSIS_TLV_TYPE = 1;
@@ -59,8 +61,7 @@
     }
 
     /**
-     * @param chassis
-     *            the chassisId to set
+     * @param chassis the chassisId to set
      * @return this
      */
     public LLDP setChassisId(final LLDPTLV chassis) {
@@ -76,8 +77,7 @@
     }
 
     /**
-     * @param portId
-     *            the portId to set
+     * @param portId the portId to set
      * @return this
      */
     public LLDP setPortId(final LLDPTLV portId) {
@@ -93,8 +93,7 @@
     }
 
     /**
-     * @param ttl
-     *            the ttl to set
+     * @param ttl the ttl to set
      * @return this
      */
     public LLDP setTtl(final LLDPTLV ttl) {
@@ -110,8 +109,7 @@
     }
 
     /**
-     * @param optionalTLVList
-     *            the optionalTLVList to set
+     * @param optionalTLVList the optionalTLVList to set
      * @return this
      */
     public LLDP setOptionalTLVList(final List<LLDPTLV> optionalTLVList) {
@@ -162,22 +160,22 @@
                 break;
             }
             switch (tlv.getType()) {
-            case 0x0:
-                // can throw this one away, its just an end delimiter
-                break;
-            case 0x1:
-                this.chassisId = tlv;
-                break;
-            case 0x2:
-                this.portId = tlv;
-                break;
-            case 0x3:
-                this.ttl = tlv;
-                break;
+                case 0x0:
+                    // can throw this one away, its just an end delimiter
+                    break;
+                case 0x1:
+                    this.chassisId = tlv;
+                    break;
+                case 0x2:
+                    this.portId = tlv;
+                    break;
+                case 0x3:
+                    this.ttl = tlv;
+                    break;
 
-            default:
-                this.optionalTLVList.add(tlv);
-                break;
+                default:
+                    this.optionalTLVList.add(tlv);
+                    break;
             }
         } while (tlv.getType() != 0 && bb.hasRemaining());
         return this;
@@ -273,21 +271,21 @@
                     break;
                 }
                 switch (tlv.getType()) {
-                case 0x0:
-                    // can throw this one away, it's just an end delimiter
-                    break;
-                case 0x1:
-                    lldp.chassisId = tlv;
-                    break;
-                case 0x2:
-                    lldp.portId = tlv;
-                    break;
-                case 0x3:
-                    lldp.ttl = tlv;
-                    break;
-                default:
-                    lldp.optionalTLVList.add(tlv);
-                    break;
+                    case 0x0:
+                        // can throw this one away, it's just an end delimiter
+                        break;
+                    case 0x1:
+                        lldp.chassisId = tlv;
+                        break;
+                    case 0x2:
+                        lldp.portId = tlv;
+                        break;
+                    case 0x3:
+                        lldp.ttl = tlv;
+                        break;
+                    default:
+                        lldp.optionalTLVList.add(tlv);
+                        break;
                 }
 
                 currentIndex += tlv.getLength();
@@ -297,4 +295,15 @@
         };
     }
 
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("chassisId", Arrays.toString(chassisId.getValue()))
+                .add("portId", Arrays.toString(portId.getValue()))
+                .add("ttl", Arrays.toString(ttl.getValue()))
+                .add("ethType", Short.toString(ethType))
+                .toString();
+
+        // TODO: need to handle optionalTLVList
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/LLDPTLV.java b/utils/misc/src/main/java/org/onlab/packet/LLDPTLV.java
index 77efe1b..1c51456 100644
--- a/utils/misc/src/main/java/org/onlab/packet/LLDPTLV.java
+++ b/utils/misc/src/main/java/org/onlab/packet/LLDPTLV.java
@@ -30,6 +30,20 @@
     protected short length;
     protected byte[] value;
 
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("[");
+        sb.append("type= ");
+        sb.append(type);
+        sb.append("length= ");
+        sb.append(length);
+        sb.append("value= ");
+        sb.append(Arrays.toString(value));
+        sb.append("]");
+        return sb.toString();
+    }
+
     /**
      * @return the type
      */
diff --git a/utils/misc/src/main/java/org/onlab/packet/MPLS.java b/utils/misc/src/main/java/org/onlab/packet/MPLS.java
index 71c5803..0b918d4 100644
--- a/utils/misc/src/main/java/org/onlab/packet/MPLS.java
+++ b/utils/misc/src/main/java/org/onlab/packet/MPLS.java
@@ -19,8 +19,12 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onlab.packet.PacketUtils.checkInput;
 
+/**
+ * Representation of an MPLS Packet.
+ */
 public class MPLS extends BasePacket {
     public static final int HEADER_LENGTH = 4;
 
@@ -159,4 +163,14 @@
             return mpls;
         };
     }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("label", Integer.toString(label))
+                .add("bos", Byte.toString(bos))
+                .add("ttl", Byte.toString(ttl))
+                .add("protocol", Byte.toString(protocol))
+                .toString();
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/ONOSLLDP.java b/utils/misc/src/main/java/org/onlab/packet/ONOSLLDP.java
index 5b3902a..4d5d58b 100644
--- a/utils/misc/src/main/java/org/onlab/packet/ONOSLLDP.java
+++ b/utils/misc/src/main/java/org/onlab/packet/ONOSLLDP.java
@@ -177,9 +177,4 @@
         }
         return null;
     }
-
-
-
-
-
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/PIM.java b/utils/misc/src/main/java/org/onlab/packet/PIM.java
index e6ef0ae..3787510 100755
--- a/utils/misc/src/main/java/org/onlab/packet/PIM.java
+++ b/utils/misc/src/main/java/org/onlab/packet/PIM.java
@@ -22,6 +22,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onlab.packet.PacketUtils.checkInput;
 
 /**
@@ -296,4 +297,14 @@
             return pim;
         };
     }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("version", Byte.toString(version))
+                .add("type", Byte.toString(type))
+                .add("reserved", Byte.toString(reserved))
+                .add("checksum", Short.toString(reserved))
+                .toString();
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/RADIUS.java b/utils/misc/src/main/java/org/onlab/packet/RADIUS.java
index 297fee7..de0cb39 100644
--- a/utils/misc/src/main/java/org/onlab/packet/RADIUS.java
+++ b/utils/misc/src/main/java/org/onlab/packet/RADIUS.java
@@ -30,6 +30,7 @@
 import java.util.Arrays;
 import java.util.List;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onlab.packet.PacketUtils.checkHeaderLength;
 import static org.onlab.packet.PacketUtils.checkInput;
 import static org.slf4j.LoggerFactory.getLogger;
@@ -68,7 +69,7 @@
     /**
      * Constructs a RADIUS packet with the given code and identifier.
      *
-     * @param code code
+     * @param code       code
      * @param identifier identifier
      */
     public RADIUS(byte code, byte identifier) {
@@ -313,7 +314,7 @@
      * Sets an attribute in the RADIUS packet.
      *
      * @param attrType the type field of the attribute to set
-     * @param value value to be set
+     * @param value    value to be set
      * @return reference to the attribute object
      */
     public RADIUSAttribute setAttribute(byte attrType, byte[] value) {
@@ -328,7 +329,7 @@
      * Updates an attribute in the RADIUS packet.
      *
      * @param attrType the type field of the attribute to update
-     * @param value the value to update to
+     * @param value    the value to update to
      * @return reference to the attribute object
      */
     public RADIUSAttribute updateAttribute(byte attrType, byte[] value) {
@@ -420,4 +421,15 @@
         return this;
     }
 
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("code", Byte.toString(code))
+                .add("identifier", Byte.toString(identifier))
+                .add("length", Short.toString(length))
+                .add("authenticator", Arrays.toString(authenticator))
+                .toString();
+
+        // TODO: need to handle attributes
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/RADIUSAttribute.java b/utils/misc/src/main/java/org/onlab/packet/RADIUSAttribute.java
index 9687e37..45f22855 100644
--- a/utils/misc/src/main/java/org/onlab/packet/RADIUSAttribute.java
+++ b/utils/misc/src/main/java/org/onlab/packet/RADIUSAttribute.java
@@ -18,6 +18,8 @@
 
 package org.onlab.packet;
 
+import java.util.Arrays;
+
 /**
  * An attribute in a RADIUS packet.
  */
@@ -139,4 +141,17 @@
         return this;
     }
 
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("[");
+        sb.append("type= ");
+        sb.append(type);
+        sb.append("length= ");
+        sb.append(length);
+        sb.append("value= ");
+        sb.append(Arrays.toString(value));
+        sb.append("]");
+        return sb.toString();
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/TCP.java b/utils/misc/src/main/java/org/onlab/packet/TCP.java
index e089f27..6f9f6df 100644
--- a/utils/misc/src/main/java/org/onlab/packet/TCP.java
+++ b/utils/misc/src/main/java/org/onlab/packet/TCP.java
@@ -21,6 +21,7 @@
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onlab.packet.PacketUtils.*;
 
 /**
@@ -459,4 +460,20 @@
             return tcp;
         };
     }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("sourcePort", Integer.toString(sourcePort))
+                .add("destinationPort", Integer.toString(destinationPort))
+                .add("sequence", Integer.toString(sequence))
+                .add("acknowledge", Integer.toString(acknowledge))
+                .add("dataOffset", Byte.toString(dataOffset))
+                .add("flags", Short.toString(flags))
+                .add("windowSize", Short.toString(windowSize))
+                .add("checksum", Short.toString(checksum))
+                .add("urgentPointer", Short.toString(urgentPointer))
+                .add("options", Arrays.toString(options))
+                .toString();
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/UDP.java b/utils/misc/src/main/java/org/onlab/packet/UDP.java
index a30c9a9..25221fa 100644
--- a/utils/misc/src/main/java/org/onlab/packet/UDP.java
+++ b/utils/misc/src/main/java/org/onlab/packet/UDP.java
@@ -22,6 +22,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onlab.packet.PacketUtils.*;
 
 /**
@@ -303,4 +304,14 @@
             return udp;
         };
     }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("sourcePort", Integer.toString(sourcePort))
+                .add("destinationPort", Integer.toString(destinationPort))
+                .add("length", Short.toString(length))
+                .add("checksum", Short.toString(checksum))
+                .toString();
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/ipv6/Authentication.java b/utils/misc/src/main/java/org/onlab/packet/ipv6/Authentication.java
index ec04a81..5af4d92 100644
--- a/utils/misc/src/main/java/org/onlab/packet/ipv6/Authentication.java
+++ b/utils/misc/src/main/java/org/onlab/packet/ipv6/Authentication.java
@@ -26,6 +26,7 @@
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onlab.packet.PacketUtils.checkInput;
 
 /**
@@ -297,4 +298,15 @@
             return authentication;
         };
     }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("nextHeader", Byte.toString(nextHeader))
+                .add("payloadLength", Byte.toString(payloadLength))
+                .add("securityParamIndex", Integer.toString(securityParamIndex))
+                .add("sequence", Integer.toString(sequence))
+                .add("integrityCheck", Arrays.toString(integrityCheck))
+                .toString();
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/ipv6/BaseOptions.java b/utils/misc/src/main/java/org/onlab/packet/ipv6/BaseOptions.java
index f57b756..6c323ae 100644
--- a/utils/misc/src/main/java/org/onlab/packet/ipv6/BaseOptions.java
+++ b/utils/misc/src/main/java/org/onlab/packet/ipv6/BaseOptions.java
@@ -26,6 +26,7 @@
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onlab.packet.PacketUtils.checkHeaderLength;
 import static org.onlab.packet.PacketUtils.checkInput;
 
@@ -257,4 +258,14 @@
             return baseOptions;
         };
     }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("nextHeader", Byte.toString(nextHeader))
+                .add("headerExtLength", Byte.toString(headerExtLength))
+                .add("options", Arrays.toString(options))
+                .add("type", Short.toString(type))
+                .toString();
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/ipv6/EncapSecurityPayload.java b/utils/misc/src/main/java/org/onlab/packet/ipv6/EncapSecurityPayload.java
index e46a126..13c0545 100644
--- a/utils/misc/src/main/java/org/onlab/packet/ipv6/EncapSecurityPayload.java
+++ b/utils/misc/src/main/java/org/onlab/packet/ipv6/EncapSecurityPayload.java
@@ -24,6 +24,7 @@
 
 import java.nio.ByteBuffer;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onlab.packet.PacketUtils.checkInput;
 
 /**
@@ -185,4 +186,12 @@
             return encapSecurityPayload;
         };
     }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("securityParamIndex", Integer.toString(securityParamIndex))
+                .add("sequence", Integer.toString(sequence))
+                .toString();
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/ipv6/Fragment.java b/utils/misc/src/main/java/org/onlab/packet/ipv6/Fragment.java
index 68015d3..9fb1529 100644
--- a/utils/misc/src/main/java/org/onlab/packet/ipv6/Fragment.java
+++ b/utils/misc/src/main/java/org/onlab/packet/ipv6/Fragment.java
@@ -25,6 +25,7 @@
 
 import java.nio.ByteBuffer;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onlab.packet.PacketUtils.checkInput;
 
 /**
@@ -250,4 +251,14 @@
             return fragment;
         };
     }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("nextHeader", Byte.toString(nextHeader))
+                .add("fragmentOffset", Short.toString(fragmentOffset))
+                .add("moreFragment", Byte.toString(moreFragment))
+                .add("identification", Integer.toString(identification))
+                .toString();
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/ipv6/Routing.java b/utils/misc/src/main/java/org/onlab/packet/ipv6/Routing.java
index d7d204a..5a7ae45 100644
--- a/utils/misc/src/main/java/org/onlab/packet/ipv6/Routing.java
+++ b/utils/misc/src/main/java/org/onlab/packet/ipv6/Routing.java
@@ -26,6 +26,7 @@
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onlab.packet.PacketUtils.checkHeaderLength;
 import static org.onlab.packet.PacketUtils.checkInput;
 
@@ -288,4 +289,15 @@
             return routing;
         };
     }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("nextHeader", Byte.toString(nextHeader))
+                .add("headerExtLength", Byte.toString(headerExtLength))
+                .add("routingType", Byte.toString(routingType))
+                .add("segmentsLeft", Byte.toString(segmentsLeft))
+                .add("routingData", Arrays.toString(routingData))
+                .toString();
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/ndp/NeighborAdvertisement.java b/utils/misc/src/main/java/org/onlab/packet/ndp/NeighborAdvertisement.java
index 99fa0dd..ed02d87 100644
--- a/utils/misc/src/main/java/org/onlab/packet/ndp/NeighborAdvertisement.java
+++ b/utils/misc/src/main/java/org/onlab/packet/ndp/NeighborAdvertisement.java
@@ -24,6 +24,7 @@
 import java.util.Arrays;
 import java.util.List;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onlab.packet.PacketUtils.checkInput;
 
 /**
@@ -275,4 +276,14 @@
             return neighborAdvertisement;
         };
     }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("routerFlag", Byte.toString(routerFlag))
+                .add("solicitedFlag", Byte.toString(solicitedFlag))
+                .add("overrideFlag", Byte.toString(overrideFlag))
+                .add("targetAddress", Arrays.toString(targetAddress))
+                .toString();
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/ndp/NeighborDiscoveryOptions.java b/utils/misc/src/main/java/org/onlab/packet/ndp/NeighborDiscoveryOptions.java
index 00a2606..18c0143 100644
--- a/utils/misc/src/main/java/org/onlab/packet/ndp/NeighborDiscoveryOptions.java
+++ b/utils/misc/src/main/java/org/onlab/packet/ndp/NeighborDiscoveryOptions.java
@@ -25,6 +25,7 @@
 import java.util.Arrays;
 import java.util.List;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onlab.packet.PacketUtils.checkInput;
 
 /**
@@ -117,6 +118,18 @@
         private int optionWireLength() {
             return 8 * optionLengthField();
         }
+
+        @Override
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            sb.append("[");
+            sb.append("type= ");
+            sb.append(type);
+            sb.append("data= ");
+            sb.append(data);
+            sb.append("]");
+            return sb.toString();
+        }
     }
 
     /**
@@ -278,4 +291,11 @@
             return ndo;
         };
     }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .toString();
+        // TODO: need to handle options
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/ndp/NeighborSolicitation.java b/utils/misc/src/main/java/org/onlab/packet/ndp/NeighborSolicitation.java
index 77c119a..ce3b7b7 100644
--- a/utils/misc/src/main/java/org/onlab/packet/ndp/NeighborSolicitation.java
+++ b/utils/misc/src/main/java/org/onlab/packet/ndp/NeighborSolicitation.java
@@ -24,6 +24,7 @@
 import java.util.Arrays;
 import java.util.List;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onlab.packet.PacketUtils.checkInput;
 
 /**
@@ -189,4 +190,12 @@
             return neighborSolicitation;
         };
     }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("targetAddress", Arrays.toString(targetAddress))
+                .toString();
+        // TODO: need to handle options
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/ndp/Redirect.java b/utils/misc/src/main/java/org/onlab/packet/ndp/Redirect.java
index 51256d4..2d2e061 100644
--- a/utils/misc/src/main/java/org/onlab/packet/ndp/Redirect.java
+++ b/utils/misc/src/main/java/org/onlab/packet/ndp/Redirect.java
@@ -24,6 +24,7 @@
 import java.util.Arrays;
 import java.util.List;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onlab.packet.PacketUtils.checkInput;
 
 /**
@@ -222,4 +223,12 @@
             return redirect;
         };
     }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("targetAddress", Arrays.toString(targetAddress))
+                .add("destinationAddress", Arrays.toString(destinationAddress))
+                .toString();
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/ndp/RouterAdvertisement.java b/utils/misc/src/main/java/org/onlab/packet/ndp/RouterAdvertisement.java
index 597fc9f..43f4f38 100644
--- a/utils/misc/src/main/java/org/onlab/packet/ndp/RouterAdvertisement.java
+++ b/utils/misc/src/main/java/org/onlab/packet/ndp/RouterAdvertisement.java
@@ -22,6 +22,7 @@
 import java.nio.ByteBuffer;
 import java.util.List;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onlab.packet.PacketUtils.checkInput;
 
 /**
@@ -322,4 +323,17 @@
             return routerAdvertisement;
         };
     }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("currentHopLimit", Byte.toString(currentHopLimit))
+                .add("mFlag", Byte.toString(mFlag))
+                .add("oFlag", Byte.toString(oFlag))
+                .add("routerLifetime", Short.toString(routerLifetime))
+                .add("reachableTime", Integer.toString(reachableTime))
+                .add("retransmitTimer", Integer.toString(retransmitTimer))
+                .toString();
+        // TODO: need to handle optionis
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/ndp/RouterSolicitation.java b/utils/misc/src/main/java/org/onlab/packet/ndp/RouterSolicitation.java
index e279a40..20b6673 100644
--- a/utils/misc/src/main/java/org/onlab/packet/ndp/RouterSolicitation.java
+++ b/utils/misc/src/main/java/org/onlab/packet/ndp/RouterSolicitation.java
@@ -22,6 +22,7 @@
 import java.nio.ByteBuffer;
 import java.util.List;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onlab.packet.PacketUtils.checkInput;
 
 /**
@@ -152,4 +153,11 @@
             return routerSolicitation;
         };
     }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .toString();
+        // TODO: need to handle options
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/pim/PIMHello.java b/utils/misc/src/main/java/org/onlab/packet/pim/PIMHello.java
index 9ad3fdb..4d42f32 100644
--- a/utils/misc/src/main/java/org/onlab/packet/pim/PIMHello.java
+++ b/utils/misc/src/main/java/org/onlab/packet/pim/PIMHello.java
@@ -23,6 +23,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onlab.packet.PacketUtils.checkInput;
 
 public class PIMHello extends BasePacket {
@@ -115,4 +116,13 @@
             return hello;
         };
     }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("nbrIpAddress", nbrIpAddress.toString())
+                .add("priorityPresent", Boolean.toString(priorityPresent))
+                .toString();
+        // TODO: need to handle options
+    }
 }
diff --git a/utils/misc/src/main/java/org/onlab/packet/pim/PIMJoinPrune.java b/utils/misc/src/main/java/org/onlab/packet/pim/PIMJoinPrune.java
index 9653115..45fe287 100644
--- a/utils/misc/src/main/java/org/onlab/packet/pim/PIMJoinPrune.java
+++ b/utils/misc/src/main/java/org/onlab/packet/pim/PIMJoinPrune.java
@@ -23,6 +23,7 @@
 import java.nio.ByteBuffer;
 import java.util.HashMap;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static org.onlab.packet.PacketUtils.checkInput;
 
 public class PIMJoinPrune extends BasePacket {
@@ -268,4 +269,13 @@
             return jp;
         };
     }
+
+    @Override
+    public String toString() {
+        return toStringHelper(getClass())
+                .add("upstreamAddr", upstreamAddr.toString())
+                .add("holdTime", Short.toString(holdTime))
+                .toString();
+        // TODO: need to handle joinPrunes
+    }
 }