1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/tools/quic/quic_server_session.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/logging.h" 8d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)#include "net/quic/quic_connection.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/quic/reliable_quic_stream.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/tools/quic/quic_spdy_server_stream.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace net { 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace tools { 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)QuicServerSession::QuicServerSession( 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const QuicConfig& config, 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicConnection* connection, 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicSessionOwner* owner) 19d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) : QuicSession(connection, config), 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) owner_(owner) { 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)QuicServerSession::~QuicServerSession() { 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void QuicServerSession::InitializeSession( 2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const QuicCryptoServerConfig& crypto_config) { 2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) crypto_stream_.reset(CreateQuicCryptoServerStream(crypto_config)); 2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)QuicCryptoServerStream* QuicServerSession::CreateQuicCryptoServerStream( 3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const QuicCryptoServerConfig& crypto_config) { 3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return new QuicCryptoServerStream(crypto_config, this); 3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void QuicServerSession::OnConnectionClosed(QuicErrorCode error, 371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool from_peer) { 381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) QuicSession::OnConnectionClosed(error, from_peer); 391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) owner_->OnConnectionClosed(connection()->guid(), error); 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 42d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)bool QuicServerSession::ShouldCreateIncomingDataStream(QuicStreamId id) { 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (id % 2 == 0) { 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DLOG(INFO) << "Invalid incoming even stream_id:" << id; 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connection()->SendConnectionClose(QUIC_INVALID_STREAM_ID); 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (GetNumOpenStreams() >= get_max_open_streams()) { 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DLOG(INFO) << "Failed to create a new incoming stream with id:" << id 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) << " Already " << GetNumOpenStreams() << " open."; 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) connection()->SendConnectionClose(QUIC_TOO_MANY_OPEN_STREAMS); 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 57d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)QuicDataStream* QuicServerSession::CreateIncomingDataStream( 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicStreamId id) { 59d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles) if (!ShouldCreateIncomingDataStream(id)) { 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NULL; 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return new QuicSpdyServerStream(id, this); 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 66d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)QuicDataStream* QuicServerSession::CreateOutgoingDataStream() { 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DLOG(ERROR) << "Server push not yet supported"; 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NULL; 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)QuicCryptoServerStream* QuicServerSession::GetCryptoStream() { 7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return crypto_stream_.get(); 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace tools 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace net 77