OSDN Git Service

rusty-gd: Serialize size fields.
authorQasim Javed <qasimj@google.com>
Wed, 27 Jan 2021 20:45:22 +0000 (12:45 -0800)
committerQasim Javed <qasimj@google.com>
Wed, 27 Jan 2021 20:45:54 +0000 (12:45 -0800)
Bug: 171749953
Tag: #gd-refactor
Test: gd/cert/run --rhost

Change-Id: Ia2f2acddd43960deca96b037295e17203038b1fd

gd/packet/parser/fields/size_field.cc
gd/packet/parser/fields/size_field.h
gd/packet/parser/packet_def.cc

index ce2c899..45d0978 100644 (file)
@@ -65,3 +65,38 @@ std::string SizeField::GetSizedFieldName() const {
 void SizeField::GenStringRepresentation(std::ostream& s, std::string accessor) const {
   s << accessor;
 }
+
+void SizeField::GenRustWriter(std::ostream& s, Size start_offset, Size end_offset) const {
+  Size size = GetSize();
+  int num_leading_bits = GetRustBitOffset(s, start_offset, end_offset, GetSize());
+
+  s << "let mut " << GetName() << ": " << GetRustDataType() << " = self.get_total_size() as ";
+  s << GetRustDataType() << ";";
+  s << GetName() << " -= self.get_size() as " << GetRustDataType() << ";";
+  if (util::RoundSizeUp(size.bits()) != size.bits()) {
+    uint64_t mask = 0;
+    for (int i = 0; i < size.bits(); i++) {
+      mask <<= 1;
+      mask |= 1;
+    }
+    s << "let " << GetName() << " = ";
+    s << GetName() << " & 0x" << std::hex << mask << std::dec << ";";
+  }
+
+  int access_offset = 0;
+  if (num_leading_bits != 0) {
+    access_offset = -1;
+    uint64_t mask = 0;
+    for (int i = 0; i < num_leading_bits; i++) {
+      mask <<= 1;
+      mask |= 1;
+    }
+    s << "let " << GetName() << " = (" << GetName() << " << " << num_leading_bits << ") | ("
+      << "(buffer[" << start_offset.bytes() << "] as " << GetRustParseDataType() << ") & 0x" << std::hex << mask
+      << std::dec << ");";
+  }
+
+  s << "buffer[" << start_offset.bytes() + access_offset << ".."
+    << start_offset.bytes() + GetSize().bytes() + access_offset << "].copy_from_slice(&" << GetName()
+    << ".to_le_bytes());";
+}
index 2d40c42..64e827a 100644 (file)
@@ -48,6 +48,8 @@ class SizeField : public ScalarField {
 
   virtual void GenStringRepresentation(std::ostream& s, std::string accessor) const override;
 
+  virtual void GenRustWriter(std::ostream& s, Size start_offset, Size end_offset) const override;
+
  private:
   int size_;
   std::string sized_field_name_;
index 0073db3..08cff47 100644 (file)
@@ -871,7 +871,6 @@ void PacketDef::GenRustStructSizeField(std::ostream& s) const {
   auto fields = fields_.GetFieldsWithoutTypes({
       BodyField::kFieldType,
       CountField::kFieldType,
-      SizeField::kFieldType,
   });
   for (int i = 0; i < fields.size(); i++) {
     size += fields[i]->GetSize().bytes();
@@ -998,7 +997,7 @@ void PacketDef::GenRustStructImpls(std::ostream& s) const {
   // write_to function
   s << "fn write_to(&self, buffer: &mut BytesMut) {";
   if (fields.size() > 0) {
-    s << " buffer.resize(buffer.len() + self.get_size(), 0);";
+    s << " buffer.resize(buffer.len() + self.get_total_size(), 0);";
   }
 
   fields = fields_.GetFieldsWithoutTypes({
@@ -1006,7 +1005,6 @@ void PacketDef::GenRustStructImpls(std::ostream& s) const {
       CountField::kFieldType,
       PaddingField::kFieldType,
       ReservedField::kFieldType,
-      SizeField::kFieldType,
       FixedScalarField::kFieldType,
   });