Adds Packet struct
BUG: 72654144
Change-Id: I7ba05b48de278d46b3a13e8046735603e18e894c
diff --git a/common/vsoc/lib/socket_forward_region_view.h b/common/vsoc/lib/socket_forward_region_view.h
index 1e4fe0d..27bea34 100644
--- a/common/vsoc/lib/socket_forward_region_view.h
+++ b/common/vsoc/lib/socket_forward_region_view.h
@@ -27,6 +27,88 @@
using Message = std::vector<std::uint8_t>;
+struct Header {
+ std::uint32_t payload_length;
+ std::uint32_t generation;
+ enum MessageType : std::uint32_t {
+ DATA = 0,
+ BEGIN,
+ END,
+ };
+ MessageType message_type;
+};
+
+constexpr std::size_t kMaxPayloadSize =
+ layout::socket_forward::kMaxPacketSize - sizeof(Header);
+
+struct Packet {
+ private:
+ Header header_;
+ char payload_data_[kMaxPayloadSize];
+
+ static Packet MakePacket(Header::MessageType type, std::uint32_t generation) {
+ Packet packet{};
+ packet.set_generation(generation);
+ packet.header_.message_type = type;
+ return packet;
+ }
+
+ public:
+ static Packet MakeBegin(std::uint32_t generation) {
+ return MakePacket(Header::BEGIN, generation);
+ }
+
+ static Packet MakeEnd(std::uint32_t generation) {
+ return MakePacket(Header::END, generation);
+ }
+
+ static Packet MakeData(std::uint32_t generation) {
+ return MakePacket(Header::DATA, generation);
+ }
+
+ void set_payload_length(std::uint32_t length) {
+ CHECK_LE(length, sizeof payload_data_);
+ header_.message_type = Header::DATA;
+ header_.payload_length = length;
+ }
+
+ std::uint32_t generation() const {
+ return header_.generation;
+ }
+
+ void set_generation(std::uint32_t generation) {
+ header_.generation = generation;
+ }
+
+ char* payload() {
+ return payload_data_;
+ }
+
+ std::uint32_t payload_length() const {
+ return header_.payload_length;
+ }
+
+ Header::MessageType message_type() const {
+ return header_.message_type;
+ }
+
+
+ char* raw_data() {
+ return reinterpret_cast<char*>(this);
+ }
+
+ const char* raw_data() const {
+ return reinterpret_cast<const char*>(this);
+ }
+
+ size_t raw_data_size() const {
+ return payload_length() + sizeof header_;
+ }
+};
+
+static_assert(sizeof(Packet) == layout::socket_forward::kMaxPacketSize, "");
+static_assert(std::is_pod<Packet>{}, "");
+
// Data sent will start with a uint32_t indicating the number of bytes being
// sent, followed be the data itself
class SocketForwardRegionView