
On 03/15/2011 11:51 AM, Daniel P. Berrange wrote:
This provides a new struct that contains a buffer for the RPC message header+payload, as well as a decoded copy of the message header. There is an API for applying a XDR encoding & decoding of the message headers and payloads. There are also APIs for maintaining a simple FIFO queue of message instances.
Expected usage scenarios are:
To send a message
msg = virNetMessageNew()
...fill in msg->header fields.. virNetMessageEncodeHeader(msg) ...loook at msg->header fields to determine payload filter virNetMessageEncodePayload(msg, xdrfilter, data) ...send msg->bufferLength worth of data from buffer
To receive a message
msg = virNetMessageNew() ...read VIR_NET_MESSAGE_LEN_MAX of data into buffer virNetMessageDecodeLength(msg) ...read msg->bufferLength-msg->bufferOffset of data into buffer virNetMessageDecodeHeader(msg) ...look at msg->header fields to determine payload filter virNetMessageDecodePayload(msg, xdrfilter, data) ...run payload processor
+++ b/src/Makefile.am @@ -1202,6 +1202,7 @@ EXTRA_DIST += $(LIBVIRT_QEMU_SYMBOL_FILE) noinst_LTLIBRARIES += libvirt-net-rpc.la
libvirt_net_rpc_la_SOURCES = \ + rpc/virnetmessage.h rpc/virnetmessage.c \ rpc/virnetprotocol.h rpc/virnetprotocol.c
Huh? There's no src/rpc in current libvirt.git. This looks like 2/15 in the v1 posting. Did you forget to submit the original 1/15 as a prerequisite patch? http://www.redhat.com/archives/libvir-list/2010-December/msg00617.html
libvirt_net_rpc_la_CFLAGS = \ $(AM_CFLAGS) diff --git a/src/rpc/virnetmessage.c b/src/rpc/virnetmessage.c new file mode 100644 index 0000000..4c226d2 --- /dev/null +++ b/src/rpc/virnetmessage.c @@ -0,0 +1,365 @@ +/* + * virnetmessage.h: basic RPC message encoding/decoding + * + * Copyright (C) 2010 Red Hat, Inc.
Welcome to 2011. :)
+/* + * @msg: the outgoing message, whose header to encode + * + * Encodes the length word and header of the message, setting the
Hmm, you still missed my spacing comment from http://www.redhat.com/archives/libvir-list/2010-December/msg00657.html s/the message/the message/
diff --git a/src/rpc/virnetmessage.h b/src/rpc/virnetmessage.h new file mode 100644 index 0000000..9a92c0b --- /dev/null +++ b/src/rpc/virnetmessage.h @@ -0,0 +1,70 @@ +/* + * virnetmessage.h: basic RPC message encoding/decoding + * + * Copyright (C) 2010 Red Hat, Inc.
2011
+ +struct _virNetMessage { + char buffer[VIR_NET_MESSAGE_MAX + VIR_NET_MESSAGE_LEN_MAX];
Is it worth a comment warning that this struct should never be stack-allocated?
+void virNetMessageFree(virNetMessagePtr msg);
cfg.mk should list this as a free-like function.
+ +virNetMessagePtr virNetMessageQueueServe(virNetMessagePtr *queue);
It's worth adding attributes: ATTRIBUTE_NONNULL(1)
+void virNetMessageQueuePush(virNetMessagePtr *queue, + virNetMessagePtr msg); ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
+ +int virNetMessageEncodeHeader(virNetMessagePtr msg); ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK
+int virNetMessageDecodeLength(virNetMessagePtr msg); ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK
+int virNetMessageDecodeHeader(virNetMessagePtr msg); ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK
+ +int virNetMessageEncodePayload(virNetMessagePtr msg, + xdrproc_t filter, + void *data); ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK
+int virNetMessageDecodePayload(virNetMessagePtr msg, + xdrproc_t filter, + void *data); ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK
+ +int virNetMessageEncodePayloadRaw(virNetMessagePtr msg, + const char *buf, + size_t len); ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK
+ +void virNetMessageSaveError(virNetMessageErrorPtr rerr); ATTRIBUTE_NONNULL(1)
-- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org