// Copyright 2019 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.

// Util functions to dump info/data for debug.

#include "third_party/iwlwifi/test/inspect-host-cmd.h"

#include <stdint.h>
#include <stdio.h>
#include <zircon/syscalls.h>

#include <cstdio>
#include <iterator>
#include <sstream>
#include <string>

#define INSPECT_BUFSIZ 512

// Given a 'bitmap_value' and an array of bit definition, this function returns a joined string
//  which indicates asserted bits.
//
// The returned string will NOT contain the tailing newline character.
//
static std::string join_bitmap_string(const char** bit_defs, size_t bit_defs_len,
                                      uint64_t bitmap_value) {
  std::ostringstream out;
  bool first = true;

  for (size_t i = bit_defs_len; i > 0; i--) {
    if (bitmap_value & BIT(i - 1)) {
      out << (first ? "" : ",") << bit_defs[i - 1];
      first = false;
    }
  }

  return out.str();
}

// This function returns a multi-line string.
static std::string inspect_host_cmd_str(struct iwl_host_cmd* cmd) {
  const char* flags_defs[] = {
      // bit definition of 'enum CMD_MODE'
      "async",        "want_skb",        "send_in_rfkill", "high_prio",
      "send_in_idle", "make_trans_idle", "wake_up_trans",  "want_async_callback",
  };
  const char* dataflags_defs[] = {
      // bit definition of 'enum iwl_hcmd_dataflag'
      "nocopy",
      "dup",
  };

  constexpr size_t kMaxStrBufSize = 1024;
  char strbuf[kMaxStrBufSize];
  std::snprintf(strbuf, kMaxStrBufSize, "host_cmd id[0x%02x] flags[0x%x:%s]\n", cmd->id, cmd->flags,
                join_bitmap_string(flags_defs, std::size(flags_defs), cmd->flags).c_str());
  std::string out(strbuf);

  for (size_t i = 0; i < std::size(cmd->len); i++) {
    std::snprintf(
        strbuf, kMaxStrBufSize, "  [%zu] dataflags[0x%x:%s] len[%d]\n", i, cmd->dataflags[i],
        join_bitmap_string(dataflags_defs, std::size(dataflags_defs), cmd->dataflags[i]).c_str(),
        cmd->len[i]);
    out += std::string(strbuf);
  }

  return out;
}

void inspect_host_cmd(const char* func_name, int line_no, struct iwl_host_cmd* cmd) {
  printf("%s():%d %s", func_name, line_no, inspect_host_cmd_str(cmd).c_str());
}
