USB拨号驱动
来源 https://blog.csdn.net/weixin_42129680/article/details/114872944
参考 https://blog.csdn.net/chenliang0224/article/details/79998046
RNDIS: Remote Network Driver Interface Specification,既是RemoteNDIS,既是远程网络驱动接口规范。基于USB实现RNDIS实际上就是TCP/IP over USB,就是在USB设备上跑TCP/IP,让USB设备看上去像一块网卡。
cdc_ether驱动在枚举时相对usb-serial要简单的多,因为usb-serial驱动在枚举时涉及到两种总线,即usb和usb-serial总线,所以注册会比较麻烦,而cdc_ether只在usb总线上注册。
CDC: 通讯设备类
ECM: 以太网控制模型
EEM: 以太网仿真模型
我们可以通过路由器的usb口外接3g、4G(lte)的上网卡,并将其作为wan口,就能实现mifi的功能。
在没有4G上网卡托的情况下,也可以把android手机通过数据线连接到openwrt/LEDE的路由器上,通过android的tether功能使用手机的移动网络,这里以MIUI为例,openwrt的配置如下:
一、需要的软件包:kmod-usb-net kmod-usb-net-rndis kmod-usb-net-cdc-ether usbutils udev
ssh进入终端,执行以下命令:
opkg update
opkg install kmod-usb-net kmod-usb-net-rndis kmod-usb-net-cdc-ether usbutils udev
二、配置手机通过usb线连接到路由器,在手机上,打开tether功能(usb共享网络)。
在路由器端,lsusb,查看是否探测到你的手机: dmesg: 显示发现一个rndis设备,并注册为接口usb0, ifconfig -a查看是否存在usb0接口:
下面开始设置usb0接口为上网口
把RNDIS(这里的名字可以自己命名)设置为usb0接口:
uci del network.xxx(xxx为以前的rndis接口,如果以前有设置的话,没有的话就不用这条命令)
uci set network.RNDIS=interface
uci set network.RNDIS.ifname=usb0
uci set network.RNDIS.proto=dhcp
uci commit network
重启RNDIS
ifdown RNDIS
ifup RNDIS
这样就可以上网了
1. 拨号介绍
ppp拨号:modem相当于猫,自身不能上网;
ECM拨号:网络共享方式,AP和modem都能上网。
1.1 ppp拨号
**PPP(点到点协议)**在拨号过程中用于MS和PC间数据交互、协商。在拨号流程的初期首先开启的就是PC和MS直接的PPP过程,在拨号成功后,还需要依靠PPP协议对IP包进行封装传输数据。
1.1.1 linux中PPP实现方式
传输层、网络层(TCP/IP)——数据链路层(PPP)——物理层(串口,网口)
(1)发送时,TCP/IP数据包经过PPP打包之后经过串口发送。
(2)接收时,从串口上来的数据经PPP解包之后上报给TCP/IP协议层。
linux下ppp框架结构如下图:
1.1.2 PPP协议栈
主要负责PPP层数据的封装、压缩与解压缩.另外,它还对普通数据包和PPP过程的数据包进行了分流,将普通数据包提交到TCP/IP协议栈,而将PPP过程的数据包放到/dev/ppp设备队列中,等待pppd去收取并处理.
http://hi.csdn.net/attachment/201112/31/0_1325300769F8Qz.gif
1.1.3 pppd
pppd是一个用户空间的后台服务进程(daemon。pppd实现了所有鉴权、压缩/解压和加密/解密等扩展功能的控制协议。pppd只是一个普通的用户进程,pppd与内核中的PPP协议处理模块之间通过设备文件(/dev/ppp)进行通信。pppd有一个辅助工具chat,用来与GSM模组建立会话。它向串口发送AT命令,建立与GSM模组的会话,以便让PPP协议可以在串口上传输数据包。
设备文件/dev/ppp。通过read系统调用,pppd可以读取PPP协议处理模块的数据包,当然,PPP协议处理模块只会把应该由pppd处理的数据包发给pppd。通过write系统调用,pppd可以把要发送的数据包传递给PPP协议处理模块。通过ioctrl系统调用,pppd可以设置PPP协议的参数,可以建立/关闭连接。在pppd里,每种协议实现都在独立的C文件中,它们通常要实现protent接口,该接口主要用于处理数据包,和fsm_callbacks接口,该接口主要用于状态机的状态切换。
1.2 ECM
以太网控制模型(Ethernet Networking Control Model) 用于在设备和主机之间传输以太网数据包。
在操作系统看来,CDC ECM设备就是一个虚拟以太网卡,包含标准网卡需要的MAC地址和IP地址。ECM的驱动源码文件是drivers/net/usb/cdc_ether.c
CDC-ECM同UVC原理上是一样的,定义一套标准协议主从机都遵守了就不需要额外的驱动程序。
数据接口则用于在USB总线上交换USB数据包,这些USB数以的包封装了完整的以太网包。
1.3 GobiNet 和 qmi-wwan
详细看过GobiNet 的代码后,发现GobiNet 已经支持QMI-WWAN了,即使使用QMI-WWAN驱动的,也可以使用GobiNet 来进行后台的管理,包括拨号,掉线重拨等。
1.3.1 Gobinet拨号
GOBI 高通Gobi无线宽带芯片技术,只需一个模块即可支持多种移动宽带网络和众多移动运营商.
高通公司称全新的芯片将基于Gobi 4G LTE无线基带、MDM9615和MDM9215。这种技术可以在FDD和TDD网络下进行LTE连接,同时支持HSPA+和EV-DO网络、2G/3G网络。这意味着用户可以在本地使用高速4G LTE网络,在其他地方使用3G网络。Gobi平台在MDM芯片组的基础上还提供了软件增强层,这样可以使用不同技术下的无线连接更简单。
1.3.2 QMI-WWAN协议拨号
QMI: Qualcom Message Interface
MSM: Mobile station mode
AP: Application Procesor
高通平台目前都是非对称多核心,最主要的是AP和Modem。
两个处理器怎么进行通信呢,我们把AP和Modem当作两个主机,问题就变得了很简单,TCP/IP协议不是一种非常成功的进程间跨主机通信方式。高通没有采用这种方式,但是借鉴了TCP/IP的框架设计。
Qualcomm MSM Interface,作用用于AP和BP侧的交互,通俗说法就是让设备终端TE(可以是手机,PDA,计算机)对高通BP侧的AMSS系统进行操作,如调用函数,读取数据,设置其中的NV项等。
参考:http://blog.csdn.net/u012439416/article/category/7004974
1.4 rndis
NDIS(Network Driver Interface Specification)是网络驱动程序接口规范的简称。它横跨传输层、网络层和数据链路层,定义了网卡或网卡驱动程序与上层协议驱动程序之间的通信接口规范,屏蔽了底层物理硬件的不同,使上层的协议驱动程序可以和底层任何型号的网卡通信。
NDIS为网络驱动程序创建了一个完整的开发环境,只需调用NDIS函数,而不用考虑操作系统的内核以及与其他驱动程序的接口问题,从而使得网络驱动程序可以从与操作系统的复杂通讯中分离,极大地方便了网络驱动程序的编写。另外,利用NDIS的封装特性,可以专注于一层驱动的设计,减少了设计的复杂性,同时易于扩展驱动程序栈。
NDIS支持三种类型的网络驱动程序:
(1)NDIS网卡驱动程序(NICdrivers) :网卡驱动程序是网卡与上层驱动程序通信的接口,它负责接收来自上层的数据包,或将数据包发送到上层相应的驱动程序,同时它还完成处理中断等工作。
(2)NDIS中间驱动程序 (InterMediateProtocolDrivers):中间驱动程序位于网卡驱动程序和协议驱动程序之间,它向上提供小端口(Minport)函数集,向下提供协议(protocol)函数集,因此对于上层驱动程序而言,它是小端口驱动程序。对于底层的驱动程序,它是协议驱动程序。
(3)NDIS协议驱动程序 (Upper Level Protocol Drivers):协议驱动程序执行具体的网络协议,如IPX/SPX、TCP/IP等。协议驱动程序为应用层客户程序提供服务,接收来自网卡或中间驱动程序的信息
ndis既然是标准,那么win、linux都可以使用,广义的来讲,在windows上是ndis,只要符合ndis标准的无线网卡、有线网卡,不需要驱动,直接就可以在win7以上的系统上使用。
但是在linux上它却是以另一个名字为大家知晓"ECM(Ethernet Control Model) "/“NCM”,其实ECM NCM只是在linux上规定 了ndis规范的“物理层”实现形式,是通过USB CDC通信类来实现了,所以双叫CDC-ECM,在华为的这个文档里写的很清楚
linux下其它ndis层怎么实现了我就不知道了,但是我知道ndis物理层除了使用标准ECM来实现之外,还有一个非标准的QMI WWAN ,这是高通自己定义的ndis物理层标准,由于高通的行业地位,这个非标甚至比标准运用的还要广泛,ECM QMI由于使用协议不同,拨号连网的命令也不同, 华为ME909是echo “AT^NDISDUP=1,1”>/dev/ttyUSB0 而STIM7100是 echo “AT$QCRMCALL=1,1” > /dev/ttyUSB2 命令形式不一样,但实质是一样的,都是建立连接,获得运营商IP地址。
如果是支持ECM标准的4G模块,3.X的内核支持,直接在内核中配置就可以了。比如华为ME909
如果是支持高通QMI的模块,好像有文档说3.4以上的内核直接支持,那是不是也是内核menuconfig时,添加 上就行也呢?这个我还没有验证。使用高通方案的模块多的很sim7100 ec20几乎都是。
最后说MBIM,(Mobile Broadband Interface Model),这是正宗的移动宽带接口模型,专门用于3G/4G/5G模块的,上面说的ndis这个并不是专门用在移动宽带上的,比如USB接口的百兆网卡RTL8152也是基于ndis的,所以它能做到免驱。但是MBIM只在win8以上的windows上使用,不知道为什么 linux没有使用,好象这种新技术都是windows先用,然后才慢慢推广到linux上。(最近调试imx6ull板子时,在4.x.xx的内核中发现了 CDC MBIM support选项,说明新内核已经支持了)
1.5 ping
(1)描述问题:ubuntu服务器能ping通IP地址,但ping不通域名。
(2)查找原因
打开终端执行ping baidu.com(ping百度的域名),结果是ping: baidu.com: Temporary failure in name resolution。
执行ping 220.181.57.216(baidu.com对应的IP地址),可以收到回传数据。
所以可以断定,DNS解析服务器出问题了。
(3)解决办法
编辑resolv.conf文件,该文件是DNS客户机配置文件,用于设置DNS服务器的IP地址及DNS域名,还包含了主机的域名搜索顺序。执行命令:sudo vim /etc/resolv.conf,将下面内容加入:
nameserver 8.8.8.8 //google的域名解析服务器
nameserver 114.114.114.114 //联通的域名解析服务器
1.6 公网IP和私网IP
在百度直接搜索IP会显示公网IP,在cmd中输入ipconfig,或者在Linux终端下输入ifconfig,会显示出私有ip。
公网IP一般是运营商分配的,公网ip才能上网,但是不可能给每一个电脑分配一个IP,ipv4肯定是不够的。所以需要私有IP,这种ip一般是用于局域网的管理,不能直接连上互联网,必须通过公网ip上网。
在很早的时候就预料到了ipv4可能不足,所以在每一类的ip地址中都预留了一部分地址作为私有ip:
类型 ip范围 私有地址范围
A 1.0.0.0~126.255.255.255 10.0.0.0~10.255.255.255
B 128.0.0.0~191.255.255.255 172.16.0.0~172.31.255.255
C 192.0.0.0~223.255.255.255 192.168.0.0~192.168.255.255
这也是为什么大多数时候,你使用ipconfig查到的一般就只是以172.开头的b类私有Ip,或者以192.168开头的c类私有Ip。
私有ip有底下的几个限制:
(1)私有 IP 的路由信息不能对外散播 (只能存在内部网络);
(2)使用私有 IP 作为来源或目的地址的封包,不能透过 Internet 来转送 (不然网络会混乱);
(3)关于私有 IP 的参考纪录(如 DNS),只能限于内部网络使用。
=========== End