在上一篇关于usb的代码分析https://blog.csdn.net/FlayHigherGT/article/details/85261810中,我们聊到了一些关于usb插入拔出之后spicy回应的某些回调函数,也聊到了如何实现连接虚拟机时自动重定向已经插着的usb,但是经过最近的研究,发现这个功能其实是在spicy里面是有功能实现的,下面细说。
1、spice-usbredir-auto-redirect-filter 筛选插入的usb设备是否能不用勾选自动重定向到虚拟机内
2、spice-usbredir-redirect-on-connect 筛选spice-channel连接的时候是否能自动重定向已经插在物理机上的usb设备
这是官网对于这两个参数的用法的解释https://www.spice-space.org/usbredir.html。默认的参数是0x03,-1,-1,-1,0|-1,-1,-1,-1,1
这个参数是由两个字符串组成,每个字符串都是五个字段,这些字段的含义分别是:
0x03,-1,-1,-1,0|-1,-1,-1,-1,1 0x03键鼠设备,后面半段表示所有设备都可以重定向,前面半段表示键鼠设备不能重定向,所以整段的意义就是除了键鼠设备,其他的设备都能重定向。
下面是libusb中的关于usb的某些特征枚举,结构体(决定了第一位是哪类设备):
http://libusb.sourceforge.net/api-1.0/structlibusb__device__descriptor.html#a480a0b5345a2e59987e20fa7247c3f0e
下面例子是查看usb设备的
https://blog.csdn.net/FlayHigherGT/article/details/90245349
libusb接口信息:
https://blog.csdn.net/FlayHigherGT/article/details/89297462
usb-device-manager.c中
spice_usb_device_manager_check_redir_on_connect是usb自动连接的代码函数if (usbredirhost_check_device_filter)是usb自动连接筛选的机制,之后就是进入usbredir子项目内部了
usbredir项目里面
usbredirhost.c里面usbredirhost_check_device_filter函数用来筛选usb参数,最终的对比是这样的:
if (config == NULL) {
return usbredirfilter_check(rules, rules_count, dev_desc.bDeviceClass,
dev_desc.bDeviceSubClass, dev_desc.bDeviceProtocol,
NULL, NULL, NULL, 0,
dev_desc.idVendor, dev_desc.idProduct,
dev_desc.bcdDevice, flags);
}
num_interfaces = config->bNumInterfaces;
printf("usbredir---num_interface=%d\n", num_interfaces);
for (i = 0; i < num_interfaces; i++) {
const struct libusb_interface_descriptor *intf_desc =
config->interface[i].altsetting;
interface_class[i] = intf_desc->bInterfaceClass;
interface_subclass[i] = intf_desc->bInterfaceSubClass;
interface_protocol[i] = intf_desc->bInterfaceProtocol;
printf("usbredir---class=%d, subclass=%d, protocol=%d\n",
interface_class[i], interface_subclass[i], interface_protocol[i]);
//最终对比的class是interface_class(0x03),而interface_subclass始终是1
}
libusb_free_config_descriptor(config);
return usbredirfilter_check(rules, rules_count, dev_desc.bDeviceClass,
dev_desc.bDeviceSubClass, dev_desc.bDeviceProtocol,
interface_class, interface_subclass, interface_protocol,
num_interfaces, dev_desc.idVendor, dev_desc.idProduct,
dev_desc.bcdDevice, flags);
}