pw_rpc: Send CLIENT_ERROR on unexpected packet
This updates the RPC client to send back a CLIENT_ERROR to the server if
it receives a packet it was not expecting. The server is updated to
handle client errors by ending the active RPC, if applicable.
Change-Id: Ia9a2f36571fd3f91e28a50393c531df66ba11f09
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/19180
Commit-Queue: Alexei Frolov <frolv@google.com>
Reviewed-by: Wyatt Hepler <hepler@google.com>
diff --git a/pw_rpc/base_server_writer.cc b/pw_rpc/base_server_writer.cc
index 1e3c396..942cf32 100644
--- a/pw_rpc/base_server_writer.cc
+++ b/pw_rpc/base_server_writer.cc
@@ -50,8 +50,7 @@
return;
}
- call_.server().RemoveWriter(*this);
- state_ = kClosed;
+ Close();
// Send a control packet indicating that the stream (and RPC) has terminated.
call_.channel().Send(Packet(PacketType::SERVER_STREAM_END,
@@ -79,6 +78,15 @@
return call_.channel().Send(response_, ResponsePacket(payload));
}
+void BaseServerWriter::Close() {
+ if (!open()) {
+ return;
+ }
+
+ call_.server().RemoveWriter(*this);
+ state_ = kClosed;
+}
+
Packet BaseServerWriter::ResponsePacket(
std::span<const std::byte> payload) const {
return Packet(PacketType::RESPONSE,