Merge "Push virtio-net interface renaming into userspace." into gce-dev
diff --git a/common/libs/net/network_interface_manager.cpp b/common/libs/net/network_interface_manager.cpp
index 32d5583..4ee96b7 100644
--- a/common/libs/net/network_interface_manager.cpp
+++ b/common/libs/net/network_interface_manager.cpp
@@ -75,15 +75,22 @@
     : nl_client_(std::move(nl_client)) {}
 
 std::unique_ptr<NetworkInterface> NetworkInterfaceManager::Open(
-    const std::string& if_name) {
+    const std::string& if_name, const std::string& if_name_alt) {
   std::unique_ptr<NetworkInterface> iface;
   // NOTE: do not replace this code with an IOCTL call.
   // On SELinux enabled Androids, RILD is not permitted to execute an IOCTL
   // and this call will fail.
-  const int32_t index = if_nametoindex(if_name.c_str());
-  if (index < 0) {
-    LOG(ERROR) << "Failed to get interface (" << if_name << ") index.";
-    return iface;
+  int32_t index = if_nametoindex(if_name.c_str());
+  if (index == 0) {
+    // Try the alternate name. This will be renamed to our preferred name
+    // by the kernel, because we specify IFLA_IFNAME, but open by index.
+    LOG(ERROR) << "Failed to get interface (" << if_name << ") index, "
+               << "trying alternate.";
+    index = if_nametoindex(if_name_alt.c_str());
+    if (index == 0) {
+      LOG(ERROR) << "Failed to get interface (" << if_name_alt << ") index.";
+      return iface;
+    }
   }
 
   iface.reset(new NetworkInterface(index));
diff --git a/common/libs/net/network_interface_manager.h b/common/libs/net/network_interface_manager.h
index 3d6ccc5..f28b0ff 100644
--- a/common/libs/net/network_interface_manager.h
+++ b/common/libs/net/network_interface_manager.h
@@ -32,14 +32,15 @@
 //
 //   std::unique_ptr<NetlinkClient> client(NetlinkClient::GetDefault());
 //   NetworkInterfaceManager manager(client.get());
-//   std::unique_ptr<NetworkInterface> iface(manager.Open("eth0"));
+//   std::unique_ptr<NetworkInterface> iface(manager.Open("eth0", "em0"));
 //
 class NetworkInterfaceManager {
  public:
   // Open existing network interface.
   //
   // NOTE: this method does not fill in any NetworkInterface details yet.
-  std::unique_ptr<NetworkInterface> Open(const std::string& if_name);
+  std::unique_ptr<NetworkInterface> Open(const std::string& if_name,
+                                         const std::string& if_name_alt);
 
   // Apply changes made to existing network interface.
   // This method cannot be used to instantiate new network interfaces.
diff --git a/guest/hals/ril/vsoc_ril.cpp b/guest/hals/ril/vsoc_ril.cpp
index b60ad8d..0d33dd9 100644
--- a/guest/hals/ril/vsoc_ril.cpp
+++ b/guest/hals/ril/vsoc_ril.cpp
@@ -114,9 +114,10 @@
   std::unique_ptr<cvd::NetlinkClient> nl(factory->New(NETLINK_ROUTE));
   std::unique_ptr<cvd::NetworkInterfaceManager> nm(
       cvd::NetworkInterfaceManager::New(factory));
-  std::unique_ptr<cvd::NetworkInterface> ni(nm->Open("rmnet0"));
+  std::unique_ptr<cvd::NetworkInterface> ni(nm->Open("rmnet0", "eth0"));
 
   if (ni) {
+    ni->SetName("rmnet0");
     ni->SetAddress(ipaddr);
     ni->SetBroadcastAddress(bcaddr);
     ni->SetPrefixLength(prefixlen);
@@ -132,7 +133,7 @@
 // This call returns true, if operation was successful.
 bool TearDownNetworkInterface() {
   auto nm(cvd::NetworkInterfaceManager::New(nullptr));
-  auto ni(nm->Open("rmnet0"));
+  auto ni(nm->Open("rmnet0", "eth0"));
 
   if (ni) {
     ni->SetOperational(false);