Android f_rndis 分析笔记

本文详细介绍了RNDIS(远程网络驱动器接口规范),分析了其在Linux开源社区中的应用困境,以及在Android系统中`f_rndis`模块的代码实现,包括数据结构、接口配置、以太网功能驱动初始化等关键步骤,揭示了RNDIS在USB通信中的复杂性和限制。
摘要由CSDN通过智能技术生成

背景说明

RNDIS是一个以太网端口 ( Ethernet port )。最开始是微软控制的,用以取代 CDC Ethernet 的协议。

公开发布的 RNDIS规范很模糊,并且不必要的复杂。 ActiveSync 等规范术语使情况更糟糕。

简而言之,它是一个微软控制的,而不是开源生态系统控制的协议。 Linux 支持它仅仅是因为微软不支持 CDC以太网标准。


RNDIS数据传输模型很复杂,每个USB 消息都包含了多个以太网包。

RNDIS默认期待自己作为USB配置中的唯一功能;因此你不能把它用于USB复合设备;并且它期待自己是第一个usb配置。


很不幸,微软的RNDIS驱动程序充满了bug,经常死机或者系统冻结,且经常和规范矛盾。

对于Linux开源社区而言,既然改正这些bug, 或者从微软拿到精确的RNDIS规范文档从而绕过它都不可能,

也许你可以避免使用 RNDIS。


代码分析

kernel/drivers/usb/gadget/f_rndis.c 文件开头即定义了 f_rndis 数据结构

struct f_rndis {
	struct gether			port;
	u8				ctrl_id, data_id;
	u8				ethaddr[ETH_ALEN];
	u32				vendorID;
	const char			*manufacturer;
	int				config;

	struct usb_ep			*notify;
	struct usb_request		*notify_req;
	atomic_t			notify_count;
};

随后,f_rndis.c 分别定义了各种  usb 接口 和 usb 描述符。
static struct usb_interface_descriptor rndis_control_intf = {
	.bLength =		sizeof rndis_control_intf,
	.bDescriptorType =	USB_DT_INTERFACE,

	/* status endpoint is optional; this could be patched later */
	.bNumEndpoints =	1,
	.bInterfaceClass =	USB_CLASS_COMM,
	.bInterfaceSubClass =   USB_CDC_SUBCLASS_ACM,
	.bInterfaceProtocol =   USB_CDC_ACM_PROTO_VENDOR,
};

其后, 分别定义了 full speed, high speed, super speed的描述符。
static struct usb_descriptor_header *eth_ss_function[] = {
	(struct usb_descriptor_header *) &rndis_iad_descriptor,

	/* control interface matches ACM, not Ethernet */
	(struct usb_descriptor_header *) &rndis_control_intf,
	(struct usb_descriptor_header *) &header_desc,
	(struct usb_descriptor_header *) &call_mgmt_descriptor,
	(struct usb_descriptor_header *) &rndis_acm_descriptor,
	(struct usb_descriptor_header *) &rndis_union_desc,
	(struct usb_descriptor_header *) &ss_notify_desc,
	(struct usb_descriptor_header *) &ss_intr_comp_desc,

	/* data interface has no altsetting */
	(struct usb_descriptor_he
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值