[libvirt] [PATCH 08/10] Qemu remote protocol.

Eric Blake eblake at redhat.com
Wed Apr 21 18:26:55 UTC 2010


On 04/21/2010 10:01 AM, Chris Lalancette wrote:
> Since we are adding a new "per-hypervisor" protocol, we
> make it so that the qemu remote protocol uses a new
> PROTOCOL and PROGRAM number.  This allows us to easily
> distinguish it from the normal REMOTE protocol.
> 
> This necessitates changing the proc in remote_message_header
> from a "remote_procedure" to an "unsigned", which should
> be the same size (and thus preserve the on-wire protocol).

>  REMOTE_PROTOCOL = $(top_srcdir)/src/remote/remote_protocol.x
> +QEMU_PROTOCOL = $(top_srcdir)/src/remote/qemu_protocol.x
>  
>  remote_dispatch_prototypes.h: $(srcdir)/remote_generate_stubs.pl $(REMOTE_PROTOCOL)
> -	$(AM_V_GEN)perl -w $(srcdir)/remote_generate_stubs.pl -p $(REMOTE_PROTOCOL) > $@
> +	$(AM_V_GEN)perl -w $(srcdir)/remote_generate_stubs.pl -c -p remote $(REMOTE_PROTOCOL) > $@
>  
>  remote_dispatch_table.h: $(srcdir)/remote_generate_stubs.pl $(REMOTE_PROTOCOL)
> -	$(AM_V_GEN)perl -w $(srcdir)/remote_generate_stubs.pl -t $(REMOTE_PROTOCOL) > $@
> +	$(AM_V_GEN)perl -w $(srcdir)/remote_generate_stubs.pl -c -t remote $(REMOTE_PROTOCOL) > $@
>  
>  remote_dispatch_args.h: $(srcdir)/remote_generate_stubs.pl $(REMOTE_PROTOCOL)
> -	$(AM_V_GEN)perl -w $(srcdir)/remote_generate_stubs.pl -a $(REMOTE_PROTOCOL) > $@
> +	$(AM_V_GEN)perl -w $(srcdir)/remote_generate_stubs.pl -c -a remote $(REMOTE_PROTOCOL) > $@
>  
>  remote_dispatch_ret.h: $(srcdir)/remote_generate_stubs.pl $(REMOTE_PROTOCOL)
> -	$(AM_V_GEN)perl -w $(srcdir)/remote_generate_stubs.pl -r $(REMOTE_PROTOCOL) > $@
> +	$(AM_V_GEN)perl -w $(srcdir)/remote_generate_stubs.pl -c -r remote $(REMOTE_PROTOCOL) > $@
> +
> +qemu_dispatch_prototypes.h: $(srcdir)/remote_generate_stubs.pl $(QEMU_PROTOCOL)
> +	$(AM_V_GEN)perl -w $(srcdir)/remote_generate_stubs.pl -p qemu $(QEMU_PROTOCOL) > $@

Reading through the patch in linear order, it was not clear at this
point why remote needs the addition of the new -c option, but not qemu.

> +remoteDispatchClientRequest(struct qemud_server *server,
> +                            struct qemud_client *client,
> +                            struct qemud_client_message *msg)
>  {
>      int ret;
>      remote_error rerr;
> +    int qemu_call;

Based on your use, this is better as bool...

> -    if (msg->hdr.vers != REMOTE_PROTOCOL_VERSION) {
> +
> +    if (!qemu_call && msg->hdr.vers != REMOTE_PROTOCOL_VERSION) {
>          remoteDispatchFormatError (&rerr,
>                                     _("version mismatch (actual %x, expected %x)"),
>                                     msg->hdr.vers, REMOTE_PROTOCOL_VERSION);
>          goto error;
>      }
> +    else if (qemu_call && msg->hdr.vers != QEMU_PROTOCOL_VERSION) {
> +        remoteDispatchFormatError (&rerr,
> +                                   _("version mismatch (actual %x, expected %x)"),
> +                                   msg->hdr.vers, QEMU_PROTOCOL_VERSION);
> +        goto error;
> +    }
>  
>      switch (msg->hdr.type) {
>      case REMOTE_CALL:
> -        return remoteDispatchClientCall(server, client, msg);
> +        return remoteDispatchClientCall(server, client, msg, qemu_call);

...which affects the prototype of remoteDispatchClientCall.

> @@ -6390,6 +6406,35 @@ remoteDispatchNumOfNwfilters (struct qemud_server *server ATTRIBUTE_UNUSED,
>      return 0;
>  }
>  
> +static int
> +qemuDispatchMonitorCommand (struct qemud_server *server ATTRIBUTE_UNUSED,

Given that earlier in the patch, you removed the space for
remoteDispatchClientRequest, it seems odd to see the space here.

> +++ b/daemon/remote_generate_stubs.pl
> @@ -1,7 +1,16 @@
>  #!/usr/bin/perl -w
>  #
> -# This script parses remote_protocol.x and produces lots of boilerplate
> -# code for both ends of the remote connection.
> +# This script parses remote_protocol.x or qemu_protocol.x and produces lots of
> +# boilerplate code for both ends of the remote connection.
> +#
> +# The first non-option argument specifies the prefix to be searched for, and
> +# output to, the boilerplate code.  The second non-option argument is the
> +# file you want to operate on.  For instance, to generate the dispatch table
> +# for both remote_protocol.x and qemu_protocol.x, you would run the
> +# following:
> +#
> +# remote_generate_stubs.pl -c -t remote ../src/remote/remote_protocol.x
> +# remote_generate_stubs.pl -c -t qemu ../src/remote/qemu_protocol.x

This comment doesn't match the makefile.

>  #
>  # By Richard Jones <rjones at redhat.com>
>  
> @@ -10,8 +19,12 @@ use strict;
>  use Getopt::Std;
>  
>  # Command line options.
> -our ($opt_p, $opt_t, $opt_a, $opt_r, $opt_d);
> -getopts ('ptard');
> +our ($opt_p, $opt_t, $opt_a, $opt_r, $opt_d, $opt_c);
> +getopts ('ptardc');
> +
> +my $structprefix = $ARGV[0];
> +my $procprefix = uc $structprefix;
> +shift;
>  
>  # Convert name_of_call to NameOfCall.
>  sub name_to_ProcName {
> @@ -25,47 +38,50 @@ sub name_to_ProcName {
>  # opinion about the name, args and return type of each RPC.
>  my ($name, $ProcName, $id, %calls, @calls);
>  
> -# REMOTE_PROC_CLOSE has no args or ret.
> -$calls{close} = {
> -    name => "close",
> -    ProcName => "Close",
> -    UC_NAME => "CLOSE",
> -    args => "void",
> -    ret => "void",
> -};
> +# only generate a close method if -c was passed

Ah, now I see why only one of the two generators needed -c.

> +if ($opt_c) {
> +    # REMOTE_PROC_CLOSE has no args or ret.
> +    $calls{close} = {
> +	name => "close",
> +	ProcName => "Close",
> +	UC_NAME => "CLOSE",
> +	args => "void",
> +	ret => "void",
> +    };
> +}
>  
> @@ -88,7 +104,7 @@ while (<>) {
>  # Output
>  
>  print <<__EOF__;
> -/* Automatically generated by remote_generate_stubs.pl.
> +/* Automatically generated by ${structprefix}_generate_stubs.pl.

One search-and-replace too many.  The script's name is fixed, so half
your output files now have a bogus comment.

> +/* Define the program number, protocol version and procedure numbers here. */
> +const QEMU_PROGRAM = 0x20008087;
> +const QEMU_PROTOCOL_VERSION = 1;
> +
> +enum qemu_procedure {
> +    QEMU_PROC_MONITOR_COMMAND = 1

Do we want the cute comment here about grouping command ids by 10, or
save that until we actually have more commands?

Overall, the patch is large, but looks decent.  I don't know if it could
have been subdivided any further.

-- 
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/20100421/44fd4757/attachment-0001.sig>


More information about the libvir-list mailing list