Index: net/tools/quic/quic_dispatcher.h |
diff --git a/net/tools/quic/quic_dispatcher.h b/net/tools/quic/quic_dispatcher.h |
index 1c010abbaa1e0efcf6ffd1f8948ab25dbc37e341..47c31d213e7718c5381a8e2641a774c2bdffafdd 100644 |
--- a/net/tools/quic/quic_dispatcher.h |
+++ b/net/tools/quic/quic_dispatcher.h |
@@ -10,6 +10,7 @@ |
#include <list> |
+#include "base/basictypes.h" |
#include "base/containers/hash_tables.h" |
#include "base/memory/scoped_ptr.h" |
#include "net/base/ip_endpoint.h" |
@@ -37,11 +38,14 @@ namespace net { |
class EpollServer; |
class QuicConfig; |
+class QuicConnectionHelper; |
class QuicCryptoServerConfig; |
class QuicSession; |
namespace tools { |
+class QuicPacketWriterWrapper; |
+ |
namespace test { |
class QuicDispatcherPeer; |
} // namespace test |
@@ -49,7 +53,8 @@ class QuicDispatcherPeer; |
class DeleteSessionsAlarm; |
class QuicEpollConnectionHelper; |
-class QuicDispatcher : public QuicPacketWriter, public QuicSessionOwner { |
+class QuicDispatcher : public QuicPacketWriter, |
+ public QuicServerSessionVisitor { |
public: |
// Ideally we'd have a linked_hash_set: the boolean is unused. |
typedef linked_hash_map<QuicBlockedWriterInterface*, bool> WriteBlockedList; |
@@ -60,10 +65,12 @@ class QuicDispatcher : public QuicPacketWriter, public QuicSessionOwner { |
QuicDispatcher(const QuicConfig& config, |
const QuicCryptoServerConfig& crypto_config, |
const QuicVersionVector& supported_versions, |
- int fd, |
EpollServer* epoll_server); |
+ |
virtual ~QuicDispatcher(); |
+ void Initialize(int fd); |
+ |
// QuicPacketWriter |
virtual WriteResult WritePacket( |
const char* buffer, size_t buf_len, |
@@ -89,11 +96,12 @@ class QuicDispatcher : public QuicPacketWriter, public QuicSessionOwner { |
// Sends ConnectionClose frames to all connected clients. |
void Shutdown(); |
+ // QuicServerSessionVisitor interface implementation: |
// Ensure that the closed connection is cleaned up asynchronously. |
virtual void OnConnectionClosed(QuicGuid guid, QuicErrorCode error) OVERRIDE; |
- // Sets the fd and creates a default packet writer with that fd. |
- void set_fd(int fd); |
+ // Queues the blocked writer for later resumption. |
+ virtual void OnWriteBlocked(QuicBlockedWriterInterface* writer) OVERRIDE; |
typedef base::hash_map<QuicGuid, QuicSession*> SessionMap; |
@@ -110,8 +118,17 @@ class QuicDispatcher : public QuicPacketWriter, public QuicSessionOwner { |
WriteBlockedList* write_blocked_list() { return &write_blocked_list_; } |
protected: |
- const QuicConfig& config_; |
- const QuicCryptoServerConfig& crypto_config_; |
+ // Instantiates a new low-level packet writer. Caller takes ownership of the |
+ // returned object. |
+ QuicPacketWriter* CreateWriter(int fd); |
+ |
+ // Instantiates a new top-level writer wrapper. Takes ownership of |writer|. |
+ // Caller takes ownership of the returned object. |
+ virtual QuicPacketWriterWrapper* CreateWriterWrapper( |
+ QuicPacketWriter* writer); |
+ |
+ // Replaces the packet writer with |writer|. Takes ownership of |writer|. |
+ void set_writer(QuicPacketWriter* writer); |
QuicTimeWaitListManager* time_wait_list_manager() { |
return time_wait_list_manager_.get(); |
@@ -124,7 +141,6 @@ class QuicDispatcher : public QuicPacketWriter, public QuicSessionOwner { |
return supported_versions_; |
} |
- protected: |
// Called by |framer_visitor_| when the public header has been parsed. |
virtual bool OnUnauthenticatedPublicHeader( |
const QuicPacketPublicHeader& header); |
@@ -140,6 +156,10 @@ class QuicDispatcher : public QuicPacketWriter, public QuicSessionOwner { |
return *current_packet_; |
} |
+ const QuicConfig& config() const { return config_; } |
+ |
+ const QuicCryptoServerConfig& crypto_config() const { return crypto_config_; } |
+ |
private: |
class QuicFramerVisitor; |
friend class net::tools::test::QuicDispatcherPeer; |
@@ -154,6 +174,10 @@ class QuicDispatcher : public QuicPacketWriter, public QuicSessionOwner { |
bool HandlePacketForTimeWait(const QuicPacketPublicHeader& header); |
+ const QuicConfig& config_; |
+ |
+ const QuicCryptoServerConfig& crypto_config_; |
+ |
// The list of connections waiting to write. |
WriteBlockedList write_blocked_list_; |
@@ -170,14 +194,13 @@ class QuicDispatcher : public QuicPacketWriter, public QuicSessionOwner { |
EpollServer* epoll_server_; // Owned by the server. |
- // The connection for client-server communication |
- int fd_; |
- |
// The helper used for all connections. |
scoped_ptr<QuicEpollConnectionHelper> helper_; |
- // The writer to write to the socket with. |
- scoped_ptr<QuicPacketWriter> writer_; |
+ // The writer to write to the socket with. We require a writer wrapper to |
+ // allow replacing writer implementation without disturbing running |
+ // connections. |
+ scoped_ptr<QuicPacketWriterWrapper> writer_; |
// This vector contains QUIC versions which we currently support. |
// This should be ordered such that the highest supported version is the first |