forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
195 lines
6.1 KiB
195 lines
6.1 KiB
.. SPDX-License-Identifier: GPL-2.0 |
|
.. include:: <isonum.txt> |
|
|
|
========== |
|
Linux CAIF |
|
========== |
|
|
|
Copyright |copy| ST-Ericsson AB 2010 |
|
|
|
:Author: Sjur Brendeland/ [email protected] |
|
:License terms: GNU General Public License (GPL) version 2 |
|
|
|
|
|
Introduction |
|
============ |
|
|
|
CAIF is a MUX protocol used by ST-Ericsson cellular modems for |
|
communication between Modem and host. The host processes can open virtual AT |
|
channels, initiate GPRS Data connections, Video channels and Utility Channels. |
|
The Utility Channels are general purpose pipes between modem and host. |
|
|
|
ST-Ericsson modems support a number of transports between modem |
|
and host. Currently, UART and Loopback are available for Linux. |
|
|
|
|
|
Architecture |
|
============ |
|
|
|
The implementation of CAIF is divided into: |
|
|
|
* CAIF Socket Layer and GPRS IP Interface. |
|
* CAIF Core Protocol Implementation |
|
* CAIF Link Layer, implemented as NET devices. |
|
|
|
:: |
|
|
|
RTNL |
|
! |
|
! +------+ +------+ |
|
! +------+! +------+! |
|
! ! IP !! !Socket!! |
|
+-------> !interf!+ ! API !+ <- CAIF Client APIs |
|
! +------+ +------! |
|
! ! ! |
|
! +-----------+ |
|
! ! |
|
! +------+ <- CAIF Core Protocol |
|
! ! CAIF ! |
|
! ! Core ! |
|
! +------+ |
|
! +----------!---------+ |
|
! ! ! ! |
|
! +------+ +-----+ +------+ |
|
+--> ! HSI ! ! TTY ! ! USB ! <- Link Layer (Net Devices) |
|
+------+ +-----+ +------+ |
|
|
|
|
|
|
|
Implementation |
|
============== |
|
|
|
|
|
CAIF Core Protocol Layer |
|
------------------------ |
|
|
|
CAIF Core layer implements the CAIF protocol as defined by ST-Ericsson. |
|
It implements the CAIF protocol stack in a layered approach, where |
|
each layer described in the specification is implemented as a separate layer. |
|
The architecture is inspired by the design patterns "Protocol Layer" and |
|
"Protocol Packet". |
|
|
|
CAIF structure |
|
^^^^^^^^^^^^^^ |
|
|
|
The Core CAIF implementation contains: |
|
|
|
- Simple implementation of CAIF. |
|
- Layered architecture (a la Streams), each layer in the CAIF |
|
specification is implemented in a separate c-file. |
|
- Clients must call configuration function to add PHY layer. |
|
- Clients must implement CAIF layer to consume/produce |
|
CAIF payload with receive and transmit functions. |
|
- Clients must call configuration function to add and connect the |
|
Client layer. |
|
- When receiving / transmitting CAIF Packets (cfpkt), ownership is passed |
|
to the called function (except for framing layers' receive function) |
|
|
|
Layered Architecture |
|
==================== |
|
|
|
The CAIF protocol can be divided into two parts: Support functions and Protocol |
|
Implementation. The support functions include: |
|
|
|
- CFPKT CAIF Packet. Implementation of CAIF Protocol Packet. The |
|
CAIF Packet has functions for creating, destroying and adding content |
|
and for adding/extracting header and trailers to protocol packets. |
|
|
|
The CAIF Protocol implementation contains: |
|
|
|
- CFCNFG CAIF Configuration layer. Configures the CAIF Protocol |
|
Stack and provides a Client interface for adding Link-Layer and |
|
Driver interfaces on top of the CAIF Stack. |
|
|
|
- CFCTRL CAIF Control layer. Encodes and Decodes control messages |
|
such as enumeration and channel setup. Also matches request and |
|
response messages. |
|
|
|
- CFSERVL General CAIF Service Layer functionality; handles flow |
|
control and remote shutdown requests. |
|
|
|
- CFVEI CAIF VEI layer. Handles CAIF AT Channels on VEI (Virtual |
|
External Interface). This layer encodes/decodes VEI frames. |
|
|
|
- CFDGML CAIF Datagram layer. Handles CAIF Datagram layer (IP |
|
traffic), encodes/decodes Datagram frames. |
|
|
|
- CFMUX CAIF Mux layer. Handles multiplexing between multiple |
|
physical bearers and multiple channels such as VEI, Datagram, etc. |
|
The MUX keeps track of the existing CAIF Channels and |
|
Physical Instances and selects the appropriate instance based |
|
on Channel-Id and Physical-ID. |
|
|
|
- CFFRML CAIF Framing layer. Handles Framing i.e. Frame length |
|
and frame checksum. |
|
|
|
- CFSERL CAIF Serial layer. Handles concatenation/split of frames |
|
into CAIF Frames with correct length. |
|
|
|
:: |
|
|
|
+---------+ |
|
| Config | |
|
| CFCNFG | |
|
+---------+ |
|
! |
|
+---------+ +---------+ +---------+ |
|
| AT | | Control | | Datagram| |
|
| CFVEIL | | CFCTRL | | CFDGML | |
|
+---------+ +---------+ +---------+ |
|
\_____________!______________/ |
|
! |
|
+---------+ |
|
| MUX | |
|
| | |
|
+---------+ |
|
_____!_____ |
|
/ \ |
|
+---------+ +---------+ |
|
| CFFRML | | CFFRML | |
|
| Framing | | Framing | |
|
+---------+ +---------+ |
|
! ! |
|
+---------+ +---------+ |
|
| | | Serial | |
|
| | | CFSERL | |
|
+---------+ +---------+ |
|
|
|
|
|
In this layered approach the following "rules" apply. |
|
|
|
- All layers embed the same structure "struct cflayer" |
|
- A layer does not depend on any other layer's private data. |
|
- Layers are stacked by setting the pointers:: |
|
|
|
layer->up , layer->dn |
|
|
|
- In order to send data upwards, each layer should do:: |
|
|
|
layer->up->receive(layer->up, packet); |
|
|
|
- In order to send data downwards, each layer should do:: |
|
|
|
layer->dn->transmit(layer->dn, packet); |
|
|
|
|
|
CAIF Socket and IP interface |
|
============================ |
|
|
|
The IP interface and CAIF socket API are implemented on top of the |
|
CAIF Core protocol. The IP Interface and CAIF socket have an instance of |
|
'struct cflayer', just like the CAIF Core protocol stack. |
|
Net device and Socket implement the 'receive()' function defined by |
|
'struct cflayer', just like the rest of the CAIF stack. In this way, transmit and |
|
receive of packets is handled as by the rest of the layers: the 'dn->transmit()' |
|
function is called in order to transmit data. |
|
|
|
Configuration of Link Layer |
|
--------------------------- |
|
The Link Layer is implemented as Linux network devices (struct net_device). |
|
Payload handling and registration is done using standard Linux mechanisms. |
|
|
|
The CAIF Protocol relies on a loss-less link layer without implementing |
|
retransmission. This implies that packet drops must not happen. |
|
Therefore a flow-control mechanism is implemented where the physical |
|
interface can initiate flow stop for all CAIF Channels.
|
|
|