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