| // Copyright 2021 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. |
| |
| #include "third_party/iwlwifi/test/tlv-fw-builder.h" |
| |
| #include <endian.h> |
| |
| #include <cstring> |
| |
| #include "third_party/iwlwifi/platform/compiler.h" |
| |
| extern "C" { |
| #include "third_party/iwlwifi/fw/file.h" |
| } // extern "C" |
| |
| namespace wlan::testing { |
| |
| TlvFwBuilder::TlvFwBuilder() { |
| // Build a minimal TLV firmware header. |
| static constexpr char kFwName[] = "fuchsia_debug_fw"; |
| static constexpr int kFwApiVersion = 17; |
| iwl_tlv_ucode_header header = {}; |
| header.zero = 0; |
| header.magic = htole32(IWL_TLV_UCODE_MAGIC); |
| std::memcpy(header.human_readable, kFwName, sizeof(kFwName)); |
| header.ver = (kFwApiVersion << 8); // See: IWL_UCODE_API. |
| header.build = 0; |
| binary_.resize(sizeof(header), '\0'); |
| std::memcpy(binary_.data(), &header, sizeof(header)); |
| } |
| |
| void TlvFwBuilder::AddValue(uint32_t type, const void* data, size_t size) { |
| iwl_ucode_tlv tlv = {}; |
| tlv.type = cpu_to_le32(type); |
| tlv.length = cpu_to_le32(size); |
| |
| const size_t data_size = (size + 3) & ~3; |
| const size_t old_size = binary_.size(); |
| binary_.resize(binary_.size() + sizeof(tlv) + data_size, '\0'); |
| char* fw_data = binary_.data() + old_size; |
| |
| std::memcpy(fw_data, &tlv, sizeof(tlv)); |
| fw_data += sizeof(tlv); |
| std::memcpy(fw_data, data, size); |
| } |
| |
| TlvFwBuilder::~TlvFwBuilder() = default; |
| |
| std::string TlvFwBuilder::GetBinary() const { return binary_; } |
| |
| } // namespace wlan::testing |