[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/lldp/src/main/java/org/onosproject/provider/lldp/impl/LldpLinkProvider.java b/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/LldpLinkProvider.java
index 6ff437a..cd7e2d2 100644
--- a/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/LldpLinkProvider.java
+++ b/providers/lldp/src/main/java/org/onosproject/provider/lldp/impl/LldpLinkProvider.java
@@ -29,7 +29,6 @@
 import org.onlab.util.SharedExecutors;
 import org.onlab.util.Tools;
 import org.onosproject.cfg.ComponentConfigService;
-import org.onosproject.cluster.ClusterMetadata;
 import org.onosproject.cluster.ClusterMetadataService;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.core.ApplicationId;
@@ -53,7 +52,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.link.LinkService;
@@ -85,7 +84,6 @@
 import static org.onlab.packet.Ethernet.TYPE_LLDP;
 import static org.onlab.util.Tools.get;
 import static org.onlab.util.Tools.groupedThreads;
-import static org.onosproject.cluster.ClusterMetadata.NO_NAME;
 import static org.onosproject.net.Link.Type.DIRECT;
 import static org.onosproject.net.config.basics.SubjectFactories.APP_SUBJECT_FACTORY;
 import static org.onosproject.net.config.basics.SubjectFactories.CONNECT_POINT_SUBJECT_FACTORY;
@@ -96,7 +94,7 @@
  * Provider which uses LLDP and BDDP packets to detect network infrastructure links.
  */
 @Component(immediate = true)
-public class LldpLinkProvider extends AbstractProvider implements LinkProvider {
+public class LldpLinkProvider extends AbstractProvider implements ProbedLinkProvider {
 
     private static final String PROVIDER_NAME = "org.onosproject.provider.lldp";
 
@@ -194,7 +192,6 @@
 
     public static final String CONFIG_KEY = "suppression";
     public static final String FEATURE_NAME = "linkDiscovery";
-    public static final String FINGERPRINT_FEATURE_NAME = "fingerprint";
 
     private final Set<ConfigFactory<?, ?>> factories = ImmutableSet.of(
             new ConfigFactory<ApplicationId, SuppressionConfig>(APP_SUBJECT_FACTORY,
@@ -218,19 +215,11 @@
                 public LinkDiscoveryFromPort createConfig() {
                     return new LinkDiscoveryFromPort();
                 }
-            },
-            new ConfigFactory<DeviceId, FingerprintProbeFromDevice>(DEVICE_SUBJECT_FACTORY,
-                    FingerprintProbeFromDevice.class, FINGERPRINT_FEATURE_NAME) {
-                @Override
-                public FingerprintProbeFromDevice createConfig() {
-                    return new FingerprintProbeFromDevice();
-                }
             }
     );
 
     private final InternalConfigListener cfgListener = new InternalConfigListener();
 
-
     /**
      * Creates an OpenFlow link provider.
      */
@@ -238,6 +227,17 @@
         super(new ProviderId("lldp", PROVIDER_NAME));
     }
 
+    private final String buildSrcMac() {
+        String srcMac = ProbedLinkProvider.fingerprintMac(clusterMetadataService.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;
+    }
+
     @Activate
     public void activate(ComponentContext context) {
         cfgService.registerProperties(getClass());
@@ -404,14 +404,6 @@
         return isBlacklisted(new ConnectPoint(port.element().id(), port.number()));
     }
 
-    private boolean isFingerprinted(DeviceId did) {
-        FingerprintProbeFromDevice cfg = cfgRegistry.getConfig(did, FingerprintProbeFromDevice.class);
-        if (cfg == null) {
-            return false;
-        }
-        return cfg.enabled();
-    }
-
     /**
      * Updates discovery helper for specified device.
      *
@@ -433,11 +425,6 @@
 
         LinkDiscovery ld = discoverers.computeIfAbsent(device.id(),
                                      did -> new LinkDiscovery(device, context));
-        if (isFingerprinted(device.id())) {
-            ld.enableFingerprint();
-        } else {
-            ld.disableFingerprint();
-        }
         if (ld.isStopped()) {
             ld.start();
         }
@@ -753,14 +740,13 @@
         }
 
         @Override
-        public String fingerprint() {
-            ClusterMetadata mdata = clusterMetadataService.getClusterMetadata();
-            return mdata == null ? NO_NAME : mdata.getName();
+        public DeviceService deviceService() {
+            return deviceService;
         }
 
         @Override
-        public DeviceService deviceService() {
-            return deviceService;
+        public String fingerprint() {
+            return buildSrcMac();
         }
     }
 
@@ -808,15 +794,6 @@
                         }
                     }
 
-                } else if (event.configClass() == FingerprintProbeFromDevice.class &&
-                        CONFIG_CHANGED.contains(event.type())) {
-
-                    if (event.subject() instanceof DeviceId) {
-                        final DeviceId did = (DeviceId) event.subject();
-                        Device device = deviceService.getDevice(did);
-                        updateDevice(device);
-                    }
-
                 } else if (event.configClass().equals(SuppressionConfig.class) &&
                         (event.type() == NetworkConfigEvent.Type.CONFIG_ADDED ||
                                 event.type() == NetworkConfigEvent.Type.CONFIG_UPDATED)) {