/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef WIFICOND_SERVER_H_
#define WIFICOND_SERVER_H_

#include <memory>
#include <string>
#include <vector>

#include <android-base/macros.h>
#include <wifi_system/interface_tool.h>

#include "android/net/wifi/nl80211/BnWificond.h"
#include "android/net/wifi/nl80211/IApInterface.h"
#include "android/net/wifi/nl80211/IClientInterface.h"
#include "android/net/wifi/nl80211/IInterfaceEventCallback.h"
#include "android/net/wifi/nl80211/IWificondEventCallback.h"

#include "wificond/ap_interface_impl.h"
#include "wificond/client_interface_impl.h"

namespace android {
namespace wificond {

class NL80211Packet;
class NetlinkUtils;
class ScanUtils;

struct InterfaceInfo;

class Server : public android::net::wifi::nl80211::BnWificond {
 public:
  Server(std::unique_ptr<wifi_system::InterfaceTool> if_tool,
         NetlinkUtils* netlink_utils,
         ScanUtils* scan_utils);
  ~Server() override = default;

  android::binder::Status registerWificondEventCallback(
      const android::sp<android::net::wifi::nl80211::IWificondEventCallback>&
          callback) override;
  android::binder::Status unregisterWificondEventCallback(
      const android::sp<android::net::wifi::nl80211::IWificondEventCallback>&
          callback) override;

  android::binder::Status RegisterCallback(
      const android::sp<android::net::wifi::nl80211::IInterfaceEventCallback>&
          callback) override;
  android::binder::Status UnregisterCallback(
      const android::sp<android::net::wifi::nl80211::IInterfaceEventCallback>&
          callback) override;
  // Returns a vector of available frequencies for 2.4GHz channels.
  android::binder::Status getAvailable2gChannels(
      ::std::optional<::std::vector<int32_t>>* out_frequencies) override;
  // Returns a vector of available frequencies for 5GHz non-DFS channels.
  android::binder::Status getAvailable5gNonDFSChannels(
      ::std::optional<::std::vector<int32_t>>* out_frequencies) override;
  // Returns a vector of available frequencies for DFS channels.
  android::binder::Status getAvailableDFSChannels(
      ::std::optional<::std::vector<int32_t>>* out_frequencies) override;
  // Returns a vector of available frequencies for 6GHz channels.
  android::binder::Status getAvailable6gChannels(
      ::std::optional<::std::vector<int32_t>>* out_frequencies) override;
  // Returns a vector of available frequencies for 60GHz channels.
  android::binder::Status getAvailable60gChannels(
      ::std::optional<::std::vector<int32_t>>* out_frequencies) override;

  android::binder::Status createApInterface(
      const std::string& iface_name,
      android::sp<android::net::wifi::nl80211::IApInterface>*
          created_interface) override;

  android::binder::Status createClientInterface(
      const std::string& iface_name,
      android::sp<android::net::wifi::nl80211::IClientInterface>*
          created_interface) override;

  android::binder::Status tearDownApInterface(
      const std::string& iface_name,
      bool* out_success) override;

  android::binder::Status tearDownClientInterface(
      const std::string& iface_name,
      bool* out_success) override;

  android::binder::Status tearDownInterfaces() override;

  android::binder::Status GetClientInterfaces(
      std::vector<android::sp<android::IBinder>>* out_client_ifs) override;
  android::binder::Status GetApInterfaces(
      std::vector<android::sp<android::IBinder>>* out_ap_ifs) override;
  status_t dump(int fd, const Vector<String16>& args) override;

  // Returns device wiphy capabilities for an interface
  android::binder::Status getDeviceWiphyCapabilities(
      const std::string& iface_name,
      ::std::optional<net::wifi::nl80211::DeviceWiphyCapabilities>* capabilities) override;

  android::binder::Status notifyCountryCodeChanged() override;

 private:
  // Request interface information from kernel and setup local interface object.
  // This assumes that interface should be in STATION mode. Even if we setup
  // interface on behalf of createApInterace(), it is Hostapd that configure
  // the interface to Ap mode later.
  // Returns true on success, false otherwise.
  bool SetupInterface(const std::string& iface_name, InterfaceInfo* interface,
      uint32_t *wiphy_index);
  void LogSupportedBands(uint32_t wiphy_index);
  void OnRegDomainChanged(uint32_t wiphy_index, std::string& country_code);
  void handleCountryCodeChanged();
  void BroadcastClientInterfaceReady(
      android::sp<android::net::wifi::nl80211::IClientInterface> network_interface);
  void BroadcastApInterfaceReady(
      android::sp<android::net::wifi::nl80211::IApInterface> network_interface);
  void BroadcastClientInterfaceTornDown(
      android::sp<android::net::wifi::nl80211::IClientInterface> network_interface);
  void BroadcastApInterfaceTornDown(
      android::sp<android::net::wifi::nl80211::IApInterface> network_interface);
  void BroadcastRegDomainChanged(std::string country_code);
  void MarkDownAllInterfaces();
  int FindWiphyIndex(const std::string& iface_name);
  bool GetBandInfo(int wiphy_index, BandInfo* band_info);
  int GetWiphyIndexFromBand(int band);
  void UpdateBandWiphyIndexMap(int wiphy_index);
  void EraseBandWiphyIndexMap(int wiphy_index);
  bool hasNoIfaceForWiphyIndex(int wiphy_index);

  const std::unique_ptr<wifi_system::InterfaceTool> if_tool_;
  NetlinkUtils* const netlink_utils_;
  ScanUtils* const scan_utils_;

  // Chips serves mutually exclusive bands.
  std::map<uint32_t, uint32_t> band_to_wiphy_index_map_;
  std::map<std::string, uint32_t> iface_to_wiphy_index_map_;
  std::map<std::string, std::unique_ptr<ApInterfaceImpl>> ap_interfaces_;
  std::map<std::string, std::unique_ptr<ClientInterfaceImpl>> client_interfaces_;
  std::vector<android::sp<android::net::wifi::nl80211::IInterfaceEventCallback>>
      interface_event_callbacks_;
  std::vector<android::sp<android::net::wifi::nl80211::IWificondEventCallback>>
      wificond_event_callbacks_;

  // Cached interface list from kernel for dumping.
  std::vector<InterfaceInfo> debug_interfaces_;

  DISALLOW_COPY_AND_ASSIGN(Server);
};

}  // namespace wificond
}  // namespace android

#endif  // WIFICOND_SERVER_H_
