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()”函式來傳輸資料。