[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
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/ArpTest.java b/utils/misc/src/test/java/org/onlab/packet/ArpTest.java
index 6224624..c057176 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ArpTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ArpTest.java
@@ -16,6 +16,7 @@
 
 package org.onlab.packet;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -45,7 +46,7 @@
     @Before
     public void setUp() {
         ByteBuffer bb = ByteBuffer.allocate(ARP.INITIAL_HEADER_LENGTH +
-                        2 * hwAddressLength + 2 * protoAddressLength);
+                2 * hwAddressLength + 2 * protoAddressLength);
         bb.putShort(ARP.HW_TYPE_ETHERNET);
         bb.putShort(ARP.PROTO_TYPE_IP);
         bb.put(hwAddressLength);
@@ -70,6 +71,9 @@
         PacketTestUtils.testDeserializeTruncated(deserializer, byteHeader);
     }
 
+    /**
+     * Tests deserialize and getters.
+     */
     @Test
     public void testDeserialize() throws Exception {
         ARP arp = deserializer.deserialize(byteHeader, 0, byteHeader.length);
@@ -85,4 +89,19 @@
         assertTrue(Arrays.equals(targetMac.toBytes(), arp.getTargetHardwareAddress()));
         assertTrue(Arrays.equals(targetIp.toOctets(), arp.getTargetProtocolAddress()));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringArp() throws Exception {
+        ARP arp = deserializer.deserialize(byteHeader, 0, byteHeader.length);
+        String str = arp.toString();
+        assertTrue(StringUtils.contains(str, "hardwareAddressLength=" + hwAddressLength));
+        assertTrue(StringUtils.contains(str, "protocolAddressLength=" + protoAddressLength));
+        assertTrue(StringUtils.contains(str, "senderHardwareAddress=" + Arrays.toString(srcMac.toBytes())));
+        assertTrue(StringUtils.contains(str, "senderProtocolAddress=" + Arrays.toString(srcIp.toOctets())));
+        assertTrue(StringUtils.contains(str, "targetHardwareAddress=" + Arrays.toString(targetMac.toBytes())));
+        assertTrue(StringUtils.contains(str, "targetProtocolAddress=" + Arrays.toString(targetIp.toOctets())));
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/DhcpTest.java b/utils/misc/src/test/java/org/onlab/packet/DhcpTest.java
index aac8141..085adf9 100644
--- a/utils/misc/src/test/java/org/onlab/packet/DhcpTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/DhcpTest.java
@@ -17,6 +17,7 @@
 package org.onlab.packet;
 
 import com.google.common.base.Charsets;
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -111,6 +112,9 @@
         PacketTestUtils.testDeserializeTruncated(deserializer, byteHeader);
     }
 
+    /**
+     * Tests deserialize and getters.
+     */
     @Test
     public void testDeserialize() throws Exception {
         DHCP dhcp = deserializer.deserialize(byteHeader, 0, byteHeader.length);
@@ -134,4 +138,28 @@
         assertEquals(hostNameOption, dhcp.options.get(0));
     }
 
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringDhcp() throws Exception {
+        DHCP dhcp = deserializer.deserialize(byteHeader, 0, byteHeader.length);
+        String str = dhcp.toString();
+
+        assertTrue(StringUtils.contains(str, "opCode=" + opCode));
+        assertTrue(StringUtils.contains(str, "hardwareType=" + hardwareType));
+        assertTrue(StringUtils.contains(str, "hardwareAddressLength=" + hardwareAddressLength));
+        assertTrue(StringUtils.contains(str, "hops=" + hops));
+        assertTrue(StringUtils.contains(str, "transactionId=" + transactionId));
+        assertTrue(StringUtils.contains(str, "seconds=" + seconds));
+        assertTrue(StringUtils.contains(str, "flags=" + flags));
+        assertTrue(StringUtils.contains(str, "clientIPAddress=" + clientIpAddress));
+        assertTrue(StringUtils.contains(str, "yourIPAddress=" + yourIpAddress));
+        assertTrue(StringUtils.contains(str, "serverIPAddress=" + serverIpAddress));
+        assertTrue(StringUtils.contains(str, "gatewayIPAddress=" + gatewayIpAddress));
+        assertTrue(StringUtils.contains(str, "clientHardwareAddress=" + Arrays.toString(clientHardwareAddress)));
+        assertTrue(StringUtils.contains(str, "serverName=" + serverName));
+        assertTrue(StringUtils.contains(str, "bootFileName=" + bootFileName));
+        // TODO: add option unit test
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/ICMP6Test.java b/utils/misc/src/test/java/org/onlab/packet/ICMP6Test.java
index 39ddc24..8616b48 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ICMP6Test.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ICMP6Test.java
@@ -18,6 +18,7 @@
 
 package org.onlab.packet;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -107,4 +108,17 @@
         assertTrue(icmp61.equals(icmp61));
         assertFalse(icmp61.equals(icmp62));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringIcmp6() throws Exception {
+        ICMP6 icmp6 = ICMP6.deserializer().deserialize(bytePacket, 0, bytePacket.length);
+        String str = icmp6.toString();
+
+        assertTrue(StringUtils.contains(str, "icmpType=" + ICMP6.ECHO_REQUEST));
+        assertTrue(StringUtils.contains(str, "icmpCode=" + (byte) 0x00));
+        assertTrue(StringUtils.contains(str, "checksum=" + (short) 0x82bc));
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/ICMPTest.java b/utils/misc/src/test/java/org/onlab/packet/ICMPTest.java
index 8514aa5..e836dc4 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ICMPTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ICMPTest.java
@@ -16,12 +16,14 @@
 
 package org.onlab.packet;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Before;
 import org.junit.Test;
 
 import java.nio.ByteBuffer;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 /**
  * Unit tests for the ICMP class.
@@ -59,6 +61,9 @@
         PacketTestUtils.testDeserializeTruncated(deserializer, headerBytes);
     }
 
+    /**
+     * Tests deserialize and getters.
+     */
     @Test
     public void testDeserialize() throws Exception {
         ICMP icmp = deserializer.deserialize(headerBytes, 0, headerBytes.length);
@@ -67,4 +72,17 @@
         assertEquals(icmpCode, icmp.getIcmpCode());
         assertEquals(checksum, icmp.getChecksum());
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringIcmp() throws Exception {
+        ICMP icmp = deserializer.deserialize(headerBytes, 0, headerBytes.length);
+        String str = icmp.toString();
+
+        assertTrue(StringUtils.contains(str, "icmpType=" + icmpType));
+        assertTrue(StringUtils.contains(str, "icmpCode=" + icmpCode));
+        assertTrue(StringUtils.contains(str, "checksum=" + checksum));
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/IGMPTest.java b/utils/misc/src/test/java/org/onlab/packet/IGMPTest.java
index a25f721..7634bbf 100644
--- a/utils/misc/src/test/java/org/onlab/packet/IGMPTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/IGMPTest.java
@@ -93,4 +93,12 @@
         IGMP igmp = deserializer.deserialize(data, 0, data.length);
         assertTrue(igmp.equals(igmpMembership));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringIgmp() throws Exception {
+        // TODO: add toString unit test
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/IPv4Test.java b/utils/misc/src/test/java/org/onlab/packet/IPv4Test.java
index 1bacf2a..8412701 100644
--- a/utils/misc/src/test/java/org/onlab/packet/IPv4Test.java
+++ b/utils/misc/src/test/java/org/onlab/packet/IPv4Test.java
@@ -16,6 +16,7 @@
 
 package org.onlab.packet;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -78,6 +79,9 @@
         PacketTestUtils.testDeserializeTruncated(deserializer, headerBytes);
     }
 
+    /**
+     * Tests deserialize and getters.
+     */
     @Test
     public void testDeserialize() throws Exception {
         IPv4 ipv4 = deserializer.deserialize(headerBytes, 0, headerBytes.length);
@@ -96,4 +100,26 @@
         assertEquals(destinationAddress, ipv4.getDestinationAddress());
         assertTrue(ipv4.isTruncated());
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringIPv4() throws Exception {
+        IPv4 ipv4 = deserializer.deserialize(headerBytes, 0, headerBytes.length);
+        String str = ipv4.toString();
+
+        assertTrue(StringUtils.contains(str, "version=" + version));
+        assertTrue(StringUtils.contains(str, "headerLength=" + headerLength));
+        assertTrue(StringUtils.contains(str, "diffServ=" + diffServ));
+        assertTrue(StringUtils.contains(str, "totalLength=" + totalLength));
+        assertTrue(StringUtils.contains(str, "identification=" + identification));
+        assertTrue(StringUtils.contains(str, "flags=" + flags));
+        assertTrue(StringUtils.contains(str, "fragmentOffset=" + fragmentOffset));
+        assertTrue(StringUtils.contains(str, "ttl=" + ttl));
+        assertTrue(StringUtils.contains(str, "protocol=" + protocol));
+        assertTrue(StringUtils.contains(str, "checksum=" + checksum));
+        assertTrue(StringUtils.contains(str, "sourceAddress=" + sourceAddress));
+        assertTrue(StringUtils.contains(str, "destinationAddress=" + destinationAddress));
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/IPv6Test.java b/utils/misc/src/test/java/org/onlab/packet/IPv6Test.java
index 720a4d2..84e2644 100644
--- a/utils/misc/src/test/java/org/onlab/packet/IPv6Test.java
+++ b/utils/misc/src/test/java/org/onlab/packet/IPv6Test.java
@@ -18,6 +18,7 @@
 
 package org.onlab.packet;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -151,4 +152,20 @@
         assertTrue(packet1.equals(packet1));
         assertFalse(packet1.equals(packet2));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringIPv6() throws Exception {
+        IPv6 ipv6 = deserializer.deserialize(bytePacket, 0, bytePacket.length);
+        String str = ipv6.toString();
+
+        assertTrue(StringUtils.contains(str, "version=" + (byte) 6));
+        assertTrue(StringUtils.contains(str, "trafficClass=" + (byte) 0x93));
+        assertTrue(StringUtils.contains(str, "flowLabel=" + 0x13579));
+        assertTrue(StringUtils.contains(str, "nextHeader=" + IPv6.PROTOCOL_UDP));
+        assertTrue(StringUtils.contains(str, "hopLimit=" + (byte) 32));
+        // TODO: test IPv6 source and destination address
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/LLCTest.java b/utils/misc/src/test/java/org/onlab/packet/LLCTest.java
index 39bb72f..8154148 100644
--- a/utils/misc/src/test/java/org/onlab/packet/LLCTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/LLCTest.java
@@ -16,12 +16,14 @@
 
 package org.onlab.packet;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Before;
 import org.junit.Test;
 
 import java.nio.ByteBuffer;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 /**
  * Unit tests for LLC class.
@@ -59,6 +61,9 @@
         PacketTestUtils.testDeserializeTruncated(deserializer, bytes);
     }
 
+    /**
+     * Tests deserialize and getters.
+     */
     @Test
     public void testDeserialize() throws Exception {
         LLC llc = deserializer.deserialize(bytes, 0, bytes.length);
@@ -67,4 +72,17 @@
         assertEquals(ssap, llc.getSsap());
         assertEquals(ctrl, llc.getCtrl());
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringLLC() throws Exception {
+        LLC llc = deserializer.deserialize(bytes, 0, bytes.length);
+        String str = llc.toString();
+
+        assertTrue(StringUtils.contains(str, "dsap=" + dsap));
+        assertTrue(StringUtils.contains(str, "ssap=" + ssap));
+        assertTrue(StringUtils.contains(str, "ctrl=" + ctrl));
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/LLDPTest.java b/utils/misc/src/test/java/org/onlab/packet/LLDPTest.java
index 95b0b04..154dee7 100644
--- a/utils/misc/src/test/java/org/onlab/packet/LLDPTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/LLDPTest.java
@@ -89,6 +89,9 @@
         PacketTestUtils.testDeserializeTruncated(deserializer, bytes);
     }
 
+    /**
+     * Tests deserialize and getters.
+     */
     @Test
     public void testDeserialize() throws Exception {
         LLDP lldp = deserializer.deserialize(bytes, 0, bytes.length);
@@ -112,4 +115,15 @@
         assertEquals(optionalTlvSize, optionalTlv.getLength());
         assertTrue(Arrays.equals(optionalTlvValue, optionalTlv.getValue()));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringLLDP() throws Exception {
+        LLDP lldp = deserializer.deserialize(bytes, 0, bytes.length);
+        String str = lldp.toString();
+
+        // TODO: need to add LLDP toString unit test
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/MplsTest.java b/utils/misc/src/test/java/org/onlab/packet/MplsTest.java
index 2ab8ff9..b08b2e9 100644
--- a/utils/misc/src/test/java/org/onlab/packet/MplsTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/MplsTest.java
@@ -16,6 +16,7 @@
 
 package org.onlab.packet;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -23,6 +24,7 @@
 import java.util.HashMap;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 /**
  * Unit tests for MPLS class.
@@ -62,6 +64,9 @@
         PacketTestUtils.testDeserializeTruncated(deserializer, bytes);
     }
 
+    /**
+     * Tests deserialize and getters.
+     */
     @Test
     public void testDeserialize() throws Exception {
         MPLS mpls = deserializer.deserialize(bytes, 0, bytes.length);
@@ -71,4 +76,18 @@
         assertEquals(ttl, mpls.ttl);
         assertEquals(protocol, mpls.protocol);
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringMpls() throws Exception {
+        MPLS mpls = deserializer.deserialize(bytes, 0, bytes.length);
+        String str = mpls.toString();
+
+        assertTrue(StringUtils.contains(str, "label=" + label));
+        assertTrue(StringUtils.contains(str, "bos=" + bos));
+        assertTrue(StringUtils.contains(str, "ttl=" + ttl));
+        assertTrue(StringUtils.contains(str, "protocol=" + protocol));
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/PacketTestUtils.java b/utils/misc/src/test/java/org/onlab/packet/PacketTestUtils.java
index 209b1d2..3fcd6b5 100644
--- a/utils/misc/src/test/java/org/onlab/packet/PacketTestUtils.java
+++ b/utils/misc/src/test/java/org/onlab/packet/PacketTestUtils.java
@@ -61,7 +61,7 @@
      * deserialize the packet.
      *
      * @param deserializer deserializer function to test
-     * @param header byte array of a full-size packet
+     * @param header       byte array of a full-size packet
      */
     public static void testDeserializeTruncated(Deserializer deserializer,
                                                 byte[] header) {
@@ -82,9 +82,9 @@
      * DeserializationException is not thrown by the deserializer function.
      *
      * @param deserializer deserializer function to test
-     * @param bytes input byte array
-     * @param offset input offset
-     * @param length input length
+     * @param bytes        input byte array
+     * @param offset       input offset
+     * @param length       input length
      */
     public static void expectDeserializationException(Deserializer deserializer,
                                                       byte[] bytes, int offset, int length) {
diff --git a/utils/misc/src/test/java/org/onlab/packet/TCPTest.java b/utils/misc/src/test/java/org/onlab/packet/TCPTest.java
index faab5c2..1d6814b 100644
--- a/utils/misc/src/test/java/org/onlab/packet/TCPTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/TCPTest.java
@@ -18,6 +18,7 @@
 
 package org.onlab.packet;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -160,4 +161,23 @@
         assertTrue(tcp1.equals(tcp1));
         assertFalse(tcp1.equals(tcp2));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringTcp() throws Exception {
+        TCP tcp = deserializer.deserialize(bytePacketTCP4, 0, bytePacketTCP4.length);
+        String str = tcp.toString();
+
+        assertTrue(StringUtils.contains(str, "sourcePort=" + 0x50));
+        assertTrue(StringUtils.contains(str, "destinationPort=" + 0x60));
+        assertTrue(StringUtils.contains(str, "sequence=" + 0x10));
+        assertTrue(StringUtils.contains(str, "acknowledge=" + 0x20));
+        assertTrue(StringUtils.contains(str, "dataOffset=" + (byte) 0x5));
+        assertTrue(StringUtils.contains(str, "flags=" + (short) 0x2));
+        assertTrue(StringUtils.contains(str, "windowSize=" + (short) 0x1000));
+        assertTrue(StringUtils.contains(str, "checksum=" + (short) 0x1bae));
+        assertTrue(StringUtils.contains(str, "urgentPointer=" + (short) 0x1));
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/UDPTest.java b/utils/misc/src/test/java/org/onlab/packet/UDPTest.java
index ba453f6..4b83897 100644
--- a/utils/misc/src/test/java/org/onlab/packet/UDPTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/UDPTest.java
@@ -18,6 +18,7 @@
 
 package org.onlab.packet;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -131,4 +132,18 @@
         assertTrue(udp1.equals(udp1));
         assertFalse(udp1.equals(udp2));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringUdp() throws Exception {
+        UDP udp = deserializer.deserialize(bytePacketUDP4, 0, bytePacketUDP4.length);
+        String str = udp.toString();
+
+        assertTrue(StringUtils.contains(str, "sourcePort=" + 0x50));
+        assertTrue(StringUtils.contains(str, "destinationPort=" + 0x60));
+        assertTrue(StringUtils.contains(str, "length=" + (short) 8));
+        assertTrue(StringUtils.contains(str, "checksum=" + (short) 0x7bda));
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/ipv6/AuthenticationTest.java b/utils/misc/src/test/java/org/onlab/packet/ipv6/AuthenticationTest.java
index 39ab910..5ca7ea4 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ipv6/AuthenticationTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ipv6/AuthenticationTest.java
@@ -16,6 +16,7 @@
 
 package org.onlab.packet.ipv6;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -23,11 +24,10 @@
 import org.onlab.packet.Deserializer;
 import org.onlab.packet.UDP;
 
+import java.util.Arrays;
+
 import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 /**
  * Tests for class {@link Authentication}.
@@ -118,4 +118,19 @@
         assertTrue(auth1.equals(auth1));
         assertFalse(auth1.equals(auth2));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringAuthentication() throws Exception {
+        Authentication auth = deserializer.deserialize(bytePacket, 0, bytePacket.length);
+        String str = auth.toString();
+
+        assertTrue(StringUtils.contains(str, "nextHeader=" + (byte) 0x11));
+        assertTrue(StringUtils.contains(str, "payloadLength=" + (byte) 0x02));
+        assertTrue(StringUtils.contains(str, "securityParamIndex=" + 0x13572468));
+        assertTrue(StringUtils.contains(str, "sequence=" + 0xffff00));
+        assertTrue(StringUtils.contains(str, "integrityCheck=" + Arrays.toString(icv)));
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/ipv6/BaseOptionsTest.java b/utils/misc/src/test/java/org/onlab/packet/ipv6/BaseOptionsTest.java
index bb91e9e..17ada1e 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ipv6/BaseOptionsTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ipv6/BaseOptionsTest.java
@@ -16,6 +16,7 @@
 
 package org.onlab.packet.ipv6;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -24,11 +25,10 @@
 import org.onlab.packet.IPv6;
 import org.onlab.packet.UDP;
 
+import java.util.Arrays;
+
 import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 /**
  * Tests for class {@link BaseOptions}.
@@ -112,4 +112,17 @@
         assertTrue(baseopt1.equals(baseopt1));
         assertFalse(baseopt1.equals(baseopt2));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringBaseOptions() throws Exception {
+        BaseOptions baseopt = deserializer.deserialize(bytePacket, 0, bytePacket.length);
+        String str = baseopt.toString();
+
+        assertTrue(StringUtils.contains(str, "nextHeader=" + (byte) 0x11));
+        assertTrue(StringUtils.contains(str, "headerExtLength=" + (byte) 0x00));
+        assertTrue(StringUtils.contains(str, "options=" + Arrays.toString(options)));
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/ipv6/EncapSecurityPayloadTest.java b/utils/misc/src/test/java/org/onlab/packet/ipv6/EncapSecurityPayloadTest.java
index e0e9919..d8e2f34 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ipv6/EncapSecurityPayloadTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ipv6/EncapSecurityPayloadTest.java
@@ -16,6 +16,7 @@
 
 package org.onlab.packet.ipv6;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -101,4 +102,16 @@
         assertTrue(esp1.equals(esp1));
         assertFalse(esp1.equals(esp2));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringESP() throws Exception {
+        EncapSecurityPayload esp = deserializer.deserialize(bytePacket, 0, bytePacket.length);
+        String str = esp.toString();
+
+        assertTrue(StringUtils.contains(str, "securityParamIndex=" + 0x13572468));
+        assertTrue(StringUtils.contains(str, "sequence=" + 0xffff00));
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/ipv6/FragmentTest.java b/utils/misc/src/test/java/org/onlab/packet/ipv6/FragmentTest.java
index f2d5e48..7e5dc15 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ipv6/FragmentTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ipv6/FragmentTest.java
@@ -16,6 +16,7 @@
 
 package org.onlab.packet.ipv6;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -110,4 +111,18 @@
         assertTrue(frag1.equals(frag1));
         assertFalse(frag1.equals(frag2));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringFragment() throws Exception {
+        Fragment frag = deserializer.deserialize(bytePacket, 0, bytePacket.length);
+        String str = frag.toString();
+
+        assertTrue(StringUtils.contains(str, "nextHeader=" + (byte) 0x11));
+        assertTrue(StringUtils.contains(str, "fragmentOffset=" + (short) 0x1f));
+        assertTrue(StringUtils.contains(str, "moreFragment=" + (byte) 1));
+        assertTrue(StringUtils.contains(str, "identification=" + 0x1357));
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/ipv6/RoutingTest.java b/utils/misc/src/test/java/org/onlab/packet/ipv6/RoutingTest.java
index a03bacc..293c9d7 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ipv6/RoutingTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ipv6/RoutingTest.java
@@ -16,6 +16,7 @@
 
 package org.onlab.packet.ipv6;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -24,11 +25,10 @@
 import org.onlab.packet.Deserializer;
 import org.onlab.packet.UDP;
 
+import java.util.Arrays;
+
 import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 /**
  * Tests for class {@link Routing}.
@@ -125,4 +125,19 @@
         assertTrue(routing1.equals(routing1));
         assertFalse(routing1.equals(routing2));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringRouting() throws Exception {
+        Routing routing = deserializer.deserialize(bytePacket, 0, bytePacket.length);
+        String str = routing.toString();
+
+        assertTrue(StringUtils.contains(str, "nextHeader=" + (byte) 0x11));
+        assertTrue(StringUtils.contains(str, "headerExtLength=" + (byte) 0x02));
+        assertTrue(StringUtils.contains(str, "routingType=" + (byte) 0x00));
+        assertTrue(StringUtils.contains(str, "segmentsLeft=" + (byte) 0x03));
+        assertTrue(StringUtils.contains(str, "routingData=" + Arrays.toString(routingData)));
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborAdvertisementTest.java b/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborAdvertisementTest.java
index d537251..6b03ca9 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborAdvertisementTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborAdvertisementTest.java
@@ -15,6 +15,7 @@
  */
 package org.onlab.packet.ndp;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.onlab.packet.DeserializationException;
@@ -25,10 +26,7 @@
 import java.nio.ByteBuffer;
 
 import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 /**
  * Tests for class {@link NeighborAdvertisement}.
@@ -137,4 +135,18 @@
         assertTrue(na1.equals(na1));
         assertFalse(na1.equals(na2));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringNA() throws Exception {
+        NeighborAdvertisement na = deserializer.deserialize(bytePacket, 0, bytePacket.length);
+        String str = na.toString();
+
+        assertTrue(StringUtils.contains(str, "routerFlag=" + (byte) 1));
+        assertTrue(StringUtils.contains(str, "solicitedFlag=" + (byte) 1));
+        assertTrue(StringUtils.contains(str, "overrideFlag=" + (byte) 1));
+        // TODO: need to handle TARGET_ADDRESS
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborSolicitationTest.java b/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborSolicitationTest.java
index 03e57f5e..6f8c9da 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborSolicitationTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborSolicitationTest.java
@@ -25,10 +25,7 @@
 import java.nio.ByteBuffer;
 
 import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 /**
  * Tests for class {@link NeighborSolicitation}.
@@ -131,4 +128,15 @@
         assertTrue(ns1.equals(ns1));
         assertFalse(ns1.equals(ns2));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringNS() throws Exception {
+        NeighborSolicitation ns = deserializer.deserialize(bytePacket, 0, bytePacket.length);
+        String str = ns.toString();
+
+        // TODO: need to handle TARGET_ADDRESS and Options
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/ndp/RedirectTest.java b/utils/misc/src/test/java/org/onlab/packet/ndp/RedirectTest.java
index 3115714..e70da7c 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ndp/RedirectTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ndp/RedirectTest.java
@@ -144,4 +144,15 @@
         assertTrue(rd1.equals(rd1));
         assertFalse(rd1.equals(rd2));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringRedirect() throws Exception {
+        Redirect rd = deserializer.deserialize(bytePacket, 0, bytePacket.length);
+        String str = rd.toString();
+
+        // TODO: need to handle TARGET_ADDRESS and DESTINATION_ADDRESS
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/ndp/RouterAdvertisementTest.java b/utils/misc/src/test/java/org/onlab/packet/ndp/RouterAdvertisementTest.java
index ede1574..014f36e 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ndp/RouterAdvertisementTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ndp/RouterAdvertisementTest.java
@@ -15,6 +15,7 @@
  */
 package org.onlab.packet.ndp;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.onlab.packet.DeserializationException;
@@ -137,4 +138,22 @@
         assertTrue(ra1.equals(ra1));
         assertFalse(ra1.equals(ra2));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringRA() throws Exception {
+        RouterAdvertisement ra = deserializer.deserialize(bytePacket, 0, bytePacket.length);
+        String str = ra.toString();
+
+        assertTrue(StringUtils.contains(str, "currentHopLimit=" + (byte) 3));
+        assertTrue(StringUtils.contains(str, "mFlag=" + (byte) 1));
+        assertTrue(StringUtils.contains(str, "oFlag=" + (byte) 1));
+        assertTrue(StringUtils.contains(str, "routerLifetime=" + (short) 0x258));
+        assertTrue(StringUtils.contains(str, "reachableTime=" + 0x3e8));
+        assertTrue(StringUtils.contains(str, "retransmitTimer=" + 0x1f4));
+
+        // TODO: need to handle options
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/ndp/RouterSolicitationTest.java b/utils/misc/src/test/java/org/onlab/packet/ndp/RouterSolicitationTest.java
index e3b5686..b562f38 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ndp/RouterSolicitationTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ndp/RouterSolicitationTest.java
@@ -24,10 +24,7 @@
 import java.nio.ByteBuffer;
 
 import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 /**
  * Tests for class {@link RouterSolicitation}.
@@ -111,4 +108,15 @@
         assertTrue(rs1.equals(rs1));
         assertFalse(rs1.equals(rs2));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringRS() throws Exception {
+        RouterSolicitation rs = deserializer.deserialize(bytePacket, 0, bytePacket.length);
+        String str = rs.toString();
+
+        // TODO: need to handle Options
+    }
 }