当前位置:   article > 正文

USB ncm虚拟网卡

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地址,启动网卡

  1. // 切换为device模式
  2. echo peripheral > /sys/devices/platform/usb0/dwc3_mode
  3. //查看功能函数
  4. ls -l /config/usb_gadget/g1/configs/b.1
  5. -rw-r--r-- 1 root root 4096 1970-01-01 08:00 MaxPower
  6. -rw-r--r-- 1 root root 4096 2022-07-18 01:42 bmAttributes
  7. lrwxrwxrwx 1 root root 0 2022-07-18 01:42 f1 -> ../../../../usb_gadget/g1/functions/ffs.ncm
  8. drwxr-xr-x 3 root root 0 1970-01-01 08:00 strings
  9. //开启网卡设置IP地址
  10. 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通,应该是路由策略问题,需要设置路由策略

  1. console:/ # ping -I usb0 10.1.9.33 //指定网卡可以ping通 //应该是路由策略问题
  2. PING 10.1.9.33 (10.1.9.33) from 10.1.9.101 usb0: 56(84) bytes of data.
  3. 64 bytes from 10.1.9.33: icmp_seq=1 ttl=128 time=1.35 ms
  4. 64 bytes from 10.1.9.33: icmp_seq=2 ttl=128 time=1.56 ms
  5. 64 bytes from 10.1.9.33: icmp_seq=3 ttl=128 time=1.68 ms
  6. 64 bytes from 10.1.9.33: icmp_seq=4 ttl=128 time=1.88 ms
  7. 64 bytes from 10.1.9.33: icmp_seq=5 ttl=128 time=1.81 ms
  8. console:/ ip route
  9. 10.1.9.0/24 dev usb0 proto kernel scope link src 10.1.9.101
  10. console:/ ip rule
  11. 0: from all lookup local
  12. 10000: from all fwmark 0xc0000/0xd0000 lookup legacy_system
  13. 10500: from all iif lo oif dummy0 uidrange 0-0 lookup dummy0
  14. 13000: from all fwmark 0x10063/0x1ffff iif lo lookup local_network
  15. 14000: from all iif lo oif dummy0 lookup dummy0
  16. 15000: from all fwmark 0x0/0x10000 lookup legacy_system
  17. 16000: from all fwmark 0x0/0x10000 lookup legacy_network
  18. 17000: from all fwmark 0x0/0x10000 lookup local_network
  19. 32000: from all unreachable
  20. console:/ ip rule add from all lookup main pref 9000

之后就可以ping通了

3.使用iperf3测试网络速度

windows需要下载iperf3 工具

  1. C:\Windows\system32>iperf3 -s
  2. -----------------------------------------------------------
  3. Server listening on 5201
  4. -----------------------------------------------------------

开发板自带

  1. console:/ # which iperf3 //查看iperf3所在路径
  2. /system/bin/iperf3
  3. console:/ # iperf3 -s //Server端开启iperf的服务器模式
  4. -----------------------------------------------------------
  5. Server listening on 5201
  6. -------------------------------
  7. 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

  1. char* tempdir = getenv("TMPDIR");
  2. if (tempdir == 0){
  3. tempdir = getenv("TEMP");
  4. }
  5. if (tempdir == 0){
  6. tempdir = getenv("TMP");
  7. }
  8. if (tempdir == 0){
  9. tempdir = "/tmp";
  10. console:/ # export TMP=/data

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/991675
推荐阅读
相关标签
  

闽ICP备14008679号