196 lines
6.1 KiB
ReStructuredText
196 lines
6.1 KiB
ReStructuredText
|
.. SPDX-License-Identifier: GPL-2.0
|
||
|
.. include:: <isonum.txt>
|
||
|
|
||
|
==========
|
||
|
Linux CAIF
|
||
|
==========
|
||
|
|
||
|
Copyright |copy| ST-Ericsson AB 2010
|
||
|
|
||
|
:Author: Sjur Brendeland/ sjur.brandeland@stericsson.com
|
||
|
: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.
|