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()’ 函数以发送数据。