Cleaned out all BDDP related features, and some other obselete code.

Change-Id: I07fd3737ba62a6bb6e43b29342a1f05940f5667c
diff --git a/src/main/java/net/onrc/onos/core/linkdiscovery/ILinkDiscoveryService.java b/src/main/java/net/onrc/onos/core/linkdiscovery/ILinkDiscoveryService.java
index fb2de2b..8f232b1 100644
--- a/src/main/java/net/onrc/onos/core/linkdiscovery/ILinkDiscoveryService.java
+++ b/src/main/java/net/onrc/onos/core/linkdiscovery/ILinkDiscoveryService.java
@@ -65,21 +65,4 @@
      * Removes a switch port from suppress lldp set.
      */
     public void removeFromSuppressLLDPs(long sw, short port);
-
-    /**
-     * Get the set of quarantined ports on a switch.
-     */
-    public Set<Short> getQuarantinedPorts(long sw);
-
-    /**
-     * Get the status of auto port fast feature.
-     */
-    public boolean isAutoPortFastFeature();
-
-    /**
-     * Set the state for auto port fast feature.
-     *
-     * @param autoPortFastFeature
-     */
-    public void setAutoPortFastFeature(boolean autoPortFastFeature);
 }
diff --git a/src/main/java/net/onrc/onos/core/linkdiscovery/LinkInfo.java b/src/main/java/net/onrc/onos/core/linkdiscovery/LinkInfo.java
index f757360..9d8481a 100644
--- a/src/main/java/net/onrc/onos/core/linkdiscovery/LinkInfo.java
+++ b/src/main/java/net/onrc/onos/core/linkdiscovery/LinkInfo.java
@@ -23,7 +23,6 @@
 
     public LinkInfo(Long firstSeenTime,
                     Long lastLldpReceivedTime,
-                    Long lastBddpReceivedTime,
                     int srcPortState,
                     int dstPortState) {
         super();
@@ -31,14 +30,12 @@
         this.dstPortState = dstPortState;
         this.firstSeenTime = firstSeenTime;
         this.lastLldpReceivedTime = lastLldpReceivedTime;
-        this.lastBddpReceivedTime = lastBddpReceivedTime;
     }
 
     protected Integer srcPortState;
     protected Integer dstPortState;
     protected Long firstSeenTime;
     protected Long lastLldpReceivedTime; /* Standard LLLDP received time */
-    protected Long lastBddpReceivedTime; /* Modified LLDP received time  */
 
     /**
      * The port states stored here are topology's last knowledge of
@@ -73,14 +70,6 @@
         this.lastLldpReceivedTime = unicastValidTime;
     }
 
-    public Long getMulticastValidTime() {
-        return lastBddpReceivedTime;
-    }
-
-    public void setMulticastValidTime(Long multicastValidTime) {
-        this.lastBddpReceivedTime = multicastValidTime;
-    }
-
     public Integer getSrcPortState() {
         return srcPortState;
     }
@@ -100,8 +89,6 @@
     public LinkType getLinkType() {
         if (lastLldpReceivedTime != null) {
             return LinkType.DIRECT_LINK;
-        } else if (lastBddpReceivedTime != null) {
-            return LinkType.MULTIHOP_LINK;
         }
         return LinkType.INVALID_LINK;
     }
@@ -115,7 +102,6 @@
         int result = 1;
         result = prime * result + ((firstSeenTime == null) ? 0 : firstSeenTime.hashCode());
         result = prime * result + ((lastLldpReceivedTime == null) ? 0 : lastLldpReceivedTime.hashCode());
-        result = prime * result + ((lastBddpReceivedTime == null) ? 0 : lastBddpReceivedTime.hashCode());
         result = prime * result + ((srcPortState == null) ? 0 : srcPortState.hashCode());
         result = prime * result + ((dstPortState == null) ? 0 : dstPortState.hashCode());
         return result;
@@ -153,14 +139,6 @@
             return false;
         }
 
-        if (lastBddpReceivedTime == null) {
-            if (other.lastBddpReceivedTime != null) {
-                return false;
-            }
-        } else if (!lastBddpReceivedTime.equals(other.lastBddpReceivedTime)) {
-            return false;
-        }
-
         if (srcPortState == null) {
             if (other.srcPortState != null) {
                 return false;
@@ -187,7 +165,6 @@
     @Override
     public String toString() {
         return "LinkInfo [unicastValidTime=" + ((lastLldpReceivedTime == null) ? "null" : lastLldpReceivedTime)
-                + ", multicastValidTime=" + ((lastBddpReceivedTime == null) ? "null" : lastBddpReceivedTime)
                 + ", srcPortState=" + ((srcPortState == null) ? "null" : srcPortState)
                 + ", dstPortState=" + ((dstPortState == null) ? "null" : srcPortState)
                 + "]";
diff --git a/src/main/java/net/onrc/onos/core/linkdiscovery/internal/LinkDiscoveryManager.java b/src/main/java/net/onrc/onos/core/linkdiscovery/internal/LinkDiscoveryManager.java
index 33dbf57..22baf58 100644
--- a/src/main/java/net/onrc/onos/core/linkdiscovery/internal/LinkDiscoveryManager.java
+++ b/src/main/java/net/onrc/onos/core/linkdiscovery/internal/LinkDiscoveryManager.java
@@ -18,9 +18,6 @@
 package net.onrc.onos.core.linkdiscovery.internal;
 
 import java.io.IOException;
-import java.net.InetAddress;
-import java.net.NetworkInterface;
-import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -32,7 +29,6 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -45,7 +41,6 @@
 import net.floodlightcontroller.core.annotations.LogMessageCategory;
 import net.floodlightcontroller.core.annotations.LogMessageDoc;
 import net.floodlightcontroller.core.annotations.LogMessageDocs;
-import net.floodlightcontroller.core.internal.OFSwitchImpl;
 import net.floodlightcontroller.core.module.FloodlightModuleContext;
 import net.floodlightcontroller.core.module.FloodlightModuleException;
 import net.floodlightcontroller.core.module.IFloodlightModule;
@@ -62,12 +57,8 @@
 import net.onrc.onos.core.linkdiscovery.LinkInfo;
 import net.onrc.onos.core.linkdiscovery.NodePortTuple;
 import net.onrc.onos.core.linkdiscovery.web.LinkDiscoveryWebRoutable;
-import net.onrc.onos.core.main.IOnosRemoteSwitch;
-import net.onrc.onos.core.packet.BSN;
 import net.onrc.onos.core.packet.Ethernet;
-import net.onrc.onos.core.packet.IPv4;
 import net.onrc.onos.core.packet.LLDP;
-import net.onrc.onos.core.packet.LLDPTLV;
 import net.onrc.onos.core.packet.OnosLldp;
 import net.onrc.onos.core.registry.IControllerRegistryService;
 import net.onrc.onos.core.util.SwitchPort;
@@ -124,35 +115,12 @@
     protected IControllerRegistryService registryService;
 
 
-    // LLDP and BDDP fields
+    // LLDP fields
     private static final byte[] LLDP_STANDARD_DST_MAC_STRING =
             HexString.fromHexString("01:80:c2:00:00:0e");
     private static final long LINK_LOCAL_MASK = 0xfffffffffff0L;
     private static final long LINK_LOCAL_VALUE = 0x0180c2000000L;
 
-    // BigSwitch OUI is 5C:16:C7, so 5D:16:C7 is the multicast version
-    // private static final String LLDP_BSN_DST_MAC_STRING = "5d:16:c7:00:00:01";
-    private static final String LLDP_BSN_DST_MAC_STRING = "ff:ff:ff:ff:ff:ff";
-
-
-    // Direction TLVs are used to indicate if the LLDPs were sent
-    // periodically or in response to a recieved LLDP
-    private static final byte TLV_DIRECTION_TYPE = 0x73;
-    private static final short TLV_DIRECTION_LENGTH = 1;  // 1 byte
-    private static final byte[] TLV_DIRECTION_VALUE_FORWARD = {0x01};
-    private static final byte[] TLV_DIRECTION_VALUE_REVERSE = {0x02};
-    private static final LLDPTLV FORWARD_TLV
-            = new LLDPTLV().
-            setType(TLV_DIRECTION_TYPE).
-            setLength(TLV_DIRECTION_LENGTH).
-            setValue(TLV_DIRECTION_VALUE_FORWARD);
-
-    private static final LLDPTLV REVERSE_TLV
-            = new LLDPTLV().
-            setType(TLV_DIRECTION_TYPE).
-            setLength(TLV_DIRECTION_LENGTH).
-            setValue(TLV_DIRECTION_VALUE_REVERSE);
-
     // Link discovery task details.
     protected SingletonTask discoveryTask;
     protected static final int DISCOVERY_TASK_INTERVAL = 1;
@@ -164,23 +132,10 @@
     // value to a small number, say 1 or 2 sec.
     protected static final int LLDP_TO_KNOWN_INTERVAL = 20; // LLDP frequency for known links
 
-    protected LLDPTLV controllerTLV;
     protected ReentrantReadWriteLock lock;
     int lldpTimeCount = 0;
 
     /**
-     * Flag to indicate if automatic port fast is enabled or not.
-     * Default is set to false -- Initialized in the init method as well.
-     */
-    boolean autoPortFastFeature = false;
-
-    /**
-     * Map of remote switches that are not connected to this controller. This
-     * is used to learn remote switches in a distributed controller ONOS.
-     */
-    protected Map<Long, IOnosRemoteSwitch> remoteSwitches;
-
-    /**
      * Map from link to the most recent time it was verified functioning.
      */
     protected Map<Link, LinkInfo> links;
@@ -196,14 +151,6 @@
     protected Map<NodePortTuple, Set<Link>> portLinks;
 
     /**
-     * Set of link tuples over which multicast LLDPs are received
-     * and unicast LLDPs are not received.
-     */
-    protected Map<NodePortTuple, Set<Link>> portBroadcastDomainLinks;
-
-    protected volatile boolean shuttingDown = false;
-
-    /**
      * Topology aware components are called in the order they were added to the
      * the array.
      */
@@ -251,14 +198,8 @@
      * them.  Data traffic from these ports are not allowed until the ports
      * are released from quarantine.
      */
-    protected LinkedBlockingQueue<NodePortTuple> quarantineQueue;
-    protected LinkedBlockingQueue<NodePortTuple> maintenanceQueue;
-    /**
-     * Quarantine task.
-     */
-    //protected SingletonTask bddpTask;
-    protected static final int BDDP_TASK_INTERVAL = 100; // 100 ms.
-    protected static final int BDDP_TASK_SIZE = 5;       // # of ports per iteration
+    //protected LinkedBlockingQueue<NodePortTuple> quarantineQueue;
+    //protected LinkedBlockingQueue<NodePortTuple> maintenanceQueue;
 
     /**
      * Map of broadcast domain ports and the last time a BDDP was either
@@ -315,20 +256,10 @@
         discover(npt);
     }
 
-    public boolean isShuttingDown() {
-        return shuttingDown;
-    }
-
-    public boolean isFastPort(long sw, short port) {
-        return false;
-    }
-
     @Override
     public ILinkDiscovery.LinkType getLinkType(Link lt, LinkInfo info) {
         if (info.getUnicastValidTime() != null) {
             return ILinkDiscovery.LinkType.DIRECT_LINK;
-        } else if (info.getMulticastValidTime() != null) {
-            return ILinkDiscovery.LinkType.MULTIHOP_LINK;
         }
         return ILinkDiscovery.LinkType.INVALID_LINK;
     }
@@ -352,155 +283,6 @@
         }
     }
 
-
-    /**
-     * Quarantine Ports.
-     */
-    /*
-    protected class QuarantineWorker implements Runnable {
-        @Override
-        public void run() {
-            try {
-                processBDDPLists();
-            } catch (Exception e) {
-                log.error("Error in quarantine worker thread", e);
-            } finally {
-                bddpTask.reschedule(BDDP_TASK_INTERVAL,
-                        TimeUnit.MILLISECONDS);
-            }
-        }
-    }
-    */
-
-    /**
-     * Add a switch port to the quarantine queue. Schedule the
-     * quarantine task if the quarantine queue was empty before adding
-     * this switch port.
-     *
-     * @param npt
-     */
-    protected void addToQuarantineQueue(NodePortTuple npt) {
-        if (!quarantineQueue.contains(npt)) {
-            quarantineQueue.add(npt);
-        }
-    }
-
-    /**
-     * Remove a switch port from the quarantine queue.
-     */
-    protected void removeFromQuarantineQueue(NodePortTuple npt) {
-        // Remove all occurrences of the node port tuple from the list.
-        boolean removedSomething;
-
-        do {
-            removedSomething = quarantineQueue.remove(npt);
-        } while (removedSomething);
-    }
-
-    /**
-     * Add a switch port to maintenance queue.
-     *
-     * @param npt
-     */
-    protected void addToMaintenanceQueue(NodePortTuple npt) {
-        // TODO We are not checking if the switch port tuple is already
-        // in the maintenance list or not.  This will be an issue for
-        // really large number of switch ports in the network.
-        if (!maintenanceQueue.contains(npt)) {
-            maintenanceQueue.add(npt);
-        }
-    }
-
-    /**
-     * Remove a switch port from maintenance queue.
-     *
-     * @param npt
-     */
-    protected void removeFromMaintenanceQueue(NodePortTuple npt) {
-        // Remove all occurrences of the node port tuple from the queue.
-        boolean removedSomething;
-        do {
-            removedSomething = maintenanceQueue.remove(npt);
-        } while (removedSomething);
-    }
-
-    /**
-     * This method processes the quarantine list in bursts.  The task is
-     * at most once per BDDP_TASK_INTERVAL.
-     * One each call, BDDP_TASK_SIZE number of switch ports are processed.
-     * Once the BDDP packets are sent out through the switch ports, the ports
-     * are removed from the quarantine list.
-     */
-
-    protected void processBDDPLists() {
-        int count = 0;
-        Set<NodePortTuple> nptList = new HashSet<NodePortTuple>();
-
-        while (count < BDDP_TASK_SIZE && quarantineQueue.peek() != null) {
-            NodePortTuple npt;
-            npt = quarantineQueue.remove();
-            sendDiscoveryMessage(npt.getNodeId(), npt.getPortId(), false, false);
-            nptList.add(npt);
-            count++;
-        }
-
-        count = 0;
-        while (count < BDDP_TASK_SIZE && maintenanceQueue.peek() != null) {
-            NodePortTuple npt;
-            npt = maintenanceQueue.remove();
-            sendDiscoveryMessage(npt.getNodeId(), npt.getPortId(), false, false);
-            count++;
-        }
-
-        for (NodePortTuple npt : nptList) {
-            generateSwitchPortStatusUpdate(npt.getNodeId(), npt.getPortId());
-        }
-    }
-
-    @Override
-    public Set<Short> getQuarantinedPorts(long sw) {
-        Set<Short> qPorts = new HashSet<Short>();
-
-        Iterator<NodePortTuple> iter = quarantineQueue.iterator();
-        while (iter.hasNext()) {
-            NodePortTuple npt = iter.next();
-            if (npt.getNodeId() == sw) {
-                qPorts.add(npt.getPortId());
-            }
-        }
-        return qPorts;
-    }
-
-    private void generateSwitchPortStatusUpdate(long sw, short port) {
-        UpdateOperation operation;
-
-        IOFSwitch iofSwitch = floodlightProvider.getSwitches().get(sw);
-        if (iofSwitch == null) {
-            return;
-        }
-
-        OFPhysicalPort ofp = iofSwitch.getPort(port);
-        if (ofp == null) {
-            return;
-        }
-
-        int srcPortState = ofp.getState();
-        boolean portUp = ((srcPortState &
-                OFPortState.OFPPS_STP_MASK.getValue()) !=
-                OFPortState.OFPPS_STP_BLOCK.getValue());
-
-        if (portUp) {
-            operation = UpdateOperation.PORT_UP;
-        } else {
-            operation = UpdateOperation.PORT_DOWN;
-        }
-
-        LinkUpdate update = new LinkUpdate(new LDUpdate(sw, port, operation));
-
-
-        controller.publishUpdate(update);
-    }
-
     /**
      * Send LLDP on known ports.
      */
@@ -520,37 +302,7 @@
     }
 
     protected void discover(long sw, short port) {
-        sendDiscoveryMessage(sw, port, true, false);
-    }
-
-    /**
-     * Learn remote switches when running as a distributed controller ONOS.
-     */
-    protected IOFSwitch addRemoteSwitch(long sw, short port) {
-        IOnosRemoteSwitch remotesw = null;
-
-        // add a switch if we have not seen it before
-        remotesw = remoteSwitches.get(sw);
-
-        if (remotesw == null) {
-            remotesw = new OFSwitchImpl();
-            remotesw.setupRemoteSwitch(sw);
-            remoteSwitches.put(remotesw.getId(), remotesw);
-            log.debug("addRemoteSwitch(): added fake remote sw {}", remotesw);
-        }
-
-        // add the port if we have not seen it before
-        if (remotesw.getPort(port) == null) {
-            OFPhysicalPort remoteport = new OFPhysicalPort();
-            remoteport.setPortNumber(port);
-            remoteport.setName("fake_" + port);
-            remoteport.setConfig(0);
-            remoteport.setState(0);
-            remotesw.setPort(remoteport);
-            log.debug("addRemoteSwitch(): added fake remote port {} to sw {}", remoteport, remotesw.getId());
-        }
-
-        return remotesw;
+        sendDiscoveryMessage(sw, port, false);
     }
 
     /**
@@ -572,7 +324,6 @@
                     "to the switch.",
             recommendation = LogMessageDoc.CHECK_SWITCH)
     protected void sendDiscoveryMessage(long sw, short port,
-                                        boolean isStandard,
                                         boolean isReverse) {
 
         IOFSwitch iofSwitch = floodlightProvider.getSwitches().get(sw);
@@ -600,11 +351,6 @@
             return;
         }
 
-        // For fast ports, do not send forward LLDPs or BDDPs.
-        if (!isReverse && autoPortFastFeature && isFastPort(sw, port)) {
-            return;
-        }
-
         if (log.isTraceEnabled()) {
             log.trace("Sending LLDP packet out of swich: {}, port: {}",
                     sw, port);
@@ -685,62 +431,14 @@
                     if (isLinkDiscoverySuppressed(sw, ofp.getPortNumber())) {
                         continue;
                     }
-                    if (autoPortFastFeature && isFastPort(sw, ofp.getPortNumber())) {
-                        continue;
-                    }
 
                     // sends forward LLDP only non-fastports.
-                    sendDiscoveryMessage(sw, ofp.getPortNumber(), true, false);
-
-                    // If the switch port is not alreayd in the maintenance
-                    // queue, add it.
-                    //NodePortTuple npt = new NodePortTuple(sw, ofp.getPortNumber());
-                    //addToMaintenanceQueue(npt);
+                    sendDiscoveryMessage(sw, ofp.getPortNumber(), false);
                 }
             }
         }
     }
 
-    protected void setControllerTLV() {
-        //Setting the controllerTLVValue based on current nano time,
-        //controller's IP address, and the network interface object hash
-        //the corresponding IP address.
-
-        final int prime = 7867;
-        InetAddress localIPAddress = null;
-        NetworkInterface localInterface = null;
-
-        byte[] controllerTLVValue = new byte[]{0, 0, 0, 0, 0, 0, 0, 0};  // 8 byte value.
-        ByteBuffer bb = ByteBuffer.allocate(10);
-
-        try {
-            localIPAddress = java.net.InetAddress.getLocalHost();
-            localInterface = NetworkInterface.getByInetAddress(localIPAddress);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
-        long result = System.nanoTime();
-        if (localIPAddress != null) {
-            result = result * prime + IPv4.toIPv4Address(localIPAddress.getHostAddress());
-        }
-        if (localInterface != null) {
-            result = result * prime + localInterface.hashCode();
-        }
-        // set the first 4 bits to 0.
-        result = result & (0x0fffffffffffffffL);
-
-        bb.putLong(result);
-
-        bb.rewind();
-        bb.get(controllerTLVValue, 0, 8);
-
-        this.controllerTLV = new LLDPTLV()
-                                .setType((byte) 0x0c)
-                                .setLength((short) controllerTLVValue.length)
-                                .setValue(controllerTLVValue);
-    }
-
     @Override
     public String getName() {
         return "linkdiscovery";
@@ -766,7 +464,7 @@
         return Command.CONTINUE;
     }
 
-    private Command handleLldp(LLDP lldp, long sw, OFPacketIn pi, boolean isStandard, FloodlightContext cntx) {
+    private Command handleLldp(LLDP lldp, long sw, OFPacketIn pi) {
         // If LLDP is suppressed on this port, ignore received packet as well
         IOFSwitch iofSwitch = floodlightProvider.getSwitches().get(sw);
         if (iofSwitch == null) {
@@ -783,35 +481,6 @@
         }
 
         // Verify this LLDP packet matches what we're looking for
-        /*
-        for (LLDPTLV lldptlv : lldp.getOptionalTLVList()) {
-            if (lldptlv.getType() == 127 && lldptlv.getLength() == 12 &&
-                    lldptlv.getValue()[0] == 0x0 && lldptlv.getValue()[1] == 0x26 &&
-                    lldptlv.getValue()[2] == (byte) 0xe1 && lldptlv.getValue()[3] == 0x0) {
-                ByteBuffer dpidBB = ByteBuffer.wrap(lldptlv.getValue());
-                remoteSwitch = floodlightProvider.getSwitches().get(dpidBB.getLong(4));
-                if (remoteSwitch == null) {
-                    // Added by ONOS
-                    // floodlight LLDP coming from a remote switch connected to a different controller
-                    // add it to our cache of unconnected remote switches
-                    remoteSwitch = addRemoteSwitch(dpidBB.getLong(4), remotePort);
-                }
-            } else if (lldptlv.getType() == 12 && lldptlv.getLength() == 8) {
-                otherId = ByteBuffer.wrap(lldptlv.getValue()).getLong();
-                if (myId == otherId) {
-                    myLLDP = true;
-                }
-            } else if (lldptlv.getType() == TLV_DIRECTION_TYPE &&
-                    lldptlv.getLength() == TLV_DIRECTION_LENGTH) {
-                if (lldptlv.getValue()[0] == TLV_DIRECTION_VALUE_FORWARD[0]) {
-                    isReverse = false;
-                } else if (lldptlv.getValue()[0] == TLV_DIRECTION_VALUE_REVERSE[0]) {
-                    isReverse = true;
-                }
-            }
-        }
-        */
-
         byte[] packetData = pi.getPacketData();
         if (!OnosLldp.isOnosLldp(packetData)) {
             log.trace("Dropping LLDP that wasn't sent by ONOS");
@@ -856,20 +525,12 @@
         // Store the time of update to this link, and push it out to routingEngine
         Link lt = new Link(remoteDpid, remotePort, iofSwitch.getId(), pi.getInPort());
 
-
-        Long lastLldpTime = null;
-        Long lastBddpTime = null;
-
         Long firstSeenTime = System.currentTimeMillis();
 
-        if (isStandard) {
-            lastLldpTime = System.currentTimeMillis();
-        } else {
-            lastBddpTime = System.currentTimeMillis();
-        }
+        Long lastLldpTime = System.currentTimeMillis();
 
         LinkInfo newLinkInfo =
-                new LinkInfo(firstSeenTime, lastLldpTime, lastBddpTime,
+                new LinkInfo(firstSeenTime, lastLldpTime,
                         srcPortState, dstPortState);
 
         addOrUpdateLink(lt, newLinkInfo);
@@ -882,14 +543,14 @@
         boolean isReverse = OnosLldp.isReverse(lldp);
 
         newLinkInfo = links.get(lt);
-        if (newLinkInfo != null && isStandard && !isReverse) {
+        if (newLinkInfo != null && !isReverse) {
             Link reverseLink = new Link(lt.getDst(), lt.getDstPort(),
                     lt.getSrc(), lt.getSrcPort());
             LinkInfo reverseInfo = links.get(reverseLink);
             if (reverseInfo == null) {
                 // the reverse link does not exist.
                 if (newLinkInfo.getFirstSeenTime() > System.currentTimeMillis() - LINK_TIMEOUT) {
-                    this.sendDiscoveryMessage(lt.getDst(), lt.getDstPort(), isStandard, true);
+                    this.sendDiscoveryMessage(lt.getDst(), lt.getDstPort(), true);
                 }
             }
         }
@@ -904,22 +565,8 @@
                 IFloodlightProviderService.bcStore.get(cntx,
                         IFloodlightProviderService.CONTEXT_PI_PAYLOAD);
 
-        if (eth.getEtherType() == Ethernet.TYPE_BSN) {
-            BSN bsn = (BSN) eth.getPayload();
-            if (bsn == null) {
-                return Command.STOP;
-            }
-            if (bsn.getPayload() == null) {
-                return Command.STOP;
-            }
-            // It could be a packet other than BSN LLDP, therefore
-            // continue with the regular processing.
-            if (!(bsn.getPayload() instanceof LLDP)) {
-                return Command.CONTINUE;
-            }
-            return handleLldp((LLDP) bsn.getPayload(), sw, pi, false, cntx);
-        } else if (eth.getEtherType() == Ethernet.TYPE_LLDP) {
-            return handleLldp((LLDP) eth.getPayload(), sw, pi, true, cntx);
+        if (eth.getEtherType() == Ethernet.TYPE_LLDP) {
+            return handleLldp((LLDP) eth.getPayload(), sw, pi);
         } else if (eth.getEtherType() < 1500) {
             long destMac = eth.getDestinationMAC().toLong();
             if ((destMac & LINK_LOCAL_MASK) == LINK_LOCAL_VALUE) {
@@ -931,12 +578,6 @@
             }
         }
 
-        // If packet-in is from a quarantine port, stop processing.
-        NodePortTuple npt = new NodePortTuple(sw, pi.getInPort());
-        if (quarantineQueue.contains(npt)) {
-            return Command.STOP;
-        }
-
         return Command.CONTINUE;
     }
 
@@ -984,9 +625,7 @@
             }
 
             if (log.isTraceEnabled()) {
-                log.trace("addOrUpdateLink: {} {}",
-                        lt,
-                        (newInfo.getMulticastValidTime() != null) ? "multicast" : "unicast");
+                log.trace("addOrUpdateLink: {}", lt);
             }
 
             UpdateOperation updateOperation = null;
@@ -1019,11 +658,6 @@
                 }
                 portLinks.get(dstNpt).add(lt);
 
-                // Add to portNOFLinks if the unicast valid time is null
-                if (newInfo.getUnicastValidTime() == null) {
-                    addLinkToBroadcastDomain(lt);
-                }
-
                 // ONOS: Distinguish added event separately from updated event
                 updateOperation = UpdateOperation.LINK_ADDED;
                 linkChanged = true;
@@ -1037,12 +671,6 @@
                     if (oldInfo.getUnicastValidTime() != null) {
                         newInfo.setUnicastValidTime(oldInfo.getUnicastValidTime());
                     }
-                } else if (newInfo.getMulticastValidTime() == null) {
-                    // This is due to a unicast LLDP, so copy the old multicast
-                    // value.
-                    if (oldInfo.getMulticastValidTime() != null) {
-                        newInfo.setMulticastValidTime(oldInfo.getMulticastValidTime());
-                    }
                 }
 
                 Long oldTime = oldInfo.getUnicastValidTime();
@@ -1052,12 +680,12 @@
                 if (oldTime != null & newTime == null) {
                     // openflow -> non-openflow transition
                     // we need to add the link tuple to the portNOFLinks
-                    addLinkToBroadcastDomain(lt);
+                    //addLinkToBroadcastDomain(lt);
                     linkChanged = true;
                 } else if (oldTime == null & newTime != null) {
                     // non-openflow -> openflow transition
                     // we need to remove the link from the portNOFLinks
-                    removeLinkFromBroadcastDomain(lt);
+                    //removeLinkFromBroadcastDomain(lt);
                     linkChanged = true;
                 }
 
@@ -1290,20 +918,8 @@
         if (isLinkDiscoverySuppressed(sw, p)) {
             // Do nothing as link discovery is suppressed.
             return;
-        } else if (autoPortFastFeature && isFastPort(sw, p)) {
-            // Do nothing as the port is a fast port.
-            return;
         } else {
-            NodePortTuple npt = new NodePortTuple(sw, p);
             discover(sw, p);
-            // if it is not a fast port, add it to quarantine.
-            if (!isFastPort(sw, p)) {
-                addToQuarantineQueue(npt);
-            } else {
-                // Add to maintenance queue to ensure that BDDP packets
-                // are sent out.
-                addToMaintenanceQueue(npt);
-            }
         }
     }
 
@@ -1410,14 +1026,14 @@
                         (info.getUnicastValidTime() + (1000L * LINK_TIMEOUT) < curTime)) {
                     info.setUnicastValidTime(null);
 
-                    if (info.getMulticastValidTime() != null) {
-                        addLinkToBroadcastDomain(lt);
-                    }
+                    //if (info.getMulticastValidTime() != null) {
+                        //addLinkToBroadcastDomain(lt);
+                    //}
                     // Note that even if mTime becomes null later on,
                     // the link would be deleted, which would trigger updateClusters().
                     linkChanged = true;
                 }
-                if ((info.getMulticastValidTime() != null) &&
+                /*if ((info.getMulticastValidTime() != null) &&
                         (info.getMulticastValidTime() + (1000L * LINK_TIMEOUT) < curTime)) {
                     info.setMulticastValidTime(null);
                     // if uTime is not null, then link will remain as openflow
@@ -1425,11 +1041,11 @@
                     // don't care about linkChanged flag here.
                     removeLinkFromBroadcastDomain(lt);
                     linkChanged = true;
-                }
+                }*/
                 // Add to the erase list only if the unicast
                 // time is null.
-                if (info.getUnicastValidTime() == null &&
-                        info.getMulticastValidTime() == null) {
+                if (info.getUnicastValidTime() == null) { //&&
+                        //info.getMulticastValidTime() == null) {
                     eraseList.add(entry.getKey());
                 } else if (linkChanged) {
                     UpdateOperation operation;
@@ -1468,10 +1084,6 @@
         return true;
     }
 
-    public Map<NodePortTuple, Set<Link>> getPortBroadcastDomainLinks() {
-        return portBroadcastDomainLinks;
-    }
-
     @Override
     public Map<Link, LinkInfo> getLinks() {
         lock.readLock().lock();
@@ -1484,44 +1096,6 @@
         return result;
     }
 
-    protected void addLinkToBroadcastDomain(Link lt) {
-
-        NodePortTuple srcNpt, dstNpt;
-        srcNpt = new NodePortTuple(lt.getSrc(), lt.getSrcPort());
-        dstNpt = new NodePortTuple(lt.getDst(), lt.getDstPort());
-
-        if (!portBroadcastDomainLinks.containsKey(srcNpt)) {
-            portBroadcastDomainLinks.put(srcNpt, new HashSet<Link>());
-        }
-        portBroadcastDomainLinks.get(srcNpt).add(lt);
-
-        if (!portBroadcastDomainLinks.containsKey(dstNpt)) {
-            portBroadcastDomainLinks.put(dstNpt, new HashSet<Link>());
-        }
-        portBroadcastDomainLinks.get(dstNpt).add(lt);
-    }
-
-    protected void removeLinkFromBroadcastDomain(Link lt) {
-
-        NodePortTuple srcNpt, dstNpt;
-        srcNpt = new NodePortTuple(lt.getSrc(), lt.getSrcPort());
-        dstNpt = new NodePortTuple(lt.getDst(), lt.getDstPort());
-
-        if (portBroadcastDomainLinks.containsKey(srcNpt)) {
-            portBroadcastDomainLinks.get(srcNpt).remove(lt);
-            if (portBroadcastDomainLinks.get(srcNpt).isEmpty()) {
-                portBroadcastDomainLinks.remove(srcNpt);
-            }
-        }
-
-        if (portBroadcastDomainLinks.containsKey(dstNpt)) {
-            portBroadcastDomainLinks.get(dstNpt).remove(lt);
-            if (portBroadcastDomainLinks.get(dstNpt).isEmpty()) {
-                portBroadcastDomainLinks.remove(dstNpt);
-            }
-        }
-    }
-
     @Override
     public void addListener(ILinkDiscoveryListener listener) {
         linkDiscoveryAware.add(listener);
@@ -1564,7 +1138,6 @@
         Collection<Class<? extends IFloodlightService>> l =
                 new ArrayList<Class<? extends IFloodlightService>>();
         l.add(ILinkDiscoveryService.class);
-        //l.add(ITopologyService.class);
         return l;
     }
 
@@ -1601,9 +1174,6 @@
         // Added by ONOS
         registryService = context.getServiceImpl(IControllerRegistryService.class);
 
-        // Set the autoportfast feature to false.
-        this.autoPortFastFeature = false;
-
         // We create this here because there is no ordering guarantee
         this.linkDiscoveryAware = new ArrayList<ILinkDiscoveryListener>();
         this.lock = new ReentrantReadWriteLock();
@@ -1611,12 +1181,7 @@
         this.portLinks = new HashMap<NodePortTuple, Set<Link>>();
         this.suppressLinkDiscovery =
                 Collections.synchronizedSet(new HashSet<NodePortTuple>());
-        this.portBroadcastDomainLinks = new HashMap<NodePortTuple, Set<Link>>();
         this.switchLinks = new HashMap<Long, Set<Link>>();
-        this.quarantineQueue = new LinkedBlockingQueue<NodePortTuple>();
-        this.maintenanceQueue = new LinkedBlockingQueue<NodePortTuple>();
-        // Added by ONOS
-        this.remoteSwitches = new HashMap<Long, IOnosRemoteSwitch>();
     }
 
     @Override
@@ -1657,13 +1222,9 @@
                 } catch (Exception e) {
                     log.error("Exception in LLDP send timer.", e);
                 } finally {
-                    if (!shuttingDown) {
-                        // Always reschedule link discovery if we're not
-                        // shutting down (no chance of SLAVE role now)
-                        log.trace("Rescheduling discovery task");
-                        discoveryTask.reschedule(DISCOVERY_TASK_INTERVAL,
-                                TimeUnit.SECONDS);
-                    }
+                    log.trace("Rescheduling discovery task");
+                    discoveryTask.reschedule(DISCOVERY_TASK_INTERVAL,
+                            TimeUnit.SECONDS);
                 }
             }
         });
@@ -1671,30 +1232,11 @@
         // Always reschedule link discovery as we are never in SLAVE role now
         discoveryTask.reschedule(DISCOVERY_TASK_INTERVAL, TimeUnit.SECONDS);
 
-        // Setup the BDDP task.  It is invoked whenever switch port tuples
-        // are added to the quarantine list.
-        //bddpTask = new SingletonTask(ses, new QuarantineWorker());
-        //bddpTask.reschedule(BDDP_TASK_INTERVAL, TimeUnit.MILLISECONDS);
-
-
         // Register for the OpenFlow messages we want to receive
         floodlightProvider.addOFMessageListener(OFType.PACKET_IN, this);
         floodlightProvider.addOFMessageListener(OFType.PORT_STATUS, this);
         // Register for switch updates
         floodlightProvider.addOFSwitchListener(this);
-        if (restApi != null) {
-            restApi.addRestletRoutable(new LinkDiscoveryWebRoutable());
-        }
-        setControllerTLV();
-    }
-
-    @Override
-    public boolean isAutoPortFastFeature() {
-        return autoPortFastFeature;
-    }
-
-    @Override
-    public void setAutoPortFastFeature(boolean autoPortFastFeature) {
-        this.autoPortFastFeature = autoPortFastFeature;
+        restApi.addRestletRoutable(new LinkDiscoveryWebRoutable());
     }
 }
diff --git a/src/main/java/net/onrc/onos/core/linkdiscovery/web/AutoPortFast.java b/src/main/java/net/onrc/onos/core/linkdiscovery/web/AutoPortFast.java
deleted file mode 100644
index a13116f..0000000
--- a/src/main/java/net/onrc/onos/core/linkdiscovery/web/AutoPortFast.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package net.onrc.onos.core.linkdiscovery.web;
-
-import net.onrc.onos.core.linkdiscovery.ILinkDiscoveryService;
-
-import org.restlet.data.Status;
-import org.restlet.resource.Get;
-import org.restlet.resource.ServerResource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class AutoPortFast extends ServerResource {
-    private static final Logger log = LoggerFactory.getLogger(AutoPortFast.class);
-
-    @Get("json")
-    public String retrieve() {
-        ILinkDiscoveryService linkDiscovery;
-        linkDiscovery = (ILinkDiscoveryService) getContext().getAttributes().
-                get(ILinkDiscoveryService.class.getCanonicalName());
-
-        String param = ((String) getRequestAttributes().get("state")).toLowerCase();
-        if (param.equals("enable") || param.equals("true")) {
-            linkDiscovery.setAutoPortFastFeature(true);
-        } else if (param.equals("disable") || param.equals("false")) {
-            linkDiscovery.setAutoPortFastFeature(false);
-        }
-        setStatus(Status.SUCCESS_OK, "OK");
-        if (linkDiscovery.isAutoPortFastFeature()) {
-            return "enabled";
-        } else {
-            return "disabled";
-        }
-    }
-}
diff --git a/src/main/java/net/onrc/onos/core/linkdiscovery/web/LinkDiscoveryWebRoutable.java b/src/main/java/net/onrc/onos/core/linkdiscovery/web/LinkDiscoveryWebRoutable.java
index 39ecbfa..bf223c7 100644
--- a/src/main/java/net/onrc/onos/core/linkdiscovery/web/LinkDiscoveryWebRoutable.java
+++ b/src/main/java/net/onrc/onos/core/linkdiscovery/web/LinkDiscoveryWebRoutable.java
@@ -13,7 +13,6 @@
     public Router getRestlet(Context context) {
         Router router = new Router(context);
         router.attach("/links/json", LinksResource.class);
-        router.attach("/autoportfast/{state}/json", AutoPortFast.class); // enable/true or disable/false
         return router;
     }
 
diff --git a/src/test/java/net/onrc/onos/core/linkdiscovery/internal/LinkDiscoveryManagerTest.java b/src/test/java/net/onrc/onos/core/linkdiscovery/internal/LinkDiscoveryManagerTest.java
index 4cebdaa..dd748ac 100644
--- a/src/test/java/net/onrc/onos/core/linkdiscovery/internal/LinkDiscoveryManagerTest.java
+++ b/src/test/java/net/onrc/onos/core/linkdiscovery/internal/LinkDiscoveryManagerTest.java
@@ -121,8 +121,7 @@
 
         Link lt = new Link(1L, 2, 2L, 1);
         LinkInfo info = new LinkInfo(System.currentTimeMillis(),
-                System.currentTimeMillis(), null,
-                0, 0);
+                System.currentTimeMillis(), 0, 0);
         topology.addOrUpdateLink(lt, info);
 
 
@@ -145,8 +144,7 @@
 
         Link lt = new Link(1L, 2, 2L, 1);
         LinkInfo info = new LinkInfo(System.currentTimeMillis(),
-                System.currentTimeMillis(), null,
-                0, 0);
+                System.currentTimeMillis(), 0, 0);
         topology.addOrUpdateLink(lt, info);
         topology.deleteLinks(Collections.singletonList(lt), "Test");
 
@@ -167,8 +165,7 @@
         NodePortTuple dstNpt = new NodePortTuple(2L, 3);
 
         LinkInfo info = new LinkInfo(System.currentTimeMillis(),
-                System.currentTimeMillis(), null,
-                0, 0);
+                System.currentTimeMillis(), 0, 0);
         topology.addOrUpdateLink(lt, info);
 
         // check invariants hold
@@ -190,8 +187,7 @@
         NodePortTuple dstNpt = new NodePortTuple(2L, 3);
 
         LinkInfo info = new LinkInfo(System.currentTimeMillis(),
-                System.currentTimeMillis(), null,
-                0, 0);
+                System.currentTimeMillis(), 0, 0);
         topology.addOrUpdateLink(lt, info);
         topology.deleteLinks(Collections.singletonList(lt), "Test to self");
 
@@ -211,8 +207,7 @@
         NodePortTuple srcNpt = new NodePortTuple(1L, 2);
         NodePortTuple dstNpt = new NodePortTuple(2L, 1);
         LinkInfo info = new LinkInfo(System.currentTimeMillis(),
-                System.currentTimeMillis(), null,
-                0, 0);
+                System.currentTimeMillis(), 0, 0);
         topology.addOrUpdateLink(lt, info);
 
         IOFSwitch sw1 = getMockFloodlightProvider().getSwitches().get(1L);
@@ -236,8 +231,7 @@
         replay(sw1);
         Link lt = new Link(1L, 2, 1L, 3);
         LinkInfo info = new LinkInfo(System.currentTimeMillis(),
-                System.currentTimeMillis(), null,
-                0, 0);
+                System.currentTimeMillis(), 0, 0);
         topology.addOrUpdateLink(lt, info);
 
         // Mock up our expected behavior
@@ -262,8 +256,7 @@
         LinkInfo info;
 
         info = new LinkInfo(System.currentTimeMillis() - 40000,
-                System.currentTimeMillis() - 40000, null,
-                0, 0);
+                System.currentTimeMillis() - 40000, 0, 0);
         topology.addOrUpdateLink(lt, info);
 
         // check invariants hold
@@ -274,116 +267,29 @@
         assertNotNull(topology.portLinks.get(dstNpt));
         assertTrue(topology.portLinks.get(dstNpt).contains(lt));
         assertTrue(topology.links.containsKey(lt));
-        assertTrue(topology.portBroadcastDomainLinks.get(srcNpt) == null ||
-                !topology.portBroadcastDomainLinks.get(srcNpt).contains(lt));
-        assertTrue(topology.portBroadcastDomainLinks.get(dstNpt) == null ||
-                !topology.portBroadcastDomainLinks.get(dstNpt).contains(lt));
 
         topology.timeoutLinks();
 
 
         info = new LinkInfo(System.currentTimeMillis(), /* firstseen */
-                null, /* unicast */
-                System.currentTimeMillis(), 0, 0);
+                null, /* unicast */0, 0);
         topology.addOrUpdateLink(lt, info);
         assertTrue(topology.links.get(lt).getUnicastValidTime() == null);
-        assertTrue(topology.links.get(lt).getMulticastValidTime() != null);
-        assertTrue(topology.portBroadcastDomainLinks.get(srcNpt).contains(lt));
-        assertTrue(topology.portBroadcastDomainLinks.get(dstNpt).contains(lt));
 
 
-        // Add a link info based on info that woudld be obtained from unicast LLDP
+        // Add a link info based on info that would be obtained from unicast LLDP
         // Setting the unicast LLDP reception time to be 40 seconds old, so we can use
         // this to test timeout after this test.  Although the info is initialized
         // with LT_OPENFLOW_LINK, the link property should be changed to LT_NON_OPENFLOW
         // by the addOrUpdateLink method.
         info = new LinkInfo(System.currentTimeMillis() - 40000,
-                System.currentTimeMillis() - 40000, null, 0, 0);
+                System.currentTimeMillis() - 40000, 0, 0);
         topology.addOrUpdateLink(lt, info);
-        assertTrue(topology.portBroadcastDomainLinks.get(srcNpt) == null ||
-                !topology.portBroadcastDomainLinks.get(srcNpt).contains(lt));
-        assertTrue(topology.portBroadcastDomainLinks.get(dstNpt) == null ||
-                !topology.portBroadcastDomainLinks.get(dstNpt).contains(lt));
 
         // Expect to timeout the unicast Valid Time, but not the multicast Valid time
         // So the link type should go back to non-openflow link.
         topology.timeoutLinks();
-        assertTrue(topology.links.get(lt).getUnicastValidTime() == null);
-        assertTrue(topology.links.get(lt).getMulticastValidTime() != null);
-        assertTrue(topology.portBroadcastDomainLinks.get(srcNpt).contains(lt));
-        assertTrue(topology.portBroadcastDomainLinks.get(dstNpt).contains(lt));
-
-        // Set the multicastValidTime to be old and see if that also times out.
-        info = new LinkInfo(System.currentTimeMillis() - 40000,
-                null, System.currentTimeMillis() - 40000, 0, 0);
-        topology.addOrUpdateLink(lt, info);
-        topology.timeoutLinks();
         assertTrue(topology.links.get(lt) == null);
-        assertTrue(topology.portBroadcastDomainLinks.get(srcNpt) == null ||
-                !topology.portBroadcastDomainLinks.get(srcNpt).contains(lt));
-        assertTrue(topology.portBroadcastDomainLinks.get(dstNpt) == null ||
-                !topology.portBroadcastDomainLinks.get(dstNpt).contains(lt));
-
-
-        // Test again only with multicast LLDP
-        info = new LinkInfo(System.currentTimeMillis() - 40000,
-                null, System.currentTimeMillis() - 40000, 0, 0);
-        topology.addOrUpdateLink(lt, info);
-        assertTrue(topology.links.get(lt).getUnicastValidTime() == null);
-        assertTrue(topology.links.get(lt).getMulticastValidTime() != null);
-        assertTrue(topology.portBroadcastDomainLinks.get(srcNpt).contains(lt));
-        assertTrue(topology.portBroadcastDomainLinks.get(dstNpt).contains(lt));
-
-        // Call timeout and check if link is no longer present.
-        topology.timeoutLinks();
-        assertTrue(topology.links.get(lt) == null);
-        assertTrue(topology.portBroadcastDomainLinks.get(srcNpt) == null ||
-                !topology.portBroadcastDomainLinks.get(srcNpt).contains(lt));
-        assertTrue(topology.portBroadcastDomainLinks.get(dstNpt) == null ||
-                !topology.portBroadcastDomainLinks.get(dstNpt).contains(lt));
-
-        // Start clean and see if loops are also added.
-        lt = new Link(1L, 1, 1L, 2);
-        srcNpt = new NodePortTuple(1L, 1);
-        dstNpt = new NodePortTuple(1L, 2);
-        info = new LinkInfo(System.currentTimeMillis() - 40000,
-                null, System.currentTimeMillis() - 40000, 0, 0);
-        topology.addOrUpdateLink(lt, info);
-        assertTrue(topology.portBroadcastDomainLinks.get(srcNpt).contains(lt));
-        assertTrue(topology.portBroadcastDomainLinks.get(dstNpt).contains(lt));
-
-
-        // Start clean and see if loops are also added.
-        lt = new Link(1L, 1, 1L, 3);
-        srcNpt = new NodePortTuple(1L, 1);
-        dstNpt = new NodePortTuple(1L, 3);
-        info = new LinkInfo(System.currentTimeMillis() - 40000,
-                null, System.currentTimeMillis() - 40000, 0, 0);
-        topology.addOrUpdateLink(lt, info);
-        assertTrue(topology.portBroadcastDomainLinks.get(srcNpt).contains(lt));
-        assertTrue(topology.portBroadcastDomainLinks.get(dstNpt).contains(lt));
-
-
-        // Start clean and see if loops are also added.
-        lt = new Link(1L, 4, 1L, 5);
-        srcNpt = new NodePortTuple(1L, 4);
-        dstNpt = new NodePortTuple(1L, 5);
-        info = new LinkInfo(System.currentTimeMillis() - 40000,
-                null, System.currentTimeMillis() - 40000, 0, 0);
-        topology.addOrUpdateLink(lt, info);
-        assertTrue(topology.portBroadcastDomainLinks.get(srcNpt).contains(lt));
-        assertTrue(topology.portBroadcastDomainLinks.get(dstNpt).contains(lt));
-
-
-        // Start clean and see if loops are also added.
-        lt = new Link(1L, 3, 1L, 5);
-        srcNpt = new NodePortTuple(1L, 3);
-        dstNpt = new NodePortTuple(1L, 5);
-        info = new LinkInfo(System.currentTimeMillis() - 40000,
-                null, System.currentTimeMillis() - 40000, 0, 0);
-        topology.addOrUpdateLink(lt, info);
-        assertTrue(topology.portBroadcastDomainLinks.get(srcNpt).contains(lt));
-        assertTrue(topology.portBroadcastDomainLinks.get(dstNpt).contains(lt));
     }
 
     /**
@@ -421,7 +327,7 @@
         EasyMock.expectLastCall().once();
         replay(swTest);
 
-        topology.sendDiscoveryMessage(3L, portNum, true, false);
+        topology.sendDiscoveryMessage(3L, portNum, false);
 
         verify(swTest);
     }