[Yunq] Add support for repeated nested fields
This commit is contained in:
parent
05f2403dc2
commit
9c860dd6a4
14 changed files with 207 additions and 61 deletions
|
|
@ -35,26 +35,21 @@ glcr::Status DenaliServer::HandleReadMany(const ReadManyRequest& req,
|
|||
ReadResponse& resp) {
|
||||
ASSIGN_OR_RETURN(AhciPort * device, driver_.GetDevice(req.device_id()));
|
||||
|
||||
if (req.lba().size() != req.sector_cnt().size()) {
|
||||
return glcr::InvalidArgument("LBA and Sector Cnt must be the same length.");
|
||||
}
|
||||
|
||||
uint64_t sector_cnt = 0;
|
||||
for (uint64_t cnt : req.sector_cnt()) {
|
||||
sector_cnt += cnt;
|
||||
for (auto& block : req.blocks()) {
|
||||
sector_cnt += block.size();
|
||||
}
|
||||
uint64_t region_paddr;
|
||||
mmth::OwnedMemoryRegion region = mmth::OwnedMemoryRegion::ContiguousPhysical(
|
||||
sector_cnt * 512, ®ion_paddr);
|
||||
|
||||
for (uint64_t i = 0; i < req.lba().size(); i++) {
|
||||
uint64_t lba = req.lba().at(i);
|
||||
uint64_t size = req.sector_cnt().at(i);
|
||||
ASSIGN_OR_RETURN(auto semaphore,
|
||||
device->IssueRead(lba, size, region_paddr));
|
||||
for (auto& block : req.blocks()) {
|
||||
ASSIGN_OR_RETURN(
|
||||
auto semaphore,
|
||||
device->IssueRead(block.lba(), block.size(), region_paddr));
|
||||
semaphore->Wait();
|
||||
|
||||
region_paddr += size * 512;
|
||||
region_paddr += block.size() * 512;
|
||||
}
|
||||
|
||||
resp.set_device_id(req.device_id());
|
||||
|
|
|
|||
|
|
@ -16,10 +16,7 @@ message ReadRequest {
|
|||
|
||||
message ReadManyRequest {
|
||||
u64 device_id;
|
||||
// FIXME: Add repeated message fields.
|
||||
// Must be the same length.
|
||||
repeated u64 lba;
|
||||
repeated u64 sector_cnt;
|
||||
repeated DiskBlock blocks;
|
||||
}
|
||||
|
||||
message ReadResponse {
|
||||
|
|
|
|||
|
|
@ -109,33 +109,28 @@ glcr::Status ReadManyRequest::ParseFromBytesInternal(const yunq::MessageView& me
|
|||
RETURN_ERROR(message.CheckHeader());
|
||||
// Parse device_id.
|
||||
ASSIGN_OR_RETURN(device_id_, message.ReadField<uint64_t>(0));
|
||||
// Parse lba.
|
||||
ASSIGN_OR_RETURN(lba_, message.ReadRepeated<uint64_t>(1));
|
||||
|
||||
// Parse sector_cnt.
|
||||
ASSIGN_OR_RETURN(sector_cnt_, message.ReadRepeated<uint64_t>(2));
|
||||
// Parse blocks.
|
||||
message.ReadRepeatedMessage<DiskBlock>(1, blocks_);
|
||||
|
||||
|
||||
return glcr::Status::Ok();
|
||||
}
|
||||
|
||||
uint64_t ReadManyRequest::SerializeToBytes(glcr::ByteBuffer& bytes, uint64_t offset) const {
|
||||
yunq::Serializer serializer(bytes, offset, 3);
|
||||
yunq::Serializer serializer(bytes, offset, 2);
|
||||
return SerializeInternal(serializer);
|
||||
}
|
||||
|
||||
uint64_t ReadManyRequest::SerializeToBytes(glcr::ByteBuffer& bytes, uint64_t offset, glcr::CapBuffer& caps) const {
|
||||
yunq::Serializer serializer(bytes, offset, 3, caps);
|
||||
yunq::Serializer serializer(bytes, offset, 2, caps);
|
||||
return SerializeInternal(serializer);
|
||||
}
|
||||
|
||||
uint64_t ReadManyRequest::SerializeInternal(yunq::Serializer& serializer) const {
|
||||
// Write device_id.
|
||||
serializer.WriteField<uint64_t>(0, device_id_);
|
||||
// Write lba.
|
||||
serializer.WriteRepeated<uint64_t>(1, lba_);
|
||||
// Write sector_cnt.
|
||||
serializer.WriteRepeated<uint64_t>(2, sector_cnt_);
|
||||
// Write blocks.
|
||||
serializer.WriteRepeatedMessage<DiskBlock>(1, blocks_);
|
||||
|
||||
serializer.WriteHeader();
|
||||
|
||||
|
|
|
|||
|
|
@ -16,15 +16,20 @@ class DiskBlock {
|
|||
DiskBlock() {}
|
||||
// Delete copy and move until implemented.
|
||||
DiskBlock(const DiskBlock&) = delete;
|
||||
DiskBlock(DiskBlock&&) = delete;
|
||||
DiskBlock(DiskBlock&&) = default;
|
||||
DiskBlock& operator=(DiskBlock&&) = default;
|
||||
|
||||
[[nodiscard]] glcr::Status ParseFromBytes(const yunq::MessageView& message);
|
||||
[[nodiscard]] glcr::Status ParseFromBytes(const yunq::MessageView& message, const glcr::CapBuffer&);
|
||||
uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset) const;
|
||||
uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset, glcr::CapBuffer&) const;
|
||||
|
||||
const uint64_t& lba() const { return lba_; }
|
||||
uint64_t& mutable_lba() { return lba_; }
|
||||
void set_lba(const uint64_t& value) { lba_ = value; }
|
||||
|
||||
const uint64_t& size() const { return size_; }
|
||||
uint64_t& mutable_size() { return size_; }
|
||||
void set_size(const uint64_t& value) { size_ = value; }
|
||||
|
||||
private:
|
||||
|
|
@ -41,14 +46,18 @@ class ReadRequest {
|
|||
ReadRequest() {}
|
||||
// Delete copy and move until implemented.
|
||||
ReadRequest(const ReadRequest&) = delete;
|
||||
ReadRequest(ReadRequest&&) = delete;
|
||||
ReadRequest(ReadRequest&&) = default;
|
||||
ReadRequest& operator=(ReadRequest&&) = default;
|
||||
|
||||
[[nodiscard]] glcr::Status ParseFromBytes(const yunq::MessageView& message);
|
||||
[[nodiscard]] glcr::Status ParseFromBytes(const yunq::MessageView& message, const glcr::CapBuffer&);
|
||||
uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset) const;
|
||||
uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset, glcr::CapBuffer&) const;
|
||||
|
||||
const uint64_t& device_id() const { return device_id_; }
|
||||
void set_device_id(const uint64_t& value) { device_id_ = value; }
|
||||
uint64_t& mutable_device_id() { return device_id_; }
|
||||
void set_device_id(const uint64_t& value) { device_id_ = value; }
|
||||
|
||||
const DiskBlock& block() const { return block_; }
|
||||
DiskBlock& mutable_block() { return block_; }
|
||||
|
||||
|
|
@ -66,23 +75,25 @@ class ReadManyRequest {
|
|||
ReadManyRequest() {}
|
||||
// Delete copy and move until implemented.
|
||||
ReadManyRequest(const ReadManyRequest&) = delete;
|
||||
ReadManyRequest(ReadManyRequest&&) = delete;
|
||||
ReadManyRequest(ReadManyRequest&&) = default;
|
||||
ReadManyRequest& operator=(ReadManyRequest&&) = default;
|
||||
|
||||
[[nodiscard]] glcr::Status ParseFromBytes(const yunq::MessageView& message);
|
||||
[[nodiscard]] glcr::Status ParseFromBytes(const yunq::MessageView& message, const glcr::CapBuffer&);
|
||||
uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset) const;
|
||||
uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset, glcr::CapBuffer&) const;
|
||||
|
||||
const uint64_t& device_id() const { return device_id_; }
|
||||
uint64_t& mutable_device_id() { return device_id_; }
|
||||
void set_device_id(const uint64_t& value) { device_id_ = value; }
|
||||
const glcr::Vector<uint64_t>& lba() const { return lba_; }
|
||||
void add_lba(const uint64_t& value) { lba_.PushBack(value); }
|
||||
const glcr::Vector<uint64_t>& sector_cnt() const { return sector_cnt_; }
|
||||
void add_sector_cnt(const uint64_t& value) { sector_cnt_.PushBack(value); }
|
||||
|
||||
const glcr::Vector<DiskBlock>& blocks() const { return blocks_; }
|
||||
glcr::Vector<DiskBlock>& mutable_blocks() { return blocks_; }
|
||||
void add_blocks(DiskBlock&& value) { blocks_.PushBack(glcr::Move(value)); }
|
||||
|
||||
private:
|
||||
uint64_t device_id_;
|
||||
glcr::Vector<uint64_t> lba_;
|
||||
glcr::Vector<uint64_t> sector_cnt_;
|
||||
glcr::Vector<DiskBlock> blocks_;
|
||||
|
||||
// Parses everything except for caps.
|
||||
glcr::Status ParseFromBytesInternal(const yunq::MessageView& message);
|
||||
|
|
@ -94,17 +105,24 @@ class ReadResponse {
|
|||
ReadResponse() {}
|
||||
// Delete copy and move until implemented.
|
||||
ReadResponse(const ReadResponse&) = delete;
|
||||
ReadResponse(ReadResponse&&) = delete;
|
||||
ReadResponse(ReadResponse&&) = default;
|
||||
ReadResponse& operator=(ReadResponse&&) = default;
|
||||
|
||||
[[nodiscard]] glcr::Status ParseFromBytes(const yunq::MessageView& message);
|
||||
[[nodiscard]] glcr::Status ParseFromBytes(const yunq::MessageView& message, const glcr::CapBuffer&);
|
||||
uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset) const;
|
||||
uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset, glcr::CapBuffer&) const;
|
||||
|
||||
const uint64_t& device_id() const { return device_id_; }
|
||||
uint64_t& mutable_device_id() { return device_id_; }
|
||||
void set_device_id(const uint64_t& value) { device_id_ = value; }
|
||||
|
||||
const uint64_t& size() const { return size_; }
|
||||
uint64_t& mutable_size() { return size_; }
|
||||
void set_size(const uint64_t& value) { size_ = value; }
|
||||
|
||||
const z_cap_t& memory() const { return memory_; }
|
||||
z_cap_t& mutable_memory() { return memory_; }
|
||||
void set_memory(const z_cap_t& value) { memory_ = value; }
|
||||
|
||||
private:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue