blob: 7b87c153d23f57483dce92b71219079e65623baa [file] [log] [blame]
.. _bt_l2cap:
Logical Link Control and Adaptation Protocol (L2CAP)
####################################################
L2CAP layer enables connection-oriented channels which can be enable with the
configuration option: :option:`CONFIG_BT_L2CAP_DYNAMIC_CHANNEL`. This channels
support segmentation and reassembly transparently, they also support credit
based flow control making it suitable for data streams.
Channels instances are represented by the :cpp:class:`bt_l2cap_chan` struct which
contains the callbacks in the :cpp:class:`bt_l2cap_chan_ops` struct to inform
when the channel has been connected, disconnected or when the encryption has
changed.
In addition to that it also contains the ``recv`` callback which is called
whenever an incoming data has been received. Data received this way can be
marked as processed by returning 0 or using
:cpp:func:`bt_l2cap_chan_recv_complete` API if processing is asynchronous.
.. note::
The ``recv`` callback is called directly from RX Thread thus it is not
recommended to block for long periods of time.
For sending data the :cpp:func:`bt_l2cap_chan_send` API can be used noting that
it may block if no credits are available, and resuming as soon as more credits
are available.
Servers can be registered using :cpp:func:`bt_l2cap_server_register` API passing
the :cpp:class:`bt_l2cap_server` struct which informs what ``psm`` it should
listen to, the required security level ``sec_level``, and the callback
``accept`` which is called to authorize incoming connection requests and
allocate channel instances.
Client channels can be initiated with use of :cpp:func:`bt_l2cap_chan_connect`
API and can be disconnected with the :cpp:func:`bt_l2cap_chan_disconnect` API.
Note that the later can also disconnect channel instances created by servers.
API Reference
*************
.. doxygengroup:: bt_l2cap
:project: Zephyr