qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [RFC] New Migration Protocol using Visitor Interface


From: Anthony Liguori
Subject: Re: [Qemu-devel] [RFC] New Migration Protocol using Visitor Interface
Date: Mon, 03 Oct 2011 09:42:02 -0500
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.21) Gecko/20110831 Lightning/1.0b2 Thunderbird/3.1.13

On 10/03/2011 09:11 AM, Michael S. Tsirkin wrote:
On Mon, Oct 03, 2011 at 08:43:54AM -0500, Anthony Liguori wrote:
visit_start_array(v, "entries", errp);
for (int i = 0; i<   s->size; i++) {
     visit_type_int(v, NULL,&s->entry[i], errp);
}
visit_end_array(v, errp);

Sequences can encode structures not just arrays.
How would you encode this for example:

SEQUENCE OF { VQN: INTEGER, SEQUENCE { OPTIONAL VECTOR: INTEGER}  }

visit_start_array(v, "vqs", errp);
for (i = 0; i<  s->n_vqs; i++) {
     // Array elements never have a name, hence NULL name
     visit_start_struct(v, "VirtQueue", NULL, errp);
     visit_type_int(v,&s->vq[i].num, "vqn", errp);

     // Given this sub-struct an arbitrary name.  It could also be anonymous.
     visit_start_struct(v, "MsixInfo", "msix_info", errp);
     if (s->vq[i].msix_enabled) {
         visit_type_int(v,&s->vq[i].vector, "vector", errp);

Why is this a pointer to vector, btw?

So you can write a single visit function that works for input or output.

Think of the simple case like:

void visit_simple_type(Visitor *v, SimpleType *t, const char *name, Error 
**errp)
{
   visit_start_struct(v, "SimpleType", name, errp);
   visit_type_int(v, &t->a, "a", errp);
   visit_type_int(v, &t->b, "b", errp);
   visit_end_struct(v, errp);
}

For complex types like Virtio, you need to do a bit more. You wouldn't do a simple for () {} loop but instead use the Visitor list mechanism. That would eliminate the need to have to marshal n_vqs.


     }
     visit_end_struct(v, errp);

     visit_end_struct(v, errp);
}
visit_end_array(v, errp);

This would also generate JSON of:

'vqs': [ { 'vqn': 2, 'msix_info': { 'vector': 3 } } ]

How would optional fields be handled?

As far as the Visitor goes, if something is optional you just don't encode it. If you need to key off the presence of a field, presumably you could just check to see whether it succeeded or failed to visit that field. I'm not 100% sure if you can do a single input/output visitor when you have optional fields.

My rough thinking is that each device would have a input/output visitor callback that took the same signature. That gives the flexibility of having two separate interfaces but in the common case, you just pass the same function for both.

Specifically
the case where first field in a sequence tells
you the meaning of the following ones?

Can you give me the example in ASN.1?

Regards,

Anthony Liguori





reply via email to

[Prev in Thread] Current Thread [Next in Thread]