blob: fc479ec7cab9f9f72d94d0d52a2b61294faec68a [file] [log] [blame]
Jorge E. Moreira577383b2018-05-24 14:17:51 -07001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#pragma once
17
18#include <memory>
19#include <string>
Cody Schuffelenefadb8d2018-08-10 16:10:35 -070020#include <set>
Jorge E. Moreira577383b2018-05-24 14:17:51 -070021
22namespace Json {
23class Value;
24}
25
26namespace vsoc {
27
Jorge E. Moreirab8dfb992018-07-22 20:53:56 -070028constexpr char kDefaultUuidPrefix[] = "699acfc4-c8c4-11e7-882b-5065f31dc1";
Cody Schuffelenf219a162018-10-11 19:01:57 -070029constexpr char kCuttlefishConfigEnvVarName[] = "CUTTLEFISH_CONFIG_FILE";
Ryan Haining7338d352018-10-24 17:41:52 -070030constexpr char kVsocUserPrefix[] = "vsoc-";
Jorge E. Moreira8dad5042019-10-01 16:04:52 -070031constexpr char kBootStartedMessage[] ="VIRTUAL_DEVICE_BOOT_STARTED";
32constexpr char kBootCompletedMessage[] = "VIRTUAL_DEVICE_BOOT_COMPLETED";
33constexpr char kBootFailedMessage[] = "VIRTUAL_DEVICE_BOOT_FAILED";
34constexpr char kMobileNetworkConnectedMessage[] =
35 "VIRTUAL_DEVICE_NETWORK_MOBILE_CONNECTED";
36constexpr char kWifiConnectedMessage[] =
37 "VIRTUAL_DEVICE_NETWORK_WIFI_CONNECTED";
Jorge E. Moreira1e8e2f12019-10-07 18:09:49 -070038constexpr char kInternalDirName[] = "internal";
39
Jorge E. Moreirab8dfb992018-07-22 20:53:56 -070040
Cody Schuffelenb6fa7362019-05-08 11:58:14 -070041enum class AdbMode {
Cody Schuffelen134ff032019-11-22 00:25:32 -080042 Tunnel,
Cody Schuffelenb6fa7362019-05-08 11:58:14 -070043 VsockTunnel,
44 VsockHalfTunnel,
45 NativeVsock,
46 Usb,
47 Unknown,
48};
49
Jorge E. Moreira577383b2018-05-24 14:17:51 -070050// Holds the configuration of the cuttlefish instances.
51class CuttlefishConfig {
52 public:
Cody Schuffelen1fcdbc02019-10-04 14:02:23 -070053 static const CuttlefishConfig* Get();
Jorge E. Moreira077d3002018-07-20 11:43:05 -070054
55 CuttlefishConfig();
56 ~CuttlefishConfig();
Jorge E. Moreira577383b2018-05-24 14:17:51 -070057
58 // Saves the configuration object in a file, it can then be read in other
59 // processes by passing the --config_file option.
Jorge E. Moreiraa8142f92018-06-13 17:33:55 -070060 bool SaveToFile(const std::string& file) const;
Jorge E. Moreira577383b2018-05-24 14:17:51 -070061
62 // Returns the path to a file with the given name in the instance directory..
63 std::string PerInstancePath(const char* file_name) const;
Jorge E. Moreira1e8e2f12019-10-07 18:09:49 -070064 std::string PerInstanceInternalPath(const char* file_name) const;
Jorge E. Moreira577383b2018-05-24 14:17:51 -070065
66 std::string instance_name() const;
67
68 void disable_usb_adb() {
69 // This seems to be the way usb is being disbled in the launcher
70 set_usb_v1_socket_name("");
71 }
72
Jorge E. Moreira577383b2018-05-24 14:17:51 -070073 std::string instance_dir() const;
74 void set_instance_dir(const std::string& instance_dir);
75
Jorge E. Moreira1e8e2f12019-10-07 18:09:49 -070076 std::string instance_internal_dir() const;
77
Jorge E. Moreira88322832018-07-22 16:41:01 -070078 std::string vm_manager() const;
79 void set_vm_manager(const std::string& name);
80
Greg Hartmana3c552d2019-03-28 18:20:48 -070081 std::string gpu_mode() const;
82 void set_gpu_mode(const std::string& name);
83
84 std::string wayland_socket() const;
85 void set_wayland_socket(const std::string& path);
86
Greg Hartmaneb04ac52019-07-16 16:44:18 -070087 std::string x_display() const;
88 void set_x_display(const std::string& address);
89
Jorge E. Moreiraba626622019-01-28 17:47:50 -080090 std::string hardware_name() const;
91 void set_hardware_name(const std::string& name);
92
Jorge E. Moreira577383b2018-05-24 14:17:51 -070093 std::string serial_number() const;
94 void set_serial_number(const std::string& serial_number);
95
96 int cpus() const;
97 void set_cpus(int cpus);
98
99 int memory_mb() const;
100 void set_memory_mb(int memory_mb);
101
102 int dpi() const;
103 void set_dpi(int dpi);
104
105 int x_res() const;
106 void set_x_res(int x_res);
107
108 int y_res() const;
109 void set_y_res(int y_res);
110
Cody Schuffelen5bc697c2019-01-28 21:05:29 -0800111 int num_screen_buffers() const;
112 void set_num_screen_buffers(int num_screen_buffers);
113
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700114 int refresh_rate_hz() const;
115 void set_refresh_rate_hz(int refresh_rate_hz);
116
Jorge E. Moreira80ddd7f2019-02-04 16:30:13 -0800117 // Returns kernel image extracted from the boot image or the user-provided one
118 // if given by command line to the launcher. This function should not be used
119 // to get the kernel image the vmm should boot, GetKernelImageToUse() should
120 // be used instead.
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700121 std::string kernel_image_path() const;
122 void set_kernel_image_path(const std::string& kernel_image_path);
123
Jorge E. Moreira80ddd7f2019-02-04 16:30:13 -0800124 bool decompress_kernel() const;
125 void set_decompress_kernel(bool decompress_kernel);
126
127 // Returns the path to the kernel image that should be given to the vm manager
128 // to boot, takes into account whether the original image was decompressed or
129 // not.
130 std::string GetKernelImageToUse() const {
131 return decompress_kernel() ? decompressed_kernel_image_path()
132 : kernel_image_path();
133 }
134
135 std::string decompressed_kernel_image_path() const;
136 void set_decompressed_kernel_image_path(const std::string& path);
137
Cody Schuffelene13a78a2019-01-29 14:51:26 -0800138 bool use_unpacked_kernel() const;
139 void set_use_unpacked_kernel(bool use_unpacked_kernel);
140
Jorge E. Moreirab2427ba2018-08-23 17:11:55 -0700141 std::set<std::string> kernel_cmdline() const;
142 void set_kernel_cmdline(const std::set<std::string>& kernel_cmdline);
143 void add_kernel_cmdline(const std::string& arg);
144 void add_kernel_cmdline(const std::set<std::string>& kernel_cmdline);
145 std::string kernel_cmdline_as_string() const;
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700146
Greg Hartman91f81422018-07-09 16:04:49 -0700147 std::string gdb_flag() const;
148 void set_gdb_flag(const std::string& gdb);
149
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700150 std::string ramdisk_image_path() const;
151 void set_ramdisk_image_path(const std::string& ramdisk_image_path);
152
Cody Schuffelen9fd95472019-10-04 13:49:57 -0700153 std::string initramfs_path() const;
154 void set_initramfs_path(const std::string& initramfs_path);
155
156 std::string final_ramdisk_path() const;
157 void set_final_ramdisk_path(const std::string& final_ramdisk_path);
158
Ram Muthiah1aa02f82019-10-22 20:26:28 +0000159 std::string vendor_ramdisk_image_path() const;
160 void set_vendor_ramdisk_image_path(const std::string&
161 vendor_ramdisk_image_path);
162
Cody Schuffelen3c99f5b2019-06-14 17:26:01 -0700163 std::vector<std::string> virtual_disk_paths() const;
164 void set_virtual_disk_paths(const std::vector<std::string>& disk_paths);
Cody Schuffelen88b82d52019-05-29 14:16:03 -0700165
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700166 std::string mempath() const;
167 void set_mempath(const std::string& mempath);
168
169 std::string ivshmem_qemu_socket_path() const;
170 void set_ivshmem_qemu_socket_path(
171 const std::string& ivshmem_qemu_socket_path);
172
173 std::string ivshmem_client_socket_path() const;
174 void set_ivshmem_client_socket_path(
175 const std::string& ivshmem_client_socket_path);
176
177 int ivshmem_vector_count() const;
178 void set_ivshmem_vector_count(int ivshmem_vector_count);
179
180 // The name of the socket that will be used to forward access to USB gadget.
181 // This is for V1 of the USB bus.
182 std::string usb_v1_socket_name() const;
183 void set_usb_v1_socket_name(const std::string& usb_v1_socket_name);
184
185 int vhci_port() const;
186 void set_vhci_port(int vhci_port);
187
188 std::string usb_ip_socket_name() const;
189 void set_usb_ip_socket_name(const std::string& usb_ip_socket_name);
190
Jorge E. Moreirab1ec4352019-06-04 11:43:08 -0700191 std::string kernel_log_pipe_name() const;
192 void set_kernel_log_pipe_name(const std::string& kernel_log_pipe_name);
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700193
Jorge E. Moreira7207f4b2019-09-25 10:30:29 -0700194 std::string console_pipe_name() const;
195 void set_console_pipe_name(const std::string& console_pipe_name);
196
Jorge E. Moreira81afca12018-07-26 16:48:49 -0700197 bool deprecated_boot_completed() const;
198 void set_deprecated_boot_completed(bool deprecated_boot_completed);
199
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700200 std::string console_path() const;
201 void set_console_path(const std::string& console_path);
202
203 std::string logcat_path() const;
204 void set_logcat_path(const std::string& logcat_path);
205
Cody Schuffelen5de48652019-09-16 19:49:52 +0000206 std::string logcat_receiver_binary() const;
207 void set_logcat_receiver_binary(const std::string& binary);
208
Jorge E. Moreiraf1f7cb32019-04-15 18:44:41 -0700209 std::string config_server_binary() const;
210 void set_config_server_binary(const std::string& binary);
211
Jorge E. Moreira66f6ec82018-07-16 16:43:15 -0700212 std::string launcher_log_path() const;
213 void set_launcher_log_path(const std::string& launcher_log_path);
214
Jorge E. Moreira50a07752018-07-18 18:49:04 -0700215 std::string launcher_monitor_socket_path() const;
216 void set_launcher_monitor_socket_path(
217 const std::string& launhcer_monitor_path);
218
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700219 std::string mobile_bridge_name() const;
220 void set_mobile_bridge_name(const std::string& mobile_bridge_name);
221
222 std::string mobile_tap_name() const;
223 void set_mobile_tap_name(const std::string& mobile_tap_name);
224
Cody Schuffelen975175a2018-06-14 18:20:02 -0700225 std::string wifi_tap_name() const;
226 void set_wifi_tap_name(const std::string& wifi_tap_name);
227
Cody Schuffelend946b5f2018-12-12 11:54:48 -0800228 void set_vsock_guest_cid(int vsock_guest_cid);
229 int vsock_guest_cid() const;
230
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700231 std::string uuid() const;
232 void set_uuid(const std::string& uuid);
233
Greg Hartman6abdbb92018-05-24 09:49:00 -0700234 void set_cuttlefish_env_path(const std::string& path);
235 std::string cuttlefish_env_path() const;
236
Cody Schuffelen90b2fb22019-02-28 18:55:21 -0800237 void set_adb_mode(const std::set<std::string>& modes);
Cody Schuffelenb6fa7362019-05-08 11:58:14 -0700238 std::set<AdbMode> adb_mode() const;
Ryan Haining4a1abea2018-07-10 16:20:19 -0700239
Cody Schuffelene0d0c462019-09-09 14:13:01 -0700240 void set_host_port(int host_port);
241 int host_port() const;
242
Ryan Haining7338d352018-10-24 17:41:52 -0700243 void set_adb_ip_and_port(const std::string& ip_port);
244 std::string adb_ip_and_port() const;
245
246 std::string adb_device_name() const;
247
Ryan Haining6d821ec2018-07-27 11:39:09 -0700248 void set_device_title(const std::string& title);
249 std::string device_title() const;
250
Greg Hartmanf1f28c52018-09-20 17:19:19 -0700251 void set_setupwizard_mode(const std::string& title);
252 std::string setupwizard_mode() const;
253
Cody Schuffelen58980032018-10-11 17:11:13 -0700254 void set_qemu_binary(const std::string& qemu_binary);
255 std::string qemu_binary() const;
256
Jorge E. Moreiraba626622019-01-28 17:47:50 -0800257 void set_crosvm_binary(const std::string& crosvm_binary);
258 std::string crosvm_binary() const;
259
Jorge E. Moreira13cbd982019-06-06 16:06:34 -0700260 void set_console_forwarder_binary(const std::string& crosvm_binary);
261 std::string console_forwarder_binary() const;
262
Cody Schuffelen5bc697c2019-01-28 21:05:29 -0800263 void set_ivserver_binary(const std::string& ivserver_binary);
264 std::string ivserver_binary() const;
265
Cody Schuffelen55676ca2019-01-28 22:00:05 -0800266 void set_kernel_log_monitor_binary(
267 const std::string& kernel_log_monitor_binary);
268 std::string kernel_log_monitor_binary() const;
269
Cody Schuffelen17b34722019-01-28 22:57:14 -0800270 void set_enable_vnc_server(bool enable_vnc_server);
271 bool enable_vnc_server() const;
272
273 void set_vnc_server_port(int vnc_server_port);
274 int vnc_server_port() const;
275
276 void set_vnc_server_binary(const std::string& vnc_server_binary);
277 std::string vnc_server_binary() const;
278
Cody Schuffelen134ff032019-11-22 00:25:32 -0800279 void set_enable_stream_audio(bool enable_stream_audio);
280 bool enable_stream_audio() const;
281
282 void set_stream_audio_port(int stream_audio_port);
283 int stream_audio_port() const;
284
285 void set_stream_audio_binary(const std::string& stream_audio_binary);
286 std::string stream_audio_binary() const;
287
Cody Schuffelend12e0c92019-01-29 15:44:45 -0800288 void set_restart_subprocesses(bool restart_subprocesses);
289 bool restart_subprocesses() const;
290
Cody Schuffelen1f08d972019-01-29 16:21:12 -0800291 void set_run_adb_connector(bool run_adb_connector);
292 bool run_adb_connector() const;
293
294 void set_adb_connector_binary(const std::string& adb_connector_binary);
295 std::string adb_connector_binary() const;
296
297 void set_virtual_usb_manager_binary(const std::string& binary);
298 std::string virtual_usb_manager_binary() const;
299
300 void set_socket_forward_proxy_binary(const std::string& binary);
301 std::string socket_forward_proxy_binary() const;
302
303 void set_socket_vsock_proxy_binary(const std::string& binary);
304 std::string socket_vsock_proxy_binary() const;
305
Cody Schuffelen50249732019-01-29 16:42:55 -0800306 void set_run_as_daemon(bool run_as_daemon);
307 bool run_as_daemon() const;
308
Cody Schuffelen3a640952019-01-29 17:14:41 -0800309 void set_run_e2e_test(bool run_e2e_test);
310 bool run_e2e_test() const;
311
312 void set_e2e_test_binary(const std::string& e2e_test_binary);
313 std::string e2e_test_binary() const;
314
Cody Schuffelen2b51bab2019-01-29 18:14:48 -0800315 void set_data_policy(const std::string& data_policy);
316 std::string data_policy() const;
317
318 void set_blank_data_image_mb(int blank_data_image_mb);
319 int blank_data_image_mb() const;
320
321 void set_blank_data_image_fmt(const std::string& blank_data_image_fmt);
322 std::string blank_data_image_fmt() const;
323
Cody Schuffelen5de48652019-09-16 19:49:52 +0000324 void set_logcat_mode(const std::string& mode);
325 std::string logcat_mode() const;
326
327 void set_logcat_vsock_port(int port);
328 int logcat_vsock_port() const;
Jorge E. Moreirafd10cae2019-02-19 15:35:42 -0800329
Jorge E. Moreiraf1f7cb32019-04-15 18:44:41 -0700330 void set_config_server_port(int port);
331 int config_server_port() const;
332
Jorge E. Moreirac87c2c72019-03-06 16:12:23 -0800333 void set_frames_vsock_port(int port);
334 int frames_vsock_port() const;
335
Ram Muthiah792e2ad2019-04-19 11:19:46 -0700336 void set_enable_tombstone_receiver(bool enable_tombstone_receiver);
337 bool enable_tombstone_receiver() const;
338
339 void set_tombstone_receiver_binary(const std::string& binary);
340 std::string tombstone_receiver_binary() const;
341
342 void set_tombstone_receiver_port(int port);
343 int tombstone_receiver_port() const;
344
Cody Schuffelen1300f122019-05-28 18:24:34 -0700345 void set_use_bootloader(bool use_bootloader);
346 bool use_bootloader() const;
347
348 void set_bootloader(const std::string& bootloader_path);
349 std::string bootloader() const;
350
David Anderson637bfd62019-09-26 13:23:21 -0700351 void set_boot_slot(const std::string& boot_slot);
352 std::string boot_slot() const;
353
Jorge E. Moreiraf4b202b2019-02-05 17:51:06 -0800354 bool enable_ivserver() const;
355
Jorge E. Moreirac87c2c72019-03-06 16:12:23 -0800356 std::string touch_socket_path() const;
357 std::string keyboard_socket_path() const;
358
Cody Schuffelen038d4d92019-11-04 15:09:03 -0800359 void set_touch_socket_port(int touch_socket_port);
360 int touch_socket_port() const;
361
362 void set_keyboard_socket_port(int keyboard_socket_port);
363 int keyboard_socket_port() const;
364
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700365 private:
366 std::unique_ptr<Json::Value> dictionary_;
367
Ryan Hainingd3f185d2018-07-19 12:11:47 -0700368 void SetPath(const std::string& key, const std::string& path);
Jorge E. Moreira077d3002018-07-20 11:43:05 -0700369 bool LoadFromFile(const char* file);
370 static CuttlefishConfig* BuildConfigImpl();
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700371
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700372 CuttlefishConfig(const CuttlefishConfig&) = delete;
373 CuttlefishConfig& operator=(const CuttlefishConfig&) = delete;
374};
375
376// Returns the instance number as obtained from the CUTTLEFISH_INSTANCE
377// environment variable or the username.
378int GetInstance();
Jorge E. Moreira015c0002018-07-19 11:01:16 -0700379// Returns a path where the launhcer puts a link to the config file which makes
380// it easily discoverable regardless of what vm manager is in use
381std::string GetGlobalConfigFileLink();
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700382
383// Returns the path to the ivserver's client socket.
384std::string GetDomain();
385
386// These functions modify a given base value to make it different accross
387// different instances by appending the instance id in case of strings or adding
388// it in case of integers.
389std::string GetPerInstanceDefault(const char* prefix);
390int GetPerInstanceDefault(int base);
391
392std::string GetDefaultPerInstanceDir();
Jorge E. Moreira077d3002018-07-20 11:43:05 -0700393std::string GetDefaultMempath();
Cody Schuffelend946b5f2018-12-12 11:54:48 -0800394int GetDefaultPerInstanceVsockCid();
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700395
Jorge E. Moreiraa8142f92018-06-13 17:33:55 -0700396std::string DefaultHostArtifactsPath(const std::string& file);
397std::string DefaultGuestImagePath(const std::string& file);
Greg Hartmana3c552d2019-03-28 18:20:48 -0700398std::string DefaultEnvironmentPath(const char* environment_key,
399 const char* default_value,
400 const char* path);
Jorge E. Moreiraa8142f92018-06-13 17:33:55 -0700401
Jorge E. Moreirad9668372019-01-28 22:40:42 -0800402// Whether the host supports qemu
Jorge E. Moreiraa8142f92018-06-13 17:33:55 -0700403bool HostSupportsQemuCli();
Cody Schuffelend946b5f2018-12-12 11:54:48 -0800404bool HostSupportsVsock();
Greg Hartmana3c552d2019-03-28 18:20:48 -0700405
406// GPU modes
Greg Hartmanbc1bed42019-04-05 20:02:00 -0700407extern const char* const kGpuModeGuestSwiftshader;
408extern const char* const kGpuModeDrmVirgl;
Jorge E. Moreira577383b2018-05-24 14:17:51 -0700409} // namespace vsoc