Linux CAIF¶
版权所有 © ST-Ericsson AB 2010
- 作者:
Sjur Brendeland/ sjur.brandeland@stericsson.com
- 许可条款:
GNU 通用公共许可证 (GPL) 第 2 版
引言¶
CAIF 是 ST-Ericsson 蜂窝调制解调器用于调制解调器和主机之间通信的 MUX 协议。主机进程可以打开虚拟 AT 信道、启动 GPRS 数据连接、视频信道和实用程序信道。实用程序信道是调制解调器和主机之间的通用管道。
ST-Ericsson 调制解调器支持调制解调器和主机之间的多种传输方式。目前,UART 和 Loopback 可用于 Linux。
架构¶
CAIF 的实现分为
CAIF 套接字层和 GPRS IP 接口。
CAIF 核心协议实现
CAIF 链路层,实现为 NET 设备。
RTNL
!
! +------+ +------+
! +------+! +------+!
! ! IP !! !Socket!!
+-------> !interf!+ ! API !+ <- CAIF Client APIs
! +------+ +------!
! ! !
! +-----------+
! !
! +------+ <- CAIF Core Protocol
! ! CAIF !
! ! Core !
! +------+
! +----------!---------+
! ! ! !
! +------+ +-----+ +------+
+--> ! HSI ! ! TTY ! ! USB ! <- Link Layer (Net Devices)
+------+ +-----+ +------+
实现¶
CAIF 核心协议层¶
CAIF 核心层实现了 ST-Ericsson 定义的 CAIF 协议。它以分层方式实现 CAIF 协议栈,其中规范中描述的每个层都实现为单独的层。该架构受到“协议层”和“协议数据包”设计模式的启发。
CAIF 结构¶
核心 CAIF 实现包含
CAIF 的简单实现。
分层架构(如 Streams),CAIF 规范中的每个层都在单独的 c 文件中实现。
客户端必须调用配置函数来添加物理层。
客户端必须实现 CAIF 层,通过接收和传输函数来消费/生成 CAIF 有效负载。
客户端必须调用配置函数来添加和连接客户端层。
当接收/传输 CAIF 数据包 (cfpkt) 时,所有权会传递给被调用的函数(帧层的接收函数除外)
分层架构¶
CAIF 协议可分为两部分:支持函数和协议实现。支持函数包括
CFPKT CAIF 数据包。CAIF 协议数据包的实现。CAIF 数据包具有创建、销毁和添加内容以及向协议数据包添加/提取头部和尾部的函数。
CAIF 协议实现包含
CFCNFG CAIF 配置层。配置 CAIF 协议栈,并提供一个客户端接口,用于在 CAIF 栈之上添加链路层和驱动程序接口。
CFCTRL CAIF 控制层。编码和解码枚举和信道设置等控制消息。还匹配请求和响应消息。
CFSERVL 通用 CAIF 服务层功能;处理流量控制和远程关机请求。
CFVEI CAIF VEI 层。处理 VEI(虚拟外部接口)上的 CAIF AT 信道。此层编码/解码 VEI 帧。
CFDGML CAIF 数据报层。处理 CAIF 数据报层(IP 流量),编码/解码数据报帧。
CFMUX CAIF 多路复用层。处理多个物理承载和多个信道(如 VEI、数据报等)之间的多路复用。MUX 跟踪现有的 CAIF 信道和物理实例,并根据信道 ID 和物理 ID 选择适当的实例。
CFFRML CAIF 成帧层。处理成帧,即帧长度和帧校验和。
CFSERL CAIF 串行层。处理将帧串联/拆分为具有正确长度的 CAIF 帧。
+---------+
| Config |
| CFCNFG |
+---------+
!
+---------+ +---------+ +---------+
| AT | | Control | | Datagram|
| CFVEIL | | CFCTRL | | CFDGML |
+---------+ +---------+ +---------+
\_____________!______________/
!
+---------+
| MUX |
| |
+---------+
_____!_____
/ \
+---------+ +---------+
| CFFRML | | CFFRML |
| Framing | | Framing |
+---------+ +---------+
! !
+---------+ +---------+
| | | Serial |
| | | CFSERL |
+---------+ +---------+
在此分层方法中,适用以下“规则”。
所有层都嵌入相同的结构“struct cflayer”
一个层不依赖于任何其他层的私有数据。
通过设置指针来堆叠层
layer->up , layer->dn为了向上发送数据,每个层都应该这样做
layer->up->receive(layer->up, packet);为了向下发送数据,每个层都应该这样做
layer->dn->transmit(layer->dn, packet);
CAIF 套接字和 IP 接口¶
IP 接口和 CAIF 套接字 API 在 CAIF 核心协议之上实现。IP 接口和 CAIF 套接字拥有一个“struct cflayer”实例,就像 CAIF 核心协议栈一样。网络设备和套接字实现了“struct cflayer”定义的“receive()”函数,就像 CAIF 栈的其余部分一样。通过这种方式,数据包的传输和接收与其他层一样处理:调用“dn->transmit()”函数来传输数据。
链路层配置¶
链路层实现为 Linux 网络设备(struct net_device
)。有效负载处理和注册使用标准 Linux 机制完成。
CAIF 协议依赖于无损链路层,不实现重传。这意味着不能发生数据包丢失。因此,实现了一种流控制机制,其中物理接口可以启动所有 CAIF 信道的流量停止。