// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef SRC_DEVICES_BLOCK_DRIVERS_ZXCRYPT_EXTRA_H_
#define SRC_DEVICES_BLOCK_DRIVERS_ZXCRYPT_EXTRA_H_

#include <fuchsia/hardware/block/c/banjo.h>
#include <stddef.h>
#include <stdint.h>
#include <zircon/listnode.h>
#include <zircon/types.h>

namespace zxcrypt {

// |extra_op_t| is the extra information placed in the tail end of |block_op_t|s queued against a
// |zxcrypt::Device|.
//
// TODO(aarongreen): This struct should be promoted into a class, with:
//  * methods to access the relevant fields
//  * DLL node state for a fbl::DoublyLinkedList
//  * Methods to encapsulate the setting/clearing/reading into the data field.
static_assert(sizeof(uintptr_t) <= sizeof(uint64_t), "uintptr_t > uint64_t");
struct extra_op_t {
  // Used to link deferred block requests
  list_node_t node;

  // Memory region to use for cryptographic transformations.
  uint8_t* data;

  // The remaining are used to save fields of the original block request which may be altered
  zx_handle_t vmo;
  uint32_t length;
  uint64_t offset_dev;
  uint64_t offset_vmo;
  block_impl_queue_callback completion_cb;
  void* cookie;

  // Resets this structure to an initial state.
  zx_status_t Init(block_op_t* block, block_impl_queue_callback completion_cb, void* cookie,
                   size_t reserved_blocks);
};

// Translates |block_op_t|s to |extra_op_t|s and vice versa.
extra_op_t* BlockToExtra(block_op_t* block, size_t op_size);
block_op_t* ExtraToBlock(extra_op_t* extra, size_t op_size);

}  // namespace zxcrypt

#endif  // SRC_DEVICES_BLOCK_DRIVERS_ZXCRYPT_EXTRA_H_
