[PATCH 2/5] ch: add net device alias assignment

Stefan Kober posted 5 patches 3 weeks ago
[PATCH 2/5] ch: add net device alias assignment
Posted by Stefan Kober 3 weeks ago
On-behalf-of: SAP stefan.kober@sap.com
Signed-off-by: Stefan Kober <stefan.kober@cyberus-technology.de>
---
 src/ch/ch_alias.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
 src/ch/ch_alias.h |  3 +++
 2 files changed, 50 insertions(+)

diff --git a/src/ch/ch_alias.c b/src/ch/ch_alias.c
index bdf8452a3c..dad297b20c 100644
--- a/src/ch/ch_alias.c
+++ b/src/ch/ch_alias.c
@@ -18,11 +18,13 @@
 
 #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;
diff --git a/src/ch/ch_alias.h b/src/ch/ch_alias.h
index 81e20c27c7..b9a12fac11 100644
--- a/src/ch/ch_alias.h
+++ b/src/ch/ch_alias.h
@@ -23,5 +23,8 @@
 int
 chAssignDeviceDiskAlias(virDomainDiskDef *disk);
 
+void
+chAssignDeviceNetAlias(virDomainDef *def, virDomainNetDef *net);
+
 int
 chAssignDeviceAliases(virDomainDef *def);
-- 
2.51.0