public void run() {
        info("Route-" + hashCode() + " entering run()");
        try {
            while (!stopped()) {
                try {
		    if (serverSocket == null) {
			info("Thread-" + Thread.currentThread().hashCode() + " Route-" + hashCode() + " constructing new ServerSocket on port " + local_port);
			serverSocket = new ServerSocket(local_port);
		    }
                    Socket localSocket, remoteSocket;
                    try {
                        info("waiting for connection to serversocket on port " + local_port);
			info("Thread-" + Thread.currentThread().hashCode() + " Route-" + hashCode() + " calling accept()");
                        localSocket = serverSocket.accept();
                        info("connection received on port " + local_port);
                        info("connecting to remote socket: host: " + remote_hostname + ", port: " + remote_port);
                        remoteSocket = new Socket(remote_hostname, remote_port);
                        info("remote socket connected, constructing connection processor ...");
                        final ConnectionProcessorImpl proc = new ConnectionProcessorImpl(localSocket.getInputStream(),
											 localSocket.getOutputStream(),
											 remoteSocket.getInputStream(),
											 remoteSocket.getOutputStream(),
											 this.name,
											 this.log_dir,
											 filterConfigs);
			synchronized(processors) { processors.add(proc); }
                        info("starting connection processor impl thread for " + proc.hashCode() +  " ...");
                        new Thread(proc).start();
                        info("connection processor impl thread started.");
			//proc.run();
                    } catch (java.net.SocketException ignored) {
			// happens if the serverSocket is closed while we're blocking on accept()
                    }
                } catch (IOException e) {
		    // thrown by ServerSocket construction
		    warn("Route-" + hashCode() + " run() catch #2: " + e.getMessage());
                }

            }
        } finally {
            info("Route-" + hashCode() + " leaving run()");
        }
    }