当前位置:   article > 正文

[LuckFox Pico Plus] usb gadget 之rndis的协议分析_usb rndis 枚举

usb rndis 枚举

背景

由于最近在看rndis,因此把协议大概看下,整理如下,仅供参考,有些写的不对的地方希望路过的同学多家指正。

RNDIS主要工作流程

枚举的配置描述符信息

配置描述符:

09 02 4b 00 02 02 00 c0 00 //配置描述符

        09  配置描述符固定长度 09

        02  描述符类型,配置描述符02

        4b 00 配置所返回的数据长度 0x004B

        02   接口个数

        02   set_configuration所需要的参数值

        00   描述配置符的字符串的索引     

        c0   供电模式

        00   最大电流

08 0b 00 02 e0 01 03 06 //接口关联描述符

        08 //长度

        0b //接口关联描述符类型 0B

        00 //第一个接口编号

        02 接口总数量

        e0 bFunctionClass //通常跟第一个接口class一样

        01 bFunctionSubClass //通常跟第一个接口SubClass一样

        03 bFunctionProtocol //通常跟第一个接口protocol一样

        06 字符串描述符索引

09 04 00 00 01 e0 01 03 04 //接口描述符

        09 长度

        04 接口描述符类型

        00 接口编号

        00 备用接口描述符编号

        01 端点个数

        e0 接口类型 bInterfaceClass  

        01 接口子类型 bInterfaceSubClass

        03 接口协议 bInterfaceProtocol

        04 字符串描述符索引接口

05 24 00 10 01

05 24 01 00 01

04 24 02 00  

05 24 06 00 01

07 05 82 03 08 00 09  //端点描述符  

        07 长度

        05 类型,端点描述符

        82 端点地址和输入输出属性 IN 端点号 2

        03 端点传输类型属性  中断

        08 00 端点收发最大包大小 0x0008

        09   间隔时间

09 04 01 00 02 0a 00 00 05

        09 长度

        04 接口描述符

        01 接口编号

        00 备用接口编号

        02 端点个数

        0a 接口类型

        00 接口子类型

        00 接口协议

        05 字符串描述符索引

07 05 81 02 00 02 00  端点描述符

        07 长度

        05 端点类型

        81  IN 端点号1

        02  bluk属性

        00 02 最大包长度 0x0200(512)

        00 间隔时间

07 05 01 02 00 02 00  端点描述符

        07 长度

        05 端点类型

        01 OUT 端点号1

        02 bluk属性

        00 02 最大包长度 0x0200(512)

        00 间隔时间

RNDIS控制消息的流程

REMOTE_XX_MSG和REMOTE_XX_CMPLT这几对控制消息命令都是需要通过ep0发送SEND_ENCAPSULATED_COMMAND ,后发送REMOTE xx MSG(BlukOUT端点) ,收到RESPONSE_AVAILED后之后发送GetEncapsulatedResponse请求收到REMOTE_XX_CMPLY(BlukIN端点)

如图

RNDIS详细控制命令以及解析

    REMOTE_NDIS_INITIALIZE_MSG

枚举成功后,HOST 发送REMOTE_NDIS_INITIALIZE_MSG到DEVICE,具体报文如下:

例程:02 00 00 00  18 00 00 00  02 00 00 00  01 00 00 00  00 00 00 00  00 40 00 00

解析如下:

02 00 00 00  MessageType  0x00000002

18 00 00 00  MessageType  0x00000018

02 00 00 00  RequestId     0x00000002

01 00 00 00  MajorVersion

00 00 00 00  MinorVersion

00 40 00 00  MaxTransferSize 0x000004000

REMOTE_NDIS_INITIALIZE_CMPLT

DEVICE响应REMOTE_NDIS_INITIALIZE_MSG反馈回REMOTE_NDIS_INITIALIZE_CMPLT 具体内容如下:

例程:

02 00 00 80  34 00 00 00  02 00 00 00  00 00 00 00  01 00 00 00  00 00 00 00  01 00 00 00  00 00 00 00  01 00 00 00  2c 06 00 00  00 00 00 00  00 00 00 00  00 00 00 00

解析如下:

02 00 00 80  MessageType 0x80000002

34 00 00 00  长度

02 00 00 00  RequestId 0x00000002

00 00 00 00  状态

01 00 00 00  Major

00 00 00 00  Minor

01 00 00 00  RNDIS_DF_CONNECTIONLESS 0x00000001

00 00 00 00  Medium

01 00 00 00  

2c 06 00 00  

00 00 00 00  

00 00 00 00  

00 00 00 00

REMOTE_NDIS_QUERY_MSG

HOST 发送REMOTE_NDIS_QUERY_MSG请求具体信息

例程:

04 00 00 00  1c 00 00 00  03 00 00 00  01 01 01 00  00 00 00 00  14 00 00 00  00 00 00 00

解析:

04 00 00 00  //0x00000004

1c 00 00 00  

03 00 00 00  //RequestId 0x00000003

01 01 01 00  //Oid 0x00010101

00 00 00 00  

14 00 00 00  

00 00 00 00

REMOTE_NDIS_QUERY_CMPLT

DEVICE响应REMOTE_NDIS_QUERY_MSG反馈回REMOTE_NDIS_QUERY_CMPLT

例程

04 00 00 80  88 00 00 00  03 00 00 00  00 00 00 00  70 00 00 00  10 00 00 00  01 01 01 00  02 01 01 00  03 01 01 00  04 01 01 00  06 01 01 00  07 01 01 00  0a 01 01 00  0b 01 01 00  0c 01 01 00  0d 01 01 00  16 01 01 00  0e 01 01 00  11 01 01 00  14 01 01 00  02 02 01 00  01 01 02 00  02 01 02 00  03 01 02 00  04 01 02 00  05 01 02 00  01 01 01 01  02 01 01 01

03 01 01 01  05 01 01 01  04 01 01 01  01 01 02 01  02 01 02 01  03 01 02 01

解析

04 00 00 80  

88 00 00 00  

03 00 00 00  

00 00 00 00  

70 00 00 00  //长度

10 00 00 00  //从RequestId开始的偏移位置 0x00000010

01 01 01 00  02 01 01 00  03 01 01 00  04 01 01 00  

06 01 01 00  07 01 01 00  0a 01 01 00  0b 01 01 00  

0c 01 01 00  0d 01 01 00  16 01 01 00  0e 01 01 00  

11 01 01 00  14 01 01 00  02 02 01 00  01 01 02 00  

02 01 02 00  03 01 02 00  04 01 02 00  05 01 02 00  

01 01 01 01  02 01 01 01  03 01 01 01  05 01 01 01  

04 01 01 01  01 01 02 01  02 01 02 01  03 01 02 01

REMOTE_NDIS_SET_MSG

HOST 发送 REMOTE_NDIS_SET_MSG设置指定OID的参数信息

例程:05 00 00 00  20 00 00 00  0c 00 00 00  0e 01 01 00  04 00 00 00  14 00 00 00  00 00 00 00  0b 00 00 00

解析:

05 00 00 00  

20 00 00 00  

0c 00 00 00  RequestId 

0e 01 01 00  Oid

04 00 00 00  长度

14 00 00 00  偏移

00 00 00 00  DeviceVcHandle

0b 00 00 00  数据

REMOTE_NDIS_SET_CMPLT

Deivce 响应REMOTE_NDIS_SET_MSG 反馈 REMOTE_NDIS_SET_CMPLT

例程:05 00 00 80  10 00 00 00  0c 00 00 00  00 00 00 00

解析:

05 00 00 80  

10 00 00 00  

0c 00 00 00 RequestId

00 00 00 00 Status

REMOTE_NDIS_KEEPALIVE_MSG

当没有其他控制或数据流量从设备发送到总线定义的 KeepAliveTimeoutPeriod 主机时,
主机会定期发送此消息。 在没有其他消息流量的情况下,主机至少每
RNDIS_KEEPALIVE_TIMEOUT秒发送一次此消息,以检测远程设备的状态。 远程设备可以
在相反方向使用相同的消息,但这不是必需的。

例程:08 00 00 00  0c 00 00 00  6f 00 00 00 

REMOTE_NDIS_KEEPALIVE_CMPLT

设备将通过发送 REMOTE_NDIS_KEEPALIVE_CMPLT 响应消息来响应来自主机
的REMOTE_NDIS_KEEPALIVE_MSG消息。 如果返回的状态未RNDIS_STATUS_SUCCESS,
主机将发送 REMOTE_NDIS_RESET_MSG 来重置设备。

例程:08 00 00 80  10 00 00 00  6f 00 00 00  00 00 00 00  

其他消息可以参考

https://learn.microsoft.com/zh-cn/windows-hardware/drivers/network/remote-ndis-messaging

REMOTE_NDIS_PACKET_MSG

REMOTE_NDIS_PACKET_MSG封装 NDIS 数据包以形成单个数据消息。

串联多个REMOTE_NDIS_PACKET_MSG元素会形成多包消息。 每个单独的REMOTE_NDIS_PACKET_MSG组件都按如下所述构造。 与单数据包消息的区别在于,每个REMOTE_NDIS_PACKET_MSG标头中的 MessageLength 字段包括一些额外的填充字节。 这些填充字节将追加到除最后一个REMOTE_NDIS_PACKET_MSG,以便后续REMOTE_NDIS_PACKET_MSG从适当的字节边界开始。 对于从设备发送到主机的消息,此填充应导致每个REMOTE_NDIS_PACKET_MSG从多包消息开头开始的字节偏移量为 8 个字节的倍数。 当主机向设备发送多包消息时,它将遵循设备指定的 PacketAlignmentFactor 。

下表中定义了REMOTE_NDIS_PACKET_MSG格式。

下表中指明了单个 OOB 数据记录的格式。

下表定义了每数据包信息数据记录的格式。

01 00 00 00  cb 00 00 00  24 00 00 00  9f 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  

00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  

33 33 00 01  00 02 目的地址

22 9b  f9 76 8b 9f    源地址

86 dd 类型IPV6

60 05  ae 5e 00 69  11 01 fe 80  00 00 00 00 00 00 a9 10  18 cc 9c a7  b1 5c ff 02  00 00 00 00  00 00 00 00  00 00 00 01 00 02 02 22  02 23 00 69  47 37 01 64  82 1d 00 08  00 02 00 00  00 01 00 0e  00 01 00 01  2b 51 18 be 00 e0 70 eb  e4 33 00 03  00 0c 28 d6  e1 31 00 00  00 00 00 00  00 00 00 27  00 13 00 11 59 46 5a 58  2d 43 48 45  4e 4c 49 41  4e 44 49 4e  47 00 10 00  0e 00 00 01  37 00 08 4d 53 46 54 20  35 2e 30 00  06 00 08 00  11 00 17 00  18 00 27

报文2:

01 00 00 00  56 00 00 00  24 00 00 00  2a 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00 00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  

ff ff ff ff  ff ff

22 9b f9 76 8b 9f  源地址

08 06  //类型 ARP请求

00 01  08 00 06 04 00 01 22 9b  f9 76 8b 9f  00 00 00 00  00 00 00 00  00 00 c0 a8  01 6a   

无连接 ((如 802.3) )和面向连接的 ((如 ATM) 设备)使用相同的数据包消息结构来简
化数据包处理的通用代码。 每个 REMOTE_NDIS_PACKET_MSG 消息都包含有关单个网络
数据单元的信息, (以太网 802.3 帧) 。详细报文结构如下:

   

参考:

远程 NDIS 消息传送 - Windows drivers | Microsoft Learn

USB中文网 - USB技术开发交流

STM32驱动开发(二)--USB Device RNDIS虚拟网卡(usb hound抓包完整数据流分析)_stm32 usb rndis驱动-CSDN博客

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号