123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506 |
- /*
- * Copyright (c) 2011 - 2018, Nordic Semiconductor ASA
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form, except as embedded into a Nordic
- * Semiconductor ASA integrated circuit in a product or a software update for
- * such product, must reproduce the above copyright notice, this list of
- * conditions and the following disclaimer in the documentation and/or other
- * materials provided with the distribution.
- *
- * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
- * contributors may be used to endorse or promote products derived from this
- * software without specific prior written permission.
- *
- * 4. This software, with or without modification, must only be used with a
- * Nordic Semiconductor ASA integrated circuit.
- *
- * 5. Any software provided in binary form under this license must not be reverse
- * engineered, decompiled, modified and/or disassembled.
- *
- * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- /**
- @addtogroup BLE_L2CAP Logical Link Control and Adaptation Protocol (L2CAP)
- @{
- @brief Definitions and prototypes for the L2CAP interface.
- */
- #ifndef BLE_L2CAP_H__
- #define BLE_L2CAP_H__
- #include <stdint.h>
- #include "nrf_svc.h"
- #include "nrf_error.h"
- #include "ble_ranges.h"
- #include "ble_types.h"
- #include "ble_err.h"
- #ifdef __cplusplus
- extern "C" {
- #endif
- /**@addtogroup BLE_L2CAP_TERMINOLOGY Terminology
- * @{
- * @details
- *
- * L2CAP SDU
- * - A data unit that the application can send/receive to/from a peer.
- *
- * L2CAP PDU
- * - A data unit that is exchanged between local and remote L2CAP entities.
- * It consists of L2CAP protocol control information and payload fields.
- * The payload field can contain an L2CAP SDU or a part of an L2CAP SDU.
- *
- * L2CAP MTU
- * - The maximum length of an L2CAP SDU.
- *
- * L2CAP MPS
- * - The maximum length of an L2CAP PDU payload field.
- *
- * Credits
- * - A value indicating the number of L2CAP PDUs that the receiver of the credit can send to the peer.
- * @} */
- /**@addtogroup BLE_L2CAP_ENUMERATIONS Enumerations
- * @{ */
- /**@brief L2CAP API SVC numbers. */
- enum BLE_L2CAP_SVCS
- {
- SD_BLE_L2CAP_CH_SETUP = BLE_L2CAP_SVC_BASE + 0, /**< Set up an L2CAP channel. */
- SD_BLE_L2CAP_CH_RELEASE = BLE_L2CAP_SVC_BASE + 1, /**< Release an L2CAP channel. */
- SD_BLE_L2CAP_CH_RX = BLE_L2CAP_SVC_BASE + 2, /**< Receive an SDU on an L2CAP channel. */
- SD_BLE_L2CAP_CH_TX = BLE_L2CAP_SVC_BASE + 3, /**< Transmit an SDU on an L2CAP channel. */
- SD_BLE_L2CAP_CH_FLOW_CONTROL = BLE_L2CAP_SVC_BASE + 4, /**< Advanced SDU reception flow control. */
- };
- /**@brief L2CAP Event IDs. */
- enum BLE_L2CAP_EVTS
- {
- BLE_L2CAP_EVT_CH_SETUP_REQUEST = BLE_L2CAP_EVT_BASE + 0, /**< L2CAP Channel Setup Request event.
- \n See @ref ble_l2cap_evt_ch_setup_request_t. */
- BLE_L2CAP_EVT_CH_SETUP_REFUSED = BLE_L2CAP_EVT_BASE + 1, /**< L2CAP Channel Setup Refused event.
- \n See @ref ble_l2cap_evt_ch_setup_refused_t. */
- BLE_L2CAP_EVT_CH_SETUP = BLE_L2CAP_EVT_BASE + 2, /**< L2CAP Channel Setup Completed event.
- \n See @ref ble_l2cap_evt_ch_setup_t. */
- BLE_L2CAP_EVT_CH_RELEASED = BLE_L2CAP_EVT_BASE + 3, /**< L2CAP Channel Released event.
- \n No additional event structure applies. */
- BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED = BLE_L2CAP_EVT_BASE + 4, /**< L2CAP Channel SDU data buffer released event.
- \n See @ref ble_l2cap_evt_ch_sdu_buf_released_t. */
- BLE_L2CAP_EVT_CH_CREDIT = BLE_L2CAP_EVT_BASE + 5, /**< L2CAP Channel Credit received.
- \n See @ref ble_l2cap_evt_ch_credit_t. */
- BLE_L2CAP_EVT_CH_RX = BLE_L2CAP_EVT_BASE + 6, /**< L2CAP Channel SDU received.
- \n See @ref ble_l2cap_evt_ch_rx_t. */
- BLE_L2CAP_EVT_CH_TX = BLE_L2CAP_EVT_BASE + 7, /**< L2CAP Channel SDU transmitted.
- \n See @ref ble_l2cap_evt_ch_tx_t. */
- };
- /** @} */
- /**@addtogroup BLE_L2CAP_DEFINES Defines
- * @{ */
- /**@brief Maximum number of L2CAP channels per connection. */
- #define BLE_L2CAP_CH_COUNT_MAX (64)
- /**@brief Minimum L2CAP MTU, in bytes. */
- #define BLE_L2CAP_MTU_MIN (23)
- /**@brief Minimum L2CAP MPS, in bytes. */
- #define BLE_L2CAP_MPS_MIN (23)
- /**@brief Invalid CID. */
- #define BLE_L2CAP_CID_INVALID (0x0000)
- /**@brief Default number of credits for @ref sd_ble_l2cap_ch_flow_control. */
- #define BLE_L2CAP_CREDITS_DEFAULT (1)
- /**@defgroup BLE_L2CAP_CH_SETUP_REFUSED_SRCS L2CAP channel setup refused sources
- * @{ */
- #define BLE_L2CAP_CH_SETUP_REFUSED_SRC_LOCAL (0x01) /**< Local. */
- #define BLE_L2CAP_CH_SETUP_REFUSED_SRC_REMOTE (0x02) /**< Remote. */
- /** @} */
- /** @defgroup BLE_L2CAP_CH_STATUS_CODES L2CAP channel status codes
- * @{ */
- #define BLE_L2CAP_CH_STATUS_CODE_SUCCESS (0x0000) /**< Success. */
- #define BLE_L2CAP_CH_STATUS_CODE_LE_PSM_NOT_SUPPORTED (0x0002) /**< LE_PSM not supported. */
- #define BLE_L2CAP_CH_STATUS_CODE_NO_RESOURCES (0x0004) /**< No resources available. */
- #define BLE_L2CAP_CH_STATUS_CODE_INSUFF_AUTHENTICATION (0x0005) /**< Insufficient authentication. */
- #define BLE_L2CAP_CH_STATUS_CODE_INSUFF_AUTHORIZATION (0x0006) /**< Insufficient authorization. */
- #define BLE_L2CAP_CH_STATUS_CODE_INSUFF_ENC_KEY_SIZE (0x0007) /**< Insufficient encryption key size. */
- #define BLE_L2CAP_CH_STATUS_CODE_INSUFF_ENC (0x0008) /**< Insufficient encryption. */
- #define BLE_L2CAP_CH_STATUS_CODE_INVALID_SCID (0x0009) /**< Invalid Source CID. */
- #define BLE_L2CAP_CH_STATUS_CODE_SCID_ALLOCATED (0x000A) /**< Source CID already allocated. */
- #define BLE_L2CAP_CH_STATUS_CODE_UNACCEPTABLE_PARAMS (0x000B) /**< Unacceptable parameters. */
- #define BLE_L2CAP_CH_STATUS_CODE_NOT_UNDERSTOOD (0x8000) /**< Command Reject received instead of LE Credit Based Connection Response. */
- #define BLE_L2CAP_CH_STATUS_CODE_TIMEOUT (0xC000) /**< Operation timed out. */
- /** @} */
- /** @} */
- /**@addtogroup BLE_L2CAP_STRUCTURES Structures
- * @{ */
- /**
- * @brief BLE L2CAP connection configuration parameters, set with @ref sd_ble_cfg_set.
- *
- * @note These parameters are set per connection, so all L2CAP channels created on this connection
- * will have the same parameters.
- *
- * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true:
- * - rx_mps is smaller than @ref BLE_L2CAP_MPS_MIN.
- * - tx_mps is smaller than @ref BLE_L2CAP_MPS_MIN.
- * - ch_count is greater than @ref BLE_L2CAP_CH_COUNT_MAX.
- * @retval ::NRF_ERROR_NO_MEM rx_mps or tx_mps is set too high.
- */
- typedef struct
- {
- uint16_t rx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall
- be able to receive on L2CAP channels on connections with this
- configuration. The minimum value is @ref BLE_L2CAP_MPS_MIN. */
- uint16_t tx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall
- be able to transmit on L2CAP channels on connections with this
- configuration. The minimum value is @ref BLE_L2CAP_MPS_MIN. */
- uint8_t rx_queue_size; /**< Number of SDU data buffers that can be queued for reception per
- L2CAP channel. The minimum value is one. */
- uint8_t tx_queue_size; /**< Number of SDU data buffers that can be queued for transmission
- per L2CAP channel. The minimum value is one. */
- uint8_t ch_count; /**< Number of L2CAP channels the application can create per connection
- with this configuration. The default value is zero, the maximum
- value is @ref BLE_L2CAP_CH_COUNT_MAX.
- @note if this parameter is set to zero, all other parameters in
- @ref ble_l2cap_conn_cfg_t are ignored. */
- } ble_l2cap_conn_cfg_t;
- /**@brief L2CAP channel RX parameters. */
- typedef struct
- {
- uint16_t rx_mtu; /**< The maximum L2CAP SDU size, in bytes, that L2CAP shall be able to
- receive on this L2CAP channel.
- - Must be equal to or greater than @ref BLE_L2CAP_MTU_MIN. */
- uint16_t rx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall be
- able to receive on this L2CAP channel.
- - Must be equal to or greater than @ref BLE_L2CAP_MPS_MIN.
- - Must be equal to or less than @ref ble_l2cap_conn_cfg_t::rx_mps. */
- ble_data_t sdu_buf; /**< SDU data buffer for reception.
- - If @ref ble_data_t::p_data is non-NULL, initial credits are
- issued to the peer.
- - If @ref ble_data_t::p_data is NULL, no initial credits are
- issued to the peer. */
- } ble_l2cap_ch_rx_params_t;
- /**@brief L2CAP channel setup parameters. */
- typedef struct
- {
- ble_l2cap_ch_rx_params_t rx_params; /**< L2CAP channel RX parameters. */
- uint16_t le_psm; /**< LE Protocol/Service Multiplexer. Used when requesting
- setup of an L2CAP channel, ignored otherwise. */
- uint16_t status; /**< Status code, see @ref BLE_L2CAP_CH_STATUS_CODES.
- Used when replying to a setup request of an L2CAP
- channel, ignored otherwise. */
- } ble_l2cap_ch_setup_params_t;
- /**@brief L2CAP channel TX parameters. */
- typedef struct
- {
- uint16_t tx_mtu; /**< The maximum L2CAP SDU size, in bytes, that L2CAP is able to
- transmit on this L2CAP channel. */
- uint16_t peer_mps; /**< The maximum L2CAP PDU payload size, in bytes, that the peer is
- able to receive on this L2CAP channel. */
- uint16_t tx_mps; /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP is able
- to transmit on this L2CAP channel. This is effective tx_mps,
- selected by the SoftDevice as
- MIN( @ref ble_l2cap_ch_tx_params_t::peer_mps, @ref ble_l2cap_conn_cfg_t::tx_mps ) */
- uint16_t credits; /**< Initial credits given by the peer. */
- } ble_l2cap_ch_tx_params_t;
- /**@brief L2CAP Channel Setup Request event. */
- typedef struct
- {
- ble_l2cap_ch_tx_params_t tx_params; /**< L2CAP channel TX parameters. */
- uint16_t le_psm; /**< LE Protocol/Service Multiplexer. */
- } ble_l2cap_evt_ch_setup_request_t;
- /**@brief L2CAP Channel Setup Refused event. */
- typedef struct
- {
- uint8_t source; /**< Source, see @ref BLE_L2CAP_CH_SETUP_REFUSED_SRCS */
- uint16_t status; /**< Status code, see @ref BLE_L2CAP_CH_STATUS_CODES */
- } ble_l2cap_evt_ch_setup_refused_t;
- /**@brief L2CAP Channel Setup Completed event. */
- typedef struct
- {
- ble_l2cap_ch_tx_params_t tx_params; /**< L2CAP channel TX parameters. */
- } ble_l2cap_evt_ch_setup_t;
- /**@brief L2CAP Channel SDU Data Buffer Released event. */
- typedef struct
- {
- ble_data_t sdu_buf; /**< Returned reception or transmission SDU data buffer. The SoftDevice
- returns SDU data buffers supplied by the application, which have
- not yet been returned previously via a @ref BLE_L2CAP_EVT_CH_RX or
- @ref BLE_L2CAP_EVT_CH_TX event. */
- } ble_l2cap_evt_ch_sdu_buf_released_t;
- /**@brief L2CAP Channel Credit received event. */
- typedef struct
- {
- uint16_t credits; /**< Additional credits given by the peer. */
- } ble_l2cap_evt_ch_credit_t;
- /**@brief L2CAP Channel received SDU event. */
- typedef struct
- {
- uint16_t sdu_len; /**< Total SDU length, in bytes. */
- ble_data_t sdu_buf; /**< SDU data buffer.
- @note If there is not enough space in the buffer
- (sdu_buf.len < sdu_len) then the rest of the SDU will be
- silently discarded by the SoftDevice. */
- } ble_l2cap_evt_ch_rx_t;
- /**@brief L2CAP Channel transmitted SDU event. */
- typedef struct
- {
- ble_data_t sdu_buf; /**< SDU data buffer. */
- } ble_l2cap_evt_ch_tx_t;
- /**@brief L2CAP event structure. */
- typedef struct
- {
- uint16_t conn_handle; /**< Connection Handle on which the event occured. */
- uint16_t local_cid; /**< Local Channel ID of the L2CAP channel, or
- @ref BLE_L2CAP_CID_INVALID if not present. */
- union
- {
- ble_l2cap_evt_ch_setup_request_t ch_setup_request; /**< L2CAP Channel Setup Request Event Parameters. */
- ble_l2cap_evt_ch_setup_refused_t ch_setup_refused; /**< L2CAP Channel Setup Refused Event Parameters. */
- ble_l2cap_evt_ch_setup_t ch_setup; /**< L2CAP Channel Setup Completed Event Parameters. */
- ble_l2cap_evt_ch_sdu_buf_released_t ch_sdu_buf_released;/**< L2CAP Channel SDU Data Buffer Released Event Parameters. */
- ble_l2cap_evt_ch_credit_t credit; /**< L2CAP Channel Credit Received Event Parameters. */
- ble_l2cap_evt_ch_rx_t rx; /**< L2CAP Channel SDU Received Event Parameters. */
- ble_l2cap_evt_ch_tx_t tx; /**< L2CAP Channel SDU Transmitted Event Parameters. */
- } params; /**< Event Parameters. */
- } ble_l2cap_evt_t;
- /** @} */
- /**@addtogroup BLE_L2CAP_FUNCTIONS Functions
- * @{ */
- /**@brief Set up an L2CAP channel.
- *
- * @details This function is used to:
- * - Request setup of an L2CAP channel: sends an LE Credit Based Connection Request packet to a peer.
- * - Reply to a setup request of an L2CAP channel (if called in response to a
- * @ref BLE_L2CAP_EVT_CH_SETUP_REQUEST event): sends an LE Credit Based Connection
- * Response packet to a peer.
- *
- * @note A call to this function will require the application to keep the SDU data buffer alive
- * until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_RX or
- * @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event.
- *
- * @events
- * @event{@ref BLE_L2CAP_EVT_CH_SETUP, Setup successful.}
- * @event{@ref BLE_L2CAP_EVT_CH_SETUP_REFUSED, Setup failed.}
- * @endevents
- *
- * @mscs
- * @mmsc{@ref BLE_L2CAP_CH_SETUP_MSC}
- * @endmscs
- *
- * @param[in] conn_handle Connection Handle.
- * @param[in,out] p_local_cid Pointer to a uint16_t containing Local Channel ID of the L2CAP channel:
- * - As input: @ref BLE_L2CAP_CID_INVALID when requesting setup of an L2CAP
- * channel or local_cid provided in the @ref BLE_L2CAP_EVT_CH_SETUP_REQUEST
- * event when replying to a setup request of an L2CAP channel.
- * - As output: local_cid for this channel.
- * @param[in] p_params L2CAP channel parameters.
- *
- * @retval ::NRF_SUCCESS Successfully queued request or response for transmission.
- * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry.
- * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.
- * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.
- * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied.
- * @retval ::NRF_ERROR_INVALID_LENGTH Supplied higher rx_mps than has been configured on this link.
- * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (L2CAP channel already set up).
- * @retval ::NRF_ERROR_NOT_FOUND CID not found.
- * @retval ::NRF_ERROR_RESOURCES The limit has been reached for available L2CAP channels,
- * see @ref ble_l2cap_conn_cfg_t::ch_count.
- */
- SVCALL(SD_BLE_L2CAP_CH_SETUP, uint32_t, sd_ble_l2cap_ch_setup(uint16_t conn_handle, uint16_t *p_local_cid, ble_l2cap_ch_setup_params_t const *p_params));
- /**@brief Release an L2CAP channel.
- *
- * @details This sends a Disconnection Request packet to a peer.
- *
- * @events
- * @event{@ref BLE_L2CAP_EVT_CH_RELEASED, Release complete.}
- * @endevents
- *
- * @mscs
- * @mmsc{@ref BLE_L2CAP_CH_RELEASE_MSC}
- * @endmscs
- *
- * @param[in] conn_handle Connection Handle.
- * @param[in] local_cid Local Channel ID of the L2CAP channel.
- *
- * @retval ::NRF_SUCCESS Successfully queued request for transmission.
- * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.
- * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is
- * in progress for the L2CAP channel).
- * @retval ::NRF_ERROR_NOT_FOUND CID not found.
- */
- SVCALL(SD_BLE_L2CAP_CH_RELEASE, uint32_t, sd_ble_l2cap_ch_release(uint16_t conn_handle, uint16_t local_cid));
- /**@brief Receive an SDU on an L2CAP channel.
- *
- * @details This may issue additional credits to the peer using an LE Flow Control Credit packet.
- *
- * @note A call to this function will require the application to keep the memory pointed by
- * @ref ble_data_t::p_data alive until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_RX
- * or @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event.
- *
- * @note The SoftDevice can queue up to @ref ble_l2cap_conn_cfg_t::rx_queue_size SDU data buffers
- * for reception per L2CAP channel.
- *
- * @events
- * @event{@ref BLE_L2CAP_EVT_CH_RX, The SDU is received.}
- * @endevents
- *
- * @mscs
- * @mmsc{@ref BLE_L2CAP_CH_RX_MSC}
- * @endmscs
- *
- * @param[in] conn_handle Connection Handle.
- * @param[in] local_cid Local Channel ID of the L2CAP channel.
- * @param[in] p_sdu_buf Pointer to the SDU data buffer.
- *
- * @retval ::NRF_SUCCESS Buffer accepted.
- * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.
- * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.
- * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is
- * in progress for an L2CAP channel).
- * @retval ::NRF_ERROR_NOT_FOUND CID not found.
- * @retval ::NRF_ERROR_RESOURCES Too many SDU data buffers supplied. Wait for a
- * @ref BLE_L2CAP_EVT_CH_RX event and retry.
- */
- SVCALL(SD_BLE_L2CAP_CH_RX, uint32_t, sd_ble_l2cap_ch_rx(uint16_t conn_handle, uint16_t local_cid, ble_data_t const *p_sdu_buf));
- /**@brief Transmit an SDU on an L2CAP channel.
- *
- * @note A call to this function will require the application to keep the memory pointed by
- * @ref ble_data_t::p_data alive until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_TX
- * or @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event.
- *
- * @note The SoftDevice can queue up to @ref ble_l2cap_conn_cfg_t::tx_queue_size SDUs for
- * transmission per L2CAP channel.
- *
- * @note The application can keep track of the available credits for transmission by following
- * the procedure below:
- * - Store initial credits given by the peer in a variable.
- * (Initial credits are provided in a @ref BLE_L2CAP_EVT_CH_SETUP event.)
- * - Decrement the variable, which stores the currently available credits, by
- * ceiling((@ref ble_data_t::len + 2) / tx_mps) when a call to this function returns
- * @ref NRF_SUCCESS. (tx_mps is provided in a @ref BLE_L2CAP_EVT_CH_SETUP event.)
- * - Increment the variable, which stores the currently available credits, by additional
- * credits given by the peer in a @ref BLE_L2CAP_EVT_CH_CREDIT event.
- *
- * @events
- * @event{@ref BLE_L2CAP_EVT_CH_TX, The SDU is transmitted.}
- * @endevents
- *
- * @mscs
- * @mmsc{@ref BLE_L2CAP_CH_TX_MSC}
- * @endmscs
- *
- * @param[in] conn_handle Connection Handle.
- * @param[in] local_cid Local Channel ID of the L2CAP channel.
- * @param[in] p_sdu_buf Pointer to the SDU data buffer.
- *
- * @retval ::NRF_SUCCESS Successfully queued L2CAP SDU for transmission.
- * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.
- * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.
- * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is
- * in progress for the L2CAP channel).
- * @retval ::NRF_ERROR_NOT_FOUND CID not found.
- * @retval ::NRF_ERROR_DATA_SIZE Invalid SDU length supplied, must not be more than
- * @ref ble_l2cap_ch_tx_params_t::tx_mtu provided in
- * @ref BLE_L2CAP_EVT_CH_SETUP event.
- * @retval ::NRF_ERROR_RESOURCES Too many SDUs queued for transmission. Wait for a
- * @ref BLE_L2CAP_EVT_CH_TX event and retry.
- */
- SVCALL(SD_BLE_L2CAP_CH_TX, uint32_t, sd_ble_l2cap_ch_tx(uint16_t conn_handle, uint16_t local_cid, ble_data_t const *p_sdu_buf));
- /**@brief Advanced SDU reception flow control.
- *
- * @details Adjust the way the SoftDevice issues credits to the peer.
- * This may issue additional credits to the peer using an LE Flow Control Credit packet.
- *
- * @mscs
- * @mmsc{@ref BLE_L2CAP_CH_FLOW_CONTROL_MSC}
- * @endmscs
- *
- * @param[in] conn_handle Connection Handle.
- * @param[in] local_cid Local Channel ID of the L2CAP channel or @ref BLE_L2CAP_CID_INVALID to set
- * the value that will be used for newly created channels.
- * @param[in] credits Number of credits that the SoftDevice will make sure the peer has every
- * time it starts using a new reception buffer.
- * - @ref BLE_L2CAP_CREDITS_DEFAULT is the default value the SoftDevice will
- * use if this function is not called.
- * - If set to zero, the SoftDevice will stop issuing credits for new reception
- * buffers the application provides or has provided. SDU reception that is
- * currently ongoing will be allowed to complete.
- * @param[out] p_credits NULL or pointer to a uint16_t. If a valid pointer is provided, it will be
- * written by the SoftDevice with the number of credits that is or will be
- * available to the peer. If the value written by the SoftDevice is 0 when
- * credits parameter was set to 0, the peer will not be able to send more
- * data until more credits are provided by calling this function again with
- * credits > 0. This parameter is ignored when local_cid is set to
- * @ref BLE_L2CAP_CID_INVALID.
- *
- * @note Application should take care when setting number of credits higher than default value. In
- * this case the application must make sure that the SoftDevice always has reception buffers
- * available (see @ref sd_ble_l2cap_ch_rx) for that channel. If the SoftDevice does not have
- * such buffers available, packets may be NACKed on the Link Layer and all Bluetooth traffic
- * on the connection handle may be stalled until the SoftDevice again has an available
- * reception buffer. This applies even if the application has used this call to set the
- * credits back to default, or zero.
- *
- * @retval ::NRF_SUCCESS Flow control parameters accepted.
- * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.
- * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.
- * @retval ::NRF_ERROR_INVALID_STATE Invalid State to perform operation (Setup or release is
- * in progress for an L2CAP channel).
- * @retval ::NRF_ERROR_NOT_FOUND CID not found.
- */
- SVCALL(SD_BLE_L2CAP_CH_FLOW_CONTROL, uint32_t, sd_ble_l2cap_ch_flow_control(uint16_t conn_handle, uint16_t local_cid, uint16_t credits, uint16_t *p_credits));
- /** @} */
- #ifdef __cplusplus
- }
- #endif
- #endif // BLE_L2CAP_H__
- /**
- @}
- */
|