• 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校验和不能包含在以太网收发数据包中。检验失败的帧数据不能再发送到主机。这意味着设备必须能够缓冲至少一个完整的以太网帧数据

###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共享网络时, 模型如下:

在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

CDC-ECM 和 RNDIS相关推荐

  1. USB CDC ECM

    USB CDC ECM 以太网控制模型(Ethernet Networking Control Model) 用于在设备和主机之间传输以太网数据包. 在操作系统看来,CDC ECM设备就是一个虚拟以太 ...

  2. 拨号PPP NDIS RNDIS CDC ECM NCM QMI_WWAN GOBINET RMNET MBIM概念介绍

    PPP   PPP 用于建立点对点链路.最初是用于慢速设备的,比如早期通过串行线上网.通过一套协议,维护硬件链路上的数据连接,并具备安全和认证特性,可建立计费模式.   我们在PPP拨号脚本中也常常可 ...

  3. 拨号之 PPP NDIS RNDIS CDC ECM NCM QMI-WWAN GOBINET RMNET MBIM 区别

    如果做3.4.5G的上网,常常会遇到上述几个名词,他们都跟拨号联网相关,总是弄得人云里雾里,这些概念到底是什么意思,或者有啥区别呢? 这里结合网上资料,基于个人理解,再次整理,如有错误之处,欢迎指正. ...

  4. Planck-Pi 开启 Gadget RNDIS 教程

    文章目录 前言 RNDIS介绍 配置教程 1.内核配置 2.设备树配置 3.RNDIS 配置 4.实体机设置 5.后记 前言 本教程硬件基于稚晖君开源的 Planck-Pi ,开源地址: peng-z ...

  5. MT7628 Openwrt21 Fibocom FM650-CN驱动添加rndis拨号

    1.拨号模式简介 ECM(Ethernet Networking Control Model 以太网控制模型)用于在设备和主机之间传输以太网数据 包.在操作系统看来,CDC ECM 设备就是一个虚拟以 ...

  6. am335x usb linux配置,AM335X Usb 配置设备 RNDIS

    首先:打开linux 内核配置菜单: $ make CROSS_COMPILE=arm-arago-linux-gnueabi- ARCH=arm menuconfig 在主菜单选择 Device D ...

  7. 定制 kali nethunter内核 (官方不支持的手机)

    Kali Linux NetHunter内核编译指南 发表于 2021-09-12   更新于 2022-10-08   分类于 kali   阅读次数:   阅读次数: 1890   Valine: ...

  8. Qualcomm平台android开发总结

    1.高通平台android开发总结 1.1 搭建高通平台环境开发环境 在高通开发板上烧录文件系统 建立高通平台开发环境 高通平台,android和 modem 编译流程分析 高通平台 7620 启动流 ...

  9. USB中CDC-ECM的了解和配置

    转载:http://blog.csdn.net/kangear/article/details/37605811 USB中典型类及子类: 类别 解释 子类 典型应用 IC芯片 备注 UVC 视频类 免 ...

最新文章

  1. java 分页组件_java 代码组装的分页组件
  2. 腾讯offer是什么样子_记一次腾讯社招前端面试(已拿到offer入职)
  3. (摘要)100个伟大的商业理念:理念34:企业社会责任
  4. sequelize 连接2个数据库_数据库激荡 40 年,NoSQL、NewSQL谁能接棒?
  5. Linux嵌入式 -- Bootloader , Uboot
  6. javascript 函数整理
  7. kettle优化抽取数据速度_Kettle性能优化
  8. qt webkit 本地html5,Qt Webkit HTML5 Score
  9. 机构研究显示iPhone 12 Pro Max是美国最受欢迎5G手机
  10. 利用搜索引擎实现关键词爬取内容
  11. 花书+吴恩达深度学习(九)优化方法之二阶近似方法(牛顿法, CG, BFGS, L-BFGS)
  12. leetcode-337-打家劫舍三*
  13. pytorch-使用GPU加速模型训练
  14. Jquery对话框基本配置
  15. 山东大学软件学院概率论与数理统计(考试)——期末考试回忆版
  16. 把谷歌主题背景图片保存下来
  17. 论文下载哪家强 | caj 官网软件下载
  18. 计算机研究院分所烟台,综合新闻_中科院计算所烟台分所 烟台中科网络技术研究所...
  19. 7-6 厘米换算英尺英寸 (15 分)
  20. iOS11降级到iOS10.3.3/10.3.2教程

热门文章

  1. 广东首出网络科技有限公司
  2. 解决Dropbox无法连接的问题
  3. win7系统备份还原软件_软网推荐:轻松一键系统备份与还原
  4. 怎么关闭开机启动的今日爆点提供的热点资讯
  5. 十六,洗礼 《西敏小要理问答》
  6. 漏洞挖掘之资产收集(信息收集)
  7. 抽象类的概念和应用方法
  8. 网吧电脑装linux系统下载,linux系统安装方法介绍 | 专业网吧维护
  9. 【敏捷开发每日一贴】:猪和鸡的故事
  10. QQ手机4.7版增多人通话功能 支持50人实时沟通