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()”函数来传输数据。