[ONOS-7281] Using slow protocol destination mac address (01:80:C2:00:00:0E), and supporting port description in ONOS LLDP

Change-Id: I98dfbad436da0b689a2ac89665ee3298c32b61e8
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 cd46eee..33b1f85 100644
--- a/utils/misc/src/main/java/org/onlab/packet/LLDP.java
+++ b/utils/misc/src/main/java/org/onlab/packet/LLDP.java
@@ -117,6 +117,16 @@
         return this;
     }
 
+    /**
+     * Adds additional TLV to optionalTLVList.
+     * @param lldptlv the optional TLV to be added
+     * @return this
+     */
+    public LLDP addOptionalTLV(final LLDPTLV lldptlv) {
+        this.optionalTLVList.add(lldptlv);
+        return this;
+    }
+
     @Override
     public byte[] serialize() {
         int length = 2 + this.chassisId.getLength() + 2
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 bfac8f0..62f2e7a 100644
--- a/utils/misc/src/main/java/org/onlab/packet/LLDPTLV.java
+++ b/utils/misc/src/main/java/org/onlab/packet/LLDPTLV.java
@@ -26,6 +26,9 @@
  *
  */
 public class LLDPTLV {
+
+    public static final int MAX_LENGTH = 0x1ff;
+
     protected byte type;
     protected short length;
     protected byte[] value;
diff --git a/utils/misc/src/main/java/org/onlab/packet/MacAddress.java b/utils/misc/src/main/java/org/onlab/packet/MacAddress.java
index b048794..8a6d918 100644
--- a/utils/misc/src/main/java/org/onlab/packet/MacAddress.java
+++ b/utils/misc/src/main/java/org/onlab/packet/MacAddress.java
@@ -36,9 +36,9 @@
      */
     public static final MacAddress NONE = ONOS;
     /**
-     * ONOS LLDP MAC address with multicast bit set.
+     * ONOS LLDP MAC address with slow protocol destination address.
      */
-    public static final MacAddress ONOS_LLDP = valueOf("a5:23:05:00:00:01");
+    public static final MacAddress ONOS_LLDP = valueOf("01:80:C2:00:00:0E");
     /**
      * All-zero MAC address.
      */
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 706a8b1..c45ff71 100644
--- a/utils/misc/src/main/java/org/onlab/packet/ONOSLLDP.java
+++ b/utils/misc/src/main/java/org/onlab/packet/ONOSLLDP.java
@@ -21,6 +21,7 @@
 
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
 import java.util.HashMap;
 
 import static org.onlab.packet.LLDPOrganizationalTLV.OUI_LENGTH;
@@ -58,6 +59,8 @@
 
     private static final byte TTL_TLV_TYPE = 3;
 
+    private static final byte PORT_DESC_TLV_TYPE = 4;
+
     private final byte[] ttlValue = new byte[] {0, 0x78};
 
     // Only needs to be accessed from LinkProbeFactory.
@@ -240,4 +243,33 @@
         probe.setChassisId(chassisId);
         return probe;
     }
+
+    /**
+     * Creates a link probe for link discovery/verification.
+     *
+     * @param deviceId The device ID as a String
+     * @param chassisId The chassis ID of the device
+     * @param portNum Port number of port to send probe out of
+     * @param portDesc Port description of port to send probe out of
+     * @return ONOSLLDP probe message
+     */
+    public static ONOSLLDP onosLLDP(String deviceId, ChassisId chassisId, int portNum, String portDesc) {
+
+        ONOSLLDP probe = onosLLDP(deviceId, chassisId, portNum);
+
+        if (portDesc != null && !portDesc.isEmpty()) {
+            byte[] bPortDesc = portDesc.getBytes(StandardCharsets.UTF_8);
+
+            if (bPortDesc.length > LLDPTLV.MAX_LENGTH) {
+                bPortDesc = Arrays.copyOf(bPortDesc, LLDPTLV.MAX_LENGTH);
+            }
+            LLDPTLV portDescTlv = new LLDPTLV()
+                    .setType(PORT_DESC_TLV_TYPE)
+                    .setLength((short) bPortDesc.length)
+                    .setValue(bPortDesc);
+            probe.addOptionalTLV(portDescTlv);
+        }
+        return probe;
+    }
+
 }