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