From a409fe492f53dd811259c11f0cde4f8771f269ad Mon Sep 17 00:00:00 2001 From: Jason Ye Date: Fri, 12 Apr 2013 16:08:25 -0700 Subject: [PATCH] - Add stop() method in IMessageReadWrite for proper clean up when connection is closed. - Be able to handle whitespace in TLS config lines Signed-off-by: Jason Ye --- .../openflow/core/IMessageReadWrite.java | 8 ++++ .../openflow/core/internal/Controller.java | 4 +- .../internal/MessageReadWriteService.java | 6 +++ .../SecureMessageReadWriteService.java | 44 ++++++++++++++---- .../openflow/core/internal/SwitchHandler.java | 45 +++++++++++++------ .../internal/TopologyManagerImpl.java | 2 +- 6 files changed, 85 insertions(+), 24 deletions(-) diff --git a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/core/IMessageReadWrite.java b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/core/IMessageReadWrite.java index 301159d6d3..8fb9a6acb8 100644 --- a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/core/IMessageReadWrite.java +++ b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/core/IMessageReadWrite.java @@ -42,4 +42,12 @@ public interface IMessageReadWrite { * @throws Exception */ public List readMessages() throws Exception; + + /** + * Proper clean up when the switch connection is closed + * + * @return + * @throws Exception + */ + public void stop() throws Exception; } diff --git a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/core/internal/Controller.java b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/core/internal/Controller.java index f183b516de..f3004acaba 100644 --- a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/core/internal/Controller.java +++ b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/core/internal/Controller.java @@ -246,6 +246,7 @@ public class Controller implements IController, CommandProvider { } } ((SwitchHandler) sw).stop(); + sw = null; } private void notifySwitchAdded(ISwitch sw) { @@ -264,8 +265,7 @@ public class Controller implements IController, CommandProvider { try { this.switchEvents.put(event); } catch (InterruptedException e) { - e.printStackTrace(); - logger.error("Interrupt Exception " + e.toString()); + logger.debug("SwitchEvent caught Interrupt Exception"); } } diff --git a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/core/internal/MessageReadWriteService.java b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/core/internal/MessageReadWriteService.java index d20bf1e0a0..fb34b0f063 100644 --- a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/core/internal/MessageReadWriteService.java +++ b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/core/internal/MessageReadWriteService.java @@ -139,4 +139,10 @@ public class MessageReadWriteService implements IMessageReadWrite { } return msgs; } + + @Override + public void stop() { + inBuffer = null; + outBuffer = null; + } } diff --git a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/core/internal/SecureMessageReadWriteService.java b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/core/internal/SecureMessageReadWriteService.java index b41156147f..ddc87bc530 100644 --- a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/core/internal/SecureMessageReadWriteService.java +++ b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/core/internal/SecureMessageReadWriteService.java @@ -10,6 +10,7 @@ package org.opendaylight.controller.protocol_plugin.openflow.core.internal; import java.io.FileInputStream; +import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousCloseException; import java.nio.channels.SelectionKey; @@ -50,14 +51,20 @@ public class SecureMessageReadWriteService implements IMessageReadWrite { private ByteBuffer myNetData; // encrypted message to be sent private ByteBuffer peerAppData; // clear text message received from the switch private ByteBuffer peerNetData; // encrypted message from the switch + private FileInputStream kfd = null, tfd = null; public SecureMessageReadWriteService(SocketChannel socket, Selector selector) throws Exception { this.socket = socket; this.selector = selector; this.factory = new BasicFactory(); - createSecureChannel(socket); - createBuffers(sslEngine); + try { + createSecureChannel(socket); + createBuffers(sslEngine); + } catch (Exception e) { + stop(); + throw e; + } } /** @@ -67,17 +74,19 @@ public class SecureMessageReadWriteService implements IMessageReadWrite { * @throws Exception */ private void createSecureChannel(SocketChannel socket) throws Exception { - String keyStoreFile = System.getProperty("controllerKeyStore"); - String keyStorePassword = System.getProperty("controllerKeyStorePassword"); - String trustStoreFile = System.getProperty("controllerTrustStore"); - String trustStorePassword = System.getProperty("controllerTrustStorePassword"); + String keyStoreFile = System.getProperty("controllerKeyStore").trim(); + String keyStorePassword = System.getProperty("controllerKeyStorePassword").trim(); + String trustStoreFile = System.getProperty("controllerTrustStore").trim(); + String trustStorePassword = System.getProperty("controllerTrustStorePassword").trim(); KeyStore ks = KeyStore.getInstance("JKS"); KeyStore ts = KeyStore.getInstance("JKS"); KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); - ks.load(new FileInputStream(keyStoreFile), keyStorePassword.toCharArray()); - ts.load(new FileInputStream(trustStoreFile), trustStorePassword.toCharArray()); + kfd = new FileInputStream(keyStoreFile); + tfd = new FileInputStream(trustStoreFile); + ks.load(kfd, keyStorePassword.toCharArray()); + ts.load(tfd, trustStorePassword.toCharArray()); kmf.init(ks, keyStorePassword.toCharArray()); tmf.init(ts); @@ -344,4 +353,23 @@ public class SecureMessageReadWriteService implements IMessageReadWrite { this.myNetData = ByteBuffer.allocate(session.getPacketBufferSize()); this.peerNetData = ByteBuffer.allocate(session.getPacketBufferSize()); } + + @Override + public void stop() throws IOException { + this.sslEngine = null; + this.sslEngineResult = null; + this.myAppData = null; + this.myNetData = null; + this.peerAppData = null; + this.peerNetData = null; + + if (this.kfd != null) { + this.kfd.close(); + this.kfd = null; + } + if (this.tfd != null) { + this.tfd.close(); + this.tfd = null; + } + } } diff --git a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/core/internal/SwitchHandler.java b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/core/internal/SwitchHandler.java index b87b785e3c..78ab3275a4 100644 --- a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/core/internal/SwitchHandler.java +++ b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/core/internal/SwitchHandler.java @@ -9,6 +9,7 @@ package org.opendaylight.controller.protocol_plugin.openflow.core.internal; +import java.io.IOException; import java.nio.channels.AsynchronousCloseException; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; @@ -186,17 +187,33 @@ public class SwitchHandler implements ISwitch { } public void stop() { - try { - running = false; - selector.wakeup(); - cancelSwitchTimer(); - this.selector.close(); - this.socket.close(); - executor.shutdown(); - } catch (Exception e) { - // do nothing since we are shutting down. - return; - } + running = false; + cancelSwitchTimer(); + try { + selector.wakeup(); + selector.close(); + } catch (Exception e) { + } + try { + socket.close(); + } catch (Exception e) { + } + try { + msgReadWriteService.stop(); + } catch (Exception e) { + } + executor.shutdown(); + + selector = null; + socket = null; + msgReadWriteService = null; + + if (switchHandlerThread != null) { + switchHandlerThread.interrupt(); + } + if (transmitThread != null) { + transmitThread.interrupt(); + } } @Override @@ -713,7 +730,8 @@ public class SwitchHandler implements ISwitch { */ class PriorityMessageTransmit implements Runnable { public void run() { - while (true) { + running = true; + while (running) { try { if (!transmitQ.isEmpty()) { PriorityMessage pmsg = transmitQ.poll(); @@ -725,6 +743,7 @@ public class SwitchHandler implements ISwitch { reportError(e); } } + transmitQ = null; } } @@ -762,7 +781,7 @@ public class SwitchHandler implements ISwitch { } private IMessageReadWrite getMessageReadWriteService() throws Exception { - String str = System.getProperty("secureChannelEnabled"); + String str = System.getProperty("secureChannelEnabled").trim(); return ((str != null) && (str.equalsIgnoreCase("true"))) ? new SecureMessageReadWriteService(socket, selector) : new MessageReadWriteService(socket, selector); diff --git a/opendaylight/topologymanager/src/main/java/org/opendaylight/controller/topologymanager/internal/TopologyManagerImpl.java b/opendaylight/topologymanager/src/main/java/org/opendaylight/controller/topologymanager/internal/TopologyManagerImpl.java index 25058a3e13..227df54944 100644 --- a/opendaylight/topologymanager/src/main/java/org/opendaylight/controller/topologymanager/internal/TopologyManagerImpl.java +++ b/opendaylight/topologymanager/src/main/java/org/opendaylight/controller/topologymanager/internal/TopologyManagerImpl.java @@ -733,7 +733,7 @@ public class TopologyManagerImpl implements ITopologyManager, String dpid = ci.nextArgument(); if (dpid == null) { - ci.println("Null source ndoe id"); + ci.println("Null source node id"); return; } -- 2.36.6