]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Emit NIC_MAC_CHANGE event
authorMichal Privoznik <mprivozn@redhat.com>
Tue, 27 Jun 2023 11:32:55 +0000 (13:32 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 25 Mar 2025 10:49:30 +0000 (11:49 +0100)
So far, we only process NIC_RX_FILTER_CHANGED event when the
corresponding device has 'trustGuestRxFilters' enabled. And the
event is emitted only for virtio model. IOW, this is fairly
limited situation and other scenarios don't emit any event (e.g.
change of MAC address on a PCI passthrough device).

Resolves: https://issues.redhat.com/browse/RHEL-7035
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
src/qemu/qemu_domain.c
src/qemu/qemu_domain.h
src/qemu/qemu_driver.c
src/qemu/qemu_process.c

index 7f89b193f9dcf98c6c349e783bd47c25cb8f4b92..e45eef47876a12defa21acf6f5c2d8d1b22c5d6d 100644 (file)
@@ -11088,7 +11088,8 @@ syncNicRxFilterMulticast(char *ifname,
 int
 qemuDomainSyncRxFilter(virDomainObj *vm,
                        virDomainNetDef *def,
-                       virDomainAsyncJob asyncJob)
+                       virDomainAsyncJob asyncJob,
+                       virObjectEvent **event)
 {
     qemuDomainObjPrivate *priv = vm->privateData;
     g_autoptr(virNetDevRxFilter) guestFilter = NULL;
@@ -11145,6 +11146,19 @@ qemuDomainSyncRxFilter(virDomainObj *vm,
         oldMac = &def->mac;
 
     if (virMacAddrCmp(oldMac, &guestFilter->mac)) {
+        if (event) {
+            char oldMACStr[VIR_MAC_STRING_BUFLEN] = { 0 };
+            char newMACStr[VIR_MAC_STRING_BUFLEN] = { 0 };
+
+            virMacAddrFormat(oldMac, oldMACStr);
+            virMacAddrFormat(&guestFilter->mac, newMACStr);
+
+            *event = virDomainEventNICMACChangeNewFromObj(vm,
+                                                          def->info.alias,
+                                                          oldMACStr,
+                                                          newMACStr);
+        }
+
         /* Reflect changed MAC address in the domain XML. */
         if (virMacAddrCmp(&def->mac, &guestFilter->mac)) {
             if (!def->currentAddress) {
index e3b206763c9bd8c5da6dc0f64c4f5751de5e1f96..70e1fb187fa979f9fcd62323dd6b943c3bd18431 100644 (file)
@@ -1132,7 +1132,8 @@ qemuDomainRefreshStatsSchema(virDomainObj *dom);
 int
 qemuDomainSyncRxFilter(virDomainObj *vm,
                        virDomainNetDef *def,
-                       virDomainAsyncJob asyncJob);
+                       virDomainAsyncJob asyncJob,
+                       virObjectEvent **event);
 
 int
 qemuDomainSchedCoreStart(virQEMUDriverConfig *cfg,
index 20b94ccdf0e3b0a4a3288a7730bd899e352c829f..1be32c01b1fcfc1348fd4b6f68749c2db9580567 100644 (file)
@@ -3679,9 +3679,11 @@ processNetdevStreamDisconnectedEvent(virDomainObj *vm,
 
 
 static void
-processNicRxFilterChangedEvent(virDomainObj *vm,
+processNicRxFilterChangedEvent(virQEMUDriver *driver,
+                               virDomainObj *vm,
                                const char *devAlias)
 {
+    virObjectEvent *event = NULL;
     virDomainDeviceDef dev;
     virDomainNetDef *def;
 
@@ -3726,11 +3728,12 @@ processNicRxFilterChangedEvent(virDomainObj *vm,
     VIR_DEBUG("process NIC_RX_FILTER_CHANGED event for network "
               "device %s in domain %s", def->info.alias, vm->def->name);
 
-    if (qemuDomainSyncRxFilter(vm, def, VIR_ASYNC_JOB_NONE) < 0)
+    if (qemuDomainSyncRxFilter(vm, def, VIR_ASYNC_JOB_NONE, &event) < 0)
         goto endjob;
 
  endjob:
     virDomainObjEndJob(vm);
+    virObjectEventStateQueue(driver->domainEventState, event);
 }
 
 
@@ -4074,7 +4077,7 @@ static void qemuProcessEventHandler(void *data, void *opaque)
         processNetdevStreamDisconnectedEvent(vm, processEvent->data);
         break;
     case QEMU_PROCESS_EVENT_NIC_RX_FILTER_CHANGED:
-        processNicRxFilterChangedEvent(vm, processEvent->data);
+        processNicRxFilterChangedEvent(driver, vm, processEvent->data);
         break;
     case QEMU_PROCESS_EVENT_SERIAL_CHANGED:
         processSerialChangedEvent(driver, vm, processEvent->data,
index c3eeadfc3b6420409c59557a8846fe8941647303..842f55943924578e2ddf7864826fcb87e2237a1c 100644 (file)
@@ -8362,7 +8362,7 @@ qemuProcessRefreshRxFilters(virDomainObj *vm,
             continue;
         }
 
-        if (qemuDomainSyncRxFilter(vm, def, asyncJob) < 0)
+        if (qemuDomainSyncRxFilter(vm, def, asyncJob, NULL) < 0)
             return -1;
     }