[libvirt] [RFC PATCHv2 5/5] WIP: smartcard: turn on qemu support

Daniel P. Berrange berrange at redhat.com
Fri Jan 14 19:23:17 UTC 2011


On Fri, Jan 14, 2011 at 11:25:36AM -0700, Eric Blake wrote:
> On 01/14/2011 05:41 AM, Daniel P. Berrange wrote:
> > On Thu, Jan 13, 2011 at 05:34:37PM -0700, Eric Blake wrote:
> > 
> >> +            virCommandAddArg(cmd, devstr);
> >> +            VIR_FREE(devstr);
> >> +
> >> +            virCommandAddArg(cmd, "-device");
> >> +            virCommandAddArgFormat(cmd, "ccid-card-passthru,chardev=%s",
> >> +                                   smartcard->info.alias);
> >> +            break;
> >> +        }
> >> +    }
> >> +
> >>      if (!def->nserials) {
> >>          /* If we have -device, then we set -nodefault already */
> >>          if (!(qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE))
> > 
> > We currently only provide a single '-device usb-ccid' device. It looks
> > like we're relying on the ccid-card-XXX devices automagically associating
> > themselves with that. It would be better to explicitly link them up
> > by specifying the 'id' of the 'usb-ccid' device to which they must be
> > associated. If QEMU doesn't have such an explicit link, it ought to
> > be added.
> 
> That's how Alon implemented it.  -device usb-ccid is instantiated
> exactly once, and is not tied to any -chardev.  -device
> ccid-card-emulated automatically uses the services of -device usb-ccid,
> and does not need any -chardev.  And -device ccid-card-passthru
> automatically uses the services of -device usb-ccid, and requires an
> associated -chardev (Alon has only tested with a tcp chardev and with a
> spicevmc,name=smartcard chardev).  At this point, your complaints seem
> to be more about whether Alon's qemu command line implementation makes
> sense (which, given that the smartcard patches have been proposed but
> are not yet upstream, may mean that the final qemu implementation will
> change and my libvirt patch would have to equally change to match),
> rather than whether I'm correctly mapping to the command line that Alon
> documented:
> 
> http://cgit.freedesktop.org/~alon/qemu/commit/?h=usb_ccid.v15&id=024a37bf696ae3a8d148a2ecbecdd3d92d390b2a

Alon's docs are showing the simplified syntax suitable for
end users. This doesn't guarentee a stable guest visible ABI.
Looking at the code, we need to set the 'slot' parameter on each
ccid device we have. This means we need a new address type for
smart card devices, and a corresponding <controller> instance.
So in the XML we'd get (including libvirt generated aliases
and addresses):

<devices>
  <controller type='ccid' index='0'>
     <alias id='ccid0'/>
  </controller>
  <controller type='ccid' index='1'>
     <alias id='ccid1'/>
  </controller>
  <smartcard mode='host'>
    <alias id='smartcard0'/>
     <address type='ccid' controller='0' slot='0'/>
  </smartcard>
  <smartcard mode='host-certificates'>
    <certificate>/path/to/cert1</certificate>
    <certificate>/path/to/cert2</certificate>
    <certificate>/path/to/cert3</certificate>
    <alias id='smartcard1'/>
    <address type='ccid' controller='0' slot='3'/>
  </smartcard>
  <smartcard mode='passthrough' type='tcp'>
    <source mode='connect' host='127.0.0.1' service='2001'/>
    <protocol type='raw'/>
    <alias id='smartcard2'/>
    <address type='ccid' controller='1' slot='0'/>
  </smartcard>
</devices>


Which would end up mapping to

  -device usb-ccid,id=ccid0
  -device usb-ccid,id=ccid1

  -device ccid-host,id=smartcard0,bus=ccid0,slot=0
  -device ccid-certificates,id=smartcard1,bus=ccid0,slot=3...
  -device ccid-passthrough,id=smartcard2,bus=ccid1,slot=0...

In other words a hierarchy

  USB bus 0
   |
   +-  ccid0
   |     |
   |     +- smartcard0   (ccid slot 0)
   |     +- smartcard1   (ccid slot 3)
   |
   +-  ccid1
         |
         +- smartcard2   (ccid slot 0)


This is a pretty similar setup to the way we link virtio-serial devices
and vmchannels

> > Also, does the order of '-device ccid-card-XXX' devices matter ie is
> > the ordering a guest visible ABI ? If so, then we need to track an
> > explicit address against each <smartcard> so that we can selectively
> > hotplug/hotunplug devices, and have a stable ABI across migration.
> 
> That I'm not sure about.  Alon said that the guest sees the smartcard as
> a USB device, but didn't mention anything about whether -device
> ccid-card-* can take additional USB addressing parameters to lock down
> where the device appears on the guest's USB bus.

The 'usb-ccid' is on the USB bus, but we don't have stable
addressing for that, because the guest OS controls USB
addresses. We do need the stable slots for the <smartcards>
though.

Daniel




More information about the libvir-list mailing list