blob: d06376dfd5b097622080d8783986ddfa64530333 [file] [log] [blame]
wubf975eac2019-08-19 19:41:01 -07001// 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 "net/third_party/quiche/src/quic/qbone/qbone_packet_exchanger.h"
6
bnc463f2352019-10-10 04:49:34 -07007#include <utility>
wubf975eac2019-08-19 19:41:01 -07008
9namespace quic {
10
11bool QbonePacketExchanger::ReadAndDeliverPacket(
12 QboneClientInterface* qbone_client) {
13 bool blocked = false;
14 string error;
15 std::unique_ptr<QuicData> packet = ReadPacket(&blocked, &error);
16 if (packet == nullptr) {
17 if (!blocked) {
18 visitor_->OnReadError(error);
19 }
20 return false;
21 }
22 qbone_client->ProcessPacketFromNetwork(packet->AsStringPiece());
23 return true;
24}
25
26void QbonePacketExchanger::WritePacketToNetwork(const char* packet,
27 size_t size) {
28 bool blocked = false;
29 string error;
30 if (packet_queue_.empty() && !write_blocked_) {
31 if (WritePacket(packet, size, &blocked, &error)) {
32 return;
33 }
34 if (!blocked) {
35 visitor_->OnWriteError(error);
36 return;
37 }
38 write_blocked_ = true;
39 }
40
41 // Drop the packet on the floor if the queue if full.
42 if (packet_queue_.size() >= max_pending_packets_) {
43 return;
44 }
45
46 auto data_copy = new char[size];
47 memcpy(data_copy, packet, size);
48 packet_queue_.push_back(
vasilvv0fc587f2019-09-06 13:33:08 -070049 std::make_unique<QuicData>(data_copy, size, /* owns_buffer = */ true));
wubf975eac2019-08-19 19:41:01 -070050}
51
52void QbonePacketExchanger::SetWritable() {
53 write_blocked_ = false;
54 while (!packet_queue_.empty()) {
55 bool blocked = false;
56 string error;
57 if (WritePacket(packet_queue_.front()->data(),
58 packet_queue_.front()->length(), &blocked, &error)) {
59 packet_queue_.pop_front();
60 } else {
61 if (!blocked) {
62 visitor_->OnWriteError(error);
63 }
64 write_blocked_ = blocked;
65 return;
66 }
67 }
68}
69
70} // namespace quic