To allow new mandatory migration cookie data to be introduced, add support for checking supported feature flags when parsing migration cookie. * src/qemu/qemu_migration.c: Feature flag checking in migration cookie parsing --- src/qemu/qemu_migration.c | 56 ++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 55 insertions(+), 1 deletions(-) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 4d7bc38..f69bbfd 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -48,7 +48,18 @@ #define timeval_to_ms(tv) (((tv).tv_sec * 1000ull) + ((tv).tv_usec / 1000)) enum qemuMigrationCookieFlags { - QEMU_MIGRATION_COOKIE_GRAPHICS = (1 << 0), + QEMU_MIGRATION_COOKIE_FLAG_GRAPHICS, + + QEMU_MIGRATION_COOKIE_FLAG_LAST +}; + +VIR_ENUM_DECL(qemuMigrationCookieFlag); +VIR_ENUM_IMPL(qemuMigrationCookieFlag, + QEMU_MIGRATION_COOKIE_FLAG_LAST, + "graphics"); + +enum qemuMigrationCookieFeatures { + QEMU_MIGRATION_COOKIE_GRAPHICS = (1 << QEMU_MIGRATION_COOKIE_FLAG_GRAPHICS), }; typedef struct _qemuMigrationCookieGraphics qemuMigrationCookieGraphics; @@ -65,6 +76,7 @@ typedef struct _qemuMigrationCookie qemuMigrationCookie; typedef qemuMigrationCookie *qemuMigrationCookiePtr; struct _qemuMigrationCookie { int flags; + int flagsMandatory; /* Host properties */ unsigned char hostuuid[VIR_UUID_BUFLEN]; @@ -286,6 +298,7 @@ static void qemuMigrationCookieXMLFormat(virBufferPtr buf, { char uuidstr[VIR_UUID_STRING_BUFLEN]; char hostuuidstr[VIR_UUID_STRING_BUFLEN]; + int i; virUUIDFormat(mig->uuid, uuidstr); virUUIDFormat(mig->hostuuid, hostuuidstr); @@ -296,6 +309,12 @@ static void qemuMigrationCookieXMLFormat(virBufferPtr buf, virBufferEscapeString(buf, " <hostname>%s</hostname>\n", mig->hostname); virBufferAsprintf(buf, " <hostuuid>%s</hostuuid>\n", hostuuidstr); + for (i = 0 ; i < QEMU_MIGRATION_COOKIE_FLAG_LAST ; i++) { + if (mig->flagsMandatory & (1 << i)) + virBufferAsprintf(buf, " <feature name='%s'/>", + qemuMigrationCookieFlagTypeToString(i)); + } + if ((mig->flags & QEMU_MIGRATION_COOKIE_GRAPHICS) && mig->graphics) qemuMigrationCookieGraphicsXMLFormat(buf, mig->graphics); @@ -377,6 +396,8 @@ qemuMigrationCookieXMLParse(qemuMigrationCookiePtr mig, { char uuidstr[VIR_UUID_STRING_BUFLEN]; char *tmp; + xmlNodePtr *nodes = NULL; + int i, n; /* We don't store the uuid, name, hostname, or hostuuid * values. We just compare them to local data to do some @@ -440,6 +461,38 @@ qemuMigrationCookieXMLParse(qemuMigrationCookiePtr mig, } VIR_FREE(tmp); + /* Check to ensure all mandatory features from XML are also + * present in 'flags' */ + if ((n = virXPathNodeSet("./features", ctxt, &nodes)) < 0) + goto error; + + for (i = 0 ; i < n ; i++) { + int val; + char *str = virXMLPropString(nodes[i], "name"); + if (!str) { + qemuReportError(VIR_ERR_INTERNAL_ERROR, + "%s", _("missing feature name")); + goto error; + } + + if ((val = qemuMigrationCookieFlagTypeFromString(str)) < 0) { + qemuReportError(VIR_ERR_INTERNAL_ERROR, + _("Unknown migration cookie feature %s"), + str); + VIR_FREE(str); + goto error; + } + + if ((flags & (1 << val)) == 0) { + qemuReportError(VIR_ERR_INTERNAL_ERROR, + _("Unsupported migration cookie feature %s"), + str); + VIR_FREE(str); + } + VIR_FREE(str); + } + VIR_FREE(nodes); + if ((flags & QEMU_MIGRATION_COOKIE_GRAPHICS) && virXPathBoolean("count(./graphics) > 0", ctxt) && (!(mig->graphics = qemuMigrationCookieGraphicsXMLParse(ctxt)))) @@ -449,6 +502,7 @@ qemuMigrationCookieXMLParse(qemuMigrationCookiePtr mig, error: VIR_FREE(tmp); + VIR_FREE(nodes); return -1; } -- 1.7.4.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list