Command Section

NG_L2CAP(4)            FreeBSD Kernel Interfaces Manual            NG_L2CAP(4)

NAME
     ng_l2cap - Netgraph node type that implements Bluetooth Logical 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
                provides 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 duplex
                channels.

           3.   L2CAP provides a reliable channel using the mechanisms
                available 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 occurs.  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 protocols.  Each
     L2CAP packet received on a channel is directed to the appropriate 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
     remote device.

     CID assignment is relative to a particular device and a device 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 parameters 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.  Incoming 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 messages will be sent to
          avoid any MTU limitations and negotiate incrementally.  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 request 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 corresponding 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, RFCOMM and Telephony
     Control.

   Segmentation and Reassembly
     The data packets defined by the Baseband Protocol are limited in size.
     Large L2CAP packets must be segmented into multiple smaller Baseband
     packets prior to their transmission over the air.  Similarly, multiple
     received Baseband packets may be reassembled into a single larger L2CAP
     packet.

   Quality of Service
     The L2CAP connection establishment process allows the exchange of
     information regarding the quality of service (QoS) expected between 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 responsibilities:

           -   L2CAP does not transport audio designated for SCO links.

           -   L2CAP does not enforce a reliable channel or ensure data
               integrity, that is, L2CAP performs no retransmissions or
               checksum calculations.

           -   L2CAP does not support a reliable multicast channel.

           -   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 sockets 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 message 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 acknowledgment.

     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 indicates a pending
          notification, the Status value may contain more information 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 Identifier contained
          in the request, and the PSM value the request is targeting.

     NGM_L2CAP_L2CA_CON_RSP
          Issues a response to a connection request event indication.  Input
          parameters are the remote device's 48-bit address, 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_CFG
          Requests the initial configuration (or reconfiguration) 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 outgoing MTU size (maximum
          packet that can be sent across the channel) and the flowspec
          describing the characteristics of the incoming data.  All other
          channel parameters are set to their default 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 endpoint 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 Disconnect 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 {
                        uint32_t token;  /* token to use in L2CAP_L2CA_WRITE */
                        uint16_t length; /* length of the data */
                        uint16_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_CREATE
          Requests the creation of a CID to represent a logical 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 readable.  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 operation.  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_PING
          Initiates an L2CA Echo Request message and the reception of the
          corresponding L2CAP Echo Response message.  The input 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_CLT
          Request to disable (enable) the reception of connectionless packets.
          The input parameter is the PSM value indicating 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_DEBUG
          Returns an integer containing the current debug level for the node.

     NGM_L2CAP_NODE_SET_DEBUG
          This command takes an integer argument and sets current 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.

FreeBSD 13.1-RELEASE-p6          July 4, 2002          FreeBSD 13.1-RELEASE-p6

Command Section

man2web Home...