Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 704a6ce3 authored by Qasim Javed's avatar Qasim Javed Committed by Gerrit Code Review
Browse files

Merge changes I71b8d3f5,Ie360848b,I6705aa19,I58d1972a,I2e4658ca, ...

* changes:
  rusty-gd: hci facade completes command to ACK receive
  rusty-gd: don't put payloads, the size has already been allocated
  rusty-gd: take vector sizes into account
  rusty-gd: move write_to logic to parent_def
  rusty-gd: move size field to packet gen
  rusty-gd: Write correct size and compute it once
parents d1a661a7 a8b2d0fc
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -1103,7 +1103,6 @@ packet SetupSynchronousConnectionStatus : CommandStatus (command_op_code = SETUP

packet AcceptSynchronousConnection : ScoConnectionCommand (op_code = ACCEPT_SYNCHRONOUS_CONNECTION) {
  bd_addr : Address,
  _reserved_ : 4,
  transmit_bandwidth : 32,
  receive_bandwidth : 32,
  max_latency : 16, // 0-3 reserved, 0xFFFF = don't care
+5 −2
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

#include "fields/scalar_field.h"

#include "fields/size_field.h"
#include "util.h"

const std::string ScalarField::kFieldType = "ScalarField";
@@ -194,8 +195,10 @@ void ScalarField::GenRustWriter(std::ostream& s, Size start_offset, Size end_off
  Size size = GetSize();
  int num_leading_bits = GetRustBitOffset(s, start_offset, end_offset, GetSize());

  if (GetFieldType() == SizeField::kFieldType) {
    // Do nothing, the field access has already happened in packet_def
  } else if (GetRustParseDataType() != GetRustDataType()) {
    // needs casting to primitive
  if (GetRustParseDataType() != GetRustDataType()) {
    s << "let " << GetName() << " = self." << GetName() << ".to_" << GetRustParseDataType() << "().unwrap();";
  } else {
    s << "let " << GetName() << " = self." << GetName() << ";";
+0 −35
Original line number Diff line number Diff line
@@ -65,38 +65,3 @@ 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());";
}
+0 −2
Original line number Diff line number Diff line
@@ -48,8 +48,6 @@ 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_;
+6 −38
Original line number Diff line number Diff line
@@ -866,18 +866,6 @@ void PacketDef::GenRustStructFieldNames(std::ostream& s) const {
  }
}

void PacketDef::GenRustStructSizeField(std::ostream& s) const {
  int size = 0;
  auto fields = fields_.GetFieldsWithoutTypes({
      BodyField::kFieldType,
      CountField::kFieldType,
  });
  for (int i = 0; i < fields.size(); i++) {
    size += fields[i]->GetSize().bytes();
  }
  s << size;
}

void PacketDef::GenRustStructImpls(std::ostream& s) const {
  s << "impl " << name_ << "Data {";

@@ -996,29 +984,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_total_size(), 0);";
  }

  fields = fields_.GetFieldsWithoutTypes({
      BodyField::kFieldType,
      CountField::kFieldType,
      PaddingField::kFieldType,
      ReservedField::kFieldType,
      FixedScalarField::kFieldType,
  });

  for (auto const& field : fields) {
    auto start_field_offset = GetOffsetForField(field->GetName(), false);
    auto end_field_offset = GetOffsetForField(field->GetName(), true);

    if (start_field_offset.empty() && end_field_offset.empty()) {
      ERROR(field) << "Field location for " << field->GetName() << " is ambiguous, "
                   << "no method exists to determine field location from begin() or end().\n";
    }

    field->GenRustWriter(s, start_field_offset, end_field_offset);
  }
  GenRustWriteToFields(s);

  if (HasChildEnums()) {
    s << "match &self.child {";
@@ -1029,7 +995,8 @@ void PacketDef::GenRustStructImpls(std::ostream& s) const {
      s << name_ << "DataChild::" << child->name_ << "(value) => value.write_to(buffer),";
    }
    if (fields_.HasPayload()) {
      s << name_ << "DataChild::Payload(p) => buffer.put(&p[..]),";
      auto offset = GetOffsetForField("payload");
      s << name_ << "DataChild::Payload(p) => buffer[" << offset.bytes() << "..].copy_from_slice(&p[..]),";
    }
    s << name_ << "DataChild::None => {}";
    s << "}";
@@ -1045,8 +1012,8 @@ void PacketDef::GenRustStructImpls(std::ostream& s) const {
  }
  s << "}\n";

  s << "pub fn get_size(&self) -> usize {";
  GenRustStructSizeField(s);
  s << "fn get_size(&self) -> usize {";
  GenSizeRetVal(s);
  s << "}\n";
  s << "}\n";
}
@@ -1069,6 +1036,7 @@ void PacketDef::GenRustAccessStructImpls(std::ostream& s) const {

  s << "fn to_bytes(self) -> Bytes {";
  s << " let mut buffer = BytesMut::new();";
  s << " buffer.resize(self." << root_accessor << ".get_total_size(), 0);";
  s << " self." << root_accessor << ".write_to(&mut buffer);";
  s << " buffer.freeze()";
  s << "}\n";
Loading