USB ncm虚拟网卡

NCM介绍

1 功能

USB NCM,属于USB-IF定义的CDC(Communication Device Class)下的一个子类:Network Control Model,用于Host和Device之间交换以太网帧。这些以太网帧可以传输在通信网络上传输的IPv4或IPv6数据报。NCM主要用于高速网络场景下比如HSPA和LTE数据服务。NCM协议规范基于ECM(Ethernet Control Model )改进而来,支持了更高的数据率。

ECM和NCM都适用于IEEE 802.3类型的以太网功能,可以将IP流量传输到外部网络。ECM是为USB全速设备设计的,特别是支持docsis 1.0电缆调制解调器。尽管ECM功能完备,但它在吞吐量或效率上不能很好地扩展到更高的USB速度和更高的网络速度。NCM借鉴了ECM实现中获得的经验,调整了数据传输协议,使它效率更加高。

使用NCM的主要优点在于它在单个USB批量传输中传输多个数据报的方法。除了减少中断开销之外,NCM规范还允许数据的发送方在程序中设置数据报大小。

NCM功能由NCM通信接口和NCM数据接口实现。NCM通信接口主要用于配置和管理组网功能。NCM数据接口用于传输数据,使用该接口定义的端点。

2 协议层次

主机驱动与NCM功能设备之间的逻辑连接、控制连接和数据连接示意图

3 数据传输

NCM允许设备和主机使用一个USB传输有效地传输一个或多个以太网帧。USB传输被格式化为NCM传输块(NTB)。

有两种NTB格式:NTB-16和NTB-32。前者用来表示长度小于64K的NTB,后者用来表示不超过4GB的NTB。

https://download.csdn.net/download/qq_36201603/86448967

虚拟网卡配置和测试

1.开发板设置

  1. 首先关闭USB的host功能,打开usb gadget功能。

进入到USB gadget support,打开USB Peripheral Controller,Anyka usb device Port, udc driver support(usb-otg)对应平台的UDC设备控制,让USB控制器运行在device模式。

配置function为NCM,可手动link,也可以setprop通过sys.usb.config属性等方式调用RC文件来生效

配置IP地址,启动网卡

// 切换为device模式 
echo peripheral > /sys/devices/platform/usb0/dwc3_mode 

//查看功能函数
ls -l  /config/usb_gadget/g1/configs/b.1
-rw-r--r-- 1 root root 4096 1970-01-01 08:00 MaxPower
-rw-r--r-- 1 root root 4096 2022-07-18 01:42 bmAttributes
lrwxrwxrwx 1 root root    0 2022-07-18 01:42 f1 -> ../../../../usb_gadget/g1/functions/ffs.ncm
drwxr-xr-x 3 root root    0 1970-01-01 08:00 strings 

//开启网卡设置IP地址
ifconfig usb0 10.1.9.101 up

连接电脑可在设备管理器查看usbncm网卡设备

2.主机端设置

win11配置该网卡地址:10.1.9.33 设置 USB 网卡的 IP 地址和设备的 usb0 的 IP 地址在同一网段

网关:10.1.9.101 网关地址为开发板的USB IP地址

主机端可以使用Windows,linux,也可以使用开发板

netsh interface ipv4 add address name="以太网 3" 10.1.9.33 255.255.255.0 10.1.9.101

问题1:

使用开发板直接ping主机无法ping通

指定网卡可以ping通,应该是路由策略问题,需要设置路由策略

console:/ # ping -I usb0 10.1.9.33             //指定网卡可以ping通 //应该是路由策略问题
PING 10.1.9.33 (10.1.9.33) from 10.1.9.101 usb0: 56(84) bytes of data.
64 bytes from 10.1.9.33: icmp_seq=1 ttl=128 time=1.35 ms
64 bytes from 10.1.9.33: icmp_seq=2 ttl=128 time=1.56 ms
64 bytes from 10.1.9.33: icmp_seq=3 ttl=128 time=1.68 ms
64 bytes from 10.1.9.33: icmp_seq=4 ttl=128 time=1.88 ms
64 bytes from 10.1.9.33: icmp_seq=5 ttl=128 time=1.81 ms

console:/ ip route 
10.1.9.0/24 dev usb0 proto kernel scope link src 10.1.9.101
console:/ ip rule 
0: from all lookup local 
10000: from all fwmark 0xc0000/0xd0000 lookup legacy_system 
10500: from all iif lo oif dummy0 uidrange 0-0 lookup dummy0 
13000: from all fwmark 0x10063/0x1ffff iif lo lookup local_network 
14000: from all iif lo oif dummy0 lookup dummy0 
15000: from all fwmark 0x0/0x10000 lookup legacy_system 
16000: from all fwmark 0x0/0x10000 lookup legacy_network 
17000: from all fwmark 0x0/0x10000 lookup local_network 
32000: from all unreachable 
console:/ ip rule add from all lookup main pref 9000

之后就可以ping通了

3.使用iperf3测试网络速度

windows需要下载iperf3 工具

C:\Windows\system32>iperf3 -s
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------

开发板自带

console:/ # which iperf3        //查看iperf3所在路径
/system/bin/iperf3 

console:/ # iperf3 -s          //Server端开启iperf的服务器模式 
----------------------------------------------------------- 
Server listening on 5201 
------------------------------- 

console:/ # iperf3 -c 10.1.9.33

iperf3: error

iperf3: error - unable to create a new stream: No such file or directory

根目录下没有tmp,也无法手动挂载

android/external/iperf3/src/iperf_api.c

     char* tempdir = getenv("TMPDIR");
        if (tempdir == 0){
            tempdir = getenv("TEMP");
          }
          if (tempdir == 0){
              tempdir = getenv("TMP");
          }
          if (tempdir == 0){
              tempdir = "/tmp";


console:/ # export TMP=/data

相关文章

学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习...
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面...
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生...
Can’t connect to local MySQL server through socket \'/v...
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 ...
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服...