[ONOS-4424] Tag LLDP/BDDP source address with fingerprint

Link probes incorporate cluster fingerprint in source
MAC address. This removes the need for an additional TLV and the
complexity associated with it, and also adds fingerprinting to
BDDPs for free.

 - fingerprint in Ethernet source address. The old default MAC
   value is only used when the CusterMetadata service isn't ready.
 - remove support for TLV fingerprint field and associated config
   knobs.
 - links at control domain boundary are classified as EDGE type links.

Change-Id: Idb07dd06fbeee25e9fcee3fbdddec7a7dbb2c397
diff --git a/providers/netcfglinks/src/main/java/org/onosproject/provider/netcfglinks/NetworkConfigLinksProvider.java b/providers/netcfglinks/src/main/java/org/onosproject/provider/netcfglinks/NetworkConfigLinksProvider.java
index 6851e7e..186024b 100644
--- a/providers/netcfglinks/src/main/java/org/onosproject/provider/netcfglinks/NetworkConfigLinksProvider.java
+++ b/providers/netcfglinks/src/main/java/org/onosproject/provider/netcfglinks/NetworkConfigLinksProvider.java
@@ -29,6 +29,7 @@
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.ONOSLLDP;
+import org.onosproject.cluster.ClusterMetadataService;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.mastership.MastershipService;
@@ -50,7 +51,7 @@
 import org.onosproject.net.flow.DefaultTrafficSelector;
 import org.onosproject.net.flow.TrafficSelector;
 import org.onosproject.net.link.DefaultLinkDescription;
-import org.onosproject.net.link.LinkProvider;
+import org.onosproject.net.link.ProbedLinkProvider;
 import org.onosproject.net.link.LinkProviderRegistry;
 import org.onosproject.net.link.LinkProviderService;
 import org.onosproject.net.packet.InboundPacket;
@@ -77,7 +78,7 @@
 @Component(immediate = true)
 public class NetworkConfigLinksProvider
         extends AbstractProvider
-        implements LinkProvider {
+        implements ProbedLinkProvider {
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected LinkProviderRegistry providerRegistry;
@@ -97,6 +98,9 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected CoreService coreService;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected ClusterMetadataService metadataService;
+
     private static final String PROP_PROBE_RATE = "probeRate";
     private static final int DEFAULT_PROBE_RATE = 3000;
     @Property(name = PROP_PROBE_RATE, intValue = DEFAULT_PROBE_RATE,
@@ -125,6 +129,17 @@
         super(new ProviderId("lldp", PROVIDER_NAME));
     }
 
+    private final String buildSrcMac() {
+        String srcMac = ProbedLinkProvider.fingerprintMac(metadataService.getClusterMetadata());
+        String defMac = ProbedLinkProvider.defaultMac();
+        if (srcMac.equals(defMac)) {
+            log.warn("Couldn't generate fingerprint. Using default value {}", defMac);
+            return defMac;
+        }
+        log.trace("Generated MAC address {}", srcMac);
+        return srcMac;
+    }
+
     private void createLinks() {
         netCfgService.getSubjects(LinkKey.class)
                 .forEach(linkKey -> configuredLinks.add(linkKey));
@@ -166,7 +181,7 @@
         }
 
         LinkDiscovery ld = discoverers.computeIfAbsent(device.id(),
-                                                       did -> new LinkDiscovery(device, context));
+                did -> new LinkDiscovery(device, context));
         if (ld.isStopped()) {
             ld.start();
         }
@@ -240,7 +255,7 @@
 
         @Override
         public String fingerprint() {
-            return "";
+            return buildSrcMac();
         }
 
         @Override