On 10/01/2012 11:18 AM, Kyle Mestery wrote: > Add utility functions for Open vSwitch to both save > per-port data before a live migration, and restore the > per-port data after a live migration. > > Signed-off-by: Kyle Mestery <kmestery@xxxxxxxxx> > --- > src/libvirt_private.syms | 2 ++ > src/util/virnetdevopenvswitch.c | 70 +++++++++++++++++++++++++++++++++++++++++ > src/util/virnetdevopenvswitch.h | 6 ++++ > 3 files changed, 78 insertions(+) > > diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms > index eebc52a..449744e 100644 > --- a/src/libvirt_private.syms > +++ b/src/libvirt_private.syms > @@ -1477,7 +1477,9 @@ virNetDevMacVLanVPortProfileRegisterCallback; > > # virnetdevopenvswitch.h > virNetDevOpenvswitchAddPort; > +virNetDevOpenvswitchGetMigrateData; > virNetDevOpenvswitchRemovePort; > +virNetDevOpenvswitchSetMigrateData; > > > # virnetdevtap.h > diff --git a/src/util/virnetdevopenvswitch.c b/src/util/virnetdevopenvswitch.c > index a6993b6..841f693 100644 > --- a/src/util/virnetdevopenvswitch.c > +++ b/src/util/virnetdevopenvswitch.c > @@ -179,3 +179,73 @@ int virNetDevOpenvswitchRemovePort(const char *brname ATTRIBUTE_UNUSED, const ch > virCommandFree(cmd); > return ret; > } > + > +/** > + * virNetDevOpenvswitchGetMigrateData: > + * @migrate: a pointer to store the data into, allocated by this function > + * @ifname: name of the interface for which data is being migrated > + * > + * Allocates data to be migrated specific to Open vSwitch > + * > + * Returns 0 in case of success or -1 in case of failure > + */ > +int virNetDevOpenvswitchGetMigrateData(char **migrate, const char *ifname) > +{ > + virCommandPtr cmd = NULL; > + int ret = 0; > + > + cmd = virCommandNewArgList(OVSVSCTL, "--timeout=5", "get", "Interface", > + ifname, "external_ids:PortData", NULL); > + > + virCommandSetOutputBuffer(cmd, migrate); > + > + /* Run the command */ > + if (virCommandRun(cmd, NULL) < 0) { > + virReportSystemError(VIR_ERR_INTERNAL_ERROR, > + _("Unable to run command to get OVS port data for " > + "interface %s"), ifname); > + ret = -1; > + goto error; > + } > + > + /* Wipeout the newline */ > + (*migrate)[strlen(*migrate) - 1] = '\0'; > + > +error: > + return ret; > +} > + > +/** > + * virNetDevOpenvswitchSetMigrateData: > + * @migrate: the data which was transferred during migration > + * @ifname: the name of the interface the data is associated with > + * > + * Repopulates OVS per-port data on destination host > + * > + * Returns 0 in case of success or -1 in case of failure > + */ > +int virNetDevOpenvswitchSetMigrateData(char *migrate, const char *ifname) > +{ > + virCommandPtr cmd = NULL; > + int ret = 0; > + virBufferPtr buf; > + > + if (VIR_ALLOC(buf) < 0) { > + ret = -1; > + goto error; > + } > + > + virBufferAsprintf(buf, "external_ids:PortData=%s", migrate); > + > + cmd = virCommandNewArgList(OVSVSCTL, "--timeout=5", "set", "Interface", ifname, > + virBufferCurrentContent(buf), NULL); > + /* Run the command */ > + if ((ret = virCommandRun(cmd, NULL)) < 0) { > + virReportSystemError(VIR_ERR_INTERNAL_ERROR, > + _("Unable to run command to set OVS port data for " > + "interface %s"), ifname); > + } > + > +error: > + return ret; > +} > diff --git a/src/util/virnetdevopenvswitch.h b/src/util/virnetdevopenvswitch.h > index 7e5b618..147cd6f 100644 > --- a/src/util/virnetdevopenvswitch.h > +++ b/src/util/virnetdevopenvswitch.h > @@ -42,4 +42,10 @@ int virNetDevOpenvswitchAddPort(const char *brname, > int virNetDevOpenvswitchRemovePort(const char *brname, const char *ifname) > ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK; > > +int virNetDevOpenvswitchGetMigrateData(char **migrate, const char *ifname) > + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK; > + > +int virNetDevOpenvswitchSetMigrateData(char *migrate, const char *ifname) > + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK; > + > #endif /* __VIR_NETDEV_OPENVSWITCH_H__ */ ACK, but I'm going to resubmit it rebased on the new 1/3. -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list