Index: net/quic/quic_server.cc |
diff --git a/net/quic/quic_server.cc b/net/quic/quic_server.cc |
deleted file mode 100644 |
index 610b305f66b7ea4b0ac323e3e72f0405ca92c643..0000000000000000000000000000000000000000 |
--- a/net/quic/quic_server.cc |
+++ /dev/null |
@@ -1,191 +0,0 @@ |
-// Copyright 2014 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/quic/quic_server.h" |
- |
-#include <string.h> |
- |
-#include "net/base/ip_endpoint.h" |
-#include "net/base/net_errors.h" |
-#include "net/quic/crypto/crypto_handshake.h" |
-#include "net/quic/crypto/quic_random.h" |
-#include "net/quic/quic_crypto_stream.h" |
-#include "net/quic/quic_data_reader.h" |
-#include "net/quic/quic_dispatcher.h" |
-#include "net/quic/quic_in_memory_cache.h" |
-#include "net/quic/quic_protocol.h" |
-#include "net/quic/quic_server_packet_writer.h" |
-#include "net/udp/udp_server_socket.h" |
- |
-namespace net { |
- |
-namespace { |
- |
-const char kSourceAddressTokenSecret[] = "secret"; |
- |
-// Allocate some extra space so we can send an error if the client goes over |
-// the limit. |
-const int kReadBufferSize = 2 * kMaxPacketSize; |
- |
-} // namespace |
- |
-QuicServer::QuicServer(const QuicConfig& config, |
- const QuicVersionVector& supported_versions) |
- : helper_(base::MessageLoop::current()->message_loop_proxy().get(), |
- &clock_, |
- QuicRandom::GetInstance()), |
- config_(config), |
- crypto_config_(kSourceAddressTokenSecret, QuicRandom::GetInstance()), |
- supported_versions_(supported_versions), |
- read_pending_(false), |
- synchronous_read_count_(0), |
- read_buffer_(new IOBufferWithSize(kReadBufferSize)), |
- weak_factory_(this) { |
- Initialize(); |
-} |
- |
-void QuicServer::Initialize() { |
-#if MMSG_MORE |
- use_recvmmsg_ = true; |
-#endif |
- |
- // 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 kInitialSessionFlowControlWindow = 1 * 1024 * 1024; // 1 MB |
- const uint32 kInitialStreamFlowControlWindow = 64 * 1024; // 64 KB |
- if (config_.GetInitialStreamFlowControlWindowToSend() == |
- kMinimumFlowControlSendWindow) { |
- config_.SetInitialStreamFlowControlWindowToSend( |
- kInitialStreamFlowControlWindow); |
- } |
- if (config_.GetInitialSessionFlowControlWindowToSend() == |
- kMinimumFlowControlSendWindow) { |
- config_.SetInitialSessionFlowControlWindowToSend( |
- kInitialSessionFlowControlWindow); |
- } |
- |
- // Initialize the in memory cache now. |
- QuicInMemoryCache::GetInstance(); |
- |
- scoped_ptr<CryptoHandshakeMessage> scfg( |
- crypto_config_.AddDefaultConfig( |
- helper_.GetRandomGenerator(), helper_.GetClock(), |
- QuicCryptoServerConfig::ConfigOptions())); |
-} |
- |
-QuicServer::~QuicServer() { |
-} |
- |
-int QuicServer::Listen(const IPEndPoint& address) { |
- scoped_ptr<UDPServerSocket> socket( |
- new UDPServerSocket(&net_log_, NetLog::Source())); |
- |
- socket->AllowAddressReuse(); |
- |
- int rc = socket->Listen(address); |
- if (rc < 0) { |
- LOG(ERROR) << "Listen() failed: " << ErrorToString(rc); |
- return rc; |
- } |
- |
- // These send and receive buffer sizes are sized for a single connection, |
- // because the default usage of QuicServer is as a test server with one or |
- // two clients. Adjust higher for use with many clients. |
- rc = socket->SetReceiveBufferSize( |
- static_cast<int32>(kDefaultSocketReceiveBuffer)); |
- if (rc < 0) { |
- LOG(ERROR) << "SetReceiveBufferSize() failed: " << ErrorToString(rc); |
- return rc; |
- } |
- |
- rc = socket->SetSendBufferSize(20 * kMaxPacketSize); |
- if (rc < 0) { |
- LOG(ERROR) << "SetSendBufferSize() failed: " << ErrorToString(rc); |
- return rc; |
- } |
- |
- rc = socket->GetLocalAddress(&server_address_); |
- if (rc < 0) { |
- LOG(ERROR) << "GetLocalAddress() failed: " << ErrorToString(rc); |
- return rc; |
- } |
- |
- DVLOG(1) << "Listening on " << server_address_.ToString(); |
- |
- socket_.swap(socket); |
- |
- dispatcher_.reset( |
- new QuicDispatcher(config_, |
- crypto_config_, |
- supported_versions_, |
- new QuicDispatcher::DefaultPacketWriterFactory(), |
- &helper_)); |
- QuicServerPacketWriter* writer = new QuicServerPacketWriter( |
- socket_.get(), |
- dispatcher_.get()); |
- dispatcher_->Initialize(writer); |
- |
- StartReading(); |
- |
- return OK; |
-} |
- |
-void QuicServer::Shutdown() { |
- // Before we shut down the epoll server, give all active sessions a chance to |
- // notify clients that they're closing. |
- dispatcher_->Shutdown(); |
- |
- socket_->Close(); |
- socket_.reset(); |
-} |
- |
-void QuicServer::StartReading() { |
- if (read_pending_) { |
- return; |
- } |
- read_pending_ = true; |
- |
- int result = socket_->RecvFrom( |
- read_buffer_.get(), |
- read_buffer_->size(), |
- &client_address_, |
- base::Bind(&QuicServer::OnReadComplete, base::Unretained(this))); |
- |
- if (result == ERR_IO_PENDING) { |
- synchronous_read_count_ = 0; |
- return; |
- } |
- |
- if (++synchronous_read_count_ > 32) { |
- synchronous_read_count_ = 0; |
- // Schedule the processing through the message loop to 1) prevent infinite |
- // recursion and 2) avoid blocking the thread for too long. |
- base::MessageLoop::current()->PostTask( |
- FROM_HERE, |
- base::Bind(&QuicServer::OnReadComplete, |
- weak_factory_.GetWeakPtr(), |
- result)); |
- } else { |
- OnReadComplete(result); |
- } |
-} |
- |
-void QuicServer::OnReadComplete(int result) { |
- read_pending_ = false; |
- if (result == 0) |
- result = ERR_CONNECTION_CLOSED; |
- |
- if (result < 0) { |
- LOG(ERROR) << "QuicServer read failed: " << ErrorToString(result); |
- Shutdown(); |
- return; |
- } |
- |
- QuicEncryptedPacket packet(read_buffer_->data(), result, false); |
- dispatcher_->ProcessPacket(server_address_, client_address_, packet); |
- |
- StartReading(); |
-} |
- |
-} // namespace net |