]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
ch: add net device alias assignment
authorStefan Kober <stefan.kober@cyberus-technology.de>
Mon, 6 Oct 2025 15:18:08 +0000 (17:18 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Thu, 23 Oct 2025 09:25:28 +0000 (11:25 +0200)
On-behalf-of: SAP stefan.kober@sap.com
Signed-off-by: Stefan Kober <stefan.kober@cyberus-technology.de>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/ch/ch_alias.c
src/ch/ch_alias.h

index bdf8452a3ce2e847f8b5fa335df1d8412f5eb118..dad297b20c38764a7332b952fb73bcf93741349f 100644 (file)
 
 #include <config.h>
 
+#include "virstring.h"
 #include "virutil.h"
 
 #include "ch_alias.h"
 
 #define VIR_FROM_THIS VIR_FROM_CH
+#define CH_NET_ID_PREFIX "net"
 
 int chAssignDeviceDiskAlias(virDomainDiskDef *disk)
 {
@@ -47,6 +49,47 @@ int chAssignDeviceDiskAlias(virDomainDiskDef *disk)
     return 0;
 }
 
+/**
+ * Extract the index number of some device alias
+ */
+static
+int chDomainDeviceAliasIndex(const virDomainDeviceInfo *info,
+                             const char *prefix)
+{
+    int idx;
+
+    if (!info->alias)
+        return -1;
+    if (!STRPREFIX(info->alias, prefix))
+        return -1;
+
+    if (virStrToLong_i(info->alias + strlen(prefix), NULL, 10, &idx) < 0)
+        return -1;
+
+    return idx;
+}
+
+void chAssignDeviceNetAlias(virDomainDef *def, virDomainNetDef *net)
+{
+    size_t idx = 0;
+    size_t i;
+
+    if (net->info.alias) {
+        return;
+    }
+
+    for (i = 0; i < def->nnets; i++) {
+        int thisidx;
+
+        if ((thisidx = chDomainDeviceAliasIndex(&def->nets[i]->info, CH_NET_ID_PREFIX)) < 0)
+            continue;
+        if (thisidx >= idx)
+            idx = thisidx + 1;
+    }
+
+    net->info.alias = g_strdup_printf("%s%lu", CH_NET_ID_PREFIX, idx);
+}
+
 int chAssignDeviceAliases(virDomainDef *def)
 {
     size_t i;
@@ -56,6 +99,10 @@ int chAssignDeviceAliases(virDomainDef *def)
             return -1;
     }
 
+    for (i = 0; i < def->nnets; i++) {
+        chAssignDeviceNetAlias(def, def->nets[i]);
+    }
+
     /* TODO: handle other devices */
 
     return 0;
index 81e20c27c73beb6ad2a430c53aee94ca4da3cd3e..b9a12fac11b9abddd503569f302471fb0b55946f 100644 (file)
@@ -23,5 +23,8 @@
 int
 chAssignDeviceDiskAlias(virDomainDiskDef *disk);
 
+void
+chAssignDeviceNetAlias(virDomainDef *def, virDomainNetDef *net);
+
 int
 chAssignDeviceAliases(virDomainDef *def);