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,