ng_l2cap(4)
NAME
- ng_l2cap - Netgraph node type that implements Bluetooth Log
- ical Link Control and Adaptation Protocol (L2CAP)
SYNOPSIS
#include <sys/types.h> #include <netgraph/bluetooth/include/ng_hci.h> #include <netgraph/bluetooth/include/ng_l2cap.h>
DESCRIPTION
- The l2cap node type is a Netgraph node type that implements
- Bluetooth
Logical Link Control and Adaptation Protocol as per chapter - D of the
Bluetooth Specification Book v1.1. - L2CAP provides connection-oriented and connectionless data
- services to
upper layer protocols with protocol multiplexing capability, - segmentation
and reassembly operation, and group abstractions. L2CAP - permits higher
level protocols and applications to transmit and receive - L2CAP data packets up to 64 kilobytes in length.
- L2CAP Assumptions
1. The ACL link between two units is set up. The- Baseband pro
vides orderly delivery of data packets, although - there might
be individual packet corruption and duplicates. - No more than
one ACL link exists between any two devices. - 2. The Baseband always provides the impression of
- full-duplex
communication channels. This does not imply that - all L2CAP
communications are bi-directional. Multicasts - and unidirectional traffic (e.g., video) do not require du
- plex channels.
- 3. L2CAP provides a reliable channel using the mech
- anisms avail
able at the Baseband layer. The Baseband always - performs data
integrity checks when requested and resends data - until it has
been successfully acknowledged or a timeout oc - curs. As
acknowledgements may be lost, timeouts may occur - even after
the data has been successfully sent.
L2CAP GENERAL OPERATION
- The Logical Link Control and Adaptation Protocol (L2CAP) is
- based around
the concept of ``channels''. Each channel is bound to a - single protocol
in a many-to-one fashion. Multiple channels can be bound to - the same
protocol, but a channel cannot be bound to multiple proto - cols. Each
L2CAP packet received on a channel is directed to the appro - priate higher
level protocol. - Each one of the end-points of an L2CAP channel is referred
- to by a channel identifier. Channel identifiers (CIDs) are local names
- representing
a logical channel end-point on the device. Identifiers from - 0x0001 to
0x003F are reserved for specific L2CAP functions. The null - identifier
(0x0000) is defined as an illegal identifier and must never - be used as a
destination end-point. All L2CAP signalling commands are - sent to CID
0x0001. CID 0x0002 is reserved for group-oriented channel. - The same CID
must not be reused as a local L2CAP channel endpoint for - multiple simultaneous L2CAP channels between a local device and some re
- mote device.
- CID assignment is relative to a particular device and a de
- vice can assign
CIDs independently from other devices. Thus, even if the - same CID value
has been assigned to (remote) channel endpoints by several - remote devices
connected to a single local device, the local device can - still uniquely
associate each remote CID with a different device. - Channel Operational States
NG_L2CAP_CLOSED
In this state, there is no channel associated with- this CID.
This is the only state when a link level connection - (Baseband)
may not exist. Link disconnection forces all other - states into
the NG_L2CAP_CLOSED state. - NG_L2CAP_W4_L2CAP_CON_RSP
In this state, the CID represents a local end-point - and an L2CAP
Connect Request message has been sent referencing - this endpoint
and it is now waiting for the corresponding L2CAP - Connect
Response message. - NG_L2CAP_W4_L2CA_CON_RSP
In this state, the remote end-point exists and an - L2CAP Connect
Request has been received by the local L2CAP entity. - An L2CA
Connect Indication has been sent to the upper layer - and the part
of the local L2CAP entity processing the received - L2CAP Connect
Request waits for the corresponding response. The - response may
require a security check to be performed. - NG_L2CAP_CONFIG
In this state, the connection has been established - but both sides
are still negotiating the channel parameters. The - Configuration
state may also be entered when the channel parame - ters are being
renegotiated. Prior to entering the NG_L2CAP_CONFIG - state, all
outgoing data traffic is suspended since the traffic - parameters
of the data traffic are to be renegotiated. Incom - ing data traffic is accepted until the remote channel endpoint
- has entered the
NG_L2CAP_CONFIG state. In the NG_L2CAP_CONFIG - state, both sides
will issue L2CAP Configuration Request messages if - only defaults
are being used, a null message will be sent. If a - large amount
of parameters need to be negotiated, multiple mes - sages will be
sent to avoid any MTU limitations and negotiate in - crementally.
Moving from the NG_L2CAP_CONFIG state to the - NG_L2CAP_OPEN state
requires both sides to be ready. An L2CAP entity is - ready when
it has received a positive response to its final re - quest and it
has positively responded to the final request from - the remote
device. - NG_L2CAP_OPEN
In this state, the connection has been established - and configured, and data flow may proceed.
- NG_L2CAP_W4_L2CAP_DISCON_RSP
In this state, the connection is shutting down and - an L2CAP Disconnect Request message has been sent. This state
- is now waiting
for the corresponding response. - NG_L2CAP_W4_L2CA_DISCON_RSP
In this state, the connection on the remote endpoint - is shutting
down and an L2CAP Disconnect Request message has - been received.
An L2CA Disconnect Indication has been sent to the - upper layer to
notify the owner of the CID that the remote endpoint - is being
closed. This state is now waiting for the corre - sponding response
from the upper layer before responding to the remote - endpoint.
- Protocol Multiplexing
L2CAP supports protocol multiplexing because the Baseband - Protocol does
not support any ``type'' field identifying the higher layer - protocol
being multiplexed above it. L2CAP is able to distinguish - between upper
layer protocols such as the Service Discovery Protocol, RF - COMM and Telephony Control.
- Segmentation and ReassemblyThe data packets defined by the Baseband Protocol are limit
- ed in size.
Large L2CAP packets must be segmented into multiple smaller - Baseband
packets prior to their transmission over the air. Similar - ly, multiple
received Baseband packets may be reassembled into a single - larger L2CAP
packet. - Quality of ServiceThe L2CAP connection establishment process allows the ex
- change of information regarding the quality of service (QoS) expected be
- tween two Bluetooth units.
- Groups
The Baseband Protocol supports the concept of a piconet, a - group of
devices synchronously hopping together using the same clock. - The L2CAP
group abstraction permits implementations to efficiently map - protocol
groups on to piconets. - The following features are outside the scope of L2CAP re
- sponsibilities:
- L2CAP does not transport audio designated for SCO- links.
- - L2CAP does not enforce a reliable channel or en
- sure dataintegrity, that is, L2CAP performs no retransmis
- sions or checksum calculations.
- - L2CAP does not support a reliable multicast chan
- nel.
- - L2CAP does not support the concept of a global
- group name.
HOOKS
This node type supports the following hooks:
hci Bluetooth Host Controller Interface downstream hook.
- l2c Upper layer protocol upstream hook. Usually the
- Bluetooth L2CAP
socket layer is connected to the hook. - ctl Control hook. Usually the Bluetooth raw L2CAP sock
- ets layer is
connected to the hook.
INTERFACE TO THE UPPER LAYER PROTOCOLS (L2CA CONTROL MESSAGES)
- Bluetooth specification says that L2CA request must block
- until response
is ready. L2CAP node uses token field from Netgraph message - header to
match L2CA request and response. The upper layer protocol - must populate
token. L2CAP node will queue request and start processing. - Later, when
response is ready or timeout has occurred, L2CAP node will - create new
Netgraph message, set token and NFG_RESP flag and send mes - sage to the
upper layer. Note that L2CA indication messages will not - populate token
and will not set NGF_RESP flag. There is no reason for - this, because
they are just notifications and do not require acknowledg - ment.
- NGM_L2CAP_L2CA_CON
Requests the creation of a channel representing a - logical connection to a physical address. Input parameters are
- the target protocol (PSM) and remote device's 48-bit address
- (BD_ADDR). Output
parameters are the local CID (LCID) allocated by the - local L2CAP
entity, and Result of the request. If Result indi - cates a pending
notification, the Status value may contain more in - formation of
what processing is delaying the establishment of the - connection.
- NGM_L2CAP_L2CA_CON_IND
This message includes the parameters for the address - of the
remote device that issued the connection request, - the local CID
representing the channel being requested, the Iden - tifier contained in the request, and the PSM value the request
- is targeting.
- NGM_L2CAP_L2CA_CON_RSPIssues a response to a connection request event in
- dication.
Input parameters are the remote device's 48-bit ad - dress, Identifier sent in the request, local CID, the Response
- code, and the
Status attached to the Response code. The output - parameter is
the Result of the service request. This primitive - must be called
no more than once after receiving the indication. - NGM_L2CAP_L2CA_CFGRequests the initial configuration (or reconfigura
- tion) of a
channel to a new set of channel parameters. Input - parameters are
the local CID endpoint, new incoming receivable MTU - (InMTU), new
outgoing flow spec-ification, and flush and link - timeouts. Output parameters are the Result, accepted incoming MTU
- (InMTU), the
remote side's flow requests, and flush and link - timeouts.
- NGM_L2CAP_L2CA_CFG_IND
This message includes the parameters indicating the - local CID of
the channel the request has been sent to, the outgo - ing MTU size
(maximum packet that can be sent across the channel) - and the
flowspec describing the characteristics of the in - coming data.
All other channel parameters are set to their de - fault values if
not provided by the remote device. - NGM_L2CAP_L2CA_CFG_RSP
Issues a response to a configuration request event - indication.
Input parameters include the local CID of the end - point being configured, outgoing transmit MTU (which may be equal
- or less to the
OutMTU parameter in the configuration indication - event) and the
accepted flowspec for incoming traffic. The output - parameter is
the Result value. - NGM_L2CAP_L2CA_QOS_IND
This message includes the parameter indicating the - address of the
remote Bluetooth device where the QoS contract has - been violated.
- NGM_L2CAP_L2CA_DISCON
Requests the disconnection of the channel. Input - parameter is
the CID representing the local channel endpoint. - Output parameter is Result. Result is zero if an L2CAP Discon
- nect Response is
received, otherwise a non-zero value is returned. - Once disconnection has been requested, no process will be able
- to successfully read or write from the CID.
- NGM_L2CAP_L2CA_DISCON_IND
This message includes the parameter indicating the - local CID the
request has been sent to. - NGM_L2CAP_L2CA_WRITE
Response to transfer of data request. Actual data - must be
received from appropriate upstream hook and must be - prepended
with header defined as follows.
/* L2CA data packet header */
typedef struct {
u_int32_t token; /* token to use in- L2CAP_L2CA_WRITE */
u_int16_t length; /* length of the da - ta */
u_int16_t lcid; /* local channel ID - */
- } __attribute__ ((packed))
- ng_l2cap_l2ca_hdr_t;
- The output parameters are Result and Length of data
- written.
- NGM_L2CAP_L2CA_GRP_CREATERequests the creation of a CID to represent a logi
- cal connection
to multiple devices. Input parameter is the PSM - value that the
outgoing connectionless traffic is labelled with, - and the filter
used for incoming traffic. Output parameter is the - CID representing the local endpoint. On creation, the group
- is empty but
incoming traffic destined for the PSM value is read - able. This
request has not been implemented. - NGM_L2CAP_L2CA_GRP_CLOSE
The use of this message closes down a Group. This - request has
not been implemented. - NGM_L2CAP_L2CA_GRP_ADD_MEMBER
Requests the addition of a member to a group. The - input parameter includes the CID representing the group and the
- BD_ADDR of
the group member to be added. The output parameter - Result confirms the success or failure of the request. This
- request has
not been implemented. - NGM_L2CAP_L2CA_GRP_REM_MEMBER
Requests the removal of a member from a group. The - input parameters include the CID representing the group and
- BD_ADDR of the
group member to be removed. The output parameter - Result confirms
the success or failure of the request. This request - has not been
implemented. - NGM_L2CAP_L2CA_GRP_MEMBERSHIP
Requests a report of the members of a group. The - input parameter
CID represents the group being queried. The output - parameter
Result confirms the success or failure of the opera - tion. If the
Result is successful, BD_ADDR_Lst is a list of the - Bluetooth
addresses of the N members of the group. This - request has not
been implemented. - NGM_L2CAP_L2CA_PINGInitiates an L2CA Echo Request message and the re
- ception of the
corresponding L2CAP Echo Response message. The in - put parameters
are remote Bluetooth device BD_ADDR, Echo Data and - Length of the
echo data. The output parameters are Result, Echo - Data and
Length of the echo data. - NGM_L2CAP_L2CA_GET_INFO
Initiates an L2CA Information Request message and - the reception
of the corresponding L2CAP Info Response message. - The input
parameters are remote Bluetooth device BD_ADDR and - Information
Type. The output parameters are Result, Information - Data and
Size of the information data. - NGM_L2CAP_L2CA_ENABLE_CLTRequest to disable (enable) the reception of connec
- tionless packets. The input parameter is the PSM value indicat
- ing service
that should be blocked (unblocked) and Enable flag.
NETGRAPH CONTROL MESSAGES
- This node type supports the generic control messages, plus
- the following:
- NGM_L2CAP_NODE_GET_FLAGS
Returns current state for the node. - NGM_L2CAP_NODE_GET_DEBUGReturns an integer containing the current debug lev
- el for the
node. - NGM_L2CAP_NODE_SET_DEBUGThis command takes an integer argument and sets cur
- rent debug
level for the node. - NGM_L2CAP_NODE_GET_CON_LIST
Returns list of active baseband connections (i.e., - ACL links).
- NGM_L2CAP_NODE_GET_CHAN_LIST
Returns list of active L2CAP channels. - NGM_L2CAP_NODE_GET_AUTO_DISCON_TIMO
Returns an integer containing the current value of - the auto disconnect timeout (in sec).
- NGM_L2CAP_NODE_SET_AUTO_DISCON_TIMO
This command accepts an integer and sets the value - of the auto
disconnect timeout (in sec). The special value of 0 - (zero) disables auto disconnect timeout.
SHUTDOWN
- This node shuts down upon receipt of an NGM_SHUTDOWN control
- message, or
when all hooks have been disconnected.
SEE ALSO
netgraph(4), l2control(8), l2ping(8), ngctl(8)
HISTORY
The l2cap node type was implemented in FreeBSD 5.0.
AUTHORS
Maksim Yevmenkin <m_evmenkin@yahoo.com>
BUGS
- Most likely. Please report if found.
- BSD July 4, 2002