2020-01-08 11:15:16 +01:00
|
|
|
// OpenVPN -- An application to securely tunnel IP networks
|
|
|
|
// over a single port, with support for SSL/TLS-based
|
|
|
|
// session authentication and key exchange,
|
|
|
|
// packet encryption, packet authentication, and
|
|
|
|
// packet compression.
|
2015-10-19 00:27:01 +02:00
|
|
|
//
|
2022-09-29 11:41:13 +02:00
|
|
|
// Copyright (C) 2012-2022 OpenVPN Inc.
|
2015-10-19 00:27:01 +02:00
|
|
|
//
|
2020-01-08 11:15:16 +01:00
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU Affero General Public License Version 3
|
|
|
|
// as published by the Free Software Foundation.
|
2015-10-19 00:27:01 +02:00
|
|
|
//
|
2020-01-08 11:15:16 +01:00
|
|
|
// 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 Affero General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU Affero General Public License
|
|
|
|
// along with this program in the COPYING file.
|
|
|
|
// If not, see <http://www.gnu.org/licenses/>.
|
2015-10-19 00:27:01 +02:00
|
|
|
|
2020-01-08 11:15:16 +01:00
|
|
|
#pragma once
|
2015-10-19 00:27:01 +02:00
|
|
|
|
|
|
|
#include <openvpn/acceptor/base.hpp>
|
2019-08-30 10:03:06 +02:00
|
|
|
#include <openvpn/ssl/sslconsts.hpp>
|
2015-10-19 00:27:01 +02:00
|
|
|
|
|
|
|
namespace openvpn {
|
|
|
|
namespace Acceptor {
|
|
|
|
|
|
|
|
struct TCP : public Base
|
|
|
|
{
|
|
|
|
typedef RCPtr<TCP> Ptr;
|
|
|
|
|
2017-03-30 23:38:32 +02:00
|
|
|
TCP(openvpn_io::io_context &io_context)
|
2015-10-19 00:27:01 +02:00
|
|
|
: acceptor(io_context)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void async_accept(ListenerBase *listener,
|
|
|
|
const size_t acceptor_index,
|
2017-03-30 23:38:32 +02:00
|
|
|
openvpn_io::io_context &io_context) override
|
2015-10-19 00:27:01 +02:00
|
|
|
{
|
|
|
|
AsioPolySock::TCP::Ptr sock(new AsioPolySock::TCP(io_context, acceptor_index));
|
2018-05-12 05:40:57 +02:00
|
|
|
acceptor.async_accept(sock->socket,
|
|
|
|
[listener = ListenerBase::Ptr(listener), sock](const openvpn_io::error_code &error) mutable
|
|
|
|
{ listener->handle_accept(std::move(sock), error); });
|
2015-10-19 00:27:01 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
virtual void close() override
|
|
|
|
{
|
2019-08-31 05:26:01 +02:00
|
|
|
#ifdef OPENVPN_DEBUG_ACCEPT
|
|
|
|
OPENVPN_LOG("ACCEPTOR CLOSE " << local_endpoint);
|
|
|
|
#endif
|
2015-10-19 00:27:01 +02:00
|
|
|
acceptor.close();
|
|
|
|
}
|
|
|
|
|
2019-08-30 10:03:06 +02:00
|
|
|
enum
|
|
|
|
{
|
|
|
|
// start at (1<<24) to avoid conflicting with SSLConst flags
|
|
|
|
DISABLE_REUSE_ADDR = (1 << 24),
|
|
|
|
REUSE_PORT = (1 << 25),
|
|
|
|
|
|
|
|
FIRST = DISABLE_REUSE_ADDR
|
|
|
|
};
|
|
|
|
void set_socket_options(unsigned int flags)
|
2015-10-19 00:27:01 +02:00
|
|
|
{
|
2019-08-30 10:03:06 +02:00
|
|
|
static_assert(int(FIRST) > int(SSLConst::LAST), "TCP flags in conflict with SSL flags");
|
|
|
|
|
2015-10-19 00:27:01 +02:00
|
|
|
#if defined(OPENVPN_PLATFORM_WIN)
|
|
|
|
// set Windows socket flags
|
2019-08-30 10:03:06 +02:00
|
|
|
if (!(flags & DISABLE_REUSE_ADDR))
|
|
|
|
acceptor.set_option(openvpn_io::ip::tcp::acceptor::reuse_address(true));
|
2015-10-19 00:27:01 +02:00
|
|
|
#else
|
|
|
|
// set Unix socket flags
|
|
|
|
{
|
|
|
|
const int fd = acceptor.native_handle();
|
2019-08-30 10:03:06 +02:00
|
|
|
if (flags & REUSE_PORT)
|
|
|
|
SockOpt::reuseport(fd);
|
|
|
|
if (!(flags & DISABLE_REUSE_ADDR))
|
|
|
|
SockOpt::reuseaddr(fd);
|
2015-10-19 00:27:01 +02:00
|
|
|
SockOpt::set_cloexec(fd);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2019-08-30 10:03:06 +02:00
|
|
|
// filter all but socket option flags
|
|
|
|
static unsigned int sockopt_flags(const unsigned int flags)
|
|
|
|
{
|
|
|
|
return flags & (DISABLE_REUSE_ADDR | REUSE_PORT);
|
|
|
|
}
|
|
|
|
|
2017-03-30 23:38:32 +02:00
|
|
|
openvpn_io::ip::tcp::endpoint local_endpoint;
|
|
|
|
openvpn_io::ip::tcp::acceptor acceptor;
|
2015-10-19 00:27:01 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace Acceptor
|
|
|
|
} // namespace openvpn
|