创建USB虚拟网卡
在用户空间如何创建USB Gadget设备,并使用该设备来模拟网卡?在看到这篇[博客](Android USB之复合设备(gadget)详解 - sheldon_blogs - 博客园)的时候,看到里面有对于configfs的介绍:
configfs是基于ram的文件系统,与sysfs的功能有所不同。sysfs是基于文件系统的kernel对象视图,虽然某些属性允许用户读写,但对象是在kernel中创建、注册、销毁,由kernel控制其生命周期。而configfs是一个基于文件系统的内核对象管理器(或称为config_items),config_items在用户空间通过mkdir显式的创建,使用rmdir销毁,在mkdir之后会出现对应的属性,可以在用户空间对这些属性进行读写,与sysfs不同的是,这些对象的生命周期完全由用户空间控制,kernel只需要响应用户空间的操作即可。configfs和sysfs两者可以共存,但不能相互取代。
这里我们就是要利用configfs来创建设备并模拟网卡。如何创建呢?
1 挂载configfs
mount -t configfs none /sys/kernel/config
2 创建Gadget框架
mkdir /sys/kernel/config/usb_gadget/eth
上面这个命令创建一个名为"eth"的USB Gadget设备框架。
3 创建设备描述符
echo 0x046b > /sys/kernel/config/usb_gadget/eth/idVendor # 厂商ID
echo 0xFFb0 > /sys/kernel/config/usb_gadget/eth/idProduct # 产品ID
echo 0x02 > /sys/kernel/config/usb_gadget/eth/bDeviceClass # 设备类(通信设备类)
echo 0x00 > /sys/kernel/config/usb_gadget/eth/bDeviceSubClass # 子类
echo 0x00 > /sys/kernel/config/usb_gadget/eth/bDeviceProtocol # 协议
echo 0x0100 > /sys/kernel/config/usb_gadget/eth/bcdDevice # 设备版本号(BCD码)
上述的具体信息根据实际情况进行修改。
4 创建字符串描述符
mkdir /sys/kernel/config/usb_gadget/eth/strings/0x409 # 创建字符串描述符目录
echo 1234567890. > /sys/kernel/config/usb_gadget/eth/strings/0x409/serialnumber # 序列号
echo American Megatrends Inc. > /sys/kernel/config/usb_gadget/eth/strings/0x409/manufacturer # 制造商
echo Virtual Ethernet. > /sys/kernel/config/usb_gadget/eth/strings/0x409/product # 产品名
5 创建配置
每一种配置表示一种工作模式,每一种配置是一个独立的文件夹。
mkdir configs/<name>.<number>
mkdir configs/c.1
5.1 创建RNDIS配置
mkdir /sys/kernel/config/usb_gadget/eth/configs/c.1
echo 0 > /sys/kernel/config/usb_gadget/eth/configs/c.1/MaxPower # 最大功耗(单位是2mA,0表示自供电)
echo 0xC0 > /sys/kernel/config/usb_gadget/eth/configs/c.1/bmAttributes # 属性(自供电,不支持远程唤醒)
mkdir /sys/kernel/config/usb_gadget/eth/configs/c.1/strings/0x409 # 配置的字符串描述
5.2 创建ECM配置
mkdir /sys/kernel/config/usb_gadget/eth/configs/c.2
echo 0 > /sys/kernel/config/usb_gadget/eth/configs/c.2/MaxPower
echo 0xC0 > /sys/kernel/config/usb_gadget/eth/configs/c.2/bmAttributes
mkdir /sys/kernel/config/usb_gadget/eth/configs/c.2/strings/0x409
6 创建功能描述符
功能代表设备提供的具体能力(如网络、大容量存储等):
# 创建ECM功能(CDC Ethernet Control Model)
mkdir /sys/kernel/config/usb_gadget/eth/functions/ecm.usb0
# 创建RNDIS功能(Microsoft的远程网络驱动接口规范)
mkdir /sys/kernel/config/usb_gadget/eth/functions/rndis.usb0
# 设置RNDIS的OS描述符(用于Windows兼容性)
echo RNDIS > /sys/kernel/config/usb_gadget/eth/functions/rndis.usb0/os_desc/interface.rndis/compatible_id
echo 5162001 > /sys/kernel/config/usb_gadget/eth/functions/rndis.usb0/os_desc/interface.rndis/sub_compatible_id
7 关联功能和配置
# 将ECM功能链接到配置c.2
cd /sys/kernel/config/usb_gadget/eth && ln -s functions/ecm.usb0 configs/c.2/
# 将RNDIS功能链接到配置c.1
cd /sys/kernel/config/usb_gadget/eth && ln -s functions/rndis.usb0 configs/c.1/
# 将配置c.1链接到os_desc目录(供Windows使用)
cd /sys/kernel/config/usb_gadget/eth && ln -s configs/c.1 os_desc/c.1
将功能与配置关联起来。这样,当主机选择某个配置时,相应的功能就被激活。
8 启用设备
为了启用gadget,它必须绑定到UDC (USB设备控制器):
echo <udc name> > UDC
其中
echo 1e6a0000.usb-vhub:p3 > /sys/kernel/config/usb_gadget/eth/UDC
Reference
通过configfs配置的Linux USB gadget - 闹闹爸爸 - 博客园
linux主机通过USB使用arm linux开发板网络 - 闹闹爸爸 - 博客园
linux usb gadget驱动详解(二)_linux usb gadget 盘符-CSDN博客

浙公网安备 33010602011771号