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 通道的流量停止。