Select Git revision
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
multiplexed_socket.cpp 33.07 KiB
/*
* Copyright (C) 2004-2023 Savoir-faire Linux Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include "multiplexed_socket.h"
#include "peer_connection.h"
#include "ice_transport.h"
#include "certstore.h"
#include <opendht/logger.h>
#include <opendht/thread_pool.h>
#include <asio/io_context.hpp>
#include <asio/steady_timer.hpp>
#include <deque>
static constexpr std::size_t IO_BUFFER_SIZE {8192}; ///< Size of char buffer used by IO operations
static constexpr int MULTIPLEXED_SOCKET_VERSION {1};
struct ChanneledMessage
{
uint16_t channel;
std::vector<uint8_t> data;
MSGPACK_DEFINE(channel, data)
};
struct BeaconMsg
{
bool p;
MSGPACK_DEFINE_MAP(p)
};
struct VersionMsg
{
int v;
MSGPACK_DEFINE_MAP(v)
};
namespace dhtnet {
using clock = std::chrono::steady_clock;
using time_point = clock::time_point;
class MultiplexedSocket::Impl
{
public:
Impl(MultiplexedSocket& parent,
std::shared_ptr<asio::io_context> ctx,
const DeviceId& deviceId,
std::unique_ptr<TlsSocketEndpoint> endpoint,
std::shared_ptr<dht::log::Logger> logger)
: parent_(parent)
, ctx_(std::move(ctx))
, deviceId(deviceId)
, endpoint(std::move(endpoint))
, eventLoopThread_ {[this] {
try {