Merge changes I507b7827,Ie7eea383,I7e53e4fd

* changes:
  Delete config variables for vnc vsock internals
  Dynamically choose the VNC vsock ports in run_cvd
  Simplify vm_manager_helpers_ with function pointers
diff --git a/host/commands/assemble_cvd/flags.cc b/host/commands/assemble_cvd/flags.cc
index da1082d..21781bf 100644
--- a/host/commands/assemble_cvd/flags.cc
+++ b/host/commands/assemble_cvd/flags.cc
@@ -171,8 +171,6 @@
               "Binary for the configuration server");
 DEFINE_int32(config_server_port, vsoc::GetPerInstanceDefault(4680),
              "The (vsock) port for the configuration server");
-DEFINE_int32(frames_vsock_port, vsoc::GetPerInstanceDefault(5580),
-             "The vsock port to receive frames from the guest on");
 DEFINE_bool(enable_tombstone_receiver, true, "Enables the tombstone logger on "
             "both the guest and the host");
 DEFINE_string(tombstone_receiver_binary,
@@ -180,10 +178,6 @@
               "Binary for the tombstone server");
 DEFINE_int32(tombstone_receiver_port, vsoc::GetPerInstanceDefault(5630),
              "The vsock port for tombstones");
-DEFINE_int32(keyboard_server_port, GetPerInstanceDefault(5540),
-             "The port on which the vsock keyboard server should listen");
-DEFINE_int32(touch_server_port, GetPerInstanceDefault(5640),
-             "The port on which the vsock touch server should listen");
 DEFINE_bool(use_bootloader, false, "Boots the device using a bootloader");
 DEFINE_string(bootloader, "", "Bootloader binary path");
 DEFINE_string(boot_slot, "", "Force booting into the given slot. If empty, "
@@ -400,15 +394,11 @@
   tmp_config_obj.set_logcat_mode(FLAGS_logcat_mode);
   tmp_config_obj.set_logcat_vsock_port(FLAGS_logcat_vsock_port);
   tmp_config_obj.set_config_server_port(FLAGS_config_server_port);
-  tmp_config_obj.set_frames_vsock_port(FLAGS_frames_vsock_port);
 
   tmp_config_obj.set_enable_tombstone_receiver(FLAGS_enable_tombstone_receiver);
   tmp_config_obj.set_tombstone_receiver_port(FLAGS_tombstone_receiver_port);
   tmp_config_obj.set_tombstone_receiver_binary(FLAGS_tombstone_receiver_binary);
 
-  tmp_config_obj.set_touch_socket_port(FLAGS_touch_server_port);
-  tmp_config_obj.set_keyboard_socket_port(FLAGS_keyboard_server_port);
-
   tmp_config_obj.set_use_bootloader(FLAGS_use_bootloader);
   tmp_config_obj.set_bootloader(FLAGS_bootloader);
 
diff --git a/host/commands/run_cvd/launch.cc b/host/commands/run_cvd/launch.cc
index e4eb858..0d8aace 100644
--- a/host/commands/run_cvd/launch.cc
+++ b/host/commands/run_cvd/launch.cc
@@ -210,60 +210,63 @@
   return server;
 }
 
-cvd::SharedFD CreateVsockVncInputServer(int port) {
-  auto server = cvd::SharedFD::VsockServer(port, SOCK_STREAM);
-  if (!server->IsOpen()) {
-    LOG(ERROR) << "Unable to create vsock input server: "
-               << server->StrError();
-    return cvd::SharedFD();
+VncServerPorts LaunchVNCServerIfEnabled(
+    const vsoc::CuttlefishConfig& config,
+    cvd::ProcessMonitor* process_monitor,
+    std::function<bool(MonitorEntry*)> callback) {
+  VncServerPorts server_ret;
+  if (!config.enable_vnc_server()) {
+    return {};
   }
-  return server;
-}
-
-bool LaunchVNCServerIfEnabled(const vsoc::CuttlefishConfig& config,
-                              cvd::ProcessMonitor* process_monitor,
-                              std::function<bool(MonitorEntry*)> callback) {
-  if (config.enable_vnc_server()) {
-    // Launch the vnc server, don't wait for it to complete
-    auto port_options = "-port=" + std::to_string(config.vnc_server_port());
-    cvd::Command vnc_server(config.vnc_server_binary());
-    vnc_server.AddParameter(port_options);
-    if (config.vm_manager() == vm_manager::QemuManager::name()) {
-      vnc_server.AddParameter("-write_virtio_input");
-    }
-    // When the ivserver is not enabled, the vnc touch_server needs to serve
-    // on sockets and send input events to whoever connects to it (the VMM).
-    auto touch_server =
-        config.vm_manager() == vm_manager::CrosvmManager::name()
-            ? CreateUnixVncInputServer(config.touch_socket_path())
-            : CreateVsockVncInputServer(config.touch_socket_port());
-    if (!touch_server->IsOpen()) {
-      return false;
-    }
-    vnc_server.AddParameter("-touch_fd=", touch_server);
-
-    auto keyboard_server =
-        config.vm_manager() == vm_manager::CrosvmManager::name()
-            ? CreateUnixVncInputServer(config.keyboard_socket_path())
-            : CreateVsockVncInputServer(config.keyboard_socket_port());
-    if (!keyboard_server->IsOpen()) {
-      return false;
-    }
-    vnc_server.AddParameter("-keyboard_fd=", keyboard_server);
-    // TODO(b/128852363): This should be handled through the wayland mock
-    //  instead.
-    // Additionally it receives the frame updates from a virtual socket
-    // instead
-    auto frames_server =
-        cvd::SharedFD::VsockServer(config.frames_vsock_port(), SOCK_STREAM);
-    if (!frames_server->IsOpen()) {
-      return false;
-    }
-    vnc_server.AddParameter("-frame_server_fd=", frames_server);
-    process_monitor->StartSubprocess(std::move(vnc_server), callback);
-    return true;
+  std::set<std::string> extra_kernel_args;
+  // Launch the vnc server, don't wait for it to complete
+  auto port_options = "-port=" + std::to_string(config.vnc_server_port());
+  cvd::Command vnc_server(config.vnc_server_binary());
+  vnc_server.AddParameter(port_options);
+  if (config.vm_manager() == vm_manager::QemuManager::name()) {
+    vnc_server.AddParameter("-write_virtio_input");
   }
-  return false;
+  // When the ivserver is not enabled, the vnc touch_server needs to serve
+  // on sockets and send input events to whoever connects to it (the VMM).
+  cvd::SharedFD touch_server;
+  if (config.vm_manager() == vm_manager::CrosvmManager::name()) {
+    touch_server = CreateUnixVncInputServer(config.touch_socket_path());
+  } else {
+    touch_server = cvd::SharedFD::VsockServer(SOCK_STREAM);
+    server_ret.touch_server_vsock_port = touch_server->VsockServerPort();
+  }
+  if (!touch_server->IsOpen()) {
+    LOG(ERROR) << "Could not open touch server: " << touch_server->StrError();
+    return {};
+  }
+  vnc_server.AddParameter("-touch_fd=", touch_server);
+
+  cvd::SharedFD keyboard_server;
+  if (config.vm_manager() == vm_manager::CrosvmManager::name()) {
+    keyboard_server = CreateUnixVncInputServer(config.keyboard_socket_path());
+  } else {
+    keyboard_server = cvd::SharedFD::VsockServer(SOCK_STREAM);
+    server_ret.keyboard_server_vsock_port = keyboard_server->VsockServerPort();
+  }
+  if (!keyboard_server->IsOpen()) {
+    LOG(ERROR) << "Could not open keyboard server: " << keyboard_server->StrError();
+    return {};
+  }
+  vnc_server.AddParameter("-keyboard_fd=", keyboard_server);
+  // TODO(b/128852363): This should be handled through the wayland mock
+  //  instead.
+  // Additionally it receives the frame updates from a virtual socket
+  // instead
+  auto frames_server = cvd::SharedFD::VsockServer(SOCK_STREAM);
+  server_ret.frames_server_vsock_port = frames_server->VsockServerPort();
+  if (!frames_server->IsOpen()) {
+    LOG(ERROR) << "Could not open frames server: " << frames_server->StrError();
+    return {};
+  }
+  vnc_server.AddParameter("-frame_server_fd=", frames_server);
+  process_monitor->StartSubprocess(std::move(vnc_server), callback);
+
+  return server_ret;
 }
 
 void LaunchAdbConnectorIfEnabled(cvd::ProcessMonitor* process_monitor,
diff --git a/host/commands/run_cvd/launch.h b/host/commands/run_cvd/launch.h
index 4db6e12..42eed0d 100644
--- a/host/commands/run_cvd/launch.h
+++ b/host/commands/run_cvd/launch.h
@@ -1,7 +1,10 @@
 #pragma once
 
 #include <functional>
+#include <set>
+#include <string>
 
+#include "common/libs/fs/shared_fd.h"
 #include "common/libs/utils/subprocess.h"
 #include "host/commands/run_cvd/process_monitor.h"
 #include "host/libs/config/cuttlefish_config.h"
@@ -16,9 +19,6 @@
                         cvd::ProcessMonitor* process_monitor);
 void LaunchUsbServerIfEnabled(const vsoc::CuttlefishConfig& config,
                               cvd::ProcessMonitor* process_monitor);
-bool LaunchVNCServerIfEnabled(const vsoc::CuttlefishConfig& config,
-                              cvd::ProcessMonitor* process_monitor,
-                              std::function<bool(cvd::MonitorEntry*)> callback);
 void LaunchAdbConnectorIfEnabled(cvd::ProcessMonitor* process_monitor,
                                  const vsoc::CuttlefishConfig& config,
                                  cvd::SharedFD adbd_events_pipe);
@@ -26,3 +26,13 @@
                                  const vsoc::CuttlefishConfig& config);
 void LaunchTombstoneReceiverIfEnabled(const vsoc::CuttlefishConfig& config,
                                       cvd::ProcessMonitor* process_monitor);
+
+struct VncServerPorts {
+  std::optional<int> frames_server_vsock_port;
+  std::optional<int> touch_server_vsock_port;
+  std::optional<int> keyboard_server_vsock_port;
+};
+VncServerPorts LaunchVNCServerIfEnabled(
+    const vsoc::CuttlefishConfig& config,
+    cvd::ProcessMonitor* process_monitor,
+    std::function<bool(cvd::MonitorEntry*)> callback);
diff --git a/host/commands/run_cvd/main.cc b/host/commands/run_cvd/main.cc
index 486a0db..470c0d5 100644
--- a/host/commands/run_cvd/main.cc
+++ b/host/commands/run_cvd/main.cc
@@ -302,9 +302,6 @@
   if (config.logcat_mode() == cvd::kLogcatVsockMode) {
     kernel_cmdline.push_back(concat("androidboot.vsock_logcat_port=", config.logcat_vsock_port()));
   }
-  if (config.enable_vnc_server()) {
-    kernel_cmdline.push_back(concat("androidboot.vsock_frames_port=", config.frames_vsock_port()));
-  }
   if (config.enable_tombstone_receiver()) {
     kernel_cmdline.push_back("androidboot.tombstone_transmit=1");
     kernel_cmdline.push_back(concat(
@@ -328,11 +325,6 @@
     }
     kernel_cmdline.push_back(concat("androidboot.slot_suffix=", slot_suffix));
   }
-  if (config.vm_manager() == vm_manager::QemuManager::name()) {
-    kernel_cmdline.push_back(concat("androidboot.vsock_touch_port=", config.touch_socket_port()));
-    kernel_cmdline.push_back(concat(
-        "androidboot.vsock_keyboard_port=", config.keyboard_socket_port()));
-  }
   kernel_cmdline.push_back(concat("loop.max_part=", config.loop_max_part()));
   if (config.guest_enforce_security()) {
     kernel_cmdline.push_back("enforcing=1");
@@ -350,6 +342,22 @@
 
   return kernel_cmdline;
 }
+std::vector<std::string> KernelCommandLineFromVnc(const VncServerPorts& vnc_ports) {
+  std::vector<std::string> kernel_args;
+  if (vnc_ports.frames_server_vsock_port) {
+    kernel_args.push_back(concat("androidboot.vsock_frames_port=",
+                                 *vnc_ports.frames_server_vsock_port));
+  }
+  if (vnc_ports.touch_server_vsock_port) {
+    kernel_args.push_back(concat("androidboot.vsock_touch_port=",
+                                 *vnc_ports.touch_server_vsock_port));
+  }
+  if (vnc_ports.keyboard_server_vsock_port) {
+    kernel_args.push_back(concat("androidboot.vsock_keyboard_port=",
+                                 *vnc_ports.keyboard_server_vsock_port));
+  }
+  return kernel_args;
+}
 
 }  // namespace
 
@@ -472,6 +480,8 @@
   cvd::SharedFD adbd_events_pipe = event_pipes[1];
   event_pipes.clear();
 
+  std::set<std::string> extra_kernel_cmdline;
+
   SetUpHandlingOfBootEvents(&process_monitor, boot_events_pipe,
                             boot_state_machine);
 
@@ -486,12 +496,15 @@
   // The vnc server needs to be launched after the ivserver because it connects
   // to it when using qemu. It needs to launch before the VMM because it serves
   // on several sockets (input devices, vsock frame server) when using crosvm.
-  auto frontend_enabled = LaunchVNCServerIfEnabled(
+  auto vnc_server_config = LaunchVNCServerIfEnabled(
       *config, &process_monitor, GetOnSubprocessExitCallback(*config));
+  auto vnc_kernel_args = KernelCommandLineFromVnc(vnc_server_config);
+
+  auto kernel_args = KernelCommandLineFromConfig(*config);
+  kernel_args.insert(kernel_args.end(), vnc_kernel_args.begin(), vnc_kernel_args.end());
 
   // Start the guest VM
-  vm_manager->WithFrontend(frontend_enabled);
-  auto kernel_args = KernelCommandLineFromConfig(*config);
+  vm_manager->WithFrontend(vnc_kernel_args.size() > 0);
   vm_manager->WithKernelCommandLine(android::base::Join(kernel_args, " "));
   auto vmm_commands = vm_manager->StartCommands();
   for (auto& vmm_cmd: vmm_commands) {
diff --git a/host/libs/config/cuttlefish_config.cpp b/host/libs/config/cuttlefish_config.cpp
index 3b223d9..4b2451c 100644
--- a/host/libs/config/cuttlefish_config.cpp
+++ b/host/libs/config/cuttlefish_config.cpp
@@ -143,7 +143,6 @@
 const char* kLogcatMode = "logcat_mode";
 const char* kLogcatVsockPort = "logcat_vsock_port";
 const char* kConfigServerPort = "config_server_port";
-const char* kFramesVsockPort = "frames_vsock_port";
 const char* kLogcatReceiverBinary = "logcat_receiver_binary";
 const char* kConfigServerBinary = "config_server_binary";
 
@@ -156,9 +155,6 @@
 
 const char* kBootSlot = "boot_slot";
 
-const char* kTouchSocketPort = "touch_socket_port";
-const char* kKeyboardSocketPort = "keyboard_socket_port";
-
 const char* kLoopMaxPart = "loop_max_part";
 const char* kGuestEnforceSecurity = "guest_enforce_security";
 const char* kGuestAuditSecurity = "guest_audit_security";
@@ -718,14 +714,6 @@
   return (*dictionary_)[kConfigServerPort].asInt();
 }
 
-void CuttlefishConfig::set_frames_vsock_port(int port) {
-  (*dictionary_)[kFramesVsockPort] = port;
-}
-
-int CuttlefishConfig::frames_vsock_port() const {
-  return (*dictionary_)[kFramesVsockPort].asInt();
-}
-
 void CuttlefishConfig::set_logcat_receiver_binary(const std::string& binary) {
   SetPath(kLogcatReceiverBinary, binary);
 }
@@ -798,22 +786,6 @@
   return PerInstanceInternalPath("keyboard.sock");
 }
 
-void CuttlefishConfig::set_touch_socket_port(int port) {
-  (*dictionary_)[kTouchSocketPort] = port;
-}
-
-int CuttlefishConfig::touch_socket_port() const {
-  return (*dictionary_)[kTouchSocketPort].asInt();
-}
-
-void CuttlefishConfig::set_keyboard_socket_port(int port) {
-  (*dictionary_)[kKeyboardSocketPort] = port;
-}
-
-int CuttlefishConfig::keyboard_socket_port() const {
-  return (*dictionary_)[kKeyboardSocketPort].asInt();
-}
-
 void CuttlefishConfig::set_loop_max_part(int loop_max_part) {
   (*dictionary_)[kLoopMaxPart] = loop_max_part;
 }
diff --git a/host/libs/config/cuttlefish_config.h b/host/libs/config/cuttlefish_config.h
index bf3d231..d6a162a 100644
--- a/host/libs/config/cuttlefish_config.h
+++ b/host/libs/config/cuttlefish_config.h
@@ -288,9 +288,6 @@
   void set_config_server_port(int port);
   int config_server_port() const;
 
-  void set_frames_vsock_port(int port);
-  int frames_vsock_port() const;
-
   void set_enable_tombstone_receiver(bool enable_tombstone_receiver);
   bool enable_tombstone_receiver() const;
 
@@ -312,12 +309,6 @@
   std::string touch_socket_path() const;
   std::string keyboard_socket_path() const;
 
-  void set_touch_socket_port(int touch_socket_port);
-  int touch_socket_port() const;
-
-  void set_keyboard_socket_port(int keyboard_socket_port);
-  int keyboard_socket_port() const;
-
   void set_loop_max_part(int loop_max_part);
   int loop_max_part() const;
 
diff --git a/host/libs/vm_manager/vm_manager.cpp b/host/libs/vm_manager/vm_manager.cpp
index 2ab4157..40fa828 100644
--- a/host/libs/vm_manager/vm_manager.cpp
+++ b/host/libs/vm_manager/vm_manager.cpp
@@ -44,32 +44,20 @@
         {
           QemuManager::name(),
           {
-            [](const vsoc::CuttlefishConfig* config) {
-              return GetManagerSingleton<QemuManager>(config);
-            },
-            []() { return vsoc::HostSupportsQemuCli(); },
-            [](const std::string& gpu_mode) {
-              return QemuManager::ConfigureGpu(gpu_mode);
-            },
-            []() {
-              return QemuManager::ConfigureBootDevices();
-            }
+            GetManagerSingleton<QemuManager>,
+            vsoc::HostSupportsQemuCli,
+            QemuManager::ConfigureGpu,
+            QemuManager::ConfigureBootDevices,
           },
         },
         {
           CrosvmManager::name(),
           {
-            [](const vsoc::CuttlefishConfig* config) {
-              return GetManagerSingleton<CrosvmManager>(config);
-            },
+            GetManagerSingleton<CrosvmManager>,
             // Same as Qemu for the time being
-            []() { return vsoc::HostSupportsQemuCli(); },
-            [](const std::string& gpu_mode) {
-              return CrosvmManager::ConfigureGpu(gpu_mode);
-            },
-            []() {
-              return CrosvmManager::ConfigureBootDevices();
-            }
+            vsoc::HostSupportsQemuCli,
+            CrosvmManager::ConfigureGpu,
+            CrosvmManager::ConfigureBootDevices,
           }
         }
     };