[libvirt] [PATCH 01/10] Provide a simple object for encoding/decoding RPC messages
Eric Blake
eblake at redhat.com
Tue Mar 15 19:34:53 UTC 2011
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 at redhat.com +1-801-349-2682
Libvirt virtualization library http://libvirt.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 619 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20110315/be03712f/attachment-0001.sig>
More information about the libvir-list
mailing list