On 09.12.2016 13:24, Mehdi Abaakouk wrote:
This change adds a new helper function that
return a ifname from the vhostuser unix-socket path but only
if the interface is managed by openvswitch
This new function is issue to autodetect the ifname for openvswitch
managed vhostuser interface.
---
src/conf/domain_conf.c | 5 +++++
src/libvirt_private.syms | 1 +
src/util/virnetdevopenvswitch.c | 41 +++++++++++++++++++++++++++++++++++++++++
src/util/virnetdevopenvswitch.h | 3 +++
4 files changed, 50 insertions(+)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 7715cad..178208e 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -55,6 +55,7 @@
#include "virtpm.h"
#include "virstring.h"
#include "virnetdev.h"
+#include "virnetdevopenvswitch.h"
#include "virhostdev.h"
#define VIR_FROM_THIS VIR_FROM_DOMAIN
@@ -9582,6 +9583,10 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
def->data.vhostuser->type = VIR_DOMAIN_CHR_TYPE_UNIX;
def->data.vhostuser->data.nix.path = vhostuser_path;
+
+ if (!ifname)
+ ifname = virNetDevOpenvswitchGetVhostuserIfname(vhostuser_path);
This should go into post parse callback. I mean, I know that we still do
fill out some defaults in parse phase, but we shouldn't really. Once
domain XML is parsed, post parse callbacks are called and it their jobs
to fill in missing pieces (or chose some sane defaults).
qemuDomainDefPostParse() looks like a good candidate.
+
vhostuser_path = NULL;
if (STREQ(vhostuser_mode, "server")) {
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 867acdb..1b3d8d4 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2047,6 +2047,7 @@ virNetDevMidonetUnbindPort;
# util/virnetdevopenvswitch.h
virNetDevOpenvswitchAddPort;
virNetDevOpenvswitchGetMigrateData;
+virNetDevOpenvswitchGetVhostuserIfname;
virNetDevOpenvswitchInterfaceStats;
virNetDevOpenvswitchRemovePort;
virNetDevOpenvswitchSetMigrateData;
diff --git a/src/util/virnetdevopenvswitch.c b/src/util/virnetdevopenvswitch.c
index f003b3b..94b730b 100644
--- a/src/util/virnetdevopenvswitch.c
+++ b/src/util/virnetdevopenvswitch.c
@@ -377,3 +377,44 @@ virNetDevOpenvswitchInterfaceStats(const char *ifname,
virCommandFree(cmd);
return ret;
}
+
+/**
+ * virNetDevOpenvswitchVhostuserGetIfname:
+ * @path: the path of the unix socket
+ *
+ * Retreives the ovs ifname from vhostuser unix socket path
+ *
+ * Returns a new string which must be deallocated by caller or NULL
+ */
+char *
+virNetDevOpenvswitchGetVhostuserIfname(const char *path)
+{
+ virCommandPtr cmd = NULL;
+ char *ifname = NULL;
+ char **tokens = NULL;
+ size_t ntokens = 0;
+
+ /* Openvswitch vhostuser path are hardcoded to
+ * /<runstatedir>/openvswitch/<ifname>
+ * for example: /var/run/openvswitch/dpdkvhostuser0
+ *
+ * so we pick the filename and check it's a openvswitch interface
+ */
+ if ((tokens = virStringSplitCount(path, "/", 0, &ntokens))) {
+ if (VIR_STRDUP(ifname, tokens[ntokens - 1]) < 0)
+ goto cleanup;
+ }
+ if (ifname != NULL) {
+ cmd = virCommandNewArgList(OVSVSCTL, "--timeout=5", "get",
"Interface",
+ ifname, "name", NULL);
+ if (virCommandRun(cmd, NULL) < 0) {
+ /* it's not a openvswitch vhostuser interface */
+ VIR_FREE(ifname);
+ }
+ }
+
+ cleanup:
+ virStringListFreeCount(tokens, ntokens);
+ return ifname;
The @cmd needs to be freed.
+
+}
diff --git a/src/util/virnetdevopenvswitch.h b/src/util/virnetdevopenvswitch.h
index 0f9e1df..fe86e28 100644
--- a/src/util/virnetdevopenvswitch.h
+++ b/src/util/virnetdevopenvswitch.h
@@ -52,4 +52,7 @@ int virNetDevOpenvswitchInterfaceStats(const char *ifname,
virDomainInterfaceStatsPtr stats)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
+char *virNetDevOpenvswitchGetVhostuserIfname(const char *path)
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
+
#endif /* __VIR_NETDEV_OPENVSWITCH_H__ */
Michal