OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/tools/quic/quic_client.h" | 5 #include "net/tools/quic/quic_client.h" |
6 | 6 |
7 #include <errno.h> | 7 #include <errno.h> |
8 #include <netinet/in.h> | 8 #include <netinet/in.h> |
9 #include <string.h> | 9 #include <string.h> |
10 #include <sys/epoll.h> | 10 #include <sys/epoll.h> |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 supported_versions, | 67 supported_versions, |
68 config, | 68 config, |
69 new QuicEpollConnectionHelper(epoll_server), | 69 new QuicEpollConnectionHelper(epoll_server), |
70 proof_verifier), | 70 proof_verifier), |
71 server_address_(server_address), | 71 server_address_(server_address), |
72 local_port_(0), | 72 local_port_(0), |
73 epoll_server_(epoll_server), | 73 epoll_server_(epoll_server), |
74 initialized_(false), | 74 initialized_(false), |
75 packets_dropped_(0), | 75 packets_dropped_(0), |
76 overflow_supported_(false), | 76 overflow_supported_(false), |
77 use_recvmmsg_(false), | |
78 store_response_(false), | 77 store_response_(false), |
79 latest_response_code_(-1), | 78 latest_response_code_(-1), |
80 packet_reader_(new QuicPacketReader()) {} | 79 packet_reader_(new QuicPacketReader()) {} |
81 | 80 |
82 QuicClient::~QuicClient() { | 81 QuicClient::~QuicClient() { |
83 if (connected()) { | 82 if (connected()) { |
84 session()->connection()->SendConnectionCloseWithDetails( | 83 session()->connection()->SendConnectionCloseWithDetails( |
85 QUIC_PEER_GOING_AWAY, "Client being torn down"); | 84 QUIC_PEER_GOING_AWAY, "Client being torn down"); |
86 } | 85 } |
87 | 86 |
88 STLDeleteElements(&data_to_resend_on_connect_); | 87 STLDeleteElements(&data_to_resend_on_connect_); |
89 STLDeleteElements(&data_sent_before_handshake_); | 88 STLDeleteElements(&data_sent_before_handshake_); |
90 | 89 |
91 CleanUpAllUDPSockets(); | 90 CleanUpAllUDPSockets(); |
92 } | 91 } |
93 | 92 |
94 bool QuicClient::Initialize() { | 93 bool QuicClient::Initialize() { |
95 QuicClientBase::Initialize(); | 94 QuicClientBase::Initialize(); |
96 | 95 |
97 #if MMSG_MORE | |
98 use_recvmmsg_ = true; | |
99 #endif | |
100 | |
101 set_num_sent_client_hellos(0); | 96 set_num_sent_client_hellos(0); |
102 set_num_stateless_rejects_received(0); | 97 set_num_stateless_rejects_received(0); |
103 set_connection_error(QUIC_NO_ERROR); | 98 set_connection_error(QUIC_NO_ERROR); |
104 | 99 |
105 // If an initial flow control window has not explicitly been set, then use the | 100 // If an initial flow control window has not explicitly been set, then use the |
106 // same values that Chrome uses. | 101 // same values that Chrome uses. |
107 const uint32_t kSessionMaxRecvWindowSize = 15 * 1024 * 1024; // 15 MB | 102 const uint32_t kSessionMaxRecvWindowSize = 15 * 1024 * 1024; // 15 MB |
108 const uint32_t kStreamMaxRecvWindowSize = 6 * 1024 * 1024; // 6 MB | 103 const uint32_t kStreamMaxRecvWindowSize = 6 * 1024 * 1024; // 6 MB |
109 if (config()->GetInitialStreamFlowControlWindowToSend() == | 104 if (config()->GetInitialStreamFlowControlWindowToSend() == |
110 kMinimumFlowControlSendWindow) { | 105 kMinimumFlowControlSendWindow) { |
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 | 384 |
390 return true; | 385 return true; |
391 } | 386 } |
392 | 387 |
393 void QuicClient::OnEvent(int fd, EpollEvent* event) { | 388 void QuicClient::OnEvent(int fd, EpollEvent* event) { |
394 DCHECK_EQ(fd, GetLatestFD()); | 389 DCHECK_EQ(fd, GetLatestFD()); |
395 | 390 |
396 if (event->in_events & EPOLLIN) { | 391 if (event->in_events & EPOLLIN) { |
397 bool more_to_read = true; | 392 bool more_to_read = true; |
398 while (connected() && more_to_read) { | 393 while (connected() && more_to_read) { |
399 if (use_recvmmsg_) { | 394 more_to_read = packet_reader_->ReadAndDispatchPackets( |
400 more_to_read = packet_reader_->ReadAndDispatchPackets( | 395 GetLatestFD(), QuicClient::GetLatestClientAddress().port(), this, |
401 GetLatestFD(), QuicClient::GetLatestClientAddress().port(), this, | 396 overflow_supported_ ? &packets_dropped_ : nullptr); |
402 overflow_supported_ ? &packets_dropped_ : nullptr); | |
403 } else { | |
404 more_to_read = QuicPacketReader::ReadAndDispatchSinglePacket( | |
405 GetLatestFD(), QuicClient::GetLatestClientAddress().port(), this, | |
406 overflow_supported_ ? &packets_dropped_ : nullptr); | |
407 } | |
408 } | 397 } |
409 } | 398 } |
410 if (connected() && (event->in_events & EPOLLOUT)) { | 399 if (connected() && (event->in_events & EPOLLOUT)) { |
411 writer()->SetWritable(); | 400 writer()->SetWritable(); |
412 session()->connection()->OnCanWrite(); | 401 session()->connection()->OnCanWrite(); |
413 } | 402 } |
414 if (event->in_events & EPOLLERR) { | 403 if (event->in_events & EPOLLERR) { |
415 DVLOG(1) << "Epollerr"; | 404 DVLOG(1) << "Epollerr"; |
416 } | 405 } |
417 } | 406 } |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
496 return fd_address_map_.back().first; | 485 return fd_address_map_.back().first; |
497 } | 486 } |
498 | 487 |
499 void QuicClient::ProcessPacket(const IPEndPoint& self_address, | 488 void QuicClient::ProcessPacket(const IPEndPoint& self_address, |
500 const IPEndPoint& peer_address, | 489 const IPEndPoint& peer_address, |
501 const QuicEncryptedPacket& packet) { | 490 const QuicEncryptedPacket& packet) { |
502 session()->connection()->ProcessUdpPacket(self_address, peer_address, packet); | 491 session()->connection()->ProcessUdpPacket(self_address, peer_address, packet); |
503 } | 492 } |
504 | 493 |
505 } // namespace net | 494 } // namespace net |
OLD | NEW |