diff options
author | Myles Watson <mylesgw@google.com> | 2023-01-09 15:11:46 -0800 |
---|---|---|
committer | Cherrypicker Worker <android-build-cherrypicker-worker@google.com> | 2023-01-18 09:10:30 +0000 |
commit | 7d0a4c1aab3b76ec82f6860632771a2bd1a20f83 (patch) | |
tree | f1c9c07e021abdc5029af6fe7d470e4fec82b4f8 | |
parent | 7dd7f46b09a49b8585240796e04b594ea1f72cb9 (diff) | |
download | cuttlefish-7d0a4c1aab3b76ec82f6860632771a2bd1a20f83.tar.gz |
bt_vhci_forwarder: Drop partial packets
Bug: 259684388
Test: test_suites_arm64
Change-Id: I6787b3b8097613c1b0806b76bf40bafbd397f6db
(cherry picked from commit adf73dfcd620ef86b4dded3ea8b7483b4e81913b)
Merged-In: I6787b3b8097613c1b0806b76bf40bafbd397f6db
-rw-r--r-- | guest/commands/bt_vhci_forwarder/main.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/guest/commands/bt_vhci_forwarder/main.cpp b/guest/commands/bt_vhci_forwarder/main.cpp index 2f1aab2e7..d1bb58850 100644 --- a/guest/commands/bt_vhci_forwarder/main.cpp +++ b/guest/commands/bt_vhci_forwarder/main.cpp @@ -128,6 +128,9 @@ int main(int argc, char** argv) { send(vhci_fd, HCI_ISODATA_PKT, raw_iso.data(), raw_iso.size()); }, []() { LOG(INFO) << "HCI socket device disconnected"; }); + + bool before_first_command = true; + while (true) { int ret = TEMP_FAILURE_RETRY(poll(fds, 2, -1)); if (ret < 0) { @@ -141,6 +144,7 @@ int main(int argc, char** argv) { if (c < 0) { PLOG(ERROR) << "vhci to virtio-console failed"; } + before_first_command = false; } if (fds[1].revents & POLLHUP) { LOG(ERROR) << "PollHUP"; @@ -148,6 +152,16 @@ int main(int argc, char** argv) { continue; } if (fds[1].revents & (POLLIN | POLLERR)) { + if (before_first_command) { + // Drop any data left in the virtio-console from a previous reset. + ssize_t bytes = TEMP_FAILURE_RETRY(read(virtio_fd, buf, kBufferSize)); + if (bytes < 0) { + LOG(ERROR) << "virtio_fd ready, but read failed " << strerror(errno); + } else { + LOG(INFO) << "Discarding " << bytes << " bytes from virtio_fd."; + } + continue; + } // 'virtio-console to vhci' depends on H4Packetizer because vhci expects // full packet, but the data from virtio-console could be partial. h4.OnDataReady(virtio_fd); |