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

#ifndef SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_TEST_SIM_MVM_H_
#define SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_TEST_SIM_MVM_H_

#include <memory>
#include <vector>

#include "src/connectivity/wlan/drivers/testing/lib/sim-env/sim-env.h"
#include "src/connectivity/wlan/drivers/testing/lib/sim-env/sim-sta-ifc.h"

extern "C" {
#include "third_party/iwlwifi/iwl-trans.h"
}  // extern "C"

#include "third_party/iwlwifi/test/sim-nvm.h"
#include "third_party/iwlwifi/test/sim.h"

namespace wlan::testing {

class SimMvm : public ::wlan::simulation::StationIfc {
 public:
  explicit SimMvm(::wlan::simulation::Environment* env) : env_(env), resp_buf_(kNvmAccessCmdSize) {
    env->AddStation(this);
  }
  ~SimMvm() {
    if (env_ != nullptr) {
      env_->RemoveStation(this);
    }
  }

  // Execute the command.
  //
  // 'notify_wait' will be updated to:
  //   true: tell the caller to notify the notification wait.
  //   false: no need to notify.
  //
  zx_status_t SendCmd(struct iwl_host_cmd* cmd, bool* notify_wait);

  // StationIfc operations
  void Rx(std::shared_ptr<const simulation::SimFrame> frame,
          std::shared_ptr<const simulation::WlanRxInfo> info) override {}

 private:
  // The buffer size should be determined by the max response size.
  // This number is for the response of NVM_ACCESS_CMD read command.
  static constexpr size_t kNvmAccessCmdSize = 16 + 2048;

  ::wlan::simulation::Environment* env_;
  SimNvm nvm_;

  // Used by SendCmd() to store the response from the simulated firmware functions.
  //
  // Since this buffer is used only when CMD_WANT_SKB is set, which means it is protected
  // by STATUS_SYNC_HCMD_ACTIVE in trans->status when CMD_ASYNC is de-assserted in cmd->flags.
  std::vector<char> resp_buf_;
};

}  // namespace wlan::testing

#endif  // SRC_CONNECTIVITY_WLAN_DRIVERS_THIRD_PARTY_INTEL_IWLWIFI_TEST_SIM_MVM_H_
