三、RNDIS网卡
RNDIS 是 Remote Network Driver Interface Specification(远程网络驱动程序接口规范) 的首字母缩写,实际上的作用为 TCP/IP over USB,也即视 USB 设备(如手机)为网卡,是基于USB实现RNDIS实际上就是TCP/IP over USB,从而使 Windows 可以通过 USB 设备连接网络。
TCP/IP 协议族,简称为 TCP/IP, 其名称源于其最早的两个核心协议 TCP(Transmission Control Protocol,传输控制协议)和 IP (Internet Protocol,网际协议),它规定了设备连接网络的方式以及数据如何传输的标准。
8910平台支持RNDIS功能,并且默认处于开启状态。模块只要能联网,正常情况下只要将模块接入电脑(windows、linux)电脑就会识别出来一块网卡,不需要经历ppp拨号那样复杂的流程就可以访问联网。
3.1、控制接口
3.1.1、RNDIS控制接口描述符(9字节)
字段 | 长度(位) | 偏移量(位) | 十六进制值 | 说明 |
---|---|---|---|---|
bLength | 8 | 136 | 0x09 | 描述符大小为9字节 |
bDescriptorType | 8 | 144 | 0x04 | 接口描述符类型 |
bInterfaceNumber | 8 | 152 | 0x00 | 此接口号的索引为0。 |
bAlternateSetting | 8 | 160 | 0x00 | 用于选择此接口的备用设置的值为0 |
bNumEndpoints | 8 | 168 | 0x01 | 此接口使用的端点数为1(不包括端点0) |
bInterfaceClass | 8 | 176 | 0xE0 | 接口实现无线控制器类 |
bInterfaceSubClass | 8 | 184 | 0x01 | 接口实现射频控制器子类 |
bInterfaceProtocol | 8 | 192 | 0x03 | 接口使用设备线适配器同步流接口协议 |
iInterface | 8 | 200 | 0x03 | 接口字符串描述符索引为3 |
3.1.2、RNDIS CDC Header功能描述符(5字节)
Header功能描述符表示功能描述符的开始,其他紧跟的内容就是此设备的功能描述符的内容。bcdCDC表示的是CDC的版本。
字段 | 长度(位) | 偏移量(位) | 十六进制值 | 说明 |
---|---|---|---|---|
bLength | 8 | 208 | 0x05 | 描述符的大小,以字节为单位 |
bDescriptorType | 8 | 216 | 0x24 | 描述符类型 |
bDescriptorSubType | 8 | 224 | 0x00 | 描述符子类型 |
bcdCDC | 16 | 232 | 0x0110 | USB通信类定义通信规范1.10版 |
3.1.3、RNDIS CDC Call Management功能描述符(4字节)
Call Management描述的就是电话相关的东西,AT指令集的支持情况。 bDataInterface表示如有电话时,电话数据内容对应的接口号。
字段 | 长度(位) | 偏移量(位) | 十六进制值 | 说明 |
---|---|---|---|---|
bLength | 8 | 248 | 0x05 | 描述符的大小,以字节为单位 |
bDescriptorType | 8 | 256 | 0x24 | 描述符类型 |
bDescriptorSubType | 8 | 264 | 0x01 | 描述符子类型 |
bmCapabilities | 8 | 272 | 0x00 | Bit0:设备是否自己处理呼叫管理1 Bit1:设备是否可以通过数据类接口发送/接收呼叫管理信息0 |
bDataInterface | 8 | 280 | 0x01 | 可选用于呼叫管理的数据类接口的接口号 |
3.1.4、RNDIS CDC ACM功能描述符(4字节)
ACM(Abstract Control Model),即抽象控制模型,PSTN下,除了ACM模型还有还有DLM(Direct Line Mode), TCM(Telephone Control Model)。
字段 | 长度(位) | 偏移量(位) | 十六进制值 | 说明 |
---|---|---|---|---|
bLength | 8 | 288 | 0x04 | 描述符的大小,以字节为单位 |
bDescriptorType | 8 | 296 | 0x24 | 描述符类型 |
bDescriptorSubType | 8 | 304 | 0x02 | 描述符子类型 |
bmCapabilities | 8 | 312 | 0x00 | 第0位:设备是否支持Set_Comm_Feature、Clear_Comm_Feature和Get_Comm_Feature的组合请求 第1位:设备是否支持Set_Line_Coding、Set_Control_Line_State、Get_Line_Coding和Serial_State 1的通知组合 |
3.1.5、RNDIS CDC Union功能描述符(5字节)
Union描述符就是用来告诉主机端,哪些接口是联合在一起的,对应着一个功能,这个功能需要主机装载对应的驱动来实现,因此,功能与驱动是一对一的关系。这里bControlInterface值为0,则表示接口0为控制接口,bSubBoardinateInterface0值为1,表示接口1为控制接口0的下级接口,即数据接口。在CDC标准中,控制接口是必须的,而数据接口是可选的,因此,数据接口为控制接口的附属。
字段 | 长度(位) | 偏移量(位) | 解码 | 十六进制值 | 说明 |
---|---|---|---|---|---|
bLength | 8 | 320 | 0x05 | 0x05 | 描述符的大小,以字节为单位 |
bDescriptorType | 8 | 328 | 0x24 | 0x24 | 描述符类型 |
bDescriptorSubType | 8 | 336 | 0x06 | 0x06 | 描述符子类型 |
bControlInterface | 8 | 344 | 0x00 | 0x00 | 通信或数据类接口的接口号 |
bSubordinateInterface0 | 8 | 352 | 0x01 | 0x01 | 下级接口的接口号 |
3.1.6、RNDIS 通知端点描述符(7字节)
字段 | 长度(位) | 偏移量(位) | 十六进制值 | 说明 |
---|---|---|---|---|
bLength | 8 | 360 | 0x07 | 描述符大小为7字节 |
bDescriptorType | 8 | 368 | 0x05 | 端点描述符类型 |
bEndpointAddress | 8 | 376 | 0x82 | 这是端点号为2的输入端点 |
bmAttributes | 8 | 384 | 0x03 | 类型-传输:中断 低功耗:无 Pkt大小调整:无 |
wMaxPacketSize | 16 | 392 | 0x0008 | 此终结点的最大数据包大小为8字节。如果是高速,则每帧增加0个事务 |
bInterval | 8 | 408 | 0x09 | 轮询间隔值为每9帧。如果高速,每256帧 |
3.2、数据接口
3.2.1、RNDIS数据接口描述符(9字节)
字段 | 长度(位) | 偏移量(位) | 十六进制值 | 说明 |
---|---|---|---|---|
bLength | 8 | 416 | 0x09 | 描述符大小为9字节 |
bDescriptorType | 8 | 424 | 0x04 | 接口描述符类型 |
bAlternateSetting | 8 | 432 | 0x01 | 此接口号为1。 |
bAlternateSetting | 8 | 440 | 0x00 | 用于选择此接口的备用设置的值为0 |
bNumEndpoints | 8 | 448 | 0x02 | 此接口使用的端点数为2(不包括端点0) |
bInterfaceClass | 8 | 456 | 0x0A | 接口实现数据接口类 |
bInterfaceProtocol | 8 | 472 | 0x00 | 接口使用不需要特定于类的协议 |
bInterfaceSubClass | 8 | 464 | 0x00 | 子类编码为0 |
iInterface | 8 | 480 | 0x04 | 接口字符串描述符索引为4 |
3.2.2、RNDIS数据输入端点描述符(7字节)
字段 | 长度(位) | 偏移量(位) | 十六进制值 | 说明 |
---|---|---|---|---|
bLength | 8 | 488 | 0x07 | 描述符大小为7字节 |
bDescriptorType | 8 | 496 | 0x05 | 端点描述符类型 |
bEndpointAddress | 8 | 504 | 0x81 | 这是端点号为1的IN端点 |
bmAttributes | 8 | 512 | 0x02 | 类型-传输:批量 包大小调整:否 |
wMaxPacketSize | 16 | 520 | 0x0200 | 此终结点的最大数据包大小为512字节。如果是高速,则每帧增加0个事务 |
bInterval | 8 | 536 | 0x00 | 轮询间隔值为每0帧。高速未定义 |
3.2.3、RNDIS数据输出端点描述符(7字节)
字段 | 长度(位) | 偏移量(位) | 十六进制值 | 说明 |
---|---|---|---|---|
bLength | 8 | 544 | 0x07 | 描述符大小为7字节 |
bDescriptorType | 8 | 552 | 0x05 | 端点描述符类型 |
bEndpointAddress | 8 | 560 | 0x01 | 这是端点号为1的输出端点 |
bmAttributes | 8 | 568 | 0x02 | 类型-传输:批量 包大小调整:否 |
wMaxPacketSize | 16 | 576 | 0x0200 | 此终结点的最大数据包大小为512字节。如果是高速,则每帧增加0个事务 |
bInterval | 8 | 592 | 0x00 | 轮询间隔值为每0帧。 |