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。

虚拟网卡配置和测试

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

USB ncm虚拟网卡的更多相关文章

  1. 二十、网卡框架分析、虚拟网卡驱动和DM9621驱动分析

    一.网络设备驱动的结构 网卡设备不同于字符设备和块设备, 网络设备并不对应于/dev目录下的文件,它存放在/sys/class/net目录下. Linux系统对网络设备驱动定义了四个层次: 1. 网络 ...

  2. USB NCM介绍

    ​1 功能概述 USB NCM,属于USB-IF定义的CDC(Communication Device Class)下的一个子类:Network Control Model,用于Host和Device ...

  3. 删除Windows中隐藏的物理网卡和网络虚拟化失败后的虚拟网卡

    Windows环境下,在更换硬件服务器主板和网卡等硬件.恢复操作系统或者网络虚拟化失败后,可能会出现网卡方面的问题.例如,设备管理器中多了不应该存在的网卡:因命名冲突无法重命名当前网络连接:IP地址冲 ...

  4. 【强烈推荐】利用NAT、Host-Only双虚拟网卡,实现Virtual Box中CentOS6.3联网

    问题背景: 先前都是在Virtual Box中以“网络共享”方式,让里面的Linux虚拟机Host-Only方式联网,参考如下: Virtual Box下配置Host-Only联网方式详解 但最近被公 ...

  5. C#如何获取物理网卡,虚拟网卡,以及无线网卡

    就不废话了,直接上代码 /// <summary></summary> /// 显示本机各网卡的详细信息 /// <summary></summary> ...

  6. Ubuntu 14.10 创建虚拟网卡实现桥接网络

    目标需求:在Ubuntu主机创建一张虚拟网卡,使得搭建在VirtualBox中的其他主机能借助虚拟网卡构建的局域网进行相互间的通讯 步骤一:准备工具包 安装 uml-utilities 以及 brid ...

  7. CentOS设置虚拟网卡做NAT方式和Bridge方式桥接

    CentOS设置虚拟网卡做NAT方式和Bridge方式桥接 http://www.centoscn.com/CentOS/config/2015/0225/4736.html 摘要:KVM虚拟机网络配 ...

  8. 通过桥接虚拟网卡使VMWare和宿主机实现双向通讯

    0.为什么选择虚拟网卡和桥接模式 首先虚拟机网络设置为NAT,虚拟机实现上网是很方便的,但是宿主机访问虚拟机就比较麻烦了(需要单独配置端口转发),桥接就能很好的解决这个问题,桥接模式会把虚拟机当做宿主 ...

  9. 解决vmware安装 win7 后 没有虚拟网卡驱动 不能上网的问题

    项目需要用到win7 32位系统,于是装个虚拟机,换了好几个系统资源,都是没有网卡驱动, XP 2003 都能上网唯独WIN7 不行,安装vmware tools也不管用,终于找到了这个东西.vmwa ...

  10. 【已解决】Vmware无法创建虚拟网卡的问题

    最近因为各种需要,要在虚拟机里使用桥接方式连接.但是不管怎么操作,都无法添加虚拟网卡.连续好多天需要用到桥接上网,今儿多方搜索,找到了解决方案. 参考资料:http://tieba.baidu.com ...

随机推荐

  1. 【MySQL】java.sql.SQLException: Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='

    问题原因参考: http://t.zoukankan.com/zhulei2-p-13451554.html collations 排序规则 Illegal mix 非法混合 SQL报错指出,操作符等 ...

  2. 【Java】Reflection 反射机制 02获取类的一切

    先创建一个可演示的类 注解类 package cn.dai.Reflection.demo; import java.lang.annotation.ElementType; import java. ...

  3. 【Git】03 撤销 & 版本回退

    回退分为三种情况,每种情况对应了我们文件的存储区域 工作区 | 暂存区 | 版本区(当前分支) 1.文件可能存放在工作区,没有被Git追踪[红色标记状态] 2.文件可能已经添加到暂存区,没有被Git提 ...

  4. FFmpeg开发笔记(四十四)毕业设计可做的几个拉满颜值的音视频APP

    ​一年一度的毕业季就要到了,毕业设计算是大学生毕业前的最后一个大作业,尤其是计算机相关专业的毕业设计,通常要通过编程开发一个软件,比如开发一个图书馆管理系统,开发一个电商APP等等. 一个好的毕业设计 ...

  5. python运行报警告:Cython directive 'language_level' not set, using '3str' for now (Py3)

    相关: https://stackoverflow.com/questions/34603628/how-to-specify-python-3-source-in-cythons-setup-py ...

  6. 七牛云-存储区域代码:报错:"statusCode": 400,"error": incorrect region, please use up-cn-east-2.qiniup.com ——【图床】Typora 七牛云图床 配置文件

    使用PicList对七牛云配置图床,报错信息: 2023-12-13 19:52:19 [PicList ERROR] { "method": "POST", ...

  7. python网络连接报错:ValueError("Unable to determine SOCKS version from %s" % proxy_url) ValueError: Unable to determine SOCKS version from socks://192.168.1.100:1080/

    python应用proxy网络连接报错: return super().send(request, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...

  8. python中不同方法的按索引读取数组的性能比较——哪种按索引读取数组的性能更好

    写python代码这么多年,从来也没有想过不同方式的读取python数组会有什么太大的性能差距,不过这段时间写代码突然发现这个差别还挺大,于是就多研究了一下. 本文研究的是使用不同方式来对python ...

  9. git 如何在本地批量删除匹配名称分支

    背景 有时间创建了一大堆的dev/*分支,远程合并完就删除了,但本地还留下一大堆,自己又忘记删除了.一个个删除太麻烦.后面发现居然有批量删除的方法 备注:这里是window下powershell的命令 ...

  10. Leetcode: 1484. Groups Sold Products By The Date

    题目要求如下: 输入的数据为 要求按照日期查询出每日销售数量及相应产品的名称,并按照字符顺序进行排序. 下面是实现的代码: import pandas as pd def categorize_pro ...