summaryrefslogtreecommitdiff
path: root/chromium/net/tools/quic/quic_server.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/tools/quic/quic_server.cc')
-rw-r--r--chromium/net/tools/quic/quic_server.cc213
1 files changed, 0 insertions, 213 deletions
diff --git a/chromium/net/tools/quic/quic_server.cc b/chromium/net/tools/quic/quic_server.cc
deleted file mode 100644
index 45269bdd489..00000000000
--- a/chromium/net/tools/quic/quic_server.cc
+++ /dev/null
@@ -1,213 +0,0 @@
-// Copyright (c) 2012 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.
-
-#include "net/tools/quic/quic_server.h"
-
-#include <errno.h>
-#include <features.h>
-#include <netinet/in.h>
-#include <string.h>
-#include <sys/epoll.h>
-#include <sys/socket.h>
-
-#include <memory>
-
-#include "net/quic/core/crypto/crypto_handshake.h"
-#include "net/quic/core/crypto/quic_random.h"
-#include "net/quic/core/quic_crypto_stream.h"
-#include "net/quic/core/quic_data_reader.h"
-#include "net/quic/core/quic_packets.h"
-#include "net/quic/core/tls_server_handshaker.h"
-#include "net/quic/platform/api/quic_clock.h"
-#include "net/quic/platform/api/quic_flags.h"
-#include "net/quic/platform/api/quic_logging.h"
-#include "net/tools/quic/platform/impl/quic_epoll_clock.h"
-#include "net/tools/quic/platform/impl/quic_socket_utils.h"
-#include "net/tools/quic/quic_dispatcher.h"
-#include "net/tools/quic/quic_epoll_alarm_factory.h"
-#include "net/tools/quic/quic_epoll_connection_helper.h"
-#include "net/tools/quic/quic_http_response_cache.h"
-#include "net/tools/quic/quic_packet_reader.h"
-#include "net/tools/quic/quic_simple_crypto_server_stream_helper.h"
-#include "net/tools/quic/quic_simple_dispatcher.h"
-
-#ifndef SO_RXQ_OVFL
-#define SO_RXQ_OVFL 40
-#endif
-
-namespace net {
-
-namespace {
-
-// Specifies the directory used during QuicHttpResponseCache
-// construction to seed the cache. Cache directory can be
-// generated using `wget -p --save-headers <url>`
-std::string FLAGS_quic_response_cache_dir = "";
-
-const int kEpollFlags = EPOLLIN | EPOLLOUT | EPOLLET;
-const char kSourceAddressTokenSecret[] = "secret";
-
-} // namespace
-
-const size_t kNumSessionsToCreatePerSocketEvent = 16;
-
-QuicServer::QuicServer(std::unique_ptr<ProofSource> proof_source,
- QuicHttpResponseCache* response_cache)
- : QuicServer(std::move(proof_source),
- QuicConfig(),
- QuicCryptoServerConfig::ConfigOptions(),
- AllSupportedVersions(),
- response_cache) {}
-
-QuicServer::QuicServer(
- std::unique_ptr<ProofSource> proof_source,
- const QuicConfig& config,
- const QuicCryptoServerConfig::ConfigOptions& crypto_config_options,
- const ParsedQuicVersionVector& supported_versions,
- QuicHttpResponseCache* response_cache)
- : port_(0),
- fd_(-1),
- packets_dropped_(0),
- overflow_supported_(false),
- silent_close_(false),
- config_(config),
- crypto_config_(kSourceAddressTokenSecret,
- QuicRandom::GetInstance(),
- std::move(proof_source),
- TlsServerHandshaker::CreateSslCtx()),
- crypto_config_options_(crypto_config_options),
- version_manager_(supported_versions),
- packet_reader_(new QuicPacketReader()),
- response_cache_(response_cache) {
- Initialize();
-}
-
-void QuicServer::Initialize() {
- // If an initial flow control window has not explicitly been set, then use a
- // sensible value for a server: 1 MB for session, 64 KB for each stream.
- const uint32_t kInitialSessionFlowControlWindow = 1 * 1024 * 1024; // 1 MB
- const uint32_t kInitialStreamFlowControlWindow = 64 * 1024; // 64 KB
- if (config_.GetInitialStreamFlowControlWindowToSend() ==
- kMinimumFlowControlSendWindow) {
- config_.SetInitialStreamFlowControlWindowToSend(
- kInitialStreamFlowControlWindow);
- }
- if (config_.GetInitialSessionFlowControlWindowToSend() ==
- kMinimumFlowControlSendWindow) {
- config_.SetInitialSessionFlowControlWindowToSend(
- kInitialSessionFlowControlWindow);
- }
-
- epoll_server_.set_timeout_in_us(50 * 1000);
-
- if (!FLAGS_quic_response_cache_dir.empty()) {
- response_cache_->InitializeFromDirectory(FLAGS_quic_response_cache_dir);
- }
-
- QuicEpollClock clock(&epoll_server_);
-
- std::unique_ptr<CryptoHandshakeMessage> scfg(crypto_config_.AddDefaultConfig(
- QuicRandom::GetInstance(), &clock, crypto_config_options_));
-}
-
-QuicServer::~QuicServer() = default;
-
-bool QuicServer::CreateUDPSocketAndListen(const QuicSocketAddress& address) {
- fd_ = QuicSocketUtils::CreateUDPSocket(
- address,
- /*receive_buffer_size =*/kDefaultSocketReceiveBuffer,
- /*send_buffer_size =*/kDefaultSocketReceiveBuffer, &overflow_supported_);
- if (fd_ < 0) {
- QUIC_LOG(ERROR) << "CreateSocket() failed: " << strerror(errno);
- return false;
- }
-
- sockaddr_storage addr = address.generic_address();
- int rc = bind(fd_, reinterpret_cast<sockaddr*>(&addr), sizeof(addr));
- if (rc < 0) {
- QUIC_LOG(ERROR) << "Bind failed: " << strerror(errno);
- return false;
- }
- QUIC_LOG(INFO) << "Listening on " << address.ToString();
- port_ = address.port();
- if (port_ == 0) {
- QuicSocketAddress address;
- if (address.FromSocket(fd_) != 0) {
- QUIC_LOG(ERROR) << "Unable to get self address. Error: "
- << strerror(errno);
- }
- port_ = address.port();
- }
-
- epoll_server_.RegisterFD(fd_, this, kEpollFlags);
- dispatcher_.reset(CreateQuicDispatcher());
- dispatcher_->InitializeWithWriter(CreateWriter(fd_));
-
- return true;
-}
-
-QuicDefaultPacketWriter* QuicServer::CreateWriter(int fd) {
- return new QuicDefaultPacketWriter(fd);
-}
-
-QuicDispatcher* QuicServer::CreateQuicDispatcher() {
- QuicEpollAlarmFactory alarm_factory(&epoll_server_);
- return new QuicSimpleDispatcher(
- config_, &crypto_config_, &version_manager_,
- std::unique_ptr<QuicEpollConnectionHelper>(new QuicEpollConnectionHelper(
- &epoll_server_, QuicAllocator::BUFFER_POOL)),
- std::unique_ptr<QuicCryptoServerStream::Helper>(
- new QuicSimpleCryptoServerStreamHelper(QuicRandom::GetInstance())),
- std::unique_ptr<QuicEpollAlarmFactory>(
- new QuicEpollAlarmFactory(&epoll_server_)),
- response_cache_);
-}
-
-void QuicServer::WaitForEvents() {
- epoll_server_.WaitForEventsAndExecuteCallbacks();
-}
-
-void QuicServer::Shutdown() {
- if (!silent_close_) {
- // Before we shut down the epoll server, give all active sessions a chance
- // to notify clients that they're closing.
- dispatcher_->Shutdown();
- }
-
- close(fd_);
- fd_ = -1;
-}
-
-void QuicServer::OnEvent(int fd, EpollEvent* event) {
- DCHECK_EQ(fd, fd_);
- event->out_ready_mask = 0;
-
- if (event->in_events & EPOLLIN) {
- QUIC_DVLOG(1) << "EPOLLIN";
-
- dispatcher_->ProcessBufferedChlos(kNumSessionsToCreatePerSocketEvent);
-
- bool more_to_read = true;
- while (more_to_read) {
- more_to_read = packet_reader_->ReadAndDispatchPackets(
- fd_, port_, QuicEpollClock(&epoll_server_), dispatcher_.get(),
- overflow_supported_ ? &packets_dropped_ : nullptr);
- }
-
- if (dispatcher_->HasChlosBuffered()) {
- // Register EPOLLIN event to consume buffered CHLO(s).
- event->out_ready_mask |= EPOLLIN;
- }
- }
- if (event->in_events & EPOLLOUT) {
- dispatcher_->OnCanWrite();
- if (dispatcher_->HasPendingWrites()) {
- event->out_ready_mask |= EPOLLOUT;
- }
- }
- if (event->in_events & EPOLLERR) {
- }
-}
-
-} // namespace net