116 lines
4.1 KiB
C++
116 lines
4.1 KiB
C++
// Copyright 2019 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#ifndef PLATFORM_IMPL_TLS_DATA_ROUTER_POSIX_H_
|
|
#define PLATFORM_IMPL_TLS_DATA_ROUTER_POSIX_H_
|
|
|
|
#include <memory>
|
|
#include <mutex>
|
|
#include <unordered_map>
|
|
#include <vector>
|
|
|
|
#include "absl/base/thread_annotations.h"
|
|
#include "platform/api/time.h"
|
|
#include "platform/impl/socket_handle_waiter.h"
|
|
#include "util/osp_logging.h"
|
|
|
|
namespace openscreen {
|
|
|
|
class StreamSocketPosix;
|
|
class TlsConnectionPosix;
|
|
|
|
// This class is responsible for 3 operations:
|
|
// 1) Listen for incoming connections on registed StreamSockets.
|
|
// 2) Check all registered TlsConnections for read data via boringSSL call
|
|
// and pass all read data to the connection's observer.
|
|
// 3) Check all registered TlsConnections' write buffers for additional data
|
|
// to be written out. If any is present, write it using boringSSL.
|
|
// The above operations also imply that this class must support registration
|
|
// of StreamSockets and TlsConnections.
|
|
// These operations will be called repeatedly on the networking thread, so none
|
|
// of them should block. Additionally, this class must ensure that deletions of
|
|
// the above types do not occur while a socket/connection is currently being
|
|
// accessed from the networking thread.
|
|
class TlsDataRouterPosix : public SocketHandleWaiter::Subscriber {
|
|
public:
|
|
class SocketObserver {
|
|
public:
|
|
virtual ~SocketObserver() = default;
|
|
|
|
// Socket creation shouldn't occur on the Networking thread, so pass the
|
|
// socket to the observer and expect them to call socket->Accept() on the
|
|
// correct thread.
|
|
virtual void OnConnectionPending(StreamSocketPosix* socket) = 0;
|
|
};
|
|
|
|
// The provided SocketHandleWaiter is expected to live for the duration of
|
|
// this object's lifetime.
|
|
TlsDataRouterPosix(
|
|
SocketHandleWaiter* waiter,
|
|
std::function<Clock::time_point()> now_function = Clock::now);
|
|
~TlsDataRouterPosix() override;
|
|
|
|
// Register a TlsConnection that should be watched for readable and writable
|
|
// data.
|
|
void RegisterConnection(TlsConnectionPosix* connection);
|
|
|
|
// Deregister a TlsConnection.
|
|
void DeregisterConnection(TlsConnectionPosix* connection);
|
|
|
|
// Takes ownership of a StreamSocket and registers that it should be watched
|
|
// for incoming TCP connections with the SocketHandleWaiter.
|
|
void RegisterAcceptObserver(std::unique_ptr<StreamSocketPosix> socket,
|
|
SocketObserver* observer);
|
|
|
|
// Stops watching TCP sockets added by a particular observer for incoming
|
|
// connections.
|
|
void DeregisterAcceptObserver(SocketObserver* observer);
|
|
|
|
// SocketHandleWaiter::Subscriber overrides.
|
|
void ProcessReadyHandle(SocketHandleWaiter::SocketHandleRef handle,
|
|
uint32_t flags) override;
|
|
|
|
OSP_DISALLOW_COPY_AND_ASSIGN(TlsDataRouterPosix);
|
|
|
|
protected:
|
|
// Determines if the provided socket is currently being watched by this
|
|
// instance.
|
|
bool IsSocketWatched(StreamSocketPosix* socket) const;
|
|
|
|
virtual bool HasTimedOut(Clock::time_point start_time,
|
|
Clock::duration timeout);
|
|
|
|
friend class TestingDataRouter;
|
|
|
|
bool disable_locking_for_testing_ = false;
|
|
|
|
private:
|
|
SocketHandleWaiter* waiter_;
|
|
|
|
// Mutex guarding connections_ vector.
|
|
mutable std::mutex connections_mutex_;
|
|
|
|
// Mutex guarding |accept_socket_mappings_|.
|
|
mutable std::mutex accept_socket_mutex_;
|
|
|
|
// Function to get the current time.
|
|
std::function<Clock::time_point()> now_function_;
|
|
|
|
// Mapping from all sockets to the observer that should be called when the
|
|
// socket recognizes an incoming connection.
|
|
std::unordered_map<StreamSocketPosix*, SocketObserver*>
|
|
accept_socket_mappings_ GUARDED_BY(accept_socket_mutex_);
|
|
|
|
// Set of all TlsConnectionPosix objects currently registered.
|
|
std::vector<TlsConnectionPosix*> connections_ GUARDED_BY(connections_mutex_);
|
|
|
|
// StreamSockets currently owned by this object, being watched for
|
|
std::vector<std::unique_ptr<StreamSocketPosix>> accept_stream_sockets_
|
|
GUARDED_BY(accept_socket_mutex_);
|
|
};
|
|
|
|
} // namespace openscreen
|
|
|
|
#endif // PLATFORM_IMPL_TLS_DATA_ROUTER_POSIX_H_
|