spice-gtk之usb相关代码(2)

回顾

在上一篇关于usb的代码分析https://blog.csdn.net/FlayHigherGT/article/details/85261810中,我们聊到了一些关于usb插入拔出之后spicy回应的某些回调函数,也聊到了如何实现连接虚拟机时自动重定向已经插着的usb,但是经过最近的研究,发现这个功能其实是在spicy里面是有功能实现的,下面细说。

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

这个参数是由两个字符串组成,每个字符串都是五个字段,这些字段的含义分别是:<class>,<vendor>,<product>,<version>,<allow>,前面四个字段是一个usb设备的特征,表示什么类型设备啊,两个id号啊,版本号啊,这些字段都是某一个usb设备的特有的特征,这些参数中如果是-1,表示不管都可以通过,比如product=-1表示任意product号都ok,最后一个参数表示这样的设备是否能被重定向,0表示不能,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设备的<vendor>,<product>,<version>等等信息的:

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);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章