xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/quic/qbone/qbone_packet_exchanger.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright (c) 2019 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 
5 #include "quiche/quic/qbone/qbone_packet_exchanger.h"
6 
7 #include <utility>
8 
9 namespace quic {
10 
ReadAndDeliverPacket(QboneClientInterface * qbone_client)11 bool QbonePacketExchanger::ReadAndDeliverPacket(
12     QboneClientInterface* qbone_client) {
13   bool blocked = false;
14   std::string error;
15   std::unique_ptr<QuicData> packet = ReadPacket(&blocked, &error);
16   if (packet == nullptr) {
17     if (!blocked && visitor_) {
18       visitor_->OnReadError(error);
19     }
20     return false;
21   }
22   qbone_client->ProcessPacketFromNetwork(packet->AsStringPiece());
23   return true;
24 }
25 
WritePacketToNetwork(const char * packet,size_t size)26 void QbonePacketExchanger::WritePacketToNetwork(const char* packet,
27                                                 size_t size) {
28   bool blocked = false;
29   std::string error;
30   if (packet_queue_.empty() && !write_blocked_) {
31     if (WritePacket(packet, size, &blocked, &error)) {
32       return;
33     }
34     if (blocked) {
35       write_blocked_ = true;
36     } else {
37       QUIC_LOG_EVERY_N_SEC(ERROR, 60) << "Packet write failed: " << error;
38       if (visitor_) {
39         visitor_->OnWriteError(error);
40       }
41     }
42   }
43 
44   // Drop the packet on the floor if the queue if full.
45   if (packet_queue_.size() >= max_pending_packets_) {
46     return;
47   }
48 
49   auto data_copy = new char[size];
50   memcpy(data_copy, packet, size);
51   packet_queue_.push_back(
52       std::make_unique<QuicData>(data_copy, size, /* owns_buffer = */ true));
53 }
54 
SetWritable()55 void QbonePacketExchanger::SetWritable() {
56   write_blocked_ = false;
57   while (!packet_queue_.empty()) {
58     bool blocked = false;
59     std::string error;
60     if (WritePacket(packet_queue_.front()->data(),
61                     packet_queue_.front()->length(), &blocked, &error)) {
62       packet_queue_.pop_front();
63     } else {
64       if (!blocked && visitor_) {
65         visitor_->OnWriteError(error);
66       }
67       write_blocked_ = blocked;
68       return;
69     }
70   }
71 }
72 
73 }  // namespace quic
74