Merge "Update the default cbrsnetworkmonitor permissions granted to Cuttlefish." into rvc-d1-dev
diff --git a/host/commands/assemble_cvd/flags.cc b/host/commands/assemble_cvd/flags.cc
index d57e871..8562271 100644
--- a/host/commands/assemble_cvd/flags.cc
+++ b/host/commands/assemble_cvd/flags.cc
@@ -31,6 +31,7 @@
 #define VBMETA_MAX_SIZE 65536ul
 
 using vsoc::ForCurrentInstance;
+using vsoc::RandomSerialNumber;
 using cvd::AssemblerExitCodes;
 
 DEFINE_string(cache_image, "", "Location of the cache partition image.");
@@ -86,6 +87,8 @@
              "Total amount of memory available for guest, MB.");
 DEFINE_string(serial_number, ForCurrentInstance("CUTTLEFISHCVD"),
               "Serial number to use for the device");
+DEFINE_bool(use_random_serial, false,
+            "Whether to use random serial for the device.");
 DEFINE_string(assembly_dir,
               cvd::StringFromEnv("HOME", ".") + "/cuttlefish_assembly",
               "A directory to put generated files common between instances");
@@ -405,7 +408,11 @@
         .ForInstance(num);
     // Set this first so that calls to PerInstancePath below are correct
     instance.set_instance_dir(FLAGS_instance_dir + "." + std::to_string(num));
-    instance.set_serial_number(FLAGS_serial_number + std::to_string(num));
+    if(FLAGS_use_random_serial){
+      instance.set_serial_number(RandomSerialNumber("CFCVD" + std::to_string(num)));
+    } else {
+      instance.set_serial_number(FLAGS_serial_number + std::to_string(num));
+    }
 
     instance.set_mobile_bridge_name(StrForInstance("cvd-mbr-", num));
     instance.set_mobile_tap_name(StrForInstance("cvd-mtap-", num));
diff --git a/host/libs/config/cuttlefish_config.cpp b/host/libs/config/cuttlefish_config.cpp
index cc9a000..c11ed16 100644
--- a/host/libs/config/cuttlefish_config.cpp
+++ b/host/libs/config/cuttlefish_config.cpp
@@ -25,6 +25,7 @@
 #include <iterator>
 #include <sstream>
 #include <string>
+#include <time.h>
 
 #include <android-base/strings.h>
 #include <glog/logging.h>
@@ -994,6 +995,16 @@
 }
 int ForCurrentInstance(int base) { return base + GetInstance() - 1; }
 
+std::string RandomSerialNumber(const std::string& prefix) {
+  const char hex_characters[] = "0123456789ABCDEF";
+  std::srand(time(0));
+  char str[10];
+  for(int i=0; i<10; i++){
+    str[i] = hex_characters[rand() % strlen(hex_characters)];
+  }
+  return prefix + str;
+}
+
 std::string GetDefaultPerInstanceDir() {
   std::ostringstream stream;
   stream << std::getenv("HOME") << "/cuttlefish_runtime";
diff --git a/host/libs/config/cuttlefish_config.h b/host/libs/config/cuttlefish_config.h
index c99ecf1..e6a1e79 100644
--- a/host/libs/config/cuttlefish_config.h
+++ b/host/libs/config/cuttlefish_config.h
@@ -388,6 +388,9 @@
 std::string ForCurrentInstance(const char* prefix);
 int ForCurrentInstance(int base);
 
+// Returns a random serial number appended to a given prefix.
+std::string RandomSerialNumber(const std::string& prefix);
+
 std::string GetDefaultPerInstanceDir();
 std::string GetDefaultMempath();
 int GetDefaultPerInstanceVsockCid();