blob: f23148d0a388009c9d0bac79a9cc9536da2ee81c [file] [log] [blame]
/*
* Copyright (C) 2018 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.
*/
#pragma once
#include <sys/types.h>
#include <array>
#include <cstdint>
#include <map>
#include <memory>
#include <optional>
#include <set>
#include <string>
#include <string_view>
#include <vector>
#include <fmt/ostream.h>
#include "common/libs/utils/environment.h"
#include "common/libs/utils/result.h"
#include "host/libs/config/config_constants.h"
#include "host/libs/config/config_fragment.h"
#include "host/libs/config/config_utils.h"
namespace Json {
class Value;
}
namespace cuttlefish {
enum class SecureHal {
Unknown,
GuestGatekeeperInsecure,
GuestKeymintInsecure,
HostKeymintInsecure,
HostKeymintSecure,
HostGatekeeperInsecure,
HostGatekeeperSecure,
HostOemlockInsecure,
HostOemlockSecure,
};
enum class VmmMode {
kUnknown,
kCrosvm,
kGem5,
kQemu,
};
std::ostream& operator<<(std::ostream&, VmmMode);
std::string ToString(VmmMode mode);
Result<VmmMode> ParseVmm(std::string_view);
enum class ExternalNetworkMode {
kUnknown,
kTap,
kSlirp,
};
std::ostream& operator<<(std::ostream&, ExternalNetworkMode);
Result<ExternalNetworkMode> ParseExternalNetworkMode(std::string_view);
// Holds the configuration of the cuttlefish instances.
class CuttlefishConfig {
public:
static const CuttlefishConfig* Get();
static std::unique_ptr<const CuttlefishConfig> GetFromFile(
const std::string& path);
static bool ConfigExists();
CuttlefishConfig();
CuttlefishConfig(CuttlefishConfig&&);
~CuttlefishConfig();
CuttlefishConfig& operator=(CuttlefishConfig&&);
// Saves the configuration object in a file, it can then be read in other
// processes by passing the --config_file option.
bool SaveToFile(const std::string& file) const;
bool LoadFromFile(const char* file);
bool SaveFragment(const ConfigFragment&);
bool LoadFragment(ConfigFragment&) const;
std::string root_dir() const;
void set_root_dir(const std::string& root_dir);
std::string instances_dir() const;
std::string InstancesPath(const std::string&) const;
std::string assembly_dir() const;
std::string AssemblyPath(const std::string&) const;
std::string instances_uds_dir() const;
std::string InstancesUdsPath(const std::string&) const;
std::string environments_dir() const;
std::string EnvironmentsPath(const std::string&) const;
std::string environments_uds_dir() const;
std::string EnvironmentsUdsPath(const std::string&) const;
VmmMode vm_manager() const;
void set_vm_manager(VmmMode vmm);
std::string ap_vm_manager() const;
void set_ap_vm_manager(const std::string& name);
struct DisplayConfig {
int width;
int height;
int dpi;
int refresh_rate_hz;
};
struct TouchpadConfig {
int width;
int height;
static Json::Value Serialize(
const CuttlefishConfig::TouchpadConfig& config);
static TouchpadConfig Deserialize(const Json::Value& config_json);
};
void set_secure_hals(const std::set<std::string>& hals);
std::set<SecureHal> secure_hals() const;
void set_crosvm_binary(const std::string& crosvm_binary);
std::string crosvm_binary() const;
void set_gem5_debug_flags(const std::string& gem5_debug_flags);
std::string gem5_debug_flags() const;
void set_enable_host_uwb(bool enable_host_uwb);
bool enable_host_uwb() const;
void set_enable_host_uwb_connector(bool enable_host_uwb);
bool enable_host_uwb_connector() const;
void set_enable_host_bluetooth(bool enable_host_bluetooth);
bool enable_host_bluetooth() const;
void set_enable_automotive_proxy(bool enable_automotive_proxy);
bool enable_automotive_proxy() const;
// Bluetooth is enabled by bt_connector and rootcanal
void set_enable_host_bluetooth_connector(bool enable_host_bluetooth);
bool enable_host_bluetooth_connector() const;
void set_enable_host_nfc(bool enable_host_nfc);
bool enable_host_nfc() const;
void set_enable_host_nfc_connector(bool enable_host_nfc_connector);
bool enable_host_nfc_connector() const;
void set_casimir_args(const std::string& casimir_args);
std::vector<std::string> casimir_args() const;
void set_casimir_instance_num(int casimir_instance_num);
int casimir_instance_num() const;
void set_casimir_nci_port(int port);
int casimir_nci_port() const;
void set_casimir_rf_port(int port);
int casimir_rf_port() const;
// Flags for the set of radios that are connected to netsim
enum NetsimRadio {
Bluetooth = 0b00000001,
Wifi = 0b00000010,
Uwb = 0b00000100,
};
void netsim_radio_enable(NetsimRadio flag);
bool netsim_radio_enabled(NetsimRadio flag) const;
void set_netsim_instance_num(int netsim_instance_num);
int netsim_instance_num() const;
// Netsim has a built-in connector to forward packets to another daemon based
// on instance number. This is set in the serial launch case when FLAGS
// rootcanal_instance_num is specified. The non-netsim case uses
// bluetooth_connector and rootcanal_hci_port for the same purpose. Purposely
// restricted to legacy bluetooth serial invocation because new cases should
// use cvd.
int netsim_connector_instance_num() const;
void set_netsim_connector_instance_num(int netsim_instance_num);
void set_netsim_args(const std::string& netsim_args);
std::vector<std::string> netsim_args() const;
enum class Answer {
kUnknown = 0,
kYes,
kNo,
};
void set_enable_metrics(std::string enable_metrics);
CuttlefishConfig::Answer enable_metrics() const;
void set_metrics_binary(const std::string& metrics_binary);
std::string metrics_binary() const;
void set_extra_kernel_cmdline(const std::string& extra_cmdline);
std::vector<std::string> extra_kernel_cmdline() const;
// A directory containing the SSL certificates for the signaling server
void set_webrtc_certs_dir(const std::string& certs_dir);
std::string webrtc_certs_dir() const;
// The port for the webrtc signaling server. It's used by the signaling server
// to bind to it and by the webrtc process to connect to and register itself
void set_sig_server_port(int port);
int sig_server_port() const;
// The address of the signaling server
void set_sig_server_address(const std::string& addr);
std::string sig_server_address() const;
// The path section of the url where the webrtc process registers itself with
// the signaling server
void set_sig_server_path(const std::string& path);
std::string sig_server_path() const;
// Whether the webrtc process should use a secure connection (WSS) to the
// signaling server.
void set_sig_server_secure(bool secure);
bool sig_server_secure() const;
// Whether the webrtc process should attempt to verify the authenticity of the
// signaling server (reject self signed certificates)
void set_sig_server_strict(bool strict);
bool sig_server_strict() const;
void set_host_tools_version(const std::map<std::string, uint32_t>&);
std::map<std::string, uint32_t> host_tools_version() const;
void set_virtio_mac80211_hwsim(bool virtio_mac80211_hwsim);
bool virtio_mac80211_hwsim() const;
void set_ap_rootfs_image(const std::string& path);
std::string ap_rootfs_image() const;
void set_ap_kernel_image(const std::string& path);
std::string ap_kernel_image() const;
void set_pica_uci_port(int pica_uci_port);
int pica_uci_port() const;
void set_rootcanal_args(const std::string& rootcanal_args);
std::vector<std::string> rootcanal_args() const;
void set_rootcanal_hci_port(int rootcanal_hci_port);
int rootcanal_hci_port() const;
void set_rootcanal_link_port(int rootcanal_link_port);
int rootcanal_link_port() const;
void set_rootcanal_link_ble_port(int rootcanal_link_ble_port);
int rootcanal_link_ble_port() const;
void set_rootcanal_test_port(int rootcanal_test_port);
int rootcanal_test_port() const;
// The path of an AP image in composite disk
std::string ap_image_dev_path() const;
void set_ap_image_dev_path(const std::string& dev_path);
// path to the saved snapshot file(s)
std::string snapshot_path() const;
void set_snapshot_path(const std::string& snapshot_path);
std::set<std::string> straced_host_executables() const;
void set_straced_host_executables(const std::set<std::string>& executables);
bool host_sandbox() const;
void set_host_sandbox(bool host_sandbox);
bool IsCrosvm() const;
class InstanceSpecific;
class MutableInstanceSpecific;
MutableInstanceSpecific ForInstance(int instance_num);
InstanceSpecific ForInstance(int instance_num) const;
InstanceSpecific ForInstanceName(const std::string& name) const;
InstanceSpecific ForDefaultInstance() const;
std::vector<InstanceSpecific> Instances() const;
std::vector<std::string> instance_dirs() const;
void set_instance_names(const std::vector<std::string>& instance_names);
std::vector<std::string> instance_names() const;
// A view into an existing CuttlefishConfig object for a particular instance.
class InstanceSpecific {
const CuttlefishConfig* config_;
std::string id_;
friend InstanceSpecific CuttlefishConfig::ForInstance(int num) const;
friend std::vector<InstanceSpecific> CuttlefishConfig::Instances() const;
InstanceSpecific(const CuttlefishConfig* config, const std::string& id)
: config_(config), id_(id) {}
Json::Value* Dictionary();
const Json::Value* Dictionary() const;
public:
std::string serial_number() const;
// If any of the following port numbers is 0, the relevant service is not
// running on the guest.
// Port number for qemu to run a vnc server on the host
int qemu_vnc_server_port() const;
// Port number to connect to the tombstone receiver on the host
int tombstone_receiver_port() const;
// Port number to connect to the config server on the host
int config_server_port() const;
// Port number to connect to the audiocontrol server on the guest
int audiocontrol_server_port() const;
// Port number to connect to the adb server on the host
int adb_host_port() const;
// Port number to connect to the fastboot server on the host
int fastboot_host_port() const;
// Device-specific ID to distinguish modem simulators. Must be 4 digits.
int modem_simulator_host_id() const;
// Port number to connect to the gnss grpc proxy server on the host
int gnss_grpc_proxy_server_port() const;
std::string adb_ip_and_port() const;
// Port number to connect to the camera hal on the guest
int camera_server_port() const;
// Port number to connect to the lights hal on the guest
int lights_server_port() const;
std::string adb_device_name() const;
std::string gnss_file_path() const;
std::string fixed_location_file_path() const;
std::string mobile_bridge_name() const;
std::string mobile_tap_name() const;
std::string mobile_mac() const;
std::string wifi_bridge_name() const;
std::string wifi_tap_name() const;
std::string wifi_mac() const;
bool use_bridged_wifi_tap() const;
std::string ethernet_tap_name() const;
std::string ethernet_bridge_name() const;
std::string ethernet_mac() const;
std::string ethernet_ipv6() const;
uint32_t session_id() const;
bool use_allocd() const;
int vsock_guest_cid() const;
std::string vsock_guest_group() const;
std::string uuid() const;
std::string instance_name() const;
std::string environment_name() const;
std::vector<std::string> virtual_disk_paths() const;
// Returns the path to a file with the given name in the instance
// directory..
std::string PerInstancePath(const std::string& file_name) const;
std::string PerInstanceInternalPath(const std::string& file_name) const;
std::string PerInstanceLogPath(const std::string& file_name) const;
std::string CrosvmSocketPath() const;
std::string OpenwrtCrosvmSocketPath() const;
std::string instance_dir() const;
std::string instance_internal_dir() const;
// Return the Unix domain socket path with given name. Because the
// length limitation of Unix domain socket name, it needs to be in
// the another directory than normal Instance path.
std::string PerInstanceUdsPath(const std::string& file_name) const;
std::string PerInstanceInternalUdsPath(const std::string& file_name) const;
std::string PerInstanceGrpcSocketPath(const std::string& socket_name) const;
std::string instance_uds_dir() const;
std::string instance_internal_uds_dir() const;
std::string touch_socket_path(int touch_dev_idx) const;
std::string rotary_socket_path() const;
std::string keyboard_socket_path() const;
std::string switches_socket_path() const;
std::string access_kregistry_path() const;
std::string hwcomposer_pmem_path() const;
std::string pstore_path() const;
std::string pflash_path() const;
std::string console_path() const;
std::string logcat_path() const;
std::string kernel_log_pipe_name() const;
std::string console_pipe_prefix() const;
std::string console_in_pipe_name() const;
std::string console_out_pipe_name() const;
std::string gnss_pipe_prefix() const;
std::string gnss_in_pipe_name() const;
std::string gnss_out_pipe_name() const;
std::string logcat_pipe_name() const;
std::string restore_adbd_pipe_name() const;
std::string launcher_log_path() const;
std::string launcher_monitor_socket_path() const;
std::string sdcard_path() const;
std::string sdcard_overlay_path() const;
std::string persistent_composite_disk_path() const;
std::string persistent_composite_overlay_path() const;
std::string persistent_ap_composite_disk_path() const;
std::string persistent_ap_composite_overlay_path() const;
std::string os_composite_disk_path() const;
std::string ap_composite_disk_path() const;
std::string uboot_env_image_path() const;
std::string ap_uboot_env_image_path() const;
std::string ap_esp_image_path() const;
std::string esp_image_path() const;
std::string chromeos_state_image() const;
std::string otheros_esp_grub_config() const;
std::string ap_esp_grub_config() const;
std::string audio_server_path() const;
enum class BootFlow {
Android,
AndroidEfiLoader,
ChromeOs,
ChromeOsDisk,
Linux,
Fuchsia
};
BootFlow boot_flow() const;
// modem simulator related
std::string modem_simulator_ports() const;
// The device id the webrtc process should use to register with the
// signaling server
std::string webrtc_device_id() const;
// The group id the webrtc process should use to register with the
// signaling server
std::string group_id() const;
// Whether this instance should start the webrtc signaling server
bool start_webrtc_sig_server() const;
// Whether to start a reverse proxy to the webrtc signaling server already
// running in the host
bool start_webrtc_sig_server_proxy() const;
// Whether this instance should start a rootcanal instance
bool start_rootcanal() const;
// Whether this instance should start a casimir instance
bool start_casimir() const;
// Whether this instance should start a pica instance
bool start_pica() const;
// Whether this instance should start a netsim instance
bool start_netsim() const;
// TODO(b/288987294) Remove this when separating environment is done
// Whether this instance should start a wmediumd instance
bool start_wmediumd_instance() const;
const Json::Value& mcu() const;
enum class APBootFlow {
// Not starting AP at all (for example not the 1st instance)
None,
// Generating ESP and using U-BOOT to boot AP
Grub,
// Using legacy way to boot AP in case we cannot generate ESP image.
// Currently we have only one case when we cannot do it. When users
// have ubuntu bionic which doesn't have monolith binaris in the
// grub-efi-arm64-bin (for arm64) and grub-efi-ia32-bin (x86) deb packages.
// TODO(b/260337906): check is it possible to add grub binaries into the AOSP
// to deliver the proper grub environment
// TODO(b/260338443): use grub-mkimage from grub-common in case we cannot overcome
// legal issues
LegacyDirect
};
APBootFlow ap_boot_flow() const;
bool crosvm_use_balloon() const;
bool crosvm_use_rng() const;
bool use_pmem() const;
// Wifi MAC address inside the guest
int wifi_mac_prefix() const;
std::string factory_reset_protected_path() const;
std::string persistent_bootconfig_path() const;
// used for the persistent_composite_disk vbmeta
std::string vbmeta_path() const;
std::string ap_vbmeta_path() const;
std::string id() const;
std::string gem5_binary_dir() const;
std::string gem5_checkpoint_dir() const;
// Serial console
bool console() const;
std::string console_dev() const;
bool enable_sandbox() const;
bool enable_virtiofs() const;
// KGDB configuration for kernel debugging
bool kgdb() const;
// TODO (b/163575714) add virtio console support to the bootloader so the
// virtio console path for the console device can be taken again. When that
// happens, this function can be deleted along with all the code paths it
// forces.
bool use_bootloader() const;
Arch target_arch() const;
int cpus() const;
std::string data_policy() const;
int blank_data_image_mb() const;
int gdb_port() const;
std::vector<DisplayConfig> display_configs() const;
std::vector<TouchpadConfig> touchpad_configs() const;
std::string grpc_socket_path() const;
int memory_mb() const;
int ddr_mem_mb() const;
std::string setupwizard_mode() const;
std::string userdata_format() const;
bool guest_enforce_security() const;
bool use_sdcard() const;
bool pause_in_bootloader() const;
bool run_as_daemon() const;
bool enable_audio() const;
bool enable_gnss_grpc_proxy() const;
bool enable_bootanimation() const;
bool enable_usb() const;
std::vector<std::string> extra_bootconfig_args() const;
bool record_screen() const;
std::string gem5_debug_file() const;
bool protected_vm() const;
bool mte() const;
std::string boot_slot() const;
bool fail_fast() const;
// Kernel and bootloader logging
bool enable_kernel_log() const;
bool vhost_net() const;
bool vhost_user_vsock() const;
int openthread_node_id() const;
// Mobile network info (RIL)
std::string ril_dns() const;
std::string ril_ipaddr() const;
std::string ril_gateway() const;
std::string ril_broadcast() const;
uint8_t ril_prefixlen() const;
bool enable_webrtc() const;
std::string webrtc_assets_dir() const;
// The range of TCP ports available for webrtc sessions.
std::pair<uint16_t, uint16_t> webrtc_tcp_port_range() const;
// The range of UDP ports available for webrtc sessions.
std::pair<uint16_t, uint16_t> webrtc_udp_port_range() const;
bool smt() const;
std::string crosvm_binary() const;
std::string seccomp_policy_dir() const;
std::string qemu_binary_dir() const;
// Configuration flags for a minimal device
bool enable_minimal_mode() const;
bool enable_modem_simulator() const;
int modem_simulator_instance_number() const;
int modem_simulator_sim_type() const;
std::string gpu_mode() const;
std::string gpu_angle_feature_overrides_enabled() const;
std::string gpu_angle_feature_overrides_disabled() const;
std::string gpu_capture_binary() const;
std::string gpu_gfxstream_transport() const;
std::string gpu_renderer_features() const;
std::string gpu_context_types() const;
std::string guest_vulkan_driver() const;
std::string frames_socket_path() const;
std::string gpu_vhost_user_mode() const;
bool enable_gpu_udmabuf() const;
bool enable_gpu_vhost_user() const;
bool enable_gpu_external_blob() const;
bool enable_gpu_system_blob() const;
std::string hwcomposer() const;
bool restart_subprocesses() const;
// android artifacts
std::string boot_image() const;
std::string new_boot_image() const;
std::string init_boot_image() const;
std::string data_image() const;
std::string new_data_image() const;
std::string super_image() const;
std::string new_super_image() const;
std::string misc_image() const;
std::string misc_info_txt() const;
std::string metadata_image() const;
std::string vendor_boot_image() const;
std::string new_vendor_boot_image() const;
std::string vbmeta_image() const;
std::string new_vbmeta_image() const;
std::string vbmeta_system_image() const;
std::string vbmeta_vendor_dlkm_image() const;
std::string new_vbmeta_vendor_dlkm_image() const;
std::string vbmeta_system_dlkm_image() const;
std::string new_vbmeta_system_dlkm_image() const;
std::string default_target_zip() const;
std::string system_target_zip() const;
// otheros artifacts
std::string otheros_esp_image() const;
// android efi loader flow
std::string android_efi_loader() const;
// chromeos artifacts for otheros flow
std::string chromeos_disk() const;
std::string chromeos_kernel_path() const;
std::string chromeos_root_image() const;
// linux artifacts for otheros flow
std::string linux_kernel_path() const;
std::string linux_initramfs_path() const;
std::string linux_root_image() const;
std::string fuchsia_zedboot_path() const;
std::string fuchsia_multiboot_bin_path() const;
std::string fuchsia_root_image() const;
std::string custom_partition_path() const;
int blank_metadata_image_mb() const;
int blank_sdcard_image_mb() const;
std::string bootloader() const;
std::string initramfs_path() const;
std::string kernel_path() const;
std::string guest_android_version() const;
bool bootconfig_supported() const;
std::string filename_encryption_mode() const;
ExternalNetworkMode external_network_mode() const;
};
// A view into an existing CuttlefishConfig object for a particular instance.
class MutableInstanceSpecific {
CuttlefishConfig* config_;
std::string id_;
friend MutableInstanceSpecific CuttlefishConfig::ForInstance(int num);
MutableInstanceSpecific(CuttlefishConfig* config, const std::string& id);
Json::Value* Dictionary();
public:
void set_serial_number(const std::string& serial_number);
void set_qemu_vnc_server_port(int qemu_vnc_server_port);
void set_tombstone_receiver_port(int tombstone_receiver_port);
void set_config_server_port(int config_server_port);
void set_frames_server_port(int config_server_port);
void set_touch_server_port(int config_server_port);
void set_keyboard_server_port(int config_server_port);
void set_gatekeeper_vsock_port(int gatekeeper_vsock_port);
void set_keymaster_vsock_port(int keymaster_vsock_port);
void set_audiocontrol_server_port(int audiocontrol_server_port);
void set_lights_server_port(int lights_server_port);
void set_adb_host_port(int adb_host_port);
void set_modem_simulator_host_id(int modem_simulator_id);
void set_adb_ip_and_port(const std::string& ip_port);
void set_fastboot_host_port(int fastboot_host_port);
void set_camera_server_port(int camera_server_port);
void set_mobile_bridge_name(const std::string& mobile_bridge_name);
void set_mobile_tap_name(const std::string& mobile_tap_name);
void set_mobile_mac(const std::string& mac);
void set_wifi_bridge_name(const std::string& wifi_bridge_name);
void set_wifi_tap_name(const std::string& wifi_tap_name);
void set_wifi_mac(const std::string& mac);
void set_use_bridged_wifi_tap(bool use_bridged_wifi_tap);
void set_ethernet_tap_name(const std::string& ethernet_tap_name);
void set_ethernet_bridge_name(const std::string& set_ethernet_bridge_name);
void set_ethernet_mac(const std::string& mac);
void set_ethernet_ipv6(const std::string& ip);
void set_session_id(uint32_t session_id);
void set_use_allocd(bool use_allocd);
void set_vsock_guest_cid(int vsock_guest_cid);
void set_vsock_guest_group(const std::string& vsock_guest_group);
void set_uuid(const std::string& uuid);
void set_environment_name(const std::string& env_name);
// modem simulator related
void set_modem_simulator_ports(const std::string& modem_simulator_ports);
void set_virtual_disk_paths(const std::vector<std::string>& disk_paths);
void set_webrtc_device_id(const std::string& id);
void set_group_id(const std::string& id);
void set_start_webrtc_signaling_server(bool start);
void set_start_webrtc_sig_server_proxy(bool start);
void set_start_rootcanal(bool start);
void set_start_casimir(bool start);
void set_start_pica(bool start);
void set_start_netsim(bool start);
// TODO(b/288987294) Remove this when separating environment is done
void set_start_wmediumd_instance(bool start);
void set_mcu(const Json::Value &v);
void set_ap_boot_flow(InstanceSpecific::APBootFlow flow);
void set_crosvm_use_balloon(const bool use_balloon);
void set_crosvm_use_rng(const bool use_rng);
void set_use_pmem(const bool use_pmem);
// Wifi MAC address inside the guest
void set_wifi_mac_prefix(const int wifi_mac_prefix);
// Gnss grpc proxy server port inside the host
void set_gnss_grpc_proxy_server_port(int gnss_grpc_proxy_server_port);
// Gnss grpc proxy local file path
void set_gnss_file_path(const std::string &gnss_file_path);
void set_fixed_location_file_path(
const std::string& fixed_location_file_path);
void set_gem5_binary_dir(const std::string& gem5_binary_dir);
void set_gem5_checkpoint_dir(const std::string& gem5_checkpoint_dir);
// Serial console
void set_console(bool console);
void set_enable_sandbox(const bool enable_sandbox);
void set_enable_virtiofs(const bool enable_virtiofs);
void set_kgdb(bool kgdb);
void set_target_arch(Arch target_arch);
void set_cpus(int cpus);
void set_data_policy(const std::string& data_policy);
void set_blank_data_image_mb(int blank_data_image_mb);
void set_gdb_port(int gdb_port);
void set_display_configs(const std::vector<DisplayConfig>& display_configs);
void set_touchpad_configs(
const std::vector<TouchpadConfig>& touchpad_configs);
void set_memory_mb(int memory_mb);
void set_ddr_mem_mb(int ddr_mem_mb);
Result<void> set_setupwizard_mode(const std::string& title);
void set_userdata_format(const std::string& userdata_format);
void set_guest_enforce_security(bool guest_enforce_security);
void set_use_sdcard(bool use_sdcard);
void set_pause_in_bootloader(bool pause_in_bootloader);
void set_run_as_daemon(bool run_as_daemon);
void set_enable_audio(bool enable);
void set_enable_usb(bool enable);
void set_enable_gnss_grpc_proxy(const bool enable_gnss_grpc_proxy);
void set_enable_bootanimation(const bool enable_bootanimation);
void set_extra_bootconfig_args(const std::string& extra_bootconfig_args);
void set_record_screen(bool record_screen);
void set_gem5_debug_file(const std::string& gem5_debug_file);
void set_protected_vm(bool protected_vm);
void set_mte(bool mte);
void set_boot_slot(const std::string& boot_slot);
void set_grpc_socket_path(const std::string& sockets);
void set_fail_fast(bool fail_fast);
// Kernel and bootloader logging
void set_enable_kernel_log(bool enable_kernel_log);
void set_enable_webrtc(bool enable_webrtc);
void set_webrtc_assets_dir(const std::string& webrtc_assets_dir);
// The range of TCP ports available for webrtc sessions.
void set_webrtc_tcp_port_range(std::pair<uint16_t, uint16_t> range);
// The range of UDP ports available for webrtc sessions.
void set_webrtc_udp_port_range(std::pair<uint16_t, uint16_t> range);
void set_smt(bool smt);
void set_crosvm_binary(const std::string& crosvm_binary);
void set_seccomp_policy_dir(const std::string& seccomp_policy_dir);
void set_qemu_binary_dir(const std::string& qemu_binary_dir);
void set_vhost_net(bool vhost_net);
void set_vhost_user_vsock(bool vhost_user_vsock);
void set_openthread_node_id(int node_id);
// Mobile network (RIL)
void set_ril_dns(const std::string& ril_dns);
void set_ril_ipaddr(const std::string& ril_ipaddr);
void set_ril_gateway(const std::string& ril_gateway);
void set_ril_broadcast(const std::string& ril_broadcast);
void set_ril_prefixlen(uint8_t ril_prefixlen);
// Configuration flags for a minimal device
void set_enable_minimal_mode(bool enable_minimal_mode);
void set_enable_modem_simulator(bool enable_modem_simulator);
void set_modem_simulator_instance_number(int instance_numbers);
void set_modem_simulator_sim_type(int sim_type);
void set_gpu_mode(const std::string& name);
void set_gpu_angle_feature_overrides_enabled(const std::string& overrides);
void set_gpu_angle_feature_overrides_disabled(const std::string& overrides);
void set_gpu_capture_binary(const std::string&);
void set_gpu_gfxstream_transport(const std::string& transport);
void set_gpu_renderer_features(const std::string& features);
void set_gpu_context_types(const std::string& context_types);
void set_guest_vulkan_driver(const std::string& driver);
void set_frames_socket_path(const std::string& driver);
void set_enable_gpu_udmabuf(const bool enable_gpu_udmabuf);
void set_enable_gpu_vhost_user(const bool enable_gpu_vhost_user);
void set_enable_gpu_external_blob(const bool enable_gpu_external_blob);
void set_enable_gpu_system_blob(const bool enable_gpu_system_blob);
void set_hwcomposer(const std::string&);
void set_restart_subprocesses(bool restart_subprocesses);
// system image files
void set_boot_image(const std::string& boot_image);
void set_new_boot_image(const std::string& new_boot_image);
void set_init_boot_image(const std::string& init_boot_image);
void set_data_image(const std::string& data_image);
void set_new_data_image(const std::string& new_data_image);
void set_super_image(const std::string& super_image);
void set_new_super_image(const std::string& super_image);
void set_misc_info_txt(const std::string& misc_image);
void set_vendor_boot_image(const std::string& vendor_boot_image);
void set_new_vendor_boot_image(const std::string& new_vendor_boot_image);
void set_vbmeta_image(const std::string& vbmeta_image);
void set_new_vbmeta_image(const std::string& new_vbmeta_image);
void set_vbmeta_system_image(const std::string& vbmeta_system_image);
void set_vbmeta_vendor_dlkm_image(
const std::string& vbmeta_vendor_dlkm_image);
void set_new_vbmeta_vendor_dlkm_image(
const std::string& vbmeta_vendor_dlkm_image);
void set_vbmeta_system_dlkm_image(
const std::string& vbmeta_system_dlkm_image);
void set_new_vbmeta_system_dlkm_image(
const std::string& vbmeta_system_dlkm_image);
void set_default_target_zip(const std::string& default_target_zip);
void set_system_target_zip(const std::string& system_target_zip);
void set_otheros_esp_image(const std::string& otheros_esp_image);
void set_android_efi_loader(const std::string& android_efi_loader);
void set_chromeos_disk(const std::string& chromeos_disk);
void set_chromeos_kernel_path(const std::string& linux_kernel_path);
void set_chromeos_root_image(const std::string& linux_root_image);
void set_linux_kernel_path(const std::string& linux_kernel_path);
void set_linux_initramfs_path(const std::string& linux_initramfs_path);
void set_linux_root_image(const std::string& linux_root_image);
void set_fuchsia_zedboot_path(const std::string& fuchsia_zedboot_path);
void set_fuchsia_multiboot_bin_path(const std::string& fuchsia_multiboot_bin_path);
void set_fuchsia_root_image(const std::string& fuchsia_root_image);
void set_custom_partition_path(const std::string& custom_partition_path);
void set_blank_metadata_image_mb(int blank_metadata_image_mb);
void set_blank_sdcard_image_mb(int blank_sdcard_image_mb);
void set_bootloader(const std::string& bootloader);
void set_initramfs_path(const std::string& initramfs_path);
void set_kernel_path(const std::string& kernel_path);
void set_guest_android_version(const std::string& guest_android_version);
void set_bootconfig_supported(bool bootconfig_supported);
void set_filename_encryption_mode(const std::string& userdata_format);
void set_external_network_mode(ExternalNetworkMode network_mode);
private:
void SetPath(const std::string& key, const std::string& path);
};
class EnvironmentSpecific;
class MutableEnvironmentSpecific;
MutableEnvironmentSpecific ForEnvironment(const std::string& envName);
EnvironmentSpecific ForEnvironment(const std::string& envName) const;
MutableEnvironmentSpecific ForDefaultEnvironment();
EnvironmentSpecific ForDefaultEnvironment() const;
std::vector<std::string> environment_dirs() const;
class EnvironmentSpecific {
friend EnvironmentSpecific CuttlefishConfig::ForEnvironment(
const std::string&) const;
friend EnvironmentSpecific CuttlefishConfig::ForDefaultEnvironment() const;
const CuttlefishConfig* config_;
std::string envName_;
EnvironmentSpecific(const CuttlefishConfig* config,
const std::string& envName)
: config_(config), envName_(envName) {}
Json::Value* Dictionary();
const Json::Value* Dictionary() const;
public:
std::string environment_name() const;
std::string environment_uds_dir() const;
std::string PerEnvironmentUdsPath(const std::string& file_name) const;
std::string environment_dir() const;
std::string PerEnvironmentPath(const std::string& file_name) const;
std::string PerEnvironmentLogPath(const std::string& file_name) const;
std::string PerEnvironmentGrpcSocketPath(
const std::string& file_name) const;
std::string control_socket_path() const;
std::string launcher_log_path() const;
// wmediumd related configs
bool enable_wifi() const;
bool start_wmediumd() const;
std::string vhost_user_mac80211_hwsim() const;
std::string wmediumd_api_server_socket() const;
std::string wmediumd_config() const;
int wmediumd_mac_prefix() const;
};
class MutableEnvironmentSpecific {
friend MutableEnvironmentSpecific CuttlefishConfig::ForEnvironment(
const std::string&);
friend MutableEnvironmentSpecific CuttlefishConfig::ForDefaultEnvironment();
CuttlefishConfig* config_;
std::string envName_;
MutableEnvironmentSpecific(CuttlefishConfig* config,
const std::string& envName)
: config_(config), envName_(envName) {}
Json::Value* Dictionary();
public:
// wmediumd related configs
void set_enable_wifi(const bool enable_wifi);
void set_start_wmediumd(bool start);
void set_vhost_user_mac80211_hwsim(const std::string& path);
void set_wmediumd_api_server_socket(const std::string& path);
void set_wmediumd_config(const std::string& path);
void set_wmediumd_mac_prefix(int mac_prefix);
};
private:
std::unique_ptr<Json::Value> dictionary_;
static CuttlefishConfig* BuildConfigImpl(const std::string& path);
CuttlefishConfig(const CuttlefishConfig&) = delete;
CuttlefishConfig& operator=(const CuttlefishConfig&) = delete;
};
// Whether the instance is restored from a snapshot. Stays true until the device
// reboots.
// When the device is booting, the config init function checks if
// "FLAGS_snapshot_path" is not empty, and if it isn't empty, a file called
// "restore" will be created to keep track of the restore.
// This is necessary because we don't want to
// modify the config when the device boots, however we also want to only restore
// once. Tracking via "restore" is necessary as a bug existed when checking if
// "snapshot_path" existed during boot, where a restart or a powerwash of the
// device would actually perform a restore instead of their respective actions.
bool IsRestoring(const CuttlefishConfig&);
// Vhost-user-vsock modes
extern const char* const kVhostUserVsockModeAuto;
extern const char* const kVhostUserVsockModeTrue;
extern const char* const kVhostUserVsockModeFalse;
// GPU modes
extern const char* const kGpuModeAuto;
extern const char* const kGpuModeCustom;
extern const char* const kGpuModeDrmVirgl;
extern const char* const kGpuModeGfxstream;
extern const char* const kGpuModeGfxstreamGuestAngle;
extern const char* const kGpuModeGfxstreamGuestAngleHostSwiftShader;
extern const char* const kGpuModeGuestSwiftshader;
extern const char* const kGpuModeNone;
// GPU vhost user modes
extern const char* const kGpuVhostUserModeAuto;
extern const char* const kGpuVhostUserModeOn;
extern const char* const kGpuVhostUserModeOff;
// HwComposer modes
extern const char* const kHwComposerAuto;
extern const char* const kHwComposerDrm;
extern const char* const kHwComposerRanchu;
extern const char* const kHwComposerNone;
} // namespace cuttlefish
#if FMT_VERSION >= 90000
template <>
struct fmt::formatter<cuttlefish::ExternalNetworkMode> : ostream_formatter {};
template <>
struct fmt::formatter<cuttlefish::VmmMode> : ostream_formatter {};
#endif