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.
-----Original Message----- From: Alon Levy [mailto:al...@redhat.com] Sent: Thursday, March 22, 2012 9:47 PM To: Charles.Tsai-蔡清海-研究發展部 Cc: spice-devel@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" _______________________________________________ Spice-devel mailing list Spice-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/spice-devel