CDC-ECM 和 RNDIS

article/2025/9/18 18:27:56

 

 

  • Home
  • Categories
  • Tags
  • About
  • Feed

CDC-ECM 和 RNDIS

Category: network      Tags:   network  linux  wifi

###1. USB-CDC

USB协议中的的CDC类是USB通信设备类 (Communication Device Class) 的简称, CDC类是USB组织定义的一类专门给各种通信设备(电信通信设备和中速网络通信设备)使用的USB子类, 而USB-cdc又可以分为几个子类

  • CDC-ACM : Abstract Control Model
    • ACM driver将usb设备视为一个虚拟的modem或者com口, driver能够通过ACM来发送data和AT command (使用不同的channel), 或者通过模拟串口发送data和AT command
  • CDC-ECM : Ethernet Networking Control Model
    • ECM 协议能够在device和host之间交换ethernet frame, 符合ECM规范的设备, 认为自己是注解的一个虚拟的网络接口, 可以被分配MAC和IP, 通常使用ECM的设比是 LAN/WAN适配器
  • CDC-NCM : Network Control Model
    • NCM 协议用于在device和host之间, 交换高速的ethernet frame, 符合ECM规范的设备, 认为自己是注解的一个虚拟的网络接口, 可以被分配MAC和IP,常见的使用NCM的设备是 支持3.5G/4G网络(例如 HSPA+ 和 LTE)的无线适配器

每一个子类都由一个通信接口类和一个数据接口类组成

定义了这样的一系列协议的好处是: usb 主/从 机都支持这些协议后, 就可以使用通用的设备驱动

###2. CDC-ECM

以太网控制模型是用在主从设备间的以太网帧数据的交换, 其中,

  • 通信类接口用于配置和管理以太网程序
  • 数据接口则用于在USB总线上交换USB数据包,这些USB数以的包封装了完整的以太网包。CRC校验和不能包含在以太网收发数据包中。检验失败的帧数据不能再发送到主机。这意味着设备必须能够缓冲至少一个完整的以太网帧数据

cdc-ecm

###3. RNDIS

RNDIS (Remote network Driver Interface Specification) 协议是微软对于 CDC-ECM 的变种实现,主要用于简化windows平台中usb网络设备的驱动开发, RNDIS网络协议栈如图所示

RNDIS数据传输模型很复杂,每个USB消息都包含了多个以太网包, RNDIS默认期待自己作为USB配置中的唯一功能, 所以对于USB复合设备需要注意,RNDIS它期待自己是第一个usb配置

Linux支持它仅仅是因为微软不支持 CDC以太网标准

在Android手机中, RNDIS几乎是标配

###4. linux使能CDC-ECM/RNDIS功能

若要在linux中支持RNDIS,需要修改内核的编译选项, 与以太网不同, 在usb网络中, 各端是不对等的,USB host 和 USB device端所需要的软硬件是不同的,

####4.1 linux 作为USB host时

linux作为usb host时,要支持RNDIS,依赖 rndis_host.ko 模块, 需要打开kernel的config

Device Drivers   --->Network Device Support --->Usb Network Adapters --->Multi-purpose USB Networking Framework --->CDC Ethernet SupportHost For RDNIS and ActiveSync Devices

这两个config, 分别用于支持 CDC-ECM 和 RNDIS

####4.2 linux作为从机时

linux作为usb device时, 要支持RNDIS, 依赖 g_ether.ko 模块, 需要打开kernel的config

Device Drivers   --->USB support --->USB Gadget Support --->USB Gadget Driver --->Ethernet Gadget (with CDC Ethernet Support)RNDIS support

这两个config, 分别用于支持 CDC-ECM 和 RNDIS

将运行linux的usb从机连接到运行linux的usb主机后,打开usb共享网络(即配置usb从机的功能为RNDIS), 则在主机和从机上都会出现一个名为 “usbx” (x为数字编号) 的网络接口

关于 usb gadget : 常用的usb设备, 比如 U盘, 鼠标, 键盘等等, 都比较简单, 使用较小的控制芯片,在其上面运行编译好的固件, 而一些linux嵌入式设备, 通常都配备有性能较好的cpu,并且, 很多这一类设备都支持OTG功能, 可以在同一接口上扮演usb host和usb device的功能, 对于将linux设备作为usb device端时, linux提出了Gadget驱动框架, 其定义了一套API, UDC(usb device controller)需要实现这些API (主流的SoC的usb controller driver基本上都实现了这些API, 利用这些API, Gadget 框架实现了一套与硬件无关的功能(基本上可以对应到 USB 协议里 的各种 USB Class), 当然,Gadget 驱动还是受限于底层提供的功能的。比如 某些 Class 需要 USB Isochronous 端点,这时我们就不能支持该 Class, 基于Gadget驱动框架, 可以开发driver,实现多种USB device, 比如

  • Gadget Zero, 类似于 dummy hcd, 该驱动用于测试 udc 驱动。它会帮助您通过 USB-IF 测试。
  • Ethernet over USB, 该驱动模拟以太网网口,它支持多种运行方式:
  • CDC Ethernet: usb 规范规定的 Communications Device Class “Ethernet Model” protocol。
  • CDC Subset: 对硬件要求最低的一种方式,主要是 Linux 主机支持该方式。
  • RNDIS: 微软公司对 CDC Ethernet 的变种实现。
  • File-backed Storage Gadget最常见的 U 盘功能实现。
  • Serial Gadget 实现,包括:
  • Generic Serial 实现(只需要Bulk-in/Bulk-out端点+ep0)
  • CDC ACM 规范实现。
  • Gadget Filesystem, 将 Gadget API 接口暴露给应用层,以便在应用层实现user mode driver。
  • MIDI: 暴露ALSA接口,提供 recording 以及 playback 功能。

###5. USB共享网络模型

无论是使用 CDC-ECM 还是 RNDIS, 通过USB共享网络时, 模型如下:

usb共享网络模型

在android设备上, 使用USB共享网络时, 虚拟的网络接口通常命名为rndis0, 而不是usb0

在移动设备上, 应用RNDIS时, 移动设备通常作为 USB deivce, 其它的设备作为USB host, 虽然可以从任一端设备共享网络给另一端设备, 对于移动设备来说, 这两种方式有着不同的命名:

  • USB tethering : 移动设备共享网络给其它的设备
  • USB reserse-tethering : 其它的设备共享网络给移动设备

事实上,对于移动设备来说, 应用最多场景还是USB tethering(如果要进行reserse-tethring的话, 还需要在移动设备上关闭其它联网方式, 然后在另一端的设备上设置其它网卡的网络共享给其虚拟的usb网卡)

####5. usb网络共享与tcp/ip转发

usb tethering 本质上是利用tcp/ip协议栈的转发功能, 和softap以及 bluetooth tethering 类似 (tcp/ip 网络协议栈的数据包转发来实现网络共享, 通常是使用iptables 命令来操作 其nat表来配置的)

例如, 一台android手机, 通过wifi连接网络, 然后通过usb tethering 将网络共享给 ubuntu pc, 在android手机上连接wifi,在其开启usb tetehering之前,dump 其iptables的nat表的配置如下:

# iptables -S -t nat
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N natctrl_nat_POSTROUTING
-N oem_nat_pre
-A PREROUTING -j oem_nat_pre
-A POSTROUTING -j nactrl_nat_POSTROUTING

而在开启usb tethering之后, dump 其iptables的nat表的配置如下:

# iptables -S -t nat
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N natctrl_nat_POSTROUTING
-N oem_nat_pre
-A PREROUTING -j oem_nat_pre
-A POSTROUTING -j nactrl_nat_POSTROUTING
-A natctrl_nat_POSTROUTING -o wlan0 -j MASQUERADE

正是最后多出的一行命令设置了将 wifi 接口的网络共享给其它的接口

 

Android

  • android studio 调试应用程序November 21, 2017
  • android systraceNovember 20, 2017
  • android traceviewApril 23, 2017
  • android 屏幕适配March 06, 2017
  • 使用 gradle 构建 android projectOctober 23, 2016
  • 使用 uiautomator 框架进行 UI 测试October 06, 2016
  • 多用户与 userid uid appidOctober 05, 2016
  • AppOpsAugust 29, 2016
  • IntentAugust 05, 2016
  • android permissionApril 05, 2016
  • android aar包March 17, 2016
  • java 反射机制March 03, 2016
  • android DexClassLoaderMarch 02, 2016
  • android support libraryFebruary 26, 2016
  • android init 启动流程December 10, 2015
  • 设置system.img 和 data.img 文件的属主和权限October 31, 2015
  • android persistent appOctober 14, 2015
  • android dhcp and dnsAugust 04, 2015
  • android wifi信号强度显示July 06, 2015
  • android native crashJune 19, 2015
  • gdb 远程调试在android上的应用June 01, 2015
  • dumpsysApril 11, 2015
  • SELinux 安全上下文April 02, 2015
  • android.mkJanuary 30, 2015
  • svc 命令July 11, 2014
  • adb manualApril 08, 2014
  • android image 文件February 06, 2014

Linux-kernel

  • linux debugfsNovember 03, 2015
  • linux内核模块入/出口函数September 12, 2015
  • linux per-cpu 变量September 09, 2015
  • linux内核模块版本检查May 28, 2015
  • linux内核模块签名May 27, 2015
  • linux内核模块July 27, 2014
  • linux kprobeJune 26, 2014
  • linux kernel debug 方法April 05, 2014
  • linux dynamic debugApril 01, 2014
  • linux printkMarch 29, 2014

Linux-driver

  • linux-PM PM QoSFebruary 18, 2015
  • linux-PM runtime PMFebruary 17, 2015
  • linux-PM autosleepFebruary 16, 2015
  • linux-PM wakelockFebruary 15, 2015
  • linux-PM wakeup countFebruary 14, 2015
  • linux-PM wakeup sourceFebruary 13, 2015
  • linux-PM PM callbackFebruary 12, 2015
  • linux devresFebruary 11, 2015
  • 使用proc文件系统导出信息January 29, 2015
  • linux 中断子系统November 23, 2014
  • linux regulatorSeptember 16, 2014
  • linux suspend resume 流程May 20, 2014

Diy-linux

  • 7-在真机上引导linuxMay 29, 2014
  • 6-添加initrc脚本May 28, 2014
  • 5-在qemu中引导linuxMay 27, 2014
  • 4-建立根文件系统May 26, 2014
  • 3-编译buxyboxMay 25, 2014
  • 2-编译linux内核May 24, 2014
  • 1-qemu简介May 23, 2014

Linux

  • linux 线程November 24, 2015
  • linux进程的内存布局June 17, 2015
  • VDSO和系统调用June 15, 2015
  • ELF 文件结构June 05, 2015
  • initrd 处理流程February 05, 2015
  • initrdFebruary 03, 2015
  • linux 虚拟块设备February 01, 2015
  • linux 内存文件系统January 30, 2015
  • linux 内核镜像文件种类January 29, 2015
  • linux consoleSeptember 10, 2014
  • gcc attribute 扩展June 18, 2014

Bus

  • i2c toolsSeptember 23, 2015
  • i2c-dev接口January 30, 2015
  • i2c 驱动January 29, 2015
  • i2c 总线January 27, 2015

Network

  • CDC-ECM 和 RNDISOctober 29, 2015
  • iptablesSeptember 18, 2015
  • netfilter 框架September 14, 2015
  • raw socketAugust 31, 2015
  • struct sk_buffAugust 28, 2015
  • 以太网帧格式August 21, 2015
  • MAC 地址August 20, 2015
  • socket接口的网络协议无关性August 17, 2015
  • linux虚拟网络接口 —— 802.1q vlanAugust 11, 2015
  • linux虚拟网络接口 —— tun/tapAugust 11, 2015
  • linux虚拟网络接口 —— 多ip地址August 11, 2015
  • linux虚拟网络接口 —— 环回接口 loAugust 11, 2015
  • generic netlinkJanuary 31, 2015
  • netlinkJanuary 29, 2015

Wifi

  • IEEE 802.11 无线网络接口的类型November 28, 2015
  • android上wifi扫描间隔November 26, 2015
  • WPAS 中的循环扫描November 25, 2015
  • android wifi 组播November 24, 2015
  • wifi 与 以太网August 24, 2015
  • wext private ioctlJuly 27, 2015
  • EAP 认证July 20, 2015
  • 802.11 throughputJuly 19, 2015
  • 802.11 速率自适应算法July 19, 2015
  • wifi MCSJuly 17, 2015
  • wifi漫游与802.11rJuly 12, 2015
  • 射频基础知识July 06, 2015
  • 802.11 power saveJune 23, 2015
  • WPAS与client的通信May 18, 2015

Nfc

  • linux NFC subsystmNovember 04, 2015
  • NFC CE 模式November 04, 2015
  • NFC P2P 模式November 03, 2015
  • NFC RW 模式November 02, 2015
  • NFC 概述October 31, 2015

Tool

  • 构建交叉编译工具链January 11, 2016
  • linux上配置git server和repoJanuary 10, 2016
  • openssl 证书/签名/加密December 08, 2015
  • 使用freeradius搭建EAP认证环境November 30, 2015

Android-app

  • android 应用签名July 11, 2016

http://chatgpt.dhexx.cn/article/AwWRurlA.shtml

相关文章

CDC

CDC CDC(clock domain crossing) 思维导图: 跨时钟域处理方法总结如下: 1、有关系的时钟之间传单bit数据,理论上只需要源数据保持足够长的时间(clk2的两个周期)即可; 2、无关系的时钟之间传单bit数据,必须要使用同步器; 3、不管有无关系的时钟进行单bit传输,脉冲同…

2023年3月全国DAMA-CDGA/CDGP数据治理认证招生简章

弘博创新是DAMA中国授权的数据治理人才培养基地,贴合市场需求定制教学体系,采用行业资深名师授课,理论与实践案例相结合,快速全面提升个人/企业数据治理专业知识与实践经验,通过考试还能获得数据专业领域证书。 DAMA认…

cdsn的code使用方法

今天无意间发现了csdn的code,刚好前两天因为校园网对github的限制苦恼,这下来了精神,迫不及待的尝试了一下! 网上搜了很多使用方法,在这里做个总结,感谢网上的各位贴友。 code感觉就是github的大陆版,各种功能都蛮像的,希望是一个经得起考验的版本控制器。 下面是方…

CDSN格式

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

CDSN使用教程

欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持&#x…

Mysql中去重的语法_MySQL去重distinct

去重 在MySQL中需要查询表中不重复的记录时,可以使用distinct关键字过滤重复记录。 语法: select distinct [,...,] from ; 数据表如下: mysql> select * from emp; +-------+--------+------------+------+------------+------+------+--------+ | empno | ename | job …

mysql去重统计

第一种使用 DISTINCT 去重统计 SELECT COUNT(DISTINCT record_id) FROM assessment_record_date WHERE date_type 1 and DATE_FORMAT( the_date,%Y-%m) DATE_FORMAT(NOW(),%Y-%m) 结果是去重之后的总数量 第二种使用 GROUP BY 去重统计 SELECT COUNT(record_id) FROM a…

mysql查询去重后的总数

mysql 查询去重 建议以后给出列名、数据示例,这样我们写的SQL你可以粘贴运行~ SELECTDISTINCT表1.列2,表1.列1 FROM表1 WHERE表1.列2IN(SELECT列1FROM表2) 更多追问追答 谢谢你,我补充了一下,我想粘贴的多点,但是太多了…

mysql去重查询方法优化

前言 说起来开始进行面试是年前倒数第二周,上午9点,我还在去公司的公交上,突然收到蚂蚁的面试电话,其实算不上真正的面试。面试官只是和我聊了下他们在做的事情(主要是做双十一这里大促的稳定性保障,偏中间件吧),说的很详细,然后和我沟通了下是否有兴趣,我表示有兴趣…

Mysql去重查询---DISTINCT、group by

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 DISTINCT语法:关键词 distinct用于返回唯一不同的值。 表结构案例SELECT DISTINCT age FROM emp1SELECT DISTINCT age ,NAME FROM emp1SELECT DISTINCT * FROM emp1…

MYSQL去重方法汇总

表数据 备注: id: 任务id;name: 参与人name; 1:distinct 1.1 -- 根据任务ID去重 SELECT DISTINCT id FROM test;1.2 -- 任务总数 SELECT COUNT(DISTINCT id) FROM test;1.3 distinct 通常效率较低。它不适合用来展示去重后具体的值,一般与…

mysql 怎么去重2维数组,mysql去重查询

在使用MySQL时,有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录,但是实际中我们往往用distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段&#xff…

MySQL去重查询只保留一条最新的记录

需求:MySQL去重查询只保留一条最新的记录 文章目录 易错的写法正确的写法-1正确的写法-2正确的写法-3 易错的写法 表结构与初始数据如下SQL文件: -- MySQL dump 10.13 Distrib 8.0.28, for Linux (x86_64) -- -- Host: localhost Database: test01…

MySQL去重查询

在使用MySQL时,有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录, 实例: select distinct name,id from user;,这样的结果为: distinct name,id 这样的my…

mysql去重查询的三种方法

文章目录 前言一、插入测试数据二、剔除重复数据方法1.方法一:使用distinct2.方法二:使用group by3.方法三:使用开窗函数 总结 前言 数据库生成环境中经常会遇到表中有重复的数据,或者进行关联过程中产生重复数据,下面…

易基因|RNA m7G甲基化测序(m7G-MeRIP-seq)

N7-甲基鸟苷(N7-methylguanosine,m7G)是真核生物tRNA、rRNA和mRNA 5cap中最丰富的修饰之一。作为一种重要的表观遗传修饰,m7G RNA甲基化在基因表达、加工代谢、蛋白质合成、转录稳定等方面发挥着重要的作用,参与疾病发…

GeneXus学习(二)基本对象(持续更新)

GeneXus对象很多,笔者持续更新每个对象的用法 一、Transaction GeneXus中的Transaction是用于描述对象的模型。 英文描述: Describes an object or actor of reality, defining the structure of the database, business rules, and the UI for data…

sgRNAs基因编辑

CRISPR-Cas9知识学习笔记 https://www.163.com/dy/article/FGCP58KC0532AN5N.html https://crispr.dbcls.jp CRISPR(clustered regularly interspaced short palindromic repeats,成簇的规律间隔短回文重复序列)和CRISPR-associated protein …

敏捷开发与GeneXus哲学

译者前言 在GeneXus的重要创始人和核心成员的观念里,在做一件重大事情前往往需要进行大量的思考,尤其是所要从事事业背后的本质及相关的哲学问题进行思考,然后要研究对应的方法论。在上述问题得到明确的答案后,才开始开展工作。 …

【Reactome 下载所有通路基因集】

Reactome 下载所有通路基因集 Reactome 下载所有通路基因集Reactome 介绍ReactomePA官网下载处理 Reactome 下载所有通路基因集 目前,网上有许多下载 KEGG、GO 数据库中所有富集通路的基因集方法,但是相对于 Reactome 来说却几乎没有。所以,…