X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fprotocol_plugins%2Fopenflow%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fprotocol_plugin%2Fopenflow%2Finternal%2FDiscoveryService.java;h=1938cb1ae68e66efe8bb68b12f42e3fcf1373703;hb=dfa4383b0b5c9c6de340526a62aef731922fa29f;hp=ee712030e95573a807239dc6283f4291bb5f01d0;hpb=fa52e9399f9687c7290ed98b22b00cdce4a6aacd;p=controller.git diff --git a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/DiscoveryService.java b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/DiscoveryService.java index ee712030e9..1938cb1ae6 100644 --- a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/DiscoveryService.java +++ b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/DiscoveryService.java @@ -39,6 +39,7 @@ import org.osgi.framework.FrameworkUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.opendaylight.controller.sal.connection.IPluginOutConnectionService; import org.opendaylight.controller.sal.core.Config; import org.opendaylight.controller.sal.core.ConstructionException; import org.opendaylight.controller.sal.core.Edge; @@ -126,6 +127,7 @@ public class DiscoveryService implements IInventoryShimExternalListener, IDataPa private volatile Boolean shuttingDown = false; private LLDPTLV chassisIdTlv, portIdTlv, ttlTlv, customTlv; + private IPluginOutConnectionService connectionOutService; class DiscoveryTransmit implements Runnable { private final BlockingQueue transmitQ; @@ -256,6 +258,11 @@ public class DiscoveryService implements IInventoryShimExternalListener, IDataPa return; } + if (!connectionOutService.isLocal(nodeConnector.getNode())) { + logger.debug("Discoery packets will not be sent to {} in a non-master controller", nodeConnector.toString()); + return; + } + if (outPkt == null) { logger.debug("Can not send discovery packet out since outPkt is null"); return; @@ -301,12 +308,18 @@ public class DiscoveryService implements IInventoryShimExternalListener, IDataPa return PacketResult.IGNORED; } - if (((Short) inPkt.getIncomingNodeConnector().getID()).equals(NodeConnector.SPECIALNODECONNECTORID)) { + NodeConnector nodeConnector = inPkt.getIncomingNodeConnector(); + if (((Short) nodeConnector.getID()).equals(NodeConnector.SPECIALNODECONNECTORID)) { logger.trace("Ignoring ethernet packet received on special port: " + inPkt.getIncomingNodeConnector().toString()); return PacketResult.IGNORED; } + if (!connectionOutService.isLocal(nodeConnector.getNode())) { + logger.debug("Discoery packets will not be processed from {} in a non-master controller", nodeConnector.toString()); + return PacketResult.IGNORED; + } + Ethernet ethPkt = new Ethernet(); try { ethPkt.deserialize(data, 0, data.length * NetUtils.NumBitsInAByte); @@ -564,6 +577,14 @@ public class DiscoveryService implements IInventoryShimExternalListener, IDataPa readyListHi.add(nodeConnector); } + private void removeNodeConnector(NodeConnector nodeConnector) { + readyListLo.remove(nodeConnector); + readyListHi.remove(nodeConnector); + stagingList.remove(nodeConnector); + holdTime.remove(nodeConnector); + elapsedTime.remove(nodeConnector); + } + private Set getRemoveSet(Collection c, Node node) { Set removeSet = new HashSet(); if (c == null) { @@ -571,16 +592,7 @@ public class DiscoveryService implements IInventoryShimExternalListener, IDataPa } for (NodeConnector nodeConnector : c) { if (node.equals(nodeConnector.getNode())) { - Edge edge1 = edgeMap.get(nodeConnector); - if (edge1 != null) { - removeSet.add(nodeConnector); - - // check reverse direction - Edge edge2 = edgeMap.get(edge1.getTailNodeConnector()); - if ((edge2 != null) && node.equals(edge2.getTailNodeConnector().getNode())) { - removeSet.add(edge2.getHeadNodeConnector()); - } - } + removeSet.add(nodeConnector); } } return removeSet; @@ -589,6 +601,29 @@ public class DiscoveryService implements IInventoryShimExternalListener, IDataPa private void removeDiscovery(Node node) { Set removeSet; + removeSet = getRemoveSet(edgeMap.keySet(), node); + NodeConnector peerConnector; + Edge edge1, edge2; + for (NodeConnector nodeConnector : removeSet) { + // get the peer for fast removal of the edge in reverse direction + peerConnector = null; + edge1 = edgeMap.get(nodeConnector); + if (edge1 != null) { + edge2 = edgeMap.get(edge1.getTailNodeConnector()); + if ((edge2 != null) && node.equals(edge2.getTailNodeConnector().getNode())) { + peerConnector = edge2.getHeadNodeConnector(); + } + } + + removeEdge(nodeConnector, false); + removeEdge(peerConnector, isEnabled(peerConnector)); + } + + removeSet = getRemoveSet(prodMap.keySet(), node); + for (NodeConnector nodeConnector : removeSet) { + removeProdEdge(nodeConnector); + } + removeSet = getRemoveSet(readyListHi, node); readyListHi.removeAll(removeSet); @@ -603,22 +638,14 @@ public class DiscoveryService implements IInventoryShimExternalListener, IDataPa holdTime.remove(nodeConnector); } - removeSet = getRemoveSet(edgeMap.keySet(), node); + removeSet = getRemoveSet(elapsedTime.keySet(), node); for (NodeConnector nodeConnector : removeSet) { - removeEdge(nodeConnector, false); - } - - removeSet = getRemoveSet(prodMap.keySet(), node); - for (NodeConnector nodeConnector : removeSet) { - removeProdEdge(nodeConnector); + elapsedTime.remove(nodeConnector); } } private void removeDiscovery(NodeConnector nodeConnector) { - readyListHi.remove(nodeConnector); - readyListLo.remove(nodeConnector); - stagingList.remove(nodeConnector); - holdTime.remove(nodeConnector); + removeNodeConnector(nodeConnector); removeEdge(nodeConnector, false); removeProdEdge(nodeConnector); } @@ -657,8 +684,10 @@ public class DiscoveryService implements IInventoryShimExternalListener, IDataPa for (NodeConnector nodeConnector : retrySet) { // Allow one more retry - readyListLo.add(nodeConnector); elapsedTime.remove(nodeConnector); + if (connectionOutService.isLocal(nodeConnector.getNode())) { + transmitQ.add(nodeConnector); + } } } } @@ -692,10 +721,12 @@ public class DiscoveryService implements IInventoryShimExternalListener, IDataPa private void doDiscovery() { if (++discoveryTimerTickCount <= discoveryBatchPauseTicks) { for (NodeConnector nodeConnector : getWorkingSet()) { - transmitQ.add(nodeConnector); - // Move to staging area after it's served - if (!stagingList.contains(nodeConnector)) { - stagingList.add(nodeConnector); + if (connectionOutService.isLocal(nodeConnector.getNode())) { + transmitQ.add(nodeConnector); + // Move to staging area after it's served + if (!stagingList.contains(nodeConnector)) { + stagingList.add(nodeConnector); + } } } } else if (discoveryTimerTickCount >= discoveryBatchRestartTicks) { @@ -785,6 +816,11 @@ public class DiscoveryService implements IInventoryShimExternalListener, IDataPa } elapsedTime.remove(src); + // fast discovery of the edge in reverse direction + if (!edgeMap.containsKey(dst) && !readyListHi.contains(dst) && !elapsedTime.keySet().contains(dst)) { + moveToReadyListHi(dst); + } + // notify updateEdge(edge, UpdateType.ADDED, props); logger.trace("Add edge {}", edge); @@ -851,18 +887,15 @@ public class DiscoveryService implements IInventoryShimExternalListener, IDataPa * Remove OpenFlow edge */ private void removeEdge(NodeConnector nodeConnector, boolean stillEnabled) { - holdTime.remove(nodeConnector); - readyListLo.remove(nodeConnector); - readyListHi.remove(nodeConnector); + if (nodeConnector == null) { + return; + } + + removeNodeConnector(nodeConnector); if (stillEnabled) { // keep discovering - if (!stagingList.contains(nodeConnector)) { - stagingList.add(nodeConnector); - } - } else { - // stop it - stagingList.remove(nodeConnector); + stagingList.add(nodeConnector); } Edge edge = null; @@ -1220,7 +1253,15 @@ public class DiscoveryService implements IInventoryShimExternalListener, IDataPa if (val != null) { try { - int ticks = Integer.parseInt(val); + int ticks; + Set monitorSet = holdTime.keySet(); + if (monitorSet != null) { + for (NodeConnector nodeConnector : monitorSet) { + holdTime.put(nodeConnector, 0); + } + } + + ticks = Integer.parseInt(val); DiscoveryPeriod.INTERVAL.setTick(ticks); discoveryBatchRestartTicks = getDiscoveryInterval(); discoveryBatchPauseTicks = getDiscoveryPauseInterval(); @@ -1402,6 +1443,16 @@ public class DiscoveryService implements IInventoryShimExternalListener, IDataPa } } + void setIPluginOutConnectionService(IPluginOutConnectionService s) { + connectionOutService = s; + } + + void unsetIPluginOutConnectionService(IPluginOutConnectionService s) { + if (connectionOutService == s) { + connectionOutService = null; + } + } + private void initDiscoveryPacket() { // Create LLDP ChassisID TLV chassisIdTlv = new LLDPTLV();