usb channel自动选择功能
功能说明
在客户端,触发重定向行为时
客户端通过libusb接口,获取usbspeed,并根据speed和配置文件,选择对应的usb channel
原来逻辑:从0-n 依次选择
目标逻辑:优先选择速度匹配的通道
逻辑优先级:低于指定通道的配置
模块结构
MC | 配置修改 | 现在需要修改记录到usbSetting的配置中(可选1) |
UNIQB | 配置下发 | 现在需要下发usb2.0数,usb3.0数到客户端(可选2) |
LIBUSB | USB应用层操作接口 | 提供速度获取接口, 无需改动 |
SPICE | 管理通道选择 | 主要修改点 |
USBREDIR | USB重定向功能、规则管理 | 提供读取全局配置的接口,目前复用 |
数据结构
配置,考虑到兼容性,和之前的磁盘重定向字段一样,放入到rule[0],默认规则中下发(和磁盘重定向,同一级别)
{usb_2:xx,usb_3:xx}
单元功能
接口
- 关于调用顺序 参考 spice usb通道相关逻辑
/获取全局配置/
const usbredir_ksvd_rule* usbredirfilter_get_global(const usbredir_ksvd_rules* rule);
{
“usb_3”:6,
“usb_2”:4
}1
2
3
4
5
* 为了让调用者更新后,可以兼容(考虑到以后可能会从rule[0]中拆分global配置)
``` CPP
#ifndef usbredirfilter_get_global
#define usbredirfilter_get_global(a) usbredirfilter_get_rule_byid(a, 0)
执行流程
- is_channel_device_match
- 之前,用来实现指定通道功能的函数,这里需要在函数内,加入通道速度识别判定优先级,低于指定通道
- 参数 const struct usbredirfilter_rule_ksvd *rules, int rules_count, libusb_device *libdev, int channel_id)
%%{init: {'theme':'default'}}%% graph TD A(开始) B[获取绑定id] C{是否绑定} D{是否相同} E{通道是否已经被别人绑定} F(ret false) G(ret true) A-->B B-->C C--yes-->D C--no-->E D--yes-->G D--no-->F E--yes-->F E--no-->G
%%{init: {'theme':'default'}}%% graph TD A(开始) B[获取绑定id] Ba[获取global策略] C{是否绑定} D{是否相同} E{通道是否已经被别人绑定} F(ret false) G(ret true) H[获取设备速度] I{速度是否匹配通道} End2F(ret false) End2T(ret true) A-->B B-->Ba Ba-->C C--yes-->D C--no-->E D--yes-->G D--no-->F E--yes-->F E--no-->H H-->I I--yes-->End2T I--no-->End2F
- 本文作者: crazyboy
- 本文链接: http://crazyboy.www.crazyboy.info/blog/blog/2022/12/20/kylin/usb/redir/kylinusbredir3/autochannel/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!