]> xenbits.xensource.com Git - libvirt.git/commitdiff
conf, docs: Add support for dummy network interface
authorMartin Kletzander <mkletzan@redhat.com>
Thu, 4 Aug 2022 08:26:40 +0000 (10:26 +0200)
committerMartin Kletzander <mkletzan@redhat.com>
Fri, 5 Aug 2022 12:37:54 +0000 (14:37 +0200)
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
Reviewed-by: Reviewed-by: Ján Tomko <jtomko@redhat.com>
19 files changed:
docs/formatdomain.rst
src/ch/ch_monitor.c
src/conf/domain_conf.c
src/conf/domain_conf.h
src/conf/netdev_bandwidth_conf.c
src/conf/schemas/domaincommon.rng
src/libxl/libxl_conf.c
src/libxl/xen_common.c
src/lxc/lxc_controller.c
src/lxc/lxc_driver.c
src/lxc/lxc_process.c
src/qemu/qemu_command.c
src/qemu/qemu_domain.c
src/qemu/qemu_hotplug.c
src/qemu/qemu_interface.c
src/qemu/qemu_process.c
src/qemu/qemu_validate.c
src/vmx/vmx.c
tools/virsh-domain.c

index adfdd7b7a5ac4f914342ed7062d19249ed63d76e..ed0d9c19593b5f594e614a98eace50e4e44f2071 100644 (file)
@@ -5240,6 +5240,30 @@ which the UDP socket packets will originate from the QEMU host. :since:`Since
    </devices>
    ...
 
+Dummy network interface
+^^^^^^^^^^^^^^^^^^^^^^^
+
+An unconnected network interface sounds pretty pointless, but can show up for
+example with VMWare when libvirt does not have any more information to provide.
+Two such scenarios are currently known:
+
+1) network interface exists, but is not connected to any existing network
+2) the interface is connected to something known as VMWare Distributed Switch
+
+The difference between these two is not (yet?) discoverable by libvirt, so at
+least the information gathered from the hypervisor is provided in the
+element. :since:`Since 8.7.0`
+
+::
+
+   ...
+   <devices>
+     <interface type='dummy'>
+       <mac address='52:54:00:22:c9:42'/>
+     </interface>
+   </devices>
+   ...
+
 Setting the NIC model
 ^^^^^^^^^^^^^^^^^^^^^
 
index fe3c1237c4d1177e9d27ad4bb0b0b2c86de90a2c..67ca4a7a0dcd77c7346908d1fc0a28e7c48887c5 100644 (file)
@@ -301,6 +301,7 @@ virCHMonitorBuildNetJson(virJSONValue *nets,
         case VIR_DOMAIN_NET_TYPE_HOSTDEV:
         case VIR_DOMAIN_NET_TYPE_UDP:
         case VIR_DOMAIN_NET_TYPE_VDPA:
+        case VIR_DOMAIN_NET_TYPE_DUMMY:
         case VIR_DOMAIN_NET_TYPE_LAST:
         default:
             virReportEnumRangeError(virDomainNetType, netType);
index 50338b6365639466c499f104810e4dde39d449ef..7764b1054d6fd43e51827376f9c7ca1cbb54dfed 100644 (file)
@@ -573,6 +573,7 @@ VIR_ENUM_IMPL(virDomainNet,
               "hostdev",
               "udp",
               "vdpa",
+              "dummy",
 );
 
 VIR_ENUM_IMPL(virDomainNetModel,
@@ -2495,6 +2496,7 @@ virDomainActualNetDefFree(virDomainActualNetDef *def)
     case VIR_DOMAIN_NET_TYPE_INTERNAL:
     case VIR_DOMAIN_NET_TYPE_UDP:
     case VIR_DOMAIN_NET_TYPE_VDPA:
+    case VIR_DOMAIN_NET_TYPE_DUMMY:
     case VIR_DOMAIN_NET_TYPE_LAST:
         break;
     }
@@ -2621,6 +2623,7 @@ virDomainNetDefFree(virDomainNetDef *def)
 
     case VIR_DOMAIN_NET_TYPE_ETHERNET:
     case VIR_DOMAIN_NET_TYPE_USER:
+    case VIR_DOMAIN_NET_TYPE_DUMMY:
     case VIR_DOMAIN_NET_TYPE_LAST:
         break;
     }
@@ -9312,6 +9315,7 @@ virDomainNetDefParseXML(virDomainXMLOption *xmlopt,
 
     case VIR_DOMAIN_NET_TYPE_ETHERNET:
     case VIR_DOMAIN_NET_TYPE_USER:
+    case VIR_DOMAIN_NET_TYPE_DUMMY:
     case VIR_DOMAIN_NET_TYPE_LAST:
         break;
     }
@@ -9490,6 +9494,7 @@ virDomainNetDefParseXML(virDomainXMLOption *xmlopt,
         case VIR_DOMAIN_NET_TYPE_DIRECT:
         case VIR_DOMAIN_NET_TYPE_HOSTDEV:
         case VIR_DOMAIN_NET_TYPE_UDP:
+        case VIR_DOMAIN_NET_TYPE_DUMMY:
         case VIR_DOMAIN_NET_TYPE_VDPA:
             break;
         case VIR_DOMAIN_NET_TYPE_LAST:
@@ -23681,6 +23686,7 @@ virDomainNetDefFormat(virBuffer *buf,
             break;
 
         case VIR_DOMAIN_NET_TYPE_USER:
+        case VIR_DOMAIN_NET_TYPE_DUMMY:
         case VIR_DOMAIN_NET_TYPE_LAST:
             break;
         }
@@ -28296,6 +28302,7 @@ virDomainNetGetActualVirtPortProfile(const virDomainNetDef *iface)
         case VIR_DOMAIN_NET_TYPE_INTERNAL:
         case VIR_DOMAIN_NET_TYPE_UDP:
         case VIR_DOMAIN_NET_TYPE_VDPA:
+        case VIR_DOMAIN_NET_TYPE_DUMMY:
         case VIR_DOMAIN_NET_TYPE_LAST:
             break;
         }
@@ -28309,6 +28316,7 @@ virDomainNetGetActualVirtPortProfile(const virDomainNetDef *iface)
     case VIR_DOMAIN_NET_TYPE_INTERNAL:
     case VIR_DOMAIN_NET_TYPE_UDP:
     case VIR_DOMAIN_NET_TYPE_VDPA:
+    case VIR_DOMAIN_NET_TYPE_DUMMY:
     case VIR_DOMAIN_NET_TYPE_LAST:
     default:
         return NULL;
@@ -29305,6 +29313,7 @@ virDomainNetTypeSharesHostView(const virDomainNetDef *net)
     case VIR_DOMAIN_NET_TYPE_HOSTDEV:
     case VIR_DOMAIN_NET_TYPE_UDP:
     case VIR_DOMAIN_NET_TYPE_VDPA:
+    case VIR_DOMAIN_NET_TYPE_DUMMY:
     case VIR_DOMAIN_NET_TYPE_LAST:
         break;
     }
@@ -29568,6 +29577,7 @@ virDomainNetDefActualToNetworkPort(virDomainDef *dom,
     case VIR_DOMAIN_NET_TYPE_USER:
     case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
     case VIR_DOMAIN_NET_TYPE_VDPA:
+    case VIR_DOMAIN_NET_TYPE_DUMMY:
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                        _("Unexpected network port type %s"),
                        virDomainNetTypeToString(virDomainNetGetActualType(iface)));
index 724265b6b528607aacdb4a2c96b514331ea14bb7..7b81acf5db3b8fd766929ddca81834e84f762af6 100644 (file)
@@ -939,6 +939,7 @@ typedef enum {
     VIR_DOMAIN_NET_TYPE_HOSTDEV,
     VIR_DOMAIN_NET_TYPE_UDP,
     VIR_DOMAIN_NET_TYPE_VDPA,
+    VIR_DOMAIN_NET_TYPE_DUMMY,
 
     VIR_DOMAIN_NET_TYPE_LAST
 } virDomainNetType;
index 4d9f855916d723a90a71564c4cb3b55e26baa55e..58d166901a8cd51699e79125c6842fa33412e11a 100644 (file)
@@ -295,6 +295,7 @@ bool virNetDevSupportsBandwidth(virDomainNetType type)
     case VIR_DOMAIN_NET_TYPE_INTERNAL:
     case VIR_DOMAIN_NET_TYPE_HOSTDEV:
     case VIR_DOMAIN_NET_TYPE_VDPA:
+    case VIR_DOMAIN_NET_TYPE_DUMMY:
     case VIR_DOMAIN_NET_TYPE_LAST:
         break;
     }
index c4f293a4c35ec3e612de1689e6d11d8d934d1449..5d530f957b0d71df3f5cf780fba115d27a2fe63c 100644 (file)
           </interleave>
         </group>
 
+        <group>
+          <attribute name="type">
+            <value>dummy</value>
+          </attribute>
+          <ref name="interface-options"/>
+        </group>
+
       </choice>
       <optional>
         <attribute name="trustGuestRxFilters">
index aa3d7925ec8f3d38ffc69a84143bb35d680b4242..92e4e0ee605f49d1a477dbf2d52b632f7ecc260d 100644 (file)
@@ -1391,6 +1391,7 @@ libxlMakeNic(virDomainDef *def,
         case VIR_DOMAIN_NET_TYPE_DIRECT:
         case VIR_DOMAIN_NET_TYPE_HOSTDEV:
         case VIR_DOMAIN_NET_TYPE_VDPA:
+        case VIR_DOMAIN_NET_TYPE_DUMMY:
         case VIR_DOMAIN_NET_TYPE_LAST:
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                     _("unsupported interface type %s"),
index b97ba0a199c14ec2a64c962e9f28ca939eba4b50..d90ec674e5f666a58c305802e028f0b5c767254a 100644 (file)
@@ -1677,6 +1677,7 @@ xenFormatNet(virConnectPtr conn,
     case VIR_DOMAIN_NET_TYPE_UDP:
     case VIR_DOMAIN_NET_TYPE_USER:
     case VIR_DOMAIN_NET_TYPE_VDPA:
+    case VIR_DOMAIN_NET_TYPE_DUMMY:
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported net type '%s'"),
                        virDomainNetTypeToString(net->type));
         return -1;
index a71a662ebda770028147f5b8fc85784d644a5183..c63f4b14eaf884d373b4437f5bf75f1550b3fbce 100644 (file)
@@ -422,6 +422,7 @@ static int virLXCControllerGetNICIndexes(virLXCController *ctrl)
         case VIR_DOMAIN_NET_TYPE_INTERNAL:
         case VIR_DOMAIN_NET_TYPE_HOSTDEV:
         case VIR_DOMAIN_NET_TYPE_VDPA:
+        case VIR_DOMAIN_NET_TYPE_DUMMY:
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                            _("Unsupported net type %s"),
                            virDomainNetTypeToString(actualType));
index 6b2f721178ac560532793c5ef293c314ce437129..6bd2cdd205d4fe0f68a4b933aa28a0affb4100dd 100644 (file)
@@ -3465,6 +3465,7 @@ lxcDomainAttachDeviceNetLive(virLXCDriver *driver,
     case VIR_DOMAIN_NET_TYPE_HOSTDEV:
     case VIR_DOMAIN_NET_TYPE_UDP:
     case VIR_DOMAIN_NET_TYPE_VDPA:
+    case VIR_DOMAIN_NET_TYPE_DUMMY:
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                        _("Network device type is not supported"));
         goto cleanup;
@@ -3520,6 +3521,7 @@ lxcDomainAttachDeviceNetLive(virLXCDriver *driver,
         case VIR_DOMAIN_NET_TYPE_HOSTDEV:
         case VIR_DOMAIN_NET_TYPE_UDP:
         case VIR_DOMAIN_NET_TYPE_VDPA:
+        case VIR_DOMAIN_NET_TYPE_DUMMY:
         case VIR_DOMAIN_NET_TYPE_LAST:
         default:
             /* no-op */
@@ -3962,6 +3964,7 @@ lxcDomainDetachDeviceNetLive(virDomainObj *vm,
     case VIR_DOMAIN_NET_TYPE_HOSTDEV:
     case VIR_DOMAIN_NET_TYPE_UDP:
     case VIR_DOMAIN_NET_TYPE_VDPA:
+    case VIR_DOMAIN_NET_TYPE_DUMMY:
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                        _("Only bridged veth devices can be detached"));
         goto cleanup;
index f9854ac1389dbf7530e9726a43edf532864715c2..fab23fa2b11f709044a530651dbc500c014fd42d 100644 (file)
@@ -594,9 +594,10 @@ virLXCProcessSetupInterfaces(virLXCDriver *driver,
         case VIR_DOMAIN_NET_TYPE_MCAST:
         case VIR_DOMAIN_NET_TYPE_UDP:
         case VIR_DOMAIN_NET_TYPE_INTERNAL:
-        case VIR_DOMAIN_NET_TYPE_LAST:
         case VIR_DOMAIN_NET_TYPE_HOSTDEV:
         case VIR_DOMAIN_NET_TYPE_VDPA:
+        case VIR_DOMAIN_NET_TYPE_DUMMY:
+        case VIR_DOMAIN_NET_TYPE_LAST:
             virReportError(VIR_ERR_INTERNAL_ERROR,
                            _("Unsupported network type %s"),
                            virDomainNetTypeToString(type));
@@ -1607,6 +1608,7 @@ virLXCProcessReconnectNotifyNets(virDomainDef *def)
         case VIR_DOMAIN_NET_TYPE_HOSTDEV:
         case VIR_DOMAIN_NET_TYPE_UDP:
         case VIR_DOMAIN_NET_TYPE_VDPA:
+        case VIR_DOMAIN_NET_TYPE_DUMMY:
         case VIR_DOMAIN_NET_TYPE_LAST:
             break;
         }
index 3f65b8adc794b4425ababf22270564b8e6e56e5b..ff7d432ccd2a7fa33b01301291c5b1f797bdae1f 100644 (file)
@@ -4351,6 +4351,7 @@ qemuBuildHostNetProps(virDomainNetDef *net)
 
     case VIR_DOMAIN_NET_TYPE_HOSTDEV:
         /* Should have been handled earlier via PCI/USB hotplug code. */
+    case VIR_DOMAIN_NET_TYPE_DUMMY:
     case VIR_DOMAIN_NET_TYPE_LAST:
         break;
     }
@@ -8834,6 +8835,7 @@ qemuBuildInterfaceConnect(virDomainObj *vm,
     case VIR_DOMAIN_NET_TYPE_MCAST:
     case VIR_DOMAIN_NET_TYPE_INTERNAL:
     case VIR_DOMAIN_NET_TYPE_UDP:
+    case VIR_DOMAIN_NET_TYPE_DUMMY:
     case VIR_DOMAIN_NET_TYPE_LAST:
         break;
     }
@@ -8931,6 +8933,7 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver,
     case VIR_DOMAIN_NET_TYPE_MCAST:
     case VIR_DOMAIN_NET_TYPE_INTERNAL:
     case VIR_DOMAIN_NET_TYPE_UDP:
+    case VIR_DOMAIN_NET_TYPE_DUMMY:
     case VIR_DOMAIN_NET_TYPE_LAST:
         /* nada */
         break;
@@ -8969,6 +8972,7 @@ qemuBuildInterfaceCommandLine(virQEMUDriver *driver,
     case VIR_DOMAIN_NET_TYPE_INTERNAL:
     case VIR_DOMAIN_NET_TYPE_HOSTDEV:
     case VIR_DOMAIN_NET_TYPE_VDPA:
+    case VIR_DOMAIN_NET_TYPE_DUMMY:
     case VIR_DOMAIN_NET_TYPE_LAST:
        /* These types don't use a network device on the host, but
         * instead use some other type of connection to the emulated
index 69e0c9e217c0de74f809ce965cf9aca1454fad7c..bc44687958f890e2c5fffe0854549f07dcd7831c 100644 (file)
@@ -9837,6 +9837,7 @@ qemuDomainNetSupportsMTU(virDomainNetType type)
     case VIR_DOMAIN_NET_TYPE_HOSTDEV:
     case VIR_DOMAIN_NET_TYPE_UDP:
     case VIR_DOMAIN_NET_TYPE_VDPA:
+    case VIR_DOMAIN_NET_TYPE_DUMMY:
     case VIR_DOMAIN_NET_TYPE_LAST:
         break;
     }
index 5eb370c3dfd475ac7bda4bb4663b5abd9cd1b5f7..2c2c270eb9462b2c2645195af63ab46936a17469 100644 (file)
@@ -1329,6 +1329,7 @@ qemuDomainAttachNetDevice(virQEMUDriver *driver,
     case VIR_DOMAIN_NET_TYPE_MCAST:
     case VIR_DOMAIN_NET_TYPE_INTERNAL:
     case VIR_DOMAIN_NET_TYPE_UDP:
+    case VIR_DOMAIN_NET_TYPE_DUMMY:
     case VIR_DOMAIN_NET_TYPE_LAST:
         virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
                        _("hotplug of interface type of %s is not implemented yet"),
@@ -3494,6 +3495,7 @@ qemuDomainChangeNetFilter(virDomainObj *vm,
     case VIR_DOMAIN_NET_TYPE_HOSTDEV:
     case VIR_DOMAIN_NET_TYPE_UDP:
     case VIR_DOMAIN_NET_TYPE_VDPA:
+    case VIR_DOMAIN_NET_TYPE_DUMMY:
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                        _("filters not supported on interfaces of type %s"),
                        virDomainNetTypeToString(virDomainNetGetActualType(newdev)));
@@ -3846,6 +3848,7 @@ qemuDomainChangeNet(virQEMUDriver *driver,
         case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
         case VIR_DOMAIN_NET_TYPE_HOSTDEV:
         case VIR_DOMAIN_NET_TYPE_VDPA:
+        case VIR_DOMAIN_NET_TYPE_DUMMY:
             virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
                            _("unable to change config on '%s' network type"),
                            virDomainNetTypeToString(newdev->type));
index cf8117d9961aea203cfe8b1cc8b955c362fa3384..fa34ecd5130fca3953a4fb2ca7b45ab91bb0d7e3 100644 (file)
@@ -118,6 +118,7 @@ qemuInterfaceStartDevice(virDomainNetDef *net)
     case VIR_DOMAIN_NET_TYPE_INTERNAL:
     case VIR_DOMAIN_NET_TYPE_HOSTDEV:
     case VIR_DOMAIN_NET_TYPE_VDPA:
+    case VIR_DOMAIN_NET_TYPE_DUMMY:
     case VIR_DOMAIN_NET_TYPE_LAST:
         /* these types all require no action */
         break;
@@ -204,6 +205,7 @@ qemuInterfaceStopDevice(virDomainNetDef *net)
     case VIR_DOMAIN_NET_TYPE_INTERNAL:
     case VIR_DOMAIN_NET_TYPE_HOSTDEV:
     case VIR_DOMAIN_NET_TYPE_VDPA:
+    case VIR_DOMAIN_NET_TYPE_DUMMY:
     case VIR_DOMAIN_NET_TYPE_LAST:
         /* these types all require no action */
         break;
index fbf460595bf1f43ab93997e77a06ed1ec19684c9..c6d8f50901a229ca039d78a1b73b9db400b8200f 100644 (file)
@@ -3317,6 +3317,7 @@ qemuProcessNotifyNets(virDomainDef *def)
         case VIR_DOMAIN_NET_TYPE_HOSTDEV:
         case VIR_DOMAIN_NET_TYPE_UDP:
         case VIR_DOMAIN_NET_TYPE_VDPA:
+        case VIR_DOMAIN_NET_TYPE_DUMMY:
         case VIR_DOMAIN_NET_TYPE_LAST:
             break;
         }
@@ -8343,6 +8344,7 @@ void qemuProcessStop(virQEMUDriver *driver,
         case VIR_DOMAIN_NET_TYPE_HOSTDEV:
         case VIR_DOMAIN_NET_TYPE_UDP:
         case VIR_DOMAIN_NET_TYPE_VDPA:
+        case VIR_DOMAIN_NET_TYPE_DUMMY:
         case VIR_DOMAIN_NET_TYPE_LAST:
             /* No special cleanup procedure for these types. */
             break;
index 41349829defdddd4fa5279b8f4b61cc631f33abd..8d26b43f731c712679d078c51fe84910888111c4 100644 (file)
@@ -1774,6 +1774,7 @@ qemuValidateNetSupportsCoalesce(virDomainNetType type)
     case VIR_DOMAIN_NET_TYPE_INTERNAL:
     case VIR_DOMAIN_NET_TYPE_UDP:
     case VIR_DOMAIN_NET_TYPE_VDPA:
+    case VIR_DOMAIN_NET_TYPE_DUMMY:
     case VIR_DOMAIN_NET_TYPE_LAST:
         break;
     }
index 318696fd56d5bc0d40d1609ebd7399b0c5456c04..95e2d4ae249c8b6274824e335321514f67a546ce 100644 (file)
@@ -3957,6 +3957,7 @@ virVMXFormatEthernet(virDomainNetDef *def, int controller,
     case VIR_DOMAIN_NET_TYPE_HOSTDEV:
     case VIR_DOMAIN_NET_TYPE_UDP:
     case VIR_DOMAIN_NET_TYPE_VDPA:
+    case VIR_DOMAIN_NET_TYPE_DUMMY:
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported net type '%s'"),
                        virDomainNetTypeToString(def->type));
         return -1;
index 1f995a462adbaac915339fb856d8c0dec93f970e..451f51d633d885a4147690f2304150ff256b019f 100644 (file)
@@ -1069,6 +1069,7 @@ cmdAttachInterface(vshControl *ctl, const vshCmd *cmd)
     case VIR_DOMAIN_NET_TYPE_UDP:
     case VIR_DOMAIN_NET_TYPE_VDPA:
     case VIR_DOMAIN_NET_TYPE_INTERNAL:
+    case VIR_DOMAIN_NET_TYPE_DUMMY:
     case VIR_DOMAIN_NET_TYPE_LAST:
         vshError(ctl, _("No support for %s in command 'attach-interface'"),
                  type);