[libvirt] [PATCH 06/14] Define a wire protocol for talking to the virtlockd daemon

Daniel P. Berrange berrange at redhat.com
Tue Dec 11 20:41:40 UTC 2012


From: "Daniel P. Berrange" <berrange at redhat.com>

The virtlockd daemon will be responsible for managing locks
on virtual machines. Communication will be via the standard
RPC infrastructure. This provides the XDR protocol definition

* src/locking/lock_protocol.x: Wire protocol for virtlockd
* src/Makefile.am: Include lock_protocol.[ch] in virtlockd

Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
---
 .gitignore                  |  1 +
 cfg.mk                      |  3 ++
 src/Makefile.am             | 14 ++++++-
 src/locking/lock_protocol.x | 95 +++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 112 insertions(+), 1 deletion(-)
 create mode 100644 src/locking/lock_protocol.x

diff --git a/.gitignore b/.gitignore
index 1e3a624..449a1c6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -108,6 +108,7 @@
 /src/libvirt_*helper
 /src/libvirt_*probes.h
 /src/libvirt_lxc
+/src/locking/lock_protocol.[ch]
 /src/locking/qemu-sanlock.conf
 /src/locking/test_libvirt_sanlock.aug
 /src/lxc/lxc_controller_dispatch.h
diff --git a/cfg.mk b/cfg.mk
index 95a1d3a..1fe007e 100644
--- a/cfg.mk
+++ b/cfg.mk
@@ -827,3 +827,6 @@ exclude_file_name_regexp--sc_unmarked_diagnostics = \
   ^(docs/apibuild.py|tests/virt-aa-helper-test)$$
 
 exclude_file_name_regexp--sc_size_of_brackets = cfg.mk
+
+exclude_file_name_regexp--sc_correct_id_types = \
+  (^src/locking/lock_protocol.x$$)
diff --git a/src/Makefile.am b/src/Makefile.am
index 6a66efd..2023f88 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -148,6 +148,15 @@ LOCK_DRIVER_SANLOCK_SOURCES = \
 LOCK_DRIVER_SANLOCK_HELPER_SOURCES = \
 		locking/sanlock_helper.c
 
+LOCK_PROTOCOL_GENERATED = \
+		locking/lock_protocol.h \
+		locking/lock_protocol.c \
+		$(NULL)
+
+EXTRA_DIST += locking/lock_protocol.x
+BUILT_SOURCES += $(LOCK_PROTOCOL_GENERATED)
+MAINTAINERCLEANFILES += $(LOCK_PROTOCOL_GENERATED)
+
 LOCK_DAEMON_SOURCES = \
 		locking/lock_daemon.h \
 		locking/lock_daemon.c \
@@ -1518,7 +1527,10 @@ EXTRA_DIST += $(LIBVIRT_QEMU_SYMBOL_FILE)
 if WITH_LIBVIRTD
 sbin_PROGRAMS = virtlockd
 
-virtlockd_SOURCES = $(LOCK_DAEMON_SOURCES)
+virtlockd_SOURCES = \
+		$(LOCK_DAEMON_SOURCES) \
+		$(LOCK_PROTOCOL_GENERATED) \
+		$(NULL)
 virtlockd_CFLAGS = \
 		$(AM_CFLAGS) \
 		$(NULL)
diff --git a/src/locking/lock_protocol.x b/src/locking/lock_protocol.x
new file mode 100644
index 0000000..5f40f9a
--- /dev/null
+++ b/src/locking/lock_protocol.x
@@ -0,0 +1,95 @@
+/* -*- c -*-
+ */
+
+%#include "internal.h"
+
+typedef opaque virLockSpaceProtocolUUID[VIR_UUID_BUFLEN];
+
+/* Length of long, but not unbounded, strings.
+ * This is an arbitrary limit designed to stop the decoder from trying
+ * to allocate unbounded amounts of memory when fed with a bad message.
+ */
+const VIR_LOCK_SPACE_PROTOCOL_STRING_MAX = 65536;
+
+/* A long string, which may NOT be NULL. */
+typedef string virLockSpaceProtocolNonNullString<VIR_LOCK_SPACE_PROTOCOL_STRING_MAX>;
+
+/* A long string, which may be NULL. */
+typedef virLockSpaceProtocolNonNullString *virLockSpaceProtocolString;
+
+struct virLockSpaceProtocolOwner {
+    virLockSpaceProtocolUUID uuid;
+    virLockSpaceProtocolNonNullString name;
+    unsigned int id;
+    unsigned int pid;
+};
+
+struct virLockSpaceProtocolRegisterArgs {
+    virLockSpaceProtocolOwner owner;
+    unsigned int flags;
+};
+
+struct virLockSpaceProtocolRestrictArgs {
+    unsigned int flags;
+};
+
+struct virLockSpaceProtocolNewArgs {
+    virLockSpaceProtocolNonNullString path;
+    unsigned int flags;
+};
+
+struct virLockSpaceProtocolCreateResourceArgs {
+    virLockSpaceProtocolNonNullString path;
+    virLockSpaceProtocolNonNullString name;
+    unsigned int flags;
+};
+
+struct virLockSpaceProtocolDeleteResourceArgs {
+    virLockSpaceProtocolNonNullString path;
+    virLockSpaceProtocolNonNullString name;
+    unsigned int flags;
+};
+
+enum virLockSpaceProtocolAcquireResourceFlags {
+    VIR_LOCK_SPACE_PROTOCOL_ACQUIRE_RESOURCE_SHARED     = 1,
+    VIR_LOCK_SPACE_PROTOCOL_ACQUIRE_RESOURCE_AUTOCREATE = 2
+};
+
+struct virLockSpaceProtocolAcquireResourceArgs {
+    virLockSpaceProtocolNonNullString path;
+    virLockSpaceProtocolNonNullString name;
+    unsigned int flags;
+};
+
+struct virLockSpaceProtocolReleaseResourceArgs {
+    virLockSpaceProtocolNonNullString path;
+    virLockSpaceProtocolNonNullString name;
+    unsigned int flags;
+};
+
+struct virLockSpaceProtocolCreateLockSpaceArgs {
+    virLockSpaceProtocolNonNullString path;
+};
+
+
+/* Define the program number, protocol version and procedure numbers here. */
+const VIR_LOCK_SPACE_PROTOCOL_PROGRAM = 0xEA7BEEF;
+const VIR_LOCK_SPACE_PROTOCOL_PROGRAM_VERSION = 1;
+
+enum virLockSpaceProtocolProcedure {
+    /* Each function must have a two-word comment.  The first word is
+     * whether remote_generator.pl handles daemon, the second whether
+     * it handles src/remote.  Additional flags can be specified after a
+     * pipe.
+     */
+    VIR_LOCK_SPACE_PROTOCOL_PROC_REGISTER = 1, /* skipgen skipgen */
+    VIR_LOCK_SPACE_PROTOCOL_PROC_RESTRICT = 2, /* skipgen skipgen */
+    VIR_LOCK_SPACE_PROTOCOL_PROC_NEW = 3, /* skipgen skipgen */
+    VIR_LOCK_SPACE_PROTOCOL_PROC_CREATE_RESOURCE = 4, /* skipgen skipgen */
+    VIR_LOCK_SPACE_PROTOCOL_PROC_DELETE_RESOURCE = 5, /* skipgen skipgen */
+
+    VIR_LOCK_SPACE_PROTOCOL_PROC_ACQUIRE_RESOURCE = 6, /* skipgen skipgen */
+    VIR_LOCK_SPACE_PROTOCOL_PROC_RELEASE_RESOURCE = 7, /* skipgen skipgen */
+
+    VIR_LOCK_SPACE_PROTOCOL_PROC_CREATE_LOCKSPACE = 8 /* skipgen skipgen */
+};
-- 
1.7.11.7




More information about the libvir-list mailing list