[Spice-devel] Fail to create a printing channel

Charles.Tsai-蔡清海-研究發展部 charles.tsai at cloudena.com
Thu Mar 22 18:05:48 PDT 2012


Alon,

	I will put some traces in Qemu to see if I can find out where the code is stuck.



-----Original Message-----
From: Alon Levy [mailto:alevy at redhat.com] 
Sent: Thursday, March 22, 2012 10:22 PM
To: Charles.Tsai-蔡清海-研究發展部
Cc: spice-devel at lists.freedesktop.org
Subject: Re: Fail to create a printing channel

On Thu, Mar 22, 2012 at 09:55:45PM +0800, Charles.Tsai-蔡清海-研究發展部 wrote:
> Alon,
> 
> I did all of what you mentioned before. Nothing is missed in my checklist.
> Function "spice_server_char_device_add_interface" in fact is not called at all.
> Qemu somehow is blocked somewhere. For now, I still do not know the root cause.
> 

OK. So nothing comes to mind. Where is it stuck?

> 
> -----Original Message-----
> From: Alon Levy [mailto:alevy at redhat.com]
> Sent: Thursday, March 22, 2012 9:47 PM
> To: Charles.Tsai-蔡清海-研究發展部
> Cc: spice-devel at lists.freedesktop.org
> Subject: Re: Fail to create a printing channel
> 
> On Thu, Mar 22, 2012 at 07:34:38PM +0800, Charles.Tsai-蔡清海-研究發展部 wrote:
> > Alon,
> 
> Or anyone else on the list..
> 
> > 
> > 	I am running the following script to create the printing channel based on the virtio device framework.
> > 	When the VM is launched, it seems to block somewhere in Qemu.
> > 
> > 	If I remove the following two lines, the VM can be launched without any problem.		
> > 	The following two lines basically are used to create the printing channel between the host and guest.
> > 
> > 	-chardev spicevmc,id=vdprint,name=vdprint \
> > 	-device virtserialport,chardev=vdprint,name=com.redhat.print.0"
> > 
> > 	Can you give me some hits why Qemu does not call spice server to create the printing channel? Is there any 	function in Qemu I need to change so as to create additional channel within the Virtio device?
> > 
> > 	Let me know if I made anything wrong with my Qemu's command options. Thanks.
> 
> How it works right now, and it's probably not how we want it to be, is that there is a function qemu calls to get the allowed list of names by spice-server. That function is implemented by spice-server, so you would need to add the "vdprint" string to it.
> 
> diff --git a/server/reds.c b/server/reds.c index c54d30c..bb75624 
> 100644
> --- a/server/reds.c
> +++ b/server/reds.c
> @@ -3364,6 +3364,7 @@ SPICE_GNUC_VISIBLE void 
> spice_server_char_device_wakeup(SpiceCharDeviceInstance*
>  #define SUBTYPE_VDAGENT "vdagent"
>  #define SUBTYPE_SMARTCARD "smartcard"
>  #define SUBTYPE_USBREDIR "usbredir"
> +#define SUBTYPE_PRINTER "printer"
>  
>  const char *spice_server_char_device_recognized_subtypes_list[] = {
>      SUBTYPE_VDAGENT,
> @@ -3371,6 +3372,7 @@ const char *spice_server_char_device_recognized_subtypes_list[] = {
>      SUBTYPE_SMARTCARD,
>  #endif
>      SUBTYPE_USBREDIR,
> +    SUBTYPE_PRINTER,
>      NULL,
>  };
> 
> Then you need to tell spice what to do when spice_server_char_device_add_interface is called with this subtype (subtype == 'name' parameter to the chardev. Another thing that should be changed).
> 
> You could basically just use another spicevmc_device_connect call. You 
> will need to add the channel to the spice.proto (again, this should be 
> changed so adding generic channels doesn't require this - something 
> like having a generic channel subtype, and having a message that tells 
> the client which channel this is - will be a little ugly since getting 
> a channel list won't be enough for the client to know what channels 
> are available, but it's not too bad - anyway off topic)
> 
> For now you can just change the spice-protocol/spice/enums.h file directly instead of recreating it:
> 
> U x86_64 garlic:spice-protocol alon ((1a3b563...))$ git diff diff 
> --git a/spice/enums.h b/spice/enums.h index d2dbfd0..9f54ac0 100644
> --- a/spice/enums.h
> +++ b/spice/enums.h
> @@ -330,6 +330,7 @@ enum {
>      SPICE_CHANNEL_TUNNEL,
>      SPICE_CHANNEL_SMARTCARD,
>      SPICE_CHANNEL_USBREDIR,
> +    SPICE_CHANNEL_PRINTER,
>  
>      SPICE_END_CHANNEL
>  };
> 
> @@ -3401,9 +3403,13 @@ static int spice_server_char_device_add_interface(SpiceServer *s,
>          }
>      }
>  #endif
> +    /* all other channels use the generic spicevmc channel */
>      else if (strcmp(char_device->subtype, SUBTYPE_USBREDIR) == 0) {
>          spicevmc_device_connect(char_device, SPICE_CHANNEL_USBREDIR);
>      }
> +    else if (strcmp(char_device->subtype, SUBTYPE_PRINTER) == 0) {
> +        spicevmc_device_connect(char_device, SPICE_CHANNEL_PRINTER);
> +    }
>      return 0;
>  }
> 
> Hope you can understand my not very collected response.
> 
> Bonus points for sending patches to fix the raised issues, or starting a discussion on how to exactly.
> 
> Alon
> 
> > ==================================
> > 
> > #!/bin/sh
> > 
> > ARGS="-localtime -spice port=5900,disable-ticketing \ -drive 
> > file=/opt/virt/user/Win7_64.cow \ -vga qxl \ -device 
> > virtio-serial-pci,multifunction=on \ -chardev 
> > spicevmc,id=vdagent,id=vdagent,name=vdagent \ -device
> > virtserialport,chardev=vdagent,name=com.redhat.spice.0 \ -usbdevice 
> > tablet -smp 1,cores=2 -m 2048 -enable-kvm -net nic -net user \ 
> > -chardev spicevmc,id=vdprint,name=vdprint \ -device 
> > virtserialport,chardev=vdprint,name=com.redhat.print.0"


More information about the Spice-devel mailing list