diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java index f727dc61a9857f88b2cb44a3cd992830bc25eca0..e32cf6e58be3caad620da7e547d8ed2c2dfb96ba 100644 --- a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java +++ b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java @@ -227,7 +227,7 @@ IFloodlightModule, IInfoProvider, IHAListener { /** * List of ports through which LLDP/BDDPs are not sent. */ - protected Set<NodePortTuple> suppressLLDPs; + protected Set<NodePortTuple> suppressLinkDiscovery; /** A list of ports that are quarantined for discovering links through * them. Data traffic from these ports are not allowed until the ports @@ -269,7 +269,7 @@ IFloodlightModule, IInfoProvider, IHAListener { } public Set<NodePortTuple> getSuppressLLDPsInfo() { - return suppressLLDPs; + return suppressLinkDiscovery; } /** @@ -279,7 +279,7 @@ IFloodlightModule, IInfoProvider, IHAListener { public void AddToSuppressLLDPs(long sw, short port) { NodePortTuple npt = new NodePortTuple(sw, port); - this.suppressLLDPs.add(npt); + this.suppressLinkDiscovery.add(npt); deleteLinksOnPort(npt, "LLDP suppressed."); } @@ -290,7 +290,7 @@ IFloodlightModule, IInfoProvider, IHAListener { public void RemoveFromSuppressLLDPs(long sw, short port) { NodePortTuple npt = new NodePortTuple(sw, port); - this.suppressLLDPs.remove(npt); + this.suppressLinkDiscovery.remove(npt); discover(npt); } @@ -339,8 +339,8 @@ IFloodlightModule, IInfoProvider, IHAListener { } } while (updates.peek() != null); } - private boolean isLLDPSuppressed(long sw, short portNumber) { - return this.suppressLLDPs.contains(new NodePortTuple(sw, portNumber)); + private boolean isLinkDiscoverySuppressed(long sw, short portNumber) { + return this.suppressLinkDiscovery.contains(new NodePortTuple(sw, portNumber)); } protected void discoverLinks() { @@ -537,7 +537,7 @@ IFloodlightModule, IInfoProvider, IHAListener { return; } - if (isLLDPSuppressed(sw, port)) { + if (isLinkDiscoverySuppressed(sw, port)) { /* Dont send LLDPs out of this port as suppressLLDPs set * */ @@ -659,16 +659,20 @@ IFloodlightModule, IInfoProvider, IHAListener { if (iofSwitch == null) continue; if (iofSwitch.getEnabledPorts() != null) { for (OFPhysicalPort ofp: iofSwitch.getEnabledPorts()) { - if (!isFastPort(sw, ofp.getPortNumber())) { - // 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()); - if (!maintenanceQueue.contains(npt)) - addToMaintenanceQueue(npt); - } + 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()); + if (!maintenanceQueue.contains(npt)) + addToMaintenanceQueue(npt); + } } } @@ -734,7 +738,7 @@ IFloodlightModule, IInfoProvider, IHAListener { return Command.STOP; } - if (isLLDPSuppressed(sw, pi.getInPort())) + if (isLinkDiscoverySuppressed(sw, pi.getInPort())) return Command.STOP; // If this is a malformed LLDP, or not from us, exit @@ -807,7 +811,7 @@ IFloodlightModule, IInfoProvider, IHAListener { } return Command.STOP; } - if (suppressLLDPs.contains(new NodePortTuple(remoteSwitch.getId(), + if (suppressLinkDiscovery.contains(new NodePortTuple(remoteSwitch.getId(), remotePort))) { if (log.isTraceEnabled()) { log.trace("Ignoring link with suppressed src port: switch {} port {}", @@ -1256,15 +1260,36 @@ IFloodlightModule, IInfoProvider, IHAListener { // to be sent on the timer as it is normally done // do it outside the write-lock // sendLLDPTask.reschedule(1000, TimeUnit.MILLISECONDS); - discover(npt); - if (!isLLDPSuppressed(npt.getNodeId(), npt.getPortId()) && - autoPortFastFeature && - !isFastPort(npt.getNodeId(), npt.getPortId())) - addToQuarantineQueue(npt); + processNewPort(npt.getNodeId(), npt.getPortId()); } return Command.CONTINUE; } + /** + * Process a new port. + * If link discovery is disabled on the port, then do nothing. + * If autoportfast feature is enabled and the port is a fast port, then + * do nothing. + * Otherwise, send LLDP message. Add the port to quarantine. + * @param sw + * @param p + */ + private void processNewPort(long sw, short p) { + NodePortTuple npt = new NodePortTuple(sw, p); + if (isLinkDiscoverySuppressed(npt.getNodeId(), npt.getPortId())) { + // Do nothing as link discovery is suppressed. + } + else if (autoPortFastFeature && + isFastPort(npt.getNodeId(), npt.getPortId())) { + // Do nothing as autoportfast feature is enabled and + // the port is a fast port. + } + else { + discover(npt); + addToQuarantineQueue(npt); + } + } + /** * We send out LLDP messages when a switch is added to discover the topology * @param sw The IOFSwitch that connected to the controller @@ -1272,15 +1297,9 @@ IFloodlightModule, IInfoProvider, IHAListener { @Override public void addedSwitch(IOFSwitch sw) { - NodePortTuple npt; if (sw.getEnabledPorts() != null) { for (Short p : sw.getEnabledPortNumbers()) { - npt = new NodePortTuple(sw.getId(), p); - discover(npt); - if (!isLLDPSuppressed(npt.getNodeId(), npt.getPortId()) && - autoPortFastFeature && - !isFastPort(npt.getNodeId(), npt.getPortId())) - addToQuarantineQueue(npt); + processNewPort(sw.getId(), p); } } // Update event history @@ -1759,7 +1778,7 @@ IFloodlightModule, IInfoProvider, IHAListener { this.updates = new LinkedBlockingQueue<LDUpdate>(); this.links = new HashMap<Link, LinkInfo>(); this.portLinks = new HashMap<NodePortTuple, Set<Link>>(); - this.suppressLLDPs = + this.suppressLinkDiscovery = Collections.synchronizedSet(new HashSet<NodePortTuple>()); this.portBroadcastDomainLinks = new HashMap<NodePortTuple, Set<Link>>(); this.switchLinks = new HashMap<Long, Set<Link>>();