quic_simple_server_packet_writer.cc 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. // Copyright 2014 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "net/tools/quic/quic_simple_server_packet_writer.h"
  5. #include <utility>
  6. #include "base/bind.h"
  7. #include "base/check_op.h"
  8. #include "base/location.h"
  9. #include "base/metrics/histogram_functions.h"
  10. #include "net/base/io_buffer.h"
  11. #include "net/base/net_errors.h"
  12. #include "net/quic/address_utils.h"
  13. #include "net/socket/udp_server_socket.h"
  14. #include "net/third_party/quiche/src/quiche/quic/core/quic_dispatcher.h"
  15. namespace net {
  16. QuicSimpleServerPacketWriter::QuicSimpleServerPacketWriter(
  17. UDPServerSocket* socket,
  18. quic::QuicDispatcher* dispatcher)
  19. : socket_(socket), dispatcher_(dispatcher) {}
  20. QuicSimpleServerPacketWriter::~QuicSimpleServerPacketWriter() = default;
  21. void QuicSimpleServerPacketWriter::OnWriteComplete(int rv) {
  22. DCHECK_NE(rv, ERR_IO_PENDING);
  23. write_blocked_ = false;
  24. quic::WriteResult result(
  25. rv < 0 ? quic::WRITE_STATUS_ERROR : quic::WRITE_STATUS_OK, rv);
  26. dispatcher_->OnCanWrite();
  27. }
  28. bool QuicSimpleServerPacketWriter::IsWriteBlocked() const {
  29. return write_blocked_;
  30. }
  31. void QuicSimpleServerPacketWriter::SetWritable() {
  32. write_blocked_ = false;
  33. }
  34. absl::optional<int> QuicSimpleServerPacketWriter::MessageTooBigErrorCode()
  35. const {
  36. return ERR_MSG_TOO_BIG;
  37. }
  38. quic::WriteResult QuicSimpleServerPacketWriter::WritePacket(
  39. const char* buffer,
  40. size_t buf_len,
  41. const quic::QuicIpAddress& self_address,
  42. const quic::QuicSocketAddress& peer_address,
  43. quic::PerPacketOptions* options) {
  44. scoped_refptr<StringIOBuffer> buf =
  45. base::MakeRefCounted<StringIOBuffer>(std::string(buffer, buf_len));
  46. DCHECK(!IsWriteBlocked());
  47. int rv;
  48. if (buf_len <= static_cast<size_t>(std::numeric_limits<int>::max())) {
  49. rv = socket_->SendTo(
  50. buf.get(), static_cast<int>(buf_len), ToIPEndPoint(peer_address),
  51. base::BindOnce(&QuicSimpleServerPacketWriter::OnWriteComplete,
  52. weak_factory_.GetWeakPtr()));
  53. } else {
  54. rv = ERR_MSG_TOO_BIG;
  55. }
  56. quic::WriteStatus status = quic::WRITE_STATUS_OK;
  57. if (rv < 0) {
  58. if (rv != ERR_IO_PENDING) {
  59. base::UmaHistogramSparse("Net.quic::QuicSession.WriteError", -rv);
  60. status = quic::WRITE_STATUS_ERROR;
  61. } else {
  62. status = quic::WRITE_STATUS_BLOCKED_DATA_BUFFERED;
  63. write_blocked_ = true;
  64. }
  65. }
  66. return quic::WriteResult(status, rv);
  67. }
  68. quic::QuicByteCount QuicSimpleServerPacketWriter::GetMaxPacketSize(
  69. const quic::QuicSocketAddress& peer_address) const {
  70. return quic::kMaxOutgoingPacketSize;
  71. }
  72. bool QuicSimpleServerPacketWriter::SupportsReleaseTime() const {
  73. return false;
  74. }
  75. bool QuicSimpleServerPacketWriter::IsBatchMode() const {
  76. return false;
  77. }
  78. quic::QuicPacketBuffer QuicSimpleServerPacketWriter::GetNextWriteLocation(
  79. const quic::QuicIpAddress& self_address,
  80. const quic::QuicSocketAddress& peer_address) {
  81. return {nullptr, nullptr};
  82. }
  83. quic::WriteResult QuicSimpleServerPacketWriter::Flush() {
  84. return quic::WriteResult(quic::WRITE_STATUS_OK, 0);
  85. }
  86. } // namespace net