// Copyright 2022 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/sim-mcc-update.h"

#include <string.h>
#include <zircon/assert.h>

#include <iterator>

extern "C" {
#include "third_party/iwlwifi/mvm/mvm.h"
}
#include "third_party/iwlwifi/platform/compiler.h"

namespace wlan::testing {

zx_status_t HandleMccUpdate(struct iwl_host_cmd* cmd, SimMvmResponse* resp) {
  auto mcc_cmd = reinterpret_cast<const struct iwl_mcc_update_cmd*>(cmd->data[0]);

  __le32 channels[] = {
      // actually the channel flags.
      0x034b,  // Ch1: VALID IBSS ACTIVE GO_CONCURRENT 20MHZ 40MHZ
      0x0f4a,  // Ch2:        BSS ACTIVE GO_CONCURRENT 20MHZ 40MHZ 80MHZ 160MHZ
      0x0f43,  // Ch3: VALID  BSS        GO_CONCURRENT 20MHZ 40MHZ 80MHZ 160MHZ
      0x0f4b,  // Ch4: VALID IBSS ACTIVE GO_CONCURRENT 20MHZ 40MHZ 80MHZ 160MHZ
  };
  static constexpr size_t n_chan = std::size(channels);
  size_t resp_size =
      sizeof(struct iwl_mcc_update_resp_v3) + n_chan * sizeof(__le32);  // mcc_resp->channels[0]
  resp->resize(resp_size);
  auto mcc_resp = reinterpret_cast<struct iwl_mcc_update_resp_v3*>(resp->data());
  memset(mcc_resp, 0, resp_size);
  mcc_resp->status = le32_to_cpu(MCC_RESP_NEW_CHAN_PROFILE);
  mcc_resp->mcc = mcc_cmd->mcc;
  mcc_resp->source_id = mcc_cmd->source_id;

  // The channel list that this country supports. Currently we always return the same one.
  // Note that this doesn't match the list in iwl_ext_nvm_channels / iwl_nvm_channels.
  // We just return it for easy unit testing.
  mcc_resp->n_channels = n_chan;  // See enum iwl_nvm_channel_flags below:
  memcpy(mcc_resp->channels, channels, sizeof(channels));
  return ZX_OK;
}

}  // namespace wlan::testing
