Linux CAIF¶
版权所有 © ST-Ericsson AB 2010
- 作者:
Sjur Brendeland/ sjur.brandeland@stericsson.com
- 许可条款:
GNU 通用公共许可证 (GPL) 版本 2
简介¶
CAIF 是 ST-Ericsson 蜂窝调制解调器用于调制解调器和主机之间通信的 MUX 协议。主机进程可以打开虚拟 AT 通道,启动 GPRS 数据连接、视频通道和实用通道。实用通道是调制解调器和主机之间的通用管道。
ST-Ericsson 调制解调器支持调制解调器和主机之间的多种传输方式。目前,UART 和环回可用于 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 文件中实现。
客户端必须调用配置函数来添加 PHY 层。
客户端必须实现 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 通道的流量停止。