内核模块USBIP协议描述

1   USBIP协议

1.1USBIP协议基本介绍

USB/IP协议遵循C/S架构。服务器端导入USB设备,客户端导出USB设备。导出USB设备的驱动程序运行在客户端机器上。大致可分为2个部分:

1、  客户端获取USB设备的列表

客户端通过TCP/IP协议连接上服务器,并发送一个OP_REP_DEVLIST数据包到服务器,服务器收到后,发回OP_REP_DEVLIST USB设备信息数据包列表。具体流程如下:

图2?1 客户端获取USB 设备列表流程

2、  客户端导入USB设备

一旦客户端获知USB设备的列表,会创建虚拟USB设备,并使用已经创建好的套接字向服务器发送一个OP_REQ_IMPORT请求包,服务器回复OP_REP_IMPORT包。这样就会建立一个通道。客户端发送两种类型的数据包: :USBIP_CMD_SUBMIT提交URB请求、,USBIP_CMD_UNLINK放弃提交的URB请求。服务器分别回复USBIP_RET_SUBMIT和USBIP_RET_UNLINK。具体流程如下:

1.2 主要结构体描述

/*Common header for all the kinds of PDUs. */

struct op_common{

uint16_t version;

#defineOP_REQUEST      (0x80 << 8)

#define OP_REPLY   (0x00 << 8)

uint16_t code;

/* add more error code */

#define ST_OK 0x00

#define ST_NA 0x01

uint32_t status; /* op_code status (forreply) */

}__attribute__((packed));

1.2.1

1.2.2       USBIP数据交互通用结构体

structusbip_header {

struct usbip_header_basic base;

union {

structusbip_header_cmd_submit  cmd_submit;

structusbip_header_ret_submit    ret_submit;

structusbip_header_cmd_unlink    cmd_unlink;

structusbip_header_ret_unlink      ret_unlink;

} u;

} PACKED;

1.3交互数据描述

数据交互过程中全部使用网络字节序(big endian)。

1.3.1       请求获得USB设备列表信息(OP_REQ_DEVLIST)


NO.


偏移(字节)


长度(字节)


数值


描述


1


0


2


0X100


版本号 V1.1.1(当前)


2


2


2


0X8005


命令OP_REQ_DEVLIST


3


4


4


0


状态:未使用,设置为0


4


32


Busid (新改动)

1.3.2       回复USB设备列表信息(OP_REP_DEVLIST)


NO.


偏移(字节)


长度(字节)


数值


描述


1


0


2


0X100


版本号 V1.1.1(当前)


2


2


2


0X0005


命令OP_REP_DEVLIST


3


4


4


0


状态:0 :OK


4


8


4


n


导出设备的数量。0:无


5


0X0c


256


6


0x10c


32


busid总线ID(字符串)


7


0x12c


4


Busnum总线数量


8


0x130


4


Devnum设备数量


9


0x134


4


Speed传输速率


10


0x138


2


idVendor生产厂商编号(由USB官方分配)


11


0x13A


2


idProduct产品编号(制造厂商分配)


12


0x13C


2


bcdDevice设备出厂编号


13


0x13E


1


bDeviceClass设备类代码(由USB官方分配)


14


0x13F


1


bDeviceSubClass子类代码(由USB官方分配)


15


0x140


1


bDeviceProtocol设备协议代码(由USB官方分配)


16


0x141


1


bConfigurationValueSet_Configuration命令所需要的参数值


17


0x142


1


bNumConfigurations当前速度下能支持的配置数量


18


0x143


1


bNumInterfaces此配置的接口数量


19


0x144


1


M_0


bInterfaceClass接口类型


20


0x145


1


bInterfaceSubClass接口子类型


21


0x146


1


bInterfaceProtocol接口遵循的协议


22


0x147


1


填充字节,设置0


23


0XC+i*0x138+m_(i-1)*4


第二个导出USB设备开始区域

1.3.3       请求导入远程USB设备(OP_REQ_IMPORT)


NO.


偏移(字节)


长度(字节)


数值


描述


1


0


2


0X100


版本号 V1.1.1(当前)


2


2


2


0X0005


命令OP_REP_DEVLIST


3


4


4


0


状态:0 :OK


4


8


32


Busid:

1.3.4       回复导入远程USB设备(OP_REP_IMPORT)


NO.


偏移(字节)


长度(字节)


数值


描述


1


0


2


0X100


版本号 V1.1.1(当前)


2


2


2


0X0005


命令OP_REP_DEVLIST


3


4


4


0


状态:0 :OK


4


0X0c


256


路经:主机出口设备的USB设备,字符串以零字节


5


0x108


32


busid总线ID(字符串)


6


0x128


4


Busnum总线数量


7


0x12C


4


Devnum设备数量


8


0x130


4


Speed传输速率


9


0x134


2


idVendor生产厂商编号(由USB官方分配)


10


0x136


2


idProduct产品编号(制造厂商分配)


11


0x138


2


bcdDevice设备出厂编号


12


0x139


1


bDeviceClass设备类代码(由USB官方分配)


13


0x13A


1


bDeviceSubClass子类代码(由USB官方分配)


14


0x13B


1


bDeviceProtocol设备协议代码(由USB官方分配)


15


0x13C


1


bConfigurationValueSet_Configuration命令所需要的参数值


16


0x13D


1


bNumConfigurations当前速度下能支持的配置数量


17


0x14E


1


bNumInterfaces此配置的接口数量

1.3.5       提交URB请求(USBIP_CMD_SUBMIT)

首先了解下USB设备方向:

IN

OUT


NO.


偏移(字节)


长度(字节)


数值


描述


1


0


4


0X001


命令(USBIP_CMD_SUBMIT)


2


4


4


序列号


3


8


4


0


Devid


4


0xC


4


方向 :0:USBIP_DIR_OUT

1:USBIP_DIR_IN


5


0x10


4


Ep:端口号:0-15


6


0X14


4


传输标志(看下面介绍)


7


0X18


4


传输数据buffer长度


8


0x1C


4


开始帧


9


0X20


4


包的个数(ISO等时传输模式下使用)


10


0X24


4


时间间隔:(最长时间的请求服务器)


11


0X28


8


USB数据字节设置,没有使用写0


12


0x30


传输数据

1.3.6       回复URB请求(USBIP_RET_SUBMIT)


NO.


偏移(字节)


长度(字节)


数值


描述


1


0


4


0X003


命令(USBIP_RET_SUBMIT)


2


4


4


序列号


3


8


4


0


Devid


4


0xC


4


方向 :0:USBIP_DIR_OUT

1:USBIP_DIR_IN


5


0x10


4


Ep:端口号:0-15


6


0X14


4


URB传输成功为0,其他错误发生


7


0X18


4


传输数据buffer长度


8


0x1C


4


开始帧


9


0X20


4


包的个数(ISO等时传输模式下使用)


10


0X24


4


错误数


11


0X28


8


USB数据字节设置,没有使用写0


12


0x30


传输数据

1.3.7       取消一个URB请求(USBIP_CMD_UNLINK)


NO.


偏移(字节)


长度(字节)


数值


描述


1


0


4


0X002


命令(USBIP_CMD_UNLINK)


2


4


4


URB unlink序列号


3


8


4


0


Devid


4


0xC


4


方向 :0:USBIP_DIR_OUT

1:USBIP_DIR_IN


5


0x10


4


Ep:端口号:0


6


0X14


4


序列号,已提交URB 请求的序列号


7


0x30


n


URB传输数据

1.3.8       回复取消URB请求(USBIP_RET_UNLINK)


NO.


偏移(字节)


长度(字节)


数值


描述


1


0


4


0X004


命令(USBIP_RET_UNLINK)


2


4


4


URB unlink序列号


3


8


4


0


Devid


4


0xC


4


方向 :0:USBIP_DIR_OUT

1:USBIP_DIR_IN


5


0x10


4


Ep:端口号:0


6


0X14


4


状态


7


0x30


n


URB传输数据

1.3.9      传输标志transfer_flags

传输标志值得设置具体参考:

1、  http://www.deansys.com/doc/ldd3/ch13s03.html

2、  http://blog.csdn.net/myarrow/article/details/7025065


NO.


传输标志



控制


中断



等时


1


URB_SHORT_NOT_OK


0x1


Only in


Only in


Only in


No


2


URB_ISO_ASAP


0x2


No


No


No


Yes


3


URB_NO_TRANSFER_DMA_MAP


0x4


Yes


Yes


Yes


Yes


4


URB_NO_FSBR


0x20


Yes


No


No


No


5


URB_ZERO_PACKET


0x40


No


No


Only out


No


6


URB_NO_INTERRUPT


0x80


Yes


Yes


Yes


Yes


7


URB_FREE_BUFFER


0x100


Yes


Yes


Yes


Yes


8


URB_DIR_MASK


0x200


Yes


Yes


Yes


Yes

2   URB请求块

具体参见博客:http://blog.csdn.net/lidaqiang99/article/details/6591024

或者下载宋宝华的 《Linux 设备驱动开发详解》USB驱动设备一章有详细的介绍

时间: 2024-08-11 03:36:39

内核模块USBIP协议描述的相关文章

Diameter协议

Diameter是计算机网络中使用的一个认证.授权和审计协议.它从功能更少的RADIUS协议进化而来,并且取代之. Dimater应用通过添加新的命令或属性扩展基础协议,例如使用扩展认证 协议(EAP). 与RADIUS协议比较 名字是一个单词游戏(从RADIUS,半径到DIAMETER,直径),从前任RADIUS协议演化而来(直径是半径的二倍).Diameter不直接后向兼容,但是提供RADIUS升级路径.DIAMETER提供的主要特征(RADIUS中缺乏的)有: * 可靠传输协议(TCP或S

通用轻量级二进制格式协议解析器

在通信协议中,经常碰到使用私有协议的场景,报文内容是肉眼无法直接看明白的二进制格式.由于协议的私有性质,即使大名鼎鼎的 Wireshark,要解析其内容,也无能为力. 面对这种情况,开发人员通常有两个办法:第一,对照报文内容和协议规范进行人工分析(假设内容没有经过加密.压缩):第二,编程实现协议报文的解析(源于程序员的懒惰 ^_^). 很明显,第二条道路是主流.目前比较常见的实现方式是开发对应的 Wireshark 插件,包括 C.Lua 等插件.当然,插件完成后需要运行 Wireshark 才

CANopen协议介绍

1.CANopen协议简介 从OSI 网络模型的角度来看,CAN总线只定义了OSI网络模型的第一层(物理层) 和第二层(数据链路层),而在实际设计中,这两层完全由硬件实现,设计人员无需再为此开发相关软件或固件. 同时,CAN只定义物理层和数据链路层,没有规定应用层,本身并不完整,因此需要一个高层协议来定义CAN报文中的11/29位标识符和8字节数据的使用.而且,基于CAN总线的工业自动化应用中,越来越需要一个开放的.标准化的高层协议:这个协议支持各种CAN厂商设备的互用性.互换性,能够实现在CA

RDP协议集、音频输出、音频输入重定向虚拟通道

一.RDP协议集及子协议之间如何交互 由于目前Windows Server的版本已经进入到了2016版,因此在本文中,终端服务一律称为其最新名称:远程桌面服务(RDS). 以下组件对于了解远程桌面服务协议至关重要: RDP客户端:支持远程桌面服务协议的客户端称为RDP客户端,因为客户端安装了支持远程处理的软件组件.使用此RDP客户端,用户连接到RD会话主机服务器以登录到远程桌面计算机或远程应用程序. 远程桌面会话主机(RD会话主机):RDP客户端与之通信的服务器称为远程桌面会话主机(RD会话主机

wireshark插件开发 - 自定义协议

虽然wireshark自带了很多知名协议的解析插件,譬如HTTP.DHCP等等,然而在实际应用环境中,有不少软件之间的通信协议都是私有的,如游戏客户端和服务器之间的交互协议通常都是私有的,wireshark无法具体解析出各种字段之间的含义,只能显示接收到的二进制数据,给协议的分析和问题的排查带来了一定的困难,尤其是协议内容比较复杂时. 本文一个自定义的简单协议入手,分析如何基于wireshark开发自定义协议分析插件. 1.1. 概述 本书使用Go语言来描述协议的交互过程.Go由Google出品

3.协议与端口

协议有网络层协议,传输层协议,应用层协议. 网络层协议用于三层网络互联,传输层协议用于数据传输,应用层协议用于数据的应用. IP协议属于网络层协议,IP的主要作用是寻址和分段.IP端口号范围0~65535. 端口属于四层传输层,如果说IP是一座房子,那么端口就是这个房子的门. TCP叫传输控制协议,是一种安全可靠的传输层协议. UDP叫用户数据包协议,是一种简单但不可靠的传输层协议. TCP/IP我们就可以理解为是一种安全可靠的数据传输的一对组合.IP用于寻址,而TCP则决定数据安全的传输控制.

TCP/IP网络协议基础知识集锦[转]

引言 本篇属于TCP/IP协议的基础知识,重点介绍了TCP/IP协议簇的内容.作用以及TCP.UDP.IP三种常见网络协议相关的基础知识. 内容 TCP/IP协议簇是由OSI七层模型发展而来的,之所以存在OSI互联参考模型主要有以下几点好处: 1.用于解决不同厂商的设备互联问题:即兼容性考虑; 2.层次化结构独立性强;可扩展性强; 3.统一标准可以方便学习; TCP/IP模型 TCP/IP模型与OSI模型的相互关系如下图所示: 注释 1.应用层:与OSI的应用层.表示层.会话层相对应,主要作用是

一种通用的树形二进制协议描述方法与处理算法

概述: 本方法定义了一种数据结构,可用于描述任意的树形二进制协议,并配合一个特定的处理算法,可实现一种通用的,由该种树形二进制协议定义的比特流解析与填充的处理,该数据结构的定义如下: /* 以下结构用于定义一个协议节点的描述信息. */ struct _proto_info; typedef struct _proto_des { const char *              name; /* 用于描述一个协议节点的名称. */ size_t                    stat

JSON-RPC轻量级远程调用协议介绍及使用

JSON-RPC轻量级远程调用协议介绍及使用 目录 技术简介    1 一.JSON-RPC协议描述    1 二.JSON-RPC调用简单示例    1 2.1.服务器端Java调用示例    1 2.2.Java客户端调用示例    2 2.3.PHP客户端调用示例    2 2.3.JavaScript客户端调用示例    2 2.4.直接GET请求进行调用    2 三.JSON-RPC总结    3 参考文档    3 技术简介 json-rpc是基于json的跨语言远程调用协议,比x